ZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tawppbmRleCAzN2I4NTExLi44YjVhNmY1IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rCkBAIC0zNSw2ICszNSw4IEBACiAgICAgRHVtbXlBdWRpb1NvdXJjZS5jcHAgXA0KICAgICBEdW1teVZpZGVvU291cmNlLmNwcCBcDQogICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIFwNCisgICAgQXVkaW9QbGF5ZXJCYXNlLmNwcCBcDQorICAgIFByZXZpZXdQbGF5ZXJCYXNlLmNwcCBcDQogICAgIFByZXZpZXdSZW5kZXJlci5jcHANCiANCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbA0KQEAgLTUwLDEwICs1MiwxMSBAQAogICAgIGxpYnV0aWxzICAgICAgICAgICBcDQogICAgIGxpYmN1dGlscyAgICAgICAgICBcDQogICAgIGxpYm1lZGlhICAgICAgICAgICBcDQorICAgIGxpYmRybWZyYW1ld29yayAgICBcDQogICAgIGxpYnN0YWdlZnJpZ2h0ICBcDQogICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgXA0KICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwNCi0gICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwNCisgICAgbGliZ3VpIFwNCiAgICAgbGliYXVkaW9mbGluZ2VyIFwNCiAgICAgbGlidWkNCiANCkBAIC05OCwxMSArMTAxLDYgQEAKICAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwNCiAgICAgLURVU0VfU1RBR0VGUklHSFRfM0dQUF9SRUFERVINCiANCi0NCi0jIERvbid0IHByZWxpbmsgdGhpcyBsaWJyYXJ5LiAgRm9yIG1vcmUgZWZmaWNpZW50IGNvZGUsIHlvdSBtYXkgd2FudA0KLSMgdG8gYWRkIHRoaXMgbGlicmFyeSB0byB0aGUgcHJlbGluayBtYXAgYW5kIHNldCB0aGlzIHRvIHRydWUuDQotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UNCi0NCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpDQogDQogI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkNCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0F1ZGlvUGxheWVyQmFzZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0F1ZGlvUGxheWVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjNmE2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQXVkaW9QbGF5ZXJCYXNlLmNwcApAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QbGF5ZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworI2luY2x1ZGUgIkF1ZGlvUGxheWVyQmFzZS5oIgorI2luY2x1ZGUgIlByZXZpZXdQbGF5ZXJCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQXVkaW9QbGF5ZXJCYXNlOjpBdWRpb1BsYXllckJhc2UoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAorICAgICAgICBQcmV2aWV3UGxheWVyQmFzZSAqb2JzZXJ2ZXIpCisgICAgOiBtQXVkaW9UcmFjayhOVUxMKSwKKyAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1TYW1wbGVSYXRlKDApLAorICAgICAgbUxhdGVuY3lVcygwKSwKKyAgICAgIG1GcmFtZVNpemUoMCksCisgICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAorICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMoLTEpLAorICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcygtMSksCisgICAgICBtU2Vla2luZyhmYWxzZSksCisgICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCisgICAgICBtRmluYWxTdGF0dXMoT0spLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAorICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKKyAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKKyAgICAgIG1PYnNlcnZlcihvYnNlcnZlcikgeworfQorCitBdWRpb1BsYXllckJhc2U6On5BdWRpb1BsYXllckJhc2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGxheWVyQmFzZTo6c2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgQ0hFQ0tfRVEobVNvdXJjZSwgTlVMTCk7CisgICAgbVNvdXJjZSA9IHNvdXJjZTsKK30KKworc3RhdHVzX3QgQXVkaW9QbGF5ZXJCYXNlOjpzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKyAgICBDSEVDSyhtU291cmNlICE9IE5VTEwpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWxsb3cgYW4gb3B0aW9uYWwgSU5GT19GT1JNQVRfQ0hBTkdFRCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKKyAgICAvLyBvZiBwbGF5YmFjaywgaWYgdGhlcmUgaXMgb25lLCBnZXRGb3JtYXQgYmVsb3cgd2lsbCByZXRyaWV2ZSB0aGUKKyAgICAvLyB1cGRhdGVkIGZvcm1hdCwgaWYgdGhlcmUgaXNuJ3QsIHdlJ2xsIHN0YXNoIGF3YXkgdGhlIHZhbGlkIGJ1ZmZlcgorICAgIC8vIG9mIGRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgZmlyc3QgYXVkaW8gY2FsbGJhY2suCisKKyAgICBDSEVDSyhtRmlyc3RCdWZmZXIgPT0gTlVMTCk7CisKKyAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBtU291cmNlLT5yZWFkKCZtRmlyc3RCdWZmZXIpOworICAgIGlmIChtRmlyc3RCdWZmZXJSZXN1bHQgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICBMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7CisKKyAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOworICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKKyAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKKworICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisKKyAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKKyAgICAgICAgICAgICAgICAmQXVkaW9QbGF5ZXJCYXNlOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworCisgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAobnVtQ2hhbm5lbHMgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgOiBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgICAgICAgICAgICAgIDAsIDAsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKKworICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9UcmFjazsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXRlbmN5VXMgPSAoaW50NjRfdCltQXVkaW9UcmFjay0+bGF0ZW5jeSgpICogMTAwMDsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1RyYWNrLT5mcmFtZVNpemUoKTsKKworICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQXVkaW9QbGF5ZXJCYXNlOjpwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcykgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGlmIChwbGF5UGVuZGluZ1NhbXBsZXMpIHsKKyAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BsYXllckJhc2U6OnJlc3VtZSgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGxheWVyQmFzZTo6cmVzZXQoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKKworICAgICAgICBkZWxldGUgbUF1ZGlvVHJhY2s7CisgICAgICAgIG1BdWRpb1RyYWNrID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQorICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KKworICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgTE9HVigiQXVkaW9QbGF5ZXJCYXNlIHJlbGVhc2luZyBpbnB1dCBidWZmZXIuIik7CisKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbVNvdXJjZS0+c3RvcCgpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBoYWNrIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgT01YCisgICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQorICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgorICAgIHdwPE1lZGlhU291cmNlPiB0bXAgPSBtU291cmNlOworICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7CisgICAgICAgIHVzbGVlcCgxMDAwKTsKKyAgICB9CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCisgICAgbU51bUZyYW1lc1BsYXllZCA9IDA7CisgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gLTE7CisgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1GaW5hbFN0YXR1cyA9IE9LOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBdWRpb1BsYXllckJhc2U6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7CisgICAgc3RhdGljX2Nhc3Q8QXVkaW9QbGF5ZXJCYXNlICo+KHVzZXIpLT5BdWRpb0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKK30KKworYm9vbCBBdWRpb1BsYXllckJhc2U6OmlzU2Vla2luZygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU2Vla2luZzsKK30KKworYm9vbCBBdWRpb1BsYXllckJhc2U6OnJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSB7CisgICAgKmZpbmFsU3RhdHVzID0gT0s7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKKyAgICByZXR1cm4gbVJlYWNoZWRFT1M7Cit9CisKKy8vIHN0YXRpYworc2l6ZV90IEF1ZGlvUGxheWVyQmFzZTo6QXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCisgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSkgeworICAgIEF1ZGlvUGxheWVyQmFzZSAqbWUgPSAoQXVkaW9QbGF5ZXJCYXNlICopY29va2llOworCisgICAgcmV0dXJuIG1lLT5maWxsQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3ZvaWQgQXVkaW9QbGF5ZXJCYXNlOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgeworICAgIGlmIChldmVudCAhPSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7CisKKyAgICBidWZmZXItPnNpemUgPSBudW1CeXRlc1dyaXR0ZW47Cit9CisKK3VpbnQzMl90IEF1ZGlvUGxheWVyQmFzZTo6Z2V0TnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQoKSBjb25zdCB7CisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkT3V0OworICAgIHN0YXR1c190IGVycjsKKworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZE91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWRPdXQpOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0sgfHwgbU51bUZyYW1lc1BsYXllZCA8IG51bUZyYW1lc1BsYXllZE91dCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBtTnVtRnJhbWVzUGxheWVkIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Ym1pdHRlZAorICAgIC8vIHRvIHRoZSBhdWRpbyBzaW5rIGZvciBwbGF5YmFjaywgYnV0IG5vdCBhbGwgb2YgdGhlbQorICAgIC8vIG1heSBoYXZlIHBsYXllZCBvdXQgYnkgbm93LgorICAgIHJldHVybiBtTnVtRnJhbWVzUGxheWVkIC0gbnVtRnJhbWVzUGxheWVkT3V0OworfQorCitzaXplX3QgQXVkaW9QbGF5ZXJCYXNlOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1OdW1GcmFtZXNQbGF5ZWQgPT0gMCkgeworICAgICAgICBMT0dWKCJBdWRpb0NhbGxiYWNrIik7CisgICAgfQorCisgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgcG9zdFNlZWtDb21wbGV0ZSA9IGZhbHNlOworICAgIGJvb2wgcG9zdEVPUyA9IGZhbHNlOworICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOworCisgICAgc2l6ZV90IHNpemVfZG9uZSA9IDA7CisgICAgc2l6ZV90IHNpemVfcmVtYWluaW5nID0gc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZV9yZW1haW5pbmcgPiAwKSB7CisgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgICAgIGlmIChtU2Vla2luZykgeworICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKKworICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlZWtDb21wbGV0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisKKyAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG1GaXJzdEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGVyciA9IG1GaXJzdEJ1ZmZlclJlc3VsdDsKKworICAgICAgICAgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgJm9wdGlvbnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSygoZXJyID09IE9LICYmIG1JbnB1dEJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgIHx8IChlcnIgIT0gT0sgJiYgbUlucHV0QnVmZmVyID09IE5VTEwpKTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgJiYgIW1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcG9zdCBFT1MgcmlnaHQgYXdheSBidXQgb25seQorICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciBhbGwgZnJhbWVzIGhhdmUgYWN0dWFsbHkgYmVlbiBwbGF5ZWQgb3V0LgorCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzdWJtaXR0ZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sgdGhhdCB5b3UgaGF2ZW4ndCBoZWFyZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE51bUZyYW1lc1BlbmRpbmdQbGF5b3V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBudW1iZXIgb2YgZnJhbWVzIHdlJ3JlIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHN1Ym1pdCB0byB0aGUgQXVkaW9UcmFjayBieSByZXR1cm5pbmcgZnJvbSB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1BZGRpdGlvbmFsRnJhbWVzID0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNQZW5kaW5nUGxheW91dCArPSBudW1BZGRpdGlvbmFsRnJhbWVzOworCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVRvQ29tcGxldGlvblVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgxMDAwMDAwbGwgKiBudW1GcmFtZXNQZW5kaW5nUGxheW91dCkgLyBtU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgICAgICBMT0dWKCJ0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHBsYXllZDogJWxsZCAoJWxsZCB1cykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzUGxheWVkICsgbnVtQWRkaXRpb25hbEZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgICAgICBMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNQZW5kaW5nUGxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVG9Db21wbGV0aW9uVXMsIHRpbWVUb0NvbXBsZXRpb25VcyAvIDFFNik7CisKKyAgICAgICAgICAgICAgICAgICAgcG9zdEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gdGltZVRvQ29tcGxldGlvblVzICsgbUxhdGVuY3lVczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gZXJyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7CisKKyAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQorICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgLyBtU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlZCwgIgorICAgICAgICAgICAgICAgICAibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAorICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAorICAgICAgICAgICAgICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyAvIDFFNiwgbVBvc2l0aW9uVGltZVJlYWxVcyAvIDFFNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplX3JlbWFpbmluZzsKKyAgICAgICAgaWYgKGNvcHkgPiBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBjb3B5ID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgoY2hhciAqKWRhdGEgKyBzaXplX2RvbmUsCisgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIGNvcHkpOworCisgICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7CisKKyAgICAgICAgc2l6ZV9kb25lICs9IGNvcHk7CisgICAgICAgIHNpemVfcmVtYWluaW5nIC09IGNvcHk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7CisgICAgfQorCisgICAgaWYgKHBvc3RFT1MpIHsKKyAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MocG9zdEVPU0RlbGF5VXMpOworICAgIH0KKworICAgIGlmIChwb3N0U2Vla0NvbXBsZXRlKSB7CisgICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemVfZG9uZTsKK30KKworaW50NjRfdCBBdWRpb1BsYXllckJhc2U6OmdldFJlYWxUaW1lVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UmVhbFRpbWVVc0xvY2tlZCgpOworfQorCitpbnQ2NF90IEF1ZGlvUGxheWVyQmFzZTo6Z2V0UmVhbFRpbWVVc0xvY2tlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gLW1MYXRlbmN5VXMgKyAobU51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Cit9CisKK2ludDY0X3QgQXVkaW9QbGF5ZXJCYXNlOjpnZXRNZWRpYVRpbWVVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIDwgMCB8fCBtUG9zaXRpb25UaW1lUmVhbFVzIDwgMCkgeworICAgICAgICBpZiAobVNlZWtpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vla1RpbWVVczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludDY0X3QgcmVhbFRpbWVPZmZzZXQgPSBnZXRSZWFsVGltZVVzTG9ja2VkKCkgLSBtUG9zaXRpb25UaW1lUmVhbFVzOworICAgIGlmIChyZWFsVGltZU9mZnNldCA8IDApIHsKKyAgICAgICAgcmVhbFRpbWVPZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybiBtUG9zaXRpb25UaW1lTWVkaWFVcyArIHJlYWxUaW1lT2Zmc2V0OworfQorCitib29sIEF1ZGlvUGxheWVyQmFzZTo6Z2V0TWVkaWFUaW1lTWFwcGluZygKKyAgICAgICAgaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqcmVhbHRpbWVfdXMgPSBtUG9zaXRpb25UaW1lUmVhbFVzOworICAgICptZWRpYXRpbWVfdXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKKworICAgIHJldHVybiBtUG9zaXRpb25UaW1lUmVhbFVzICE9IC0xICYmIG1Qb3NpdGlvblRpbWVNZWRpYVVzICE9IC0xOworfQorCitzdGF0dXNfdCBBdWRpb1BsYXllckJhc2U6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVNlZWtpbmcgPSB0cnVlOworICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOworCisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb1RyYWNrLT5mbHVzaCgpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9BdWRpb1BsYXllckJhc2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQXVkaW9QbGF5ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOWZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQXVkaW9QbGF5ZXJCYXNlLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BMQVlFUl9CQVNFX0hfCisKKyNkZWZpbmUgQVVESU9fUExBWUVSX0JBU0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhU291cmNlOworY2xhc3MgQXVkaW9UcmFjazsKK2NsYXNzIFByZXZpZXdQbGF5ZXJCYXNlOworCitjbGFzcyBBdWRpb1BsYXllckJhc2UgOiBwdWJsaWMgVGltZVNvdXJjZSB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIFJFQUNIRURfRU9TLAorICAgICAgICBTRUVLX0NPTVBMRVRFCisgICAgfTsKKworICAgIEF1ZGlvUGxheWVyQmFzZShjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKKyAgICAgICAgICAgICAgICBQcmV2aWV3UGxheWVyQmFzZSAqYXVkaW9PYnNlcnZlciA9IE5VTEwpOworCisgICAgdmlydHVhbCB+QXVkaW9QbGF5ZXJCYXNlKCk7CisKKyAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgLy8gUmV0dXJuIHRpbWUgaW4gdXMuCisgICAgdmlydHVhbCBpbnQ2NF90IGdldFJlYWxUaW1lVXMoKTsKKworICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7CisKKyAgICB2b2lkIHBhdXNlKGJvb2wgcGxheVBlbmRpbmdTYW1wbGVzID0gZmFsc2UpOworICAgIHZvaWQgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgYnVmZmVyIHBsYXllZCAoaW4gdXMpLgorICAgIGludDY0X3QgZ2V0TWVkaWFUaW1lVXMoKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgYSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkLCBpLmUuIHRoZSBBdWRpb1BsYXllckJhc2UKKyAgICAvLyBoYXMgcGxheWVkIGF0IGxlYXN0IG9uZSBmcmFtZSBvZiBhdWRpby4KKyAgICBib29sIGdldE1lZGlhVGltZU1hcHBpbmcoaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cyk7CisKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKKworICAgIGJvb2wgaXNTZWVraW5nKCk7CisgICAgYm9vbCByZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cyk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgQXVkaW9UcmFjayAqbUF1ZGlvVHJhY2s7CisKKyAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOworCisgICAgaW50IG1TYW1wbGVSYXRlOworICAgIGludDY0X3QgbUxhdGVuY3lVczsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIGludDY0X3QgbU51bUZyYW1lc1BsYXllZDsKKworICAgIGludDY0X3QgbVBvc2l0aW9uVGltZU1lZGlhVXM7CisgICAgaW50NjRfdCBtUG9zaXRpb25UaW1lUmVhbFVzOworCisgICAgYm9vbCBtU2Vla2luZzsKKyAgICBib29sIG1SZWFjaGVkRU9TOworICAgIHN0YXR1c190IG1GaW5hbFN0YXR1czsKKyAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworCisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIGJvb2wgbUlzRmlyc3RCdWZmZXI7CisgICAgc3RhdHVzX3QgbUZpcnN0QnVmZmVyUmVzdWx0OworICAgIE1lZGlhQnVmZmVyICptRmlyc3RCdWZmZXI7CisKKyAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKKyAgICBQcmV2aWV3UGxheWVyQmFzZSAqbU9ic2VydmVyOworCisgICAgc3RhdGljIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pOworICAgIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pOworCisgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCisgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUpOworCisgICAgc2l6ZV90IGZpbGxCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzTG9ja2VkKCkgY29uc3Q7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICB1aW50MzJfdCBnZXROdW1GcmFtZXNQZW5kaW5nUGxheW91dCgpIGNvbnN0OworCisgICAgQXVkaW9QbGF5ZXJCYXNlKGNvbnN0IEF1ZGlvUGxheWVyQmFzZSAmKTsKKyAgICBBdWRpb1BsYXllckJhc2UgJm9wZXJhdG9yPShjb25zdCBBdWRpb1BsYXllckJhc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFVRElPX1BMQVlFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmNwcAppbmRleCAwNGY4ZGM5Li44MjczYTQwIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKQEAgLTc2LDkgKzc2LDEwIEBACiAgICAgbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLAogICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKICAgICBtRnJhbWVEdXJhdGlvblVzKGZyYW1lRHVyYXRpb25VcyksCisgICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCiAgICAgbUF1ZGlvRHVyYXRpb25VcyhhdWRpb0R1cmF0aW9uVXMpLAogICAgIG1UaW1lU3RhbXBVcygwKSAsCi0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCisKICAgICBtQnVmZmVyR3JvdXAoTlVMTCl7CiAgICAgTE9HMigiRHVtbXlBdWRpb1NvdXJjZTo6RHVtbXlBdWRpb1NvdXJjZSBjb25zdHJ1Y3RvciBTVEFSVCIpOwogICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KQEAgLTk3LDcgKzk4LDEyIEBACiAgICAgTE9HMigiRHVtbXlBdWRpb1NvdXJjZTo6fkR1bW15QXVkaW9Tb3VyY2UiKTsKIH0KIAotCit2b2lkIER1bW15QXVkaW9Tb3VyY2U6OnNldER1cmF0aW9uIChpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgTE9HMigiU2V0RHVyYXRpb24gJWxsZCIsIG1BdWRpb0R1cmF0aW9uVXMpOworICAgIG1BdWRpb0R1cmF0aW9uVXMgKz0gYXVkaW9EdXJhdGlvblVzOworICAgIExPRzIoIlNldER1cmF0aW9uICVsbGQiLCBtQXVkaW9EdXJhdGlvblVzKTsKK30KIAogc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewogICAgIHN0YXR1c190IGVyciA9IE9LOwpAQCAtMTQzLDcgKzE0OSw3IEBACiAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGluZ1JhdGUpOwogICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUZyYW1lRHVyYXRpb25Vcyk7CiAKLSAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15QXVkaW9Tb3VyY2UiKTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlBdWRpb1NvdXJjZSIpOwogCiAgICAgcmV0dXJuIG1ldGE7CiB9CkBAIC0xNTIsMTggKzE1OCwyMCBAQAogICAgIHN0YXR1c190IGVyciAgICAgICAgICAgID0gT0s7CiAgICAgLy9MT0cyKCJEdW1teUF1ZGlvU291cmNlOjpyZWFkIFNUQVJUIik7CiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBpbnQzMl90IGJ5dGVDb3VudDsKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwogICAgICAgICBtVGltZVN0YW1wVXMgPSBzZWVrVGltZVVzOwotICAgICB9Ci0KLSAgICBpZiAobVRpbWVTdGFtcFVzID49IG1BdWRpb0R1cmF0aW9uVXMpIHsKLSAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtVGltZVN0YW1wVXMgPj0gbUF1ZGlvRHVyYXRpb25VcykgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICBMT0dJKCJFT1MgcmVhY2hlZCIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KICAgICB9CiAKICAgICBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwpAQCAtMTcxLDEzICsxNzksOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHVpbnQ4X3QgKmlucHV0UHRyID0KLSAgICAoIHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBtZW1zZXQKLSAgICBmb3IgKGJ5dGVDb3VudCA9IDA7IGJ5dGVDb3VudCA8IChtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsgYnl0ZUNvdW50KyspIHsKLSAgICAgICAgaW5wdXRQdHJbYnl0ZUNvdW50XSA9IDA7Ci0gICAgfQorICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAwLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsKIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIChtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKSk7CiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmgKaW5kZXggYTU2MmJjMS4uYmIzZjRhMiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmgKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmgKQEAgLTQ1LDggKzQ1LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsNCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7DQogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOw0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQgKE1lZGlhQnVmZmVyICoqYnVmZmVyLCANCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkIChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7DQorICAgIHZvaWQgc2V0RHVyYXRpb24gKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsNCiANCiBwcm90ZWN0ZWQ6DQogICAgIER1bW15QXVkaW9Tb3VyY2UgKGludDMyX3Qgc2FtcGxpbmdSYXRlLA0KQEAgLTYyLDcgKzYzLDggQEAKICAgICBpbnQzMl90IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lOw0KICAgICBpbnQ2NF90IG1BdWRpb0R1cmF0aW9uVXM7DQogICAgIGludDY0X3QgbVRpbWVTdGFtcFVzOw0KLSAgICBpbnQzMl90IG1OYkJ1ZmZlcjsNCisgICAgTXV0ZXggbUxvY2s7DQorDQogICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsNCiANCiAgICAgRHVtbXlBdWRpb1NvdXJjZShjb25zdCBEdW1teUF1ZGlvU291cmNlICYpOw0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCmluZGV4IDU4NDg3YjIuLjgwODE2NjAgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcApAQCAtOTYsNyArOTYsNyBAQAogDQogICAgIExPRzIoIkR1bW15VmlkZW9Tb3VyY2U6OnN0b3AgU1RBUlQiKTsNCiAgICAgaWYgKG1JbWFnZUJ1ZmZlciAhPSBOVUxMKSB7DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUltYWdlQnVmZmVyKTsNCisgICAgICAgIGZyZWUobUltYWdlQnVmZmVyKTsNCiAgICAgICAgIG1JbWFnZUJ1ZmZlciA9IE5VTEw7DQogICAgIH0NCiAgICAgTE9HMigiRHVtbXlWaWRlb1NvdXJjZTo6c3RvcCBFTkQiKTsNCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZtSW1hZ2VQbGF5U3RhcnRUaW1lLCAxMDAwKTsgLy8xMDAwIHRpbWUgc2NhbGUgZm9yIHRpbWUgaW4gbXMNCiAgICAgfQ0KIA0KLSAgICBpZiAoKG1JbWFnZVNlZWtUaW1lID09IG1JbWFnZUNsaXBEdXJhdGlvbikgfHwgKG1GcmFtZVRpbWVVcyA9PSBtSW1hZ2VDbGlwRHVyYXRpb24pKSB7DQorICAgIGlmICgobUltYWdlU2Vla1RpbWUgPT0gbUltYWdlQ2xpcER1cmF0aW9uKSB8fCAobUZyYW1lVGltZVVzID09IChpbnQ2NF90KW1JbWFnZUNsaXBEdXJhdGlvbikpIHsNCiAgICAgICAgIExPRzIoIkR1bW15VmlkZW9Tb3VyY2U6OnJlYWQoKSBFbmQgb2Ygc3RyZWFtIHJlYWNoZWQ7IHJldHVybiBOVUxMIGJ1ZmZlciIpOw0KICAgICAgICAgKm91dCA9IE5VTEw7DQogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsNCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oCmluZGV4IDZmY2MwYTkuLjY4NmU2MzcgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oCkBAIC0yMSw3ICsyMSw2IEBACiANCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPg0KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+DQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4NCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4NCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPg0KICNpbmNsdWRlICJPTVhfSVZDb21tb24uaCINCkBAIC0zNiw3ICszNSw2IEBACiANCiBjbGFzcyAgTWVkaWFCdWZmZXI7DQogY2xhc3MgIE1ldGFEYXRhOw0KLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOw0KIA0KIHN0cnVjdCBEdW1teVZpZGVvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsNCiANCkBAIC02Myw3ICs2MSw2IEBACiAgICAgdWludDY0X3QgbUltYWdlQ2xpcER1cmF0aW9uOw0KICAgICBjb25zdCBjaGFyICptVXJpOw0KICAgICBpbnQ2NF90IG1GcmFtZVRpbWVVczsNCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOw0KICAgICBib29sIG1Jc0ZpcnN0SW1hZ2VGcmFtZTsNCiAgICAgdm9pZCAqbUltYWdlQnVmZmVyOw0KICAgICBNNE9TQV9UaW1lIG1JbWFnZVBsYXlTdGFydFRpbWU7DQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmMjZhMThjLi44YzllZjEwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKICNpbmNsdWRlICJEdW1teVZpZGVvU291cmNlLmgiCiAjaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0xpdmVTZXNzaW9uLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oIgogCkBAIC0xNzEsMTcgKzE3MCwxOCBAQAogfQogCiBQcmV2aWV3UGxheWVyOjpQcmV2aWV3UGxheWVyKCkKLSAgICA6IEF3ZXNvbWVQbGF5ZXIoKSwKLSAgICAgIG1GcmFtZVJHQkJ1ZmZlcihOVUxMKSwKLSAgICAgIG1GcmFtZVlVVkJ1ZmZlcihOVUxMKSwKKyAgICA6IFByZXZpZXdQbGF5ZXJCYXNlKCksCisgICAgICBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCgwKSAgICwKICAgICAgIG1SZXBvcnRlZFdpZHRoKDApLAogICAgICAgbVJlcG9ydGVkSGVpZ2h0KDApLAotICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgoMCkgeworICAgICAgbUZyYW1lUkdCQnVmZmVyKE5VTEwpLAorICAgICAgbUZyYW1lWVVWQnVmZmVyKE5VTEwpewogCiAgICAgbVZpZGVvUmVuZGVyZXIgPSBOVUxMOwogICAgIG1MYXN0VmlkZW9CdWZmZXIgPSBOVUxMOwogICAgIG1TdXNwZW5zaW9uU3RhdGUgPSBOVUxMOwogICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOworICAgIG1WZUF1ZGlvUGxheWVyID0gTlVMTDsKICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMgPSAwOwogICAgIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUgPSAwOwogICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSA9IDA7CkBAIC0xOTIsMTcgKzE5MiwxNyBAQAogICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSAwOwogICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7CiAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgIG1WZUF1ZGlvUGxheWVyID0gTlVMTDsKKyAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IHRydWU7CiAKICAgICBtVmlkZW9FdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uVmlkZW9FdmVudCk7CiAgICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7CiAgICAgbVN0cmVhbURvbmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgICZBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUpOworICAgICAgICAgJlByZXZpZXdQbGF5ZXI6Om9uU3RyZWFtRG9uZSk7CiAKICAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwogCiAgICAgbUNoZWNrQXVkaW9TdGF0dXNFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgIHRoaXMsICZBd2Vzb21lUGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMpOworICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllckJhc2U6Om9uQ2hlY2tBdWRpb1N0YXR1cyk7CiAKICAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKIApAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgcmVzZXQoKTsKIAogICAgIGlmKG1SZXNpemVkVmlkZW9CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKG1SZXNpemVkVmlkZW9CdWZmZXItPmRhdGEoKSkpOworICAgICAgICBmcmVlKChtUmVzaXplZFZpZGVvQnVmZmVyLT5kYXRhKCkpKTsKICAgICAgICAgbVJlc2l6ZWRWaWRlb0J1ZmZlciA9IE5VTEw7CiAgICAgfQogCkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICAgICAgTE9HVigiUHJldmlld1BsYXllcjogc2V0RGF0YVNvdXJjZV9sIER1bW15YXVkaW9jcmVhdGlvbiBzdGFydGVkIik7CiAKICAgICAgICAgbUF1ZGlvVHJhY2sgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobVBsYXlFbmRUaW1lTXNlYykqMTAwMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7CiAgICAgICAgIExPR1YoIlByZXZpZXdQbGF5ZXI6IHNldERhdGFTb3VyY2VfbCBEdW1teWF1aW9zb3VyY2UgY3JlYXRlZCIpOwogICAgICAgICBpZihtQXVkaW9UcmFjayAhPSBOVUxMKSB7CiAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgTE9HVigiUHJldmlld1BsYXllcjogc2V0RGF0YVNvdXJjZV9sX2pwZyBzdGFydGVkIik7CiAKICAgICBtQXVkaW9Tb3VyY2UgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwogICAgIExPR1YoIlByZXZpZXdQbGF5ZXI6IHNldERhdGFTb3VyY2VfbF9qcGcgRHVtbXlhdWRpb3NvdXJjZSBjcmVhdGVkIik7CiAgICAgaWYobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgc2V0QXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlKTsKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIG1EdXJhdGlvblVzID0gKG1QbGF5RW5kVGltZU1zZWMgLSBtUGxheUJlZ2luVGltZU1zZWMpKjEwMDA7CisgICAgbUR1cmF0aW9uVXMgPSAobVBsYXlFbmRUaW1lTXNlYyAtIG1QbGF5QmVnaW5UaW1lTXNlYykqMTAwMExMOwogCiAgICAgbVZpZGVvU291cmNlID0gRHVtbXlWaWRlb1NvdXJjZTo6Q3JlYXRlKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzLCBtVXJpKTsKQEAgLTM5Nyw3ICszOTcsMTAgQEAKIAogICAgIG1UaW1lU291cmNlID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7CisgICAgLy9TaW5nbGUgYXVkaW8gcGxheWVyIGluc3RhbmNlIHVzZWQKKyAgICAvL1NvIGRvbm90IGRlbGV0ZSBpdCBoZXJlCisgICAgLy9JdCBpcyBkZWxldGVkIGZyb20gUHJldmlld0NvbnRyb2xsZXIgY2xhc3MKKyAgICAvL2RlbGV0ZSBtQXVkaW9QbGF5ZXI7CiAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKIAogICAgIGlmIChtTGFzdFZpZGVvQnVmZmVyKSB7CkBAIC00NDcsMjMgKzQ1MCwxMSBAQAogICAgIG1Jc1ZpZGVvU291cmNlSnBnID0gZmFsc2U7CiAgICAgbUZyYW1lUkdCQnVmZmVyID0gTlVMTDsKICAgICBpZihtRnJhbWVZVVZCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUZyYW1lWVVWQnVmZmVyKTsKKyAgICAgICAgZnJlZShtRnJhbWVZVVZCdWZmZXIpOwogICAgICAgICBtRnJhbWVZVVZCdWZmZXIgPSBOVUxMOwogICAgIH0KIH0KIAotdm9pZCBQcmV2aWV3UGxheWVyOjpwYXJ0aWFsX3Jlc2V0X2woKSB7Ci0KLSAgICBpZiAobUxhc3RWaWRlb0J1ZmZlcikgewotICAgICAgICBtTGFzdFZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1MYXN0VmlkZW9CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIGNhbGwgYmFzZSBzdHJ1Y3QgKi8KLSAgICBBd2Vzb21lUGxheWVyOjpwYXJ0aWFsX3Jlc2V0X2woKTsKLQotfQotCiBzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwbGF5KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTQ3Miw4ICs0NjMsMTU0IEBACiAgICAgcmV0dXJuIHBsYXlfbCgpOwogfQogCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzdGFydEF1ZGlvUGxheWVyX2woKSB7CisgICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7CisKKyAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7CisgICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOworCisgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCisgICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCisgICAgICAgIHN0YXR1c190IGVyciA9IG1WZUF1ZGlvUGxheWVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1WZUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKKworICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9QbGF5ZXIoQXVkaW9QbGF5ZXJCYXNlICphdWRpb1BsYXllcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgQ0hFQ0soIShtRmxhZ3MgJiBQTEFZSU5HKSk7CisgICAgbUF1ZGlvUGxheWVyID0gYXVkaW9QbGF5ZXI7CisKKyAgICBMT0dWKCJTZXRBdWRpb1BsYXllciIpOworICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKKyAgICBtVmVBdWRpb1BsYXllciA9CisgICAgICAgICAgICAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciopbUF1ZGlvUGxheWVyOworCisgICAgLy8gY2hlY2sgaWYgdGhlIG5ldyBhbmQgb2xkIHNvdXJjZSBhcmUgZHVtbXkKKyAgICBzcDxNZWRpYVNvdXJjZT4gYW5BdWRpb1NvdXJjZSA9IG1WZUF1ZGlvUGxheWVyLT5nZXRTb3VyY2UoKTsKKyAgICBpZiAoYW5BdWRpb1NvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0LgorICAgICAgICBMT0dWKCJzZXRBdWRpb1BsYXllcjogQXVkaW8gcGxheWVyIGRvZXMgbm90IGhhdmUgYW55IHNvdXJjZSBzZXQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIElmIG5ldyB2aWRlbyBzb3VyY2UgaXMgbm90IGR1bW15LCB0aGVuIGFsd2F5cyBjaGFuZ2Ugc291cmNlCisgICAgLy8gRWxzZSBhdWRpbyBwbGF5ZXIgY29udGludWVzIHVzaW5nIG9sZCBhdWRpbyBzb3VyY2UgYW5kIHRoZXJlIGFyZQorICAgIC8vIGZyYW1lIGRyb3BzIHRvIG1haW50YWluIEFWIHN5bmMKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnBWaWRTcmNUeXBlOworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwVmlkU3JjVHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAocFZpZFNyY1R5cGUsICJEdW1teVZpZGVvU291cmNlIikgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR1YoIiBWaWRlbyBjbGlwIHdpdGggc2lsZW50IGF1ZGlvOyBuZWVkIHRvIGNoYW5nZSBzb3VyY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpwU3JjVHlwZTE7CisgICAgY29uc3QgY2hhciAqcFNyY1R5cGUyOworICAgIG1ldGEgPSBhbkF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBTcmNUeXBlMSkpIHsKKyAgICAgICAgaWYgKHN0cmNtcChwU3JjVHlwZTEsICJEdW1teUF1ZGlvU291cmNlIikgPT0gMCkgeworICAgICAgICAgICAgbWV0YSA9IG1BdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwU3JjVHlwZTIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwU3JjVHlwZTIsICJEdW1teUF1ZGlvU291cmNlIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHNldCB0aGUgbmV3IHBsYXkgZHVyYXRpb24gZm9yIHRoZSBleGlzdGluZyBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2UgKnBNZWRpYVNyYyA9IGFuQXVkaW9Tb3VyY2UuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIER1bW15QXVkaW9Tb3VyY2UgKnBEdW1teUF1ZGlvU291cmNlID0gKER1bW15QXVkaW9Tb3VyY2UqKXBNZWRpYVNyYzsKKyAgICAgICAgICAgICAgICAgICAgLy9JbmNyZW1lbnQgdGhlIGR1cmF0aW9uIG9mIGF1ZGlvIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICBwRHVtbXlBdWRpb1NvdXJjZS0+c2V0RHVyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIG5ldyBhdWRpbyBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgY29udGludWUgdXNpbmcgb2xkIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXRBdWRpb1BsYXllcjogc3RvcCBuZXcgYXVkaW8gc291cmNlIik7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUoKSB7CisgICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKCFtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAobVN0cmVhbURvbmVTdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBMT0dWKCJNRURJQV9FUlJPUiAlZCIsIG1TdHJlYW1Eb25lU3RhdHVzKTsKKworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBtU3RyZWFtRG9uZVN0YXR1cyk7CisKKyAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7CisKKyAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgYWxsRG9uZSA9CisgICAgICAgIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgVklERU9fQVRfRU9TKSkKKyAgICAgICAgICAgICYmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgQVVESU9fQVRfRU9TKSk7CisKKyAgICBpZiAoIWFsbERvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiAoTE9PUElORyB8IEFVVE9fTE9PUElORykpIHsKKyAgICAgICAgc2Vla1RvX2woMCk7CisKKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOworICAgICAgICAvL3BhdXNlIGJlZm9yZSBzZW5kaW5nIGV2ZW50CisgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOworCisgICAgICAgIC8vVGhpcyBsb2NrIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAorICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrQ29udHJvbCk7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOworCisgICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CisgICAgICAgIExPR1YoIm9uU3RyZWFtRG9uZSBlbmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworCiBzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwbGF5X2woKSB7CiAKKyAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKwogICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC01MTIsMjYgKzY0OSw3NSBAQAogICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCiAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7CiAKLSAgICAgICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1WZUF1ZGlvUGxheWVyOworICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKKyAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIE1lZGlhU291cmNlIGluIG9yZGVyIHRvIGVuYWJsZQorICAgICAgICAgICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZlQXVkaW9QbGF5ZXItPnN0YXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlIG1BdWRpb1BsYXllcjsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1UaW1lU291cmNlID0gbVZlQXVkaW9QbGF5ZXI7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7CiAgICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVmVBdWRpb1BsYXllciA9IChWaWRlb0VkaXRvckF1ZGlvUGxheWVyKiltQXVkaW9QbGF5ZXI7CisgICAgICAgICAgICBib29sIGlzQXVkaW9QbGF5ZXJTdGFydGVkID0gbVZlQXVkaW9QbGF5ZXItPmlzU3RhcnRlZCgpOwogCi0gICAgICAgIENIRUNLKCEobUZsYWdzICYgQVVESU9fUlVOTklORykpOworICAgICAgICAgICAgaWYgKG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJwbGF5X2w6IENoYW5nZSBhdWRpbyBzb3VyY2UgcmVxdWlyZWQiKTsKIAotICAgICAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOworICAgICAgICAgICAgICAgIGlmIChpc0F1ZGlvUGxheWVyU3RhcnRlZCA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1WZUF1ZGlvUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtVmVBdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIG1WZUF1ZGlvUGxheWVyLT5zZXRTb3VyY2UobUF1ZGlvU291cmNlKTsKKyAgICAgICAgICAgICAgICBtVmVBdWRpb1BsYXllci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisKKyAgICAgICAgICAgICAgICBtVmVBdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncygKKyAgICAgICAgICAgICAgICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgIG1WZUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNBdWRpb1BsYXllclN0YXJ0ZWQgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBtVmVBdWRpb1BsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1WZUF1ZGlvUGxheWVyLT5zdGFydCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WZUF1ZGlvUGxheWVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1YoInBsYXlfbDogTm8gU291cmNlIGNoYW5nZSByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgIG1WZUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7CisKKyAgICAgICAgICAgICAgICBtVmVBdWRpb1BsYXllci0+cmVzdW1lKCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOworICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7CisgICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1WZUF1ZGlvUGxheWVyOworICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOworICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTQ2LDYgKzczMiw3IEBACiAgICAgICAgIE1lZGlhQnVmZmVyICphTG9jYWxCdWZmZXI7CiAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKICAgICAgICAgbVZpZGVvU291cmNlLT5yZWFkKCZhTG9jYWxCdWZmZXIsICZvcHRpb25zKTsKKyAgICAgICAgYUxvY2FsQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CkBAIC01NjgsMzggKzc1NSw5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzdGFydEF1ZGlvUGxheWVyX2woKSB7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotCi0gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCi0gICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1WZUF1ZGlvUGxheWVyLT5zdGFydCgKLSAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WZUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKLQotICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KIAogc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFJlbmRlcmVyX2woKSB7Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpIHsKKyAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKICAgICAgICAgaW50MzJfdCBmb3JtYXQ7CkBAIC02MzgsMTIgKzc5Niw2IEBACiB9CiAKIAotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRJU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtSVN1cmZhY2UgPSBpc3VyZmFjZTsKLX0KLQotCiBzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lVXMpIHsKIAogICAgIGlmICgobUV4dHJhY3RvckZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLKSB8fCAobUlzVmlkZW9Tb3VyY2VKcGcpKSB7CkBAIC03NjQsNiArOTE2LDExIEBACiAgICAgfQogICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwogCisgICAgaWYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykgeworICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIFRpbWVTb3VyY2UgKnRzX3N0ID0gICZtU3lzdGVtVGltZVNvdXJjZTsKICAgICBpbnQ2NF90IHRpbWVTdGFydFVzID0gdHNfc3QtPmdldFJlYWxUaW1lVXMoKTsKIApAQCAtNzc0LDcgKzkzMSw3IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIGlmKG1TZWVraW5nID09IFNFRUsgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKIAogICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2VlayB0aGUgdmlkZW8gc291cmNlIGZpcnN0LCBmb2xsb3dlZCBieQogICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNvdXJjZS4KQEAgLTc5OSwxMCArOTU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICBtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQwotICAgICAgICAgICAgICAgICAgICAgICAgOiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5yZWFkKCZtVmlkZW9CdWZmZXIsICZvcHRpb25zKTsKQEAgLTgyMSw4ICs5NzUsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVyciAhPSBPSyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsgLy8gc2FudG9zaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC04MzUsMTEgKzk5MCwxMSBAQAogICAgICAgICAgICAgICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSgtMSk7CiAgICAgICAgICAgICAgICAgTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IEVPUyByZWFjaGVkLiIpOwogICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKKyAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCisgICAgICAgICAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTg1NSwxNCArMTAxMCwyMyBAQAogICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKICAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7CiAKLSAgICAgICAgICAgIGlmKCh2aWRlb1RpbWVVcy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICAgICAgICAgIC8vIEZyYW1lcyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCi0gICAgICAgICAgICAgICAgLy8gRG9ub3QgcmVuZGVyCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQorICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQorICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZigodmlkZW9UaW1lVXMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnJhbWVzIGFyZSBiZWZvcmUgYmVnaW4gY3V0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9ub3QgcmVuZGVyCisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtODc3LDEwICsxMDQxLDkgQEAKICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgIH0KIAotICAgIG1EZWNvZGVkVmlkZW9UcyA9IHRpbWVVczsKIAogICAgIGlmKCFtU3RhcnROZXh0UGxheWVyKSB7Ci0gICAgICAgIGludDY0X3QgcGxheWJhY2tUaW1lUmVtYWluaW5nID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMCkgLSB0aW1lVXM7CisgICAgICAgIGludDY0X3QgcGxheWJhY2tUaW1lUmVtYWluaW5nID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKSAtIHRpbWVVczsKICAgICAgICAgaWYocGxheWJhY2tUaW1lUmVtYWluaW5nIDw9IDE1MDAwMDApIHsKICAgICAgICAgICAgIC8vV2hlbiBsZXNzIHRoYW4gMS41IHNlYyBvZiBwbGF5YmFjayBsZWZ0CiAgICAgICAgICAgICAvLyBzZW5kIG5vdGlmaWNhdGlvbiB0byBzdGFydCBuZXh0IHBsYXllcgpAQCAtODkyLDExICsxMDU1LDEwIEBACiAKICAgICBTZWVrVHlwZSB3YXNTZWVraW5nID0gbVNlZWtpbmc7CiAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KHRpbWVVcyk7Ci0KLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgeworICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAhKG1GbGFncyAmIChBVURJT19SVU5OSU5HKSkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIExPR0UoIlN0YXJ0dW5nIHRoZSBhdWRpbyBwbGF5ZXIgZmFpbGVkIHcvIGVyciAlZCIsIGVycik7CisgICAgICAgICAgICBMT0dFKCJTdGFydGluZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtOTI2LDYzICsxMDg4LDQwIEBACiAKICAgICAgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7CiAKKyAgICAgICAgaWYgKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgeworICAgICAgICAgICAgLy8gTGV0J3MgZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgc2Vla2luZyByaWdodCBhd2F5LgorICAgICAgICAgICAgbGF0ZW5lc3NVcyA9IDA7CisgICAgICAgIH0KICAgICAgICAgTE9HVigiQXVkaW8gdGltZSBzdGFtcCA9ICVsbGQgYW5kIHZpZGVvIHRpbWUgc3RhbXAgPSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMtPmdldFJlYWxUaW1lVXMoKSx0aW1lVXMpOworICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDQwMDAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gNDBtcyBsYXRlLgogCi0gICAgICAgIGlmICh3YXNTZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewotICAgICAgICAgICAgaWYgKGxhdGVuZXNzVXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiYWZ0ZXIgU0VFS19WSURFT19PTkxZIHdlJ3JlIGxhdGUgYnkgJS4yZiBzZWNzIiwgbGF0ZW5lc3NVcyAvIDFFNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdhc1NlZWtpbmcgPT0gTk9fU0VFSykgewotCi0gICAgICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDUwMDAwMGxsCi0gICAgICAgICAgICAgICAgJiYgbVJUU1BDb250cm9sbGVyID09IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygKLSAgICAgICAgICAgICAgICAgICAgJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJ3ZSdyZSBtdWNoIHRvbyBsYXRlICglLjJmIHNlY3MpLCB2aWRlbyBza2lwcGluZyBhaGVhZCIsCi0gICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMgLyAxRTYpOwotCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIG1TZWVraW5nID0gU0VFS19WSURFT19PTkxZOwotICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gbWVkaWFUaW1lVXM7Ci0KLSAgICAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDQwMDAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KLQotICAgICAgICAgICAgICAgIExPR1YoIkxWIFBMQVlFUiB3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgTE9HVigiTFYgUExBWUVSIHdlJ3JlIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CiAKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0yNTAwMCkgewotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LgotICAgICAgICAgICAgICAgIExPR1YoIldlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LCBsYXRlbmVzcyAlbGxkIiwgbGF0ZW5lc3NVcyk7Ci0KLSAgICAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDI1MDAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMjUwMDApIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LgorICAgICAgICAgICAgTE9HVigiV2UncmUgbW9yZSB0aGFuIDI1bXMgZWFybHksIGxhdGVuZXNzICVsbGQiLCBsYXRlbmVzc1VzKTsKKworICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgyNTAwMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgfHwgbVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewogICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgIGlmICggZXJyICE9IE9LICkKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7IC8vIHNhbnRvc2gKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBJZiB0aW1lc3RhbXAgZXhjZWVkcyBlbmRDdXRUaW1lIG9mIGNsaXAsIGRvbm90IHJlbmRlcgpAQCAtOTk2LDEzICsxMTM1LDE0IEBACiAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7CiAgICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7CiAgICAgICAgIExPR1YoIlByZXZpZXdQbGF5ZXI6IG9uVmlkZW9FdmVudCB0aW1lVXMgPiBtUGxheUVuZFRpbWU7IHNlbmQgRU9TLi4iKTsKLSAgICAgICAgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgICAgICB9CisgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCisgICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7CiAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICAvLyBDYXB0dXJlIHRoZSBmcmFtZSB0aW1lc3RhbXAgdG8gYmUgcmVuZGVyZWQKKyAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7CiAKICAgICAvLyBQb3N0IHByb2Nlc3NpbmcgdG8gYXBwbHkgdmlkZW8gZWZmZWN0cwogICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKQEAgLTEwMjAsNyArMTE2MCw2IEBACiAgICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQogICAgICAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpCiAgICAgICAgICAgICAgICYmIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24gIT0gMCkpIHsKLQogICAgICAgICAgICAgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCiAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIFRSVUUpOwogICAgICAgICB9CkBAIC0xMDM0LDE0ICsxMTczLDEzIEBACiAgICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewogICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5WSURFT19FRkZFQ1RfRlJBTUlORzsgLy9uZXZlciBhcHBseSBmcmFtaW5nIGhlcmUuCiAgICAgICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotCiAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbmRleDsKICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1OdW1iZXJFZmZlY3RzOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcyA9IG1EZWNvZGVkVmlkZW9Ucy8xMDAwOwogICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lT2Zmc2V0ID0gbURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDA7CiAgICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewogICAgICAgICAgICAgICAgICAgICBpZiAoKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSArIDEpIDw9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgKyB0aW1lT2Zmc2V0IC0gbVBsYXlCZWdpblRpbWVNc2VjKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSAtIDEgKwpAQCAtMTExNywxMyArMTI1NSwxNyBAQAogICAgICAgICBMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TLiIpOwogICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwogICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBpZiAobU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotICAgICAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOworICAgICAgICAvLyBTZXQgdGhlIGxhc3QgZGVjb2RlZCB0aW1lc3RhbXAgdG8gZHVyYXRpb24KKyAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgIH0KICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCh3YXNTZWVraW5nICE9IE5PX1NFRUspICYmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7CisgICAgICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmKCFtSXNWaWRlb1NvdXJjZUpwZykgewogICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgwKTsKICAgICAgICAgfQpAQCAtMTM0OCw2ICsxNDkwLDE2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIFByZXZpZXdQbGF5ZXI6OmFjcXVpcmVMb2NrKCkgeworICAgIExPR1YoImFjcXVpcmVMb2NrIik7CisgICAgbUxvY2tDb250cm9sLmxvY2soKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyOjpyZWxlYXNlTG9jaygpIHsKKyAgICBMT0dWKCJyZWxlYXNlTG9jayIpOworICAgIG1Mb2NrQ29udHJvbC51bmxvY2soKTsKK30KKwogc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVzdW1lKCkgewogICAgIExPR1YoInJlc3VtZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0xMzYxLDEzICsxNTEzLDEzIEBACiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKHN0YXRlLT5tRmlsZVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IEF3ZXNvbWVQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChzdGF0ZS0+bUZpbGVTb3VyY2UpOworICAgICAgICBlcnIgPSBQcmV2aWV3UGxheWVyQmFzZTo6c2V0RGF0YVNvdXJjZV9sKHN0YXRlLT5tRmlsZVNvdXJjZSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgbUZpbGVTb3VyY2UgPSBzdGF0ZS0+bUZpbGVTb3VyY2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlX2woc3RhdGUtPm1VcmksICZzdGF0ZS0+bVVyaUhlYWRlcnMpOworICAgICAgICBlcnIgPSBQcmV2aWV3UGxheWVyQmFzZTo6c2V0RGF0YVNvdXJjZV9sKHN0YXRlLT5tVXJpLCAmc3RhdGUtPm1VcmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMzgxLDcgKzE1MzMsNyBAQAogCiAgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKIAotICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIChtU3VyZmFjZSAhPSBOVUxMIHx8IG1JU3VyZmFjZSAhPSBOVUxMKSkgeworICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIChtU3VyZmFjZSAhPSBOVUxMKSkgewogICAgICAgICBtVmlkZW9SZW5kZXJlciA9CiAgICAgICAgICAgICBQcmV2aWV3TG9jYWxSZW5kZXJlcjo6aW5pdFByZXZpZXdMb2NhbFJlbmRlcmVyKAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gcHJldmlld09ubHkKQEAgLTE0NjEsNyArMTYxMyw3IEBACiBzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKIAogICAgIG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjKjEwMDA7CisgICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjKjEwMDBMTDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2MDYsNyArMTc1OCw3IEBACiAKICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKICAgICB7Ci0gICAgICAgIExPR0UoImRvTWVkaWFSZW5kZXJpbmc6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsIGVycik7CisgICAgICAgIExPR0UoImRvTWVkaWFSZW5kZXJpbmc6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsIChpbnQpZXJyKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgICAgbVZpZGVvUmVzaXplZE9yQ3JvcHBlZCA9IHRydWU7CkBAIC0xNjE2LDcgKzE3NjgsNyBAQAogCiBzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCkgewogCi0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjKjEwMDA7CisgICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjKjEwMDBMTDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE4NDAsMTMgKzE5OTIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBlcnIgIT0gT0sgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsgLy8gc2FudG9zaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TIHJlYWNoZWQuIik7CiAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwogICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KQEAgLTE4NjIsMTUgKzIwMTYsMjMgQEAKIAogICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKICAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGlmKCh2aWRlb1RpbWVVcy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBiZWdpbiBjdXQgdGltZQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVtCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQorICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQorICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZigodmlkZW9UaW1lVXMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGVtCisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTg4OSw0ICsyMDUxLDkgQEAKIAogfQogCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcykgeworICAgICpsYXN0UmVuZGVyZWRUaW1lTXMgPSAoKChtRGVjb2RlZFZpZGVvVHMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpOworICAgIHJldHVybiBPSzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1MzgyNjk4Li5iNzkzNjM5Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oCkBAIC0yOCwxMiArMjgsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPEF3ZXNvbWVQbGF5ZXIuaD4KKyNpbmNsdWRlICJQcmV2aWV3UGxheWVyQmFzZS5oIgogI2luY2x1ZGUgIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9QbGF5ZXI7CitzdHJ1Y3QgQXVkaW9QbGF5ZXJCYXNlOwogc3RydWN0IERhdGFTb3VyY2U7CiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7CkBAIC01MSw3ICs1MSw3IEBACiAgICAgUHJldmlld1BsYXllclJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1BsYXllclJlbmRlcmVyICYpOwogfTsKIAotc3RydWN0IFByZXZpZXdQbGF5ZXIgOiBwdWJsaWMgQXdlc29tZVBsYXllciB7CitzdHJ1Y3QgUHJldmlld1BsYXllciA6IHB1YmxpYyBQcmV2aWV3UGxheWVyQmFzZSB7CiAgICAgUHJldmlld1BsYXllcigpOwogICAgIH5QcmV2aWV3UGxheWVyKCk7CiAKQEAgLTYwLDE0ICs2MCwxNCBAQAogCiAgICAgc3RhdHVzX3QgcGxheSgpOwogCi0gICAgdm9pZCBzZXRJU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlKTsKLQogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBnZXRWaWRlb0RpbWVuc2lvbnMoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBzdXNwZW5kKCk7CiAgICAgc3RhdHVzX3QgcmVzdW1lKCk7CisgICAgdm9pZCBhY3F1aXJlTG9jaygpOworICAgIHZvaWQgcmVsZWFzZUxvY2soKTsKIAogICAgIHN0YXR1c190IHByZXBhcmUoKTsKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKApAQCAtOTIsNyArOTIsOCBAQAogICAgIHN0YXR1c190IHJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKICAgICBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwogICAgIHN0YXR1c190IHJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLQorICAgIHN0YXR1c190IGdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BsYXllcihBdWRpb1BsYXllckJhc2UgKmF1ZGlvUGxheWVyKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IFByZXZpZXdQbGF5ZXJFdmVudDsKQEAgLTExMSwyNCArMTEyLDIzIEBACiAgICAgICAgIEFVVE9fTE9PUElORyAgICAgICAgPSAxMDI0LAogICAgIH07CiAKLSAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOwotCiAgICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHMoYm9vbCBrZWVwQnVmZmVyaW5nR29pbmcgPSBmYWxzZSk7CiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKTsKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woCiAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogICAgIHZvaWQgcmVzZXRfbCgpOwotICAgIHZvaWQgcGFydGlhbF9yZXNldF9sKCk7CiAgICAgc3RhdHVzX3QgcGxheV9sKCk7CiAgICAgc3RhdHVzX3QgaW5pdFJlbmRlcmVyX2woKTsKICAgICBzdGF0dXNfdCBpbml0QXVkaW9EZWNvZGVyKCk7CiAgICAgc3RhdHVzX3QgaW5pdFZpZGVvRGVjb2Rlcih1aW50MzJfdCBmbGFncyA9IDApOwogICAgIHZvaWQgb25WaWRlb0V2ZW50KCk7CisgICAgdm9pZCBvblN0cmVhbURvbmUoKTsKICAgICBzdGF0dXNfdCBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKICAgICBzdGF0aWMgYm9vbCBDb250aW51ZVByZXBhcmF0aW9uKHZvaWQgKmNvb2tpZSk7CiAgICAgdm9pZCBvblByZXBhcmVBc3luY0V2ZW50KCk7CiAgICAgdm9pZCBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwogICAgIHN0YXR1c190IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOworICAgIGJvb2wgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQ7CiAKICAgICBzcDxQcmV2aWV3UGxheWVyUmVuZGVyZXI+IG1WaWRlb1JlbmRlcmVyOwogCkBAIC0yMDAsMTAgKzIwMCwxMCBAQAogICAgIGJvb2wgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7CiAgICAgaW50NjRfdCBtSW1hZ2VGcmFtZVRpbWVVczsKICAgICBib29sIG1TdGFydE5leHRQbGF5ZXI7CisgICAgbXV0YWJsZSBNdXRleCBtTG9ja0NvbnRyb2w7CiAKICAgICBNNFZJRklfVUludDgqICBtRnJhbWVSR0JCdWZmZXI7CiAgICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1WZUF1ZGlvUGxheWVyOwogCiAgICAgdm9pZCBzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7CkBAIC0yMjAsNiArMjIwLDggQEAKICAgICBzdGF0dXNfdCBwcmVwYXJlX2woKTsKICAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwogCisgICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAgKm1WZUF1ZGlvUGxheWVyOworCiAgICAgUHJldmlld1BsYXllcihjb25zdCBQcmV2aWV3UGxheWVyICYpOwogICAgIFByZXZpZXdQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UGxheWVyICYpOwogfTsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllckJhc2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiOGE3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllckJhc2UuY3BwCkBAIC0wLDAgKzEsMTkxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyN1bmRlZiBERUJVR19IRENQCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUHJldmlld1BsYXllckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQcmV2aWV3UGxheWVyQmFzZS5oIgorI2luY2x1ZGUgIkF1ZGlvUGxheWVyQmFzZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKworI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2VDb21wb3Nlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2RlZmluZSBVU0VfU1VSRkFDRV9BTExPQyAxCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGludDY0X3Qga0xvd1dhdGVyTWFya1VzID0gMjAwMDAwMGxsOyAgLy8gMnNlY3MKK3N0YXRpYyBpbnQ2NF90IGtIaWdoV2F0ZXJNYXJrVXMgPSAxMDAwMDAwMGxsOyAgLy8gMTBzZWNzCitzdGF0aWMgaW50NjRfdCBrSGlnaFdhdGVyTWFya1JUU1BVcyA9IDQwMDAwMDBsbDsgIC8vIDRzZWNzCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb3dXYXRlck1hcmtCeXRlcyA9IDQwMDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrSGlnaFdhdGVyTWFya0J5dGVzID0gMjAwMDAwOworCitzdHJ1Y3QgQXdlc29tZUV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgeworICAgIEF3ZXNvbWVFdmVudCgKKyAgICAgICAgICAgIFByZXZpZXdQbGF5ZXJCYXNlICpwbGF5ZXIsCisgICAgICAgICAgICB2b2lkIChQcmV2aWV3UGxheWVyQmFzZTo6Km1ldGhvZCkoKSkKKyAgICAgICAgOiBtUGxheWVyKHBsYXllciksCisgICAgICAgICAgbU1ldGhvZChtZXRob2QpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Bd2Vzb21lRXZlbnQoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKKyAgICAgICAgKG1QbGF5ZXItPiptTWV0aG9kKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBQcmV2aWV3UGxheWVyQmFzZSAqbVBsYXllcjsKKyAgICB2b2lkIChQcmV2aWV3UGxheWVyQmFzZTo6Km1NZXRob2QpKCk7CisKKyAgICBBd2Vzb21lRXZlbnQoY29uc3QgQXdlc29tZUV2ZW50ICYpOworICAgIEF3ZXNvbWVFdmVudCAmb3BlcmF0b3I9KGNvbnN0IEF3ZXNvbWVFdmVudCAmKTsKK307CisKK3N0cnVjdCBBd2Vzb21lTG9jYWxSZW5kZXJlciA6IHB1YmxpYyBBd2Vzb21lUmVuZGVyZXIgeworICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQorICAgICAgICA6IG1UYXJnZXQobmV3IFNvZnR3YXJlUmVuZGVyZXIobmF0aXZlV2luZG93LCBtZXRhKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgICAgICByZW5kZXIoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBtVGFyZ2V0LT5yZW5kZXIoZGF0YSwgc2l6ZSwgTlVMTCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QXdlc29tZUxvY2FsUmVuZGVyZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OworICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU29mdHdhcmVSZW5kZXJlciAqbVRhcmdldDsKKworICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKGNvbnN0IEF3ZXNvbWVMb2NhbFJlbmRlcmVyICYpOworICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZUxvY2FsUmVuZGVyZXIgJik7OworfTsKKworc3RydWN0IEF3ZXNvbWVOYXRpdmVXaW5kb3dSZW5kZXJlciA6IHB1YmxpYyBBd2Vzb21lUmVuZGVyZXIgeworICAgIEF3ZXNvbWVOYXRpdmVXaW5kb3dSZW5kZXJlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csCisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcykKKyAgICAgICAgOiBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdykgeworICAgICAgICBhcHBseVJvdGF0aW9uKHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbmRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpLmdldCgpKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJxdWV1ZUJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgICAgIC1lcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFEYXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgbWV0YURhdGEtPnNldEludDMyKGtLZXlSZW5kZXJlZCwgMSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QXdlc29tZU5hdGl2ZVdpbmRvd1JlbmRlcmVyKCkge30KKworcHJpdmF0ZToKKyAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OworCisgICAgdm9pZCBhcHBseVJvdGF0aW9uKGludDMyX3Qgcm90YXRpb25EZWdyZWVzKSB7CisgICAgICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKKyAgICAgICAgc3dpdGNoIChyb3RhdGlvbkRlZ3JlZXMpIHsKKyAgICAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNmb3JtKSB7CisgICAgICAgICAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQXdlc29tZU5hdGl2ZVdpbmRvd1JlbmRlcmVyKGNvbnN0IEF3ZXNvbWVOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKKyAgICBBd2Vzb21lTmF0aXZlV2luZG93UmVuZGVyZXIgJm9wZXJhdG9yPSgKKyAgICAgICAgICAgIGNvbnN0IEF3ZXNvbWVOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKK307CisKKy8vIFRvIGNvbGxlY3QgdGhlIGRlY29kZXIgdXNhZ2UKK3ZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSB7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKKyAgICBDSEVDSyhzZXJ2aWNlLmdldCgpICE9IE5VTEwpOworCisgICAgc2VydmljZS0+YWRkQmF0dGVyeURhdGEocGFyYW1zKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1ByZXZpZXdQbGF5ZXJCYXNlOjpQcmV2aWV3UGxheWVyQmFzZSgpCisgICAgOiBtUXVldWVTdGFydGVkKGZhbHNlKSwKKyAgICAgIG1UaW1lU291cmNlKE5VTEwpLAorICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcoZmFsc2UpLAorICAgICAgbUF1ZGlvUGxheWVyKE5VTEwpLAorICAgICAgbURpc3BsYXlXaWR0aCgwKSwKKyAgICAgIG1EaXNwbGF5SGVpZ2h0KDApLAorICAgICAgbUZsYWdzKDApLAorICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAorICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCisgICAgICBtTGFzdFZpZGVvVGltZVVzKC0xKSB7CisgICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CisKKyAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOworCisgICAgbVZpZGVvRXZlbnQgPSBuZXcgQXdlc29tZUV2ZW50KHRoaXMsICZQcmV2aWV3UGxheWVyQmFzZTo6b25WaWRlb0V2ZW50KTsKKyAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtU3RyZWFtRG9uZUV2ZW50ID0gbmV3IEF3ZXNvbWVFdmVudCh0aGlzLCAmUHJldmlld1BsYXllckJhc2U6Om9uU3RyZWFtRG9uZSk7CisgICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtQnVmZmVyaW5nRXZlbnQgPSBuZXcgQXdlc29tZUV2ZW50KHRoaXMsICZQcmV2aWV3UGxheWVyQmFzZTo6b25CdWZmZXJpbmdVcGRhdGUpOworICAgIG1CdWZmZXJpbmdFdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVmlkZW9MYWdFdmVudCA9IG5ldyBBd2Vzb21lRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXJCYXNlOjpvblZpZGVvTGFnVXBkYXRlKTsKKyAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKKworICAgIG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQgPSBuZXcgQXdlc29tZUV2ZW50KAorICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXJCYXNlOjpvbkNoZWNrQXVkaW9TdGF0dXMpOworCisgICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICByZXNldCgpOworfQorCitQcmV2aWV3UGxheWVyQmFzZTo6flByZXZpZXdQbGF5ZXJCYXNlKCkgeworICAgIGlmIChtUXVldWVTdGFydGVkKSB7CisgICAgICAgIG1RdWV1ZS5zdG9wKCk7CisgICAgfQorCisgICAgcmVzZXQoKTsKKworICAgIG1DbGllbnQuZGlzY29ubmVjdCgpOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpjYW5jZWxQbGF5ZXJFdmVudHMoYm9vbCBrZWVwQnVmZmVyaW5nR29pbmcpIHsKKyAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvRXZlbnQtPmV2ZW50SUQoKSk7CisgICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7CisgICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQtPmV2ZW50SUQoKSk7CisgICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtUXVldWUuY2FuY2VsRXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudC0+ZXZlbnRJRCgpKTsKKyAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvTGFnRXZlbnQtPmV2ZW50SUQoKSk7CisgICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAoIWtlZXBCdWZmZXJpbmdHb2luZykgeworICAgICAgICBtUXVldWUuY2FuY2VsRXZlbnQobUJ1ZmZlcmluZ0V2ZW50LT5ldmVudElEKCkpOworICAgICAgICBtQnVmZmVyaW5nRXZlbnRQZW5kaW5nID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKHVyaSwgaGVhZGVycyk7Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpzZXREYXRhU291cmNlX2woCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICByZXNldF9sKCk7CisKKyAgICBtVXJpID0gdXJpOworCisgICAgaWYgKGhlYWRlcnMpIHsKKyAgICAgICAgbVVyaUhlYWRlcnMgPSAqaGVhZGVyczsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVVyaUhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIC8vIEJyb3dzZXIgaXMgaW4gImluY29nbml0byIgbW9kZSwgc3VwcHJlc3MgbG9nZ2luZyBVUkxzLgorCisgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgICAgIG1VcmlIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworCisgICAgICAgICAgICBtRmxhZ3MgfD0gSU5DT0dOSVRPOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEobUZsYWdzICYgSU5DT0dOSVRPKSkgeworICAgICAgICBMT0dJKCJzZXREYXRhU291cmNlX2woJyVzJykiLCBtVXJpLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dJKCJzZXREYXRhU291cmNlX2woVVJMIHN1cHByZXNzZWQpIik7CisgICAgfQorCisgICAgLy8gVGhlIGFjdHVhbCB3b3JrIHdpbGwgYmUgZG9uZSBkdXJpbmcgcHJlcGFyYXRpb24gaW4gdGhlIGNhbGwgdG8KKyAgICAvLyA6OmZpbmlzaFNldERhdGFTb3VyY2VfbCB0byBhdm9pZCBibG9ja2luZyB0aGUgY2FsbGluZyB0aHJlYWQgaW4KKyAgICAvLyBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHJlc2V0X2woKTsKKworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgc3RhdHVzX3QgZXJyID0gZGF0YVNvdXJjZS0+aW5pdENoZWNrKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUZpbGVTb3VyY2UgPSBkYXRhU291cmNlOworCisgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChkYXRhU291cmNlKTsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNldERhdGFTb3VyY2VfbCgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpIHsKKyAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKKworICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKG1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICAgICAgaWYgKFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEICE9IG1EZWNyeXB0SGFuZGxlLT5zdGF0dXMpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIEVSUk9SX0RSTV9OT19MSUNFTlNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNldERhdGFTb3VyY2VfbChjb25zdCBzcDxNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvcikgeworICAgIC8vIEF0dGVtcHQgdG8gYXBwcm94aW1hdGUgb3ZlcmFsbCBzdHJlYW0gYml0cmF0ZSBieSBzdW1taW5nIGFsbAorICAgIC8vIHRyYWNrcycgaW5kaXZpZHVhbCBiaXRyYXRlcywgaWYgbm90IGFsbCBvZiB0aGVtIGFkdmVydGlzZSBiaXRyYXRlLAorICAgIC8vIHdlIGhhdmUgdG8gZmFpbC4KKworICAgIGludDY0X3QgdG90YWxCaXRSYXRlID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICB0b3RhbEJpdFJhdGUgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxCaXRSYXRlICs9IGJpdHJhdGU7CisgICAgfQorCisgICAgbUJpdHJhdGUgPSB0b3RhbEJpdFJhdGU7CisKKyAgICBMT0dWKCJtQml0cmF0ZSA9ICVsbGQgYml0cy9zZWMiLCBtQml0cmF0ZSk7CisKKyAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOworICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFoYXZlVmlkZW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgc2V0VmlkZW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CisgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOworCisgICAgICAgICAgICAvLyBTZXQgdGhlIHByZXNlbnRhdGlvbi9kaXNwbGF5IHNpemUKKyAgICAgICAgICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7CisgICAgICAgICAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICBzZXRBdWRpb1NvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKKyAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGZvciB2b3JiaXMgYXVkaW8sIG5vbmUgb2YgdGhlIG90aGVyIGF1ZGlvCisgICAgICAgICAgICAgICAgLy8gZm9ybWF0cyBldmVuIHN1cHBvcnQgdGhpcyByaW5ndG9uZSBzcGVjaWZpYyBoYWNrIGFuZAorICAgICAgICAgICAgICAgIC8vIHJldHJpZXZpbmcgdGhlIG1ldGFkYXRhIG9uIHNvbWUgZXh0cmFjdG9ycyBtYXkgdHVybiBvdXQKKyAgICAgICAgICAgICAgICAvLyB0byBiZSB2ZXJ5IGV4cGVuc2l2ZS4KKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsb29wOworICAgICAgICAgICAgICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApICYmIGxvb3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVUT19MT09QSU5HOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaGF2ZUF1ZGlvICYmICFoYXZlVmlkZW8pIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUV4dHJhY3RvckZsYWdzID0gZXh0cmFjdG9yLT5mbGFncygpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpyZXNldCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJlc2V0X2woKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6cmVzZXRfbCgpIHsKKyAgICBtRGlzcGxheVdpZHRoID0gMDsKKyAgICBtRGlzcGxheUhlaWdodCA9IDA7CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKKyAgICAgICAgdWludDMyX3QgcGFyYW1zID0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tEZWNvZGVyOworICAgICAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSAmJiAobUF1ZGlvU291cmNlICE9IG1BdWRpb1RyYWNrKSkgeworICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tWaWRlbzsKKyAgICAgICAgfQorICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKKyAgICAgICAgbUZsYWdzIHw9IFBSRVBBUkVfQ0FOQ0VMTEVEOworICAgICAgICBpZiAobUNvbm5lY3RpbmdEYXRhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0koImludGVycnVwdGluZyB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIik7CisgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29ubmVjdGluZ1JUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0koImludGVycnVwdGluZyB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIik7CisgICAgICAgICAgICBtQ29ubmVjdGluZ1JUU1BDb250cm9sbGVyLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZywgd2UncmUganVzdCBidWZmZXJpbmcKKyAgICAgICAgICAgIC8vIGVub3VnaCBkYXRhIHRvIHN0YXJ0IHBsYXliYWNrLCB3ZSBjYW4gc2FmZWx5IGludGVycnVwdCB0aGF0LgorICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKKyAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGNhbmNlbFBsYXllckV2ZW50cygpOworCisgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CisgICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKKworICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0CisgICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQorICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KKyAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCisgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKKyAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KKyAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCisgICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOworICAgIH0KKyAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKKworICAgIG1UaW1lU291cmNlID0gTlVMTDsKKworICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7CisgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKKworICAgIG1WaWRlb1JlbmRlcmVyLmNsZWFyKCk7CisKKyAgICBpZiAobVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJUU1BDb250cm9sbGVyLT5kaXNjb25uZWN0KCk7CisgICAgICAgIG1SVFNQQ29udHJvbGxlci5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7CisgICAgfQorCisgICAgbUR1cmF0aW9uVXMgPSAtMTsKKyAgICBtRmxhZ3MgPSAwOworICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7CisgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKKyAgICBtVmlkZW9UaW1lVXMgPSAwOworCisgICAgbVNlZWtpbmcgPSBOT19TRUVLOworICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOworICAgIG1TZWVrVGltZVVzID0gMDsKKworICAgIG1Vcmkuc2V0VG8oIiIpOworICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CisKKyAgICBtRmlsZVNvdXJjZS5jbGVhcigpOworCisgICAgbUJpdHJhdGUgPSAtMTsKKyAgICBtTGFzdFZpZGVvVGltZVVzID0gLTE7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworCisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgUHJldmlld1BsYXllckJhc2U6OmdldEJpdHJhdGUoaW50NjRfdCAqYml0cmF0ZSkgeworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBpZiAobUR1cmF0aW9uVXMgPj0gMCAmJiBtQ2FjaGVkU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CisgICAgICAgICpiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOyAgLy8gaW4gYml0cy9zZWMKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1CaXRyYXRlID49IDApIHsKKyAgICAgICAgKmJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgKmJpdHJhdGUgPSAwOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWZmIGNhY2hlZCBkdXJhdGlvbiBpcyBhdmFpbGFibGUvYXBwbGljYWJsZS4KK2Jvb2wgUHJldmlld1BsYXllckJhc2U6OmdldENhY2hlZER1cmF0aW9uX2woaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSB7CisgICAgaW50NjRfdCBiaXRyYXRlOworCisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gbVJUU1BDb250cm9sbGVyLT5nZXRRdWV1ZUR1cmF0aW9uVXMoZW9zKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwgJiYgZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworICAgICAgICAqZHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOworICAgICAgICAqZW9zID0gKGZpbmFsU3RhdHVzICE9IE9LKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjplbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpIHsKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB9Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om9uVmlkZW9MYWdVcGRhdGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1WaWRlb0xhZ0V2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgaW50NjRfdCBhdWRpb1RpbWVVcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKKyAgICBpbnQ2NF90IHZpZGVvTGF0ZUJ5VXMgPSBhdWRpb1RpbWVVcyAtIG1WaWRlb1RpbWVVczsKKworICAgIGlmICghKG1GbGFncyAmIFZJREVPX0FUX0VPUykgJiYgdmlkZW9MYXRlQnlVcyA+IDMwMDAwMGxsKSB7CisgICAgICAgIExPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCBtcy4iLCB2aWRlb0xhdGVCeVVzIC8gMTAwMGxsKTsKKworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICAgICAgICAgIE1FRElBX0lORk8sCisgICAgICAgICAgICAgICAgTUVESUFfSU5GT19WSURFT19UUkFDS19MQUdHSU5HLAorICAgICAgICAgICAgICAgIHZpZGVvTGF0ZUJ5VXMgLyAxMDAwbGwpOworICAgIH0KKworICAgIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6b25CdWZmZXJpbmdVcGRhdGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1CdWZmZXJpbmdFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyaW5nRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKyAgICAgICAgYm9vbCBlb3MgPSAoZmluYWxTdGF0dXMgIT0gT0spOworCisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCAxMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyByZWFjaGVkIEVPUywgcHJlcGFyZSBpcyBkb25lLiIpOworICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGU7CisgICAgICAgICAgICBpZiAoZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkU2l6ZSA9IG1DYWNoZWRTb3VyY2UtPmNhY2hlZFNpemUoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWRTaXplICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKworICAgICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiAoZG91YmxlKWNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUgb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBsaW1pdHMgdG8gbWFpbnRhaW4gdGhlIGNhY2hlLgorCisgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBQTEFZSU5HKSAmJiAhZW9zCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJWQpICwgcGF1c2luZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtMb3dXYXRlck1hcmtCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBDQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgcGF1c2VfbCgpOworICAgICAgICAgICAgICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJUKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREYXRhUmVtYWluaW5nID4ga0hpZ2hXYXRlck1hcmtCeXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCBwcmVwYXJlIGlzIGRvbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXM7CisgICAgYm9vbCBlb3M7CisgICAgaWYgKGdldENhY2hlZER1cmF0aW9uX2woJmNhY2hlZER1cmF0aW9uVXMsICZlb3MpKSB7CisgICAgICAgIExPR1YoImNhY2hlZER1cmF0aW9uVXMgPSAlLjJmIHNlY3MsIGVvcz0lZCIsCisgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNiwgZW9zKTsKKworICAgICAgICBpbnQ2NF90IGhpZ2hXYXRlck1hcmtVcyA9CisgICAgICAgICAgICAobVJUU1BDb250cm9sbGVyICE9IE5VTEwpID8ga0hpZ2hXYXRlck1hcmtSVFNQVXMgOiBrSGlnaFdhdGVyTWFya1VzOworCisgICAgICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgIWVvcworICAgICAgICAgICAgICAgICYmIChjYWNoZWREdXJhdGlvblVzIDwga0xvd1dhdGVyTWFya1VzKSkgeworICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKCUuMmYgc2VjcykgLCBwYXVzaW5nLiIsCisgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgcGF1c2VfbCgpOworICAgICAgICAgICAgZW5zdXJlQ2FjaGVJc0ZldGNoaW5nX2woKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOworICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREdXJhdGlvblVzID4gaGlnaFdhdGVyTWFya1VzKSB7CisgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBoYXMgZmlsbGVkIHVwICglLjJmIHNlY3MpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyBmaWxsZWQgdXAgKCUuMmYgc2VjcyksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6b25TdHJlYW1Eb25lKCkgeworICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmICghbVN0cmVhbURvbmVFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgTE9HVigiTUVESUFfRVJST1IgJWQiLCBtU3RyZWFtRG9uZVN0YXR1cyk7CisKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKKyAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgbVN0cmVhbURvbmVTdGF0dXMpOworCisgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOworCisgICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGFsbERvbmUgPQorICAgICAgICAobVZpZGVvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpCisgICAgICAgICAgICAmJiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIEFVRElPX0FUX0VPUykpOworCisgICAgaWYgKCFhbGxEb25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgKExPT1BJTkcgfCBBVVRPX0xPT1BJTkcpKSB7CisgICAgICAgIHNlZWtUb19sKDApOworCisgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiTUVESUFfUExBWUJBQ0tfQ09NUExFVEUiKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7CisKKyAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7CisKKyAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICB9Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpwbGF5KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworCisgICAgcmV0dXJuIHBsYXlfbCgpOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6cGxheV9sKCkgeworICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOworCisgICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmICghKG1GbGFncyAmIFBSRVBBUkVEKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBwcmVwYXJlX2woKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgbUZsYWdzIHw9IFBMQVlJTkc7CisgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOworCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKKyAgICAgICAgZ2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVEFSVCwgcG9zaXRpb24gLyAxMDAwKTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyQmFzZShtQXVkaW9TaW5rLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldFNvdXJjZShtQXVkaW9Tb3VyY2UpOworCisgICAgICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBzZWVrIHJlcXVlc3QgYmVmb3JlIHdlIGV2ZXIgc3RhcnRlZCwKKyAgICAgICAgICAgICAgICAvLyBob25vciB0aGUgcmVxdWVzdCBub3cuCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGRvIHRoaXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhdWRpbyBwbGF5ZXIKKyAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uLgorICAgICAgICAgICAgICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENIRUNLKCEobUZsYWdzICYgQVVESU9fUlVOTklORykpOworCisgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvUGxheWVyOworICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOworCisgICAgICAgICAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlLCBQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVGltZVNvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciA9PSBOVUxMKSB7CisgICAgICAgIG1UaW1lU291cmNlID0gJm1TeXN0ZW1UaW1lU291cmNlOworICAgIH0KKworICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBLaWNrIG9mZiB2aWRlbyBwbGF5YmFjaworICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CisKKyAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBwb3N0VmlkZW9MYWdFdmVudF9sKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgQVRfRU9TKSB7CisgICAgICAgIC8vIExlZ2FjeSBiZWhhdmlvdXIsIGlmIGEgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcgYW5kIHRoZW4KKyAgICAgICAgLy8gaXMgc3RhcnRlZCBhZ2Fpbiwgd2UgcGxheSBmcm9tIHRoZSBzdGFydC4uLgorICAgICAgICBzZWVrVG9fbCgwKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFDb2RlY1N0YXJ0ZWQKKyAgICAgICAgfCBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0RlY29kZXI7CisgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgJiYgKG1BdWRpb1NvdXJjZSAhPSBtQXVkaW9UcmFjaykpIHsKKyAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87CisgICAgfQorICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tWaWRlbzsKKyAgICB9CisgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnN0YXJ0QXVkaW9QbGF5ZXJfbCgpIHsKKyAgICBDSEVDSyghKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKTsKKworICAgIGlmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKCEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpIHsKKyAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7CisKKyAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKKyAgICAgICAgLy8gdGhlIHByZWZldGNoZXIgdG8gcmVhZCBpdHMgZGF0YS4KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7CisgICAgfQorCisgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7CisKKyAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om5vdGlmeVZpZGVvU2l6ZV9sKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKyAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAorICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgY3JvcExlZnQgPSBjcm9wVG9wID0gMDsKKyAgICAgICAgY3JvcFJpZ2h0ID0gd2lkdGggLSAxOworICAgICAgICBjcm9wQm90dG9tID0gaGVpZ2h0IC0gMTsKKworICAgICAgICBMT0dWKCJnb3QgZGltZW5zaW9ucyBvbmx5ICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJnb3QgY3JvcCByZWN0ICVkLCAlZCwgJWQsICVkIiwKKyAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpKSB7CisgICAgICAgIExPR1YoIkRpc3BsYXkgd2lkdGggY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5V2lkdGgsIGRpc3BsYXlXaWR0aCk7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7CisgICAgfQorICAgIGludDMyX3QgZGlzcGxheUhlaWdodDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKKyAgICAgICAgTE9HVigiRGlzcGxheSBoZWlnaHQgY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OworICAgIH0KKworICAgIGludDMyX3QgdXNhYmxlV2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7CisgICAgaW50MzJfdCB1c2FibGVIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7CisgICAgaWYgKG1EaXNwbGF5V2lkdGggIT0gMCkgeworICAgICAgICB1c2FibGVXaWR0aCA9IG1EaXNwbGF5V2lkdGg7CisgICAgfQorICAgIGlmIChtRGlzcGxheUhlaWdodCAhPSAwKSB7CisgICAgICAgIHVzYWJsZUhlaWdodCA9IG1EaXNwbGF5SGVpZ2h0OworICAgIH0KKworICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVIZWlnaHQsIHVzYWJsZVdpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVXaWR0aCwgdXNhYmxlSGVpZ2h0KTsKKyAgICB9Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OmluaXRSZW5kZXJlcl9sKCkgeworICAgIGlmIChtTmF0aXZlV2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3QgZm9ybWF0OworICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudDsKKyAgICBpbnQzMl90IGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodDsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmZm9ybWF0KSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjb21wb25lbnQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmZGVjb2RlZFdpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZkZWNvZGVkSGVpZ2h0KSk7CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIW1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgIGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CisKKyAgICBtVmlkZW9SZW5kZXJlci5jbGVhcigpOworCisgICAgLy8gTXVzdCBlbnN1cmUgdGhhdCBtVmlkZW9SZW5kZXJlcidzIGRlc3RydWN0b3IgaXMgYWN0dWFsbHkgZXhlY3V0ZWQKKyAgICAvLyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLgorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKworICAgIGlmIChVU0VfU1VSRkFDRV9BTExPQyAmJiBzdHJuY21wKGNvbXBvbmVudCwgIk9NWC4iLCA0KSA9PSAwKSB7CisgICAgICAgIC8vIEhhcmR3YXJlIGRlY29kZXJzIGF2b2lkIHRoZSBDUFUgY29sb3IgY29udmVyc2lvbiBieSBkZWNvZGluZworICAgICAgICAvLyBkaXJlY3RseSB0byBBTmF0aXZlQnVmZmVycywgc28gd2UgbXVzdCB1c2UgYSByZW5kZXJlciB0aGF0CisgICAgICAgIC8vIGp1c3QgcHVzaGVzIHRob3NlIGJ1ZmZlcnMgdG8gdGhlIEFOYXRpdmVXaW5kb3cuCisgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KKyAgICAgICAgICAgIG5ldyBBd2Vzb21lTmF0aXZlV2luZG93UmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgcm90YXRpb25EZWdyZWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKKyAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLiAgVGhpcyByZW5kZXJlcgorICAgICAgICAvLyB0aGVuIHBlcmZvcm1zIGEgY29sb3IgY29udmVyc2lvbiBhbmQgY29weSB0byBnZXQgdGhlIGRhdGEKKyAgICAgICAgLy8gaW50byB0aGUgQU5hdGl2ZUJ1ZmZlci4KKyAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgfQorfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6cGF1c2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisKKyAgICByZXR1cm4gcGF1c2VfbCgpOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6cGF1c2VfbChib29sIGF0X2VvcykgeworICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjYW5jZWxQbGF5ZXJFdmVudHModHJ1ZSAvKiBrZWVwQnVmZmVyaW5nR29pbmcgKi8pOworCisgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgeworICAgICAgICBpZiAoYXRfZW9zKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBwbGF5ZWQgdGhlIGF1ZGlvIHN0cmVhbSB0byBjb21wbGV0aW9uIHdlCisgICAgICAgICAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBzYW1wbGVzIHJlbWFpbmluZyBpbiB0aGUgYXVkaW8KKyAgICAgICAgICAgIC8vIHRyYWNrJ3MgcXVldWUgYXJlIHBsYXllZCBvdXQuCisgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKHRydWUgLyogcGxheVBlbmRpbmdTYW1wbGVzICovKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKKyAgICB9CisKKyAgICBtRmxhZ3MgJj0gflBMQVlJTkc7CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0RlY29kZXI7CisgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgJiYgKG1BdWRpb1NvdXJjZSAhPSBtQXVkaW9UcmFjaykpIHsKKyAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87CisgICAgfQorICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tWaWRlbzsKKyAgICB9CisKKyAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIFByZXZpZXdQbGF5ZXJCYXNlOjppc1BsYXlpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIChtRmxhZ3MgJiBQTEFZSU5HKSB8fCAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKKyAgICBzZXROYXRpdmVXaW5kb3dfbChzdXJmYWNlKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6c2V0U3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiAmc3VyZmFjZVRleHR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVN1cmZhY2UuY2xlYXIoKTsKKyAgICBpZiAoc3VyZmFjZVRleHR1cmUgIT0gTlVMTCkgeworICAgICAgICBzZXROYXRpdmVXaW5kb3dfbChuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3VyZmFjZVRleHR1cmUpKTsKKyAgICB9Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OnNodXRkb3duVmlkZW9EZWNvZGVyX2woKSB7CisgICAgaWYgKG1WaWRlb0J1ZmZlcikgeworICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAorICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKKyAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KKyAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOworICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOworICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgdXNsZWVwKDEwMDApOworICAgIH0KKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OnNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpIHsKKyAgICBtTmF0aXZlV2luZG93ID0gbmF0aXZlOworCisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dJKCJhdHRlbXB0aW5nIHRvIHJlY29uZmlndXJlIHRvIHVzZSBuZXcgc3VyZmFjZSIpOworCisgICAgYm9vbCB3YXNQbGF5aW5nID0gKG1GbGFncyAmIFBMQVlJTkcpICE9IDA7CisKKyAgICBwYXVzZV9sKCk7CisgICAgbVZpZGVvUmVuZGVyZXIuY2xlYXIoKTsKKworICAgIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKKworICAgIENIRUNLX0VRKGluaXRWaWRlb0RlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgIGlmIChtTGFzdFZpZGVvVGltZVVzID49IDApIHsKKyAgICAgICAgbVNlZWtpbmcgPSBTRUVLOworICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOworICAgICAgICBtU2Vla1RpbWVVcyA9IG1MYXN0VmlkZW9UaW1lVXM7CisgICAgICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7CisgICAgfQorCisgICAgaWYgKHdhc1BsYXlpbmcpIHsKKyAgICAgICAgcGxheV9sKCk7CisgICAgfQorfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpzZXRBdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtRmxhZ3MgPSBtRmxhZ3MgJiB+TE9PUElORzsKKworICAgIGlmIChzaG91bGRMb29wKSB7CisgICAgICAgIG1GbGFncyB8PSBMT09QSU5HOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1pc2NTdGF0ZUxvY2spOworCisgICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAqZHVyYXRpb25VcyA9IG1EdXJhdGlvblVzOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6Z2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25VcykgeworICAgIGlmIChtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgeworICAgICAgICAqcG9zaXRpb25VcyA9IG1SVFNQQ29udHJvbGxlci0+Z2V0Tm9ybWFsUGxheVRpbWVVcygpOworICAgIH0KKyAgICBlbHNlIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7CisgICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgJiYgKG1BdWRpb1BsYXllciA9PSBOVUxMIHx8ICEobUZsYWdzICYgVklERU9fQVRfRU9TKSkpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NaXNjU3RhdGVMb2NrKTsKKyAgICAgICAgKnBvc2l0aW9uVXMgPSBtVmlkZW9UaW1lVXM7CisgICAgfSBlbHNlIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAqcG9zaXRpb25VcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcG9zaXRpb25VcyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6c2Vla1RvKGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKG1FeHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFSykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICByZXR1cm4gc2Vla1RvX2wodGltZVVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6T25SVFNQU2Vla0RvbmVXcmFwcGVyKHZvaWQgKmNvb2tpZSkgeworICAgIHN0YXRpY19jYXN0PFByZXZpZXdQbGF5ZXJCYXNlICo+KGNvb2tpZSktPm9uUlRTUFNlZWtEb25lKCk7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om9uUlRTUFNlZWtEb25lKCkgeworICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7CisgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNlZWtUb19sKGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1SVFNQQ29udHJvbGxlci0+c2Vla0FzeW5jKHRpbWVVcywgT25SVFNQU2Vla0RvbmVXcmFwcGVyLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgeworICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICBwbGF5X2woKTsKKyAgICB9CisKKyAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMICYmIChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKSB7CisgICAgICAgIC8vIFZpZGVvIHBsYXliYWNrIGNvbXBsZXRlZCBiZWZvcmUsIHRoZXJlJ3Mgbm8gcGVuZGluZworICAgICAgICAvLyB2aWRlbyBldmVudCByaWdodCBub3cuIEluIG9yZGVyIGZvciB0aGlzIG5ldyBzZWVrCisgICAgICAgIC8vIHRvIGJlIGhvbm9yZWQsIHdlIG5lZWQgdG8gcG9zdCBvbmUuCisKKyAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOworICAgIH0KKworICAgIG1TZWVraW5nID0gU0VFSzsKKyAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVVczsKKyAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOworCisgICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOworCisgICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKKyAgICAgICAgTE9HVigic2Vla2luZyB3aGlsZSBwYXVzZWQsIHNlbmRpbmcgU0VFS19DT01QTEVURSBub3RpZmljYXRpb24iCisgICAgICAgICAgICAgIiBpbW1lZGlhdGVseS4iKTsKKworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOworICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOworCisgICAgICAgIGlmICgobUZsYWdzICYgUFJFUEFSRUQpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gU0VFS19QUkVWSUVXOworICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCkgeworICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKG1TZWVrVGltZVVzKTsKKworICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7CisgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKKworICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6UEFVU0UsIDApOworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIG1TZWVrVGltZVVzIC8gMTAwMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OnNldEF1ZGlvU291cmNlKHNwPE1lZGlhU291cmNlPiBzb3VyY2UpIHsKKyAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CisKKyAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OmluaXRBdWRpb0RlY29kZXIoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CisgICAgICAgIG1BdWRpb1NvdXJjZSA9IG1BdWRpb1RyYWNrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBjcmVhdGVFbmNvZGVyCisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2spOworICAgIH0KKworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgIGlmIChtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NaXNjU3RhdGVMb2NrKTsKKyAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA8IDAgfHwgZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU291cmNlLT5zdGFydCgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApKSB7CisgICAgICAgIC8vIEZvciBsZWdhY3kgcmVhc29ucyB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gaWdub3JlIHRoZSBhYnNlbmNlCisgICAgICAgIC8vIG9mIGFuIGF1ZGlvIGRlY29kZXIgZm9yIFFDRUxQIGluc3RlYWQgb2YgYWJvcnRpbmcgcGxheWJhY2sKKyAgICAgICAgLy8gYWx0b2dldGhlci4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6c2V0VmlkZW9Tb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSkgeworICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKKworICAgIG1WaWRlb1RyYWNrID0gc291cmNlOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6aW5pdFZpZGVvRGVjb2Rlcih1aW50MzJfdCBmbGFncykgeworCisgICAgLy8gRWl0aGVyIHRoZSBhcHBsaWNhdGlvbiBvciB0aGUgRFJNIHN5c3RlbSBjYW4gaW5kZXBlbmRlbnRseSBzYXkKKyAgICAvLyB0aGF0IHRoZXJlIG11c3QgYmUgYSBoYXJkd2FyZS1wcm90ZWN0ZWQgcGF0aCB0byBhbiBleHRlcm5hbCB2aWRlbyBzaW5rLgorICAgIC8vIEZvciBub3cgd2UgYWx3YXlzIHJlcXVpcmUgYSBoYXJkd2FyZS1wcm90ZWN0ZWQgcGF0aCB0byBleHRlcm5hbCB2aWRlbyBzaW5rCisgICAgLy8gaWYgY29udGVudCBpcyBEUk1lZCwgYnV0IGV2ZW50dWFsbHkgdGhpcyBjb3VsZCBiZSBvcHRpb25hbCBwZXIgRFJNIGFnZW50LgorICAgIC8vIFdoZW4gdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHByb3RlY3Rpb24sIHRoZW4KKyAgICAvLyAgIChVU0VfU1VSRkFDRV9BTExPQyAmJiAobVN1cmZhY2UgIT0gMCkgJiYKKyAgICAvLyAgIChtU3VyZmFjZS0+Z2V0RmxhZ3MoKSAmIElTdXJmYWNlQ29tcG9zZXI6OmVQcm90ZWN0ZWRCeUFwcCkpCisgICAgLy8gd2lsbCBiZSB0cnVlLCBidXQgdGhhdCBwYXJ0IGlzIGFscmVhZHkgaGFuZGxlZCBieSBTdXJmYWNlRmxpbmdlci4KKworI2lmZGVmIERFQlVHX0hEQ1AKKyAgICAvLyBGb3IgZGVidWdnaW5nLCB3ZSBhbGxvdyBhIHN5c3RlbSBwcm9wZXJ0eSB0byBjb250cm9sIHRoZSBwcm90ZWN0ZWQgdXNhZ2UuCisgICAgLy8gSW4gY2FzZSBvZiB1bmluaXRpYWxpemVkIG9yIHVuZXhwZWN0ZWQgcHJvcGVydHksIHdlIGRlZmF1bHQgdG8gIkRSTSBvbmx5Ii4KKyAgICBib29sIHNldFByb3RlY3Rpb25CaXQgPSBmYWxzZTsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMuaGRjcF9jaGVja2luZyIsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICBpZiAoIXN0cmNtcCh2YWx1ZSwgIm5ldmVyIikpIHsKKyAgICAgICAgICAgIC8vIG5vcAorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodmFsdWUsICJhbHdheXMiKSkgeworICAgICAgICAgICAgc2V0UHJvdGVjdGlvbkJpdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh2YWx1ZSwgImRybS1vbmx5IikpIHsKKyAgICAgICAgICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvdGVjdGlvbkJpdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIHByb3BlcnR5IHZhbHVlIGlzIGVtcHR5LCBvciB1bmV4cGVjdGVkIHZhbHVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNldFByb3RlY3Rpb25CaXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgLy8gY2FuJyByZWFkIHByb3BlcnR5IHZhbHVlCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNldFByb3RlY3Rpb25CaXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIC8vIG5vdGUgdGhhdCB1c2FnZSBiaXQgaXMgYWxyZWFkeSBjbGVhcmVkLCBzbyBubyBuZWVkIHRvIGNsZWFyIGl0IGluIHRoZSAiZWxzZSIgY2FzZQorICAgIGlmIChzZXRQcm90ZWN0aW9uQml0KSB7CisgICAgICAgIGZsYWdzIHw9IE9NWENvZGVjOjprRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkOworICAgIH0KKyNlbHNlCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgZmxhZ3MgfD0gT01YQ29kZWM6OmtFbmFibGVHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CisgICAgfQorI2VuZGlmCisgICAgTE9HVigiaW5pdFZpZGVvRGVjb2RlciBmbGFncz0weCV4IiwgZmxhZ3MpOworICAgIG1WaWRlb1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCksCisgICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlRW5jb2RlcgorICAgICAgICAgICAgbVZpZGVvVHJhY2ssCisgICAgICAgICAgICBOVUxMLCBmbGFncywgVVNFX1NVUkZBQ0VfQUxMT0MgPyBtTmF0aXZlV2luZG93IDogTlVMTCk7CisKKyAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAobVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWlzY1N0YXRlTG9jayk7CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbVZpZGVvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OmZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKSB7CisgICAgaWYgKG1TZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgeworICAgICAgICBtU2Vla2luZyA9IE5PX1NFRUs7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVNlZWtpbmcgPT0gTk9fU0VFSyB8fCAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7CisgICAgICAgIExPR1YoInNlZWtpbmcgYXVkaW8gdG8gJWxsZCB1cyAoJS4yZiBzZWNzKS4iLCB2aWRlb1RpbWVVcywgdmlkZW9UaW1lVXMgLyAxRTYpOworCisgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSB2aWRlbyB0aW1lLCBzZWVrIGF1ZGlvIHRvIHRoZSBvcmlnaW5hbGx5CisgICAgICAgIC8vIHJlcXVlc3RlZCBzZWVrIHRpbWUgaW5zdGVhZC4KKworICAgICAgICBtQXVkaW9QbGF5ZXItPnNlZWtUbyh2aWRlb1RpbWVVcyA8IDAgPyBtU2Vla1RpbWVVcyA6IHZpZGVvVGltZVVzKTsKKyAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOworICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghbVNlZWtOb3RpZmljYXRpb25TZW50KSB7CisgICAgICAgIC8vIElmIHdlJ3JlIHBsYXlpbmcgdmlkZW8gb25seSwgcmVwb3J0IHNlZWsgY29tcGxldGUgbm93LAorICAgICAgICAvLyBvdGhlcndpc2UgYXVkaW8gcGxheWVyIHdpbGwgbm90aWZ5IHVzIGxhdGVyLgorICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOworICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOworICAgIH0KKworICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKKyAgICBtU2Vla2luZyA9IE5PX1NFRUs7CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVEFSVCwgdmlkZW9UaW1lVXMgLyAxMDAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om9uVmlkZW9FdmVudCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmICghbVZpZGVvRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIC8vIFRoZSBldmVudCBoYXMgYmVlbiBjYW5jZWxsZWQgaW4gcmVzZXRfbCgpIGJ1dCBoYWQgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGF0IHRoYXQgdGltZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7CisgICAgICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU2Vla2luZyA9PSBTRUVLICYmIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmICEobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgeworICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2VlayB0aGUgdmlkZW8gc291cmNlIGZpcnN0LCBmb2xsb3dlZCBieQorICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNvdXJjZS4KKyAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBEYXRhU291cmNlIG9mZnNldCBjYXVzZWQgYnkKKyAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBjb2RlYyBwcmVmZXRjaGluZyBkYXRhIGZyb20gdGhlIG9sZCBsb2NhdGlvbnMKKyAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB2aWRlbyBjb2RlYyBpcyBhbHJlYWR5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBuZXcKKyAgICAgICAgICAgIC8vIGxvY2F0aW9ucywgd2UnbGwgInBhdXNlIiB0aGUgYXVkaW8gc291cmNlLCBjYXVzaW5nIGl0IHRvCisgICAgICAgICAgICAvLyBzdG9wIHJlYWRpbmcgaW5wdXQgZGF0YSB1bnRpbCBhIHN1YnNlcXVlbnQgc2Vlay4KKworICAgICAgICAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgeworICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKKworICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CisgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgeworICAgICAgICAgICAgTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsIG1TZWVrVGltZVVzIC8gMUU2KTsKKworICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCisgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLAorICAgICAgICAgICAgICAgICAgICBtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQworICAgICAgICAgICAgICAgICAgICAgICAgOiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOworICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyID09IE5VTEwpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlZpZGVvU291cmNlIHNpZ25hbGxlZCBmb3JtYXQgY2hhbmdlLiIpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0UmVuZGVyZXJfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNvIHZpZGVvIHBsYXliYWNrIGlzIGNvbXBsZXRlLCBidXQgd2UgbWF5IHN0aWxsIGhhdmUKKyAgICAgICAgICAgICAgICAvLyBhIHNlZWsgcmVxdWVzdCBwZW5kaW5nIHRoYXQgbmVlZHMgdG8gYmUgYXBwbGllZAorICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBhdWRpbyB0cmFjay4KKyAgICAgICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJ2aWRlbyBzdHJlYW0gZW5kZWQgd2hpbGUgc2Vla2luZyEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KC0xKTsKKworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShtRmxhZ3MgJiAoQVVESU9fUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7CisgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU29tZSBkZWNvZGVycywgbm90YWJseSB0aGUgUFYgQVZDIHNvZnR3YXJlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3B1cmlvdXMgZW1wdHkgYnVmZmVycyB0aGF0IHdlIGp1c3Qgd2FudCB0byBpZ25vcmUuCisKKyAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgbUxhc3RWaWRlb1RpbWVVcyA9IHRpbWVVczsKKworICAgIGlmIChtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkpIHsKKyAgICAgICAgaWYgKG1TZWVrVGltZVVzID4gdGltZVVzKSB7CisgICAgICAgICAgICBMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsIHRpbWVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWlzY1N0YXRlTG9jayk7CisgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICBTZWVrVHlwZSB3YXNTZWVraW5nID0gbVNlZWtpbmc7CisgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KHRpbWVVcyk7CisKKyAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgIShtRmxhZ3MgJiAoQVVESU9fUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0dFKCJTdGFydHVuZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOworCisgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7CisgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7CisgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CisgICAgfQorCisgICAgaW50NjRfdCByZWFsVGltZVVzLCBtZWRpYVRpbWVVczsKKyAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19BVF9FT1MpICYmIG1BdWRpb1BsYXllciAhPSBOVUxMCisgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygmcmVhbFRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXM7CisgICAgfQorCisgICAgaWYgKHdhc1NlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworCisgICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOworCisgICAgICAgIGlmIChsYXRlbmVzc1VzID4gMCkgeworICAgICAgICAgICAgTE9HSSgiYWZ0ZXIgU0VFS19WSURFT19PTkxZIHdlJ3JlIGxhdGUgYnkgJS4yZiBzZWNzIiwgbGF0ZW5lc3NVcyAvIDFFNik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2FzU2Vla2luZyA9PSBOT19TRUVLKSB7CisgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KKworICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKworICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKKworICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDUwMDAwMGxsCisgICAgICAgICAgICAgICAgJiYgbVJUU1BDb250cm9sbGVyID09IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygKKyAgICAgICAgICAgICAgICAgICAgJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgIExPR0koIndlJ3JlIG11Y2ggdG9vIGxhdGUgKCUuMmYgc2VjcyksIHZpZGVvIHNraXBwaW5nIGFoZWFkIiwKKyAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcyAvIDFFNik7CisKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgbVNlZWtpbmcgPSBTRUVLX1ZJREVPX09OTFk7CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IG1lZGlhVGltZVVzOworCisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDQwMDAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gNDBtcyBsYXRlLgorICAgICAgICAgICAgTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpLCBkcm9wcGluZyBmcmFtZSIsCisgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYpOworICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0xMDAwMCkgeworICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDEwbXMgZWFybHkuCisKKyAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMTAwMDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3IHx8IG1WaWRlb1JlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKKworICAgICAgICBpbml0UmVuZGVyZXJfbCgpOworICAgIH0KKworICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1WaWRlb1JlbmRlcmVyLT5yZW5kZXIobVZpZGVvQnVmZmVyKTsKKyAgICB9CisKKyAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworCisgICAgaWYgKHdhc1NlZWtpbmcgIT0gTk9fU0VFSyAmJiAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgeworICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6cG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBpZiAobVZpZGVvRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSB0cnVlOworICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvRXZlbnQsIGRlbGF5VXMgPCAwID8gMTAwMDAgOiBkZWxheVVzKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6cG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cykgeworICAgIGlmIChtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gdHJ1ZTsKKworICAgIG1TdHJlYW1Eb25lU3RhdHVzID0gc3RhdHVzOworICAgIG1RdWV1ZS5wb3N0RXZlbnQobVN0cmVhbURvbmVFdmVudCk7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OnBvc3RCdWZmZXJpbmdFdmVudF9sKCkgeworICAgIGlmIChtQnVmZmVyaW5nRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlcmluZ0V2ZW50UGVuZGluZyA9IHRydWU7CisgICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtQnVmZmVyaW5nRXZlbnQsIDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OnBvc3RWaWRlb0xhZ0V2ZW50X2woKSB7CisgICAgaWYgKG1WaWRlb0xhZ0V2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IHRydWU7CisgICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtVmlkZW9MYWdFdmVudCwgMTAwMDAwMGxsKTsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOworICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobUNoZWNrQXVkaW9TdGF0dXNFdmVudCwgZGVsYXlVcyk7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6Om9uQ2hlY2tBdWRpb1N0YXR1cygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmICghbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIC8vIEV2ZW50IHdhcyBkaXNwYXRjaGVkIGFuZCB3aGlsZSB3ZSB3ZXJlIGJsb2NraW5nIG9uIHRoZSBtdXRleCwKKyAgICAgICAgLy8gaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmIChtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSAmJiAhbUF1ZGlvUGxheWVyLT5pc1NlZWtpbmcoKSkgeworICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOworCisgICAgICAgIGlmICghbVNlZWtOb3RpZmljYXRpb25TZW50KSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOworICAgICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1TZWVraW5nID0gTk9fU0VFSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKKyAgICBpZiAobVdhdGNoRm9yQXVkaW9FT1MgJiYgbUF1ZGlvUGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKKyAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSBmYWxzZTsKKyAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKKyAgICAgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOworICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZmluYWxTdGF0dXMpOworICAgIH0KK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnByZXBhcmUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gcHJlcGFyZV9sKCk7Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpwcmVwYXJlX2woKSB7CisgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVEKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Jc0FzeW5jUHJlcGFyZSA9IGZhbHNlOworICAgIHN0YXR1c190IGVyciA9IHByZXBhcmVBc3luY19sKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgd2hpbGUgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICBtUHJlcGFyZWRDb25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIG1QcmVwYXJlUmVzdWx0OworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6cHJlcGFyZUFzeW5jKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gYXN5bmMgcHJlcGFyZSBhbHJlYWR5IHBlbmRpbmcKKyAgICB9CisKKyAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOworICAgIHJldHVybiBwcmVwYXJlQXN5bmNfbCgpOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6cHJlcGFyZUFzeW5jX2woKSB7CisgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIGFzeW5jIHByZXBhcmUgYWxyZWFkeSBwZW5kaW5nCisgICAgfQorCisgICAgaWYgKCFtUXVldWVTdGFydGVkKSB7CisgICAgICAgIG1RdWV1ZS5zdGFydCgpOworICAgICAgICBtUXVldWVTdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOworICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IG5ldyBBd2Vzb21lRXZlbnQoCisgICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllckJhc2U6Om9uUHJlcGFyZUFzeW5jRXZlbnQpOworCisgICAgbVF1ZXVlLnBvc3RFdmVudChtQXN5bmNQcmVwYXJlRXZlbnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQcmV2aWV3UGxheWVyQmFzZTo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sKCkgeworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykKKyAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCBtVXJpLnN0cmluZygpLCA4KSkgeworICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKAorICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBJTkNPR05JVE8pCisgICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCisgICAgICAgICAgICAgICAgICAgIDogMCk7CisKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdChtVXJpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICBtTG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLmNsZWFyKCk7CisKKyAgICAgICAgICAgIExPR0koIm1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdCgpIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgbUNhY2hlZFNvdXJjZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoCisgICAgICAgICAgICAgICAgbmV3IFRocm90dGxlZFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLCA1MCAqIDEwMjQgLyogYnl0ZXMvc2VjICovKSk7CisjZWxzZQorICAgICAgICBtQ2FjaGVkU291cmNlID0gbmV3IE51Q2FjaGVkU291cmNlMihtQ29ubmVjdGluZ0RhdGFTb3VyY2UpOworI2VuZGlmCisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOworCisgICAgICAgIGRhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlOworCisgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBkYXRhU291cmNlLT5nZXRNSU1FVHlwZSgpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcChjb250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBub3QgZG9pbmcgdGhpcyBmb3Igc3RyZWFtcyB0aGF0IGFwcGVhciB0byBiZSBhdWRpby1vbmx5CisgICAgICAgICAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CisgICAgICAgICAgICAvLyBwbGF5aW5nIGJhY2sgZmFpcmx5IGluc3RhbnRseS4KKworICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcHJlZmlsbCB0aGUgY2FjaGUgYmVmb3JlIHRyeWluZyB0byBpbnN0YW50aWF0ZQorICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBiZWxvdywgYXMgdGhlIGxhdHRlciBpcyBhbiBvcGVyYXRpb24gdGhhdCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8vIGNvdWxkIGJsb2NrIG9uIHRoZSBkYXRhc291cmNlIGZvciBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lLgorICAgICAgICAgICAgLy8gRHVyaW5nIHRoYXQgdGltZSB3ZSdkIGJlIHVuYWJsZSB0byBhYm9ydCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyBwcmVmaWxsLgorCisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICAgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworCisgICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga0hpZ2hXYXRlck1hcmtCeXRlcworICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1c2xlZXAoMjAwMDAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgICBMT0dJKCJQcmVwYXJlIGNhbmNlbGxlZCB3aGlsZSB3YWl0aW5nIGZvciBpbml0aWFsIGNhY2hlIGZpbGwuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykpIHsKKyAgICAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtUlRTUENvbnRyb2xsZXIgPSBuZXcgQVJUU1BDb250cm9sbGVyKG1Mb29wZXIpOworICAgICAgICBtQ29ubmVjdGluZ1JUU1BDb250cm9sbGVyID0gbVJUU1BDb250cm9sbGVyOworCisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtUlRTUENvbnRyb2xsZXItPmNvbm5lY3QobVVyaS5zdHJpbmcoKSk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKworICAgICAgICBtQ29ubmVjdGluZ1JUU1BDb250cm9sbGVyLmNsZWFyKCk7CisKKyAgICAgICAgTE9HSSgiQVJUU1BDb250cm9sbGVyOjpjb25uZWN0IHJldHVybmVkICVkIiwgZXJyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtUlRTUENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gbVJUU1BDb250cm9sbGVyLmdldCgpOworICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVyaS5zdHJpbmcoKSwgJm1VcmlIZWFkZXJzKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8obURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CisgICAgICAgIGlmIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7Cit9CisKK3ZvaWQgUHJldmlld1BsYXllckJhc2U6OmFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpIHsKKyAgICBDSEVDSyhlcnIgIT0gT0spOworCisgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgIH0KKworICAgIG1QcmVwYXJlUmVzdWx0ID0gZXJyOworICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKTsKKyAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOworICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKworLy8gc3RhdGljCitib29sIFByZXZpZXdQbGF5ZXJCYXNlOjpDb250aW51ZVByZXBhcmF0aW9uKHZvaWQgKmNvb2tpZSkgeworICAgIFByZXZpZXdQbGF5ZXJCYXNlICptZSA9IHN0YXRpY19jYXN0PFByZXZpZXdQbGF5ZXJCYXNlICo+KGNvb2tpZSk7CisKKyAgICByZXR1cm4gKG1lLT5tRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgPT0gMDsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6b25QcmVwYXJlQXN5bmNFdmVudCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7CisgICAgICAgIExPR0koInByZXBhcmUgd2FzIGNhbmNlbGxlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmciKTsKKyAgICAgICAgYWJvcnRQcmVwYXJlKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Vcmkuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGluaXRWaWRlb0RlY29kZXIoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1NvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGluaXRBdWRpb0RlY29kZXIoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1GbGFncyB8PSBQUkVQQVJJTkdfQ09OTkVDVEVEOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCB8fCBtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgeworICAgICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgfQorfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpmaW5pc2hBc3luY1ByZXBhcmVfbCgpIHsKKyAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7CisgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOworICAgICAgICB9CisKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CisgICAgfQorCisgICAgbVByZXBhcmVSZXN1bHQgPSBPSzsKKyAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7CisgICAgbUZsYWdzIHw9IFBSRVBBUkVEOworICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CisgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit1aW50MzJfdCBQcmV2aWV3UGxheWVyQmFzZTo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRyYWN0b3JGbGFnczsKK30KKwordm9pZCBQcmV2aWV3UGxheWVyQmFzZTo6cG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGRlbGF5VXMpOworfQorCit2b2lkIFByZXZpZXdQbGF5ZXJCYXNlOjpwb3N0QXVkaW9TZWVrQ29tcGxldGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woMCAvKiBkZWxheVVzICovKTsKK30KKworc3RhdHVzX3QgUHJldmlld1BsYXllckJhc2U6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFByZXZpZXdQbGF5ZXJCYXNlOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgIHJldHVybiBPSzsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXJCYXNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4ZDUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllckJhc2UuaApAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUFJFVklFV19QTEFZRVJfQkFTRV9IXworCisjZGVmaW5lIFBSRVZJRVdfUExBWUVSX0JBU0VfSF8KKworI2luY2x1ZGUgIkhUVFBCYXNlLmgiCisjaW5jbHVkZSAiVGltZWRFdmVudFF1ZXVlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEF1ZGlvUGxheWVyQmFzZTsKK3N0cnVjdCBEYXRhU291cmNlOworc3RydWN0IE1lZGlhQnVmZmVyOworc3RydWN0IE1lZGlhRXh0cmFjdG9yOworc3RydWN0IE1lZGlhU291cmNlOworc3RydWN0IE51Q2FjaGVkU291cmNlMjsKK3N0cnVjdCBJU3VyZmFjZVRleHR1cmU7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKKworY2xhc3MgRHJtTWFuYWdlckNsaW5ldDsKK2NsYXNzIERlY3J5cHRIYW5kbGU7CisKK3N0cnVjdCBBd2Vzb21lUmVuZGVyZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQXdlc29tZVJlbmRlcmVyKCkge30KKworICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgPSAwOworCitwcml2YXRlOgorICAgIEF3ZXNvbWVSZW5kZXJlcihjb25zdCBBd2Vzb21lUmVuZGVyZXIgJik7CisgICAgQXdlc29tZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZVJlbmRlcmVyICYpOworfTsKKworc3RydWN0IFByZXZpZXdQbGF5ZXJCYXNlIHsKKyAgICBQcmV2aWV3UGxheWVyQmFzZSgpOworICAgIH5QcmV2aWV3UGxheWVyQmFzZSgpOworCisgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHN0YXR1c190IHByZXBhcmUoKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlX2woKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOworCisgICAgc3RhdHVzX3QgcGxheSgpOworICAgIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICBib29sIGlzUGxheWluZygpIGNvbnN0OworCisgICAgdm9pZCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2b2lkIHNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4gJnN1cmZhY2VUZXh0dXJlKTsKKyAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7CisgICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOworCisgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgc3RhdHVzX3QgZ2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25Vcyk7CisKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOworCisgICAgLy8gVGhpcyBpcyBhIG1hc2sgb2YgTWVkaWFFeHRyYWN0b3I6OkZsYWdzLgorICAgIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisKKyAgICB2b2lkIHBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMgPSAwbGwpOworICAgIHZvaWQgcG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBd2Vzb21lRXZlbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBQcmV2aWV3UGxheWVyOworCisgICAgZW51bSB7CisgICAgICAgIFBMQVlJTkcgICAgICAgICAgICAgPSAxLAorICAgICAgICBMT09QSU5HICAgICAgICAgICAgID0gMiwKKyAgICAgICAgRklSU1RfRlJBTUUgICAgICAgICA9IDQsCisgICAgICAgIFBSRVBBUklORyAgICAgICAgICAgPSA4LAorICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCisgICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKKyAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAorICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAorICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAorICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAorICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKKworICAgICAgICAvLyBXZSBhcmUgYmFzaWNhbGx5IGRvbmUgcHJlcGFyaW5nIGJ1dCBhcmUgY3VycmVudGx5IGJ1ZmZlcmluZworICAgICAgICAvLyBzdWZmaWNpZW50IGRhdGEgdG8gYmVnaW4gcGxheWJhY2sgYW5kIGZpbmlzaCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKKyAgICAgICAgLy8gZm9yIGdvb2QuCisgICAgICAgIFBSRVBBUklOR19DT05ORUNURUQgPSAyMDQ4LAorCisgICAgICAgIC8vIFdlJ3JlIHRyaWdnZXJpbmcgYSBzaW5nbGUgdmlkZW8gZXZlbnQgdG8gZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIHNlZWtwb2ludC4KKyAgICAgICAgU0VFS19QUkVWSUVXICAgICAgICA9IDQwOTYsCisKKyAgICAgICAgQVVESU9fUlVOTklORyAgICAgICA9IDgxOTIsCisgICAgICAgIEFVRElPUExBWUVSX1NUQVJURUQgPSAxNjM4NCwKKworICAgICAgICBJTkNPR05JVE8gICAgICAgICAgID0gMzI3NjgsCisgICAgfTsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgTXV0ZXggbU1pc2NTdGF0ZUxvY2s7CisKKyAgICBPTVhDbGllbnQgbUNsaWVudDsKKyAgICBUaW1lZEV2ZW50UXVldWUgbVF1ZXVlOworICAgIGJvb2wgbVF1ZXVlU3RhcnRlZDsKKyAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CisKKyAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOworICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOworCisgICAgU3RyaW5nOCBtVXJpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOworCisgICAgc3A8RGF0YVNvdXJjZT4gbUZpbGVTb3VyY2U7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvVHJhY2s7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1WaWRlb1NvdXJjZTsKKyAgICBzcDxBd2Vzb21lUmVuZGVyZXI+IG1WaWRlb1JlbmRlcmVyOworICAgIGJvb2wgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXc7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvVHJhY2s7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1NvdXJjZTsKKyAgICBBdWRpb1BsYXllckJhc2UgKm1BdWRpb1BsYXllcjsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworCisgICAgaW50MzJfdCBtRGlzcGxheVdpZHRoOworICAgIGludDMyX3QgbURpc3BsYXlIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgdWludDMyX3QgbUV4dHJhY3RvckZsYWdzOworCisgICAgaW50NjRfdCBtVGltZVNvdXJjZURlbHRhVXM7CisgICAgaW50NjRfdCBtVmlkZW9UaW1lVXM7CisKKyAgICBlbnVtIFNlZWtUeXBlIHsKKyAgICAgICAgTk9fU0VFSywKKyAgICAgICAgU0VFSywKKyAgICAgICAgU0VFS19WSURFT19PTkxZCisgICAgfTsKKyAgICBTZWVrVHlwZSBtU2Vla2luZzsKKworICAgIGJvb2wgbVNlZWtOb3RpZmljYXRpb25TZW50OworICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisKKyAgICBpbnQ2NF90IG1CaXRyYXRlOyAgLy8gdG90YWwgYml0cmF0ZSBvZiB0aGUgZmlsZSAoaW4gYnBzKSBvciAtMSBpZiB1bmtub3duLgorCisgICAgYm9vbCBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZTsKKyAgICBib29sIG1XYXRjaEZvckF1ZGlvRU9TOworCisgICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVZpZGVvRXZlbnQ7CisgICAgYm9vbCBtVmlkZW9FdmVudFBlbmRpbmc7CisgICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVN0cmVhbURvbmVFdmVudDsKKyAgICBib29sIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nOworICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1CdWZmZXJpbmdFdmVudDsKKyAgICBib29sIG1CdWZmZXJpbmdFdmVudFBlbmRpbmc7CisgICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUNoZWNrQXVkaW9TdGF0dXNFdmVudDsKKyAgICBib29sIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZzsKKyAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtVmlkZW9MYWdFdmVudDsKKyAgICBib29sIG1WaWRlb0xhZ0V2ZW50UGVuZGluZzsKKworICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Bc3luY1ByZXBhcmVFdmVudDsKKyAgICBDb25kaXRpb24gbVByZXBhcmVkQ29uZGl0aW9uOworICAgIGJvb2wgbUlzQXN5bmNQcmVwYXJlOworICAgIHN0YXR1c190IG1QcmVwYXJlUmVzdWx0OworICAgIHN0YXR1c190IG1TdHJlYW1Eb25lU3RhdHVzOworCisgICAgdm9pZCBwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcyA9IC0xKTsKKyAgICB2b2lkIHBvc3RCdWZmZXJpbmdFdmVudF9sKCk7CisgICAgdm9pZCBwb3N0U3RyZWFtRG9uZUV2ZW50X2woc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICB2b2lkIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpOworICAgIHZvaWQgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOworICAgIHN0YXR1c190IHBsYXlfbCgpOworCisgICAgTWVkaWFCdWZmZXIgKm1WaWRlb0J1ZmZlcjsKKworICAgIHNwPEhUVFBCYXNlPiBtQ29ubmVjdGluZ0RhdGFTb3VyY2U7CisgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBUlRTUENvbnRyb2xsZXI+IG1SVFNQQ29udHJvbGxlcjsKKyAgICBzcDxBUlRTUENvbnRyb2xsZXI+IG1Db25uZWN0aW5nUlRTUENvbnRyb2xsZXI7CisKKyAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKKworICAgIGludDY0X3QgbUxhc3RWaWRlb1RpbWVVczsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpOworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbChjb25zdCBzcDxNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvcik7CisgICAgdm9pZCByZXNldF9sKCk7CisgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IHBhdXNlX2woYm9vbCBhdF9lb3MgPSBmYWxzZSk7CisgICAgdm9pZCBpbml0UmVuZGVyZXJfbCgpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplX2woKTsKKyAgICB2b2lkIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKKworICAgIHZvaWQgY2FuY2VsUGxheWVyRXZlbnRzKGJvb2wga2VlcEJ1ZmZlcmluZ0dvaW5nID0gZmFsc2UpOworCisgICAgdm9pZCBzZXRBdWRpb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKTsKKyAgICBzdGF0dXNfdCBpbml0QXVkaW9EZWNvZGVyKCk7CisKKyAgICB2b2lkIHNldFZpZGVvU291cmNlKHNwPE1lZGlhU291cmNlPiBzb3VyY2UpOworICAgIHN0YXR1c190IGluaXRWaWRlb0RlY29kZXIodWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIHZvaWQgb25TdHJlYW1Eb25lKCk7CisKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDApOworCisgICAgdm9pZCBvblZpZGVvRXZlbnQoKTsKKyAgICB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKCk7CisgICAgdm9pZCBvbkNoZWNrQXVkaW9TdGF0dXMoKTsKKyAgICB2b2lkIG9uUHJlcGFyZUFzeW5jRXZlbnQoKTsKKyAgICB2b2lkIGFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKKyAgICB2b2lkIG9uVmlkZW9MYWdVcGRhdGUoKTsKKworICAgIGJvb2wgZ2V0Q2FjaGVkRHVyYXRpb25fbChpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpOworCisgICAgc3RhdHVzX3QgZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7CisKKyAgICBzdGF0aWMgYm9vbCBDb250aW51ZVByZXBhcmF0aW9uKHZvaWQgKmNvb2tpZSk7CisKKyAgICBzdGF0aWMgdm9pZCBPblJUU1BTZWVrRG9uZVdyYXBwZXIodm9pZCAqY29va2llKTsKKyAgICB2b2lkIG9uUlRTUFNlZWtEb25lKCk7CisKKyAgICBib29sIGdldEJpdHJhdGUoaW50NjRfdCAqYml0cmF0ZSk7CisKKyAgICB2b2lkIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKTsKKyAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisKKyAgICBzdGF0dXNfdCBzdGFydEF1ZGlvUGxheWVyX2woKTsKKworICAgIHZvaWQgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOworICAgIHZvaWQgc2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSk7CisKKyAgICBQcmV2aWV3UGxheWVyQmFzZShjb25zdCBQcmV2aWV3UGxheWVyQmFzZSAmKTsKKyAgICBQcmV2aWV3UGxheWVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdQbGF5ZXJCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQUkVWSUVXX1BMQVlFUl9CQVNFX0hfCisKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcAppbmRleCBjZmRlZDcyLi44ZjE3MmYzIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuY3BwCkBAIC0yMDcsNyArMjA3LDcgQEAKIC8vDQogdm9pZCBQcmV2aWV3UmVuZGVyZXI6OnJlbmRlcigNCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpIHsNCi0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKmJ1ZjsNCisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOw0KICAgICBpbnQgZXJyOw0KIA0KICAgICBpZiAoKGVyciA9IG1TdXJmYWNlLT5kZXF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCAmYnVmKSkgIT0gMCkgew0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5oCmluZGV4IDg3NmNhMTYuLmNjZmNmODYgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaApAQCAtNzIsNyArNzIsNyBAQAogICAgIHNpemVfdCBtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodDsNCiAgICAgc2l6ZV90IG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0Ow0KIA0KLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqbUJ1ZjsNCisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqbUJ1ZjsNCiANCiAgICAgUHJldmlld1JlbmRlcmVyKGNvbnN0IFByZXZpZXdSZW5kZXJlciAmKTsNCiAgICAgUHJldmlld1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1JlbmRlcmVyICYpOw0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGVkOWRlNmUuLjcwYzM4ZTYgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcApAQCAtMjgsMTYgKzI4LDE5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKICNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBBd2Vzb21lUGxheWVyICpvYnNlcnZlcikKLSAgICA6IEF1ZGlvUGxheWVyKGF1ZGlvU2luaywgb2JzZXJ2ZXIpIHsKKyAgICAgICAgUHJldmlld1BsYXllckJhc2UgKm9ic2VydmVyKQorICAgIDogQXVkaW9QbGF5ZXJCYXNlKGF1ZGlvU2luaywgb2JzZXJ2ZXIpIHsKIAogICAgIExPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIiKTsKICAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgPSBOVUxMOworICAgIG1BdWRpb1Byb2Nlc3MgPSBOVUxMOwogICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IDA7CiAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9IDA7CiAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAwOwpAQCAtNDcsNiArNTAsNyBAQAogICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFMgPSAwOwogICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCA9IDA7CiAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgIG1Tb3VyY2UgPSBOVUxMOwogfQogCiBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjp+VmlkZW9FZGl0b3JBdWRpb1BsYXllcigpIHsKQEAgLTU1LDEwICs1OSw1NiBAQAogICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICByZXNldCgpOwogICAgIH0KKyAgICBpZiAobUF1ZGlvUHJvY2VzcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQXVkaW9Qcm9jZXNzOworICAgICAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKKyAgICB9Cit9Cit2b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAvLyBCZWZvcmUgc2V0dGluZyBzb3VyY2UsIHN0b3AgYW55IGV4aXN0aW5nIHNvdXJjZS4KKyAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQorICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KKworICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllciByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOworCisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworfQorCitzcDxNZWRpYVNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0U291cmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK3ZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0T2JzZXJ2ZXIoUHJldmlld1BsYXllckJhc2UgKm9ic2VydmVyKSB7CisgICAgTE9HVigic2V0T2JzZXJ2ZXIiKTsKKyAgICAvL0NIRUNLKCFtU3RhcnRlZCk7CisgICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Cit9CisKK2Jvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTdGFydGVkKCkgeworICAgIHJldHVybiBtU3RhcnRlZDsKIH0KIAogc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7CiAgICAgTE9HVigiU3RhcnQiKTsKQEAgLTgwLDExICsxMzAsMTYgQEAKICAgICB2ZUF1ZE1peFNldHRpbmdzIGF1ZGlvTWl4U2V0dGluZ3M7CiAKICAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9IG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPSAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPSBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPSAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9ICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvMTAwLjA7CisgICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ190aHJlc2hvbGQgPQorICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfdGhyZXNob2xkOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfbG93Vm9sdW1lID0KKyAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfbG93Vm9sdW1lKSAvIDEwMC4wOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfZW5hYmxlID0KKyAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJJbkR1Y2tpbmdfZW5hYmxlOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVFZvbExldmVsID0KKyAgICAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpIC8gMTAwLjA7CisgICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUVm9sTGV2ZWwgPQorICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUFkZFZvbHVtZSkgLyAxMDAuMDsKICAgICBhdWRpb01peFNldHRpbmdzLmx2QlRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlCVENoYW5uZWxDb3VudDsKICAgICBhdWRpb01peFNldHRpbmdzLmx2UFRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzOwogCkBAIC0yNDYsNyArMzAxLDcgQEAKIAogICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBudW1DaGFubmVscywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgJlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLCB0aGlzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjY4LDEwICszMjMsMTAgQEAKICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpNVVNJQywgbVNhbXBsZVJhdGUsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAorICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgICAgIChudW1DaGFubmVscyA9PSAyKQotICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgICAgICAgICAgICAgOiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgOiBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgICAgIDAsIDAsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKIAogICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKQEAgLTMwMSwxMCArMzU2LDM3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlc3VtZSgpIHsKKworICAgIHZlQXVkTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKKworICAgIC8vIFNpbmdsZSBhdWRpbyBwbGF5ZXIgaXMgdXNlZDsKKyAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKKyAgICAvLyB3aGljaCBtaWdodCBoYXZlIGNoYW5nZWQgd2l0aCBuZXcgYXVkaW8gc291cmNlCisgICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ190aHJlc2hvbGQgPQorICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfdGhyZXNob2xkOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfbG93Vm9sdW1lID0KKyAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfbG93Vm9sdW1lKSAvIDEwMC4wOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfZW5hYmxlID0KKyAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJJbkR1Y2tpbmdfZW5hYmxlOworICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVFZvbExldmVsID0KKyAgICAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpIC8gMTAwLjA7CisgICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUVm9sTGV2ZWwgPQorICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUFkZFZvbHVtZSkgLyAxMDAuMDsKKyAgICBhdWRpb01peFNldHRpbmdzLmx2QlRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlCVENoYW5uZWxDb3VudDsKKyAgICBhdWRpb01peFNldHRpbmdzLmx2UFRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzOworCisgICAgLy8gQ2FsbCB0byBBdWRpbyBtaXggcGFyYW0gc2V0dGluZworICAgIG1BdWRpb1Byb2Nlc3MtPnZlU2V0QXVkaW9Qcm9jZXNzaW5nUGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOworCisgICAgLy9DYWxsIHRoZSBiYXNlIGNsYXNzCisgICAgQXVkaW9QbGF5ZXJCYXNlOjpyZXN1bWUoKTsKK30KKwogdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZXNldCgpIHsKIAogICAgIExPR1YoInJlc2V0Iik7Ci0gICAgQXVkaW9QbGF5ZXI6OnJlc2V0KCk7CisgICAgQXVkaW9QbGF5ZXJCYXNlOjpyZXNldCgpOwogCiAgICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50CiAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKQEAgLTMzMSwxNiArNDEzLDE5IEBACiAgICAgc2l6ZV90IHNpemVfcmVtYWluaW5nID0gc2l6ZTsKIAogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QU1fQnVmZmVyIGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIgbWl4RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIgcHRGcmFtZSA9IHtOVUxMLCAwfTsKKyAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07CisgICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKKyAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07CiAgICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7CiAgICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7CiAgICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQogICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE7CisgICAgTTRPU0FfSW50MTYgICAgICpwUFRNZGF0YT1OVUxMOwogICAgIE00T1NBX1VJbnQzMiAgICAgdWlQQ01zaXplID0gMDsKIAorICAgIGJvb2wgcG9zdFNlZWtDb21wbGV0ZSA9IGZhbHNlOworICAgIGJvb2wgcG9zdEVPUyA9IGZhbHNlOworCiAgICAgd2hpbGUgKChzaXplX3JlbWFpbmluZyA+IDApJiYoZXJyPT1NNE5PX0VSUk9SKSkgewogICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKIApAQCAtMzYzLDggKzQ0OCw5IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKwogICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlZWtDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNzksNyArNDY1LDExIEBACiAKICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZvcHRpb25zKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawogICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCkBAIC0zOTAsOSArNDgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cyAqIDEwMDApKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIkNoZWNraW5nICVsbGQgPD0gJWxsZCAtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIkNoZWNraW5nICVsbGQgPD0gJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50LW1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGgsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCk7CiAKIAogICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcHRyOwpAQCAtNDAzLDEyICs0OTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZnAgPSBNNE9TQV9OVUxMOwogCiAgICAgICAgICAgICAgICAgICAgICAgICB1aVBDTXNpemUgPSAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhID0gKE00T1NBX0ludDE2KikobUlucHV0QnVmZmVyLT5kYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwUFRNZGF0YSA9IChNNE9TQV9JbnQxNiopICgodWludDhfdCopIG1JbnB1dEJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIm1peCB3aXRoIGJhY2tncm91bmQgbWFsbG9jIHRvIGRvIGxlbiAlZCIsIGxlbik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJnRnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBX21hbGxvYyggbGVuLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBsZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJiZ0ZyYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyBNYWxsb2MgZmFpbGVkIik7CkBAIC00MTYsNyArNTA2LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilNNE9TQV9tYWxsb2MobGVuLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJtaXhGcmFtZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gbWl4RnJhbWUubV9kYXRhQWRkcmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nIE1hbGxvYyBmYWlsZWQiKTsKQEAgLTQ1MCw3ICs1NDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSB0bXAzMjsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiTTRPU0FfZmlsZVJlYWRTZWVrIGVyciAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJNNE9TQV9maWxlUmVhZFNlZWsgZXJyICVkIiwoaW50KWVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobUJHQXVkaW9QQ01GaWxlSGFuZGxlLApAQCAtNDk3LDggKzU4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdEZyYW1lLCAmYmdGcmFtZSwgJm1peEZyYW1lKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZGVjb2RlZCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbWl4RnJhbWUubV9kYXRhQWRkcmVzcywgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltaXhGcmFtZS5tX2RhdGFBZGRyZXNzLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3ApewpAQCAtNTE0LDEwICs2MDQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJnRnJhbWUubV9kYXRhQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbWl4RnJhbWUubV9kYXRhQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKQEAgLTUzOCw3ICs2MjgsNyBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgICAgIExPR1YoImZpbGxCdWZmZXI6IG1Tb3VyY2UtPnJlYWQgcmV0dXJuZWQgZXJyICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyICYmICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUygpOworICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CkBAIC01ODIsOCArNjcyLDE4IEBACiAgICAgICAgIHNpemVfcmVtYWluaW5nIC09IGNvcHk7CiAgICAgfQogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7CisgICAgfQorCisgICAgaWYgKHBvc3RFT1MpIHsKKyAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MoKTsKKyAgICB9CisKKyAgICBpZiAocG9zdFNlZWtDb21wbGV0ZSkgeworICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOworICAgIH0KIAogICAgIHJldHVybiBzaXplX2RvbmU7CiB9CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCmluZGV4IDkyYjc3YjYuLjczYWVhNjUgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCkBAIC0yNyw3ICsyNyw4IEBACiAjaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiDQogI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCINCiAjaW5jbHVkZSAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIg0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPg0KKyNpbmNsdWRlICJBdWRpb1BsYXllckJhc2UuaCINCisjaW5jbHVkZSAiUHJldmlld1BsYXllckJhc2UuaCINCiANCiBuYW1lc3BhY2UgYW5kcm9pZCB7DQogDQpAQCAtMzYsNyArMzcsNyBAQAogY2xhc3MgUHJldmlld1BsYXllcjsNCiANCiANCi1jbGFzcyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyIDogcHVibGljIEF1ZGlvUGxheWVyIHsNCitjbGFzcyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyIDogcHVibGljIEF1ZGlvUGxheWVyQmFzZSB7DQogcHVibGljOg0KICAgICBlbnVtIHsNCiAgICAgICAgIFJFQUNIRURfRU9TLA0KQEAgLTQ0LDExICs0NSwxMiBAQAogICAgIH07DQogDQogICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmssDQotICAgICAgICBBd2Vzb21lUGxheWVyICphdWRpb09ic2VydmVyID0gTlVMTCk7DQorICAgICAgICBQcmV2aWV3UGxheWVyQmFzZSAqYXVkaW9PYnNlcnZlciA9IE5VTEwpOw0KIA0KICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCk7DQogDQogICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7DQorICAgIHZvaWQgcmVzdW1lKCk7DQogDQogICAgIHZvaWQgc2V0QXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOw0KICAgICB2b2lkIHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShNNE9TQV9Db250ZXh0IHBCR0F1ZGlvUENNRmlsZUhhbmRsZSk7DQpAQCAtNTcsNiArNTksMTEgQEAKICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUywNCiAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCk7DQogDQorICAgIHZvaWQgc2V0T2JzZXJ2ZXIoUHJldmlld1BsYXllckJhc2UgKm9ic2VydmVyKTsNCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOw0KKyAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKCk7DQorDQorICAgIGJvb2wgaXNTdGFydGVkKCk7DQogcHJpdmF0ZToNCiANCiAgICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKm1BdWRpb01peFNldHRpbmdzOw0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCmluZGV4IDIwNDlmMDguLmJjZGMzZGUgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcApAQCAtMjIsNDEgKzIyLDQxIEBACiANCiBuYW1lc3BhY2UgYW5kcm9pZCB7DQogDQotVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyA6OlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKSB7DQorVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHsNCiANCiAgICAgTE9HVigiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6IENvbnN0cnVjdCAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyAiKTsNCiANCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bUF1ZFZvbEFyckluZGV4ID0gMDsNCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bURvRHVja2luZyA9IDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1EdWNraW5nX2VuYWJsZSA9IDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1EdWNraW5nX2xvd1ZvbHVtZSA9IDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1EdWNraW5nX3RocmVzaG9sZCA9IDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1EdWNraW5nRmFjdG9yID0gMDsNCisgICAgbUF1ZFZvbEFyckluZGV4ID0gMDsNCisgICAgbURvRHVja2luZyA9IDA7DQorICAgIG1EdWNraW5nX2VuYWJsZSA9IDA7DQorICAgIG1EdWNraW5nX2xvd1ZvbHVtZSA9IDA7DQorICAgIG1EdWNraW5nX3RocmVzaG9sZCA9IDA7DQorICAgIG1EdWNraW5nRmFjdG9yID0gMDsNCiANCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bUJUVm9sTGV2ZWwgPSAwOw0KLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptUFRWb2xMZXZlbCA9IDA7DQorICAgIG1CVFZvbExldmVsID0gMDsNCisgICAgbVBUVm9sTGV2ZWwgPSAwOw0KIA0KLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptSXNTU1JDbmVlZGVkID0gMDsNCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bUNoYW5uZWxDb252ZXJzaW9uID0gMDsNCisgICAgbUlzU1NSQ25lZWRlZCA9IDA7DQorICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7DQogDQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1CVEZvcm1hdCA9IE1PTk9fMTZfQklUOw0KKyAgICBtQlRGb3JtYXQgPSBNT05PXzE2X0JJVDsNCiANCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bUluU2FtcGxlUmF0ZSA9IDgwMDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1PdXRTYW1wbGVSYXRlID0gMTYwMDA7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1QVENoYW5uZWxDb3VudCA9IDI7DQotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1CVENoYW5uZWxDb3VudCA9IDE7DQorICAgIG1JblNhbXBsZVJhdGUgPSA4MDAwOw0KKyAgICBtT3V0U2FtcGxlUmF0ZSA9IDE2MDAwOw0KKyAgICBtUFRDaGFubmVsQ291bnQgPSAyOw0KKyAgICBtQlRDaGFubmVsQ291bnQgPSAxOw0KIH0NCiANCiBNNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjp2ZVByb2Nlc3NBdWRpb01peE5EdWNrKA0KICAgICAgICAgdm9pZCAqcFBUQnVmZmVyLCB2b2lkICpwQlRCdWZmZXIsIHZvaWQgKnBPdXRCdWZmZXIpIHsNCiANCi0gICAgTTRBTV9CdWZmZXIqIHBQcmltYXJ5VHJhY2sgICA9IChNNEFNX0J1ZmZlciopcFBUQnVmZmVyOw0KLSAgICBNNEFNX0J1ZmZlciogcEJhY2tncm91bmRUcmFjayA9IChNNEFNX0J1ZmZlciopcEJUQnVmZmVyOw0KLSAgICBNNEFNX0J1ZmZlciogcE1peGVkT3V0QnVmZmVyICA9IChNNEFNX0J1ZmZlciopcE91dEJ1ZmZlcjsNCisgICAgTTRBTV9CdWZmZXIxNiogcFByaW1hcnlUcmFjayAgID0gKE00QU1fQnVmZmVyMTYqKXBQVEJ1ZmZlcjsNCisgICAgTTRBTV9CdWZmZXIxNiogcEJhY2tncm91bmRUcmFjayA9IChNNEFNX0J1ZmZlcjE2KilwQlRCdWZmZXI7DQorICAgIE00QU1fQnVmZmVyMTYqIHBNaXhlZE91dEJ1ZmZlciAgPSAoTTRBTV9CdWZmZXIxNiopcE91dEJ1ZmZlcjsNCiANCiAgICAgTE9HVigiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6bHZQcm9jZXNzQXVkaW9NaXhORHVjayBcDQotICAgICBwUFRCdWZmZXIgMHgleCBwQlRCdWZmZXIgMHgleCBwT3V0QnVmZmVyIDB4JXgiLCBwUFRCdWZmZXIsDQotICAgICAgcEJUQnVmZmVyLCBwT3V0QnVmZmVyKTsNCisgICAgICAgIHBQVEJ1ZmZlciAweCV4IHBCVEJ1ZmZlciAweCV4IHBPdXRCdWZmZXIgMHgleCIsIHBQVEJ1ZmZlciwNCisgICAgICAgIHBCVEJ1ZmZlciwgcE91dEJ1ZmZlcik7DQogDQogICAgIE00T1NBX0VSUiByZXN1bHQgPSBNNE5PX0VSUk9SOw0KICAgICBNNE9TQV9JbnQxNiAqcEJUTWRhdGExOw0KQEAgLTc0LDggKzc0LDggQEAKICAgICBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZTsNCiANCiAgICAgLy8gQmVmb3JlIG1peGluZywgd2UgbmVlZCB0byBoYXZlIG9ubHkgUFQgYXMgb3V0IGJ1ZmZlcg0KLSAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywNCi0gICAgIChNNE9TQV9NZW1BZGRyOClwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzLCBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7DQorICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywNCisgICAgICAgICh2b2lkICopcFByaW1hcnlUcmFjay0+bV9kYXRhQWRkcmVzcywgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUpOw0KIA0KICAgICAvLyBJbml0aWFsbHkgY29udGFpbnMgdGhlIGlucHV0IHByaW1hcnkgdHJhY2sNCiAgICAgcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7DQpAQCAtODUsNyArODUsNyBAQAogICAgIC8vIFNpbmNlIHdlIG5lZWQgdG8gZ2l2ZSBzYW1wbGUgY291bnQgYW5kIG5vdCBidWZmZXIgc2l6ZQ0KICAgICB1aVBDTXNpemUgPSBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZS8yIDsNCiANCi0gICAgaWYoKHRoaXMtPm1EdWNraW5nX2VuYWJsZSkgJiYgKHRoaXMtPm1QVFZvbExldmVsICE9IDAuMCkpIHsNCisgICAgaWYgKChtRHVja2luZ19lbmFibGUpICYmIChtUFRWb2xMZXZlbCAhPSAwLjApKSB7DQogICAgICAgICAvLyBMT0dJKCJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogSW4gRHVja2luZyBhbmFseXNpcyAiKTsNCiAgICAgICAgIGxvb3BJbmRleCA9IDA7DQogICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7DQpAQCAtOTMsMzUgKzkzLDMyIEBACiANCiAgICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiopcFByaW1hcnlUcmFjay0+bV9kYXRhQWRkcmVzczsNCiANCi0gICAgICAgIHdoaWxlKCBsb29wSW5kZXggPCBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemUvc2l6ZW9mKE00T1NBX0ludDE2KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPj0gMCl7DQorICAgICAgICB3aGlsZSAobG9vcEluZGV4IDwgcFByaW1hcnlUcmFjay0+bV9idWZmZXJTaXplL3NpemVvZihNNE9TQV9JbnQxNikpIHsNCisgICAgICAgICAgICBpZiAocFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPj0gMCkgew0KICAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID8NCi0gICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOw0KICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsNCi0gICAgICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/DQotICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWU6IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWU6IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XTsNCiAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGxvb3BJbmRleCsrOw0KICAgICAgICAgfQ0KIA0KLSAgICAgICAgdGhpcy0+bUF1ZGlvVm9sdW1lQXJyYXlbdGhpcy0+bUF1ZFZvbEFyckluZGV4XSA9DQotICAgICAgICAgZ2V0RGVjaWJlbFNvdW5kKHBlYWtEYlZhbHVlKTsNCisgICAgICAgIG1BdWRpb1ZvbHVtZUFycmF5W21BdWRWb2xBcnJJbmRleF0gPSBnZXREZWNpYmVsU291bmQocGVha0RiVmFsdWUpOw0KIA0KICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6IGdldERlY2liZWxTb3VuZCAlZCIsDQotICAgICAgICAgdGhpcy0+bUF1ZGlvVm9sdW1lQXJyYXlbdGhpcy0+bUF1ZFZvbEFyckluZGV4XSk7DQorICAgICAgICAgICAgbUF1ZGlvVm9sdW1lQXJyYXlbbUF1ZFZvbEFyckluZGV4XSk7DQogDQogICAgICAgICAvLyBXSU5ET1dfU0laRSBpcyAxMCBieSBkZWZhdWx0DQogICAgICAgICAvLyBDaGVjayBmb3IgdGhyZXNob2xkIGlzIGRvbmUgYWZ0ZXIgMTAgY3ljbGVzDQotICAgICAgICBpZiAoIHRoaXMtPm1BdWRWb2xBcnJJbmRleCA+PSBXSU5ET1dfU0laRSAtMSkgew0KLSAgICAgICAgICAgIHRoaXMtPm1Eb0R1Y2tpbmcgPSBpc1RocmVzaG9sZEJyZWFjaGVkKHRoaXMtPm1BdWRpb1ZvbHVtZUFycmF5LA0KLSAgICAgICAgICAgICB0aGlzLT5tQXVkVm9sQXJySW5kZXgsdGhpcy0+bUR1Y2tpbmdfdGhyZXNob2xkICk7DQotDQotICAgICAgICAgICAgdGhpcy0+bUF1ZFZvbEFyckluZGV4ID0gMDsNCisgICAgICAgIGlmIChtQXVkVm9sQXJySW5kZXggPj0gV0lORE9XX1NJWkUgLSAxKSB7DQorICAgICAgICAgICAgbURvRHVja2luZyA9IGlzVGhyZXNob2xkQnJlYWNoZWQobUF1ZGlvVm9sdW1lQXJyYXksDQorICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4LG1EdWNraW5nX3RocmVzaG9sZCApOw0KKyAgICAgICAgICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7DQogICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRoaXMtPm1BdWRWb2xBcnJJbmRleCsrOw0KKyAgICAgICAgICAgIG1BdWRWb2xBcnJJbmRleCsrOw0KICAgICAgICAgfQ0KIA0KICAgICAgICAgLy8NCkBAIC0xMzUsMjUgKzEzMiwyMyBAQAogICAgICAgICAvLyAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpDQogICAgICAgICAvLw0KIA0KLSAgICAgICAgaWYodGhpcy0+bURvRHVja2luZyl7DQotICAgICAgICAgICAgaWYgKCB0aGlzLT5tRHVja2luZ0ZhY3RvciA+IHRoaXMtPm1EdWNraW5nX2xvd1ZvbHVtZSkgew0KKyAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsNCisgICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPiBtRHVja2luZ19sb3dWb2x1bWUpIHsNCiAgICAgICAgICAgICAgICAgLy8gRkFERSBPVVQgQkcgVHJhY2sNCiAgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3Rvcg0KICAgICAgICAgICAgICAgICAvLyBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoIGxvdyB2b2x1bWUgbGV2ZWwNCi0gICAgICAgICAgICAgICAgdGhpcy0+bUR1Y2tpbmdGYWN0b3IgLT0gKHRoaXMtPm1EdWNraW5nX2xvd1ZvbHVtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aGlzLT5tRHVja2luZ0ZhY3RvciA9IHRoaXMtPm1EdWNraW5nX2xvd1ZvbHVtZTsNCisgICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgLT0gKG1EdWNraW5nX2xvd1ZvbHVtZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSBtRHVja2luZ19sb3dWb2x1bWU7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoIHRoaXMtPm1EdWNraW5nRmFjdG9yIDwgMS4wICl7DQorICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yIDwgMS4wICkgew0KICAgICAgICAgICAgICAgICAvLyBGQURFIElOIEJHIFRyYWNrDQogICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBvZg0KICAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaCBvcmlnLnZvbHVtZSBsZXZlbA0KLSAgICAgICAgICAgICAgICB0aGlzLT5tRHVja2luZ0ZhY3RvciArPSAodGhpcy0+bUR1Y2tpbmdfbG93Vm9sdW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZXsNCi0gICAgICAgICAgICAgICAgdGhpcy0+bUR1Y2tpbmdGYWN0b3IgPSAxLjA7DQorICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yICs9IChtRHVja2luZ19sb3dWb2x1bWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gMS4wOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgfSAvLyBlbmQgaWYgLSBtRHVja2luZ19lbmFibGUNCkBAIC0xNjIsNDYgKzE1Nyw0MiBAQAogICAgIC8vIE1peGluZyBMb2dpYw0KIA0KICAgICBMT0dWKCJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogT3V0IG9mIER1Y2tpbmcgYW5hbHlzaXMgdWlQQ01zaXplXA0KLSAgICAgJWQgJWYgJWYiLCB0aGlzLT5tRG9EdWNraW5nLCB0aGlzLT5tRHVja2luZ0ZhY3Rvcix0aGlzLT5tQlRWb2xMZXZlbCk7DQorICAgICAgICAlZCAlZiAlZiIsIG1Eb0R1Y2tpbmcsIG1EdWNraW5nRmFjdG9yLG1CVFZvbExldmVsKTsNCiANCi0gICAgd2hpbGUodWlQQ01zaXplLS0+MCkgew0KKyAgICB3aGlsZSAodWlQQ01zaXplLS0gPiAwKSB7DQogDQogICAgICAgICBNNE9TQV9JbnQzMiB0ZW1wOw0KICAgICAgICAgLy8gU2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVA0KLSAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSp0aGlzLT5tQlRWb2xMZXZlbCk7DQotICAgICAgICAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KSgqcFBUTWRhdGEyKnRoaXMtPm1QVFZvbExldmVsKTsNCisgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEqbUJUVm9sTGV2ZWwpOw0KKyAgICAgICAgKnBQVE1kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQVE1kYXRhMiptUFRWb2xMZXZlbCk7DQogDQogICAgICAgICAvLyBNaXggdGhlIHR3byBzYW1wbGVzDQotICAgICAgICBpZiAoIHRoaXMtPm1Eb0R1Y2tpbmcpIHsNCisgICAgICAgIGlmIChtRG9EdWNraW5nKSB7DQogDQogICAgICAgICAgICAgLy8gRHVjayB0aGUgQkcgdHJhY2sgdG8gZHVja2luZyBmYWN0b3IgdmFsdWUgYmVmb3JlIG1peGluZw0KLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCgqcEJUTWRhdGExKSoodGhpcy0+bUR1Y2tpbmdGYWN0b3IpKTsNCisgICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7DQogDQogICAgICAgICAgICAgLy8gbWl4IGFzIG5vcm1hbCBjYXNlDQogICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQorICAgICAgICB9IGVsc2Ugew0KIA0KLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCgqcEJUTWRhdGExKSoodGhpcy0+bUR1Y2tpbmdGYWN0b3IpKTsNCisgICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7DQogICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOw0KICAgICAgICAgfQ0KIA0KLSAgICAgICAgaWYgKCAqcEJUTWRhdGExIDwgMCkgew0KKyAgICAgICAgaWYgKCpwQlRNZGF0YTEgPCAwKSB7DQogICAgICAgICAgICAgdGVtcCA9IC0oKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwNCiANCi0gICAgICAgICAgICBpZiAoIHRlbXAgPiAzMjc2Nykgew0KKyAgICAgICAgICAgIGlmICh0ZW1wID4gMzI3NjcpIHsNCiAgICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IC0zMjc2NjsgLy8gbGVzcyB0aGVuIG1heCBhbGxvd2VkIHZhbHVlDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2V7DQorICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoLXRlbXApOw0KICAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KKyAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICB0ZW1wID0gKCpwQlRNZGF0YTEpICogMjsgLy8gYnJpbmcgdG8gb3JpZ2luYWwgQW1wbGl0dWRlIGxldmVsDQogICAgICAgICAgICAgaWYgKCB0ZW1wID4gMzI3NjgpIHsNCiAgICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IDMyNzY3OyAvLyBsZXNzIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCkBAIC0yMTAsMTQxICsyMDEsMTE2IEBACiAgICAgICAgIHBQVE1kYXRhMisrOw0KICAgICB9DQogICAgIC8vTE9HVigiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6IENvcHkgZmluYWwgb3V0ICIpOw0KLSAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywNCi0gICAgIChNNE9TQV9NZW1BZGRyOClwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzLA0KLSAgICAgIHBCYWNrZ3JvdW5kVHJhY2stPm1fYnVmZmVyU2l6ZSk7DQorICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywNCisgICAgICAgICh2b2lkICopcEJhY2tncm91bmRUcmFjay0+bV9kYXRhQWRkcmVzcywNCisgICAgICAgIHBCYWNrZ3JvdW5kVHJhY2stPm1fYnVmZmVyU2l6ZSk7DQogDQogICAgIExPR1YoIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Omx2UHJvY2Vzc0F1ZGlvTWl4TkR1Y2sgRVhJVCIpOw0KICAgICByZXR1cm4gcmVzdWx0Ow0KIH0NCiANCi1WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogflZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKSB7DQorVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6flZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKSB7DQogDQotIC8vZnJlZShWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogcFRlbXBCdWZmZXIpOw0KIH0NCiANCiBNNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpjYWxjdWxhdGVPdXRSZXNhbXBsZUJ1ZlNpemUoKSB7DQogDQotICAgIE00T1NBX0ludDMyIGJ1ZlNpemUgPTA7DQotDQogICAgIC8vIFRoaXMgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIGNoYW5uZWwgY291bnQgaW4gbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZQ0KLSAgICBidWZTaXplID0gKHRoaXMtPm1PdXRTYW1wbGVSYXRlL3RoaXMtPm1JblNhbXBsZVJhdGUpKnRoaXMtPm1CVEJ1ZmZlci5tX2J1ZmZlclNpemU7DQotDQotICAgIHJldHVybiBidWZTaXplOw0KKyAgICByZXR1cm4gKG1PdXRTYW1wbGVSYXRlIC8gbUluU2FtcGxlUmF0ZSkgKiBtQlRCdWZmZXIubV9idWZmZXJTaXplOw0KIH0NCiANCiB2b2lkIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgOjp2ZVNldEF1ZGlvUHJvY2Vzc2luZ1BhcmFtcygNCi0gICAgICAgIHZlQXVkTWl4U2V0dGluZ3MgZ0lucHV0UGFyYW1zKSB7DQorICAgICAgICBjb25zdCB2ZUF1ZE1peFNldHRpbmdzJiBnSW5wdXRQYXJhbXMpIHsNCiANCiAgICAgTE9HVigiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6IEVOVEVSIGx2U2V0QXVkaW9Qcm9jZXNzaW5nUGFyYW1zICIpOw0KLSAgICB0aGlzLT5tRHVja2luZ19lbmFibGUgICAgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfZW5hYmxlOw0KLSAgICB0aGlzLT5tRHVja2luZ19sb3dWb2x1bWUgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfbG93Vm9sdW1lOw0KLSAgICB0aGlzLT5tRHVja2luZ190aHJlc2hvbGQgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfdGhyZXNob2xkOw0KKyAgICBtRHVja2luZ19lbmFibGUgICAgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfZW5hYmxlOw0KKyAgICBtRHVja2luZ19sb3dWb2x1bWUgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfbG93Vm9sdW1lOw0KKyAgICBtRHVja2luZ190aHJlc2hvbGQgICAgPSBnSW5wdXRQYXJhbXMubHZJbkR1Y2tpbmdfdGhyZXNob2xkOw0KIA0KLSAgICB0aGlzLT5tUFRWb2xMZXZlbCAgICAgICAgICAgPSBnSW5wdXRQYXJhbXMubHZQVFZvbExldmVsOw0KLSAgICB0aGlzLT5tQlRWb2xMZXZlbCAgICAgICAgICAgPSBnSW5wdXRQYXJhbXMubHZCVFZvbExldmVsIDsNCisgICAgbVBUVm9sTGV2ZWwgICAgICAgICAgID0gZ0lucHV0UGFyYW1zLmx2UFRWb2xMZXZlbDsNCisgICAgbUJUVm9sTGV2ZWwgICAgICAgICAgID0gZ0lucHV0UGFyYW1zLmx2QlRWb2xMZXZlbCA7DQogDQotICAgIHRoaXMtPm1CVENoYW5uZWxDb3VudCAgICAgICA9IGdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ow0KLSAgICB0aGlzLT5tUFRDaGFubmVsQ291bnQgICAgICAgPSBnSW5wdXRQYXJhbXMubHZQVENoYW5uZWxDb3VudDsNCisgICAgbUJUQ2hhbm5lbENvdW50ICAgICAgID0gZ0lucHV0UGFyYW1zLmx2QlRDaGFubmVsQ291bnQ7DQorICAgIG1QVENoYW5uZWxDb3VudCAgICAgICA9IGdJbnB1dFBhcmFtcy5sdlBUQ2hhbm5lbENvdW50Ow0KIA0KLSAgICB0aGlzLT5tQlRGb3JtYXQgICAgICAgICAgICAgPSBnSW5wdXRQYXJhbXMubHZCVEZvcm1hdDsNCisgICAgbUJURm9ybWF0ICAgICAgICAgICAgID0gZ0lucHV0UGFyYW1zLmx2QlRGb3JtYXQ7DQogDQotICAgIHRoaXMtPm1JblNhbXBsZVJhdGUgICAgICAgICA9IGdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZTsNCi0gICAgdGhpcy0+bU91dFNhbXBsZVJhdGUgICAgICAgID0gZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZTsNCisgICAgbUluU2FtcGxlUmF0ZSAgICAgICAgID0gZ0lucHV0UGFyYW1zLmx2SW5TYW1wbGVSYXRlOw0KKyAgICBtT3V0U2FtcGxlUmF0ZSAgICAgICAgPSBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlOw0KIA0KLSAgICB0aGlzLT5tQXVkVm9sQXJySW5kZXggICAgICAgPSAwOw0KLSAgICB0aGlzLT5tRG9EdWNraW5nICAgICAgICAgICAgPSAwOw0KLSAgICB0aGlzLT5tRHVja2luZ0ZhY3RvciAgICAgICAgPSAxLjA7IC8vIGRlZmF1bHQNCisgICAgbUF1ZFZvbEFyckluZGV4ICAgICAgID0gMDsNCisgICAgbURvRHVja2luZyAgICAgICAgICAgID0gMDsNCisgICAgbUR1Y2tpbmdGYWN0b3IgICAgICAgID0gMS4wOyAvLyBkZWZhdWx0DQogDQogICAgIExPR1YoIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OiAgZHVja2luZ19lbmFibGUgMHgleCBcDQotICAgICBkdWNraW5nX2xvd1ZvbHVtZSAlZiAgZHVja2luZ190aHJlc2hvbGQgJWQgIGZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLA0KLSAgICAgdGhpcy0+bUR1Y2tpbmdfZW5hYmxlLCB0aGlzLT5tRHVja2luZ19sb3dWb2x1bWUsIHRoaXMtPm1EdWNraW5nX3RocmVzaG9sZCwNCi0gICAgIHRoaXMtPm1QVFZvbExldmVsLCB0aGlzLT5tUFRWb2xMZXZlbCk7DQorICAgICAgICBkdWNraW5nX2xvd1ZvbHVtZSAlZiAgZHVja2luZ190aHJlc2hvbGQgJWQgIGZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLA0KKyAgICAgICAgbUR1Y2tpbmdfZW5hYmxlLCBtRHVja2luZ19sb3dWb2x1bWUsIG1EdWNraW5nX3RocmVzaG9sZCwNCisgICAgICAgIG1QVFZvbExldmVsLCBtUFRWb2xMZXZlbCk7DQogDQogICAgIC8vIEZvbGxvd2luZyBsb2djIGRlY2lkZXMgaWYgU1NSQyBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgdGhpcyBtaXhpbmcNCi0gICAgaWYgKCBnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUgIT0gZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZSl7DQotICAgICAgICB0aGlzLT5tSXNTU1JDbmVlZGVkICAgICAgPSAxOw0KLSAgICB9ZWxzZXsNCi0gICAgICAgIHRoaXMtPm1Jc1NTUkNuZWVkZWQgICAgICA9IDA7DQotICAgIH0NCi0gICAgaWYoIGdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50ICE9IGdJbnB1dFBhcmFtcy5sdlBUQ2hhbm5lbENvdW50KXsNCisgICAgbUlzU1NSQ25lZWRlZCA9IChnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUgIT0gZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZSk7DQorICAgIGlmIChnSW5wdXRQYXJhbXMubHZCVENoYW5uZWxDb3VudCAhPSBnSW5wdXRQYXJhbXMubHZQVENoYW5uZWxDb3VudCl7DQogICAgICAgICBpZiAoZ0lucHV0UGFyYW1zLmx2QlRDaGFubmVsQ291bnQgPT0gMil7DQotICAgICAgICAgICAgdGhpcy0+bUNoYW5uZWxDb252ZXJzaW9uICAgPSAxOyAvLyBjb252ZXJ0IHRvIE1PTk8NCi0gICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgIHRoaXMtPm1DaGFubmVsQ29udmVyc2lvbiAgID0gMjsgLy8gQ29udmVydCB0byBTVEVSRU8NCisgICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gICA9IDE7IC8vIGNvbnZlcnQgdG8gTU9OTw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gICA9IDI7IC8vIENvbnZlcnQgdG8gU1RFUkVPDQogICAgICAgICB9DQotICAgIH1lbHNlew0KLSAgICAgICAgdGhpcy0+bUNoYW5uZWxDb252ZXJzaW9uICAgPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgbUNoYW5uZWxDb252ZXJzaW9uICAgPSAwOw0KICAgICB9DQogICAgIExPR1YoIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OiBFWElUIHZlU2V0QXVkaW9Qcm9jZXNzaW5nUGFyYW1zICIpOw0KIH0NCiANCiANCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogZ2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSkgew0KLQ0KLSAgICBpbnQgZGJTb3VuZCA9IDE7DQotDQotICAgIGlmICh2YWx1ZSA9PSAwKSByZXR1cm4gMDsNCi0NCi0gICAgaWYgKHZhbHVlID4gMHg0MDAwICYmIHZhbHVlIDw9IDB4ODAwMCkgLy8gMzI3NjgNCi0gICAgICAgIGRiU291bmQgPSA5MDsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDIwMDAgJiYgdmFsdWUgPD0gMHg0MDAwKSAvLyAxNjM4NA0KLSAgICAgICAgZGJTb3VuZCA9IDg0Ow0KLSAgICBlbHNlIGlmICh2YWx1ZSA+IDB4MTAwMCAmJiB2YWx1ZSA8PSAweDIwMDApIC8vIDgxOTINCi0gICAgICAgIGRiU291bmQgPSA3ODsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwKSAvLyA0MDI4DQotICAgICAgICBkYlNvdW5kID0gNzI7DQotICAgIGVsc2UgaWYgKHZhbHVlID4gMHgwNDAwICYmIHZhbHVlIDw9IDB4MDgwMCkgLy8gMjA0OA0KLSAgICAgICAgZGJTb3VuZCA9IDY2Ow0KLSAgICBlbHNlIGlmICh2YWx1ZSA+IDB4MDIwMCAmJiB2YWx1ZSA8PSAweDA0MDApIC8vIDEwMjQNCi0gICAgICAgIGRiU291bmQgPSA2MDsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwKSAvLyA1MTINCi0gICAgICAgIGRiU291bmQgPSA1NDsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAwODAgJiYgdmFsdWUgPD0gMHgwMTAwKSAvLyAyNTYNCi0gICAgICAgIGRiU291bmQgPSA0ODsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAwNDAgJiYgdmFsdWUgPD0gMHgwMDgwKSAvLyAxMjgNCi0gICAgICAgIGRiU291bmQgPSA0MjsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwKSAvLyA2NA0KLSAgICAgICAgZGJTb3VuZCA9IDM2Ow0KLSAgICBlbHNlIGlmICh2YWx1ZSA+IDB4MDAxMCAmJiB2YWx1ZSA8PSAweDAwMjApIC8vIDMyDQotICAgICAgICBkYlNvdW5kID0gMzA7DQotICAgIGVsc2UgaWYgKHZhbHVlID4gMHgwMDA4ICYmIHZhbHVlIDw9IDB4MDAxMCkgLy8xNg0KLSAgICAgICAgZGJTb3VuZCA9IDI0Ow0KLSAgICBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDgpIC8vOA0KLSAgICAgICAgZGJTb3VuZCA9IDI0Ow0KLSAgICBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMyAmJiB2YWx1ZSA8PSAweDAwMDcpIC8vIDQNCi0gICAgICAgIGRiU291bmQgPSAxODsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAwMDEgJiYgdmFsdWUgPD0gMHgwMDAzKSAvLzINCi0gICAgICAgIGRiU291bmQgPSAxMjsNCi0gICAgZWxzZSBpZiAodmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEpIC8vIDENCi0gICAgICAgIGRiU291bmQgPSA2Ow0KLSAgICBlbHNlDQotICAgICAgICBkYlNvdW5kID0gMDsNCi0NCi0gICAgcmV0dXJuIGRiU291bmQ7DQorLy8gRmFzdCB3YXkgdG8gY29tcHV0ZSAxMCAqIGxvZyh2YWx1ZSkNCitNNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpnZXREZWNpYmVsU291bmQoTTRPU0FfVUludDMyIHZhbHVlKSB7DQorICAgIGlmICh2YWx1ZSA8PSAwIHx8IHZhbHVlID4gMHg4MDAwKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4NDAwMCkgeyAvLyAzMjc2OA0KKyAgICAgICAgcmV0dXJuIDkwOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgyMDAwKSB7IC8vIDE2Mzg0DQorICAgICAgICByZXR1cm4gODQ7DQorICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDEwMDApIHsgLy8gODE5Mg0KKyAgICAgICAgcmV0dXJuIDc4Ow0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwODAwKSB7IC8vIDQwMjgNCisgICAgICAgIHJldHVybiA3MjsNCisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDQwMCkgeyAvLyAyMDQ4DQorICAgICAgICByZXR1cm4gNjY7DQorICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAyMDApIHsgLy8gMTAyNA0KKyAgICAgICAgcmV0dXJuIDYwOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMTAwKSB7IC8vIDUxMg0KKyAgICAgICAgcmV0dXJuIDU0Ow0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDgwKSB7IC8vIDI1Ng0KKyAgICAgICAgcmV0dXJuIDQ4Ow0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDQwKSB7IC8vIDEyOA0KKyAgICAgICAgcmV0dXJuIDQyOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDIwKSB7IC8vIDY0DQorICAgICAgICByZXR1cm4gMzY7DQorICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMTApIHsgLy8gMzINCisgICAgICAgIHJldHVybiAzMDsNCisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwOCkgeyAvLyAxNg0KKyAgICAgICAgcmV0dXJuIDI0Ow0KKyAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDA3KSB7IC8vIDgNCisgICAgICAgIHJldHVybiAyNDsNCisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMykgeyAvLyA0DQorICAgICAgICByZXR1cm4gMTg7DQorICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDEpIHsgLy8gMg0KKyAgICAgICAgcmV0dXJuIDEyOw0KKyAgICB9IGVsc2UgIHsgLy8gMQ0KKyAgICAgICAgcmV0dXJuIDY7DQorICAgIH0NCiB9DQogDQotTTRPU0FfQm9vbCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjogaXNUaHJlc2hvbGRCcmVhY2hlZCgNCi0gICAgICAgIE00T1NBX0ludDMyKiBhdmVyYWdlVmFsdWUsIE00T1NBX0ludDMyIHN0b3JlQ291bnQsDQotICAgICAgICAgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUpIHsNCitNNE9TQV9Cb29sIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmlzVGhyZXNob2xkQnJlYWNoZWQoDQorICAgICAgICBNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLA0KKyAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwNCisgICAgICAgIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKSB7DQogDQotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsNCi0gICAgaW50IGk7DQotICAgIGludCBmaW5hbFZhbHVlID0gMDsNCi0NCi0gICAgZm9yIChpPTA7IGk8IHN0b3JlQ291bnQ7aSsrKQ0KLSAgICAgICAgZmluYWxWYWx1ZSArPSBhdmVyYWdlVmFsdWVbaV07DQotDQotICAgIGZpbmFsVmFsdWUgPSBmaW5hbFZhbHVlL3N0b3JlQ291bnQ7DQotDQotICAgIC8vcHJpbnRmICgiPCVkID4gXHQgICIsIGZpbmFsVmFsdWUpOw0KLQ0KLSAgICBpZiAoZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlKQ0KLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsNCi0gICAgZWxzZQ0KLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfRkFMU0U7DQotDQotICAgIHJldHVybiByZXN1bHQ7DQorICAgIGludCB0b3RhbFZhbHVlID0gMDsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yZUNvdW50OyArK2kpIHsNCisgICAgICAgIHRvdGFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOw0KKyAgICB9DQorICAgIHJldHVybiAodG90YWxWYWx1ZSAvIHN0b3JlQ291bnQgPiB0aHJlc2hvbGRWYWx1ZSk7DQogfQ0KIA0KIH0vL25hbWVzcGFjZSBhbmRyb2lkDQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaAppbmRleCA4NTFhMTMzLi4xMDE1NzIxIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaAorKysgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaApAQCAtMzEsNyArMzEsNyBAQAogdHlwZWRlZiBzdHJ1Y3Qgew0KICAgICBNNE9TQV9VSW50MTYqICAgbV9kYXRhQWRkcmVzczsgLy8gQW5kcm9pZCBTUkMgbmVlZHMgYSBJbnQxNiBwb2ludGVyDQogICAgIE00T1NBX1VJbnQzMiAgICBtX2J1ZmZlclNpemU7DQotfSBNNEFNX0J1ZmZlcjsNCit9IE00QU1fQnVmZmVyMTY7ICAgIC8vIFN0cnVjdHVyZSBjb250YWlucyBJbnQxNl90IHBvaW50ZXINCiANCiAvLyBGb2xsb3dpbmcgc3RydWN0IHdpbGwgYmUgdXNlZCBieSBhcHAgdG8gc3VwcGx5IHRoZSBQVCBhbmQgQlQgcHJvcGVydGllcw0KIC8vIGFsb25nIHdpdGggZHVja2luZyB2YWx1ZXMNCkBAIC01MywxMCArNTMsMTMgQEAKIGNsYXNzIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmcgew0KIHB1YmxpYzoNCiAgICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOw0KLSAgICB2b2lkIHZlU2V0QXVkaW9Qcm9jZXNzaW5nUGFyYW1zKHZlQXVkTWl4U2V0dGluZ3MgbWl4UGFyYW1zKTsNCi0gICAgTTRPU0FfSW50MzIgdmVQcm9jZXNzQXVkaW9NaXhORHVjayh2b2lkKiAsIHZvaWQgKiwgdm9pZCAqKTsNCisgICAgdm9pZCB2ZVNldEF1ZGlvUHJvY2Vzc2luZ1BhcmFtcyhjb25zdCB2ZUF1ZE1peFNldHRpbmdzJiBtaXhQYXJhbXMpOw0KIA0KLXByb3RlY3RlZDoNCisgICAgTTRPU0FfSW50MzIgdmVQcm9jZXNzQXVkaW9NaXhORHVjaygNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHByaW1hcnlUcmFja0J1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJhY2tncm91bmRUcmFja0J1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIG1peGVkT3V0cHV0QnVmZmVyKTsNCisNCiAgICAgflZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsNCiANCiBwcml2YXRlOg0KQEAgLTc5LDE1ICs4MiwxMSBAQAogICAgIE00T1NBX0Zsb2F0IG1QVFZvbExldmVsOw0KICAgICBNNE9TQV9GbG9hdCBtQlRWb2xMZXZlbDsNCiANCi0gICAgTTRBTV9CdWZmZXIgbVBUQnVmZmVyOw0KLSAgICBNNEFNX0J1ZmZlciBtQlRCdWZmZXI7DQotICAgIE00QU1fQnVmZmVyIG1PdXRNaXhCdWZmZXI7DQotICAgIE00T1NBX0ludDE2ICptVGVtcEJ1ZmZlcjsNCi0gICAgTTRPU0FfSW50MzIgbVRlbXBGcmFtZUNvdW50Ow0KKyAgICBNNEFNX0J1ZmZlcjE2IG1CVEJ1ZmZlcjsNCiANCiAgICAgTTRPU0FfSW50MzIgZ2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSk7DQogICAgIE00T1NBX0Jvb2wgIGlzVGhyZXNob2xkQnJlYWNoZWQoTTRPU0FfSW50MzIqIGF2ZXJhZ2VWYWx1ZSwNCi0gICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKTsNCisgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKTsNCiANCiAgICAgLy8gVGhpcyByZXR1cm5zIHRoZSBzaXplIG9mIGJ1ZmZlciB3aGljaCBuZWVkcyB0byBhbGxvY2F0ZWQNCiAgICAgLy8gYmVmb3JlIHJlc2FtcGxpbmcgaXMgY2FsbGVkDQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcAppbmRleCA0NmIxOGQ5Li45MTJhYWIwIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcAorKysgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcApAQCAtMjQsNiArMjQsOCBAQAogDQogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+DQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+DQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiANCiBuYW1lc3BhY2UgYW5kcm9pZCB7DQogDQpAQCAtNDksMTMgKzUxLDE2IEBACiAgICAgcmV0dXJuIE9LOw0KIH0NCiANCisNCitzdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpIHsNCisgICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvUGxheWVyKGF1ZGlvUGxheWVyKTsNCit9DQorDQorDQogc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoDQogICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7DQogICAgIExPR0koInNldERhdGFTb3VyY2UoJyVzJykiLCB1cmwpOw0KIA0KLSAgICBtVmVBdWRpb1NpbmsgPSBuZXcgVmVBdWRpb091dHB1dCgpOw0KLSAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsobVZlQXVkaW9TaW5rKTsNCi0NCiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsNCiB9DQogDQpAQCAtNjYsMTMgKzcxLDYgQEAKICAgICByZXR1cm4gKCFPSyk7DQogfQ0KIA0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgew0KLSAgICBMT0dWKCJzZXRWaWRlb0lTdXJmYWNlIik7DQotDQotICAgIG1QbGF5ZXItPnNldElTdXJmYWNlKHN1cmZhY2UpOw0KLSAgICByZXR1cm4gT0s7DQotfQ0KLQ0KIHN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsNCiAgICAgTE9HVigic2V0VmlkZW9TdXJmYWNlIik7DQogDQpAQCAtODAsNiArNzgsMTMgQEAKICAgICByZXR1cm4gT0s7DQogfQ0KIA0KK3N0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4gJnN1cmZhY2VUZXh0dXJlKSB7DQorICAgIExPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUiKTsNCisNCisgICAgbVBsYXllci0+c2V0U3VyZmFjZVRleHR1cmUoc3VyZmFjZVRleHR1cmUpOw0KKyAgICByZXR1cm4gT0s7DQorfQ0KKw0KIHN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwcmVwYXJlKCkgew0KICAgICBMT0dWKCJwcmVwYXJlIik7DQogICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7DQpAQCAtMTU0LDYgKzE1OSwxNiBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXRMb29waW5nKGxvb3ApOw0KIH0NCiANCitzdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIExPR1YoInNldFBhcmFtZXRlciIpOworICAgIHJldHVybiBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgTE9HVigiZ2V0UGFyYW1ldGVyIik7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKK30KKwogcGxheWVyX3R5cGUgVmlkZW9FZGl0b3JQbGF5ZXI6OnBsYXllclR5cGUoKSB7DQogICAgIExPR1YoInBsYXllclR5cGUiKTsNCiAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsNCkBAIC0xNjcsNiArMTgyLDE2IEBACiBzdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzdW1lKCkgew0KICAgICBMT0dWKCJyZXN1bWUiKTsNCiAgICAgcmV0dXJuIG1QbGF5ZXItPnJlc3VtZSgpOw0KK30KKwordm9pZCBWaWRlb0VkaXRvclBsYXllcjo6YWNxdWlyZUxvY2soKSB7CisgICAgTE9HVigiYWNxdWlyZUxvY2siKTsKKyAgICBtUGxheWVyLT5hY3F1aXJlTG9jaygpOworfQorDQordm9pZCBWaWRlb0VkaXRvclBsYXllcjo6cmVsZWFzZUxvY2soKSB7DQorICAgIExPR1YoInJlbGVhc2VMb2NrIik7DQorICAgIG1QbGF5ZXItPnJlbGVhc2VMb2NrKCk7DQogfQ0KIA0KIHN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjppbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7DQpAQCAtMjc3LDYgKzMwMiwxMSBAQAogICAgIHJldHVybiBtUGxheWVyLT5yZWFkRmlyc3RWaWRlb0ZyYW1lKCk7DQogfQ0KIA0KK3N0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcykgew0KKyAgICBtUGxheWVyLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMobGFzdFJlbmRlcmVkVGltZU1zKTsNCisgICAgcmV0dXJuIE5PX0VSUk9SOw0KK30NCisNCiAvKiBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1NpbmsgaW50ZXJmYWNlICovDQogI3VuZGVmIExPR19UQUcNCiAjZGVmaW5lIExPR19UQUcgIlZlQXVkaW9TaW5rIg0KQEAgLTI4OCw3ICszMTgsNyBAQAogICAgIDogbUNhbGxiYWNrKE5VTEwpLA0KICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSB7DQogICAgIG1UcmFjayA9IDA7DQotICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06Ok1VU0lDOw0KKyAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsNCiAgICAgbUxlZnRWb2x1bWUgPSAxLjA7DQogICAgIG1SaWdodFZvbHVtZSA9IDEuMDsNCiAgICAgbUxhdGVuY3kgPSAwOw0KQEAgLTMwNCw3ICszMzQsNyBAQAogdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKSB7DQogDQogICAgIG1Jc09uRW11bGF0b3IgPSBmYWxzZTsNCi0gICAgbU1pbkJ1ZmZlckNvdW50ID0xMjsNCisgICAgbU1pbkJ1ZmZlckNvdW50ID0gNDsNCiB9DQogDQogYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkgew0KQEAgLTM2OCw4ICszOTgsOCBAQAogDQogICAgIC8vIENoZWNrIGFyZ3VtZW50ICJidWZmZXJDb3VudCIgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQNCiAgICAgaWYgKGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7DQotICAgICAgICBMT0dEKCJidWZmZXJDb3VudCAoJWQpIGlzIHRvbyBzbWFsbCBhbmQgaW5jcmVhc2VkIHRvICVkIiwNCi0gICAgICAgICBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsNCisgICAgICAgIExPR1YoImJ1ZmZlckNvdW50ICglZCkgaXMgdG9vIHNtYWxsIGFuZCBpbmNyZWFzZWQgdG8gJWQiLA0KKyAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOw0KICAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7DQogDQogICAgIH0NCkBAIC0zOTcsNyArNDI3LDcgQEAKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLA0KICAgICAgICAgICAgICAgICBmb3JtYXQsDQogICAgICAgICAgICAgICAgIChjaGFubmVsQ291bnQgPT0gMikgPw0KLSAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyA6IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05PLA0KKyAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywNCiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwNCiAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLywNCiAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLA0KQEAgLTQwOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsDQogICAgICAgICAgICAgICAgIGZvcm1hdCwNCiAgICAgICAgICAgICAgICAgKGNoYW5uZWxDb3VudCA9PSAyKSA/DQotICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPIDogQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8sDQorICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9NT05PLA0KICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsNCiAgICAgfQ0KIA0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaAppbmRleCA0N2QxNzRkLi4zNDlmN2ZkIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oCkBAIC0yMywxNCArMjMsMTQgQEAKICNpbmNsdWRlICJNNHhWU1NfQVBJLmgiDQogI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIg0KICNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiDQotDQorI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCINCiANCiBuYW1lc3BhY2UgYW5kcm9pZCB7DQogDQogc3RydWN0IFByZXZpZXdQbGF5ZXI7DQogDQogY2xhc3MgVmlkZW9FZGl0b3JQbGF5ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXJJbnRlcmZhY2Ugew0KLQ0KKyAgICBwdWJsaWM6DQogICAgIGNsYXNzIFZlQXVkaW9PdXRwdXQ6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaw0KICAgICB7DQogICAgIHB1YmxpYzoNCkBAIC05Nyw4ICs5Nyw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsNCiANCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7DQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsNCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4gJnN1cmZhY2VUZXh0dXJlKTsNCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7DQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7DQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsNCkBAIC0xMTQsOCArMTE0LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsNCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOw0KICAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmQoKTsNCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsNCi0NCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUxvY2soKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUxvY2soKTsNCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoDQogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsNCiANCkBAIC0xNDIsOCArMTQ2LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsNCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOw0KICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGaXJzdFZpZGVvRnJhbWUoKTsNCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcyk7DQogDQotDQorICAgIHN0YXR1c190IHNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKTsNCiBwcml2YXRlOg0KICAgICBQcmV2aWV3UGxheWVyICAgICAgICptUGxheWVyOw0KICAgICBzcDxWZUF1ZGlvT3V0cHV0PiAgICBtVmVBdWRpb1Npbms7DQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKaW5kZXggNzhmMGNkYS4uYjEyZDhmZSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcAorKysgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCkBAIC0zOSwxNCArMzksMTYgQEAKICAgICAgIG1DdXJyZW50Q2xpcE51bWJlcigtMSksDQogICAgICAgbUNsaXBUb3RhbER1cmF0aW9uKDApLA0KICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QoVklERU9fRUZGRUNUX05PTkUpLA0KKyAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKE5VTEwpLA0KKyAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUoTlVMTCksDQogICAgICAgbVRhcmdldChOVUxMKSwNCiAgICAgICBtSm5pQ29va2llKE5VTEwpLA0KICAgICAgIG1KbmlDYWxsYmFjayhOVUxMKSwNCi0gICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyhOVUxMKSwNCi0gICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKE5VTEwpLA0KLSAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCgwKSwNCiAgICAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uKDApLA0KICAgICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uKDApLA0KKyAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCgwKSwNCisgICAgICBtT3ZlcmxheVN0YXRlKE9WRVJMQVlfQ0xFQVIpLA0KKyAgICAgIG1BY3RpdmVQbGF5ZXJJbmRleCgwKSwNCiAgICAgICBtT3V0cHV0VmlkZW9XaWR0aCgwKSwNCiAgICAgICBtT3V0cHV0VmlkZW9IZWlnaHQoMCksDQogICAgICAgYlN0b3BUaHJlYWRJblByb2dyZXNzKGZhbHNlKSwNCkBAIC03Nyw3ICs3OSw3IEBACiAgICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7DQogICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgew0KICAgICAgICAgICAgIExPR0UoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwNCi0gICAgICAgICAgICBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgZXJyKTsNCisgICAgICAgICAgICBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCkgZXJyKTsNCiAgICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yDQogICAgICAgICB9DQogDQpAQCAtOTcsMjkgKzk5LDI3IEBACiAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKQ0KICAgICAgICAgew0KICAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUNsaXBMaXN0W2ldLT5wRmlsZSk7DQorICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7DQogICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSBOVUxMOw0KICAgICAgICAgICAgIH0NCiANCi0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUNsaXBMaXN0W2ldKTsNCisgICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXSk7DQogICAgICAgICB9DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUNsaXBMaXN0KTsNCisgICAgICAgIGZyZWUobUNsaXBMaXN0KTsNCiAgICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7DQogICAgIH0NCiANCiAgICAgaWYobUVmZmVjdHNTZXR0aW5ncykgew0KICAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgew0KICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBOVUxMKSB7DQotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoDQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7DQorICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7DQogDQotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoDQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsNCisgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOw0KIA0KICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltRWZmZWN0c1NldHRpbmdzKTsNCisgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7DQogICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsNCiAgICAgfQ0KIA0KQEAgLTEyOCwxMSArMTI4LDE4IEBACiAgICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBNNE9TQV9OVUxMOw0KICAgICB9DQogDQorICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7DQorICAgICAgICBmcmVlKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsNCisgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gTlVMTDsNCisgICAgfQ0KKw0KICAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsNCiAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0Ow0KICAgICAgICAgbVRhcmdldCA9IE5VTEw7DQogICAgIH0NCiANCisgICAgbU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7DQorDQogICAgIExPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIHJldHVybnMiKTsNCiB9DQogDQpAQCAtMTYxLDcgKzE2OCw3IEBACiAgICAgfQ0KIA0KICAgICBpZihtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUJhY2tncm91bmRBdWRpb1NldHRpbmcpOw0KKyAgICAgICAgZnJlZShtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7DQogICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7DQogICAgIH0NCiANCkBAIC0xNzAsMjkgKzE3NywyNyBAQAogICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0tPnBGaWxlICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1DbGlwTGlzdFtpXS0+cEZpbGUpOw0KKyAgICAgICAgICAgICAgICBmcmVlKG1DbGlwTGlzdFtpXS0+cEZpbGUpOw0KICAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gTlVMTDsNCiAgICAgICAgICAgICB9DQogDQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1DbGlwTGlzdFtpXSk7DQorICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0pOw0KICAgICAgICAgfQ0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1DbGlwTGlzdCk7DQorICAgICAgICBmcmVlKG1DbGlwTGlzdCk7DQogICAgICAgICBtQ2xpcExpc3QgPSBOVUxMOw0KICAgICB9DQogDQogICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MpIHsNCiAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsNCiAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgew0KLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKA0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEpOw0KKyAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEpOw0KIA0KLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKA0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7DQorICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsNCiANCiAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTlVMTDsNCiAgICAgICAgICAgICB9DQogICAgICAgICB9DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbUVmZmVjdHNTZXR0aW5ncyk7DQorICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOw0KICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7DQogICAgIH0NCiANCkBAIC0yMDAsNyArMjA1LDcgQEAKICAgICAgICAgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7DQogICAgICAgICBMT0dWKCJsb2FkRWRpdFNldHRpbmdzOiAjIG9mIENsaXBzID0gJWQiLCBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQpOw0KIA0KLSAgICAgICAgbUNsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKilNNE9TQV9tYWxsb2MoDQorICAgICAgICBtQ2xpcExpc3QgPSAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyoqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCiAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopKnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLCBNNFZTLA0KICAgICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBwQ2xpcExpc3QiKTsNCiANCkBAIC0yMDgsMjggKzIxMywyOCBAQAogICAgICAgICAgICAgTE9HRSgibG9hZEVkaXRTZXR0aW5nczogTWFsbG9jIGVycm9yIik7DQogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KICAgICAgICAgfQ0KLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCltQ2xpcExpc3QsDQotICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKSpwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwgMCk7DQorICAgICAgICBtZW1zZXQoKHZvaWQgKiltQ2xpcExpc3QsMCwNCisgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopKnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsNCiANCiAgICAgICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspIHsNCiANCiAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBjdXJyZW50IGNsaXANCiAgICAgICAgICAgICBtQ2xpcExpc3RbaV0gPQ0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopTTRPU0FfbWFsbG9jKA0KKyAgICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKA0KICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpLE00VlMsKE00T1NBX0NoYXIqKSJjbGlwIHNldHRpbmdzIik7DQogDQogICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldID09IE5VTEwpIHsNCiANCi0gICAgICAgICAgICAgICAgTE9HRSgibG9hZEVkaXRTZXR0aW5nczogQWxsb2NhdGlvbiBlcnJvciBmb3IgbUNsaXBMaXN0WyVkXSIsIGkpOw0KKyAgICAgICAgICAgICAgICBMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBBbGxvY2F0aW9uIGVycm9yIGZvciBtQ2xpcExpc3RbJWRdIiwgKGludClpKTsNCiAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAvLyBDb3B5IHBsYWluIHN0cnVjdHVyZQ0KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbUNsaXBMaXN0W2ldLA0KLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sDQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbUNsaXBMaXN0W2ldLA0KKyAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLA0KICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOw0KIA0KICAgICAgICAgICAgIGlmKE5VTEwgIT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKSB7DQotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKA0KKyAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCiAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSwgTTRWUywNCiAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsNCiANCkBAIC0yMzksOCArMjQ0LDggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KICAgICAgICAgICAgICAgICB9DQogDQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbUNsaXBMaXN0W2ldLT5wRmlsZSwNCi0gICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsDQorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1DbGlwTGlzdFtpXS0+cEZpbGUsDQorICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwNCiAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUpOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBlbHNlIHsNCkBAIC0yNjEsNyArMjY2LDcgQEAKICAgICAgICAgTE9HVigibG9hZEVkaXRTZXR0aW5nczogbU51bWJlckVmZmVjdHMgPSAlZCIsIG1OdW1iZXJFZmZlY3RzKTsNCiANCiAgICAgICAgIGlmKG1OdW1iZXJFZmZlY3RzICE9IDApIHsNCi0gICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyopTTRPU0FfbWFsbG9jKA0KKyAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoDQogICAgICAgICAgICAgIG1OdW1iZXJFZmZlY3RzKnNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpLA0KICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImVmZmVjdHMgc2V0dGluZ3MiKTsNCiANCkBAIC0yNzAsOCArMjc1LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQogICAgICAgICAgICAgfQ0KIA0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpbUVmZmVjdHNTZXR0aW5ncywNCi0gICAgICAgICAgICAgbU51bWJlckVmZmVjdHMqc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksIDApOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKW1FZmZlY3RzU2V0dGluZ3MsMCwNCisgICAgICAgICAgICAgbU51bWJlckVmZmVjdHMqc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOw0KIA0KICAgICAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsNCiANCkBAIC0yNzksMjAgKzI4NCwyMCBAQAogICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7DQogICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE5VTEw7DQogDQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpJihtRWZmZWN0c1NldHRpbmdzW2ldKSwNCi0gICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXSksDQorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSYobUVmZmVjdHNTZXR0aW5nc1tpXSksDQorICAgICAgICAgICAgICAgICAodm9pZCAqKSYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwNCiAgICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsNCiANCiAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQ0KLSAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgew0KKyAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgew0KICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBGcmFtaW5nIFJHQiBidWZmZXINCiAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9DQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwNCisgICAgICAgICAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLA0KICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikibHZwcCBmcmFtaW5nIGJ1ZmZlciIpOw0KIA0KICAgICAgICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIGZvciBwRnJhbWluZ0J1ZiIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltRWZmZWN0c1NldHRpbmdzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCiAgICAgICAgICAgICAgICAgICAgIH0NCkBAIC0zMTEsMjAgKzMxNiwxOSBAQAogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOiB3cm9uZyBSR0IgdHlwZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltRWZmZWN0c1NldHRpbmdzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7DQogICAgICAgICAgICAgICAgICAgICB9DQogDQotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHJnYlNpemUsIE00VlMsDQorICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHJnYlNpemUsIE00VlMsDQogICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJmcmFtaW5nIGJ1ZmZlciBwYWNfZGF0YSIpOw0KIA0KICAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIHBGcmFtaW5nQnVmIHBhYyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltRWZmZWN0c1NldHRpbmdzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsNCiANCiAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOw0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCkBAIC0zNTgsOSArMzYyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOw0KIA0KICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcEZyYW1pbmcgZGF0YQ0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkNCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKQ0KICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwNCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEsDQorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgIHJnYlNpemUpOw0KIA0KICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnJnYlR5cGUgPQ0KQEAgLTM3Miw3ICszNzYsNyBAQAogDQogICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9PSBOVUxMKSB7DQogDQotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IChNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyopTTRPU0FfbWFsbG9jKA0KKyAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSAoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCiAgICAgICAgIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsDQogICAgICAgICAoTTRPU0FfQ2hhciopIkx2UFAsIGNvcHkgb2YgYmdtU2V0dGluZ3MiKTsNCiANCkBAIC0zODEsOCArMzg1LDggQEAKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCiAgICAgICAgIH0NCiANCi0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpbUJhY2tncm91bmRBdWRpb1NldHRpbmcsIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyopLCAwKTsNCi0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbUJhY2tncm91bmRBdWRpb1NldHRpbmcsIChNNE9TQV9NZW1BZGRyOCliZ21TZXR0aW5ncywgc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKSk7DQorICAgICAgICBtZW1zZXQoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgMCxzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKSk7DQorICAgICAgICBtZW1jcHkoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgKHZvaWQgKiliZ21TZXR0aW5ncywgc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKSk7DQogDQogICAgICAgICBpZiAoIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkgew0KIA0KQEAgLTQxMyw4ICs0MTcsNiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7DQogDQogICAgIG1TdXJmYWNlID0gc3VyZmFjZTsNCi0gICAgbUlTdXJmYWNlID0gc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKTsNCi0gICAgTE9HVigic2V0U3VyZmFjZTogbUlTdXJmYWNlID0gJXAiLCBtSVN1cmZhY2UuZ2V0KCkpOw0KICAgICByZXR1cm4gTTROT19FUlJPUjsNCiB9DQogDQpAQCAtNDI2LDcgKzQyOCw3IEBACiAgICAgTTRPU0FfVUludDMyIGkgPSAwLCBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDA7DQogICAgIExPR1YoInN0YXJ0UHJldmlldyIpOw0KIA0KLSAgICBpZihmcm9tTVMgPiB0b01zKSB7DQorICAgIGlmKGZyb21NUyA+IChNNE9TQV9VSW50MzIpdG9Ncykgew0KICAgICAgICAgTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPiB0b01zIik7DQogICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOw0KICAgICB9DQpAQCAtNDUyLDYgKzQ1NCwxMyBAQAogICAgICAgICBtVGFyZ2V0ID0gTlVMTDsNCiAgICAgfQ0KIA0KKyAgICAvLyBDcmVhdGUgQXVkaW8gcGxheWVyIHRvIGJlIHVzZWQgZm9yIGVudGlyZQ0KKyAgICAvLyBzdG9yeWJvYXJkIGR1cmF0aW9uDQorICAgIG1WRUF1ZGlvU2luayA9IG5ldyBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dCgpOw0KKyAgICBtVkVBdWRpb1BsYXllciA9IG5ldyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKG1WRUF1ZGlvU2luayk7DQorICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsNCisgICAgbVZFQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsNCisNCiAgICAgTE9HVigic3RhcnRQcmV2aWV3OiBsb29wID0gJWQiLCBsb29wKTsNCiAgICAgbVByZXZpZXdMb29waW5nID0gbG9vcDsNCiANCkBAIC01NDIsNiArNTUxLDcgQEAKIA0KICAgICAvLyBTdGFydCBwbGF5aW5nIHdpdGggcGxheWVyIGluc3RhbmNlIDANCiAgICAgbUN1cnJlbnRQbGF5ZXIgPSAwOw0KKyAgICBtQWN0aXZlUGxheWVySW5kZXggPSAwOw0KIA0KICAgICBpZih0b01zID09IC0xKSB7DQogICAgICAgICBMT0dWKCJzdGFydFByZXZpZXc6IFByZXZpZXcgdGlsbCBlbmQgb2Ygc3Rvcnlib2FyZCIpOw0KQEAgLTU1Miw3ICs1NjIsNyBAQAogICAgIH0NCiAgICAgZWxzZSB7DQogICAgICAgICBMT0dWKCJzdGFydFByZXZpZXc6IHRvTXM9JWQiLCB0b01zKTsNCi0gICAgICAgIGlmKHRvTXMgPiBtQ2xpcFRvdGFsRHVyYXRpb24pIHsNCisgICAgICAgIGlmKChNNE9TQV9VSW50MzIpdG9NcyA+IG1DbGlwVG90YWxEdXJhdGlvbikgew0KICAgICAgICAgICAgIExPR0UoInN0YXJ0UHJldmlldzogdG9NcyA+IG1DbGlwVG90YWxEdXJhdGlvbiIpOw0KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7DQogICAgICAgICB9DQpAQCAtNTYwLDcgKzU3MCw3IEBACiAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gMDsNCiANCiAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7DQotICAgICAgICAgICAgaWYodG9NcyA8PSAoaUluY3JlbWVudGVkRHVyYXRpb24gKw0KKyAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpdG9NcyA8PSAoaUluY3JlbWVudGVkRHVyYXRpb24gKw0KICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkpIHsNCiAgICAgICAgICAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQ0KICAgICAgICAgICAgICAgICBtTGFzdFByZXZpZXdDbGlwRW5kVGltZSA9IG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOw0KQEAgLTU4NSw3ICs1OTUsNyBAQAogICAgIC8vIE9wZW4gdGhlIHByZXZpZXcgcHJvY2VzcyB0aHJlYWQNCiAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY09wZW4oJm1UaHJlYWRDb250ZXh0LCAoTTRPU0FfVGhyZWFkRG9JdCl0aHJlYWRQcm9jKTsNCiAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7DQotICAgICAgICBMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOk00T1NBX3RocmVhZFN5bmNPcGVuIGVycm9yICVkIiwgZXJyKTsNCisgICAgICAgIExPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6TTRPU0FfdGhyZWFkU3luY09wZW4gZXJyb3IgJWQiLCAoaW50KSBlcnIpOw0KICAgICAgICAgcmV0dXJuIGVycjsNCiAgICAgfQ0KIA0KQEAgLTU5NCw3ICs2MDQsNyBAQAogICAgICAoTTRPU0FfRGF0YU9wdGlvbilQUkVWSUVXX1RIUkVBRF9TVEFDS19TSVpFKTsNCiANCiAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7DQotICAgICAgICBMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU2V0T3B0aW9uIGVycm9yICVkIiwgZXJyKTsNCisgICAgICAgIExPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IHRocmVhZFN5bmNTZXRPcHRpb24gZXJyb3IgJWQiLCAoaW50KSBlcnIpOw0KICAgICAgICAgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsNCiAgICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsNCiAgICAgICAgIHJldHVybiBlcnI7DQpAQCAtNjAzLDcgKzYxMyw3IEBACiAgICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQNCiAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdGFydChtVGhyZWFkQ29udGV4dCwgKE00T1NBX1ZvaWQqKXRoaXMpOw0KICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7DQotICAgICAgICBMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU3RhcnQgZXJyb3IgJWQiLCBlcnIpOw0KKyAgICAgICAgTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogdGhyZWFkU3luY1N0YXJ0IGVycm9yICVkIiwgKGludCkgZXJyKTsNCiAgICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7DQogICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7DQogICAgICAgICByZXR1cm4gZXJyOw0KQEAgLTYxNCwxNCArNjI0LDIwIEBACiAgICAgcmV0dXJuIE00Tk9fRVJST1I7DQogfQ0KIA0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzdG9wUHJldmlldygpIHsNCitNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RvcFByZXZpZXcoKSB7DQogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KKyAgICB1aW50MzJfdCBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyA9IDA7DQogICAgIExPR1YoInN0b3BQcmV2aWV3Iik7DQogDQogICAgIC8vIFN0b3AgdGhlIHRocmVhZA0KICAgICBpZihtVGhyZWFkQ29udGV4dCAhPSBOVUxMKSB7DQogICAgICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MgPSB0cnVlOw0KLSAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlUG9zdChtU2VtVGhyZWFkV2FpdCk7DQorICAgICAgICB7DQorICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrU2VtKTsNCisgICAgICAgICAgICBpZiAobVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVQb3N0KG1TZW1UaHJlYWRXYWl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQogDQogICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RvcChtVGhyZWFkQ29udGV4dCk7DQogICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgew0KQEAgLTYzMSw3ICs2NDcsNyBAQAogDQogICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOw0KICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsNCi0gICAgICAgICAgICBMT0dFKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgZXJyKTsNCisgICAgICAgICAgICBMT0dFKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCllcnIpOw0KICAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3INCiAgICAgICAgIH0NCiANCkBAIC02MzksOSArNjU1LDEzIEBACiAgICAgfQ0KIA0KICAgICAvLyBDbG9zZSB0aGUgc2VtYXBob3JlIGZpcnN0DQotICAgIGlmKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsNCi0gICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKG1TZW1UaHJlYWRXYWl0KTsNCi0gICAgICAgIExPR1YoInN0b3BQcmV2aWV3OiBjbG9zZSBzZW1hcGhvcmUgcmV0dXJucyAweCV4IiwgZXJyKTsNCisgICAgew0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrU2VtKTsNCisgICAgICAgIGlmKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZShtU2VtVGhyZWFkV2FpdCk7DQorICAgICAgICAgICAgTE9HVigic3RvcFByZXZpZXc6IGNsb3NlIHNlbWFwaG9yZSByZXR1cm5zIDB4JXgiLCBlcnIpOw0KKyAgICAgICAgICAgIG1TZW1UaHJlYWRXYWl0ID0gTlVMTDsNCisgICAgICAgIH0NCiAgICAgfQ0KIA0KICAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8TkJQTEFZRVJfSU5TVEFOQ0VTOyBwbGF5ZXJJbnN0KyspIHsNCkBAIC02NTAsMTYgKzY3MCwzMSBAQAogICAgICAgICAgICAgICAgIExPR1YoInN0b3AgdGhlIHBsYXllciBmaXJzdCIpOw0KICAgICAgICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnN0b3AoKTsNCiAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgTE9HVigic3RvcFByZXZpZXc6IGNsZWFyaW5nIG1WZVBsYXllciIpOw0KLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS5jbGVhcigpOw0KKyAgICAgICAgICAgIGlmIChwbGF5ZXJJbnN0ID09IG1BY3RpdmVQbGF5ZXJJbmRleCkgew0KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGxhc3QgcmVuZGVyZWQgZnJhbWUgdGltZSBzdGFtcA0KKyAgICAgICAgICAgICAgICBtVmVQbGF5ZXJbbUFjdGl2ZVBsYXllckluZGV4XS0+Z2V0TGFzdFJlbmRlcmVkVGltZU1zKCZsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyk7DQorICAgICAgICAgICAgfQ0KKworICAgICAgICAgICAgLy9UaGlzIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAorICAgICAgICAgICAgLy9zdG9wUHJldmlldygpIGluIFByZXZpZXdDb250cm9sbGVyDQorICAgICAgICAgICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI+IHRlbXAgPSBtVmVQbGF5ZXJbcGxheWVySW5zdF07CisgICAgICAgICAgICB0ZW1wLT5hY3F1aXJlTG9jaygpOworICAgICAgICAgICAgTE9HVigic3RvcFByZXZpZXc6IGNsZWFyaW5nIG1WZVBsYXllciIpOworICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7CiAgICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBOVUxMOw0KKyAgICAgICAgICAgIHRlbXAtPnJlbGVhc2VMb2NrKCk7CiAgICAgICAgIH0NCiAgICAgfQ0KKyAgICBMT0dWKCJzdG9wUHJldmlldzogY2xlYXIgYXVkaW9TaW5rIGFuZCBhdWRpb1BsYXllciIpOw0KKyAgICBtVkVBdWRpb1NpbmsuY2xlYXIoKTsNCisgICAgaWYgKG1WRUF1ZGlvUGxheWVyKSB7DQorICAgICAgICBkZWxldGUgbVZFQXVkaW9QbGF5ZXI7DQorICAgICAgICBtVkVBdWRpb1BsYXllciA9IE5VTEw7DQorICAgIH0NCiANCiAgICAgLy8gSWYgaW1hZ2UgZmlsZSBwbGF5aW5nLCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBwb2ludGVyDQogICAgIGlmKG1GcmFtZVN0ci5wQnVmZmVyICE9IE00T1NBX05VTEwpIHsNCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltRnJhbWVTdHIucEJ1ZmZlcik7DQorICAgICAgICBmcmVlKG1GcmFtZVN0ci5wQnVmZmVyKTsNCiAgICAgICAgIG1GcmFtZVN0ci5wQnVmZmVyID0gTTRPU0FfTlVMTDsNCiAgICAgfQ0KIA0KQEAgLTY3Nyw3ICs3MTIsOCBAQAogICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gMDsNCiAgICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gMDsNCiANCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQorICAgIExPR1YoInN0b3BQcmV2aWV3KCkgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgJWxkIiwgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMpOw0KKyAgICByZXR1cm4gbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXM7DQogfQ0KIA0KIE00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpjbGVhclN1cmZhY2UoDQpAQCAtNjkxLDkgKzcyNyw2IEBACiANCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsNCiANCi0gICAgLy8gR2V0IHRoZSBJc3VyZmFjZSB0byBiZSBwYXNzZWQgdG8gcmVuZGVyZXINCi0gICAgbUlTdXJmYWNlID0gc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKTsNCi0NCiAgICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlDQogICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgew0KICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7DQpAQCAtNzMyLDEyICs3NjUsMTIgQEAKICAgICAgKE00T1NBX1VJbnQzMilvdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilvdXRCdWZmZXIpOw0KIA0KICAgICAvKiBGaWxsIHRoZSBzdXJmYWNlIHdpdGggYmxhY2sgZnJhbWUgKi8NCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwbGFuZU91dFswXS5wYWNfZGF0YSxwbGFuZU91dFswXS51X3dpZHRoICoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMF0udV9oZWlnaHQgKiAxLjUsMHgwMCk7DQotICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcGxhbmVPdXRbMV0ucGFjX2RhdGEscGxhbmVPdXRbMV0udV93aWR0aCAqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzFdLnVfaGVpZ2h0LDEyOCk7DQotICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcGxhbmVPdXRbMl0ucGFjX2RhdGEscGxhbmVPdXRbMl0udV93aWR0aCAqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsyXS51X2hlaWdodCwxMjgpOw0KKyAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFswXS5wYWNfZGF0YSwweDAwLHBsYW5lT3V0WzBdLnVfd2lkdGggKg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFswXS51X2hlaWdodCAqIDEuNSk7DQorICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzFdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsxXS51X3dpZHRoICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMV0udV9oZWlnaHQpOw0KKyAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFsyXS5wYWNfZGF0YSwxMjgscGxhbmVPdXRbMl0udV93aWR0aCAqDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsyXS51X2hlaWdodCk7DQogDQogICAgIG1UYXJnZXQtPnJlbmRlcllWMTIoKTsNCiAgICAgcmV0dXJuIGVycjsNCkBAIC03NTQsOCArNzg3LDYgQEAKICAgICBNNFZJRklfVUludDggKnBpeGVsQXJyYXkgPSBOVUxMOw0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOw0KIA0KLSAgICAvLyBHZXQgdGhlIElzdXJmYWNlIHRvIGJlIHBhc3NlZCB0byByZW5kZXJlcg0KLSAgICBtSVN1cmZhY2UgPSBzdXJmYWNlLT5nZXRJU3VyZmFjZSgpOw0KICAgICBpZiAocEN1cnJFZGl0SW5mbyAhPSBOVUxMKSB7DQogICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IC0xOw0KICAgICB9DQpAQCAtODEzLDEzICs4NDQsMTMgQEAKIA0KICAgICAgICAgLy9Qcm92aWRlIHRoZSBvdmVybGF5IFVwZGF0ZSBpbmRpY2F0aW9uIHdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBlZmZlY3QNCiAgICAgICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsNCi0gICAgICAgICAgICBpbnQgaW5kZXg7DQorICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4Ow0KICAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gflZJREVPX0VGRkVDVF9GUkFNSU5HOyAvL25ldmVyIGFwcGx5IGZyYW1pbmcgaGVyZS4NCiANCiAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkNCiAgICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgew0KICAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2luZGV4XS5WaWRlb0VmZmVjdFR5cGUgPT0NCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsNCisgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsNCiANCiAgICAgICAgICAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSA8PSBwRnJhbWVJbmZvLT50aW1lTXMpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSsNCkBAIC04NDQsMTAgKzg3NSwxMCBAQAogICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7DQogDQogICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsNCi0gICAgICAgICAgICAgICAgTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBhcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOw0KKyAgICAgICAgICAgICAgICBMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGFwcGx5VmlkZW9FZmZlY3QgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsNCiAgICAgICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7DQogICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOw0KLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcGl4ZWxBcnJheSk7DQorICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7DQogICAgICAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOw0KICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOw0KICAgICAgICAgICAgfQ0KQEAgLTg2MCwxMCArODkxLDEwIEBACiAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOw0KIA0KICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQotICAgICAgICAgICAgICAgIExPR0UoInJlbmRlclByZXZpZXdGcmFtZTpkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgZXJyKTsNCisgICAgICAgICAgICAgICAgTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOmRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7DQogICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0Ow0KICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBpeGVsQXJyYXkpOw0KKyAgICAgICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOw0KICAgICAgICAgICAgICAgICBwaXhlbEFycmF5ID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsNCiAgICAgICAgICAgICB9DQpAQCAtODc2LDEwICs5MDcsMTAgQEAKICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsNCiANCiAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQotICAgICAgICAgICAgTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgZXJyKTsNCisgICAgICAgICAgICBMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7DQogICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7DQogICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7DQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBpeGVsQXJyYXkpOw0KKyAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7DQogICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7DQogICAgICAgICAgICAgcmV0dXJuIGVycjsNCiAgICAgICAgIH0NCkBAIC05MTAsMTAgKzk0MSw2IEBACiAgICAgTE9HVigicHJlcGFyZVBsYXllcjogc2V0RGF0YVNvdXJjZSBpbnN0YW5jZSAlcyIsDQogICAgICAoY29uc3QgY2hhciAqKXBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZSk7DQogDQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRWaWRlb0lTdXJmYWNlKA0KLSAgICAgcENvbnRyb2xsZXItPm1JU3VyZmFjZSk7DQotICAgIExPR1YoInByZXBhcmVQbGF5ZXI6IHNldFZpZGVvSVN1cmZhY2UiKTsNCi0NCiAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFZpZGVvU3VyZmFjZSgNCiAgICAgIHBDb250cm9sbGVyLT5tU3VyZmFjZSk7DQogICAgIExPR1YoInByZXBhcmVQbGF5ZXI6IHNldFZpZGVvU3VyZmFjZSIpOw0KQEAgLTkyMyw3ICs5NTAsNyBAQAogICAgICBwQ29udHJvbGxlci0+bU91dHB1dFZpZGVvU2l6ZSk7DQogICAgIExPR1YoInByZXBhcmVQbGF5ZXI6IHNldE1lZGlhUmVuZGVyaW5nTW9kZSIpOw0KIA0KLSAgICBpZihpbmRleCA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7DQorICAgIGlmKChNNE9TQV9VSW50MzIpaW5kZXggPT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgew0KICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFBsYXliYWNrQmVnaW5UaW1lKA0KICAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsNCiAgICAgfQ0KQEAgLTk1Niw2ICs5ODMsNyBAQAogICAgICAgICBMT0dWKCJwcmVwYXJlUGxheWVyOiBzZWVrVG8oJWQpIiwNCiAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOw0KICAgICB9DQorICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9QbGF5ZXIocENvbnRyb2xsZXItPm1WRUF1ZGlvUGxheWVyKTsNCiANCiAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnJlYWRGaXJzdFZpZGVvRnJhbWUoKTsNCiAgICAgTE9HVigicHJlcGFyZVBsYXllcjogcmVhZEZpcnN0VmlkZW9GcmFtZSBvZiBjbGlwIik7DQpAQCAtOTc2LDcgKzEwMDQsNyBAQAogICAgICAgICBMT0dWKCJ0aHJlYWRQcm9jOiBwbGF5aW5nIGZpbGUgaW5kZXggJWQgdG90YWwgY2xpcHMgJWQiLA0KICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIsIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpOw0KIA0KLSAgICAgICAgaWYocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA+PQ0KKyAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID49DQogICAgICAgICAgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldykgew0KIA0KICAgICAgICAgICAgIExPR1YoIkFsbCBjbGlwcyBwcmV2aWV3ZWQiKTsNCkBAIC0xMDIwLDcgKzEwNDgsNyBAQAogICAgICAgICB9DQogDQogICAgICAgICBpbmRleD1wQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOw0KLSAgICAgICAgaWYocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7DQorICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgew0KICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9DQogICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXA7DQogDQpAQCAtMTA0NCw3ICsxMDcyLDcgQEAKICAgICAgICAgTE9HVigidGhyZWFkUHJvYzogc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSIpOw0KIA0KICAgICAgICAgLy8gU2V0IHRoZSBuZXh0IGNsaXAgZHVyYXRpb24gZm9yIEF1ZGlvIG1peCBoZXJlDQotICAgICAgICBpZihwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyICE9IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsNCisgICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7DQogDQogICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgNCiAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24sDQpAQCAtMTA1Nyw2ICsxMDg1LDggQEAKICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsDQogICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOw0KICAgICAgICAgfQ0KKyAgICAgICAgLy8gQ2FwdHVyZSB0aGUgYWN0aXZlIHBsYXllciBiZWluZyB1c2VkDQorICAgICAgICBwQ29udHJvbGxlci0+bUFjdGl2ZVBsYXllckluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyOw0KIA0KICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zdGFydCgpOw0KICAgICAgICAgTE9HVigidGhyZWFkUHJvYzogc3RhcnRlZCIpOw0KQEAgLTEwNzAsMTYgKzExMDAsMjAgQEAKICAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7DQogICAgICAgICBwcmVwYXJlUGxheWVyKCh2b2lkKilwQ29udHJvbGxlciwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyLA0KICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIrMSk7DQotICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwNCi0gICAgICAgICAgICBNNE9TQV9XQUlUX0ZPUkVWRVIpOw0KKyAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlV2FpdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQsDQorICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7DQorICAgICAgICB9DQogICAgIH0gZWxzZSB7DQogICAgICAgICBpZiAoIXBDb250cm9sbGVyLT5iU3RvcFRocmVhZEluUHJvZ3Jlc3MpIHsNCiAgICAgICAgICAgICBMT0dWKCJ0aHJlYWRQcm9jOiBzdGF0ZSBidXN5Li4ud2FpdCBmb3Igc2VtIik7DQotICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlV2FpdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQsDQotICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7DQorICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVdhaXQocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0LA0KKyAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSKTsNCisgICAgICAgICAgICAgfQ0KICAgICAgICAgfQ0KICAgICAgICAgTE9HVigidGhyZWFkUHJvYzogc2VtIHdhaXQgcmV0dXJuZWQgZXJyID0gMHgleCIsIGVycik7DQotICAgIH0NCisgICAgfQogDQogICAgIC8vQWx3YXlzIHJldHVybiBNNE5PX0VSUk9SIHRvIGVuc3VyZSB0aGUgdGhyZWFkIGtlZXBzIHJ1bm5pbmcNCiAgICAgcmV0dXJuIE00Tk9fRVJST1I7DQpAQCAtMTEwNiw3ICsxMTQwLDcgQEAKICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7DQogDQogICAgICAgICAgICAgLy9zZW5kIHByb2dyZXNzIGNhbGxiYWNrIHdpdGggbGFzdCBmcmFtZSB0aW1lc3RhbXANCi0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09DQorICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09DQogICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsNCiAgICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uID0NCiAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQ0KQEAgLTExMjMsNyArMTE1NywyOSBAQAogICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwgTVNHX1RZUEVfUFJPR1JFU1NfSU5ESUNBVElPTiwNCiAgICAgICAgICAgICAgICAgICZwbGF5ZWREdXJhdGlvbik7DQogDQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQpOw0KKyAgICAgICAgICAgIGlmICgocENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9VUERBVEUpICYmDQorICAgICAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgIT0NCisgICAgICAgICAgICAgICAgKHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXctMSkpKSB7DQorICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9DQorICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwNCisgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiQ3VycmVudCBFZGl0IGluZm8iKTsNCisgICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7DQorICAgICAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsNCisgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9DTEVBUjsNCisgICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhwQ29udHJvbGxlci0+bUxvY2tTZW0pOw0KKyAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQogICAgICAgICBjYXNlIE1FRElBX0VSUk9SOg0KQEAgLTExNjQsNyArMTIyMCw3IEBACiAgICAgICAgICAgICBMT0dWKCJWSURFTyBQTEFZQkFDSyBBTE1PU1Qgb3ZlciwgcHJlcGFyZSBuZXh0IHBsYXllciIpOw0KICAgICAgICAgICAgIC8vIFNlbGVjdCBuZXh0IHBsYXllciBhbmQgcHJlcGFyZSBpdA0KICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2xpcCBhZnRlciB0aGlzIG9uZQ0KLSAgICAgICAgICAgIGlmICgocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcisxKSA8DQorICAgICAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpKHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIrMSkgPA0KICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7DQogICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCA9IE00T1NBX1RSVUU7DQogICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcisrOw0KQEAgLTExNzIsNyArMTIyOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGZpcnN0IGNsaXAgdG8gYmUgcGxheWVkDQotICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7DQorICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICBjYXNlIDB4QkJCQkJCQkI6DQpAQCAtMTE4MCw3ICsxMjQxLDcgQEAKICAgICAgICAgICAgIExPR1YoIlZJREVPIFBMQVlCQUNLLCBVcGRhdGUgT3ZlcmxheSIpOw0KICAgICAgICAgICAgIGludCBvdmVybGF5SW5kZXggPSBleHQyOw0KICAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9DQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfbWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwNCisgICAgICAgICAgICAgICAgICAgIChWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8pLA0KICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOw0KICAgICAgICAgICAgIC8vZXh0MSA9IDE7IHN0YXJ0IHRoZSBvdmVybGF5IGRpc3BsYXkNCiAgICAgICAgICAgICAvLyAgICAgPSAyOyBDbGVhciB0aGUgb3ZlcmxheS4NCkBAIC0xMTg5LDE0ICsxMjUwLDE2IEBACiAgICAgICAgICAgICBMT0dWKCJwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOw0KICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsNCiAgICAgICAgICAgICAgICAgaWYgKGV4dDEgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX1VQREFURTsNCiAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1RZUEVfT1ZFUkxBWV9VUERBVEUsIHBFZGl0SW5mbyk7DQogICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7DQogICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLA0KICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBFZGl0SW5mbyk7DQorICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOw0KICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KICAgICAgICAgZGVmYXVsdDoNCkBAIC0xNDM5LDcgKzE1MDIsNyBAQAogDQogICAgIGVyciA9IGFwcGx5UmVuZGVyaW5nTW9kZShwbGFuZUluLCBwbGFuZU91dCwgbVJlbmRlcmluZ01vZGUpOw0KICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgew0KLSAgICAgICAgTE9HRSgiZG9JbWFnZVJlbmRlcmluZ01vZGU6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsIGVycik7DQorICAgICAgICBMT0dFKCJkb0ltYWdlUmVuZGVyaW5nTW9kZTogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0weCV4IiwgKHVuc2lnbmVkIGludCllcnIpOw0KICAgICB9DQogICAgIHJldHVybiBlcnI7DQogfQ0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgKaW5kZXggMmEyYTY2NS4uNGM2MmFjNSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgKKysrIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKIA0KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4NCiAjaW5jbHVkZSAiVmlkZW9FZGl0b3JQbGF5ZXIuaCINCisjaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIg0KICNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCINCiAjaW5jbHVkZSAiTTRPU0FfVGhyZWFkLmgiDQogI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiDQpAQCAtNTEsNiArNTIsMTAgQEAKICAgICBWZVBsYXllckF1dG9TdG9wDQogfSBWZVBsYXllclN0YXRlOw0KIA0KK3R5cGVkZWYgZW51bSB7DQorICAgIE9WRVJMQVlfVVBEQVRFID0gMCwNCisgICAgT1ZFUkxBWV9DTEVBUg0KK30gT3ZlcmxheVN0YXRlOw0KIA0KIC8vIENhbGxiYWNrIG1lY2hhbmlzbSBmcm9tIFByZXZpZXdDb250cm9sbGVyIHRvIEpuaSAgKi8NCiB0eXBlZGVmIHZvaWQgKCpqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0KSh2b2lkKiBjb29raWUsIE00T1NBX1VJbnQzMiBtc2dUeXBlLCB2b2lkICphcmdjKTsNCkBAIC03MCw3ICs3NSw3IEBACiAgICAgTTRPU0FfRVJSIHN0YXJ0UHJldmlldyhNNE9TQV9VSW50MzIgZnJvbU1TLCBNNE9TQV9JbnQzMiB0b01zLA0KICAgICAgICAgTTRPU0FfVUludDE2IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50LCBNNE9TQV9Cb29sIGxvb3ApIDsNCiANCi0gICAgTTRPU0FfRVJSIHN0b3BQcmV2aWV3KCk7DQorICAgIE00T1NBX1VJbnQzMiBzdG9wUHJldmlldygpOw0KIA0KICAgICBNNE9TQV9FUlIgcmVuZGVyUHJldmlld0ZyYW1lKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLA0KICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvLA0KQEAgLTg4LDcgKzkzLDYgQEAKIHByaXZhdGU6DQogICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyPiBtVmVQbGF5ZXJbTkJQTEFZRVJfSU5TVEFOQ0VTXTsNCiAgICAgaW50IG1DdXJyZW50UGxheWVyOyAvL0luc3RhbmNlIG9mIHRoZSBwbGF5ZXIgY3VycmVudGx5IGJlaW5nIHVzZWQNCi0gICAgc3A8SVN1cmZhY2U+IG1JU3VyZmFjZTsNCiAgICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOw0KICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOw0KICAgICBNNE9TQV9Db250ZXh0IG1UaHJlYWRDb250ZXh0Ow0KQEAgLTExNyw2ICsxMjEsOCBAQAogICAgIE00T1NBX1VJbnQzMiBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsNCiAgICAgTTRPU0FfVUludDMyIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lOw0KICAgICBNNE9TQV9VSW50MzIgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOw0KKyAgICBPdmVybGF5U3RhdGUgbU92ZXJsYXlTdGF0ZTsNCisgICAgaW50IG1BY3RpdmVQbGF5ZXJJbmRleDsNCiANCiAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOw0KICAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9XaWR0aDsNCkBAIC0xMjUsOCArMTMxLDEyIEBACiAgICAgTTRPU0FfQ29udGV4dCBtU2VtVGhyZWFkV2FpdDsNCiAgICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsNCiANCisgICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ+IG1WRUF1ZGlvU2luazsNCisgICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbVZFQXVkaW9QbGF5ZXI7DQorDQogICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsNCiAgICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOw0KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrU2VtOw0KICAgICBzdGF0aWMgTTRPU0FfRVJSIHByZXBhcmVQbGF5ZXIodm9pZCogcGFyYW0sIGludCBwbGF5ZXJJbnN0YW5jZSwgaW50IGluZGV4KTsNCiAgICAgc3RhdGljIE00T1NBX0VSUiB0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKTsNCiAgICAgc3RhdGljIHZvaWQgbm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKTsNCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCmluZGV4IDA5MWJkZmIuLmMzMDRjYTIgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCisrKyBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCINCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4NCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPg0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPg0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4NCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIg0KIA0KIA0KQEAgLTQ2LDkgKzQ4LDggQEAKICAgICBtU2Vla1RpbWVVcyA9IC0xOw0KICAgICBtTGVmdG92ZXIgPSAwOw0KICAgICBtTGFzdFJlYWRTaXplID0gMDsNCi0jaWZuZGVmIEZST1lPDQorICAgIG1SZVNhbXBsZWRCdWZmZXIgPSBOVUxMOw0KICAgICBtU2Vla01vZGUgPSAgUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsNCi0jZW5kaWYNCiANCiAgICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsNCiANCkBAIC03Miw3ICs3Myw3IEBACiANCiAgICAgLy8gQWxsb2NhdGUgYSAgMSBzZWMgYnVmZmVyICh0ZXN0IG9ubHksIHRvIGJlIHJlZmluZWQpDQogICAgIG1JbnRlcmZyYW1lQnVmZmVyUG9zaXRpb24gPSAwOw0KLSAgICBwSW50ZXJmcmFtZUJ1ZmZlciA9IG5ldyB1aW50OF90W0RFRkFVTFRfU0FNUExJTkdfRlJFUSAqIDIgKiAyXTsgLy9zdGVyZW89MiAqIGJ5dGVzcGVyc2FtcGxlPTINCisgICAgbUludGVyZnJhbWVCdWZmZXIgPSBuZXcgdWludDhfdFtERUZBVUxUX1NBTVBMSU5HX0ZSRVEgKiAyICogMl07IC8vc3RlcmVvPTIgKiBieXRlc3BlcnNhbXBsZT0yDQogDQogDQogfQ0KQEAgLTg2LDkgKzg3LDkgQEAKICAgICAgICAgbU91dHB1dEZvcm1hdCA9IE5VTEw7DQogICAgIH0NCiANCi0gICAgaWYgKHBJbnRlcmZyYW1lQnVmZmVyICE9IE5VTEwpew0KLSAgICAgICAgZGVsZXRlIHBJbnRlcmZyYW1lQnVmZmVyOw0KLSAgICAgICAgcEludGVyZnJhbWVCdWZmZXIgPSBOVUxMOw0KKyAgICBpZiAobUludGVyZnJhbWVCdWZmZXIgIT0gTlVMTCl7DQorICAgICAgICBkZWxldGUgbUludGVyZnJhbWVCdWZmZXI7DQorICAgICAgICBtSW50ZXJmcmFtZUJ1ZmZlciA9IE5VTEw7DQogICAgIH0NCiB9DQogDQpAQCAtMTIyLDcgKzEyMyw2IEBACiAgICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbENudCk7DQogICAgIENIRUNLKHN1Y2Nlc3MpOw0KIA0KLSAgICBtSW5wdXRGcmFtZVNpemUgPSBtQ2hhbm5lbENudCAqIDI7IC8vMiBpcyB0aGUgYnl0ZSBkZXB0aA0KICAgICBpZihtU2FtcGxlUmF0ZSAhPSBtT3V0cHV0U2FtcGxlUmF0ZSkgew0KICAgICAgICAgTE9HVigiUmVzYW1wbGluZyByZXF1aXJlZCAoJWQgIT0gJWQpIiwgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlKTsNCiAgICAgICAgIG1Jc1Jlc2FtcGxpbmdSZXF1aXJlZCA9IHRydWU7DQpAQCAtMTQ1LDkgKzE0NSw3IEBACiAgICAgICAgIH0NCiAgICAgfQ0KICAgICBtU2Vla1RpbWVVcyA9IC0xOw0KLSNpZm5kZWYgRlJPWU8NCiAgICAgbVNlZWtNb2RlID0gIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7DQotI2VuZGlmDQogICAgIG1TdGFydGVkID0gdHJ1ZTsNCiAgICAgbVNvdXJjZS0+c3RhcnQoKTsNCiANCkBAIC0xNjgsNiArMTY2LDEwIEBACiAgICAgbUFjY3VPdXRCdWZmZXJTaXplICA9IDA7DQogICAgIG1MZWZ0b3ZlciA9IDA7DQogICAgIG1MYXN0UmVhZFNpemUgPSAwOw0KKyAgICBpZiAobVJlU2FtcGxlZEJ1ZmZlciAhPSBOVUxMKSB7DQorICAgICAgICBmcmVlKG1SZVNhbXBsZWRCdWZmZXIpOw0KKyAgICAgICAgbVJlU2FtcGxlZEJ1ZmZlciA9IE5VTEw7DQorICAgIH0NCiANCiAgICAgcmV0dXJuIE9LOw0KIH0NCkBAIC0xOTYsMjAgKzE5OCwxMiBAQAogDQogICAgICAgICAvLyBTdG9yZSB0aGUgc2VlayBwYXJhbWV0ZXJzDQogICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7DQotI2lmbmRlZiBGUk9ZTw0KICAgICAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOw0KICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsNCi0jZWxzZQ0KLSAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgew0KLSNlbmRpZg0KICAgICAgICAgICAgIExPR1YoInJlYWQgU2VlayAlbGxkIiwgc2Vla1RpbWVVcyk7DQogICAgICAgICAgICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOw0KICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsNCi0jaWZuZGVmIEZST1lPDQogICAgICAgICAgICAgbVNlZWtNb2RlID0gbW9kZTsNCi0jZWxzZQ0KLSAgICAgICAgICAgIG1SZWFkT3B0aW9ucyA9ICpvcHRpb25zOw0KLSNlbmRpZg0KICAgICAgICAgfQ0KIA0KICAgICAgICAgLy8gV2UgYXNrIGZvciAxMDI0IGZyYW1lcyBpbiBvdXRwdXQNCkBAIC0yMTksMTkgKzIxMywyNSBAQAogICAgICAgICBMT0dWKCJvdXRCdWZmZXJTaXplICAgICAgICAgICAgJWQiLCBvdXRCdWZmZXJTaXplKTsNCiAgICAgICAgIExPR1YoIm91dEZyYW1lQ250ICAgICAgICAgICAgICAlZCIsIG91dEZyYW1lQ250KTsNCiANCi0gICAgICAgIHBUbXBCdWZmZXIgPSAoaW50MzJfdCopbWFsbG9jKG91dEZyYW1lQ250ICogMiAqIHNpemVvZihpbnQzMl90KSk7IC8vb3V0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCByZXNhbXBsZXIgb3V0IGlzIDMyIGJpdHMNCisgICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSAoaW50MzJfdCopbWFsbG9jKG91dEZyYW1lQ250ICogMiAqIHNpemVvZihpbnQzMl90KSk7IC8vb3V0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCByZXNhbXBsZXIgb3V0IGlzIDMyIGJpdHMNCiAgICAgICAgIG1lbXNldChwVG1wQnVmZmVyLCAweDAwLCBvdXRGcmFtZUNudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOw0KICAgICAgICAgLy8gUmVzYW1wbGUgdG8gdGFyZ2V0IHF1YWxpdHkNCiAgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHBUbXBCdWZmZXIsIG91dEZyYW1lQ250LCB0aGlzKTsNCi0gICAgICAgIGludDE2X3QgKnJlU2FtcGxlZEJ1ZmZlciA9IChpbnQxNl90KiltYWxsb2Mob3V0QnVmZmVyU2l6ZSk7DQotICAgICAgICBtZW1zZXQocmVTYW1wbGVkQnVmZmVyLCAweDAwLCBvdXRCdWZmZXJTaXplKTsNCisNCisgICAgICAgIC8vIEZyZWUgcHJldmlvdXMgYWxsb2NhdGlvbg0KKyAgICAgICAgaWYgKG1SZVNhbXBsZWRCdWZmZXIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGZyZWUobVJlU2FtcGxlZEJ1ZmZlcik7DQorICAgICAgICAgICAgbVJlU2FtcGxlZEJ1ZmZlciA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBtUmVTYW1wbGVkQnVmZmVyID0gKGludDE2X3QqKW1hbGxvYyhvdXRCdWZmZXJTaXplKTsNCisgICAgICAgIG1lbXNldChtUmVTYW1wbGVkQnVmZmVyLCAweDAwLCBvdXRCdWZmZXJTaXplKTsNCiANCiAgICAgICAgIC8vIENvbnZlcnQgYmFjayB0byAxNiBiaXRzDQotICAgICAgICBBdWRpb01peGVyOjpkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopcmVTYW1wbGVkQnVmZmVyLCBwVG1wQnVmZmVyLCBvdXRGcmFtZUNudCk7DQorICAgICAgICBBdWRpb01peGVyOjpkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopbVJlU2FtcGxlZEJ1ZmZlciwgcFRtcEJ1ZmZlciwgb3V0RnJhbWVDbnQpOw0KICAgICAgICAgTE9HVigiUmVzYW1wbGVkIGJ1ZmZlciBzaXplICVkIiwgb3V0RnJhbWVDbnQqIDIgKiBzaXplb2YoaW50MTZfdCkpOw0KIA0KICAgICAgICAgLy8gQ3JlYXRlIG5ldyBNZWRpYUJ1ZmZlcg0KLSAgICAgICAgbUNvcHlCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHZvaWQqKXJlU2FtcGxlZEJ1ZmZlciwgb3V0QnVmZmVyU2l6ZSk7DQorICAgICAgICBtQ29weUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigodm9pZCopbVJlU2FtcGxlZEJ1ZmZlciwgb3V0QnVmZmVyU2l6ZSk7DQogDQogICAgICAgICAvLyBDb21wdXRlIGFuZCBzZXQgdGhlIG5ldyB0aW1lc3RhbXANCiAgICAgICAgIHNwPE1ldGFEYXRhPiB0byA9IG1Db3B5QnVmZmVyLT5tZXRhX2RhdGEoKTsNCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICBpZiAobUxlZnRvdmVyID4gMCkgew0KICAgICAgICAgTE9HVigiTW92aW5nIG1MZWZ0b3ZlciA9JWQgIGZyb20gICVkIiwgbUxlZnRvdmVyLCBtTGFzdFJlYWRTaXplKTsNCiAgICAgICAgIGlmIChtTGFzdFJlYWRTaXplID4gMCkgew0KLSAgICAgICAgICAgIG1lbWNweShwSW50ZXJmcmFtZUJ1ZmZlciwgKHVpbnQ4X3QqKSAocEludGVyZnJhbWVCdWZmZXIgKyBtTGFzdFJlYWRTaXplKSwgbUxlZnRvdmVyKTsNCisgICAgICAgICAgICBtZW1jcHkobUludGVyZnJhbWVCdWZmZXIsICh1aW50OF90KikgKG1JbnRlcmZyYW1lQnVmZmVyICsgbUxhc3RSZWFkU2l6ZSksIG1MZWZ0b3Zlcik7DQogICAgICAgICB9DQogICAgICAgICBtSW50ZXJmcmFtZUJ1ZmZlclBvc2l0aW9uID0gbUxlZnRvdmVyOw0KICAgICB9DQpAQCAtMjkwLDcgKzI5MCw2IEBACiANCiAgICAgd2hpbGUgKChhdmFpbGFibGVGcmFtZXMgPCBwQnVmZmVyLT5mcmFtZUNvdW50KSYmKG1TdGFydGVkKSkgew0KICAgICAgICAgLy8gaWYgd2Ugc2VlaywgcmVzZXQgdGhlIGluaXRpYWwgdGltZSBzdGFtcCBhbmQgYWNjdW11bGF0ZWQgdGltZQ0KLSNpZm5kZWYgRlJPWU8NCiAgICAgICAgIFJlYWRPcHRpb25zIG9wdGlvbnM7DQogICAgICAgICBpZiAobVNlZWtUaW1lVXMgPj0gMCkgew0KICAgICAgICAgICAgIExPR1YoIiVwIGNhY2hlTW9yZV9sIFNlZWsgcmVxdWVzdGVkID0gJWxsZCIsIHRoaXMsIG1TZWVrVGltZVVzKTsNCkBAIC0yOTgsMTQgKzI5Nyw2IEBACiAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywgbW9kZSk7DQogICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAtMTsNCiAgICAgICAgIH0NCi0jZWxzZQ0KLSAgICAgICAgUmVhZE9wdGlvbnMgb3B0aW9uczsNCi0gICAgICAgIGlmIChtU2Vla1RpbWVVcyA+PSAwKSB7DQotICAgICAgICAgICAgTE9HVigiJXAgY2FjaGVNb3JlX2wgU2VlayByZXF1ZXN0ZWQgPSAlbGxkIiwgdGhpcywgbVNlZWtUaW1lVXMpOw0KLSAgICAgICAgICAgIG9wdGlvbnMgPSBtUmVhZE9wdGlvbnM7DQotICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAtMTsNCi0gICAgICAgIH0NCi0jZW5kaWYNCiAgICAgICAgIC8qIFRoZSBmaXJzdCBjYWxsIHRvIHJlYWQoKSB3aWxsIHJlcXVpcmUgdG8gYnVmZmVyIHR3aWNlIGFzIG11Y2ggZGF0YSAqLw0KICAgICAgICAgLyogVGhpcyB3aWxsIGJlIG5lZWRlZCBieSB0aGUgcmVzYW1wbGVyICovDQogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZhQnVmZmVyLCAmb3B0aW9ucyk7DQpAQCAtMzE3LDE1ICszMDgsMTYgQEAKICAgICAgICAgICAgIC8vRW1wdHkgdGhlIGludGVybmFsIGJ1ZmZlciBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgbGVmdCBpbiB0aGUgc291cmNlDQogICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgIGxhc3RCdWZmZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBtSW5wdXRCeXRlQnVmZmVyID0gcEludGVyZnJhbWVCdWZmZXI7DQogICAgICAgICAgICAgICAgIC8vY2xlYXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBqdXN0IGluIGNhc2UNCi0gICAgICAgICAgICAgICAgbWVtc2V0KHBJbnRlcmZyYW1lQnVmZmVyK21JbnRlcmZyYW1lQnVmZmVyUG9zaXRpb24sIDB4MDAsIERFRkFVTFRfU0FNUExJTkdfRlJFUSAqIDIgKiAyIC0gbUludGVyZnJhbWVCdWZmZXJQb3NpdGlvbik7DQorICAgICAgICAgICAgICAgIG1lbXNldChtSW50ZXJmcmFtZUJ1ZmZlcittSW50ZXJmcmFtZUJ1ZmZlclBvc2l0aW9uLCAweDAwLCBERUZBVUxUX1NBTVBMSU5HX0ZSRVEgKiAyICogMiAtIG1JbnRlcmZyYW1lQnVmZmVyUG9zaXRpb24pOw0KICAgICAgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgIC8vY29weSB0aGUgYnVmZmVyDQotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90KikgKHBJbnRlcmZyYW1lQnVmZmVyICsgbUludGVyZnJhbWVCdWZmZXJQb3NpdGlvbiksICh1aW50OF90KikgKGFCdWZmZXItPmRhdGEoKSArIGFCdWZmZXItPnJhbmdlX29mZnNldCgpKSwgYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIG1lbWNweSgoKHVpbnQ4X3QqKSBtSW50ZXJmcmFtZUJ1ZmZlcikgKyBtSW50ZXJmcmFtZUJ1ZmZlclBvc2l0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikgYUJ1ZmZlci0+ZGF0YSgpKSArIGFCdWZmZXItPnJhbmdlX29mZnNldCgpLA0KKyAgICAgICAgICAgICAgICAgICAgYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOw0KICAgICAgICAgICAgIExPR1YoIlJlYWQgZnJvbSBidWZmZXIgICVkIiwgYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOw0KIA0KICAgICAgICAgICAgIG1JbnRlcmZyYW1lQnVmZmVyUG9zaXRpb24gKz0gYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7DQpAQCAtMzUyLDcgKzM0NCw3IEBACiAgICAgfQ0KIA0KICAgICAvL3VwZGF0ZSB0aGUgaW5wdXQgYnVmZmVyDQotICAgIHBCdWZmZXItPnJhdyAgICAgICAgPSAodm9pZCopKHBJbnRlcmZyYW1lQnVmZmVyKTsNCisgICAgcEJ1ZmZlci0+cmF3ICAgICAgICA9ICh2b2lkKikobUludGVyZnJhbWVCdWZmZXIpOw0KIA0KICAgICAvLyBVcGRhdGUgaG93IG1hbnkgYnl0ZXMgYXJlIGxlZnQNCiAgICAgLy8gKGFjdHVhbFJlYWRTaXplIGlzIHVwZGF0ZWQgaW4gZ2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCBmcm9tIHJlc2FtcGxlKCkpDQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCmluZGV4IDNjNTU3YTQuLjhiZmQ5OTEgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaAorKysgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmgKQEAgLTE1LDIwICsxNSwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovDQogDQorI2luY2x1ZGUgPHN0ZGludC5oPg0KKw0KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+DQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+DQorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4NCiANCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4NCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4NCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPg0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4NCiANCiAjaW5jbHVkZSAiQXVkaW9CdWZmZXJQcm92aWRlci5oIg0KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIg0KIA0KIG5hbWVzcGFjZSBhbmRyb2lkIHsNCi0vL3N0cnVjdCBNZWRpYVNvdXJjZTsNCiANCitzdHJ1Y3QgTWVkaWFCdWZmZXI7DQogDQogY2xhc3MgVmlkZW9FZGl0b3JTUkMgOiBwdWJsaWMgTWVkaWFTb3VyY2UgLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7DQogDQpAQCAtNDksMTQgKzQ4LDE0IEBACiANCiAgICAgZW51bSB7IC8vU2FtcGxpbmcgZnJlcQ0KICAgICAgICAga0ZyZXE4MDAwSHogPSA4MDAwLA0KLSAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsDQotICAgICBrRnJlcTEyMDAwSHogPSAxMjAwMCwNCi0gICAgIGtGcmVxMTYwMDBIeiA9IDE2MDAwLA0KLSAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsDQotICAgICBrRnJlcTI0MDAwMEh6ID0gMjQwMDAsDQotICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwNCi0gICAgIGtGcmVxNDQxMDAgPSA0NDEwMCwNCi0gICAgIGtGcmVxNDgwMDAgPSA0ODAwMCwNCisgICAgICAgIGtGcmVxMTEwMjVIeiA9IDExMDI1LA0KKyAgICAgICAga0ZyZXExMjAwMEh6ID0gMTIwMDAsDQorICAgICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwNCisgICAgICAgIGtGcmVxMjIwNTBIeiA9IDIyMDUwLA0KKyAgICAgICAga0ZyZXEyNDAwMDBIeiA9IDI0MDAwLA0KKyAgICAgICAga0ZyZXEzMjAwMEh6ID0gMzIwMDAsDQorICAgICAgICBrRnJlcTQ0MTAwID0gNDQxMDAsDQorICAgICAgICBrRnJlcTQ4MDAwID0gNDgwMDAsDQogICAgIH07DQogDQogICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBVTklUWV9HQUlOID0gMHgxMDAwOw0KQEAgLTcwLDEzICs2OSw4IEBACiAgICAgICAgIFZpZGVvRWRpdG9yU1JDICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JTUkMgJik7DQogDQogICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgKm1SZXNhbXBsZXI7DQotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICAqbWJ1ZmZlclByb3ZpZGVyOw0KICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgbVNvdXJjZTsNCiAgICAgICAgIE1lZGlhQnVmZmVyICAgICAgKm1Db3B5QnVmZmVyOw0KLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOw0KLSAgICAgICAgdWludDhfdCAqbUlucHV0Qnl0ZUJ1ZmZlcjsNCi0gICAgICAgIGludDMyX3QgbUlucHV0QnVmZmVyTGVuZ3RoOw0KLSAgICAgICAgaW50IG1JbnB1dEZyYW1lU2l6ZTsNCiAgICAgICAgIGludCBtQml0RGVwdGg7DQogICAgICAgICBpbnQgbUNoYW5uZWxDbnQ7DQogICAgICAgICBpbnQgbVNhbXBsZVJhdGU7DQpAQCAtODYsOSArODAsOCBAQAogICAgICAgICBib29sIG1Jc0NoYW5uZWxDb252ZXJ0aW9uUmVxdWlyZWQ7IC8vIGZvciBtb25vIHRvIHN0ZXJlbw0KICAgICAgICAgc3A8TWV0YURhdGE+IG1PdXRwdXRGb3JtYXQ7DQogICAgICAgICBNdXRleCBtTG9jazsNCi0gICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXI7DQogDQotICAgICAgICB1aW50OF90KiBwSW50ZXJmcmFtZUJ1ZmZlcjsNCisgICAgICAgIHVpbnQ4X3QqIG1JbnRlcmZyYW1lQnVmZmVyOw0KICAgICAgICAgaW50MzJfdCBtSW50ZXJmcmFtZUJ1ZmZlclBvc2l0aW9uOw0KICAgICAgICAgaW50MzJfdCBtTGVmdG92ZXI7DQogICAgICAgICBpbnQzMl90IG1MYXN0UmVhZFNpemUgOw0KQEAgLTk4LDYgKzkxLDcgQEAKIA0KICAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsNCiAgICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7DQorICAgICAgICBpbnQxNl90ICptUmVTYW1wbGVkQnVmZmVyOw0KIA0KIH07DQogDQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKaW5kZXggM2MzYTdiOC4uYWQ1Y2JjNSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmNwcAorKysgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCkBAIC0yODIsNyArMjgyLDcgQEAKICAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8NCiAgICAgcF9idWZfc3JjID0gJihQbGFuZUluWzBdLnBhY19kYXRhW1BsYW5lSW5bMF0udV90b3BsZWZ0XSk7DQogICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0WzBdLnBhY19kYXRhW1BsYW5lT3V0WzBdLnVfdG9wbGVmdF0pOw0KLSAgICBNNE9TQV9tZW1jcHkoKE00T1NBX0ludDgqKXBfYnVmX2Rlc3QsKE00T1NBX0ludDgqKXBfYnVmX3NyYyAsDQorICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsKHZvaWQgKilwX2J1Zl9zcmMgLA0KICAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsNCiANCiAgICAgLyogVGhlIFUgYW5kIFYgY29tcG9uZW50cyBhcmUgcGxhbmFyLiBUaGUgbmVlZCB0byBiZSBtYWRlIGludGVybGVhdmVkICovDQpAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgIC8qIFRoZSBpbnB1dCBZIFBsYW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBvdXRwdXQgWSBQbGFuZSAqLw0KICAgICAgcF9idWZfc3JjID0gJihQbGFuZUluWzBdLnBhY19kYXRhW1BsYW5lSW5bMF0udV90b3BsZWZ0XSk7DQogICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsNCi0gICAgIE00T1NBX21lbWNweSgoTTRPU0FfSW50OCopcF9idWZfZGVzdCwoTTRPU0FfSW50OCopcF9idWZfc3JjICwNCisgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsKHZvaWQgKilwX2J1Zl9zcmMgLA0KICAgICAgICAgIFBsYW5lT3V0WzBdLnVfd2lkdGggKiBQbGFuZU91dFswXS51X2hlaWdodCk7DQogDQogICAgICAvKiBUaGUgVSBhbmQgViBjb21wb25lbnRzIGFyZSBwbGFuYXIuIFRoZSBuZWVkIHRvIGJlIG1hZGUgaW50ZXJsZWF2ZWQgKi8NCkBAIC0zNzUsMzIgKzM3NSwzMiBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpDQogICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlOg0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAxMjgpOw0KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMjgsDQorICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwNCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwgMjU1KTsNCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMjU1LA0KKyAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOg0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAwKTsNCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwNCisgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToNCiAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAxMTcpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTE3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7DQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwgMTM5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEzOSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6DQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsDQotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsNCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsDQorICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiANCiAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Og0KQEAgLTQxNywxNSArNDE3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwgKE00T1NBX1VJbnQ4KXUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTIpDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IFYxNihyLCBnLCBiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIChNNE9TQV9VSW50OCl2KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCkBAIC00NDgsMTggKzQ0OCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIChNNE9TQV9VSW50OCl1KTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAoTTRPU0FfVUludDgpdik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgLyoqDQpAQCAtNDc2LDggKzQ3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7DQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQpAQCAtNjQ2LDcgKzY0OCw3IEBACiANCiAgICAgICAgICAgICAgICAgaWYoYWxwaGFCbGVuZGluZ1N0cnVjdCAhPSBNNE9TQV9OVUxMKQ0KICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMCAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApKQ0KKyAgICAgICAgICAgICAgICAgICAgaWYocFByb2dyZXNzLT51aVByb2dyZXNzIDwgKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KSpwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydDsNCkBAIC03NzgsOSArNzgwLDkgQEAKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyB4KyspDQogICAgICAgICB7DQogICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQ0KLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBPdXRDciwgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAxMTcpOyAvKiBVIHZhbHVlICovDQorICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8NCiAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcE91dENyLCBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIDEzOSk7IC8qIFYgdmFsdWUgKi8NCisgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dENyLCAxMzkscFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsgLyogViB2YWx1ZSAqLw0KIA0KICAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOw0KICAgICAgICAgICAgIHBPdXRDciArPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsNCkBAIC04NTgsOCArODYwLDggQEAKICAgICAgICAgew0KICAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2NkZXN0X2xpbmUsIChNNE9TQV9NZW1BZGRyOClwX2NzcmNfbGluZSwgdV93aWR0aCk7DQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9jZGVzdCwgKE00T1NBX01lbUFkZHI4KXBfY3NyYywgdV93aWR0aCk7DQorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7DQorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsICh2b2lkICopcF9jc3JjLCB1X3dpZHRoKTsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsNCiAgICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsNCkBAIC05NzMsMTIgKzk3NSwxMiBAQAogICAgICAgICAvKiB3cml0ZSBibGFjayBsaW5lcyAqLw0KICAgICAgICAgZm9yIChqID0gKG5iX2JsYWNrX2xpbmVzID4+IDEpOyBqICE9IDA7IGotLSkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7DQorICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOw0KICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7DQotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDApOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwgMCx1X3dpZHRoKTsNCiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0Ow0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgdV93aWR0aHV2LCAxMjgpOw0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgdV93aWR0aHV2LCAxMjgpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHUsIDEyOCx1X3dpZHRodXYpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHYsIDEyOCx1X3dpZHRodXYpOw0KICAgICAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2Ow0KICAgICAgICAgICAgIHBfZGVzdHYgKz0gdV9zdHJpZGVfb3V0X3V2Ow0KICAgICAgICAgfQ0KQEAgLTk4NiwxNCArOTg4LDE0IEBACiAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgaW1hZ2UgKi8NCiAgICAgICAgIGZvciAoaiA9ICh1X2hlaWdodCAtIG5iX2JsYWNrX2xpbmVzKSA+PiAxOyBqICE9IDA7IGotLSkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgKE00T1NBX01lbUFkZHI4KXBfc3JjLCB1X3dpZHRoKTsNCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3QsICh2b2lkICopcF9zcmMsIHVfd2lkdGgpOw0KICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7DQogICAgICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7DQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIChNNE9TQV9NZW1BZGRyOClwX3NyYywgdV93aWR0aCk7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCAodm9pZCAqKXBfc3JjLCB1X3dpZHRoKTsNCiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0Ow0KICAgICAgICAgICAgIHBfc3JjICs9IHVfc3RyaWRlOw0KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgKE00T1NBX01lbUFkZHI4KXBfc3JjdSwgdV93aWR0aHV2KTsNCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdHYsIChNNE9TQV9NZW1BZGRyOClwX3NyY3YsIHVfd2lkdGh1dik7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0dSwgKHZvaWQgKilwX3NyY3UsIHVfd2lkdGh1dik7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwgKHZvaWQgKilwX3NyY3YsIHVfd2lkdGh1dik7DQogICAgICAgICAgICAgcF9kZXN0dSArPSB1X3N0cmlkZV9vdXRfdXY7DQogICAgICAgICAgICAgcF9kZXN0diArPSB1X3N0cmlkZV9vdXRfdXY7DQogICAgICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2Ow0KQEAgLTEwMTAsMTQgKzEwMTIsMTQgQEAKICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBpbWFnZSBpbWFnZSAqLw0KICAgICAgICAgZm9yIChqID0gKG5iX2JsYWNrX2xpbmVzID4+IDEpOyBqICE9IDA7IGotLSkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgKE00T1NBX01lbUFkZHI4KXBfc3JjLCB1X3dpZHRoKTsNCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3QsICh2b2lkICopcF9zcmMsIHVfd2lkdGgpOw0KICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7DQogICAgICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7DQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIChNNE9TQV9NZW1BZGRyOClwX3NyYywgdV93aWR0aCk7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCAodm9pZCAqKXBfc3JjLCB1X3dpZHRoKTsNCiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0Ow0KICAgICAgICAgICAgIHBfc3JjICs9IHVfc3RyaWRlOw0KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgKE00T1NBX01lbUFkZHI4KXBfc3JjdSwgdV93aWR0aHV2KTsNCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdHYsIChNNE9TQV9NZW1BZGRyOClwX3NyY3YsIHVfd2lkdGh1dik7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0dSwgKHZvaWQgKilwX3NyY3UsIHVfd2lkdGh1dik7DQorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwgKHZvaWQgKilwX3NyY3YsIHVfd2lkdGh1dik7DQogICAgICAgICAgICAgcF9kZXN0dSArPSB1X3N0cmlkZV9vdXRfdXY7DQogICAgICAgICAgICAgcF9kZXN0diArPSB1X3N0cmlkZV9vdXRfdXY7DQogICAgICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2Ow0KQEAgLTEwMjgsMTIgKzEwMzAsMTIgQEAKICAgICAgICAgLyogdGhlIHBvaW50ZXJzIHRvIHBfZGVzdCwgcF9kZXN0dSBhbmQgcF9kZXN0diBhcmUgdXNlZCB0aHJvdWdoIHRoZSB0d28gbG9vcHMgImZvciIgKi8NCiAgICAgICAgIGZvciAoaiA9ICh1X2hlaWdodCAtIG5iX2JsYWNrX2xpbmVzKSA+PiAxOyBqICE9IDA7IGotLSkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7DQorICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOw0KICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7DQotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDApOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwgMCx1X3dpZHRoKTsNCiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0Ow0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgdV93aWR0aHV2LCAxMjgpOw0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgdV93aWR0aHV2LCAxMjgpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHUsIDEyOCx1X3dpZHRodXYpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHYsIDEyOCx1X3dpZHRodXYpOw0KICAgICAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2Ow0KICAgICAgICAgICAgIHBfZGVzdHYgKz0gdV9zdHJpZGVfb3V0X3V2Ow0KICAgICAgICAgfQ0KQEAgLTEwNjEsNyArMTA2Myw3IEBACiANCiAgICAgLyoqDQogICAgICAqIEFsbG9jYXRlIG91dHB1dCBZVVYgcGxhbmVzICovDQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBX21hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7DQorICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7DQogICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkNCiAgICAgew0KICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7DQpAQCAtMTA3MSw3ICsxMDczLDcgQEAKICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7DQogICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsNCiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7DQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7Ow0KKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIqKSJBbGxvYyBmb3IgdGhlIENvbnZlcnRpb24gb3V0cHV0IFlVViIpOzsNCiAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQ0KICAgICB7DQogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsNCkBAIC0xMTI2LDcgKzExMjgsNyBAQAogDQogICAgIC8qKg0KICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLw0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV9tYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOw0KKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOw0KICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpDQogICAgIHsNCiAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOw0KQEAgLTExMzYsNyArMTEzOCw3IEBACiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ow0KICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7DQogICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOw0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfbWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIqKSJBbGxvYyBmb3IgdGhlIENvbnZlcnRpb24gb3V0cHV0IFlVViIpOzsNCisgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQqMyk+PjEsIE00VlMsIChNNE9TQV9DaGFyKikiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7DQogICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkNCiAgICAgew0KICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7DQpAQCAtMTI3OSwxNiArMTI4MSw2IEBACiAgICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7DQogDQogICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8NCi0jaWYgMA0KLSAgICAgICAgICAgIC8qICh4LHkpICovDQotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjAwLGkzMl9nMDAsaTMyX2IwMCx1MTZfcGl4MSk7DQotICAgICAgICAgICAgLyogKHgrMSx5KSAqLw0KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IxMCxpMzJfZzEwLGkzMl9iMTAsdTE2X3BpeDIpOw0KLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8NCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsNCi0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8NCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMTEsaTMyX2cxMSxpMzJfYjExLHUxNl9waXg0KTsNCi0jZWxzZQ0KICAgICAgICAgICAgIC8qICh4LHkpICovDQogICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7DQogICAgICAgICAgICAgLyogKHgrMSx5KSAqLw0KQEAgLTEyOTcsOCArMTI4OSw2IEBACiAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHUxNl9waXgzKTsNCiAgICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8NCiAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsNCi0jZW5kaWYNCi0jaWYgMSAvKiBTb2x1dGlvbiB0byBhdm9pZCBncmVlbiBlZmZlY3RzIGR1ZSB0byB0cmFuc3BhcmVuY3kgKi8NCiAgICAgICAgICAgICAvKiBJZiBSR0IgaXMgdHJhbnNwYXJlbnQgY29sb3IgKDAsIDYzLCAwKSwgd2UgdHJhbnNmb3JtIGl0IHRvIHdoaXRlICgzMSw2MywzMSkgKi8NCiAgICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApDQogICAgICAgICAgICAgew0KQEAgLTEzMjAsNyArMTMxMCw2IEBACiAgICAgICAgICAgICAgICAgaTMyX2IxMSA9IDMxOw0KICAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7DQogICAgICAgICAgICAgfQ0KLSNlbmRpZg0KICAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLw0KICAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7DQogICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsNCkBAIC0xMzQ3LDQ3ICsxMzM2LDggQEAKICAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsNCiAgICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7DQogICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOw0KLSNpZiAwIC8qIFRlbXBvcmFyeSBzb2x1dGlvbiB0byBhdm9pZCBncmVlbiBlZmZlY3RzIGR1ZSB0byB0cmFuc3BhcmVuY3kgLT4gVG8gYmUgcmVtb3ZlZCAqLw0KLSAgICAgICAgICAgIGNvdW50X251bGwgPSA0Ow0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovDQotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaTMyX3UwMCA9IDA7DQotICAgICAgICAgICAgICAgIGkzMl92MDAgPSAwOw0KLSAgICAgICAgICAgICAgICBjb3VudF9udWxsIC0tOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpMzJfdTEwID0gMDsNCi0gICAgICAgICAgICAgICAgaTMyX3YxMCA9IDA7DQotICAgICAgICAgICAgICAgIGNvdW50X251bGwgLS07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGkzMl91MDEgPSAwOw0KLSAgICAgICAgICAgICAgICBpMzJfdjAxID0gMDsNCi0gICAgICAgICAgICAgICAgY291bnRfbnVsbCAtLTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaTMyX3UxMSA9IDA7DQotICAgICAgICAgICAgICAgIGkzMl92MTEgPSAwOw0KLSAgICAgICAgICAgICAgICBjb3VudF9udWxsIC0tOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihjb3VudF9udWxsID09IDApDQotICAgICAgICAgICAgew0KLSNlbmRpZg0KICAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7DQogICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsNCi0jaWYgMCAvKiBUZW1wb3Jhcnkgc29sdXRpb24gdG8gYXZvaWQgZ3JlZW4gZWZmZWN0cyBkdWUgdG8gdHJhbnNwYXJlbmN5IC0+IFRvIGJlIHJlbW92ZWQgKi8NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSAvIGNvdW50X251bGwpOw0KLSAgICAgICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpIC8gY291bnRfbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSNlbmRpZg0KICAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovDQogICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7DQogICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLw0KQEAgLTE1NzEsNyArMTUyMSw3IEBACiAgICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsNCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspDQogICAgICAgICB7DQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LCAoTTRPU0FfTWVtQWRkcjgpcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgIHBfYnVmX3NyYyArPSBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7DQogICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOw0KICAgICAgICAgfQ0KQEAgLTE2MTAsNyArMTU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQ0KIHsNCi0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbiwgKnB1OF9kYXRhX291dDsNCisgICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbiwgKnB1OF9kYXRhX291dCwgKnB1OGR1bTsNCiAgICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsNCiAgICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7DQogICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsNCkBAIC0xNjIzLDE5ICsxNTczLDI5IEBACiAgICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsNCiAgICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsNCiANCi0gICAgaWYgKCAocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJiAocFBsYW5lSW5bMF0udV93aWR0aCA9PSBwUGxhbmVPdXRbMF0udV93aWR0aCkpDQorICAgIE00VklGSV9VSW50OCAgICB1OFdmbGFnID0gMDsNCisgICAgTTRWSUZJX1VJbnQ4ICAgIHU4SGZsYWcgPSAwOw0KKyAgICBNNFZJRklfVUludDMyICAgbG9vcCA9IDA7DQorDQorDQorICAgIC8qDQorICAgICBJZiBpbnB1dCB3aWR0aCBpcyBlcXVhbCB0byBvdXRwdXQgd2lkdGggYW5kIGlucHV0IGhlaWdodCBlcXVhbCB0bw0KKyAgICAgb3V0cHV0IGhlaWdodCB0aGVuIE00VklGSV9ZVVY0MjB0b1lVVjQyMCBpcyBjYWxsZWQuDQorICAgICovDQorICAgIGlmICgocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJg0KKyAgICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGggPT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpKQ0KICAgICB7DQogICAgICAgICByZXR1cm4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHBVc2VyRGF0YSwgcFBsYW5lSW4sIHBQbGFuZU91dCk7DQogICAgIH0NCiANCiAgICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLw0KLSAgICBpZiggKElTX0VWRU4ocFBsYW5lSW5bMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICB8fA0KKyAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV9oZWlnaHQpID09IEZBTFNFKSAgICB8fA0KICAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkpDQogICAgIHsNCiAgICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7DQogICAgIH0NCiANCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpID09IEZBTFNFKSB8fA0KKyAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCkgPT0gRkFMU0UpIHx8DQogICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpKQ0KICAgICB7DQogICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7DQpAQCAtMTY1OSw2ICsxNjE5LDE2IEBACiAgICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfd2lkdGg7DQogICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X2hlaWdodDsNCiANCisgICAgICAgIC8qDQorICAgICAgICBGb3IgdGhlIGNhc2UgLCB3aWR0aF9vdXQgPSB3aWR0aF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZA0KKyAgICAgICAgYWNjZXNzaW5nIG9uZSBjb2x1bW4gYmV5b25kIHRoZSBpbnB1dCB3aWR0aC5JbiB0aGlzIGNhc2UgdGhlIGxhc3QNCisgICAgICAgIGNvbHVtbiBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nDQorICAgICAgICAqLw0KKyAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPT0gdTMyX3dpZHRoX2luKSB7DQorICAgICAgICAgICAgdTMyX3dpZHRoX291dCA9IHUzMl93aWR0aF9vdXQtMTsNCisgICAgICAgICAgICB1OFdmbGFnID0gMTsNCisgICAgICAgIH0NCisNCiAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8NCiAgICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikNCiAgICAgICAgIHsNCkBAIC0xNjY5LDYgKzE2MzksMTYgQEAKICAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7DQogICAgICAgICB9DQogDQorICAgICAgICAvKg0KKyAgICAgICAgRm9yIHRoZSBjYXNlICwgaGVpZ2h0X291dCA9IGhlaWdodF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZA0KKyAgICAgICAgYWNjZXNzaW5nIG9uZSByb3cgYmV5b25kIHRoZSBpbnB1dCBoZWlnaHQuSW4gdGhpcyBjYXNlIHRoZSBsYXN0DQorICAgICAgICByb3cgaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZw0KKyAgICAgICAgKi8NCisgICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA9PSB1MzJfaGVpZ2h0X2luKSB7DQorICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSB1MzJfaGVpZ2h0X291dC0xOw0KKyAgICAgICAgICAgIHU4SGZsYWcgPSAxOw0KKyAgICAgICAgfQ0KKw0KICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovDQogICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikNCiAgICAgICAgIHsNCkBAIC0xNjgxLDE0ICsxNjYxLDE1IEBACiANCiAgICAgICAgIC8qDQogICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0Lg0KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQ0KKyAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQ0KKyAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUNCiAgICAgICAgICovDQogICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQNCi0gICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cw0KLSAgICAgICAgICAgICovDQorICAgICAgICAvKg0KKyAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkDQorICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25hbCBvbiB0aGUgMTUgbG93IGJpdHMNCisgICAgICAgICovDQogICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSB1MzJfeV9pbmMgJiAweGZmZmY7DQogDQogICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkNCkBAIC0xNzA1LDggKzE2ODYsOSBAQAogDQogDQogICAgICAgICAvKg0KLSAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuDQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQ0KKyAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4NCisgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUNCisgICAgICAgIGJldHdlZW4gMCBhbmQgMC41DQogICAgICAgICAqLw0KICAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpDQogICAgICAgICB7DQpAQCAtMTcyNywxMiArMTcwOSwxNCBAQAogICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7DQogDQogICAgICAgICAvKg0KLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdA0KLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlDQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToNCi0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpDQotICAgICAgICB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteCAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpd2VpZ2h0aW5nIGNvZWZmaWNpZW50DQotICAgICAgICBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uDQorICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kDQorICAgICAgICB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLg0KKyAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uDQorICAgICAgICBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToNCisgICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKSsNCisgICAgICAgIGYocCsmLHErMSlSKDEtYSlSKGItMSkgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXgNCisgICAgICAgIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudCBpcyB0aGUgZGlzdGFuY2UNCisgICAgICAgIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbg0KICAgICAgICAgKi8NCiANCiAgICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLw0KQEAgLTE3NjIsNiArMTc0NiwxNiBAQAogICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsNCiAgICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsNCiANCisgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAgIFRoaXMgdThXZmxhZyBmbGFnIGdldHMgaW4gdG8gZWZmZWN0IGlmIGlucHV0IGFuZCBvdXRwdXQNCisgICAgICAgICAgICAgICB3aWR0aCBpcyBzYW1lLCBhbmQgaGVpZ2h0IG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzDQorICAgICAgICAgICAgICAgcGl4ZWwgaXMgcmVwbGljYXRlZCBoZXJlDQorICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAodThXZmxhZykgew0KKyAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0ID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHU4ZHVtID0gKHB1OF9kYXRhX291dC11MzJfd2lkdGhfb3V0KTsNCiAgICAgICAgICAgICBwdThfZGF0YV9vdXQgPSBwdThfZGF0YV9vdXQgKyB1MzJfc3RyaWRlX291dCAtIHUzMl93aWR0aF9vdXQ7DQogDQogICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovDQpAQCAtMTc3MSw2ICsxNzY1LDE3IEBACiAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsNCisNCisgICAgICAgIC8qDQorICAgICAgICBUaGlzIHU4SGZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0IGhlaWdodA0KKyAgICAgICAgaXMgc2FtZSwgYW5kIHdpZHRoIG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzIHBpeGVsIHJvdyBpcw0KKyAgICAgICAgcmVwbGljYXRlZCBoZXJlDQorICAgICAgICAqLw0KKyAgICAgICAgaWYgKHU4SGZsYWcpIHsNCisgICAgICAgICAgICBmb3IobG9vcCA9MDsgbG9vcCA8ICh1MzJfd2lkdGhfb3V0K3U4V2ZsYWcpOyBsb29wKyspIHsNCisgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCkqcHU4ZHVtKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KICAgICB9DQogDQogICAgIHJldHVybiBNNFZJRklfT0s7DQpAQCAtMTgwMCw5ICsxODA1LDkgQEAKICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0Ow0KICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0Ow0KICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWTsNCi0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVU7DQotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWOw0KKyAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE5VTEw7DQorICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVVID0gTlVMTDsNCisgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBOVUxMOw0KICAgICAgICAgTTRPU0FfVUludDMyIGk7DQogDQogICAgICAgICAvKnRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8NCkBAIC0xODIwLDkgKzE4MjUsOSBAQAogICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLw0KICAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpDQogICAgICAgICB7DQotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMF0ucGFjX2RhdGEsKHBQbGFuZU91dFswXS51X2hlaWdodCpwUGxhbmVPdXRbMF0udV9zdHJpZGUpLFlfUExBTkVfQk9SREVSX1ZBTFVFKTsNCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBQbGFuZU91dFsxXS5wYWNfZGF0YSwocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSksVV9QTEFORV9CT1JERVJfVkFMVUUpOw0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcFBsYW5lT3V0WzJdLnBhY19kYXRhLChwUGxhbmVPdXRbMl0udV9oZWlnaHQqcFBsYW5lT3V0WzJdLnVfc3RyaWRlKSxWX1BMQU5FX0JPUkRFUl9WQUxVRSk7DQorICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMF0udV9oZWlnaHQqcFBsYW5lT3V0WzBdLnVfc3RyaWRlKSk7DQorICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMV0udV9oZWlnaHQqcFBsYW5lT3V0WzFdLnVfc3RyaWRlKSk7DQorICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMl0udV9oZWlnaHQqcFBsYW5lT3V0WzJdLnVfc3RyaWRlKSk7DQogDQogICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7DQogICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsNCkBAIC0xODQzLDIwICsxODQ4LDIwIEBACiAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsNCiANCiAgICAgICAgICAgICAvKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8NCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJZIikgOw0KKyAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclkiKSA7DQogICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQ0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOw0KICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQogICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBX21hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclUiKSA7DQorICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsIE00VlMsIChNNE9TQV9DaGFyKikiYXBwbHlSZW5kZXJpbmdNb2RlOiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyVSIpIDsNCiAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID09IE00T1NBX05VTEwpDQogICAgICAgICAgICAgew0KIA0KICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7DQogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCiAgICAgICAgICAgICB9DQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCopTTRPU0FfbWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsIE00VlMsIChNNE9TQV9DaGFyKikiYXBwbHlSZW5kZXJpbmdNb2RlOiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsNCisgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJWIikgOw0KICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkNCiAgICAgICAgICAgICB7DQogDQpAQCAtMTg2OCw5ICsxODczLDkgQEAKICAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOw0KICAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOw0KIA0KLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSwocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSxZX1BMQU5FX0JPUkRFUl9WQUxVRSk7DQotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUpLFVfUExBTkVfQk9SREVSX1ZBTFVFKTsNCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEsKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSksVl9QTEFORV9CT1JERVJfVkFMVUUpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOw0KKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOw0KIA0KICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpIC9wUGxhbmVJbi0+dV93aWR0aCkgPD0gcFBsYW5lT3V0LT51X2hlaWdodCkvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQ0KICAgICAgICAgICAgIHsNCkBAIC0xOTU5LDcgKzE5NjQsNyBAQAogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpDQogICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7DQogICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCkBAIC0xOTc3LDcgKzE5ODIsNyBAQAogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpDQogICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7DQogICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCkBAIC0xOTkzLDcgKzE5OTgsNyBAQAogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpDQogICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsNCisgICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7DQogICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH0NCkBAIC0yMDA0LDE5ICsyMDA5LDE5IEBACiAgICAgICAgIHsNCiAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFswXS51X2hlaWdodDsgaSsrKQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwT3V0UGxhbmVZLCAoTTRPU0FfTWVtQWRkcjgpcEluUGxhbmVZLCBwUGxhbmVPdXRbMF0udV93aWR0aCk7DQorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVksICh2b2lkICopcEluUGxhbmVZLCBwUGxhbmVPdXRbMF0udV93aWR0aCk7DQogICAgICAgICAgICAgICAgIHBJblBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV93aWR0aDsNCiAgICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspDQogICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBPdXRQbGFuZVUsIChNNE9TQV9NZW1BZGRyOClwSW5QbGFuZVUsIHBQbGFuZU91dFsxXS51X3dpZHRoKTsNCisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lVSwgKHZvaWQgKilwSW5QbGFuZVUsIHBQbGFuZU91dFsxXS51X3dpZHRoKTsNCiAgICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3dpZHRoOw0KICAgICAgICAgICAgICAgICBwT3V0UGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMl0udV9oZWlnaHQ7IGkrKykNCiAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcE91dFBsYW5lViwgKE00T1NBX01lbUFkZHI4KXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOw0KKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOw0KICAgICAgICAgICAgICAgICBwSW5QbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7DQogICAgICAgICAgICAgICAgIHBPdXRQbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOw0KICAgICAgICAgICAgIH0NCkBAIC0yMDI1LDExICsyMDMwLDE2IEBACiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkNCiAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOw0KKyAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgfQ0KICAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgew0KKyAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7DQorICAgICAgICAgICAgbV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7DQorICAgICAgICB9DQogICAgIH0NCiANCiAgICAgcmV0dXJuIGVycjsNCkBAIC0yMTI0LDcgKzIxMzQsNyBAQAogICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOw0KIA0KICAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovDQotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLCBNNEFJUiwgKE00T1NBX0NoYXIqKSJBSVIgaW50ZXJuYWwgY29udGV4dCIpIDsNCisgICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksIE00QUlSLCAoTTRPU0FfQ2hhciopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOw0KICAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgcEMpIDsNCiANCiANCkBAIC0yMTU3LDcgKzIxNjcsNyBAQAogICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLw0KICAgICBpZihNNE9TQV9OVUxMICE9IHBDKQ0KICAgICB7DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMpIDsNCisgICAgICAgIGZyZWUocEMpIDsNCiAgICAgfQ0KIA0KICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsNCkBAIC0yMTg5LDcgKzIxOTksNyBAQAogICAgIHsNCiAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsNCiAgICAgfQ0KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMpIDsNCisgICAgZnJlZShwQykgOw0KIA0KICAgICByZXR1cm4gTTROT19FUlJPUiA7DQogDQpAQCAtMjUxOCw3ICsyNTI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bG9jX2hlaWdodDsgaisrKQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29weSBvbmUgd2hvbGUgbGluZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgoTTRPU0FfTWVtQWRkcjgpcHU4X2RhdGFfb3V0LCAoTTRPU0FfTWVtQWRkcjgpcHU4X2RhdGFfaW4sIGxvY193aWR0aCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLCBsb2Nfd2lkdGgpOw0KIA0KICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGU7DQpAQCAtMjk2Nyw3ICsyOTc3LDcgQEAKICAgICBNNE9TQV9Db250ZXh0IGxJbWFnZUZpbGVGcCAgPSBNNE9TQV9OVUxMOw0KICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsNCiANCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfbWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGFyZ2IgZGF0YSIpOw0KKyAgICBNNE9TQV9VSW50OCAqcFRtcERhdGEgPSAoTTRPU0FfVUludDgqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX2FyZ2IsIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgYXJnYiBkYXRhIik7DQogICAgIGlmKHBUbXBEYXRhID09IE00T1NBX05VTEwpIHsNCiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsNCiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCkBAIC0yOTc5LDcgKzI5ODksNyBAQAogICAgIGlmKChsZXJyICE9IE00Tk9fRVJST1IpIHx8IChsSW1hZ2VGaWxlRnAgPT0gTTRPU0FfTlVMTCkpDQogICAgIHsNCiAgICAgICAgIExPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IENhbiBub3Qgb3BlbiB0aGUgZmlsZSAiKTsNCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wRGF0YSk7DQorICAgICAgICBmcmVlKHBUbXBEYXRhKTsNCiAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX05PVF9GT1VORDsNCiAgICAgfQ0KICAgICBsZXJyID0gTTRPU0FfZmlsZVJlYWREYXRhKGxJbWFnZUZpbGVGcCwgKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOw0KQEAgLTI5ODcsMjcgKzI5OTcsMjcgQEAKICAgICB7DQogICAgICAgICBMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBjYW4gbm90IHJlYWQgdGhlIGRhdGEgIik7DQogICAgICAgICBNNE9TQV9maWxlUmVhZENsb3NlKGxJbWFnZUZpbGVGcCk7DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOw0KKyAgICAgICAgZnJlZShwVG1wRGF0YSk7DQogICAgICAgICByZXR1cm4gbGVycjsNCiAgICAgfQ0KICAgICBNNE9TQV9maWxlUmVhZENsb3NlKGxJbWFnZUZpbGVGcCk7DQogDQogICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFlVVjQyMCBkYXRhLg0KLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYyhmcmFtZVNpemUsIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOw0KKyAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOw0KICAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQ0KICAgICB7DQogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7DQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOw0KKyAgICAgICAgZnJlZShwVG1wRGF0YSk7DQogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQogICAgIH0NCiANCiAgICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLw0KLSAgICBmb3IgKGludCBpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgew0KKyAgICBmb3IgKE00T1NBX1VJbnQzMiBpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgew0KICAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7DQogICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOw0KICAgICAgICAgaisrOw0KICAgICB9DQotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wRGF0YSk7DQorICAgIGZyZWUocFRtcERhdGEpOw0KIA0KICNpZmRlZiBGSUxFX0RVTVANCiAgICAgRklMRSAqZnAgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3JnYi5yYXciLCAid2IiKTsNCkBAIC0zMDIzLDEzICszMDMzLDEzIEBACiAgICAgICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gd2lkdGgqMzsNCiAgICAgICAgIHJnYlBsYW5lLnVfdG9wbGVmdCA9IDA7DQogDQotICAgICAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfbWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwNCisgICAgICAgIHl1dlBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLA0KICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOw0KICAgICAgICAgeXV2UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7DQogICAgICAgICB5dXZQbGFuZVswXS51X3dpZHRoID0gd2lkdGg7DQogICAgICAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOw0KICAgICAgICAgeXV2UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsNCi0gICAgICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfbWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMF0udV93aWR0aCAqIDEuNSwgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsNCisgICAgICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMF0udV93aWR0aCAqIDEuNSwgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsNCiANCiAgICAgICAgIHl1dlBsYW5lWzFdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOw0KICAgICAgICAgeXV2UGxhbmVbMV0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsNCkBAIC0zMDQ4LDkgKzMwNTgsOSBAQAogICAgICAgICAvL2VyciA9IE00VklGSV9CR1I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsNCiAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIExPR0UoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7DQorICAgICAgICAgICAgTE9HRSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgKHVuc2lnbmVkIGludCllcnIpOw0KICAgICAgICAgfQ0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lLnBhY19kYXRhKTsNCisgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOw0KIA0KICAgICAgICAgLy9MT0dFKCJSR0IgdG8gWVVWIGRvbmUiKTsNCiAjaWZkZWYgRklMRV9EVU1QDQpAQCAtMzA2Myw3ICszMDczLDcgQEAKICAgICAgICAgfQ0KICNlbmRpZg0KICAgICAgICAgKnBCdWZmZXIgPSB5dXZQbGFuZVswXS5wYWNfZGF0YTsNCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil5dXZQbGFuZSk7DQorICAgICAgICBmcmVlKHl1dlBsYW5lKTsNCiAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOw0KIA0KIH0NCkBAIC0zMjMwLDcgKzMyNDAsNyBAQAogICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsNCiANCiAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9DQotICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKU00T1NBX21hbGxvYygNCisgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKA0KICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksIE00VlMsDQogICAgICAgKE00T1NBX0NoYXIqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3QiKTsNCiANCkBAIC0zMjU0LDcgKzMyNjQsNyBAQAogDQogICAgICAgICAvLyBJZiBZVVYgYnVmZmVyIGV4aXN0cywgZGVsZXRlIGl0DQogICAgICAgICBpZihvdmVybGF5WVVWICE9IE5VTEwpIHsNCi0gICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilvdmVybGF5WVVWKTsNCisgICAgICAgICAgIGZyZWUob3ZlcmxheVlVVik7DQogICAgICAgICAgICBvdmVybGF5WVVWID0gTlVMTDsNCiAgICAgICAgIH0NCiAgICAgaWYoZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I1NjUpIHsNCkBAIC0zMjc2LDcgKzMyODYsNyBAQAogICAgIH0NCiAgICAgZWxzZSB7DQogICAgICAgICBMT0dWKCIgWVVWIGJ1ZmZlciByZXVzZSIpOw0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfbWFsbG9jKA0KKyAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKA0KICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIqKSJZVVYiKTsNCiANCiAgICAgICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkgew0KQEAgLTMzMzAsMTEgKzMzNDAsMTEgQEAKICAgICAgICAgICAgIGNvbG9yRWZmZWN0LCBlcnIpOw0KIA0KICAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7DQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJ1ZmZlcjEpOw0KKyAgICAgICAgICAgIGZyZWUoYnVmZmVyMSk7DQogICAgICAgICAgICAgYnVmZmVyMSA9IE5VTEw7DQogICAgICAgICB9DQogICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjIpIHsNCi0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYnVmZmVyMik7DQorICAgICAgICAgICAgZnJlZShidWZmZXIyKTsNCiAgICAgICAgICAgICBidWZmZXIyID0gTlVMTDsNCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiBlcnI7DQpAQCAtMzM1NywxNCArMzM2NywxNCBAQAogICAgICAgICAgbHVtX2ZhY3RvciwgTlVMTCk7DQogDQogICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQotICAgICAgICBMT0dFKCJNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKCVkKSBlcnJvciAlZCIsIHZpZGVvRWZmZWN0LCBlcnIpOw0KKyAgICAgICAgTE9HRSgiTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSglZCkgZXJyb3IgJWQiLCB2aWRlb0VmZmVjdCwgKGludCllcnIpOw0KIA0KICAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7DQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJ1ZmZlcjEpOw0KKyAgICAgICAgICAgIGZyZWUoYnVmZmVyMSk7DQogICAgICAgICAgICAgYnVmZmVyMT0gTlVMTDsNCiAgICAgICAgIH0NCiAgICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMikgew0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilidWZmZXIyKTsNCisgICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOw0KICAgICAgICAgICAgIGJ1ZmZlcjI9IE5VTEw7DQogICAgICAgICB9DQogICAgICAgICByZXR1cm4gZXJyOw0KQEAgLTMzODgsMTQgKzMzOTgsMTQgQEAKICAgICBlcnIgPSBNNFZGTF9hcHBseUN1cnRhaW4oIChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVJbiwNCiAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilwbGFuZU91dCwgY3VydGFpblBhcmFtcywgTlVMTCk7DQogICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQotICAgICAgICBMT0dFKCJNNFZGTF9hcHBseUN1cnRhaW4oJWQpIGVycm9yICVkIiwgdmlkZW9FZmZlY3QsIGVycik7DQorICAgICAgICBMT0dFKCJNNFZGTF9hcHBseUN1cnRhaW4oJWQpIGVycm9yICVkIiwgdmlkZW9FZmZlY3QsIChpbnQpZXJyKTsNCiANCiAgICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgew0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilidWZmZXIxKTsNCisgICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOw0KICAgICAgICAgICAgIGJ1ZmZlcjE9IE5VTEw7DQogICAgICAgICB9DQogICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjIpIHsNCi0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYnVmZmVyMik7DQorICAgICAgICAgICAgZnJlZShidWZmZXIyKTsNCiAgICAgICAgICAgICBidWZmZXIyID0gTlVMTDsNCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiBlcnI7DQpAQCAtMzQyMyw3ICszNDMzLDcgQEAKIA0KICAgICBmcmFtZVNpemUgPSAocGFyYW1zLT52aWRlb1dpZHRoKnBhcmFtcy0+dmlkZW9IZWlnaHQqMykgPj4gMTsNCiANCi0gICAgZmluYWxPdXRwdXRCdWZmZXIgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MoZnJhbWVTaXplLCBNNFZTLA0KKyAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsDQogICAgICAoTTRPU0FfQ2hhciopKCJsdnBwIGZpbmFsT3V0cHV0QnVmZmVyIikpOw0KIA0KICAgICBpZihmaW5hbE91dHB1dEJ1ZmZlciA9PSBOVUxMKSB7DQpAQCAtMzQzMiwxMyArMzQ0MiwxMyBAQAogICAgIH0NCiANCiAgICAgLy8gYWxsb2NhdGUgdGhlIHRlbXBPdXRwdXRCdWZmZXINCi0gICAgdGVtcE91dHB1dEJ1ZmZlciA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYygNCisgICAgdGVtcE91dHB1dEJ1ZmZlciA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCiAgICAgICgocGFyYW1zLT52aWRlb0hlaWdodCpwYXJhbXMtPnZpZGVvV2lkdGgqMyk+PjEpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJsdnBwIGNvbG9yQnVmZmVyIikpOw0KIA0KICAgICBpZih0ZW1wT3V0cHV0QnVmZmVyID09IE5VTEwpIHsNCiAgICAgICAgIExPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciB0ZW1wT3V0cHV0QnVmZmVyIik7DQogICAgICAgICBpZihOVUxMICE9IGZpbmFsT3V0cHV0QnVmZmVyKSB7DQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZpbmFsT3V0cHV0QnVmZmVyKTsNCisgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsNCiAgICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7DQogICAgICAgICB9DQogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQpAQCAtMzUwNiw3ICszNTE2LDcgQEAKICAgICAgICAgLy8gZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5DQogICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgew0KICAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQ0KLSAgICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCkNCisgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQpDQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KICAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCwNCkBAIC0zNTIyLDcgKzM1MzIsNyBAQAogICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkNCiAgICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7DQogICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09DQotICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYpDQorICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYpDQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgfQ0KICAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2LA0KQEAgLTM1MzgsNyArMzU0OCw3IEBACiAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQ0KICAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsNCiAgICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0NCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcykNCisgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcykNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICB9DQogICAgICAgICBpZihpIDwgcGFyYW1zLT5udW1iZXJFZmZlY3RzKSB7DQpAQCAtMzU2MCwxNCArMzU3MCwxNCBAQAogICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMpOw0KIA0KICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQotICAgICAgICAgICAgICAgIExPR0UoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyBlcnJvciAweCV4IiwgZXJyKTsNCisgICAgICAgICAgICAgICAgTE9HRSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7DQogDQogICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmaW5hbE91dHB1dEJ1ZmZlcik7DQorICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsNCiAgICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0ZW1wT3V0cHV0QnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7DQogICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOw0KQEAgLTM1ODUsNyArMzU5NSw3IEBACiAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQ0KICAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsNCiAgICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0NCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgew0KKyAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7DQogICAgICAgICAgICAgICAgIGlmKChwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkgJiYNCiAgICAgICAgICAgICAgICAgICAgKChwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSsNCiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkpDQpAQCAtMzYwOSwxMCArMzYxOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpOw0KICAgICAgICAgICAgIH0NCiANCi0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC5hbHBoYUJsZW5kaW5nU3RydWN0KTsNCisgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguYWxwaGFCbGVuZGluZ1N0cnVjdCk7DQogDQogICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC5GcmFtaW5nWXV2ICE9IE5VTEwpIHsNCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHguRnJhbWluZ1l1dik7DQorICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC5GcmFtaW5nWXV2KTsNCiAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC5GcmFtaW5nWXV2ID0gTlVMTDsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgLy9JZiBwcmVwYXJlRnJhbWluZ1N0cnVjdHVyZSAvIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZw0KQEAgLTM2MjAsMTEgKzM2MzAsMTEgQEAKICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQogDQogICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmaW5hbE91dHB1dEJ1ZmZlcik7DQorICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsNCiAgICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0ZW1wT3V0cHV0QnVmZmVyKTsNCisgICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7DQogICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOw0KQEAgLTM3NjMsMTEgKzM3NzMsMTEgQEAKICAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIHBhcmFtcy0+cmVuZGVyaW5nTW9kZSk7DQogDQogICAgIGlmKE00T1NBX05VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsNCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmaW5hbE91dHB1dEJ1ZmZlcik7DQorICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsNCiAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyPSBNNE9TQV9OVUxMOw0KICAgICB9DQogICAgIGlmKE00T1NBX05VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgew0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRlbXBPdXRwdXRCdWZmZXIpOw0KKyAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsNCiAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBNNE9TQV9OVUxMOw0KICAgICB9DQogICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7DQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaAppbmRleCBkNjMxMmNjLi5mYTkyN2I3IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaApAQCAtOTcsNyArOTcsNyBAQAogeyBcCiAgICAgaWYoTTRPU0FfTlVMTCAhPSAocCkpIFwKICAgICB7IFwKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwKSkgOyBcCisgICAgICAgIGZyZWUoKHApKSA7IFwKICAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKICAgICB9IFwKIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzRlYTNhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgICAgICAgTFZfVHlwZXMuaAotKiBAYnJpZWYgICAgVHlwZXMgZGVmaW5pdGlvbiBmb3IgU21hcnRwaG9uZSB0ZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWX1RZUEVTX0gKLSNkZWZpbmUgTFZfVFlQRVNfSAotCi0vKi0tLS0tLS0tLS0tLSovCi0vKiAgICBJTkNMVURFUyAgKi8KLS8qLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgIENIQVJBQ1RFUiBFTkNPRElORyBDT05WRVJTSU9OIEZDVFMgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBNNE9TQV9VSW50MzIgKCpMVl9mcm9tVVRGOFRvTmF0aXZlX0ZjdCkoY29uc3QgTTRPU0FfQ2hhciogcFN0YXJ0LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqKiBwT3V0KTsKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgZnJvbSBVVEY4IGZvcm1hdCB3aGljaCBpcyB0aGUgZGVmYXVsdAotKiAgICAgICAgICAgIGVuY29kaW5nIGluIHRoZSBlbmdpbmVzIGFuZCBhcHBsaWNhdGlvbiBsb2dpY3MgdG8gdGhlIGNoYXJhY3RlciBlbmNvZGluZwotKiAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT1Mgb3IgcGxhdGZvcm0uIFRoZSBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgd2l0aGluIHRoaXMKLSogICAgICAgICAgICBmdW5jdGlvbiBhbmQgdGhlbiwgY2FsbGVyIHdpbGwgaGF2ZSB0byBmcmVlICp0YXJnZXRTdGFydCB0aGFua3MgdG8gTTRPU0FfZnJlZS4KLSogICAgICAgICAgICBCb3RoIHN0cmluZ3MgbXVzdCBiZSBOVUxMLXRlcm1pbmF0ZWVkLgotKiBAcGFyYW0gICAgcFN0YXJ0ICAgICAgICAoSU4pOiAgICBTdHJpbmcgdG8gY29udmVydC4KLSogQHBhcmFtICAgIHBPdXQgICAgICAgIChPVVQpOiAgICBUaGlzIHBvaW50ZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhpcyBmdW5jdGlvbi4gSXQgY29udGFpbnMgdGhlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udmVydGVkIHRvIHRoZSBuYXRpdmUgZm9ybWF0LgotKiBAcmV0dXJuICAgIFN1Y2Nlc3M6IFNpemUgaW4gYnl0ZXMgYWxsb2NhdGVkIGluY2x1ZGluZyB0aGUgTlVMTCBjaGFyYWN0ZXIuIEZhaWx1cmU6IDAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyICgqTFZfZnJvbVVURjhUb05hdGl2ZV9GY3QpKGNvbnN0IE00T1NBX0NoYXIqIHBTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqKiBwT3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBNNE9TQV9VSW50MzIgKCpMVl9mcm9tTmF0aXZlVG9VVEY4X0ZjdCkoY29uc3QgTTRPU0FfQ2hhciogcFN0YXJ0LAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqKiB0YXJnZXRTdGFydCk7Ci0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RyaW5nIGluIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IHRoZQotKiAgICAgICAgICAgIE9TIG9yIHBsYXRmb3JtIHRvIGZyb20gVVRGOCBmb3JtYXQgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaW4gdGhlCi0qICAgICAgICAgICAgZW5naW5lcyBhbmQgYXBwbGljYXRpb24gbG9naWNzLiBUaGUgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkIHdpdGhpbiB0aGlzCi0qICAgICAgICAgICAgZnVuY3Rpb24gYW5kIHRoZW4sIGNhbGxlciB3aWxsIGhhdmUgdG8gZnJlZSAqdGFyZ2V0U3RhcnQgdGhhbmtzIHRvIE00T1NBX2ZyZWUuCi0qICAgICAgICAgICAgQm90aCBzdHJpbmdzIG11c3QgYmUgTlVMTC10ZXJtaW5hdGVlZC4KLSogQHBhcmFtICAgIHBTdGFydCAgICAgICAgKElOKTogICAgU3RyaW5nIHRvIGNvbnZlcnQuCi0qIEBwYXJhbSAgICBwT3V0ICAgICAgICAoT1VUKTogICAgVGhpcyBwb2ludGVyIHdpbGwgYmUgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24uIEl0IGNvbnRhaW5zIHRoZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnZlcnRlZCB0byBVVEY4IGZvcm1hdC4KLSogQHJldHVybiAgICBTdWNjZXNzOiBTaXplIGluIGJ5dGVzIGFsbG9jYXRlZCBpbmNsdWRpbmcgdGhlIE5VTEwgY2hhcmFjdGVyLiBGYWlsdXJlOiAwCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIE00T1NBX1VJbnQzMiAoKkxWX2Zyb21OYXRpdmVUb1VURjhfRmN0KShjb25zdCBNNE9TQV9Wb2lkKiogcFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBPdXQpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qLS0tICBMVl9UWVBFU19IIC0tLSovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaAppbmRleCBiNTFhZjIzLi5hYmQ2YzlmIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKQEAgLTU1LDQ2ICs1NSw5IEBACiBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nock5Db3B5ICAgICAgICAgIChNNE9TQV9DaGFyICAgKnN0ck91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbjJDb3B5KTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyTkNhdCAgICAgICAgICAgKE00T1NBX0NoYXIgICAqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuMkFwcGVuZCk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockNvbXBhcmUgICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICAqY21wUmVzdWx0KTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyTkNvbXBhcmUgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbjJDb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAgKmNtcFJlc3VsdCk7CiBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbCAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgICpyZXN1bHQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJGaW5kQ2hhciAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnBvaW50ZXJJblN0cik7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclJldmVyc2VGaW5kQ2hhcihNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqcG9pbnRlckluU3RyKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyU3BhbiAgICAgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZGVsaW1pdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwb3NJblN0cik7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNwYW5Db21wbGVtZW50IChNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmRlbGltaXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcG9zSW5TdHIpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJQYnJrICAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpkZWxpbWl0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipwb2ludGVySW5TdHIpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJGaW5kUGF0dGVybiAgICAoTTRPU0FfQ2hhciAgICpzdHJJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipwb2ludGVySW5TdHIxKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9VSW50MzIgTTRPU0FfY2hyTGVuZ3RoICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4pOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0NoYXIgICBNNE9TQV9jaHJUb0xvd2VyICAgICAoTTRPU0FfQ2hhciAgIGNJbik7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfQ2hhciAgIE00T1NBX2NoclRvVXBwZXIgICAgIChNNE9TQV9DaGFyICAgY0luKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgICAgTTRPU0FfY2hyR2V0V29yZCAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqYmVnaW5EZWxpbWl0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmVuZERlbGltaXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqb3V0cHV0UG9pbnRlcik7CiBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQzMiAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LApAQCAtMTAzLDM3ICs2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQ4ICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ2NCAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50NjQgICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0SW50MzIgICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldEludDE2ICAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAgKnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ4ICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCAgICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RG91YmxlICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRUaW1lICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSAgICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7CiBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQWNjZXNzLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OWE5ODEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUFjY2Vzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000T1NBX0ZJTEVBQ0VTU19IX18KLSNkZWZpbmUgX19NNE9TQV9GSUxFQUNFU1NfSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgIE00T1NBX0ZpbGVQdHJGY3QKLSAqIEBicmllZiAgICAgICAgRGVmaW5lcyB0aGUgYXZhaWxhYmxlIGZ1bmN0aW9ucyBmb3IgRmlsZSByZWFkL3dyaXRlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00T1NBX0ZJTEVJTlRFUkZBQ0VfUkFNLAotICAgIE00T1NBX0ZJTEVJTlRFUkZBQ0VfRkZTLAotICAgIE00T1NBX0ZJTEVJTlRFUkZBQ0VfT1BUSU1fRkZTCi0KLX0gTTRPU0FfRmlsZUludGVyZmFjZV90OwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVyOyAgICAvKio8IFBvaW50ZXIgdG8gZmlsZSB3cml0ZXIgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICAgKnBGaWxlUmVhZGVyOyAgICAvKio8IFBvaW50ZXIgdG8gZmlsZSByZWFkZXIgZnVuY3Rpb25zICovCi19IE00T1NBX0ZpbGVQdHJGY3Q7Ci0KLS8qU2VtYXBob3JlIGZvciBoYW5kbGluZyBvZiBSL1cgYWNjZXNzKi8KLWV4dGVybiBNNE9TQV9Db250ZXh0ICAgIE00T1NBX0ZpbGVJbnRlcmZhY2VfUldzZW1hcGhvcmU7IC8qZGVmaW5lZCBpbiBNNE9TQV9GaWxlSW50ZXJmYWNlLmMqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZ1bmMgICAgICAgICBNNF9GaWxlSW50ZXJmYWNlX3h4eAotICogQGJyaWVmICAgICAgICBNYW5hZ2UgdGhlIGludGVyZmFjZSBwb2ludGVycyBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9GaWxlUHRyRmN0KiBNNF9GaWxlSW50ZXJmYWNlX0luaXRQb2ludGVyKHZvaWQpOwotTTRPU0FfRVJSIE00X0ZpbGVJbnRlcmZhY2VfU2VsZWN0UG9pbnRlcihNNE9TQV9GaWxlUHRyRmN0ICpwRmlsZUZjdFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZUludGVyZmFjZV90IG1vZGUpOwotTTRPU0FfVm9pZCBNNF9GaWxlSW50ZXJmYWNlX0ZyZWVQb2ludGVyKE00T1NBX0ZpbGVQdHJGY3QgKnBGaWxlRmN0UHRyKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW1fU2V0SW50ZXJmYWNlRkZTKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMqLwotCi0jZW5kaWYgLyogX19NNE9TQV9GSUxFQUNFU1NfSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDYWNoZS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiNGMyYmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVDYWNoZS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgIE9zYWwgRmlsZSBSZWFkZXIgYW5kIFdyaXRlciB3aXRoIGNhY2hlCi0gKiBAbm90ZSAgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZQotICogICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW0gYWNjZXNzIHdpdGggaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgdXNlZCB0bwotICogICAgICAgICAgICAgICAgICByZWFkIGFuZCB0byB3cml0ZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRUNBQ0hFX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNBQ0hFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVPcGVuX2NhY2hlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9jYWNoZSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19jYWNoZSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNlZWtfY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVTZXRPcHRpb25fY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZUZsdXNoX2NhY2hlKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLU00T1NBX0VSUiBNNE9TQV9maWxlQ2xvc2VfY2FjaGUoIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotCi0vKiBVc2VkIGluIFZBICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlX2NhY2hlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIE00T1NBX0ZJTEVDQUNIRV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmgKaW5kZXggNjYzYmU2Ni4uZWRhNjkyMSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaApAQCAtMzQsMjEgKzM0LDcgQEAKICNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgogCiAKLQotLyojZGVmaW5lIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVEKi8gLypNZWFucyBNNE9TQV9JbnQ2NCBpcyB1c2VkKi8KLQotI2lmbmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAotI2RlZmluZSBNNE9TQV9GSUxFX1BPU18zMl9CSVRTX1NVUFBPUlRFRCAgICAgLypNZWFucyBNNE9TQV9JbnQzMiBpcyB1c2VkKi8KLSNlbmRpZiAvKk00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVEKi8KLQotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAotdHlwZWRlZiBNNE9TQV9JbnQ2NCBNNE9TQV9GaWxlUG9zaXRpb247Ci0jZW5kaWYKLSNpZmRlZiBNNE9TQV9GSUxFX1BPU18zMl9CSVRTX1NVUFBPUlRFRAogdHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247Ci0jZW5kaWYKIAogLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlIGFjY2Vzcy4KICAqICBpZSwgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBvciB0byB3cml0ZSAgb3IKQEAgLTEyOSwxMDkgKzExNSw1IEBACiAjZGVmaW5lIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwNCkKIAogCi0jaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKLQotI2RlZmluZSBNNE9TQV9GUE9TX1NFVChmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDY0X1NFVChmcG9zX2EsIGZwb3NfYikKLQotI2RlZmluZSBNNE9TQV9GUE9TX0FERChmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpXAotICAgICAgICBNNE9TQV9JTlQ2NF9BREQoZnBvc19yZXN1bHQsIGZwb3NfYSwgZnBvc19iKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfU1VCKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDY0X1NVQihmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKGZwb3Nfb3V0LCBmcG9zX2luLCBpMzJfaW4pXAotICAgICAgeyBNNE9TQV9JbnQ2NCBpNjRfaW47XAotICAgICAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKGk2NF9pbiwgaTMyX2luKTtcCi0gICAgICAgIE00T1NBX0lOVDY0X0FERChmcG9zX291dCwgZnBvc19pbiwgaTY0X2luKTsgfQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfU1VCX0NPTlNUX1VJTlQzMihmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKVwKLSAgICAgIHsgTTRPU0FfSW50NjQgaTY0X2luO1wKLSAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMihpNjRfaW4sIGkzMl9pbik7XAotICAgICAgICBNNE9TQV9JTlQ2NF9TVUIoZnBvc19vdXQsIGZwb3NfaW4sIGk2NF9pbik7IH0KLQotI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9ESVZJU0lPTihmcG9zX3Jlc3VsdCwgZnBvc19hLCBpMzJfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQ2NF9TQ0FMQVJfRElWSVNJT04oZnBvc19yZXN1bHQsIGZwb3NfYSwgaTMyX3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfQ09NUEFSRShmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDY0X0NPTVBBUkUoZnBvc19hLCBmcG9zX2IpCi0KLSNkZWZpbmUgTTRPU0FfRklMRV9QT1NJVElPTl9UT19JTlQoZnBvcywgaXBvcylcCi0gICAgICAgIE00T1NBX0lOVDY0X1NFVChpcG9zLCBmcG9zKQotCi0jZGVmaW5lIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKGlwb3MsIGZwb3MpXAotICAgICAgICBNNE9TQV9GUE9TX1NFVChmcG9zLCBpcG9zKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfSVNfUE9TSVRJVkUoZnBvc192YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDY0X0lTX1BPU0lUSVZFKGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQ2NF9ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQ2NF9BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19MRUZUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKLSAgICAgICAgTTRPU0FfSU5UNjRfTEVGVF9TSElGVChmcG9zX3Jlc3VsdCwgZnBvc192YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKLQotI2RlZmluZSBNNE9TQV9GUE9TX1JJR0hUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKLSAgICAgICAgTTRPU0FfSU5UNjRfUklHSFRfU0hJRlQoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUsIHVpMzJfbmJQb3NpdGlvbnMpCi0KLSNlbmRpZgotCi0jaWZkZWYgTTRPU0FfRklMRV9QT1NfMzJfQklUU19TVVBQT1JURUQKLQotI2RlZmluZSBNNE9TQV9GUE9TX1NFVChmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDMyX1NFVChmcG9zX2EsIGZwb3NfYikKLQotI2RlZmluZSBNNE9TQV9GUE9TX0FERChmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpXAotICAgICAgICBNNE9TQV9JTlQzMl9BREQoZnBvc19yZXN1bHQsIGZwb3NfYSwgZnBvc19iKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfU1VCKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDMyX1NVQihmcG9zX3Jlc3VsdCwgZnBvc19hLCBmcG9zX2IpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKGZwb3Nfb3V0LCBmcG9zX2luLCBpMzJfaW4pXAotICAgICAgICBNNE9TQV9GUE9TX0FERChmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfU1VCX0NPTlNUX1VJTlQzMihmcG9zX291dCwgZnBvc19pbiwgaTMyX2luKVwKLSAgICAgICAgTTRPU0FfRlBPU19TVUIoZnBvc19vdXQsIGZwb3NfaW4sIGkzMl9pbikKLQotI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX1NDQUxBUl9QUk9EVUNUKGZwb3NfcmVzdWx0LCBmcG9zX2EsIGkzMl92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9GUE9TX1NDQUxBUl9ESVZJU0lPTihmcG9zX3Jlc3VsdCwgZnBvc19hLCBpMzJfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQzMl9TQ0FMQVJfRElWSVNJT04oZnBvc19yZXN1bHQsIGZwb3NfYSwgaTMyX3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfQ09NUEFSRShmcG9zX2EsIGZwb3NfYilcCi0gICAgICAgIE00T1NBX0lOVDMyX0NPTVBBUkUoZnBvc19hLCBmcG9zX2IpCi0KLSNkZWZpbmUgTTRPU0FfRklMRV9QT1NJVElPTl9UT19JTlQoZnBvcywgaXBvcylcCi0gICAgICAgIE00T1NBX0lOVDMyX1NFVChpcG9zLCBmcG9zKQotCi0jZGVmaW5lIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKGlwb3MsIGZwb3MpXAotICAgICAgICBNNE9TQV9GUE9TX1NFVChmcG9zLCBpcG9zKQotCi0jZGVmaW5lIE00T1NBX0ZQT1NfSVNfUE9TSVRJVkUoZnBvc192YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX0lTX1BPU0lUSVZFKGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQzMl9ORUcoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQzMl9BQlMoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfRlBPU19MRUZUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfTEVGVF9TSElGVChmcG9zX3Jlc3VsdCwgZnBvc192YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKLQotI2RlZmluZSBNNE9TQV9GUE9TX1JJR0hUX1NISUZUKGZwb3NfcmVzdWx0LCBmcG9zX3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfUklHSFRfU0hJRlQoZnBvc19yZXN1bHQsIGZwb3NfdmFsdWUsIHVpMzJfbmJQb3NpdGlvbnMpCi0KLSNlbmRpZgotCi0KLQogI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAppbmRleCBmMzA2NGE3Li4yNjEwNzBmIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApAQCAtNDYsMTIgKzQ2LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF9yZWFkOwogICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3dyaXRlOwotI2lmZGVmIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVECi0gICAvKiogVGhlIGZpbGUgaGFuZGxlciAqLwotICAgTTRPU0FfSW50MzIgICAgICAgICAgZmlsZV9kZXNjOwotI2Vsc2UKICAgIEZJTEUqICAgICAgICAgICAgICAgIGZpbGVfZGVzYzsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRCAqLwogICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBVUkwgKi8KICAgIE00T1NBX0NoYXIqICAgICAgICAgIHVybF9uYW1lOwogICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlRXh0cmEuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVFeHRyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzliYWMyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVFeHRyYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQGZpbGUgICAgICAgIE00T1NBX0ZpbGVFeHRyYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBAaW5ncm91cCAgICAgT1NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVfRVhUUkFfSAotI2RlZmluZSBNNE9TQV9GSUxFX0VYVFJBX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0vKiBzaXplIG9mIHRoZSBjb3B5IGJ1ZmZlciAoaW4gYnl0ZXMpIGZvciBNNE9TQV9maWxlRXh0cmFDb3B5ICovCi0jZGVmaW5lIEJVRkZFUl9DT1BZX1NJWkUgMTAyNAotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE9TQV9UeXBlSW52YWxpZCA9IDAsCi0gICAgTTRPU0FfVHlwZUZpbGUsCi0gICAgTTRPU0FfVHlwZURpcgotfSBNNE9TQV9FbnRyeVR5cGU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFEZWxldGUoY29uc3QgTTRPU0FfQ2hhciogdXJsKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNvcHkoTTRPU0FfQ2hhciogc3JjVXJsLCBNNE9TQV9DaGFyKiBkc3RVcmwpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhUmVuYW1lKE00T1NBX0NoYXIqIHNyY1VybCwgTTRPU0FfQ2hhciogZHN0VXJsKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXIoY29uc3QgTTRPU0FfQ2hhciogdXJsKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNyZWF0ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYVJlbW92ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKLQotTTRPU0FfVUludDMyIE00T1NBX2ZpbGVFeHRyYUdldEZyZWVTcGFjZShjb25zdCBNNE9TQV9DaGFyKiBwVXJsKTsKLQotTTRPU0FfVUludDMyIE00T1NBX2ZpbGVFeHRyYUdldFRvdGFsU3BhY2UoY29uc3QgTTRPU0FfQ2hhciogcFVybCk7Ci0KLU00T1NBX0VudHJ5VHlwZSBNNE9TQV9maWxlRXh0cmFHZXRUeXBlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfRmlsZVBvc2l0aW9uIGxlbmd0aCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRV9FWFRSQV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlclJhbS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlclJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDgwMTkyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJSYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclJhbS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSAiZmlsZSIgc3RvcmVkIGluIFJBTS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJSQU1fSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSUkFNX0gKLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRGSV9GaWxlUmVhZGVyUmFtX0Rlc2NyaXB0b3IKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSBkZXNjcmlwdG9yIChwdWJsaWMpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSB0aGUgcG9pbnRlciB0byB0aGUgZGF0YSBpbiBtZW1vcnkKLSAqIEBub3RlICAgICAgICBhbmQgaXRzIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBGaWxlRGVzYzsgICAgLyogUG9pbnRlciBvbiBmaWxlIGRhdGEgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgZGF0YVNpemU7ICAgIC8qIFNpemUgb2YgZGF0YSAqLwotfSBNNE9TQV9GaWxlUmVhZGVyUmFtX0Rlc2NyaXB0b3I7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLS8qIHJlYWRlciBBUEkgOiBSQU0gZnVuY3Rpb25zICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1PcGVuKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MgKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbURhdGEoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtU2VlayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtQ2xvc2UoIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtR2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1TZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVJFQURFUlJBTV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlclJhbS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlclJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzE5YTA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJSYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclJhbS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIgdG8gUkFNCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byB3cml0ZSBhICJmaWxlIiBpbiBSQU0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUlJBTV9ICi0jZGVmaW5lIE00T1NBX0ZJTEVXUklURVJSQU1fSAotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fRGVzY3JpcHRvcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIGRlc2NyaXB0b3IgKHB1YmxpYykKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwb2ludGVyIHRvIHRoZSBkYXRhIGluIG1lbW9yeQotICogQG5vdGUgICAgICAgIGFuZCBpdHMgc2l6ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEZpbGVEZXNjOyAgICAvKiBQb2ludGVyIG9uIGZpbGUgZGF0YSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBkYXRhU2l6ZTsgICAgLyogU2l6ZSBvZiBkYXRhICovCi19IE00T1NBX0ZpbGVXcml0ZXJSYW1fRGVzY3JpcHRvcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyogV3JpdGVyIEFQSSA6IFJBTSBmdW5jdGlvbnMgKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1PcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtRGF0YShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIFNpemUpOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbVNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1GbHVzaChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbVNldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIE9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIE9wdGlvblZhbHVlKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1HZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVdSSVRFUlJBTV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaAppbmRleCBkMGJiNDljLi5kODBmZmY2IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaAorKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaApAQCAtMzksMjYgKzM5LDEwIEBACiB7CiAjZW5kaWYKIAotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfTWVtQWRkcjMyIE00T1NBX21hbGxvYyAoTTRPU0FfVUludDMyIHNpemUsCitNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9NZW1BZGRyMzIgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIChNNE9TQV9VSW50MzIgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpOwogCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9Wb2lkICBNNE9TQV9mcmVlICAgKE00T1NBX01lbUFkZHIzMiBhZGRyZXNzKTsKLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfVm9pZCBNNE9TQV9tZW1zZXQgKE00T1NBX01lbUFkZHI4IGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdmFsdWUpOwotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9Wb2lkIE00T1NBX21lbWNweSAoTTRPU0FfTWVtQWRkcjggb3V0cHV0QmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGlucHV0QmxvY2ssIE00T1NBX1VJbnQzMiBzaXplKTsKLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfTWVtQWRkcjggTTRPU0FfbWVtbW92ZShNNE9TQV9NZW1BZGRyOCBvdXRwdXRCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBpbnB1dEJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfSW50MzIgTTRPU0FfbWVtY21wIChNNE9TQV9NZW1BZGRyOCBhZGRyZXNzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYWRkcmVzczIsIE00T1NBX1VJbnQzMiBzaXplKTsKLQogTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KHZvaWQpOwogCiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1N0cmluZy5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmY2Y0ZWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TdHJpbmcuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIHB1YmxpYyBkZWZpbml0aW9uIGZvciBzdHJpbmcgbGlicmFyeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfTTRPU0FfU1RSSU5HX0hfCi0jZGVmaW5lIF9NNE9TQV9TVFJJTkdfSF8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0KLQotdHlwZWRlZiB2b2lkKiBNNE9TQV9TdHJpbmc7Ci0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa3N0ckFsbCA9IDAsCi0gICBNNE9TQV9rc3RyQmVnaW4sCi0gICBNNE9TQV9rc3RyRW5kCi19IE00T1NBX3N0ck1vZGU7Ci0KLS8qIHR5cGVzIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa3N0ckRlYyAgID0gTTRPU0Ffa2NockRlYywKLSAgIE00T1NBX2tzdHJIZXhhICA9IE00T1NBX2tjaHJIZXhhLAotICAgTTRPU0Ffa3N0ck9jdCAgID0gTTRPU0Ffa2Nock9jdAotfSBNNE9TQV9zdHJOdW1CYXNlOwotCi0vKiBFcnJvciBhbmQgV2FybmluZ3MgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfU1RSX0JBRF9TVFJJTkcgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX1NUUklORywweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfU1RSX0NPTlZfRkFJTEVEICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX1NUUklORywweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfU1RSX09WRVJGTE9XICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX1NUUklORywweDAwMDAwMykKLSNkZWZpbmUgTTRFUlJfU1RSX0JBRF9BUkdTICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX1NUUklORywweDAwMDAwNCkKLQotI2RlZmluZSBNNFdBUl9TVFJfT1ZFUkZMT1cgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfU1RSSU5HLDB4MDAwMDAxKQotI2RlZmluZSBNNFdBUl9TVFJfTk9UX0ZPVU5EICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRPU0FfU1RSSU5HLDB4MDAwMDAyKQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyQ3JlYXRlKCAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcqIHBzdHIpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJSZXNldCggICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJEZXN0cm95KCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRDaGFyQ29udGVudCggICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBwY2hhcik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldENoYXJDb250ZW50KCAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiBwcGNoYXIpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRDaGFyKCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIGMpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRDaGFyKCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBwYyk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldEludDgoICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQ4KCAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4KiBwaTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRVSW50OCggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50OCggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcHVpOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldEludDE2KCAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2IGkxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldEludDE2KCAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2KiBwaTE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0VUludDE2KCAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHVpMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50MTYoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIHB1aTE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50MzIoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0SW50MzIoICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBpMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRVSW50MzIoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldFVJbnQzMiggICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXREb3VibGUoICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Eb3VibGUgZCk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldERvdWJsZSggICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcGQpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTZXRJbnQ2NCggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ2NCBpNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQ2NCggICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ2NCogcGk2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldEZpbGVQb3NpdGlvbiggICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0RmlsZVBvc2l0aW9uKCAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwZnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldFRpbWUoICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldFRpbWUoICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUqIHB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyR2V0TGVuZ3RoKCAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwdWkzMik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clRydW5jYXRlKCAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aCk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNvcHkoICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfb3V0KTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyQ29weVN1YlN0ciggICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHVpMzJfbnVtKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyQ29uY2F0KCAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9zZWNvbmQpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJJbnNlcnRTdWJTdHIoICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfbnVtKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyQ29tcGFyZSggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBpMzJfcmVzdWx0KTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciggICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNhc2VDb21wYXJlKCAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyKCAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9vZmZzZXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcGkzMl9yZXN1bHQpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTcGFuKCAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9yZXN1bHQpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJTcGFuQ29tcGxlbWVudCggICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJGaW5kRmlyc3RDaGFyKCAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3Bvcyk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRMYXN0Q2hhciggICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyKCAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJGaW5kTGFzdFN1YlN0ciggICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3Bvcyk7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldEZpcnN0VG9rZW4oICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfZGVsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgcHN0cl90b2tlbik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckdldExhc3RUb2tlbiggICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfZGVsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgcHN0cl90b2tlbik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldFVwcGVyQ2FzZSggICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0clNldExvd2VyQ2FzZSggICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cik7Ci0KLU00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3N0ckRlbFN1YlN0ciggICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogdWkzMl9udW0pOwotCi1NNE9TQUxfU1RSSU5HX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zdHJSZXBsYWNlU3ViU3RyKCAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX29sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfbmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU3ByaW50ZiggICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKLQotTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc3RyU2V0TWluQWxsb2NhdGlvblNpemUoICBNNE9TQV9TdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfc2l6ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TdHJpbmdfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU3RyaW5nX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzMwM2MxZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TdHJpbmdfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU3RyaW5nLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBwdWJsaWMgZGVmaW5pdGlvbiBmb3Igc3RyaW5nIGxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9NNE9TQV9TVFJJTkdfUFJJVl9ICi0jZGVmaW5lIF9NNE9TQV9TVFJJTkdfUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfU3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8qIHN0cmluZyBpZGVudGlmaWFudCAqLwotICAgTTRPU0FfVUludDMyICAgY29yZUlEOwotICAgLyoqIGRhdGEgYnVmZmVyICovCi0gICBNNE9TQV9DaGFyKiBwdWk4X2J1ZmZlcjsKLSAgIC8qKiBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgKi8KLSAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemU7Ci0gICAvKiogc2l6ZSBvZiB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLSAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKLX0gTTRPU0Ffc3RyU3RydWN0OwotCi0KLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZWFsbG9jKCAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpOwotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KCAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9zdHJQcml2U2V0KCAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcGNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpOwotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSggICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqKiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyKTsKLQotTTRPU0FfSW50MzIgTTRPU0Ffc3RyUHJpdkZpbmRMYXN0U3ViU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zKTsKLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBuYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBubGVuZ3RoKTsKLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIoICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0ciggICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyKCAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKTsKLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZTUHJpbnRmKCAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IG1hcmtlcik7Ci0KLQotI2RlZmluZSBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZiwgc3RyaW5nKVwKLSAgIGlmKGJ1ZmYgPT0gTTRPU0FfTlVMTClcCi0gICB7XAotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsIHN0cmluZyk7XAotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DO1wKLSAgIH1cCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaAppbmRleCA5ODRjMjQzLi43MzdlYmFkIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oCkBAIC0zMywxMzIgKzMzLDE3IEBACiAjaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKIAogCi10eXBlZGVmIE00T1NBX0ludDY0ICAgTTRPU0FfVGltZTsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgTTRPU0FfVGltZTsKIAogCiAvKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KLSNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECi0gICAjZGVmaW5lIE00T1NBX1RJTUVfU0VUX1VOS05PV04odGltZSkge3RpbWUgPSAweDgwMDAwMDAwMDAwMDAwMDBMTCA7fQotI2VuZGlmIC8qIE00T1NBXzY0QklUU19TVVBQT1JURUQgKi8KIAotI2lmZGVmIE00T1NBXzY0QklUU19DT1VQTEVfSU5UCi0gICAjZGVmaW5lIE00T1NBX1RJTUVfU0VUX1VOS05PV04odGltZSkge1wKLSAgICAgIHRpbWUubWFqb3IgPSAweDgwMDAwMDAwIDtcCi0gICAgICB0aW1lLm1pbm9yID0gMHgwMDAwMDAwMCA7fQotI2VuZGlmIC8qIE00T1NBXzY0QklUU19DT1VQTEVfSU5UICovCi0KLSNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAotICAgI2RlZmluZSBNNE9TQV9USU1FX1NFVF9VTktOT1dOKHRpbWUpIHt0aW1lID0gMHg4MDAwMDAwMDt9Ci0jZW5kaWYgICAvKiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCAqLwotCi0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgcHJvdmlkZWQgdGltZSBpcyBzZXQgdG8gdW5rbm93biB0aW1lLAotICAgIGFuZCAwIGVsc2UuKi8KLSNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECi0KLSNkZWZpbmUgTTRPU0FfVElNRV9JU19VTktOT1dOKHRpbWUpICgoKE00T1NBX1VJbnQ2NCkodGltZSkgPT0gMHg4MDAwMDAwMDAwMDAwMDAwTEwpID8gMSA6IDApCi0KLSNlbGlmIGRlZmluZWQgTTRPU0FfNjRCSVRTX0NPVVBMRV9JTlQKLQotI2RlZmluZSBNNE9TQV9USU1FX0lTX1VOS05PV04odGltZSlcCi0gICAoKCAoTTRPU0FfSU5UNjRfR0VUX0hJR0gzMih0aW1lKSA9PSBNNE9TQV91bmtub3duVGltZU1ham9yKVwKLSAgICAgICYmKE00T1NBX0lOVDY0X0dFVF9MT1czMih0aW1lKSA9PSBNNE9TQV91bmtub3duVGltZU1pbm9yKSApID8gMTowKQotCi0jZWxzZSAvKiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCAqLwotCi0jZGVmaW5lIE00T1NBX1RJTUVfSVNfVU5LTk9XTih0aW1lKSAoKChNNE9TQV9VSW50MzIpKHRpbWUpID09IDB4ODAwMDAwMDApID8gMSA6IDApCi0KLSNlbmRpZgotCi0KLS8qKiBUaGlzIG1hY3JvIGFmZmVjdHMgdGltZTIgdG8gdGltZTEuKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9TRVQodGltZTEsIHRpbWUyKVwKLSAgICAgICAgTTRPU0FfSU5UNjRfU0VUKHRpbWUxLCB0aW1lMikKLQotCi0vKiogVGhpcyBtYWNybyBzZXRzIHRpbWUgZnJvbSBpMzIuKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9GUk9NX0lOVDMyKHRpbWUsIGkzMilcCi0gICAgICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIodGltZSwgaTMyKQotCi0KLS8qKiBUaGlzIG1hY3JvIHNldHMgdGltZSBmcm9tIGkzMiB1aTMyLiovCi0jZGVmaW5lIE00T1NBX1RJTUVfRlJPTV9JTlQzMl9VSU5UMzIodGltZSwgaTMyLCB1aTMyKVwKLSAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMl9VSU5UMzIodGltZSwgaTMyLCB1aTMyKQotCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRpbWUgaXMgcG9zaXRpdmUqLwotI2RlZmluZSBNNE9TQV9USU1FX0lTX1BPU0lUSVZFKHRpbWUpXAotICAgICAgICBNNE9TQV9JTlQ2NF9JU19QT1NJVElWRSh0aW1lKQotCi0KLS8qKiBUaGlzIG1hY3JvIHNldHMgdGltZV9vdXQgPSAtdGltZV9pbiovCi0jZGVmaW5lIE00T1NBX1RJTUVfTkVHKHRpbWVfb3V0LCB0aW1lX2luKVwKLSAgICAgICAgTTRPU0FfSU5UNjRfTkVHKHRpbWVfb3V0LCB0aW1lX2luKQotCi0KLS8qKiBUaGlzIG1hY3JvIHNldHMgdGltZV9vdXQgPSB8dGltZV9pbnwqLwotI2RlZmluZSBNNE9TQV9USU1FX0FCUyh0aW1lX291dCwgdGltZV9pbilcCi0gICAgICAgIE00T1NBX0lOVDY0X0FCUyh0aW1lX291dCwgdGltZV9pbikKLQotCi0vKiogVGhpcyBtYWNybyBhZGRzIHRoZSAyIHByb3ZpZGVkIHRpbWVzICh0aW1lMSBhbmQgdGltZTIpLAotICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuIEJvdGggdGltZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHRpbWVzY2FsZS4qLwotI2RlZmluZSBNNE9TQV9USU1FX0FERChyZXN1bHQsIHRpbWUxLCB0aW1lMilcCi0gICAgICAgIE00T1NBX0lOVDY0X0FERChyZXN1bHQsIHRpbWUxLCB0aW1lMikKLQotCi0vKiogVGhpcyBtYWNybyBzdWJzIHRoZSAyIHByb3ZpZGVkIHRpbWVzICh0aW1lMSBhbmQgdGltZTIpLAotICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9TVUIocmVzdWx0LCB0aW1lMSwgdGltZTIpXAotICAgICAgICBNNE9TQV9JTlQ2NF9TVUIocmVzdWx0LCB0aW1lMSwgdGltZTIpCi0KLQotLyoqIFRoaXMgbWFjcm8gZG9lcyBhIHNjYWxhciBwcm9kdWN0IChyZXN1bHQgPSB0aW1lKnZhbHVlKSwKLSAgICBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW4gcmVzdWx0LiovCi0jZGVmaW5lIE00T1NBX1RJTUVfU0NBTEFSX1BST0RVQ1QocmVzdWx0LCB0aW1lLCB2YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKHJlc3VsdCwgdGltZSwgdmFsdWUpCi0KLQotLyoqIFRoaXMgbWFjcm8gZG9lcyBhIHNjYWxhciBkaXZpc2lvbiAocmVzdWx0PSB0aW1lIC8gdmFsdWUpLAotICAgIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiByZXN1bHQuKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9TQ0FMQVJfRElWSVNJT04ocmVzdWx0LCB0aW1lLCB2YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihyZXN1bHQsIHRpbWUsIHZhbHVlKQotCi0KLS8qKiBUaGlzIG1hY3JvIHVwZGF0ZXMgdGhlIHRpbWUgdG8gdGhlIG9sZFRpbWVTY2FsZSB0byB0aGUgbmV3VGltZVNjYWxlLiBUaGUKLSAgICByZXN1bHQgKHRoZSBuZWFyZXN0IHJvdW5kZWQgdG8gdGhlIG1pbiB2YWx1ZSkgaXMgc3RvcmVkIGluIHJlc3VsdCB2YWx1ZS4gKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9DSEFOR0VfVElNRVNDQUxFKHJlc3VsdCwgdGltZSwgb2xkVGltZVNjYWxlLCBuZXdUaW1lU2NhbGUpXAotICAgICAgeyBNNE9TQV9UaW1lIHRfdGVtcFRpbWUxLCB0X3RlbXBUaW1lMiwgdF90ZW1wVGltZTM7XAotICAgICAgICBNNE9TQV9JbnQzMiBpMzJfcXVvdGllbnQgPSBuZXdUaW1lU2NhbGUvb2xkVGltZVNjYWxlO1wKLSAgICAgICAgTTRPU0FfSW50MzIgaTMyX3Jlc3QgPSBuZXdUaW1lU2NhbGUlb2xkVGltZVNjYWxlO1wKLSAgICAgICAgTTRPU0FfSU5UNjRfU0NBTEFSX1BST0RVQ1QodF90ZW1wVGltZTEsIHRpbWUsIGkzMl9xdW90aWVudCk7XAotICAgICAgICBNNE9TQV9JTlQ2NF9TQ0FMQVJfUFJPRFVDVCh0X3RlbXBUaW1lMiwgdGltZSwgaTMyX3Jlc3QpO1wKLSAgICAgICAgTTRPU0FfSU5UNjRfU0NBTEFSX0RJVklTSU9OKHRfdGVtcFRpbWUzLCB0X3RlbXBUaW1lMiwgb2xkVGltZVNjYWxlKTtcCi0gICAgICAgIE00T1NBX0lOVDY0X0FERChyZXN1bHQsIHRfdGVtcFRpbWUxLCB0X3RlbXBUaW1lMyk7IH0KLQotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyB0aGUgMiBwcm92aWRlZCB0aW1lcyAodGltZTEgJiB0aW1lMikuCi0gICAgVGhlIHJlc3VsdCBpcyBlaXRoZXI6Ci0gICogQGFyZyAgMTogaWYgdGltZTEgaXMgYmlnZ2VyIHRoYW4gdGltZTIKLSAgKiBAYXJnICAwOiBpZiB0aW1lMiBpcyBlcXVhbCB0byB0aW1lMgotICAqIEBhcmcgLTE6IGlmIHRpbWUxIGlzIHNtYWxsZXIgdGhhbiB0aW1lMiAgKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9DT01QQVJFKHRpbWUxLCB0aW1lMilcCi0gICAgICAgIE00T1NBX0lOVDY0X0NPTVBBUkUodGltZTEsIHRpbWUyKQotCisjZGVmaW5lIE00T1NBX1RJTUVfVU5LTk9XTiAweDgwMDAwMDAwCiAKIC8qKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgdGltZSB3aXRoIGEgdGltZSBzY2FsZSB0byBtaWxsaXNlY29uZC4KICAgICBUaGUgcmVzdWx0IGlzIGEgTTRPU0FfRG91YmxlKi8KICNkZWZpbmUgTTRPU0FfVElNRV9UT19NUyhyZXN1bHQsIHRpbWUsIHRpbWVzY2FsZSlcCi0gICAgICB7IE00T1NBX0lOVDY0X1RPX0RPVUJMRShyZXN1bHQsIHRpbWUpO1wKLSAgICAgICAgcmVzdWx0ID0gKDEwMDAqcmVzdWx0KS8oKE00T1NBX0RvdWJsZSl0aW1lc2NhbGUpOyB9Ci0KLQotLyoqIFRoaXMgbWFjcm8gY29udmVydHMgYSBtaWxsaXNlY29uZCB0aW1lIHRvIE00T1NBX1RpbWUgd2l0aCB0aGUgcHJvdmlkZWQKLSAgICB0aW1lc2NhbGUuIFRoZSByZXN1bHQgKHRoZSBuZWFyZXN0IHJvdW5kZWQgdG8gdGhlIG1pbiB2YWx1ZSkgaXMgc3RvcmVkCi0gICAgaW4gdGltZSB2YWx1ZS4qLwotI2RlZmluZSBNNE9TQV9NU19UT19USU1FKHRpbWUsIHRpbWVzY2FsZSwgbXMpXAotICAgICAge000T1NBX0lOVDY0X0ZST01fRE9VQkxFKHRpbWUsIChtcyooKE00T1NBX0RvdWJsZSkodGltZXNjYWxlKSkvMTAwMC4wKSk7fQotCisgICAgICB7IHJlc3VsdCA9ICgxMDAwKihNNE9TQV9Eb3VibGUpdGltZSkvKChNNE9TQV9Eb3VibGUpdGltZXNjYWxlKTsgfQogCiAjZW5kaWYgLypNNE9TQV9USU1FX0gqLwogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaAppbmRleCAyNTBmMTMxLi4yZWU5NTY4IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKQEAgLTI5LDE1ICsyOSwxMyBAQAogI2RlZmluZSBNNE9TQV9UWVBFU19ICiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiTTRPU0FfRXhwb3J0LmgiCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qI2RlZmluZSBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICAgICAqLyAgLyogbWVhbnMgbG9uZyBsb25nIGlzIHVzZWQgICAgICAgICovCi0vKiNkZWZpbmUgTTRPU0FfNjRCSVRTX0NPVVBMRV9JTlQgICAgKi8gICAgLyogbWVhbnMgY291cGxlIGludDMyIGlzIHVzZWQgICAgKi8KLSNkZWZpbmUgTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQgICAgICAvKiBtZWFucyBJbnQzMiBpcyB1c2VkICAgICAgICAgICAgKi8KLQogCiB0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9Cb29sOwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUludDg7CkBAIC01NywzNSArNTUsNiBAQAogCiB0eXBlZGVmIHZvaWQgICAgICAgICAgICBNNE9TQV9Wb2lkOwogCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfSW50MzIgICBoaWdoOwotICAgTTRPU0FfSW50MzIgICBsb3c7Ci19IE00T1NBX0NvdXBsZUludDMyOwotCi0jaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE00T1NBX0ludDY0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgTTRPU0FfVUludDY0OwotI2VuZGlmCi0KLSNpZmRlZiBNNE9TQV82NEJJVFNfQ09VUExFX0lOVAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX0ludDMyIG1ham9yOwotICAgTTRPU0FfVUludDMyIG1pbm9yOwotfSBNNE9TQV9JbnQ2NDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBNNE9TQV9VSW50MzIgbWFqb3I7Ci0gICBNNE9TQV9VSW50MzIgbWlub3I7Ci19IE00T1NBX1VJbnQ2NDsKLSNlbmRpZgotCi0jaWZkZWYgTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQKLXR5cGVkZWYgTTRPU0FfSW50MzIgTTRPU0FfSW50NjQ7Ci10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE9TQV9VSW50NjQ7Ci0jZW5kaWYKLQogLyogTWluICYgbWF4IGRlZmluaXRpb25zKi8KICNkZWZpbmUgTTRPU0FfVUlOVDhfTUlOICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNNE9TQV9VSU5UOF9NQVggICAgICAgICAgICAgICAgMjU1CkBAIC0xMTEsMjIgKzgwLDYgQEAKICNkZWZpbmUgTTRPU0FfVUNIQVJfTUlOICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNNE9TQV9VQ0hBUl9NQVggICAgICAgICAgICAgICAgMjU1CiAKLSNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAotCi0jZGVmaW5lIE00T1NBX1VJTlQ2NF9NSU4gICAgICAgIE00T1NBX1VJTlQzMl9NSU4KLSNkZWZpbmUgTTRPU0FfVUlOVDY0X01BWCAgICAgICAgTTRPU0FfVUlOVDMyX01BWAotI2RlZmluZSBNNE9TQV9JTlQ2NF9NSU4gICAgICAgICAgTTRPU0FfSU5UMzJfTUlOCi0jZGVmaW5lIE00T1NBX0lOVDY0X01BWCAgICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLQotI2Vsc2UgLyogTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQqLwotCi0jZGVmaW5lIE00T1NBX1VJTlQ2NF9NSU4gICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDY0X01BWCAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRkxMCi0jZGVmaW5lIE00T1NBX0lOVDY0X01JTiAgICAgICAweDgwMDAwMDAwMDAwMDAwMDBMTAotI2RlZmluZSBNNE9TQV9JTlQ2NF9NQVggICAgICAgMHg3RkZGRkZGRkZGRkZGRkZGTEwKLQotI2VuZGlmIC8qIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVEKi8KLQogI2RlZmluZSBNNE9TQV9OVUxMICAgICAgICAgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBNNE9TQV9UUlVFICAgICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBNNE9TQV9GQUxTRSAgICAgICAgICAgICAgICAgICAgMHgwMApAQCAtMTQxLDIzNSArOTQsOSBAQAogCiB0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQ7CiAKLQogLyoqIEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ki8KIHR5cGVkZWYgIE00T1NBX1VJbnQxNiBNNE9TQV9Db3JlSUQ7CiAKLQotLyogTWFjcm8gdG8gc3VwcG9ydCBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuIHBsYXRmb3JtICovCi0KLS8qIHRvIHRyYW5zbGF0ZSBhIDE2IGJpdHMgdG8gaXRzIEJpZyBFbmRpYW4gdmFsdWUqLwotI2RlZmluZSBNNE9TQV9JTlQxNl9UT19CRSh1aTE2X2hvc3QpICgoKCh1aTE2X2hvc3QpICYgKE00T1NBX1VJbnQxNikgMHgwMGZmKSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWkxNl9ob3N0KSAmIChNNE9TQV9VSW50MTYpIDB4ZmYwMCkgPj4gOCkgKQotCi0vKiB0byB0cmFuc2xhdGUgYSAzMiBiaXRzIHRvIGl0cyBCaWcgRW5kaWFuIHZhbHVlICovCi0jZGVmaW5lIE00T1NBX0lOVDMyX1RPX0JFKHVpMzJfaG9zdCkgKCgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDAwMGZmKSA8PCAyNCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDBmZjAwKSA8PCAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweDAwZmYwMDAwKSA+PiAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfaG9zdCkgJiAoTTRPU0FfVUludDMyKSAweGZmMDAwMDAwKSA+PiAgMjQpKQotCi0vKiB0byB0cmFuc2xhdGUgYSA2NCBiaXRzIHRvIGl0cyBCaWcgRW5kaWFuIHZhbHVlICovCi0jZGVmaW5lIE00T1NBX0lOVDY0X1RPX0JFKHVpNjRfaG9zdCkgKCgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwMDAwMDAwMDAwMDAwZmYpIDw8IDU2KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwZmYwMCkgPDwgNDApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTY0X2hvc3QpICYgKE00T1NBX1VJbnQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwKSA8PCAyNCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwMDAwMDAwZmYwMDAwMDApIDw8ICA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwZmYwMDAwMDAwMCkgPj4gIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTY0X2hvc3QpICYgKE00T1NBX1VJbnQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwKSA+PiAyNCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfaG9zdCkgJiAoTTRPU0FfVUludDY0KSAweDAwZmYwMDAwMDAwMDAwMDApID4+IDQwKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWk2NF9ob3N0KSAmIChNNE9TQV9VSW50NjQpIDB4ZmYwMDAwMDAwMDAwMDAwMCkgPj4gNTYpKQotCi0vKiB0byB0cmFuc2xhdGUgYSBCaWcgRW5kaWFuIDE2IGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24gKi8KLSNkZWZpbmUgTTRPU0FfQkVfVE9fSU5UMTYodWkxNl9uZXQpICgoKCh1aTE2X25ldCkgJiAoTTRPU0FfVUludDE2KSAweDAwZmYpIDw8IDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMTZfbmV0KSAmIChNNE9TQV9VSW50MTYpIDB4ZmYwMCkgPj4gOCkgKQotCi0vKiB0byB0cmFuc2xhdGUgYSBCaWcgRW5kaWFuIDMyIGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24qLwotI2RlZmluZSBNNE9TQV9CRV9UT19JTlQzMih1aTMyX25ldCkgKCgoKHVpMzJfbmV0KSAmIChNNE9TQV9VSW50MzIpIDB4MDAwMDAwZmYpIDw8IDI0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aTMyX25ldCkgJiAoTTRPU0FfVUludDMyKSAweDAwMDBmZjAwKSA8PCAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWkzMl9uZXQpICYgKE00T1NBX1VJbnQzMikgMHgwMGZmMDAwMCkgPj4gIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpMzJfbmV0KSAmIChNNE9TQV9VSW50MzIpIDB4ZmYwMDAwMDApID4+ICAyNCkpCi0KLS8qIHRvIHRyYW5zbGF0ZSBhIEJpZyBFbmRpYW4gNjQgYml0cyB0byBpdHMgaG9zdCByZXByZXNlbnRhdGlvbiAqLwotI2RlZmluZSBNNE9TQV9CRV9UT19JTlQ2NCh1aTY0X25ldCkgKCgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwMDBmZikgPDwgNTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMDAwZmYwMCkgPDwgNDApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDAwMGZmMDAwMCkgPDwgMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwMDBmZjAwMDAwMCkgPDwgIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMDAwZmYwMDAwMDAwMCkgPj4gIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDAwMGZmMDAwMDAwMDAwMCkgPj4gMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4MDBmZjAwMDAwMDAwMDAwMCkgPj4gNDApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpNjRfbmV0KSAmIChNNE9TQV9VSW50NjQpIDB4ZmYwMDAwMDAwMDAwMDAwMCkgPj4gNTYpKQotCi0vKiB0byB0cmFuc2xhdGUgYSAxNiBiaXRzIHRvIGl0cyBMaXR0bGUgRW5kaWFuIHZhbHVlKi8KLSNkZWZpbmUgTTRPU0FfSU5UMTZfVE9fTEUodWkxNl9ob3N0KSAodWkxNl9ob3N0KQotCi0vKiB0byB0cmFuc2xhdGUgYSAzMiBiaXRzIHRvIGl0cyBMaXR0bGUgRW5kaWFuIHZhbHVlICovCi0jZGVmaW5lIE00T1NBX0lOVDMyX1RPX0xFKHVpMzJfaG9zdCkgKHVpMzJfaG9zdCkKLQotLyogdG8gdHJhbnNsYXRlIGEgNjQgYml0cyB0byBpdHMgTGl0dGxlIEVuZGlhbiB2YWx1ZSAqLwotI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19MRSh1aTY0X2hvc3QpICh1aTY0X2hvc3QpCi0KLS8qIHRvIHRyYW5zbGF0ZSBhIExpdHRsZSBFbmRpYW4gMTYgYml0cyB0byBpdHMgaG9zdCByZXByZXNlbnRhdGlvbiAqLwotI2RlZmluZSBNNE9TQV9MRV9UT19JTlQxNih1aTE2X25ldCkgKHVpMTZfbmV0KQotCi0vKiB0byB0cmFuc2xhdGUgYSBMaXR0bGUgRW5kaWFuIDMyIGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24qLwotI2RlZmluZSBNNE9TQV9MRV9UT19JTlQzMih1aTMyX25ldCkgKHVpMzJfbmV0KQotCi0vKiB0byB0cmFuc2xhdGUgYSBMaXR0bGUgRW5kaWFuIDY0IGJpdHMgdG8gaXRzIGhvc3QgcmVwcmVzZW50YXRpb24gKi8KLSNkZWZpbmUgTTRPU0FfTEVfVE9fSU5UNjQodWk2NF9uZXQpICh1aTY0X25ldCkKLQotCi0vKiBNYWNybyB0byBtYW5pcHVsYXRlIE00T1NBX0ludDMyKi8KLSNkZWZpbmUgTTRPU0FfSU5UMzJfU0VUKGkzMl9vdXQsIGkzMl9pbilcCi0gICB7IGkzMl9vdXQgPSBpMzJfaW47IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9BREQoaTMyX3Jlc3VsdCwgaTMyX2EsIGkzMl9iKVwKLSAgIHsgaTMyX3Jlc3VsdCA9IChpMzJfYSkgKyAoaTMyX2IpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfU1VCKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfYilcCi0gICB7IGkzMl9yZXN1bHQgPSAoaTMyX2EpIC0gKGkzMl9iKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDMyX1NDQUxBUl9QUk9EVUNUKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfdmFsdWUpXAotICAgeyBpMzJfcmVzdWx0ID0gKGkzMl9hKSAqIChpMzJfdmFsdWUpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfU0NBTEFSX0RJVklTSU9OKGkzMl9yZXN1bHQsIGkzMl9hLCBpMzJfdmFsdWUpXAotICAgeyBpMzJfcmVzdWx0ID0gKGkzMl9hKSAvIChpMzJfdmFsdWUpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfQ09NUEFSRShpMzJfYSwgaTMyX2IpXAotICAgKCAoKGkzMl9hKSA9PSAoaTMyX2IpKSA/IDAgOiAoICgoaTMyX2EpID4gKGkzMl9iKSkgPyAxIDogLTEpICkKLQotI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0lOVDMyKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSlcCi0gICB7IGkzMl9yZXN1bHQgPSAoTTRPU0FfSW50MzIpKGkzMl92YWx1ZSk7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0lOVDMyX1VJTlQzMihpMzJfcmVzdWx0LCBpMzJfaGlnaCwgdWkzMl9sb3cpXAotICAgeyBpMzJfcmVzdWx0ID0gKE00T1NBX0ludDMyKSh1aTMyX2xvdyk7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9HRVRfTE9XMzIoaTMyX3ZhbHVlKSAoKE00T1NBX0ludDMyKShpMzJfdmFsdWUpKQotCi0jZGVmaW5lIE00T1NBX0lOVDMyX0dFVF9ISUdIMzIoaTMyX3ZhbHVlKSAoMCkKLQotI2RlZmluZSBNNE9TQV9JTlQzMl9JU19QT1NJVElWRShpMzJfdmFsdWUpICgoaTMyX3ZhbHVlKSA+PSAwKQotCi0jZGVmaW5lIE00T1NBX0lOVDMyX05FRyhpMzJfcmVzdWx0LCBpMzJfdmFsdWUpXAotICAgeyBpMzJfcmVzdWx0ID0gLShpMzJfdmFsdWUpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfQUJTKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSlcCi0gICB7IGlmICgoaTMyX3ZhbHVlKSA+IDApIHsgaTMyX3Jlc3VsdCA9IGkzMl92YWx1ZTsgfVwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgeyBpMzJfcmVzdWx0ID0gLShpMzJfdmFsdWUpOyB9IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9MRUZUX1NISUZUKGkzMl9yZXN1bHQsIGkzMl92YWx1ZSwgdWkzMl9uYlBvcylcCi0gICB7IGk2NF9yZXN1bHQgPSAoKCh1aTMyX25iUG9zKT4weDFGKT8wOigoaTY0X3ZhbHVlKTw8KHVpMzJfbmJQb3MpKSk7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9SSUdIVF9TSElGVChpMzJfcmVzdWx0LCBpMzJfdmFsdWUsIHVpMzJfbmJQb3MpXAotICAgeyBpNjRfcmVzdWx0ID0gKCgodWkzMl9uYlBvcyk+MHgxRik/MDooKGk2NF92YWx1ZSk+Pih1aTMyX25iUG9zKSkpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UMzJfVE9fRE9VQkxFKGZfcmVzdWx0LCBpMzJfdmFsdWUpXAotICAgeyBmX3Jlc3VsdCA9IChNNE9TQV9Eb3VibGUpKGkzMl92YWx1ZSk7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQzMl9GUk9NX0RPVUJMRShpMzJfcmVzdWx0LCBmX3ZhbHVlKVwKLSAgIHsgaTMyX3Jlc3VsdCA9IChNNE9TQV9JbnQzMikoZl92YWx1ZSk7IH0KLQotCi0jaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAotCi0vKiBNYWNybyB0byBtYW5pcHVsYXRlIE00T1NBX0ludDY0Ki8KLSNkZWZpbmUgTTRPU0FfSU5UNjRfU0VUKGk2NF9vdXQsIGk2NF9pbikgeyBpNjRfb3V0ID0gaTY0X2luOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UNjRfQUREKGk2NF9yZXN1bHQsIGk2NF9hLCBpNjRfYilcCi0gICB7IGk2NF9yZXN1bHQgPSAoaTY0X2EpICsgKGk2NF9iKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NVQihpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAotICAgeyBpNjRfcmVzdWx0ID0gKGk2NF9hKSAtIChpNjRfYik7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9TQ0FMQVJfUFJPRFVDVChpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKLSAgIHsgaTY0X3Jlc3VsdCA9IChpNjRfYSkgKiAoaTMyX3ZhbHVlKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKLSAgIHsgaTY0X3Jlc3VsdCA9IChpNjRfYSkgLyAoaTMyX3ZhbHVlKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0NPTVBBUkUoaTY0X2EsIGk2NF9iKVwKLSAgICggKChpNjRfYSkgPT0gKGk2NF9iKSkgPyAwIDogKCAoKGk2NF9hKSA+IChpNjRfYikpID8gMSA6IC0xKSApXAotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzIoaTY0X3Jlc3VsdCwgaTMyX3ZhbHVlKVwKLSAgIHsgaTY0X3Jlc3VsdCA9IChNNE9TQV9JbnQ2NCkoaTMyX3ZhbHVlKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdylcCi0gICB7IGk2NF9yZXN1bHQgPSAoaTMyX2hpZ2gpOyBpNjRfcmVzdWx0ID0gKGk2NF9yZXN1bHQ8PDMyKSsodWkzMl9sb3cpOyB9Ci0KLSNkZWZpbmUgTTRPU0FfSU5UNjRfR0VUX0xPVzMyKGk2NF92YWx1ZSlcCi0gICAoKE00T1NBX0ludDMyKSgoaTY0X3ZhbHVlKSAmIDB4RkZGRkZGRkYpKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0dFVF9ISUdIMzIoaTY0X3ZhbHVlKVwKLSAgICgoTTRPU0FfSW50MzIpKCgoaTY0X3ZhbHVlKSA+PiAzMikgJiAweEZGRkZGRkZGKSkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9JU19QT1NJVElWRShpNjRfdmFsdWUpICgoKGk2NF92YWx1ZSk+PTApPzE6MCkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9ORUcoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKLSAgIHsgaTY0X3Jlc3VsdCA9IC0oaTY0X3ZhbHVlKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0FCUyhpNjRfcmVzdWx0LCBpNjRfdmFsdWUpXAotICAgeyBpZiAoTTRPU0FfSU5UNjRfSVNfUE9TSVRJVkUoaTY0X3ZhbHVlKSkgeyBpNjRfcmVzdWx0ID0gaTY0X3ZhbHVlOyB9XAotICAgICBlbHNlIHsgTTRPU0FfSU5UNjRfTkVHKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSk7IH0gfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0xFRlRfU0hJRlQoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlLCB1aTMyX25iUG9zKVwKLSAgIHsgaTY0X3Jlc3VsdCA9ICgoKHVpMzJfbmJQb3MpPjB4M0YpPzA6KChpNjRfdmFsdWUpPDwodWkzMl9uYlBvcykpKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvcylcCi0gICB7IGk2NF9yZXN1bHQgPSAoKCh1aTMyX25iUG9zKT4weDNGKT8wOigoaTY0X3ZhbHVlKT4+KHVpMzJfbmJQb3MpKSk7IH0KLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19ET1VCTEUoZl9yZXN1bHQsIGk2NF92YWx1ZSlcCi0gICB7IGZfcmVzdWx0ID0gKE00T1NBX0RvdWJsZSkoaTY0X3ZhbHVlKTsgfQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fRE9VQkxFKGk2NF9yZXN1bHQsIGZfdmFsdWUpXAotICAgeyBpNjRfcmVzdWx0ID0gKE00T1NBX0ludDY0KShmX3ZhbHVlKTsgfQotCi0jZW5kaWYgICAvKk00T1NBXzY0QklUU19TVVBQT1JURUQqLwotCi0KLSNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NFVChpNjRfb3V0LCBpNjRfaW4pXAotICAgICAgICBNNE9TQV9JTlQzMl9TRVQoaTY0X291dCwgaTY0X2luKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0FERChpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAotICAgICAgICBNNE9TQV9JTlQzMl9BREQoaTY0X3Jlc3VsdCwgaTY0X2EsIGk2NF9iKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NVQihpNjRfcmVzdWx0LCBpNjRfYSwgaTY0X2IpXAotICAgICAgICBNNE9TQV9JTlQzMl9TVUIoaTY0X3Jlc3VsdCwgaTY0X2EsIGk2NF9iKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9QUk9EVUNUKGk2NF9yZXN1bHQsIGk2NF9hLCBpMzJfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQzMl9TQ0FMQVJfUFJPRFVDVChpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1NDQUxBUl9ESVZJU0lPTihpNjRfcmVzdWx0LCBpNjRfYSwgaTMyX3ZhbHVlKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfU0NBTEFSX0RJVklTSU9OKGk2NF9yZXN1bHQsIGk2NF9hLCBpMzJfdmFsdWUpCi0KLSNkZWZpbmUgTTRPU0FfSU5UNjRfQ09NUEFSRShpNjRfYSwgaTY0X2IpXAotICAgICAgICBNNE9TQV9JTlQzMl9DT01QQVJFKGk2NF9hLCBpNjRfYikKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKGk2NF9yZXN1bHQsIGkzMl92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX0ZST01fSU5UMzIoaTY0X3Jlc3VsdCwgaTMyX3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdylcCi0gICAgICAgIE00T1NBX0lOVDMyX0ZST01fSU5UMzJfVUlOVDMyKGk2NF9yZXN1bHQsIGkzMl9oaWdoLCB1aTMyX2xvdykKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9HRVRfTE9XMzIoaTY0X3ZhbHVlKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfR0VUX0xPVzMyKGk2NF92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9HRVRfSElHSDMyKGk2NF92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX0dFVF9ISUdIMzIoaTY0X3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0lTX1BPU0lUSVZFKGk2NF92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX0lTX1BPU0lUSVZFKGk2NF92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9ORUcoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfTkVHKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9BQlMoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlKVwKLSAgICAgICAgTTRPU0FfSU5UMzJfQUJTKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSkKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9MRUZUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucylcCi0gICAgICAgIE00T1NBX0lOVDMyX0xFRlRfU0hJRlQoaTY0X3Jlc3VsdCwgaTY0X3ZhbHVlLCB1aTMyX25iUG9zaXRpb25zKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucylcCi0gICAgICAgIE00T1NBX0lOVDMyX1JJR0hUX1NISUZUKGk2NF9yZXN1bHQsIGk2NF92YWx1ZSwgdWkzMl9uYlBvc2l0aW9ucykKLQotI2RlZmluZSBNNE9TQV9JTlQ2NF9UT19ET1VCTEUoZl9yZXN1bHQsIGk2NF92YWx1ZSlcCi0gICAgICAgIE00T1NBX0lOVDMyX1RPX0RPVUJMRShmX3Jlc3VsdCwgaTY0X3ZhbHVlKQotCi0jZGVmaW5lIE00T1NBX0lOVDY0X0ZST01fRE9VQkxFKGk2NF9yZXN1bHQsIGZfdmFsdWUpXAotICAgICAgICBNNE9TQV9JTlQzMl9GUk9NX0RPVUJMRShpNjRfcmVzdWx0LCBmX3ZhbHVlKQotCi0jZW5kaWYgLypNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRCovCi0KLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCmluZGV4IGI5MzUxYzIuLjFiMjEwNzkgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvQW5kcm9pZC5tawpAQCAtMjgsMTggKzI4LDEyIEBACiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcDQogICAgIE00T1NBX0NoYXJTdGFyLmMgXA0KICAgICBNNE9TQV9DbG9jay5jIFwNCi0gICAgTTRPU0FfRmlsZUNhY2hlLmMgXA0KICAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXA0KLSAgICBNNE9TQV9GaWxlRXh0cmEuYyBcDQogICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcDQotICAgIE00T1NBX0ZpbGVSZWFkZXJfUkFNLmMgXA0KICAgICBNNE9TQV9GaWxlV3JpdGVyLmMgXA0KLSAgICBNNE9TQV9GaWxlV3JpdGVyX1JBTS5jIFwNCiAgICAgTTRPU0FfTXV0ZXguYyBcDQogICAgIE00T1NBX1JhbmRvbS5jIFwNCiAgICAgTTRPU0FfU2VtYXBob3JlLmMgXA0KLSAgICBNNE9TQV9TdHJpbmcuYyBcDQotICAgIE00T1NBX1N0cmluZ19wcml2LmMgXA0KICAgICBNNE9TQV9UaHJlYWQuYyBcDQogICAgIE00UFNXX0RlYnVnVHJhY2UuYyBcDQogICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwNCkBAIC03Myw5ICs2Nyw1IEBACiAgICAgLURVU0VfU1RBR0VGUklHSFRfUkVBREVSUyBcDQogICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSDQogDQotIyBEb24ndCBwcmVsaW5rIHRoaXMgbGlicmFyeS4gIEZvciBtb3JlIGVmZmljaWVudCBjb2RlLCB5b3UgbWF5IHdhbnQNCi0jIHRvIGFkZCB0aGlzIGxpYnJhcnkgdG8gdGhlIHByZWxpbmsgbWFwIGFuZCBzZXQgdGhpcyB0byB0cnVlLg0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlDQotDQogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQ0KIA0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwppbmRleCAzNjU0MWYwLi5kYzg0ZWFiIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCkBAIC0xNjcsNyArMTY3LDggQEAKIAogICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQogICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfbWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgTTRPU0FfRklMRV9SRUFERVIsICJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQiKTsKKyAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgCisgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0Iik7CiAgICAgICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKICAgICB9CiAKQEAgLTE4Miw3ICsxODMsNyBAQAogCiAgICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCiAgICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKKyAgICAgICAgICAgIGZyZWUoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIwNyw3ICsyMDgsNyBAQAogICAgIGNvcHlzaXplID0gYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIG9mZnNldDsKICAgICBjb3B5c2l6ZSA9IChzaXplIDwgY29weXNpemUpID8gc2l6ZSA6IGNvcHlzaXplOwogCi0gICAgTTRPU0FfbWVtY3B5KHBEYXRhLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICsgb2Zmc2V0LCBjb3B5c2l6ZSk7CisgICAgbWVtY3B5KCh2b2lkICopcERhdGEsICh2b2lkICopKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQpLCBjb3B5c2l6ZSk7CiAKICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gLT0gY29weXNpemU7CiAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwpAQCAtNDQ5LDMwICs0NTAsNiBAQAogICAgICAgICBlcnIgPSBlcnJubzsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKICAgICB9Ci0jaWYgMAotICAgIGZpbGVTZWVrUG9zaXRpb24gPSAwOwotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+c2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVTZWVrRW5kLCAmZmlsZVNlZWtQb3NpdGlvbik7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmV0cmlldmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPmZpbGVTaXplKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0gICAgfQotI2VuZGlmCiAjZWxzZQogICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIDAsIE00T1NBX2tGaWxlU2Vla0VuZCwgJmVycm5vKTsKIApAQCAtNTQ0LDggKzUyMSw4IEBACiAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKIAogICAgIC8qICAgICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSByZWFkZXIgY29udGV4dC4gKi8KLSAgICBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgIk00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSIpOworICAgIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0gKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0iKTsKIAogICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQpOwogCkBAIC01NTQsMTEgKzUzMSwxMSBAQAogCiAgICAgLypTZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlciovCiAKLSAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAiTlhQU1dfRmlsZVJlYWRlck9wdGltX2luaXQiKTsKKyAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCIpOwogICAgIGlmIChNNE9TQV9OVUxMPT1hcENvbnRleHQtPkZTKQogICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9pbml0IC0gRVJST1IgOiBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfRmlsZVJlYWRlck9wdGltX2luaXQgLSBFUlJPUiA6IGFsbG9jYXRpb24gZmFpbGVkIik7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAgICAgYXBDb250ZXh0LT5GUy0+b3BlblJlYWQgID0gTTRPU0FfZmlsZVJlYWRPcGVuOwpAQCAtNTY3LDcgKzU0NCw3IEBACiAgICAgYXBDb250ZXh0LT5GUy0+Y2xvc2VSZWFkID0gTTRPU0FfZmlsZVJlYWRDbG9zZTsKICAgICBhcENvbnRleHQtPkZTLT5zZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZFNldE9wdGlvbjsKICAgICBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbjsKLSAgICNlbHNlCisjZWxzZQogICAgIGFwQ29udGV4dC0+RlMgPSBGUzsKICNlbmRpZgogCkBAIC02NjEsNyArNjM4LDcgQEAKICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOwogICAgICAgICB9CiAKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSBhcENvbnRleHQpOworICAgICAgICBmcmVlKCBhcENvbnRleHQpOwogICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtOTc2LDEyICs5NTMsMTIgQEAKICAgICAvLz4+Pj4gR0xNMjAwOTAyMTIgOiBzZXQgdGhlIGxvdyBsZXZlbCBmdW5jdGlvbiBzdGF0aWNhbGx5CiAgICAgaWYgKGFwQ29udGV4dC0+RlMgIT0gTTRPU0FfTlVMTCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikgYXBDb250ZXh0LT5GUyk7CisgICAgICAgIGZyZWUoIGFwQ29udGV4dC0+RlMpOwogICAgIH0KICAgICAvLzw8PDwgR0xNMjAwOTAyMTIgOiBzZXQgdGhlIGxvdyBsZXZlbCBmdW5jdGlvbiBzdGF0aWNhbGx5CiAKICAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dCk7CisgICAgZnJlZShhcENvbnRleHQpOwogCiAgICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KICAgICByZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKaW5kZXggNGE4NjVjMS4uZWI3ZTUyNSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jCkBAIC03NiwxMTQgKzc2LDYgQEAKIAogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jYXQoKS4KLSAqIEBub3RlICAgICAgIEl0IGFwcGVuZHMgYXQgbW9zdCBsZW4yQXBwZW5kIGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gdGhlIGVuZAotICogICAgICAgICAgICAgb2YgcFN0ck91dC4gVGhlIGluaXRpYWwgY2hhcmFjdGVyIG9mIHBTdHJJbiBvdmVycmlkZXMgdGhlIG51bGwKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHBTdHJPdXQuIFRISVMgTEFTVCBOVUxMIENIQVJBQ1RFUiBJTgotICogICAgICAgICAgICAgcFN0ck91dCBNVVNUIEJFIFBSRVNFTlQuCi0gKiAgICAgICAgICAgICAtIElmIGEgbnVsbCBjaGFyYWN0ZXIgYXBwZWFycyBpbiBwU3RySW4gYmVmb3JlIGxlbjJBcHBlbmQKLSAqICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcmUgYXBwZW5kZWQsIHRoZSBmdW5jdGlvbiBhcHBlbmRzIGFsbCBjaGFyYWN0ZXJzCi0gKiAgICAgICAgICAgICAgIGZyb20gcFN0ckluLCB1cCB0byB0aGlzIE00T1NBX05VTEwgY2hhcmFjdGVyLgotICogICAgICAgICAgICAgLSBJZiBsZW4yQXBwZW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgdGhlIGxlbmd0aAotICogICAgICAgICAgICAgICBvZiBwU3RySW4gaXMgdXNlZCBpbiBwbGFjZSBvZiBsZW4yQXBwZW5kLiBUaGUgcmVzdWx0aW5nIHN0cmluZwotICogICAgICAgICAgICAgICBpcyB0ZXJtaW5hdGVkIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KLSAqICAgICAgICAgICAgIC0gcFN0ck91dCBhbmQgcFN0ckluIE1VU1QgTk9UIE9WRVJMQVAgKHRoaXMgaXMgTk9UIENIRUNLRUQpLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgRGVzdGluYXRpb24gY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGFwcGVuZC4KLSAqIEBwYXJhbSAgICAgIGxlbjJBcHBlbmQ6IChJTikgTWF4IG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIGFwcGVuZC4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFN0ck91dCBpcyBNNE9TQV9OVUxMLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyTkNhdChNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyKiBwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQXBwZW5kKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ2F0XHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsTTRPU0FfVUludDMyICVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJPdXQscFN0ckluLGxlbjJBcHBlbmQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ2F0Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNhdDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzdHJuY2F0KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIqKXBTdHJJbiwgKHNpemVfdClsZW4yQXBwZW5kKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3RyY21wKCkuCi0gKiBAbm90ZSAgICAgICBJdCBjb21wYXJlcyBwU3RySW4xIGFuZCBwU3RySW4yIGxleGljb2dyYXBoaWNhbGx5LgotICogICAgICAgICAgICAgVGhlIHZhbHVlIHJldHVybmVkIGluIGNtcFJlc3VsdCBpcyBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvcgotICogICAgICAgICAgICAgbGVzcyB0aGFuIDAsIGlmIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIGdyZWF0ZXIgdGhhbiwKLSAqICAgICAgICAgICAgIGVxdWFsIHRvLCBvciBsZXNzIHRoYW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBTdHJJbjIKLSAqICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gVGhlIHNpZ24gb2YgYSBub24temVybyByZXR1cm4gdmFsdWUgaXMgZGV0ZXJtaW5lZAotICogICAgICAgICAgICAgYnkgdGhlIHNpZ24gb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWVzIG9mIHRoZSBmaXJzdAotICogICAgICAgICAgICAgcGFpciBvZiBieXRlcyB0aGF0IGRpZmZlciBpbiB0aGUgc3RyaW5ncyBiZWluZyBjb21wYXJlZC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockNvbXBhcmUoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBDbXBSZXN1bHQpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NockNvbXBhcmVcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCxNNE9TQV9JbnQzMiogJXgpIiwKLSAgICAgICAgICAgICAgICAgICAgcFN0ckluMSxwU3RySW4yLHBDbXBSZXN1bHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQ29tcGFyZTpcdHN0ckluMSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJDb21wYXJlOlx0c3RySW4yIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ21wUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockNvbXBhcmU6XHRjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBDbXBSZXN1bHQgPSAoTTRPU0FfSW50MzIpc3RyY21wKChjb25zdCBjaGFyICopcFN0ckluMSwgKGNvbnN0IGNoYXIgKilwU3RySW4yKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jbXAoKS4KLSAqIEBub3RlICAgICAgIEl0IGxleGljb2dyYXBoaWNhbGx5IGNvbXBhcmVzIGF0IG1vc3QgdGhlIGZpcnN0IGxlbjJDb21wCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIGluIHBTdHJJbjEgYW5kIHBTdHJJbjIuCi0gKiAgICAgICAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gY21wUmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yCi0gKiAgICAgICAgICAgICBsZXNzIHRoYW4gMCwgaWYgdGhlIGZpcnN0IGxlbjJDb21wIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZwotICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIGdyZWF0ZXIgdGhhbiwgZXF1YWwgdG8sIG9yIGxlc3MgdGhhbiB0aGUKLSAqICAgICAgICAgICAgIGZpcnN0IGxlbjJDb21wIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHBTdHJJbjIKLSAqICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gVGhlIHNpZ24gb2YgYSBub24temVybyByZXR1cm4gdmFsdWUgaXMgZGV0ZXJtaW5lZAotICogICAgICAgICAgICAgYnkgdGhlIHNpZ24gb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWVzIG9mIHRoZSBmaXJzdAotICogICAgICAgICAgICAgcGFpciBvZiBieXRlcyB0aGF0IGRpZmZlciBpbiB0aGUgc3RyaW5ncyBiZWluZyBjb21wYXJlZC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBsZW4yQ29tcDogKElOKSBMZW5ndGggdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24uCi0gKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2Nock5Db21wYXJlKE00T1NBX0NoYXIqIHBTdHJJbjEsTTRPU0FfQ2hhciogcFN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuMkNvbXAsIE00T1NBX0ludDMyKiBwQ21wUmVzdWx0KQotewotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJOQ29tcGFyZVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LCIKLSAgICAgICAgIk00T1NBX0ludDMyICVsZCwgTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLGxlbjJDb21wLHBDbXBSZXN1bHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvbXBhcmU6XHRwU3RySW4xIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4yLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db21wYXJlOlx0cFN0ckluMiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENtcFJlc3VsdCxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29tcGFyZTpcdHBDbXBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBDbXBSZXN1bHQgPSAoTTRPU0FfSW50MzIpc3RybmNtcCgoY29uc3QgY2hhciopcFN0ckluMSwgKGNvbnN0IGNoYXIqKXBTdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpbGVuMkNvbXApOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBjb21wYXJpc29uIG9mIHBTdHJJbjEgYW5kIHBTdHJJbjIuCiAgKiBAbm90ZSAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gcmVzdWx0IGlzIE00T1NBX1RSVUUgaWYgdGhlIHN0cmluZwogICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIHN0cmljdGx5IGlkZW50aWNhbCB0byB0aGUgc3RyaW5nIHBvaW50ZWQKQEAgLTIyOSwzMzEgKzEyMSw2IEBACiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CiAKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJjaHIoKS4KLSAqIEBub3RlICAgICAgIEl0IGZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIChpLmUuIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZwotICogICAgICAgICAgICAgb2YgdGhlIHN0cmluZykgb2YgYyBpbiBwU3RySW4gYW5kIHNldCAqcFBvaW50ZXJJblN0ciB0byB0aGlzCi0gKiAgICAgICAgICAgICBwb3NpdGlvbi4KLSAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2UgaXMgZm91bmQsICpwUG9pbnRlckluU3RyIGlzIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgd2hlcmUgdG8gc2VhcmNoLgotICogQHBhcmFtICAgICAgYzogKElOKSBDaGFyYWN0ZXIgdG8gc2VhcmNoLgotICogQHBhcmFtICAgICAgcFBvaW50ZXJJblN0cjogKE9VVCkgcG9pbnRlciBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBjLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwUG9pbnRlckluU3RyIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGMgZm91bmQuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJGaW5kQ2hhciAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9DaGFyIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcEluU3RyKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJGaW5kQ2hhclx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9DaGFyICVjIgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4KSIscFN0ckluLGMscEluU3RyKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRDaGFyOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW5TdHIsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRDaGFyOlx0cEluU3RyIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwSW5TdHIgPSAoTTRPU0FfQ2hhciopc3RyY2hyKChjb25zdCBjaGFyICopcFN0ckluLChpbnQpYyk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSAqcEluU3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cnJjaHIoKS4KLSAqIEBub3RlICAgICAgIEl0IGZpbmRzIHRoZSBsYXN0IG9jY3VycmVuY2UgKGkuZS4gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZQotICogICAgICAgICAgICAgc3RyaW5nLCBiYWNrd2FyZCkgb2YgYyBpbiBwU3RySW4gYW5kIHNldCAqcFBvaW50ZXJJblN0ciB0byB0aGlzCi0gKiAgICAgICAgICAgICBwb3NpdGlvbi4KLSAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2UgaXMgZm91bmQsICpwUG9pbnRlckluU3RyIGlzIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgd2hlcmUgdG8gc2VhcmNoLgotICogQHBhcmFtICAgICAgYzogKElOKSBDaGFyYWN0ZXIgdG8gc2VhcmNoLgotICogQHBhcmFtICAgICAgcFBvaW50ZXJJblN0cjogKE9VVCkgcG9pbnRlciBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBjLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwUG9pbnRlckluU3RyIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGMgZm91bmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NoclJldmVyc2VGaW5kQ2hhcihNNE9TQV9DaGFyKiBwU3RySW4sIE00T1NBX0NoYXIgYyxNNE9TQV9DaGFyKiogcEluU3RyKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJSZXZlcnNlRmluZENoYXJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfQ2hhciAlYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4sYyxwSW5TdHIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyUmV2ZXJzZUZpbmRDaGFyOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW5TdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclJldmVyc2VGaW5kQ2hhcjpcdHBJblN0ciBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcEluU3RyID0gKE00T1NBX0NoYXIqKXN0cnJjaHIoKGNvbnN0IGNoYXIgKilwU3RySW4sKGludCljKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwSW5TdHIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05PVF9GT1VORDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3Ryc3BuKCkuCi0gKiBAbm90ZSAgICAgICBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBzdHJpbmcgcFN0ckluCi0gKiAgICAgICAgICAgICB0aGF0IGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgZnJvbSBzdHJpbmcgcERlbGltaXRlcnMKLSAqICAgICAgICAgICAgIChpdCAic3BhbnMiIHRoaXMgc2V0IG9mIGNoYXJhY3RlcnMpLgotICogICAgICAgICAgICAgSWYgbm8gb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyIHByZXNlbnQgaW4gcERlbGltaXRlcnMgaXMgZm91bmQKLSAqICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgcFN0ckluLCAqcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZyB3aGVyZSB0byBzZWFyY2guCi0gKiBAcGFyYW0gICAgICBwRGVsaW1pdGVyczogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNldCBvZgotICogICAgICAgICAgICAgY2hhcmFjdGVycyB0byBzZWFyY2guCi0gKiBAcGFyYW0gICAgICBwUG9zSW5TdHI6IChPVVQpIExlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiwgcERlbGltaXRlcnMgb3IgcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NoclNwYW4oTTRPU0FfQ2hhciogcFN0ckluLE00T1NBX0NoYXIqIHBEZWxpbWl0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBQb3NJblN0cikKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyU3Bhblx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4IgotICAgICAgICAiTTRPU0FfVUludDMyKiAleCkiLHBTdHJJbixwRGVsaW1pdGVycyxwUG9zSW5TdHIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU3BhbjpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zSW5TdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU3BhbjpcdHBQb3NJblN0ciBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcFBvc0luU3RyID0gKE00T1NBX1VJbnQzMilzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlbGltaXRlcnMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJjc3BuKCkuCi0gKiBAbm90ZSAgICAgICBJdCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBzdHJpbmcgcFN0ckluCi0gKiAgICAgICAgICAgICB0aGF0IGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgTk9UIGZyb20gc3RyaW5nIGRlbGltaXRlcnMKLSAqICAgICAgICAgICAgIChpdCBzcGFucyB0aGUgY29tcGxlbWVudCBvZiB0aGlzIHNldCBvZiBjaGFyYWN0ZXJzKS4KLSAqICAgICAgICAgICAgIElmIG5vIG9jY3VycmVuY2Ugb2YgYW55IGNoYXJhY3RlciBwcmVzZW50IGluIGRlbGltaXRlcnMgaXMgZm91bmQKLSAqICAgICAgICAgICAgIGluIHBTdHJJbiwgKnBQb3NJblN0ciBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiBwU3RySW4uCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZyB3aGVyZSB0byBzZWFyY2guCi0gKiBAcGFyYW0gICAgICBkZWxpbWl0ZXJzOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIHRvIHNlYXJjaC4KLSAqIEBwYXJhbSAgICAgIHBQb3NJblN0cjogKE9VVCkgTGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluLCBkZWxpbWl0ZXJzIG9yIHBQb3NJblN0ciBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05PVF9GT1VORDogbm8gb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyIHByZXNlbnQgaW4KLSAqICAgICAgICAgICAgIGRlbGltaXRlcnMgaGFzIGJlZW4gZm91bmQgaW4gcFN0ckluLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudCAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9DaGFyKiBwRGVsaW1pdGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwUG9zSW5TdHIpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NoclNwYW5Db21wbGVtZW50XHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgiCi0gICAgICAgICJNNE9TQV9VSW50MzIqICV4KSIscFN0ckluLHBEZWxpbWl0ZXJzLHBQb3NJblN0cik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERlbGltaXRlcnMsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zSW5TdHIsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNwYW5Db21wbGVtZW50Olx0cFBvc0luU3RyIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwUG9zSW5TdHIgPSAoTTRPU0FfVUludDMyKXN0cmNzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlbGltaXRlcnMpOwotICAgIGlmKCpwUG9zSW5TdHIgPCAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbikpCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3Mgc3RycGJyaygpLgotICogQG5vdGUgICAgICAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gc3RyaW5nIHBTdHJJbgotICogICAgICAgICAgICAgb2YgYW55IGNoYXJhY3RlciBmcm9tIHN0cmluZyBwRGVsaW1pdGVycywgb3IgYSBudWxsIHBvaW50ZXIgaWYKLSAqICAgICAgICAgICAgIG5vIGNoYXJhY3RlciBmcm9tIHBEZWxpbWl0ZXJzIGV4aXN0cyBpbiBwU3RySW4uIEluIHRoZSBsYXR0ZXIKLSAqICAgICAgICAgICAgIGNhc2UsIFdBUl9OT19GT1VORCBpcyByZXR1cm5lZC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIHdoZXJlIHRvIHNlYXJjaC4KLSAqIEBwYXJhbSAgICAgIHBEZWxpbWl0ZXJzOiAoSU4pIENoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIHRvIHNlYXJjaC4KLSAqIEBwYXJhbSAgICAgIHBQb2ludGVySW5TdHI6IChPVVQpIFBvaW50ZXIgb24gdGhlIGZpcnN0IGNoYXJhY3RlciBiZWxvbmdpbmcgdG8KLSAqICAgICAgICAgICAgIHBEZWxpbWl0ZXJzLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiwgcERlbGltaXRlcnMgb3IgcFBvc0luU3RyIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTk9UX0ZPVU5EOiBubyBvY2N1cnJlbmNlIG9mIGFueSBjaGFyYWN0ZXIgcHJlc2VudCBpbgotICogICAgICAgICAgICAgcERlbGltaXRlcnMgaGFzIGJlZW4gZm91bmQgaW4gcFN0ckluLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJQYnJrKE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfQ2hhciogcERlbGltaXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKipwUG9pbnRlckluU3RyKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJQYnJrXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4scERlbGltaXRlcnMscFBvaW50ZXJJblN0cik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERlbGltaXRlcnMsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTcGFuQ29tcGxlbWVudDpcdHBEZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9pbnRlckluU3RyLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNwYW5Db21wbGVtZW50Olx0cFBvaW50ZXJJblN0ciBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcFBvaW50ZXJJblN0ciA9IChNNE9TQV9DaGFyKilzdHJwYnJrKChjb25zdCBjaGFyICopcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBEZWxpbWl0ZXJzKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwUG9pbnRlckluU3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cnN0cigpLgotICogQG5vdGUgICAgICAgSXQgbG9jYXRlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nIHBTdHJJbjIgKGV4Y2x1ZGluZwotICogICAgICAgICAgICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyKSBpbiBzdHJpbmcgcFN0ckluMSBhbmQgc2V0Ci0gKiAgICAgICAgICAgICBwUG9pbnRlckluU3RyMSB0byB0aGUgbG9jYXRlZCBzdHJpbmcsIG9yIHRvIGEgbnVsbCBwb2ludGVyIGlmIHRoZQotICogICAgICAgICAgICAgc3RyaW5nIGlzIG5vdCBmb3VuZCwgaW4gd2hpY2ggY2FzZSBNNFdBUl9DSFJfTk9UX0ZPVU5EIGlzCi0gKiAgICAgICAgICAgICByZXR1cm5lZC4gSWYgcFN0ckluMiBwb2ludHMgdG8gYSBzdHJpbmcgd2l0aCB6ZXJvIGxlbmd0aCAodGhhdAotICogICAgICAgICAgICAgaXMsIHRoZSBzdHJpbmcgIiIpLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBwU3RySW4xLgotICogQHBhcmFtICAgICAgcFN0ckluMTogKElOKSBDaGFyYWN0ZXIgc3RyaW5nIHdoZXJlIHRvIHNlYXJjaC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgQ2hhcmFjdGVyIHN0cmluZyB0byBzZWFyY2guCi0gKiBAcGFyYW0gICAgICBwUG9pbnRlckluU3RyMTogKE9VVCkgUG9pbnRlciBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHBTdHJJbjIKLSAqICAgICAgICAgICAgIGluIHBTdHJJbjEuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluMSwgcFN0ckluMiBvciBwUG9pbnRlckluU3RyMSBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05PVF9GT1VORDogbm8gb2NjdXJyZW5jZSBvZiBwU3RySW4yIGhhcyBiZWVuIGZvdW5kIGluCi0gKiAgICAgICAgICAgICBwU3RySW4xLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJGaW5kUGF0dGVybihNNE9TQV9DaGFyKiBwU3RySW4xLCBNNE9TQV9DaGFyKiBwU3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiBwUG9pbnRlckluU3RyMSkKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyRmluZFBhdHRlcm5cdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCIKLSAgICAgICAgIk00T1NBX0NoYXIqKiAleCkiLHBTdHJJbjEscFN0ckluMixwUG9pbnRlckluU3RyMSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJGaW5kUGF0dGVybjpcdHBTdHJJbjEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjIsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyRmluZFBhdHRlcm46XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9pbnRlckluU3RyMSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockZpbmRQYXR0ZXJuOlx0cFBvaW50ZXJJblN0cjEgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBQb2ludGVySW5TdHIxID0gKE00T1NBX0NoYXIqKXN0cnN0cigoY29uc3QgY2hhciAqKXBTdHJJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBTdHJJbjIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gKnBQb2ludGVySW5TdHIxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cmxlbigpLgotICogQG5vdGUgICAgICAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gcFN0ckluLCBub3QgaW5jbHVkaW5nCi0gKiAgICAgICAgICAgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCi0gKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGhhdmUgbm8gcmV0dXJuIGNvZGUuIEl0IGRvZXMgbm90IGNoZWNrIHRoYXQgcFN0ckluCi0gKiAgICAgICAgICAgICBkb2VzIG5vdCBwb2ludCB0byBudWxsLCBub3IgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgc3RyaW5nIChpLmUuCi0gKiAgICAgICAgICAgICBudWxsLXRlcm1pbmF0ZWQpLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcmV0dXJuICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBwU3RySW4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00T1NBX2Nockxlbmd0aChNNE9TQV9DaGFyKiBwU3RySW4pCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2Nockxlbmd0aFx0KE00T1NBX0NoYXIqICV4KSIscFN0ckluKTsKLSAgICByZXR1cm4gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4pOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaWJjJ3MgdG9sb3dlcigpLgotICogQG5vdGUgICAgICAgSXQgY29udmVydHMgdGhlIGNoYXJhY3RlciB0byBsb3dlciBjYXNlLCBpZiBwb3NzaWJsZSBhbmQKLSAqICAgICAgICAgICAgIGFwcHJvcHJpYXRlLCBhbmQgcmV0dXJucyBpdC4KLSAqIEBwYXJhbSAgICAgIGNJbjogKElOKSBJbnB1dCBjaGFyYWN0ZXIgdG8gY29udmVydC4KLSAqIEByZXR1cm4gICAgIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfQ2hhciBNNE9TQV9jaHJUb0xvd2VyIChNNE9TQV9DaGFyIGNJbikKLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfY2hyVG9Mb3dlclx0KE00T1NBX0NoYXIgJWMpIixjSW4pOwotICAgIHJldHVybiAoTTRPU0FfQ2hhcil0b2xvd2VyKChpbnQpY0luKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHRvdXBwZXIoKS4KLSAqIEBub3RlICAgICAgIEl0IGNvbnZlcnRzIHRoZSBjaGFyYWN0ZXIgdG8gdXBwZXIgY2FzZSwgaWYgcG9zc2libGUgYW5kCi0gKiAgICAgICAgICAgICBhcHByb3ByaWF0ZSwgYW5kIHJldHVybnMgaXQuCi0gKiBAcGFyYW0gICAgICBjSW46IChJTikgSW5wdXQgY2hhcmFjdGVyIHRvIGNvbnZlcnQuCi0gKiBAcmV0dXJuICAgICBjb252ZXJ0ZWQgY2hhcmFjdGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0NoYXIgTTRPU0FfY2hyVG9VcHBlcihNNE9TQV9DaGFyIGNJbikKLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfY2hyVG9VcHBlclx0KE00T1NBX0NoYXIgJWMpIixjSW4pOwotICAgIHJldHVybiAoTTRPU0FfQ2hhcil0b3VwcGVyKChpbnQpY0luKTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0V29yZChNNE9TQV9DaGFyKiAgICBwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiAgICBwQmVnaW5EZWxpbWl0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogICAgcEVuZERlbGltaXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiAgICBwU3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKnBTdHJPdXRNYXhMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcE91dHB1dFBvaW50ZXIpCi17Ci0gICAgTTRPU0FfQ2hhciAgICpwVGVtcDsKLSAgICBNNE9TQV9VSW50MzIgIHBvczsKLSAgICBNNE9TQV9FUlIgICAgIGVycm9yQ29kZTsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRXb3JkXHQoTTRPU0FfQ2hhciogJXgsLi4uLC4uLixNNE9TQV9DaGFyKiAleCwiCi0gICAgICAgICJNNE9TQV9VSW50MzIqICV4LE00T1NBX0NoYXIqKiAleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RySW4scFN0ck91dCxwU3RyT3V0TWF4TGVuLHBPdXRwdXRQb2ludGVyKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEJlZ2luRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRXb3JkOlx0YmVnaW5EZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRW5kRGVsaW1pdGVycywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFdvcmQ6XHRlbmREZWxpbWl0ZXJzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyT3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXRNYXhMZW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0V29yZDpcdHN0ck91dE1heExlbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBlcnJvckNvZGUgPSBNNE9TQV9jaHJTcGFuKHBTdHJJbiwgcEJlZ2luRGVsaW1pdGVycywgJnBvcyk7Ci0gICAgcFRlbXAgICAgID0gcFN0ckluICsgcG9zOwotICAgIGVycm9yQ29kZSA9IE00T1NBX2NoclNwYW5Db21wbGVtZW50KHBUZW1wLCBwRW5kRGVsaW1pdGVycywgJnBvcyk7Ci0gICAgaWYocG9zID4gKnBTdHJPdXRNYXhMZW4pCi0gICAgewotICAgICAgICAqcFN0ck91dE1heExlbiA9IHBvczsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIGlmKHBvcykKLSAgICB7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFN0ck91dCwoTTRPU0FfTWVtQWRkcjgpcFRlbXAsIHBvcyk7Ci0gICAgfQotICAgIHBTdHJPdXRbcG9zXSAgID0gJ1wwJzsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBPdXRwdXRQb2ludGVyKQotICAgIHsKLSAgICAgICAgKnBPdXRwdXRQb2ludGVyID0gcFRlbXAgKyBwb3M7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQogCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTczNyw2MzkgKzMwNCw2IEBACiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CiAKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDggZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDggdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDhfTUFYLgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDhfTUFYLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKLSAqICAgICAgICAgICAgIG51bWJlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDgoTTRPU0FfQ2hhciogICAgICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogICAgcFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfVUludDMyIHVsOwotICAgIGNoYXIqICAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50OFx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50OCogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDg6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQ4Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLwotICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYodWw+TTRPU0FfVUlOVDhfTUFYKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UOF9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDgpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX0ludDY0IGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX0ludDY0IHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKLSAqICAgICAgICAgICAgIGRlY2ltYWwgcmVwcmVzZW50YXRpb24uIHBTdHJPdXQgaXMgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLSAqICAgICAgICAgICAgIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzCi0gKiAgICAgICAgICAgICBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0bwotICogICAgICAgICAgICAgICBNNE9TQV9JTlQ2NF9NQVggb3IgTTRPU0FfSU5UNjRfTUlOIHJlc3BlY3RpdmVseS4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiAgICAgICAgICAgICBGT1IgVEhFIE1PTUVOVCwgT05MWSBERUNJTUFMIFJFUFJFU0VOVEFUSU9OIElTIEhBTkRMRUQuCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDY0X01BWCBvciBsZXNzIHRoYW4gTTRPU0FfSU5UNjRfTUlOCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldEludDY0KE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfSW50NjQqIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBTdHJPdXQsIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECi0gICAgTTRPU0FfSW50NjQgICAgIG1heFZhbCAgID0gIE00T1NBX0lOVDY0X01BWDsgLyogdGhpcyBpcyAyXjYzLTEgKi8KLSAgICBNNE9TQV9JbnQ2NCAgICAgbWluVmFsICAgPSAgTTRPU0FfSU5UNjRfTUlOOyAvKiB0aGlzIGlzIC0yXjYzKzEgKi8KLSAgICBNNE9TQV9DaGFyICAgbWF4U3RyW10gPSAgIjkyMjMzNzIwMzY4NTQ3NzU4MDciOwotICAgIE00T1NBX0NoYXIqICBiZWdpbk51bTsKLSAgICBNNE9TQV9VSW50MzIgbWF4TGVuICAgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiltYXhTdHIpOwotICAgIE00T1NBX1VJbnQzMiBjaHJDb3VudCA9IDA7Ci0gICAgTTRPU0FfVUludDggIG5lZ2F0aXZlID0gMDsKLQotICAgIE00T1NBX1RSQUNFMV80KChNNE9TQV9DaGFyICopIk00T1NBX2NockdldEludDY0XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQ2NCogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50NjQ6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDY0Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIHRyaW0gYmxhbmsgY2hhcmFjdGVycyAqLwotICAgIHdoaWxlICgqcFN0ckluID09ICcgJyB8fCAqcFN0ckluID09ICdcdCcpIHBTdHJJbisrOwotCi0gICAgLyogZ2V0IHRoZSBzaWduICovCi0gICAgaWYgKCpwU3RySW4gPT0gJysnKSBwU3RySW4rKzsKLSAgICBlbHNlIGlmICgqcFN0ckluID09ICctJykKLSAgICB7Ci0gICAgICAgIG5lZ2F0aXZlID0gMTsKLSAgICAgICAgcFN0ckluKys7Ci0gICAgfQotICAgIGJlZ2luTnVtID0gcFN0ckluOwotCi0gICAgLyogZ2V0IHRoZSBsZW5ndGggb2YgdGhlIG51bWVyaWNhbCBwYXJ0ICovCi0gICAgd2hpbGUoKCpwU3RySW4gPj0gJzAnKSAmJiAoKnBTdHJJbiA8PSAnOScpKQotICAgIHsKLSAgICAgICAgcFN0ckluKys7Ci0gICAgICAgIGNockNvdW50Kys7Ci0gICAgfQotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZighY2hyQ291bnQpCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogaGFzIG92ZXJmbG93IChvciB1bmRlcmZsb3cpIG9jY3VyZWQgPyAqLwotICAgIGlmKChjaHJDb3VudCA+IG1heExlbikgLyogb2J2aW91cyBvdmVyZmxvdyAob3IgdW5kZXJmbG93KSAqLwotICAgICAgICB8fAotICAgICAgICAoKGNockNvdW50ID09IG1heExlbikgJiYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKiliZWdpbk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1heFN0ciwgbWF4TGVuKSA+IDApKSkKLSAgICAgICAgLyogbGVzcyBvYnZpb3VzIG92ZXJmbG93IChvciB1bmRlcmZsb3cpICovCi0gICAgewotICAgICAgICBpZihuZWdhdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBWYWwgPSBtaW5WYWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFZhbCA9IG1heFZhbDsKLSAgICAgICAgfQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gYmVnaW5OdW0rY2hyQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgcFN0ckluID0gYmVnaW5OdW07Ci0gICAgKnBWYWwgID0gMDsKLSAgICB3aGlsZSgoKnBTdHJJbiA+PSAnMCcpICYmICgqcFN0ckluIDw9ICc5JykpCi0gICAgewotICAgICAgICAqcFZhbCA9ICgqcFZhbCkqMTAgKyAoKnBTdHJJbisrIC0gJzAnKTsKLSAgICB9Ci0gICAgaWYobmVnYXRpdmUpCi0gICAgewotICAgICAgICAqcFZhbCA9IC0qcFZhbDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSBwU3RySW47Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotI2VsaWYgZGVmaW5lZCBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAotICAgIHJldHVybihNNE9TQV9jaHJHZXRJbnQzMihwU3RySW4sIChNNE9TQV9JbnQzMiopIHBWYWwsIHBTdHJPdXQsIE00T1NBX2tjaHJEZWMpKTsKLSNlbHNlCi0gICAgcmV0dXJuKE00RVJSX05PVF9JTVBMRU1FTlRFRCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfSW50MzIgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0bwotICogICAgICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVggb3IgTTRPU0FfSU5UMzJfTUlOIHJlc3BlY3RpdmVseS4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDMyX01BWCBvciBsZXNzIHRoYW4gTTRPU0FfSU5UMzJfTUlOCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldEludDMyKE00T1NBX0NoYXIqICAgICAgICBwU3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqICAgIHBTdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX0ludDMyIGw7Ci0gICAgY2hhciogICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0SW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfSW50MzIqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbixNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MzI6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVycm5vID0gMDsKLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKChlcnJubyA9PSBFUkFOR0UpICYmIChsID09IE00T1NBX0lOVDMyX01BWCkpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX0lOVDMyX01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gdW5kZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKChlcnJubyA9PSBFUkFOR0UpICYmIChsID09ICBNNE9TQV9JTlQzMl9NSU4pKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9JTlQzMl9NSU47Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfSW50MzIpbDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9JbnQxNiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9JbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHBWYWwgaXMgc2V0IHRvCi0gKiAgICAgICAgICAgICAgIE00T1NBX0lOVDE2X01BWCBvciBNNE9TQV9JTlQxNl9NSU4gcmVzcGVjdGl2ZWx5LgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfSU5UMTZfTUFYIG9yIGxlc3MgdGhhbiBNNE9TQV9JTlQxNl9NSU4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0SW50MTYoTTRPU0FfQ2hhciogICAgICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiogICAgcFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfSW50MzIgbDsKLSAgICBjaGFyKiAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRJbnQxNlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9JbnQxNiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0SW50MTY6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDE2Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKGw+TTRPU0FfSU5UMTZfTUFYKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9JTlQxNl9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIHVuZGVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZihsPE00T1NBX0lOVDE2X01JTikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfSU5UMTZfTUlOOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIG5vbWluYWwgY2FzZSAqLwotICAgICpwVmFsID0gKE00T1NBX1VJbnQxNilsOwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX0ludDggZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfSW50OCB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHBWYWwgaXMgc2V0IHRvCi0gKiAgICAgICAgICAgICAgIE00T1NBX0lOVDhfTUFYIG9yIE00T1NBX0lOVDhfTUlOIHJlc3BlY3RpdmVseS4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX0lOVDhfTUFYIG9yIGxlc3MgdGhhbiBNNE9TQV9JTlQ4X01JTgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRJbnQ4KE00T1NBX0NoYXIqICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDgqICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9JbnQzMiBsOwotICAgIGNoYXIqICAgICAgIHBUZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldEludDhcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfSW50OCogJXgiCi0gICAgICAgICAgICAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEludDg6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRJbnQ4Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICBsID0gc3RydG9sKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCAxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgbCA9IHN0cnRvbCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLCA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKGw+TTRPU0FfSU5UOF9NQVgpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX0lOVDhfTUFYOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiB1bmRlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYobDxNNE9TQV9JTlQ4X01JTikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfSU5UOF9NSU47Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDgpbDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9Eb3VibGUgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfRG91YmxlIHZhbHVlIHBWYWwuIHBTdHJPdXQgaXMgc2V0Ci0gKiAgICAgICAgICAgICB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBwVmFsIGlzIHNldCB0byBudWxsCi0gKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IGFuIHVuZGVyZmxvdyBvciBvdmVyZmxvdyBvY2N1cnMgZHVyaW5nIHRoZQotICogICAgICAgICAgICAgY29udmVyc2lvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0RG91YmxlKE00T1NBX0NoYXIqICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiAgICBwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCkKLXsKLSAgICBNNE9TQV9Eb3VibGUgZDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyR2V0RG91YmxlXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX0RvdWJsZSogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgpIixwU3RySW4scFZhbCxwU3RyT3V0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldERvdWJsZTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXREb3VibGU6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVycm5vID0gMDsKLSAgICBkID0gc3RydG9kKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXApOwotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwLjA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZihlcnJubyA9PSBFUkFOR0UpCi0gICAgewotICAgICAgICAqcFZhbCA9IDAuMDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9Eb3VibGUpZDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9UaW1lIGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgU2luY2UsIE00T1NBX1RpbWUgaXMgZGVmaW5lZCBhcyBNNE9TQV9JbnQ2NCwgaXQgY2FsbHMKLSAqICAgICAgICAgICAgIE00T1NBX2NockdldEludDY0KCkuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBvdXQgb2YgcmFuZ2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldFRpbWUoTTRPU0FfQ2hhciogICAgcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSogICAgcFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRUaW1lXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1RpbWUqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRUaW1lOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VGltZTpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcmV0dXJuIE00T1NBX2NockdldEludDY0KHBTdHJJbiwoTTRPU0FfSW50NjQqKXBWYWwscFN0ck91dCxiYXNlKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9GaWxlUG9zaXRpb24gZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBEZXBlbmRpbmcgb24gdGhlIE00T1NBX0ZpbGVQb3NpdGlvbiBkZWZpbml0aW9uLCB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICBjYWxscyB0aGUgY29ycmVzcG9kaW5nIHVuZGVybHlpbmcgdHlwZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKLSAqICAgICAgICAgICAgIG91dCBvZiByYW5nZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uKE00T1NBX0NoYXIqICAgICAgICAgICAgcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICAgICAgICAgIHBTdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgICAgICAgIGJhc2UpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldEZpbGVQb3NpdGlvblx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9GaWxlUG9zaXRpb24qICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0RmlsZVBvc2l0aW9uOlx0cFN0ckluIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVmFsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldEZpbGVQb3NpdGlvbjpcdHBWYWwgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9QT1NfNjRfQklUU19TVVBQT1JURUQKLSAgICByZXR1cm4gTTRPU0FfY2hyR2V0SW50NjQocFN0ckluLChNNE9TQV9JbnQ2NCopcFZhbCxwU3RyT3V0LGJhc2UpOwotI2Vsc2UKLSAgICByZXR1cm4gTTRPU0FfY2hyR2V0SW50MzIocFN0ckluLChNNE9TQV9JbnQzMiopcFZhbCxwU3RyT3V0LGJhc2UpOwotI2VuZGlmCi0KLX0KLQogTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYoTTRPU0FfQ2hhciAgKnBTdHJPdXQsIE00T1NBX1VJbnQzMiBzdHJPdXRNYXhMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmZvcm1hdCwgLi4uKQogewpAQCAtMTQ2NywxOSArNDAxLDkgQEAKIAogICAgIG5ld0Zvcm1hdExlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCkgKyAxOwogCi0jaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAotI2lmZGVmIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVECi0gICAgbmV3Rm9ybWF0TGVuZ3RoICs9IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0jZWxzZQotICAgIG5ld0Zvcm1hdExlbmd0aCArPSAoY291bnRfbGwrY291bnRfdG0tY291bnRfYWEpOwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVECiAgICAgbmV3Rm9ybWF0TGVuZ3RoIC09IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0jZWxzZQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0jZW5kaWYKIAotICAgIG5ld0Zvcm1hdCA9KE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyhuZXdGb3JtYXRMZW5ndGgsCisgICAgbmV3Rm9ybWF0ID0oTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld0Zvcm1hdExlbmd0aCwKICAgICAgICAgTTRPU0FfQ0hBUlNUQVIsKE00T1NBX0NoYXIqKSJNNE9TQV9jaHJQcmludGY6IG5ld0Zvcm1hdCIpOwogICAgIGlmKE00T1NBX05VTEwgPT0gbmV3Rm9ybWF0KQogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CkBAIC0xNTMyLDM2ICs0NTYsMTcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJsbCIsIDIpKQogICAgICAgICAgICAgewotI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWxsICovCi0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0jZWxzZQogICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotI2VuZGlmCiAgICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJ0bSIsIDIpKQogICAgICAgICAgICAgewotI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWxsICovCi0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0jZWxzZQogICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotI2VuZGlmCiAgICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgInRtIiBwcmVmaXggKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJhYSIsIDIpKQogICAgICAgICAgICAgewotI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKLSNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbGwgKi8KICAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsKLSNlbHNlCi0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAiYWEiIHByZWZpeCAqLwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTg4LDcgKzQ5Myw3IEBACiAKICAgICBlcnIgPSB2c25wcmludGYoKGNoYXIgKilwU3RyT3V0LCAoc2l6ZV90KXN0ck91dE1heExlbiArIDEsIChjb25zdCBjaGFyICopbmV3Rm9ybWF0LCBtYXJrZXIpOwogICAgIHZhX2VuZChtYXJrZXIpOwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiluZXdGb3JtYXQpOworICAgIGZyZWUobmV3Rm9ybWF0KTsKICAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKICAgICB7CiAgICAgICAgIHBTdHJPdXRbc3RyT3V0TWF4TGVuXSA9ICdcMCc7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYwppbmRleCA5MTQ4ZmU2Li44NWZlMzAzIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMKQEAgLTU4LDE3ICs1OCwxMCBAQAogewogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAogICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZSA9IDA7CiAgICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2hpOwogICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9sbzsKICAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbGg7Ci0jZWxzZSAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCi0gICAgTTRPU0FfSW50NjQgaTY0X3RpbWUgPSAwOwotICAgIE00T1NBX0ludDY0IGk2NF90aW1lX2hpOwotICAgIE00T1NBX0ludDY0IGk2NF90aW1lX2xvOwotICAgIE00T1NBX0ludDY0IGk2NF90ZW1wOwotI2VuZGlmIC8qIE00T1NBXzY0QklUU19TVVBQT1JURUQgKi8KICAgICBNNE9TQV9VSW50MzIgZmFjdG9yOwogCiAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2Nsb2NrR2V0VGltZVx0XHRNNE9TQV9UaW1lKiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLApAQCAtODMsNyArNzYsNiBAQAogCiAgICAgaWYoZ2V0dGltZW9mZGF5KCZ0diwgJnR6KSA9PSAwKQogICAgIHsKLSNpZmRlZiBNNE9TQV82NEJJVFNfTk9UX1NVUFBPUlRFRAogICAgICAgICB1MzJfdGltZV9sbyA9ICh0di50dl9zZWMgJiAweEZGRkYpICogdGltZXNjYWxlOwogICAgICAgICB1MzJfdGltZV9oaSA9ICgoKHR2LnR2X3NlYyA+PiAxNikgJiAweEZGRkYpICogdGltZXNjYWxlKSArICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKICAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwpAQCAtOTEsMTYgKzgzLDggQEAKICAgICAgICAgdTMyX3RpbWVfaGkgKz0gKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOwogICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7CiAgICAgICAgIHUzMl90aW1lID0gKCh1MzJfdGltZV9oaSAmIDB4N0ZGRikgPDwgMTYpIHwgdTMyX3RpbWVfbG87Ci0jZWxzZSAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCi0gICAgICAgIHR2LnR2X3VzZWMgLz0gZmFjdG9yOwotICAgICAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyX1VJTlQzMihpNjRfdGltZV9oaSwgMCwgdHYudHZfc2VjKTsKLSAgICAgICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMl9VSU5UMzIoaTY0X3RpbWVfbG8sIDAsIHR2LnR2X3VzZWMpOwotICAgICAgICBNNE9TQV9JTlQ2NF9TQ0FMQVJfUFJPRFVDVChpNjRfdGVtcCwgaTY0X3RpbWVfaGksIHRpbWVzY2FsZSk7Ci0gICAgICAgIE00T1NBX0lOVDY0X0FERChpNjRfdGltZSwgaTY0X3RlbXAsIGk2NF90aW1lX2xvKTsKLSNlbmRpZiAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCiAgICAgfQogCi0jaWZkZWYgTTRPU0FfNjRCSVRTX05PVF9TVVBQT1JURUQKICAgICAvKiBNNE9TQV9UaW1lIGlzIHNpZ25lZCwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWF4IHZhbHVlKi8KICAgICBpZiAodTMyX3RpbWUgPiBNNE9TQV9JTlQzMl9NQVgpCiAgICAgewpAQCAtMTEzLDE0ICs5Nyw2IEBACiAgICAgewogICAgICAgICByZXR1cm4gTTRXQVJfVElNRVNDQUxFX1RPT19CSUc7CiAgICAgfQotI2Vsc2UgLyogTTRPU0FfNjRCSVRTX1NVUFBPUlRFRCAqLwotICAgICpwVGltZSA9IChNNE9TQV9UaW1lKWk2NF90aW1lOwotCi0gICAgaWYoIHRpbWVzY2FsZSA+IDEwMDAwMDAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOwotICAgIH0KLSNlbmRpZiAvKiBNNE9TQV82NEJJVFNfU1VQUE9SVEVEICovCiAKICAgICByZXR1cm4gTTROT19FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDYWNoZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4MDQxMjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVDYWNoZS5jCi0gKgotICogQGJyaWVmICAgICAgICBPc2FsIEZpbGUgUmVhZGVyIGFuZCBXcml0ZXIgd2l0aCBjYWNoZQotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZQotICogICAgICAgICAgICAgICBmaWxlc3lzdGVtIGFjY2VzcyB3aXRoIGludGVybWVkaWF0ZSBidWZmZXJzIHVzZWQgdG8KLSAqICAgICAgICAgICAgICAgcmVhZCBhbmQgdG8gd3JpdGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRmlsZSBjYWNoZSBidWZmZXJzIHBhcmFtZXRlcnMgKHNpemUsIG51bWJlciBvZiBidWZmZXJzLCBldGMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSAgICAoOCoxMDI0KQotI2RlZmluZSBNNE9TQV9DQUNIRUJVRkZFUl9OQiAgICA2Ci0jZGVmaW5lIE00T1NBX0NBQ0hFQlVGRkVSX05PTkUgICAgLTEKLSNkZWZpbmUgTTRPU0FfQ0FDSEVCVUZGRVJfQUxMICAgIC0yCi0jZGVmaW5lIE00T1NBX0VPRiAgICAgICAgICAgICAgIC0xCi0KLS8qKiBTdHJhdGVneSB1c2VkIGJ5IE9zYWwgRmlsZSBDYWNoZSB0byBmbHVzaCB0aGUgYnVmZmVycyB0byBkaXNrLgotRGVwZW5kaW5nIG9uIHRoZSBzZXJ2aWNlLCB0aGUgc3RyYXRlZ3kgd2lsbCBoYXZlIG1vcmUgb3IgbGVzcyBzdWNjZXNzICovCi0vLyNkZWZpbmUgQlVGRkVSX1NFTEVDVF9JTklUSUFMICAgICAgICAvKiogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBPc2FsIEZpbGUgUmVhZGVyIG9wdGltICovCi0vLyNkZWZpbmUgQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUgICAgLyoqIFRvIGZsdXNoIGluIHByaW9yaXR5IHRoZSBidWZmZXJzIHdoaWNoIGhhdmUgbm90IGJlZW4gdXNlZCBmb3IgYSBjZXJ0YWluIHRpbWUgKi8KLS8vI2RlZmluZSBCVUZGRVJfU0VMRUNUX1dJVEhfU1BBQ0UgICAgLyoqIFRvIGZsdXNoIGluIHByaW9yaXR5IHRoZSBidWZmZXJzIHdoaWNoIGhhdmUgbm90IGJlZW4gdXNlZCBhIGxvdCBvZiB0aW1lcyAqLwotI2RlZmluZSBCVUZGRVJfU0VMRUNUX1dJVEhfUE9TICAgIC8qKiBUbyBmbHVzaCBpbiBwcmlvcml0eSB0aGUgYnVmZmVycyB3aGljaCBoYXZlIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBvbiB0aGUgZmlsZSAqLwotCi0vKiB0byBtZWFzdXJlIHN1Y2Nlc3Mgb2YgY2FjaGUgb3BlcmF0aW9ucyAqLwotLy8jZGVmaW5lIEZJTEVDQUNIRV9TVEFUUwotCi0vKiBGb3IgcGVyZm9ybWFuY2UgbWVhc3VyZSAqLwotLy8jZGVmaW5lIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0KLS8qKiogIFRvIGRlYnVnICovCi0vLyNkZWZpbmUgTk9fU1RSQVRFR1kKLS8vI2RlZmluZSBCVUZGRVJfRElTUExBWQotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSNpbmNsdWRlICJNNE9TQV9jbG9jay5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgICBmaWxlT3BlbnRpbWUsCi0gICAgZmlsZUNsb3NldGltZSwKLSAgICBmaWxlUmVhZERhdGF0aW1lLAotICAgIGZpbGVXcml0ZURhdGF0aW1lLAotICAgIGZpbGVTZWVrdGltZSwKLSAgICBmaWxlR2V0T3B0aW9udGltZSwKLSAgICBmaWxlU2V0T3B0aW9udGltZSwKLSAgICBmaWxlRXh0ZXJuYWxGbHVzaHRpbWUsCi0gICAgZW51bV9zaXplICAgIC8qIGZvciBlbnVtIHNpemUgKi8KLX0gTTRPU0FfZmlsZXRpbWVUeXBlOwotCi10eXBlZGVmICAgIE00T1NBX1RpbWUgVGFiRmlsZXRpbWVbZW51bV9zaXplKzFdOwotCi12b2lkIE00T1NBX0ZpbGVDYWNoZV9pbml0VGltZU1lYXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci12b2lkIE00T1NBX0ZpbGVDYWNoZV9kaXNwbGF5VGltZU1lYXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLwotCi0vKiBBTlNJIEMqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotLyogRW5kOiBBTlNJIEMgaW5jbHVkZXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNhY2hlLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLQotCi0jZGVmaW5lIExPQ0sgXAotICAgIE00T1NBX211dGV4TG9jayhhcENvbnRleHQtPm1fbXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSNkZWZpbmUgVU5MT0NLIFwKLSAgICBNNE9TQV9tdXRleFVubG9jayhhcENvbnRleHQtPm1fbXV0ZXgpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIEZpbGVEZXNjOwotfSBNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAoKnBGY3RQdHJfT3BlbikoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1JlYWQpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfV3JpdGUpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfU2VlaykoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1RlbGwpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOwotICAgIE00T1NBX0ludDMyICAgICAgICAoKnBGY3RQdHJfQ2xvc2UpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgKCpwRmN0UHRyX0FjY2Vzc1R5cGUpKCBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3NfSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBGaWxlTW9kZUFjY2Vzc19PdXQgKTsKLQotfSBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cl9jYWNoZTsKLQotTTRPU0FfVm9pZCogTTRPU0FfRmlsZVN5c3RlbV9GRlNfT3Blbl9jYWNoZSggTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKLU00T1NBX0ludDMyIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX0Nsb3NlX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApOwotTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX1JlYWRfY2FjaGUoIE00T1NBX1ZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7Ci1NNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVN5c3RlbV9GRlNfV3JpdGVfY2FjaGUoIE00T1NBX1ZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fICk7Ci1NNE9TQV9JbnQzMiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19TZWVrX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm9fZmZzICk7Ci1NNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVN5c3RlbV9GRlNfVGVsbF9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVPcGVuX2NhY2hlX2ludGVybmFsKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHJfY2FjaGUgKkZTKTsKLQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLVVzZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgIF4KLSAgICAgICAgICAgICAgICAgICB8Ci0tLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tCi18RmlsbGVkfCAgICB8Q29waWVkfCAgICB8TW9kaWZpZWR8Ci0tLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tCi0gIF4KLSAgfAotLS0tLS0tLS0tLS0tLS0tLS0tRGlzay0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF0b21pYyBzdGF0ZXMgZm9yIGEgYnVmZmVyOgotCi0weDAwICAgIGluaXRpYWxpemVkIG9yIGZsdXNoZWQgKFdoZW4gaXQgaXMgaW5pdGlhbGl6ZWQgYWdhaW4sIGl0IGlzIGZsdXNoZWQgaWYgbmVjZXNzYXJ5KQotMHgwMSAgICBGaWxsZWQgZnJvbSBkaXNrCi0weDAzICAgIEZpbGxlZCBhbmQgQ29waWVkIHRvIHVzZXIKLQotMHg4MCAgICBNb2RpZmllZCBhbmQgbmV3bHkgY3JlYXRlZCAoZG9lcyBub3QgZXhpc3Qgb24gZGlzaykgPT4gbXVzdCBiZSBmbHVzaGVkCi0weDgzICAgIE1vZGlmaWVkIGFmdGVyIGhhdmluZyBiZWVuIHJlYWQgZnJvbSBkaXNrID0+IG11c3QgYmUgZmx1c2hlZAotCi0qLwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE9TQV9rSW5pdGlhbGl6ZWQgPSAwLAotICAgIE00T1NBX2tGaWxsZWQgPSAweDEsCi0gICAgTTRPU0Ffa0NvcGllZCA9IDB4MiwKLSAgICBNNE9TQV9rTW9kaWZpZWQgPSAweDgwCi19IE00T1NBX0ZpbGVDYWNoZVN0YXRlQXRvbWljOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXIKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIEJ1ZmZlcnMgY29udGV4dCAocHJpdmF0ZSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgICAgZGF0YTsgICAgICAgIC8qKjwgYnVmZmVyIGRhdGEgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhlIGJ1ZmZlciAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZXBvczsgICAgLyoqPCBwb3NpdGlvbiBpbiB0aGUgZmlsZSBvZiB0aGUgYnVmZmVyJ3MgZmlyc3Qgb2N0ZXQgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHJlbWFpbjsgICAgICAgIC8qKjwgZGF0YSBhbW91bnQgbm90IGFscmVhZHkgY29waWVkIGZyb20gYnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG5iRmlsbFNpbmNlTGFzdEFjZXNzOyAgICAvKio8IFRvIGtub3cgc2luY2UgaG93IG1hbnkgdGltZSB3ZSBkaWRuJ3QgdXNlIHRoaXMgYnVmZmVyLiB0byBkZXRlY3QgIGRlYWQgYnVmZmVycyAqLwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICBuYkFjY2Vzc2VkOyAgICAgICAgICAgIC8qKjwgbmIgb2YgdGltZXMgdGhlIGJ1ZmZlciBoYXMgYmVlbiBhY2Nlc3NlZCB3aXRob3V0IGJlaW5nIHJlaW5pdGlhbGl6ZWQgKi8KLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgdGltZUFjY2Vzc2VkOyAgICAgICAgIC8qKjwgbGFzdCB0aW1lIGF0IHdoaWNoIHRoZSBidWZmZXIgaGFzIGJlZW4gYWNjZXNzZWQgd2l0aG91dCBiZWluZyByZWluaXRpYWxpemVkICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIHN0YXRlOwotfSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgRmlsZSBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICBJc09wZW5lZDsgICAgICAgICAgICAgICAvKio8IE1pY3JvIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBNNE9TQV9GaWxlQXR0cmlidXRlIEZpbGVBdHRyaWJ1dGU7ICAgICAgICAgIC8qKjwgT3BlbmluZyBtb2RlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICByZWFkRmlsZVBvczsgICAgICAgICAgICAvKio8IEVmZmVjdGl2ZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBhYnNvbHV0ZVBvczsgICAgICAgICAgICAvKio8IFZpcnR1YWwgcG9zaXRpb24gZm9yIG5leHQgcmVhZGluZyAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgYWJzb2x1dGVXcml0ZVBvczsgICAgICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCB3cml0aW5nICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBmaWxlU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBmaWxlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICB2aXJ0dWFsRmlsZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KLQotICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXIgYnVmZmVyW000T1NBX0NBQ0hFQlVGRkVSX05CXTsgIC8qKjwgYnVmZmVycyAqLwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgYUZpbGVEZXNjOyAgICAgICAgICAvKio8IEZpbGUgZGVzY3JpcHRvciAqLwotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyX2NhY2hlICpGUzsgICAgICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLwotCi0jaWZkZWYgRklMRUNBQ0hFX1NUQVRTCi0gICAgTTRPU0FfVUludDMyICAgICAgICBjYWNoZVN1Y2Nlc3NSZWFkOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgY2FjaGVTdWNjZXNzV3JpdGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBuYlJlYWRDYWNoZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG5iV3JpdGVDYWNoZTsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJSZWFkRkZTOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJXcml0ZUZGUzsKLSNlbmRpZiAvKiBGSUxFQ0FDSEVfU1RBVFMgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICBtX211dGV4OwotCi0gICAgTTRPU0FfVGltZSAgICAgICAgICAgIGNocm9ubzsKLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgbV9maWxlbmFtZVsyNTZdOwotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBUYWJGaWxldGltZSAgICAgICAgICAgIGdNeVBlcmZGaWxlVGFiOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLX0gTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQ7Ci0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuIChyZXR2YWwpOwotCi0vKiB1c2VkIHRvIGRldGVjdCBkZWFkIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTICAgIE00T1NBX0NBQ0hFQlVGRkVSX05CKjIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgIFF1aWNrIFNvcnQgZnVuY3Rpb24gICAgKHByaXZhdGUpICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLU00T1NBX1ZvaWQgTTRPU0FfRmlsZUNhY2hlX2ludGVybmFsUXVpY2tzb3J0KE00T1NBX0ludDMyKiBjb25zdCB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNNE9TQV9JbnQzMiBmaXJzdCAsIGNvbnN0IE00T1NBX0ludDMyIGxhc3QpCi0gewotICAgIE00T1NBX0ludDMyIHN0YXJ0SW5kZXg7Ci0gICAgTTRPU0FfSW50MzIgZW5kSW5kZXg7Ci0gICAgTTRPU0FfSW50MzIgYmVnaW47Ci0gICAgTTRPU0FfSW50MzIgZW5kOwotICAgIE00T1NBX0ludDMyIHBpdm90OwotICAgIE00T1NBX0ludDMyIHRlbXA7Ci0gICAgTTRPU0FfSW50MzIgaW5kZXg9MDsKLSAgICBNNE9TQV9JbnQzMiBzaXplPTA7Ci0gICAgTTRPU0FfSW50MzIgY2FwYWNpdHkgPSBNNE9TQV9DQUNIRUJVRkZFUl9OQiAqIDU7Ci0gICAgLy9hbGxvY2F0aW9uIG9mIHRoZSBmaWZvCi0gICAgTTRPU0FfSW50MzIqIHF1ZXVlID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiogY3Vyc29yOwotICAgIE00T1NBX0ludDMyKiBpbmRleGM7Ci0KLSAgICBxdWV1ZSA9IChNNE9TQV9JbnQzMiopTTRPU0FfbWFsbG9jKGNhcGFjaXR5KnNpemVvZihNNE9TQV9JbnQzMiksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikgInF1aWNrc29ydCBGSUZPIG9mIEZpbGVDYWNoZSIpOwotCi0gICAgaWYocXVldWUgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuOwotICAgIGN1cnNvciA9IHF1ZXVlOwotICAgIGluZGV4YyA9IHF1ZXVlOwotICAgICooY3Vyc29yKyspID0gZmlyc3Q7IC8vcmVtZW1iZXIgdGhlIGFycmF5IGZpcnN0IGVsZW1lbnQKLSAgICAqKGN1cnNvcisrKSA9IGxhc3Q7ICAgIC8vcmVtZW1iZXIgdGhlIGFycmF5IGVuZAotICAgIGluZGV4ID0gMDsKLSAgICBzaXplID0gMjsKLSAgICBkbwotICAgIHsKLSAgICAgICAgc3RhcnRJbmRleCAgID0gKihpbmRleGMrKyk7Ci0gICAgICAgIGVuZEluZGV4ICAgID0gKihpbmRleGMrKyk7Ci0gICAgICAgIGluZGV4Kz0yOwotICAgICAgICBpZihzdGFydEluZGV4IDwgZW5kSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlZ2luICAgID0gc3RhcnRJbmRleDsKLSAgICAgICAgICAgIGVuZCAgICAgICAgPSBlbmRJbmRleDsKLSAgICAgICAgICAgIHBpdm90ICAgID0gdGFibGVbZW5kSW5kZXhdOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIChiZWdpbiA8IGVuZEluZGV4KSAmJiAodGFibGVbYmVnaW5dPD1waXZvdCkgKQotICAgICAgICAgICAgICAgICAgICBiZWdpbisrOwotICAgICAgICAgICAgICAgIHdoaWxlICggKGVuZCA+IGJlZ2luKSAmJiAodGFibGVbZW5kXT49cGl2b3QpICkKLSAgICAgICAgICAgICAgICAgICAgZW5kLS07Ci0gICAgICAgICAgICAgICAgaWYgKGJlZ2luIDwgZW5kKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCAgICAgICAgICAgID0gdGFibGVbZW5kXTsKLSAgICAgICAgICAgICAgICAgICAgdGFibGVbZW5kXSAgICAgICAgPSB0YWJsZVtiZWdpbl07Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2JlZ2luXSAgICA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfXdoaWxlKGJlZ2luIDwgZW5kKTsKLQotICAgICAgICAgICAgdGVtcCAgICAgICAgICAgID0gdGFibGVbZW5kSW5kZXhdOwotICAgICAgICAgICAgdGFibGVbZW5kSW5kZXhdICAgICAgICA9IHRhYmxlW2JlZ2luXTsKLSAgICAgICAgICAgIHRhYmxlW2JlZ2luXSAgICA9IHRlbXA7Ci0gICAgICAgICAgICAqKGN1cnNvcisrKSA9IHN0YXJ0SW5kZXg7Ci0gICAgICAgICAgICAqKGN1cnNvcisrKSA9IGJlZ2luLTE7Ci0gICAgICAgICAgICAqKGN1cnNvcisrKSA9IGJlZ2luKzE7Ci0gICAgICAgICAgICAqKGN1cnNvcisrKSA9ICBlbmRJbmRleDsKLSAgICAgICAgICAgIHNpemUrPTQ7Ci0gICAgICAgICAgICBpZihzaXplPT1jYXBhY2l0eSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiT3ZlcmZsb3cgaW4gcXVpY2tTb3J0LiBpbmNyZWFzZSBjYXBhY2l0eSBzaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHdoaWxlKGluZGV4PHNpemUpOwotICAgIGN1cnNvciA9IE5VTEw7Ci0gICAgaW5kZXhjID0gTlVMTDsKLSAgICBNNE9TQV9mcmVlKHF1ZXVlKTsKLX0KLQotTTRPU0FfVm9pZCBNNE9TQV9GaWxlQ2FjaGVfaW50ZXJuYWxRdWlja3NvcnQ2NChNNE9TQV9JbnQ2NCogY29uc3QgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTTRPU0FfSW50MzIgZmlyc3QgLCBjb25zdCBNNE9TQV9JbnQzMiBsYXN0KQotIHsKLSAgICBNNE9TQV9JbnQzMiBzdGFydEluZGV4OwotICAgIE00T1NBX0ludDMyIGVuZEluZGV4OwotICAgIE00T1NBX0ludDMyIGJlZ2luOwotICAgIE00T1NBX0ludDMyIGVuZDsKLSAgICBNNE9TQV9JbnQ2NCBwaXZvdDsKLSAgICBNNE9TQV9JbnQ2NCB0ZW1wOwotICAgIE00T1NBX0ludDMyIGluZGV4PTA7Ci0gICAgTTRPU0FfSW50MzIgc2l6ZT0wOwotICAgIE00T1NBX0ludDMyIGNhcGFjaXR5ID0gTTRPU0FfQ0FDSEVCVUZGRVJfTkIgKiA1OwotICAgIC8vYWxsb2NhdGlvbiBvZiB0aGUgZmlmbwotICAgIE00T1NBX0ludDMyKiBxdWV1ZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIqIGN1cnNvcjsKLSAgICBNNE9TQV9JbnQzMiogaW5kZXhjOwotCi0gICAgcXVldWUgPSAoTTRPU0FfSW50MzIqKU00T1NBX21hbGxvYyhjYXBhY2l0eSpzaXplb2YoTTRPU0FfSW50MzIpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopICJxdWlja3NvcnQgRklGTyBvZiBGaWxlQ2FjaGUiKTsKLQotICAgIGlmKHF1ZXVlID09IE00T1NBX05VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBjdXJzb3IgPSBxdWV1ZTsKLSAgICBpbmRleGMgPSBxdWV1ZTsKLSAgICAqKGN1cnNvcisrKSA9IGZpcnN0OyAvL3JlbWVtYmVyIHRoZSBhcnJheSBmaXJzdCBlbGVtZW50Ci0gICAgKihjdXJzb3IrKykgPSBsYXN0OyAgICAvL3JlbWVtYmVyIHRoZSBhcnJheSBlbmQKLSAgICBpbmRleCA9IDA7Ci0gICAgc2l6ZSA9IDI7Ci0gICAgZG8KLSAgICB7Ci0gICAgICAgIHN0YXJ0SW5kZXggICA9ICooaW5kZXhjKyspOwotICAgICAgICBlbmRJbmRleCAgICA9ICooaW5kZXhjKyspOwotICAgICAgICBpbmRleCs9MjsKLSAgICAgICAgaWYoc3RhcnRJbmRleCA8IGVuZEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBiZWdpbiAgICA9IHN0YXJ0SW5kZXg7Ci0gICAgICAgICAgICBlbmQgICAgICAgID0gZW5kSW5kZXg7Ci0gICAgICAgICAgICBwaXZvdCAgICA9IHRhYmxlW2VuZEluZGV4XTsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAoYmVnaW4gPCBlbmRJbmRleCkgJiYgKHRhYmxlW2JlZ2luXTw9cGl2b3QpICkKLSAgICAgICAgICAgICAgICAgICAgYmVnaW4rKzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIChlbmQgPiBiZWdpbikgJiYgKHRhYmxlW2VuZF0+PXBpdm90KSApCi0gICAgICAgICAgICAgICAgICAgIGVuZC0tOwotICAgICAgICAgICAgICAgIGlmIChiZWdpbiA8IGVuZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgICAgICAgICAgICA9IHRhYmxlW2VuZF07Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2VuZF0gICAgICAgID0gdGFibGVbYmVnaW5dOwotICAgICAgICAgICAgICAgICAgICB0YWJsZVtiZWdpbl0gICAgPSB0ZW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH13aGlsZShiZWdpbiA8IGVuZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgICAgICAgICAgICA9IHRhYmxlW2VuZEluZGV4XTsKLSAgICAgICAgICAgIHRhYmxlW2VuZEluZGV4XSAgICAgICAgPSB0YWJsZVtiZWdpbl07Ci0gICAgICAgICAgICB0YWJsZVtiZWdpbl0gICAgPSB0ZW1wOwotICAgICAgICAgICAgKihjdXJzb3IrKykgPSBzdGFydEluZGV4OwotICAgICAgICAgICAgKihjdXJzb3IrKykgPSBiZWdpbi0xOwotICAgICAgICAgICAgKihjdXJzb3IrKykgPSBiZWdpbisxOwotICAgICAgICAgICAgKihjdXJzb3IrKykgPSAgZW5kSW5kZXg7Ci0gICAgICAgICAgICBzaXplKz00OwotICAgICAgICAgICAgaWYoc2l6ZT09Y2FwYWNpdHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk92ZXJmbG93IGluIHF1aWNrU29ydC4gaW5jcmVhc2UgY2FwYWNpdHkgc2l6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZShpbmRleDxzaXplKTsKLSAgICBjdXJzb3IgPSBOVUxMOwotICAgIGluZGV4YyA9IE5VTEw7Ci0gICAgTTRPU0FfZnJlZShxdWV1ZSk7Ci19Ci0KLS8qIFNvcnRzIGFuIGFycmF5IG9mIHNpemUgc2l6ZSAqLwotTTRPU0FfVm9pZCBNNE9TQV9GaWxlQ2FjaGVfUVNfcXVpY2tTb3J0IChNNE9TQV9GaWxlUG9zaXRpb24gYXJyYXlbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpCi17Ci0gICAgaWYgKHNpemU9PTEgfHwgc2l6ZT09MCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJTb3J0IG5vdCBuZWNlc3NhcnkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE00T1NBX0ZpbGVDYWNoZV9pbnRlcm5hbFF1aWNrc29ydChhcnJheSwwLHNpemUtMSk7Ci19Ci0KLU00T1NBX1ZvaWQgTTRPU0FfRmlsZUNhY2hlX1FTX3F1aWNrU29ydDY0IChNNE9TQV9UaW1lIGFycmF5W10sIE00T1NBX1VJbnQzMiBzaXplKQotewotICAgIGlmIChzaXplPT0xIHx8IHNpemU9PTApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiU29ydCBub3QgbmVjZXNzYXJ5Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNNE9TQV9GaWxlQ2FjaGVfaW50ZXJuYWxRdWlja3NvcnQ2NChhcnJheSwwLHNpemUtMSk7Ci19Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgIEJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgZm9yIFJXIGFjY2VzcyAgKHByaXZhdGUpICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzSW5pdChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSA9IE00T1NBX2tJbml0aWFsaXplZDsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCkmKGFwQ29udGV4dC0+YnVmZmVyW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX0ZpbGVDYWNoZV9CdWZmZXIpICwgMCk7Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfbWFsbG9jKE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIqKSJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVySW5pdCIpOwotICAgICAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBNNE9TQV9FT0Y7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZyZWUoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci0gICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotI2lmZGVmIEJVRkZFUl9ESVNQTEFZCi1NNE9TQV9Wb2lkIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJEaXNwbGF5KE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiLS0tLS0tIEJ1ZmZlcnMgZGlzcGxheSAiKTsKLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfNSgiLS0tLS0tIEJ1ZiVkIDogRmlsZVBvcz0lZCBzdGF0ZT0weCV4IG5iQWNjZXNzZWQ9JWQgLS0gdGltZUFjY2Vzc2VkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iQWNjZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lQWNjZXNzZWQpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKLX0KLSNlbmRpZgotCi0KLS8qIHJlYWRzIGZyb20gYW4gZXhpc3RpbmcgYnVmZmVyIChudW1iZXIgaSkgYXQgYWJzb2x1dGUgcG9zaXRpb24gcG9zIGFuZCBmaWxscyBwRGF0YS4gaXQgcmVhZHMgbWF4aW11bSBvbmUgYmxvYyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJDb3B5KE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBEYXRhKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3B5c2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIkJ1ZmZlckNvcHkgb2YgJWQsIHBvcz0lZCIsIGksIHBvcyk7Ci0KLSAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID09IE00T1NBX0VPRikgcmV0dXJuIE00T1NBX0VPRjsKLQotICAgIC8qIHZlcmlmaWNhdGlvbiBwb3MgaXMgaW5zaWRlIGJ1ZmZlciBpKi8KLSAgICBpZiggICAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICB8fCAocG9zID4gKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gMSkpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIGNvcGllZCAqLwotICAgIH0KLQotICAgIG9mZnNldCA9IHBvcyAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7ICAgIC8qIG9mZnNldCB0byByZWFkIGZyb20gaW4gdGhlIGJ1ZmZlciAqLwotCi0gICAgY29weXNpemUgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gb2Zmc2V0OyAgICAvKiBidWZmZXIgc2l6ZSAtIG9mZnNldCwgaXQgaXMgdGhlIG1heGltdW0gd2UgY2FuIHJlYWQgZnJvbSBhIGJ1ZmZlciAqLwotICAgIGNvcHlzaXplID0gKHNpemUgPCBjb3B5c2l6ZSkgPyBzaXplIDogY29weXNpemU7IC8qIGFkanVzdCBpbiBjYXNlIHVzZXIgd2FudHMgdG8gcmVhZCBsZXNzIHRoYW4gdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIgKGNvcHlzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IGNhc2UsIHRha2UgdGhlIG1pbihjb3B5c2l6ZSwgc2l6ZSkqLwotCi0gICAgTTRPU0FfbWVtY3B5KHBEYXRhLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICsgb2Zmc2V0LCBjb3B5c2l6ZSk7Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gLT0gY29weXNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0KLSAgICAvKiBpdCBpcyBhIHJlYWQgYWNjZXNzICovCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCsrOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCA9IGFwQ29udGV4dC0+Y2hyb25vOwotICAgIGFwQ29udGV4dC0+Y2hyb25vKys7Ci0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlIHw9IE00T1NBX2tDb3BpZWQ7Ci0KLSAgICByZXR1cm4gY29weXNpemU7Ci19Ci0KLS8qIHdyaXRlcyBvbiBjYWNoZS4gYXQgYWJzb2x1dGUgcG9zaXRpb24gcG9zIGFuZCB3cml0ZXMgcERhdGEgdG8gdGhlIGJ1ZmZlci4gaXQgd3JpdGVzIG1heGltdW0gb25lIGJsb2MgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyTW9kaWZ5Q29udGVudChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwRGF0YSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29weXNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG9mZnNldCwgZ3JpZFBvczsKLQotICAgIE00T1NBX1RSQUNFM18yKCJCdWZmZXJNb2RpZnkgb2YgJWQsIHBvcz0lZCIsIGksIHBvcyk7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGdyaWRQb3MgPSAocG9zIC8gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkgKiBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFOwotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IGdyaWRQb3M7Ci0KLSAgICAvKiBpbiBjYXNlIG9mIGFuIGV4aXN0aW5nIGJsb2NrIChub3QgYXQgZW9mKSAqLwotICAgIGlmICAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplICE9IDApCi0gICAgewotICAgICAgICAvKiB0ZXN0IGlmIHdlIGFyZSBhbHJlYWR5IGluc2lkZSB0aGlzIGJ1ZmZlciAqLwotICAgICAgICBpZiAoICAgKHBvcyA8IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCi0gICAgICAgICAgIHx8IChwb3MgPiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCdWZmZXJNb2RpZnkgRVJSIG5vdGhpbmcgY29waWVkLCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsgLyogbm90aGluZyBjb3BpZWQgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIG9mZnNldCA9IHBvcyAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7ICAgIC8qIG9mZnNldCB0byB3cml0ZSB0bywgaW4gdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogYnVmZmVyIHNpemUgLSBvZmZzZXQsIGl0IGlzIHRoZSBtYXhpbXVtIHdlIGNhbiB3cml0ZSBpbnRvIGEgYnVmZmVyICovCi0gICAgY29weXNpemUgPSBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFIC0gb2Zmc2V0OwotICAgIC8qIGFkanVzdCBpbiBjYXNlIHVzZXIgd2FudHMgdG8gd3JpdGUgbGVzcyB0aGFuIHRoZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIChjb3B5c2l6ZSkgaW4gdGhhdCBjYXNlLCB0YWtlIHRoZSBtaW4oY29weXNpemUsIHNpemUpKi8KLSAgICBjb3B5c2l6ZSA9IChjb3B5c2l6ZSA8IHNpemUpID8gY29weXNpemUgOiBzaXplOwotCi0gICAgTTRPU0FfbWVtY3B5KGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQsIHBEYXRhLCBjb3B5c2l6ZSk7Ci0KLSAgICAvKiB1cGRhdGUgYnVmZmVyIHNpemUgaWYgaXQgaXMgYSBuZXcgYnVmZmVyIG9yIGV4cGFuZGVkIG9uZSovCi0gICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBjb3B5c2l6ZStvZmZzZXQpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gY29weXNpemUrb2Zmc2V0OwotICAgIH0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUgLSBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplOyAvKiBub3QgdGVtcG9yYXJ5ICovCi0KLSAgICAvKiBtYXJrIHRoaXMgYnVmZmVyIGFzIG1vZGlmaWVkICovCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgfD0gTTRPU0Ffa01vZGlmaWVkOwotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iQWNjZXNzZWQrKzsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lQWNjZXNzZWQgPSBhcENvbnRleHQtPmNocm9ubzsKLSAgICBhcENvbnRleHQtPmNocm9ubysrOwotCi0gICAgcmV0dXJuIGNvcHlzaXplOwotfQotCi0KLS8qIHdyaXRlcyBpbiBhIGJ1ZmZlciAobnVtYmVyIGkpIHdpdGggdGhlIGRhdGEgcmVhZCBmcm9tIGRpc2sqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBncmlkUG9zOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBkaWZmOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyIHJldF92YWw7Ci0gICAgTTRPU0FfVUludDE2IGVyclJldHVybmVkOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIkJ1ZmZlckZpbGwgIGkgPSAlZCAgcG9zID0gJWQiLCBpLCBwb3MpOwotCi0gICAgLyogQXZvaWQgY3ljbGluZyBzdGF0ZW1lbnQgYmVjYXVzZSBvZiBFT0YgKi8KLSAgICBpZihwb3MgPiBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSkKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotCi0gICAgLyogUmVsb2NhdGUgdG8gYWJzb2x1dGUgcG9zdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBncmlkUG9zID0gKHBvcyAvIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUpICogTTRPU0FfQ0FDSEVCVUZGRVJfU0laRTsKLQotICAgIC8qIGRpZmYgaXMgaG93IG11Y2ggc2hhbGwgd2UgZnNfc2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gcmVhY2ggZ3JpZFBvcyovCi0gICAgZGlmZiA9IGdyaWRQb3MgLSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgLyogb24gc29tZSBmaWxlc3lzdGVtcyBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gYSBzZWVrIGJldHdlZW4gYW4gZmZzIHJlYWQgYW5kIGZmcyB3cml0ZSBldmVuIGlmIGl0IGlzIHNhbWUgcG9zICovCi0gICAgICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZXJyUmV0dXJuZWQpOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihyZXRfdmFsICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJyUmV0dXJuZWQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAvKiBlbmQuIG9uIHNvbWUgKi8KLQotLyogdGhlIGJ1ZmZlciB3aWxsIGJlIHJldXNlZCB0byBiZSBmaWxsZWQgd2l0aCBhbm90aGVyIGZpbGVwb3Mgc28gcmVpbml0IGNvdW50ZXJzIG9mIGFjY2VzcyAqLwotICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICAhPSBncmlkUG9zKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCA9IDA7Ci0gICAgfQotCi0gICAgLyogc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGlzIGJ1ZmZlciAqLwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBncmlkUG9zOwotCi0gICAgLyogUmVhZCBEYXRhICovCi0gICAgc2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfUmVhZChhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFLCAmZXJyUmV0dXJuZWQpOwotCi0jaWZkZWYgRklMRUNBQ0hFX1NUQVRTCi0gICAgYXBDb250ZXh0LT5uYlJlYWRGRlMrKzsKLSNlbmRpZiAvKiBGSUxFQ0FDSEVfU1RBVFMgKi8KLQotICAgIGlmKHNpemUgPT0gLTEpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotCi0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJyUmV0dXJuZWQpOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IHNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0KLSAgICAvKiBSZXRyaWV2ZSBjdXJyZW50IHBvc2l0aW9uICovCi0gICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJSZXR1cm5lZCk7Ci0KLSAgICBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQotICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogbWFyayB0aGlzIGJ1ZmZlciBhcyBtb2RpZmllZCAqLwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlIHw9IE00T1NBX2tGaWxsZWQ7Ci0KLSAgICAvKiBpdCBpcyBhIHdyaXRlIGFjY2VzcyAqLwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iQWNjZXNzZWQrKzsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lQWNjZXNzZWQgPSBhcENvbnRleHQtPmNocm9ubzsKLSAgICBhcENvbnRleHQtPmNocm9ubysrOwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyogIFJlaW5pdGlhbGl6ZXMgYSBidWZmZXIgZm9yIGZpbGxpbmcgaXQgZm9yIGRhdGEgYXQgZW5kIG9mIGZpbGUuIGZpbGVwb3NpdGlvbiBpcyBnaXZlbiAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJSZWluaXRpYWxpemUoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQ4IGksIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGdyaWRQb3M7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9NZW1BZGRyOCBzYXZlRGF0YUFkZHJlc3M7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiQnVmZmVyUmVpbml0aWFsaXplIGkgPSAlZCAgcG9zID0gJWQiLCBpLCBwb3MpOwotCi0gICAgLyogUmVsb2NhdGUgdG8gYWJzb2x1dGUgcG9zdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocG9zICE9IC0xKQotICAgICAgICBncmlkUG9zID0gKHBvcyAvIE00T1NBX0NBQ0hFQlVGRkVSX1NJWkUpICogTTRPU0FfQ0FDSEVCVUZGRVJfU0laRTsKLSAgICBlbHNlCi0gICAgICAgIGdyaWRQb3MgPSAtMTsKLQotICAgIC8qIFJBWiB0aGUgYnVmZmVyLCBvbmx5ICJkYXRhIGFkZHJlc3MiIHN0YXlzKi8KLSAgICBzYXZlRGF0YUFkZHJlc3MgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhOwotCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCkmKGFwQ29udGV4dC0+YnVmZmVyW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX0ZpbGVDYWNoZV9CdWZmZXIpICwgMCk7Ci0KLSAgICAvKiBwdXQgYWdhaW4gdGhlIHByZWNpb3VzICJkYXRhIGFkZHJlc3MiIHByZXZpb3VzbHkgYWxsb2NhdGVkICovCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IHNhdmVEYXRhQWRkcmVzczsKLQotICAgIC8qIGluaXRpYWxpemF0aW9ucyBhbHJlYWR5IGRvbmUgaW4gdGhlIG1lbXNldDogKi8KLSAgICAvKiBtYXJrIHRoaXMgYnVmZmVyIGFzIGluaXRpYWxpemVkKi8KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZT0gTTRPU0Ffa0luaXRpYWxpemVkOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iQWNjZXNzZWQgPSAwOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCA9IDA7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBncmlkUG9zOwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKiBmbHVzaGVzIGEgYnVmZmVyIChudW1iZXIgaSkgdG8gdGhlIGRpc2sqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZ3JpZFBvcywgcG9zOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBkaWZmOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyIHJldF92YWw7Ci0gICAgTTRPU0FfVUludDE2IGVyclJldHVybmVkOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIkJ1ZmZlckZsdXNoIG9mIGJ1ZmZlciBpPSVkIGl0cyBwb3M9JWQiLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKLQotICAgIHBvcyA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGdyaWRQb3MgPSAocG9zIC8gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRSkgKiBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFOwotCi0gICAgLyogZGlmZiBpcyBob3cgbXVjaCBzaGFsbCB3ZSBmc19zZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbiB0byByZWFjaCBncmlkUG9zKi8KLSAgICBkaWZmID0gZ3JpZFBvcyAtIGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7Ci0KLSAgICBpZiAocG9zID4gYXBDb250ZXh0LT5maWxlU2l6ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2g6IEVycm9yISBBdHRlbXB0IHRvIHNlZWsgYXQgcG9zPSVkLCB3aGlsc3QgZmlsZVNpemU9JWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgYXBDb250ZXh0LT5maWxlU2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIC8qIG9uIHNvbWUgZmlsZXN5c3RlbXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGRvIGEgc2VlayBiZXR3ZWVuIGFuIGZmcyByZWFkIGFuZCBmZnMgd3JpdGUgZXZlbiBpZiBpdCBpcyBzYW1lIHBvcyAqLwotICAgICAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBkaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmVyclJldHVybmVkKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYocmV0X3ZhbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVyclJldHVybmVkKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgLyogZW5kOiBvbiBzb21lIGZpbGVzeXN0ZW1zKi8KLQotICAgIC8qIHVwZGF0ZSB0aGUgcmVhZCBmaWxlIHBvcyBhZnRlciB0aGUgc2VlayAqLwotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zOwotCi0gICAgLyogV3JpdGUgRGF0YSAqLwotICAgIHNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1dyaXRlKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplLCAmZXJyUmV0dXJuZWQpOwotI2lmZGVmIEZJTEVDQUNIRV9TVEFUUwotICAgIGFwQ29udGV4dC0+bmJXcml0ZUZGUysrOwotI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLwotICAgICAvKiB2ZXJpZnkgaWYgYWxsIGRhdGEgcmVxdWVzdGVkIHRvIGJlIHdyaXR0ZW4sIGhhcyBiZWVuIHdyaXR0ZW4gKi8KLSAgICBpZihzaXplIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJSZXR1cm5lZCk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2ggRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJldHJpZXZlIGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyclJldHVybmVkKTsKLQotICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSAoYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA+IGFwQ29udGV4dC0+ZmlsZVNpemUpID8gYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA6IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0KLSAgICAvKiBtYXJrIHRoaXMgYnVmZmVyIGFzIG5vdCBtb2RpZmllZCAqLwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlICY9IH4oTTRPU0Ffa01vZGlmaWVkKTsKLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qIGZsdXNoZXMgYWxsIG1vZGlmaWVkIGJ1ZmZlcnMgdW50aWwgdGhlIHBvc2l0aW9uIG9mIGJ1ZmZlciBpCi1pZiBpbmRleCBpcyBNNE9TQV9DQUNIRUJVRkZFUl9BTEwgdGhlbiBmbHVzaCBhbGwqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpbmRleCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50OCBpLCBqLCBob3dNYW55VG9GbHVzaDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gYnVmUG9zW000T1NBX0NBQ0hFQlVGRkVSX05CXTsKLSAgICBNNE9TQV9Cb29sIGZsdXNoZWQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotCi0gICAgaT0wOwotICAgIGZvcihqPTA7IGo8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGorKykKLSAgICB7Ci0gICAgICAgIGlmICggKChhcENvbnRleHQtPmJ1ZmZlcltqXS5zdGF0ZSAmIE00T1NBX2tNb2RpZmllZCkgPT0gTTRPU0Ffa01vZGlmaWVkKSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZQb3NbaV0gPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5maWxlcG9zOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGhvd01hbnlUb0ZsdXNoID0gaTsKLQotICAgIGlmIChob3dNYW55VG9GbHVzaCA9PSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkJ1ZmZlcnNGbHVzaCA6IG5vIGZsdXNoIG5lZWRlZCIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaG93TWFueVRvRmx1c2ggPT0gMSkKLSAgICB7Ci0gICAgICAgIGdvdG8gZmx1c2hpbmc7Ci0gICAgfQotCi0gICAgTTRPU0FfRmlsZUNhY2hlX1FTX3F1aWNrU29ydChidWZQb3MsIGhvd01hbnlUb0ZsdXNoKTsKLQotZmx1c2hpbmc6Ci0gICAgaWYgKGluZGV4ID09IE00T1NBX0NBQ0hFQlVGRkVSX0FMTCkKLSAgICB7Lyogc2ltcGx5IGZsdXNoIGFsbCBidWZmZXJzIGluIG9yZGVyIG9mIHBvc2l0aW9ucyAqLwotICAgICAgICBmb3Ioaj0wOyBqPGhvd01hbnlUb0ZsdXNoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICAgICAgICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID09IGJ1ZlBvc1tqXSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbCgxKSA6IFdlIE5lZWQgdG8gRmx1c2ggYnVmZmVyICVkIGl0cyBwb3M9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIHRoZXJlIGlzIGEgZ2l2ZW4gaW5kZXggdG8gZmx1c2ggdW50aWwgaXQqLwotICAgICAgICBmb3Ioaj0wOyBqPGhvd01hbnlUb0ZsdXNoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID09IGJ1ZlBvc1tqXQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA8PSBhcENvbnRleHQtPmJ1ZmZlcltpbmRleF0uZmlsZXBvcwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplIC0gTTRPU0FfQ0FDSEVCVUZGRVJfU0laRQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoMikgOiBXZSBOZWVkIHRvIEZsdXNoIGJ1ZmZlciAlZCBpdHMgcG9zPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT09aW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgIC8qIHRoZSBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaGFzIGJlZW4gZmx1c2hlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gZmx1c2hlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwgZXJyPTB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotI2lmZGVmIEJVRkZFUl9ESVNQTEFZCi1NNE9TQV9Wb2lkIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJEaXNwbGF5KE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiLS0tLS0tIEJ1ZmZlcnMgZGlzcGxheSAiKTsKLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMygiLS0tLS0tIEJ1ZiVkIDogRmlsZVBvcz0lZCBzdGF0ZT0weCV4ICIsCi0gICAgICAgICAgICAgICAgICAgaSwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcywgYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUpOwotI2lmZGVmIEJVRkZFUl9EQVRFCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJuYkFjY2Vzc2VkPSVkIC0gbmJNb2RpZmllZCA9JWQiLAotICAgICAgICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkFjY2Vzc2VkLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYk1vZGlmaWVkKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoInRpbWVBY2Nlc3NlZD0lZCAtIHRpbWVNb2RpZmllZCA9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnRpbWVBY2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0udGltZU1vZGlmaWVkKTsKLSNlbmRpZiAvKiBCVUZGRVJfREFURSAqLwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiKTsKLX0KLSNlbmRpZgotCi0KLS8qIHByb3ZpZGVzIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB0byBhIHBvc2l0aW9uIHBvcwotYW5kIHdpdGggcG9zIGluc2lkZSB0aGUgcmVhZCBkYXRhIGludG8gdGhpcyBidWZmZXIKLWVsc2UgcmV0dXJucyBDQUNIRV9CVUZGRVJfTk9ORSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJNYXRjaFRvUmVhZChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBtYXRjaGVzIHdpdGggZ2l2ZW4gcG9zICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoICAgKHBvcyA+PSBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQotICAgICAgICAgICAgJiYgKHBvcyA8IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplKQotICAgICAgICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgIT0gTTRPU0FfRU9GKSAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkJ1ZmZlck1hdGNoIHJldHVybnMgIGkgPSAlZCIsIGkpOwotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiQnVmZmVyTWF0Y2ggcmV0dXJucyAgTiBPIE4gRSAhISEiLCBpKTsKLSAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKLX0KLQotCi0vKiBwcm92aWRlcyB0aGUgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3NpdGlvbiBwb3MKLWFuZCB3aXRoIHBvcyBpbnNpZGUgaXRzIG1heGltdW0gY2FwYWNpdHkKLWVsc2UgcmV0dXJucyBDQUNIRV9CVUZGRVJfTk9ORSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJNYXRjaFRvV3JpdGUoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0gICAgLyogU2VsZWN0IHRoZSBidWZmZXIgd2hpY2ggbWF0Y2hlcyB3aXRoIGdpdmVuIHBvcyAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKCAgIChwb3MgPj0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICAgICAgJiYgKHBvcyA8IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFKQotICAgICAgICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgIT0gTTRPU0FfRU9GKSAgICAgICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJCdWZmZXJNYXRjaCByZXR1cm5zICBpID0gJWQiLCBpKTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIkJ1ZmZlck1hdGNoIHJldHVybnMgIE4gTyBOIEUgISEhIiwgaSk7Ci0gICAgcmV0dXJuIE00T1NBX0NBQ0hFQlVGRkVSX05PTkU7Ci19Ci0KLS8qIGNob29zZXMgYSBidWZmZXIgYnkgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lIGFuZCByZXR1cm5zIGkgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdEZvcldyaXRlKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IHNlbGVjdGVkID0gMDsKLSAgICBNNE9TQV9VSW50MzIgaiwgdG9Tb3J0OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBidWZQb3NbTTRPU0FfQ0FDSEVCVUZGRVJfTkJdOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvLyB1cGRhdGUgbmJGaWxsU2luY2VMYXN0QWNlc3MgZmllbGQKLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyArKzsKLSAgICB9Ci0jaWZkZWYgTk9fU1RSQVRFR1kKLSAgICBnb3RvIGVuZF9zZWxlY3Rpb247Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogMS8gaWYgdGhlcmUgaXMgc3RpbGwgYSBuZXcgYnVmZmVyLCB1c2UgaXQgKi8KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlID09IE00T1NBX2tJbml0aWFsaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOwotICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAyLyBDaG9vc2UgYSBmaWxsZWQgYW5kIGNvcGllZCBidWZmZXIgICAgICAqLwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoICgoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgJiBNNE9TQV9rRmlsbGVkKSA9PSBNNE9TQV9rRmlsbGVkKQotICAgICAgICAgICAgJiYgKChhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSAmIE00T1NBX2tDb3BpZWQpID09IE00T1NBX2tDb3BpZWQpCi0gICAgICAgICAgICAmJiAoKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlICYgTTRPU0Ffa01vZGlmaWVkKSAhPSBNNE9TQV9rTW9kaWZpZWQpICAgLyogYnVnIGZpeCBtb2RpZmllZCAqLwotICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKLSAgICAgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIDMvIENob29zZSBhIG1vZGlmaWVkIGJ1ZmZlciB3aXRoIGZpbGVwb3M+dGhyZXNob2xkIGFuZCBtaW4gICAqLwotICAgIGk9MDsKLQotICAgIC8qIHNvcnQgdGhlIGJ1ZmZlcnMgYnkgZmlsZXBvcyBhbmQgY2hvb3NlIHRoZSBtaW4gYW5kIG5vdCA8IHRocmVzaG9sZCovCi0gICAgZm9yKGo9MDsgajxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaisrKQotICAgIHsKLSAgICAgICAgaWYgICgKLSAgICAgICAgICAgICAoKGFwQ29udGV4dC0+YnVmZmVyW2pdLnN0YXRlICYgTTRPU0Ffa01vZGlmaWVkKSA9PSBNNE9TQV9rTW9kaWZpZWQpCi0gICAgICAgICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2pdLmZpbGVwb3MgPiAtMSkgLyogbm90IEVPRiAqLwotICAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmUG9zW2ldID0gYXBDb250ZXh0LT5idWZmZXJbal0uZmlsZXBvczsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRvU29ydCA9IGk7Ci0gICAgaWYgKHRvU29ydCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHNlbGVjdGVkID0gMDsKLSAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmICh0b1NvcnQgPT0xICkKLSAgICB7Ci0gICAgICAgIGdvdG8gc2tpcF9zb3J0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfUVNfcXVpY2tTb3J0KGJ1ZlBvcywgdG9Tb3J0KTsKLSAgICB9Ci0KLXNraXBfc29ydDoKLSAgICAvKiB0YWtlIHRoZSBzbWFsbGVzdCBmaWxlcG9zICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPT0gYnVmUG9zWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3RlZCA9IGk7Ci0gICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLWVuZF9zZWxlY3Rpb246Ci0gICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5maWxlcG9zID4gYXBDb250ZXh0LT5maWxlU2l6ZSApCi0gICAgewotICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgb3V0c2lkZSByZWFsIGZpbGUgc2l6ZSwKLSAgICAgICAgaW4gdGhhdCBjYXNlLCBmbHVzaCBhbGwgYnVmZmVycyBiZWZvcmUgdGhpcyBvbmUKLSAgICAgICAgdW5sZXNzIHRoZXJlIHdpbGwgYmUgYSBzZWVrIG91dHNpZGUgZmlsZXNpemUqLwotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpID09IE00T1NBX2tNb2RpZmllZCApCi0gICAgewotICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgaW5zaWRlIGZpbGVzaXplLCBzaW1wbHkgZmx1c2ggaXQqLwotICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIE5PX1NUUkFURUdZCi0gICAgLyogc2VsZWN0ZWQgc3RheXMgMCAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIE00T1NBX0NBQ0hFQlVGRkVSX0FMTCk7Ci0gICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRPU0FfRklMRV9DQUNIRV9CVUZGRVJfTk9ORTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIE00T1NBX1RSQUNFM18xKCItLS0tLS0tLS0tIEJ1ZmZlclNlbGVjdCByZXR1cm5zICBpID0gJWQiLCBzZWxlY3RlZCk7Ci0gICAgIHJldHVybiBzZWxlY3RlZDsKLX0KLQotCi0vKiBjaG9vc2VzIGEgYnVmZmVyIGJ5IG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZSBhbmQgcmV0dXJucyBpICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoVGltZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaTsKLSAgICBNNE9TQV9VSW50OCBzZWxlY3RlZCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGosIHRvU29ydDsKLSAgICBNNE9TQV9UaW1lIGJ1ZlRpbWVbTTRPU0FfQ0FDSEVCVUZGRVJfTkJdOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIDEvIGlmIHRoZXJlIGlzIHN0aWxsIGEgbmV3IGJ1ZmZlciwgdXNlIGl0ICovCi0KLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zdGF0ZSA9PSBNNE9TQV9rSW5pdGlhbGl6ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKLSAgICAgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGk9MDsKLSAgICAvKiBzb3J0IGFsbCBidWZmZXJzIHdpdGggb3JkZXIgb2YgdGltZUFjY2Vzc2VkICovCi0gICAgZm9yKGo9MDsgajxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaisrKQotICAgIHsKLSAgICAgICAgYnVmVGltZVtpXSA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLnRpbWVBY2Nlc3NlZDsKLSAgICAgICAgaSsrOwotICAgIH0KLQotICAgIHRvU29ydCA9IGk7Ci0gICAgaWYgKHRvU29ydCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHNlbGVjdGVkID0gMDsKLSAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmICh0b1NvcnQgPT0xICkKLSAgICB7Ci0gICAgICAgIGdvdG8gc2tpcF9zb3J0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfUVNfcXVpY2tTb3J0NjQoYnVmVGltZSwgdG9Tb3J0KTsKLSAgICB9Ci0KLXNraXBfc29ydDoKLSAgICAvKiB0YWtlIHRoZSBzbWFsbGVzdCB0aW1lQWNjZXNzZWQgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX0NBQ0hFQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbaV0udGltZUFjY2Vzc2VkID09IGJ1ZlRpbWVbMF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGVkID0gaTsKLSAgICAgICAgICAgIGdvdG8gZW5kX3NlbGVjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotZW5kX3NlbGVjdGlvbjoKLSAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLmZpbGVwb3MgPiBhcENvbnRleHQtPmZpbGVTaXplICkKLSAgICB7Ci0gICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBvdXRzaWRlIHJlYWwgZmlsZSBzaXplLAotICAgICAgICBpbiB0aGF0IGNhc2UsIGZsdXNoIGFsbCBidWZmZXJzIGJlZm9yZSB0aGlzIG9uZQotICAgICAgICB1bmxlc3MgdGhlcmUgd2lsbCBiZSBhIHNlZWsgb3V0c2lkZSBmaWxlc2l6ZSovCi0gICAgICAgIE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzRmx1c2hVbnRpbChhcENvbnRleHQsIHNlbGVjdGVkKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5zdGF0ZSAmIE00T1NBX2tNb2RpZmllZCkgPT0gTTRPU0Ffa01vZGlmaWVkICkKLSAgICB7Ci0gICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBpbnNpZGUgZmlsZXNpemUsIHNpbXBseSBmbHVzaCBpdCovCi0gICAgICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJGbHVzaChhcENvbnRleHQsIHNlbGVjdGVkKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9DQUNIRUJVRkZFUl9OT05FOwotICAgICAgICB9Ci0gICAgfQotICAgIE00T1NBX1RSQUNFM18xKCItLS0tLS0tLS0tIEJ1ZmZlclNlbGVjdCByZXR1cm5zICBpID0gJWQiLCBzZWxlY3RlZCk7Ci0gICAgIHJldHVybiBzZWxlY3RlZDsKLX0KLQotLyogY2hvb3NlcyBhIGJ1ZmZlciBieSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUgYW5kIHJldHVybnMgaSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFBvcyhNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaTsKLSAgICBNNE9TQV9VSW50OCBzZWxlY3RlZCA9IDAsIGo7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gbWluUG9zOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAxLyBpZiB0aGVyZSBpcyBzdGlsbCBhIG5ldyBidWZmZXIsIHVzZSBpdCAqLwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc3RhdGUgPT0gTTRPU0Ffa0luaXRpYWxpemVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3RlZCA9IGk7Ci0gICAgICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtaW5Qb3MgPSBhcENvbnRleHQtPmJ1ZmZlclswXS5maWxlcG9zOwotICAgIHNlbGVjdGVkID0gMDsKLSAgICBmb3Ioaj0xOyBqPE00T1NBX0NBQ0hFQlVGRkVSX05COyBqKyspCi0gICAgewotICAgICAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbal0uZmlsZXBvcyA8IG1pblBvcykKLSAgICAgICAgewotICAgICAgICAgICAgbWluUG9zID0gYXBDb250ZXh0LT5idWZmZXJbal0uZmlsZXBvczsKLSAgICAgICAgICAgIHNlbGVjdGVkID0gajsKLSAgICAgICAgfQotICAgIH0KLQotZW5kX3NlbGVjdGlvbjoKLSAgICBpZiAoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLmZpbGVwb3MgPiBhcENvbnRleHQtPmZpbGVTaXplICkKLSAgICB7Ci0gICAgICAgIC8qIGluIGNhc2UgaXQgc2VsZWN0cyBhIG1vZGlmaWVkIGJ1ZmZlciBvdXRzaWRlIHJlYWwgZmlsZSBzaXplLAotICAgICAgICBpbiB0aGF0IGNhc2UsIGZsdXNoIGFsbCBidWZmZXJzIGJlZm9yZSB0aGlzIG9uZQotICAgICAgICB1bmxlc3MgdGhlcmUgd2lsbCBiZSBhIHNlZWsgb3V0c2lkZSBmaWxlc2l6ZSovCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJCdWZmZXJTZWxlY3RXaXRoUG9zIHNlbGVjdGVkIGJ1ZmZlciBpcyBvdXNpZGUgZmlsZSBiLmZpbGVwb3M9JWQgPiBmaWxlU2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5maWxlcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5maWxlU2l6ZSApOwotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpID09IE00T1NBX2tNb2RpZmllZCApCi0gICAgewotICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgaW5zaWRlIGZpbGVzaXplLCBzaW1wbHkgZmx1c2ggaXQqLwotICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKLSAgICAgICAgfQotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMSgiLS0tLS0tLS0tLSBCdWZmZXJTZWxlY3RXaXRoUG9zIHJldHVybnMgIGkgPSAlZCIsIHNlbGVjdGVkKTsKLSAgICAgcmV0dXJuIHNlbGVjdGVkOwotfQotCi0KLS8qIGNob29zZXMgYSBidWZmZXIgYnkgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lIGFuZCByZXR1cm5zIGkgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhTcGFjZShNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaTsKLSAgICBNNE9TQV9VSW50OCBzZWxlY3RlZCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGosIHRvU29ydDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gYnVmU3RhdFtNNE9TQV9DQUNIRUJVRkZFUl9OQl07Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogMS8gaWYgdGhlcmUgaXMgc3RpbGwgYSBuZXcgYnVmZmVyLCB1c2UgaXQgKi8KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlID09IE00T1NBX2tJbml0aWFsaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOwotICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaT0wOwotICAgIC8qIHNvcnQgYWxsIGJ1ZmZlcnMgd2l0aCBvcmRlciBvZiBuYkFjY2Vzc2VkICovCi0gICAgZm9yKGo9MDsgajxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaisrKQotICAgIHsKLSAgICAgICAgYnVmU3RhdFtpXSA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLm5iQWNjZXNzZWQgKyBhcENvbnRleHQtPmJ1ZmZlcltqXS50aW1lQWNjZXNzZWQqMjsgLyogdHJ5IGh5YnJpZCAqLwotICAgICAgICBpKys7Ci0gICAgfQotCi0gICAgdG9Tb3J0ID0gaTsKLSAgICBpZiAodG9Tb3J0ID09IDAgKQotICAgIHsKLSAgICAgICAgc2VsZWN0ZWQgPSAwOwotICAgICAgICBnb3RvIGVuZF9zZWxlY3Rpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHRvU29ydCA9PTEgKQotICAgIHsKLSAgICAgICAgZ290byBza2lwX3NvcnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX0ZpbGVDYWNoZV9RU19xdWlja1NvcnQoYnVmU3RhdCwgdG9Tb3J0KTsKLSAgICB9Ci0KLXNraXBfc29ydDoKLSAgICAvKiB0YWtlIHRoZSBzbWFsbGVzdCBuYkFjY2Vzc2VkICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9JbnQ2NCkgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJBY2Nlc3NlZCAgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS50aW1lQWNjZXNzZWQqMiA9PSBidWZTdGF0WzBdKSAvKiBoeWJyaWQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOwotICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi1lbmRfc2VsZWN0aW9uOgotICAgIGlmIChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uZmlsZXBvcyA+IGFwQ29udGV4dC0+ZmlsZVNpemUgKQotICAgIHsKLSAgICAgICAgLyogaW4gY2FzZSBpdCBzZWxlY3RzIGEgbW9kaWZpZWQgYnVmZmVyIG91dHNpZGUgcmVhbCBmaWxlIHNpemUsCi0gICAgICAgIGluIHRoYXQgY2FzZSwgZmx1c2ggYWxsIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgb25lCi0gICAgICAgIHVubGVzcyB0aGVyZSB3aWxsIGJlIGEgc2VlayBvdXRzaWRlIGZpbGVzaXplKi8KLSAgICAgICAgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGbHVzaFVudGlsKGFwQ29udGV4dCwgc2VsZWN0ZWQpOwotICAgIH0KLSAgICBlbHNlIGlmICgoYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRdLnN0YXRlICYgTTRPU0Ffa01vZGlmaWVkKSA9PSBNNE9TQV9rTW9kaWZpZWQgKQotICAgIHsKLSAgICAgICAgLyogaW4gY2FzZSBpdCBzZWxlY3RzIGEgbW9kaWZpZWQgYnVmZmVyIGluc2lkZSBmaWxlc2l6ZSwgc2ltcGx5IGZsdXNoIGl0Ki8KLSAgICAgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZsdXNoKGFwQ29udGV4dCwgc2VsZWN0ZWQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX0NBQ0hFQlVGRkVSX05PTkU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIi0tLS0tLS0tLS0gQnVmZmVyU2VsZWN0IHJldHVybnMgIGkgPSAlZCIsIHNlbGVjdGVkKTsKLSAgICAgcmV0dXJuIHNlbGVjdGVkOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdEZvclJlYWQoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGksaiwgc2VsZWN0ZWQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1pbl9hbW91bnQsbWF4X2Ftb3VudDsKLSAgICBNNE9TQV9JbnQ4IG1pbl9pLG1heF9jb3VudDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogdXBkYXRlIG5iRmlsbFNpbmNlTGFzdEFjZXNzIGZpZWxkICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgKys7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFBsYW4gQS8gaWYgdGhlcmUgaXMgc3RpbGwgYSBuZXcgYnVmZmVyLCB1c2UgaXQgKi8KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfQ0FDSEVCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLnN0YXRlID09IE00T1NBX2tJbml0aWFsaXplZCkKLSAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOwotICAgICAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF4X2NvdW50ID0gTTRPU0FfQ0FDSEVCVUZGRVJfTkI7Ci0gICAgbWF4X2Ftb3VudCA9IE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUzsKLQotICAgIC8qIFBsYW4gQiA6IFNjYW4gZm9yIGRlYWQgYnVmZmVyICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPj0gKE00T1NBX1VJbnQzMikgbWF4X2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4X2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzOwotICAgICAgICAgICAgbWF4X2NvdW50ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtYXhfY291bnQ8TTRPU0FfQ0FDSEVCVUZGRVJfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMigiREVBRCBCVUZGRVI6ICVkLCAlZCIsbWF4X2NvdW50LGFwQ29udGV4dC0+YnVmZmVyW21heF9jb3VudF0ubmJGaWxsU2luY2VMYXN0QWNlc3MpOwotICAgICAgICBzZWxlY3RlZCA9IG1heF9jb3VudDsKLSAgICAgICAgZ290byBlbmRfc2VsZWN0aW9uOwotICAgIH0KLQotICAgIG1pbl9pID0gMDsKLSAgICBtaW5fYW1vdW50ID0gTTRPU0FfQ0FDSEVCVUZGRVJfTkI7Ci0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBpcyB0aGUgbW9zdCAiZW1wdHkiICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9DQUNIRUJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IGkgJSBNNE9TQV9DQUNIRUJVRkZFUl9OQjsKLQotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW4gPCBtaW5fYW1vdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5fYW1vdW50ID0gYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluOwotICAgICAgICAgICAgbWluX2kgPSBqOwotICAgICAgICB9Ci0gICAgfQotICAgIHNlbGVjdGVkID0gbWluX2k7Ci0KLWVuZF9zZWxlY3Rpb246Ci0gICAgaWYgKGFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkXS5maWxlcG9zID4gYXBDb250ZXh0LT5maWxlU2l6ZSApCi0gICAgewotICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgb3V0c2lkZSByZWFsIGZpbGUgc2l6ZSwKLSAgICAgICAgaW4gdGhhdCBjYXNlLCBmbHVzaCBhbGwgYnVmZmVycyBiZWZvcmUgdGhpcyBvbmUKLSAgICAgICAgdW5sZXNzIHRoZXJlIHdpbGwgYmUgYSBzZWVrIG91dHNpZGUgZmlsZXNpemUqLwotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF0uc3RhdGUgJiBNNE9TQV9rTW9kaWZpZWQpID09IE00T1NBX2tNb2RpZmllZCApCi0gICAgewotICAgICAgICAvKiBpbiBjYXNlIGl0IHNlbGVjdHMgYSBtb2RpZmllZCBidWZmZXIgaW5zaWRlIGZpbGVzaXplLCBzaW1wbHkgZmx1c2ggaXQqLwotICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmx1c2goYXBDb250ZXh0LCBzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZWxlY3RlZDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZUNhY2hlX0NhbGN1bGF0ZVNpemUoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9JbnQzMiAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgZXJyUmV0dXJuZWQ7Ci0KLSAgICAvKiBnbyB0byB0aGUgZW5kIG9mIGZpbGUqLwotICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyUmV0dXJuZWQpOwotCi0gICAgaWYgKHJldF92YWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJyUmV0dXJuZWQpOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfRmlsZUNhY2hlX0NhbGN1bGF0ZVNpemUgRVJSID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJldHJpZXZlIHNpemUgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJSZXR1cm5lZCk7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqLwotLyp8IE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbnMgZGVwZW5kZW50IG9uIFBsYXRmb3JtIEZpbGVTeXN0ZW0gIHwgKi8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198ICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgT3BlbnMgYSBmaWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZpbGVEZXNjcmlwdG9yIDogICAgSU4gICAgdXJsIG9mIHRoZSBmaWxlCi0gKiAgICAgICAgICBGaWxlTW9kZUFjY2VzcyAgOiAgICBJTiAgICBhY2Nlc3MgbW9kZSBmb3Igb3BlbmluZyB0aGUgZmlsZQotICogICAgICAgICAgZXJybm9fZmZzICAgICAgICAgICA6ICAgT1VUIGludGVybmFsIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtCi0gKiBAcmV0dXJuICBwQyAgICAgICAgICAgICAgOiAgIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9Wb2lkKiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19PcGVuX2NhY2hlKCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCi17Ci0KLSAgICBNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICAgICAqcEMgPSBNNE9TQV9OVUxMOwotICAgIEZJTEUqIGZwOwotCi0gICAgTTRPU0FfQ2hhciAgbW9kZVs0XSAgICAgICAgICAgID0gIiI7Ci0gICAgTTRPU0FfQ2hhciogcFJlYWRTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSJyIjsKLSAgICBNNE9TQV9DaGFyKiBwV3JpdGVTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopInciOwotICAgIE00T1NBX0NoYXIqIHBBcHBlbmRTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImEiOwotICAgIE00T1NBX0NoYXIqIHBCaW5hcnlTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImIiOwotICAgIE00T1NBX0NoYXIqIHBQbHVzU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiKyI7Ci0KLSAgICBmcCA9IE00T1NBX05VTEw7Ci0gICAgKmVycm5vX2ZmcyA9IDA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRPU0FfRmlsZVN5c3RlbV9GRlNfT3Blbl9jYWNoZSA6IE9wZW4gKioqKiBcbiIpOwotCi0gICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgIC8qICBWZXJpZnkgYWNjZXNzIG1vZGUgICovCi0gICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKgotICAgIEFsbCBwb3NzaWJsZSBmaWxlIGFjY2Vzc2VzOgotCi0gICAgICAgIHIgOiBSZWFkIG9ubHksIGZpbGUgbXVzdCBleGlzdAotCi0gICAgICAgIHcgOiBXcml0ZSBvbmx5LiBJZiB0aGUgZmlsZSBleGlzdHMsIGl0IGlzIG92ZXJ3cml0dGVuLiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KLQotICAgICAgICBhIDogd3JpdGUgYXQgZW5kIG9mIGZpbGUgKGFwcGVuZCkuIElmIHRoZSBmaWxlIGV4aXN0cywgaXQgaXMgZXh0ZW5kZWQuIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgotCi0gICAgICAgIHIrIDogdXBkYXRlIChpLmUuIHJlYWQgYW5kIHdyaXRlKS4gVGhlIGZpbGUgbXVzdCBleGlzdC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGEgcmVhZCBhZnRlciBhIHdyaXRlIChvciBhIHdyaXRlIGFmdGVyIGEgcmVhZCkKLSAgICAgICAgdW5sZXNzIHdlIHJlcG9zaXRpb24gdGhlIGZpbGUgcG9pbnRlci4KLQotICAgICAgICB3KyA6IGNyZWF0aW9uLCB0byB1cGRhdGUuIElmIHRoZSBmaWxlIGV4aXN0cywgaXQgaXMgb3ZlcndyaXR0ZW4uIElmIHRoZSBmaWxlcyBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KLSAgICAgICAgYSsgOiBleHRlbnNpb24gYW5kIHVwZGF0ZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuIElmIHRoZSBmaWxlIGV4aXN0cywgdGhlIGZpbGUgcG9pbnRlciBpcyBwdXQgYXQgZW5kIG9mIGZpbGUuCi0KLSAgICBBbGwgcG9zc2libGUgY2FzZXMgZm9yIGZpbGVNb2RlQWNjZXNzIHBhcmFtZXRlcjoKLQotICAgICAgICBXcml0ZSgyKSAgICAgICAgICAgIHcKLSAgICAgICAgV3JpdGVSZWFkKDMpICAgICAgICByKyAgICAvLyByK2IgVXNlZCBieSBNTQotICAgICAgICBXcml0ZVJlYWRDcmVhdGUoMTEpICAgIHcrICAgIC8vIHcrYiBVc2VkIGJ5IE1NCi0gICAgICAgIFdyaXRlUmVhZEFwcGVuZCg3KSAgICBhKwotICAgICAgICBXcml0ZUNyZWF0ZSgxMCkgICAgICAgIHcKLSAgICAgICAgV3JpdGVBcHBlbmQoMTIpICAgICAgICBhCi0gICAgICAgIFJlYWQgICAgICAgICAgICAgICAgciAgICAvLyByYiBVc2VkIGJ5IE1NCi0gICAgICAgIEVycm9yCi0gICAgKi8KLQotCi0gICAgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYgKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKSAvKiBVc2VkIGJ5IE1NICovCi0gICAgewotICAgICAgICAvKiogIncrIiAqLwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBXcml0ZVN0cmluZywgMSk7Ci0gICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFBsdXNTdHJpbmcsIDEpOwotICAgIH0KLSAgICBlbHNlIGlmICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSAmJiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSkKLSAgICB7Ci0gICAgICAgIC8qKiAiYSsiICovCi0gICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcEFwcGVuZFN0cmluZywgMSk7Ci0gICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFBsdXNTdHJpbmcsIDEpOwotICAgIH0KLSAgICBlbHNlIGlmICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSAmJiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpKSAgICAvKiBVc2VkIGJ5IE1NICovCi0gICAgewotICAgICAgICAvKiogInIrIiAqLwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBSZWFkU3RyaW5nLCAxKTsKLSAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwUGx1c1N0cmluZywgMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpICYmIChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSkKLSAgICB7Ci0gICAgICAgIC8qKiAidyIgKi8KLSAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwV3JpdGVTdHJpbmcsIDEpOwotICAgIH0KLSAgICBlbHNlIGlmICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSAmJiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkpCi0gICAgewotICAgICAgICAvKiogImEiICovCi0gICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcEFwcGVuZFN0cmluZywgMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKQotICAgIHsKLSAgICAgICAgLyoqICJyIiAqLwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBSZWFkU3RyaW5nLCAxKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKQotICAgIHsKLSAgICAgICAgLyoqICJ3IiAqLwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBXcml0ZVN0cmluZywgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlU3lzdGVtX0ZGU19PcGVuX2NhY2hlIDogaW52YWxpZCBGaWxlTW9kZUFjY2VzcyA9ICV4IiwgRmlsZU1vZGVBY2Nlc3MpOwotICAgICAgICAqZXJybm9fZmZzID0gKE00T1NBX1VJbnQxNilNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICB9Ci0KLSAgICAvKiBhZGQgdGhlIGIgKi8KLSAgICBNNE9TQV9jaHJOQ2F0KG1vZGUsIHBCaW5hcnlTdHJpbmcsIDEpOwotCi0gICAgZnAgPSBmb3BlbigoY29uc3QgY2hhciAqKSBwRmlsZURlc2NyaXB0b3IsIChjb25zdCBjaGFyICopbW9kZSk7IC8qIE9wZW4gaW4gcmIgb3IgaW4gcitiKi8KLSAgICBpZiggZnAgIT0gTlVMTCApCi0gICAgewotICAgICAgICBwQyA9IChNNE9TQV9GaWxlU3lzdGVtX0ZGU190X2NhY2hlICopIE00T1NBX21hbGxvYyhzaXplb2YgKiBwQywgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyKikiTTRPU0FfRmlsZVN5c3RlbV9GRlNfT3Blbl9jYWNoZSIpOwotCi0gICAgICAgIGlmIChwQyA9PSBNNE9TQV9OVUxMKSByZXR1cm4gTTRPU0FfTlVMTDsgLyplcnJvciBvY2N1cmVkID0+IHJldHVybiBOVUxMIHBvaW50ZXIqLwotCi0gICAgICAgIHBDLT5GaWxlRGVzYyA9IGZwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgRU5PRU5UOgotICAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX05PVF9GT1VORCwgIk00T1NBX2ZpbGVSZWFkT3BlbjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgICAqZXJybm9fZmZzPShNNE9TQV9VSW50MTYpTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVBQ0NFUzoKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0xPQ0tFRCwgIk00T1NBX2ZpbGVSZWFkT3BlbjogUGVybWlzc2lvbiBkZW5pZWQiKTsKLSAgICAgICAgICAgICAgICAqZXJybm9fZmZzPShNNE9TQV9VSW50MTYpTTRFUlJfRklMRV9MT0NLRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZVJlYWRPcGVuOiBJbnZhbGlkIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgKmVycm5vX2Zmcz0oTTRPU0FfVUludDE2KU00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgY2FzZSBFTUZJTEU6Ci0gICAgICAgICAgICAgY2FzZSBFTk9TUEM6Ci0gICAgICAgICAgICAgY2FzZSBFTk9NRU06Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlUmVhZE9wZW46IFRvbyBtYW55IG9wZW4gZmlsZXMiKTsKLSAgICAgICAgICAgICAgICAqZXJybm9fZmZzPShNNE9TQV9VSW50MTYpTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkT3BlbiIpOwotICAgICAgICAgICAgICAgICplcnJub19mZnM9KE00T1NBX1VJbnQxNilNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgfSAvKiBlbmQgc3dpdGNoICovCi0gICAgfSAvKiBlbmQgZWxzZSAqLwotCi0gICAgcmV0dXJuIChNNE9TQV9Wb2lkKilwQzsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZWFkcyBkYXRhIGZyb20gZmlsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICA6ICAgSU4gIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgIGRhdGEgICAgICAgICAgICA6ICAgIElOICBidWZmZXIgZm9yIHJlYWRpbmcgZGF0YQotICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIDogICAgSU4gICAgYW1vdW50IG9mIGJ5dGVzIHRvIHJlYWQKLSAqICAgICAgICAgIGVycm5vX2ZmcyAgICAgICAgICAgOiAgIE9VVCBpbnRlcm5hbCBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlsZXN5c3RlbQotICogQHJldHVybiAgcmV0ICAgICAgICAgICAgIDogICBlZmZlY3RpdmUgYW1vdW50IG9mIGJ5dGVzIHJlYWQgLyAtMSBpZiBhbiBlcnJvciBvY2N1cnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVN5c3RlbV9GRlNfUmVhZF9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKQotewotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKnBDID0gKE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiAgICByZXM7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfRmlsZVN5c3RlbV9GRlNfUmVhZCAgc2l6ZSA9ICVsZCIsIHNpemUpOwotCi0gICAgcmVzID0gLTE7Ci0KLSAgICByZXMgPSBmcmVhZChkYXRhLHNpemVvZihNNE9TQV9DaGFyKSwgc2l6ZSwgcEMtPkZpbGVEZXNjKTsKLSAgICBpZiggLTEgPCByZXMgKQotICAgIHsKLSAgICAgICAgKmVycm5vX2ZmcyA9IE00Tk9fRVJST1I7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICplcnJub19mZnMgPSBlcnJubzsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE00T1NBX0ZpbGVQb3NpdGlvbilyZXM7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFdyaXRlcyBkYXRhIHRvIGZpbGUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgOiAgIElOICBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICBkYXRhICAgICAgICAgICAgOiAgICBJTiAgYnVmZmVyIHdpdGggZGF0YSB0byB3cml0ZQotICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIDogICAgSU4gICAgYW1vdW50IG9mIGJ5dGVzIHRvIHJlYWQKLSAqICAgICAgICAgIGVycm5vX2ZmcyAgICAgICAgICAgOiAgIE9VVCBpbnRlcm5hbCBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlsZXN5c3RlbQotICogQHJldHVybiAgcmV0ICAgICAgICAgICAgIDogICBlZmZlY3RpdmUgYW1vdW50IG9mIGJ5dGVzIHJlYWQgLyBhbiBlcnJvciBjb2RlIGlmIGFuIGVycm9yIG9jY3VycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlU3lzdGVtX0ZGU19Xcml0ZV9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKQotewotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKnBDID0gKE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiAgICByZXM7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfRmlsZVN5c3RlbV9GRlNfV3JpdGUgIHNpemUgPSAlbGQiLCBzaXplKTsKLQotICAgIHJlcyA9IDA7Ci0KLSAgICByZXMgPSBmd3JpdGUoZGF0YSxzaXplb2YoTTRPU0FfQ2hhciksIHNpemUsIHBDLT5GaWxlRGVzYyk7Ci0gICAgaWYoIC0xIDwgcmVzICkKLSAgICB7Ci0gICAgICAgICplcnJub19mZnMgPSBNNE5PX0VSUk9SOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqZXJybm9fZmZzID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlU3lzdGVtX0ZGU19Xcml0ZSAgZXJyb3IiLCAqZXJybm9fZmZzKTsKLSAgICB9Ci0KLSAgICBmZmx1c2gocEMtPkZpbGVEZXNjKTsKLQotICAgIHJldHVybiAoTTRPU0FfRmlsZVBvc2l0aW9uKXJlczsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTZWVrcyBhdCBnaXZlbiBwb3NpdGlvbiBpbiBhIGZpbGUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgOiAgIElOICBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICBwb3MgICAgICAgICAgICAgOiAgICBJTiAgYW1vdW50IG9mIGJ5dGVzIGZvciB0aGUgbW92ZQotICogICAgICAgICAgbW9kZSAgICAgICAgICAgIDogICAgSU4gICAga2luZCBvZiBzZWVrIHRvIHBlcmZvcm0KLSAqICAgICAgICAgIGVycm5vX2ZmcyAgICAgICAgICAgOiAgIE9VVCBpbnRlcm5hbCBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlsZXN5c3RlbQotICogQHJldHVybiAgcmV0ICAgICAgICAgICAgIDogICAwIG9uIHN1Y2Nlc3MgLyBhbnkgb3RoZXIgdmFsdWUgaWYgYW4gZXJyb3Igb2NjdXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfSW50MzIgTTRPU0FfRmlsZVN5c3RlbV9GRlNfU2Vla19jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCi17Ci0gICAgTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqcEMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX0ZpbGVTeXN0ZW1fRkZTX1NlZWsgIHBvcyA9ICVsZCAgbW9kZSA9ICVkIiwgcG9zLCBtb2RlKTsKLQotICAgIHN3aXRjaChtb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgOgotICAgICAgICAgICAgKmVycm5vX2ZmcyA9IGZzZWVrKHBDLT5GaWxlRGVzYywgcG9zLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgotICAgICAgICAgICAgKmVycm5vX2Zmcz0gZnNlZWsocEMtPkZpbGVEZXNjLCBwb3MsIFNFRUtfQ1VSKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kIDoKLSAgICAgICAgICAgICplcnJub19mZnMgPSBmc2VlayhwQy0+RmlsZURlc2MsIHBvcywgU0VFS19FTkQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuICplcnJub19mZnM7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBUZWxscyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpbGUgcG9pbnRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICA6ICAgSU4gIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgIGVycm5vX2ZmcyAgICAgICAgICAgOiAgIE9VVCBpbnRlcm5hbCBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlsZXN5c3RlbQotICogQHJldHVybiAgcmV0ICAgICAgICAgICAgIDogICBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyLyAtMSBpZiBhbiBlcnJvciBvY2N1cnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9GaWxlUG9zaXRpb24gTTRPU0FfRmlsZVN5c3RlbV9GRlNfVGVsbF9jYWNoZSggTTRPU0FfVm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJub19mZnMgKQotewotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKnBDID0gKE00T1NBX0ZpbGVTeXN0ZW1fRkZTX3RfY2FjaGUgKilwQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zOwotCi0gICAgcG9zID0gZnRlbGwocEMtPkZpbGVEZXNjKTsKLQotICAgICplcnJub19mZnMgPSAwOwotCi0gICAgcmV0dXJuIHBvczsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDbG9zZXMgdGhlIGZpbGUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgOiAgIElOICBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICBlcnJub19mZnMgICAgICAgICAgIDogICBPVVQgaW50ZXJuYWwgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIGZpbGVzeXN0ZW0KLSAqIEByZXR1cm4gIHJldCAgICAgICAgICAgICA6ICAgMCBvbiBzdWNjZXNzIC8gYW55IG90aGVyIHZhbHVlIGlmIGFuIGVycm9yIG9jY3VycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ludDMyIE00T1NBX0ZpbGVTeXN0ZW1fRkZTX0Nsb3NlX2NhY2hlKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vX2ZmcyApCi17Ci0gICAgTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqcEMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSAqKXBDb250ZXh0OwotCi0gICAgKmVycm5vX2ZmcyA9IGZjbG9zZShwQy0+RmlsZURlc2MpOwotCi0gICAgcmV0dXJuICplcnJub19mZnM7Ci19Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVPcGVuX2NhY2hlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHJfY2FjaGUgKkZTOwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSBTeXN0ZW0gaW50ZXJmYWNlICovCi0gICAgRlMgPSAoTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHJfY2FjaGUgKilNNE9TQV9tYWxsb2Moc2l6ZW9mICogRlMsCi0gICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsKE00T1NBX0NoYXIqKSJNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0cl9jYWNoZSIpOwotCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBGUykKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotCi0gICAgRlMtPnBGY3RQdHJfT3BlbiA9IE00T1NBX0ZpbGVTeXN0ZW1fRkZTX09wZW5fY2FjaGU7Ci0gICAgRlMtPnBGY3RQdHJfUmVhZCA9IE00T1NBX0ZpbGVTeXN0ZW1fRkZTX1JlYWRfY2FjaGU7Ci0gICAgRlMtPnBGY3RQdHJfV3JpdGUgPSBNNE9TQV9GaWxlU3lzdGVtX0ZGU19Xcml0ZV9jYWNoZTsKLSAgICBGUy0+cEZjdFB0cl9TZWVrID0gTTRPU0FfRmlsZVN5c3RlbV9GRlNfU2Vla19jYWNoZTsKLSAgICBGUy0+cEZjdFB0cl9UZWxsID0gTTRPU0FfRmlsZVN5c3RlbV9GRlNfVGVsbF9jYWNoZTsKLSAgICBGUy0+cEZjdFB0cl9DbG9zZSA9IE00T1NBX0ZpbGVTeXN0ZW1fRkZTX0Nsb3NlX2NhY2hlOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVPcGVuX2NhY2hlX2ludGVybmFsKHBDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTW9kZUFjY2VzcywgRlMpOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIHByb3ZpZGVkIGZpbGVEZXNjcmlwdG9yIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChPVVQpIEZpbGUgQ2FjaGUgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBGaWxlRGVzY3JpcHRvciA6ICAgICAgIChJTikgRmlsZSBEZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlLgotKiBAcGFyYW0gICAgICAgRmlsZU1vZGVBY2Nlc3MgOiAgICAgICAgKElOKSBGaWxlIG1vZGUgYWNjZXNzLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwQ29udGV4dCBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX05PVF9GT1VORCBUaGUgZmlsZSBjYW4gbm90IGJlIG9wZW5lZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlT3Blbl9jYWNoZV9pbnRlcm5hbChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyX2NhY2hlICpGUykKLXsKLSAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX0VSUiAgIGVyciAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVm9pZCogYUZpbGVEZXNjID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9Cb29sICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX1VJbnQxNiBlcnJSZXR1cm5lZCA9IDA7Ci0gICAgTTRPU0FfSW50MzIgbGVuLG5hbWVfbGVuOwotICAgIE00T1NBX0NoYXIqIHBDaGFyRmlsZURlc2MgPSAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yOwotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBNNE9TQV9UaW1lIHRpbWUxID0gMDsKLSAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVPcGVuX2NhY2hlIGZkID0gJXMgbW9kZSA9ICVkIiwgcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlQWNjZXNzKTsKLQotICAgIC8qICAgICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIEZTKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0LiAqLwotICAgIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyKikiTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQiKTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQpOwotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUwotICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfaW5pdFRpbWVNZWFzKGFwQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTEsMTAwMCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KLQotICAgIC8qIFNldCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLwotICAgIGFwQ29udGV4dC0+RlMgPSBGUzsKLQotICAgIGlmIChNNE9TQV9rRmlsZVdyaXRlID09IEZpbGVNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgRmlsZU1vZGVBY2Nlc3MgfD0gTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlOyAgICAvKiBmb3IgVkEgaW4gY2FzZSBvZiBvcGVuIHdpdGggb25seSBXcml0ZSBmbGFnLCB3ZSBhZGQgdGhlIENyZWF0ZSAqLwotICAgIH0KLQotICAgIC8qIEZvciBWQSBhbmQgVkVTLCB3ZSBuZWVkIHRvIGFkZCBhY2Nlc3MgaW4gcmVhZCwgdG8gd3JpdGUgdGhlIG1vb3YgZm9yIGV4YW1wbGUgKi8KLSAgICAvKiBBZGQgdGhlIGZsYWcgUmVhZCBpbiBhbGwgY2FzZXMsIGJlY2F1c2UgT3NhbCBGaWxlIENhY2hlIHVzZXMgcmVhZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgRmlsZU1vZGVBY2Nlc3MgfD0gTTRPU0Ffa0ZpbGVSZWFkOwotCi0gICAgYUZpbGVEZXNjID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9PcGVuKHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyUmV0dXJuZWQpOwotCi0gICAgaWYgKGFGaWxlRGVzYyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJSZXR1cm5lZCk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9maWxlT3Blbl9jYWNoZSBlcnJvciAweCV4IGZvciBmZCA9ICVzIiwgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qZnJlZSB0aGUgY29udGV4dCBhbmQgYXNzb2NpYXRlZCBGUyBwb2ludGVycyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkgLypzaG91bGQgbmV2ZXIgYmUgbnVsbCovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dC0+RlMpIC8qc2hvdWxkIG5ldmVyIGJlIG51bGwqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQtPkZTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dCk7Ci0gICAgICAgICAgICBhcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgYnVmZmVycyAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJzSW5pdChhcENvbnRleHQpOwotICAgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfVFJVRTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgZ290byBjbGVhbnVwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzICovCi0gICAgYXBDb250ZXh0LT5maWxlU2l6ZSA9IDA7Ci0gICAgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUgPSAwOwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAwOwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyA9IDA7Ci0KLQotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSAwOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgRGVzY3JpcHRvciovCi0gICAgYXBDb250ZXh0LT5hRmlsZURlc2MgPSBhRmlsZURlc2M7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBtb2RlIEFjY2VzcyAqLwotICAgIGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzID0gKE00T1NBX0ZpbGVNb2RlQWNjZXNzKUZpbGVNb2RlQWNjZXNzOwotCi0gICAgYXBDb250ZXh0LT5jaHJvbm8gPSAwOwotCi0jaWZkZWYgRklMRUNBQ0hFX1NUQVRTCi0gICAgYXBDb250ZXh0LT5uYlJlYWRDYWNoZSA9IDA7Ci0gICAgYXBDb250ZXh0LT5uYldyaXRlQ2FjaGUgPSAwOwotCi0gICAgYXBDb250ZXh0LT5uYlJlYWRGRlMgPSAwOwotICAgIGFwQ29udGV4dC0+bmJXcml0ZUZGUyA9IDA7Ci0jZW5kaWYKLQotICAgIC8qUmV0cmlldmUgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9IChNNE9TQV9Db250ZXh0KWFwQ29udGV4dDsKLQotICAgIC8qIENvbXB1dGUgZmlsZSBzaXplICovCi0gICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0NhbGN1bGF0ZVNpemUoYXBDb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgZ290byBjbGVhbnVwOwotCi0gICAgYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUgPSBhcENvbnRleHQtPmZpbGVTaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOwotICAgIGlmICh0aW1lMj50aW1lMSkKLSAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlT3BlbnRpbWVdICs9IHRpbWUyLXRpbWUxOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICBNNE9TQV9tdXRleE9wZW4oJihhcENvbnRleHQtPm1fbXV0ZXgpKTsKLQotICAgIC8qIGZpbGVuYW1lIGV4dHJhY3Rpb24sIGp1c3QgZm9yIHRyYWNlcyAgKi8KLSAgICBNNE9TQV9tZW1zZXQoYXBDb250ZXh0LT5tX2ZpbGVuYW1lLCAyNTYsIDApOwotICAgIGxlbj0oIE00T1NBX2Nockxlbmd0aChwQ2hhckZpbGVEZXNjKSApKzE7Ci0gICAgZm9yKCAtLWxlbiA7IChsZW4gPj0gMCAmJiBwQ2hhckZpbGVEZXNjW2xlbl0gIT0gJ1xcJyAmJiBwQ2hhckZpbGVEZXNjW2xlbl0gIT0gJy8nKSA7IGxlbi0tICk7Ci0gICAgbmFtZV9sZW49TTRPU0FfY2hyTGVuZ3RoKCAmcENoYXJGaWxlRGVzY1tsZW4rMV0gKTsKLSAgICBlcnI9TTRPU0FfY2hyTkNvcHkoYXBDb250ZXh0LT5tX2ZpbGVuYW1lLCAmcENoYXJGaWxlRGVzY1tsZW4rMV0sIG5hbWVfbGVuKTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlT3Blbl9jYWNoZSBvZiAlcyBoYXMgcEMgPSAweCV4IiwgYXBDb250ZXh0LT5tX2ZpbGVuYW1lLCBhcENvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLWNsZWFudXA6Ci0KLSAgICAvKiBmcmVlIGNvbnRleHQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBhcENvbnRleHQpCi0gICAgewotICAgICAgICBpZihidWZmZXJzX2FsbG9jYXRlZCA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZyZWUoYXBDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dCk7Ci0gICAgICAgICAgICBhcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHJlYWRzIHRoZSAnc2l6ZScgYnl0ZXMgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpCi0qICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJyBwb2ludGVyLiBJZiAnc2l6ZScgYnl0ZSBjYW4gbm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsCi0qICAgICAgICAgICAgICAgICAgICAgICdzaXplJyBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdCBudW1iZXIgb2YgcmVhZCBieXRlcy4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEZpbGUgcmVhZGVyIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwRGF0YSA6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhLgotKiBAcGFyYW0gICAgICAgcFNpemUgOiAoSU5PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZSkuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBTaXplLCBmaWxlRGVzY3JpcHRvciBvciBwRGF0YSBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfY2FjaGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCxNNE9TQV9NZW1BZGRyOCBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBhU2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29waWVkU2l6ZTsKLSAgICBNNE9TQV9JbnQ4IHNlbGVjdGVkX2J1ZmZlciwgY3VycmVudF9idWZmZXI7Ci0gICAgTTRPU0FfSW50MzIgY2FzdGVkU2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7Ci0gICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7Ci0KLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRPU0FfZmlsZVJlYWREYXRhX2NhY2hlIG9mICVzIHNpemU9JWQgYXQgcG9zPSVkICAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+bV9maWxlbmFtZSwgKnBTaXplLCBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBEYXRhKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBTaXplKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi1MT0NLCi0KLS8qIDIwMDgwMTI1IFN0YXJ0IDogaWYgKnBTaXplIGlzIHRvbyBoaWdoLCBhZGp1c3QgaXQgdG8gdGhlIHNpemUgbGVmdCBpbiB0aGUgZmlsZS4gTUktOTU4Ki8KLSAgICBjYXN0ZWRTaXplID0gKiBwU2l6ZTsKLSAgICBpZiAoY2FzdGVkU2l6ZSA8IDApCi0gICAgewotICAgICAgICBjb3BpZWRTaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSNpZmRlZiBNNE9TQV9GSUxFQ0FDSEVfTU0KLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7IC8qIG5vX2RhdGFfeWV0IGZvciBNTSAqLwotI2VuZGlmCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0vKiAyMDA4MDEyNSBFbmQgOiBpZiAqcFNpemUgaXMgdG9vIGhpZ2gsIGFkanVzdCBpdCB0byB0aGUgc2l6ZSBsZWZ0IGluIHRoZSBmaWxlLiBNSS05NTgqLwotCi0gICAgLyogUHJldmVudCByZWFkaW5nIGJleW9uZCBFT0YgKi8KLSAgICBpZigoKnBTaXplID4gMCkgJiYgKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUpKSAvKiB2aXJ0dWFsIEZTaXplKi8KLSAgICB7Ci0gICAgICAgIGNvcGllZFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOyAvKiBmb3IgVkEgYW5kIFZQUyAqLwotI2lmZGVmIE00T1NBX0ZJTEVDQUNIRV9NTQotICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsgLyogbm9fZGF0YV95ZXQgZm9yIE1NICovCi0jZW5kaWYKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotLyogMjAwODAxMjUgU3RhcnQgOiBpZiAqcFNpemUgaXMgdG9vIGhpZ2gsIGFkanVzdCBpdCB0byB0aGUgc2l6ZSBsZWZ0IGluIHRoZSBmaWxlLiBNSS05NTgqLwotICAgIGlmICgqcFNpemUgPiAoTTRPU0FfVUludDMyKShhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSAtIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVSZWFkRGF0YV9jYWNoZSA6IEF0dGVtcHRlZCB0byByZWFkIGJleW9uZCBmaWxlIHNpemUsIGFkanVzdGVkIHNpemUiKTsKLSAgICAgICAgKnBTaXplID0gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUgLSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgIH0KLS8qIDIwMDgwMTI1IEVuZCA6IGlmICpwU2l6ZSBpcyB0b28gaGlnaCwgYWRqdXN0IGl0IHRvIHRoZSBzaXplIGxlZnQgaW4gdGhlIGZpbGUuIE1JLTk1OCovCi0KLSAgICAvKiBDaGVjayBpZiBkYXRhIGNhbiBiZSByZWFkIGZyb20gYSBidWZmZXIgKi8KLSAgICAvKiBJZiBub3QsIGZpbGwgb25lIGFjY29yZGluZyB0byBxdWFudGl6ZWQgcG9zaXRpb25zICovCi0gICAgY29waWVkU2l6ZSA9IDA7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJNYXRjaFRvUmVhZChhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX0NBQ0hFQlVGRkVSX05PTkUpCi0gICAgewotCi0jaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX0lOSVRJQUwpCi0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RGb3JSZWFkKGFwQ29udGV4dCk7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9USU1FKQotICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFRpbWUoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1NQQUNFKQotICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFNwYWNlKGFwQ29udGV4dCk7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9QT1MpCi0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoUG9zKGFwQ29udGV4dCk7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSA9PSBzZWxlY3RlZF9idWZmZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOyAvKiB0ZW1wb3JhcnkgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZpbGwoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotICAgIH0KLSNpZmRlZiBGSUxFQ0FDSEVfU1RBVFMKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBidWZmZXJNYXRjaCBoYXMgc3VjY2VzcyBpbiByZWFkICAqLwotICAgICAgICBhcENvbnRleHQtPm5iUmVhZENhY2hlKys7Ci0gICAgfQotI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLwotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZigoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKSAmJiAoKnBTaXplIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKSkKLSAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICBlbHNlIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygicmVhZERhdGEgIHNpemUgPSAlZCAgYnVmZmVyID0gJWQgIHBvcyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHBEYXRhICovCi0gICAgd2hpbGUoKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIGFTaXplID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICBpZihhU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IHNlbGVjdGVkX2J1ZmZlcjsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyTWF0Y2hUb1JlYWQoYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkX2J1ZmZlciA9PSBNNE9TQV9DQUNIRUJVRkZFUl9OT05FKQotICAgICAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfSU5JVElBTCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdEZvclJlYWQoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoVGltZShhcENvbnRleHQpOwotI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfU1BBQ0UpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoU3BhY2UoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1BPUykKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhQb3MoYXBDb250ZXh0KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9DQUNIRUJVRkZFUl9OT05FID09IHNlbGVjdGVkX2J1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7IC8qIHRlbXBvcmFyeSBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpICYmICgoKnBTaXplLWNvcGllZFNpemUpIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIEZJTEVDQUNIRV9TVEFUUwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlck1hdGNoIGhhcyBzdWNjZXNzIGluIHJlYWQgICovCi0gICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+bmJSZWFkQ2FjaGUrKzsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgLyogRklMRUNBQ0hFX1NUQVRTICovCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotY2xlYW51cCA6Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciAqLwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgY29waWVkU2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVDQUNIRV9NTQotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0jZW5kaWYgLyogTTRPU0FfRklMRUNBQ0hFX01NICovCi0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlUmVhZERhdGFfY2FjaGUgc2l6ZSA9ICVkICBjb3BpZWQgPSAlZCAgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLCBjb3BpZWRTaXplLCBlcnIpOwotICAgIH0KLQotICAgIC8qIEVmZmVjdGl2ZSBjb3BpZWQgc2l6ZSBtdXN0IGJlIHJldHVybmVkICovCi0gICAgKnBTaXplID0gY29waWVkU2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKLSAgICBpZiAodGltZTI+dGltZTEpCi0gICAgICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVJlYWREYXRhdGltZV0gKz0gdGltZTItdGltZTE7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KLQotVU5MT0NLCi0KLSAgICAvKiBSZWFkIGlzIGRvbmUgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdzaXplJyBieXRlcyBzdG9yZWQgYXQgJ2RhdGEnIG1lbW9yeQotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgc2VsZWN0ZWQgYnkgaXRzIGNvbnRleHQuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCi0gKiBAbm90ZSAgICAgICBNb3Jlb3ZlciB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0Ci0gKiAgICAgICAgICAgICAnc2l6ZScgYnl0ZXMuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgcERhdGE6IChJTikgRGF0YSBwb2ludGVyIG9mIHRoZSB3cml0ZSBkYXRhCi0gKiBAcGFyYW0gICAgICBzaXplOiAoSU4pIFNpemUgb2YgdGhlIGRhdGEgdG8gd3JpdGUgKGluIGJ5dGVzKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVEYXRhX2NhY2hlKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRPU0FfTWVtQWRkcjggcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKQotewotICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGFTaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3BpZWRTaXplOwotICAgIE00T1NBX0ludDggc2VsZWN0ZWRfYnVmZmVyLCBjdXJyZW50X2J1ZmZlcjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7Ci0gICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7Ci0KLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSBvZiAlcyBzaXplPSVkIGF0IHBvcz0lZCAgICIsCi0gICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5tX2ZpbGVuYW1lLCBzaXplLCBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOwotCi0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIC8qcHJvdGVjdGlvbiovCi0gICAgaWYgKGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyA+IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVXcml0ZURhdGFfY2FjaGUgRVJST1IgOiBhdHRlbXB0aW5nIHRvIHdyaXRlIGJleW9uZCBFT0YiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX0RBVEFfWUVUOwotICAgIH0KLQotTE9DSwotCi0gICAgLyogQ2hlY2sgaWYgZGF0YSBoYXMgYmVlbiByZWFkIGludG8gYSBidWZmZXIgKi8KLSAgICAvKiBJZiBub3QsIHdlIHNob3VsZCByZWFkIHRoYXQgYnVmZmVyIGZpcnN0IGFuZCB0aGVuIGZpbGwgaXQgKi8KLSAgICBjb3BpZWRTaXplID0gMDsKLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1hdGNoVG9Xcml0ZShhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MpOwotCi0gICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX0NBQ0hFQlVGRkVSX05PTkUpCi0gICAgewotI2lmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9JTklUSUFMKQotICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0Rm9yV3JpdGUoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUpCi0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoVGltZShhcENvbnRleHQpOwotI2VsaWYgZGVmaW5lZChCVUZGRVJfU0VMRUNUX1dJVEhfU1BBQ0UpCi0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVDYWNoZV9CdWZmZXJTZWxlY3RXaXRoU3BhY2UoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1BPUykKLSAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhQb3MoYXBDb250ZXh0KTsKLSNlbmRpZgotCi0gICAgICAgIGlmIChNNE9TQV9DQUNIRUJVRkZFUl9OT05FID09IHNlbGVjdGVkX2J1ZmZlcikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVXcml0ZURhdGFfY2FjaGUgRVJSMSBlcnI9MHgleCIsIGVycik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsgLyogdGVtcG9yYXJ5IGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MgLSBNNE9TQV9DQUNIRUJVRkZFUl9TSVpFIDwgYXBDb250ZXh0LT5maWxlU2l6ZSkgLyogYWJzb2x1dGVQb3Mgbm90IHJlYWRmaWxlcG8gc3RyaWN0bHkgPCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyUmVpbml0aWFsaXplKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zKTsKLSAgICAgICAgfQotCi0gICAgfQotI2lmZGVmIEZJTEVDQUNIRV9TVEFUUwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGJ1ZmZlck1hdGNoIGhhcyBzdWNjZXNzIGluIHdyaXRlICovCi0gICAgICAgIGFwQ29udGV4dC0+bmJXcml0ZUNhY2hlKys7Ci0gICAgfQotI2VuZGlmIC8qIEZJTEVDQUNIRV9TVEFUUyAqLwotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZihlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpIC8qIG1lYW5zIHRoZSBidWZmZXIgaXMgc21hbGwsIGl0IGlzIGF0IEVPRiwgYnVmZmVyRmlsbCBkaWRuJ3QgZnVsbHkgZmlsbCBpdCovCi0gICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgZWxzZSBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIndyaXRlRGF0YSAgc2l6ZSA9ICVkICBidWZmZXIgPSAlZCAgcG9zID0gJWQiLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zKTsKLQotICAgIC8qIENvcHkgYnVmZmVyIGludG8gcERhdGEgKi8KLSAgICB3aGlsZSgoKE00T1NBX1VJbnQzMiljb3BpZWRTaXplIDwgc2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIGFTaXplID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1vZGlmeUNvbnRlbnQoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAvKiB1cGRhdGUgdmlydHVhbEZpbGVTaXplIGluIGNhc2Ugd2Ugd3JpdGUgYXQgdGhlIGVuZCAgKi8KLSAgICAgICAgaWYgKGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcytjb3BpZWRTaXplPmFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSA9IGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcytjb3BpZWRTaXplOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoInZpcnR1YWxGaWxlU2l6ZSBpbmNyZW1lbnRlZCB0byAlZCIsIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyID0gc2VsZWN0ZWRfYnVmZmVyOwotICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlck1hdGNoVG9Xcml0ZShhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemUpOwotCi0gICAgICAgICAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfQ0FDSEVCVUZGRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfSU5JVElBTCkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0Rm9yV3JpdGUoYXBDb250ZXh0KTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhUaW1lKGFwQ29udGV4dCk7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9TUEFDRSkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyU2VsZWN0V2l0aFNwYWNlKGFwQ29udGV4dCk7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9QT1MpCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlclNlbGVjdFdpdGhQb3MoYXBDb250ZXh0KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX0NBQ0hFQlVGRkVSX05PTkUgPT0gc2VsZWN0ZWRfYnVmZmVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVXcml0ZURhdGFfY2FjaGUgRVJSMiBlcnI9MHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOyAvKiB0ZW1wb3JhcnkgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcytjb3BpZWRTaXplIDwgYXBDb250ZXh0LT5maWxlU2l6ZSkgLyogYWJzb2x1dGVQb3Mgbm90IHJlYWRmaWxlcG8gc3RyaWN0bHkgPCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRmlsZUNhY2hlX0J1ZmZlckZpbGwoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyUmVpbml0aWFsaXplKGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZigoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgRklMRUNBQ0hFX1NUQVRTCi0gICAgZWxzZSAgLyogKHNlbGVjdGVkX2J1ZmZlciA9PSBNNE9TQV9DQUNIRUJVRkZFUl9OT05FKSAqLwotICAgIHsKLSAgICAgICAgLyogYnVmZmVyTWF0Y2ggaGFzIHN1Y2Nlc3MgaW4gd3JpdGUgKi8KLSAgICAgICAgYXBDb250ZXh0LT5uYldyaXRlQ2FjaGUrKzsKLSAgICB9Ci0jZW5kaWYgLyogRklMRUNBQ0hFX1NUQVRTICovCi0KLSAgICAgICAgfQotCi0gICAgfQotCi1jbGVhbnVwIDoKLQotICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCi0gICAgYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zICsgY29waWVkU2l6ZTsKLSNpZmRlZiBNNE9TQV9GSUxFQ0FDSEVfTU0KLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVDQUNIRV9NTSAqLwotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVdyaXRlRGF0YV9jYWNoZSBzaXplID0gJWQgIGNvcGllZCA9ICVkICBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGNvcGllZFNpemUsIGVycik7Ci0gICAgfQotCi0gICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KLSAgICBzaXplID0gY29waWVkU2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKLSAgICBpZiAodGltZTI+dGltZTEpCi0gICAgICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVdyaXRlRGF0YXRpbWVdICs9IHRpbWUyLXRpbWUxOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLVVOTE9DSwotCi0gICAgLyogUmVhZCBpcyBkb25lICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KLSogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6Ci0qICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KLSogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX2NhY2hlKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24pCi17Ci0gICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmaW5hbFBvczsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfVGltZSB0aW1lMSA9IDA7Ci0gICAgTTRPU0FfVGltZSB0aW1lMiA9IDA7Ci0KLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUxLDEwMDApOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZVJlYWRTZWVrX2NhY2hlIG1vZGUgPSAlZCBwb3MgPSAlZCIsIFNlZWtNb2RlLCAqcFBvc2l0aW9uKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBQb3NpdGlvbik7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBTZWVrTW9kZSk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi1MT0NLCi0KLSAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgIHN3aXRjaChTZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nIDoKLSAgICAgICAgICAgIGZpbmFsUG9zID0gKnBQb3NpdGlvbjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kIDoKLSAgICAgICAgICAgIGZpbmFsUG9zID0gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtDdXJyZW50IDoKLSAgICAgICAgICAgIGZpbmFsUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb247Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIFVOTE9DSwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZFNlZWtfY2FjaGUgdG8gYWJzb2x1dGVQb3MgPSAlZCAiLCBmaW5hbFBvcyk7Ci0KLS8qIDIwMDgwMTI1IFN0YXJ0IDogUHJvdGVjdCBhZ2FpbnN0IHNlZWsgb3V0c2lkZSBmaWxlLiBNSS05NTgqLwotICAgIGlmIChmaW5hbFBvcyA8PSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSAmJiBmaW5hbFBvcz49MCkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBmaW5hbFBvczsKLSAgICAgICAgKnBQb3NpdGlvbiA9IGZpbmFsUG9zOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfZmlsZVJlYWRTZWVrX2NhY2hlOiBhdHRlbXB0ZWQgdG8gc2VlayBhdCAlZCB3aGlsc3QgZmlsZXNpemU9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQb3MsIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKTsKLSAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7ICAgIC8qIGtlZXAgdGhlIHByZXZpb3VzIHBvc2l0aW9uICovCi0gICAgICAgIC8vZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOyAgLyogZm9yIFZBICovCi0gICAgfQotLyogMjAwODAxMjUgRW5kIDogUHJvdGVjdCBhZ2FpbnN0IHNlZWsgb3V0c2lkZSBmaWxlLiBNSS05NTgqLwotCi0jaWZkZWYgTTRPU0FfRklMRUNBQ0hFX01NCi0gICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0jZW5kaWYgLyogTTRPU0FfRklMRUNBQ0hFX01NICovCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUwotICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTIsMTAwMCk7Ci0gICAgaWYgKHRpbWUyPnRpbWUxKQotICAgICAgICBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVTZWVrdGltZV0gKz0gdGltZTItdGltZTE7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KLQotVU5MT0NLCi0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCi0qICAgICAgICAgICAgICBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgOgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgYmVnaW5uaW5nIChwb3NpdGlvbiBNVVNUIGJlIHBvc2l0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IHBvc2l0aW9uCi0qICAgICAgICAgICAgICBGcm9tIHRoZSBlbmQgKHBvc2l0aW9uIE1VU1QgYmUgbmVnYXRpdmUpIDogZW5kIHBvc2l0aW9uID0gZmlsZSBzaXplICsgcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gKHNpZ25lZCBvZmZzZXQpIDogZW5kIHBvc2l0aW9uID0gY3VycmVudCBwb3NpdGlvbiArIHBvc2l0aW9uLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIFNlZWtNb2RlIDogICAgICAoSU4pIFNlZWsgYWNjZXNzIG1vZGUuCi0qIEBwYXJhbSAgICAgICBwUG9zaXRpb24gOiAgICAgKElOKSBQb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNlZWtfY2FjaGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZmluYWxQb3M7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUwotICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOwotICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOwotCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVXcml0ZVNlZWtfY2FjaGUgbW9kZSA9ICVkIHBvcyA9ICVkIiwgU2Vla01vZGUsICpwUG9zaXRpb24pOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLUxPQ0sKLQotICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgc3dpdGNoKFNlZWtNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgOgotICAgICAgICAgICAgZmluYWxQb3MgPSAqcFBvc2l0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgotICAgICAgICAgICAgZmluYWxQb3MgPSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZSArICpwUG9zaXRpb247Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgotICAgICAgICAgICAgZmluYWxQb3MgPSBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBVTkxPQ0sKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlU2Vla19jYWNoZSB0byBhYnNvbHV0ZVdyaXRlUG9zID0gJWQgIiwgZmluYWxQb3MpOwotCi0vKiAyMDA4MDEyNSBTdGFydCA6IFByb3RlY3QgYWdhaW5zdCBzZWVrIG91dHNpZGUgZmlsZS4gTUktOTU4Ki8KLSAgICBpZiAoZmluYWxQb3MgPD0gYXBDb250ZXh0LT52aXJ0dWFsRmlsZVNpemUgJiYgZmluYWxQb3M+PTApCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MgPSBmaW5hbFBvczsKLSAgICAgICAgKnBQb3NpdGlvbiA9IGZpbmFsUG9zOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfZmlsZVdyaXRlU2Vla19jYWNoZTogYXR0ZW1wdGVkIHRvIHNlZWsgYXQgJWQgd2hpbHN0IGZpbGVzaXplPSVkICAgICAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQb3MsIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKTsKLSAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVXcml0ZVBvczsgICAgLyoga2VlcCB0aGUgcHJldmlvdXMgcG9zaXRpb24gKi8KLSAgICAgICAgLy9lcnIgPSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047Ci0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7ICAvKiBmb3IgVkEgKi8KLSAgICB9Ci0vKiAyMDA4MDEyNSBFbmQgOiBQcm90ZWN0IGFnYWluc3Qgc2VlayBvdXRzaWRlIGZpbGUuIE1JLTk1OCovCi0KLSNpZmRlZiBNNE9TQV9GSUxFQ0FDSEVfTU0KLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVdyaXRlUG9zOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVDQUNIRV9NTSAqLwotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOwotICAgIGlmICh0aW1lMj50aW1lMSkKLSAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlU2Vla3RpbWVdICs9IHRpbWUyLXRpbWUxOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLVVOTE9DSwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUZsdXNoX2NhY2hlKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIC8qIERvIG5vdGhpbmcsIE00T1NBX2ZpbGVDYWNoZSBtb2R1bGUgbWFuYWdlcyBpdHMgY2FjaGVzIGJ5IGl0c2VsZiAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDbG9zZV9jYWNoZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyIGFSZXRfVmFsID0gMDsKLSAgICBNNE9TQV9VSW50MTYgZXJyUmV0dXJuZWQgPSAwOwotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUwotICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOwotICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOwotCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVDbG9zZV9jYWNoZSBwQyA9IDB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotTE9DSwotCi0jaWZkZWYgQlVGRkVSX0RJU1BMQVkKLSAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyRGlzcGxheShhcENvbnRleHQpOwotI2VuZGlmCi0KLSAgICBNNE9TQV9GaWxlQ2FjaGVfQnVmZmVyc0ZsdXNoVW50aWwoYXBDb250ZXh0LCBNNE9TQV9DQUNIRUJVRkZFUl9BTEwpOwotCi0gICAgLyogYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZUNhY2hlX0J1ZmZlcnNGcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGFSZXRfVmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9DbG9zZShhcENvbnRleHQtPmFGaWxlRGVzYywgJmVyclJldHVybmVkKTsKLQotICAgIGlmIChhUmV0X1ZhbCAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVyclJldHVybmVkKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVDbG9zZV9jYWNoZSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0LT5GUyk7Ci0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWFwQ29udGV4dC0+YUZpbGVEZXNjKTsKLQotI2lmZGVmIEZJTEVDQUNIRV9TVEFUUwotewotICAgIE00T1NBX0ludDMyIHN1Y2Nlc3NSYXRlUmVhZCwgc3VjY2Vzc1JhdGVXcml0ZTsKLQotICAgIHN1Y2Nlc3NSYXRlUmVhZD0gKGFwQ29udGV4dC0+bmJSZWFkRkZTICsgYXBDb250ZXh0LT5uYlJlYWRDYWNoZSA9PTApPyAoLTEpIDogKGFwQ29udGV4dC0+bmJSZWFkQ2FjaGUpKjEwMCAvIChhcENvbnRleHQtPm5iUmVhZENhY2hlICsgYXBDb250ZXh0LT5uYlJlYWRGRlMpOwotCi0gICAgc3VjY2Vzc1JhdGVXcml0ZSA9IChhcENvbnRleHQtPm5iV3JpdGVGRlMgKyBhcENvbnRleHQtPm5iV3JpdGVDYWNoZSA9PSAwKT8gKC0xKSA6IChhcENvbnRleHQtPm5iV3JpdGVDYWNoZSkqMTAwIC8gKGFwQ29udGV4dC0+bmJXcml0ZUNhY2hlICsgYXBDb250ZXh0LT5uYldyaXRlRkZTKTsKLQotI2lmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9JTklUSUFMKQotICAgIE00T1NBX1RSQUNFMV8wKCJCVUZGRVJfU0VMRUNUX0lOSVRJQUwiKTsKLSNlbGlmIGRlZmluZWQoQlVGRkVSX1NFTEVDVF9XSVRIX1RJTUUpCi0gICAgTTRPU0FfVFJBQ0UxXzAoIkJVRkZFUl9TRUxFQ1RfV0lUSF9USU1FIik7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9TUEFDRSkKLSAgICBNNE9TQV9UUkFDRTFfMCgiQlVGRkVSX1NFTEVDVF9XSVRIX1NQQUNFIik7Ci0jZWxpZiBkZWZpbmVkKEJVRkZFUl9TRUxFQ1RfV0lUSF9QT1MpCi0gICAgTTRPU0FfVFJBQ0UxXzAoIkJVRkZFUl9TRUxFQ1RfV0lUSF9QT1MiKTsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk9zYWwgRmlsZSBDYWNoZSBTdGF0cyBmb3IgJXMiLCBhcENvbnRleHQtPm1fZmlsZW5hbWUpOwotICAgIE00T1NBX1RSQUNFMV8yKCJGSUxFQ0FDSEVfU1RBVFM6IG5iUmVhZENhY2hlPSVkIC8gbmJSZWFkRkZTPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPm5iUmVhZENhY2hlLCBhcENvbnRleHQtPm5iUmVhZEZGUyk7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoIkZJTEVDQUNIRV9TVEFUUzogbmJXcml0ZUNhY2hlPSVkIC8gbmJXcml0ZUZGUz0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+bmJXcml0ZUNhY2hlLCBhcENvbnRleHQtPm5iV3JpdGVGRlMpOwotICAgIE00T1NBX1RSQUNFMV8yKCJGSUxFQ0FDSEVfU1RBVFM6IFN1Y2Nlc3MgaW4gcmVhZGluZyA6ICVkIHBlcmNlbnQgLSBTdWNjZXNzIGluIHdyaXRpbmcgJWQgcGVyY2VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZVJlYWQsIHN1Y2Nlc3NSYXRlV3JpdGUpOwotICAgIE00T1NBX1RSQUNFMV8wKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLX0KLSNlbmRpZiAvKiBGSUxFQ0FDSEVfU1RBVFMgKi8KLQotICAgIFVOTE9DSwotCi0gICAgaWYgKGFwQ29udGV4dC0+bV9tdXRleCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfbXV0ZXhDbG9zZShhcENvbnRleHQtPm1fbXV0ZXgpOwotICAgICAgICBhcENvbnRleHQtPm1fbXV0ZXggPSBNNE9TQV9OVUxMOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTIsMTAwMCk7Ci0gICAgICAgIGlmICh0aW1lMj50aW1lMSkKLSAgICAgICAgICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZUNsb3NldGltZV0gKz0gdGltZTItdGltZTE7Ci0KLSAgICAgICAgTTRPU0FfRmlsZUNhY2hlX2Rpc3BsYXlUaW1lTWVhcyhhcENvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KWFwQ29udGV4dCwgc2l6ZW9mKE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KSwgMCk7Ci0KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYXBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlQ2xvc2VfY2FjaGUgbGVhdmluZyB3aXRoIGVyciA9IDB4JXgiLCBlcnIpOwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0qICAgICAgICAgICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wb25lbnQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uVmFsdWUgOiAgIChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbi4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwQ29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfT1BUSU9OX0lEIHRoZSBvcHRpb24gaWQgaXMgbm90IHZhbGlkLgotKiBAcmV0dXJuICAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlU2V0T3B0aW9uX2NhY2hlKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OwotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBNNE9TQV9UaW1lIHRpbWUxID0gMDsKLSAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKLQotICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmdGltZTEsMTAwMCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogU2V0IHRoZSBkZXNpcmVkIG9wdGlvbiBpZiBpdCBpcyBhdmFsYWlibGUgKi8KLSAgICBzd2l0Y2goT3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplIDogICAgICAgLyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUgOiAgLyoqPCBHZXQgdGhlIGZpbGUgYXR0cmlidXRlKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRVUkwgOiAgICAgICAgICAgIC8qKjwgR2V0IHRoZSBkaXJlY3RvcnkgKyBuYW1lIG9mIHRoZSBmaWxlICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0YgOiAgICAgICAgICAgICAvKio8IFNlZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiA6ICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURfT05MWTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZURlc2NNb2RlOgotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7ICAgICAgICAgICAgICAgICAgICAvKiBmb3IgTU0gKi8KLQotICAgICAgICBkZWZhdWx0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYWQgb3B0aW9uIElEICovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKLSAgICBpZiAodGltZTI+dGltZTEpCi0gICAgICAgIGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVNldE9wdGlvbnRpbWVdICs9IHRpbWUyLXRpbWUxOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQ0FDSEVfVElNRV9NRUFTICovCi0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0qICAgICAgICAgICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wb25lbnQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgcE9wdGlvblZhbHVlIDogIChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcENvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KLSogQHJldHVybiAgICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCBUaGUgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUdldE9wdGlvbl9jYWNoZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0Jvb2wgaXNFb2Y7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUwotICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOwotICAgIE00T1NBX1RpbWUgdGltZTIgPSAwOwotCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0NBQ0hFX1RJTUVfTUVBUyAqLwotCi0KLSAgICAvKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLUxPQ0sKLQotICAgIC8qIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyogR2V0IEZpbGUgU2l6ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOi8qKjwgR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlIFJlYWRHZXRGaWxlU2l6ZSByZXR1cm4gZmlsZXNpemUgPSAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKTsKLSAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKXBPcHRpb25WYWx1ZSkgPSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZTsgLyogcmV0dXJuIHZpcnR1YWwgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6LyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgV3JpdGVHZXRGaWxlU2l6ZSByZXR1cm4gZmlsZXNpemUgPSAlZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKTsKLSAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKXBPcHRpb25WYWx1ZSkgPSBhcENvbnRleHQtPnZpcnR1YWxGaWxlU2l6ZTsgLyogcmV0dXJuIHZpcnR1YWwgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIENoZWNrIEVuZCBvZiBmaWxlIE9jY3VycyAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GIDogICAgIC8qKjwgU2VlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICBpc0VvZiA9IChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+dmlydHVhbEZpbGVTaXplKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsgLyogdmlydHVhbCAqLwotICAgICAgICAgICAgKCooTTRPU0FfQm9vbCAqKXBPcHRpb25WYWx1ZSkgPSBpc0VvZjsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlIFJlYWRJc0VPRiByZXR1cm4gaXNFb2Y9JWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VvZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgRmlsZSBQb3NpdGlvbiAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiA6ICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgUmVhZEdldEZpbGVQb3NpdGlvbiByZXR1cm4gcnBvcz0lZCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLSAgICAgICAgICAgICooTTRPU0FfRmlsZVBvc2l0aW9uICopcE9wdGlvblZhbHVlID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIEdldCBGaWxlIFBvc2l0aW9uICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVQb3NpdGlvbiA6ICAgIC8qKjwgR2V0IGZpbGUgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlR2V0T3B0aW9uX2NhY2hlIFdyaXRlR2V0RmlsZVBvc2l0aW9uIHJldHVybiB3cG9zPSVkICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3MpOwotICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlV3JpdGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgQXR0cmlidXRlICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZSA6ICAvKio8IEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUgPSBhY2Nlc3MgbW9kZSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVHZXRPcHRpb25fY2FjaGUgUmVhZEdldEZpbGVBdHRyaWJ1dGUgcmV0dXJuIG1vZGU9JWQgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2Vzcyk7Ci0gICAgICAgICAgICAoKihNNE9TQV9GaWxlQXR0cmlidXRlICopcE9wdGlvblZhbHVlKS5tb2RlQWNjZXNzID0gYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgIC8qKiBHZXQgdGhlIHJlYWRlciBjb250ZXh0IGZvciByZWFkICYgd3JpdGUgZmlsZS4gKE00T1NBX0NvbnRleHQqKSovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFJlYWRlckNvbnRleHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUdldE9wdGlvbl9jYWNoZSBXcml0ZUdldFJlYWRlckNvbnRleHQgcmV0dXJuIGM9MHgleCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0KTsKLSAgICAgICAgICAgICgqKE00T1NBX0NvbnRleHQgKilwT3B0aW9uVmFsdWUpID0gYXBDb250ZXh0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKio8IEJhZCBvcHRpb24gSUQgKi8KLSAgICAgICAgICAgIFVOTE9DSwotICAgICAgICAgICAgcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLSAgICBNNE9TQV9jbG9ja0dldFRpbWUoJnRpbWUyLDEwMDApOwotICAgIGlmICh0aW1lMj50aW1lMSkKLSAgICAgICAgYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlR2V0T3B0aW9udGltZV0gKz0gdGltZTItdGltZTE7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMgKi8KLQotICAgIFVOTE9DSwotCi0KLSAgICAvKlJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogRm9yIFZBICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlX2NhY2hlKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVUludDMyIGxlbmd0aCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MTYgcmVzdWx0ID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IGNvbnRleHQ7Ci0KLQotICAgIEZJTEUqIGZpbGVkZXNjMSA9ICgoTTRPU0FfRmlsZVN5c3RlbV9GRlNfdF9jYWNoZSopICggYXBDb250ZXh0LT5hRmlsZURlc2MpKS0+RmlsZURlc2M7Ci0KLSAgICByZXN1bHQgPSBmdHJ1bmNhdGUoZmlsZWRlc2MxLT5fZmlsZSwgbGVuZ3RoKTsKLQotICAgIGlmKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTZXRFbmRPZkZpbGUgcmV0dXJucyBlcnI6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9FWFRSQSwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0jaWZkZWYgTTRPU0FfRklMRV9DQUNIRV9USU1FX01FQVMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE9TQV9GaWxlQ2FjaGVfaW5pdFRpbWVNZWFzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlQ2FjaGVfQ29udGV4dCopIHBDb250ZXh0OwotICAgIE00T1NBX1RpbWUgdGltZTEgPSAwOwotCi0gICAgbWVtc2V0KGFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWIsIDAsIHNpemVvZihhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiKSk7IC8vUmVzZXQgcGVyZiBtZWFzdXJlbWVudCBhcnJheQotCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMSwxMDAwKTsKLSAgICBhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2VudW1fc2l6ZV0gPSB0aW1lMTsgICAgICAgICAvL3RvIGNvbXB1dGUgdG90YWwgYXBwbGljYXRpb24gdGltZQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTTRPU0FfRmlsZUNhY2hlX2Rpc3BsYXlUaW1lTWVhcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVDYWNoZV9Db250ZXh0KiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZUNhY2hlX0NvbnRleHQqKSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RpbWUgZ2xvYmFsZmlsZXBlcmZtZWFzID0gMDsKLSAgICBNNE9TQV9UaW1lIHRpbWUyID0gMDsKLSAgICBNNE9TQV9VSW50MzIgaT0wOwotCi0gICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZ0aW1lMiwxMDAwKTsKLQotICAgIC8qIFRpbWUgc3BlbnQgaW4gYXBwbGljYXRpb24gKi8KLSAgICB0aW1lMiA9IHRpbWUyLWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZW51bV9zaXplXTsKLQotICAgIC8qIFRpbWUgc3BlbnQgaW4gRmlsZSBTeXN0ZW0gcHJvY2VkdXJlcyAqLwotICAgIGZvciAoaT0wOyBpPGVudW1fc2l6ZTsgaSsrKQotICAgICAgICBnbG9iYWxmaWxlcGVyZm1lYXMgKz0gYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltpXTsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJPc2FsIEZpbGUgQ2FjaGUgVGltZSBtZWFzdXJlbWVudCBmb3IgJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+bV9maWxlbmFtZSk7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoIkFwcGxpY2F0aW9uIHRpbWUgPSVkLCBmaWxlQ2FjaGUgdG90YWwgdGltZSA9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpdGltZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilnbG9iYWxmaWxlcGVyZm1lYXMpOwotICAgIE00T1NBX1RSQUNFMV80KCJPcGVudGltZTolZCwgUmVhZERhdGF0aW1lOiVkLCBXcml0ZURhdGF0aW1lOiAlZCwgU2Vla3RpbWU6JWQiLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZU9wZW50aW1lXSAsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlUmVhZERhdGF0aW1lXSAsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlV3JpdGVEYXRhdGltZV0gLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVNlZWt0aW1lXSApOwotICAgIE00T1NBX1RSQUNFMV80KCJHZXRPcHRpb250aW1lOiVkLCBTZXRPcHRpb250aW1lOiVkLCBFeHRlcm5hbEZsdXNoOiAlZCwgQ2xvc2V0aW1lOiAlZCIsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpYXBDb250ZXh0LT5nTXlQZXJmRmlsZVRhYltmaWxlR2V0T3B0aW9udGltZV0gLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZVNldE9wdGlvbnRpbWVdLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKWFwQ29udGV4dC0+Z015UGVyZkZpbGVUYWJbZmlsZUV4dGVybmFsRmx1c2h0aW1lXSwKLSAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilhcENvbnRleHQtPmdNeVBlcmZGaWxlVGFiW2ZpbGVDbG9zZXRpbWVdKTsKLSAgICBNNE9TQV9UUkFDRTFfMCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLX0KLQotI2VuZGlmIC8qIE00T1NBX0ZJTEVfSU5URVJGQUNFX01NX1RJTUVfTUVBUyAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jCmluZGV4IDUyZmU3ODEuLjU5Mjc2NjEgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2lmbmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCiAjZXJyb3IgIlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgaXMgbm90IGRlZmluZWQiCi0jZW5kaWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUworI2VuZGlmIC8qVVNFX1NUQUdFRlJJR0hUX0NPREVDUyovCiAKICNpZmRlZiBVVEZfQ09OVkVSU0lPTgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgogI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCiAKLS8vI2RlZmluZSBGSUxFX0xPV0VSX0NBU0UgLy9kZWZpbmVkIHRvIHN1cHBvcnQgbGltaXRhaW9uIG9mIGxvd2VyIGNhc2UgZmlsZSBzeXN0ZW0gaW4gc2RjYXJkLgogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCkBAIC04Niw5ICs4NSw2IEBACiAgICAgRklMRSogcEZpbGVIYW5kbGVyID0gTTRPU0FfTlVMTDsKICAgICBNNE9TQV9GaWxlQ29udGV4dCAqcEZpbGVDb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKIAotI2lmZGVmIEZJTEVfTE9XRVJfQ0FTRQotICAgIE00T1NBX0NoYXIgKnRtcExvd2VyQ2FzZVVybCA9IE00T1NBX05VTEw7Ci0jZW5kaWYKIAogI2lmZGVmIFVURl9DT05WRVJTSU9OCiAgICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCkBAIC05Niw3ICs5Miw3IEBACiAgICAgTTRPU0FfVm9pZCogdGVtcENvbnZlcnNpb25CdWY7CiAgICAgTTRPU0FfVUludDMyIHRlbXBDb252ZXJzaW9uU2l6ZSA9IDEwMDA7CiAKLSAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLCAiY29udmVyc2lvbiBidWYiKTsKKyAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLCAiY29udmVyc2lvbiBidWYiKTsKICAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQogICAgIHsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7CkBAIC0xMDgsNyArMTA0LDYgQEAKICAgICBwcmludGYoImZpbGUgb3BlbiAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOwogI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwogCi0vLy8qdG1wTFNBKi9NNE9TQV9UUkFDRTFfMigiIyMjIE00T1NBX2ZpbGVDb21tb25PcGVuICVzIDB4JVgiLCBwVXJsLCBmaWxlTW9kZUFjY2Vzcyk7CiAgICAgTTRPU0FfVFJBQ0UzXzQoIk00T1NBX2ZpbGVDb21tb25PcGVuXHRcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgogICAgICAgICAiTTRPU0FfQ2hhciogJXNcdGZpbGVNb2RlQWNjZXNzICVkIiwgY29yZV9pZCwgcENvbnRleHQsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKIApAQCAtMTM5LDQ2ICsxMzQsMzcgQEAKICAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKICAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwogCi0jaWZkZWYgRklMRV9MT1dFUl9DQVNFCi0gICAgdG1wTG93ZXJDYXNlVXJsID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyhzdHJsZW4ocFVybCkgKzEsIDAsICJjb252ZXJzaW9uIGJ1ZiIpOwotICAgIGZvcihpPTA7IGk8c3RybGVuKHBVcmwpOyBpKyspCi0gICAgewotICAgICAgICB0bXBMb3dlckNhc2VVcmxbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKHBVcmxbaV0pOwotICAgIH0KLSAgICB0bXBMb3dlckNhc2VVcmxbaV0gPSAnXDAnOyAvL251bGwgdGVybWluYXRlCi0jZW5kaWYKLQogICAgIC8qIENyZWF0ZSBmbGFnIG5lY2Vzc2FyeSBmb3Igb3BlbmluZyBmaWxlICovCiAgICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYKICAgICAgICAgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSkKICAgICB7Ci0gICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFdyaXRlU3RyaW5nLCAxKTsKLSAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwUGx1c1N0cmluZywgMSk7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKKyAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcEFwcGVuZFN0cmluZywgMSk7CisgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwQXBwZW5kU3RyaW5nLCAoc2l6ZV90KTEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFJlYWRTdHJpbmcsIDEpOworICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFJlYWRTdHJpbmcsIChzaXplX3QpMSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5DYXQobW9kZSwgcFdyaXRlU3RyaW5nLCAxKTsKKyAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9jaHJOQ2F0KG1vZGUscFBsdXNTdHJpbmcsIDEpOworICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsKGNvbnN0IGNoYXIgKilwUGx1c1N0cmluZywgKHNpemVfdCkxKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmKCEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUlzVGV4dE1vZGUpKQogICAgIHsKLSAgICAgICAgTTRPU0FfY2hyTkNhdChtb2RlLCBwQmluYXJ5U3RyaW5nLCAxKTsKKyAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcEJpbmFyeVN0cmluZywoc2l6ZV90KTEpOwogICAgIH0KIAogICAgIC8qT3BlbiB0aGUgZmlsZSovCkBAIC0xODcsMTQgKzE3Myw5IEBACiAgICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCiAgICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0ZW1wQ29udmVyc2lvbkJ1ZiwgKGNvbnN0IGNoYXIgKiltb2RlKTsKICAgICAvKkZyZWUgdGhlIHRlbXBvcmFyeSBkZWNvZGVkIGJ1ZmZlciovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRlbXBDb252ZXJzaW9uQnVmKTsKKyAgICBmcmVlKHRlbXBDb252ZXJzaW9uQnVmKTsKICNlbHNlIC8qIFVURl9DT05WRVJTSU9OICovCi0jaWZkZWYgRklMRV9MT1dFUl9DQVNFCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0bXBMb3dlckNhc2VVcmwsIChjb25zdCBjaGFyICopbW9kZSk7Ci0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRtcExvd2VyQ2FzZVVybCk7Ci0jZWxzZQogICAgIHBGaWxlSGFuZGxlciA9IGZvcGVuKChjb25zdCBjaGFyICopcFVybCwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSNlbmRpZgogI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCiAKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUhhbmRsZXIpCkBAIC0yMzMsNyArMjE0LDcgQEAKICAgICB9CiAKICAgICAvKiBBbGxvY2F0ZSB0aGUgZmlsZSBjb250ZXh0ICovCi0gICAgcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KikgTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9GaWxlQ29udGV4dCksCisgICAgcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlQ29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IGZpbGUgY29udGV4dCIpOwogICAgIGlmIChNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dCkKICAgICB7CkBAIC0yNjgsMjggKzI0OSwyOCBAQAogICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzczsKICAgICB9CiAKLSAgICBNNE9TQV9JTlRfVE9fRklMRV9QT1NJVElPTigwLCBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pOwotICAgIE00T1NBX0lOVF9UT19GSUxFX1BPU0lUSU9OKDAsIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pOworICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IDA7CisgICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IDA7CiAKICAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSBVUkwgc3RyaW5nICovCi0gICAgcEZpbGVDb250ZXh0LT51cmxfbmFtZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfbWFsbG9jKE00T1NBX2Nockxlbmd0aChwVXJsKSsxLAorICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogVVJMIG5hbWUiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnVybF9uYW1lKQogICAgIHsKICAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRmlsZUNvbnRleHQpOworICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7CiAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgIH0KLSAgICBNNE9TQV9jaHJOQ29weShwRmlsZUNvbnRleHQtPnVybF9uYW1lLCBwVXJsLCBNNE9TQV9jaHJMZW5ndGgocFVybCkrMSk7CisgICAgTTRPU0FfY2hyTkNvcHkocEZpbGVDb250ZXh0LT51cmxfbmFtZSwgcFVybCwgc3RybGVuKChjb25zdCBjaGFyICopcFVybCkrMSk7CiAKICAgICAvKiBHZXQgdGhlIGZpbGUgbmFtZSAqLwogICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZShwVXJsLCAmcEZpbGVDb250ZXh0LT5maWxlX25hbWUpOwogICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQogICAgIHsKICAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlQ29udGV4dCk7CisgICAgICAgIGZyZWUocEZpbGVDb250ZXh0LT51cmxfbmFtZSk7CisgICAgICAgIGZyZWUocEZpbGVDb250ZXh0KTsKICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0zMjYsNyArMzA3LDYgQEAKICAgICBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSA9IGlTaXplOwogCiAgICAgKnBDb250ZXh0ID0gcEZpbGVDb250ZXh0OwotLy8gICAgLyp0bXBMU0EqL000T1NBX1RSQUNFMV8xKCIjIyMgTTRPU0FfZmlsZUNvbW1vbk9wZW4gcEZpbGVDb250ZXh0IDB4JVgiLCBwRmlsZUNvbnRleHQpOwogCiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CkBAIC0zOTksOCArMzc5LDggQEAKICAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7CiAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfY3VycmVudDsKICAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX251bGw7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbmVnX3VuOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX251bGwgPSAwOworICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX25lZ191biA9IC0xOwogICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2ZpbGVfc2l6ZTsKICAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwogCkBAIC00MTEsMzkgKzM5MSwzNiBAQAogICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwogICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlUG9zLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwogCi0gICAgTTRPU0FfSU5UX1RPX0ZJTEVfUE9TSVRJT04oMCwgZnBvc19udWxsKTsKLSAgICBNNE9TQV9JTlRfVE9fRklMRV9QT1NJVElPTigtMSwgZnBvc19uZWdfdW4pOwotICAgIE00T1NBX0ZQT1NfU0VUKGZwb3NfZmlsZV9zaXplLCBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSk7CisgICAgZnBvc19maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKIAogICAgIGlmKFNlZWtSZWFkID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQogICAgIHsKLSAgICAgICAgTTRPU0FfRlBPU19TRVQoZnBvc19jdXJyZW50LCBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pOworICAgICAgICBmcG9zX2N1cnJlbnQgPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb247CiAgICAgfQogICAgIGVsc2UgaWYoU2Vla1dyaXRlID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQogICAgIHsKLSAgICAgICAgTTRPU0FfRlBPU19TRVQoZnBvc19jdXJyZW50LCBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKTsKKyAgICAgICAgZnBvc19jdXJyZW50ID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTTRPU0FfSU5UX1RPX0ZJTEVfUE9TSVRJT04oMCwgZnBvc19jdXJyZW50KTsKKyAgICAgICAgZnBvc19jdXJyZW50ID0gMDsKICAgICB9CiAKICAgICBzd2l0Y2goc2Vla01vZGUpCiAgICAgewogICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudDoKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRlBPU19TRVQoZnBvc19zZWVrLCAqcEZpbGVQb3MpOworICAgICAgICAgICAgZnBvc19zZWVrID0gKnBGaWxlUG9zOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZzoKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRlBPU19TVUIoZnBvc19zZWVrLCAqcEZpbGVQb3MsIGZwb3NfY3VycmVudCkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyAtIGZwb3NfY3VycmVudDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZQT1NfQUREKGZwb3Nfc2VlaywgZnBvc19maWxlX3NpemUsICpwRmlsZVBvcyk7Ci0gICAgICAgICAgICBNNE9TQV9GUE9TX1NVQihmcG9zX3NlZWssIGZwb3Nfc2VlaywgZnBvc19jdXJyZW50KTsKKyAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyArIGZwb3NfZmlsZV9zaXplIC0gZnBvc19jdXJyZW50OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBkZWZhdWx0OgpAQCAtNDUyLDcgKzQyOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNNE9TQV9GUE9TX0FERChmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmcsIGZwb3NfY3VycmVudCwgZnBvc19zZWVrKTsKKyAgICBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmcgPSBmcG9zX2N1cnJlbnQgKyBmcG9zX3NlZWs7CiAKICAgICBpZihmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgZnBvc19zZWVrLCBTRUVLX0NVUikgIT0gMCkKICAgICB7CkBAIC00NzQsNyArNDUxLDcgQEAKICAgICB9CiAKICAgICAvKiBTZXQgdGhlIHJldHVybmVkIHBvc2l0aW9uIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLwotICAgIE00T1NBX0ZQT1NfU0VUKCpwRmlsZVBvcywgZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nKTsKKyAgICAqcEZpbGVQb3MgPSBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7CiAKICAgICAvKiBTRUVLIGRvbmUsIHJlc2V0IGVuZCBvZiBmaWxlIHZhbHVlICovCiAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfRkFMU0U7CkBAIC01MDksMTAgKzQ4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwogI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KIAotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKKyAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwogICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSBNNE9TQV9OVUxMOwogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKKyAgICBmcmVlKHBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKICAgICBwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSA9IE00T1NBX05VTEw7CiAKICAgICBpMzJfZXJyX2NvZGUgPSBmY2xvc2UocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwpAQCAtNTIzLDcgKzUwMCw3IEBACiAgICAgTTRPU0Ffc2VtYXBob3JlQ2xvc2UocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7LyogZnJlZSB0aGUgc2VtYXBob3JlICovCiAjZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlQ29udGV4dCk7CisgICAgZnJlZShwRmlsZUNvbnRleHQpOwogCiAgICAgaWYgKGkzMl9lcnJfY29kZSAhPSAwKQogICAgIHsKQEAgLTU2NSwxNyArNTQyLDE3IEBACiAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKICAgICB9CiAKLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lLCBUaGVTdGF0LnN0X2N0aW1lKTsKLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWUsIFRoZVN0YXQuc3RfYXRpbWUpOwotICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIocEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWUsIFRoZVN0YXQuc3RfbXRpbWUpOworICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9jdGltZTsKKyAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9hdGltZTsKKyAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfbXRpbWU7CiAKLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZVNjYWxlICAgID0gMTsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS50aW1lU2NhbGU9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWVTY2FsZSAgICA9IDE7CisgICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWVTY2FsZSA9IDE7CisgICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZVNjYWxlID0gMTsKKyAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZVNjYWxlID0gMTsKIAotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS5yZWZlcmVuY2VZZWFyICAgID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS5yZWZlcmVuY2VZZWFyPSAxOTcwOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS5yZWZlcmVuY2VZZWFyICAgID0gMTk3MDsKKyAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7CisgICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7CisgICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwogCiAgICAgcEF0dHJpYnV0ZS0+bW9kZUFjY2VzcyA9IGZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKIApAQCAtNjA4LDEwICs1ODUsMTAgQEAKICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwogCi0gICAgdWlMZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocEZpbGVDb250ZXh0LT51cmxfbmFtZSkrMTsKKyAgICB1aUxlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBGaWxlQ29udGV4dC0+dXJsX25hbWUpKzE7CiAKICAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSB1cmxfbmFtZSAqLwotICAgICpwVXJsID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aUxlbmd0aCwgTTRPU0FfRklMRV9DT01NT04sCisgICAgKnBVcmwgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHVpTGVuZ3RoLCBNNE9TQV9GSUxFX0NPTU1PTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogdXJsIik7CiAgICAgaWYoTTRPU0FfTlVMTCA9PSAqcFVybCkKICAgICB7CkBAIC02NjAsNyArNjM3LDcgQEAKICAgICAqcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKIAogICAgIC8qUGFyc2UgVVJMKi8KLSAgICBpVXJsTGVuID0gTTRPU0FfY2hyTGVuZ3RoKHBVcmwpOworICAgIGlVcmxMZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKTsKICAgICBmb3IoaT1pVXJsTGVuLTE7IGk+PTA7IGktLSkKICAgICB7CiAgICAgICAgIGlmIChwVXJsW2ldICE9ICdcXCcgJiYgcFVybFtpXSAhPSAnLycpCkBAIC02NzMsNyArNjUwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB0ckZpbGVuYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV9tYWxsb2MoRmlsZU5hbWVMZW4rMSwgTTRPU0FfRklMRV9DT01NT04sCisgICAgcHRyRmlsZW5hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhGaWxlTmFtZUxlbisxLCBNNE9TQV9GSUxFX0NPTU1PTiwKICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IEZpbGVuYW1lIHN0cmluZyIpOwogICAgIGlmIChwdHJGaWxlbmFtZSA9PSBNNE9TQV9OVUxMKQogICAgIHsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVFeHRyYS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUV4dHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhN2I1MzIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUV4dHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUV4dHJhLmMKLSogQGJyaWVmICAgICAgICBGaWxlIGV4dHJhIGZvciBBbmRyb2lkCi0qIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSBzZXQgb2YgYmFzaWMgZnVuY3Rpb25zIHRvIGhhbmRsZSBmaWxlCi0qICAgICAgICAgICAgICAgaXRzZWxmLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUV4dHJhLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyB0aGUgcHJvdmlkZWQgVVJMLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYURlbGV0ZShjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQotewotCi0gICAgTTRPU0FfSW50MzIgIGVycjsKLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotICAgIE00T1NBX1ZvaWQqIHRlbXBDb252ZXJzaW9uQnVmOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQ29udmVyc2lvblNpemUgPSAxMDAwOyAgICAvKnNpemUgb2YgdGhlIGRlY29kZWQgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBpbmNyZWFzZSBpZiBuZWNlc3NhcnkqLwotI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCi0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZUV4dHJhRGVsZXRlXHRcdE00T1NBX0NoYXIqICVzIiwgcFVybCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhRGVsZXRlOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCi0gICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KLSAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiY29udmVyc2lvbiBidWYiKTsKLSAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIE00T1NBX1RvVVRGOF9PU0FMKChNNE9TQV9Wb2lkKilwVXJsLCB0ZW1wQ29udmVyc2lvbkJ1ZiwgJnRlbXBDb252ZXJzaW9uU2l6ZSk7Ci0gICAgKChNNE9TQV9DaGFyKil0ZW1wQ29udmVyc2lvbkJ1ZilbdGVtcENvbnZlcnNpb25TaXplIF0gPSAnXDAnOwotCi0gICAgcHJpbnRmKCJyZW1vdmUgZmlsZSAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOwotCi0gICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgZXJyID0gcmVtb3ZlICh0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0gICAgLypGcmVlIHRoZSB0ZW1wb3JhcnkgZGVjb2RlZCBidWZmZXIqLwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZWxzZQotICAgIGVyciA9IHJlbW92ZSgoY29uc3QgY2hhciAqKXBVcmwpOwotI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCi0KLSAgICBpZigtMSA9PSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFEZWxldGU6IENhbm5vdCByZW1vdmUgdGhlIGlucHV0IHVybCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBmaWxlIGxvY2F0ZWQgYnkgJ3BTcmNVcmwnIHRvICdwRHN0VXJsJy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwU3JjVXJsOiAoSU4pIHNvdXJjZSBVUkwKLSAqIEBwYXJhbSAgICAgIHBEc3RVcmw6IChJTikgRGVzdGluYXRpb24gVVJMCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhQ29weShNNE9TQV9DaGFyKiBwU3JjVXJsLCBNNE9TQV9DaGFyKiBwRHN0VXJsKQotewotICAgIE00T1NBX0NvbnRleHQgcElucHV0RmlsZUNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0NvbnRleHQgcE91dHB1dEZpbGVDb250ZXh0PSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfRVJSICAgICAgIGVycjsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlTaXplUmVhZCA9IEJVRkZFUl9DT1BZX1NJWkU7Ci0gICAgTTRPU0FfTWVtQWRkcjMyIGNvcHlfYnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2ZpbGVFeHRyYURlbGV0ZVx0XHRNNE9TQV9DaGFyKiAlc1x0TTRPU0FfQ2hhciogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjVXJsLCBwRHN0VXJsKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRHN0VXJsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYUNvcHk6IHBEc3RVcmwgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTcmNVcmwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ29weTogcFNyY1VybCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJnBJbnB1dEZpbGVDb250ZXh0LCBwU3JjVXJsLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVJlYWRPcGVuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogT3BlbiBvdXRwdXQgZmlsZSAqLwotICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZU9wZW4oJnBPdXRwdXRGaWxlQ29udGV4dCwgcERzdFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGV8TTRPU0Ffa0ZpbGVDcmVhdGUpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVdyaXRlT3BlbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciAqLwotICAgIGNvcHlfYnVmZmVyID0gTTRPU0FfbWFsbG9jKEJVRkZFUl9DT1BZX1NJWkUsIE00T1NBX0ZJTEVfRVhUUkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlRXh0cmFDb3B5OiBjb3B5IGJ1ZmZlciIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gY29weV9idWZmZXIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVFeHRyYUNvcHkiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIENvcHkgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSB1c2luZyBjb3B5IGJ1ZmZlciAqLwotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgLyogTG9hZCBkYXRhIGludG8gY29weSBidWZmZXIgKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWREYXRhKHBJbnB1dEZpbGVDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpY29weV9idWZmZXIsICZ1aVNpemVSZWFkKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgdG8gb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZURhdGEocE91dHB1dEZpbGVDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWNvcHlfYnVmZmVyLCB1aVNpemVSZWFkKTsKLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00V0FSX05PX0RBVEFfWUVUID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgLyogbm8gbW9yZSBkYXRhIHRvIGNvcHksIGVuZCBvZiBmaWxlIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVXcml0ZURhdGEocE91dHB1dEZpbGVDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWNvcHlfYnVmZmVyLCB1aVNpemVSZWFkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7IC8qIGFuIGVycm9yIG9jY3VyICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGcmVlIGNvcHkgYnVmZmVyICovCi0gICAgTTRPU0FfZnJlZShjb3B5X2J1ZmZlcik7Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlV3JpdGVDbG9zZShwT3V0cHV0RmlsZUNvbnRleHQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhQ29weTogTTRPU0FfZmlsZVdyaXRlQ2xvc2UiKTsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlUmVhZENsb3NlKHBJbnB1dEZpbGVDb250ZXh0KTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVFeHRyYUNvcHk6IE00T1NBX2ZpbGVSZWFkQ2xvc2UiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZW5hbWVzIHRoZSAncFNyY1VybCcgdG8gJ3BEc3RVcmwnLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHBTcmNVcmw6IChJTikgc291cmNlIFVSTAotICogQHBhcmFtICAgICAgcERzdFVybDogKElOKSBEZXN0aW5hdGlvbiBVUkwKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFSZW5hbWUoTTRPU0FfQ2hhciogcFNyY1VybCwgTTRPU0FfQ2hhciogcERzdFVybCkKLXsKLSAgICBNNE9TQV9FUlIgICAgZXJyOwotICAgIE00T1NBX0ludDMyIGlWYWx1ZTsKLSAgICBNNE9TQV9DaGFyKiAgICBwU3JjRmlsZW5hbWUgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0NoYXIqICAgIHBEc3RGaWxlbmFtZSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfZmlsZUV4dHJhUmVuYW1lXHRcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNVcmwsIHBEc3RVcmwpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcERzdFVybCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBwU3JjVXJsIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3JjVXJsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFSZW5hbWU6IHBEc3RVcmwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBTcmNVcmwsICZwU3JjRmlsZW5hbWUpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUocERzdFVybCwgJnBEc3RGaWxlbmFtZSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFNyY0ZpbGVuYW1lKTsKLSAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZUV4dHJhUmVuYW1lOiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBSZW5hbWUgZmlsZSAqLwotICAgIGlWYWx1ZSA9IHJlbmFtZSgoY29uc3QgY2hhciAqKXBTcmNGaWxlbmFtZSwgKGNvbnN0IGNoYXIgKilwRHN0RmlsZW5hbWUpOwotICAgIGlmICgwICE9IGlWYWx1ZSkKLSAgICB7Ci0gICAgLyoKLSAgICAgICAgV2hhdCBlcnJvciBjb2RlIHNoYWxsIGJlIHJldHVybmVkID8gRnJvbSBNU0ROOgotICAgICAgICBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm5zIDAgaWYgaXQgaXMgc3VjY2Vzc2Z1bC4gT24gYW4gZXJyb3IsIHRoZQotICAgICAgICBmdW5jdGlvbiAgcmV0dXJucyBhIG5vbnplcm8gdmFsdWUgYW5kIHNldHMgZXJybm8gdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgdmFsdWVzOgotICAgICAgICAtIEVBQ0NFUzogRmlsZSBvciBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IG5ld25hbWUgYWxyZWFkeSBleGlzdHMgb3IgY291bGQKLSAgICAgICAgbm90IGJlIGNyZWF0ZWQgKGludmFsaWQgcGF0aCk7IG9yIG9sZG5hbWUgaXMgYSBkaXJlY3RvcnkgYW5kIG5ld25hbWUKLSAgICAgICAgc3BlY2lmaWVzIGEgZGlmZmVyZW50IHBhdGguCi0gICAgICAgIC0gRU5PRU5UOiBGaWxlIG9yIHBhdGggc3BlY2lmaWVkIGJ5IG9sZG5hbWUgbm90IGZvdW5kLgotICAgICAgICAtIEVJTlZBTDogTmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuCi0gICAgICAgIEZvciBvdGhlciBwb3NzaWJsZSByZXR1cm4gdmFsdWVzLCBzZWUgX2Rvc2Vycm5vLCBfZXJybm8sIHN5c2Vycmxpc3QsIGFuZAotICAgICAgICAgICAgX3N5c19uZXJyLiAqLwotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlRXh0cmFSZW5hbWU6IHJlbmFtZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcERzdEZpbGVuYW1lKTsKLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFNyY0ZpbGVuYW1lKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSBzcGVjaWZpZWQgbmV3Ci0gKiAgICAgICAgICAgICBkaXJlY3RvcnkgJ3VybCcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcFVybDogKElOKSBEaXJlY3RvcnkgdG8gd2hpY2ggY3VycmVudCBkaXJlY3RvcnkgdG8gYmUgY2hhbmdlZAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhQ2hhbmdlQ3VycmVudERpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQotewotICAgIE00T1NBX0VSUiAgICBlcnI7Ci0gICAgTTRPU0FfQ2hhciogcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBpVmFsdWUgPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXJcdFx0TTRPU0FfQ2hhciogJXMiLCBwVXJsKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYUNoYW5nZUN1cnJlbnREaXI6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKChNNE9TQV9DaGFyKilwVXJsLCAmcEZpbGVOYW1lKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ2hhbmdlQ3VycmVudERpcjogTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaVZhbHVlID0gY2hkaXIoKGNoYXIqKXBGaWxlTmFtZSk7Ci0KLSAgICBpZiAoaVZhbHVlICE9IDApCi0gICAgewotICAgIC8qCi0gICAgV2hhdCBlcnJvciBjb2RlIHNoYWxsIGJlIHJldHVybmVkID8gRnJvbSBNU0ROOgotICAgIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHJldHVybnMgYSB2YWx1ZSBvZiAwIGlmIHN1Y2Nlc3NmdWwuIEEgcmV0dXJuCi0gICAgdmFsdWUgb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXRoIGNvdWxkIG5vdCBiZSBmb3VuZCwgaW4KLSAgICB3aGljaCBjYXNlIGVycm5vIGlzIHNldCB0byBFTk9FTlQuKi8KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlRXh0cmFDaGFuZ2VDdXJyZW50RGlyOiBjaGRpciBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuKE00RVJSX1BBUkFNRVRFUik7Ci0gICAgfQotCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBGaWxlTmFtZSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSBzcGVjaWZpZWQgJ3VybCcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcFVybDogKElOKSBQYXRoIHRvIGNyZWF0ZSBuZXcgZGlyZWN0b3J5IHdpdGggbmFtZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVFeHRyYUNyZWF0ZURpcihjb25zdCBNNE9TQV9DaGFyKiBwVXJsKQotewotICAgIE00T1NBX0ludDMyICAgICAgICBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZUV4dHJhQ3JlYXRlRGlyICVzIiwgcFVybCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhQ3JlYXRlRGlyOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVyciA9IG1rZGlyKChjaGFyKilwVXJsLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOwotCi0gICAgaWYoIGVyciA8IDAgKQotICAgIHsKLSAgICAgICAgICAgcmV0dXJuIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0VYVFJBLCBlcnJubyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgUGF0aCBvZiBkaXJlY3Rvcnkgd2l0aCBuYW1lCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUV4dHJhUmVtb3ZlRGlyKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCi17Ci0gICAgTTRPU0FfSW50MzIgICAgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVFeHRyYVJlbW92ZURpciAlcyIsIHBVcmwpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYVJlbW92ZURpcjogcFVybCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBlcnIgPSBybWRpcigoY2hhciopcFVybCk7Ci0gICAgaWYoZXJyIDwgMCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlRXh0cmFSZW1vdmVEaXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9FWFRSQSwgZXJybm8pOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIHJldHJpZXZlcyB0aGUgZnJlZSBzcGFjZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwVXJsOiAoSU4pIHJvb3QgZGlyZWN0b3J5Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRPU0FfZmlsZUV4dHJhR2V0RnJlZVNwYWNlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCi17Ci0gICAgTTRPU0FfVUludDMyIHNpemUgPSAwOwotICAgIHN0cnVjdCBzdGF0ZnMgc3RhdDsKLQotICAgIGlmICggTTRPU0FfTlVMTCAhPSBwVXJsICkKLSAgICB7Ci0gICAgICAgIGlmICgwID09IHN0YXRmcyggKGNvbnN0IGNoYXIgKilwVXJsLCAmc3RhdCApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHN0YXQuZl9iZnJlZSAqIHN0YXQuZl9ic2l6ZSkgPiBNNE9TQV9VSU5UMzJfTUFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNpemUgPSBNNE9TQV9VSU5UMzJfTUFYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNpemUgPSAoTTRPU0FfVUludDMyKShzdGF0LmZfYmZyZWUgKiBzdGF0LmZfYnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChzaXplKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHRvdGFsIHNwYWNlCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcFVybDogKElOKSBQYXRoIG9mIGRpcmVjdG9yeSB3aXRoIG5hbWUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNE9TQV9maWxlRXh0cmFHZXRUb3RhbFNwYWNlKGNvbnN0IE00T1NBX0NoYXIqIHBVcmwpCi17Ci0gICAgTTRPU0FfVUludDMyIHNpemUgPSAwOwotICAgIHN0cnVjdCBzdGF0ZnMgc3RhdDsKLQotICAgIGlmICggTTRPU0FfTlVMTCAhPSBwVXJsICkKLSAgICB7Ci0gICAgICAgIGlmICgwID09IHN0YXRmcyggKGNvbnN0IGNoYXIgKilwVXJsLCAmc3RhdCApKQotICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKChzdGF0LmZfYmxvY2tzICogc3RhdC5mX2JzaXplKSA+IE00T1NBX1VJTlQzMl9NQVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IE00T1NBX1VJTlQzMl9NQVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IChNNE9TQV9VSW50MzIpKHN0YXQuZl9ibG9ja3MgKiBzdGF0LmZfYnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChzaXplKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlIHRoZSBmaWxlIHR5cGUgKERpcmVjdG9yeSBvciBmaWxlKS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwVXJsOiAoSU4pIFBhdGggb2YgZGlyZWN0b3J5IHdpdGggbmFtZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRW50cnlUeXBlIE00T1NBX2ZpbGVFeHRyYUdldFR5cGUoY29uc3QgTTRPU0FfQ2hhciogcFVybCkKLXsKLSAgICBNNE9TQV9FbnRyeVR5cGUgdHlwZSA9IE00T1NBX1R5cGVJbnZhbGlkOwotICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OwotCi0gICAgaWYgKCBNNE9TQV9OVUxMICE9IHBVcmwgKQotICAgIHsKLSAgICAgICAgaWYgKDAgPT0gc3RhdCggKGNvbnN0IGNoYXIgKilwVXJsLCAmZmlsZVN0YXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIFNfSVNESVIoIGZpbGVTdGF0LnN0X21vZGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IE00T1NBX1R5cGVEaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IE00T1NBX1R5cGVGaWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh0eXBlKTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gdHJ1bmNhdGUgYSBmaWxlLgotICogICAgICAgICAgICAgICB0aGUgZmlsZSBtdXN0IGJlIHByZXZpb3VzbHkgb3BlbmVkIGluIHdyaXRlIG1vZGUKLSAqIEBub3RlICAgICAgIHRoZSBwb3NpdGlvbiBwb2ludGVyIGluIHRoZSBmaWxlIGlzIHNldCB0byB0aGUgYmVnaW5uaW5nCi0gKiAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0cnVuY2F0ZQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBtZWRpYSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgICBsZW5ndGg6IChJTikgbGVuZ3RoIG9mIHRoZSBmaWxlIGFmdGVyIHRydW5jYXRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlRXh0cmFmVHJ1bmNhdGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9GaWxlUG9zaXRpb24gbGVuZ3RoKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQxNiByZXN1bHQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gY29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVFeHRyYWZUcnVuY2F0ZTogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gbGVuZ3RoLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUV4dHJhZlRydW5jYXRlOiBsZW5ndGggaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcmVzdWx0ID0gZnRydW5jYXRlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLT5fZmlsZSwgbGVuZ3RoKTsKLQotICAgIGlmKHJlc3VsdCAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTZXRFbmRPZkZpbGUgcmV0dXJucyBlcnI6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9FWFRSQSwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCmluZGV4IGJlM2JiMzcuLjVlOWY3NTcgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKQEAgLTExNyw4ICsxMTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiwgdWlTaXplUmVhZCk7CisgICAgICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gKyB1aVNpemVSZWFkOwogICAgICAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwpAQCAtMTcwLDggKzE2OSw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIE00T1NBX0ZQT1NfQUREX0NPTlNUX1VJTlQzMihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiwgdWlTaXplUmVhZCk7CisgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiArIHVpU2l6ZVJlYWQ7CiAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7CkBAIC0zMTAsNyArMzA4LDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTTRPU0FfRlBPU19TRVQocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uLCAqcFBvc2l0aW9uKTsKKyAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKICAgICB9CiAKICNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyX1JBTS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlcl9SQU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjRhY2ZhYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyX1JBTS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclJhbS5jCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZnJvbSBSQU0KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSAiZmlsZSIgc3RvcmVkIGluIFJBTS4KLSAqIEBkYXRlICAgICAgICAgLSAyMDA0LTA1LTExOiBjcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlclJhbS5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHJlYWRlciBpbiBSYW0gY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgRmlsZSBSZWFkZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICBwRmlsZURlc2M7ICAvKiBQb2ludGVyIG9uIGZpbGUgZGF0YSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBkYXRhU2l6ZTsgICAvKiBTaXplIG9mIGRhdGEgdG8gcmVhZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBkYXRhT2Zmc2V0OyAvKiBBY3R1YWwgb2Zmc2V0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgIElzT3BlbmVkOyAgIC8qIE1pY3JvIHN0YXRlIG1hY2hpbmUgKi8KLX0gTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcmVhZCBwb2ludGVyIGF0IHRoZSBwcm92aWRlZCBhZHJlc3MgYW5kCi0gKiAgICAgICAgICAgICByZXR1cm5zIGEgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0gKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1PcGVuKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MgKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCogcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUmVhZGVyUmFtX0Rlc2NyaXB0b3IqIHBEZXNjcmlwdG9yPWZpbGVEZXNjcmlwdG9yOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVSZWFkUmFtT3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4XHRNNE9TQV9Wb2lkKiAweCV4IgotICAgICAgICAgICAgICAgICAgIlx0TTRPU0FfVUludDMyICVkIiwgY29udGV4dCwgZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgKmNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGlmKE00T1NBX05VTEwgPT0gZmlsZURlc2NyaXB0b3IpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBjb250ZXh0ICovCi0gICAgcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciopIkNvbnRleHQgYWxsb2NhdGlvbiIpOwotICAgIGlmKHBDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogVmVyaWZ5IGFjY2VzcyBtb2RlICovCi0gICAgaWYgKCgoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgIT0gMCkKLSAgICAgICB8fCgwID09IChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpKQotICAgIHsKLSAgICAgICAgZXJyPU00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogT3BlbiBmaWxlIGluIHJlYWQgbW9kZSBhbmQgaW4gYmluYXJ5L3RleHQgbW9kZSAgd2l0aC93aXRob3V0IGNyZWF0aW9uIHJpZ2h0ICovCi0gICAgaWYoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpICE9IDApCi0gICAgewotICAgICAgICBlcnI9TTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICgoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEZpbGVEZXNjID0gKE00T1NBX01lbUFkZHI4KShwRGVzY3JpcHRvci0+cEZpbGVEZXNjKTsKLSAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhU2l6ZSA9IChNNE9TQV9JbnQzMikocERlc2NyaXB0b3ItPmRhdGFTaXplKTsKLSAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnI9TTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWNsZWFudXA6Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZihwQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENvbnRleHQpOwotICAgICAgICAgICAgKmNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpjb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiBtZW1vcnkKLSAqICAgICAgICAgICAgIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKSBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScKLSAqICAgICAgICAgICAgIHBvaW50ZXIuCi0gKiBAbm90ZSAgICAgICBJZiAnc2l6ZScgYnl0ZSBjYW5ub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwgJ3NpemUnCi0gKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdAotICogICAgICAgICAgICAgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBkYXRhOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YQotICogQHBhcmFtICAgICAgc2l6ZTogKElOL09VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlcykKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNFdBUl9OT19EQVRBX1lFVDogdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgdG8gZmlsbCB0aGUgJ2RhdGEnCi0gKiAgICAgICAgICAgICBidWZmZXIsIHNvIHRoZSBzaXplIHBhcmFtZXRlciBoYXMgYmVlbiB1cGRhdGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbURhdGEoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSApCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVJlYWRlclJhbV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBhU2l6ZSA9ICpwU2l6ZTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwgfHwgZGF0YSA9PSBNNE9TQV9OVUxMIHx8IHBTaXplID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZiAocENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gcmVhZCBvciBub3QgKi8KLSAgICBpZigocENvbnRleHQtPmRhdGFPZmZzZXQgKyBhU2l6ZSkgPiBwQ29udGV4dC0+ZGF0YVNpemUpCi0gICAgewotICAgICAgICBhU2l6ZSA9IHBDb250ZXh0LT5kYXRhU2l6ZSAtIHBDb250ZXh0LT5kYXRhT2Zmc2V0OwotICAgICAgICBNNE9TQV9tZW1jcHkoZGF0YSwgKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YU9mZnNldCksIGFTaXplKTsKLSAgICAgICAgKnBTaXplID0gYVNpemU7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9tZW1jcHkoZGF0YSwgKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YU9mZnNldCksIGFTaXplKTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCArPSBhU2l6ZTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKLSAqICAgICAgICAgICAgIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCi0gKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLCBmcm9tCi0gKiAgICAgICAgICAgICB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4KLSAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgIHBvc2l0aW9uIHBvaW50ZXIgbXVzdCBiZSB1cGRhdGVkLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1TZWVrKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uICkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PShNNE9TQV9GaWxlUmVhZGVyUmFtX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMIHx8IHNlZWtNb2RlID09IE00T1NBX05VTEwgfHwgcG9zaXRpb24gPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICAvKiAqLwotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgotICAgICAgICAgICAgLyogQ2hlY2sgaWYgcG9zaXRpb24gaXMgcmVhY2hhYmxlIGFuZCB1cGRhdGUgZGF0YU9mZnNldCAqLwotICAgICAgICAgICAgaWYoKChNNE9TQV9VSW50MzIpKCpwb3NpdGlvbikgPD0gcENvbnRleHQtPmRhdGFTaXplKSAmJiAoKnBvc2l0aW9uID49IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gKnBvc2l0aW9uOwotICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IHBDb250ZXh0LT5kYXRhT2Zmc2V0OwotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBwb3NpdGlvbiBpcyByZWFjaGFibGUgYW5kIHVwZGF0ZSBkYXRhT2Zmc2V0ICovCi0gICAgICAgICAgICBpZigoKE00T1NBX0ludDMyKShwQ29udGV4dC0+ZGF0YVNpemUpICsgKnBvc2l0aW9uID49IDApICYmICgqcG9zaXRpb24gPD0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSBwQ29udGV4dC0+ZGF0YVNpemUgKyAqcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gcENvbnRleHQtPmRhdGFPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQ6Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBwb3NpdGlvbiBpcyByZWFjaGFibGUgYW5kIHVwZGF0ZSBkYXRhT2Zmc2V0ICovCi0gICAgICAgICAgICBpZigoKnBvc2l0aW9uICsgKE00T1NBX0ludDMyKShwQ29udGV4dC0+ZGF0YU9mZnNldCkgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICgqcG9zaXRpb24gKyAoTTRPU0FfSW50MzIpKHBDb250ZXh0LT5kYXRhT2Zmc2V0KSA8PQotICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDb250ZXh0LT5kYXRhU2l6ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgKz0gKnBvc2l0aW9uOwotICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IHBDb250ZXh0LT5kYXRhT2Zmc2V0OwotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkUmFtQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZiAocENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklEIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5Ci0gKiAgICAgICAgICAgICB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRSYW1HZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUgKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVSZWFkZXJSYW1fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6Ci0gICAgICAgICAgICAoKihNNE9TQV9VSW50MzIgKilvcHRpb25WYWx1ZSkgPSAocENvbnRleHQtPmRhdGFTaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkSXNFT0Y6Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+ZGF0YU9mZnNldCA9PSBwQ29udGV4dC0+ZGF0YVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCooTTRPU0FfVUludDggKilvcHRpb25WYWx1ZSkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqKE00T1NBX1VJbnQ4ICopb3B0aW9uVmFsdWUpID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGU6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldFVSTDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uIDoKLSAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKW9wdGlvblZhbHVlKSA9IHBDb250ZXh0LT5kYXRhT2Zmc2V0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVJlYWRSYW1HZXRPcHRpb24gaW52YWxpZCBvcHRpb24gSUQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpKQotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFJhbVNldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlICkKLXsKLSAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYwppbmRleCAxZmM3M2RjLi45MmI0NjJmIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCkBAIC0xMTMsMTIgKzExMywxMiBAQAogICAgICAgICB9CiAgICAgICAgIGZmbHVzaChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7CiAKLSAgICAgICAgTTRPU0FfRlBPU19BRERfQ09OU1RfVUlOVDMyKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24sIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24sIFdyaXRlU2l6ZSk7CisgICAgICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgV3JpdGVTaXplOwogCiAgICAgICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgIGlmKE00T1NBX0ZQT1NfQ09NUEFSRShwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uLCBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkgPiAwKQorICAgICAgICBpZihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID4gcEZpbGVDb250ZXh0LT5maWxlX3NpemUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZQT1NfU0VUKHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplLCBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTE2MCwxNCArMTYwLDEyIEBACiAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKICAgICB9CiAKLSAgICBNNE9TQV9GUE9TX0FERF9DT05TVF9VSU5UMzIocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTaXplV3JpdGUpOworICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgdWlTaXplV3JpdGU7CiAKICAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlmKE00T1NBX0ZQT1NfQ09NUEFSRShwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uLCBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkgPiAwKQorICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKICAgICB7Ci0gICAgICAgIE00T1NBX0ZQT1NfU0VUKHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplLCBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKTsKKyAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwogICAgIH0KIAogICAgIGlmKChNNE9TQV9VSW50MzIpdWlTaXplV3JpdGUgPCB1aVNpemUpCkBAIC0yODUsNyArMjgzLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBNNE9TQV9GUE9TX1NFVChwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uLCAqcFBvc2l0aW9uKTsKKyAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKIAogICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1dyaXRlOwogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyX1JBTS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlcl9SQU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTM0MWNhOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyX1JBTS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlclJhbS5jCi0KLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZnJvbSBSQU0KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSAiZmlsZSIgc3RvcmVkIGluIFJBTS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlclJhbS5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXJSYW0uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE9TQV9GaWxlV3JpdGVSYW1fQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHdyaXRlciBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBGaWxlIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEZpbGVEZXNjOyAgICAvKiBQb2ludGVyIG9uIGZpbGUgZGF0YSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBkYXRhU2l6ZTsgICAgLyogU2l6ZSBvZiBkYXRhIHRvIHdyaXRlICovCi0gICAgTTRPU0FfVUludDMyICAgIGRhdGFPZmZzZXQ7ICAgIC8qIEFjdHVhbCBvZmZzZXQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBJc09wZW5lZDsgICAgLyogTWljcm8gc3RhdGUgbWFjaGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBidWZmZXJTaXplOyAgICAvKiBBY3R1YWwgdXNlZCBzaXplIGluc2lkZSB0aGUgYnVmZmVyICovCi19IE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGlzIG1ldGhvZCAib3BlbnMiIHRoZSBwcm92aWRlZCBmaWxlRGVzY3JpcHRvciAoaW4gZmFjdCBhZGRyZXNzKQotICogICAgICAgICAgICBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKE9VVCkgRmlsZSB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3IgOiAgICAoSU4pIEZpbGUgRGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgICBGaWxlTW9kZUFjY2VzcyA6ICAgIChJTikgRmlsZSBtb2RlIGFjY2Vzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1PcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKLXsKLSAgICBNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZVdyaXRlclJhbV9EZXNjcmlwdG9yKiBwRGVzY3JpcHRvciA9IGZpbGVEZXNjcmlwdG9yOwotICAgIE00T1NBX0ludDMyIGFGaWxlRGVzYz0tMTsKLSAgICBNNE9TQV9FUlIgICBlcnI9TTROT19FUlJPUjsKLQotICAgIC8qICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgaWYoZmlsZURlc2NyaXB0b3IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSB3cml0ZXIgY29udGV4dC4gKi8KLSAgICBwQ29udGV4dCA9IChNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfV1JJVEVSLCAoTTRPU0FfQ2hhciopIkNvbnRleHQgYWxsb2NhdGlvbiIpOwotICAgIGlmKHBDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQotICAgIHsKLSAgICAgICAgcENvbnRleHQtPnBGaWxlRGVzYyA9IChNNE9TQV9NZW1BZGRyOCkocERlc2NyaXB0b3ItPnBGaWxlRGVzYyk7Ci0gICAgICAgIHBDb250ZXh0LT5kYXRhU2l6ZSA9IChNNE9TQV9JbnQzMikocERlc2NyaXB0b3ItPmRhdGFTaXplKTsKLSAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAwOwotICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgIH0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgICpjb250ZXh0PU00T1NBX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpjb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2Qgd3JpdGVzIHRoZSAnc2l6ZScgYnl0ZXMgc3RvcmVkIGF0ICdkYXRhJyBtZW1vcnkgYXQgdGhlIGVuZAotICogICAgICAgICAgICBvZiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCi0gKiAgICAgICAgICAgIE1vcmVvdmVyLCB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0ICdzaXplJyBieXRlcy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBGaWxlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBEYXRhIDogICAgKElOKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHdyaXR0ZW4gZGF0YS4KLSAqIEBwYXJhbSAgICBTaXplIDogICAgKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgcERhdGEgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbURhdGEoTTRPU0FfQ29udGV4dCBjb250ZXh0LE00T1NBX01lbUFkZHI4IGRhdGEsIE00T1NBX1VJbnQzMiBTaXplKQotewotICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7Ci0KLSAgICAvKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMIHx8IGRhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKiBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byB3cml0ZSBvciBub3QgKi8KLSAgICBpZiAocENvbnRleHQtPmRhdGFPZmZzZXQgKyBTaXplIDwgcENvbnRleHQtPmRhdGFTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX21lbWNweSgocENvbnRleHQtPnBGaWxlRGVzYyArIHBDb250ZXh0LT5kYXRhT2Zmc2V0KSwgZGF0YSwgU2l6ZSk7Ci0gICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ICs9IFNpemU7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5kYXRhT2Zmc2V0PiBwQ29udGV4dC0+YnVmZmVyU2l6ZSkgcENvbnRleHQtPmJ1ZmZlclNpemUgPSBwQ29udGV4dC0+ZGF0YU9mZnNldDsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHdyaXRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCi0gKiAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6Ci0gKiAgICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KLSAqICAgICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgotICogICAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBTZWVrTW9kZSA6ICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KLSAqIEBwYXJhbSAgICBwUG9zaXRpb24gOiAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0gKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbVNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7Ci0KLSAgICAvKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMIHx8IFNlZWtNb2RlID09IE00T1NBX05VTEwgfHwgcG9zaXRpb24gPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKiBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgIHN3aXRjaChTZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgotICAgICAgICAgICAgLyogQ2hlY2sgaWYgcG9zaXRpb24gaXMgcmVhY2hhYmxlIGFuZCB1cGRhdGUgZGF0YU9mZnNldCAqLwotICAgICAgICAgICAgaWYgKCgoKnBvc2l0aW9uKSA+PSAwKSAmJiAoKE00T1NBX1VJbnQzMikoKnBvc2l0aW9uKSA8PSBwQ29udGV4dC0+ZGF0YVNpemUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gKnBvc2l0aW9uOwotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBwb3NpdGlvbiBpcyByZWFjaGFibGUgYW5kIHVwZGF0ZSBkYXRhT2Zmc2V0ICovCi0gICAgICAgICAgICBpZiAoKCpwb3NpdGlvbikgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+ZGF0YVNpemUgPj0gKE00T1NBX1VJbnQzMikoLSgqcG9zaXRpb24pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5kYXRhT2Zmc2V0ID0gKE00T1NBX1VJbnQzMikgKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YVNpemUgKyAoKnBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgoKnBvc2l0aW9uKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCA9IChNNE9TQV9VSW50MzIpKHBDb250ZXh0LT5wRmlsZURlc2MgKyBwQ29udGV4dC0+ZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudDoKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIHBvc2l0aW9uIGlzIHJlYWNoYWJsZSBhbmQgdXBkYXRlIGRhdGFPZmZzZXQgKi8KLSAgICAgICAgICAgIGlmICgoKnBvc2l0aW9uKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5kYXRhT2Zmc2V0ID49IChNNE9TQV9VSW50MzIpKC0oKnBvc2l0aW9uKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+ZGF0YU9mZnNldCA9IChNNE9TQV9VSW50MzIpIChwQ29udGV4dC0+ZGF0YU9mZnNldCArICgqcG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPmRhdGFTaXplID49IChNNE9TQV9VSW50MzIpKHBDb250ZXh0LT5kYXRhT2Zmc2V0ICsgKCpwb3NpdGlvbikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPmRhdGFPZmZzZXQgPSAoTTRPU0FfVUludDMyKSAocENvbnRleHQtPmRhdGFPZmZzZXQgKyAoKnBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiAgICAgICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyIG11c3QgYmUgZnJlZWQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVJhbUNsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqIHBDb250ZXh0PShNNE9TQV9GaWxlV3JpdGVyUmFtX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycj1NNE5PX0VSUk9SOwotCi0gICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIGlmKHBDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgLyogVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDb250ZXh0KTsKLQotICAgIC8qICAgIFJldHVybiBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gZmx1c2ggdGhlIHBlbmRpbmcgZGF0YQotICogICAgICAgICAgICB0byB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiAgICAgICAgICAgIEFsbCBwZW5kaW5nIHdyaXR0ZW4gZGF0YSBhcmUgd3JpdHRlbiBpbiB0aGUgZmlsZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtRmx1c2goTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCogcENvbnRleHQ9KE00T1NBX0ZpbGVXcml0ZXJSYW1fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBpZihjb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgLyogVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBETyBOT1RISU5HICovCi0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBPcHRpb25JZCA6ICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcGFyYW0gICAgT3B0aW9uVmFsdWUgOiAgICAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfUkVBRF9PTkxZIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlUmFtU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0Kiljb250ZXh0OwotCi0gICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qICAgIFNldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dCA6ICAgIC8qIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkwgOiAgICAgICAgICAgIC8qIEdldCB0aGUgZGlyZWN0b3J5ICsgbmFtZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlUG9zaXRpb24gOiAgICAvKiBHZXQgZmlsZSBwb3NpdGlvbiAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURfT05MWTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZSA6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiBJdCBpcyBOVUxMIGlmIHRoZSBmaWxlIGlzIG9wZW5lZAotICAgICAgICAgICAgICogd2l0aCB3cml0ZSBhdHRyaWJ1dGUgb25seSAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBkZWZhdWx0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhZCBvcHRpb24gSUQgKi8KLSAgICAgICAgICAgIHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIC8qICAgIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIGNvcmUgZmlsZSByZWFkZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcG9uZW50LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIE9wdGlvbklkIDogICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSAqIEBwYXJhbSAgICBwT3B0aW9uVmFsdWUgOiAgICAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICBwQ29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgdGhlIG9wdGlvbiBpZCBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgVGhlIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVSYW1HZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0KiBwQ29udGV4dD0oTTRPU0FfRmlsZVdyaXRlclJhbV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgIGVycj1NNE5PX0VSUk9SOwotCi0gICAgLyogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qICAgIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6LyogR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KLSAgICAgICAgICAgICgqKE00T1NBX1VJbnQzMiAqKW9wdGlvblZhbHVlKSA9IChwQ29udGV4dC0+YnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRVUkwgOiAgICAvKiBHZXQgdGhlIGRpcmVjdG9yeSArIG5hbWUgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgZGVmYXVsdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhZCBvcHRpb24gSUQgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogICAgUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKaW5kZXggMGQ4NTdmNi4uOGRiM2UyYSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwogCi0gICAgcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKU00T1NBX21hbGxvYyhzaXplb2YoTTRPU0FfTXV0ZXhDb250ZXh0KSwKKyAgICBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9NdXRleENvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICBNNE9TQV9NVVRFWCwgKE00T1NBX0NoYXIqKSJNNE9TQV9tdXRleE9wZW46IG11dGV4IGNvbnRleHQiKTsKIAogICAgIGlmKE00T1NBX05VTEwgPT0gcE11dGV4Q29udGV4dCkKQEAgLTk2LDcgKzk2LDcgQEAKICAgICBpZighb3BlbmVkKQogICAgIHsKICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsICJNNE9TQV9tdXRleE9wZW46IE9TIG11dGV4IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcE11dGV4Q29udGV4dCk7CisgICAgICAgIGZyZWUocE11dGV4Q29udGV4dCk7CiAgICAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRCA7CiAgICAgfQogCkBAIC0yNjksNyArMjY5LDcgQEAKIAogICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSBwTXV0ZXhDb250ZXh0KTsKKyAgICBmcmVlKCBwTXV0ZXhDb250ZXh0KTsKIAogICAgIHJldHVybiBNNE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwppbmRleCBhOTliMTM2Li5hZWFjMGE5IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwpAQCAtNzcsNyArNzcsNyBAQAogCiAgICAqY29udGV4dCA9IE00T1NBX05VTEw7CiAKLSAgIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopIE00T1NBX21hbGxvYygKKyAgIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfU2VtYXBob3JlQ29udGV4dCksIE00T1NBX1NFTUFQSE9SRSwKICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX3NlbWFwaG9yZU9wZW46IHNlbWFwaG9yZSBjb250ZXh0Iik7CiAKQEAgLTkwLDcgKzkwLDcgQEAKIAogICAgaWYgKDAgIT0gc2VtX2luaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSwgMCwgaW5pdGlhbF9jb3VudCkpCiAgICB7Ci0gICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpc2VtYXBob3JlQ29udGV4dCk7CisgICAgICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwogCiAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwKICAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVPcGVuOiBPUyBzZW1hcGhvcmUgY3JlYXRpb24gZmFpbGVkIik7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAogICAgc2VtX2Rlc3Ryb3koJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7CiAKLSAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilzZW1hcGhvcmVDb250ZXh0KTsKKyAgIGZyZWUoc2VtYXBob3JlQ29udGV4dCk7CiAKICAgIHJldHVybiBNNE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU3RyaW5nLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TdHJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY5OGI0Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TdHJpbmcuYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX1N0cmluZ19wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfU3RyaW5nLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZW1wdHkgTTRPU0FfU3RyaW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcFN0ck91dAotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyQ3JlYXRlKE00T1NBX1N0cmluZyogcFN0ck91dCkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3N0ckNyZWF0ZVx0XHRNNE9TQV9TdHJpbmcqIDB4JXgiLCBwU3RyT3V0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJPdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNyZWF0ZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMICE9ICpwU3RyT3V0LCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ3JlYXRlIik7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgb3V0cHV0IE00T1NBX1N0cmluZyAqLwotICAgIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX3N0clN0cnVjdCksIE00T1NBX1NUUklORywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2Q3JlYXRlOiBvdXRwdXQgc3RyaW5nIik7Ci0KLSAgICAvKiBDaGVjayBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cikKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJQcml2Q3JlYXRlIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBTdHItPmNvcmVJRCA9IE00T1NBX1NUUklORzsKLSAgICBwU3RyLT5wdWk4X2J1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcFN0ci0+dWkzMl9sZW5ndGggPSAwOwotICAgIHBTdHItPnVpMzJfc2l6ZSA9IDA7Ci0KLSAgICAqcFN0ck91dCA9IHBTdHI7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0IHRoZSBNNE9TQV9TdHJpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBzdHJfaW4KLSAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE9TQV9zdHJSZXNldChNNE9TQV9TdHJpbmcgc3RyX2luKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3N0clJlc2V0XHRcdE00T1NBX1N0cmluZyogMHgleCIsIHN0cl9pbik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJSZXNldCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clJlc2V0Iik7Ci0KLSAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBCdWZmZXIpCi0gICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEJ1ZmZlcik7Ci0KLSAgICAgICAgcFN0ci0+cHVpOF9idWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBTdHItPnVpMzJfbGVuZ3RoID0gMDsKLSAgICBwU3RyLT51aTMyX3NpemUgPSAwOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGZyZWUgdGhlIG1lbW9yeSBvZiB0aGUgaW5wdXQgTTRPU0FfU3RyaW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgc3RyX2luCi0gKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyRGVzdHJveShNNE9TQV9TdHJpbmcgc3RyX2luKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zdHJEZXN0cm95XHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckRlc3Ryb3kiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRGVzdHJveSIpOwotCi0KLSAgICAvKiBGcmVlIE00T1NBX1N0cmluZyBidWZmZXIgKi8KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHBTdHItPnB1aThfYnVmZmVyKSk7Ci0KLSAgICAvKiBGcmVlIE00T1NBX1N0cmluZyBzdHJ1Y3R1cmUgbWVtb3J5ICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTdHIpOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIHN0cl9pbiBjb250ZW50Ci0gKiBAbm90ZQotICogQHBhcmFtICAgICAgc3RyX2luCi0gKiBAcGFyYW0gICAgICBwQ2hhcgotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00T1NBX3N0clNldENoYXJDb250ZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIgKnBDaGFyKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRDb250ZW50XHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9DaGFyKiIKLSAgICAgICAgIiAweCV4Iiwgc3RyX2luLCBwQ2hhcik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRDb250ZW50Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENoYXIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRDb250ZW50Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldENvbnRlbnQiKTsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIHBDaGFyLCBNNE9TQV9jaHJMZW5ndGgocENoYXIpKTsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucywgaW4gcGFjX2NvbnRlbnQsIHRoZSAiQy1TdHJpbmciIG9mIHN0cl9pbgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHN0cl9pbgotICogQHBhcmFtICAgICAgcGFjX2NvbnRlbnQKLSAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3N0ckdldENoYXJDb250ZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqKiBwcGNoYXIpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckdldENvbnRlbnRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqKiIKLSAgICAgICAgIiAweCV4Iiwgc3RyX2luLCBwcGNoYXIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0Q29udGVudCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBwY2hhciwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldENvbnRlbnQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Q29udGVudCIpOwotCi0gICAgKnBwY2hhciA9IHBTdHItPnB1aThfYnVmZmVyOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNldENoYXIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfQ2hhciBjX2luKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldENoYXJcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIgJWMiLAotICAgICAgICBzdHJfaW4sIGNfaW4pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU2V0Q2hhciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRDaGFyIik7Ci0KLQotICAgIGVyciA9IE00T1NBX3N0clByaXZSZWFsbG9jKHBTdHIsIDEpOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBTdHItPnB1aThfYnVmZmVyWzBdID0gY19pbjsKLSAgICBwU3RyLT5wdWk4X2J1ZmZlclsxXSA9ICdcMCc7Ci0gICAgcFN0ci0+dWkzMl9sZW5ndGggICAgPSAxOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckdldENoYXIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfQ2hhciogcGNfb3V0KQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJHZXRDaGFyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9DaGFyKiAweCV4IiwKLSAgICAgICAgc3RyX2luLCBwY19vdXQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGNfb3V0LCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRDaGFyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0Q2hhciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRDaGFyIik7Ci0KLSAgICBpZihwU3RyLT51aTMyX2xlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAqcGNfb3V0ID0gcFN0ci0+cHVpOF9idWZmZXJbMF07Ci0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ4IGk4X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls4XTsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0SW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50OCAlZCIsCi0gICAgICAgIHN0cl9pbiwgaThfaW4pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU2V0SW50OCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRJbnQ4Iik7Ci0KLQotICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLwotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tzdHJEZWM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlZCIsIGk4X2luKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihpOF9pbiA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIi0lWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaThfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaThfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoaThfaW4gPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSItJW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWk4X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDgsIChNNE9TQV9DaGFyKikiJW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk4X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KLSAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOwotCi0KLSAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOwotfQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyR2V0SW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ4KiBwaThfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0SW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50OCogMHgleFx0IgotICAgICAgICAiTTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcGk4X291dCwgYmFzZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRJbnQ4Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGk4X291dCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50OCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkgJiYKLSAgICAgICAgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDgiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCxNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQ4Iik7Ci0KLQotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyR2V0SW50OChwU3RyLT5wdWk4X2J1ZmZlciwgcGk4X291dCwgTTRPU0FfTlVMTCwgYmFzZSk7Ci0KLSAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0SW50OCIpOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJTZXRVSW50OChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9VSW50OCB1aThfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls0XTsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0gICAgTTRPU0FfQ2hhciogcEZvcm1hdDsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRVSW50OFx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1VJbnQ4ICVkIiwKLSAgICAgICAgc3RyX2luLCB1aThfaW4pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAgIk00T1NBX3N0clNldFVJbnQ4Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDgiKTsKLQotICAgIGlmIChiYXNlID09IE00T1NBX2tjaHJEZWMpCi0gICAgewotICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIldSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJhc2UgPT0gTTRPU0Ffa2NockhleGEpCi0gICAgewotICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlWCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJhc2UgPT0gTTRPU0Ffa2Nock9jdCkKLSAgICB7Ci0gICAgICAgIHBGb3JtYXQgPSAoTTRPU0FfQ2hhciopIiVvIjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA0LCBwRm9ybWF0LCB1aThfaW4pOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotCi0gICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKLX0KLQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50OChNNE9TQV9TdHJpbmcgc3RyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwdWk4X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRVSW50OFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDgqIDB4JXhcdCIKLSAgICAgICAgIk00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHB1aThfb3V0LCAgYmFzZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50OCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aThfb3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRVSW50OCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKLSAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFVJbnQ4Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0VUludDgiKTsKLQotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50OChwU3RyLT5wdWk4X2J1ZmZlciwgcHVpOF9vdXQsIE00T1NBX05VTEwsIGJhc2UpOwotCi0gICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldFVJbnQ4Iik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJTZXRJbnQxNihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQxNiBpMTZfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlcls4XTsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0SW50MTZcdFx0TTRPU0FfU3RyaW5nKiAweCV4XHRNNE9TQV9JbnQxNiAlZCIsCi0gICAgICAgIHN0cl9pbiwgaTE2X2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldEludDE2Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0SW50MTYiKTsKLQotICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLwotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tzdHJEZWM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfaW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGNhc2UgTTRPU0Ffa3N0ckhleGE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGkxNl9pbiA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIi0lWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1pMTZfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgKE00T1NBX0NoYXIqKSIlWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoaTE2X2luIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDgsIChNNE9TQV9DaGFyKikiLSVvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWkxNl9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCA4LCAoTTRPU0FfQ2hhciopIiVvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNl9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRlIE00T1NBX1N0cmluZyBjb250ZW50IGxlbmd0aCAqLwotICAgIHVpMzJfbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKGF1aThfYnVmZmVyKSA7Ci0KLSAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOwotfQotCi0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckdldEludDE2KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0ludDE2KiBwaTE2X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRJbnQxNlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50MTYqIDB4JXgiCi0gICAgICAgICJcdE00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHBpMTZfb3V0LCBiYXNlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDE2Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkxNl9vdXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEludDE2Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChiYXNlICE9IE00T1NBX2tzdHJEZWMpICYmIChiYXNlICE9IE00T1NBX2tzdHJIZXhhKQotICAgICAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50MTYiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQxNiIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRJbnQxNihwU3RyLT5wdWk4X2J1ZmZlciwgcGkxNl9vdXQsIE00T1NBX05VTEwsIGJhc2UpOwotCi0gICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEludDE2Iik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0VUludDE2KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQxNiB1aTE2X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKLSAgICBNNE9TQV9DaGFyIGF1aThfYnVmZmVyWzhdOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLSAgICBNNE9TQV9DaGFyKiBwRm9ybWF0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldFVJbnQxNlx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1VJbnQxNiAlZCIsCi0gICAgICAgIHN0cl9pbiwgdWkxNl9pbik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRVSW50MTYiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDE2Iik7Ci0KLSAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJXUiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCi0gICAgewotICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLwotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgOCwgcEZvcm1hdCwgdWkxNl9pbik7Ci0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KLSAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOwotCi0KLSAgICByZXR1cm4gTTRPU0Ffc3RyUHJpdlNldChwU3RyLCBhdWk4X2J1ZmZlciwgdWkzMl9sZW5ndGgpOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRVSW50MTYoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDE2KiBwdWkxNl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldFVJbnQxNlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDE2KiAiCi0gICAgICAgICIweCV4XHRNNE9TQV9zdHJOdW1CYXNlICVkIiwgc3RyX2luLCBwdWkxNl9vdXQsIGJhc2UpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0VUludDE2Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMTZfb3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQxNiIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKLSAgICAgICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50MTYiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQxNiIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50MTYocFN0ci0+cHVpOF9idWZmZXIsIHB1aTE2X291dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7Ci0KLSAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0VUludDE2Iik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50MzIoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfSW50MzIgaTMyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMTZdOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLSAgICBNNE9TQV9DaGFyKiBwRm9ybWF0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldEludDMyXHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfSW50MzIgJWQiLAotICAgICAgICBzdHJfaW4sIGkzMl9pbik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRJbnQzMiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldEludDMyIik7Ci0KLSAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCi0gICAgewotICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLwotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tzdHJEZWM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2luKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihpMzJfaW4gPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiLSVYIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWkzMl9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAxNiwgKE00T1NBX0NoYXIqKSIlWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoaTMyX2luIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDE2LCAoTTRPU0FfQ2hhciopIi0lbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1pMzJfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTYsIChNNE9TQV9DaGFyKikiJW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQzMihNNE9TQV9TdHJpbmcgc3RyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRJbnQzMlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfSW50MzIqIDB4JXgiCi0gICAgICAgICJcdE00T1NBX3N0ck51bUJhc2UgJWQiLCBzdHJfaW4sIHBpMzJfb3V0LCBiYXNlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDMyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkzMl9vdXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEludDMyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChiYXNlICE9IE00T1NBX2tzdHJEZWMpICYmIChiYXNlICE9IE00T1NBX2tzdHJIZXhhKQotICAgICAgICAmJiAoYmFzZSAhPSBNNE9TQV9rc3RyT2N0KSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0SW50MzIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQzMiIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRJbnQzMihwU3RyLT5wdWk4X2J1ZmZlciwgcGkzMl9vdXQsIE00T1NBX05VTEwsIGJhc2UpOwotCi0gICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEludDMyIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNldFVJbnQzMihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9VSW50MzIgdWkzMl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlclsxMl07Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotICAgIE00T1NBX0NoYXIqIHBGb3JtYXQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyU2V0VUludDMyXHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgc3RyX2luLCB1aTMyX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFVJbnQzMiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VUludDMyIik7Ci0KLSAgICBpZiAoTTRPU0Ffa2NockRlYyA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJXUiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hySGV4YSA9PSBiYXNlKQotICAgIHsKLSAgICAgICAgcEZvcm1hdCA9IChNNE9TQV9DaGFyKikiJVgiOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9rY2hyT2N0ID09IGJhc2UpCi0gICAgewotICAgICAgICBwRm9ybWF0ID0gKE00T1NBX0NoYXIqKSIlbyI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGb3JtYXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgaW5wdXQgbnVtYmVyIGludG8gIkMtU3RyaW5nIiAqLwotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMTIsIHBGb3JtYXQsIHVpMzJfaW4pOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotCi0gICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyR2V0VUludDMyKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQzMiogcHVpMzJfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJHZXRVSW50MzJcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1VJbnQzMiogIgotICAgICAgICAiMHgleFx0TTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcHVpMzJfb3V0LCBiYXNlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFVJbnQzMiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX291dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRVSW50MzIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCi0gICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRVSW50MzIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldFVJbnQzMiIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRVSW50MzIocFN0ci0+cHVpOF9idWZmZXIsIHB1aTMyX291dCwKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCwgYmFzZSk7Ci0KLSAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0VUludDMyIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0SW50NjQoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfSW50NjQgaTY0X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMjRdOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldEludDY0XHRcdE00T1NBX1N0cmluZyogMHgleFx0TTRPU0FfSW50NjQgMHgleCIsCi0gICAgICAgIHN0cl9pbiwgJmk2NF9pbik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJTZXRJbnQ2NCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldEludDY0Iik7Ci0KLSAgICAvKiBDb252ZXJ0IGlucHV0IG51bWJlciBpbnRvICJDLVN0cmluZyIgKi8KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rc3RyRGVjOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBjYXNlIE00T1NBX2tzdHJIZXhhOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9JTlQ2NF9JU19QT1NJVElWRShpNjRfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJWxsWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0lOVDY0X05FRyhpNjRfaW4sIGk2NF9pbik7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSItJWxsWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGNhc2UgTTRPU0Ffa3N0ck9jdDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfSU5UNjRfSVNfUE9TSVRJVkUoaTY0X2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVsbG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9JTlQ2NF9ORUcoaTY0X2luLCBpNjRfaW4pOwotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSVsbG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRJbnQ2NChNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9JbnQ2NCogcGk2NF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0SW50NjRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0ludDY0KiAweCV4IgotICAgICAgICAiXHRNNE9TQV9zdHJOdW1CYXNlICVkIiwgc3RyX2luLCBwaTY0X291dCwgYmFzZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRJbnQ2NCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBpNjRfb3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRJbnQ2NCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoYmFzZSAhPSBNNE9TQV9rc3RyRGVjKSAmJiAoYmFzZSAhPSBNNE9TQV9rc3RySGV4YSkKLSAgICAgICAgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ck9jdCksIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldEludDY0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0SW50NjQiKTsKLQotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyR2V0SW50NjQocFN0ci0+cHVpOF9idWZmZXIsIHBpNjRfb3V0LCBNNE9TQV9OVUxMLCBiYXNlKTsKLQotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyX2NvZGUpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVFJfQ09OVl9GQUlMRUQsICJNNE9TQV9zdHJHZXRJbnQ2NCIpOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNldERvdWJsZShNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9Eb3VibGUgZF9pbikKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotICAgIE00T1NBX0NoYXIgYXVpOF9idWZmZXJbMjRdOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXREb3VibGVcdFx0TTRPU0FfU3RyaW5nKiAweCV4XHRNNE9TQV9Eb3VibGUqICIKLSAgICAgICAgIjB4JXgiLCBzdHJfaW4sICZkX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldERvdWJsZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0RG91YmxlIik7Ci0KLSAgICAvKiBDb252ZXJ0IGlucHV0IG51bWJlciBpbnRvICJDLVN0cmluZyIgKi8KLSAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVlIiwgZF9pbik7Ci0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBNNE9TQV9TdHJpbmcgY29udGVudCBsZW5ndGggKi8KLSAgICB1aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChhdWk4X2J1ZmZlcikgOwotCi0gICAgcmV0dXJuIE00T1NBX3N0clByaXZTZXQocFN0ciwgYXVpOF9idWZmZXIsIHVpMzJfbGVuZ3RoKTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyR2V0RG91YmxlKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0RvdWJsZSogcGRfb3V0KQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc3RyR2V0RG91YmxlXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9Eb3VibGUqICIKLSAgICAgICAgIjB4JXgiLCBzdHJfaW4sIHBkX291dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXREb3VibGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwZF9vdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldERvdWJsZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0RG91YmxlIik7Ci0KLSAgICBlcnJfY29kZSA9IE00T1NBX2NockdldERvdWJsZShwU3RyLT5wdWk4X2J1ZmZlciwgcGRfb3V0LCBNNE9TQV9OVUxMKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycl9jb2RlKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RSX0NPTlZfRkFJTEVELCAiTTRPU0Ffc3RyR2V0RG91YmxlIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0RmlsZVBvc2l0aW9uKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX1VJbnQzMiB1aTMyX2xlbmd0aDsKLSAgICBNNE9TQV9DaGFyIGF1aThfYnVmZmVyWzI0XTsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJTZXRGaWxlUG9zaXRpb25cdFx0TTRPU0FfU3RyaW5nKiAweCV4XHQiCi0gICAgICAgICJNNE9TQV9GaWxlUG9zaXRpb24qIDB4JXgiLCBzdHJfaW4sICZmcG9zX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0RmlsZVBvc2l0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTZXRGaWxlUG9zaXRpb24iKTsKLQotCi0gICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCi0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa3N0ckRlYzoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSIlYWFkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBvc19pbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgY2FzZSBNNE9TQV9rc3RySGV4YToKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfRlBPU19JU19QT1NJVElWRShmcG9zX2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiVhYVgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcG9zX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9GUE9TX05FRyhmcG9zX2luLCBmcG9zX2luKTsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIi0lYWFYIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBvc19pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgY2FzZSBNNE9TQV9rc3RyT2N0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9GUE9TX0lTX1BPU0lUSVZFKGZwb3NfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJWFhbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwb3NfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ZQT1NfTkVHKGZwb3NfaW4sIGZwb3NfaW4pOwotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSVhYW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcG9zX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24oTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfRmlsZVBvc2l0aW9uKiBwZnBvc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0ck51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0IgotICAgICAgICAiTTRPU0FfRmlsZVBvc2l0aW9uKiAweCV4XHRcdE00T1NBX3N0ck51bUJhc2UgJWQiLAotICAgICAgICBzdHJfaW4sIHBmcG9zX291dCwgYmFzZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBmcG9zX291dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCi0gICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRGaWxlUG9zaXRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRGaWxlUG9zaXRpb24ocFN0ci0+cHVpOF9idWZmZXIsIHBmcG9zX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwsIGJhc2UpOwotCi0gICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldEZpbGVQb3NpdGlvbiIpOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNldFRpbWUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVGltZSB0X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciBhdWk4X2J1ZmZlclsyNF07Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldERvdWJsZVx0XHRNNE9TQV9TdHJpbmcqIDB4JXhcdE00T1NBX1RpbWUqIDB4JXgiLAotICAgICAgICBzdHJfaW4sICZ0X2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFRpbWUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VGltZSIpOwotCi0gICAgLyogQ29udmVydCBpbnB1dCBudW1iZXIgaW50byAiQy1TdHJpbmciICovCi0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa3N0ckRlYzoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTUHJpbnRmKGF1aThfYnVmZmVyLCAyNCwgKE00T1NBX0NoYXIqKSIldG1kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9pbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgY2FzZSBNNE9TQV9rc3RySGV4YToKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfVElNRV9JU19QT1NJVElWRSh0X2luKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIiV0bVgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9USU1FX05FRyh0X2luLCB0X2luKTsKLSAgICAgICAgICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NoclNQcmludGYoYXVpOF9idWZmZXIsIDI0LCAoTTRPU0FfQ2hhciopIi0ldG1YIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgY2FzZSBNNE9TQV9rc3RyT2N0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9USU1FX0lTX1BPU0lUSVZFKHRfaW4pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiJXRtbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RJTUVfTkVHKHRfaW4sIHRfaW4pOwotICAgICAgICAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU1ByaW50ZihhdWk4X2J1ZmZlciwgMjQsIChNNE9TQV9DaGFyKikiLSV0bW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgTTRPU0FfU3RyaW5nIGNvbnRlbnQgbGVuZ3RoICovCi0gICAgdWkzMl9sZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgoYXVpOF9idWZmZXIpIDsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBTdHIsIGF1aThfYnVmZmVyLCB1aTMyX2xlbmd0aCk7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckdldFRpbWUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVGltZSogcHRfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0VGltZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVGltZSogMHgleCIKLSAgICAgICAgIlx0TTRPU0Ffc3RyTnVtQmFzZSAlZCIsIHN0cl9pbiwgcHRfb3V0LCBiYXNlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFRpbWUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdF9vdXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckdldFRpbWUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKGJhc2UgIT0gTTRPU0Ffa3N0ckRlYykgJiYgKGJhc2UgIT0gTTRPU0Ffa3N0ckhleGEpCi0gICAgICAgICYmIChiYXNlICE9IE00T1NBX2tzdHJPY3QpLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRUaW1lIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0VGltZSIpOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJHZXRUaW1lKHBTdHItPnB1aThfYnVmZmVyLCBwdF9vdXQsIE00T1NBX05VTEwsIGJhc2UpOwotCi0gICAgaWYoTTROT19FUlJPUiAhPSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUUl9DT05WX0ZBSUxFRCwgIk00T1NBX3N0ckdldFRpbWUiKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfU1RSX0NPTlZfRkFJTEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJHZXRMZW5ndGgoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyKiBwdWkzMl9sZW4pCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckdldExlbmd0aFx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyKiAiCi0gICAgICAgICIweCV4Iiwgc3RyX2luLCBwdWkzMl9sZW4pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyR2V0TGVuZ3RoIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMzJfbGVuLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJHZXRMZW5ndGgiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsICJNNE9TQV9zdHJHZXRMZW5ndGgiKTsKLQotICAgIC8qIEdldCB0aGUgTTRPU0FfU3RyaW5nU3R1Y3QgbGVuZ3RoIGZpZWxkICovCi0gICAgKnB1aTMyX2xlbiA9IHBTdHItPnVpMzJfbGVuZ3RoIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJDb21wYXJlKE00T1NBX1N0cmluZyBzdHJfaW4xLCBNNE9TQV9TdHJpbmcgc3RyX2luMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoLCBsZW5ndGgxLCBsZW5ndGgyOwotICAgIE00T1NBX0ludDMyIHJlc3VsdDsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9DaGFyKiBidWZmZXIxOwotICAgIE00T1NBX0NoYXIqIGJ1ZmZlcjI7Ci0gICAgTTRPU0FfQ2hhciogcFRtcDE7Ci0gICAgTTRPU0FfQ2hhciogcFRtcDI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyQ29tcGFyZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIDB4JXhcdCIKLSAgICAgICAgIk00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHBpMzJfcmVzdWx0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb21wYXJlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNvbXBhcmUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwaTMyX3Jlc3VsdCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29tcGFyZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjEtPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsICJNNE9TQV9zdHJDb21wYXJlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywgIk00T1NBX3N0ckNvbXBhcmUiKTsKLQotICAgIGJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXI7Ci0gICAgYnVmZmVyMiA9IHBTdHIyLT5wdWk4X2J1ZmZlcjsKLQotICAgIGxlbmd0aDEgPSBwU3RyMS0+dWkzMl9sZW5ndGg7Ci0gICAgbGVuZ3RoMiA9IHBTdHIyLT51aTMyX2xlbmd0aDsKLQotICAgIGxlbmd0aCA9IChsZW5ndGgxIDwgbGVuZ3RoMikgPyBsZW5ndGgxIDogbGVuZ3RoMjsKLQotICAgIHBUbXAxID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYygyICogbGVuZ3RoICogc2l6ZW9mKE00T1NBX0NoYXIpLAotICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJDb21wYXJlIik7Ci0KLSAgICBNNE9TQV9DSEVDS19NQUxMT0MocFRtcDEsICJNNE9TQV9zdHJDb21wYXJlIik7Ci0KLSAgICBwVG1wMiA9IHBUbXAxICsgbGVuZ3RoOwotCi0gICAgTTRPU0FfbWVtY3B5KHBUbXAxLCBidWZmZXIxLCBsZW5ndGgpOwotCi0gICAgTTRPU0FfbWVtY3B5KHBUbXAyLCBidWZmZXIyLCBsZW5ndGgpOwotCi0gICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAgIHBUbXAxW2ldID0gTTRPU0FfY2hyVG9Mb3dlcihidWZmZXIxW2ldKTsKLSAgICAgICAgcFRtcDJbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKGJ1ZmZlcjJbaV0pOwotICAgIH0KLQotICAgIE00T1NBX2Nock5Db21wYXJlKHBUbXAxLCBwVG1wMiwgbGVuZ3RoLCAmcmVzdWx0KTsKLQotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wMSk7Ci0KLSAgICBpZihyZXN1bHQgIT0gMCkKLSAgICB7Ci0gICAgICAgICpwaTMyX3Jlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGxlbmd0aDEgPT0gbGVuZ3RoMikKLSAgICAgICAgewotICAgICAgICAgICAgKnBpMzJfcmVzdWx0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsZW5ndGgxICA+IGxlbmd0aDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwaTMyX3Jlc3VsdCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcGkzMl9yZXN1bHQgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyQ29tcGFyZVN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyMTsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyMjsKLSAgICBNNE9TQV9DaGFyKiBwVG1wMTsKLSAgICBNNE9TQV9DaGFyKiBwVG1wMjsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoMSwgbGVuZ3RoMiwgaTsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGUsIHJldHVybl9jb2RlID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDb21wYXJlU3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgIgotICAgICAgICAiJWRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWRcdE00T1NBX1VJbnQzMiogMHgleCIKLSAgICAgICAgIlx0TTRPU0FfSW50MzIqIDB4JXgiLCBzdHJfaW4xLCB1aTMyX29mZnNldDEsIHN0cl9pbjIsCi0gICAgICAgIHVpMzJfb2Zmc2V0MiwgKnB1aTMyX251bSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwaTMyX3Jlc3VsdCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvbXBhcmVTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCpwdWkzMl9udW0gPT0gMCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjEtPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0cjItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldDEgPj0gcFN0cjEtPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldDIgPj0gcFN0cjItPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotCi0gICAgbGVuZ3RoMSA9IHBTdHIxLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0MTsKLSAgICBsZW5ndGgyID0gcFN0cjItPnVpMzJfbGVuZ3RoIC0gdWkzMl9vZmZzZXQyOwotCi0gICAgcEJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXIgKyB1aTMyX29mZnNldDE7Ci0gICAgcEJ1ZmZlcjIgPSBwU3RyMi0+cHVpOF9idWZmZXIgKyB1aTMyX29mZnNldDI7Ci0KLSAgICBpZihsZW5ndGgxIDwgKnB1aTMyX251bSkKLSAgICB7Ci0gICAgICAgICpwdWkzMl9udW0gPSBsZW5ndGgxOwotCi0gICAgICAgIHJldHVybl9jb2RlID0gTTRXQVJfU1RSX09WRVJGTE9XOwotICAgIH0KLQotICAgIGlmKGxlbmd0aDIgPCAqcHVpMzJfbnVtKQotICAgIHsKLSAgICAgICAgKnB1aTMyX251bSA9IGxlbmd0aDI7Ci0KLSAgICAgICAgcmV0dXJuX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgcFRtcDEgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKDIgKiAoKnB1aTMyX251bSkgKiBzaXplb2YoTTRPU0FfQ2hhciksCi0gICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotCi0gICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKHBUbXAxLCAiTTRPU0Ffc3RyQ29tcGFyZVN1YlN0ciIpOwotCi0gICAgcFRtcDIgPSBwVG1wMSArICgqcHVpMzJfbnVtKTsKLQotICAgIE00T1NBX21lbWNweShwVG1wMSwgcEJ1ZmZlcjEsICpwdWkzMl9udW0pOwotCi0gICAgTTRPU0FfbWVtY3B5KHBUbXAyLCBwQnVmZmVyMiwgKnB1aTMyX251bSk7Ci0KLSAgICBmb3IoaT0wOyBpPCgqcHVpMzJfbnVtKTsgaSsrKQotICAgIHsKLSAgICAgICAgcFRtcDFbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKHBCdWZmZXIxW2ldKTsKLSAgICAgICAgcFRtcDJbaV0gPSBNNE9TQV9jaHJUb0xvd2VyKHBCdWZmZXIyW2ldKTsKLSAgICB9Ci0KLSAgICBlcnJfY29kZSA9IE00T1NBX2Nock5Db21wYXJlKHBUbXAxLCBwVG1wMiwgKnB1aTMyX251bSwgcGkzMl9yZXN1bHQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9FUlIpTTRFUlJfUEFSQU1FVEVSID09IGVycl9jb2RlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb21wYXJlU3ViU3RyOiBNNE9TQV9jaHJOQ29tcGFyZSIpOwotCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXAxKTsKLQotICAgIHJldHVybiByZXR1cm5fY29kZTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyQ2FzZUNvbXBhcmUoTTRPU0FfU3RyaW5nIHN0cl9pbjEsIE00T1NBX1N0cmluZyBzdHJfaW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwaTMyX3Jlc3VsdCkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIxID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMTsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luMjsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoLCBsZW5ndGgxLCBsZW5ndGgyOwotICAgIE00T1NBX0NoYXIgKnBCdWZmZXIxLCAqcEJ1ZmZlcjI7Ci0gICAgTTRPU0FfSW50MzIgcmVzdWx0OwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9zdHJDYXNlQ29tcGFyZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nICIKLSAgICAgICAgIjB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHBpMzJfcmVzdWx0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDYXNlQ29tcGFyZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDYXNlQ29tcGFyZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBpMzJfcmVzdWx0LE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlIik7Ci0KLSAgICBsZW5ndGgxID0gcFN0cjEtPnVpMzJfbGVuZ3RoOwotICAgIGxlbmd0aDIgPSBwU3RyMi0+dWkzMl9sZW5ndGg7Ci0KLSAgICAvKiogTkI6ICBOZXZlciB1c2UgdGhpcyBleHByZXNzaW9uICJpID0gKHZhbHVlMSA9PSB2YWx1ZTIpID8geDogeTsiCi0gICAgICogYmVjYXVzZSB0aGF0IGRvZW5zJ3QgY29tcGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgKEFEUyBmb3IgZXhhbXBsZSkKLSAgICAgKiBVc2U6IGlmKHZhbHVlMSA9PSB2YWx1ZTIpCi0gICAgICogICAgICAgIHsgaT0geDsgLi5ldGMKLSAgICAgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyMS0+cHVpOF9idWZmZXIpCi0gICAgewotICAgICAgICBwQnVmZmVyMSA9IChNNE9TQV9DaGFyKikiIjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEJ1ZmZlcjEgPSBwU3RyMS0+cHVpOF9idWZmZXI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cjItPnB1aThfYnVmZmVyKQotICAgIHsKLSAgICAgICAgcEJ1ZmZlcjIgPSAoTTRPU0FfQ2hhciopIiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBCdWZmZXIyID0gcFN0cjItPnB1aThfYnVmZmVyOwotICAgIH0KLQotICAgIGlmICgobGVuZ3RoMSA8IGxlbmd0aDIpKQotICAgIHsKLSAgICAgICAgbGVuZ3RoID0gbGVuZ3RoMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbGVuZ3RoID0gIGxlbmd0aDI7Ci0gICAgfQotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJOQ29tcGFyZShwQnVmZmVyMSwgcEJ1ZmZlcjIsIGxlbmd0aCwgJnJlc3VsdCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX0VSUilNNEVSUl9QQVJBTUVURVIgPT0gZXJyX2NvZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ2FzZUNvbXBhcmU6IE00T1NBX2Nock5Db21wYXJlIik7Ci0KLSAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgewotICAgICAgICAqcGkzMl9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGxlbmd0aDEgPiBsZW5ndGgyKQotICAgIHsKLSAgICAgICAgKnBpMzJfcmVzdWx0ID0gMSA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwaTMyX3Jlc3VsdCA9IC0xOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBhdXRob3IgICAgIE5pY29sYXMgU2FudGluaSAoUERTTC1QKQotICogQGF1dGhvciAgICAgSGlsYWlyZSBWZXJzY2h1ZXJlIChQRFNMLVApCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBzdHJfaW4KLSAqIEBwYXJhbQotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqIEBkYXRlICAgICAgIC0gMjAwMi0xMi0zMjogY3JlYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyKE00T1NBX1N0cmluZyBzdHJfaW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcGkzMl9yZXN1bHQpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjE7Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMiA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjI7Ci0gICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjE7Ci0gICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjI7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aDEsIGxlbmd0aDI7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDYXNlQ29tcGFyZVN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0IgotICAgICAgICAiTTRPU0FfVUludDMyICVkXHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHQiCi0gICAgICAgICJNNE9TQV9VSW50MzIqIDB4JXhcdE00T1NBX0ludDMyKiAweCV4Iiwgc3RyX2luMSwKLSAgICAgICAgdWkzMl9vZmZzZXQxLCBzdHJfaW4yLCB1aTMyX29mZnNldDIsICpwdWkzMl9udW0pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0cjIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcGkzMl9yZXN1bHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcHVpMzJfbnVtLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDYXNlQ29tcGFyZVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigqcHVpMzJfbnVtID09IDAsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfb2Zmc2V0MSA+PSBwU3RyMS0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfb2Zmc2V0MiA+PSBwU3RyMi0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNhc2VDb21wYXJlU3ViU3RyIik7Ci0KLQotICAgIGxlbmd0aDEgPSBwU3RyMS0+dWkzMl9sZW5ndGggLSB1aTMyX29mZnNldDE7Ci0gICAgbGVuZ3RoMiA9IHBTdHIyLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0MjsKLQotICAgIHBCdWZmZXIxID0gcFN0cjEtPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQxOwotICAgIHBCdWZmZXIyID0gcFN0cjItPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQyOwotCi0gICAgaWYobGVuZ3RoMSA8ICpwdWkzMl9udW0pCi0gICAgewotICAgICAgICAqcHVpMzJfbnVtID0gbGVuZ3RoMTsKLQotICAgICAgICBlcnJfY29kZSA9IE00V0FSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0KLSAgICBpZihsZW5ndGgyIDwgKnB1aTMyX251bSkKLSAgICB7Ci0gICAgICAgICpwdWkzMl9udW0gPSBsZW5ndGgyOwotCi0gICAgICAgIGVycl9jb2RlID0gTTRXQVJfU1RSX09WRVJGTE9XOwotICAgIH0KLQotICAgIE00T1NBX2Nock5Db21wYXJlKHBCdWZmZXIxLCBwQnVmZmVyMiwgKnB1aTMyX251bSwgcGkzMl9yZXN1bHQpOwotCi0gICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJTcGFuKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3BvcykKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyU3Bhblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciogMHgleFx0IgotICAgICAgICAiTTRPU0FfVUludDMyKiAweCV4Iiwgc3RyX2luLCBjaGFyc2V0LCBwdWkzMl9wb3MpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU3BhbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNoYXJzZXQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwYW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwYW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbiIpOwotCi0gICAgcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbiA7Ci0KLSAgICBpZigqcHVpMzJfcG9zID49IHBTdHItPnVpMzJfbGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0KLSAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXIgKyAqcHVpMzJfcG9zOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJTcGFuKHBCdWZmZXIsIGNoYXJzZXQsICZ1aTMyX2xlbmd0aCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX0VSUilNNEVSUl9QQVJBTUVURVIgPT0gZXJyX2NvZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTcGFuOiBNNE9TQV9jaHJTcGFuIik7Ci0KLSAgICAqcHVpMzJfcG9zICs9IHVpMzJfbGVuZ3RoOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNwYW5Db21wbGVtZW50KE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0VSUiBlcnJfY29kZTsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqICIKLSAgICAgICAgIjB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbiwgY2hhcnNldCwgcHVpMzJfcG9zKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY2hhcnNldCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3BhbkNvbXBsZW1lbnQiKTsKLQotICAgIGlmKCpwdWkzMl9wb3MgPj0gcFN0ci0+dWkzMl9sZW5ndGgpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RSX09WRVJGTE9XOwotICAgIH0KLQotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyU3BhbkNvbXBsZW1lbnQocFN0ci0+cHVpOF9idWZmZXIgKyAqcHVpMzJfcG9zLAotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0LCAmdWkzMl9sZW5ndGgpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9FUlIpTTRFUlJfUEFSQU1FVEVSID09IGVycl9jb2RlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00T1NBX3N0clNwYW5Db21wbGVtZW50OiBNNE9TQV9jaHJTcGFuQ29tcGxlbWVudCIpOwotCi0gICAgaWYoTTRXQVJfQ0hSX05PVF9GT1VORCA9PSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgICpwdWkzMl9wb3MgKz0gdWkzMl9sZW5ndGg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyRmluZEZpcnN0Q2hhcihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9DaGFyIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHB1aTMyX3BvcykKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjsKLSAgICBNNE9TQV9DaGFyKiBwY2hhcjsKLSAgICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhclx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciIKLSAgICAgICAgIiAweCV4XHRNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIGMsIHB1aTMyX3Bvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRGaXJzdENoYXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOwotCi0gICAgaWYoKnB1aTMyX3BvcyA+PSBwU3RyLT51aTMyX2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgcEJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyICsgKnB1aTMyX3BvczsKLQotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZENoYXIocEJ1ZmZlciwgYywgJnBjaGFyKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyRmluZEZpcnN0Q2hhciIpOwotCi0gICAgaWYoTTRXQVJfQ0hSX05PVF9GT1VORCA9PSBlcnJfY29kZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgICpwdWkzMl9wb3MgPSBwY2hhciAtIHBTdHItPnB1aThfYnVmZmVyOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRMYXN0Q2hhcihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9DaGFyIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRMYXN0Q2hhclx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciIKLSAgICAgICAgIiAweCV4XHRNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIGMsIHB1aTMyX3Bvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsIk00T1NBX3N0ckZpbmRMYXN0Q2hhciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdENoYXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRMYXN0Q2hhciIpOwotCi0gICAgaWYoKnB1aTMyX3BvcyA+IHBTdHItPnVpMzJfbGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0KLSAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICBmb3IoaT0oKnB1aTMyX3Bvcyk7IGkhPTA7IGktLSkKLSAgICB7Ci0gICAgICAgIGlmKHBCdWZmZXJbaV0gPT0gYykKLSAgICAgICAgewotICAgICAgICAgICAgKnB1aTMyX3BvcyA9IGk7Ci0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckZpbmRGaXJzdFN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcHVpMzJfcG9zKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0cjEgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW4xOwotICAgIE00T1NBX3N0clN0cnVjdCogcFN0cjIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW4yOwotICAgIE00T1NBX0NoYXIqIHBSZXN1bHQ7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRGaXJzdFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgotICAgICAgICAiIDB4JXhcdE00T1NBX1VJbnQzMiogMHgleCIsIHN0cl9pbjEsIHN0cl9pbjIsIHB1aTMyX3Bvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kRmlyc3RTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kRmlyc3RTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwdWkzMl9wb3MsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZEZpcnN0U3ViU3RyIik7Ci0KLSAgICBpZigqcHVpMzJfcG9zID49IHBTdHIxLT51aTMyX2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgaWYocFN0cjItPnVpMzJfbGVuZ3RoID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKHBTdHIxLT5wdWk4X2J1ZmZlciArICgqcHVpMzJfcG9zKSwKLSAgICAgICAgICAgICAgICBwU3RyMi0+cHVpOF9idWZmZXIsICZwUmVzdWx0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfRVJSKU00RVJSX1BBUkFNRVRFUiA9PSBlcnJfY29kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckZpbmRGaXJzdFN1YlN0cjogTTRPU0FfY2hyRmluZFBhdHRlcm4iKTsKLQotICAgIGlmKE00V0FSX0NIUl9OT1RfRk9VTkQgPT0gZXJyX2NvZGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAqcHVpMzJfcG9zID0gcFJlc3VsdCAtIHBTdHIxLT5wdWk4X2J1ZmZlcjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJGaW5kTGFzdFN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luMSwgTTRPU0FfU3RyaW5nIHN0cl9pbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwdWkzMl9wb3MpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjE7Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMiA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjI7Ci0gICAgTTRPU0FfSW50MzIgaTMyX3Jlc3VsdDsKLQotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckZpbmRMYXN0U3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9TdHJpbmciCi0gICAgICAgICIgMHgleFx0TTRPU0FfVUludDMyKiAweCV4Iiwgc3RyX2luMSwgc3RyX2luMiwgcHVpMzJfcG9zKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdFN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIyLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJGaW5kTGFzdFN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHB1aTMyX3BvcywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHIxLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHIyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyRmluZExhc3RTdWJTdHIiKTsKLQotICAgIGlmKCpwdWkzMl9wb3MgPiBwU3RyMS0+dWkzMl9sZW5ndGgpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RSX09WRVJGTE9XOwotICAgIH0KLQotICAgIGlmKChwU3RyMi0+dWkzMl9sZW5ndGggPT0gMCkgfHwgKHBTdHIxLT51aTMyX2xlbmd0aCA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGkzMl9yZXN1bHQgPSBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIocFN0cjEsIHBTdHIyLCAqcHVpMzJfcG9zKTsKLQotICAgIGlmKGkzMl9yZXN1bHQgPCAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgKnB1aTMyX3BvcyA9IGkzMl9yZXN1bHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyVHJ1bmNhdGUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJUcm9uY2F0ZVx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgc3RyX2luLCB1aTMyX2xlbmd0aCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJUcm9uY2F0ZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clRyb25jYXRlIik7Ci0KLSAgICBpZih1aTMyX2xlbmd0aCA+PSBwU3RyLT51aTMyX2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgcFN0ci0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKLQotICAgIGlmKHBTdHItPnB1aThfYnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBwU3RyLT5wdWk4X2J1ZmZlclt1aTMyX2xlbmd0aF0gPSAnXDAnOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyQ29weShNNE9TQV9TdHJpbmcgc3RyX291dCwgTTRPU0FfU3RyaW5nIHN0cl9pbikKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBJc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX3N0clN0cnVjdCogcE9zdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfb3V0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0ckNvcHlcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1N0cmluZyAweCV4IiwKLSAgICAgICAgc3RyX2luLCBzdHJfb3V0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBJc3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0ckNvcHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBJc3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBPc3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHkiKTsKLQotICAgIHJldHVybiBNNE9TQV9zdHJQcml2U2V0KHBPc3RyLCBwSXN0ci0+cHVpOF9idWZmZXIsIHBJc3RyLT51aTMyX2xlbmd0aCk7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckNvcHlTdWJTdHIoTTRPU0FfU3RyaW5nIHN0cl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiB1aTMyX251bSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QgKnBJc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX3N0clN0cnVjdCAqcE9zdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfb3V0OwotICAgIE00T1NBX0VSUiBlcnJfY29kZSA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoLCBvbGVuZ3RoOwotICAgIE00T1NBX0NoYXIqIHBTcmM7Ci0gICAgTTRPU0FfQ2hhciogcERlc3Q7Ci0KLQotICAgIE00T1NBX1RSQUNFMV81KCJNNE9TQV9zdHJDb3B5U3ViU3RyXHRcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWQiCi0gICAgICAgICJcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9VSW50MzIgJWRcdE00T1NBX1VJbnQzMiogJTB4JXgiLAotICAgICAgICBzdHJfb3V0LCBzdHJfaW4sIHN0cl9vdXQsIHVpMzJfcG9zLCB1aTMyX251bSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSXN0ciwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29weVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPc3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCp1aTMyX251bSA9PSAwLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwT3N0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSXN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHVpMzJfcG9zID4gcE9zdHItPnVpMzJfbGVuZ3RoLCBNNEVSUl9TVFJfT1ZFUkZMT1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29weVN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX29mZnNldCA+IHBJc3RyLT51aTMyX2xlbmd0aCwgTTRFUlJfU1RSX09WRVJGTE9XLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckNvcHlTdWJTdHIiKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGVyZSBpcyBlbm91Z2ggY2hhciBpbiBzdHJfaW4gYWZ0ZXIgdWkzMl9vZmZzZXQgKi8KLSAgICB1aTMyX2xlbmd0aCA9IHBJc3RyLT51aTMyX2xlbmd0aCAtIHVpMzJfb2Zmc2V0OwotCi0gICAgaWYoKnVpMzJfbnVtID4gdWkzMl9sZW5ndGgpCi0gICAgewotICAgICAgICAqdWkzMl9udW0gPSB1aTMyX2xlbmd0aDsKLQotICAgICAgICBlcnJfY29kZSA9IE00V0FSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIGZ1dHVyZSBsZW5ndGggb2Ygc3RyMiAqLwotICAgIHVpMzJfbGVuZ3RoID0gdWkzMl9wb3MgKyAqdWkzMl9udW07Ci0KLSAgICBvbGVuZ3RoID0gcE9zdHItPnVpMzJfbGVuZ3RoOwotCi0gICAgaWYodWkzMl9sZW5ndGggPj0gb2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIG9sZW5ndGggPSB1aTMyX2xlbmd0aDsKLSAgICB9Ci0KLSAgICAvKiBSZWFsbG9jYXRpb24gaWYgbmVlZGVkICovCi0gICAgaWYoTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBPc3RyLCBvbGVuZ3RoKSAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJDb3B5U3ViU3RyIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBTcmMgID0gcElzdHItPnB1aThfYnVmZmVyICsgdWkzMl9vZmZzZXQ7Ci0gICAgcERlc3QgPSBwT3N0ci0+cHVpOF9idWZmZXIgKyB1aTMyX3BvczsKLQotICAgIE00T1NBX21lbWNweShwRGVzdCwgcFNyYywgKnVpMzJfbnVtKTsKLQotICAgIHBPc3RyLT51aTMyX2xlbmd0aCA9IG9sZW5ndGg7Ci0gICAgcE9zdHItPnB1aThfYnVmZmVyW3BPc3RyLT51aTMyX2xlbmd0aF0gPSAnXDAnOwotCi0gICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJDb25jYXQoTTRPU0FfU3RyaW5nIHN0cl9maXJzdCwgTTRPU0FfU3RyaW5nIHN0cl9zZWNvbmQpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyMSA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9maXJzdDsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX3NlY29uZDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGg7Ci0gICAgTTRPU0FfQ2hhciogcEJ1ZmZlcjsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zdHJDb25jYXRcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX1N0cmluZyAweCV4IiwKLSAgICAgICAgc3RyX2ZpcnN0LCBzdHJfc2Vjb25kKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIxLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJDb25jYXQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyMiwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyQ29uY2F0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29uY2F0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyMi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyQ29uY2F0Iik7Ci0KLSAgICBpZihwU3RyMi0+dWkzMl9sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIHVpMzJfbGVuZ3RoID0gcFN0cjEtPnVpMzJfbGVuZ3RoICsgcFN0cjItPnVpMzJfbGVuZ3RoOwotCi0gICAgaWYoTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBTdHIxLCB1aTMyX2xlbmd0aCkgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyQ29uY2F0Iik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBCdWZmZXIgPSBwU3RyMS0+cHVpOF9idWZmZXIgKyBwU3RyMS0+dWkzMl9sZW5ndGg7Ci0KLSAgICAvKiBGaWxsIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KLSAgICBNNE9TQV9tZW1jcHkocEJ1ZmZlciwgcFN0cjItPnB1aThfYnVmZmVyLCBwU3RyMi0+dWkzMl9sZW5ndGgrMSk7Ci0KLSAgICBwU3RyMS0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJJbnNlcnRTdWJTdHIoTTRPU0FfU3RyaW5nIHN0cl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfU3RyaW5nIHN0cl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHVpMzJfbnVtKQotewotICAgIE00T1NBX3N0clN0cnVjdCAqcElzdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0Ffc3RyU3RydWN0ICpwT3N0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9vdXQ7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlLCByZXR1cm5fY29kZSA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotCi0gICAgTTRPU0FfVFJBQ0UxXzUoIk00T1NBX3N0ckluc2VydFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkIgotICAgICAgICAiXHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHRNNE9TQV9VSW50MzIqICUweCV4IiwKLSAgICAgICAgc3RyX291dCwgc3RyX2luLCBzdHJfb3V0LCB1aTMyX3BvcywgdWkzMl9udW0pOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcElzdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gdWkzMl9udW0sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCp1aTMyX251bSA9PSAwLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcElzdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcE9zdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckluc2VydFN1YlN0ciIpOwotICAgIE00T1NBX0RFQlVHX0lGMih1aTMyX3BvcyA+IHBPc3RyLT51aTMyX2xlbmd0aCwgTTRFUlJfU1RSX09WRVJGTE9XLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJJbnNlcnRTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIodWkzMl9vZmZzZXQgPiBwSXN0ci0+dWkzMl9sZW5ndGgsIE00RVJSX1NUUl9PVkVSRkxPVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlcmUgaXMgZW5vdWdoIGNoYXIgaW4gc3RyX2luIGFmdGVyIHVpMzJfb2Zmc2V0ICovCi0gICAgdWkzMl9sZW5ndGggPSBwSXN0ci0+dWkzMl9sZW5ndGggLSB1aTMyX29mZnNldDsKLQotICAgIGlmKCp1aTMyX251bSA+IHVpMzJfbGVuZ3RoKQotICAgIHsKLSAgICAgICAgKnVpMzJfbnVtID0gdWkzMl9sZW5ndGg7Ci0KLSAgICAgICAgcmV0dXJuX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihwT3N0ciwgdWkzMl9wb3MsIDAsCi0gICAgICAgIHBJc3RyLT5wdWk4X2J1ZmZlciArIHVpMzJfb2Zmc2V0LCAqdWkzMl9udW0pOwotCi0gICAgaWYoZXJyX2NvZGUgPT0gKE00T1NBX0VSUilNNEVSUl9BTExPQykKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RySW5zZXJ0U3ViU3RyIik7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5fY29kZTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyRGVsU3ViU3RyKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX1VJbnQzMiB1aTMyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiB1aTMyX251bSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoOwotICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckRlbFN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfVUludDMyICVkXHQiCi0gICAgICAgICJNNE9TQV9VSW50MzIqIDB4JXgiLCBzdHJfaW4sIHVpMzJfb2Zmc2V0LCB1aTMyX251bSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zdHJEZWxTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSB1aTMyX251bSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJEZWxTdWJTdHIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckRlbFN1YlN0ciIpOwotCi0gICAgcEJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyOwotCi0gICAgdWkzMl9sZW5ndGggPSBwU3RyLT51aTMyX2xlbmd0aCA7Ci0KLSAgICBpZih1aTMyX29mZnNldCA+PSB1aTMyX2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgdWkzMl9sZW5ndGggLT0gdWkzMl9vZmZzZXQ7Ci0KLSAgICBpZigqdWkzMl9udW0gPj0gdWkzMl9sZW5ndGgpCi0gICAgewotICAgICAgICAqdWkzMl9udW0gPSB1aTMyX2xlbmd0aDsKLQotICAgICAgICBwU3RyLT51aTMyX2xlbmd0aCAtPSB1aTMyX2xlbmd0aDsKLQotICAgICAgICBwQnVmZmVyW3BTdHItPnVpMzJfbGVuZ3RoXSA9ICdcMCc7Ci0KLSAgICAgICAgZXJyX2NvZGUgPSBNNFdBUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIocFN0ciwgdWkzMl9vZmZzZXQsICp1aTMyX251bSwKLSAgICAgICAgICAgIE00T1NBX05VTEwsIDApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJfY29kZTsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUmVwbGFjZVN1YlN0cihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9TdHJpbmcgc3RyX29sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfbmV3LCBNNE9TQV9zdHJNb2RlIG1vZGUpCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwSXN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBPc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX29sZDsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBOc3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX25ldzsKLSAgICBNNE9TQV9VSW50MzIgb2xlbmd0aCwgbmxlbmd0aCwgaWxlbmd0aDsKLSAgICBNNE9TQV9Cb29sIG9zdHIyZnJlZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgbnN0cjJmcmVlID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0Ffc3RyUmVwbGFjZVN1YlN0clx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nICIKLSAgICAgICAgIjB4JXhcdE00T1NBX1N0cmluZyAweCV4XHRNNE9TQV9zdHJTdXBwck1vZGUgJWQiLAotICAgICAgICBzdHJfaW4sIHN0cl9vbGQsIHN0cl9uZXcsIG1vZGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcElzdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE9zdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcE5zdHIsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChtb2RlICE9IE00T1NBX2tzdHJBbGwpICYmIChtb2RlICE9IE00T1NBX2tzdHJFbmQpCi0gICAgICAgICYmIChtb2RlICE9IE00T1NBX2tzdHJCZWdpbiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSXN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwT3N0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwTnN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJSZXBsYWNlU3ViU3RyIik7Ci0KLSAgICBvbGVuZ3RoID0gcE9zdHItPnVpMzJfbGVuZ3RoOwotICAgIG5sZW5ndGggPSBwTnN0ci0+dWkzMl9sZW5ndGg7Ci0gICAgaWxlbmd0aCA9IHBJc3RyLT51aTMyX2xlbmd0aDsKLQotICAgIGlmKChvbGVuZ3RoID09IDApIHx8IChpbGVuZ3RoID09IDApIHx8IChvbGVuZ3RoID4gaWxlbmd0aCkpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNFdBUl9TVFJfTk9UX0ZPVU5ELCAiTTRPU0Ffc3RyUmVwbGFjZVN1YlN0ciIpOwotCi0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGlmKHBJc3RyID09IHBPc3RyKQotICAgIHsKLSAgICAgICAgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSgmcE9zdHIsIHBJc3RyKTsKLQotICAgICAgICBvc3RyMmZyZWUgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGlmKHBJc3RyID09IHBOc3RyKQotICAgIHsKLSAgICAgICAgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZSgmcE5zdHIsIHBJc3RyKTsKLQotICAgICAgICBuc3RyMmZyZWUgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGlmKG5sZW5ndGggPT0gb2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0cihwSXN0ciwgcE9zdHIsIHBOc3RyLCBtb2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZihubGVuZ3RoIDwgb2xlbmd0aCkKLSAgICB7Ci0gICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyKHBJc3RyLCBwT3N0ciwgcE5zdHIsIG1vZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJfY29kZSA9IE00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyKHBJc3RyLCBwT3N0ciwgcE5zdHIsIG1vZGUpOwotICAgIH0KLQotICAgIGlmKG9zdHIyZnJlZSA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBPc3RyLT5wdWk4X2J1ZmZlcik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwT3N0cik7Ci0gICAgfQotCi0gICAgaWYobnN0cjJmcmVlID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcE5zdHItPnB1aThfYnVmZmVyKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBOc3RyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyX2NvZGU7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckdldEZpcnN0VG9rZW4oTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfU3RyaW5nIHN0cl90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1N0cmluZyBzdHJfZGVsaW0pCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwSW4gPSAgICAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwVG9rZW4gPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfdG9rZW47Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwRGVsaW0gPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfZGVsaW07Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aF90b2tlbiwgbGVuZ3RoX2RlbGltOwotICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7Ci0gICAgTTRPU0FfQ2hhciogcGNoYXI7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgotICAgICAgICAiIDB4JXhcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luLCBzdHJfdG9rZW4sIHN0cl9kZWxpbSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW4sIE00RVJSX1BBUkFNRVRFUiwiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUb2tlbiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRGVsaW0sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwSW4tPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFRva2VuLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBEZWxpbS0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7Ci0KLSAgICBsZW5ndGhfZGVsaW0gPSBwRGVsaW0tPnVpMzJfbGVuZ3RoOwotCi0gICAgaWYocERlbGltLT51aTMyX2xlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldEZpcnN0VG9rZW4iKTsKLQotICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICBwQnVmZmVyID0gcEluLT5wdWk4X2J1ZmZlcjsKLQotICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4ocEJ1ZmZlcixwRGVsaW0tPnB1aThfYnVmZmVyLCAmcGNoYXIpOwotCi0gICAgaWYoZXJyX2NvZGUgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00V0FSX1NUUl9OT1RfRk9VTkQsICJNNE9TQV9zdHJHZXRGaXJzdFRva2VuIik7Ci0KLSAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgbGVuZ3RoX3Rva2VuID0gcGNoYXIgLSBwQnVmZmVyOwotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0KHBUb2tlbiwgcEJ1ZmZlciwgbGVuZ3RoX3Rva2VuKTsKLQotICAgIGlmKGVycl9jb2RlID09IChNNE9TQV9FUlIpTTRFUlJfQUxMT0MpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3N0ckdldEZpcnN0VG9rZW46IE00T1NBX3N0clByaXZTZXQiKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihwSW4sIDAsIGxlbmd0aF90b2tlbiArIGxlbmd0aF9kZWxpbSwKLSAgICAgICAgTTRPU0FfTlVMTCwgMCk7Ci0KLSAgICBpZihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX0FMTE9DKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsCi0gICAgICAgICAgICAiTTRPU0Ffc3RyR2V0Rmlyc3RUb2tlbjogTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0ckdldExhc3RUb2tlbihNNE9TQV9TdHJpbmcgc3RyX2luLCBNNE9TQV9TdHJpbmcgc3RyX3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TdHJpbmcgc3RyX2RlbGltKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcEluID0gICAgKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX3N0clN0cnVjdCogcFRva2VuID0gKE00T1NBX3N0clN0cnVjdCopc3RyX3Rva2VuOwotICAgIE00T1NBX3N0clN0cnVjdCogcERlbGltID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2RlbGltOwotICAgIE00T1NBX1VJbnQzMiBpbl9sZW5ndGgsIHRva2VuX2xlbmd0aCwgZGVsaW1fbGVuZ3RoOwotICAgIE00T1NBX0NoYXIqIHBJbl9idWZmZXI7Ci0gICAgTTRPU0FfQ2hhciogcFRva2VuX2J1ZmZlcjsKLSAgICBNNE9TQV9JbnQzMiBkZWxpbV9wb3M7Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3N0ckdldExhc3RUb2tlblx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfU3RyaW5nIgotICAgICAgICAiIDB4JXhcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luLCBzdHJfdG9rZW4sIHN0cl9kZWxpbSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwSW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFRva2VuLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBEZWxpbSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRMYXN0VG9rZW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBJbi0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwVG9rZW4tPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcERlbGltLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJHZXRMYXN0VG9rZW4iKTsKLQotICAgIGluX2xlbmd0aCA9IHBJbi0+dWkzMl9sZW5ndGg7Ci0gICAgZGVsaW1fbGVuZ3RoID0gcERlbGltLT51aTMyX2xlbmd0aDsKLSAgICBwSW5fYnVmZmVyID0gcEluLT5wdWk4X2J1ZmZlcjsKLQotICAgIGlmKHBEZWxpbS0+dWkzMl9sZW5ndGggPiBwSW4tPnVpMzJfbGVuZ3RoKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOwotCi0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGRlbGltX3BvcyA9IE00T1NBX3N0clByaXZGaW5kTGFzdFN1YlN0cihwSW4sIHBEZWxpbSwgaW5fbGVuZ3RoLWRlbGltX2xlbmd0aCk7Ci0KLSAgICBpZihkZWxpbV9wb3MgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRXQVJfU1RSX05PVF9GT1VORCwgIk00T1NBX3N0ckdldExhc3RUb2tlbiIpOwotCi0gICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIHBUb2tlbl9idWZmZXIgPSBwSW5fYnVmZmVyICsgZGVsaW1fcG9zICsgZGVsaW1fbGVuZ3RoOwotICAgIHRva2VuX2xlbmd0aCA9IGluX2xlbmd0aCAtIGRlbGltX3BvcyArIGRlbGltX2xlbmd0aDsKLQotICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlNldChzdHJfdG9rZW4sIHBUb2tlbl9idWZmZXIsIHRva2VuX2xlbmd0aCk7Ci0KLSAgICBpZihlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX0FMTE9DKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsCi0gICAgICAgICAgICAiTTRPU0Ffc3RyR2V0TGFzdFRva2VuOiBNNE9TQV9zdHJQcml2U2V0Iik7Ci0KLSAgICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgIH0KLQotICAgIHBJbl9idWZmZXJbZGVsaW1fcG9zXSA9ICdcMCc7Ci0KLSAgICBwSW4tPnVpMzJfbGVuZ3RoID0gZGVsaW1fcG9zOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0clNldFVwcGVyQ2FzZShNNE9TQV9TdHJpbmcgc3RyX2luKQotewotICAgIE00T1NBX3N0clN0cnVjdCogcFN0ciA9IChNNE9TQV9zdHJTdHJ1Y3QqKXN0cl9pbjsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOwotICAgIE00T1NBX0NoYXIqIHBjaGFyOwotCi0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc3RyU2V0VXBwZXJDYXNlXHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldFVwcGVyQ2FzZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0VXBwZXJDYXNlIik7Ci0KLSAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICBmb3IocGNoYXI9cEJ1ZmZlcjsgcGNoYXIhPShwQnVmZmVyK3BTdHItPnVpMzJfbGVuZ3RoKTsgcGNoYXIrKykKLSAgICB7Ci0gICAgICAgICpwY2hhciA9IE00T1NBX2NoclRvVXBwZXIoKnBjaGFyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0TG93ZXJDYXNlKE00T1NBX1N0cmluZyBzdHJfaW4pCi17Ci0gICAgTTRPU0Ffc3RyU3RydWN0KiBwU3RyID0gKE00T1NBX3N0clN0cnVjdCopc3RyX2luOwotICAgIE00T1NBX0NoYXIqIHBCdWZmZXI7Ci0gICAgTTRPU0FfQ2hhciogcGNoYXI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc3RyU2V0TG93ZXJDYXNlXHRcdE00T1NBX1N0cmluZyAweCV4Iiwgc3RyX2luKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldExvd2VyQ2FzZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9TVFJJTkcgIT0gcFN0ci0+Y29yZUlELCBNNEVSUl9TVFJfQkFEX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0TG93ZXJDYXNlIik7Ci0KLSAgICBwQnVmZmVyID0gcFN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICBmb3IocGNoYXI9cEJ1ZmZlcjsgcGNoYXIhPShwQnVmZmVyK3BTdHItPnVpMzJfbGVuZ3RoKTsgcGNoYXIrKykKLSAgICB7Ci0gICAgICAgICpwY2hhciA9IE00T1NBX2NoclRvTG93ZXIoKnBjaGFyKTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNE9TQV9zdHJTcHJpbnRmKE00T1NBX1N0cmluZyBzdHJfaW4sIE00T1NBX0NoYXIqIHBGb3JtYXQsIC4uLikKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfRVJSIGVycl9jb2RlID0gTTRFUlJfU1RSX09WRVJGTE9XOwotICAgIE00T1NBX1VJbnQzMiB1aTMyX3NpemU7Ci0gICAgdmFfbGlzdCBhcmdzOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNwcmludGZcdFx0TTRPU0FfU3RyaW5nIDB4JXhcdE00T1NBX0NoYXIqIDB4JXgiLAotICAgICAgICBzdHJfaW4sIHBGb3JtYXQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc3RyU3ByaW50ZiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNwcmludGYiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfU1RSSU5HICE9IHBTdHItPmNvcmVJRCwgTTRFUlJfU1RSX0JBRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clNldExvd2VyQ2FzZSIpOwotCi0gICAgdWkzMl9zaXplID0gcFN0ci0+dWkzMl9sZW5ndGggKyAoTTRPU0FfVUludDMyKSgxLjUgKiBNNE9TQV9jaHJMZW5ndGgocEZvcm1hdCkpOwotCi0gICAgdmFfc3RhcnQoYXJncywgcEZvcm1hdCk7Ci0KLSAgICB3aGlsZShlcnJfY29kZSA9PSAoTTRPU0FfRVJSKU00RVJSX1NUUl9PVkVSRkxPVykKLSAgICB7Ci0gICAgICAgIGVycl9jb2RlID0gTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KHBTdHIsIHVpMzJfc2l6ZSk7Ci0KLSAgICAgICAgaWYoZXJyX2NvZGUgPT0gKE00T1NBX0VSUilNNEVSUl9BTExPQykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zdHJTcHJpbnRmIik7Ci0KLSAgICAgICAgICAgIHZhX2VuZChhcmdzKTsKLQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgdWkzMl9zaXplICo9IDI7Ci0KLSAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U1ByaW50ZihwU3RyLCBwRm9ybWF0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICB2YV9lbmQoYXJncyk7Ci0KLSAgICBwU3RyLT51aTMyX2xlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwU3RyLT5wdWk4X2J1ZmZlcik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyU2V0TWluQWxsb2NhdGlvblNpemUoTTRPU0FfU3RyaW5nIHN0cl9pbiwgTTRPU0FfVUludDMyIHVpMzJfbmV3c2l6ZSkKLXsKLSAgICBNNE9TQV9zdHJTdHJ1Y3QqIHBTdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilzdHJfaW47Ci0gICAgTTRPU0FfVUludDMyIHVpMzJfc2l6ZTsKLSAgICBNNE9TQV9DaGFyKiBwQnVmZmVyOwotICAgIE00T1NBX0NoYXIqIHBJYnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3N0clNldE1pbkFsbG9jYXRpb25TaXplXHRcdE00T1NBX1N0cmluZyAweCV4XHQiCi0gICAgICAgICJNNE9TQV9JbnQzMiAlZCIsIHN0cl9pbiwgdWkzMl9uZXdzaXplKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHIsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3N0clNldEludDMyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX1NUUklORyAhPSBwU3RyLT5jb3JlSUQsIE00RVJSX1NUUl9CQURfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU2V0SW50MzIiKTsKLQotICAgIHVpMzJfc2l6ZSA9IHBTdHItPnVpMzJfc2l6ZTsKLSAgICBwSWJ1ZmZlciA9IHBTdHItPnB1aThfYnVmZmVyOwotCi0gICAgaWYodWkzMl9uZXdzaXplID4gdWkzMl9zaXplKQotICAgIHsKLSAgICAgICAgdWkzMl9zaXplID0gdWkzMl9uZXdzaXplICsgKCg0IC0gKHVpMzJfbmV3c2l6ZSAlIDQpKSAlIDQpOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KLSAgICBwQnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX3NpemUgKiBzaXplb2YoTTRPU0FfQ2hhciksCi0gICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJTZXRNaW5BbGxvY2F0aW9uU2l6ZSIpOwotCi0gICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKHBCdWZmZXIsICJNNE9TQV9zdHJTZXRNaW5BbGxvY2F0aW9uU2l6ZSIpOwotCi0gICAgaWYocElidWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX21lbWNweShwQnVmZmVyLCBwSWJ1ZmZlciwgcFN0ci0+dWkzMl9sZW5ndGgrMSk7Ci0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBJYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBwU3RyLT5wdWk4X2J1ZmZlciA9IHBCdWZmZXI7Ci0KLSAgICBwU3RyLT51aTMyX3NpemUgPSB1aTMyX3NpemU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU3RyaW5nX3ByaXYuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1N0cmluZ19wcml2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3Y2VmMzMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU3RyaW5nX3ByaXYuYworKysgL2Rldi9udWxsCkBAIC0xLDExMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TdHJpbmdfcHJpdi5jCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfU3RyaW5nX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9TdHJpbmcuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCi0gKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwc3RyX3NyYwotICogQHBhcmFtICAgICAgcGFjX2luCi0gKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlYWxsb2MoTTRPU0Ffc3RyU3RydWN0KiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoKQotewotICAgTTRPU0FfVUludDMyIHVpMzJfc2l6ZTsKLSAgIE00T1NBX0NoYXIqIGJ1ZmZlcjsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX3N0clByaXZSZWFsbG9jXHRcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1VJbnQzMiogJWQiLCBzdHIsIHVpMzJfbGVuZ3RoKTsKLQotICAgdWkzMl9zaXplID0gc3RyLT51aTMyX3NpemU7Ci0KLSAgIC8qIFJlYWxsb2MgaWYgc2l6ZSBpcyBub3Qgc3VmZmljaWVudCB0byBjb250YWluIGl0IGVudGlyZWx5ICovCi0gICBpZih1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCi0gICB7Ci0gICAgICBpZih1aTMyX3NpemUgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIHVpMzJfc2l6ZSA9IDE2OwotICAgICAgfQotCi0gICAgICB3aGlsZSh1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCi0gICAgICB7Ci0gICAgICAgICB1aTMyX3NpemUgPDw9IDE7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlciA9IHN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICAgIGlmKGJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgewotICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJ1ZmZlcik7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KLSAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWkzMl9zaXplICogc2l6ZW9mKE00T1NBX0NoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVhbGxvYyIpOwotCi0gICAgICAvKiBDaGVjayBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAqLwotICAgICAgaWYoYnVmZmVyID09IE00T1NBX05VTEwpCi0gICAgICB7Ci0gICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3N0clByaXZSZWFsbG9jIik7Ci0KLSAgICAgICAgIHN0ci0+cHVpOF9idWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgc3RyLT51aTMyX3NpemUgPSAwOwotICAgICAgICAgc3RyLT51aTMyX2xlbmd0aCA9IDA7Ci0KLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgc3RyLT5wdWk4X2J1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIHN0ci0+dWkzMl9zaXplID0gdWkzMl9zaXplOwotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCi0gKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwc3RyX3NyYwotICogQHBhcmFtICAgICAgcGFjX2luCi0gKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5KE00T1NBX3N0clN0cnVjdCogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgpCi17Ci0gICBNNE9TQV9VSW50MzIgdWkzMl9zaXplOwotICAgTTRPU0FfQ2hhciogYnVmZmVyOwotICAgTTRPU0FfQ2hhciogcHVpOF9idWZmZXI7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9zdHJQcml2UmVhbGxvY0NvcHlcdFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVUludDMyKiAlZCIsIHN0ciwgdWkzMl9sZW5ndGgpOwotCi0KLSAgIHVpMzJfc2l6ZSA9IHN0ci0+dWkzMl9zaXplOwotCi0gICAvKiBSZWFsbG9jIGlmIHNpemUgaXMgbm90IHN1ZmZpY2llbnQgdG8gY29udGFpbiBpdCBlbnRpcmVseSAqLwotICAgaWYodWkzMl9sZW5ndGggPj0gdWkzMl9zaXplKQotICAgewotICAgICAgaWYodWkzMl9zaXplID09IDApCi0gICAgICB7Ci0gICAgICAgICB1aTMyX3NpemUgPSAxNjsKLSAgICAgIH0KLQotICAgICAgd2hpbGUodWkzMl9sZW5ndGggPj0gdWkzMl9zaXplKQotICAgICAgewotICAgICAgICAgdWkzMl9zaXplIDw8PSAxOwotICAgICAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIE00T1NBX1N0cmluZyBjb250ZW50ICovCi0gICAgICBidWZmZXIgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKHVpMzJfc2l6ZSAqIHNpemVvZihNNE9TQV9DaGFyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5Iik7Ci0KLSAgICAgIC8qIENoZWNrIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yICovCi0gICAgICBpZihidWZmZXIgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyUHJpdlJlYWxsb2NDb3B5Iik7Ci0KLSAgICAgICAgIHN0ci0+cHVpOF9idWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgc3RyLT51aTMyX3NpemUgPSAwOwotICAgICAgICAgc3RyLT51aTMyX2xlbmd0aCA9IDA7Ci0KLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgcHVpOF9idWZmZXIgPSBzdHItPnB1aThfYnVmZmVyOwotCi0gICAgICBpZihwdWk4X2J1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgewotICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciwgcHVpOF9idWZmZXIsIHN0ci0+dWkzMl9sZW5ndGggKyAxKTsKLQotICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXB1aThfYnVmZmVyKTsKLSAgICAgIH0KLQotICAgICAgc3RyLT5wdWk4X2J1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIHN0ci0+dWkzMl9zaXplID0gdWkzMl9zaXplOwotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZShNNE9TQV9zdHJTdHJ1Y3QqKiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBpc3RyKQotewotICAgTTRPU0Ffc3RyU3RydWN0KiBzdHI7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9zdHJQcml2RHVwbGljYXRlXHRcdE00T1NBX3N0clN0cnVjdCoqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTdHJ1Y3QqKiAweCV4Iiwgb3N0ciwgaXN0cik7Ci0KLSAgIC8qIEFsbG9jYXRlIHRoZSBvdXRwdXQgTTRPU0FfU3RyaW5nICovCi0gICBzdHIgPSAoTTRPU0Ffc3RyU3RydWN0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX3N0clN0cnVjdCksIE00T1NBX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdkR1cGxpY2F0ZTogb3V0cHV0IHN0cmluZyIpOwotCi0gICAvKiBDaGVjayBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAqLwotICAgaWYoc3RyID09IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICAqb3N0ciA9IE00T1NBX05VTEwgOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX3N0clByaXZEdXBsaWNhdGUiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgfQotCi0gICBzdHItPmNvcmVJRCA9IE00T1NBX1NUUklORzsKLSAgIHN0ci0+cHVpOF9idWZmZXIgPSBNNE9TQV9OVUxMOwotICAgc3RyLT51aTMyX2xlbmd0aCA9IDA7Ci0gICBzdHItPnVpMzJfc2l6ZSA9IDA7Ci0KLSAgIGVycl9jb2RlID0gIE00T1NBX3N0clByaXZTZXQoc3RyLCBpc3RyLT5wdWk4X2J1ZmZlciwgaXN0ci0+dWkzMl9sZW5ndGgpOwotCi0gICBpZihlcnJfY29kZSAhPSBNNE5PX0VSUk9SKQotICAgewotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICAqb3N0ciA9IHN0cjsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhIHN0cmluZyBidWZmZXIgYnkgYSBuZXcgIkMtU3RyaW5nIgotICogICAgICAgICAgICAgYW5kIG1hbmFnZSBtZW1vcnkgaWYgbmVlZGVkCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcHN0cl9zcmMKLSAqIEBwYXJhbSAgICAgIHBhY19pbgotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlNldChNNE9TQV9zdHJTdHJ1Y3QqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBjaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfbGVuZ3RoKQotewotICAgTTRPU0FfVUludDMyIGxlbmd0aDsKLSAgIE00T1NBX0NoYXIqIGJ1ZmZlcjsKLQotICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX3N0clByaXZTZXRcdFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHRNNE9TQV9DaGFyKiAiCi0gICAgICAgICAgICAgICAgICAiMHgleFx0TTRPU0FfVUludDMyICVkIiwgc3RyLCBwY2hhciwgdWkzMl9sZW5ndGgpOwotCi0gICBpZih1aTMyX2xlbmd0aCAhPSAwKQotICAgewotICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBjaGFyKTsKLQotICAgICAgaWYobGVuZ3RoIDwgdWkzMl9sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgICB1aTMyX2xlbmd0aCA9IGxlbmd0aDsKLSAgICAgIH0KLQotICAgICAgaWYoTTRPU0Ffc3RyUHJpdlJlYWxsb2Moc3RyLCB1aTMyX2xlbmd0aCkgIT0gTTROT19FUlJPUikKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc3RyUHJpdlNldCIpOwotCi0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlciA9IHN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIGFjdHVhbCBNNE9TQV9TdHJpbmcgY29udGVudCAqLwotICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciwgcGNoYXIsIHVpMzJfbGVuZ3RoKTsKLQotICAgICAgYnVmZmVyW3VpMzJfbGVuZ3RoXSA9ICdcMCc7Ci0gICB9Ci0gICBlbHNlIGlmKHN0ci0+cHVpOF9idWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIHN0ci0+cHVpOF9idWZmZXJbMF0gPSAnXDAnOwotICAgfQotCi0gICBzdHItPnVpMzJfbGVuZ3RoID0gdWkzMl9sZW5ndGg7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzdHJpbmcgYnVmZmVyIGJ5IGEgbmV3ICJDLVN0cmluZyIKLSAqICAgICAgICAgICAgIGFuZCBtYW5hZ2UgbWVtb3J5IGlmIG5lZWRlZAotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIHBzdHJfc3JjCi0gKiBAcGFyYW0gICAgICBwYWNfaW4KLSAqIEByZXR1cm4gICAgIE00T1NBX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfSW50MzIgTTRPU0Ffc3RyUHJpdkZpbmRMYXN0U3ViU3RyKE00T1NBX3N0clN0cnVjdCogc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIHN0cjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpMzJfcG9zKQotewotICAgTTRPU0FfQ2hhciAqcGNoYXI7Ci0gICBNNE9TQV9DaGFyICpidWZmZXIxOwotICAgTTRPU0FfQ2hhciAqYnVmZmVyMjsKLSAgIE00T1NBX0ludDMyIGkzMl9yZXN1bHQ7Ci0gICBNNE9TQV9VSW50MzIgbGVuZ3RoMSwgbGVuZ3RoMjsKLSAgIE00T1NBX0ludDMyIGRpc3Q7Ci0KLSAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHJcdFx0TTRPU0Ffc3RyU3RydWN0KiAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyU3RydWN0KiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICAgICAgICAgICAgc3RyMSwgc3RyMiwgdWkzMl9wb3MpOwotCi0gICBsZW5ndGgxID0gc3RyMS0+dWkzMl9sZW5ndGg7Ci0gICBsZW5ndGgyID0gc3RyMi0+dWkzMl9sZW5ndGg7Ci0KLSAgIGlmKChsZW5ndGgxID09IDApIHx8IChsZW5ndGgyID09IDApKQotICAgewotICAgICAgcmV0dXJuIC0xOwotICAgfQotCi0gICBidWZmZXIxID0gc3RyMS0+cHVpOF9idWZmZXI7Ci0gICBidWZmZXIyID0gc3RyMi0+cHVpOF9idWZmZXI7Ci0KLSAgIGRpc3QgPSBsZW5ndGgxIC0gbGVuZ3RoMjsKLQotICAgaWYoZGlzdCA8IDApCi0gICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICB9Ci0KLSAgIGlmKChNNE9TQV9JbnQzMil1aTMyX3BvcyA+IGRpc3QpCi0gICB7Ci0gICAgICB1aTMyX3BvcyA9IGRpc3Q7Ci0gICB9Ci0KLSAgIGZvcihwY2hhciA9IGJ1ZmZlcjEgKyB1aTMyX3BvczsgcGNoYXIgIT0gYnVmZmVyMTsgcGNoYXItLSkKLSAgIHsKLSAgICAgIE00T1NBX2Nock5Db21wYXJlKHBjaGFyLCBidWZmZXIyLCBsZW5ndGgyLCAmaTMyX3Jlc3VsdCk7Ci0KLSAgICAgIGlmKGkzMl9yZXN1bHQgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBwY2hhciAtIGJ1ZmZlcjE7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiAtMTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCi0gKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwc3RyX3NyYwotICogQHBhcmFtICAgICAgcGFjX2luCi0gKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIoTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBuYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmxlbmd0aCkKLXsKLSAgIE00T1NBX0NoYXIqIGJ1ZmZlcjsKLSAgIE00T1NBX0NoYXIqIGlidWZmZXI7Ci0gICBNNE9TQV9VSW50MzIgdWkzMl9sZW5ndGgsIHVpMzJfc2l6ZSwgdWkzMl9sZW5kLCB1aTMyX3Bvc28sIHVpMzJfcG9zbjsKLQotICAgTTRPU0FfVFJBQ0UyXzUoIk00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyXHRcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1VJbnQzMiAlZFx0TTRPU0FfVUludDMyICVkXHRNNE9TQV9DaGFyKiAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVUludDMyICVkIiwgaXN0ciwgdWkzMl9wb3MsIG9sZW5ndGgsIG5idWZmLCBubGVuZ3RoKTsKLQotICAgdWkzMl9sZW5ndGggPSBpc3RyLT51aTMyX2xlbmd0aCAtIG9sZW5ndGggKyBubGVuZ3RoOwotCi0gICBpYnVmZmVyID0gaXN0ci0+cHVpOF9idWZmZXI7Ci0KLSAgIC8qIHN0cmluZyB0byByZXBsYWNlIGhhcyB0aGUgc2FtZSB0aGlzIHRoYXQgbmV3IHN0cmluZyAqLwotICAgaWYobmxlbmd0aCA9PSBvbGVuZ3RoKQotICAgewotICAgICAgaWYobmxlbmd0aCA9PSAwKQotICAgICAgewotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0KLSAgICAgIE00T1NBX21lbWNweShpYnVmZmVyICsgdWkzMl9wb3MsIG5idWZmLCBubGVuZ3RoKTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHVpMzJfbGVuZCA9IGlzdHItPnVpMzJfbGVuZ3RoIC0gdWkzMl9wb3MgLSBvbGVuZ3RoOwotICAgICAgdWkzMl9wb3NvID0gdWkzMl9wb3MgKyBvbGVuZ3RoOwotICAgICAgdWkzMl9wb3NuID0gdWkzMl9wb3MgKyBubGVuZ3RoOwotCi0gICAgICAvKiBzdHJpbmcgdG8gcmVwbGFjZSBpcyBiaWdnZXIgdGhhdCBuZXcgc3RyaW5nICovCi0gICAgICBpZihubGVuZ3RoIDwgb2xlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgIGlmKG5sZW5ndGggPiAwKQotICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyB1aTMyX3BvcywgbmJ1ZmYsIG5sZW5ndGgpOwotICAgICAgICAgfQotCi0gICAgICAgICBpZigob2xlbmd0aCAtIG5sZW5ndGgpID49IHVpMzJfbGVuZCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweShpYnVmZmVyICsgdWkzMl9wb3NuLCBpYnVmZmVyICsgdWkzMl9wb3NvLCB1aTMyX2xlbmQpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyID0gKE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyh1aTMyX2xlbmQgKiBzaXplb2YoTTRPU0FfQ2hhciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0ciIpOwotCi0gICAgICAgICAgICBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZmVyLCAiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweShidWZmZXIsIGlidWZmZXIgKyB1aTMyX3Bvc28sIHVpMzJfbGVuZCk7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoaWJ1ZmZlciArIHVpMzJfcG9zbiwgYnVmZmVyLCB1aTMyX2xlbmQpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJ1ZmZlcik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKiBzdHJpbmcgdG8gcmVwbGFjZSBpcyBzbWFsbGVyIHRoYXQgbmV3IHN0cmluZyAqLwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgdWkzMl9zaXplID0gaXN0ci0+dWkzMl9zaXplOwotCi0gICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBpbiBpc3RyICovCi0gICAgICAgICBpZih1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZih1aTMyX3NpemUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVpMzJfc2l6ZSA9IDE2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSh1aTMyX2xlbmd0aCA+PSB1aTMyX3NpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB1aTMyX3NpemUgPDw9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWkzMl9zaXplICogc2l6ZW9mKE00T1NBX0NoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKLQotICAgICAgICAgICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKGJ1ZmZlciwgIk00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyIik7Ci0KLSAgICAgICAgICAgIE00T1NBX21lbWNweShidWZmZXIsIGlidWZmZXIsIHVpMzJfcG9zKTsKLQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGJ1ZmZlciArIHVpMzJfcG9zLCBuYnVmZiwgbmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIE00T1NBX21lbWNweShidWZmZXIgKyB1aTMyX3Bvc24sIGlidWZmZXIgKyB1aTMyX3Bvc28sIHVpMzJfbGVuZCk7Ci0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilpYnVmZmVyKTsKLQotICAgICAgICAgICAgaXN0ci0+cHVpOF9idWZmZXIgPSBidWZmZXI7Ci0KLSAgICAgICAgICAgIGlzdHItPnVpMzJfc2l6ZSA9IHVpMzJfc2l6ZTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWkzMl9sZW5kICogc2l6ZW9mKE00T1NBX0NoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdlNldEFuZFJlcGxlY2VTdHIiKTsKLQotICAgICAgICAgICAgTTRPU0FfQ0hFQ0tfTUFMTE9DKGJ1ZmZlciwgIk00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyIik7Ci0KLSAgICAgICAgICAgIE00T1NBX21lbWNweShidWZmZXIsIGlidWZmZXIgKyB1aTMyX3Bvc28sIHVpMzJfbGVuZCk7Ci0KLSAgICAgICAgICAgIE00T1NBX21lbWNweShpYnVmZmVyICsgdWkzMl9wb3MsIG5idWZmLCBubGVuZ3RoKTsKLQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KGlidWZmZXIgKyB1aTMyX3Bvc24sIGJ1ZmZlciwgdWkzMl9sZW5kKTsKLQotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWJ1ZmZlcik7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLQotICAgaXN0ci0+cHVpOF9idWZmZXJbdWkzMl9sZW5ndGhdID0gJ1wwJzsKLQotICAgaXN0ci0+dWkzMl9sZW5ndGggPSB1aTMyX2xlbmd0aDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhIHN0cmluZyBidWZmZXIgYnkgYSBuZXcgIkMtU3RyaW5nIgotICogICAgICAgICAgICAgYW5kIG1hbmFnZSBtZW1vcnkgaWYgbmVlZGVkCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcHN0cl9zcmMKLSAqIEBwYXJhbSAgICAgIHBhY19pbgotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIoTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBvc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKQotewotICAgTTRPU0FfQ2hhciogaWJ1ZmZlcjsKLSAgIE00T1NBX0NoYXIqIG9idWZmZXI7Ci0gICBNNE9TQV9DaGFyKiBuYnVmZmVyOwotICAgTTRPU0FfQ2hhciogcHRyOwotICAgTTRPU0FfVUludDMyIGlsZW5ndGgsIG5sZW5ndGg7Ci0gICBNNE9TQV9JbnQzMiBpMzJfcG9zOwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTJfNCgiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0clx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ck1vZGUgJWQiLCBpc3RyLCBvc3RyLCBuc3RyLCBtb2RlKTsKLQotICAgaWJ1ZmZlciA9IGlzdHItPnB1aThfYnVmZmVyOwotICAgb2J1ZmZlciA9IG9zdHItPnB1aThfYnVmZmVyOwotICAgbmJ1ZmZlciA9IG5zdHItPnB1aThfYnVmZmVyOwotCi0gICBpbGVuZ3RoID0gaXN0ci0+dWkzMl9sZW5ndGg7Ci0gICBubGVuZ3RoID0gbnN0ci0+dWkzMl9sZW5ndGg7Ci0KLSAgIGlmKG1vZGUgIT0gTTRPU0Ffa3N0ckVuZCkKLSAgIHsKLSAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cik7Ci0KLSAgICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpLCBlcnJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0ciIpOwotCi0gICAgICBpZihlcnJfY29kZSA9PSBNNFdBUl9DSFJfTk9UX0ZPVU5EKQotICAgICAgewotICAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmKG1vZGUgPT0gTTRPU0Ffa3N0ckFsbCkKLSAgICAgIHsKLSAgICAgICAgIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkocHRyLCBuYnVmZmVyLCBubGVuZ3RoKTsKLQotICAgICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJGaW5kUGF0dGVybihwdHIrbmxlbmd0aCwgb2J1ZmZlciwgJnB0cik7Ci0KLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpLCBlcnJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTYW1lU2l6ZVN0ciIpOwotCi0gICAgICAgICB9IHdoaWxlKGVycl9jb2RlICE9IE00V0FSX0NIUl9OT1RfRk9VTkQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgTTRPU0FfbWVtY3B5KHB0ciwgbmJ1ZmZlciwgbmxlbmd0aCk7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBpMzJfcG9zID0gTTRPU0Ffc3RyUHJpdkZpbmRMYXN0U3ViU3RyKGlzdHIsIG9zdHIsIGlsZW5ndGgtMSk7Ci0KLSAgICAgIGlmKGkzMl9wb3MgPCAwKQotICAgICAgewotICAgICAgICAgcmV0dXJuIE00V0FSX1NUUl9OT1RfRk9VTkQ7Ci0gICAgICB9Ci0KLSAgICAgIE00T1NBX21lbWNweShpYnVmZmVyICsgaTMyX3BvcywgbmJ1ZmZlciwgbmxlbmd0aCk7Ci0gICB9Ci0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhIHN0cmluZyBidWZmZXIgYnkgYSBuZXcgIkMtU3RyaW5nIgotICogICAgICAgICAgICAgYW5kIG1hbmFnZSBtZW1vcnkgaWYgbmVlZGVkCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgcHN0cl9zcmMKLSAqIEBwYXJhbSAgICAgIHBhY19pbgotICogQHJldHVybiAgICAgTTRPU0FfRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0cihNNE9TQV9zdHJTdHJ1Y3QqIGlzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogb3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyU3RydWN0KiBuc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJNb2RlIG1vZGUpCi17Ci0gICBNNE9TQV9DaGFyKiBpYnVmZmVyOwotICAgTTRPU0FfQ2hhciogb2J1ZmZlcjsKLSAgIE00T1NBX0NoYXIqIG5idWZmZXI7Ci0gICBNNE9TQV9DaGFyKiBidWZmZXI7Ci0gICBNNE9TQV9DaGFyKiBwdHJfc3JjOwotICAgTTRPU0FfQ2hhciogcHRyX2Rlc3Q7Ci0gICBNNE9TQV9VSW50MzIgaWxlbmd0aCwgbmxlbmd0aCwgb2xlbmd0aCwgc2l6ZSwgbGVuZ3RoOwotICAgTTRPU0FfSW50MzIgaTMyX3BvczsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UyXzQoIk00T1NBX3N0clByaXZSZXBsYWNlU21hbGxlclN0clx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ck1vZGUgJWQiLCBpc3RyLCBvc3RyLCBuc3RyLCBtb2RlKTsKLQotICAgaWJ1ZmZlciA9IGlzdHItPnB1aThfYnVmZmVyOwotICAgb2J1ZmZlciA9IG9zdHItPnB1aThfYnVmZmVyOwotICAgbmJ1ZmZlciA9IG5zdHItPnB1aThfYnVmZmVyOwotCi0gICBpbGVuZ3RoID0gaXN0ci0+dWkzMl9sZW5ndGg7Ci0gICBvbGVuZ3RoID0gb3N0ci0+dWkzMl9sZW5ndGg7Ci0gICBubGVuZ3RoID0gbnN0ci0+dWkzMl9sZW5ndGg7Ci0KLSAgIGxlbmd0aCA9IGlsZW5ndGg7Ci0KLSAgIGlmKG1vZGUgPT0gTTRPU0Ffa3N0ckFsbCkKLSAgIHsKLSAgICAgIGVycl9jb2RlID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oaWJ1ZmZlciwgb2J1ZmZlciwgJnB0cl9zcmMpOwotCi0gICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIiKTsKLQotICAgICAgaWYoZXJyX2NvZGUgPT0gTTRXQVJfQ0hSX05PVF9GT1VORCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgICAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIE00T1NBX1N0cmluZyBjb250ZW50ICovCi0gICAgICBidWZmZXIgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKGlzdHItPnVpMzJfc2l6ZSAqIHNpemVvZihNNE9TQV9DaGFyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9TVFJJTkcsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyIik7Ci0KLSAgICAgIE00T1NBX0NIRUNLX01BTExPQyhidWZmZXIsICJNNE9TQV9zdHJQcml2UmVwbGFjZVNtYWxsZXJTdHIiKTsKLQotICAgICAgcHRyX2Rlc3QgPSBidWZmZXI7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgICBzaXplID0gKE00T1NBX1VJbnQzMilwdHJfc3JjIC0gKE00T1NBX1VJbnQzMilpYnVmZmVyOwotCi0gICAgICAgICBsZW5ndGggKz0gKG5sZW5ndGggLSBvbGVuZ3RoKTsKLQotICAgICAgICAgTTRPU0FfbWVtY3B5KHB0cl9kZXN0LCBpYnVmZmVyLCBzaXplKTsKLQotICAgICAgICAgcHRyX2Rlc3QgKz0gc2l6ZTsKLQotICAgICAgICAgTTRPU0FfbWVtY3B5KHB0cl9kZXN0LCBuYnVmZmVyLCBubGVuZ3RoKTsKLQotICAgICAgICAgcHRyX2Rlc3QgKz0gbmxlbmd0aDsKLQotICAgICAgICAgaWJ1ZmZlciArPSAoc2l6ZSArIG9sZW5ndGgpOwotCi0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKGlidWZmZXIsIG9idWZmZXIsICZwdHJfc3JjKTsKLQotICAgICAgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSksIGVycl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJQcml2UmVwbGFjZVNhbWVTaXplU3RyIik7Ci0KLSAgICAgIH0gd2hpbGUoZXJyX2NvZGUgIT0gTTRXQVJfQ0hSX05PVF9GT1VORCk7Ci0KLSAgICAgIHNpemUgPSBpbGVuZ3RoIC0gKE00T1NBX1VJbnQzMikoaWJ1ZmZlciAtIGlzdHItPnB1aThfYnVmZmVyKTsKLQotICAgICAgTTRPU0FfbWVtY3B5KHB0cl9kZXN0LCBpYnVmZmVyLCBzaXplKTsKLQotICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWlzdHItPnB1aThfYnVmZmVyKTsKLQotICAgICAgaXN0ci0+dWkzMl9sZW5ndGggPSBsZW5ndGggOwotCi0gICAgICBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7Ci0KLSAgICAgIGlzdHItPnB1aThfYnVmZmVyID0gYnVmZmVyOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgaWYobW9kZSA9PSBNNE9TQV9rc3RyQmVnaW4pCi0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKGlidWZmZXIsIG9idWZmZXIsICZwdHJfc3JjKTsKLQotICAgICAgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSksIGVycl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJQcml2UmVwbGFjZVNhbWVTaXplU3RyIik7Ci0KLSAgICAgICAgIGlmKGVycl9jb2RlID09IE00V0FSX0NIUl9OT1RfRk9VTkQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICAgICAgIH0KLQotICAgICAgICAgaTMyX3BvcyA9IChNNE9TQV9VSW50MzIpcHRyX3NyYyAtIChNNE9TQV9VSW50MzIpaWJ1ZmZlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGkzMl9wb3MgPSBNNE9TQV9zdHJQcml2RmluZExhc3RTdWJTdHIoaXN0ciwgb3N0ciwgaWxlbmd0aC0xKTsKLQotICAgICAgICAgaWYoaTMyX3BvcyA9PSAtMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlcnJfY29kZSA9IE00T1NBX3N0clByaXZTZXRBbmRSZXBsZWNlU3RyKGlzdHIsIGkzMl9wb3MsIG9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWZmZXIsIG5sZW5ndGgpOwotCi0gICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgICAgewotICAgICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV9zdHJQcml2UmVwbGFjZVNtYWxsZXJTdHIiKTsKLQotICAgICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3RyaW5nIGJ1ZmZlciBieSBhIG5ldyAiQy1TdHJpbmciCi0gKiAgICAgICAgICAgICBhbmQgbWFuYWdlIG1lbW9yeSBpZiBuZWVkZWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBwc3RyX3NyYwotICogQHBhcmFtICAgICAgcGFjX2luCi0gKiBAcmV0dXJuICAgICBNNE9TQV9FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRPU0Ffc3RyUHJpdlJlcGxhY2VCaWdnZXJTdHIoTTRPU0Ffc3RyU3RydWN0KiBpc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3N0clN0cnVjdCogb3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9zdHJTdHJ1Y3QqIG5zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc3RyTW9kZSBtb2RlKQotewotICAgTTRPU0FfQ2hhciogaWJ1ZmZlcjsKLSAgIE00T1NBX0NoYXIqIG9idWZmZXI7Ci0gICBNNE9TQV9DaGFyKiBuYnVmZmVyOwotICAgTTRPU0FfQ2hhciogYnVmZmVyOwotICAgTTRPU0FfQ2hhciogcHRyOwotICAgTTRPU0FfVUludDMyIGlsZW5ndGgsIG5sZW5ndGgsIG9sZW5ndGgsIGxlbmd0aDsKLSAgIE00T1NBX0ludDMyIGkzMl9wb3M7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMl80KCJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0clx0XHRNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJTdHJ1Y3QqIDB4JXhcdE00T1NBX3N0clN0cnVjdCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX3N0ck1vZGUgJWQiLCBpc3RyLCBvc3RyLCBuc3RyLCBtb2RlKTsKLQotICAgaWJ1ZmZlciA9IGlzdHItPnB1aThfYnVmZmVyOwotICAgb2J1ZmZlciA9IG9zdHItPnB1aThfYnVmZmVyOwotICAgbmJ1ZmZlciA9IG5zdHItPnB1aThfYnVmZmVyOwotCi0gICBpbGVuZ3RoID0gaXN0ci0+dWkzMl9sZW5ndGg7Ci0gICBvbGVuZ3RoID0gb3N0ci0+dWkzMl9sZW5ndGg7Ci0gICBubGVuZ3RoID0gbnN0ci0+dWkzMl9sZW5ndGg7Ci0KLQotICAgaWYobW9kZSA9PSBNNE9TQV9rc3RyQWxsKQotICAgewotICAgICAgTTRPU0FfVUludDMyIG49MCwgaTsKLSAgICAgIE00T1NBX0ludDMyKiBwYXR0ZXJuczsKLSAgICAgIE00T1NBX1VJbnQzMiBwb3M9MCwgc2l6ZTsKLSAgICAgIE00T1NBX1VJbnQzMiBtYXhfcGF0dGVybiA9IGlsZW5ndGggLyBvbGVuZ3RoOwotICAgICAgTTRPU0FfVUludDMyIHVpMzJfc2l6ZSA9IGlzdHItPnVpMzJfc2l6ZTsKLSAgICAgIE00T1NBX0NoYXIqIHNyYzsKLSAgICAgIE00T1NBX0NoYXIqIGRlc3Q7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KLSAgICAgIHBhdHRlcm5zID0gKE00T1NBX0ludDMyKilNNE9TQV9tYWxsb2MobWF4X3BhdHRlcm4gKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0ciIpOwotCi0gICAgICBNNE9TQV9DSEVDS19NQUxMT0MocGF0dGVybnMsIChNNE9TQV9DaGFyKikiTTRPU0Ffc3RyUHJpdlJlcGxhY2VCaWdnZXJTdHIiKTsKLQotCi0gICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKGlidWZmZXIsIG9idWZmZXIsICZwdHIpOwotCi0gICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlQmlnZ2VyU3RyIik7Ci0KLSAgICAgIGlmKGVycl9jb2RlID09IE00V0FSX0NIUl9OT1RfRk9VTkQpCi0gICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICAgIH0KLQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgIHBhdHRlcm5zW25dID0gKE00T1NBX1VJbnQzMilwdHIgLSAoTTRPU0FfVUludDMyKWlidWZmZXI7Ci0KLSAgICAgICAgIG4rKzsKLQotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9jaHJGaW5kUGF0dGVybihwdHIgKyBvbGVuZ3RoLCBvYnVmZmVyLCAmcHRyKTsKLQotICAgICAgICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSksIGVycl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0ciIpOwotCi0gICAgICB9IHdoaWxlKGVycl9jb2RlICE9IE00V0FSX0NIUl9OT1RfRk9VTkQpOwotCi0gICAgICBsZW5ndGggPSBpbGVuZ3RoIC0gKG4gKiBvbGVuZ3RoKSArIChuICogbmxlbmd0aCk7Ci0KLQotICAgICAgaWYobGVuZ3RoID49IHVpMzJfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICB1aTMyX3NpemUgPDw9IDE7Ci0KLSAgICAgICAgIH0gd2hpbGUobGVuZ3RoID49IHVpMzJfc2l6ZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgTTRPU0FfU3RyaW5nIGNvbnRlbnQgKi8KLSAgICAgIGJ1ZmZlciA9IChNNE9TQV9DaGFyKilNNE9TQV9tYWxsb2ModWkzMl9zaXplICogc2l6ZW9mKE00T1NBX0NoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1NUUklORywgKE00T1NBX0NoYXIqKSJNNE9TQV9zdHJQcml2UmVwbGFjZUJpZ2dlclN0ciIpOwotCi0gICAgICBNNE9TQV9DSEVDS19NQUxMT0MoYnVmZmVyLCAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VCaWdnZXJTdHIiKTsKLQotICAgICAgc3JjID0gaWJ1ZmZlcjsKLSAgICAgIGRlc3QgPSBidWZmZXI7Ci0KLSAgICAgIGZvcihpPTA7IGk8bjsgaSsrKQotICAgICAgewotICAgICAgICAgc2l6ZSA9IHBhdHRlcm5zW2ldIC0gcG9zOwotCi0gICAgICAgICBNNE9TQV9tZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsKLQotICAgICAgICAgcG9zID0gcGF0dGVybnNbaV0gKyBvbGVuZ3RoOwotCi0gICAgICAgICBzcmMgPSBpYnVmZmVyICsgcG9zOwotCi0gICAgICAgICBkZXN0ICs9IHNpemU7Ci0KLSAgICAgICAgIE00T1NBX21lbWNweShkZXN0LCBuYnVmZmVyLCBubGVuZ3RoKTsKLQotICAgICAgICAgZGVzdCArPSBubGVuZ3RoOwotICAgICAgfQotCi0gICAgICBzaXplID0gaWxlbmd0aCAtIChNNE9TQV9VSW50MzIpKHNyYyAtIGlidWZmZXIpOwotCi0gICAgICBNNE9TQV9tZW1jcHkoZGVzdCwgc3JjLCBzaXplKTsKLQotICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBhdHRlcm5zKTsKLQotICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWlidWZmZXIpOwotCi0gICAgICBpc3RyLT51aTMyX2xlbmd0aCA9IGxlbmd0aDsKLQotICAgICAgaXN0ci0+cHVpOF9idWZmZXIgPSBidWZmZXI7Ci0KLSAgICAgIGlzdHItPnB1aThfYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgaWYobW9kZSA9PSBNNE9TQV9rc3RyQmVnaW4pCi0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX2NockZpbmRQYXR0ZXJuKGlidWZmZXIsIG9idWZmZXIsICZwdHIpOwotCi0gICAgICAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSwgZXJyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIk00T1NBX3N0clByaXZSZXBsYWNlU2FtZVNpemVTdHIiKTsKLQotICAgICAgICAgaWYoZXJyX2NvZGUgPT0gTTRXQVJfQ0hSX05PVF9GT1VORCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9TVFJfTk9UX0ZPVU5EOwotICAgICAgICAgfQotCi0gICAgICAgICBpMzJfcG9zID0gKE00T1NBX1VJbnQzMilwdHIgLSAoTTRPU0FfVUludDMyKWlidWZmZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpMzJfcG9zID0gTTRPU0Ffc3RyUHJpdkZpbmRMYXN0U3ViU3RyKGlzdHIsIG9zdHIsIGlsZW5ndGgtMSk7Ci0KLSAgICAgICAgIGlmKGkzMl9wb3MgPT0gLTEpCi0gICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfU1RSX05PVF9GT1VORDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZXJyX2NvZGUgPSBNNE9TQV9zdHJQcml2U2V0QW5kUmVwbGVjZVN0cihpc3RyLCBpMzJfcG9zLCBvbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmZmVyLCBubGVuZ3RoKTsKLQotICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0Ffc3RyUHJpdlJlcGxhY2VTbWFsbGVyU3RyIik7Ci0KLSAgICAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE00T1NBX3N0clByaXZTUHJpbnRmKE00T1NBX3N0clN0cnVjdCogc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IG1hcmtlcikKLXsKLSAgICBNNE9TQV9DaGFyICp0ZW1wOwotICAgIE00T1NBX0NoYXIgKnBlcmNlbnRQb2ludGVyOwotICAgIE00T1NBX0NoYXIgKm5ld0Zvcm1hdDsKLSAgICBNNE9TQV9DaGFyKiBzdHJPdXQgPSBzdHItPnB1aThfYnVmZmVyICsgc3RyLT51aTMyX2xlbmd0aDsKLSAgICBNNE9TQV9VSW50MzIgc3RyT3V0TWF4TGVuID0gc3RyLT51aTMyX3NpemUtMTsKLSAgICBNNE9TQV9JbnQzMiBuZXdGb3JtYXRMZW5ndGggPSAwOwotICAgIE00T1NBX1VJbnQzMiBjb3VudF9sbCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGNvdW50X3RtID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY291bnRfYWEgPSAwOwotICAgIE00T1NBX1VJbnQzMiBjb3VudDsKLSAgICBNNE9TQV9VSW50MzIgbmJDaGFyOwotICAgIE00T1NBX0ludDMyICBpUmVzdWx0OwotCi0gICAgTTRPU0FfSW50MzIgZXJyOwotICAgIE00T1NBX0NoYXIgZmxhZ0NoYXJbXSAgICAgICAgICAgICA9ICInLSsgIzAiOwotICAgIE00T1NBX0NoYXIgd2lkdGhPclByZWNpc2lvbkNoYXJbXSA9ICIqMDEyMzQ1Njc4OSI7Ci0gICAgTTRPU0FfQ2hhciBvdGhlclByZWZpeENoYXJbXSAgICAgID0gImhsTCI7Ci0gICAgTTRPU0FfQ2hhciBjb252ZXJzaW9uQ2hhcltdICAgICAgID0gImRpb3V4WG5mZUVnR2NDc1NwJSI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0Ffc3RyU1ByaW50Zlx0XHRNNE9TQV9TdHJpbmcgMHgleFx0TTRPU0FfQ2hhciogMHgleCIsCi0gICAgICAgIHN0ciwgZm9ybWF0KTsKLQotCi0gICAgLyogY291bnQgdGhlIG51bWJlciBvZiAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXSAqLwotICAgIHRlbXAgPSBmb3JtYXQ7Ci0KLSAgICB3aGlsZSgqdGVtcCkKLSAgICB7Ci0gICAgICAgIC8qIGdldCB0aGUgbmV4dCBwZXJjZW50IGNoYXJhY3RlciAqLwotICAgICAgICBlcnIgPSBNNE9TQV9jaHJGaW5kQ2hhciAodGVtcCwgJyUnLCAmcGVyY2VudFBvaW50ZXIpOwotCi0gICAgICAgIGlmKCghcGVyY2VudFBvaW50ZXIpIHx8IChNNFdBUl9DSFJfTk9UX0ZPVU5EID09IGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIH0KLQotICAgICAgICB0ZW1wID0gcGVyY2VudFBvaW50ZXIrMTsgICAgICAgICAgIC8qIHNwYW4gaXQgKi8KLSAgICAgICAgaWYoISp0ZW1wKSAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIGZsYWdzICovCi0gICAgICAgIE00T1NBX2NoclNwYW4oZm9ybWF0LCBjb252ZXJzaW9uQ2hhciwgJm5iQ2hhcik7Ci0gICAgICAgIHRlbXAgKz0gbmJDaGFyOwotCi0gICAgICAgIGlmKCEqdGVtcCkgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzcGFuIHRoZSBvcHRpb25hbCB3aWR0aCAqLwotICAgICAgICBNNE9TQV9jaHJTcGFuKHRlbXAsIHdpZHRoT3JQcmVjaXNpb25DaGFyLCAmbmJDaGFyKTsKLSAgICAgICAgdGVtcCArPSBuYkNoYXI7Ci0gICAgICAgIGlmKCEqdGVtcCkgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigqdGVtcD09Jy4nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzcGFuIHRoZSBvcHRpb25hbCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgIE00T1NBX2NoclNwYW4oKyt0ZW1wLCB3aWR0aE9yUHJlY2lzaW9uQ2hhciwgJm5iQ2hhcik7Ci0gICAgICAgICAgICB0ZW1wICs9IG5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKnRlbXApIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoTTRPU0FfY2hyTGVuZ3RoKHRlbXApPj0yKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE00T1NBX2Nock5Db21wYXJlKHRlbXAsIChNNE9TQV9DaGFyKikibGwiLDIsICZpUmVzdWx0KTsKLSAgICAgICAgICAgIGlmIChpUmVzdWx0ICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfbGwrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJIGdvdCBPTkUgKi8KLSAgICAgICAgICAgICAgICB0ZW1wICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvbXBhcmUodGVtcCwgKE00T1NBX0NoYXIqKSJ0bSIsMiwgJmlSZXN1bHQpOwotICAgICAgICAgICAgICAgIGlmIChpUmVzdWx0ICE9IDApIC8qIOAgdm9pciBzaSBjZSBuJ2VzdCBwYXMgPT0gMCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnRfdG0rKzsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCArPTI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db21wYXJlKHRlbXAsIChNNE9TQV9DaGFyKikiYWEiLDIsICZpUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXN1bHQgIT0gMCkgLyog4CB2b2lyIHNpIGNlIG4nZXN0IHBhcyA9PSAwICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X2FhKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICs9MjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNwYW4gdGhlIG90aGVyIG9wdGlvbmFsIHByZWZpeCAqLwotICAgICAgICBNNE9TQV9jaHJTcGFuKHRlbXAsIG90aGVyUHJlZml4Q2hhciwgJm5iQ2hhcik7Ci0gICAgICAgIHRlbXAgKz0gbmJDaGFyOwotICAgICAgICBpZighKnRlbXApIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfY2hyU3Bhbih0ZW1wLCBjb252ZXJzaW9uQ2hhciwgJm5iQ2hhcik7Ci0gICAgICAgIHRlbXAgKz0gbmJDaGFyOwotICAgICAgICBpZighKnRlbXApIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBjb3VudCA9IGNvdW50X2xsICsgY291bnRfdG0gKyBjb3VudF9hYTsKLQotICAgIGlmKCFjb3VudCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYoc3RyT3V0LHN0ck91dE1heExlbixmb3JtYXQsbWFya2VyKTsKLQotICAgICAgICBpZihNNEVSUl9DSFJfU1RSX09WRVJGTE9XID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUUl9PVkVSRkxPVzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKGZvcm1hdCkgKyAxOwotCi0jaWZkZWYgTTRPU0FfNjRCSVRTX1NVUFBPUlRFRAotI2lmZGVmIE00T1NBX0ZJTEVfUE9TXzY0X0JJVFNfU1VQUE9SVEVECi0gICAgbmV3Rm9ybWF0TGVuZ3RoICs9IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0jZWxzZQotICAgIG5ld0Zvcm1hdExlbmd0aCArPSAoY291bnRfbGwrY291bnRfdG0tY291bnRfYWEpOwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkIE00T1NBXzY0QklUU19OT1RfU1VQUE9SVEVECi0gICAgbmV3Rm9ybWF0TGVuZ3RoIC09IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0jZWxzZQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0jZW5kaWYKLQotICAgIG5ld0Zvcm1hdCA9KE00T1NBX0NoYXIqKU00T1NBX21hbGxvYyhuZXdGb3JtYXRMZW5ndGgsCi0gICAgICAgIE00T1NBX0NIQVJTVEFSLCAoTTRPU0FfQ2hhciopIk00T1NBX2NoclByaW50ZjogbmV3Rm9ybWF0Iik7Ci0gICAgaWYobmV3Rm9ybWF0ID09IE00T1NBX05VTEwpIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICBuZXdGb3JtYXRbbmV3Rm9ybWF0TGVuZ3RoLTFdID0gJ1wwJzsKLSAgICB0ZW1wID0gbmV3Rm9ybWF0OwotICAgIC8qIGNvcHkgZm9ybWF0IHRvIG5ld0Zvcm1hdCwgcmVwbGFjaW5nCi0gICAgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0KLSAgICBieSAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1JNjRbY29udmVyc2lvbl0gKi8KLSAgICB3aGlsZSgqZm9ybWF0KQotICAgIHsKLSAgICAgICAgTTRPU0FfY2hyU3BhbkNvbXBsZW1lbnQoZm9ybWF0LCAoTTRPU0FfQ2hhciopIiUiLCAmbmJDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9jaHJOQ29weSh0ZW1wLGZvcm1hdCxuYkNoYXIpOyAgICAgIC8qIGNvcHkgY2hhcmFjdGVycyBiZWZvcmUgdGhlICUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICB0ZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICp0ZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSAlIGNoYXJhY3RlciAqLwotCi0gICAgICAgIE00T1NBX2NoclNwYW4oZm9ybWF0LCBmbGFnQ2hhciwgJm5iQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkodGVtcCxmb3JtYXQsbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBmbGFnIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9jaHJTcGFuKGZvcm1hdCwgd2lkdGhPclByZWNpc2lvbkNoYXIsICZuYkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KHRlbXAsZm9ybWF0LG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgdGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZigqZm9ybWF0PT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgICp0ZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBkb3QgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBpZighKmZvcm1hdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTTRPU0FfY2hyU3Bhbihmb3JtYXQsIHdpZHRoT3JQcmVjaXNpb25DaGFyLCAmbmJDaGFyKTsKLSAgICAgICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ29weSh0ZW1wLGZvcm1hdCxuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICAgICAgdGVtcCAgICs9bmJDaGFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoISpmb3JtYXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTTRPU0FfY2hyTGVuZ3RoKGZvcm1hdCk+PTIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgTTRPU0FfY2hyTkNvbXBhcmUoZm9ybWF0LCAoTTRPU0FfQ2hhciopImxsIiwyLCAmaVJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAoaVJlc3VsdCAhPSAwKQotICAgICAgICAgICAgewotI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKLSAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ0knOyAvKiAlSTY0ICovCi0gICAgICAgICAgICAgICAgKnRlbXArKyA9ICc2JzsKLSAgICAgICAgICAgICAgICAqdGVtcCsrID0gJzQnOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAqdGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImxsIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ29tcGFyZShmb3JtYXQsIChNNE9TQV9DaGFyKikidG0iLDIsICZpUmVzdWx0KTsKLSAgICAgICAgICAgICAgICBpZiAoaVJlc3VsdCAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSNpZmRlZiBNNE9TQV82NEJJVFNfU1VQUE9SVEVECi0gICAgICAgICAgICAgICAgKnRlbXArKyA9ICdJJzsgLyogJUk2NCAqLwotICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnNic7Ci0gICAgICAgICAgICAgICAgKnRlbXArKyA9ICc0JzsKLSNlbHNlCi0gICAgICAgICAgICAgICAgKnRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSNlbmRpZgotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJ0bSIgcHJlZml4ICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db21wYXJlKGZvcm1hdCwgKE00T1NBX0NoYXIqKSJhYSIsMiwgJmlSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaVJlc3VsdCAhPSAwKSAvKiDgIHZvaXIgc2kgY2Ugbidlc3QgcGFzICE9IDAgKi8KLSAgICAgICAgICAgICAgICAgICAgewotI2lmZGVmIE00T1NBXzY0QklUU19TVVBQT1JURUQKLSNpZmRlZiBNNE9TQV9GSUxFX1BPU182NF9CSVRTX1NVUFBPUlRFRAotICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICdJJzsgLyogJUk2NCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICc2JzsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnNCc7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICdsJzsKLSNlbmRpZgotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wKysgPSAnbCc7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJhYSIgcHJlZml4ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9jaHJTcGFuKGZvcm1hdCwgb3RoZXJQcmVmaXhDaGFyLCAmbmJDaGFyKTsKLQotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KHRlbXAsZm9ybWF0LG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgb3RoZXIgUHJlZml4ICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICB0ZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZighKmZvcm1hdCkKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9jaHJTcGFuKGZvcm1hdCwgY29udmVyc2lvbkNoYXIsICZuYkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KHRlbXAsZm9ybWF0LG5iQ2hhcik7Ci0gICAgICAgICAgICBmb3JtYXQgKz0gbmJDaGFyOwotICAgICAgICAgICAgdGVtcCAgICs9IG5iQ2hhcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCEqZm9ybWF0KQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgfQotCi0gICAgZXJyID0gTTRPU0FfY2hyU1ByaW50ZihzdHJPdXQsc3RyT3V0TWF4TGVuLG5ld0Zvcm1hdCxtYXJrZXIpOwotCi0gICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbmV3Rm9ybWF0KTsKLQotICAgaWYgKE00RVJSX0NIUl9TVFJfT1ZFUkZMT1cgPT0gZXJyKQotICAgewotICAgICAgIHJldHVybiBNNEVSUl9TVFJfT1ZFUkZMT1c7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKaW5kZXggYzA5YjgyYy4uNzkzYzBlNCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKKysrIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKQEAgLTU2LDEwICs1Niw2IEBACiAKICAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwogCi0gICAvKmlmKHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2sodGhyZWFkQ29udGV4dCwgdXNlckRhdGEpOwotICAgfSovCiAKICAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFJ1bm5pbmc7CiAKQEAgLTE0MSw3ICsxMzcsNyBAQAogICAgKmNvbnRleHQgPSBNNE9TQV9OVUxMOwogCiAgICB0aHJlYWRDb250ZXh0ID0KLSAgICAgIChNNE9TQV9UaHJlYWRDb250ZXh0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX1RocmVhZENvbnRleHQpLAorICAgICAgKE00T1NBX1RocmVhZENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVGhyZWFkQ29udGV4dCksCiAgICAgICBNNE9TQV9USFJFQUQsIChNNE9TQV9DaGFyKikiTTRPU0FfdGhyZWFkU3luY09wZW46IHRocmVhZCBjb250ZXh0Iik7CiAKICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKQEAgLTE1NiwxMSArMTUyLDYgQEAKICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwogICAgdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQgPSAwOwogICAgdGhyZWFkQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfVEhSRUFEOwotLyoKLSAgIHRocmVhZENvbnRleHQtPnVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgIHRocmVhZENvbnRleHQtPnN0b3BDYWxsQmFjayA9IE00T1NBX05VTEw7Ci0gICB0aHJlYWRDb250ZXh0LT5zdGFydENhbGxCYWNrID0gTTRPU0FfTlVMTDsKLSovCiAgICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7CiAgICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSA7CiAKQEAgLTI1NiwyOSArMjQ3LDYgQEAKICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koICZhdHRyaWJ1dGUsIFNDSEVEX09USEVSICkgKQogICAgICAgICAgICAgewotI2lmIDAKLSAgICAgICAgICAgICAgICBtaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKCBTQ0hFRF9PVEhFUiApOwotICAgICAgICAgICAgICAgIG1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgoIFNDSEVEX09USEVSICk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2godGhyZWFkQ29udGV4dC0+cHJpb3JpdHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IG1pbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gbWluICsgKCBtYXggLSBtaW4gKSAvIDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IG1pbiArICggbWF4IC0gbWluICkgLyAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gbWF4IC0gKCBtYXggLSBtaW4gKSAvIDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hlc3RQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCiAgICAgICAgICAgICAgICAgLyogVGVudGF0aXZlIHBhdGNoZXMgdG8gaGFuZGxlIHByaW9yaXRpZXMgaW4gYSBiZXR0ZXIgd2F5IDogKi8KICAgICAgICAgICAgICAgICAvKiBVc2UgQW5kcm9pZCdzIHByZWRlZmluZWQgcHJpb3JpdGllcyAocmFuZ2UgKzE5Li4tMjApCiAgICAgICAgICAgICAgICAgICpyYXRoZXIgdGhhbiBMaW51eCBvbmVzICgwLi45OSkqLwpAQCAtMzEzLDcgKzI4MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU87CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgICAgIHNjaGVkLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CiAKICAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oICZhdHRyaWJ1dGUsICZzY2hlZCApICkKQEAgLTQ3NSwxMCArNDQyLDEwIEBACiAKICAgIGlmKHRocmVhZENvbnRleHQtPm5hbWUgIT0gTTRPU0FfTlVMTCkKICAgIHsKLSAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0aHJlYWRDb250ZXh0LT5uYW1lKTsKKyAgICAgIGZyZWUodGhyZWFkQ29udGV4dC0+bmFtZSk7CiAgICB9CiAKLSAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0aHJlYWRDb250ZXh0KTsKKyAgIGZyZWUodGhyZWFkQ29udGV4dCk7CiAKICAgIHJldHVybiBNNE5PX0VSUk9SOwogfQpAQCAtNTQ2LDQ4ICs1MTMsNiBAQAogICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CiAKLQotCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCA9PSBNNE9TQV9UUlVFKQotCi0vKk00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhcnRlZChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0IDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdGFydGVkXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RhcnRDYWxsQmFjayA9IChNNE9TQV9UaHJlYWRDYWxsQmFjaylvcHRpb25WYWx1ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ki8KLQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgPT0gTTRPU0FfVFJVRSkKLQotLypNNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1N0b3BwZWQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNTdG9wcGVkXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RvcENhbGxCYWNrID0gKE00T1NBX1RocmVhZENhbGxCYWNrKW9wdGlvblZhbHVlOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0qLwotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCovCi0KLQotCiAjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCiAKIE00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoTTRPU0FfQ29udGV4dCBjb250ZXh0LApAQCAtNjI5LDE2ICs1NTQsMTYgQEAKIAogICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQogICAgewotICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXRocmVhZENvbnRleHQtPm5hbWUpOworICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKICAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwogICAgfQogCiAgICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQogICAgewotICAgICAgbmFtZVNpemUgPSBNNE9TQV9jaHJMZW5ndGgobmFtZSkrMTsKKyAgICAgIG5hbWVTaXplID0gc3RybGVuKChjb25zdCBjaGFyICopbmFtZSkrMTsKIAogICAgICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9Ci0gICAgICAgICAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKG5hbWVTaXplLCBNNE9TQV9USFJFQUQsCisgICAgICAgICAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5hbWVTaXplLCBNNE9TQV9USFJFQUQsCiAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX1NldFRocmVhZFN5bmNOYW1lOiB0aHJlYWQgbmFtZSIpOwogCiAgICAgICBpZih0aHJlYWRDb250ZXh0ID09IE00T1NBX05VTEwpCkBAIC02NDYsNyArNTcxLDcgQEAKICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgIH0KIAotICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl0aHJlYWRDb250ZXh0LT5uYW1lLCAoTTRPU0FfTWVtQWRkcjgpbmFtZSwKKyAgICAgIG1lbWNweSgodm9pZCAqKXRocmVhZENvbnRleHQtPm5hbWUsICh2b2lkICopbmFtZSwKICAgICAgICAgICAgICAgICAgICBuYW1lU2l6ZSk7CiAgICB9CiAKQEAgLTY3MywyOSArNTk4LDYgQEAKIAogI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLwogCi0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgPT0gTTRPU0FfVFJVRSkKLQotLypNNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1VzZXJEYXRhKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1VzZXJEYXRhXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgdGhyZWFkQ29udGV4dC0+dXNlckRhdGEgPSAoTTRPU0FfVm9pZCopb3B0aW9uVmFsdWU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfSovCi0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEqLwotCi0KLQotCi0KIC8qKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQpAQCAtNzU2LDMyICs2NTgsNiBAQAogCiAgICBzd2l0Y2gob3B0aW9uSUQpCiAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgPT0gTTRPU0FfVFJVRSkKLSAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRTdGFydGVkOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhcnRlZChjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfSovCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCA9PSBNNE9TQV9UUlVFKQotICAgICAgLypjYXNlIE00T1NBX1RocmVhZFN0b3BwZWQ6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNTdG9wcGVkKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ki8KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVE9QUEVEKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgPT0gTTRPU0FfVFJVRSkKLSAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRVc2VyRGF0YToKLSAgICAgIHsKLSAgICAgICAgIGVycl9jb2RlID0gTTRPU0FfU2V0VGhyZWFkU3luY1VzZXJEYXRhKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ki8KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEqLwogCiAjaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCiAgICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgpAQCAtODc2LDM4ICs3NTIsNiBAQAogCiAgICBzd2l0Y2gob3B0aW9uSUQpCiAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgPT0gTTRPU0FfVFJVRSkKLSAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRTdGFydGVkOgotICAgICAgewotICAgICAgICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sqIHN0YXJ0Q2FsbEJhY2sgPSAoTTRPU0FfVGhyZWFkQ2FsbEJhY2sqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqc3RhcnRDYWxsQmFjayA9IHRocmVhZENvbnRleHQtPnN0YXJ0Q2FsbEJhY2s7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfSovCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCA9PSBNNE9TQV9UUlVFKQotICAgICAgLypjYXNlIE00T1NBX1RocmVhZFN0b3BwZWQ6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9UaHJlYWRDYWxsQmFjayogc3RvcENhbGxCYWNrID0gKE00T1NBX1RocmVhZENhbGxCYWNrKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnN0b3BDYWxsQmFjayA9IHRocmVhZENvbnRleHQtPnN0b3BDYWxsQmFjazsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ki8KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVE9QUEVEKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9VU0VSX0RBVEEgPT0gTTRPU0FfVFJVRSkKLSAgICAgIC8qY2FzZSBNNE9TQV9UaHJlYWRVc2VyRGF0YToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1ZvaWQqKiB1c2VyRGF0YSA9IChNNE9TQV9Wb2lkKiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICp1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0qLwotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSovCiAKICNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKICAgICAgIGNhc2UgTTRPU0FfVGhyZWFkUHJpb3JpdHk6CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCmluZGV4IDFkZDRkM2EuLjZjMzNmYzEgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jCkBAIC0zMCw3ICszMCw3IEBACiAjaWZuZGVmIE00VlBTX0FEVkFOQ0VEX01FTU9SWV9NQU5BR0VSCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHIzMiBNNE9TQV9tYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCisgKiBAZm4gICAgICAgICBNNE9TQV9NZW1BZGRyMzIgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1VJbnQzMiBzaXplLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmcpCiAgKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG1lbW9yeSBibG9jayAoYXQgbGVhc3QgMzIgYml0cyBhbGlnbmVkKQpAQCAtNDIsNyArNDIsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KIAotTTRPU0FfTWVtQWRkcjMyIE00T1NBX21hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKK000T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKIHsKQEAgLTY4LDExNiArNjgsNSBAQAogICAgIHJldHVybiBBZGRyZXNzOwogfQogCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfVm9pZCBNNE9TQV9mcmVlKE00T1NBX01lbUFkZHIzMiBhZGRyZXNzKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBmcmVlIHRoZSBwcm92aWRlZCBtZW1vcnkgYmxvY2sKLSAqIEBub3RlICAgICAgIEFzIGluIHN0bGliLmgsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIGFkZHJlc3MgaXMgTlVMTC4KLSAqIEBwYXJhbSAgICAgIGFkZHJlc3MgKElOKTogYWRkcmVzcyBvZiB0aGUgYmxvY2sgdG8gZnJlZQotICogQHJldHVybiAgICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfVm9pZCBNNE9TQV9mcmVlIChNNE9TQV9NZW1BZGRyMzIgYWRkcmVzcykKLXsKLSAgICBmcmVlKGFkZHJlc3MpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfVm9pZCBNNE9TQV9tZW1zZXQoTTRPU0FfTWVtQWRkcjggYmxvY2ssCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHZhbHVlKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcHJvdmlkZWQgbWVtb3J5IGJsb2NrIHdpdGggdmFsdWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBibG9jayAoSU4pOiBhZGRyZXNzIG9mIGJsb2NrIHRvIGZpbGwKLSAqIEBwYXJhbSAgICAgIHNpemUgIChJTik6IHNpemUgb2YgdGhlIHByb3ZpZGVkIGJsb2NrCi0gKiBAcGFyYW0gICAgICB2YWx1ZSAoSU4pOiB2YWx1ZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbgotICogQHJldHVybiAgICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfVm9pZCBNNE9TQV9tZW1zZXQoTTRPU0FfTWVtQWRkcjggYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHZhbHVlKQotewotICAgIG1lbXNldCgodm9pZCopYmxvY2ssIHZhbHVlLCBzaXplKTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX1ZvaWQgTTRPU0FfbWVtY3B5KE00T1NBX01lbUFkZHI4IG91dHB1dEJsb2NrLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggaW5wdXRCbG9jaywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBjb3BpZXMgJ3NpemUnIGJ5dGVzIGZyb20gaW5wdXRCbG9jayB0byBvdXRwdXRCbG9jawotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIG91dHB1dEJsb2NrIChJTik6IGFkZHJlc3Mgb2YgYmxvY2sgdG8gZmlsbAotICogQHBhcmFtICAgICAgaW5wdXRCbG9jayAgKElOKTogYWRkcmVzcyBvZiB0aGUgaW5wdXQgYmxvY2sKLSAqIEBwYXJhbSAgICAgIHNpemUgKElOKTogc2l6ZSBvZiB0aGUgYmxvY2sgdG8gY29weSAoaW4gYnl0ZXMpCi0gKiBAcmV0dXJuICAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9Wb2lkIE00T1NBX21lbWNweShNNE9TQV9NZW1BZGRyOCBvdXRwdXRCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGlucHV0QmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBtZW1jcHkoKHZvaWQqKW91dHB1dEJsb2NrLCAodm9pZCopaW5wdXRCbG9jaywgIHNpemUpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHI4IE00T1NBX21lbW1vdmUoTTRPU0FfTWVtQWRkcjggb3V0cHV0QmxvY2ssIE00T1NBX01lbUFkZHI4IGlucHV0QmxvY2ssIE00T1NBX1VJbnQzMiBzaXplKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBtb3ZlcyAnc2l6ZScgYnl0ZXMgZnJvbSBpbnB1dEJsb2NrIHRvIG91dHB1dEJsb2NrCi0gKiAgICAgICAgICAgICAgIHVubGlrZSBNNE9TQV9tZW1jcHksIHRoZSB0d28gYnVmZmVycyBjYW4gaGF2ZSBhbiBvdmVybGFwLgotICogQG5vdGUgICAgICAgaW5jcmVtZW50IG1lbWNweSBieXRlIG51bWJlciAoRnJhbudvaXMgVkFMRVRURSkKLSAqIEBwYXJhbSAgICAgIG91dHB1dEJsb2NrIChJTik6IGFkZHJlc3Mgb2YgYmxvY2sgdG8gZmlsbAotICogQHBhcmFtICAgICAgaW5wdXRCbG9jayAgKElOKTogYWRkcmVzcyBvZiB0aGUgaW5wdXQgYmxvY2sKLSAqIEBwYXJhbSAgICAgIHNpemUgKElOKTogc2l6ZSBvZiB0aGUgYmxvY2sgdG8gY29weSAoaW4gYnl0ZXMpCi0gKiBAcmV0dXJuICAgICBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYmxvY2ssIGkuZS4gdGhlIGZpcnN0IHBhcmFtZXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX01lbUFkZHI4IE00T1NBX21lbW1vdmUoTTRPU0FfTWVtQWRkcjggb3V0cHV0QmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggaW5wdXRCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgIHJldHVybiBtZW1tb3ZlKCh2b2lkKilvdXRwdXRCbG9jaywgKHZvaWQqKWlucHV0QmxvY2ssICBzaXplKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9JbnQzMiBNNE9TQV9tZW1jbXAoTTRPU0FfTWVtQWRkcjggYWRkcmVzczEsIE00T1NBX01lbUFkZHI4IGFkZHJlc3MyLCBNNE9TQV9VSW50MzIgc2l6ZSkKLSAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdGhlIGZpcnN0ICdzaXplJyBieXRlcyBvZiBhZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICdhZGRyZXNzMicgYW5kIHJldHVybiBhIHZhbHVlIGluZGljYXRpbmcgdGhlaXIgcmVsYXRpb25zaGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIGFkZHJlc3MxIChJTik6IG1lbW9yeSBhZGRyZXNzIDEKLSAqIEBwYXJhbSAgICAgIGFkZHJlc3MyIChJTik6IG1lbW9yeSBhZGRyZXNzIDIKLSAqIEBwYXJhbSAgICAgIHNpemUgKElOKTogc2l6ZSBvZiB0aGUgYmxvY2sgdG8gY29tcGFyZSAoaW4gYnl0ZXMpCi0gKiBAcmV0dXJuICAgICArMSwgaWYgZmlyc3QgYnl0ZXMgb2YgYWRyZXNzMSBhcmUgc21hbGxlciB0aGFuIHRob3NlIG9mIGFkZHJlc3MyCi0gKiBAcmV0dXJuICAgICAgMCwgaWYgYm90aCBibG9ja3MgYXJlIGlkZW50aWNhbAotICogQHJldHVybiAgICAtMSwgaWYgZmlyc3QgYnl0ZXMgb2YgYWRkcmVzczEgYXJlIGJpZ2dlciB0aGFuIHRob3NlIG9mIGFkZHJlc3MyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9JbnQzMiBNNE9TQV9tZW1jbXAoTTRPU0FfTWVtQWRkcjggYWRkcmVzczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYWRkcmVzczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpCi17Ci0gICAgTTRPU0FfSW50MzIgaTMyX3Jlc3VsdCA9IG1lbWNtcChhZGRyZXNzMSwgYWRkcmVzczIsIHNpemUpOwotICAgIGlmIChpMzJfcmVzdWx0ID4gMCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaTMyX3Jlc3VsdCA8IDApIHsKLSAgICAgICAgcmV0dXJuKChNNE9TQV9JbnQzMiktMSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLQotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMKaW5kZXggZWYzOWQ4Mi4uMTdiMGFmNiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYworKysgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCkBAIC02NCw5ICs2NCw5IEBACiAKICAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCiAjaWZkZWYgTk9fRklMRQotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIkxpZmVWaWJlc1RyYWNlIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOworICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOwogI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJMaWZlVmliZXNUcmFjZSIsICIlcyIsICIlcyBhdCAlbHUgaW4gJXMiLAorICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1lc3NhZ2UsIGxpbmUsIGZpbGUpOwogI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCiAKQEAgLTg5LDkgKzg5LDkgQEAKIAogICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KICNpZmRlZiBOT19GSUxFCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTGlmZVZpYmVzVHJhY2UiLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7CisgICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbiIsICIlcyIsIChjaGFyKiltZXNzYWdlKTsKICNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTGlmZVZpYmVzVHJhY2UiLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKKyAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgKGNoYXIqKWZpbGUpOwogI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rCmluZGV4IGFiOTdlOGMuLjc1OTcxYjMgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tawpAQCAtNTQsOSArNTQsNSBAQAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKICAgICAtRERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKIAotIyBEb24ndCBwcmVsaW5rIHRoaXMgbGlicmFyeS4gIEZvciBtb3JlIGVmZmljaWVudCBjb2RlLCB5b3UgbWF5IHdhbnQKLSMgdG8gYWRkIHRoaXMgbGlicmFyeSB0byB0aGUgcHJlbGluayBtYXAgYW5kIHNldCB0aGlzIHRvIHRydWUuCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYwppbmRleCBjNzE5ZmU2Li43ZmRlMWYxIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIiAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGZpbGUgYWNjZXNzZXMgaW1wbGVtZW50YXRpb24gKi8KICNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE9TQUwgbWVtb3J5IGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCiAjaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAvKio8IE9TQUwgZGVidWcgdG9vbHMgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAgICAgICAgICAgIC8qKjwgRm9yIE00T1NBX2Nockxlbmd0aCgpICovCiAKIC8qKgogICogV3JpdGVyIGluY2x1ZGVzICovCkBAIC0xMDcsNyArMTA2LDcgQEAKICAgICAvKioKICAgICAgKiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb250ZXh0ICovCiAgICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgYXBDb250ZXh0ID0gKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKU00T1NBX21hbGxvYygKKyAgICBhcENvbnRleHQgPSAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwKICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCIpOwpAQCAtMzY2LDcgKzM2NSw3IEBACiAKICAgICAvKioKICAgICAgKiAgICBEZWFsbG9jYXRlIG91ciBvd24gY29udGV4dCAqLwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilhcENvbnRleHQpOworICAgIGZyZWUoYXBDb250ZXh0KTsKIAogICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwogICAgIHJldHVybiBlcnI7CkBAIC00NjIsNyArNDYxLDcgQEAKICAgICAgICAgICAgICAgIGJlIGEgdGV4dCBzdHJpbmcgKi8KICAgICAgICAgICAgIG1lbXZhbC5hZGRyID0gKE00T1NBX01lbUFkZHIzMilvcHRpb25WYWx1ZTsKICAgICAgICAgICAgIC8qKjwgdGhpcyBpcyBtYXggc3RyaW5nIHNpemUgY29waWVkIGJ5IHRoZSBjb3JlICovCi0gICAgICAgICAgICBtZW12YWwuc2l6ZSA9IE00T1NBX2Nockxlbmd0aChvcHRpb25WYWx1ZSk7CisgICAgICAgICAgICBtZW12YWwuc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKW9wdGlvblZhbHVlKTsKICAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCiAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfaW50ZWdyYXRpb25UYWcsICZtZW12YWwpOwogICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQpAQCAtODY0LDcgKzg2Myw3IEBACiAKICAgICAvKioKICAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZ2xvYmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwR2xvYmFsID0gKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfbWFsbG9jKAorICAgIHBHbG9iYWwgPSAoTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSksCiAgICAgICAgICAgICAgICAgTTRXUklURVJfM0dQLCAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwR2xvYmFsKQpAQCAtODc5LDEzICs4NzgsMTMgQEAKICAgICAvKioKICAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZGF0YSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCiAgICAgcERhdGEgPQotICAgICAgICAoTTRXUklURVJfRGF0YUludGVyZmFjZSAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRXUklURVJfRGF0YUludGVyZmFjZSksCisgICAgICAgIChNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKSwKICAgICAgICAgTTRXUklURVJfM0dQLCAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl9EYXRhSW50ZXJmYWNlIik7CiAgICAgaWYgKE00T1NBX05VTEwgPT0gcERhdGEpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMCgidW5hYmxlIHRvIGFsbG9jYXRlIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UsXAogICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEdsb2JhbCk7CisgICAgICAgIGZyZWUocEdsb2JhbCk7CiAgICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwogICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7CiAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1V0aWxzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYwppbmRleCA1ZGE4NWViLi40ZWM0ZjY0IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYwpAQCAtMTE5LDEzICsxMTksMTMgQEAKIHZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogewotICAgIE00T1NBX01lbUFkZHIzMiBwdHIyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV9tYWxsb2MobmV3U2l6ZSwgTTRNUDRfV1JJVEVSLAorICAgIE00T1NBX01lbUFkZHIzMiBwdHIyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNUDRfV1JJVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInJlYWxsb2MiKTsKICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwdHIyKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwdHIyLCAoTTRPU0FfTWVtQWRkcjgpcHRyLCBvbGRTaXplKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyMiwgKHZvaWQgKilwdHIsIG9sZFNpemUpOwogICAgIH0KLSAgICBNNE9TQV9mcmVlKHB0cik7CisgICAgZnJlZShwdHIpOwogICAgIHJldHVybiBwdHIyOwogfQogCkBAIC0xNTEsNTUgKzE1MSw1NSBAQAogI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAogICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0pOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rW2ldKTsKICAgICAgICAgfQogI2Vsc2UKICAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspICYmCiAgICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKTsKKyAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKKyAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKICAgICAgICAgfQogI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KIAogICAgICAgICAvKm5vdyBkeW5hbWljKi8KICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKKyAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJKTsKICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIpOworICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0cik7CiAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKQEAgLTIxMCw2OSArMjEwLDY5IEBACiAjaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCiAgICAgICAgIGZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuazsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0pOwogICAgICAgICB9CiAjZWxzZQogICAgICAgICBpZiAoKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaykgJiYKICAgICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdKSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpOwogICAgICAgICB9CiAjZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwogCiAgICAgICAgIC8qbm93IGR5bmFtaWMqLwogICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspOwogICAgICAgICB9CiAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKKyAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSk7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKTsKICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIC8qbm93IGR5bmFtaWMqLwogICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpOworICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWikKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWik7CisgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKTsKKyAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKTsKICAgICAgICAgfQogCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIpOworICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0cik7CiAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nKTsKKyAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nKTsKICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9IE00T1NBX05VTEw7CiAgICAgfQogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0cik7CisgICAgZnJlZShtTXA0RmlsZURhdGFQdHIpOwogCiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKaW5kZXggYjM3ZGRlZC4uY2IwYzg0ZiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1dyaXRlci5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYwpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgLyogVGhlIGNvbnRleHQgcmV1c2UgbW9kZSB3YXMgc3VwcHJlc3NlZCovCiAKICAgICBtTXA0RmlsZURhdGFQdHIgPQotICAgICAgICAoTTRNUDRXX01wNEZpbGVEYXRhICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE1QNFdfTXA0RmlsZURhdGEpLAorICAgICAgICAoTTRNUDRXX01wNEZpbGVEYXRhICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfTXA0RmlsZURhdGEpLAogICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk1QNCB3cml0ZXIgY29udGV4dCIpOwogICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwogICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsID0gb3V0cHV0RmlsZURlc2NyaXB0b3I7CkBAIC02MTQsOCArNjE0LDggQEAKIAogICAgIC8qIGZ0eXAgYXRvbSAqLwogCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCkgJm1NcDRGaWxlRGF0YVB0ci0+ZnR5cCwKLSAgICAgICAgc2l6ZW9mKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCksIDApOworICAgIG1lbXNldCgodm9pZCAqKSAmbU1wNEZpbGVEYXRhUHRyLT5mdHlwLDAsCisgICAgICAgIHNpemVvZihtTXA0RmlsZURhdGFQdHItPmZ0eXApKTsKIAogICAgICpjb250ZXh0UHRyID0gbU1wNEZpbGVEYXRhUHRyOwogCkBAIC02NTYsNyArNjU2LDcgQEAKICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSAoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE1QNFdfQXVkaW9UcmFja0RhdGEpLAorICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhKSwKICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNNE1QNFdfQXVkaW9UcmFja0RhdGEiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwsCiAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKQEAgLTY3Nyw3ICs2NzcsNyBAQAogI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAogCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfbWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLApAQCAtNjg2LDE0ICs2ODYsMTQgQEAKICNlbHNlCiAKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV9tYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUNoYXIgKiksCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAogICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IE00T1NBX05VTEw7CiAKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfbWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgogICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCkBAIC03MDIsMjYgKzcwMiwyNiBAQAogI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KIAogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV9tYWxsb2MoTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTCiAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzID0gMTsKIAogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfbWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgogICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlIik7CiAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBX21hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV9tYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCisgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCiAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKQEAgLTc4MCwxMyArNzgwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfbWFsbG9jKDksIE00TVA0X1dSSVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg5LCBNNE1QNF9XUklURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgOSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTgxNSwxMyArODE1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfbWFsbG9jKDYsIE00TVA0X1dSSVRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2LCBNNE1QNF9XUklURVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgNik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTg0OSwxNCArODQ5LDE0IEBACiAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSAhPSAwKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkRTSSIpOwogICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTg4Myw3ICs4ODMsNyBAQAogICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IChNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00TVA0V19WaWRlb1RyYWNrRGF0YSksCisgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfVmlkZW9UcmFja0RhdGEpLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19WaWRlb1RyYWNrRGF0YSIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwpAQCAtOTA1LDcgKzkwNSw3IEBACiAjaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCiAKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV9tYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCisgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgogICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVuayIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCkBAIC05MTUsMTQgKzkxNSwxNCBAQAogICAgICAgICAgICAgICAgIC8qcmUtdXNlIHRoZSBzYW1lIGNodW5rIGFuZCBmbHVzaCBpdCB3aGVuIGZ1bGwqLwogCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9VQ2hhciAqKSwKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7CiAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwogCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBX21hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7CiAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQpAQCAtOTMzLDE5ICs5MzMsMTkgQEAKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAogICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV9tYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCisgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCiAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQogICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfbWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgogICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAogICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQogICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE9TQV9tYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCisgICAgICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgogICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlIik7CiAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQpAQCAtOTU0LDcgKzk1NCw3IEBACiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgPSAwOwogICAgICAgICAgICAgICAgIC8qdGFibGVzIGFyZSBub3cgZHluYW1pYyovCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBX21hbGxvYyhNNE1QNFdfU1RUU19BTExPQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFRTX0FMTE9DX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMKICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwpAQCAtOTYyLDEzICs5NjIsMTMgQEAKICNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQogCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNiAqKU00T1NBX21hbGxvYyhNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwogCiAjZWxzZQogCiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBX21hbGxvYyhNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwogCiAjZW5kaWYKQEAgLTk3Nyw3ICs5NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9IDE7CiAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBX21hbGxvYyhNNE1QNFdfU1RTU19BTExPQ19TSVpFLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNTX0FMTE9DX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwpAQCAtMTA1MCwxNCArMTA1MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwogICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7CiAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTA5MCwxNCArMTA5MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwogICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7CiAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPQogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7CkBAIC0xMTMzLDcgKzExMzMsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKQEAgLTExNDMsMjUgKzExNDMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgIFNQU0xlbmd0aCA9IERTSVs2XTsKICAgICAgICAgICAgICAgICAgICAgICAgIFBQU0xlbmd0aCA9IERTSVsxMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMTIsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIsIChNNE9TQV9NZW1BZGRyOCkoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjgsIFNQU0xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMTIpLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIpLCAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjgpLCBTUFNMZW5ndGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrMiArIFNQU0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzIwLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSs0ICsgU1BTTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjggKyBTUFNMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSsyICsgU1BTTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjApLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzQgKyBTUFNMZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCArIFNQU0xlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0gSC4yNjQgdHJpbW1pbmcgKi8KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTE3MywxNCArMTE3MywxNCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClzdHJlYW1EZXNjUHRyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyMjQsNyArMTIyNCw3IEBACiAKICAgICAgICAgLyogRmlyc3QgYXVkaW8gY2h1bmsgYWxsb2NhdGlvbiAqLwogICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBX21hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKKyAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAogICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVua1swXSIpOwogICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSAhPSBNNE9TQV9OVUxMLAogICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwpAQCAtMTI0MCw3ICsxMjQwLDcgQEAKIAogICAgICAgICAvKiBGaXJzdCB2aWRlbyBjaHVuayBhbGxvY2F0aW9uICovCiAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAorICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCiAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rWzBdIik7CiAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCiAgICAgICAgICAgICBNNEVSUl9BTExPQyk7CkBAIC0xMzYzLDggKzEzNjMsNyBAQAogICAgICAgICAgICAgc2FmZXR5RmlsZVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7CiAgICAgICAgIH0KIAotICAgICAgICBNNE9TQV9tZW1zZXQoZHVtbXlEYXRhLCBzaXplb2YoZHVtbXlEYXRhKSwKLSAgICAgICAgICAgIDB4Q0EpOyAvKiBGb3IgZXh0cmEgc2FmZXR5LiAqLworICAgICAgICBtZW1zZXQoKHZvaWQgKilkdW1teURhdGEsIDB4Q0Esc2l6ZW9mKGR1bW15RGF0YSkpOyAvKiBGb3IgZXh0cmEgc2FmZXR5LiAqLwogCiAgICAgICAgIGZvciAoIGkgPSAwOwogICAgICAgICAgICAgaSA8IChzYWZldHlGaWxlU2l6ZSArIHNpemVvZihkdW1teURhdGEpIC0gMSkgLyBzaXplb2YoZHVtbXlEYXRhKTsKQEAgLTE1NzQsNyArMTU3Myw3IEBACiAKICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KICAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV9tYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCisgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rIik7CiAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgogICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCkBAIC0xODE1LDcgKzE4MTQsNyBAQAogCiAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+CiAgICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAorICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCiAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSIpOwogICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KICAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQpAQCAtMjIzNyw3ICsyMjM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmIKICAgICAgICAgICAgICAgICAgICAgICAgICogNCAvIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7CiAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+CiAgICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwogICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFLApAQCAtMjg4MCw3ICsyODc5LDYgQEAKIAogI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKIAotICAgIE00T1NBX1VJbnQzMiBmaWxlUG9zOwogICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtb292UG9zLCBtZGF0UG9zOwogCiAjZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwpAQCAtMzYxNywxMiArMzYxNSw4IEBACiAKICNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCiAKLSAgICAvKiBQaWVycmUgTGViZWF1cGluIDE5LzEyLzIwMDc6IGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4gKi8KICNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCiAgICAgLyogc2VlayBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0gICAgLyogTTRPU0FfSU5UX1RPX0ZJTEVfUE9TSVRJT04oMCwgbW9vdlBvcyk7Ci0gICAgL0NMRUFOVVBvbkVSUiggbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZtb292UG9zKSApOyAqLwogICAgIC8qIC4uLiBvciByYXRoZXIsIHNlZWsgdXNlZCB0byBiZSB1c2VkIGZvciB0aGF0LCBidXQgaXQgaGFzIGJlZW4gZm91bmQgdGhpcyBmdW5jdGlvbmFsaXR5CiAgICAgaXMgbm90IHJlbGlhYmx5LCBvciBzb21ldGltZXMgbm90IGF0IGFsbCwgaW1wbGVtZW50ZWQgaW4gdGhlIHZhcmlvdXMgT1NBTHMsIHNvIHdlIG5vdyBhdm9pZAogICAgIHVzaW5nIGl0LiAqLwpAQCAtMzYzNSw5ICszNjI5LDYgQEAKICAgICAvKiBtb292UG9zIHdpbGwgYmUgdXNlZCBhZnRlciB3cml0aW5nIHRoZSBtb292LiAqLwogCiAjZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIC8qIEVuZCBvZiBQaWVycmUgTGViZWF1cGluIDE5LzEyLzIwMDc6IGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4gKi8KLQotICAgIC8qbW9vdiovCiAKICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobW9vdlNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKQEAgLTQ1MTIsMTMgKzQ1MDMsMTIgQEAKICAgICAvKm92ZXJ3cml0ZSBtZGF0IHNpemUqLwogCiAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgICAgICBmaWxlUG9zID0gMTYgKyBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNDsKKyAgICAgICAgbWRhdFBvcz0gMTYgKyBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNDsKICAgICBlbHNlCi0gICAgICAgIGZpbGVQb3MgPSAyNDsKKyAgICAgICAgbWRhdFBvcyA9IDI0OwogCi0gICAgTTRPU0FfSU5UX1RPX0ZJTEVfUE9TSVRJT04oZmlsZVBvcywgbWRhdFBvcyk7Ci0gICAgTTRPU0FfRlBPU19TVUIobW9vdlBvcywgbW9vdlBvcywgbWRhdFBvcyk7Ci0gICAgTTRPU0FfRklMRV9QT1NJVElPTl9UT19JTlQobW9vdlBvcywgbWRhdFNpemUpOworICAgIG1vb3ZQb3MgPSBtb292UG9zIC0gbWRhdFBvczsKKyAgICBtZGF0U2l6ZSA9IG1vb3ZQb3M7CiAKICAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKGZpbGVXcml0ZXJDb250ZXh0LAogICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZtZGF0UG9zKSk7IC8qc2VlayBhZnRlciBmdHlwLi4uKi8KQEAgLTQ1NzksMTQgKzQ1NjksMTQgQEAKIAogICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7CisgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7CiAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIC8qIERlbGV0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcpOworICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcpOwogICAgICAgICBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTQ3MDcsMTEgKzQ2OTcsMTEgQEAKICAgICAgICAgbWVtQWRkclB0ci0+c2l6ZSA9IDE2OwogICAgICAgICAvKmlmIG5vIHZhbHVlIHdhcyBzZXQsIHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgKi8KICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLCAxNik7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAorICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLCAxNik7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAorICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCiAgICAgICAgICAgICAxNik7CiAgICAgICAgIGJyZWFrOwogCkBAIC00NzI1LDExICs0NzE1LDExIEBACiAgICAgICAgIG1lbUFkZHJQdHItPnNpemUgPSA2MDsKICAgICAgICAgLyppZiBubyB2YWx1ZSB3YXMgc2V0LCByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIDAgKi8KICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAorICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAorICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCiAgICAgICAgICAgICA2MCk7CiAgICAgICAgIGJyZWFrOwogCkBAIC00OTU2LDE0ICs0OTQ2LDE0IEBACiAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9PSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV9tYWxsb2MoMTYsIE00TVA0X1dSSVRFUiwKKyAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDE2LCBNNE1QNF9XUklURVIsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImVtYmVkZGVkU3RyaW5nIik7CiAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCwKICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyplbHNlLCBqdXN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXNseSBzZXQgc3RyaW5nKi8KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwgMTYpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywKKyAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDE2KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgKE00TVA0V19pbnRlZ3JhdGlvblRhZyk6CkBAIC00OTc1LDcgKzQ5NjUsNyBAQAogICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfbWFsbG9jKDYwLCBNNE1QNF9XUklURVIsCisgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2MCwgTTRNUDRfV1JJVEVSLAogICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnRlZ3JhdGlvblRhZyIpOwogICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwsCiAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKQEAgLTQ5ODMsMTYgKzQ5NzMsMTYgQEAKICAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCiAgICAgICAgICAgICBpZiAobWVtQWRkclB0ci0+c2l6ZSA8IDYwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKICAgICAgICAgICAgICAgICAgICAgNjApOwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1lbUFkZHJQdHItPmFkZHIsIG1lbUFkZHJQdHItPnNpemUpOworICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgbWVtQWRkclB0ci0+c2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbWVtQWRkclB0ci0+YWRkciwgNjApOworICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgNjApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTUxODAsMTQgKzUxNzAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01MjE2LDE0ICs1MjA2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7CkBAIC01MjM4LDggKzUyMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KQEAgLTUyNDksMTQgKzUyMzgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwgTTRNUDRfV1JJVEVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01Mjg0LDE0ICs1MjczLDE0IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENMT0NLLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENMT0NLLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2M2IxMzUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDTE9DSy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDExIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNENMT0NLLmgKLSAqIEBicmllZiAgQ2xvY2sgYW5kIHNsZWVwIGZ1bmN0aW9ucyB0eXBlcwotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRDTE9DS19IX18KLSNkZWZpbmUgX19NNENMT0NLX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyoqCi0gKiBUeXBlIG9mIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRpbWUuCi0gKi8KLXR5cGVkZWYgTTRPU0FfRG91YmxlICAgICgqTTRDTE9DS19nZXRUaW1lX2ZjdCkgKCBNNE9TQV9Wb2lkKiBwQ29udGV4dCApIDsKLQotLyoqCi0gKiBUeXBlIG9mIGEgZnVuY3Rpb24gdGhhdCBzdXNwZW5kcyBhIHRhc2sgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KLSAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkICAgICAgICAoKk00Q0xPQ0tfc2xlZXBfZmN0KSAgICAoIE00T1NBX1ZvaWQqIHBDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGR1cmF0aW9uSW5NcyApIDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRDTE9DS19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCmluZGV4IGQ0MWY5MzQuLjA3NzliZjkgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REFfVHlwZXMuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmgKQEAgLTgzLDcgKzgzLDcgQEAKICAgICBNNF9TdHJlYW1UeXBlICAgIG1fc3RyZWFtVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gdHlwZSAqLwogICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cmVhbUlkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gSWQgKHVuaXF1ZSBudW1iZXIgZGVmaW5uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0pICovCi0gICAgTTRPU0FfSW50NjQgICAgICAgIG1fZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzdHJlYW0gaW4gbWlsbGkKKyAgICBNNE9TQV9JbnQzMiAgICAgICAgbV9kdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHN0cmVhbSBpbiBtaWxsaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAqLwogICAgIE00T1NBX1VJbnQzMiAgICBtX2F2ZXJhZ2VCaXRSYXRlOyAgICAgICAgICAgIC8qKjwgQXZlcmFnZSBiaXRyYXRlIGluIGtiL3MgKi8KICAgICBNNE9TQV9VSW50MzIgICAgbV9tYXhBVVNpemU7ICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIGFuIEFjY2VzcyBVbml0ICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oCmluZGV4IDEzODZjOGMuLmY2M2JjZmUgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oCkBAIC0yOSw2ICsyOSw3IEBACiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCisjaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCiAKICNkZWZpbmUgTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWCAyCiAvKiBXQVJOSU5HOiB0aGlzIHZhbHVlIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIGdyYWJiZWQgKi8KQEAgLTQ1LDcgKzQ2LDcgQEAKIHR5cGVkZWYgZW51bQogewogIC8qIE1heGltdW0gZ2VuZXJhdGVkIEFVIHNpemUgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9fbWF4QVVzaXplICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgICAgICBNNEVOQ09ERVJfQVVESU8sIDB4MDEpCisgICAgTTRFTkNPREVSX0F1ZGlvX21heEFVc2l6ZSAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsTTRFTkNPREVSX0FVRElPLCAweDAxKQogCiB9IE00RU5DT0RFUl9BdWRpb19PcHRpb25JRDsKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRNRFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE1EUF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAwMGNkOC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE1EUF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TURQX0FQSS5oCi0gKiBAYnJpZWYgIFBhcnNlciBvZiBtZXRhZGF0YQotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNE1EUF9BUElfSF9fCi0jZGVmaW5lIF9fTTRNRFBfQVBJX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTUQ0TURQX2Nsb3NlIE00TURQX2Nsb3NlCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKmRlZmluZSB0aGUgYnVmZmVyIHNpemUgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uKi8KLSNkZWZpbmUgTTRNRFBfSU5QVVRfQlVGRkVSX1NJWkUgICAgODE5MgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1YmxpYyB0eXBlIG9mIHRoZSBNNE1EUF9vc2FGaWxlUHRyU3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgIG1fcEZpbGVSZWFkZXJGY3RzOwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBtX3BGaWxlV3JpdGVyRmN0czsKLX0gTTRNRFBfb3NhRmlsZVB0clN0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1YmxpYyB0eXBlIG9mIHRoZSBNRFAgZXhlY3V0aW9uIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00TURQX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWV0YWRhdGEgUGFyc2VyIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00V0FSX01EUF9NRURJQVRZUEVfTk9UX0RFVEVDVEVEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNRFAsIDB4MDAwMDAxKQotCi0jZGVmaW5lICAgIE00RVJSX01EUF9GQVRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRNRFAsIDB4MDAwMDAwKQotI2RlZmluZSAgICBNNEVSUl9NRFBfVU5TVVBQT1JURURfVEFHX1ZFUlNJT04gICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1EUCwgMHgwMDAwMDEpCi0jZGVmaW5lICAgIE00RVJSX01EUF9VTlNVUFBPUlRFRF9FTkNPRElOR19UWVBFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRNRFAsIDB4MDAwMDAyKQotI2RlZmluZSAgICBNNEVSUl9NRFBfSU5JVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1EUCwgMHgwMDAwMDMpCi0jZGVmaW5lICAgIE00RVJSX01EUF9BU1NFVF9QQVJTSU5HX0VSUk9SICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TURQLCAweDAwMDAwNCkKLSNkZWZpbmUgTTRFUlJfTURQX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1EUCwgMHgwMDAwMDUpCi0jZGVmaW5lIE00RVJSX01EUF9JTlZBTElEX1BBVEggICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1EUCwgMHgwMDAwMDYpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWV0YWRhdGEgcGFyc2VyIEZVTkNUSU9OUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0dGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgbWV0YWRhdGEgcGFyc2VyCi0gKiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGdldHRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIE1EUCBsaWJyYXJ5LgotICoKLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgKE9VVCkgUG9pbnRlciBvbiBhbiBhbGxvY2F0ZWQgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgTTRNRFBfZ2V0VmVyc2lvbigpIHN1Y2Nlc3NmdWxseSByZXR1cm5zLCB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgZmlsbGVkIHdpdGggdGhlIHZlcnNpb24gbnVtYmVycy4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgYXBwbGljYXRpb24uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBwVmVyc2lvbkluZm8gaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00TURQX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6aW5nIHRoZSBNRFAKLSAqICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgTURQIGFuZCBhbGxvY2F0ZXMgdGhlIE1EUCBleGVjdXRpb24KLSAqICAgICAgICAgICAgY29udGV4dCBhbmQgcGFyc2VzIHRoZSBtZXRhZGF0YQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBuZWVkZWQgdG8gc3RvcmUgbWV0YWRhdGEgaW4KLSAqICAgICAgICAgICAgVEFHIElEMyBWMSZWMiwgQVNGIG9yIDNncHAgYXNzZXQgc3RydWN0dXJlIHdpdGggdGhlIE9TQUwgYWxsb2NhdGlvbgotICogICAgICAgICAgICBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgVGhpcyBtZW1vcnkgd2lsbCBiZSBmcmVlZCBpbiBNNE1EUF9jbGVhblVwIGZ1bmN0aW9uCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpICAgIEV4ZWN1dGlvbiBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcEZpbGVQYXRoICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIG11bHRpbWVkaWEgZmlsZSBwYXRoCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkZXJGY3RzICAgIChJTikgICAgUG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIE9TQUwgZmlsZSByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIHBvaW50ZXJzCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCwgb25lIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNFdBUl9SRUFERVJfTk9fTUVUQURBVEEgICAgICAgIFRoZSBpbnB1dCBmaWxlIGRvZXNuJ3QgY29udGFpbiBtZXRhZGF0YQotICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCByZWNvZ25pemVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00TURQX2luaXQoTTRNRFBfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0NoYXIqIHBGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIHBGaWxlUmVhZGVyRmN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIE1EUCBleGVjdXRpb24gY29udGV4dCBhbmQgYWxsIG1ldGFkYXRhCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZXMgYWxyZWFkeSBhbGxvY2F0ZWQgYnkgTTRNRFBfaW5pdAotICoKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgc3luY2hyb25vdXMuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIENvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIHBDb250ZXh0IGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00TURQX2NsZWFuVXAoTTRNRFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gSW5pdGlhbGl6ZXMgdGhlIG1ldGEgZGF0YSBwYXJzZXIgb25seSBvbmNlIHRvIGNoZWNrIHNldmVyYWwgZmlsZXMgb25lCi0gKiAgICAgICAgICAgIGFmdGVyIGFub3RoZXIuCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gQ29udGV4dAotICAqIEBwYXJhbSAgICBwRmlsZVJlYWRlckZjdHMgICAgKElOKSAgICBQb2ludGVyIHRvIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgT1NBTCBmaWxlIHJlYWRlcgotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIHBvaW50ZXJzCi0qCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIHBDb250ZXh0IGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00TURQX2dsb2JhbEluaXQoTTRNRFBfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgcEZpbGVSZWFkZXJGY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBvcGVucyBhIGZpbGUgaW4gdGhlIG1ldGEgZGF0YSBwYXJzZXIKLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcEZpbGVQYXRoICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIG11bHRpbWVkaWEgZmlsZSBwYXRoCi0gICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgcENvbnRleHQgaXMgTlVMTC4gKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRNRFBfb3BlbihNNE1EUF9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbG9zZXMgYSBmaWxlIGluIHRoZSBtZXRhIGRhdGEgcGFyc2VyCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gQ29udGV4dAotICAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIHBDb250ZXh0IGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00TURQX2Nsb3NlKE00TURQX0NvbnRleHQqIHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGUgZnVuY3Rpb24gYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgYWxsIGZpZWxkcyBvZiB0aGUKLSAqICAgICAgICAgICAgTTRfTWV0YURhdGFGaWVsZHMgc3RydWN0dXJlCi0gKiAgICAgICAgICAgIEl0IGJhc2ljYWxseSBzZXRzIE00X01ldGFEYXRhRmllbGRzIHN0cnVjdHVyZSBmaWVsZHMgcG9pbnRlcnMgdG8KLSAqICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgYWxyZWFkeSByZXRyaWV2ZWQgbWV0YWRhdGEKLSAqCi0gKiBAbm90ZSAgICBJZiBtZXRhZGF0YSBhcmUgcmV0cmlldmVkIGZyb20gYW4gTVAzIG9yIGFuIEFBQyBmaWxlcywgYW5kIGJvdGgKLSAqICAgICAgICAgICAgVEFHIElEMyBWMSBhbmQgVjIgYXJlIHByZXNlbnQsIHRoZW4sIHByaW9yaXR5IGlzIGZvciBtZXRhZGF0YSBvZiBUQUcgSUQzIFYyCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBzcGVjaWFsbHkgYnkgdGhlIG11c2ljIG1hbmFnZXIgcHJvamVjdAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKElOKSBFeGVjdXRpb24gQ29udGV4dAotICogQHBhcmFtICAgIHBNZXRhZGF0YSAgICAgICAgKE9VVCkgUG9pbnRlciB0byBNNF9NZXRhRGF0YUZpZWxkcyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IG9yIHBNZXRhZGF0YSBpcyBOVUxMLiAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfUkVBREVSX05PX01FVEFEQVRBICAgICAgICBUaGUgaW5wdXQgZmlsZSBkb2Vzbid0IGNvbnRhaW4gbWV0YWRhdGEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRNRFBfZ2V0TWV0YWRhdGEoTTRNRFBfQ29udGV4dCBwQ29udGV4dCwgTTRfTWV0YURhdGFGaWVsZHMqIHBNZXRhZGF0YSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYXVkaW8gYW5kIHZpZGVvIG1lZGlhIHR5cGUKLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHNwZWNpYWxseSBieSB0aGUgbXVzaWMgbWFuYWdlciBwcm9qZWN0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIEV4ZWN1dGlvbiBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcEF1ZGlvICAgICAgICAgICAgKE9VVCkgICAgQXVkaW8gbWVkaWEgdHlwZSBwb2ludGVyCi0gKiBAcGFyYW0gICAgcFZpZGVvICAgICAgICAgICAgKE9VVCkgICAgVmlkZW8gbWVkaWEgdHlwZSBwb2ludGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRTdHJlYW1zVHlwZShNNE1EUF9Db250ZXh0IHBDb250ZXh0LE00X1N0cmVhbVR5cGUqIHBBdWRpbyxNNF9TdHJlYW1UeXBlKiBwVmlkZW8pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWVkaWFUeXBlCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBzcGVjaWFsbHkgYnkgdGhlIG11c2ljIG1hbmFnZXIgcHJvamVjdAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKElOKSAgICBFeGVjdXRpb24gQ29udGV4dAotICogQHBhcmFtICAgIHBNZWRpYVR5cGUgICAgICAgIChPVVQpICAgIE1lZGlhVHlwZSBwb2ludGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRNZWRpYVR5cGUoTTRNRFBfQ29udGV4dCBwQ29udGV4dCxNNFJFQURFUl9NZWRpYVR5cGUqIHBNZWRpYVR5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICAgcmV0dXJucyBtZWRpYVR5cGUgZm91bmQgaW4gYSBmaWxlCi0qIEBub3RlCi0qIEBwYXJhbSAgICAgICAgcEZpbGVEZXNjcmlwdG9yIChJTikgOiBwb2ludGVyIHRvIGZpbGUgZGVzY3JpcHRvcgotKiBAcGFyYW0gICAgICAgIHBGaWxlRnVuY3Rpb24gKElOKSAgIDogcG9pbnRlciB0byBmaWxlIGZ1bmN0aW9uCi0qIEBwYXJhbSAgICAgICAgcE1lZGlhVHlwZSAoT1VUKSAgICAgOiBtZWRpYVR5cGUgaWYgZm91bmQKLSogQHJldHVybiAgICAgICBNNE5PX0VSUk9SIC8gTTRFUlJfQUxMT0MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRNZWRpYVR5cGVGcm9tRmlsZShNNE9TQV9Wb2lkICpwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICAgcmV0dXJuIG1lZGlhIHR5cGUgYnkgZXh0ZW5zaW9uIGFuZCBjb250ZW50IGRldGVjdGlvbnMKLSogQG5vdGUKLSogQHBhcmFtICAgICAgICBwRmlsZURlc2NyaXB0b3IgKElOKSA6IHBvaW50ZXIgdG8gZmlsZSBkZXNjcmlwdG9yCi0qIEBwYXJhbSAgICAgICAgZGF0YUJ1ZmZlciAoSU4pICA6IG1lbW9yeSBidWZmZXIKLSogQHBhcmFtICAgICAgICBidWZmZXJTaXplIChJTikgIDogYnVmZmVyIHNpemUKLSogQHBhcmFtICAgICAgICBwTWVkaWFUeXBlIChPVVQpIDogbWVkaWFUeXBlIGlmIGZvdW5kCi0qIEByZXR1cm4gICAgICAgTTROT19FUlJPUiAvIE00RVJSX0FMTE9DCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgICAgTTRNRFBfZ2V0TWVkaWFUeXBlRnJvbUV4dGVuc2lvbkFuZENvbnRlbnQoTTRPU0FfVm9pZCAqcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgICByZXR1cm4gbWVkaWEgdHlwZSBieSBjb250ZW50IGRldGVjdGlvbgotKiBAbm90ZQotKiBAcGFyYW0gICAgICAgIGRhdGFCdWZmZXIgKElOKSAgOiBtZW1vcnkgYnVmZmVyCi0qIEBwYXJhbSAgICAgICAgYnVmZmVyU2l6ZSAoSU4pICA6IGJ1ZmZlciBzaXplCi0qIEBwYXJhbSAgICAgICAgcE1lZGlhVHlwZSAoT1VUKSA6IG1lZGlhVHlwZSBpZiBmb3VuZAotKiBAcmV0dXJuICAgICAgIE00Tk9fRVJST1IgLyBNNEVSUl9BTExPQwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSICAgIE00TURQX2dldE1lZGlhVHlwZUZyb21Db250ZW50KE00T1NBX1VJbnQ4ICpkYXRhQnVmZmVyLCBNNE9TQV9VSW50MzIgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBwYXJzZXMgdGhlIGJ1ZmZlciBwQXNmQnVmZmVyLCBleHRyYWN0cyBtZXRhZGF0YSwKLSAqICAgICAgICAgICAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcE1ldGFEYXRhIGFuZCBmaWxscyBpbi4KLSAqCi0gKiBAbm90ZSAgICBwQXNmQnVmZmVyIG93bnMgdGhlIGFwcGxpY2F0aW9uIChjYWxsZXIpLgotICogICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gZnJlZSBwQXNmQnVmZmVyIGFuZCBwTWV0YURhdGEKLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzLgotICoKLSAqIEBwYXJhbSAgICBwQXNmQnVmZmVyICAgICAgICAgICAgKElOKSAgICBpbnB1dCBidWZmZXIKLSAqIEBwYXJhbSAgICBwTWV0YURhdGEgICAgICAgICAgICAoT1VUKSAgICBQb2ludGVyIHRvIHRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IG9yIHBBc2ZCdWZmZXIgaXMgTlVMTC4gKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00V0FSX1JFQURFUl9OT19NRVRBREFUQSAgICAgICAgVGhlIE00UkVBREVSX0J1ZmZlciBkb2Vzbid0IGNvbnRhaW4gbWV0YWRhdGEKLSAqIEByZXR1cm4gICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgcmVjb2duaXplZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9wYXJzZUFTRkNvbnRlbnREZXNjKE00UkVBREVSX0J1ZmZlciogcEFzZkJ1ZmZlciwgTTRfTWV0YURhdGFGaWVsZHMgKnBNZXRhRGF0YSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBNZXRhRGF0YSBhbmQgY29waWVzIGl0cwotICogICAgICAgICAgICBwQXNzZXRGaWVsZHMgZmllbGRzCi0gKgotICogQG5vdGUgICAgVGhlIGFwcGxpY2F0aW9uIHdoaWNoIGNhbGxzIE00TURQX3BhcnNlM0dwcEFzc2V0RmllbGQgTVVTVCBmcmVlIHBNZXRhRGF0YS4KLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzLgotICoKLSAqIEBwYXJhbSAgICBwQXNzZXRGaWVsZHMgICAgKElOKSAgICBBc3NldCBmaWVsZHMgc3RydWN0dXJlIGZpbGxlZCBieSB0aGUgM2dwcCByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWV0YURhdGEgICAgICAgIChPVVQpICAgIE1ldGFkYXRhIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgaW4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IG9yIHBBc3NldEZpZWxkcyBpcyBOVUxMLiAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgcmVjb2duaXplZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9wYXJzZTNHcHBBc3NldEZpZWxkKE00X01ldGFEYXRhRmllbGRzKiBwQXNzZXRGaWVsZHMsIE00X01ldGFEYXRhRmllbGRzICpwTWV0YURhdGEpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwTWV0YURhdGEgYW5kIGNvcGllcyBpdHMKLSAqICAgICAgICAgICAgcEV4aWZGaWVsZHMgZmllbGRzCi0gKgotICogQG5vdGUgICAgVGhlIGFwcGxpY2F0aW9uIHdoaWNoIGNhbGxzIE00TURQX3BhcnNlRXhpZkZpZWxkIE1VU1QgZnJlZSBwTWV0YURhdGEuCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAqCi0gKiBAcGFyYW0gICAgcEV4aWZGaWVsZHMgICAgKElOKSAgICBFeGlmIGZpZWxkcyBzdHJ1Y3R1cmUgZmlsbGVkIGJ5IHRoZSBleGlmIHJlYWRlcgotICogQHBhcmFtICAgIHBNZXRhRGF0YSAgICAoT1VUKSAgICBNZXRhZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCBvciBwQXNzZXRGaWVsZHMgaXMgTlVMTC4gKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgICAgVGhlIGlucHV0IGZpbGUgaXMgbm90IHJlY29nbml6ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRNRFBfcGFyc2VFeGlmRmllbGQoTTRfTWV0YURhdGFGaWVsZHMgKnBFeGlmRmllbGRzLCBNNF9NZXRhRGF0YUZpZWxkcyAqcE1ldGFEYXRhKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBmaWxscyB0aGUgcE1ldGFEYXRhU3RydWN0IGJ5IHBhcnNpbmcKLSAqICAgICAgICAgICAgYSBidWZmZXIKLSAqCi0gKiBAbm90ZSAgICBwTWV0YURhdGFTdHJ1Y3Qgb3ducyB0aGUgYXBwbGljYXRpb24gKGNhbGxlcikuCi0gKiAgICAgICAgICAgIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gKGNhbGxlcikgdG8gZnJlZSBpdAotICoKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgc3luY2hyb25vdXMuCi0gKgotICogQHBhcmFtICAgICAgICBwQnVmZmVyICAgICAgICAgICAgKElOKSAgICBpbnB1dCBidWZmZXIKLSAqIEBwYXJhbSAgICAgICAgbWVkaWFUeXBlICAgICAgICAoSU4pICAgIG1lZGlhIHR5cGUgb2YgdGhlIGJ1ZmZlcgotICogQHBhcmFtICAgICAgICBwTWV0YURhdGFTdHJ1Y3QgICAgKE9VVCkgICAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtZXRhZGF0YQotICogQHBhcmFtICAgICAgICBwU2l6ZSAgICAgICAgICAgIChPVVQpICAgIHBNZXRhRGF0YVN0cnVjdCBzaXplCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgcENvbnRleHQgb3IgcEJ1ZmZlciBvciBwTWV0YURhdGFTdHJ1Y3QgaXMgTlVMTC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSBUaGUgbWVkaWEgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCi0gKiBAcmV0dXJuICAgIE00V0FSX1JFQURFUl9OT19NRVRBREFUQSAgICBObyBtZXRhZGF0YSBkZXRlY3RlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRNZXRhRGF0YUZyb21CdWZmZXIoTTRfTWV0YWRhdGFCdWZmZXIqICAgIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAgICBtZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01ldGFEYXRhRmllbGRzKiogICAgcE1ldGFEYXRhU3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICAgcFNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG1ldGFkYXRhICBzdHJ1Y3R1cmUKLSAqCi0gKiBAcGFyYW0gICAgcE1ldGFkYXRhICAgICAgICAoT1VUKSBQb2ludGVyIHRvIE00X01ldGFEYXRhRmllbGRzIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgcENvbnRleHQgb3IgcE1ldGFkYXRhIGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9Jbml0TWV0YURhdGFGaWVsZHMoTTRfTWV0YURhdGFGaWVsZHMgKnBNZXRhRGF0YVRhYik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBmcmVlcyB0aGUgbWV0YWRhdGEgIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgICBwTWV0YWRhdGEgICAgICAgIChJTikgUG9pbnRlciB0byBNNF9NZXRhRGF0YUZpZWxkcyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIHBDb250ZXh0IG9yIHBNZXRhZGF0YSBpcyBOVUxMLiAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRNRFBfRnJlZU1ldGFEYXRhRmllbGRzKE00X01ldGFEYXRhRmllbGRzICpwTWV0YURhdGFUYWIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICAgcmV0dXJucyBtZWRpYVR5cGUgZm91bmQgaW4gYSBmaWxlCi0qIEBub3RlCi0qIEBwYXJhbSAgICAgICAgcENvbnRleHQgKElOKSA6IHBvaW50ZXIgdG8gZmlsZSBkZXNjcmlwdG9yCi0qIEBwYXJhbSAgICAgICAgcEZpbGVEZXNjcmlwdG9yIChJTikgOiBwb2ludGVyIHRvIGZpbGUgZGVzY3JpcHRvcgotKiBAcGFyYW0gICAgICAgIHBGaWxlRnVuY3Rpb24gKElOKSAgIDogcG9pbnRlciB0byBmaWxlIGZ1bmN0aW9uCi0qIEBwYXJhbSAgICAgICAgcE1lZGlhVHlwZSAoT1VUKSAgICAgOiBtZWRpYVR5cGUgaWYgZm91bmQKLSogQHJldHVybiAgICAgICBNNE5PX0VSUk9SIC8gTTRFUlJfQUxMT0MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRNZWRpYVR5cGVGcm9tRmlsZUV4dGVuZGVkKCAgICBNNE1EUF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhlIGZ1bmN0aW9uIHRvIGdldCBmaWxlIHNpemUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgUG9pbnRlciB0byBNNE1EUCBDb250ZXh0IHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBTaXplICAgICAgICAgICAgKE9VVClQb2ludGVyIHRvIGZpbGUgc2l6ZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgcENvbnRleHQgb3IgcE1ldGFkYXRhIGlzIE5VTEwuIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE1EUF9nZXRNZXRhRGF0YUZpbGVTaXplKE00TURQX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiAqcFNpemUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNE1EUF9BUElfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaAppbmRleCAxNzA2MjBjLi45MGRmODJiIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKQEAgLTIwLDIyICsyMCwxMCBAQAogCiAjaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgogCi0jaW5jbHVkZSAiTTRWRF9IV19BUEkuaCIvKiBNNFZEX0ludGVyZmFjZSAqLwotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWRF9JbnRlcmZhY2UqICAgIGV4dGVybmFsRnVuY3M7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgIGV4dGVybmFsVXNlckRhdGE7Ci19KiBNNERFQ09ERVJfRVhURVJOQUxfVXNlckRhdGFUeXBlOwotCi0vKiAtLS0tLSBJbnRlcmZhY2UgcmV0cmlldmFsIC0tLS0tICovCi0KLU00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfZ2V0SW50ZXJmYWNlKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQogLyogLS0tLS0gRFNJIGJpdHN0cmVhbSBwYXJzZXIgLS0tLS0gKi8KIAogLyogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdG8gY2xpZW50cyBvZiB0aGUgc2hlbGwgdG8gYWxsb3cgdGhlbSB0byBhbmFseXNlIGNsaXBzCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVybmFsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyZGFjYjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZEX0VYVEVSTkFMX0lOVEVSTkFMX0hfXwotI2RlZmluZSBfX000VkRfRVhURVJOQUxfSU5URVJOQUxfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogbm90IE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUgKi8KLQotLyp0eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTX1RIUkVBRF9JU19JRExFID0gMCwKLSAgICBNNFZTX1RIUkVBRF9JU19SVU5OSU5HID0gMSwKLSAgICBNNFZTX1RIUkVBRF9JU19TVE9QUElORyA9IDIKLQotfSBNNFZTX1RocmVhZFN0YXRlX3Q7Ki8KLQotCi0vKiAtLS0tLSBpbnRlcm5hbCBWUyBjb250ZXh0IC0tLS0tICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogUkVBREVSICovCi0gICAgLyoqPCBSZWZlcmVuY2UgdG8gdGhlIHJlYWRlciBkYXRhIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgYWNjZXNzIHVuaXRzICovCi0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgIG1fcFJlYWRlcjsKLSAgICAvKio8IFJlZmVyZW5jZSB0byB0aGUgYWNjZXNzIHVuaXQgdXNlZCByZWFkIGFuZCBkZWNvZGUgb25lIGZyYW1lICh0aGUgQVUgY291bGQgYmUgcGFzc2VkIGJ5Ci0gICAgdGhlIHVzZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gaW5zaWRlIHRoZSBkZWNvZGVyKSAqLwotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICAgICAgICAgICBtX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGRlY29kZSBqdXN0IGFmdGVyIGEgKHJlYWQpIGp1bXAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgbV9iSnVtcDsKLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgICAgICAgbV9uZXh0QVVDdHM7ICAgICAgICAgICAgICAgIC8qKjwgQ1RTIG9mIHRoZSBBVSBhYm92ZSAqLwotCi0gICAgLyogREVDT0RFUiAqLwotCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgIG1fRGVjb2RlVXBUb0N0czsgICAgICAgIC8qKjwgVGFyZ2V0IEN0cyBmb3IgdGhlIGRlY29kZSB1cCB0byBsb29wICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgIG1fQ3VycmVudERlY29kZUN0czsgICAgIC8qKjwgQ3RzIG9mIHRoZSBsYXRlc3QgZnJhbWUgZGVjb2RlZCAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICBtX1ByZXZpb3VzRGVjb2RlQ3RzOyAgICAvKio8IEN0cyBvZiB0aGUgcHJldmlvdXMgZnJhbWUgZGVjb2RlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX05iRGVjb2RlZEZyYW1lczsgICAgICAvKio8IE51bWJlciBvZiBmcmFtZXMgZGVjb2RlZCBpbiB0aGUgZGVjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gbG9vcCAoY2FuIGJlIDApICovCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIG1fdWlEZWNvZGVFcnJvcjsgICAgICAgIC8qKjwgRXJyb3Igb3Igd2FybmluZyBjb2RlIChmcm9tIHRoZSBWRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciBvciBkZWNvZGVyKSByZXR1cm5lZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBtX2JEYXRhRGVjb2RlUGVuZGluZzsgICAvKio8IFRoZXJlIGlzIHNvbWUgZGF0YSB0byBkZWNvZGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iSXNXYWl0TmV4dERlY29kZTsgICAgLyoqPCBEbyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBhbnRpY2lwYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIHRvIGZpbmlzaCA/ICovCi0KLSAgICAvKiBSRU5ERVIgKi8KLQotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICAgbV9UYXJnZXRSZW5kZXJDdHM7ICAgICAgICAvKio8IEN0cyBmb3IgdGhlIHJlbmRlcmluZyBzdGVwICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgICBtX0N1cnJlbnRSZW5kZXJDdHM7ICAgICAgIC8qKjwgQ3RzIG9mIHRoZSBsYXRlc3QgZnJhbWUgZGVjb2RlZCAqLwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICAgbV91aVJlbmRlckVycm9yOyAgICAgICAgICAvKio8IEVycm9yIG9yIHdhcm5pbmcgY29kZSAoZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRCByZW5kZXIpIHJldHVybmVkIHRvIHRoZSBzaGVsbCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgbV9iRm9yY2VSZW5kZXI7ICAgICAgICAgICAvKio8IEZvcmNlIHJlbmRlcmluZyBldmVuIGlmIDAgZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGRlY29kZWQgKGkuZS4gYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgZGVjb2RlZCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgIG1fYkRhdGFSZW5kZXJQZW5kaW5nOyAgICAgLyoqPCBUaGVyZSBpcyBzb21lIGRhdGEgdG8gcmVuZGVyICovCi0KLSAgICAvKiBTVFJFQU0gUEFSQU1TICovCi0KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wVmlkZW9TdHJlYW1oYW5kbGVyOyAgICAvKio8IHJlZmVyZW5jZSB0byB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBkZXNjcmlwdGlvbiBwYXNzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyICovCi0gICAgTTRWRF9TdHJlYW1JbmZvKiAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbUluZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSAgICAgICAgICAgICAgICAgIG1fVmlkZW9TaXplOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBtX0RjaTsgICAgICAgICAgICAgICAgICAvKio8IEluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJIHBhcnNpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICAgICAgbV9wT3V0cHV0UGxhbmU7ICAgICAgICAgLyoqPCBQb2ludGVyIHRvIFlVViBvdXRwdXQgcGxhbmVzICovCi0KLSAgICAvKiBWRCBBUEkgKi8KLQotICAgIE00VkRfSW50ZXJmYWNlKiAgICAgICAgICAgICAgICAgICBtX1ZEX0ludGVyZmFjZTsgICAgICAgICAgIC8qKjwgcG9pbnRlcnMgdG8gSFcgZnVuY3Rpb25zICovCi0gICAgTTRWRF9TaWduYWxpbmdJbnRlcmZhY2UgICAgICAgICAgIG1fVkRfU2lnbmFsaW5nSW50ZXJmYWNlOyAgLyoqPCBwb2ludGVycyB0byBTaGVsbCBzaWduYWxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAqLwotICAgIE00VkRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICBtX1ZEX0NvbnRleHQ7ICAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byB0aGUgcmVhbCBoYXJkd2FyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCAqLwotCi0gICAgLyogVEhSRUFEIFNUVUZGICAqLwotI2lmbmRlZiBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICBtX1NlbVN5bmM7Ci0jZW5kaWYgLyogbm90IE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUgKi8KLX0gTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dDsKLQotCi0vKiAtLS0tLSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0vKgotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2J5dGU7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9pbmRleDsKLSAgICBNNE9TQV9NZW1BZGRyOCBpbjsKLQotfSBNNFZTX0JpdHN0cmVhbV9jdHh0OwotKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000VkRfRVhURVJOQUxfSU5URVJOQUxfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0hXX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9IV19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmEzM2QxNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0hXX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZEX0hXX0FQSV9IX18KLSNkZWZpbmUgX19NNFZEX0hXX0FQSV9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBNNE9TQV9NZW1BZGRyTiAqLwotCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VkRfSFdfQVBJLkgKLSAqIEBicmllZgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiAtLS0tLSBIYXJkd2FyZSBkZWNvZGVyIGVycm9ycyBhbmQgd2FybmluZ3MgLS0tLS0gKi8KLQotI2RlZmluZSBNNEVSUl9WRF9GQVRBTCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00VkRfRVhURVJOQUwsIDB4MDAwMSkKLQotCi0vKiAtLS0tLSBlbnVtIGRlZmluaXRpb25zIC0tLS0tICovCi0KLXR5cGVkZWYgZW51bQotewotICAgIE00VkRfa09wdGlvbklkX0R1bW15ID0gMAotCi19IE00VkRfT3B0aW9uSUQ7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00VkRfa01wZWc0VmlkZW9EZWMsCi0gICAgTTRWRF9rSDI2M1ZpZGVvRGVjLAotICAgIE00VkRfa0gyNjRWaWRlb0RlYywKLSAgICBNNFZEX2tWaWRlb1R5cGVfTkIgLyogbXVzdCByZW1haW4gbGFzdCAqLwotfSBNNFZEX1ZpZGVvVHlwZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWRF9rTm9uZSwKLSAgICBNNFZEX2tZVVY0MjAsCi0gICAgTTRWRF9rWVVWNDIyLAotICAgIE00VkRfa1lVWVY0MjIsCi0gICAgTTRWRF9rUkdCNTY1LAotICAgIE00VkRfa0JHUjU2NQotCi19IE00VkRfT3V0cHV0Rm9ybWF0OwotCi0KLS8qIC0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHIzMiBwQnVmZmVyOyAgICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHZpZGVvIGJ1ZmZlciAtIDMyIGJpdHMgYWxpZ25lZCAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgYnVmZmVyU2l6ZTsgICAgICAgICAgICAgLyoqPCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyICAgICAgICAgICAgKi8KLQotfSBNNFZEX1ZpZGVvQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBhV2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aCBvZiB0aGUgSW1hZ2UgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyIGFIZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIEltYWdlICAgICovCi0KLX0gTTRWRF9JbWFnZVNpemU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggcEJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGRlY29kZXIgY29uZmlndXJhdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiBhU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBidWZmZXIgKi8KLQotfSBNNFZEX0RlY29kZXJDb25maWc7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWRF9JbWFnZVNpemUgICAgICAgIGFuSW1hZ2VTaXplOyAgICAgICAgICAgIC8qKjxTaXplIG9mIHRoZSBpbWFnZSovCi0gICAgTTRWRF9EZWNvZGVyQ29uZmlnICAgIGRlY29kZXJDb25maWd1cmF0aW9uOyAgICAvKio8Y29uZmlndXJhdGlvbiBvZiB0aGUgZGVjb2RlciovCi0KLX0gTTRWRF9TdHJlYW1JbmZvOwotCi0KLS8qIC0tLS0tIGNhbGxiYWNrcyBwcm90b3R5cGVzIC0tLS0tICovCi0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX0NCX3NpZ25hbERlY29kZXJPdmVyX2ZjdCkoIE00T1NBX1ZvaWQqIHNpZ25hbFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Eb3VibGUgZnJhbWVUaW1lLCBNNE9TQV9FUlIgZXJyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX0NCX3NpZ25hbFJlbmRlck92ZXJfZmN0KSAoIE00T1NBX1ZvaWQqIHNpZ25hbFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Eb3VibGUgZnJhbWVUaW1lLCBNNE9TQV9FUlIgZXJyKTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNpZ25hbFRhcmdldDsKLQotICAgIC8qIGRlY29kZXIgY2FsbGJhY2tzIHRoYXQgbmVlZCB0byBiZSByYWlzZWQgYnkgSFcgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSAgICBNNFZEX0NCX3NpZ25hbERlY29kZXJPdmVyX2ZjdCogICAgbV9wRmN0U2lnbmFsRGVjb2Rlck92ZXI7Ci0gICAgTTRWRF9DQl9zaWduYWxSZW5kZXJPdmVyX2ZjdCogICAgIG1fcEZjdFNpZ25hbFJlbmRlck92ZXI7Ci0KLX0gTTRWRF9TaWduYWxpbmdJbnRlcmZhY2U7Ci0KLQotLyogLS0tLS0gSGFyZHdhcmUgZGVjb2RlciBmdW5jdGlvbnMgc2V0IC0tLS0tICovCi0KLXR5cGVkZWYgdm9pZCogTTRWRF9Db250ZXh0OyAvKiBWaWRlbyBEZWNvZGVyIGNvbnRleHQgKGZvciBNNFZEX0hXX3h4eHggZnVuY3Rpb25zKSAqLwotCi0KLS8qIGNvbW1vbiAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00VkRfaW5pdF9mY3QpICAgICAgICAgICggTTRWRF9Db250ZXh0KiwgTTRWRF9TaWduYWxpbmdJbnRlcmZhY2UqICk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRWRF9zZXRPcHRpb25fZmN0KSAgICAgKCBNNFZEX0NvbnRleHQsIE00VkRfT3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX2dldE9wdGlvbl9mY3QpICAgICAoIE00VkRfQ29udGV4dCwgTTRWRF9PcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiogKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX29wZW5EZWNvZGVyX2ZjdCkgKCBNNFZEX0NvbnRleHQsIE00VkRfVmlkZW9UeXBlLCBNNFZEX1N0cmVhbUluZm8qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX091dHB1dEZvcm1hdCosIE00T1NBX1ZvaWQqICk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRWRF9zdGVwRGVjb2RlX2ZjdCkgICAgKCBNNFZEX0NvbnRleHQsIE00VkRfVmlkZW9CdWZmZXIqLCBNNE9TQV9Eb3VibGUgKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX3N0ZXBSZW5kZXJfZmN0KSAgICAoIE00VkRfQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqLCBNNE9TQV9Eb3VibGUgKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX2Nsb3NlRGVjb2Rlcl9mY3QpKCBNNFZEX0NvbnRleHQgKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZEX2NsZWFuVXBfZmN0KSAgICAgICAoIE00VkRfQ29udGV4dCApOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00VkRfc2V0T3V0cHV0RmlsdGVyX2ZjdCkoIE00VkRfQ29udGV4dCwgTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCopOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VkRfaW5pdF9mY3QqICAgICAgICAgICAgICAgIG1fcEZjdEluaXRWaWRlb0RlY29kZXI7Ci0gICAgTTRWRF9zZXRPcHRpb25fZmN0KiAgICAgICAgICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNFZEX2dldE9wdGlvbl9mY3QqICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00VkRfb3BlbkRlY29kZXJfZmN0KiAgICAgICAgbV9wRmN0T3BlbkRlY29kZXI7Ci0gICAgTTRWRF9zdGVwRGVjb2RlX2ZjdCogICAgICAgIG1fcEZjdFN0ZXBEZWNvZGU7Ci0gICAgTTRWRF9zdGVwUmVuZGVyX2ZjdCogICAgICAgIG1fcEZjdFN0ZXBSZW5kZXI7Ci0gICAgTTRWRF9jbG9zZURlY29kZXJfZmN0KiAgICAgICAgbV9wRmN0Q2xvc2U7Ci0gICAgTTRWRF9jbGVhblVwX2ZjdCogICAgICAgICAgICBtX3BGY3RDbGVhblVwOwotICAgIE00VkRfc2V0T3V0cHV0RmlsdGVyX2ZjdCogICAgbV9wRmN0U2V0T3V0cHV0RmlsdGVyOwotfSBNNFZEX0ludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9IV19BUElfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRV9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkVfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMjcwMDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRV9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRV9BUEkuaAotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgb2YgYW55IGV4dGVybmFsIGVuY29kZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNFZFX0FQSV9IX18KLSNkZWZpbmUgX19NNFZFX0FQSV9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSAqICAgIE9TQUwgdHlwZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLS8qKgotICogICAgSW5jbHVkZSBWaWRlbyBmaWx0ZXJzIGludGVyZmFjZSBkZWZpbml0aW9uIChmb3IgdGhlIE00VklGSV9JbWFnZVBsYW5lIHR5cGUpICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZFIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lICAgIE00RVJSX1ZFX0ZBVEFMICAgICAgICAoKE00T1NBX0VSUilNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRWRV9FWFRFUk5BTCwgMHgwMDAwMDApKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWRV9FbmNvZGVyTW9kZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGluIHdoaWNoIG1vZGUgdGhlIGV4dGVybmFsIGVuY29kZXIgd2lsbCBiZSB1c2VkCi0gKiAgICAgICAgICAgICgiU3RhbmRhbG9uZSBlbmNvZGVyIiBvciAiRW5jb2RlciArIEdyYWJiZXIiKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWRV9rU0VNb2RlLCAgICAgICAgLyoqPCAiU3RhbmRhbG9uZSBFbmNvZGVyIiBtb2RlICovCi0gICAgTTRWRV9rRUdNb2RlICAgICAgICAvKio8ICJFbmNvZGVyICsgR3JhYmJlciIgbW9kZSAqLwotfSBNNFZFX0VuY29kZXJNb2RlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWRV9FbmNvZGVyVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBzdXBwb3J0ZWQgZW5jb2RlciB0eXBlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWRV9rTXBlZzRWaWRlb0VuYywgICAgIC8qKjwgTVBFRy00ICovCi0gICAgTTRWRV9rSDI2M1ZpZGVvRW5jLCAgICAgIC8qKjwgSDI2MyAqLwotICAgIE00VkVfa0gyNjRWaWRlb0VuYywgICAgICAvKio8IEgyNjQgKi8KLSAgICBNNFZFX2tNSlBFR0VuYywgICAgICAgICAgICAvKio8IE1KUEVHICovCi0gICAgTTRWRV9rRW5jb2RlclR5cGVfTkIKLX0gTTRWRV9FbmNvZGVyVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0ltYWdlU2l6ZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdmlkZW8gZnJhbWUgc2l6ZSAoZm9yIGJvdGggZ3JhYmJpbmcgYW5kIGVuY29kaW5nKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgIHdpZHRoOyAgICAgLyoqPCBXaWR0aCBvZiB0aGUgSW1hZ2UgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgIGhlaWdodDsgICAgLyoqPCBIZWlnaHQgb2YgdGhlIEltYWdlICovCi19IE00VkVfSW1hZ2VTaXplOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWRV9Gb3JtYXRDb25maWcKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZnJhbWUgZm9ybWF0IHdlIGhhdmUgaW4gaW5wdXQgZm9yIHRoZSBncmFiYmluZwotICogICAgICAgICAgICBwYXJ0IG9mIHRoZSBleHRlcm5hbCBlbmNvZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VkVfa1lVVjQyMD0wLCAgICAvKio8IFlVViA0OjI6MCBwbGFuYXIgKHN0YW5kYXJkIGlucHV0IGZvciBtcGVnLTQgdmlkZW8pICovCi0gICAgTTRWRV9rWVVWNDIyLCAgICAvKio8IFlVVjQyMiBwbGFuYXIgKi8KLSAgICBNNFZFX2tZVVlWLCAgICAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00VkVfa1VZVlksICAgICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNFZFX2tKUEVHLCAgICAgICAgLyoqPCBKUEVHIGNvbXByZXNzZWQgZnJhbWVzICovCi0gICAgTTRWRV9rUkdCNDQ0LCAgICAvKio8IFJHQiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRWRV9rUkdCNTU1LCAgICAvKio8IFJHQiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRWRV9rUkdCNTY1LCAgICAvKio8IFJHQiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRWRV9rUkdCMjQsICAgIC8qKjwgUkdCIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNFZFX2tSR0IzMiwgICAgLyoqPCBSR0IgMzIgYml0cyAgKi8KLSAgICBNNFZFX2tCR1I0NDQsICAgIC8qKjwgQkdSIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNFZFX2tCR1I1NTUsICAgIC8qKjwgQkdSIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNFZFX2tCR1I1NjUsICAgIC8qKjwgQkdSIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNFZFX2tCR1IyNCwgICAgLyoqPCBCR1IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00VkVfa0JHUjMyICAgICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNFZFX0Zvcm1hdENvbmZpZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0ZyYW1lcmF0ZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1heGltdW0gZnJhbWVyYXRlIHRoZSBlbmNvZGVyIHdpbGwgaGF2ZQotICogICAgICAgICAgICBhdCBpbnB1dCBhbmQgd2lsbCBnZW5lcmF0ZSBhdCBvdXRwdXQgKGluIGZyYW1lcyBwZXIgc2Vjb25kKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgZnJhbWVyYXRlTnVtOyAgICAvKio8IEZyYW1lcmF0ZSBudW1lcmF0b3IgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgIGZyYW1lcmF0ZURlbjsgICAgLyoqPCBGcmFtcmF0ZSBkZW5vbWluYXRvciAqLwotfSBNNFZFX0ZyYW1lcmF0ZTsKLS8qKjwgICAgIEZvciBleGFtcGxlLCBhIGZyYW1lcmF0ZSBvZiAyOS45NyBmcHMgZm9yIEgyNjMgZW5jb2Rpbmcgd2lsbCBiZSBleHByZXNzZWQgYXM6Ci0gICAgRnJhbWVyYXRlTnVtID0gMzAwMDAKLSAgICBGcmFtZXJhdGVEZW4gPSAxMDAxICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9HcmFiYmluZ1BhcmFtZXRlcnMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBncmFiYmluZyBwYXJhbWV0ZXJzIHNldCBhdCBvcGVuIHN0ZXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZFX0ltYWdlU2l6ZSAgICAgICAgc2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiBncmFiYmVkIGZyYW1lcyAqLwotICAgIE00VkVfRm9ybWF0Q29uZmlnICAgIGZvcm1hdDsgICAgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBncmFiYmVkIGZyYW1lcyAoWVVWNDIwLCBSR0I1NjUsZXRjLikgKi8KLX0gTTRWRV9HcmFiYmluZ1BhcmFtZXRlcnM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9FbmNvZGluZ1BhcmFtZXRlcnMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHNldCBhdCBvcGVuIHN0ZXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZFX0VuY29kZXJUeXBlICB0eXBlOyAgICAgICAgICAgICAvKio8IGNvZGluZyB0eXBlIChIMjYzL0gyNjQvTVBFRy00KSovCi0gICAgTTRWRV9JbWFnZVNpemUgICAgc2l6ZTsgICAgICAgICAgICAgLyoqPCBTaXplIG9mIGZyYW1lcyB0byBlbmNvZGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgIGJSYXRlQ29udHJvbEVuYWJsZTsgLyoqPCBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHJhdGUgY29udHJvbCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgYkxvd0RlbGF5OyAgICAgICAgLyoqPCBmb3JjZSBlbmNvZGVyIGluICJsb3cgZGVsYXkiIG1vZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICBiaXRyYXRlOyAgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgdGFyZ2V0ZWQgYml0cmF0ZSBpbiBiaXQgcGVyIHNlYyAqLwotICAgIE00VkVfRnJhbWVyYXRlICAgIGZyYW1lcmF0ZTsgICAgICAgIC8qKjwgTWF4aW11bSBpbnB1dCBmcmFtZXJhdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICB0aW1lc2NhbGU7ICAgICAgIC8qKjwgdGltZXNjYWxlIG9mIHRoZSB2aWRlbyBiaXRzdHJlYW0gKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICBwVXNlclNldHRpbmdzOyAgIC8qKjwgQWRkaXRpb25uYWwgdXNlciBzZXR0aW5ncyBwYXNzZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2aWNlIGF0IENvZGVjIHJlZ2lzdHJhdGlvbiAqLwotfSBNNFZFX0VuY29kaW5nUGFyYW1ldGVyczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX1ZpZGVvQnVmZmVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgZW5jb2RlZCBkYXRhCi0gKiAgICAgICAgICAgIGFyZSBzdG9yZWQgYnkgdGhlIGVuY29kZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyMzIgcEJ1ZmZlcjsgICAgLyoqPCBwb2ludGVyIHRvIHZpZGVvIGJ1ZmZlciAzMiBiaXRzIGFsaWduZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgYnVmZmVyU2l6ZTsgLyoqPCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyICovCi19IE00VkVfVmlkZW9CdWZmZXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9QYXJhbWV0ZXJTZXQKLSAqIEBicmllZiAgICBQYXJhbWV0ZXIgc2V0IHN0cnVjdHVyZSB1c2VkIGZvciBIMjY0IGhlYWRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MTYgICAgbGVuZ3RoOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBpdGVtcyovCi0gICAgTTRPU0FfVUludDgqICAgIHBQYXJhbWV0ZXJTZXRVbml0OyAgLyoqPCBBcnJheSBvZiBpdGVtcyovCi19IE00VkVfUGFyYW1ldGVyU2V0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00VkVfSDI2NEhlYWRlckJ1ZmZlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgc3RyZWFtIGhlYWRlciBpcyBzdG9yZWQKLSAqICAgICAgICAgICAgYnkgdGhlIGVuY29kZXIsIGluIGNhc2Ugb2YgSDI2NAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICBOQUxVbml0TGVuZ3RoOyAgICAgICAgICAgICAvKio8IGxlbmd0aCBpbiBieXRlcyBvZiBhIE5BTCBhY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgbk9mU2VxdWVuY2VQYXJhbWV0ZXJzU2V0czsgLyoqPCBOdW1iZXIgb2Ygc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgbk9mUGljdHVyZVBhcmFtZXRlcnNTZXRzOyAgLyoqPCBOdW1iZXIgb2YgcGljdHVyZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgTTRWRV9QYXJhbWV0ZXJTZXQgICAgKnBTZXF1ZW5jZVBhcmFtZXRlclNldHM7ICAgIC8qKjwgU2VxdWVuY2UgcGFyYW1ldGVyIHNldCBhcnJheSAqLwotICAgIE00VkVfUGFyYW1ldGVyU2V0ICAgICpwUGljdHVyZVBhcmFtZXRlclNldHM7ICAgICAgICAvKio8IFBpY3R1cmUgcGFyYW1ldGVyIHNldCBhcnJheSAqLwotfSBNNFZFX0gyNjRIZWFkZXJCdWZmZXI7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0hlYWRlckJ1ZmZlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgc3RyZWFtIGhlYWRlciBpcyBzdG9yZWQKLSAqICAgICAgICAgICAgYnkgdGhlIGVuY29kZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgTTRWRV9WaWRlb0J1ZmZlciAgICAgICAgIGhlYWRlcjsgICAgIC8qKjwgTVBFRy00LCBIMjYzLCBNSlBFRyAqLwotICAgICAgICBNNFZFX0gyNjRIZWFkZXJCdWZmZXIgICAgIEgyNjRIZWFkZXI7IC8qKjwgSDI2NCAqLwotICAgIH1NNFZFX1NwZWNpZmljSGVhZGVyOwotfSBNNFZFX0hlYWRlckJ1ZmZlcjsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VkVfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGRlZmluZXMgdGhlIHN1cHBvcnRlZCBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIGR1bW15PTAKLX0gTTRWRV9PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsT3BlbkVuY29kZXJEb25lKShNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc2lnbmFscyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBleHRlcm5hbCBlbmNvZGVyIGlzIG9wZW5lZC4KLSAqIEBub3RlICAgIFRoZSBleHRlcm5hbCBlbmNvZGVyIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29kZXMgaW4gdGhlIGVyckNvZGUgcGFyYW1ldGVyOgotICogICAgICAgICAgICBNNE5PX0VSUk9SICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiAgICAgICAgICAgIE00RVJSX1ZFX0ZBVEFMICAgIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQKLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAgICAgICAgIChJTikgVXNlciBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2aWNlIGF0IGluaXQgc3RlcC4KLSAqIEBwYXJhbSAgICBlcnJDb2RlIDogICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHJldHVybmVkIHRvIHRoZSBzZXJ2aWNlIGludGVybmFsIGxheWVycy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0ZBVEFMOiAgICAgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxPcGVuRW5jb2RlckRvbmUpKE00T1NBX0NvbnRleHQgcFVzZXJEYXRhLCBNNE9TQV9FUlIgZXJyQ29kZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsSGVhZGVyRG9uZSkoTTRPU0FfQ29udGV4dCBwVXNlckRhdGEsIE00T1NBX0VSUiBlcnJDb2RlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0hlYWRlckJ1ZmZlciAqcEJ1ZmZlcik7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBzaWduYWxzIHRvIHRoZSBzZXJ2aWNlIHRoYXQgdGhlIHN0cmVhbSBoZWFkZXIgaXMgcmVhZHkuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgZW5jb2RlciByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzIGluIHRoZSBlcnJDb2RlIHBhcmFtZXRlcjoKLSAqICAgICAgICAgICAgTTROT19FUlJPUiAgICBUaGVyZSBpcyBubyBlcnJvcgotICogICAgICAgICAgICBNNEVSUl9WRV9GQVRBTCAgICBhIGZhdGFsIGVycm9yIG9jY3VycmVkCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgICAgICAgICAoSU4pIFVzZXIgZGF0YSBwcm92aWRlZCBieSB0aGUgc2VydmljZSBhdCBpbml0IHN0ZXAuCi0gKiBAcGFyYW0gICAgZXJyQ29kZSA6ICAgICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSByZXR1cm5lZCB0byB0aGUgc2VydmljZSBpbnRlcm5hbCBsYXllcnMuCi0gKiBAcGFyYW0gICAgcEJ1ZmZlciA6ICAgICAgICAgICAgICAgIChJTikgU3RyZWFtIGhlYWRlci4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHBCdWZmZXIgZmllbGQgaXMgbnVsbCBvciBpbnZhbGlkLgotICogQHJldHVybiAgICBNNEVSUl9WRV9GQVRBTDogICAgICAgIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsSGVhZGVyRG9uZSkoTTRPU0FfQ29udGV4dCBwVXNlckRhdGEsIE00T1NBX0VSUiBlcnJDb2RlLAotICAgICAgICAgICAgICAgICAgICAgTTRWRV9IZWFkZXJCdWZmZXIgKnBCdWZmZXIpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfSW50MzIgKCpNNFZFX1NpZ25hbFN0YXJ0R3JhYmJlckRvbmUpKE00T1NBX0NvbnRleHQgcFVzZXJEYXRhLCBNNE9TQV9FUlIgZXJyQ29kZSk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBzaWduYWxzIHRvIHRoZSBzZXJ2aWNlIHRoYXQgdGhlIGdyYWJiaW5nIHBhcnQgaXMgc3RhcnRlZC4KLSAqICAgICAgICAgICAgVGhpcyBjYWxsYmFjayBpcyB1bnVzZWQgaW4gdGhlICJzdGFuZGFsb25lIGVuY29kZXIiIG1vZGUuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgZW5jb2RlciByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzIGluIHRoZSBlcnJDb2RlIHBhcmFtZXRlcjoKLSAqICAgICAgICAgICAgTTROT19FUlJPUiAgICBUaGVyZSBpcyBubyBlcnJvcgotICogICAgICAgICAgICBNNEVSUl9WRV9GQVRBTCAgICBhIGZhdGFsIGVycm9yIG9jY3VycmVkCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgICAgICAgICAoSU4pIFVzZXIgZGF0YSBwcm92aWRlZCBieSB0aGUgc2VydmljZSBhdCBpbml0IHN0ZXAuCi0gKiBAcGFyYW0gICAgZXJyQ29kZSA6ICAgICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSByZXR1cm5lZCB0byB0aGUgc2VydmljZSBpbnRlcm5hbCBsYXllcnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9WRV9GQVRBTDogICAgICAgIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsU3RhcnRHcmFiYmVyRG9uZSkoTTRPU0FfQ29udGV4dCBwVXNlckRhdGEsIE00T1NBX0VSUiBlcnJDb2RlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxTdGFydEVuY29kZXJEb25lKShNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc2lnbmFscyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBleHRlcm5hbCBlbmNvZGVyIGlzIHN0YXJ0ZWQuCi0gKiAgICAgICAgICAgIFRoaXMgY2FsbGJhY2sgaXMgdW51c2VkIGluIHRoZSAic3RhbmRhbG9uZSBlbmNvZGVyIiBtb2RlLgotICogQG5vdGUgICAgVGhlIGV4dGVybmFsIGVuY29kZXIgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlcyBpbiB0aGUgZXJyQ29kZSBwYXJhbWV0ZXI6Ci0gKiAgICAgICAgICAgIE00Tk9fRVJST1IgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqICAgICAgICAgICAgTTRFUlJfVkVfRkFUQUwgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZAotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgICAgICAgICAgKElOKSBVc2VyIGRhdGEgcHJvdmlkZWQgYnkgdGhlIHNlcnZpY2UgYXQgaW5pdCBzdGVwLgotICogQHBhcmFtICAgIGVyckNvZGUgOiAgICAgICAgICAgICAgICAoSU4pIEVycm9yIGNvZGUgcmV0dXJuZWQgdG8gdGhlIHNlcnZpY2UgaW50ZXJuYWwgbGF5ZXJzLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgICAgICBhIGZhdGFsIGVycm9yIG9jY3VycmVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfSW50MzIgKCpNNFZFX1NpZ25hbFN0YXJ0RW5jb2RlckRvbmUpKE00T1NBX0NvbnRleHQgcFVzZXJEYXRhLCBNNE9TQV9FUlIgZXJyQ29kZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsRW5jb2RlRG9uZSkoTTRPU0FfQ29udGV4dCBwVXNlckRhdGEsIE00T1NBX0VSUiAgICBlcnJDb2RlLAotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjdHMsIE00VkVfVmlkZW9CdWZmZXIqIHBCdWZmZXIpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc2lnbmFscyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBlbmNvZGluZyBvZiBhIGZyYW1lIGlzIGRvbmUuCi0gKiAgICAgICAgICAgIFRoZSBpbnRlZ3JhdG9yIG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGVuY29kaW5nIG9mIHRoZSB2aWRlbwotICogICAgICAgICAgICBmcmFtZSBpcyBjb21wbGV0ZWQgKGZvciBleGFtcGxlIGluIGFuIGludGVycnVwdCBjYWxsYmFjaykuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgZW5jb2RlciByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzIGluIHRoZSBlcnJDb2RlIHBhcmFtZXRlcjoKLSAqICAgICAgICAgICAgTTROT19FUlJPUiAgICBUaGVyZSBpcyBubyBlcnJvcgotICogICAgICAgICAgICBNNEVSUl9WRV9GQVRBTCAgICBhIGZhdGFsIGVycm9yIG9jY3VycmVkCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgICAgICAgICAoSU4pIFVzZXIgZGF0YSBwcm92aWRlZCBieSB0aGUgc2VydmljZSBhdCBpbml0IHN0ZXAuCi0gKiBAcGFyYW0gICAgZXJyQ29kZSA6ICAgICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSByZXR1cm5lZCB0byB0aGUgc2VydmljZSBpbnRlcm5hbCBsYXllcnMuCi0gKiBAcGFyYW0gICAgY3RzIDogICAgICAgICAgICAgICAgICAgIChJTikgVGltZSBvZiB0aGUgZW5jb2RlZCBmcmFtZSAoZnJvbSBzdGVwRW5jb2RlKS4KLSAqIEBwYXJhbSAgICBwQnVmZmVyIDogICAgICAgICAgICAgICAgKElOKSBFbmNvZGVkIGRhdGEgQnVmZmVyLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGludmFsaWQuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0ZBVEFMOiAgICAgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxFbmNvZGVEb25lKShNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSICAgIGVyckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBjdHMsIE00VkVfVmlkZW9CdWZmZXIqIHBCdWZmZXIpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfSW50MzIgKCpNNFZFX1NpZ25hbFN0b3BHcmFiYmVyRG9uZSkoTTRPU0FfQ29udGV4dCBwVXNlckRhdGEsIE00T1NBX0VSUiBlcnJDb2RlKTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHNpZ25hbHMgdG8gdGhlIHNlcnZpY2UgdGhhdCB0aGUgZ3JhYmJpbmcgcGFydCBpcyBzdG9wcGVkLgotICogICAgICAgICAgICBUaGlzIGNhbGxiYWNrIGlzIHVudXNlZCBpbiB0aGUgInN0YW5kYWxvbmUgZW5jb2RlciIgbW9kZS4KLSAqIEBub3RlICAgIFRoZSBleHRlcm5hbCBlbmNvZGVyIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29kZXMgaW4gdGhlIGVyckNvZGUgcGFyYW1ldGVyOgotICogICAgICAgICAgICBNNE5PX0VSUk9SICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiAgICAgICAgICAgIE00RVJSX1ZFX0ZBVEFMICAgIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQKLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAgICAgICAgIChJTikgVXNlciBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2aWNlIGF0IGluaXQgc3RlcC4KLSAqIEBwYXJhbSAgICBlcnJDb2RlIDogICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHJldHVybmVkIHRvIHRoZSBzZXJ2aWNlIGludGVybmFsIGxheWVycy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0ZBVEFMOiAgICAgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxTdG9wR3JhYmJlckRvbmUpKE00T1NBX0NvbnRleHQgcFVzZXJEYXRhLCBNNE9TQV9FUlIgZXJyQ29kZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9JbnQzMiAoKk00VkVfU2lnbmFsU3RvcEVuY29kZXJEb25lKShNNE9TQV9Db250ZXh0ICAgIHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc2lnbmFscyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBleHRlcm5hbCBlbmNvZGVyIGlzIHN0b3BwZWQuCi0gKiAgICAgICAgICAgIFRoaXMgY2FsbGJhY2sgaXMgdW51c2VkIGluIHRoZSAic3RhbmRhbG9uZSBlbmNvZGVyIiBtb2RlLgotICogQG5vdGUgICAgVGhlIGV4dGVybmFsIGVuY29kZXIgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlcyBpbiB0aGUgZXJyQ29kZSBwYXJhbWV0ZXI6Ci0gKiAgICAgICAgICAgIE00Tk9fRVJST1IgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqICAgICAgICAgICAgTTRFUlJfVkVfRkFUQUwgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZAotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgICAgICAgICAgKElOKSBVc2VyIGRhdGEgcHJvdmlkZWQgYnkgdGhlIHNlcnZpY2UgYXQgaW5pdCBzdGVwLgotICogQHBhcmFtICAgIGVyckNvZGUgOiAgICAgICAgICAgICAgICAoSU4pIEVycm9yIGNvZGUgcmV0dXJuZWQgdG8gdGhlIHNlcnZpY2UgaW50ZXJuYWwgbGF5ZXJzLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgICAgICBhIGZhdGFsIGVycm9yIG9jY3VycmVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfSW50MzIgKCpNNFZFX1NpZ25hbFN0b3BFbmNvZGVyRG9uZSkoTTRPU0FfQ29udGV4dCAgICBwVXNlckRhdGEsIE00T1NBX0VSUiBlcnJDb2RlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxDbG9zZUVuY29kZXJEb25lKShNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc2lnbmFscyB0byB0aGUgc2VydmljZSB0aGF0IHRoZSBleHRlcm5hbCBlbmNvZGVyIGlzIGNsb3NlZC4KLSAqIEBub3RlICAgIFRoZSBleHRlcm5hbCBlbmNvZGVyIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29kZXMgaW4gdGhlIGVyckNvZGUgcGFyYW1ldGVyOgotICogICAgICAgICAgICBNNE5PX0VSUk9SICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiAgICAgICAgICAgIE00RVJSX1ZFX0ZBVEFMICAgIGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQKLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAgICAgICAgIChJTikgVXNlciBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2aWNlIGF0IGluaXQgc3RlcC4KLSAqIEBwYXJhbSAgICBlcnJDb2RlIDogICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHJldHVybmVkIHRvIHRoZSBzZXJ2aWNlIGludGVybmFsIGxheWVycy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0ZBVEFMOiAgICAgICAgYSBmYXRhbCBlcnJvciBvY2N1cnJlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0ludDMyICgqTTRWRV9TaWduYWxDbG9zZUVuY29kZXJEb25lKShNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0dlbmVyaWNDYWxsYmFjawotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgZ2VuZXJpYyBjYWxsYmFja3MsIGkuZS4gdGhlIG9uZXMgdGhhdCBhcmUgdXNlZAotICogICAgICAgICAgICBpbiBib3RoICJTdGFuZGFsb25lIEVuY29kZXIiIGFuZCAiRW5jb2RlciArIEdyYWJiZXIiIG1vZGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWRV9TaWduYWxPcGVuRW5jb2RlckRvbmUgICAgICAgIHBPcGVuRW5jb2RlckRvbmU7IC8qKjwgQ2FsbGJhY2sgdG8gdXNlIGF0IG9wZW4gY29tcGxldGlvbiAqLwotICAgIE00VkVfU2lnbmFsSGVhZGVyRG9uZSAgICAgICAgICAgICBwSGVhZGVyRG9uZTsgICAgICAgICAvKio8IENhbGxiYWNrIHRvIHVzZSB3aGVuIHRoZSBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIGlzIHJlYWR5ICovCi0gICAgTTRWRV9TaWduYWxFbmNvZGVEb25lICAgICAgICAgICAgIHBFbmNvZGVEb25lOyAgICAgICAgIC8qKjwgQ2FsbGJhY2sgdG8gdXNlIGZvciBhbnkgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgY29tcGxldGlvbiAqLwotICAgIE00VkVfU2lnbmFsQ2xvc2VFbmNvZGVyRG9uZSAgICAgICBwQ2xvc2VFbmNvZGVyRG9uZTsvKio8IENhbGxiYWNrIHRvIHVzZSBhdCBjbG9zZSBjb21wbGV0aW9uICovCi19IE00VkVfR2VuZXJpY0NhbGxiYWNrOyAgICAvKio8IENhbGxiYWNrcyB1c2VkIGluIGFsbCBlbmNvZGVyIG1vZGVzICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00VkVfRUdNb2RlQ2FsbGJhY2sKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgdGhlIGNhbGxiYWNrcyB1c2VkIGluIHRoZSAiRW5jb2RlciArIEdyYWJiZXIiIG1vZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VkVfU2lnbmFsU3RhcnRHcmFiYmVyRG9uZSAgICAgcFN0YXJ0R3JhYmJlckRvbmU7LyoqPCBDYWxsYmFjayB0byB1c2UgYXQgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgdGhlIGdyYWJiZXIgcGFydCovCi0gICAgTTRWRV9TaWduYWxTdGFydEVuY29kZXJEb25lICAgICBwU3RhcnRFbmNvZGVyRG9uZTsvKio8IENhbGxiYWNrIHRvIHVzZSBhdCBzdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBvZiB0aGUgZW5jb2RlciBwYXJ0Ki8KLSAgICBNNFZFX1NpZ25hbFN0b3BHcmFiYmVyRG9uZSAgICAgIHBTdG9wR3JhYmJlckRvbmU7IC8qKjwgQ2FsbGJhY2sgdG8gdXNlIGF0IHN0b3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgdGhlIGdyYWJiZXIgcGFydCovCi0gICAgTTRWRV9TaWduYWxTdG9wRW5jb2RlckRvbmUgICAgICBwU3RvcEVuY29kZXJEb25lOyAvKio8IENhbGxiYWNrIHRvIHVzZSBhdCBzdG9wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIHRoZSBlbmNvZGVyIHBhcnQqLwotfSBNNFZFX0VHTW9kZUNhbGxiYWNrOyAvKio8IENhbGxiYWNrcyB1c2VkIGluICJFbmNvZGVyICsgR3JhYmJlciIgbW9kZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX1NFTW9kZUNhbGxiYWNrCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIHRoZSBjYWxsYmFja3MgdXNlZCBpbiB0aGUgIlN0YW5kYWxvbmUgRW5jb2RlciIgbW9kZQotICogQG5vdGUgICAgVGhlcmUncyBubyBzcGVjaWZpYyBjYWxsYmFjayBmb3IgdGhlIHN0YW5kYWxvbmUgZW5jb2RlciBtb2RlLAotICogICAgICAgICAgICAgICBidXQgd2UgaGF2ZSB0byBkZWNsYXJlIG9uZQotICogQG5vdGUgICAgICAgIGZvciBzb21lIGNvbXBpbGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfSW50MzIgKCpNNFZFX1NFRHVtbXlDQikgIChNNE9TQV9Db250ZXh0IHBVc2VyRGF0YSwgTTRPU0FfRVJSIGVyckNvZGUpOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VkVfU0VEdW1teUNCICAgICAgICAgICAgICAgICAgcER1bW15U0VDQjsgLyoqPCBObyBzcGVjaWZpYyBjYWxsYmFjayBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhbG9uZSBlbmNvZGVyIG1vZGUgKi8KLX0gTTRWRV9TRU1vZGVDYWxsYmFjazsgLyoqPCBDYWxsYmFja3MgdXNlZCBpbiAiU3RhbmRhbG9uZSBFbmNvZGVyIiBtb2RlICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9DYWxsYmFja0ludGVyZmFjZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBjb250YWluZXIgZm9yIHRoZSB3aG9sZSBzZXQgb2YgY2FsbGJhY2sgdXNlZCBieSBleHRlcm5hbCBlbmNvZGVyCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZFX0dlbmVyaWNDYWxsYmFjayAgICBnZW5lcmljQ2FsbGJhY2s7LyoqPCBDYWxsYmFja3MgdXNlZCBpbiBhbGwgbW9kZXMgKi8KLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgTTRWRV9FR01vZGVDYWxsYmFjayAgICBFR01vZGVDYWxsYmFjazsgLyoqPCBDYWxsYmFja3MgdXNlZCBpbiAiRW5jb2RlciArIEdyYWJiZXIiIG1vZGUgKi8KLSAgICAgICAgTTRWRV9TRU1vZGVDYWxsYmFjayAgICBTRU1vZGVDYWxsYmFjazsgLyoqPCBDYWxsYmFja3MgdXNlZCBpbiAiU3RhbmRhbG9uZSBFbmNvZGVyIiBtb2RlICovCi0gICAgfSBNNFZFX1NwZWNpZmljTW9kZUNhbGxCYWNrOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBwVXNlckRhdGE7ICAgICAgLyoqPCBJbnRlcm5hbCB1c2VyIGRhdGEgdG8gYmUgcmV0cmlldmVkIGluIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaCBhYm92ZSAqLwotfSBNNFZFX0NhbGxiYWNrSW50ZXJmYWNlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9pbml0RW5jb2Rlcl9mY3QpKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0NhbGxiYWNrSW50ZXJmYWNlKiBwQ2FsbGJhY2tJbnRlcmZhY2UpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVybmFsIHZpZGVvIGVuY29kZXIgQVBJLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiB0eXBpY2FsbHkgYWxsb2NhdGVzIHRoZSB1c2VyIGNvbnRleHQgdGhhdCB3aWxsIGJlIHByb3ZpZGVkCi0gKiAgICAgICAgICAgIHRvIHRoZSBvdGhlciBmdW5jdGlvbnMgYXMgdGhlaXIgZmlyc3QgYXJndW1lbnQuIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMKLSAqICAgICAgICAgICAgdGhlIGNhbGxiYWNrIGludGVyZmFjZSBnaXZlbiBieSB0aGUgc2VydmljZS4gRW5jb2RlciBpbXBsZW1lbnRhdGlvbiBpcyBzdXBwb3NlZAotICogICAgICAgICAgICB0byB1c2UgdGhlc2UgY2FsbGJhY2tzIGluIHJlc3BvbnNlIHRvIGVhY2ggYXN5bmNocm9ub3VzIEFQSSBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgQWxsIHRoZXNlIGNhbGxiYWNrcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBwVXNlckRhdGEgZmllbGQgc3BlY2lmaWVkCi0gKiAgICAgICAgICAgIGJ5IHRoZSBzZXJ2aWNlIGluc2lkZSB0aGUgTTRWRV9DYWxsYmFja0ludGVyZmFjZSBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKE9VVCkgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcGFyYW0gICAgcENhbGxiYWNrSW50ZXJmYWNlOiAgICAoSU4pIENhbGxiYWNrIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBjb3JyZWN0IChOVUxMIG9yIGludmFsaWQpLgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmICAgIE00T1NBX0VSUiAoKk00VkVfaW5pdEVuY29kZXJfZmN0KShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIE00VkVfQ2FsbGJhY2tJbnRlcmZhY2UqICAgIHBDYWxsYmFja0ludGVyZmFjZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKCpNNFZFX3NldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQsIE00VkVfT3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24pOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYW4gb3B0aW9uIGluIHRoZSB2aWRlbyBlbmNvZGVyIGludGVyZmFjZS4KLSAqIEBub3RlICAgIG5vbmUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoSU4pIFBvaW50ZXIgb2YgdGhlIG9wdGlvbiBkYXRhIHRvIHNldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBjb3JyZWN0IChOVUxMIG9yIGludmFsaWQpLgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOlRoZSByZXF1ZXN0ZWQgb3B0aW9uIElkIGlzIGludmFsaWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNFZFX3NldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQsICAgIE00VkVfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9nZXRPcHRpb25fZmN0KShNNE9TQV9Db250ZXh0LCBNNFZFX09wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uKik7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIGFuIG9wdGlvbiBpbiB0aGUgdmlkZW8gaW50ZXJmYWNlLgotICogQG5vdGUgICAgbm9uZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXF1ZXN0ZWQgb3B0aW9uIHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzdG9yZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBjb3JyZWN0IChOVUxMIG9yIGludmFsaWQpLgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOlRoZSByZXF1ZXN0ZWQgb3B0aW9uIElkIGlzIGludmFsaWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNFZFX2dldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VkVfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKCpNNFZFX29wZW5FbmNvZGVyX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfR3JhYmJpbmdQYXJhbWV0ZXJzICpwR3JhYmJpbmdQYXJhbXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kaW5nUGFyYW1ldGVycyAqcEVuY29kaW5nUGFyYW1zKTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIGFuIGluc3RhbmNlIG9mIHRoZSB2aWRlbyBlbmNvZGVyLgotICogICAgICAgICAgICBCb3RoIGVuY29kaW5nIGFuZCBncmFiYmluZyBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaGVyZS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzLCB0aHVzIHRoZSBleHRlcm5hbCBlbmNvZGVyIG11c3QgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICogICAgICAgICAgICBNNFZFX1NpZ25hbE9wZW5FbmNvZGVyRG9uZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBvcGVuaW5nIHN0ZXAgaXMgaW50ZXJuYWxseQotICogICAgICAgICAgICBjb21wbGV0ZWQuCi0gKiAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgYm90aCBncmFiYmVyIGFuZCBlbmNvZGVyIGNvbXBvbmVudHMgYXJlIG9wZW5lZCBhdCB0aGlzIHN0ZXAgaW4KLSAqICAgICAgICAgICAgdGhlICJlbmNvZGVyICsgZ3JhYmJlciIgbW9kZS4gSW4gcmVzcG9uc2UgdG8gdGhpcyBvcGVuLCB0aGUgZW5jb2RlciBtdXN0IGFsc28gcmV0dXJuCi0gKiAgICAgICAgICAgIHRoZSBzdHJlYW0gaGVhZGVyIChpbmNsdWRpbmcgVk9TLCBWTyAmIFZPTCkgdXNpbmcgdGhlIE00VkVfU2lnbmFsSGVhZGVyRG9uZSBjYWxsYmFjawotICogICAgICAgICAgICBmdW5jdGlvbi4gVXN1YWxseSB0aGUgc2VydmljZSB3YWl0cyBmb3IgdGhpcyBjYWxsYmFjayBiZXR3ZWVuIHRoZQotICogICAgICAgICAgICBNNFZFX1NpZ25hbE9wZW5FbmNvZGVyRG9uZQotICogICAgICAgICAgICBjYWxsYmFjayBhbmQgdGhlIE00VkVfU2lnbmFsQ2xvc2VFbmNvZGVyRG9uZSBjYWxsYmFjayBpbiBvcmRlciB0byBoYW5kbGUgaXQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwR3JhYmJpbmdQYXJhbXM6ICAgIChJTikgR3JhYmJpbmcgcGFyYW1ldGVycyAoY2FuIGJlIG9wdGlvbmFsLCBpbiB0aGlzIGNhc2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBOVUxMKS4KLSAqIEBwYXJhbSAgICBwRW5jb2RpbmdQYXJhbXM6ICAgIChJTikgRW5jb2RpbmcgcGFyYW1ldGVycy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBjb3JyZWN0IChOVUxMIG9yIGludmFsaWQpLgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIFRoZSBlbmNvZGVyIGNvdWxkIG5vdCBiZSBvcGVuZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VkVfb3BlbkVuY29kZXJfZmN0KShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfR3JhYmJpbmdQYXJhbWV0ZXJzICpwR3JhYmJpbmdQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfRW5jb2RpbmdQYXJhbWV0ZXJzICpwRW5jb2RpbmdQYXJhbXMpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9mb3JjZUlGcmFtZV9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgc2VydmljZSB0byBzaWduYWwgdGhlIGV4dGVybmFsIGVuY29kZXIgdGhhdCBhbiBJbnRyYQotICogICAgICAgICAgIHJlZnJlc2ggZnJhbWUgbXVzdCBiZSBlbmNvZGVkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gYm90aCAiU3RhbmRhbG9uZSBFbmNvZGVyIiBhbmQKLSAqICAgICAgICAgICAgIkVuY29kZXIgKyBncmFiYmVyIiBtb2RlcyBhbmQgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIGVuY29kaW5nIHNlc3Npb24uCi0gKiBAbm90ZSAgICBGb3IgdGhlICJFbmNvZGVyICsgR3JhYmJlciIgbW9kZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJldHdlZW4gdGhlIHJlY2VwdGlvbgotICogICAgICAgICAgICBvZiB0aGUgTTRWRV9TaWduYWxTdGFydEVuY29kZXJEb25lIGNhbGxiYWNrIGFuZCB0aGUgY2FsbCB0byBNNFZFX3N0b3BFbmNvZGVyX2ZjdC4KLSAqICAgICAgICAgICAgRm9yIHRoZSAiU3RhbmRhbG9uZSBFbmNvZGVyIiBtb2RlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYmV0d2VlbiB0aGUgcmVjZXB0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSBNNFZFX1NpZ25hbE9wZW5FbmNvZGVyRG9uZSBjYWxsYmFjayBhbmQgdGhlIGNhbGwgdG8gTTRWRV9jbG9zZUVuY29kZXJfZmN0LgotICogICAgICAgICAgICBUaGUgZXhwZWN0ZWQgYmVoYXZpb3IgaXMgdGhhdCB0aGUgZXh0ZXJuYWwgZW5jb2RlciBlbmNvZGVzIGFuIGludHJhIHJlZnJlc2ggZnJhbWUKLSAqICAgICAgICAgICAgZm9yIG9uZSBvZiB0aGUgZnJhbWVzIGNvbWluZyBuZXh0IHRvIHRoZSBjYWxsIG9mIE00VkVfZm9yY2VJRnJhbWVfZmN0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgZmllbGQgaXMgbm90IHZhbGlkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGVuY29kZXIgc3RhdGUuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0ZBVEFMOiAgICBUaGUgZW5jb2RlciBjb3VsZCBub3QgaGFuZGxlIHRoaXMgY2FsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWRV9mb3JjZUlGcmFtZV9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9yZWxlYXNlT3V0cHV0QnVmZmVyX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWRV9WaWRlb0J1ZmZlciAqcEJ1ZmZlcik7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNlcnZpY2UgdG8gc2lnbmFsIHRoYXQgYSBwYXJ0aWN1bGFyIG91dHB1dCBidWZmZXIsCi0gKiAgICAgICAgICAgcHJvdmlkZWQgaW4gdGhlIE00VkVfU2lnbmFsRW5jb2RlRG9uZSBjYWxsYmFjayBieSB0aGUgZXh0ZXJuYWwgZW5jb2RlciwgaXMgbm8gbW9yZQotICogICAgICAgICAgIG5lZWRlZCBieSB0aGUgc2VydmljZSBhbmQgY2FuIGJlIGNvbnNpZGVyZWQgYXMgZnJlZSBmb3IgYW55IHJlbWFpbmluZyBkYXRhIHByb2Nlc3NpbmcuCi0gKiBAbm90ZSAgICBub25lLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcGFyYW0gICAgcEJ1ZmZlcjogICAgICAgICAgICAoSU4pIEVuY29kZWQgZGF0YSBCdWZmZXIuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgY29ycmVjdCAoTlVMTCBvciBpbnZhbGlkKS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIFRoZSBlbmNvZGVyIGNvdWxkIG5vdCBhY2tub3dsZWRnZSB0aGUgYnVmZmVyIHJlbGVhc2UgZm9yIGFueQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHJlYXNvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VkVfcmVsZWFzZU91dHB1dEJ1ZmZlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9WaWRlb0J1ZmZlciAqcEJ1ZmZlcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKCpNNFZFX2Nsb3NlRW5jb2Rlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBlbmNvZGluZyBzZXNzaW9uLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBhc3luY2hyb25vdXMsIHRodXMgdGhlIGV4dGVybmFsIGVuY29kZXIgbXVzdCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgICAgICAgIE00VkVfU2lnbmFsQ2xvc2VFbmNvZGVyRG9uZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBjbG9zaW5nIHN0ZXAgaXMgaW50ZXJuYWxseQotICogICAgICAgICAgICBjb21wbGV0ZWQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgZW5jb2Rlci4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBwb2ludGVyIGlzIG51bGwgb3IgaW52YWxpZC4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIFRoZSBlbmNvZGVyIGNvdWxkIG5vdCBiZSBjbG9zZWQgZm9yIGFueSBvdGhlciByZWFzb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNFZFX2Nsb3NlRW5jb2Rlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9jbGVhblVwRW5jb2Rlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBub3RlICAgIG5vbmUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBlbmNvZGVyLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IHBvaW50ZXIgaXMgbnVsbCBvciBpbnZhbGlkLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBlbmNvZGVyIHN0YXRlLgotICogQHJldHVybiAgICBNNEVSUl9WRV9GQVRBTDogICAgVGhlIGVuY29kZXIgY291bGQgbm90IGJlIGNsb3NlZCBmb3IgYW55IG90aGVyIHJlYXNvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VkVfY2xlYW5VcEVuY29kZXJfZmN0KShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAoKk00VkVfc3RlcEVuY29kZV9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBjdHMpOwotICogQGJyaWVmICAgIFRoZSBmdW5jdGlvbiBnaXZlcyBhIHZpZGVvIGZyYW1lIHRvIHRoZSBleHRlcm5hbCBlbmNvZGVyIGluIHRoZSAiU3RhbmRhbG9uZSBlbmNvZGVyIgotICogICAgICAgICAgICBtb2RlLiBUaGUgaW5wdXQgYnVmZmVyIGNvbnNpc3RzIG9mIGEgcmF3IFlVVjQyMCBwbGFuYXIgZnJhbWUsCi0gKiAgICAgICAgICAgIGFsbG9jYXRlZCBieSB0aGUgc2VydmljZS4KLSAqICAgICAgICAgICAgVGhlIHRpbWUgKGN0cykgaXMgdGhlIGNvbXBvc2l0aW9uIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRvIGVuY29kZSBhbmQgaXMgdW5pcXVlCi0gKiAgICAgICAgICAgIGZvciBlYWNoIGZyYW1lLiBUaGlzIHRpbWUgaXMgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcy4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzIGFuZCBpdHMgY29tcGxldGlvbiBpcyBzaWduYWxlZCBieSB0aGUKLSAqICAgICAgICAgICAgTTRWRV9TaWduYWxFbmNvZGVEb25lIGNhbGxiYWNrLiBJdCBhcHBsaWVzIHRoYXQgdGhlIGlucHV0IGJ1ZmZlciBpcyBtYWludGFpbmVkIHZhbGlkCi0gKiAgICAgICAgICAgIGJ5IHRoZSBzZXJ2aWNlIHRpbGwgdGhlIGNhbGwgb2YgdGhpcyBjYWxsYmFjay4gVGhlIGVuY29kZWQgZGF0YSBhcmUgcmV0cmlldmVkIGluCi0gKiAgICAgICAgICAgIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaW4gYSBkZWRpY2F0ZWQgc3RydWN0dXJlLCBhbGxvY2F0ZWQgYnkgdGhlIGV4dGVybmFsIGVuY29kZXIuCi0gKiAgICAgICAgICAgIFRoZSBpbnB1dCBidWZmZXIgKFlVViByYXcgZnJhbWUpIGlzIGNvbnNpZGVyZWQgYnkgdGhlIHNlcnZpY2UgYXMgZnJlZSBmb3IgYW55Ci0gKiAgICAgICAgICAgICByZW1haW5pbmcgZGF0YSBwcm9jZXNzaW5nIGFmdGVyIHJlY2VpdmluZyB0aGUgTTRWRV9TaWduYWxFbmNvZGVEb25lIGNhbGxiYWNrLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcGFyYW0gICAgcElucHV0UGxhbmU6ICAgICAgICAoSU4pIElucHV0IGJ1ZmZlciB3aGVyZSB2aWRlbyBmcmFtZSBpcyBzdG9yZWQuCi0gKiBAcGFyYW0gICAgY3RzOiAgICAgICAgICAgICAgICAoSU4pIENvbXBvc2l0aW9uIHRpbWUgc3RhbXAgaW4gbWlsbGlzZWNvbmRzLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGZpZWxkIGlzIG5vdCB2YWxpZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIFRoZSBlbmNvZGVyIGNvdWxkIG5vdCBlbmNvZGUgdGhlIGZyYW1lIGZvciBhbnkgb3RoZXIgcmVhc29uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWRV9zdGVwRW5jb2RlX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCxNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgY3RzKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAoKk00VkVfc3RhcnRHcmFiYmVyX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIGdyYWJiZXIgc3ViLWNvbXBvbmVudCBvZiB0aGUgZXh0ZXJuYWwgZW5jb2RlciwgaW4gdGhlCi0gKiAgICAgICAgICAgICJlbmNvZGVyICsgZ3JhYmJlciIgbW9kZS4gVGhpcyBmdW5jdGlvbiBpcyBhc3luY2hyb25vdXMsIHRodXMgdGhlIGV4dGVybmFsCi0gKiAgICAgICAgICAgIGVuY29kZXIgbXVzdCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nIE00VkVfU2lnbmFsU3RhcnRHcmFiYmVyRG9uZSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgICAgICB3aGVuIHRoaXMgc3RhcnQgaXMgaW50ZXJuYWxseSBlZmZlY3RpdmUuCi0gKiBAbm90ZSAgICBEdXJpbmcgdGhpcyBzdGVwLCB0aGUgc2VydmljZSB3YWl0cyBmb3IgdGhlIGdyYWJiZXIgdG8gbGF1bmNoIGFueSB2aWRlbyBwcmV2aWV3IGlmCi0gKiAgICAgICAgICAgIG5lZWRlZC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBlbmNvZGVyLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGZpZWxkIGlzIG5vdCB2YWxpZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIHRoZSBlbmNvZGVyIGNvdWxkIG5vdCBiZSBzdGFydGVkIGZvciBhbnkgb3RoZXIgcmVhc29uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWRV9zdGFydEdyYWJiZXJfZmN0KShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAoKk00VkVfc3RhcnRFbmNvZGVyX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIHZpZGVvIGVuY29kZXIgaW4gdGhlICJlbmNvZGVyICsgZ3JhYmJlciIgbW9kZS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzLCB0aHVzIHRoZSBleHRlcm5hbCBlbmNvZGVyIG11c3QgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICogICAgICAgICAgICBNNFZFX1NpZ25hbFN0YXJ0RW5jb2RlckRvbmUgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGlzIHN0YXJ0IGlzIGludGVybmFsbHkKLSAqICAgICAgICAgICAgZWZmZWN0aXZlLgotICogICAgICAgICAgICBBZnRlciB0aGUgY29tcGxldGlvbiBvZiB0aGlzIGFzeW5jaHJvbm91cyBmdW5jdGlvbiwgdGhlIHNlcnZpY2Ugd2FpdHMgZm9yIHRoZQotICogICAgICAgICAgICBleHRlcm5hbCBlbmNvZGVyIHRvIHBlcmlvZGljYWxseSBjYWxsIHRoZSBNNFZFX1NpZ25hbEVuY29kZURvbmUgY2FsbGJhY2sgZWFjaCB0aW1lCi0gKiAgICAgICAgICAgIGEgbmV3IGZyYW1lIGhhcyBiZWVuIGVuY29kZWQuIFRoZSBleHRlcm5hbCBlbmNvZGVyIG11c3QgZXhwZWN0IHRvIGhhdmUgc2V2ZXJhbAotICogICAgICAgICAgICBNNFZFX3N0YXJ0RW5jb2Rlcl9mY3QgY2FsbHMgYmVmb3JlIGJlaW5nIGNsb3NlZC4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotICogICAgICAgICAgICBNNFZFX3N0b3BFbmNvZGVyX2ZjdCBmdW5jdGlvbiBmb3IgdGhlIGV4cGVjdGVkIGJlaGF2aW91ci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBlbmNvZGVyLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGZpZWxkIGlzIG5vdCB2YWxpZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIHRoZSBlbmNvZGVyIGNvdWxkIG5vdCBiZSBzdGFydGVkIGZvciBhbnkgb3RoZXIgcmVhc29uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWRV9zdGFydEVuY29kZXJfZmN0KShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE9TQV9FUlIgKCpNNFZFX3N0b3BHcmFiYmVyX2ZjdCkoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBzdG9wcyB0aGUgdmlkZW8gZ3JhYmJlciBpbiB0aGUgImVuY29kZXIgKyBncmFiYmVyIiBtb2RlLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBhc3luY2hyb25vdXMsIHRodXMgdGhlIGV4dGVybmFsIGVuY29kZXIgbXVzdCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgICAgICBNNFZFX1NpZ25hbFN0b3BHcmFiYmVyRG9uZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoaXMgc3RvcCBpcyBpbnRlcm5hbGx5IGVmZmVjdGl2ZS4KLSAqICAgICAgICAgIER1cmluZyB0aGlzIHN0ZXAsIHRoZSBzZXJ2aWNlIHdhaXRzIGZvciB0aGUgZ3JhYmJlciB0byBzdG9wIHRoZSB2aWRlbyBwcmV2aWV3Ci0gKiAgICAgICAgICBpZiBuZWVkZWQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgZW5jb2Rlci4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBmaWVsZCBpcyBub3QgdmFsaWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGNhbGwgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciBzdGF0ZS4KLSAqIEByZXR1cm4gICAgTTRFUlJfVkVfRkFUQUw6ICAgIHRoZSBlbmNvZGVyIGNvdWxkIG5vdCBiZSBzdG9wcGVkIGZvciBhbnkgb3RoZXIgcmVhc29uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWRV9zdG9wR3JhYmJlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICgqTTRWRV9zdG9wRW5jb2Rlcl9mY3QpKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIHZpZGVvIGVuY29kZXIgaW4gdGhlICJlbmNvZGVyICsgZ3JhYmJlciIgbW9kZS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzLCB0aHVzIHRoZSBleHRlcm5hbCBlbmNvZGVyIG11c3QgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICogICAgICAgICAgICBNNFZFX1NpZ25hbFN0b3BFbmNvZGVyRG9uZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoaXMgc3RvcCBpcyBpbnRlcm5hbGx5IGVmZmVjdGl2ZS4KLSAqICAgICAgICAgICAgQWZ0ZXIgdGhlIHJlY2VwdGlvbiBvZiB0aGlzIGNhbGxiYWNrLCB0aGUgc2VydmljZSBjb25zaWRlcnMgdGhhdCBubyBuZXcgZnJhbWUgd2lsbCBiZQotICogICAgICAgICAgICByZXRyaWV2ZWQgdmlhIHRoZSBNNFZFX1NpZ25hbEVuY29kZURvbmUgY2FsbGJhY2suCi0gKiAgICAgICAgICAgIFRoZSBleHRlcm5hbCBlbmNvZGVyIG11c3QgZXhwZWN0IHRvIGhhdmUgYSBwb3NzaWJsZSBjYWxsIHRvIE00VkVfc3RhcnRFbmNvZGVyX2ZjdAotICogICAgICAgICAgICBhZnRlciBNNFZFX3N0b3BFbmNvZGVyX2ZjdC4gSW4gdGhpcyBjYXNlLCB0aGUgZXh0ZXJuYWwgZW5jb2RlciBtdXN0IGNvbnNpZGVyIHRoYXQgaXQKLSAqICAgICAgICAgICAgIGhhcyBiZWVuIHBhdXNlZC9yZXN1bWVkLiBUaGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGlzIHRoZSBmb2xsb3dpbmcgb25lOgotICogICAgICAgICAgICAtIFRoZSByZXN1bHQgZnJvbSB0aGlzIHR3byBlbmNvZGluZyBzZXNzaW9ucyBpcyBhIFN0YW5kYWxvbmUgc3RyZWFtLCBubyBoZWFkZXIgaXMKLSAqICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciB0aGlzIG5ldyBzZXNzaW9uLiBUaGUgZXh0ZXJuYWwgZW5jb2RlciBpcyBmcmVlIHRvIGVuY29kZSBhIHJlZnJlc2gKLSAqICAgICAgICAgICAgZnJhbWUgKGxpa2UgSSBWT1ApIGZvciB0aGlzIG5ldyBzZXNzaW9uLgotICogICAgICAgICAgICAtIFRoZSB0aW1lIHN0YW1wcyBvZiB0aGlzIG5ldyBzZXNzaW9uIG11c3QgZGlyZWN0bHkgZm9sbG93IHRoZSB0aW1lIHN0YW1wcyBvZiB0aGUKLSAqICAgICAgICAgICAgcHJldmlvdXMgb25lIChpZTogbm8gdGltZSBob2xlIGNvbWluZyBmcm9tIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBzdG9wIG9mIHRoZSBmaXJzdAotICogICAgICAgICAgICBzZXNzaW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIG5ldyBvbmUpLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIGVuY29kZXIuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgZmllbGQgaXMgbm90IHZhbGlkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGVuY29kZXIgc3RhdGUuCi0gKiBAcmV0dXJuICAgIE00RVJSX1ZFX0VSUl9GQVRBTDogICAgdGhlIGVuY29kZXIgY291bGQgbm90IGJlIHN0b3BwZWQgZm9yIGFueSBvdGhlciByZWFzb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VkVfc3RvcEVuY29kZXJfZmN0KShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0dlbmVyaWNJbnRlcmZhY2UKLSAqIEBicmllZiAgICBUaGUgTTRWRV9HZW5lcmljSW50ZXJmYWNlIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzZXQgb2YgZnVuY3Rpb25zIHVzZWQgaW4KLSAqICAgICAgICAgICAgICAgYm90aCBlbmNvZGVyIG1vZGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWRV9pbml0RW5jb2Rlcl9mY3QgICAgICAgICAgICBtX3BGY3RJbml0RW5jb2RlcjsKLSAgICBNNFZFX3NldE9wdGlvbl9mY3QgICAgICAgICAgICAgICAgbV9wRmN0U2V0T3B0aW9uOwotICAgIE00VkVfZ2V0T3B0aW9uX2ZjdCAgICAgICAgICAgICAgICBtX3BGY3RHZXRPcHRpb247Ci0gICAgTTRWRV9vcGVuRW5jb2Rlcl9mY3QgICAgICAgICAgICBtX3BGY3RPcGVuRW5jb2RlcjsKLSAgICBNNFZFX2ZvcmNlSUZyYW1lX2ZjdCAgICAgICAgICAgIG1fcEZjdEZvcmNlSUZyYW1lOwotICAgIE00VkVfcmVsZWFzZU91dHB1dEJ1ZmZlcl9mY3QgICAgbV9wRmN0UmVsZWFzZU91dHB1dEJ1ZmZlcjsKLSAgICBNNFZFX2Nsb3NlRW5jb2Rlcl9mY3QgICAgICAgICAgICBtX3BGY3RDbG9zZUVuY29kZXI7Ci0gICAgTTRWRV9jbGVhblVwRW5jb2Rlcl9mY3QgICAgICAgICAgICBtX3BGY3RDbGVhblVwRW5jb2RlcjsKLX0gTTRWRV9HZW5lcmljSW50ZXJmYWNlOyAgICAgICAgICAgIC8qKjwgRnVuY3Rpb25zIHVzZWQgaW4gYm90aCAiU3RhbmRhbG9uZSBFbmNvZGVyIiBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jb2RlciArIEdyYWJiZXIiIG1vZGVzICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9TRU1vZGVJbnRlcmZhY2UKLSAqIEBicmllZiAgICBUaGUgTTRWRV9TRU1vZGVJbnRlcmZhY2Ugc3RydWN0dXJlIGRlZmluZXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgdXNlZCBpbgotICogICAgICAgICAgICAgICJTdGFuZGFsb25lIEVuY29kZXIiIG1vZGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZFX3N0ZXBFbmNvZGVfZmN0ICAgICAgICAgICAgbV9wRmN0U3RlcEVuY29kZTsKLX0gTTRWRV9TRU1vZGVJbnRlcmZhY2U7ICAgICAgICAgICAgLyoqPCBGdW5jdGlvbnMgdXNlZCBvbmx5IGluICJTdGFuZGFsb25lIEVuY29kZXIiIG1vZGUgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFZFX0VHTW9kZUludGVyZmFjZQotICogQGJyaWVmICAgIFRoZSBNNFZFX0VHTW9kZUludGVyZmFjZSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB1c2VkIGluCi0gKiAgICAgICAgICAgICAgIkVuY29kZXIgKyBHcmFiYmVyIiBtb2RlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWRV9zdGFydEdyYWJiZXJfZmN0ICAgICAgICBtX3BGY3RTdGFydEdyYWJiZXI7Ci0gICAgTTRWRV9zdGFydEVuY29kZXJfZmN0ICAgICAgICBtX3BGY3RTdGFydEVuY29kZXI7Ci0gICAgTTRWRV9zdG9wR3JhYmJlcl9mY3QgICAgICAgIG1fcEZjdFN0b3BHcmFiYmVyOwotICAgIE00VkVfc3RvcEVuY29kZXJfZmN0ICAgICAgICBtX3BGY3RTdG9wRW5jb2RlcjsKLX0gTTRWRV9FR01vZGVJbnRlcmZhY2U7ICAgICAgICAgICAgLyoqPCBGdW5jdGlvbnMgdXNlZCBvbmx5IGluICJFbmNvZGVyICsgR3JhYmJlciIgbW9kZSAqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRWRV9JbnRlcmZhY2UKLSAqIEBicmllZiAgICBUaGUgTTRWRV9JbnRlcmZhY2Ugc3RydWN0dXJlIHN0b3JlcyBwb2ludGVycyB0byB0aGUgdmlkZW8gZW5jb2RlciBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZFX0dlbmVyaWNJbnRlcmZhY2UgICAgICAgIGdlbmVyaWNJbnRlcmZhY2U7ICAgIC8qKjwgRnVuY3Rpb25zIHVzZWQgZXZlcnl0aW1lICovCi0gICAgTTRWRV9FbmNvZGVyTW9kZSAgICAgICAgICAgIGVuY29kZXJNb2RlOyAgICAgICAgLyoqPCAiU3RhbmRhbG9uZSBFbmNvZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICJFbmNvZGVyICsgR3JhYmJlciIgKi8KLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgTTRWRV9TRU1vZGVJbnRlcmZhY2UgICAgU0VNb2RlSW50ZXJmYWNlOyAgICAvKio8IEZ1bmN0aW9ucyB1c2VkIG9ubHkgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhbmRhbG9uZSBFbmNvZGVyIiBtb2RlICovCi0gICAgICAgIE00VkVfRUdNb2RlSW50ZXJmYWNlICAgIEVHTW9kZUludGVyZmFjZTsgICAgLyoqPCBGdW5jdGlvbnMgdXNlZCBvbmx5IGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY29kZXIgKyBHcmFiYmVyIiBtb2RlICovCi0gICAgfU00VkVfU3BlY2lmaWNJbnRlcmZhY2U7Ci19IE00VkVfSW50ZXJmYWNlOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSNlbmRpZiAvKl9fTTRWRV9BUElfSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0xvZ28uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0xvZ28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzlhMmUxYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Mb2dvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBNNF9Mb2dvX2gKLSNkZWZpbmUgTTRfTG9nb19oCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgbG9nb1tdOwotZXh0ZXJuIGNvbnN0IGludCBsb2dvX3dpZHRoOwotZXh0ZXJuIGNvbnN0IGludCBsb2dvX2hlaWdodDsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAppbmRleCBkNjhjODgxLi43OTgzMWJiIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaApAQCAtMTEyLDM0ICsxMTIsMzggQEAKICovCiB0eXBlZGVmIGVudW0KIHsKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMCAgICAgICAgICAgICAgID0gMCwKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMGIgICAgICAgICAgICAgID0gMSwKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMSAgICAgICAgICAgICAgID0gMiwKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMiAgICAgICAgICAgICAgID0gMywKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMyAgICAgICAgICAgICAgID0gNCwKLSAgICBNNFZJREVPRURJVElOR19rSDI2M19Qcm9maWxlXzBfTGV2ZWxfMTAgICAgICAgID0gNSwKLSAgICBNNFZJREVPRURJVElOR19rSDI2M19Qcm9maWxlXzBfTGV2ZWxfMjAgICAgICAgID0gNiwKLSAgICBNNFZJREVPRURJVElOR19rSDI2M19Qcm9maWxlXzBfTGV2ZWxfMzAgICAgICAgID0gNywKLSAgICBNNFZJREVPRURJVElOR19rSDI2M19Qcm9maWxlXzBfTGV2ZWxfNDAgICAgICAgID0gOCwKLSAgICBNNFZJREVPRURJVElOR19rSDI2M19Qcm9maWxlXzBfTGV2ZWxfNDUgICAgICAgID0gOSwKLSAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfNGEgICAgICAgICAgICAgID0gMTAsCi0gICAgTTRWSURFT0VESVRJTkdfa01QRUc0X1NQX0xldmVsXzUgICAgICAgICAgICAgICA9IDExLAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8xICAgICAgICAgPSAxMiwKLSAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMWIgICAgICAgID0gMTMsCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzFfMSAgICAgICA9IDE0LAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8xXzIgICAgICAgPSAxNSwKLSAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMV8zICAgICAgID0gMTYsCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzIgICAgICAgICA9IDE3LAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8yXzEgICAgICAgPSAxOCwKLSAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMl8yICAgICAgID0gMTksCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzMgICAgICAgICA9IDIwLAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8zXzEgICAgICAgPSAyMSwKLSAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfM18yICAgICAgID0gMjIsCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzQgICAgICAgICA9IDIzLAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF80XzEgICAgICAgPSAyNCwKLSAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfNF8yICAgICAgID0gMjUsCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzUgICAgICAgICA9IDI2LAotICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF81XzEgICAgICAgPSAyNywKKyAgICAvKiBILjI2MyBQcm9maWxlcyBhbmQgbGV2ZWxzICovCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjNfUHJvZmlsZV8wX0xldmVsXzEwICAgICAgICA9IDAsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjNfUHJvZmlsZV8wX0xldmVsXzIwICAgICAgICA9IDEsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjNfUHJvZmlsZV8wX0xldmVsXzMwICAgICAgICA9IDIsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjNfUHJvZmlsZV8wX0xldmVsXzQwICAgICAgICA9IDMsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjNfUHJvZmlsZV8wX0xldmVsXzQ1ICAgICAgICA9IDQsCisgICAgLyogTVBFRy00IFByb2ZpbGVzIGFuZCBsZXZlbHMgKi8KKyAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMCAgICAgICAgICAgICAgID0gNTAsCisgICAgTTRWSURFT0VESVRJTkdfa01QRUc0X1NQX0xldmVsXzBiICAgICAgICAgICAgICA9IDUxLAorICAgIE00VklERU9FRElUSU5HX2tNUEVHNF9TUF9MZXZlbF8xICAgICAgICAgICAgICAgPSA1MiwKKyAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfMiAgICAgICAgICAgICAgID0gNTMsCisgICAgTTRWSURFT0VESVRJTkdfa01QRUc0X1NQX0xldmVsXzMgICAgICAgICAgICAgICA9IDU0LAorICAgIE00VklERU9FRElUSU5HX2tNUEVHNF9TUF9MZXZlbF80YSAgICAgICAgICAgICAgPSA1NSwKKyAgICBNNFZJREVPRURJVElOR19rTVBFRzRfU1BfTGV2ZWxfNSAgICAgICAgICAgICAgID0gNTYsCisgICAgLyogQVZDIFByb2ZpbGVzIGFuZCBsZXZlbHMgKi8KKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMSAgICAgICAgID0gMTUwLAorICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8xYiAgICAgICAgPSAxNTEsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzFfMSAgICAgICA9IDE1MiwKKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMV8yICAgICAgID0gMTUzLAorICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8xXzMgICAgICAgPSAxNTQsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzIgICAgICAgICA9IDE1NSwKKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfMl8xICAgICAgID0gMTU2LAorICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8yXzIgICAgICAgPSAxNTcsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzMgICAgICAgICA9IDE1OCwKKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfM18xICAgICAgID0gMTU5LAorICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF8zXzIgICAgICAgPSAxNjAsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzQgICAgICAgICA9IDE2MSwKKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfNF8xICAgICAgID0gMTYyLAorICAgIE00VklERU9FRElUSU5HX2tIMjY0X1Byb2ZpbGVfMF9MZXZlbF80XzIgICAgICAgPSAxNjMsCisgICAgTTRWSURFT0VESVRJTkdfa0gyNjRfUHJvZmlsZV8wX0xldmVsXzUgICAgICAgICA9IDE2NCwKKyAgICBNNFZJREVPRURJVElOR19rSDI2NF9Qcm9maWxlXzBfTGV2ZWxfNV8xICAgICAgID0gMTY1LAorICAgIC8qIFVuc3VwcG9ydGVkIHByb2ZpbGUgYW5kIGxldmVsICovCiAgICAgTTRWSURFT0VESVRJTkdfa1Byb2ZpbGVfYW5kX0xldmVsX091dF9PZl9SYW5nZSA9IDI1NQogfSBNNFZJREVPRURJVElOR19WaWRlb1Byb2ZpbGVBbmRMZXZlbDsKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmgKaW5kZXggZmU5ODc2Yy4uYzRlM2E4OSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCkBAIC0yMywxMyArMjMsMTMgQEAKIAogI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCiAKLU00T1NBX0ludDMyIExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAorTTRPU0FfQ29udGV4dCBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKE00T1NBX0ludDMyIGJpdERlcHRoLCBNNE9TQV9JbnQzMiBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzYW1wbGVSYXRlLCBNNE9TQV9JbnQzMiBxdWFsaXR5KTsKLXZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfSW50MzIgcmVzYW1wbGVyQ29udGV4dCxNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpOwotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0ludDMyIHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSA7Cit2b2lkIExWQXVkaW9zZXRTYW1wbGVSYXRlKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCxNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpOwordm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIDsKIHZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0ludDMyIHJlc2FtcGxlckNvbnRleHQpOwotdm9pZCBMVkRlc3Ryb3koTTRPU0FfSW50MzIgcmVzYW1wbGVyQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgb3V0RnJhbWVDb3VudCwgTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKK3ZvaWQgTFZEZXN0cm95KE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCk7CiAKIHZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqZHN0LApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaAppbmRleCA4NmM2YjkzLi42OTNmMjQ5IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaApAQCAtNDQsOCArNDQsNiBAQAogICogRGVmaW5pdGlvbnMgb2YgTTRWSUZJX0ltYWdlUGxhbmUgKi8KICNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgogCi0jaW5jbHVkZSAiTTRWRV9BUEkuaCIKLQogLyoqCiAgKiBDb21tb24gZGVmaW5pdGlvbnMgb2YgdmlkZW8gZWRpdGluZyBjb21wb25lbnRzICovCiAjaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCkBAIC0yNDksMTIgKzI0Nyw2IEBACiBNNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwogCiAKLU00T1NBX0VSUiBNNFBUTzNHUFBfUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kZXJUeXBlIGVuY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfSW50ZXJmYWNlKiAgICBwRW5jb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKaW5kZXggYTg1OGNiMi4uZTZlODMwZCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaApAQCAtMTkzLDEzICsxOTMsNiBAQAogICAgICAqICAgIEF1ZGlvIHBhZGRpbmcgbW9kZSAqLwogICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIG1fYkF1ZGlvUGFkZGluZ1NpbGVuY2U7ICAvKio8IEEgYm9vbGVhbiB0aGF0IHNpZ25hbHMgdGhhdCBhdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVIHdpbGwgYmUgcGFkZGVkIGJ5IHNpbGVuY2UgKi8KLQotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRWRV9JbnRlcmZhY2UqICAgIHBFbmNvZGVySW50ZXJmYWNlOwotICAgICAgICBNNE9TQV9Wb2lkKiAgICAgICAgcFVzZXJEYXRhOwotICAgICAgICBNNE9TQV9Cb29sICAgICAgICByZWdpc3RlcmVkOwotICAgIH0gcmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tNNFZFX2tFbmNvZGVyVHlwZV9OQl07CiB9IE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQ7CiAKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaAppbmRleCBmNmY4ZGFhLi5hMWNmMjI1IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaApAQCAtNDgsMTEgKzQ4LDYgQEAKIC8qKgogICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwogI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotCi0KLSNpbmNsdWRlICJNNFZEX0hXX0FQSS5oIgotI2luY2x1ZGUgIk00VkVfQVBJLmgiCi0KICNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKICNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgogI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKQEAgLTU5MSw1NCArNTg2LDYgQEAKIAogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9JbnRlcmZhY2UqICAgIHBEZWNvZGVySW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBkZWNvZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGRlY29kZXIgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAoSU4pIERlY29kZXIgaW50ZXJmYWNlCi0gKiBAcGFyYW0gICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgZGVjb2RlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIFZTUzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX0ludGVyZmFjZSogICAgcERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKk00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFJlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9FbmNvZGVyVHlwZSBlbmNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfSW50ZXJmYWNlKiAgICBwRW5jb2RlckludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgVmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUzNHUFAgY29udGV4dAotICogQHBhcmFtICAgZW5jb2RlclR5cGUgICAgICAgIChJTikgVHlwZSBvZiBlbmNvZGVyIChNUEVHNCAuLi4pCi0gKiBAcGFyYW0gICBwRW5jb2RlckludGVyZmFjZSAgKElOKSBFbmNvZGVyIGludGVyZmFjZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGVuY29kZXIKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcihNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9FbmNvZGVyVHlwZSBlbmNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0ludGVyZmFjZSogICAgcEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTgyOCwzMyArNzc1LDYgQEAKIAogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlcigKLSAqICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgVmlkZW8gZGVjb2RlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIEV4dHJhY3QgcGljdHVyZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGRlY29kZXIgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAoSU4pIERlY29kZXIgaW50ZXJmYWNlCi0gKiBAcGFyYW0gICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgZGVjb2RlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIEV4dHJhY3QgcGljdHVyZSBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKFwKLSAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODkzLDY2ICs4MTMsNiBAQAogI2VuZGlmIC8qKjwgV0lOMzIgKi8KIAogCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsQ29kZWMoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgICAgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfY29kZWNUeXBlICAgICAgICBjb2RlY1R5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICAgIHBDb2RlY0ludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgVmlkZW8vQXVkaW8gY29kZWMgd2l0aCBWU1MzR1BQCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIGV4dGVybmFsIGNvZGVjIHJlZ2lzdHJhdGlvbiBBUEkgdG8KLSAqICAgICAgIGNvcGUgdXAgd2l0aCBzcGVjaWZpYyByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MzR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgY29kZWNUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgY29kZWMgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgcENvZGVjSW50ZXJmYWNlICAoSU4pIENvZGVjIGludGVyZmFjZQotICogQHBhcmFtICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgY29kZWMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgIFZTUzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0gTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbENvZGVjKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfY29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICAgIHBDb2RlY0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN1YnNjcmliZUV4dGVybmFsQ29kZWNzKE00VlNTM0dQUF9FZGl0Q29udGV4dCAgICBwQ29udGV4dCkKLSAqIEBicmllZiAgICBTdWJzY3JpYmVzIHRvIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBleHRlcm5hbCBWaWRlby9BdWRpbyBjb2RlYwotICogQG5vdGUgVGhpcyBpcyBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBleHRlcm5hbCBjb2RlYyByZWdpc3RyYXRpb24gQVBJIHRvCi0gKiAgICAgICBjb3BlIHVwIHdpdGggc3BlY2lmaWMgcmVxdWlyZW1lbnQgb2YgT01YIGNvZGVjIGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgVlNTM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdWJzY3JpYmVFeHRlcm5hbENvZGVjcyhNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3MoTTRWU1MzR1BQX0VkaXRDb250ZXh0ICAgIHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBTaGVsbEN0eHQpCi0gKiBAYnJpZWYgICAgU3Vic2NyaWJlcyB0byBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZXh0ZXJuYWwgVmlkZW8vQXVkaW8gY29kZWMKLSAqIEBub3RlIFRoaXMgaXMgbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgZXh0ZXJuYWwgY29kZWMgcmVnaXN0cmF0aW9uIEFQSSB0bwotICogICAgICAgY29wZSB1cCB3aXRoIHNwZWNpZmljIHJlcXVpcmVtZW50IG9mIE9NWCBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUzNHUFAgY29udGV4dAotICogQHBhcmFtIHBTaGVsbENvbnRleHQgICAgKElOKSBNZWRpYSBDb2RlYyBzaGVsbCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgVlNTM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcFNoZWxsQ3R4dCk7Ci0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAppbmRleCBhZWRkZDk3Li5lYTA5Y2FhIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKQEAgLTM5LDEwICszOSw2IEBACiAKICNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgLyoqPCBmb3IgTTRfQWNjZXNzVW5pdCBkZWZpbml0aW9uICovCiAKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0hXX0FQSS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC02MDcsMTMgKzYwMyw2IEBACiAqLwogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwogCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQogICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKaW5kZXggMDY5Yjg0ZC4uZjAxZTM3MSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaApAQCAtNTMsMTAgKzUzLDYgQEAKICNpbmNsdWRlICJGcm9tMmlUb01vbm9fMTYuaCIgICAgICAgIC8qKjwgU3RlcmVvIHRvIE1vbm8gICAgICovCiAjaW5jbHVkZSAiTW9ub1RvMklfMTYuaCIgICAgICAgICAgICAvKio8IE1vbm8gdG8gU3RlcmVvICAgICAqLwogCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9IV19BUEkuaCIKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtODQsMTQgKzgwLDIxIEBACiAKIHR5cGVkZWYgZW51bQogewotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSAgICA9IDEwLCAgICAvKio8IERvaW5nIFJlYWQvV3JpdGUgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBkZWNvZGluZy9lbmNvZGluZykgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCAgICAgPSAxMSwgICAgLyoqPCBEZWNvZGUgZW5jb2RlIHRvIGNyZWF0ZSBhbiBJIGZyYW1lICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMTIsICAgIC8qKjwgRG9pbmcgUmVhZC1EZWNvZGUvRmlsdGVyLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGUtV3JpdGUgb3BlcmF0aW9uICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICAgID0gMTMsICAgIC8qKjwgVHJhbnNpdGlvbjsgYmxlbmRpbmcgb2YgdHdvIHZpZGVvcyAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUICAgICA9IDE0ICAgIC8qKjwgU3BlY2lhbCBSZWFkL1dyaXRlIG1vZGUgYWZ0ZXIgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gY3V0ICh0aW1lIGZyb3plbikgKi8KKyAgICAvKio8IERvaW5nIFJlYWQvV3JpdGUgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGhhdmUgbm8gcHJvY2Vzc2luZworICAgICAqIG9uIGlucHV0IGZyYW1lcy4gT25seSB0aW1lIHN0YW1wIG1hbmlwdWxhdGlvbnMgaW4gb3V0cHV0IGZpbGUuICovCisgICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFICAgID0gMTAsCisgICAgLyoqPCBEZWNvZGUgZW5jb2RlIHRvIGNyZWF0ZSBhbiBJIGZyYW1lLiBUaGlzIGlzIGRvbmUgZm9yIGEgc2luZ2xlIGZyYW1lCisgICAgICogdG8gY3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBmcmFtZS4gKi8KKyAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCAgICAgPSAxMSwKKyAgICAvKio8IERvaW5nIFJlYWQtPkRlY29kZS0+RmlsdGVyLT5FbmNvZGUtPldyaXRlIG9wZXJhdGlvbiBvbiB0aGUgaW5wdXQgZmlsZQorICAgICAqIHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICovCisgICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMTIsCisgICAgLyoqPCBBcHBsaWVkIHdoZW4gVHJhbnNpdGlvbiBpcyBhY3RpdmUgYW5kIGJsZW5kaW5nIG9mIHR3byB2aWRlb3MgaXMKKyAgICAgKiByZXF1aXJlZC4gKi8KKyAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04gICAgPSAxMywKKyAgICAvKio8IFNwZWNpYWwgUmVhZC9Xcml0ZSBtb2RlIHVzZWQgYWZ0ZXIgQkVHSU5fQ1VUIHN0YXRlLiBUaGUgZnJhbWUKKyAgICAgKiBpcyBhbHJlYWR5IGNvZGVkIGFzIEkgZnJhbWUgaW4gQkVHSU5fQ1VUIHN0YXRlOyBzbyBza2lwIGl0LiAqLworICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUICAgICA9IDE0CiB9CiBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGU7CiAKQEAgLTU5MiwyNCArNTk1LDEzIEBACiAgICAgICogSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCiAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICAgICAgICAgU2hlbGxBUEk7ICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZTsKLSAgICAgICAgTTRPU0FfVm9pZCogICAgICAgIHBVc2VyRGF0YTsKLSAgICAgICAgTTRPU0FfQm9vbCAgICAgICAgcmVnaXN0ZXJlZDsKLSAgICB9IHJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbTTRWRF9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgIE00T1NBX0NvbnRleHQgICAgICAgIG1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tDb2RlY1R5cGVfTkJdOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgIHBPTVhVc2VyRGF0YTsKLSNlbmRpZgogICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBiSXNzZWNvbmRDbGlwOwogICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0MTsgIC8qKjwgTGlzdCBvZiB0aGUgYWN0aXZlIGVmZmVjdHMgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwogICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHMxOyAgLyoqPCBOdW1iZXJzIG9mIGFjdGl2ZSBlZmZlY3RzIFJDICovCiAgICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQ7ICAvKio8IEZsYWcgdG8gaW5kaWNhdGUgdGhhdCBhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBlZmZlY3QgaXMgYWN0aXZlICovCisgICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIGlJbk91dFRpbWVPZmZzZXQ7CisgICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJFbmNvZGVUaWxsRW9GOwogfSBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dDsKIAogCkBAIC03MTYsNyArNzA4LDcgQEAKICAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkRvRHVja2luZzsKICAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkxvb3A7CiAgICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJOb0xvb3Bpbmc7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOworICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwogICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBianVtcGZsYWc7CiAKIH0gTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0OwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaAppbmRleCBkNjlhMTdjLi5hNjYyMTFiIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaApAQCAtMzc0LDUwICszNzQsNiBAQAogTTRPU0FfRVJSIE00eFZTU19DbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwogCiAvKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19SZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgVmlkZW8gZGVjb2RlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIHhWU1MgY29udGV4dAotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgVHlwZSBvZiBkZWNvZGVyIChNUEVHNCAuLi4pCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgKElOKSBEZWNvZGVyIGludGVyZmFjZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGRlY29kZXIKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICB4VlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kZXJUeXBlIGVuY29kZXJUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9JbnRlcmZhY2UqICAgIHBFbmNvZGVySW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBkZWNvZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgeFZTUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBlbmNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGVuY29kZXIgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgIHBFbmNvZGVySW50ZXJmYWNlICAoSU4pIEVuY29kZXIgaW50ZXJmYWNlCi0gKiBAcGFyYW0gICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgZW5jb2RlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIHhWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9FbmNvZGVyVHlwZSBlbmNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0ludGVyZmFjZSogICAgcEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBwcm90b3R5cGUgICAgTTR4VlNTX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQogICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgdmVyc2lvbiBvZiB0aGUgVmlkZW8gU3R1ZGlvIDIuMQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0ludGVybmFsLmgKaW5kZXggOWJlZDdiNy4uZTk5OTg2NyAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oCkBAIC0zMzUsOSArMzM1LDYgQEAKICAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwogICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKICAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgICAgICAgICAgICBPdXRwdXRBdWRpb0JpdHJhdGU7Ci0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSNlbmRpZgogICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQkdNOwogICAgIC8qKjwgVGhpcyBib29sZWFuIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgYWxyZWFkeSBjcmVhdGVkIG9yIG5vdCAqLwogICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3JlYXRlZDsKQEAgLTM4OSwxNyArMzg2LDYgQEAKICAqICAgICAgICAgICAgYSBKUEVHIGJ5IGNodW5rIG1vZGUuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwotI2lmIDAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIG1fcEZpbGVSZWFkUHRyOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX3BKUEVHRmlsZUluOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIG1fcEZpbGVJbjsKLSAgICBNNFNQU19TdHJlYW0gICAgICAgICAgICBtX2lucHV0U3RyZWFtOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdG90YWxfcmVhZDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX2ZpbGVTaXplOwotCi19IE00eFZTU19pbnRlcm5hbEpwZWdDaHVua01vZGU7Ci0jZW5kaWYKIAogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00OTMsMjAgKzQ3OSw2IEBACiAgICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0Ki8KICAgICBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQgICAgVVRGQ29udmVyc2lvbkNvbnRleHQ7ICAgIC8qVVRGIGNvbnZlcnNpb24gY29udGV4dCBzdHJ1Y3R1cmUqLwogCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBNNFZEX0ludGVyZmFjZSogICAgcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgICAgIE00T1NBX1ZvaWQqICAgICAgICBwVXNlckRhdGE7Ci0gICAgICAgIE00T1NBX0Jvb2wgICAgICAgIHJlZ2lzdGVyZWQ7Ci0gICAgfSByZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW000VkRfa1ZpZGVvVHlwZV9OQl07Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBNNFZFX0ludGVyZmFjZSogICAgcEVuY29kZXJJbnRlcmZhY2U7Ci0gICAgICAgIE00T1NBX1ZvaWQqICAgICAgICBwVXNlckRhdGE7Ci0gICAgICAgIE00T1NBX0Jvb2wgICAgICAgIHJlZ2lzdGVyZWQ7Ci0gICAgfSByZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW000VkVfa0VuY29kZXJUeXBlX05CXTsKIH0gTTR4VlNTX0NvbnRleHQ7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaAppbmRleCAxNmM0ZmQ5Li43ZmI2NGU4IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaAorKysgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaApAQCAtNDYsOSArNDYsNiBAQAogICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwogI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgogCi0jaW5jbHVkZSAiTTRWRF9IV19BUEkuaCIKLSNpbmNsdWRlICJNNFZFX0FQSS5oIgotCiAvKioKICAqIFRvIGVuYWJsZSBleHRlcm5hbCBhdWRpbyBjb2RlY3MgcmVnaXN0ZXJpbmcqLwogI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCkBAIC0yNTksMjcgKzI1Niw2IEBACiAgICAgTTRNQ1Nfa0Nyb3BCZWZvcmVSZXNpemUgICAgICA9IDB4MDEgIC8qSW5wdXQgaW1hZ2UgaXMgY3JvcHBlZCAoYmVmb3JlIGNoYW5naW5nIHJlc29sdXRpb24pKi8KIH0gTTRNQ1NfU1BDcm9wIDsKIAotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfRXhpZkluZm9zCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBhdmFpbGFibGUgZXhpZiBmaWVsZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfQ2hhciogSW1hZ2VUaXRsZTsgICAgICAgICAgICAgIC8qIEltYWdlIHRpdGxlICovCi0gICAgTTRPU0FfQ2hhciogRXF1aXBtZW50TWFudWZhY3R1cmVyOyAgIC8qIEltYWdlIGlucHV0IGVxdWlwbWVudCBtYW51ZmFjdHVyZXIgKi8KLSAgICBNNE9TQV9DaGFyKiBFcXVpcG1lbnRNb2RlbDsgICAgICAgICAgLyogSW1hZ2UgaW5wdXQgZXF1aXBtZW50IG1vZGVsICovCi0gICAgTTRPU0FfQ2hhciogU29mdHdhcmU7ICAgICAgICAgICAgICAgIC8qIFNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNE9TQV9DaGFyKiBBcnRpc3Q7ICAgICAgICAgICAgICAgICAgLyogQXJ0aXN0ICovCi0gICAgTTRPU0FfQ2hhciogQ29weXJpZ2h0OyAgICAgICAgICAgICAgIC8qIENvcHlyaWdodCAqLwotICAgIE00T1NBX0NoYXIqIENyZWF0aW9uRGF0ZVRpbWU7ICAgICAgICAvKiBDcmVhdGlvbiBkYXRlIGFuZCB0aW1lICovCi0gICAgTTRPU0FfVUludDMyIE9yaWVudGF0aW9uOyAgICAgICAgICAgIC8qIE9yaWVudGF0aW9uIG9mIHRoZSBwaWN0dXJlICovCi0gICAgTTRPU0FfQ2hhciogTGFzdENoYW5nZURhdGVUaW1lOyAgICAgIC8qIExhc3QgQ2hhbmdlIGRhdGUgYW5kIHRpbWUqLwotICAgIE00T1NBX1VJbnQzMiBQaXhlbFhEaW1lbnNpb247ICAgICAgICAvKiBJbWFnZSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyIFBpeGVsWURpbWVuc2lvbjsgICAgICAgIC8qIEltYWdlIEhlaWdodCovCi19IE00TUNTX0V4aWZJbmZvczsKLQotLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwogCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU5MCwxODEgKzU2Niw2IEBACiAgKi8KIE00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwogCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiAgICBwRGVjb2RlckludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgVmlkZW8gZGVjb2RlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGRlY29kZXIgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAoSU4pIERlY29kZXIgaW50ZXJmYWNlCi0gKiBAcGFyYW0gICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgZGVjb2RlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9JbnRlcmZhY2UqICAgIHBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci0KLU00T1NBX0VSUiBNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9FbmNvZGVyVHlwZSBlbmNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0ludGVyZmFjZSogICAgcEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckV4dGVybmFsQXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBleHRlcm5hbCBhdWRpbyBkZWNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBkZWNvZGVyVHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICB0aGUgZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0RlY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckV4dGVybmFsQXVkaW9FbmNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBtZWRpYVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBleHRlcm5hbCBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgdGhlIGVuY29kZXIgaW50ZXJmYWNlLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZTogICAgICAgICAgICAgICAgKElOKSBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0VuY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldEV4aWZJbmZvKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFJldHJpZXZlIHRoZSBFWElGIHRhZ3MgaW5mb3JtYXRpb25zIGZyb20gYSBTdGlsbCBwaWN0dXJlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYW5kIGZpbGwgYSBFeGlmIHRhZyBzdHJ1Y3QKLSAqICAgICAgICAgICAgZXhpZlRhZ3Mgc3RydWN0dXJlIG11c3QgYmUgYWxsb2NhdGVkL2RlYWxsb2NhdGVkIGJ5IHRoZSB1c2VyCi0gKiAgICAgICAgICAgIGV4aWZUYWdzIG1lbWJlcnMgd2lsbCBwb2ludCB0byBpbnRlcm5hbCBTUEUgaW5mb3JtYXRpb24sIHVzZXIgc2hvdWxkIG5vdCB0cnkKLSAqICAgICAgICAgIHRvIG1vZGlmeSBvciBkZWFsbG9jYXRlIHRoZW0KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4aWZJbmZvKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0V4aWZJbmZvcyogZXhpZlRhZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlckV4dGVuZGVkKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgICAgKnBFbmNvZGVySW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLSAqIEBicmllZiAgICBSZWdpc3RlcnMgYW4gZXh0ZXJuYWwgQXVkaW8gRW5jb2RlcgotICogQG5vdGUgVGhpcyBpcyBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBleHRlcm5hbCBhdWRpbyBlbmNvZGVyIHRvIGNvcGUgdXAgd2l0aCBzcGVjaWZpYwotICogICAgICAgcmVxdWlyZW1lbnQgb2YgT01YIGNvZGVjIGltcGxlbWVudGF0aW9uLgotICogQHBhcmFtICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICBlbmNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGVuY29kZXIKLSAqIEBwYXJhbSAgcEVuY29kZXJJbnRlcmZhY2UgIChJTikgRW5jb2RlciBpbnRlcmZhY2UgdG8gT01YIHNoZWxsIGZ1bmN0aW9uCi0gKiBAcGFyYW0gIHBVc2VyRGF0YSAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gYSB1c2VyIGRhdGEgdG8gZ2l2ZSB0byBleHRlcm5hbCBlbmNvZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVggQ29yZSBDb250ZXh0KQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlckV4dGVuZGVkKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAgICAqcEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXJFeHRlbmRlZChNNE1DU19Db250ZXh0ICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9WaWRlb1R5cGUgICAgICAgIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAgICAqcERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBkZWNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gIGRlY29kZXJUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgZGVjb2RlciAoTVBFRzQgLi4uKQotICogQHBhcmFtICBwVmlkRGVjb2RlckludGVyZmFjZSAgKElOKSBEZWNvZGVyIGludGVyZmFjZSBvZiB0eXBlICdNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UnCi0gKiBAcGFyYW0gIHBVc2VyRGF0YSAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gYSB1c2VyIGRhdGEgdG8gZ2l2ZSB0byBleHRlcm5hbCBkZWNvZGVyCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyRXh0ZW5kZWQoTTRNQ1NfQ29udGV4dCAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlICAgICAgICBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICAgIHBWaWREZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyRXh0ZW5kZWQoKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBlbmNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIGVuY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgU28gd2UgdXNlIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgaW5zdGVhZCBvZiBNNFZFX0ludGVyZmFjZS4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgZW5jb2RlclR5cGUgICAgICAgIChJTikgVHlwZSBvZiBlbmNvZGVyIChNUEVHNCAuLi4pCi0gKiBAcGFyYW0gIHBFbmNvZGVySW50ZXJmYWNlICAoSU4pIEVuY29kZXIgaW50ZXJmYWNlIG9mIHR5cGUgJ000RU5DT0RFUl9WaWRlb0ludGVyZmFjZScKLSAqIEBwYXJhbSAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGVuY29kZXIKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXJFeHRlbmRlZChNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfRW5jb2RlclR5cGUgZW5jb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCAgICBwRW5jb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlckV4dGVuZGVkKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICAgICpwRGVjb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBBdWRpbyBEZWNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIGF1ZGlvIGRlY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gIGRlY29kZXJUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgZGVjb2RlcgotICogQHBhcmFtICBwRGVjb2RlckludGVyZmFjZSAgKElOKSBEZWNvZGVyIGludGVyZmFjZSB0byBPTVggc2hlbGwgZnVuY3Rpb24KLSAqIEBwYXJhbSAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGRlY29kZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWCBDb3JlIENvbnRleHQpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyRXh0ZW5kZWQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgICAgKnBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKaW5kZXggYjlkNjBkMi4uY2QzYTdmMyAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfRXJyb3JDb2Rlcy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaApAQCAtMTE5LDYgKzExOSw2IEBACiAvKiAtLS0tLSBPVEhFUlMgRVJST1JTIC0tLS0tICovCiAjZGVmaW5lIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDUwKQogI2RlZmluZSBNNE1DU19FUlJfTk9NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUxKQotCisjZGVmaW5lIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRNQ1MsIDB4NTIpCiAjZW5kaWYgLyogX19NNE1DU19FcnJvckNvZGVzX0hfXyAqLwogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAppbmRleCA0MjJlNDBkLi41OTdhNTkxIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKQEAgLTMzNywzMSArMzM3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKTsKIAotI2lmZGVmIFRJTUVTQ0FMRV9CVUcKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFBhcnNlVmlkZW9EU0koICkKLSAqIEBicmllZiA6ICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB2aWRlbyBEU0kgYW5kIGNoYW5nZXMgd3JpdGVyIHZvcCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uCi0gKiBAbm90ZSAgOiAgSXQgYWxzbyBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYml0cyBvbiB3aGljaCB0aGUgdm9wX3RpbWVfaW5jcmVtZW50IGlzIGNvZGVkCi0gKiAgICAgICAgICAgaW4gdGhlIGlucHV0IHN0cmVhbQotICogQHBhcmFtCi0gKiBAcmV0dXJuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRQYXJzZVZpZGVvRFNJKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGFuZ2VBVVZpZGVvVGltZXNjYWxlKCApCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHJldHVybgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50Q2hhbmdlQVVWaWRlb1RpbWVzY2FsZShNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSNlbmRpZiAvKiBUSU1FU0NBTEVfQlVHICovCi0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmgKaW5kZXggOTYxMWZjZi4uY2E2M2NjMCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaApAQCAtMTI3LDI4ICsxMjcsNiBAQAogICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCAgPSAyICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZW5jb2RpbmcgICAgKi8KIH0gTTRNQ1NfU3RyZWFtU3RhdGU7CiAKLSNpZmRlZiBUSU1FU0NBTEVfQlVHCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNE1DU19Wb2xQYXJzZQotICogQGJyaWVmICAgICAgICBWT0wgcGFyc2luZyByZXN1bHRzIG5lZWRlZCBmb3IgVk9QIHBhcnNpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGU7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2VuYWJsZTsKLSAgICBNNE9TQV9VSW50OCByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZTsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eTsKLSAgICBNNE9TQV9VSW50OCBlbmhhbmNlbWVudF90eXBlOwotICAgIE00T1NBX1VJbnQ4IGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQ7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX3dhcnBpbmdfcG9pbnRzOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZTsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb247Ci0KLX0gTTRNQ1NfVm9sUGFyc2U7Ci0jZW5kaWYKIAogLyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MzcsMTMgKzQxNSw2IEBACiAgICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgaW4gYnBzICovCiAgICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIHZpZGVvIGJpdHJhdGUgaW4gYnBzICovCiAKLSNpZmRlZiBUSU1FU0NBTEVfQlVHCi0gICAgTTRPU0FfVUludDMyICAgIHVpVmlkZW9UaW1lc2NhbGU7ICAgICAvKio8IFRhcmdldGVkIHRpbWVzY2FsZSB3aXRob3V0IGRlY29kZS9lbmNvZGUgcHJvY2VzcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVRpbWVzY2FsZUxlbmd0aDsgICAgLyoqPCBMZW5ndGggb2YgdGhlIFZPUCB0aW1lIGluY3JlbWVudCBpbiBiaXRzICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpT3JpZ1ZpZGVvVGltZXNjYWxlOyAvKio8IE9yaWdpbmFsIHRpbWVzY2FsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aU9yaWdUaW1lc2NhbGVMZW5ndGg7LyoqPCBPcmlnaW5hbCBsZW5ndGggb2YgdGhlIFZPUCB0aW1lIGluY3JlbWVudCBpbiBiaXRzKi8KLSAgICBNNE1DU19Wb2xQYXJzZSAgdm9sUGFyc2luZzsgICAgICAgICAgIC8qKjwgVk9MIHBhcnNpbmcgcmVzdWx0cyBuZWVkZWQgZm9yIFZPUCBwYXJzaW5nICovCi0jZW5kaWYKICAgICBNNE9TQV9VSW50OCAgICAgdWlQcm9ncmVzczsgIC8qKjwgUHJvZ3Jlc3MgaW5mb3JtYXRpb24gc2F2ZWQgYXQgZWFjaCBzdGVwIHRvIGJlIGFibGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0IGluIGNhc2Ugb2YgcGF1c2UgKi8KIApAQCAtNTExLDcgKzQ4Miw3IEBACiAgICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwUG9zSW5Tc3JjQnVmZmVySW47IC8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBpbiBidWZmZXIgKi8KICAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJPdXQ7LyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIG91dCBidWZmZXIgKi8KIAotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgKnBMVkF1ZGlvUmVzYW1wbGVyOworICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgcExWQXVkaW9SZXNhbXBsZXI7CiAKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsKaW5kZXggNzA3YTU4My4uZDFkNDhiYiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5taworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCkBAIC0yOCw3ICsyOCw2IEBACiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCiAgICAgICBNNE1DU19BUEkuYyBcCiAgICAgICBNNE1DU19BdWRpb0VmZmVjdHMuYyBcCi0gICAgICBNNE1DU19CaXRzdHJlYW1QYXJzZXIuYyBcCiAgICAgICBNNE1DU19Db2RlY3MuYyBcCiAgICAgICBNNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAogICAgICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKQEAgLTU4LDEwICs1Nyw1IEBACiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAogICAgIC1ETTRNQ1NfV0lUSF9GQVNUX09QRU4KIAotCi0jIERvbid0IHByZWxpbmsgdGhpcyBsaWJyYXJ5LiAgRm9yIG1vcmUgZWZmaWNpZW50IGNvZGUsIHlvdSBtYXkgd2FudAotIyB0byBhZGQgdGhpcyBsaWJyYXJ5IHRvIHRoZSBwcmVsaW5rIG1hcCBhbmQgc2V0IHRoaXMgdG8gdHJ1ZS4KLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYwppbmRleCBkMDRiZWZhLi44YmVkOTA0IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiB7CiAgICAgTlNXQVZDX01DU190ICpwX2JzID0gTTRPU0FfTlVMTDsKICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBwX2JzID0gKE5TV0FWQ19NQ1NfdCAqKU00T1NBX21hbGxvYyhzaXplb2YoTlNXQVZDX01DU190KSwgTTRNQ1MsCisgICAgcF9icyA9IChOU1dBVkNfTUNTX3QgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE5TV0FWQ19NQ1NfdCksIE00TUNTLAogICAgICAgICAoTTRPU0FfQ2hhciAqKSJOU1dBVkNfTUNTX3QiKTsKIAogICAgIGlmKCBNNE9TQV9OVUxMID09IHBfYnMgKQpAQCAtNzU2LDggKzc1Niw4IEBACiAKICAgICAvLyBTdGFnZUZyaWdodCBjb2RlY3MgbWF5IGFkZCBhIHN0YXJ0IGNvZGUsIG1ha2Ugc3VyZSBpdCBpcyBub3QgcHJlc2VudAogCi0gICAgaWYoICFNNE9TQV9tZW1jbXAoKE00T1NBX01lbUFkZHI4KWluYnVmZiwKLSAgICAgICAgKE00T1NBX01lbUFkZHI4KSJceDAwXHgwMFx4MDBceDAxIiwgNCkgKQorICAgIGlmKCAhbWVtY21wKCh2b2lkICopaW5idWZmLAorICAgICAgICAiXHgwMFx4MDBceDAwXHgwMSIsIDQpICkKICAgICB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8zKAogICAgICAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc05BTFUgRVJST1IgOiBOQUxVIHN0YXJ0IGNvZGUgaGFzIG5vdCBiZWVuIHJlbW92ZWQgJWQgIgpAQCAtNzY4LDkgKzc2OCw5IEBACiAgICAgfQogCiAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgcFRtcEJ1ZmYxID0gKE00T1NBX0ludDggKilNNE9TQV9tYWxsb2MoaW5idWZfc2l6ZSArIDQsIE00TUNTLAorICAgIHBUbXBCdWZmMSA9IChNNE9TQV9JbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGluYnVmX3NpemUgKyA0LCBNNE1DUywKICAgICAgICAgKE00T1NBX0NoYXIgKikidG1wTkFMVSIpOwotICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpKHBUbXBCdWZmMSArIDQpLCAoTTRPU0FfTWVtQWRkcjgpaW5idWZmLAorICAgIG1lbWNweSgodm9pZCAqKShwVG1wQnVmZjEgKyA0KSwgKHZvaWQgKilpbmJ1ZmYsCiAgICAgICAgIGluYnVmX3NpemUpOwogICAgIHBUbXBCdWZmMVszXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplKSAmIDB4MDAwMDAwRkY7CiAgICAgcFRtcEJ1ZmYxWzJdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gOCkgJiAweDAwMDAwMEZGOwpAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAogICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBCdWZmMSk7CisgICAgZnJlZShwVG1wQnVmZjEpOwogICAgIHBUbXBCdWZmMSA9IE00T1NBX05VTEw7CiAgICAgaW5idWZmID0gKE00T1NBX1VJbnQ4ICopcFRtcEJ1ZmYyOwogCkBAIC0xNTY2LDcgKzE1NjYsNyBAQAogICAgICAgICBpbnN0YW5jZS0+ZmluYWxfUFBTX0lEID0gQ2xpcF9QUFNJRFtjbnRdOwogCiAgICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV9tYWxsb2MoaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCisgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7CiAKICAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKQEAgLTE1NzYsOCArMTU3Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpaW5zdGFuY2UtPm1fcEZpbmFsRFNJLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCisgICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAogICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwogICAgIH0KICAgICBlbHNlCkBAIC0xNTk2LDcgKzE1OTYsNyBAQAogICAgICAgICBzaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZQogICAgICAgICAgICAgKyAxMDsKIAotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSAoTTRPU0FfVUludDggKilNNE9TQV9tYWxsb2Moc2l6ZSwgTTRNQ1MsCisgICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplLCBNNE1DUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImluc3RhbmNlLT5tX3BGaW5hbERTSSIpOwogCiAgICAgICAgIGlmKCBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPT0gTTRPU0FfTlVMTCApCkBAIC0xNjA1LDggKzE2MDUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICB9CiAKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCisgICAgICAgIG1lbWNweSgodm9pZCAqKWluc3RhbmNlLT5tX3BGaW5hbERTSSwKKyAgICAgICAgICAgICh2b2lkICopaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCiAgICAgICAgICAgICBpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7CiAKICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BGaW5hbERTSVtsQ2xpcERTSV9QUFNfb2Zmc2V0XTsKQEAgLTE5NTUsOCArMTk1NSw4IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyIC0gNTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpICZvdXRidWZmW291dGJ1ZmZwb3NdLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwX2JzLT5CdWZmZXIsIG5hbF9zaXplICsgNCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJm91dGJ1ZmZbb3V0YnVmZnBvc10sCisgICAgICAgICAgICAgICAgKHZvaWQgKilwX2JzLT5CdWZmZXIsIG5hbF9zaXplICsgNCk7CiAKICAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvc10gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAyNCkmIDB4RkYpOwogICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDE2KSYgMHhGRik7OwpAQCAtMjAzNiwzMCArMjAzNiwzMCBAQAogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPmVuY29kZXJfcHBzLnNsaWNlX2dyb3VwX2lkICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQpOworICAgICAgICBmcmVlKGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCk7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWluc3RhbmNlLT5wX2VuY29kZXJfc3BzKTsKKyAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Nwcyk7CiAgICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+cF9lbmNvZGVyX3BwcyApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMpOworICAgICAgICBmcmVlKGluc3RhbmNlLT5wX2VuY29kZXJfcHBzKTsKICAgICAgICAgaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5tX3BGaW5hbERTSSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpaW5zdGFuY2UtPm1fcEZpbmFsRFNJKTsKKyAgICAgICAgZnJlZShpbnN0YW5jZS0+bV9wRmluYWxEU0kpOwogICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilpbnN0YW5jZSk7CisgICAgICAgIGZyZWUoaW5zdGFuY2UpOwogICAgICAgICBpbnN0YW5jZSA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0yMTMwLDcgKzIxMzAsNyBAQAogCiAgICAgLyoqCiAgICAgKiBBbGxvY2F0ZSB0aGUgTUNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KSwKKyAgICBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TUNTX0ludGVybmFsQ29udGV4dCksCiAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJNNE1DU19JbnRlcm5hbENvbnRleHQiKTsKICAgICAqcENvbnRleHQgPSBwQzsKIApAQCAtMjI1MSwxOCArMjI1MSw2IEBACiAgICAgcEMtPnVpVmlkZW9CaXRyYXRlID0KICAgICAgICAgTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGU7IC8qKjwgTm8gYml0cmF0ZSBzZXQgeWV0ICovCiAKLSNpZmRlZiBUSU1FU0NBTEVfQlVHCi0KLSAgICAvKiBCeSBkZWZhdWx0LCB0aW1lc2NhbGUgaXMgbm90IG1vZGlmaWVkOyBpZiB0aGlzIHZhbHVlIGlzIG5vdCAwLCB0aW1lc2NhbGUgaXMKLSAgICAgKiBtb2RpZmllZCB3aXRob3V0IGRlY29kZS9lbmNvZGUgcHJvY2VzcwotICAgICAqLwotICAgIHBDLT51aVZpZGVvVGltZXNjYWxlID0gMDsKLSAgICBwQy0+dWlUaW1lc2NhbGVMZW5ndGggPSAwOwotICAgIHBDLT51aU9yaWdWaWRlb1RpbWVzY2FsZSA9IDA7Ci0gICAgcEMtPnVpT3JpZ1RpbWVzY2FsZUxlbmd0aCA9IDA7Ci0KLSNlbmRpZgotCiAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwogICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwogICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKQEAgLTMxNjQsNyArMzE1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcEluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKIAogICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBX21hbGxvYyhwQy0+bV9wSW5zdGFuY2UtPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1fcEluc3RhbmNlLT4gXAogICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRNQ1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKIApAQCAtMzE3Myw4ICszMTYxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJpbnN0YW5jZS0+bV9wRmluYWxEU0k6IGFsbG9jYXRpb24gZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPiBcCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT4gXAogICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTMyMjIsNyArMzIxMCw3IEBACiAgICAgZnJlZSBlZmZlY3RzIGxpc3QqLwogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wRWZmZWN0cyApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnBFZmZlY3RzKTsKKyAgICAgICAgZnJlZShwQy0+cEVmZmVjdHMpOwogICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwogICAgIH0KICAgICBwQy0+bmJFZmZlY3RzID0gMDsKQEAgLTMyMzQsMTMgKzMyMjIsNyBAQAogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+SDI2NE1DU1RlbXBCdWZmZXIpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BJbnN0YW5jZSApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0ZyZWVpbnN0YW5jZShwQy0+bV9wSW5zdGFuY2UpOwotICAgICAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOworICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7CiAgICAgfQogCiAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2Nsb3NlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7CkBAIC0zMzA3LDYgKzMyODksMTIgQEAKICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwogICAgIH0KIAorICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BJbnN0YW5jZSApCisgICAgeworICAgICAgICBlcnIgPSBIMjY0TUNTX0ZyZWVpbnN0YW5jZShwQy0+bV9wSW5zdGFuY2UpOworICAgICAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOworICAgIH0KKwogICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZW5jb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCiAKICAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlFbmNDdHh0KQpAQCAtMzMzMSw3ICszMzE5LDcgQEAKICAgICBpZiggKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCiAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYpICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmKTsKKyAgICAgICAgZnJlZShwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmKTsKICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0zMzM5LDIyICszMzI3LDIyIEBACiAgICAgewogICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOworICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7CiAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSk7CisgICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwogICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wUHJlUmVzaXplRnJhbWUpOworICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWUpOwogICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTMzNjIsMjUgKzMzNTAsMjUgQEAKIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPlNzcmNTY3JhdGNoKTsKKyAgICAgICAgZnJlZShwQy0+U3NyY1NjcmF0Y2gpOwogICAgICAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlckluICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFNzcmNCdWZmZXJJbik7CisgICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVySW4pOwogICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFNzcmNCdWZmZXJPdXQpOworICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7CiAgICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYgKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTFZEZXN0cm95KChNNE9TQV9JbnQzMilwQy0+cExWQXVkaW9SZXNhbXBsZXIpOworICAgICAgICBMVkRlc3Ryb3kocEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTM0MTMsNyArMzQwMSw3IEBACiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpOworICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKTsKICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMzQ0MSw3ICszNDI5LDcgQEAKIAogICAgIC8qKgogICAgICogRnJlZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMpOworICAgIGZyZWUocEMpOwogICAgIHBDID0gTTRPU0FfTlVMTDsKIAogICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19jbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7CkBAIC0zNTc3LDggKzM1NjUsOCBAQAogCiAgICAgLyoqCiAgICAgKiBDb3B5IHByZXZpb3VzbHkgY29tcHV0ZWQgcHJvcGVydGllcyBpbnRvIGdpdmVuIHN0cnVjdHVyZSAqLwotICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEZpbGVQcm9wZXJ0aWVzLAotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcywKKyAgICBtZW1jcHkoKHZvaWQgKilwRmlsZVByb3BlcnRpZXMsCisgICAgICAgICh2b2lkICopICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcywKICAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7CiAKICAgICByZXR1cm4gTTROT19FUlJPUjsKQEAgLTM2NzgsMTkgKzM2NjYsNiBAQAogICAgIC8qIFNldCB2aWRlbyBwYXJhbWV0ZXJzICovCiAgICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKICAgICB7Ci0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgICAgICAvKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGltZXNjYWxlIG1vZGlmaWNhdGlvbiAqLwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnVpVmlkZW9UaW1lc2NhbGUgPSBwUGFyYW1zLT5PdXRwdXRWaWRlb1RpbWVzY2FsZTsKLQotICAgICAgICAgICAgLyogSWYgdGltZXNjYWxlIG1vZGlmaWNhdGlvbiBtb2RlIGlzIG9uLCB3ZSBmb3JjZSBOVUxMIHZpZGVvIGVuY29kaW5nIC4uLiAqLwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvOwotICAgICAgICB9Ci0KLSNlbmRpZgotCiAgICAgICAgIC8qKgogICAgICAgICAqIENoZWNrIFZpZGVvIEZvcm1hdCBjb3JyZWN0bmVzcyAqLwogCkBAIC00MzA2LDcgKzQyODEsNyBAQAogICAgIHsKICAgICAgICAgTTRPU0FfVUludDMyIGogPSAwOwogICAgICAgICBwQy0+bmJFZmZlY3RzID0gcFBhcmFtcy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSAoTTRNQ1NfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV9tYWxsb2MocEMtPm5iRWZmZWN0cyBcCisgICAgICAgIHBDLT5wRWZmZWN0cyA9IChNNE1DU19FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bmJFZmZlY3RzIFwKICAgICAgICAgICAgICpzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpLCBNNE1DUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jYXRpb24gb2YgZWZmZWN0cyBsaXN0Iik7CiAKQEAgLTQzMTksOCArNDI5NCw4IEBACiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgcEMtPm5iRWZmZWN0czsgaisrICkKICAgICAgICAgewogICAgICAgICAgICAgLyogQ29weSBlZmZlY3QgdG8gImxvY2FsIiBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpICYocEMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpICYocFBhcmFtcy0+cEVmZmVjdHNbal0pLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzW2pdKSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSAmKHBQYXJhbXMtPnBFZmZlY3RzW2pdKSwKICAgICAgICAgICAgICAgICBzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpKTsKIAogICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEVmZmVjdHNbal0uQXVkaW9FZmZlY3RUeXBlICkKQEAgLTU5MDcsNyArNTg4Miw3IEBACiAgICAgICAgICogQWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSB2aWRlbyBwbGFuZSB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUKICAgICAgICAgIHJlc2l6aW5nICovCiAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfbWFsbG9jKDMgKiBzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAorICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAogICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lIik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZSApCkBAIC01OTMyLDcgKzU5MDcsNyBAQAogICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KIAogICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV9tYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSBcCisgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgXAogICAgICAgICAgICAgKnBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsIE00TUNTLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKIApAQCAtNTk1NSw3ICs1OTMwLDcgQEAKICAgICAgICAgICAgIHBQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoOyAvKio8IHNpbXBsZSBjYXNlOiBzdHJpZGUgZXF1YWxzIHdpZHRoICovCiAKICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgXAorICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlIFwKICAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LCBNNE1DUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7CiAKQEAgLTU5NzgsNyArNTk1Myw3IEBACiAgICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwogCiAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBX21hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlIFwKKyAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSBcCiAgICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwgTTRNQ1MsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwogCkBAIC02MTM1LDcgKzYxMTAsNyBAQAogICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7CiAgICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSBcCisgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgXAogICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKICAgICB9CiAKQEAgLTYzODQsNyArNjM1OSw3IEBACiAgICAgLyoqCiAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwogICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYyhwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpIFwKKyAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpIFwKICAgICAgICAgKnBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscywgTTRNQ1MsCiAgICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKIApAQCAtNjQwMCw3ICs2Mzc1LDcgQEAKICAgICAvKioKICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwogICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgXAorICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpIFwKICAgICAgICAgKnBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscywgTTRNQ1MsCiAgICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7CiAKQEAgLTY0MTMsMTggKzYzODgsMjIgQEAKICAgICB9CiAKIAotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IChNNE9TQV9JbnQzMilMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKAorICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoCiAgICAgICAgIDE2LCAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICAgICAgLypwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKi8KICAgICAgICAgKE00T1NBX0ludDE2KXBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscy8qc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyovLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8vKnBTZXR0aW5ncy0+b3V0cHV0QVNGKi8KLSAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeS8qc3NyY1BhcmFtcy5TU1JDX0ZzX091dCovLCAxKTsKLSAgICBMVkF1ZGlvc2V0U2FtcGxlUmF0ZSgoTTRPU0FfSW50MzIpcEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAorICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpLypzc3JjUGFyYW1zLlNTUkNfRnNfT3V0Ki8sIDEpOworCisgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wTFZBdWRpb1Jlc2FtcGxlcikKKyAgICAgeworICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOworICAgICB9CisKKyAgICBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsCiAgICAgICAgIC8qZ0lucHV0UGFyYW1zLmx2SW5TYW1wbGVSYXRlKi8KICAgICAgICAgLypwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSovCiAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kvKnNzcmNQYXJhbXMuU1NSQ19Gc19JbiovKTsKIAotICAgIExWQXVkaW9zZXRWb2x1bWUoKE00T1NBX0ludDMyKXBDLT5wTFZBdWRpb1Jlc2FtcGxlciwgKE00T1NBX0ludDE2KSgweDEwMDAgLyogMHg3ZmZmICovKSwKKyAgICBMVkF1ZGlvc2V0Vm9sdW1lKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwgKE00T1NBX0ludDE2KSgweDEwMDAgLyogMHg3ZmZmICovKSwKICAgICAgICAgKE00T1NBX0ludDE2KSgweDEwMDAvKjB4N2ZmZiovKSk7CiAKIApAQCAtNjQ4Niw3ICs2NDY1LDcgQEAKIAogICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwogICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYyhwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHksIE00TUNTLAorICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSwgTTRNQ1MsCiAgICAgICAgIChNNE9TQV9DaGFyICopInBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyIik7CiAKICAgICAvKioKQEAgLTY2ODAsNyArNjY1OSw3IEBACiAgICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEgyNjMgRFNJICovCiAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0KICAgICAgICAgICAgICAgICA3OyAvKio8IEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICAgICAgcERTSSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MoNywgTTRNQ1MsIChNNE9TQV9DaGFyCisgICAgICAgICAgICBwRFNJID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg3LCBNNE1DUywgKE00T1NBX0NoYXIKICAgICAgICAgICAgICAgICAqKSJwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmIChEU0kgSDI2MykiKTsKIAogICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcERTSSApCkBAIC02NzY2LDUxICs2NzQ1LDYgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKCBNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQogICAgICAgICB7Ci0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgICAgICAgICAgLyogaWYgd2UgYXJlIGluICJ0aW1lc2NhbGUgbW9kZSIsIHdlIG5lZWQgdG8ga25vdyBvbiBob3cgbWFueSBiaXRzIHRoZSB2Ci0gICAgICAgICAgICBvcF90aW1lX2luY3JlbWVudCBpcyBjb2RlZCBhbmQgdG8gY2hhbmdlIHRoZSBEU0kgKi8KLQotICAgICAgICAgICAgaWYoIHBDLT51aVZpZGVvVGltZXNjYWxlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplLAotICAgICAgICAgICAgICAgICAgICBNNE1DUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgIk5ldyBkZWNvZGVyIHNwZWNpZmljIGluZm8gZm9yIHRpbWVzY2FsZSBtb2RpZmljYXRpb24iKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IEFsbG9jYXRpb24gZXJyb3JcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvcHkgUmVhZGluZyBEU0kgdG8gbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweShwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYWxsIGEgZnVuY3Rpb24gdG8gY2hhbmdlIERTSSBhbmQgdG8gZ2V0IHRoZSBuYiBvZiBiaXRzIG9uIHdoaWNoIHRoZQotICAgICAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudCBpcyBjb2RlZCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFBhcnNlVmlkZW9EU0kocEMpOwotICAgICAgICAgICAgfQotCi0jZWxzZQogICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KIAogICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgpAQCAtNjgxOSw4ICs2NzUzLDYgQEAKICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+CiAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKIAotI2VuZGlmCi0KICAgICAgICAgfQogICAgICAgICAvKiBvdGhlcndpc2UgKE1QRUc0KSwgdGhlIERTSSB3aWxsIGJlIHJlY292ZXJlZCBmcm9tIHRoZSBlbmNvZGVyIGxhdGVyIG9uLiAqLwogCkBAIC03OTI4LDcgKzc4NjAsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfbWFsbG9jKHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUsCisgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplLAogICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUxIGJ1ZmZlciIpOwogCiAgICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMSA9PSBNNE9TQV9OVUxMICkKQEAgLTc5ODIsOCArNzkxNCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5tX3BEYXRhQWRkcmVzczEsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3NpemUpOwogICAgICAgICB9CiAKQEAgLTgwMDMsNyArNzkzNSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MocEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSwKKyAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUsCiAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSBBVSBidWZmZXIiKTsKIAogICAgICAgICAgICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczIgPT0gTTRPU0FfTlVMTCApCkBAIC04MDE3LDggKzc5NDksOCBAQAogICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gQVUgaW4gdGhlIGlucHV0IGZpbGUgKi8KICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMi5tX0NUUyA+IHBDLT5SZWFkZXJBdWRpb0FVMS5tX0NUUyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpICZwQy0+UmVhZGVyQXVkaW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVLAorICAgICAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7CiAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAogICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKICAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKQEAgLTgwNDYsOCArNzk3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5tX3BEYXRhQWRkcmVzczEsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3NpemUpOwogICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFM7CkBAIC04MDU1LDggKzc5ODcsOCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkgJnBDLT5SZWFkZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkgJnBDLT5SZWFkZXJBdWRpb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUsCisgICAgICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCiAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAogICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwpAQCAtODA4NSw4ICs4MDE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcERhdGFBZGRyZXNzMiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPlJlYWRlckF1ZGlvQVUyLm1fZGF0YUFkZHJlc3MsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MyLAorICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUyLm1fZGF0YUFkZHJlc3MsCiAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fc2l6ZSk7CiAgICAgICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX0NUUyAtIHBDLT5SZWFkZXJBdWRpb0FVMS5tX0NUUzsKQEAgLTgxMzgsMTUgKzgwNzAsMTUgQEAKICAgICAgICAgICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PLAogICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU8sCiAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpAQCAtODE2MSwxNyArODA5MywxNyBAQAogICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCiAgICAgICAgIHsKICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LAogICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwogICAgICAgICAgICAgLyogU29tZSByZW1haW5pbmcgQU1SIEFVIG5lZWRzIHRvIGJlIGNvcGllZCAqLwogICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAhPSAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgV3JpdGVyIEFVICovCiAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSArPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICArIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICsgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MTgxLDggKzgxMTMsOCBAQAogICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCiAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7CiAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplOwogICAgICAgICB9CkBAIC04MTk0LDggKzgxMjYsOCBAQAogICAgICAgICBNNE9TQV9UUkFDRTNfMSgKICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBDb3B5aW5nIGF1ZGlvIEFVOiBzaXplPSVkIiwKICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcywKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCiAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwogICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplOwogICAgIH0KQEAgLTg0MTcsNyArODM0OSw3IEBACiAKICAgICAvKioKICAgICAqIENvcHkgZnJvbSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGludG8gdGhlIFNzcmMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfbWVtY3B5KHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQsCisgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwgKHZvaWQgKilwQy0+cFBvc0luRGVjQnVmZmVyT3V0LAogICAgICAgICB1aURlY29kZXIyU3NyY19OYkJ5dGVzKTsKIAogICAgIC8qKgpAQCAtODQ2NCwyOSArODM5NiwyOSBAQAogICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCiAgICAgewogICAgICAgICB0ZW1wQnVmZk91dCA9Ci0gICAgICAgICAgICAoc2hvcnQgKilNNE9TQV9tYWxsb2MoKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgorICAgICAgICAgICAgKHNob3J0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIDIKICAgICAgICAgICAgICogKCgqcEMpLklucHV0RmlsZVByb3BlcnRpZXMpLnVpTmJDaGFubmVscyksCiAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgInRlbXBCdWZmT3V0Iik7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpdGVtcEJ1ZmZPdXQsIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIDIKLSAgICAgICAgICAgICogKCgqcEMpLklucHV0RmlsZVByb3BlcnRpZXMpLnVpTmJDaGFubmVscyksIDApOworICAgICAgICBtZW1zZXQoKHZvaWQgKil0ZW1wQnVmZk91dCwgMCwocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCisgICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKIAogICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKil0ZW1wQnVmZk91dCwgKHNob3J0ICopcFNzcmNJbnB1dCwKLSAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsIChNNE9TQV9JbnQzMilwQy0+cExWQXVkaW9SZXNhbXBsZXIpOworICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtc2V0KHBDLT5wU3NyY0J1ZmZlck91dCwgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpLCAwKTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAwLCAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKKyAgICAgICAgICAgICogKCgqcEMpLklucHV0RmlsZVByb3BlcnRpZXMpLnVpTmJDaGFubmVscykpOwogCiAgICAgICAgIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIChzaG9ydCAqKXBTc3JjSW5wdXQsIHBDLT5pU3NyY05iU2FtcGxPdXQsIChNNE9TQV9JbnQzMilwQy0+cExWQXVkaW9SZXNhbXBsZXIpOworICAgICAgICAgICAgKHNob3J0ICopcFNzcmNJbnB1dCwgcEMtPmlTc3JjTmJTYW1wbE91dCwgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKICAgICB9CiAKICAgICBpZiggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEgKQogICAgIHsKICAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXRlbXBCdWZmT3V0LCAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCiAgICAgICAgICAgICAoc2hvcnQpcEMtPmlTc3JjTmJTYW1wbE91dCk7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil0ZW1wQnVmZk91dCk7CisgICAgICAgIGZyZWUodGVtcEJ1ZmZPdXQpOwogICAgIH0KIAogCkBAIC04NjAzLDcgKzg1MzUsNyBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIC8qIGNvcHkgZnJvbSB0aGUgc3NyYyBvdXQgYnVmZmVyIGludG8gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgICAgIE00T1NBX21lbWNweShwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyLCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciwgKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKICAgICAgICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpOwogICAgIH0KIApAQCAtODY5NCwxNiArODYyNiwxNiBAQAogICAgICAgICBpZiggcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewogICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyBwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICBNNE9TQV9VSW50NjQgdGVtcFByb2dyZXNzID0gMDsKKyAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wUHJvZ3Jlc3MgPSAwOwogICAgICAgICAgICAgcFByb2dyZXNzLnVpQ2xpcFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTOwogCiAgICAgICAgICAgICBwUHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKCBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgKiAxMDAwKQogICAgICAgICAgICAgICAgIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLSAgICAgICAgICAgIHRlbXBQcm9ncmVzcyA9ICggKE00T1NBX1VJbnQ2NClwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUworICAgICAgICAgICAgdGVtcFByb2dyZXNzID0gKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCiAgICAgICAgICAgICAgICAgLSBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLnVpU3RhcnRUaW1lCiAgICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwMDsKICAgICAgICAgICAgIHBQcm9ncmVzcy51aVByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSh0ZW1wUHJvZ3Jlc3MgLyAoTTRPU0FfVUludDY0KXBDLT5wRWZmZWN0c1sKKyAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSh0ZW1wUHJvZ3Jlc3MgLyAoTTRPU0FfVUludDMyKXBDLT5wRWZmZWN0c1sKICAgICAgICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3ROdW1iZXJdLnVpRHVyYXRpb24pOwogCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0uRXh0QXVkaW9FZmZlY3RGY3QoCkBAIC04ODM1LDggKzg3NjcsOCBAQAogewogICAgIGlmKCAqYWRkciAhPSBNNE9TQV9OVUxMICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKCBNNE9TQV9NZW1BZGRyMzIpICogYWRkcik7Ci0gICAgICAgICphZGRyID0gKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYyhuZXdTaXplLCBNNE1DUywKKyAgICAgICAgZnJlZSgqYWRkcik7CisgICAgICAgICphZGRyID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdTaXplLCBNNE1DUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlJlYWxsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgQVUgYnVmZmVyIik7CiAKICAgICAgICAgaWYoICphZGRyID09IE00T1NBX05VTEwgKQpAQCAtODk5NSwxNiArODkyNyw2IEBACiAKICAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9UUlVFOwogCi0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIC8qIGNvbW1lbnRlZCx0aGlzIHBhcnQgaXMgZG9uZSBmdXJ0aGVyIG9uIG9uZSBvZiB0aGUgdGVtcG9yYXJ5IHZpZGVvIEFVICh2aWRlbyBBVTEgb3IgdmlkZW8gQVUyKSovCi0jaWYgMAotICAgIC8qKgotICAgICogUmVhZCB0aGUgbmV4dCB2aWRlbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmcEMtPlJlYWRlclZpZGVvQVUpOwotI2VuZGlmCiAKICAgICAvKiBGaW5kIHRoZSBuZXh0IEFVIGR1cmF0aW9uIHRvIG9idGFpbiBhIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0Ki8KICAgICAvKioKQEAgLTkwMjcsNyArODk0OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplLCBNNE1DUywKKyAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSwgTTRNQ1MsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUxIGJ1ZmZlciIpOwogCiAgICAgICAgIGlmKCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPT0gTTRPU0FfTlVMTCApCkBAIC05MDc3LDggKzg5OTksOCBAQAogICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQogICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemU7CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEsCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKKyAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCiAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKICAgICB9CiAKQEAgLTkwOTgsNyArOTAyMCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfbWFsbG9jKHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUsIE00TUNTLAorICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplLCBNNE1DUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVSBidWZmZXIiKTsKIAogICAgICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID09IE00T1NBX05VTEwgKQpAQCAtOTExMSw4ICs5MDMzLDggQEAKICAgICAqIFJlYWQgdGhlIG5leHQgdmlkZW8gQVUgaW4gdGhlIGlucHV0IGZpbGUgKi8KICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTID4gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTICkKICAgICB7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpICZwQy0+UmVhZGVyVmlkZW9BVSwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkgJnBDLT5SZWFkZXJWaWRlb0FVMiwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVSwKKyAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7CiAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCiAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCiAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKQEAgLTkxMzcsMTYgKzkwNTksMTYgQEAKICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwogICAgICAgICB9Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEsCisgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7CiAgICAgICAgIHZpZGVvQVVEdXJhdGlvbiA9IHBDLT5SZWFkZXJWaWRlb0FVMS5tX0NUUyAtIHBDLT5SZWFkZXJWaWRlb0FVMi5tX0NUUzsKICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMjsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkgJnBDLT5SZWFkZXJWaWRlb0FVLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSAmcEMtPlJlYWRlclZpZGVvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVLAorICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKICAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTIpOwpAQCAtOTE3MSw4ICs5MDkzLDggQEAKICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplOwogICAgICAgICB9Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5SZWFkZXJWaWRlb0FVMi5tX2RhdGFBZGRyZXNzLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIsCisgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMi5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fc2l6ZSk7CiAgICAgICAgIHZpZGVvQVVEdXJhdGlvbiA9IHBDLT5SZWFkZXJWaWRlb0FVMi5tX0NUUyAtIHBDLT5SZWFkZXJWaWRlb0FVMS5tX0NUUzsKICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMTsKQEAgLTkyMDgsMzMgKzkxMzAsNiBAQAogICAgICAgICAgICAgICAgIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9Ci0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgICAgICAvKiBJZiB3ZSBhcmUgaW4gdGltZXNjYWxlIG1vZGlmaWNhdGlvbiBtb2RlIG9yIGNsYXNzaWMgY29weSBtb2RlICovCi0KLSAgICAgICAgaWYoIHBDLT51aVZpZGVvVGltZXNjYWxlICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29weSB2aWRlbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgLy9NNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgLy8oTTRPU0FfTWVtQWRkcjgpcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemU7Ci0KLSAgICAgICAgICAgIC8qIENhbGwgaW50ZXJuYWwgZnVuY3Rpb24gdG8gY2hhbmdlIEFVIHRpbWVzY2FsZSAqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50Q2hhbmdlQVVWaWRlb1RpbWVzY2FsZShwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb252ZXJ0IENUUyB1bml0IGZyb20gbWlsbGlzZWNvbmRzIHRvIHRpbWVzY2FsZSAqLwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVGltZSkoKCggcEMtPlJlYWRlclZpZGVvQVUubV9DVFMgLSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMpCi0gICAgICAgICAgICAgICAgKiAocEMtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSAvIDEwMDAuMCkpKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0KLSNlbmRpZgotCi0gICAgICAgIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDb3B5IHZpZGVvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCiAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKQEAgLTkyNTEsMTAgKzkxNDYsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJwQy0+SDI2NE1DU1RlbXBCdWZmZXIiKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID09IE00T1NBX05VTEwgKQpAQCAtOTI3OCw4ICs5MTczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKIAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgNCksCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyArIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNCk7CiAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgLSA0OwogICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9CkBAIC05Mjg3LDggKzkxODIsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQy0+SDI2NE1DU1RlbXBCdWZmZXIgKyA0KSwKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQy0+SDI2NE1DU1RlbXBCdWZmZXIgKyA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplIC0gNCk7CiAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSAtIDQ7CiAgICAgICAgICAgICAgICAgICAgIFdyaXRlYnVmZmVyQWRkID0KQEAgLTkyOTgsOCArOTE5Myw4IEBACiAgICAgICAgICAgICAvKiBILjI2NCBUcmltbWluZyAqLwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSk7CiAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZTsKICAgICAgICAgICAgIH0KQEAgLTkzMTMsNyArOTIwOCw2IEBACiAKICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiB2aWRlbyBBVTogQ1RTPSVkIG1zIiwKICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMpOwotICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICogV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBmaWxlICovCkBAIC05MzMzLDEzICs5MjI3LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkoV3JpdGVidWZmZXJBZGQgLSA0KSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MpLCA0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KShXcml0ZWJ1ZmZlckFkZCAtIDQpLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciksIDQpOworICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKShXcml0ZWJ1ZmZlckFkZCAtIDQpLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQy0+SDI2NE1DU1RlbXBCdWZmZXIpLCA0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAvKiBILjI2NCBUcmltbWluZyAqLwogICAgIH0KQEAgLTk0MTAsNyArOTMwNCw3IEBACiAgICAgKiBDaGVjayBmb3IgZW5kIGN1dC4KICAgICAqIFdlIG11c3QgY2hlY2sgaGVyZSBpZiB0aGUgZW5kIGN1dCBpcyByZWFjaGVkLCBiZWNhdXNlIGluIHRoYXQgY2FzZSB3ZSBtdXN0CiAgICAgKiBjYWxsIHRoZSBsYXN0IGVuY29kZSBzdGVwICgtPiBiTGFzdEZyYW1lIHNldCB0byB0cnVlKSAqLwotICAgIGlmKCAoIHBDLT5kVmlEZWNDdXJyZW50Q3RzICsgcEMtPmRDdHNJbmNyZW1lbnQgKyAwLjUpID49IChwQy0+dWlFbmRDdXRUaW1lCisgICAgaWYoICggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCApID49IChwQy0+dWlFbmRDdXRUaW1lCiAgICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpICkKICAgICB7CiAgICAgICAgIEZyYW1lTW9kZSA9CkBAIC05NDgzLDggKzkzNzcsOCBAQAogICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwogICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKIAotICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mdHlwLAotICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfRnR5cEJveCksIDApOworICAgIG1lbXNldCgodm9pZCAqKSAmcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZnR5cCwKKyAgICAgICAgMCwgc2l6ZW9mKE00VklERU9FRElUSU5HX0Z0eXBCb3gpKTsKIAogICAgIC8qKgogICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCkBAIC0xMDUwMywyNSArMTAzOTcsMjUgQEAKIAogICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BEYXRhQWRkcmVzczEpOworICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczEpOwogICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wRGF0YUFkZHJlc3MyKTsKKyAgICAgICAgZnJlZShwQy0+bV9wRGF0YUFkZHJlc3MyKTsKICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIC8qQnVnIGZpeCAxMS8xMi8yMDA4ICh0byBvYnRhaW4gbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQpKi8KICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSk7CisgICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKTsKICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMik7CisgICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKTsKICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgLyoqLwpAQCAtMTA1NTksNyArMTA0NTMsNyBAQAogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKKyAgICAgICAgZnJlZShwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7CiAgICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTEwNjg2LDEzICsxMDU4MCwxOCBAQAogICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7CiAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlhTIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLSAgICAgICAgaWYgKE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU7CisgICAgICAgIGlmIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSkpIHsKKyAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQiKTsKKyAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLworICAgICAgICAgICAgTTRPU0FfRVJSX1NQTElUKGVyciwgdWlEdW1teSwgdWlDb3JlSWQsIHVpRHVtbXkpOworICAgICAgICAgICAgaWYgKE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0xMDkwMCw3MTEgKzEwNzk5LDMgQEAKICAgICByZXR1cm4gTTROT19FUlJPUjsKIH0KIAotCi1NNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhICkKLXsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqc2hlbGxJbnRlcmZhY2U7Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBuYXRpdmVUeXBlOwotICAgIE00REVDT0RFUl9FWFRFUk5BTF9Vc2VyRGF0YVR5cGUgc2hlbGxVc2VyRGF0YTsKLQotICAgIHN3aXRjaCggZGVjb2RlclR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZEX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICBjYXNlIE00VkRfa0gyNjNWaWRlb0RlYzoKLSAgICAgICAgICAgIG5hdGl2ZVR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZEX2tIMjY0VmlkZW9EZWM6Ci0gICAgICAgICAgICBuYXRpdmVUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXI6IHVua25vd24gZGVjb2RlclR5cGUgJWQiLAotICAgICAgICAgICAgICAgIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzaGVsbFVzZXJEYXRhID0KLSAgICAgICAgKE00REVDT0RFUl9FWFRFUk5BTF9Vc2VyRGF0YVR5cGUpTTRPU0FfbWFsbG9jKHNpemVvZigqc2hlbGxVc2VyRGF0YSksCi0gICAgICAgIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJ1c2VyRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBleHRlcm5hbCBzaGVsbCBkZWNvZGVyIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBzaGVsbFVzZXJEYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICBmYWlsZWQgdG8gYWxsb2NhdGUgdXNlckRhdGEgc3RydWN0dXJlIGZvciB0aGUgZXh0ZXJuYWwgc2hlbGwgZGVjb2RlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgc2hlbGxVc2VyRGF0YS0+ZXh0ZXJuYWxGdW5jcyA9IHBEZWNvZGVySW50ZXJmYWNlOwotICAgIHNoZWxsVXNlckRhdGEtPmV4dGVybmFsVXNlckRhdGEgPSBwVXNlckRhdGE7Ci0KLSAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfZ2V0SW50ZXJmYWNlKCZzaGVsbEludGVyZmFjZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9nZXRJbnRlcmZhY2UgZmFpbGVkIHdpdGggZXJyb3IgMHglMDhYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilzaGVsbFVzZXJEYXRhKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcihwQ29udGV4dCwgbmF0aXZlVHlwZSwgc2hlbGxJbnRlcmZhY2UpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAweCUwOFgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsSW50ZXJmYWNlKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsVXNlckRhdGEpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICggKE00TUNTX0ludGVybmFsQ29udGV4dAotICAgICAgICAqKXBDb250ZXh0KS0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtuYXRpdmVUeXBlXSA9IHNoZWxsVXNlckRhdGE7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLSNlbHNlCi0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLX0KLQotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kZXJUeXBlIGVuY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9JbnRlcmZhY2UgKnBFbmNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhICkKLXsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfRU5DT0RFUlMKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnNoZWxsSW50ZXJmYWNlOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgbmF0aXZlVHlwZTsKLQotICAgIHN3aXRjaCggZW5jb2RlclR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZFX2tIMjYzVmlkZW9FbmM6Ci0gICAgICAgICAgICBlcnIgPSBNNEVHRV9IMjYzX2dldEludGVyZmFjZXMoJm5hdGl2ZVR5cGUsICZzaGVsbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWRV9rTXBlZzRWaWRlb0VuYzoKLSAgICAgICAgICAgIGVyciA9IE00RUdFX01QRUc0X2dldEludGVyZmFjZXMoJm5hdGl2ZVR5cGUsICZzaGVsbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VkVfa0gyNjRWaWRlb0VuYzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyOiBIMjY0IGVuY29kZXIgdHlwZSBub3QgaW1wbGVtZW50ZWQgeWV0Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyOiB1bmtub3duIGVuY29kZXJUeXBlICVkIiwKLSAgICAgICAgICAgICAgICBlbmNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXI6IE00RUdFX2dldEludGVyZmFjZSBmYWlsZWQgd2l0aCBlcnJvciAweCUwOFgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlcihwQ29udGV4dCwgbmF0aXZlVHlwZSwgc2hlbGxJbnRlcmZhY2UpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciBmYWlsZWQgd2l0aCBlcnJvciAweCUwOFgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsSW50ZXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAoIChNNE1DU19JbnRlcm5hbENvbnRleHQKLSAgICAgICAgKilwQ29udGV4dCktPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW25hdGl2ZVR5cGVdCi0gICAgPSBwRW5jb2RlckludGVyZmFjZTsKLSAgICAoIChNNE1DU19JbnRlcm5hbENvbnRleHQKLSAgICAgICAgKilwQ29udGV4dCktPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW25hdGl2ZVR5cGVdID0gcFVzZXJEYXRhOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0jZW5kaWYKLQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckV4dGVybmFsQXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBleHRlcm5hbCBhdWRpbyBkZWNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBkZWNvZGVyVHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0IHRoZQotICogICAgICAgICAgICAgICAgZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRGVjb2RlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0RlY29kZXI6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRGVjb2RlcjogaW52YWxpZCBwb2ludGVyIG9uIGRlY29kZXIgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0RlY29kZXIoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZiggZGVjb2RlclR5cGUgPj0gTTRBRF9rVHlwZV9OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0RlY29kZXI6IEludmFsaWQgYXVkaW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbZGVjb2RlclR5cGVdID09IE00T1NBX1RSVUUKLSAgICAgICAgJiYgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRGVjb2RlcjogZXJyb3IgcGFyYW1ldGVyOiBhbiBleHRlcm5hbCBkZWNvZGVyIG9mIHR5cGVcCi0gICAgICAgICAgICAgICAgICVpIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICBkZWNvZGVyVHlwZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotICAgIHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbZGVjb2RlclR5cGVdID0KLSAgICAgICAgTTRPU0FfVFJVRTsgLyogZXh0ZXJuYWwgZGVjb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRW5jb2RlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgbWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZXh0ZXJuYWwgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQgdGhlCi0gKiAgICAgICAgICAgICBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRW5jb2RlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckV4dGVybmFsQXVkaW9FbmNvZGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwRW5jR2xvYmFsSW50ZXJmYWNlID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbEF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNQ1M6IE00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgXAotICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0VuY29kZXIoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZiggTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckV4dGVybmFsQXVkaW9FbmNvZGVyKCk6IEludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID09IE00T1NBX1RSVUUKLSAgICAgICAgJiYgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxBdWRpb0VuY29kZXI6IGVycm9yIHBhcmFtZXRlcjpcCi0gICAgICAgICAgICAgYW4gZXh0ZXJuYWwgZW5jb2RlciBvZiB0eXBlICVpIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICBNZWRpYVR5cGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICogU2F2ZSBlbmNvZGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IHBFbmNHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW01lZGlhVHlwZV0gPSBNNE9TQV9UUlVFOyAvKiBleHRlcm5hbCBlbmNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXhpZkluZm8oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgUmV0cmlldmUgdGhlIEVYSUYgdGFncyBpbmZvcm1hdGlvbnMgZnJvbSBhIFN0aWxsIHBpY3R1cmUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhbmQgZmlsbCBhIEV4aWYgdGFnIHN0cnVjdAotICogICAgICAgICAgICBleGlmVGFncyBzdHJ1Y3R1cmUgbXVzdCBiZSBhbGxvY2F0ZWQvZGVhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgZXhpZlRhZ3MgbWVtYmVycyB3aWxsIHBvaW50IHRvIGludGVybmFsIFNQRSBpbmZvcm1hdGlvbiwgdXNlciBzaG91bGQgbm90IHRyeQotICogICAgICAgICAgICAgdG8gbW9kaWZ5IG9yIGRlYWxsb2NhdGUgdGhlbQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXhpZkluZm8oIE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0V4aWZJbmZvcyAqZXhpZlRhZ3MgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2dldEV4aWZJbmZvIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19nZXRFeGlmSW5mbzogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRFeGlmSW5mbyhwQywgZXhpZlRhZ3MpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyRXh0ZW5kZWQoTTRNQ1NfQ29udGV4dCAgICBjb250ZXh0LAotTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgZGVjb2RlclR5cGUsCi1NNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgICAgKnBEZWNvZGVySW50ZXJmYWNlLAotTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBkZWNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICAgcmVxdWlyZW1lbnQgb2YgT01YIGNvZGVjIGltcGxlbWVudGF0aW9uLgotU28gd2UgdXNlIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSBpbnN0ZWFkIG9mIE00VkRfSW50ZXJmYWNlLgotICogQHBhcmFtICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBUeXBlIG9mIGRlY29kZXIgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgcFZpZERlY29kZXJJbnRlcmZhY2UgIChJTikgRGVjb2RlciBpbnRlcmZhY2Ugb2YgdHlwZSAnTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlJwotICogQHBhcmFtICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgZGVjb2RlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlckV4dGVuZGVkKCBNNE1DU19Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcFZpZERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwVXNlckRhdGEgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgbmF0aXZlVHlwZTsKLSAgICBNNERFQ09ERVJfRVhURVJOQUxfVXNlckRhdGFUeXBlIHNoZWxsVXNlckRhdGE7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSA9Ci0gICAgICAgIChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKilwVmlkRGVjb2RlckludGVyZmFjZTsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfQm9vbCBiUmVzZXRDdXJyZW50VmlkZW9EZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgPSBNNERBX1N0cmVhbVR5cGVVbmtub3duOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlckV4dGVuZGVkIGludm9rZWQgd2l0aCBjb250ZXh0ID0gMHgleCIsCi0gICAgICAgIGNvbnRleHQpOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VkRfa01wZWc0VmlkZW9EZWM6Ci0gICAgICAgIGNhc2UgTTRWRF9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgbmF0aXZlVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQ7Ci0gICAgICAgICAgICBtZWRpYVR5cGUgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZEX2tIMjY0VmlkZW9EZWM6Ci0gICAgICAgICAgICBuYXRpdmVUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBtZWRpYVR5cGUgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlckV4dGVuZGVkOiB1bmtub3duIGRlY29kZXJUeXBlICVkIiwKLSAgICAgICAgICAgICAgICBkZWNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BWaWRlb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXJFeHRlbmRlZDogcEMtPm1fcFZpZGVvRGVjb2RlciBhbHJlYWR5IHNldCB0byBcCi0gICAgICAgICAgICBwcmV2aW91cyByZWdpc3RlcmVkIGRlYyBzaGVsbCIpOwotCi0gICAgICAgIGlmKCAoICggKCBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MykKLSAgICAgICAgICAgIHx8IChwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQpKQotICAgICAgICAgICAgJiYgKG1lZGlhVHlwZSA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0KSkKLSAgICAgICAgICAgIHx8ICgoIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YykKLSAgICAgICAgICAgICYmIChtZWRpYVR5cGUgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YykpICkKLSAgICAgICAgICAgIGJSZXNldEN1cnJlbnRWaWRlb0RlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKGNvbnRleHQsIG5hdGl2ZVR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotICAgIC8qKiBQcm92aWRlIHRoZSBhcHBsaWNhdGlvbiB1c2VyIGRhdGEgYmFjayB0byB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gKioKLSAgICAqIEZvciBub3cgd2UgZG9ub3QgcHJvdmlkZSAnTTRERUNPREVSX0VYVEVSTkFMX1VzZXJEYXRhVHlwZScgKiovCi0gICAgKCAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0Ci0gICAgICAgICopY29udGV4dCktPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbbmF0aXZlVHlwZV0gPSBwVXNlckRhdGE7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SID09IGVycikgJiYgKE00T1NBX1RSVUUgPT0gYlJlc2V0Q3VycmVudFZpZGVvRGVjb2RlcikgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2Rlcihjb250ZXh0LCBtZWRpYVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlckV4dGVuZGVkOiBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyIHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlckV4dGVuZGVkIHJldHVybmluZyB3aXRoIGVycm9yICA9IDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyRXh0ZW5kZWQoKQotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBWaWRlbyBlbmNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIGVuY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICAgICAgIHJlcXVpcmVtZW50IG9mIE9NWCBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KLVNvIHdlIHVzZSBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIGluc3RlYWQgb2YgTTRWRV9JbnRlcmZhY2UuCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gIGVuY29kZXJUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgZW5jb2RlciAoTVBFRzQgLi4uKQotICogQHBhcmFtICBwRW5jb2RlckludGVyZmFjZSAgKElOKSBFbmNvZGVyIGludGVyZmFjZSBvZiB0eXBlICdNNEVOQ09ERVJfVmlkZW9JbnRlcmZhY2UnCi0gKiBAcGFyYW0gIHBVc2VyRGF0YSAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gYSB1c2VyIGRhdGEgdG8gZ2l2ZSB0byBleHRlcm5hbCBlbmNvZGVyCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyRXh0ZW5kZWQoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kZXJUeXBlIGVuY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwRW5jb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCBuYXRpdmVUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNTaGVsbEludGVyZmFjZSA9Ci0gICAgICAgIChNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICopcEVuY29kZXJJbnRlcmZhY2U7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9Cb29sIGJSZXNldEN1cnJlbnRWaWRlb0VuY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCBtZWRpYVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlckV4dGVuZGVkIGludm9rZWQgd2l0aCBjb250ZXh0ID0gMHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIHN3aXRjaCggZW5jb2RlclR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZFX2tNcGVnNFZpZGVvRW5jOgotICAgICAgICAgICAgbmF0aXZlVHlwZSA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBtZWRpYVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VkVfa0gyNjNWaWRlb0VuYzoKLSAgICAgICAgICAgIG5hdGl2ZVR5cGUgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICBtZWRpYVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWRV9rSDI2NFZpZGVvRW5jOgotICAgICAgICAgICAgbmF0aXZlVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIG1lZGlhVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlckV4dGVuZGVkOiB1bmtub3duIGVuY29kZXJUeXBlICVkIiwKLSAgICAgICAgICAgICAgICBlbmNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlckV4dGVuZGVkOlwKLSAgICAgICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzIGFscmVhZHkgc2V0IHRvIHByZXZpb3VzIHJlZ2lzdGVyZWQgRW5jIHNoZWxsIik7Ci0KLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IG5hdGl2ZVR5cGUgKQotICAgICAgICAgICAgYlJlc2V0Q3VycmVudFZpZGVvRW5jb2RlciA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIocENvbnRleHQsIG5hdGl2ZVR5cGUsIHBFbmNTaGVsbEludGVyZmFjZSk7Ci0KLSAgICAoIChNNE1DU19JbnRlcm5hbENvbnRleHQKLSAgICAgICAgKilwQ29udGV4dCktPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW25hdGl2ZVR5cGVdCi0gICAgPSBwRW5jb2RlckludGVyZmFjZTsKLSAgICAoIChNNE1DU19JbnRlcm5hbENvbnRleHQKLSAgICAgICAgKilwQ29udGV4dCktPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW25hdGl2ZVR5cGVdID0gcFVzZXJEYXRhOwotCi0gICAgaWYoICggTTROT19FUlJPUiA9PSBlcnIpICYmIChNNE9TQV9UUlVFID09IGJSZXNldEN1cnJlbnRWaWRlb0VuY29kZXIpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsIG1lZGlhVHlwZSk7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyRXh0ZW5kZWQ6IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgIk00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyRXh0ZW5kZWQgcmV0dXJuaW5nIHdpdGggZXJyb3IgID0gMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXJFeHRlbmRlZChNNE1DU19Db250ZXh0IHBDb250ZXh0LAotTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlLAotTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICAgICpwRW5jb2RlckludGVyZmFjZSwKLU00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci0gKiBAYnJpZWYgICAgUmVnaXN0ZXJzIGFuIGV4dGVybmFsIEF1ZGlvIEVuY29kZXIKLSAqIEBub3RlIFRoaXMgaXMgbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlciB0byBjb3BlIHVwIHdpdGggc3BlY2lmaWMKLSAqICAgICAgICByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gIGVuY29kZXJUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgZW5jb2RlcgotICogQHBhcmFtICBwRW5jb2RlckludGVyZmFjZSAgKElOKSBFbmNvZGVyIGludGVyZmFjZSB0byBPTVggc2hlbGwgZnVuY3Rpb24KLSAqIEBwYXJhbSAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGVuY29kZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWCBDb3JlIENvbnRleHQpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyRXh0ZW5kZWQoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0Jvb2wgYlJlc2V0Q3VycmVudEF1ZGlvRW5jb2RlciA9IE00T1NBX0ZBTFNFOwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0KLSAgICBzd2l0Y2goIGVuY29kZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgIG1lZGlhVHlwZSA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICAgICAgbWVkaWFUeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX01QMzoKLSAgICAgICAgICAgIG1lZGlhVHlwZSA9IE00VklERU9FRElUSU5HX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyRXh0ZW5kZWQ6IHVua25vd24gZW5jb2RlclR5cGUgJWQiLAotICAgICAgICAgICAgICAgIGVuY29kZXJUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyRXh0ZW5kZWQ6IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyBhbHJlYWR5IHNldCB0byBcCi0gICAgICAgICAgICAgICAgcHJldmlvdXMgcmVnaXN0ZXJlZCBFbmMgc2hlbGwiKTsKLQotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBlbmNvZGVyVHlwZSApCi0gICAgICAgICAgICBiUmVzZXRDdXJyZW50QXVkaW9FbmNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcihwQ29udGV4dCwgZW5jb2RlclR5cGUsIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlckV4dGVuZGVkOiBcCi0gICAgICAgICAgICAgICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIgZmFpbGVkIHdpdGggZXJyb3IgMHglMDhYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwRW5jb2RlckludGVyZmFjZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKCAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0Ci0gICAgICAgICopcENvbnRleHQpLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXSA9IHBFbmNvZGVySW50ZXJmYWNlOwotICAgICggKE00TUNTX0ludGVybmFsQ29udGV4dAotICAgICAgICAqKXBDb250ZXh0KS0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdID0gcFVzZXJEYXRhOwotCi0gICAgaWYoICggTTROT19FUlJPUiA9PSBlcnIpICYmIChNNE9TQV9UUlVFID09IGJSZXNldEN1cnJlbnRBdWRpb0VuY29kZXIpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsIG1lZGlhVHlwZSk7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyRXh0ZW5kZWQ6IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlckV4dGVuZGVkKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi1NNEFEX1R5cGUgZGVjb2RlclR5cGUsCi1NNEFEX0ludGVyZmFjZSAgICAqcERlY29kZXJJbnRlcmZhY2UsCi1NNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotICogQGJyaWVmICAgIFJlZ2lzdGVycyBhbiBleHRlcm5hbCBBdWRpbyBEZWNvZGVyCi0gKiBAbm90ZSBUaGlzIGlzIG11Y2ggZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIGF1ZGlvIGRlY29kZXIgdG8gY29wZSB1cCB3aXRoIHNwZWNpZmljCi0gKiAgICAgICAgICAgICByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gIGRlY29kZXJUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgZGVjb2RlcgotICogQHBhcmFtICBwRGVjb2RlckludGVyZmFjZSAgKElOKSBEZWNvZGVyIGludGVyZmFjZSB0byBPTVggc2hlbGwgZnVuY3Rpb24KLSAqIEBwYXJhbSAgcFVzZXJEYXRhICAgICAgICAgIChJTikgUG9pbnRlciBvbiBhIHVzZXIgZGF0YSB0byBnaXZlIHRvIGV4dGVybmFsIGRlY29kZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YIENvcmUgQ29udGV4dCkKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXJFeHRlbmRlZCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9Cb29sIGJSZXNldEN1cnJlbnRBdWRpb0RlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSA9IE00REFfU3RyZWFtVHlwZVVua25vd247Ci0KLSAgICBzd2l0Y2goIGRlY29kZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFNUk5COgotICAgICAgICAgICAgbWVkaWFUeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgbWVkaWFUeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICBtZWRpYVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXJFeHRlbmRlZDogdW5rbm93biBkZWNvZGVyIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlckV4dGVuZGVkOlwKLSAgICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlciBhbHJlYWR5IHNldCB0byBwcmV2aW91cyByZWdpc3RlcmVkIERlYyBzaGVsbCIpOwotCi0gICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IG1lZGlhVHlwZSApCi0gICAgICAgICAgICBiUmVzZXRDdXJyZW50QXVkaW9EZWNvZGVyID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKiBBdWRpbyBkZWNvZGVyIG1heSBiZSBjcmVhdGVkIGZvciBnZXR0aW5nIGlucHV0IENsaXAgcHJvcGVydGllcy4KLSAgICAgICAgIEluIHRoYXQgY2FzZSwgcHJldmlvdXMgYXVkaW8gZGVjIGNvbnRleHQgbmVlZHMgdG8gYmUgZGVzdHJveWVkKgotICAgICAgICAqIGJlZm9yZSByZWdpc3RlcmluZyBuZXcgZGVjb2RlciBzaGVsbCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgICAgICBwQy0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlckV4dGVuZGVkOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIocENvbnRleHQsIGRlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXJFeHRlbmRlZDpcCi0gICAgICAgICAgICAgICAgIE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyIGZhaWxlZCB3aXRoIGVycm9yIDB4JTA4WCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcERlY29kZXJJbnRlcmZhY2UpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICggKE00TUNTX0ludGVybmFsQ29udGV4dAotICAgICAgICAqKXBDb250ZXh0KS0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICAoIChNNE1DU19JbnRlcm5hbENvbnRleHQKLSAgICAgICAgKilwQ29udGV4dCktPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gcFVzZXJEYXRhOwotCi0gICAgKCAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopcENvbnRleHQpLT5iRXh0T01YQXVkRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SID09IGVycikgJiYgKE00T1NBX1RSVUUgPT0gYlJlc2V0Q3VycmVudEF1ZGlvRGVjb2RlcikgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihwQ29udGV4dCwgbWVkaWFUeXBlKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXJFeHRlbmRlZDogTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlciByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19CaXRzdHJlYW1QYXJzZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0JpdHN0cmVhbVBhcnNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODJlNDc2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0JpdHN0cmVhbVBhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX1BhcnNpbmcuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24gKFZpZGVvIENvbXByZXNzb3IgU2VydmljZSkKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFZPTCBwYXJzaW5nIGFuZCB0aW1lc2NhbGUgJ29uIHRoZSBmbHknIG1vZGlmaWNhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotCi0KLSNpZmRlZiBUSU1FU0NBTEVfQlVHCi0KLS8qdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2J5dGU7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9pbmRleDsKLSAgICBNNE9TQV9NZW1BZGRyOCBpbjsKLQotfSBNNE1DU19CaXRzdHJlYW1fY3R4dDsqLwotdHlwZWRlZiBNNFZTX0JpdHN0cmVhbV9jdHh0IE00TUNTX0JpdHN0cmVhbV9jdHh0OwotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCApCi0gKiBAYnJpZWYKLSAqIEByZXR1cm4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KChNNFZTX0JpdHN0cmVhbV9jdHh0KikgcGFyc2luZ0N0eHQsIG5iX2JpdHMpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19Xcml0ZUJpdHNUb01lbW9yeSggKQotICogQGJyaWVmCi0gKiBAcmV0dXJuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19Xcml0ZUJpdHNUb01lbW9yeSggICBNNE9TQV9VSW50MzIgYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJfYml0cykKLXsKLSAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBuYl9iaXRzKSk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KCApCi0gKiBAYnJpZWYKLSAqIEByZXR1cm4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeSggICBNNE9TQV9VSW50OCBCeXRlc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRlc3RfYnl0ZXMpCi17Ci0gICAgTTRPU0FfTWVtQWRkcjggYWRkciA9IGRlc3RfYnl0ZXM7Ci0KLSAgICAqYWRkciA9IEJ5dGVzVG9Xcml0ZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRNQ1NfaW50Q2hlY2tJbmRleCggKQotICogQGJyaWVmIDoKLSAqIEBub3RlIDogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB3cml0ZSB1bnRpbCAxNSBiaXRzIC4uLgotICogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIGJpdHMgb2Zmc2V0LCBpdCBpbmNyZWFzZXMgb3Igbm90IHRoZSA4IGJpdHMgcG9pbnRlci4KLSAqICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgaWYgbW9yZSB0aGFuIDggYml0cyBoYXZlIHRvIGJlIHdyaXR0ZW4gbm90IGNvbnNlcXVlbnRseS4KLSAqIEByZXR1cm4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRNQ1NfaW50Q2hlY2tJbmRleCggIE00T1NBX1VJbnQ4ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCogaW4pCi17Ci0gICAgTTRPU0FfVUludDMyIG9mZnNldCA9IGE7Ci0KLSAgICBpZihvZmZzZXQgPiA4ICYmIG9mZnNldCA8PTE2KQotICAgIHsKLSAgICAgICAgb2Zmc2V0LT04OwotICAgICAgICAoKmluKSsrOwotICAgIH0KLSAgICBpZigoKmluZGV4K29mZnNldCkgPj0gOCkKLSAgICB7Ci0gICAgICAgICppbmRleCA9ICgqaW5kZXgrb2Zmc2V0KS04OwotICAgICAgICAoKmluKSsrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqaW5kZXggKz0gb2Zmc2V0OwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UGFyc2VWaWRlb0RTSSggKQotICogQGJyaWVmIDogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHZpZGVvIERTSSBhbmQgY2hhbmdlcyB3cml0ZXIgdm9wIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24KLSAqIEBub3RlICA6ICBJdCBhbHNvIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBiaXRzIG9uIHdoaWNoIHRoZSB2b3BfdGltZV9pbmNyZW1lbnQgaXMgY29kZWQgaW4KLSAqICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtCi0gKiBAcmV0dXJuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRQYXJzZVZpZGVvRFNJKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi17Ci0gICAgTTRNQ1NfQml0c3RyZWFtX2N0eHQgcGFyc2luZ0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydCwgaW47Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50MzIgdGltZV9pbmNyX2xlbmd0aCwgbmV3X3RpbWVfaW5jcl9sZW5ndGg7Ci0gICAgTTRPU0FfVUludDggdm9sX3ZlcmlkPTAsIGJfaGllcmFyY2h5X3R5cGU7Ci0KLSAgICAvKiBGaWxsIGRlZmF1bHQgdmFsdWVzICovCi0gICAgcEMtPnZvbFBhcnNpbmcudmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gMDsKLSAgICBwQy0+dm9sUGFyc2luZy5zcHJpdGVfZW5hYmxlID0gMDsKLSAgICBwQy0+dm9sUGFyc2luZy5yZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IDA7Ci0gICAgcEMtPnZvbFBhcnNpbmcuc2NhbGFiaWxpdHkgPSAwOwotICAgIHBDLT52b2xQYXJzaW5nLmVuaGFuY2VtZW50X3R5cGUgPSAwOwotICAgIHBDLT52b2xQYXJzaW5nLmNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMDsKLSAgICBwQy0+dm9sUGFyc2luZy5pbnRlcmxhY2VkID0gMDsKLSAgICBwQy0+dm9sUGFyc2luZy5zcHJpdGVfd2FycGluZ19wb2ludHMgPSAwOwotICAgIHBDLT52b2xQYXJzaW5nLnNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IDA7Ci0gICAgcEMtPnZvbFBhcnNpbmcucXVhbnRfcHJlY2lzaW9uID0gNTsKLQotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZjsKLQotICAgIHN0YXJ0ID0gcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZjsKLQotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0XAotICAgICAgICAgPCBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgIHsKLSAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZSBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoY29kZSA9PSAweEI1KSAvKiBWaXN1YWwgb2JqZWN0IHN0YXJ0IGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNyk7IC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKQotICAgICAgICAgICAgICAgICAgICB7IC8qIGZpbmQgdm9sIHN0YXJ0IGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBhY2Nlc3NpYmxlIHZvbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvIG9iamVjdCB0eXBlIGluZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvIG9iamVjdCBsYXllciB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCAoOCs4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZvbCBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaHJvbWEgZm9ybWF0ICsgbG93IGRlbGF5ICgzKzEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmJ2IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIGJpdHJhdGUgKyAyIG1hcmtlciBiaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgMSArIDE1ICsgMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIHZidiBidWZmZXIgc2l6ZSArIGZpcnN0IGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJ2IG9jY3VwYW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hcmtlciBiaXRzICgxNSsxKzMrMTErMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvIG9iamVjdCBsYXllciBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gc2F2ZSBpdCBmb3Igdm9wIHBhcnNpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT52b2xQYXJzaW5nLnZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHJldHVybiAwOyAvKiBvbmx5IHJlY3Rhbmd1bGFyIGNhc2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXB1dGVzIHRpbWUgaW5jcmVtZW50IGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaiAgICA9IGNvZGUgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCAzMikgJiYgKGogIT0gMCk7IGogPj49MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGltZSBpbmNyZW1lbnQgbGVuZ3RoIGFuZCBvcmlnaW5hbCB0aW1lc2NhbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aU9yaWdUaW1lc2NhbGVMZW5ndGggPSB0aW1lX2luY3JfbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpT3JpZ1ZpZGVvVGltZXNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBuZXcgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gcEMtPnVpVmlkZW9UaW1lc2NhbGUgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCAzMikgJiYgKGogIT0gMCk7IGogPj49MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgbmV3IHRpbWUgaW5jcmVtZW50IGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpVGltZXNjYWxlTGVuZ3RoID0gdGltZV9pbmNyX2xlbmd0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgbmV3IFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiA9IHBhcnNpbmdDdHh0LmluIC0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiA9IHBhcnNpbmdDdHh0LmluIC0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KHBDLT51aVZpZGVvVGltZXNjYWxlLCBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXgsIDE2ICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIEZpeGVkIFZPUCByYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMSkgLyogMSA9IEJpbmFyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAwKSAvKiAwID0gcmVjdGFuZ3VsYXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5pbnRlcmxhY2VkID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIE9CTUMgZGlzYWJsZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2b2xfdmVyaWQgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnZvbFBhcnNpbmcuc3ByaXRlX2VuYWJsZSA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMik7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT52b2xQYXJzaW5nLnNwcml0ZV9lbmFibGUgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+dm9sUGFyc2luZy5zcHJpdGVfZW5hYmxlID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT52b2xQYXJzaW5nLnNwcml0ZV9lbmFibGUgPT0gMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ByaXRlIHN0YXRpYyA9IDEgYW5kIFNwcml0ZSBHTUMgPSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT52b2xQYXJzaW5nLnNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwcml0ZSB3aWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ByaXRlIGhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ByaXRlIGwgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ByaXRlIHRvcCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcHJpdGUgd2FycGluZyBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5zcHJpdGVfd2FycGluZ19wb2ludHMgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwcml0ZSB3YXJwaW5nIGFjY3VyYWN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5zcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dm9sUGFyc2luZy5zcHJpdGVfZW5hYmxlICE9IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3cgbGF0ZW5jeSBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmIChwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgLyogcXVhbnQgcHJlY2lzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5xdWFudF9wcmVjaXNpb24gPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JleXNjYWxlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vZ3JheSBxdWFudCB1cGRhdGUgKyBjb21wb3NpdGlvbiBtZXRob2QgKyBsaW5lYXIgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YXJ0ZXIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wbGV4aXR5IGVzdGltYXRpb24gZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5jb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7LyogcmVzeW5jIG1hcmtlciBkaXNhYmxlKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIG5ld3ByZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgcmVzb2x1dGlvbiB2b3AgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnZvbFBhcnNpbmcucmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT52b2xQYXJzaW5nLnNjYWxhYmlsaXR5ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2hpZXJhcmNoeV90eXBlID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIHJlZiBsYXllciBpZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVmIHNhbXBsaW5nIGRpcmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuaGFuY2VtZW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5lbmhhbmNlbWVudF90eXBlID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnZvbFBhcnNpbmcudmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGFuZ2VBVVZpZGVvVGltZXNjYWxlKCApCi0gKiBAYnJpZWYKLSAqIEByZXR1cm4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoYW5nZUFVVmlkZW9UaW1lc2NhbGUoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLXsKLSAgICBNNE1DU19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZTsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydCwgaW47Ci0gICAgTTRPU0FfTWVtQWRkcjMyIGluX3RlbXA7Ci0gICAgTTRPU0FfVUludDggaSwgaW5faW5kZXg9MDsgLyogaW5faW5kZXggaXMgdGhlIGJpdCBpbmRleCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyIG5ld190aW1lX2luY3I7Ci0gICAgTTRPU0FfSW50MzIgZGlmZl90aW1lc2NhbGU9IDAgOwotICAgIE00T1NBX1VJbnQzMiBzdHVmZmluZ19ieXRlPTA7Ci0gICAgTTRPU0FfVUludDggdm9wQ29kaW5nVHlwZSwgdm9wX2Zjb2RlX2ZvcndhcmQsIHZvcF9mY29kZV9iYWNrd2FyZCwgbmJfemVyb3M7Ci0KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3M7Ci0KLSAgICBzdGFydCA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgaW4gPSBwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzczsKLQotICAgIE00T1NBX21lbXNldChpbiwgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplICwgMCk7Ci0gICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgMCwgOCk7Ci0gICAgaW4rKzsKLSAgICBpZiAoY29kZSA9PSAwKQotICAgIHsKLSAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIDAsIDgpOwotICAgICAgICBpbisrOwotICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIDAsIDgpOwotICAgICAgICAgICAgaW4rKzsKLSAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZSBmb3VuZCAqLwotICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIDAsIDgpOwotICAgICAgICAgICAgICAgIGluKys7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMHhCNikKLSAgICAgICAgICAgICAgICB7IC8qIGZpbmQgdm9wIHN0YXJ0IGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMik7IC8qIFZPUCBjb2RpbmcgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgMik7Ci0gICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDIsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgdm9wQ29kaW5nVHlwZSA9IGNvZGU7IC8qIFNhdmUgaXQgYmVmb3JlIG5lZWRlZCBmdXJ0aGVyIGluIHBhcnNpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIE1vZHVsbyB0aW1lIGJhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoY29kZSAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aU9yaWdUaW1lc2NhbGVMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAvKiBWT1AgdGltZSBpbmNyZW1lbnQgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGVzIG5ldyB0aW1lIGluY3JlbWVudCBhbmQgd3JpdGUgaXQgdG8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgbmV3X3RpbWVfaW5jciA9IChwQy0+dWlWaWRlb1RpbWVzY2FsZSAqIGNvZGUpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aU9yaWdWaWRlb1RpbWVzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkobmV3X3RpbWVfaW5jciwgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgcEMtPnVpVGltZXNjYWxlTGVuZ3RoICk7Ci0gICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LHBDLT51aVRpbWVzY2FsZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVk9QIG5vdCBjb2RlZCAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOyAvKiBWT1Agbm90IGNvZGVkIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhazsgLyogVE9ETyAhISEgLT4gR290byBzdHVmZmluZyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIG5ld3ByZWQgaWdub3JlZCAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKChwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b3BDb2RpbmdUeXBlID09IDEgfHwgdm9wQ29kaW5nVHlwZSA9PSAzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5zcHJpdGVfZW5hYmxlID09IDIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogVk9QIHJvdW5kaW5nIHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihwQy0+dm9sUGFyc2luZy5yZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnZvbFBhcnNpbmcudmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b3BDb2RpbmdUeXBlID09IDAgfHwgdm9wQ29kaW5nVHlwZSA9PSAxKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVk9QIHJlZHVjZWQgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMSwmaW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPnZvbFBhcnNpbmcudmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnNwcml0ZV9lbmFibGUgPT0gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcENvZGluZ1R5cGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxMyk7IC8qIFZPUCB3aWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMTMsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMTMpOyAvKiBWT1AgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxMywmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOyAvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDEsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxMyk7IC8qIFZPUCBob3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYyBzcGF0aWFsIHJlZiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMTMsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMTMpOyAvKiBWT1AgdmVydGljYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jIHNwYXRpYWwgcmVmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxMywmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOyAvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDEsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnZvbFBhcnNpbmcuc2NhbGFiaWxpdHkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5lbmhhbmNlbWVudF90eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhY2tncm91bmQgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2UgY29udiByYXRpbyBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMSwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIFZPUCBjb25zdGFudCBhbHBoYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMSwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWT1AgY29uc3RhbnQgYWxwaGEgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCw4LCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXBDLT52b2xQYXJzaW5nLmNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7IC8qIGludHJhIGRjIHZsYyB0aHIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDMsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLmludGVybGFjZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIHRvcCBmaWVsZCBmaXJzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIGFsdGVybmF0ZSB2ZXJ0aWNhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuIGZsYWcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLCBpbl9pbmRleCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsMSwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoKHBDLT52b2xQYXJzaW5nLnNwcml0ZV9lbmFibGUgPT0gMSB8fCBwQy0+dm9sUGFyc2luZy5zcHJpdGVfZW5hYmxlID09IDIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB2b3BDb2RpbmdUeXBlID09IDMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnNwcml0ZV93YXJwaW5nX3BvaW50cyA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnZvbFBhcnNpbmcuc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEMtPnZvbFBhcnNpbmcuc3ByaXRlX2VuYWJsZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihwQy0+dm9sUGFyc2luZy52aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dm9sUGFyc2luZy5xdWFudF9wcmVjaXNpb24pOyAvKiB2b3BfcXVhbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT52b2xQYXJzaW5nLnF1YW50X3ByZWNpc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCxwQy0+dm9sUGFyc2luZy5xdWFudF9wcmVjaXNpb24sJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDLT52b2xQYXJzaW5nLnZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2b3BDb2RpbmdUeXBlICE9IDApIC8qIFAtVk9QIG9yIFMtVk9QIG9yIEItVk9QIGNhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzKTsgLyogdm9wIGZjb2RlIGZvcndhcmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwzLCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9wX2Zjb2RlX2ZvcndhcmQgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9wQ29kaW5nVHlwZSA9PSAyKSAvKiBCLVZPUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDMpOyAvKiB2b3AgZmNvZGUgZm9yd2FyZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDMsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3BfZmNvZGVfYmFja3dhcmQgPSBjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2lmIDEKLSAgICAgICAgICAgICAgICAgICAgLyogQWxpZ24gb24gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4LShwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluX2luZGV4LCA4LShwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsOC0ocGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4KSwmaW4pOwotCi0gICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3plcm9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHZvcENvZGluZ1R5cGUgPT0gMSB8fCB2b3BDb2RpbmdUeXBlID09IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2b3BfZmNvZGVfZm9yd2FyZCA+IDEpIC8qIFAtVk9QIG9yIFMtVk9QIGNhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3BfZmNvZGVfZm9yd2FyZC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3plcm9zID0gdm9wX2Zjb2RlX2ZvcndhcmQtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHZvcENvZGluZ1R5cGUgPT0gMiAmJiAodm9wX2Zjb2RlX2ZvcndhcmQgPiAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3BfZmNvZGVfYmFja3dhcmQgPiAxKSkgLyogQi1WT1AgY2FzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2b3BfZmNvZGVfZm9yd2FyZCA+IHZvcF9mY29kZV9iYWNrd2FyZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigxNSt2b3BfZmNvZGVfZm9yd2FyZCA+IDE3KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcF9mY29kZV9mb3J3YXJkLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfemVyb3MgPSB2b3BfZmNvZGVfZm9yd2FyZC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKDE1K3ZvcF9mY29kZV9iYWNrd2FyZCA+IDE3KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcF9mY29kZV9iYWNrd2FyZC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3plcm9zID0gdm9wX2Zjb2RlX2JhY2t3YXJkLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00TUNTX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29kZSAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoMCwgKE00T1NBX01lbUFkZHIzMilpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2luZGV4LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsOCwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeSgwLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCw4LCZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDEsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFsaWduOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGFuZ2VWaWRlb1BhY2tldFZpZGVvVGltZXNjYWxlKHBDICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFsaWduOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogSS1WT1AgY2FzZSBvciBQLVZPUCBvciBTLVZPUCBjYXNlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3BfZmNvZGVfZm9yd2FyZCA9IDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCBuZXh0IGJpdCB0aGF0IG11c3QgYmUgb25lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvZGUgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlYWxpZ247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhbGlnbiBvbiBieXRlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSByZXN5bmMgbWFya2VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoMCwgKE00T1NBX01lbUFkZHIzMilpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5faW5kZXgsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDgsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeSgwLCAoTTRPU0FfTWVtQWRkcjMyKWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pbmRleCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsOCwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2luZGV4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCwxLCZpbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2UgdGltZXNjYWxlIGludG8gdmlkZW8gcGFja2V0IGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoYW5nZVZpZGVvUGFja2V0VmlkZW9UaW1lc2NhbGUocEMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KDAsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50Q2hlY2tJbmRleCgmaW5faW5kZXgsOCwmaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Xcml0ZUJ5dGVUb01lbW9yeShjb2RlLCAoTTRPU0FfTWVtQWRkcjMyKWluLCBpbl9pbmRleCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDgsJmluKTsKLXJlYWxpZ246Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWxpZ24gb24gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC0ocGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX1dyaXRlQnl0ZVRvTWVtb3J5KGNvZGUsIChNNE9TQV9NZW1BZGRyMzIpaW4sIGluX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC0ocGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDgtKHBhcnNpbmdDdHh0LnN0cmVhbV9pbmRleCksJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludENoZWNrSW5kZXgoJmluX2luZGV4LDgsJmluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZShwYXJzaW5nQ3R4dC5pbiAtIHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3NcCi0gICAgICAgICAgICAgICAgICAgICAgICA8IHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAvKiBBbGlnbiBvbiB3cml0ZSAqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRNQ1NfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4LWluX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoY29kZSwgKE00T1NBX01lbUFkZHIzMilpbiwgaW5faW5kZXgsIDgtaW5faW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRDaGVja0luZGV4KCZpbl9pbmRleCw4LWluX2luZGV4LCZpbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVhZCA4IGJpdHMgd29yZHMsIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBvdXRwdXQgQVUKLSAgICAgICAgICAgICAgICAgICAgKHdyaXRlIGlzIDggYml0cyBhbGlnbmVkKSAqLwotICAgICAgICAgICAgICAgICAgICBkaWZmX3RpbWVzY2FsZSA9IHBDLT51aU9yaWdUaW1lc2NhbGVMZW5ndGggLSBwQy0+dWlUaW1lc2NhbGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGRpZmZfdGltZXNjYWxlID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPD0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV3JpdGVieXRlVG9NZW1vcnkoY29kZSwgaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbiA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNE1DU19HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV3JpdGVieXRlVG9NZW1vcnkoY29kZSwgaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbiA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGluLS07Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHBhcnNpbmdDdHh0LnN0cmVhbV9pbmRleDtpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0dWZmaW5nX2J5dGUgPSBzdHVmZmluZ19ieXRlIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHVmZmluZ19ieXRlICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV3JpdGVCeXRlVG9NZW1vcnkoc3R1ZmZpbmdfYnl0ZSwgKE00T1NBX01lbUFkZHIzMilpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgtcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4LCBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gaW4gKyAxIC0gcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIC8vKmluIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2VuZGlmIC8qIFRJTUVTQ0FMRV9CVUcgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYwppbmRleCA5ZGZmYWFkLi5jYmZmNjZjIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAgICAgICAgIC8qIGNhbiBiZSBsZWdpdGltYXRlLCBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIG9uZSB2ZXJzaW9uIHRoYXQgY2FuIHVzZSBleHRlcm5hbCBlbmNvZGVycwogICAgICAgICBidXQgd2hpY2ggc3RpbGwgaGFzIHRoZSBidWlsdC1pbiBvbmUgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgYW4gZXh0ZXJuYWwgZW5jb2RlcjsgaW4KICAgICAgICAgdGhpcyBjYXNlIHRoZSBuZXcgZW5jb2RlciBzaW1wbHkgcmVwbGFjZXMgdGhlIG9sZCBvbmUgKGkuZS4gd2UgdW5yZWdpc3RlciBpdCBmaXJzdCkuICovCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKKyAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0yNjUsMTIgKzI2NSwxMiBAQAogCiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOworICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwogICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKIAogICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pOworICAgICAgICAgICAgZnJlZShwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSk7CiAgICAgICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNjYsMTIgKzM2NiwxMiBAQAogICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZGVjb2RlcnMKICAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGRlY29kZXI7IGluCiAgICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGRlY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKKyAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwogICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwogICAgICAgICAvKiBvaCwgYW5kIGRvbid0IGZvcmdldCB0aGUgdXNlciBkYXRhLCB0b28uICovCiAgICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CiAgICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAjZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwpAQCAtNDIwLDEyICs0MjAsMTIgQEAKIAogICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7CisgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKIAogICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CiAgICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtNDU1LDEyICs0NTUsMTIgQEAKICAgICB7CiAgICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICk7CisgICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgKTsKICAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyAhPSBNNE9TQV9OVUxMKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgKTsKKyAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgKTsKICAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5MSw3ICs0OTEsNyBAQAogICAgIHsKICAgICAgICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoIChNNE9TQV9NZW1BZGRyMzIpcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKKyAgICAgICAgICAgIGZyZWUocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKICAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTUwMyw3ICs1MDMsNyBAQAogICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwogICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKCAoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICk7CisgICAgICAgICAgICAgICAgZnJlZShwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CkBAIC01MzUsMTIgKzUzNSwxMiBAQAogICAgIHsKICAgICAgICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSApOworICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSApOwogICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSApOworICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gKTsKICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC01NzIsNyArNTcyLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKCAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICk7CiAgICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgICAgICAgIC8qRG9uJ3QgZnJlZSBleHRlcm5hbCBhdWRpbyBkZWNvZGVycyBpbnRlcmZhY2VzKi8KICAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKaW5kZXggZjlkZmZkYi4uMzZhZDlkOSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKQEAgLTkxLDE1ICs5MSwxMiBAQAogICAgICBpcyBibGFjayBib3JkZXJzICovCiAgICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCiAgICAgewotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQqcFBsYW5lT3V0WzBdLnVfc3RyaWRlKSwKLSAgICAgICAgICAgIFlfUExBTkVfQk9SREVSX1ZBTFVFKTsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSksCi0gICAgICAgICAgICBVX1BMQU5FX0JPUkRFUl9WQUxVRSk7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcFBsYW5lT3V0WzJdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpLAotICAgICAgICAgICAgVl9QTEFORV9CT1JERVJfVkFMVUUpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSkpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0KnBQbGFuZU91dFsyXS51X3N0cmlkZSkpOwogICAgIH0KICAgICBlbHNlIGlmICgoTTRPU0FfTlVMTCA9PSBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSB8fAogICAgICAgICAgICAgIChNNE9TQV9OVUxMID09IHBDLT5wVmlEZWNDdHh0KSkKQEAgLTEwNywxMiArMTA0LDEyIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQogICAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0LCAwKTsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0LCAwKTsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0LCAwKTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCisgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLDAsCisgICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCisgICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKIAogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGlzIE00T1NBX05VTEwsXAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIpOwpAQCAtMjAwLDcgKzE5Nyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCiAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXVwKKyAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMF1cCiAgICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQsIE00VlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyWSIpIDsKICAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQpAQCAtMjA5LDcgKzIwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBX21hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdXAorICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsxXVwKICAgICAgICAgICAgICAgICAgICAgICAgIC51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwgTTRWUywKICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJVIikgOwogICAgICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID09IE00T1NBX05VTEwpCkBAIC0yMTgsNyArMjE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfbWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl1cCisgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdXAogICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsKICAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQpAQCAtMjMxLDE1ICsyMjgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVVID0gcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA7CiAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwogCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgWV9QTEFORV9CT1JERVJfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVfUExBTkVfQk9SREVSX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBWX1BMQU5FX0JPUkRFUl9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aCkgPD0gcFBsYW5lT3V0LT51X2hlaWdodCkKQEAgLTM4OSwyNCArMzgzLDI0IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFswXS51X2hlaWdodDsgaSsrKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoICAgKE00T1NBX01lbUFkZHI4KXBPdXRQbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBJblBsYW5lWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBQbGFuZU91dFswXS51X3dpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KCAgIChNNE9TQV9NZW1BZGRyOClwT3V0UGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwSW5QbGFuZVUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVVLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzJdLnVfaGVpZ2h0OyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSggICAoTTRPU0FfTWVtQWRkcjgpcE91dFBsYW5lViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEluUGxhbmVWLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMl0udV93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKQEAgLTQxNiw3ICs0MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NDEsMTQgKzQzNSwxNCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzBdLnVfd2lkdGgpKTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMV0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMV0udV93aWR0aCkpOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBQbGFuZU91dFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFsyXS51X2hlaWdodCAqIHBQbGFuZU91dFsyXS51X3dpZHRoKSk7CiAgICAgICAgIHBDLT5sYXN0RGVjb2RlZFBsYW5lID0gcFBsYW5lT3V0OwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5tawppbmRleCA1N2M5NzBmLi40MWNkMTVkIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCkBAIC0zOCw5ICszOCw4IEBACiAgICAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMgXAogICAgICAgTTRWU1MzR1BQX0VkaXRWaWRlby5jIFwKICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRDaGFubmVsQ292ZXJ0ZXIuYyBcCisgICAgICBNNENoYW5uZWxDb252ZXJ0ZXIuYyBcCiAgICAgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIFwKLSAgICAgIE00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmMgXAogICAgICAgTTRBSVJfQVBJLmMgXAogICAgICAgTTRSRUFERVJfUGNtLmMgXAogICAgICAgTTRQQ01SX0NvcmVSZWFkZXIuYyBcCkBAIC04NSwxMSArODQsNSBAQAogICAgIC1ETTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRW5vIFwKICAgICAtRERFQ09ERV9HSUZfT05fU0FWSU5HCiAKLSMgRG9uJ3QgcHJlbGluayB0aGlzIGxpYnJhcnkuICBGb3IgbW9yZSBlZmZpY2llbnQgY29kZSwgeW91IG1heSB3YW50Ci0jIHRvIGFkZCB0aGlzIGxpYnJhcnkgdG8gdGhlIHByZWxpbmsgbWFwIGFuZCBzZXQgdGhpcyB0byB0cnVlLgotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKLQotCi0KIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMKaW5kZXggZmFhYzQzYi4uNTYyMDM1OCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jCkBAIC04Niw3ICs4Niw3IEBACiAgICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAogICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIHBvaW50ZXIgcFN0cmVhbUhhbmRsZXIiKTsKIAotICAgIHBDID0gKE00QURfTnVsbENvbnRleHQqKU00T1NBX21hbGxvYyhzaXplb2YoTTRBRF9OdWxsQ29udGV4dCksCisgICAgcEMgPSAoTTRBRF9OdWxsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFEX051bGxDb250ZXh0KSwKICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0FVRElPLCAoTTRPU0FfQ2hhciAqKSJNNEFEX051bGxDb250ZXh0Iik7CiAgICAgaWYgKHBDID09IChNNEFEX051bGxDb250ZXh0KikwKQogICAgIHsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgTTRPU0FfREVCVUdfSUYxKChjb250ZXh0ID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsICJNNEFEX05VTExfZGVzdHJveTogaW52YWxpZCBjb250ZXh0Iik7CiAKLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMpOworICAgIGZyZWUocEMpOwogCiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CkBAIC0xNzEsMTEgKzE3MSwxMSBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBNNE9TQV9tZW1jcHkocERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsIHBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwogICAgIH0KICNlbHNlIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotICAgIE00T1NBX21lbWNweShwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAorICAgIG1lbWNweSgodm9pZCAqKXBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzLCAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgKTsKICNlbmRpZiAvKk00QURfRk9SQ0VfMTZCSVRTKi8KIApAQCAtMjM0LDcgKzIzNCw3IEBACiAqLwogTTRPU0FfRVJSIE00QURfTlVMTF9nZXRJbnRlcmZhY2UoIE00QURfVHlwZSAqcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKQogewotICAgICpwRGVjb2RlckludGVyZmFjZSA9ICggIE00QURfSW50ZXJmYWNlKilNNE9TQV9tYWxsb2MoIHNpemVvZihNNEFEX0ludGVyZmFjZSksCisgICAgKnBEZWNvZGVySW50ZXJmYWNlID0gKCAgTTRBRF9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00QURfSW50ZXJmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfSW50ZXJmYWNlIiApOwogICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkKICAgICB7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYwppbmRleCA2YTM1NDZkLi5jYjQyM2UwIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBSVJfQVBJLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwogCiAgICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLAorICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLAogICAgICAgICAgTTRBSVIsKE00T1NBX0NoYXIgKikiQUlSIGludGVybmFsIGNvbnRleHQiKSA7CiAgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7CiAKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLwogICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMpIDsKKyAgICAgICAgZnJlZShwQykgOwogICAgIH0KIAogICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7CiAgICAgfQotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQykgOworICAgIGZyZWUocEMpIDsKIAogICAgIHJldHVybiBNNE5PX0VSUk9SIDsKIApAQCAtNTMxLDcgKzUzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXB1OF9kYXRhX291dCwgKE00T1NBX01lbUFkZHI4KXB1OF9kYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0W2ldLnVfd2lkdGgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jCmluZGV4IDE0ZjUyNzEuLmRiMjEwMGYgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKICAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSxNNEVSUl9QQVJBTUVURVIsIkZpbGUgRGVzYy4gTTRPU0FfTlVMTCIpOwogCi0gICAgTTRfVG9rZW4gPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9NZW1BZGRyMzIpKjMsIE00QU1SX1JFQURFUiwKKyAgICBNNF9Ub2tlbiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX01lbUFkZHIzMikqMywgTTRBTVJfUkVBREVSLAogICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSgiTTRfVG9rZW4iKSk7CiAgICAgaWYoTTRPU0FfTlVMTCA9PSBNNF9Ub2tlbikKICAgICB7CkBAIC0xODYsMTEgKzE4NiwxMSBAQAogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwogICAgIH0KIAotICAgIHBTdHJlYW1Db250ZXh0PSAoTTRfQU1SUl9Db250ZXh0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00X0FNUlJfQ29udGV4dCksIE00QU1SX1JFQURFUiwKKyAgICBwU3RyZWFtQ29udGV4dD0gKE00X0FNUlJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BTVJSX0NvbnRleHQpLCBNNEFNUl9SRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQiKSk7CiAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilNNF9Ub2tlbik7CisgICAgICAgIGZyZWUoTTRfVG9rZW4pOwogICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DIDsKICAgICB9CkBAIC0yMTEsOCArMjExLDggQEAKICAgICBpZiAoIGVyciAhPSBNNE5PX0VSUk9SICkKICAgICB7CiAgICAgICAgIC8qIE00T1NBX0RFQlVHX0lGMygoZXJyICE9IE00Tk9fRVJST1IpLGVyciwiRmlsZSBvcGVuIGZhaWxlZCIpOyAqLwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFN0cmVhbUNvbnRleHQpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpTTRfVG9rZW4pOw0KKyAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dCk7CisgICAgICAgIGZyZWUoTTRfVG9rZW4pOwogICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKICAgICAgICAgcmV0dXJuIGVyciA7CiAgICAgfQpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgLyogIE5vIFByb2ZpbGUgbGV2ZWwgZGVmaW5lZCAqLwogICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmVkOwogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKU00X1Rva2VuKTsKKyAgICBmcmVlKE00X1Rva2VuKTsKICAgICAqcENvbnRleHQgPSBwU3RyZWFtQ29udGV4dCA7CiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiAKQEAgLTI3Nyw4ICsyNzcsOCBAQAogICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+Y2xvc2VSZWFkKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKTsKICAgICB9CiAKLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpTTRfVG9rZW4pOwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwU3RyZWFtQ29udGV4dCk7CisgICAgZnJlZShNNF9Ub2tlbik7CisgICAgZnJlZShwU3RyZWFtQ29udGV4dCk7CiAKICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKIApAQCAtMzQ3LDEwICszNDcsMTAgQEAKIAogICAgIC8qIFRpbWVzY2FsZSBlcXVhbHMgU2FtcGxpbmcgRnJlcXVlbmN5OiBOQi04MDAwIEh6LCBXQi0xNjAwMCBIeiAqLwogICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICk/ODAwMDoxNjAwMDsKLSAgICBNNE9TQV9USU1FX1NFVF9VTktOT1dOKHBTdHJlYW1EZXNjLT5kdXJhdGlvbik7CisgICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwogCiAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIgPQotICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwKKyAgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksCiAgICAgICAgICAgICAgTTRBTVJfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIiKSk7CiAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKICAgICB7CkBAIC0zNjEsNyArMzYxLDcgQEAKICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+YXZlcmFnZUJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7CiAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMIDsKICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBNNE9TQV9USU1FX1NFVF9VTktOT1dOKHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbik7CisgICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwogICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+c3RyZWFtSUQgPSAxOwogICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1UeXBlID0gcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgOwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAgICAgewogICAgICAgICBzaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplIDsKICAgICAgICAgLyogZGF0YUFkZHJlc3MgaXMgb3duZWQgYnkgUGFyc2VyLCBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGRlbGV0ZSBvciBmcmVlIGl0ICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyA9KE00T1NBX01lbUFkZHIzMilNNE9TQV9tYWxsb2Moc2l6ZSArICg0IC0gc2l6ZSAlIDQpLAorICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPShNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUgKyAoNCAtIHNpemUgJSA0KSwKICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyIpKTsKICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCiAgICAgICAgIHsKQEAgLTU5NSw3ICs1OTUsNyBAQAogICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KICAgICBNNE9TQV9USU1FX1RPX01TKHRpbWVfZG91YmxlLCB0aW1lLCAxMDAwKTsKIAotICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIoKnBPYnRhaW5DVFMsIDApOworICAgICpwT2J0YWluQ1RTID0gMDsKIAogICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwogICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULApAQCAtNjExLDcgKzYxMSw3IEBACiAKICAgICAgICAgY291bnQgPSAwIDsKICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopTTRPU0FfbWFsbG9jKE00QU1SUl9OVU1fU0VFS19FTlRSSUVTICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCisgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00QU1SUl9OVU1fU0VFS19FTlRSSUVTICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCiAgICAgICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgiKSk7CiAKICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQpAQCAtNzQwLDExICs3NDAsMTEgQEAKIAogICAgIGlmICggcGFydFNlZWtUaW1lID09IDApCiAgICAgewotICAgICAgICBNNE9TQV9USU1FX1NFVCgqcE9idGFpbkNUUywgdGltZSk7CisgICAgICAgICpwT2J0YWluQ1RTID0gdGltZTsKICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiAgICAgfQogCi0gICAgTTRPU0FfSU5UNjRfRlJPTV9ET1VCTEUoKnBPYnRhaW5DVFMsICh0aW1lX2RvdWJsZSAtIChNNE9TQV9Eb3VibGUpcGFydFNlZWtUaW1lKSkgOworICAgICpwT2J0YWluQ1RTID0gKE00T1NBX1RpbWUpKHRpbWVfZG91YmxlIC0gKE00T1NBX0RvdWJsZSlwYXJ0U2Vla1RpbWUpOwogCiAgICAgc3dpdGNoKHNlZWtNb2RlKQogICAgIHsKQEAgLTc5Myw3ICs3OTMsNyBAQAogICAgICAgICBpZiAoIHNpemUgPT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgLyogSWYgdGhlIHRhcmdldCB0aW1lIGlzIGludmFsaWQsIHBvaW50IHRvIGJlZ2luaW5nIGFuZCByZXR1cm4gKi8KLSAgICAgICAgICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIoKnBPYnRhaW5DVFMsIDApOworICAgICAgICAgICAgKnBPYnRhaW5DVFMgPSAwOwogICAgICAgICAgICAgZmlsZVBvcyA9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbMF07CiAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7CkBAIC04MzQsMjMgKzgzNCwyMyBAQAogICAgIC8qIENoZWNrIGlmIEFVIGRhdGEgQWRkcmVzcyBpcyBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBmcmVlIGl0ICovCiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKTsKKyAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpOwogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIHRoZSBzdHJlYW0gaGFuZGxlciBpcyBhbGxvY2F0ZWQgbWVtb3J5ICovCiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcik7CisgICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpOwogICAgIH0KIAogICAgIC8qIFNlZWsgdGFibGUgaXMgY3JlYXRlZCBvbmx5IHdoZW4gc2VlayBpcyB1c2VkLCBzbyBjaGVjayBpZiBtZW1vcnkgaXMgYWxsb2NhdGVkICovCiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpOworICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpOwogICAgIH0KIAogICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFN0cmVhbUNvbnRleHQpOworICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwogCiAgICAgcmV0dXJuIE00Tk9fRVJST1IgOwogfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb3ZlcnRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb3ZlcnRlci5jCnJlbmFtZSB0byBsaWJ2aWRlb2VkaXRvci92c3Mvc3JjL000Q2hhbm5lbENvbnZlcnRlci5jCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKaW5kZXggMTVmZDljOC4uZWZkZTc3MCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYwpAQCAtNzYsNyArNzYsNyBAQAogCiAgICAgLyogQWxsb2NhdGVzIHRoZSBjb250ZXh0ICovCiAgICAgY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCisgICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCiAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfb3BlblJlYWQiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQogICAgIHsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICBjb250ZXh0LT5tX3BEZWNvZGVyU3BlY0luZm8gPSBNNE9TQV9OVUxMOwogCiAgICAgLyogU2V0IHNhbXBsZSBmcmVxdWVuY3kgKi8KLSAgICBwVGVtcFVSTCA9IChNNE9TQV9DaGFyKilwVXJsICsgKE00T1NBX2Nockxlbmd0aCgoTTRPU0FfQ2hhciopcFVybCktMTEpOworICAgIHBUZW1wVVJMID0gKE00T1NBX0NoYXIqKXBVcmwgKyAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTEpOwogICAgIE00T1NBX2Nock5Db3B5KHZhbHVlLCBwVGVtcFVSTCwgNSk7CiAgICAgTTRPU0FfY2hyR2V0VUludDMyKHBUZW1wVVJMLCAmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kpLAogICAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0Ffa2NockRlYyk7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBNNE9TQV9jaHJHZXRVSW50MTYocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpLAogICAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0Ffa2NockRlYyk7CiAKLSAgICBNNE9TQV9jaHJOQ29weShwVXJsLHBVcmwsIChNNE9TQV9jaHJMZW5ndGgoKE00T1NBX0NoYXIqKXBVcmwpLTEyKSk7CisgICAgTTRPU0FfY2hyTkNvcHkocFVybCxwVXJsLCAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTIpKTsKICAgICAvKiBPcGVuIHRoZSBmaWxlICovCiAgICAgY29udGV4dC0+bV9maWxlQ29udGV4dCA9IE00T1NBX05VTEw7CiAgICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+b3BlblJlYWQoJihjb250ZXh0LT5tX2ZpbGVDb250ZXh0KSwgcFVybCwgTTRPU0Ffa0ZpbGVSZWFkKTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgIGNvbnRleHQtPm1fZGF0YVN0YXJ0T2Zmc2V0ID0gMDsKICAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgPSBwRmlsZUZ1bmN0aW9uOwogCi0gICAgY29udGV4dC0+bV9wQXVCdWZmZXIgPSAoTTRPU0FfTWVtQWRkcjMyKU00T1NBX21hbGxvYyhjb250ZXh0LT5tX2Jsb2NrU2l6ZSwgTTRXQVZfUkVBREVSLAorICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoY29udGV4dC0+bV9ibG9ja1NpemUsIE00V0FWX1JFQURFUiwKICAgICAgICAgIChNNE9TQV9DaGFyICopIkNvcmUgUENNIHJlYWRlciBBY2Nlc3MgVW5pdCIpOwogICAgIGlmIChNNE9TQV9OVUxMID09IGNvbnRleHQtPm1fcEF1QnVmZmVyKQogICAgIHsKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgICAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjb250ZXh0LT5tX2ZpbGVDb250ZXh0KTsKIAogICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMiljb250ZXh0KTsKKyAgICBmcmVlKGNvbnRleHQpOwogICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7CiAKICAgICByZXR1cm4gZXJyOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgLyogQWxsb2NhdGVzIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUgKi8KICAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7CiAgICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKU00T1NBX21hbGxvYyggc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSwgTTRXQVZfUkVBREVSLAorICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSwgTTRXQVZfUkVBREVSLAogICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00UENNUl9nZXROZXh0U3RyZWFtIik7CiAgICAgaWYocFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPT0gTTRPU0FfTlVMTCkKICAgICB7CkBAIC0yMjEsOCArMjIxLDggQEAKICAgICB9CiAgICAgLyogRmlsbCBkZWNvZGVyU3BlY2lmaWNJbmZvIHN0cnVjdHVyZSwgd2l0aCBkZWNvZGVyIGNvbmZpZyBzdHJ1Y3R1cmUgZmlsbGVkIGluICdvcGVucmVhZCcKICAgICAgICAgIGZ1bmN0aW9uICovCi0gICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmYy0+bV9kZWNvZGVyQ29uZmlnLCBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pKTsKKyAgICBtZW1jcHkoKHZvaWQgKilwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbywKKyAgICAgICAgICh2b2lkICopJmMtPm1fZGVjb2RlckNvbmZpZywgc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSk7CiAKICAgICAvKiBGaWxsIG90aGVyIGZpZWxkcyBvZiBwU3RyZWFtRGVzYyBzdHJ1Y3R1cmUgKi8KICAgICBwU3RyZWFtRGVzYy0+dGltZVNjYWxlID0gMTAwMDsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAgICAgaWYoYy0+bV9wRGVjb2RlclNwZWNJbmZvICE9IE00T1NBX05VTEwpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYy0+bV9wRGVjb2RlclNwZWNJbmZvKTsKKyAgICAgICAgZnJlZShjLT5tX3BEZWNvZGVyU3BlY0luZm8pOwogICAgIH0KIAogICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCkBAIC01ODQsNyArNTg0LDcgQEAKIAogICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEF1QnVmZmVyKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWMtPm1fcEF1QnVmZmVyKTsKKyAgICAgICAgZnJlZShjLT5tX3BBdUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KQEAgLTU5Niw3ICs1OTYsNyBAQAogICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwogICAgIGlmIChNNE9TQV9OVUxMICE9IGMpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpYyk7CisgICAgICAgIGZyZWUoYyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMKaW5kZXggNTU4MWNiZC4uMmNlMjJmNiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAgICAgLyoqCiAgICAgICogIEFsbG9jYXRlIHRoZSBNNFBUTzNHUFAgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KSwgTTRQVE8zR1BQLAorICAgIHBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCksIE00UFRPM0dQUCwKICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCIpOwogICAgICpwQ29udGV4dCA9IHBDOwogICAgIGlmIChNNE9TQV9OVUxMID09IHBDKQpAQCAtMjQyLDEzICsyNDIsNiBAQAogICAgIHBDLT5wU2F2ZWRQbGFuZSA9IE00T1NBX05VTEw7CiAgICAgcEMtPnVpU2F2ZWREdXJhdGlvbiA9IDA7CiAKLSAgICBmb3IgKGk9MDsgaTxNNFZFX2tFbmNvZGVyVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbaV0ucEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5wVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5yZWdpc3RlcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCiAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9Jbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7CiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CkBAIC00MjQsOCArNDE3LDggQEAKIAogICAgIC8qKgogICAgICAqIENvcHkgdGhlIE00UFRPM0dQUF9QYXJhbXMgc3RydWN0dXJlICovCi0gICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkoJnBDLT5tX1BhcmFtcyksCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBQYXJhbXMsIHNpemVvZihNNFBUTzNHUFBfUGFyYW1zKSk7CisgICAgbWVtY3B5KCh2b2lkICopKCZwQy0+bV9QYXJhbXMpLAorICAgICAgICAgICAgICAgICh2b2lkICopcFBhcmFtcywgc2l6ZW9mKE00UFRPM0dQUF9QYXJhbXMpKTsKICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW46IG91dHB1dFZpZGVvQml0cmF0ZSA9ICVkIiwgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MjcsNyArNTIwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGF1ZGlvIEFVIHVzZWQgZm9yIHJlYWQgb3BlcmF0aW9ucyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLAorICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQLChNNE9TQV9DaGFyICopInBSZWFkZXJBdWRpb0FVIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQogICAgICAgICAgICAgICAgICAgICB7CkBAIC04NTcsOCArODUwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICogIENvcHkgYXVkaW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00UFRPM0dQUF9TdGVwKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fZGF0YUFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZTsKIApAQCAtMTE0Myw3ICsxMTM2LDcgQEAKIAogICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKKyAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyQXVkaW9BVSk7CiAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTExNjIsMjIgKzExNTUsMjIgQEAKIAogICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pOworICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSk7CiAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pOworICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSk7CiAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7CisgICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7CiAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8gPSBNNE9TQV9OVUxMOwogICAgIH0KICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pOworICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pOwogICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTExODYsMjggKzExNzksMjggQEAKICAgICAgKiAgRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyR2xvYkludCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wUmVhZGVyR2xvYkludCk7CisgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JJbnQpOwogICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludCA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJEYXRhSW50KQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BSZWFkZXJEYXRhSW50KTsKKyAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUludCk7CiAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50ID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BFbmNvZGVySW50KQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BFbmNvZGVySW50KTsKKyAgICAgICAgZnJlZShwQy0+bV9wRW5jb2RlckludCk7CiAgICAgICAgIHBDLT5tX3BFbmNvZGVySW50ID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyR2xvYkludCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyR2xvYkludCk7CisgICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckdsb2JJbnQpOwogICAgICAgICBwQy0+bV9wV3JpdGVyR2xvYkludCA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckRhdGFJbnQpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcFdyaXRlckRhdGFJbnQpOworICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJEYXRhSW50KTsKICAgICAgICAgcEMtPm1fcFdyaXRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwogICAgIH0KICAgICAvKio8IERvIG5vdCBmcmVlIHBDLT5wT3NhTWVtb3J5UHRyRmN0IGFuZCBwQy0+cE9zYU1lbW9yeVB0ckZjdCwgYmVjYXVzZSBpdCdzIG93bmVkIGJ5IHRoZSBcCkBAIC0xMjE1LDcgKzEyMDgsNyBAQAogCiAgICAgLyoqCiAgICAgICogIEZyZWUgdGhlIGNvbnRleHQgaXRzZWxmICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDKTsKKyAgICBmcmVlKHBDKTsKICAgICBwQyA9IE00T1NBX05VTEw7CiAKICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX0NsZWFuVXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKQEAgLTEyNjMsMjMgKzEyNTYsNiBAQAogICAgIHsKICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzRfRU1QOiBiQWN0aXZhdGVFbXAgPSBNNE9TQV9UUlVFOyAvKiBubyBicmVhayAqLwogICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGlmIChwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tNNFZFX2tNcGVnNFZpZGVvRW5jXS5yZWdpc3RlcmVkKQotICAgICAgICAgICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9FTkNPREVSUwotICAgICAgICAgICAgICAgIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEkgPSBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tNNFZFX2tNcGVnNFZpZGVvRW5jXQotICAgICAgICAgICAgICAgIC5wRW5jb2RlckludGVyZmFjZTsKLSAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhID0gcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbTTRWRV9rTXBlZzRWaWRlb0VuY10ucFVzZXJEYXRhOwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRFR0VfTVBFRzRfZ2V0SW50ZXJmYWNlcygmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIGV4dGVybmFsIE1QRUc0IGVuY29kZXIgYXZhaWxhYmxlIVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKICNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKICAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAogICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7CkBAIC0xMjg3LDI2ICsxMjYzLDggQEAKICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gTVBFRzQgZW5jb2RlciBhdmFpbGFibGUhIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKICAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKICNlbmRpZiAvKiBzb2Z0d2FyZSBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgaWYgKHBDLT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW000VkVfa0gyNjNWaWRlb0VuY10ucmVnaXN0ZXJlZCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfRU5DT0RFUlMKLSAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlckV4dGVybmFsQVBJID0gcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbTTRWRV9rSDI2M1ZpZGVvRW5jXQotICAgICAgICAgICAgICAgIC5wRW5jb2RlckludGVyZmFjZTsKLSAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhID0gcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbTTRWRV9rSDI2M1ZpZGVvRW5jXS5wVXNlckRhdGE7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVHRV9IMjYzX2dldEludGVyZmFjZXMoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBleHRlcm5hbCBIMjYzIGVuY29kZXIgYXZhaWxhYmxlISBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKICNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKICAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2MygmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCiAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKQEAgLTEzMTQsMTcgKzEyNzIsOCBAQAogICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBIMjYzIGVuY29kZXIgYXZhaWxhYmxlISBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7CiAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7CiAjZW5kaWYgLyogc29mdHdhcmUgSDI2MyBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgaWYgKHBDLT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW000VkVfa0gyNjRWaWRlb0VuY10ucmVnaXN0ZXJlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IE5vIGV4dGVybmFsIEgyNjQgZW5jb2RlciBhdmFpbGFibGUhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CiAjaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwogICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwpAQCAtMTMzMyw3ICsxMjgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7CiAgICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7CiAjZW5kaWYgLyogc29mdHdhcmUgSDI2NCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCkBAIC0xNTY0LDcgKzE1MTIsNyBAQAogICAgIC8qKgogICAgICAqICBBbGxvY2F0ZSBhbmQgZmlsbCB0aGUgdmlkZW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gPQotICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBX21hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLCBNNFBUTzNHUFAsCisgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtIik7CiAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKQogICAgIHsKQEAgLTE1NzMsNyArMTUyMSw3IEBACiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9Ci0gICAgICAgIChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpLCBNNFBUTzNHUFAsCisgICAgICAgIChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpLCBNNFBUTzNHUFAsCiAgICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJWaWRlb1N0cmVhbUluZm8iKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQogICAgIHsKQEAgLTE2NzIsNyArMTYyMCw3IEBACiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCiAgICAgewogICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAorICAgICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlckF1ZGlvU3RyZWFtIik7CiAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSkKICAgICAgICAgewpAQCAtMTY4MSw3ICsxNjI5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQogICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0KLSAgICAgICAgICAgIChNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MpLCBNNFBUTzNHUFAsCisgICAgICAgICAgICAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKSwgTTRQVE8zR1BQLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlckF1ZGlvU3RyZWFtSW5mbyIpOwogICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQogICAgICAgICB7CkBAIC0xOTUyLDggKzE5MDAsOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAotICAgICAoTTRPU0FfTWVtQWRkcjgpTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzEyMl9GUkFNRSwgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFKTsKKyAgICBtZW1jcHkoKHZvaWQgKilwV3JpdGVyQXVkaW9BVS0+ZGF0YUFkZHJlc3MsCisgICAgICh2b2lkICopTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzEyMl9GUkFNRSwgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFKTsKICAgICBwV3JpdGVyQXVkaW9BVS0+c2l6ZSAgICA9IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRTsKICAgICBwV3JpdGVyQXVkaW9BVS0+Q1RTICAgICA9IG10SW5jQ3RzOwogICAgIHBXcml0ZXJBdWRpb0FVLT5uYkZyYWcgID0gMDsKQEAgLTIwMDAsOCArMTk0OCw4IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwV3JpdGVyQXVkaW9BVS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUUsCisgICAgbWVtY3B5KCh2b2lkICopcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICh2b2lkICopTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzA0OF9GUkFNRSwKICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwogICAgIHBXcml0ZXJBdWRpb0FVLT5zaXplICAgID0gTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwogICAgIHBXcml0ZXJBdWRpb0FVLT5DVFMgICAgID0gbXRJbmNDdHM7CkBAIC0yMDIwLDQxICsxOTY4LDMgQEAKIH0KIAogCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXIoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9FbmNvZGVyVHlwZSBlbmNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0ludGVyZmFjZSogICAgcEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICBzd2l0Y2ggKGVuY29kZXJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZFX2tNcGVnNFZpZGVvRW5jOgotICAgICAgICBjYXNlIE00VkVfa0gyNjNWaWRlb0VuYzoKLSAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWRV9rSDI2NFZpZGVvRW5jOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0IGVuY29kZXIgdHlwZSBub3QgaW1wbGVtZW50ZWQgeWV0Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gZW5jb2RlclR5cGUgJWQiLCBlbmNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tlbmNvZGVyVHlwZV0ucEVuY29kZXJJbnRlcmZhY2UgPSBwRW5jb2RlckludGVyZmFjZTsKLSAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tlbmNvZGVyVHlwZV0ucFVzZXJEYXRhID0gcFVzZXJEYXRhOwotICAgIHBDLT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2VuY29kZXJUeXBlXS5yZWdpc3RlcmVkID0gTTRPU0FfVFJVRTsKLQotICAgIC8qIE5vdGljZSBpdCBvdmVyd3JpdGVzIGFueSBIVyBlbmNvZGVyIHRoYXQgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZTsKLSAgICB0aGlzIGlzIG5vcm1hbC4gKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCmluZGV4IGJjYmZhZjAuLjUzZmI1YzkgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCkBAIC0xMjAsOCArMTIwLDggQEAKICAgICAgICAgICogKHRoZSBsYXN0IHBpYyBpcyBzcGxpdGVkIGR1ZSB0byB0aGUgY2FsbGJhY2sgZXh0cmEtY2FsbC4uLiAqLwogICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFBsYW5lT3V0W2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTYXZlZFBsYW5lW2ldLnBhY19kYXRhLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0W2ldLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wU2F2ZWRQbGFuZVtpXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYwppbmRleCAzMmJmOWNmLi5hN2NkNjUzIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCiAgICAgICAgICAiTTRSRUFERVJfQU1SX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKIAotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX0FNUl9Db250ZXh0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00UkVBREVSX0FNUl9Db250ZXh0KSwKKyAgICBwUmVhZGVyQ29udGV4dCA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFJFQURFUl9BTVJfQ29udGV4dCksCiAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0FNUl9Db250ZXh0Iik7CiAgICAgaWYgKHBSZWFkZXJDb250ZXh0ID09IE00T1NBX05VTEwpCiAgICAgewpAQCAtODAsNyArODAsNyBAQAogCiAgICAgcFJlYWRlckNvbnRleHQtPm1fcEF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7CiAgICAgcFJlYWRlckNvbnRleHQtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMihwUmVhZGVyQ29udGV4dC0+bV9tYXhEdXJhdGlvbiwgMCk7CisgICAgcFJlYWRlckNvbnRleHQtPm1fbWF4RHVyYXRpb24gPSAwOwogICAgIHBSZWFkZXJDb250ZXh0LT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7CiAgICAgcFJlYWRlckNvbnRleHQtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gTTRPU0FfTlVMTDsKIApAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CiAgICAgfQogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDKTsKKyAgICBmcmVlKHBDKTsKIAogICAgIHJldHVybiBNNE5PX0VSUk9SOwogfQpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgIC8qIERlbGV0ZSB0aGUgRFNJIGlmIG5lZWRlZCAqLwogICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKVwKKyAgICAgICAgICAgIGZyZWUoXAogICAgICAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7CiAKICAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BBdWRpb1N0cmVhbSk7CisgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTI3OSw3ICsyNzksNyBAQAogCiAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwogCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBX21hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKKyAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKICAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQogICAgIHsKQEAgLTMwMywxNCArMzAzLDEyIEBACiAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwogICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gLy8gTTRPU0FfSU5UNjRfRlJPTV9ET1VCTEUocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24sCi0gLy8gKE00T1NBX0RvdWJsZSkoKChNNE9TQV9GbG9hdClzdHJlYW1EZXNjLmR1cmF0aW9uKjEwMDAvKE00T1NBX0Zsb2F0KShzdHJlYW1EZXNjLnRpbWVTY2FsZSkpKSk7CiAgICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwogICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSAgICAgICAgICAgICAgID0gKHZvaWQqKXN0cmVhbURlc2MudGltZVNjYWxlOyAvKnRyaWNrIHRvIGNoYW5nZSovCiAKLSAgICBpZiAoTTRPU0FfVElNRV9DT01QQVJFKHN0cmVhbURlc2MuZHVyYXRpb24sIHBDLT5tX21heER1cmF0aW9uKSA+IDApCisgICAgaWYgKHN0cmVhbURlc2MuZHVyYXRpb24gPiBwQy0+bV9tYXhEdXJhdGlvbikKICAgICB7Ci0gICAgICAgIE00T1NBX1RJTUVfU0VUKHBDLT5tX21heER1cmF0aW9uLCBzdHJlYW1EZXNjLmR1cmF0aW9uKTsKKyAgICAgICAgcEMtPm1fbWF4RHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwogICAgIH0KICAgICBwU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlQml0UmF0ZSAgICAgICAgICA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7CiAKQEAgLTQyMiw3ICs0MjAsNyBAQAogICAgIHsKICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbiA6CiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RJTUVfU0VUKCooTTRPU0FfVGltZSopcFZhbHVlLCBwQy0+bV9tYXhEdXJhdGlvbik7CisgICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBDLT5tX21heER1cmF0aW9uOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC01MjMsMTUgKzUyMSwxMyBAQAogICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07CiAgICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwogICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NDsKKyAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAwOwogICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgIFN0YXRlOwogCiAgICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKICAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCiAgICAgICAgICAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwogCi0gICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMih0aW1lNjQsIDApOwotCiAgICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCiAgICAgewogICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKQEAgLTU5Niw4ICs1OTIsNyBAQAogICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07CiAgICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwogICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NDsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICB0aW1lRG91YmxlOyAvKnVzZWQgZm9yIHR5cGUgY29udmVyc2lvbiBvbmx5Ki8KKyAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7CiAgICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7CiAKICAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwpAQCAtNjA1LDggKzYwMCw2IEBACiAgICAgICAgICAiTTRSRUFERVJfQU1SX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwogICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSXzNHUF9qdW1wOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwogCi0gICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMih0aW1lNjQsICpwVGltZSk7Ci0KICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKICAgICB7CiAgICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwpAQCAtNjQxLDggKzYzNCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgTTRPU0FfSU5UNjRfVE9fRE9VQkxFKHRpbWVEb3VibGUsIHRpbWU2NCk7Ci0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWVEb3VibGU7CisgICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKIAogICAgIHJldHVybiBlcnI7CiB9CkBAIC03NTgsMTggKzc1MCwxOCBAQAogICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwogCiAgICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfbWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKKyAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksCiAgICAgICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiICk7CiAgICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCiAgICAgewogICAgICAgICAqcFJkckRhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9IChNNFJFQURFUl9EYXRhSW50ZXJmYWNlKilNNE9TQV9tYWxsb2MoIHNpemVvZihNNFJFQURFUl9EYXRhSW50ZXJmYWNlKSwKKyAgICAqcFJkckRhdGFJbnRlcmZhY2UgPSAoTTRSRUFERVJfRGF0YUludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfRGF0YUludGVyZmFjZSksCiAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckRhdGFJbnRlcmZhY2UpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKnBSZHJHbG9iYWxJbnRlcmZhY2UpOworICAgICAgICBmcmVlKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKICAgICAgICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKaW5kZXggNTYwNDk4My4uOWYyZTViMyAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX1BjbS5jCkBAIC02Niw3ICs2Niw3IEBACiAgICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgICAgICAgTTRFUlJfUEFSQU1FVEVSLAogICAgICAgICAgIk00UkVBREVSX1BDTV9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7CiAKLSAgICBwUmVhZGVyQ29udGV4dCA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNFJFQURFUl9QQ01fQ29udGV4dCksCisgICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAogICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwogICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQogICAgIHsKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKICAgICAgICAgICJNNFJFQURFUl9QQ01fZGVzdHJveTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKIAotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQyk7CisgICAgZnJlZShwQyk7CiAKICAgICByZXR1cm4gTTROT19FUlJPUjsKIH0KQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BBdWRpb1N0cmVhbSk7CisgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgIHN3aXRjaCAob3B0aW9uSWQpCiAgICAgewogICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICAqKChNNE9TQV9VSW50NjQqKXBWYWx1ZSkgPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb247CisgICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgpAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKICAgICB9CiAKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfbWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAorICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksCiAgICAgICAgICBNNFJFQURFUl9XQVYsIChNNE9TQV9DaGFyICopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwogICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpCiAgICAgewpAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7CiAKICAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50NjQpZkR1cmF0aW9uOworICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbiAgICAgICAgICAgICAgICA9IChNNE9TQV9JbnQzMilmRHVyYXRpb247CiAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvICAgID0gKE00T1NBX1VJbnQ4Kikoc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvKTsKICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwogICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9zdHJlYW1JZCAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7CkBAIC02ODAsMTggKzY4MCwxOCBAQAogICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwogCiAgICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfbWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwgTTRSRUFERVJfV0FWLAorICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwgTTRSRUFERVJfV0FWLAogICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00UkVBREVSX1BDTSBHbG9iYWxJbnRlcmZhY2UiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKICAgICB7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAgICAgKnBSZHJEYXRhSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlKilNNE9TQV9tYWxsb2MoIHNpemVvZihNNFJFQURFUl9EYXRhSW50ZXJmYWNlKSwgTTRSRUFERVJfV0FWLAorICAgICAgICAgKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSAiTTRSRUFERVJfUENNIERhdGFJbnRlcmZhY2UiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckRhdGFJbnRlcmZhY2UpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKnBSZHJHbG9iYWxJbnRlcmZhY2UpOworICAgICAgICBmcmVlKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCmluZGV4IGJjNzU0ODguLmM4YThhY2EgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYworKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgogCiAjaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVybmFsLmgiCiAjaW5jbHVkZSAiTTRWRF9Ub29scy5oIgogCiAvKioKQEAgLTMzLDMwICszMiw2IEBACiBNNE9TQV9VSW50MzIgTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKICAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpCiB7Ci0jaWYgMAotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotCi0gICAgY29kZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX2JpdHM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwYXJzaW5nQ3R4dC0+c3RyZWFtX2luZGV4ID09IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICAgICAgcGFyc2luZ0N0eHQtPmluKys7Ci0gICAgICAgICAgICAvL2ZyZWFkKCZzdHJlYW1fYnl0ZSwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLDEsaW4pOwotICAgICAgICAgICAgcGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgY29kZSA9IChjb2RlIDw8IDEpOwotICAgICAgICBjb2RlIHw9ICgocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlICYgMHg4MCkgPj4gNyk7Ci0KLSAgICAgICAgcGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlID0gKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA8PCAxKTsKLSAgICAgICAgcGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCsrOwotICAgIH0KLQotICAgIHJldHVybiBjb2RlOwotI2VuZGlmCiAgICAgICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KHBhcnNpbmdDdHh0LG5iX2JpdHMpKTsKIH0KIApAQCAtNjQsNDQgKzM5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyMzIgZGVzdF9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cykKIHsKLSNpZiAwCi0gICAgTTRPU0FfVUludDggaSxqOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wX2Rlc3QgPSAwLCBtYXNrID0gMCwgdGVtcCA9IDE7Ci0gICAgTTRPU0FfVUludDMyIGlucHV0ID0gYml0c1RvV3JpdGU7Ci0KLSAgICBpbnB1dCA9IChpbnB1dCA8PCAoMzIgLSBuYl9iaXRzIC0gb2Zmc2V0KSk7Ci0KLSAgICAvKiBQdXQgZGVzdGluYXRpb24gYnVmZmVyIHRvIDAgKi8KLSAgICBmb3Ioaj0wO2o8MztqKyspCi0gICAgewotICAgICAgICBmb3IoaT0wO2k8ODtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChqKjgpK2kgPj0gb2Zmc2V0ICYmIChqKjgpK2kgPCBuYl9iaXRzICsgb2Zmc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hc2sgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtYXNrID0gfm1hc2s7Ci0gICAgKmRlc3RfYml0cyAmPSBtYXNrOwotCi0gICAgLyogUGFyc2UgaW5wdXQgYml0cywgYW5kIGZpbGwgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICgoaW5wdXQgJiAoMHg4MDAwMDAwMCA+PiBvZmZzZXQpKSA+PiAoMzEtb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgLy8qZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgzMSAtIGkpKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgoNyooaisxKSktaStqKSk7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSAoaW5wdXQgPDwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLSNlbmRpZgogICAgICAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoIGJpdHNUb1dyaXRlLGRlc3RfYml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgIG5iX2JpdHMpKTsKIH0KQEAgLTUwMywxOCArNDQwLDIxIEBACiB7CiAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CiAgICAgTTRPU0FfQm9vbCBOQUxTUFNfYW5kX1Byb2ZpbGUwRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9VSW50MTYgaW5kZXg7Ci0gICAgTTRPU0FfQm9vbCAgICBjb25zdHJhaW50U2V0MzsKKyAgICBNNE9TQV9VSW50MTYgaW5kZXggPSAyODsgLyogdGhlIDI5dGggYnl0ZSBpcyBTUFMgc3RhcnQgKi8KKyAgICBNNE9TQV9Cb29sIGNvbnN0cmFpbnRTZXQzOworCisgICAgaWYgKERTSVNpemUgPD0gaW5kZXgpIHsKKyAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9FWFRFUk5BTF9QYXJzZUFWQ0RTSTogRFNJIGlzIGludmFsaWQiKTsKKyAgICAgICAgKnByb2ZpbGUgPSBNNERFQ09ERVJfQVZDX2tQcm9maWxlX2FuZF9MZXZlbF9PdXRfT2ZfUmFuZ2U7CisgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CisgICAgfQogCiAgICAgLyogY2hlY2sgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IChEU0lTaXplLTEpOyBpbmRleCsrKQorICAgIGlmKCgocERTSVtpbmRleF0gJiAweDFmKSA9PSAweDA3KSAmJiAocERTSVtpbmRleCsxXSA9PSAweDQyKSkKICAgICB7Ci0gICAgICAgIGlmKCgocERTSVtpbmRleF0gJiAweDFmKSA9PSAweDA3KSAmJiAocERTSVtpbmRleCsxXSA9PSAweDQyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTkFMU1BTX2FuZF9Qcm9maWxlMEZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIE5BTFNQU19hbmRfUHJvZmlsZTBGb3VuZCA9IE00T1NBX1RSVUU7CiAgICAgfQorCiAgICAgaWYoTTRPU0FfRkFMU0UgPT0gTkFMU1BTX2FuZF9Qcm9maWxlMEZvdW5kKQogICAgIHsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00REVDT0RFUl9FWFRFUk5BTF9QYXJzZUFWQ0RTSTogaW5kZXggYmFkID0gJWQiLCBpbmRleCk7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwOWY0OTUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTEgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmMKLSAqIEBicmllZgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaWZuZGVmIE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBub3QgTTRERUNPREVSX0VYVEVSTkFMX1NZTkNfRVhUX0RFQ09ERSAqLwotCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVybmFsLmgiCi0KLS8qIFdhcm5pbmc6IHRoZSBkZWNvZGUgdGhyZWFkIGhhcyBmaW5pc2hlZCBkZWNvZGluZyBhbGwgdGhlIGZyYW1lcyAqLwotI2RlZmluZSBNNFdBUl9ERUNPREVfRklOSVNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMLCAweDAwMDEpCi0vKiBXYXJuaW5nOiB0aGUgcmVuZGVyIHRocmVhZCBoYXMgZmluaXNoZWQgcmVuZGVyaW5nIHRoZSBmcmFtZSAqLwotI2RlZmluZSBNNFdBUl9SRU5ERVJfRklOSVNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMLCAweDAwMDIpCi0KLSNkZWZpbmUgTTRFUlJfQ0hFQ0soeCkgaWYoTTROT19FUlJPUiE9eCkgcmV0dXJuIHg7Ci0jZGVmaW5lIE00RVJSX0VYSVQoeCkgZG8geyBlcnIgPSB4OyBnb3RvIGV4aXRfd2l0aF9lcnJvcjsgfSB3aGlsZSgwKQotCi0KLS8qIC0tLS0tIHNoZWxsIEFQSSAtLS0tLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcFZTX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9kZXN0cm95KE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQpOwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9kZWNvZGUoTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkp1bXApOwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfcmVuZGVyKE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpOwotCi0vKiAtLS0tLSBTaWduYWxpbmcgZnVuY3Rpb25zIC0tLS0tICovCi0KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX3NpZ25hbERlY29kZXJPdmVyKE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSBhVGltZSwgTTRPU0FfRVJSIGFVc2VyRXJyb3IpOwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfc2lnbmFsUmVuZGVyT3ZlcihNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9NZWRpYVRpbWUgYVRpbWUsIE00T1NBX0VSUiBhVXNlckVycm9yKTsKLQotLyogLS0tLS0gc3RhdGljIGludGVybmFsIGZ1bmN0aW9ucyAtLS0tLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9Jbml0KHZvaWQqKiBwVlNfQ29udGV4dCwgTTRWRF9JbnRlcmZhY2UqIHBfSFdJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX1N0cmVhbURlc2NyaXB0aW9uSW5pdChNNFZEX1N0cmVhbUluZm8qKiBwcFN0cmVhbUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpOwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfU2V0VXBSZWFkSW5wdXQodm9pZCogcFZTX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqIHBSZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0dldE5leHRBdShNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvQnVmZmVyICpuZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogbmV4dEZyYW1lVGltZSk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9TeW5jaHJvbm91c0RlY29kZShNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c0RlY29kZShNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c1JlbmRlcihNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0KTsKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgcERlY29kZXJJbnRlcmZhY2U6IChPVVQpIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW5hbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgaWYgT0sKLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9nZXRJbnRlcmZhY2UoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgLyogQWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGRlY29kZXIgc2hlbGwgcG9pbnRlciB0byBmdW5jdGlvbiAqLwotICAgICpwRGVjb2RlckludGVyZmFjZSA9Ci0gICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV9tYWxsb2MoIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLAotICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTCwgKE00T1NBX0NoYXIgKikiTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNERFQ09ERVJfRVhURVJOQUxfZ2V0SW50ZXJmYWNlOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgPSBNNERFQ09ERVJfRVhURVJOQUxfY3JlYXRlOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgPSBNNERFQ09ERVJfRVhURVJOQUxfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uID0gTTRERUNPREVSX0VYVEVSTkFMX2dldE9wdGlvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uID0gTTRERUNPREVSX0VYVEVSTkFMX3NldE9wdGlvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVjb2RlICAgID0gTTRERUNPREVSX0VYVEVSTkFMX2RlY29kZTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVuZGVyICAgID0gTTRERUNPREVSX0VYVEVSTkFMX3JlbmRlcjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIHRoZSBleHRlcm5hbCB2aWRlbyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgaW50ZXJuYWwgdmlkZW8gZGVjb2RlciBjb250ZXh0IGFuZAotICogICAgICAgICAgaW5pdGlhbGl6ZXMgaXQuCi0gKgotICogQHBhcmFtICAgcFZTX0NvbnRleHQgICAgIChPVVQpICAgQ29udGV4dCBvZiB0aGUgdmlkZW8gaHcgc2hlbGwKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlOiAoSU4pICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0KLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGNhbGxlcikgd2hlcmUgdGhlIGRlY29kZWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN0b3JlZAotICogQHBhcmFtICAgcEV4dGVybmFsQVBJICAgIChJTikgICAgSW50ZXJmYWNlIG9mIHRoZSBjbGllbnQgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgIChJTikgICAgVXNlciBkYXRhIG9mIHRoZSBleHRlcm5hbCB2aWRlbyBkZWNvZGVyCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcFZTX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLXsKLSAgICBNNFZEX1ZpZGVvVHlwZSB2aWRlb0RlY29kZXJLaW5kOwotICAgIE00VkRfU3RyZWFtSW5mbyogcFN0cmVhbUluZm87Ci0gICAgTTRWRF9PdXRwdXRGb3JtYXQgb3V0cHV0Rm9ybWF0OwotCi0gICAgTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX2NyZWF0ZSIpOwotCi0gICAgLyogVmlkZW8gU2hlbGwgQ3JlYXRpb24gKi8KLSAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfSW5pdChwVlNfQ29udGV4dCwKLSAgICAgICAgICgoTTRERUNPREVSX0VYVEVSTkFMX1VzZXJEYXRhVHlwZSlwVXNlckRhdGEpLT5leHRlcm5hbEZ1bmNzLCBwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRERUNPREVSX0VYVEVSTkFMX2NyZWF0ZSA6XAotICAgICAgICAgICAgIE00VkRfRVhURVJOQUxfSW5pdCBSRVRVUk5TIFRIRSBFUlJPUiBDT0RFID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1NldFVwUmVhZElucHV0KCpwVlNfQ29udGV4dCwgcFJlYWRlckRhdGFJbnRlcmZhY2UsIHBBY2Nlc3NVbml0KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNERFQ09ERVJfRVhURVJOQUxfY3JlYXRlIDpcCi0gICAgICAgICAgICAgTTRWRF9FWFRFUk5BTF9TZXRVcFJlYWRJbnB1dCBSRVRVUk5TIFRIRSBFUlJPUiBDT0RFID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQgPSAoTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCopKCpwVlNfQ29udGV4dCk7Ci0KLSAgICAvKiBTdHJlYW0gRGVzY3JpcHRpb24gaW5pdCAqLwotICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9TdHJlYW1EZXNjcmlwdGlvbkluaXQoJnBTdHJlYW1JbmZvLCBwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRERUNPREVSX0VYVEVSTkFMX2NyZWF0ZSA6XAotICAgICAgICAgICAgIE00VkRfRVhURVJOQUxfU3RyZWFtRGVzY3JpcHRpb25Jbml0IFJFVFVSTlMgVEhFIEVSUk9SIENPREUgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSW5mbyA9IHBTdHJlYW1JbmZvOwotCi0gICAgLyogSFcgY29udGV4dCBjcmVhdGlvbiAqLwotICAgIGVyciA9IHBTdHJlYW1Db250ZXh0LT5tX1ZEX0ludGVyZmFjZS0+bV9wRmN0SW5pdFZpZGVvRGVjb2RlcigmKHBTdHJlYW1Db250ZXh0LT5tX1ZEX0NvbnRleHQpLAotICAgICAgICAgJihwU3RyZWFtQ29udGV4dC0+bV9WRF9TaWduYWxpbmdJbnRlcmZhY2UpKTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNERFQ09ERVJfRVhURVJOQUxfY3JlYXRlIDogbV9wRmN0SW5pdFZpZGVvRGVjb2RlcigpIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEhXIGRlY29kZXIgY3JlYXRpb24gKi8KLSAgICBzd2l0Y2gocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzIDoKLSAgICAgICAgICAgIHZpZGVvRGVjb2RlcktpbmQgPSBNNFZEX2tIMjYzVmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0IDoKLSAgICAgICAgICAgIHZpZGVvRGVjb2RlcktpbmQgPSBNNFZEX2tNcGVnNFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZXJyID0gcFN0cmVhbUNvbnRleHQtPm1fVkRfSW50ZXJmYWNlLT5tX3BGY3RPcGVuRGVjb2RlcihwU3RyZWFtQ29udGV4dC0+bV9WRF9Db250ZXh0LAotICAgICAgICAgdmlkZW9EZWNvZGVyS2luZCwgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUluZm8sICZvdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgKChNNERFQ09ERVJfRVhURVJOQUxfVXNlckRhdGFUeXBlKXBVc2VyRGF0YSktPmV4dGVybmFsVXNlckRhdGEpOwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00REVDT0RFUl9FWFRFUk5BTF9jcmVhdGUgOiBtX3BGY3RPcGVuRGVjb2RlcigpIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFBhcnNlIHRoZSBWT0wgaGVhZGVyICovCi0gICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0koKE00T1NBX1VJbnQ4ICopcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUluZm8tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyQ29uZmlndXJhdGlvbi5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1JbmZvLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlckNvbmZpZ3VyYXRpb24uYVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHJlYW1Db250ZXh0LT5tX0RjaSwgJnBTdHJlYW1Db250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0KLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRERUNPREVSX0VYVEVSTkFMX2NyZWF0ZSA6XAotICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKCkgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgcFZTX0NvbnRleHQ6ICAgKElOKSBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9kZXN0cm95KE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQpCi17Ci0gICAgTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPSAoTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCopcFZTX0NvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX2Rlc3Ryb3kiKTsKLQotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQpCi0gICAgewotICAgICAgICAvKiBDYWxsIGV4dGVybmFsIEFQSSBkZXN0cm95IGZ1bmN0aW9uICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX1ZEX0ludGVyZmFjZS0+bV9wRmN0Q2xvc2UocFN0cmVhbUNvbnRleHQtPm1fVkRfQ29udGV4dCk7Ci0KLSAgICAgICAgLyogRGVzdHJveSBjb250ZXh0ICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX1ZEX0ludGVyZmFjZS0+bV9wRmN0Q2xlYW5VcChwU3RyZWFtQ29udGV4dC0+bV9WRF9Db250ZXh0KTsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1JbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUluZm8pOwotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUluZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSNpZm5kZWYgTTRERUNPREVSX0VYVEVSTkFMX1NZTkNfRVhUX0RFQ09ERQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9TZW1TeW5jKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVDbG9zZShwU3RyZWFtQ29udGV4dC0+bV9TZW1TeW5jKTsKLSAgICAgICAgfQotI2VuZGlmIC8qIG5vdCBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFICovCi0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTdHJlYW1Db250ZXh0KTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgSXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIHNpemUgKHdpZHRoIHggaGVpZ2h0KSBvZiB0aGUgaW1hZ2UKLSAqICAgICAgICAgIC0gdGhlIERTSSBwcm9wZXJ0aWVzCi0gKgotICogQHBhcmFtICAgcFZTX0NvbnRleHQ6IChJTikgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgIChJTikgICAgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAgKElOL09VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzdG9yZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKnBWYWx1ZSkKLXsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilwVlNfQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJNNERFQ09ERVJfRVhURVJOQUxfZ2V0T3B0aW9uIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZToKLSAgICAgICAgICAgICooKE00REVDT0RFUl9WaWRlb1NpemUqKXBWYWx1ZSkgPSBwU3RyZWFtQ29udGV4dC0+bV9WaWRlb1NpemU7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfTVBFRzRfa09wdGlvbklEX0RlY29kZXJDb25maWdJbmZvOgotICAgICAgICAgICAgKigoTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKilwVmFsdWUpID0gcFN0cmVhbUNvbnRleHQtPm1fRGNpOwotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBwU3RyZWFtQ29udGV4dC0+bV9WRF9JbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbihwU3RyZWFtQ29udGV4dC0+bV9WRF9Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSWQsIHBWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIEl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSBOb3RoaW5nIGltcGxlbWVudGVkIGF0IHRoaXMgdGltZQotICoKLSAqIEBwYXJhbSAgIHBWU19Db250ZXh0OiAoSU4pICAgICAgIENvbnRleHQgb2YgdGhlIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgc2hlbGwKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgICAoSU4pICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgIChJTikgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKSB3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi17Ci0gICAgTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPSAoTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCopcFZTX0NvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX3NldE9wdGlvbiIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIHBPdXRwdXRGaWx0ZXIgPSAoTTRERUNPREVSX091dHB1dEZpbHRlciopIHBWYWx1ZTsKLSAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fVkRfSW50ZXJmYWNlLT5tX3BGY3RTZXRPdXRwdXRGaWx0ZXIocFN0cmVhbUNvbnRleHQtPm1fVkRfQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUqKXBPdXRwdXRGaWx0ZXItPm1fcEZpbHRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRGaWx0ZXItPm1fcEZpbHRlclVzZXJEYXRhKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBwU3RyZWFtQ29udGV4dC0+bV9WRF9JbnRlcmZhY2UtPm1fcEZjdFNldE9wdGlvbihwU3RyZWFtQ29udGV4dC0+bV9WRF9Db250ZXh0LAotICAgICAgICAgICAgICAgICBvcHRpb25JZCwgcFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZWNvZGUgdmlkZW8gQWNjZXNzIFVuaXRzIHVwIHRvIGEgdGFyZ2V0IHRpbWUKLSAqIEBub3RlICAgIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHZpZGVvIHVudGlsIGl0IGNhbiBvdXRwdXQgYSBkZWNvZGVkIGltYWdlIGZvciB3aGljaAotICogICAgICAgICAgdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUgcGFzc2VkIHRhcmdldGVkIHRpbWUKLSAqICAgICAgICAgIFRoZSBkYXRhIGFyZSByZWFkIGZyb20gdGhlIHJlYWRlciBkYXRhIGludGVyZmFjZSBwYXNzZWQgdG8gTTRERUNPREVSX0VYVEVSTkFMX2NyZWF0ZS4KLSAqICAgICAgICAgIElmIHRocmVhZGVkIG1vZGUsIHdhaXRzIHVudGlsIHByZXZpb3VzIGRlY29kaW5nIGlzIG92ZXIsCi0gKiAgICAgICAgICBhbmQgZmlsbCBkZWNvZGluZyBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGRlY29kaW5nIHRocmVhZC4KLSAqCi0gKiBAcGFyYW0gICBwVlNfQ29udGV4dDooSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBleHRlcm5hbCB2aWRlbyBkZWNvZGVyIHNoZWxsCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKGVuZCBvZiBzdHJlYW0pCi0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBObyBmcmFtZSB0byByZW5kZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfZGVjb2RlKE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJKdW1wKQotewotICAgIE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gKE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBWU19Db250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRERUNPREVSX0VYVEVSTkFMX2RlY29kZSA6IHVwIHRvICVsZiAgYmp1bXAgPSAweCV4IiwgKnBUaW1lLCBiSnVtcCk7Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9EZWNvZGVVcFRvQ3RzID0gKnBUaW1lOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JKdW1wID0gYkp1bXA7Ci0gICAgaWYgKGJKdW1wKQotICAgIHsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudERlY29kZUN0cyA9IC0xLjA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnRSZW5kZXJDdHMgPSAtMS4wOwotICAgIH0KLQotICAgIGlmKHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZVVwVG9DdHMgPCBwU3RyZWFtQ29udGV4dC0+bV9uZXh0QVVDdHMgJiYKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudFJlbmRlckN0cyA+IHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZVVwVG9DdHMpCi0gICAgewotICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIGxhdW5jaCBhbm90aGVyIHByZWRlY29kZSwgYXMgd2Ugd2lsbCByZXVzZQotICAgICAgICAgICAgIHRoZSBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUqLwotICAgICAgICAvKiBhIHdhcm5pbmcgaXMgcmV0dXJuZWQgdG8gdGhlIHNlcnZpY2UgdG8gd2FybiBpdCBhYm91dCB0aGF0IC4qLwotICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIHRoZSBzZXJ2aWNlIE1VU1QgTk9UIGNhbGwgcmVuZGVyIGZ1bmN0aW9uLCBhbmQgbXVzdCBrZWVwIHRoZQotICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lICovCi0gICAgICAgIC8qIGlmIG5lY2Vzc2FyeSAoaS5lIGZvcmNlIHJlbmRlciBjYXNlKSovCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJObyBkZWNvZGUgaXMgbmVlZGVkLCBzYW1lIGZyYW1lIHJldXNlZCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgfQotCi0gICAgLyogSWYgcmVuZGVyIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGZyYW1lIG4sIGl0IG1lYW5zIHRoYXQgbisxIGZyYW1lIGRlY29kaW5nIGhhcwotICAgICAgICAgbm90IGJlZW4gbGF1bmNoZWQKLSAgICAtPiBkbyBub3Qgd2FpdCBmb3IgaXRzIGRlY29kaW5nIGNvbXBsZXRpb24gLi4uKi8KLSAgICBpZihwU3RyZWFtQ29udGV4dC0+bV9iSXNXYWl0TmV4dERlY29kZSA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgLyogd2FpdCBmb3IgZGVjb2RlIG4rMSB0byBjb21wbGV0ZSAqLwotICAgICAgICAvL000c2VtdmFsdWUtLTsKLSAgICAgICAgLy9wcmludGYoIlNlbWFwaG9yZSB3YWl0OiAlZFxuIiwgTTRzZW12YWx1ZSk7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX2JJc1dhaXROZXh0RGVjb2RlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocFN0cmVhbUNvbnRleHQtPm1fU2VtU3luYywgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICB9Ci0gICAgaWYocFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudERlY29kZUN0cyA+PSAqcFRpbWUpCi0gICAgewotICAgICAgICAvKiBJZiB3ZSBhcmUgbm90IGluIHRoaXMgY29uZGl0aW9uLCBpdCBtZWFucyB0aGF0IHdlIGFzayBmb3IgYSBmcmFtZSBhZnRlciB0aGUKLSAgICAgICAgICAgICAicHJlZGVjb2RlZCIgZnJhbWUgKi8KLSAgICAgICAgKnBUaW1lID0gcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudERlY29kZUN0czsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fTmJEZWNvZGVkRnJhbWVzID0gMDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yID0gTTROT19FUlJPUjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRGF0YURlY29kZVBlbmRpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogTGF1bmNoIERlY29kZVVwVG8gcHJvY2VzcyBpbiBzeW5jaHJvbm91cyBtb2RlICovCi0gICAgd2hpbGUocFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1N5bmNocm9ub3VzRGVjb2RlKHBWU19Db250ZXh0KTsKLSAgICAgICAgLyogcmV0dXJuIGNvZGUgaXMgaWdub3JlZCwgaXQgaXMgdXNlZCBvbmx5IGluIE00T1NBX1RocmVhZCBhcGkgKi8KLSAgICB9Ci0KLSAgICAqcFRpbWUgPSBwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50RGVjb2RlQ3RzOwotCi0gICAgaWYgKCAoTTRXQVJfREVDT0RFX0ZJTklTSEVEID09IHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpCi0gICAgICAgIHx8IChNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSA9PSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKSApCi0gICAgewotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yID0gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvcjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZW5kZXJzIHRoZSB2aWRlbyBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCi0gKiBAbm90ZSAgICBJZiB0aHJlYWRlZCBtb2RlLCB0aGlzIGZ1bmN0aW9uIHVubG9jayB0aGUgZGVjb2RpbmcgdGhyZWFkLAotICogICAgICAgICAgd2hpY2ggYWxzbyBjYWxsIHRoZSBleHRlcm5hbCByZW5kZXJpbmcgZnVuY3Rpb24uCi0gKiAgICAgICAgICBFbHNlLCBqdXN0IGNhbGwgZXh0ZXJuYWwgcmVuZGVyaW5nIGZ1bmN0aW9uLCBhbmQgd2FpdHMgZm9yIGl0cwotICogICAgICAgICAgY29tcGxldGlvbi4KLSAqCi0gKiBAcGFyYW0gICBwVlNfQ29udGV4dDogKElOKSAgICAgICBDb250ZXh0IG9mIHRoZSB2aWRlbyBkZWNvZGVyIHNoZWxsCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGVmZmVjdGl2ZWx5IHJlbmRlcmVkIGZyYW1lIChpbiBtcykKLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZTooT1VUKSAgICAgIE91dHB1dCBwbGFuZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGRhdGEgKGNvbnZlcnRlZCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIE5VTEwsIHRoZSByZW5kZXJpbmcgaXMgbWFkZSBieSB0aGUgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCAoaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gY2FuIHJldHVybgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgdG8gcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfcmVuZGVyKE00T1NBX0NvbnRleHQgcFZTX0NvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJGb3JjZVJlbmRlcikKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilwVlNfQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNERFQ09ERVJfRVhURVJOQUxfcmVuZGVyIDogcFRpbWUgPSAlbGYsIGZvcmNlUmVuZGVyOiAlZCAiLCAqcFRpbWUsCi0gICAgICAgICBiRm9yY2VSZW5kZXIpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fVGFyZ2V0UmVuZGVyQ3RzID0gKnBUaW1lOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPdXRwdXRQbGFuZSA9IHBPdXRwdXRQbGFuZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRm9yY2VSZW5kZXIgPSBiRm9yY2VSZW5kZXI7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvciA9IE00Tk9fRVJST1I7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRhdGFSZW5kZXJQZW5kaW5nID0gTTRPU0FfVFJVRTsKLQotICAgIC8qIExhdW5jaCBSZW5kZXIgcHJvY2VzcyBpbiBzeW5jaHJvbm91cyBtb2RlICovCi0gICAgd2hpbGUocFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c1JlbmRlcihwVlNfQ29udGV4dCk7Ci0gICAgICAgIC8qIHJldHVybiBjb2RlIGlzIGlnbm9yZWQsIGl0IGlzIHVzZWQgb25seSBpbiBNNE9TQV9UaHJlYWQgKi8KLSAgICB9Ci0KLQotICAgICpwVGltZSA9IHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnRSZW5kZXJDdHM7Ci0KLQotICAgIGlmIChNNFdBUl9SRU5ERVJfRklOSVNIRUQgPT0gcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvcikKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpUmVuZGVyRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hbGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDYWxsZWQgYnkgdGhlIEhXIHZpZGVvIGRlY29kZXIgdG8gc2lnbmFsIHRoYXQgYSBkZWNvZGluZyBpcwotICogICAgICAgICAgb3ZlcgotICogQG5vdGUgICAgVGhlIGZ1bmN0aW9uIGdldHMgYW5vdGhlciBBVSBpbiB0aGUgaW50ZXJuYWwgQVUgYnVmZmVyLCBhbmQKLSAqICAgICAgICAgIGxhdW5jaGVzIHRoZSBkZWNvZGluZy4KLSAqICAgICAgICAgIElmIG5vIG1vcmUgQVUgYXJlIGF2YWlsYWJsZSwgdGhlIE00REVDT0RFUl9FWFRFUk5BTF9kZWNvZGUKLSAqICAgICAgICAgIChvciBNNERFQ09ERVJfRVhURVJOQUxfcmVuZGVyIGlmIHRocmVhZGVkKSBmdW5jdGlvbiBpcyB1bmxvY2tlZAotICoKLSAqIEBwYXJhbSAgIHBWU19Db250ZXh0OiAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIHZpZGVvIGh3IHNoZWxsCi0gKiBAcGFyYW0gICBhVGltZTogICAgICAgICAgKElOKSAgICB0aW1lIG9mIHRoZSBkZWNvZGVkIGZyYW1lCi0gKiBAcGFyYW0gICBhVXNlckVycm9yICAgICAgKElOKSAgICBlcnJvciBjb2RlIHJldHVybmVkIHRvIHRoZSBWUFMKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfSFdfREVDT0RFUl94eHggICAgQSBmYXRhbCBlcnJvciBvY2N1cmVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfc2lnbmFsRGVjb2Rlck92ZXIoTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSBhVGltZSwgTTRPU0FfRVJSIGFVc2VyRXJyb3IpCi17Ci0gICAgTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPSAoTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCopcFZTX0NvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRERUNPREVSX0VYVEVSTkFMX3NpZ25hbERlY29kZXJPdmVyIDogYVRpbWUgPSAlbGYiLCBhVGltZSk7Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9OYkRlY29kZWRGcmFtZXMrKzsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yID0gYVVzZXJFcnJvcjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50RGVjb2RlQ3RzID0gYVRpbWU7Ci0KLSNpZm5kZWYgTTRERUNPREVSX0VYVEVSTkFMX1NZTkNfRVhUX0RFQ09ERQotICAgIC8qIGdpdmUgY29udHJvbCBiYWNrIHRvIHN0ZXBEZWNvZGUgKi8KLSAgICAvL000c2VtdmFsdWUrKzsKLSAgICAvL3ByaW50ZigiU2VtYXBob3JlIHBvc3Q6ICVkXG4iLCBNNHNlbXZhbHVlKTsKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBTdHJlYW1Db250ZXh0LT5tX1NlbVN5bmMpOwotI2VuZGlmIC8qIG5vdCBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDYWxsZWQgYnkgdGhlIEhXIHZpZGVvIHJlbmRlcmVyIHRvIHNpZ25hbCB0aGF0IGEgcmVuZGVyaW5nIGlzCi0gKiAgICAgICAgICBvdmVyCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24ganVzdCBwb3N0IGEgc2VtYXBob3JlIHRvIHVuYmxvY2sKLSAqICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9yZW5kZXIgZnVuY3Rpb24KLSAqCi0gKiBAcGFyYW0gICBwVlNfQ29udGV4dDogICAgKElOKSAgICBjb250ZXh0IG9mIHRoZSB2aWRlbyBodyBzaGVsbAotICogQHBhcmFtICAgYVRpbWU6ICAgICAgICAgIChJTikgICAgdGltZSBvZiB0aGUgZGVjb2RlZCBmcmFtZQotICogQHBhcmFtICAgYVVzZXJFcnJvciAgICAgIChJTikgICAgZXJyb3IgY29kZSByZXR1cm5lZCB0byB0aGUgVlBTCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0hXX0RFQ09ERVJfeHh4ICAgIEEgZmF0YWwgZXJyb3Igb2NjdXJlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX3NpZ25hbFJlbmRlck92ZXIoTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIGFUaW1lLCBNNE9TQV9FUlIgYVVzZXJFcnJvcikKLXsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilwVlNfQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNERFQ09ERVJfRVhURVJOQUxfc2lnbmFsUmVuZGVyT3ZlciA6IGFUaW1lID0gJWxmIiwgYVRpbWUpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvciA9IGFVc2VyRXJyb3I7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudFJlbmRlckN0cyA9IGFUaW1lOwotCi0jaWZuZGVmIE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUKLSAgICAvKiBnaXZlIGNvbnRyb2wgYmFjayB0byBzdGVwUmVuZGVyICovCi0gICAgLy9NNHNlbXZhbHVlKys7Ci0gICAgLy9wcmludGYoIlNlbWFwaG9yZSBwb3N0OiAlZFxuIiwgTTRzZW12YWx1ZSk7Ci0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwU3RyZWFtQ29udGV4dC0+bV9TZW1TeW5jKTsKLSNlbmRpZiAvKiBub3QgTTRERUNPREVSX0VYVEVSTkFMX1NZTkNfRVhUX0RFQ09ERSAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgdmlkZW8gZGVjb2RlciBzaGVsbC9oYW5kbGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBWU19Db250ZXh0OiAgICAoT1VUKSAgIE91dHB1dCBjb250ZXh0IGFsbG9jYXRlZAotICogQHBhcmFtICAgIHBfSFdJbnRlcmZhY2U6ICAoSU4pICAgIFBvaW50ZXIgb24gdGhlIHNldCBvZiBleHRlcm5hbCBIVyBjb2RlYyBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICBQb2ludGVyIHRvIGEgdmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgIE00Tk9fRVJST1IgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfQUxMT0MgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0luaXQoTTRPU0FfQ29udGV4dCogcFZTX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkRfSW50ZXJmYWNlKiBwX0hXSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00REVDT0RFUl9FWFRFUk5BTF9Jbml0Iik7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgICpwVlNfQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQpLAotICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMLChNNE9TQV9DaGFyICopICJNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0VYVEVSTkFMX0luaXQgOiBlcnJvciwgY2Fubm90IGFsbG9jYXRlIGNvbnRleHQgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogUmVzZXQgaW50ZXJuYWwgY29udGV4dCBzdHJ1Y3R1cmUgKi8KLSAgICAqcFZTX0NvbnRleHQgPSBwU3RyZWFtQ29udGV4dDsKLQotICAgIC8qIC0tLSBSRUFERVIgLS0tICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBNNE9TQV9OVUxMOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JKdW1wID0gTTRPU0FfRkFMU0U7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fbmV4dEFVQ3RzID0gLTE7Ci0KLSAgICAvKiAtLS0gREVDT0RFUiAtLS0gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9EZWNvZGVVcFRvQ3RzID0gLTE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudERlY29kZUN0cyA9IC0xOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX05iRGVjb2RlZEZyYW1lcyA9IDA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9IE00Tk9fRVJST1I7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRhdGFEZWNvZGVQZW5kaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fUHJldmlvdXNEZWNvZGVDdHMgPSAwOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JJc1dhaXROZXh0RGVjb2RlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiAtLS0gUkVOREVSIC0tLSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX1RhcmdldFJlbmRlckN0cyA9IC0xOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnRSZW5kZXJDdHMgPSAtMTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yID0gTTROT19FUlJPUjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRm9yY2VSZW5kZXIgPSBNNE9TQV9UUlVFOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhUmVuZGVyUGVuZGluZyA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogLS0tIFNUUkVBTSBQQVJBTVMgLS0tICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9IChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogLS0tIFZEIEFQSSAtLS0gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9WRF9JbnRlcmZhY2UgPSBwX0hXSW50ZXJmYWNlOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX1ZEX0NvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fVkRfU2lnbmFsaW5nSW50ZXJmYWNlLm1fcFNpZ25hbFRhcmdldCA9IHBTdHJlYW1Db250ZXh0OwotICAgIHBTdHJlYW1Db250ZXh0LT5tX1ZEX1NpZ25hbGluZ0ludGVyZmFjZS5tX3BGY3RTaWduYWxEZWNvZGVyT3ZlciA9Ci0gICAgICAgICBNNERFQ09ERVJfRVhURVJOQUxfc2lnbmFsRGVjb2Rlck92ZXI7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fVkRfU2lnbmFsaW5nSW50ZXJmYWNlLm1fcEZjdFNpZ25hbFJlbmRlck92ZXIgPQotICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX3NpZ25hbFJlbmRlck92ZXI7Ci0KLSAgICAvKiAtLS0gVEhSRUFEIFNUVUZGIC0tLSAqLwotCi0jaWZuZGVmIE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9TZW1TeW5jID0gTTRPU0FfTlVMTDsKLSAgICAvL000c2VtdmFsdWU9MDsKLSAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVPcGVuKCYocFN0cmVhbUNvbnRleHQtPm1fU2VtU3luYyksIDApOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNERFQ09ERVJfRVhURVJOQUxfSW5pdDogY2FuJ3Qgb3BlbiBzeW5jIHNlbWFwaG9yZSAoZXJyIDB4JTA4WCkiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZiAvKiBub3QgTTRERUNPREVSX0VYVEVSTkFMX1NZTkNfRVhUX0RFQ09ERSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBGaWxscyB0aGUgc3RyZWFtIGluZm8gc3RydWN0dXJlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBkZWNvZGVyJ3MgY3JlYXRpb24gdGltZSwKLSAqICAgICAgICAgIGFsbG9jYXRlcyBhbmQgZmlsbHMgdmlkZW8gaW5mbyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcGFyYW0gICBwcFN0cmVhbUluZm8gICAgKE9VVCkgICBWaWRlbyBpbmZvIHN0cnVjdHVyZQotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgUG9pbnRlciB0byBhIHZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX1N0cmVhbURlc2NyaXB0aW9uSW5pdChNNFZEX1N0cmVhbUluZm8qKiBwcFN0cmVhbUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiBwVmlkZW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX1N0cmVhbURlc2NyaXB0aW9uSW5pdCIpOwotCi0gICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotCi0gICAgLyogTTRWRF9TdHJlYW1JbmZvIGFsbG9jYXRpb24gKi8KLSAgICAqcHBTdHJlYW1JbmZvID0gKE00VkRfU3RyZWFtSW5mbyopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZEX1N0cmVhbUluZm8pLAotICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMLCAoTTRPU0FfQ2hhciAqKSJNNFZEX1N0cmVhbUluZm8iKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwcFN0cmVhbUluZm8pCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogaW5pdCB2YWx1ZXMgKi8KLSAgICAoKnBwU3RyZWFtSW5mbyktPmFuSW1hZ2VTaXplLmFXaWR0aCAgPSBwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgKCpwcFN0cmVhbUluZm8pLT5hbkltYWdlU2l6ZS5hSGVpZ2h0ID0gcFZpZGVvU3RyZWFtSGFuZGxlci0+bV92aWRlb0hlaWdodDsKLQotICAgICgqcHBTdHJlYW1JbmZvKS0+ZGVjb2RlckNvbmZpZ3VyYXRpb24ucEJ1ZmZlciA9Ci0gICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgKCpwcFN0cmVhbUluZm8pLT5kZWNvZGVyQ29uZmlndXJhdGlvbi5hU2l6ZSAgID0gcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBJbml0aWFsaXplcyBjdXJyZW50IEFVIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBhdCBkZWNvZGVyJ3MgY3JlYXRpb24gdGltZSB0byBpbml0aWFsaXplCi0gKiAgICAgICAgICBjdXJyZW50IGRlY29kZXIncyBBVS4KLSAqCi0gKiBAcGFyYW0gICBwVlNfQ29udGV4dCAoSU4pICAgIENvbnRleHQgb2YgdGhlIHZpZGVvIGRlY29kZXIgc2hlbGwKLSAqIEBwYXJhbSAgIHBSZWFkZXIgICAgIChJTikgICAgUmVhZGVyIGludGVyZmFjZQotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgKElOKSAgICBBY2Nlc3MgVW5pdCBzdHJ1Y3R1cmUgdXNlZCBidSBkZWNvZGVyCi0gKgotICogQHJldHVybgotICogQHJldHVybgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9TZXRVcFJlYWRJbnB1dChNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqIHBSZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRWU19WaWRlb0RlY29kZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBWU19Db250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00REVDT0RFUl9FWFRFUk5BTF9TZXRVcFJlYWRJbnB1dCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00REVDT0RFUl9FWFRFUk5BTF9TZXRVcFJlYWRJbnB1dDogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlciksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRERUNPREVSX0VYVEVSTkFMX1NldFVwUmVhZElucHV0OiBpbnZhbGlkIHBSZWFkZXIgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQWNjZXNzVW5pdCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNERFQ09ERVJfRVhURVJOQUxfU2V0VXBSZWFkSW5wdXQ6IGludmFsaWQgcEFjY2Vzc1VuaXQgcG9pbnRlciIpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXI7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gMDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgdGhlIG5leHQgQVUgZnJvbSBpbnRlcm5hbCBBVSBidWZmZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8gaGF2ZSBhIGRlY29kZVVwVG8KLSAqICAgICAgICAgIGludGVyZmFjZSB3aXRoIHRoZSBWUFMuCi0gKiAgICAgICAgICBUaGUgQVUgYXJlIHJlYWQgZnJvbSBmaWxlIGJ5IE00REVDT0RFUl9FWFRFUk5BTF9kZWNvZGUgZnVuY3Rpb24KLSAqICAgICAgICAgIGFuZCBzdG9yZWQgaW50byBhIGJ1ZmZlci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseQotICogICAgICAgICAgdG8gZ2V0IHRoZXNlIHN0b3JlZCBBVS4KLSAqCi0gKiBAcGFyYW0gICBwU3RyZWFtQ29udGV4dDogKElOKSAgICAgICAgY29udGV4dCBvZiB0aGUgdmlkZW8gaHcgc2hlbGwKLSAqIEBwYXJhbSAgIG5leHRGcmFtZVRpbWU6ICAoSU4vT1VUKSAgICB0aW1lIG9mIHRoZSBBVQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00V0FSX05PX01PUkVfQVUgICAgTm8gbW9yZSBBVSBpbiBpbnRlcm5hbCBidWZmZXIKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgT25lIGludmFsaWQgcGFyYW1ldGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0dldE5leHRBdShNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvQnVmZmVyICpuZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogbmV4dEZyYW1lVGltZSkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9BY2Nlc3NVbml0KiBwQWNjZXNzVW5pdDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1Iik7Ci0KLSAgICAvKiBDaGVjayBjb250ZXh0IGlzIHZhbGlkICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1IDogZXJyb3IgcFN0cmVhbUNvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIFJlYWQgdGhlIEFVICovCi0gICAgcEFjY2Vzc1VuaXQgPSBwU3RyZWFtQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIGVyciA9IHBTdHJlYW1Db250ZXh0LT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRBdShwU3RyZWFtQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwgcEFjY2Vzc1VuaXQpOwotCi0gICAgaWYoKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkgfHwgKGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1IDogbm8gZGF0YSBhdmFsYWlibGUgMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRERUNPREVSX0VYVEVSTkFMX0dldE5leHRBdSA6IGZpbGVzeXN0ZW0gZXJyb3IgMHgleCIsIGVycik7Ci0KLSAgICAgICAgKm5leHRGcmFtZVRpbWUgICAgICAgICA9IDA7Ci0gICAgICAgIG5leHRCdWZmZXItPnBCdWZmZXIgICAgPSBNNE9TQV9OVUxMOwotICAgICAgICBuZXh0QnVmZmVyLT5idWZmZXJTaXplID0gMDsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEZpbGwgYnVmZmVyICovCi0gICAgKm5leHRGcmFtZVRpbWUgICAgICAgICA9IHBBY2Nlc3NVbml0LT5tX0NUUzsKLSAgICBuZXh0QnVmZmVyLT5wQnVmZmVyICAgID0gKE00T1NBX01lbUFkZHIzMilwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzczsKLSAgICBuZXh0QnVmZmVyLT5idWZmZXJTaXplID0gcEFjY2Vzc1VuaXQtPm1fc2l6ZTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1OiBBVSBvYnRhaW5lZCwgdGltZSBpcyAlZiIsICpuZXh0RnJhbWVUaW1lKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwVlNfQ29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSB2aWRlbyBodyBzaGVsbAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfU3luY2hyb25vdXNEZWNvZGUoTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCkKLXsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilwVlNfQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VkRfVmlkZW9CdWZmZXIgbmV4dEJ1ZmZlcjsKLQotCi0gICAgLyogLS0tLS0gZGVjb2RlIHByb2Nlc3MgLS0tLS0gKi8KLQotICAgIGlmKE00T1NBX1RSVUUgPT0gcFN0cmVhbUNvbnRleHQtPm1fYkRhdGFEZWNvZGVQZW5kaW5nKQotICAgIHsKLSAgICAgICAgLyogVGFyZ2V0ZWQgdGltZSBpcyByZWFjaGVkICovCi0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50RGVjb2RlQ3RzID49IHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZVVwVG9DdHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX1N5bmNocm9ub3VzRGVjb2RlIDpcCi0gICAgICAgICAgICAgICAgIHNraXAgZGVjb2RlIGJlY2F1c2Ugc3luY2hyb25pc2F0aW9uIik7Ci0KLSAgICAgICAgICAgIGlmKHBTdHJlYW1Db250ZXh0LT5tX05iRGVjb2RlZEZyYW1lcyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9IE00V0FSX0RFQ09ERV9GSU5JU0hFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00RVJSX0VYSVQoTTROT19FUlJPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9QcmV2aW91c0RlY29kZUN0cyA9IHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnREZWNvZGVDdHM7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBuZXh0IEFVICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IgPSBNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1KHBTdHJlYW1Db250ZXh0LAotICAgICAgICAgICAgICZuZXh0QnVmZmVyLCAmcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudERlY29kZUN0cyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggTTRXQVJfTk9fTU9SRV9BVSAhPSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNERFQ09ERVJfRVhURVJOQUxfU3luY2hyb25vdXNEZWNvZGUgOlwKLSAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9HZXROZXh0QXUgZXJyb3IgMHgleCIsIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTRFUlJfRVhJVChwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlY29kZSB0aGUgQVUgKi8KLSAgICAgICAgaWYobmV4dEJ1ZmZlci5idWZmZXJTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9Ci0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX1ZEX0ludGVyZmFjZS0+bV9wRmN0U3RlcERlY29kZShwU3RyZWFtQ29udGV4dC0+bV9WRF9Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgJm5leHRCdWZmZXIsIHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnREZWNvZGVDdHMpOwotI2lmbmRlZiBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFCi0gICAgICAgICAgICBpZiAoIChNNE5PX0VSUk9SID09IHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpCi0gICAgICAgICAgICAgICAgLyp8fCAoTTRXQVJfSU9fUEVORElORyA9PSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKSovICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGUgdG8gY29tcGxldGUgKi8KLSAgICAgICAgICAgICAgICAvL000c2VtdmFsdWUtLTsKLSAgICAgICAgICAgICAgICAvL3ByaW50ZigiU2VtYXBob3JlIHdhaXQgMjogJWRcbiIsIE00c2VtdmFsdWUpOwotICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocFN0cmVhbUNvbnRleHQtPm1fU2VtU3luYywgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICAgICAgICAgICAgICAvKiBieSBub3cgdGhlIGFjdHVhbCBtX3VpRGVjb2RlRXJyb3IgaGFzIGJlZW4gc2V0IGJ5IHNpZ25hbERlY29kZSAqLwotICAgICAgICAgICAgfQotI2VuZGlmIC8qIG5vdCBNNERFQ09ERVJfRVhURVJOQUxfU1lOQ19FWFRfREVDT0RFICovCi0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00REVDT0RFUl9FWFRFUk5BTF9TeW5jaHJvbm91c0RlY29kZSA6IEhXIGRlY29kZXIgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKTsKLSAgICAgICAgICAgICAgICBNNEVSUl9FWElUKE00Tk9fRVJST1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRFUlJfRVhJVChNNE5PX0VSUk9SKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0KLS8qIC0tLS0tIFJlbGVhc2UgcmVzb3VyY2VzIGlmIGFuIGVycm9yIG9jY3VyZWQgKi8KLWV4aXRfd2l0aF9lcnJvcjoKLQotICAgIC8qIEFib3J0IGRlY29kaW5nICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRhdGFEZWNvZGVQZW5kaW5nID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZigoTTROT19FUlJPUiA9PSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKSAmJiAoTTROT19FUlJPUiAhPSBlcnIpKQotICAgIHsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9IGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZgotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICAgcFZTX0NvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgdmlkZW8gaHcgc2hlbGwKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c0RlY29kZShNNE9TQV9Db250ZXh0IHBWU19Db250ZXh0KQotewotICAgIE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gKE00VlNfVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBWU19Db250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWRF9WaWRlb0J1ZmZlciBuZXh0QnVmZmVyOwotCi0KLSAgICAvKiAtLS0tLSBkZWNvZGUgcHJvY2VzcyAtLS0tLSAqLwotCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwU3RyZWFtQ29udGV4dC0+bV9iRGF0YURlY29kZVBlbmRpbmcpCi0gICAgewotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9QcmV2aW91c0RlY29kZUN0cyA9IHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnREZWNvZGVDdHM7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBuZXh0IEFVICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IgPSBNNERFQ09ERVJfRVhURVJOQUxfR2V0TmV4dEF1KHBTdHJlYW1Db250ZXh0LAotICAgICAgICAgICAgICZuZXh0QnVmZmVyLCAmcFN0cmVhbUNvbnRleHQtPm1fbmV4dEFVQ3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBNNFdBUl9OT19NT1JFX0FVICE9IHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00REVDT0RFUl9FWFRFUk5BTF9Bc3luY2hyb25vdXNEZWNvZGUgOlwKLSAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9HZXROZXh0QXUgZXJyb3IgMHgleCIsIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9NNHNlbXZhbHVlKys7Ci0gICAgICAgICAgICAvL3ByaW50ZigiU2VtYXBob3JlIHBvc3Q6ICVkXG4iLCBNNHNlbXZhbHVlKTsKLSAgICAgICAgICAgIC8vTTRPU0Ffc2VtYXBob3JlUG9zdChwU3RyZWFtQ29udGV4dC0+bV9TZW1TeW5jKTsKLSAgICAgICAgICAgIE00RVJSX0VYSVQocFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZWNvZGUgdGhlIEFVIGlmIG5lZWRlZCAqLwotICAgICAgICBpZihuZXh0QnVmZmVyLmJ1ZmZlclNpemUgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yID0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fVkRfSW50ZXJmYWNlLT5tX3BGY3RTdGVwRGVjb2RlKHBTdHJlYW1Db250ZXh0LT5tX1ZEX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICZuZXh0QnVmZmVyLCBwU3RyZWFtQ29udGV4dC0+bV9uZXh0QVVDdHNcCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnREZWNvZGVDdHMqLyk7Ci0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00REVDT0RFUl9FWFRFUk5BTF9Bc3luY2hyb25vdXNEZWNvZGUgOiBIVyBkZWNvZGVyIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvcik7Ci0gICAgICAgICAgICAgICAgTTRFUlJfRVhJVChNNE5PX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX2JJc1dhaXROZXh0RGVjb2RlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00RVJSX0VYSVQoTTROT19FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotCi0vKiAtLS0tLSBSZWxlYXNlIHJlc291cmNlcyBpZiBhbiBlcnJvciBvY2N1cmVkICovCi1leGl0X3dpdGhfZXJyb3I6Ci0KLSAgICAvKiBBYm9ydCBkZWNvZGluZyAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhRGVjb2RlUGVuZGluZyA9IE00T1NBX0ZBTFNFOwotCi0gICAgaWYoKE00Tk9fRVJST1IgPT0gcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvcikgJiYgKE00Tk9fRVJST1IgIT0gZXJyKSkKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpRGVjb2RlRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBWU19Db250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHZpZGVvIGh3IHNoZWxsCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9Bc3luY2hyb25vdXNSZW5kZXIoTTRPU0FfQ29udGV4dCBwVlNfQ29udGV4dCkKLXsKLSAgICBNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNFZTX1ZpZGVvRGVjb2Rlcl9Db250ZXh0KilwVlNfQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0KLSAgICAvKiAtLS0tLSBSZW5kZXIgb25lIGZyYW1lIC0tLS0tICovCi0KLSAgICBpZihNNE9TQV9UUlVFID09IHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhUmVuZGVyUGVuZGluZykKLSAgICB7Ci0jaWYgMAotICAgICAgICBpZiAoIXBTdHJlYW1Db250ZXh0LT5tX2JGb3JjZVJlbmRlcikKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0ZWQgdGltZSBpcyByZWFjaGVkICovCi0gICAgICAgICAgICBpZihwU3RyZWFtQ29udGV4dC0+bV9UYXJnZXRSZW5kZXJDdHMgLSBwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50UmVuZGVyQ3RzIDwgMS4wKQotICAgICAgICAgICAgIC8qIHNvbWUgKzAuNSBpc3N1ZXMgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c1JlbmRlciA6XAotICAgICAgICAgICAgICAgICAgICAgc2tpcCByZW5kZXIgYmVjYXVzZSBzeW5jaHJvbmlzYXRpb24iKTsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yID0gTTRXQVJfUkVOREVSX0ZJTklTSEVEOwotCi0gICAgICAgICAgICAgICAgTTRFUlJfRVhJVChNNE5PX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBwU3RyZWFtQ29udGV4dC0+bV91aURlY29kZUVycm9yKQotICAgICAgICAgICAgICAgICYmIChwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50RGVjb2RlQ3RzIFwKLSAgICAgICAgICAgICAgICAgICAgLSBwU3RyZWFtQ29udGV4dC0+bV9DdXJyZW50UmVuZGVyQ3RzIDwgMS4wKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvciA9IE00V0FSX1JFTkRFUl9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBNNEVSUl9FWElUKE00Tk9fRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwU3RyZWFtQ29udGV4dC0+bV9OYkRlY29kZWRGcmFtZXMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRFUlJfRVhJVChNNE5PX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIC8qIFJlbmRlciB0aGUgZnJhbWUgKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudFJlbmRlckN0cyA9IHBTdHJlYW1Db250ZXh0LT5tX0N1cnJlbnREZWNvZGVDdHM7Ci0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvciA9Ci0gICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fVkRfSW50ZXJmYWNlLT5tX3BGY3RTdGVwUmVuZGVyKHBTdHJlYW1Db250ZXh0LT5tX1ZEX0NvbnRleHQsCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPdXRwdXRQbGFuZSwgcFN0cmVhbUNvbnRleHQtPm1fQ3VycmVudFJlbmRlckN0cyk7Ci0jaWZuZGVmIE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUKLSAgICAgICAgaWYgKCAoTTROT19FUlJPUiA9PSBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yKQotICAgICAgICAgICAgLyogfHwgKE00V0FSX0lPX1BFTkRJTkcgPT0gcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvcikgKi8gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3YWl0IGZvciByZW5kZXIgdG8gY29tcGxldGUgKi8KLSAgICAgICAgICAgIC8vTTRzZW12YWx1ZS0tOwotICAgICAgICAgICAgLy9wcmludGYoIlNlbWFwaG9yZSB3YWl0OiAlZFxuIiwgTTRzZW12YWx1ZSk7Ci0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBTdHJlYW1Db250ZXh0LT5tX1NlbVN5bmMsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgICAgICAvKiBieSBub3cgdGhlIGFjdHVhbCBtX3VpUmVuZGVyRXJyb3IgaGFzIGJlZW4gc2V0IGJ5IHNpZ25hbFJlbmRlciAqLwotICAgICAgICB9Ci0jZW5kaWYgLyogbm90IE00REVDT0RFUl9FWFRFUk5BTF9TWU5DX0VYVF9ERUNPREUgKi8KLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBwU3RyZWFtQ29udGV4dC0+bV91aVJlbmRlckVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRERUNPREVSX0VYVEVSTkFMX0FzeW5jaHJvbm91c1JlbmRlciA6IEhXIHJlbmRlciBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhUmVuZGVyUGVuZGluZyA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIExhdW5jaCBpbiBhc3luY2hyb25vdXMgbW9kZSB0aGUgcHJlZGVjb2Rpbmcgb2YgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fTmJEZWNvZGVkRnJhbWVzID0gMDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fdWlEZWNvZGVFcnJvciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhRGVjb2RlUGVuZGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9Bc3luY2hyb25vdXNEZWNvZGUocFZTX0NvbnRleHQpOwotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpUmVuZGVyRXJyb3IgPSBNNFdBUl9SRU5ERVJfRklOSVNIRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLQotLyogLS0tLS0gUmVsZWFzZSByZXNvdXJjZXMgaWYgYW4gZXJyb3Igb2NjdXJlZCAqLwotZXhpdF93aXRoX2Vycm9yOgotCi0gICAgLyogQWJvcnQgdGhlIHJlbmRlcmluZyAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEYXRhUmVuZGVyUGVuZGluZyA9IE00T1NBX0ZBTFNFOwotCi0gICAgaWYoKE00Tk9fRVJST1IgPT0gcFN0cmVhbUNvbnRleHQtPm1fdWlSZW5kZXJFcnJvcikgJiYgKE00Tk9fRVJST1IgIT0gZXJyKSkKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3VpUmVuZGVyRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYwppbmRleCA4ZjAwZDA4Li44ODFkYTgyIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCkBAIC0xMzYsMTYgKzEzNiw2IEBACiAgICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7CiAKICAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0jaWYgMAotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMCxpMzJfZzAwLGkzMl9iMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjEwLGkzMl9nMTAsaTMyX2IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjExLGkzMl9nMTEsaTMyX2IxMSx1MTZfcGl4NCk7Ci0jZWxzZQogICAgICAgICAgICAgLyogKHgseSkgKi8KICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsdTE2X3BpeDEpOwogICAgICAgICAgICAgLyogKHgrMSx5KSAqLwpAQCAtMTU0LDggKzE0NCw2IEBACiAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHUxNl9waXgzKTsKICAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwogICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjExLGkzMl9nMTEsaTMyX3IxMSx1MTZfcGl4NCk7Ci0jZW5kaWYKLSNpZiAxIC8qIFNvbHV0aW9uIHRvIGF2b2lkIGdyZWVuIGVmZmVjdHMgZHVlIHRvIHRyYW5zcGFyZW5jeSAqLwogICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCiAgICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCiAgICAgICAgICAgICB7CkBAIC0xNzcsNyArMTY1LDYgQEAKICAgICAgICAgICAgICAgICBpMzJfYjExID0gMzE7CiAgICAgICAgICAgICAgICAgaTMyX3IxMSA9IDMxOwogICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KICAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7CiAgICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwpAQCAtMjA0LDQ3ICsxOTEsOCBAQAogICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwogICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwogICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotI2lmIDAgLyogVGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGF2b2lkIGdyZWVuIGVmZmVjdHMgZHVlIHRvIHRyYW5zcGFyZW5jeSAtPiBUbyBiZSByZW1vdmVkICovCi0gICAgICAgICAgICBjb3VudF9udWxsID0gNDsKLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX3UwMCA9IDA7Ci0gICAgICAgICAgICAgICAgaTMyX3YwMCA9IDA7Ci0gICAgICAgICAgICAgICAgY291bnRfbnVsbCAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTAgPT0gMCAmJiBpMzJfZzEwID09IDYzICYmIGkzMl9yMTAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfdTEwID0gMDsKLSAgICAgICAgICAgICAgICBpMzJfdjEwID0gMDsKLSAgICAgICAgICAgICAgICBjb3VudF9udWxsIC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl91MDEgPSAwOwotICAgICAgICAgICAgICAgIGkzMl92MDEgPSAwOwotICAgICAgICAgICAgICAgIGNvdW50X251bGwgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjExID09IDAgJiYgaTMyX2cxMSA9PSA2MyAmJiBpMzJfcjExID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX3UxMSA9IDA7Ci0gICAgICAgICAgICAgICAgaTMyX3YxMSA9IDA7Ci0gICAgICAgICAgICAgICAgY291bnRfbnVsbCAtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoY291bnRfbnVsbCA9PSAwKQotICAgICAgICAgICAgewotI2VuZGlmCiAgICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwogICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLSNpZiAwIC8qIFRlbXBvcmFyeSBzb2x1dGlvbiB0byBhdm9pZCBncmVlbiBlZmZlY3RzIGR1ZSB0byB0cmFuc3BhcmVuY3kgLT4gVG8gYmUgcmVtb3ZlZCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgLyBjb3VudF9udWxsKTsKLSAgICAgICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpIC8gY291bnRfbnVsbCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCiAgICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKICAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCmluZGV4IGM5NDM1MTMuLjg3N2RkOTcgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgLyoqCiAgICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KICAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCisgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpLAogICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Iik7CiAgICAgKnBDb250ZXh0ID0gcEM7CiAKQEAgLTE0OCw4ICsxNDgsOCBAQAogICAgIH0KIAogICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwQyAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpLDApOworICAgIG1lbXNldCgodm9pZCAqKXBDICwwLAorICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0KSk7CiAgICAgLyoqCiAgICAgKiBDb3B5IHRoaXMgc2V0dGluZyBpbiBjb250ZXh0ICovCiAgICAgcEMtPmlBZGRDdHMgPSBwU2V0dGluZ3MtPnVpQWRkQ3RzOwpAQCAtMjMyLDkgKzIzMiwxMyBAQAogICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247CiAgICAgLypnSW5wdXRQYXJhbXMubHZCVENoYW5uZWxDb3VudCovCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gKE00T1NBX0ludDMyKUxWQXVkaW9SZXNhbXBsZXJDcmVhdGUoMTYsCisgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgxNiwKICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywKLSAgICAgICAgLyogZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZSovcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOworICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOworICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQorICAgICB7CisgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CisgICAgIH0KICAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAogICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCiAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKQEAgLTU3MCwyNiArNTc0LDI2IEBACiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U3NyY1NjcmF0Y2ggKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5Tc3JjU2NyYXRjaCk7CisgICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKICAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnBTc3JjQnVmZmVySW4pOworICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAogICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFNzcmNCdWZmZXJPdXQpOworICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7CiAgICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUZW1wQnVmZmVyICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFRlbXBCdWZmZXIpOworICAgICAgICBmcmVlKHBDLT5wVGVtcEJ1ZmZlcik7CiAgICAgICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC02MDgsNyArNjEyLDcgQEAKIAogICAgIC8qKgogICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQ29udGV4dCk7CisgICAgZnJlZShwQ29udGV4dCk7CiAgICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwogCiAgICAgLyoqCkBAIC05OTIsNyArOTk2LDcgQEAKICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCiAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfbWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAogICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKIAogICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKQEAgLTEwMDMsNyArMTAwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweShwQy0+ZXdjLnBWaWRlb091dHB1dERzaSwgZW5jSGVhZGVyLT5wQnVmLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKICAgICAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMDczLDcgQEAKICAgICAgICAgICAgICAgICB7CiAKICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+XAorICAgICAgICAgICAgICAgICAgICAgZnJlZShwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+XAogICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgpAQCAtMTQyOSwyNSArMTQzMyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0jaWYgMAotICAgIC8qKgotICAgICogQ29tcHV0ZSB0aGUgdm9sdW1lIGZhY3RvcnMgKi8KLSAgICBpZiggKE00T1NBX1RSVUUKLSAgICAgICAgPT0gcEMtPmJSZW1vdmVPcmlnaW5hbCkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIHJlbW92ZSBvcmlnaW5hbCBjYXNlLCB3ZSBrZWVwIG9ubHkgdGhlIGFkZGVkIGF1ZGlvICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAxLjBGOwotICAgICAgICBwQy0+Zk9yaWdGYWN0b3IgPSAwLjBGOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBmYWN0b3IgdG8gYXBwbHkgdG8gc2FtcGxlIHRvIGRvIHRoZSBtaXhpbmcgKi8KLSAgICAgICAgcEMtPmZBZGRlZEZhY3RvciA9IHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgLyAxMDAuMEY7Ci0gICAgICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEYgLSBwQy0+ZkFkZGVkRmFjdG9yOwotICAgIH0KLSNlbmRpZgogICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCA9PSBNNE9TQV9GQUxTRSkKICAgICB7CiAgICAgICAgIC8qKgpAQCAtMTcwNCw3ICsxNjg5LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCisgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KICAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KICAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgogICAgICAgICAgICAgbV9idWZmZXJTaXplLApAQCAtMTcyMyw3ICsxNzA4LDcgQEAKICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwogICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKKyAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCiAgICAgICAgICAgICAqIHBDLT5ld2MudWlOYkNoYW5uZWxzLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKQEAgLTE3NDEsNyArMTcyNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIFRoZSAiMyIgdmFsdWUgYmVsb3cgc2hvdWxkIGJlIG9wdGltaXplZCAuLi4gb25lIGRheSAuLi4gKi8KICAgICAgICAgICAgIHBDLT5wVGVtcEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dAorICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHBDLT5pU3NyY05iU2FtcGxPdXQKICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+CiAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7CiAKQEAgLTE3NjMsNyArMTc0OCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCiAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MocEMtPm1pbmltdW1CdWZmZXJJbgorICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCiAgICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+CiAgICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KICAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKQEAgLTE3ODEsNyArMTc2Niw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwogICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MoCisgICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKIApAQCAtMTgyNiw3ICsxODExLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCisgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDIgKiBtaW5idWZmZXIsIE00VlNTM0dQUCwKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKIAogICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJJbiApCkBAIC0xOTM1LDggKzE5MjAsOCBAQAogCiAgICAgTTRPU0FfVFJBQ0UyXzAoIkEgIyMjIyBzaWxlbmNlIEFVIik7CiAKLSAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKKyAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwogCiAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KQEAgLTIwMzUsOCArMjAyMCw4IEBACiAKICAgICAvKioKICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKKyAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICh2b2lkICopKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKICAgICAgICAgKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUpKTsKIAogICAgIC8qKgpAQCAtMjY3NSw4ICsyNjYwLDggQEAKIAogICAgIC8qKgogICAgICogQ29weSB0aGUgQVUgaXRzZWxmICovCi0gICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKKyAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCisgICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwogCiAgICAgLyoqCiAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KQEAgLTI3NzgsNTcgKzI3NjMsNiBAQAogICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwogCiAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJLICoqKiogYmxlbmQgQVVzIik7Ci0jaWYgMAotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0NoYXIgZmlsZW5hbWVbMTNdOwotICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwR0lGRmlsZUluRGVidWcgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcyA9IDA7Ci0KLSAgICAgICAgICAgIHNwcmludGYoZmlsZW5hbWUsICJ0b3RvLnBjbSIpOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT5vcGVuV3JpdGUoJnBHSUZGaWxlSW5EZWJ1ZywgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQXBwZW5kKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3Qgb3BlbiBpbnB1dCBnaWYgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBGaWxlLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPnNlZWsocEdJRkZpbGVJbkRlYnVnLCBNNE9TQV9rRmlsZVNlZWtFbmQsCi0gICAgICAgICAgICAgICAgJnBvcyk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IHNlZWsgaW5wdXQgZ2lmIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBwRmlsZSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEdJRkZpbGVJbkRlYnVnLAotICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IHdyaXRlIGlucHV0IGdpZiBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcEZpbGUsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwR0lGRmlsZUluRGVidWcpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBnaWYgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBGaWxlLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2VuZGlmCiAgICAgICAgIC8qKgogICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCiAKQEAgLTI4NTYsNyArMjc5MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKICAgICAgICAgICAgICAgICArIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgTTRPU0FfbWVtbW92ZShwQy0+cFNzcmNCdWZmZXJPdXQsIHRlbXBQb3NCdWZmZXIsCisgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCiAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09CiAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7CkBAIC0yODY0LDcgKzI3OTgsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wU3NyY0J1ZmZlckluLCB0ZW1wUG9zQnVmZmVyLAorICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCiAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwogICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+bWluaW11bUJ1ZmZlckluOwogICAgICAgICB9CkBAIC0yOTUwLDggKzI4ODQsOCBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgKHZvaWQgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCkBAIC0zMTEyLDggKzMwNDYsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyogQ29weSBkZWNvZGVkIGRhdGEgaW50byBTU1JDIGJ1ZmZlciBpbiAqLwotICAgICAgICBNNE9TQV9tZW1jcHkocEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKKyAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwogICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCiAKQEAgLTMxMzQsOCArMzA2OCw4IEBACiAgICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIE00T1NBX21lbXNldChwQy0+cFBvc0luVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMpLDApOworICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCisgICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7CiAKICAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLApAQCAtMzE1OCw3ICszMDkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQogICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wU3NyY0J1ZmZlckluLCB0ZW1wUG9zQnVmZmVyLAorICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCiAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgpAQCAtMzE3MSw4ICszMTA1LDggQEAKICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3NyY0VyciA9IDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscyksMCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsMCwKKyAgICAgICAgICAgICAgICAgICAgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMpKTsKIAogICAgICAgICAgICAgICAgIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KChzaG9ydCopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCiAgICAgICAgICAgICAgICAgICAgIChzaG9ydCopcEMtPnBTc3JjQnVmZmVySW4sCkBAIC0zMTkzLDcgKzMxMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiArIChwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCiAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIE00T1NBX21lbW1vdmUocEMtPnBTc3JjQnVmZmVySW4sIHRlbXBQb3NCdWZmZXIsCisgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+CkBAIC0zMjIwLDcgKzMxNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+CiAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgIHVpTmJDaGFubmVscyk7IC8qIEJ1ZmZlciBpcyBpbiBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wVGVtcEJ1ZmZlciwgdGVtcFBvc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KICAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCkBAIC0zMjQyLDcgKzMxNzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQogICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+CiAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wVGVtcEJ1ZmZlciwgdGVtcFBvc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KICAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCkBAIC0zMjc4LDcgKzMyMTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+CiAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgIHVpTmJDaGFubmVscyk7IC8qIEJ1ZmZlciBpcyBpbiBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wU3NyY0J1ZmZlckluLCB0ZW1wUG9zQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPQogICAgICAgICAgICAgICAgICAgICAgICAgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKQEAgLTMzMDAsNyArMzIzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbW1vdmUocEMtPnBTc3JjQnVmZmVySW4sIHRlbXBQb3NCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09CiAgICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQpAQCAtMzY0OSw3ICszNTgzLDcgQEAKICAgICB7CiAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKICAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIE00T1NBX21lbW1vdmUocEMtPnBTc3JjQnVmZmVyT3V0LCB0ZW1wUG9zQnVmZmVyLAorICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCiAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwogICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtPQogICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7CkBAIC0zNjU5LDcgKzM1OTMsNyBAQAogICAgIHsKICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCiAgICAgICAgICAgICArIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBNNE9TQV9tZW1tb3ZlKHBDLT5wU3NyY0J1ZmZlckluLCB0ZW1wUG9zQnVmZmVyLAorICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPQogICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKaW5kZXggMGEzYjczNy4uZDliNmViNSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcC5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpAQCAtOTMsNyArOTMsNyBAQAogICAgIC8qKgogICAgICogQWxsb2NhdGUgdGhlIGNsaXAgY29udGV4dCAqLwogICAgICpoQ2xpcEN0eHQgPQotICAgICAgICAoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpLAorICAgICAgICAoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpLAogICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIk00VlNTM0dQUF9DbGlwQ29udGV4dCIpOwogCiAgICAgaWYoIE00T1NBX05VTEwgPT0gKmhDbGlwQ3R4dCApCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwogCiAgICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQsIHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpLCAwKTsKKyAgICBtZW1zZXQoKHZvaWQgKilwQ2xpcEN0eHQsIDAsc2l6ZW9mKE00VlNTM0dQUF9DbGlwQ29udGV4dCkpOwogCiAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MgPSBNNE9TQV9OVUxMOwogCkBAIC0yNjYsMzcgKzI2NiwzNyBAQAogCiAKIAotICAgICAgICBNNE9TQV9jaHJOQ29weShwVGVtcEZpbGUscENsaXBTZXR0aW5ncy0+cEZpbGUsTTRPU0FfY2hyTGVuZ3RoKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7CisgICAgICAgIE00T1NBX2Nock5Db3B5KHBUZW1wRmlsZSxwQ2xpcFNldHRpbmdzLT5wRmlsZSxzdHJsZW4ocENsaXBTZXR0aW5ncy0+cEZpbGUpKTsKIAogCiAgICAgc3dpdGNoIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSkKICAgICB7CiAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgTTRPU0FfY2hyTkNhdChwVGVtcEZpbGUsKE00T1NBX0NoYXIgKikiXzgwMDAiLDYpOworICAgICAgICBzdHJuY2F0KChjaGFyICopcFRlbXBGaWxlLChjb25zdCBjaGFyICopIl84MDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8xMTAyNSIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzExMDI1Iiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8xMjAwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzEyMDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8xNjAwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzE2MDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8yMjA1MCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzIyMDUwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8yNDAwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzI0MDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl8zMjAwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzMyMDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl80NDEwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzQ0MTAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIE00T1NBX2Nock5DYXQocFRlbXBGaWxlLChNNE9TQV9DaGFyICopIl80ODAwMCIsNik7CisgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzQ4MDAwIiw2KTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBpbnZhbGlkIGlucHV0IGZvciBCRyB0cmFja3NhbXBsaW5nIFwKQEAgLTMxMiwxMCArMzEyLDEwIEBACiAgICAgICAgIHN3aXRjaChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKQogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNhdChwVGVtcEZpbGUsKE00T1NBX0NoYXIgKikiXzEucGNtIiw2KTsKKyAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopcFRlbXBGaWxlLChjb25zdCBjaGFyICopIl8xLnBjbSIsNik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ2F0KHBUZW1wRmlsZSwoTTRPU0FfQ2hhciAqKSJfMi5wY20iLDYpOworICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilwVGVtcEZpbGUsKGNvbnN0IGNoYXIgKikiXzIucGNtIiw2KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IGludmFsaWQgaW5wdXQgZm9yIEJHIHRyYWNrIG5vLlwKQEAgLTY4Niw3ICs2ODYsNyBAQAogICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lID0gKE00T1NBX1VJbnQzMilpRHVyYXRpb247CiAgICAgfQogCi0gICAgcENsaXBDdHh0LT5pRW5kVGltZSA9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWU7CisgICAgcENsaXBDdHh0LT5pRW5kVGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwogCiAgICAgLyoqCiAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwpAQCAtNzE5LDcgKzcxOSw3IEBACiAgICAgICBmcmFtZSBldmVudHVhbGx5KSovCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOworICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7CiAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCiAgICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfbWFsbG9jKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCisgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKICAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAogICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwogCkBAIC0xMzc1LDcgKzEzNzUsNyBAQAogICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQogICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCiAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAogICAgICAgICAgICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAiQXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplIik7CkBAIC0xMzkwLDE2ICsxMzkwLDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBGaWxsIGl0IHdpdGggMCAoPSBwY20gc2lsZW5jZSkgKi8KLSAgICAgICAgTTRPU0FfbWVtc2V0KHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAqIHNpemVvZihNNE9TQV9JbnQxNiksIDApOworICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCisgICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKICAgICB9CiAgICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCiAgICAgewogICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7CiAKLSAgICAgICAgTTRPU0FfbWVtY3B5KHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzLCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9idWZmZXJTaXplKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAorICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7CiAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKICAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KQEAgLTE2NTUsNyArMTY1NSw3IEBACiAgICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKKyAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwogICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMTc1MCw3ICsxNzUwLDcgQEAKICAgICAqIEZyZWUgdGhlIGRlY29kZWQgYXVkaW8gYnVmZmVyICovCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOworICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7CiAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0xODEyLDkyICsxODEyLDExIEBACiAgICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwogICAgIC8qKgogICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDbGlwQ3R4dCk7CisgICAgZnJlZShwQ2xpcEN0eHQpOwogCiAgICAgcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi1NNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRDbGlwUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpzaGVsbEludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlIG5hdGl2ZVR5cGU7Ci0gICAgTTRERUNPREVSX0VYVEVSTkFMX1VzZXJEYXRhVHlwZSBzaGVsbFVzZXJEYXRhOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VkRfa01wZWc0VmlkZW9EZWM6Ci0gICAgICAgIGNhc2UgTTRWRF9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgbmF0aXZlVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VkRfa0gyNjRWaWRlb0RlYzoKLSAgICAgICAgICAgIG5hdGl2ZVR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyOiB1bmtub3duIGRlY29kZXJUeXBlICVkIiwKLSAgICAgICAgICAgICAgICBkZWNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc2hlbGxVc2VyRGF0YSA9Ci0gICAgICAgIChNNERFQ09ERVJfRVhURVJOQUxfVXNlckRhdGFUeXBlKU00T1NBX21hbGxvYyhzaXplb2YoKnNoZWxsVXNlckRhdGEpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInVzZXJEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGV4dGVybmFsIHNoZWxsIGRlY29kZXIiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHNoZWxsVXNlckRhdGEgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgIGZhaWxlZCB0byBhbGxvY2F0ZSB1c2VyRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBleHRlcm5hbCBzaGVsbCBkZWNvZGVyIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBzaGVsbFVzZXJEYXRhLT5leHRlcm5hbEZ1bmNzID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgc2hlbGxVc2VyRGF0YS0+ZXh0ZXJuYWxVc2VyRGF0YSA9IHBVc2VyRGF0YTsKLQotICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9nZXRJbnRlcmZhY2UoJnNoZWxsSW50ZXJmYWNlKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX2dldEludGVyZmFjZSBmYWlsZWQgd2l0aCBlcnJvciAweCUwOFgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsVXNlckRhdGEpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigmKHBDbGlwQ3R4dC0+U2hlbGxBUEkpLCBuYXRpdmVUeXBlLAotICAgICAgICBzaGVsbEludGVyZmFjZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAweCUwOFgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsSW50ZXJmYWNlKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXNoZWxsVXNlckRhdGEpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtuYXRpdmVUeXBlXSA9Ci0gICAgICAgIHNoZWxsVXNlckRhdGE7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKaW5kZXggOTdlM2U4OS4uM2RlMTMyMiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwogICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwogCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCkgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCwKLSAgICAgICAgc2l6ZW9mKHBDbGlwUHJvcGVydGllcy0+ZnR5cCksIDApOworICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCisgICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKIAogICAgIC8qKgogICAgICogVmlkZW8gQW5hbHlzaXMgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKaW5kZXggNmE1MjNjNy4uYWFhNjIxZSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCiAjZW5kaWYKIAotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOworICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKICNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKIAogICAgICAgICB9CkBAIC0yNzcsNyArMjc3LDcgQEAKIAogICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOworICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwogICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgLyoKQEAgLTM4NSw4ICszODUsNyBAQAogCiAjZW5kaWYKIAotICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7CiAjaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCiAKICAgICAgICAgfQpAQCAtMzk3LDggKzM5Niw3IEBACiAgICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KICAgICAgICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7CiAgICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAjZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwpAQCAtNDQ3LDEyICs0NDUsMTIgQEAKICAgICB9CiAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKKyAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwogICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwogCiAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKKyAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKICAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC00ODcsMTMgKzQ4NSwxMyBAQAogICAgIHsKICAgICAgICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzKTsKKyAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyk7CiAgICAgICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzKTsKKyAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwogICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtNTMyLDcgKzUzMCw3IEBACiAKICNlbmRpZgogCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKICNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKIAogICAgICAgICAgICAgfQpAQCAtNTU3LDcgKzU1NSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwogICAgICAgICAgICAgICAgIH0KICNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKIApAQCAtNTk1LDEzICs1OTMsMTMgQEAKICAgICB7CiAgICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldKTsKKyAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0pOwogICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYoIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7CiAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtNjQxLDcgKzYzOSw3IEBACiAKICNlbmRpZgogCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldKTsKICNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKIAogICAgICAgICAgICAgfQpAQCAtNjQ5LDIwICs2NDcsNiBAQAogI2VuZGlmCiAKICAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpZiAwIC8qIFRoaXMgaXMgdG8gYXZvaWQgZnJlZWluZyBPTVggY29yZSBjb250ZXh0LCBwYXNzZWQgYXMgdXNlciBkYXRhICovCi0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICAvKiB0aGVyZSBvdWdodCB0byBiZSBhIGJldHRlciBwYXR0ZXJuLi4uIHJpZ2h0PyAqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KIAogICAgICAgICB9CiAgICAgfQpAQCAtNjgxLDcgKzY2NSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0pOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXQuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXQuYwppbmRleCBkNDk1MTg2Li5lZmRkYTliIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCkBAIC0xMzMsMTEgKzEzMywxMSBAQAogICAgIC8qKgogICAgICogQWxsb2NhdGUgdGhlIFZTUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KICAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpLAorICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpLAogICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIk00VlNTM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKICAgICAqcENvbnRleHQgPSBwQzsKICAgICAgICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwQywgc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KSwgMCk7CisgICAgbWVtc2V0KCh2b2lkICopcEMsIDAsc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KSk7CiAKICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCiAgICAgewpAQCAtMTkwLDI0ICsxOTAsNiBAQAogICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7CiAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7CiAKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRWRF9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tpXS5wVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tpXS5yZWdpc3RlcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00VlNTM0dQUF9rQ29kZWNUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fY29kZWNJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwQy0+cE9NWFVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MgKi8KICAgICAvKgogICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwogCkBAIC0yMjksNiArMjExLDkgQEAKIAogICAgIHBDLT5iSXNNTVMgPSBNNE9TQV9GQUxTRTsKIAorICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gMDsKKyAgICBwQy0+YkVuY29kZVRpbGxFb0YgPSBNNE9TQV9GQUxTRTsKKwogICAgIC8qKgogICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7CkBAIC0yNzUsMTEgKzI2MCwxMSBAQAogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQogICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfbWFsbG9jKE00T1NBX2Nockxlbmd0aChwRmlsZSkrMSwgTTRWU1MzR1BQLAorICAgICAgICAvL3BDbGlwU2V0dGluZ3MtPnBGaWxlID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBGaWxlKSsxLCBNNFZTUzNHUFAsCiAgICAgICAgIC8vICJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwogICAgICAgICAvKkZCOiBhZGQgY2xpcCBwYXRoIHNpemUgYmVjYXVzZSBvZiB1dGYgMTYgY29udmVyc2lvbiovCiAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGZpbGVQYXRoU2l6ZSArIDEsIE00VlNTM0dQUCwKKyAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZpbGVQYXRoU2l6ZSArIDEsIE00VlNTM0dQUCwKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBDbGlwU2V0dGluZ3MtPnBGaWxlIik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQpAQCAtMjg4LDkgKzI3Myw5IEBACiAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICB9Ci0gICAgICAgIC8vTTRPU0FfbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgTTRPU0FfY2hyTGVuZ3RoKHBGaWxlKSsxKTsKKyAgICAgICAgLy9tZW1jcHkocENsaXBTZXR0aW5ncy0+cEZpbGUsIHBGaWxlLCBzdHJsZW4ocEZpbGUpKzEpOwogICAgICAgICAvKkZCOiBhZGQgY2xpcCBwYXRoIHNpemUgYmVjYXVzZSBvZiB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIE00T1NBX21lbWNweShwQ2xpcFNldHRpbmdzLT5wRmlsZSwgcEZpbGUsIGZpbGVQYXRoU2l6ZSArIDEpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7CiAgICAgfQogCiAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCkBAIC0zNzIsMTkgKzM1NywxOSBAQAogICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NPcmlnIGlzIE5VTEwiKTsKIAogICAgIC8qIENvcHkgcGxhaW4gc3RydWN0dXJlICovCi0gICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwU2V0dGluZ3NPcmlnLCBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOworICAgIG1lbWNweSgodm9pZCAqKXBDbGlwU2V0dGluZ3NEZXN0LAorICAgICAgICAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLCBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOwogCiAgICAgLyogRHVwbGljYXRlIGZpbGVuYW1lICovCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5nc09yaWctPnBGaWxlICkKICAgICB7CiAgICAgICAgIC8vcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgLy8gKE00T1NBX0NoYXIqKSBNNE9TQV9tYWxsb2MoTTRPU0FfY2hyTGVuZ3RoKHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSkrMSwgTTRWU1MzR1BQLAorICAgICAgICAvLyAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxLCBNNFZTUzNHUFAsCiAgICAgICAgIC8vICJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKICAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCiAgICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCiAgICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKU00T1NBX21hbGxvYyhwQ2xpcFNldHRpbmdzT3JpZy0+ZmlsZVBhdGhTaXplICsgMSwKKyAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAogICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKIAogICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQpAQCAtMzk0LDUzICszNzksMTYgQEAKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQogICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLy9NNE9TQV9tZW1jcHkocENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCBwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUsCi0gICAgICAgIC8vIE00T1NBX2Nockxlbmd0aChwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEpOworICAgICAgICAvL21lbWNweShwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUsIHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKKyAgICAgICAgLy8gc3RybGVuKHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSkrMSk7CiAgICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCi0gICAgICAgIE00T1NBX21lbWNweShwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUsIHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwogICAgICAgICAoIChNNE9TQV9DaGFyCiAgICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwogICAgIH0KIAogICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0jaWYgMAotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gYkNvcHlFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcFNldHRpbmdzT3JpZy0+bmJFZmZlY3RzID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LT5FZmZlY3RzID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgKiBwQ2xpcFNldHRpbmdzT3JpZy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgInBDbGlwU2V0dGluZ3NEZXN0LT5FZmZlY3RzIik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0LT5FZmZlY3RzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBlZmZlY3RzLCBuYj0lbHUiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzT3JpZy0+bmJFZmZlY3RzKTsKLSAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdC0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcENsaXBTZXR0aW5nc09yaWctPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IHBsYWluIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSAmKHBDbGlwU2V0dGluZ3NEZXN0LT5FZmZlY3RzW3VpRnhdKSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSAmKHBDbGlwU2V0dGluZ3NPcmlnLT5FZmZlY3RzW3VpRnhdKSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdC0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0jZW5kaWYgLyogUkMgKi8KICAgICAvKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwogCiAgICAgTTRPU0FfVFJBQ0UzXzAoCkBAIC00NzAsMTQgKzQxOCwxNCBAQAogICAgIC8qIGZyZWUgZmlsZW5hbWUgKi8KICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcFNldHRpbmdzLT5wRmlsZSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENsaXBTZXR0aW5ncy0+cEZpbGUpOworICAgICAgICBmcmVlKHBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIC8qIGZyZWUgZWZmZWN0cyBzZXR0aW5ncyAqLwogICAgIC8qICAgIGlmKE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+RWZmZWN0cykKICAgICB7Ci0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpOworICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7CiAgICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7CiAgICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKICAgICB9IFJDICovCkBAIC01NDgsNyArNDk2LDcgQEAKICAgICAvKioKICAgICAqIENvcHkgdGhlIGNsaXAgbGlzdCAqLwogICAgIHBDLT5wQ2xpcExpc3QgPQotICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykKKyAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpCiAgICAgICAgICogcEMtPnVpQ2xpcE51bWJlciwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cENsaXBMaXN0Iik7CiAKICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cENsaXBMaXN0ICkKQEAgLTU3Myw3ICs1MjEsNyBAQAogICAgIHsKICAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwogICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAorICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAogICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCkBAIC01ODUsMTUgKzUzMywxNSBAQAogCiAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkgJihwQy0+cEVmZmVjdHNMaXN0W2ldKSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpICYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHBDLT5wRWZmZWN0c0xpc3RbaV0pLAorICAgICAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0IFJDICovCiAgICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAorICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAogICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0Iik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCApCkBAIC02MDYsNyArNTU0LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgKi8KICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAorICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAogICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0Iik7CiAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKQogICAgICAgICB7CkBAIC03MTQsNyArNjYyLDcgQEAKICAgICAqIFdlIGFkZCBhIHRyYW5zaXRpb24gb2YgZHVyYXRpb24gMCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGNsaXAuCiAgICAgKiBJdCB3aWxsIHN1cHByZXNzIGEgd2hvbGUgYnVuY2ggYSB0ZXN0IGxhdHRlciBpbiB0aGUgcHJvY2Vzc2luZy4uLiAqLwogICAgIHBDLT5wVHJhbnNpdGlvbkxpc3QgPSAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykKKyAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpCiAgICAgICAgICogKHBDLT51aUNsaXBOdW1iZXIpLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wVHJhbnNpdGlvbkxpc3QiKTsKIAogICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wVHJhbnNpdGlvbkxpc3QgKQpAQCAtNzI4LDggKzY3Niw4IEBACiAgICAgLyoqPCBjb3B5IHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KICAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBUcmFuc2l0aW9uTGlzdFtpXSksCisgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAogICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKICAgICB9CiAKQEAgLTExNDEsNyArMTA4OSw3IEBACiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpbXAzdGFnQnVmZmVyLm1fcERhdGEpOworICAgICAgICAgICAgZnJlZShtcDN0YWdCdWZmZXIubV9wRGF0YSk7CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwpAQCAtMTQyNyw3ICsxMzc1LDcgQEAKICAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kpOworICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMTQzNSw3ICsxMzgzLDcgQEAKICAgICAqIEZyZWUgdGhlIG91dHB1dCBhdWRpbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOworICAgICAgICBmcmVlKHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpKTsKICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMTQ4NSw3NSArMTQzMyw3NSBAQAogICAgICogRnJlZSB0aGUgdGVtcG9yYXJ5IFlVViBwbGFuZXMgKi8KICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVswXS5wYWNfZGF0YSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnl1djFbMF0ucGFjX2RhdGEpOworICAgICAgICBmcmVlKHBDLT55dXYxWzBdLnBhY19kYXRhKTsKICAgICAgICAgcEMtPnl1djFbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzFdLnBhY19kYXRhICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+eXV2MVsxXS5wYWNfZGF0YSk7CisgICAgICAgIGZyZWUocEMtPnl1djFbMV0ucGFjX2RhdGEpOwogICAgICAgICBwQy0+eXV2MVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMl0ucGFjX2RhdGEgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT55dXYxWzJdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShwQy0+eXV2MVsyXS5wYWNfZGF0YSk7CiAgICAgICAgIHBDLT55dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlswXS5wYWNfZGF0YSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnl1djJbMF0ucGFjX2RhdGEpOworICAgICAgICBmcmVlKHBDLT55dXYyWzBdLnBhY19kYXRhKTsKICAgICAgICAgcEMtPnl1djJbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzFdLnBhY19kYXRhICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+eXV2MlsxXS5wYWNfZGF0YSk7CisgICAgICAgIGZyZWUocEMtPnl1djJbMV0ucGFjX2RhdGEpOwogICAgICAgICBwQy0+eXV2MlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMl0ucGFjX2RhdGEgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT55dXYyWzJdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShwQy0+eXV2MlsyXS5wYWNfZGF0YSk7CiAgICAgICAgIHBDLT55dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICAvKiBSQyAqLwogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzBdLnBhY19kYXRhICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+eXV2M1swXS5wYWNfZGF0YSk7CisgICAgICAgIGZyZWUocEMtPnl1djNbMF0ucGFjX2RhdGEpOwogICAgICAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgfQogCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMV0ucGFjX2RhdGEgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT55dXYzWzFdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShwQy0+eXV2M1sxXS5wYWNfZGF0YSk7CiAgICAgICAgIHBDLT55dXYzWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1syXS5wYWNfZGF0YSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnl1djNbMl0ucGFjX2RhdGEpOworICAgICAgICBmcmVlKHBDLT55dXYzWzJdLnBhY19kYXRhKTsKICAgICAgICAgcEMtPnl1djNbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIC8qIFJDICovCiAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMF0ucGFjX2RhdGEgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT55dXY0WzBdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShwQy0+eXV2NFswXS5wYWNfZGF0YSk7CiAgICAgICAgIHBDLT55dXY0WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICB9CiAKICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsxXS5wYWNfZGF0YSApCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPnl1djRbMV0ucGFjX2RhdGEpOworICAgICAgICBmcmVlKHBDLT55dXY0WzFdLnBhY19kYXRhKTsKICAgICAgICAgcEMtPnl1djRbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgIH0KIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzJdLnBhY19kYXRhICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+eXV2NFsyXS5wYWNfZGF0YSk7CisgICAgICAgIGZyZWUocEMtPnl1djRbMl0ucGFjX2RhdGEpOwogICAgICAgICBwQy0+eXV2NFsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0xNTYxLDcgKzE1MDksNyBAQAogICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KICAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cEVmZmVjdHNMaXN0KTsKKyAgICAgICAgZnJlZShwQy0+cEVmZmVjdHNMaXN0KTsKICAgICAgICAgcEMtPnBFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0xNTY5LDE0ICsxNTE3LDE0IEBACiAgICAgKiBSQyBGcmVlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgKi8KICAgICBpZiggcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0KTsKKyAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0KTsKICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7CiAgICAgfQogICAgIC8qKgogICAgICAqICBGcmVlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgKi8KICAgICBpZihwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKKyAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSk7CiAgICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgLyoqCkBAIC0xNjM4LDcgKzE1ODYsNyBAQAogICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5ld2MucER1bW15QXVCdWZmZXIpOworICAgICAgICBmcmVlKHBDLT5ld2MucER1bW15QXVCdWZmZXIpOwogICAgICAgICBwQy0+ZXdjLnBEdW1teUF1QnVmZmVyID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTE2ODQsNyArMTYzMiw3IEBACiAKICAgICAvKioKICAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQyk7CisgICAgZnJlZShwQyk7CiAgICAgcEMgPSBNNE9TQV9OVUxMOwogCiAgICAgLyoqCkBAIC0xNjkzLDExOSArMTY0MSw2IEBACiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CiAKLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSApCi17Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICAvKiBIZXJlIHRoZSBzaXR1YXRpb24gaXMgYSBiaXQgc3BlY2lhbDogd2UgbmVlZCB0byByZWNvcmQgdGhlIHJlZ2lzdHJhdGlvbnMgdGhhdCBhcmUgbWFkZSwKLSAgICBzbyB0aGF0IHdlIGNhbiByZXBsYXkgdGhlbSBmb3IgZWFjaCBjbGlwIHdlIGNyZWF0ZS4gKi8KLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNFZEX2tWaWRlb1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tkZWNvZGVyVHlwZV0ucERlY29kZXJJbnRlcmZhY2UKLSAgICAgICAgPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tkZWNvZGVyVHlwZV0ucFVzZXJEYXRhID0gcFVzZXJEYXRhOwotICAgIHBDLT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2RlY29kZXJUeXBlXS5yZWdpc3RlcmVkID0gTTRPU0FfVFJVRTsKLQotICAgIC8qIE5vdGljZSBpdCBvdmVyd3JpdGVzIGFueSBIVyBkZWNvZGVyIHRoYXQgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZTsKLSAgICB0aGlzIGlzIG5vcm1hbC4qLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLX0KLQotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdFJlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFX0VuY29kZXJUeXBlIGVuY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfSW50ZXJmYWNlICpwRW5jb2RlckludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwVXNlckRhdGEgKQotewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9FTkNPREVSUwotCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqc2hlbGxJbnRlcmZhY2U7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCBuYXRpdmVUeXBlOwotCi0gICAgc3dpdGNoKCBlbmNvZGVyVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VkVfa0gyNjNWaWRlb0VuYzoKLSAgICAgICAgICAgIGVyciA9IE00RUdFX0gyNjNfZ2V0SW50ZXJmYWNlcygmbmF0aXZlVHlwZSwgJnNoZWxsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZFX2tNcGVnNFZpZGVvRW5jOgotICAgICAgICAgICAgZXJyID0gTTRFR0VfTVBFRzRfZ2V0SW50ZXJmYWNlcygmbmF0aXZlVHlwZSwgJnNoZWxsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWRV9rSDI2NFZpZGVvRW5jOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgSDI2NCBlbmNvZGVyIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyOiB1bmtub3duIGVuY29kZXJUeXBlICVkIiwKLSAgICAgICAgICAgICAgICBlbmNvZGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBNNEVHRV9nZXRJbnRlcmZhY2UgZmFpbGVkIHdpdGggZXJyb3IgMHglMDhYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCYocEMtPlNoZWxsQVBJKSwgbmF0aXZlVHlwZSwKLSAgICAgICAgc2hlbGxJbnRlcmZhY2UpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIgZmFpbGVkIHdpdGggZXJyb3IgMHglMDhYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilzaGVsbEludGVyZmFjZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW25hdGl2ZVR5cGVdID0gcEVuY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW25hdGl2ZVR5cGVdID0gcFVzZXJEYXRhOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0jZW5kaWYKLQotfQotCiAjaWZkZWYgV0lOMzIKIC8qKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjExMCw4MyArMTk0NSw2IEBACiAgICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gcENsaXAtPnVpRW5kQ3V0VGltZSAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKICAgICB9CiAKLSAgICBpZiggTTRWSURFT0VESVRJTkdfa01QMyAhPSBwQ2xpcC0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0jaWYgMCAvKlJDKi8KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLQotICAgICAgICBmb3IgKCB1aUZ4ID0gMDsgdWlGeCA8IHBDbGlwLT5uYkVmZmVjdHM7IHVpRngrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocENsaXAtPkVmZmVjdHNbdWlGeF0pOyAvKio8IHNob3J0Y3V0ICovCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBObyBlZmZlY3QgY2FzZXMgKi8KLSAgICAgICAgICAgIGlmKCAwID09IHBGeC0+dWlEdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lOwotICAgICAgICAgICAgICAgIHBGeC0+QXVkaW9FZmZlY3RUeXBlID0gTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoICggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSA9PSBwRngtPlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfTm9uZSA9PSBwRngtPkF1ZGlvRWZmZWN0VHlwZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBGeC0+dWlTdGFydFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIHBGeC0+dWlEdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGFsbCB0aGUgZWZmZWN0cyBpbnRvIG1pZGRsZSBlZmZlY3RzLCBjb21wdXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICogc3RhcnQgdGltZSBhbmQgZHVyYXRpb24gKi8KLSAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0VmZmVjdEtpbmRfQmVnaW4gPT0gcEZ4LT5FZmZlY3RLaW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRngtPnVpU3RhcnRUaW1lID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VlNTM0dQUF9rRWZmZWN0S2luZF9FbmQgPT0gcEZ4LT5FZmZlY3RLaW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIER1cmF0aW9uIHNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgICAgIGlmKCBwRngtPnVpRHVyYXRpb24gPiB1aUNsaXBBY3R1YWxEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwRngtPnVpRHVyYXRpb24gPSB1aUNsaXBBY3R1YWxEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTdGFydCB0aW1lIGNvbXB1dGluZyAqLwotICAgICAgICAgICAgICAgIHBGeC0+dWlTdGFydFRpbWUgPSB1aUNsaXBBY3R1YWxEdXJhdGlvbiAtIHBGeC0+dWlEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VlNTM0dQUF9rRWZmZWN0S2luZF9NaWRkbGUgPT0gcEZ4LT5FZmZlY3RLaW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIER1cmF0aW9uIHNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgICAgIGlmKCBwRngtPnVpRHVyYXRpb24gKyBwRngtPnVpU3RhcnRUaW1lID4gdWlDbGlwQWN0dWFsRHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEZ4LT51aUR1cmF0aW9uID0gdWlDbGlwQWN0dWFsRHVyYXRpb24gLSBwRngtPnVpU3RhcnRUaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogdW5rbm93biBlZmZlY3Qga2luZCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIiwKLSAgICAgICAgICAgICAgICAgICAgcEZ4LT5FZmZlY3RLaW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgZXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHNldCAqLwotICAgICAgICAgICAgaWYoICggcEZ4LT5WaWRlb0VmZmVjdFR5cGUgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcEZ4LT5FeHRWaWRlb0VmZmVjdEZjdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrOlwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQogICAgIHJldHVybiBNNE5PX0VSUk9SOwogfQogCkBAIC0yMjYwLDcgKzIwMTgsNyBAQAogICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSkpOwogICAgICAgICB9CiAKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5wQ2xpcExpc3QpOworICAgICAgICBmcmVlKHBDLT5wQ2xpcExpc3QpOwogICAgICAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTIyNjgsNyArMjAyNiw3IEBACiAgICAgKiBGcmVlIHRoZSB0cmFuc2l0aW9uIGxpc3QgKi8KICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+cFRyYW5zaXRpb25MaXN0KTsKKyAgICAgICAgZnJlZShwQy0+cFRyYW5zaXRpb25MaXN0KTsKICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7CiAgICAgfQogfQpAQCAtMjczMiw3ICsyNDkwLDcgQEAKICAgICAgICAgKiBIMjYzIG91dHB1dCBEU0kgaXMgYWx3YXlzIDcgYnl0ZXMgKi8KICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDc7CiAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MocEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSwKKyAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSwKICAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjMpIik7CiAKICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQpAQCAtMjkzMiw3ICsyNjkwLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MoCisgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChNUEVHNCkiKTsKIApAQCAtMjk0NSw4ICsyNzAzLDggQEAKICAgICAgICAgfQogICAgICAgICBwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplID0KICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcFN0cmVhbUZvckRzaS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBTdHJlYW1Gb3JEc2ktPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLAorICAgICAgICAgICAgKHZvaWQgKilwU3RyZWFtRm9yRHNpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAogICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSk7CiAKICAgICAgICAgLyoqCkBAIC0zMDIwLDcgKzI3NzgsNyBAQAogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIG5ldyBEU0kgKi8KICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV9tYWxsb2MoZW5jSGVhZGVyLT5TaXplLCBNNFZTUzNHUFAsCisgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZW5jSGVhZGVyLT5TaXplLCBNNFZTUzNHUFAsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjY0KSIpOwogCiAgICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQpAQCAtMzAzMSw3ICsyNzg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplID0gKE00T1NBX1VJbnQxNillbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCBlbmNIZWFkZXItPnBCdWYsCisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2ksICh2b2lkICopZW5jSGVhZGVyLT5wQnVmLAogICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPlNpemUpOwogICAgICAgICAgICAgfQogCkBAIC0zMTAyLDcgKzI4NjAsNyBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBX21hbGxvYygKKyAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgcFN0cmVhbUZvckRzaS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKICAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kiKTsKIApAQCAtMzExNSw4ICsyODczLDggQEAKICAgICAgICAgfQogICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcFN0cmVhbUZvckRzaS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBTdHJlYW1Gb3JEc2ktPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpLAorICAgICAgICAgICAgKHZvaWQgKilwU3RyZWFtRm9yRHNpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAogICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSk7CiAKICAgICAgICAgLyoqCkBAIC0zMjg5LDggKzMwNDcsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIC8qIFRoZSBmbGFnIGlzIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KKyAgICAvKiBUaGUgZmxhZ3MgYXJlIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KICAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX0ZBTFNFOworICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX0ZBTFNFOwogCiAgICAgLyoqCiAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwpAQCAtMzQxMyw0OSArMzE3Miw2IEBACiAgICAgKiBTZXQgc2hvcnRjdXQgKi8KICAgICBwQ2xpcCA9ICpoQ2xpcDsKIAotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIC8qIHJlcGxheSByZWNvcmRlZCBleHRlcm5hbCBkZWNvZGVyIHJlZ2lzdHJhdGlvbnMgb24gdGhlIGNsaXAgKi8KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRWRF9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2ldLnJlZ2lzdGVyZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlZ2lzdGVyRXh0ZXJuYWxWaWRlb0RlY29kZXIocENsaXAsIGksCi0gICAgICAgICAgICAgICAgcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgcEMtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBwQ2xpcC0+U2hlbGxBUEkgPSAweCV4IiwKLSAgICAgICAgJnBDbGlwLT5TaGVsbEFQSSk7Ci0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzKChNNFZTUzNHUFBfRWRpdENvbnRleHQgKilwQywKLSAgICAgICAgKE00T1NBX0NvbnRleHQpICZwQ2xpcC0+U2hlbGxBUEkpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzIHJldHVybmVkIGVyciAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgfQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3MgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgIGVycik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTICovCi0KICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXAsIHBDbGlwU2V0dGluZ3MsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwKICAgICAgICAgTTRPU0FfRkFMU0UpOwogCkBAIC0zNzA1LDQzMSArMzQyMSwzIEBACiAgICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9ICggdG90YWxfYml0c3VtIC8gdG90YWxfZHVyYXRpb24pICogMTAwMDsKIH0KIAotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFJlZ2lzdGVyRXh0ZXJuYWxDb2RlYyhNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2NvZGVjVHlwZSAgIGNvZGVjVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBDb2RlY0ludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXJzIGFuIGV4dGVybmFsIFZpZGVvL0F1ZGlvIGNvZGVjIHdpdGggVlNTM0dQUAotICogQG5vdGUgVGhpcyBpcyBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBleHRlcm5hbCBjb2RlYyByZWdpc3RyYXRpb24gQVBJIHRvIGNvcGUKLSAqICAgICAgdXAgd2l0aCBzcGVjaWZpYyByZXF1aXJlbWVudCBvZiBPTVggY29kZWMgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MzR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgY29kZWNUeXBlICAgICAgICAoSU4pIFR5cGUgb2YgY29kZWMgKE1QRUc0IC4uLikKLSAqIEBwYXJhbSAgcENvZGVjSW50ZXJmYWNlICAoSU4pIENvZGVjIGludGVyZmFjZQotICogQHBhcmFtICBwVXNlckRhdGEgICAgICAgICAgKElOKSBQb2ludGVyIG9uIGEgdXNlciBkYXRhIHRvIGdpdmUgdG8gZXh0ZXJuYWwgY29kZWMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbENvZGVjKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2NvZGVjVHlwZSBjb2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCAoIE00T1NBX05VTEwgPT0gcENvbnRleHQpIHx8IChNNE9TQV9OVUxMID09IHBDb2RlY0ludGVyZmFjZSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsQ29kZWM6IE5VTEwgaW5wdXQgcGFyYW1ldGVyOyBwQ29udGV4dD0weCV4LFwKLSAgICAgICAgICAgIHBDb2RlY0ludGVyZmFjZT0weCV4IiwKLSAgICAgICAgICAgIHBDb250ZXh0LCBwQ29kZWNJbnRlcmZhY2UpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBjb2RlY1R5cGUgPj0gTTRWU1MzR1BQX2tDb2RlY1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsQ29kZWM6IGludmFsaWQgY29kZWMgVHlwZTsgY29kZWNUeXBlPTB4JXgiLAotICAgICAgICAgICAgY29kZWNUeXBlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQy0+bV9jb2RlY0ludGVyZmFjZVtjb2RlY1R5cGVdID0gcENvZGVjSW50ZXJmYWNlOwotICAgIHBDLT5wT01YVXNlckRhdGEgPSBwVXNlckRhdGE7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbENvZGVjOiBwQy0+bV9jb2RlY0ludGVyZmFjZVslZF0gPSAweCV4IiwKLSAgICAgICAgY29kZWNUeXBlLCBwQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsQ29kZWM6IHBDLT5wT01YVXNlckRhdGF0ID0gMHgleCIsCi0gICAgICAgIHBVc2VyRGF0YSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdWJzY3JpYmVFeHRlcm5hbENvZGVjcyhNNFZTUzNHUFBfRWRpdENvbnRleHQgICAgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgU3Vic2NyaWJlcyB0byBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZXh0ZXJuYWwgVmlkZW8vQXVkaW8gY29kZWMKLSAqIEBub3RlIFRoaXMgaXMgbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgZXh0ZXJuYWwgY29kZWMgcmVnaXN0cmF0aW9uIEFQSSB0byBjb3BlCi0gKiAgICAgICB1cCB3aXRoIHNwZWNpZmljICAgIHJlcXVpcmVtZW50IG9mIE9NWCBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgVlNTM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3MoCi0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6IE5VTEwgaW5wdXQgcGFyYW1ldGVyOyBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6ICZwQy0+U2hlbGxBUEkgPSAweCV4IiwKLSAgICAgICAgJnBDLT5TaGVsbEFQSSk7Ci0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzKHBDb250ZXh0LAotICAgICAgICAoTTRPU0FfQ29udGV4dCkgJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzIHJldHVybnMgMHgleCIsCi0gICAgICAgIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzKE00VlNTM0dQUF9FZGl0Q29udGV4dCAgICBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcFNoZWxsQ3R4dCkKLSAqIEBicmllZiAgICBTdWJzY3JpYmVzIHRvIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBleHRlcm5hbCBWaWRlby9BdWRpbyBjb2RlYwotICogQG5vdGUgVGhpcyBpcyBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBleHRlcm5hbCBjb2RlYyByZWdpc3RyYXRpb24gQVBJIHRvIGNvcGUKLSAqICAgICAgIHVwIHdpdGggc3BlY2lmaWMgcmVxdWlyZW1lbnQgb2YgT01YIGNvZGVjIGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gcFNoZWxsQ29udGV4dCAgICAoSU4pIE1lZGlhIENvZGVjIHNoZWxsIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3MoIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwU2hlbGxDdHh0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBTaGVsbENvbnRleHQgPQotICAgICAgICAoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICopcFNoZWxsQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCAoIE00T1NBX05VTEwgPT0gcENvbnRleHQpIHx8IChNNE9TQV9OVUxMID09IHBTaGVsbENvbnRleHQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczogTlVMTCBpbnB1dCBwYXJhbWV0ZXI7IHBDb250ZXh0PTB4JXgsXAotICAgICAgICAgICAgcFNoZWxsQ29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDb250ZXh0LCBwU2hlbGxDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOiBwU2hlbGxDb250ZXh0PTB4JXgiLAotICAgICAgICBwU2hlbGxDb250ZXh0KTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRGVjTVBFRzRdICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcihwU2hlbGxDb250ZXh0LAotICAgICAgICAgICAgTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwgKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZQotICAgICAgICAgICAgKilwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRGVjTVBFRzRdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoTXBlZzQpIHJldHVybmVkIGVyciAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKiogUHJvdmlkZSB0aGUgYXBwbGljYXRpb24gdXNlciBkYXRhIGJhY2sgdG8gdGhlIGludGVyZmFjZSBmdW5jdGlvbnMuICoqCi0gICAgICAgICoqLwotICAgICAgICBwU2hlbGxDb250ZXh0LT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlTVBFRzRdID0KLSAgICAgICAgICAgIHBDLT5wT01YVXNlckRhdGE7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczpcCi0gICAgICAgICAgICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKE1wZWc0KSBPSzogMHgleCIsCi0gICAgICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9EZWNNUEVHNF0pOwotICAgIH0KLQotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tWaWRlb0RlY0gyNjRdICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcihwU2hlbGxDb250ZXh0LAotICAgICAgICAgICAgTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsIChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLSAgICAgICAgICAgICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tWaWRlb0RlY0gyNjRdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoQVZDKSByZXR1cm5lZCBlcnIgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqIFByb3ZpZGUgdGhlIGFwcGxpY2F0aW9uIHVzZXIgZGF0YSBiYWNrIHRvIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb25zLiAqKgotICAgICAgICAqKi8KLSAgICAgICAgcFNoZWxsQ29udGV4dC0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQ10gPQotICAgICAgICAgICAgcEMtPnBPTVhVc2VyRGF0YTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoSDI2NCkgT0s6IDB4JXgiLAotICAgICAgICAgICAgKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZQotICAgICAgICAgICAgKilwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRGVjSDI2NF0pOwotICAgIH0KLQotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERU9fQVZDKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tWaWRlb0VuY01QRUc0XSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIocFNoZWxsQ29udGV4dCwgTTRFTkNPREVSX2tNUEVHNCwKLSAgICAgICAgICAgIChNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNNUEVHNF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlcihNcGVnNCkgcmV0dXJuZWQgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBQcm92aWRlIHRoZSBhcHBsaWNhdGlvbiB1c2VyIGRhdGEgYmFjayB0byB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gKioKLSAgICAgICAgKiovCi0gICAgICAgIHBTaGVsbENvbnRleHQtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rTVBFRzRdID0KLSAgICAgICAgICAgIHBDLT5wT01YVXNlckRhdGE7Ci0gICAgICAgIHBTaGVsbENvbnRleHQtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rTVBFRzRdID0KLSAgICAgICAgICAgIHBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNNUEVHNF07Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoTXBlZzQpIE9LOiAweCV4IiwKLSAgICAgICAgICAgIChNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNNUEVHNF0pOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNIMjYzXSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIocFNoZWxsQ29udGV4dCwgTTRFTkNPREVSX2tIMjYzLAotICAgICAgICAgICAgKE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLSAgICAgICAgICAgICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tWaWRlb0VuY0gyNjNdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoSDI2MykgcmV0dXJuZWQgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBQcm92aWRlIHRoZSBhcHBsaWNhdGlvbiB1c2VyIGRhdGEgYmFjayB0byB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gKioKLSAgICAgICAgKiovCi0gICAgICAgIHBTaGVsbENvbnRleHQtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rSDI2M10gPQotICAgICAgICAgICAgcEMtPnBPTVhVc2VyRGF0YTsKLSAgICAgICAgcFNoZWxsQ29udGV4dC0+cFZpZGVvRW5jb2RlckV4dGVybmFsQVBJVGFibGVbTTRFTkNPREVSX2tIMjYzXSA9Ci0gICAgICAgICAgICBwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2M107Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczogTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKEgyNjMpIE9LOiAweCV4IiwKLSAgICAgICAgICAgIChNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNIMjYzXSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2NF0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKHBTaGVsbENvbnRleHQsIE00RU5DT0RFUl9rSDI2NCwKLSAgICAgICAgICAgIChNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rVmlkZW9FbmNIMjY0XSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKEgyNjQpIHJldHVybmVkIGVyciAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKiogUHJvdmlkZSB0aGUgYXBwbGljYXRpb24gdXNlciBkYXRhIGJhY2sgdG8gdGhlIGludGVyZmFjZSBmdW5jdGlvbnMuICoqCi0gICAgICAgICoqLwotICAgICAgICBwU2hlbGxDb250ZXh0LT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0gyNjRdID0KLSAgICAgICAgICAgIHBDLT5wT01YVXNlckRhdGE7Ci0gICAgICAgIHBTaGVsbENvbnRleHQtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rSDI2NF0gPQotICAgICAgICAgICAgcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tWaWRlb0VuY0gyNjRdOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlcihIMjY0KSBPSzogMHgleCIsCi0gICAgICAgICAgICAoTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZQotICAgICAgICAgICAgKilwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2NF0pOwotICAgIH0KLQotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa0F1ZGlvRGVjQUFDXSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIocFNoZWxsQ29udGV4dCwgTTRBRF9rVHlwZUFBQywKLSAgICAgICAgICAgIChNNEFEX0ludGVyZmFjZSAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9EZWNBQUNdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoQUFDKSByZXR1cm5lZCBlcnIgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcFNoZWxsQ29udGV4dC0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRBRF9rVHlwZUFBQ10gPQotICAgICAgICAgICAgcEMtPnBPTVhVc2VyRGF0YTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoQUFDKSBPSzogMHgleCIsCi0gICAgICAgICAgICAoTTRBRF9JbnRlcmZhY2UgKilwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa0F1ZGlvRGVjQUFDXSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0RlY0FNUk5CXSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIocFNoZWxsQ29udGV4dCwgTTRBRF9rVHlwZUFNUk5CLAotICAgICAgICAgICAgKE00QURfSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9EZWNBTVJOQl0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcihBTVJOQikgcmV0dXJuZWQgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBTaGVsbENvbnRleHQtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW000QURfa1R5cGVBTVJOQl0gPQotICAgICAgICAgICAgcEMtPnBPTVhVc2VyRGF0YTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcihBTVJOQikgT0s6IDB4JXgiLAotICAgICAgICAgICAgKE00QURfSW50ZXJmYWNlICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0RlY0FNUk5CXSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQiovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0RlY01QM10gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKHBTaGVsbENvbnRleHQsIE00QURfa1R5cGVNUDMsCi0gICAgICAgICAgICAoTTRBRF9JbnRlcmZhY2UgKilwQy0+bV9jb2RlY0ludGVyZmFjZVtNNFZTUzNHUFBfa0F1ZGlvRGVjTVAzXSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKE1QMykgcmV0dXJuZWQgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBTaGVsbENvbnRleHQtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW000QURfa1R5cGVNUDNdID0KLSAgICAgICAgICAgIHBDLT5wT01YVXNlckRhdGE7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczogTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKE1QMykgT0s6IDB4JXgiLAotICAgICAgICAgICAgKE00QURfSW50ZXJmYWNlICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0RlY01QM10pOwotICAgIH0KLQotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9FbmNBQUNdICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihwU2hlbGxDb250ZXh0LCBNNEVOQ09ERVJfa0FBQywKLSAgICAgICAgICAgIChNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLSAgICAgICAgICAgICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0VuY0FBQ10pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihBQUMpIHJldHVybmVkIGVyciAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwU2hlbGxDb250ZXh0LT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0FBQ10gPQotICAgICAgICAgICAgcEMtPnBPTVhVc2VyRGF0YTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN1YnNjcmliZUV4dGVybmFsQ29kZWNzOiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoQUFDKSBPSzogMHgleCIsCi0gICAgICAgICAgICAoTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9FbmNBQUNdKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9FbmNBTVJOQl0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKHBTaGVsbENvbnRleHQsIE00RU5DT0RFUl9rQU1STkIsCi0gICAgICAgICAgICAoTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi0gICAgICAgICAgICAqKXBDLT5tX2NvZGVjSW50ZXJmYWNlW000VlNTM0dQUF9rQXVkaW9FbmNBTVJOQl0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3Vic2NyaWJlRXh0ZXJuYWxDb2RlY3M6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihBTVJOQikgcmV0dXJuZWQgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBTaGVsbENvbnRleHQtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rQU1STkJdID0KLSAgICAgICAgICAgIHBDLT5wT01YVXNlckRhdGE7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdWJzY3JpYmVFeHRlcm5hbENvZGVjczpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoQU1STkIpIE9LOiAweCV4IiwKLSAgICAgICAgICAgIChNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLSAgICAgICAgICAgICopcEMtPm1fY29kZWNJbnRlcmZhY2VbTTRWU1MzR1BQX2tBdWRpb0VuY0FNUk5CXSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiovCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cE9NWFVzZXJEYXRhICkKLSAgICB7Ci0gICAgICAgIC8qIElmIGV4dGVybmFsIE9NWCBjb2RlY3MgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIFZTUzNHUFAgaW50ZXJuYWwgY29udGV4dAotICAgICAgICAqIGFuZCBhcmUgYmVpbmcgc3Vic2NyaWJlZCBieSBhcHBsaWNhdGlvbiwgKgotICAgICAgICAqIHRoZW4gc2V0IGJvb2xlYW4gdG8gcHJldmVudCB1bnJlZ2lzdHJhdGlvbiBvZiBleHRlcm5hbCBjb2RlYyBpbnRlcmZhY2VzLiAqCi0gICAgICAgICogVGhpcyBpcyB0byBwcmV2ZW50IGV4dGVybmFsIGNvZGVjIGludGVyZmFjZXMgZnJvbSBiZWluZyByZXNldAotICAgICAgICAgIGR1cmluZyBWU1MzR1BQIHN0ZXAgZnVuY3Rpb24uICoKLSAgICAgICAgKiBFeHRlcm5hbCBPTVggY29kZWNzIGFyZSByZWdpc3RlcmVkIG9ubHkgb25jZSBieSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICBTbyBwb2ludGVycyBzaG91bGQgcmVtYWluIHZhbGlkKgotICAgICAgICAqIHRocm91Z2hvdXQgbGlmZSBjeWNsZSBvZiB0aGUgYXBwbGljYXRpb24gKi8KLQotICAgICAgICBwU2hlbGxDb250ZXh0LT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKaW5kZXggYjExODI0NC4uMTAzYTVlYSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKKyAgICAgICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKIAogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogRXJyb3IgY2hlY2tpbmcgKi8KQEAgLTMyMiw4ICszMjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCiAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhLCBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoTTRPU0FfVUludDMyKXBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUKQEAgLTMzMyw4ICszMzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKQEAgLTY1MCw4ICs2NTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBTVIgQVUgdG8gdGhlIG91dHB1dCAqLwogICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhLCBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwogICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTUwMSwyNiArMTUwMSw2IEBACiAgICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKICAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0CiAgICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLSNpZiAwCi0KLSAgICAgICAgICAgIGVsc2UgaWYoICggTTRWU1MzR1BQX2tFZmZlY3RLaW5kX0VuZCA9PSBwRngtPkVmZmVjdEtpbmQpCi0gICAgICAgICAgICAgICAgJiYgKHQgPj0gKE00T1NBX0ludDMyKShCQyArIHBGeC0+dWlTdGFydFRpbWUpKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICAqcGlDbGlwQWN0aXZlRWZmZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzIC0gMSAtIHVpRnhJbmRleDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhlIHRoaXJkIGVmZmVjdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gdGhlIHNlY29uZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICogSGVuY2UsIGFzIHNvb24gYXMgd2UgZm91bmQgYW4gYWN0aXZlIGVmZmVjdCwgd2UgY2FuIGdldCBvdXQgb2YgdGhpcyBsb29wICovCi0gICAgICAgICAgICAgICAgdWlGeEluZGV4ID0gcEMtPgotICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyAvKiogZ2V0IG91dCBvZiB0aGUgZm9yIGxvb3AgKi8KLSAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICovCiAKICAgICAgICAgfQogICAgIH0KQEAgLTE3ODYsOCArMTc2Niw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBQQ01kYXRhMSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBQQ01kYXRhMiwgdWlQQ01zaXplKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRWaWRlby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKaW5kZXggOTg3MDQyNi4uZjY5ZjE0YiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKQEAgLTkzLDEyICs5MywxOCBAQAogICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7CiAKICAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgaWYgKCAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldCkgPj0gcEMtPnBDMS0+aUVuZFRpbWUgKQorICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dC4gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZworICAgICAqIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAorICAgICAqLworICAgIGlmICggKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQKKyAgICAgICAgKyBwQy0+aUluT3V0VGltZU9mZnNldCkgPj0gcEMtPnBDMS0+aUVuZFRpbWUgKQogICAgIHsKICAgICAgICAgLyogUmUtYWRqdXN0IHZpZGVvIHRvIHByZWNpc2UgY3V0IHRpbWUgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKKyAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykpCisgICAgICAgICAgICAtIHBDLT5wQzEtPmlWb2Zmc2V0ICsgcEMtPmlJbk91dFRpbWVPZmZzZXQgLSBwQy0+cEMxLT5pRW5kVGltZTsKKyAgICAgICAgaWYgKCBwQy0+aUluT3V0VGltZU9mZnNldCA8IDAgKSB7CisgICAgICAgICAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgKiBWaWRlbyBpcyBkb25lIGZvciB0aGlzIGNsaXAgKi8KQEAgLTI2Myw4ICsyNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwogCiAgICAgICAgICAgICAgICAgICAgIC8qKgpAQCAtNzIzLDExICs3MjksMTUgQEAKICAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCiAgICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkKKyAgICAgICAgICAgIGlmKHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSB7CisgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKKyAgICAgICAgICAgICAgICBwQy0+YkVuY29kZVRpbGxFb0YgPSBNNE9TQV9UUlVFOworICAgICAgICAgICAgfSBlbHNlIGlmKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHByZXZpb3VzVnN0YXRlKQorICAgICAgICAgICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkgKSB7CiAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogRWxzZSB3ZSBhcmUgaW4gZGVmYXVsdCBjb3B5L3Bhc3RlIG1vZGUgKi8KICAgICAgICAgZWxzZQpAQCAtNzcxLDcgKzc4MSw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZighKChwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9PSBNNE9TQV9UUlVFKSAmJgotICAgICAgICAgICAgICAgICAgICAocEMtPlZzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUpKSkKKyAgICAgICAgICAgICAgICAgICAgKHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAqIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUKQEAgLTgyOSw3ICs4NDAsNyBAQAogICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OCiAgICAgICAgID09IHByZXZpb3VzVnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwogICAgICAgICAmJiAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFID09IHBDLT5Wc3RhdGUpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICkKKyAgICAgICAgJiYgKHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkgKQogICAgIHsKICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwogICAgIH0KQEAgLTk4OCwxMiArOTk5LDEyIEBACiAgICAgICAgIC8qKgogICAgICAgICAqIFdlIG11c3QgZmlsbCB0aGUgaW5wdXQgb2YgdGhlIGVuY29kZXIgd2l0aCBhIGR1bW15IGltYWdlLCBiZWNhdXNlCiAgICAgICAgICogZW5jb2Rpbmcgbm9pc2UgbGVhZHMgdG8gYSBodWdlIHZpZGVvIEFVLCBhbmQgdGh1cyBhIHdyaXRlciBidWZmZXIgb3ZlcmZsb3cuICovCi0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcFBsYW5lT3V0WzBdLnBhY19kYXRhLAotICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0LCAwKTsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwUGxhbmVPdXRbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMV0udV9oZWlnaHQsIDApOwotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBQbGFuZU91dFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3N0cmlkZSAqIHBQbGFuZU91dFsyXS51X2hlaWdodCwgMCk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwwLAorICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLDAsCisgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMV0udV9oZWlnaHQpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsMCwKKyAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3N0cmlkZSAqIHBQbGFuZU91dFsyXS51X2hlaWdodCk7CiAKICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIChhYm9ydCkiKTsKICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7CkBAIC0xMTQxLDE0ICsxMTUyLDE0IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAocFRtcFswXS51X2hlaWdodCAqIHBUbXBbMF0udV93aWR0aCkpOwotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCiAgICAgICAgICAgICAgICAgKHBUbXBbMV0udV9oZWlnaHQgKiBwVG1wWzFdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCisgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAogICAgICAgICAgICAgICAgIChwVG1wWzJdLnVfaGVpZ2h0ICogcFRtcFsyXS51X3dpZHRoKSk7CiAgICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKICAgICAgICAgfQpAQCAtMTIwNywxNCArMTIxOCwxNCBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFswXS5wYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCiAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMV0ucGFjX2RhdGEsCisgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAogICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzJdLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwogICAgICAgICAgICAgcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7CiAgICAgICAgIH0KQEAgLTEyMzcsMTQgKzEyNDgsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHBUZW1wMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVGVtcDJbaV0ucGFjX2RhdGEpOworICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKICAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgIGlmIChwVGVtcDFbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUZW1wMVtpXS5wYWNfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXAxW2ldLnBhY19kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzE1LDE0ICsxMzI2LDE0IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAorICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAocFRtcFswXS51X2hlaWdodCAqIHBUbXBbMF0udV93aWR0aCkpOwotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAorICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCiAgICAgICAgICAgICAgICAgKHBUbXBbMV0udV9oZWlnaHQgKiBwVG1wWzFdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCisgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAogICAgICAgICAgICAgICAgIChwVG1wWzJdLnVfaGVpZ2h0ICogcFRtcFsyXS51X3dpZHRoKSk7CiAgICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKICAgICAgICAgfQpAQCAtMTc2OSw4ICsxNzgwLDggQEAKIAogICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcFBsYW5lT3V0W2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFBsYW5lW2ldLnBhY19kYXRhLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5NzQsOSArMTk4NSwxMSBAQAogCiAgICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCh0ID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSkpICYmICAgICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8gKi8KLSAgICAgICAgICAgICAgICAgICAgKHQgPCAgKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSAvKio8IEFyZSB3ZSBpbnRvIHRoZSBlZmZlY3QgZHVyYXRpb24/ICovCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/CisgICAgICAgICAgICAgICAgICogb3IgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoICh0ID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSkpICYmCisgICAgICAgICAgICAgICAgICAgICh0IDw9IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpICkgewogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0KHMpICovCiAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3RbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwpAQCAtMTk5MywxNyArMjAwNiwxOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBlZmZlY3QgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LCB0aGVuIHRoZSBzZWNvbmQgb25lLCB0aGVuIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotCisgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBlZmZlY3QgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LCB0aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBzZWNvbmQgb25lLCB0aGVuIHRoZSBmaXJzdCBvbmUuIEhlbmNlLCBhcyBzb29uIGFzIHdlCisgICAgICAgICAgICAgICAgICAgICAqIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcC4KKyAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uID49Ci0gICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYgKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICA8ICAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KLSAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KKyAgICAgICAgICAgICAgICBpZiAoICgoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCAoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KICAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwpAQCAtMjIwNCwxNiArMjIxOSw2IEBACiAgICAgICAgIC8qIENvbXB1dGUgbWF4IGJpdHJhdGUgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGVzIGJpdHJhdGVzIGFuZCB0cmFuc2l0aW9ucyAqLwogICAgICAgICBpZiggcEMtPlZzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04gKQogICAgICAgICB7Ci0jaWYgMAotICAgICAgICAgICAgLyogTWF4IG9mIHRoZSB0d28gYmxlbmRlZCBmaWxlcyAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA+IHBDLT5wQzItPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotI2VuZGlmCiAgICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT5ld2MudWlWaWRlb0JpdHJhdGU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtMjUyNSw3ICsyNTMwLDcgQEAKICAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7CiAgICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7CiAgICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHBQbGFuZXNbMF0udV9zdHJpZGUKKyAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzBdLnVfc3RyaWRlCiAgICAgICAgICogcFBsYW5lc1swXS51X2hlaWdodCwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwUGxhbmVzWzBdLnBhY19kYXRhIik7CiAKICAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzBdLnBhY19kYXRhICkKQEAgLTI1NDAsNyArMjU0NSw3IEBACiAgICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKICAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwogICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBX21hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCisgICAgcFBsYW5lc1sxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1sxXS51X3N0cmlkZQogICAgICAgICAqIHBQbGFuZXNbMV0udV9oZWlnaHQsIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAicFBsYW5lc1sxXS5wYWNfZGF0YSIpOwogCiAgICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1sxXS5wYWNfZGF0YSApCkBAIC0yNTU1LDcgKzI1NjAsNyBAQAogICAgIHBQbGFuZXNbMl0udV9oZWlnaHQgPSBwUGxhbmVzWzFdLnVfaGVpZ2h0OwogICAgIHBQbGFuZXNbMl0udV9zdHJpZGUgPSBwUGxhbmVzWzJdLnVfd2lkdGg7CiAgICAgcFBsYW5lc1syXS51X3RvcGxlZnQgPSAwOwotICAgIHBQbGFuZXNbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfbWFsbG9jKHBQbGFuZXNbMl0udV9zdHJpZGUKKyAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzJdLnVfc3RyaWRlCiAgICAgICAgICogcFBsYW5lc1syXS51X2hlaWdodCwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwUGxhbmVzWzJdLnBhY19kYXRhIik7CiAKICAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzJdLnBhY19kYXRhICkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwppbmRleCBmNzIyNmEzLi5kZjE0YTU0IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKICAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAogICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICovYAorI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwogCiAKICAgICAvKiAtLS0gTlVMTCAtLS0gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfQVBJLmMKaW5kZXggNDJjMjRlZC4uZTk5Y2ZlNSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfQVBJLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfQVBJLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgogI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKICNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUV4dHJhLmgiCiAjaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCiAjaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKICAgICB9CiAKLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKKyAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKICAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwogCiAgICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKQEAgLTExMCw3ICsxMDksNyBAQAogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9CiAgICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKKyAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhVVEZfQ09OVkVSU0lPTl9CVUZGRVJfU0laRQogICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQ4KSwKICAgICAgICAgICAgICAgICBNNFZBLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfSW5pdDogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7CiAKQEAgLTExOCw5ICsxMTcsOSBAQAogICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQpOworICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgIH0KQEAgLTEyOSw5ICsxMjgsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOworICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0KTsKKyAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwogICAgICAgICB9CkBAIC0xNTEsNyArMTUwLDcgQEAKICAgICAgICAgKHRoZSBjb252ZXJzaW9uIGN1c3RvbWVyIGZvcm1hdCBpbnRvIFVURjgKICAgICAgICAgaXMgZG9uZSBpbiBWQS9WQUwpKi8KICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGggPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoTTRPU0FfY2hyTGVuZ3RoKHBQYXJhbXMtPnBUZW1wUGF0aCkgKyAxLAorICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBQYXJhbXMtPnBUZW1wUGF0aCkgKyAxLAogICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBQYXRoIGZvciB0ZW1wb3JhcnkgZmlsZXMiKTsKIAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wVGVtcFBhdGggPT0gTTRPU0FfTlVMTCApCkBAIC0xNTksMjggKzE1OCwyOCBAQAogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIE00T1NBX2Nockxlbmd0aChwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKKyAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7CiAgICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dCk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKICAgICB9CiAKICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9Ci0gICAgICAgIChNNFZTUzNHUFBfRWRpdFNldHRpbmdzICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWRpdFNldHRpbmdzKSwKKyAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAogICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKIAogICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKICAgICB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQpOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7CiAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CkBAIC0yMTgsMjMgKzIxNyw2IEBACiAgICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCiAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7CiAKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRWRF9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2ldLnBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2ldLnBVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tpXS5yZWdpc3RlcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFZFX2tFbmNvZGVyVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5wRW5jb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5wVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbaV0ucmVnaXN0ZXJlZCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQogICAgIC8qIEluaXRpYWxpemUgc3RhdGUgaWYgYWxsIGluaXRpYWxpemF0aW9ucyBhcmUgY29ycmVjdHMgKi8KICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7CiAKQEAgLTY0MSw4ICs2MjMsOCBAQAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAogICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfY2hyQ29tcGFyZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLCAoTTRPU0FfSW50MzIgKikgJnBDbXBSZXN1bHQpOworICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7CiAKICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQogICAgICAgICAgICAgewpAQCAtNjYyLDggKzY0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwogICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjczLDcgKzY1NCw3IEBACiAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byB1bmFsbG9jYXRlIFBDTSBwcmV2aWV3IGZpbGUgcGF0aCBpbiBpbnRlcm5hbCBjb250ZXh0ICovCiAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTcwMywxNSArNjg0LDE1IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXMtPnBGaWxlSW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZpbGVFeHRyYURlbGV0ZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNzIwLDggKzcwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZpbGVFeHRyYURlbGV0ZShwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXMtPnBGaWxlVGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwogCiAjZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KIApAQCAtNzI5LDcgKzcxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc19zYXV2KTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwogICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7CkBAIC03NDgsMTUgKzcyOSwxNSBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVJbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZpbGVFeHRyYURlbGV0ZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXMtPnBGaWxlT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC03NjUsOCArNzQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9maWxlRXh0cmFEZWxldGUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVUZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKIAogI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCiAKQEAgLTc3NCw3ICs3NTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zX3NhdXYpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC04MDIsNyArNzgzLDcgQEAKICAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwpAQCAtODYwLDcgKzg0MSw3IEBACiAgICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7CiAgICAgICAgIH0KIAotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBX21hbGxvYyBcCisgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgKyAxLCBNNFZTLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikib3V0cHV0IGZpbGUgcGF0aCIpOwogCkBAIC04NzMsOCArODU0LDggQEAKICAgICAgICAgICAgIC8qKi8KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOworICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCisgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSk7CiAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwogICAgIH0KQEAgLTEwNTYsMTkgKzEwMzcsMTggQEAKICAgICB7CiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKKyAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOworICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKiApTTRPU0FfbWFsbG9jIFwKKyAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAogICAgICAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopKnhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIsCiAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTLCBjb3B5IG9mIHBDbGlwTGlzdCIpOwogCkBAIC0xMDgyLDE1ICsxMDYyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgIH0KICAgICAgICAgLyogU2V0IGNsaXAgbGlzdCB0byBOVUxMICovCi0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwKKyAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAogICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLCAwKTsKKyAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKIAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQogICAgICAgICB7CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKSAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgKih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSksIE00VlMsIChNNE9TQV9DaGFyICopIFwKICAgICAgICAgICAgICAgICAieFZTUywgY29weSBvZiBwVHJhbnNpdGlvbkxpc3QiKTsKIApAQCAtMTEwNCwxMCArMTA4NCwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIFNldCB0cmFuc2l0aW9uIGxpc3QgdG8gTlVMTCAqLwotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LAorICAgICAgICAgICAgbWVtc2V0KAorICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCwwLAogICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAgICAgKih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSksIDApOworICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTExMzEsNyArMTExMSw3IEBACiAgICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKICAgICB7CiAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV9tYWxsb2MgXAorICAgICAgICAgICAgKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCiAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyAqIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpLAogICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiZWZmZWN0cyBzZXR0aW5ncyIpOwogCkBAIC0xMTg0LDcgKzExNjQsNyBAQAogICAgIHsKICAgICAgICAgLyogQWxsb2NhdGUgY3VycmVudCBjbGlwICovCiAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKilNNE9TQV9tYWxsb2MgXAorICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAogICAgICAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikiY2xpcCBzZXR0aW5ncyIpOwogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID09IE00T1NBX05VTEwgKQpAQCAtMTIxOSw3ICsxMTk5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9CiAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyksCisgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAogICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInRyYW5zaXRpb24gc2V0dGluZ3MiKTsKIAogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCkBAIC0xMjMyLDkgKzEyMTIsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKKyAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCisgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwogICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBleHRlcm5hbCBlZmZlY3QgY29udGV4dCB0byBOVUxMLCB0byBrbm93IGlmIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuCiAgICAgICAgICAgICBkZWNvZGVkIG9yIG5vdCAqLwpAQCAtMTI1MCw3ICsxMjMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCiAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV9tYWxsb2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAogICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwogCkBAIC0xMjY3LDE4ICsxMjQ3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gdGhlIHByb3ZpZGVkIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0b3Ugb3VyCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAogICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCiAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV9tYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfY2hyTGVuZ3RoKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAorICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAogICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKIApAQCAtMTMwMSw3ICsxMjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgTTRPU0FfY2hyTGVuZ3RoKAorICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsIHN0cmxlbigKICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpICsgMSk7CkBAIC0xMzE0LDE0ICsxMjk0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMgKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJDb21wYXJlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ21wUmVzdWx0ID0gc3RyY21wKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsIChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnhWU1MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMiAqKSAmcENtcFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTEzMzAsNyArMTMwOSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKQEAgLTE0MjgsNyArMTQwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCBoZWlnaHQhIFN0YXRlIGlzICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRfQVJHQjg4OCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfbWFsbG9jKDMKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IHBsYW5lIGZvciBBbHBoYSBtYWdpYyB0cmFuc2l0aW9uIik7CkBAIC0xNDQ5LDcgKzE0MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfc3RyaWRlID0gd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYygoIHdpZHRoICogaGVpZ2h0ICogMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoIHdpZHRoICogaGVpZ2h0ICogMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKQEAgLTE0NTksNyArMTQzOCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpb3V0cHV0UGxhbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7CkBAIC0xNTI2LDEwICsxNTA1LDkgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW91dHB1dFBsYW5lWzBdLnBhY19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG91dHB1dFBsYW5lWzBdLnBhY19kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW91dHB1dFBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG91dHB1dFBsYW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCkBAIC0xNTQwLDcgKzE1MTgsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7CkBAIC0xNjAwLDcgKzE1NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKSJJbnRlcm5hbCBzbGlkZSB0cmFuc2l0aW9uIHNldHRpbmdzIik7CkBAIC0xNjY0LDQ4MyArMTY0Miw2IEBACiAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKICAgICAgICAgfQogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgSlBHIGlucHV0IGZpbGUgdHlwZSBjYXNlCi0gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgMAotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0NoYXIgb3V0X2ltZ1s2NF07Ci0gICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdfdG1wWzY0XTsKLSAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtczsKLSAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEpQRUdGaWxlSW47Ci0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgIGNvbnZlcnRlZCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSggcFBhcmFtcyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2NockNvbXBhcmUocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiwgKE00T1NBX0ludDMyICopICZwQ21wUmVzdWx0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPmR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZUpQR18zR1A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byB1cGRhdGUgdGhpcyB2YXJpYWJsZSwgaW4gY2FzZSBzb21lIHBpY3R1cmVzIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0d28gKi8KLSAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgNjMsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCA2MywgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgIC8qIEFsbG9jYXRlIGxhc3QgZWxlbWVudCBQdG8zR1BQIHBhcmFtcyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBQYXJhbXMgPSAoTTR4VlNTX1B0bzNHUFBfcGFyYW1zCi0gICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBQdG8zR1BQIFBhcmFtcyIpOwotCi0gICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgUHRvM0dQUCBQYXJhbXMiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgPSBNNHhWU1Nfa1Jlc2l6aW5nOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkgLyogTWVhbnMgaXQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhpcyBlbGVtZW50IGluIGNhc2Ugb2Ygb3RoZXIgZmlsZSB0byBjb252ZXJ0ICovCi0gICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzYXZlIG9mIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRmlsbCB0aGUgbGFzdCBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgZWxlbWVudCAqLwotICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGlzIGZpbGxlZCwgbGV0J3MgdXNlIGl0IGluc3RlYWQgb2YgRW5kQ3V0VGltZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEc7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkocFBhcmFtcy0+cEZpbGVJbiwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgSlBHIGZpbGUgaXMgcHJlc2VudCBvbiB0aGUgRlMgKFA0TUUwMDAwMjk3NCkgYnkganVzdCBvcGVuaW5nIGFuZAotICAgICAgICAgICAgY2xvc2luZyBpdCAqLwotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBKUEVHRmlsZUluLCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3Qgb3BlbiBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBKUEVHRmlsZUluKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3QgY2xvc2UgaW5wdXQganBnIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGgsIGVycik7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nOwotICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfaW1nLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBwQ29udkZyb21VVEY4RmN0IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBQYXJhbXMtPnBGaWxlT3V0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWdfdG1wOwotICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfaW1nX3RtcCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSAoTTRPU0FfVm9pZCAqKU00T1NBX21hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBQYXJhbXMtPnBGaWxlVGVtcCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgLyogRmlsbCBQYW5BbmRab29tIHNldHRpbmdzIGlmIG5lZWRlZCAqLwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRQotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuaXNQYW5ab29tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5pc1Bhblpvb20gPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbTsKLSAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IFBhbiAmIFpvb20gcGFyYW1ldGVycyBhcmUgY29ycmVjdHMgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhCi0gICAgICAgICAgICAgICAgICAgIDw9IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYSA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYSA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYSA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYSA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGIKLSAgICAgICAgICAgICAgICAgICAgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgIDw9IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYiA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYiA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYiA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYiA8IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0KLXJlcGxhY2VKUEdfM0dQOgotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IHBQYXJhbXMtPmR1cmF0aW9uOwotCi0gICAgICAgICAgICAvKiBSZXBsYWNpbmcgaW4gVlNTIHN0cnVjdHVyZSB0aGUgSlBHIGZpbGUgYnkgdGhlIDNncCBmaWxlICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBQYXJhbXMtPnBGaWxlT3V0OwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfbWFsbG9jKChsZW5ndGgKLSAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIGZpbGUgcGF0aCBvZiBqcGcgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX21lbWNweSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGgsIChsZW5ndGggKyAxKSk7Ci0gICAgICAgICAgICAvKkZCOiBhZGQgZmlsZSBwYXRoIHNpemUgYmVjYXVzZSBvZiBVVEYxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSA9IGxlbmd0aCsxOwotICAgICAgICB9Ci0jZW5kaWYKIAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApCkBAIC0yMTYyLDggKzE2NjMsOCBAQAogICAgICAgICAgICAgICAgIC8qIFdlIHBhcnNlIGFsbCBQdG8zZ3BwIFBhcmFtIGNoYWluZWQgbGlzdCAqLwogICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyQ29tcGFyZShwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluLCAoTTRPU0FfSW50MzIgKikmcENtcFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlSW4pOwogCiAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCkBAIC0yMjIyLDcgKzE3MjMsNyBAQAogCiAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCiAgICAgICAgICAgICBwUGFyYW1zID0gKE00eFZTU19QdG8zR1BQX3BhcmFtcwotICAgICAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfUHRvM0dQUF9wYXJhbXMpLAorICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUHRvM0dQUF9wYXJhbXMpLAogICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKIAogICAgICAgICAgICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCkBAIC0yMjg0LDcgKzE3ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwRGVjb2RlZFBhdGgpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKIAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KQEAgLTIzMTQsNyArMTgxNSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKQEAgLTIzMjYsNyArMTgyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBQYXJhbXMtPnBGaWxlSW4sIHBEZWNvZGVkUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwogCiAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgSlBHIGZpbGUgaXMgcHJlc2VudCBvbiB0aGUgRlMgKFA0TUUwMDAwMjk3NCkgYnkganVzdCBvcGVuaW5nCkBAIC0yMzU3LDcgKzE4NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X2ltZzsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KQEAgLTIzODMsNyArMTg4NCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSAoTTRPU0FfVm9pZCAqKU00T1NBX21hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgb3V0Iik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQpAQCAtMjM5NSw3ICsxODk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkocFBhcmFtcy0+cEZpbGVPdXQsIHBEZWNvZGVkUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCiAKICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCkBAIC0yNDAzLDcgKzE5MDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogCiAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWdfdG1wOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAogICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgpAQCAtMjQyOSw3ICsxOTMwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSAoTTRPU0FfVm9pZCAqKU00T1NBX21hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIHRlbXAiKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wID09IE00T1NBX05VTEwgKQpAQCAtMjQ0MSw3ICsxOTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkocFBhcmFtcy0+cEZpbGVUZW1wLCBwRGVjb2RlZFBhdGgsCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IHRlbXBvcmFyeSBmaWxlIHBhdGggKi8KIAogI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCkBAIC0yNDU5LDIyICsxOTYwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhhIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYSA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiID4gMTAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYiA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7CkBAIC0yNTcxLDcgKzIwNjQsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yNjAzLDExICsyMDk2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfbWFsbG9jKChsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgQVJHQiB0byAzZ3AiKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCkBAIC0yNjE5LDggKzIxMTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCiAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSA9IGxlbmd0aCsxOwogICAgICAgICB9CkBAIC0yNjQ3LDE2ICsyMTQwLDEwIEBACiAgICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKICAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwogICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotI2lmZGVmIFRJTUVTQ0FMRV9CVUcKLQotICAgICAgICAgICAgTTRPU0FfQm9vbCB0aW1lc2NhbGVEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLQotI2VuZGlmCi0KICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZmlsZSBwcm9wZXJ0aWVzIHN0cnVjdHVyZSAqLwogCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KSAmZmlsZVByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSwgMCk7CisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikgJmZpbGVQcm9wZXJ0aWVzLDAsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7CiAKICAgICAgICAgICAgIC8vZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKIApAQCAtMjc1NCw4ICsyMjQxLDggQEAKIAogICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJDb21wYXJlKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgKE00T1NBX0ludDMyICopICZwQ21wUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQogICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCkBAIC0yODkxLDE2ICsyMzc4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaSk7CiAgICAgICAgICAgICB9CiAKLSNpZmRlZiBUSU1FU0NBTEVfQlVHCi0gICAgICAgICAgICAvKiBDaGVjayB0aW1lc2NhbGUgKi8KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQgLy8mJgotICAgICAgICAgICAgICAgIC8qICEhISEhISEhISEhISBBZGQgY29uZGl0aW9uIHRvIHVwZGF0ZSB0aW1lc2NhbGUgISEhISEhISEhISEhISEhISEhISEhISEhISAqLyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGltZXNjYWxlRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmCiAgICAgICAgICAgICAvKiBJZiB0aGUgb3V0cHV0IHZpZGVvIGZvcm1hdC9zaXplIGlzIG5vdCB0aGUgc2FtZSBhcyBwcm92aWRlZCB2aWRlbywKICAgICAgICAgICAgIGxldCdzIHRyYW5zY29kZSBpdCAqLwogCkBAIC0yOTU1LDE0ICsyNDMyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKCB2aWRlb0lzRGlmZmVyZW50ID09IE00T1NBX1RSVUUgfHwgYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFCi0jaWZkZWYgVElNRVNDQUxFX0JVRwotCi0gICAgICAgICAgICAgICAgfHwgdGltZXNjYWxlRGlmZmVyZW50ID09IE00T1NBX1RSVUUKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07CiAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKQEAgLTI5OTMsNyArMjQ2Myw3IEBACiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7CiAKICAgICAgICAgICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19NQ1NfcGFyYW1zICopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfTUNTX3BhcmFtcyksCisgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7CiAKICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKQEAgLTMwMjcsMjUgKzI0OTcsNiBAQAogICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwogCi0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRpbWVzY2FsZSBvbmx5IG5lZWRzIHRvIGJlIG1vZGlmaWVkICovCi0KLSAgICAgICAgICAgICAgICBpZiggdGltZXNjYWxlRGlmZmVyZW50ID09IE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgJiYgdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IDMwOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOdWxsVmlkZW87Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxNV9GUFM7IC8qIE11c3QgYmUgc2V0LCBvdGhlcndpc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHJldHVybnMgYW4gZXJyb3IgLi4uICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCiAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGUgPSB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlOwogCiAgICAgICAgICAgICAgICAgLyogV2UgZG8gbm90IG5lZWQgdG8gcmVlbmNvZGUgdmlkZW8gaWYgaXRzIHBhcmFtZXRlcnMgZG8gbm90IGRpZmZlciAqLwpAQCAtMzI2Miw3ICsyNzEzLDcgQEAKICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwRGVjb2RlZFBhdGgpOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwogCiAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAogICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+CkBAIC0zMjkyLDcgKzI3NDMsNyBAQAogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7CiAKICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKQEAgLTMzMDQsMTMgKzI3NTUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLyoqLwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweShwUGFyYW1zLT5wRmlsZUluLCBwRGVjb2RlZFBhdGgsCisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCiAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCiAKICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3A7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0CiAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KQEAgLTMzMzgsNyArMjc4OSw3IEBACiAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwogICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwogCiAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQpAQCAtMzM1MCw3ICsyODAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLyoqLwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweShwUGFyYW1zLT5wRmlsZU91dCwgcERlY29kZWRQYXRoLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCiAKICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCkBAIC0zMzU4LDcgKzI4MDksNyBAQAogICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCiAKICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwX3RtcDsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKIAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgpAQCAtMzM4Nyw3ICsyODM4LDcgQEAKICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCiAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAorICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIHRlbXAiKTsKIAogICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCkBAIC0zMzk5LDcgKzI4NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKiovCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBQYXJhbXMtPnBGaWxlVGVtcCwgcERlY29kZWRQYXRoLAorICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCiAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwogCiAjZWxzZQpAQCAtMzQ1MSw3ICsyOTAyLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzQ4NCwxMSArMjkzNSwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9IE00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIGZpbGUgcGF0aCBvZiAzZ3AgdG8gM2dwIik7CiAKQEAgLTM1MDEsOCArMjk1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIC8qKi8KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIChsZW5ndGggKyAxKSk7CiAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwogICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSA9IGxlbmd0aCsxOwogCkBAIC0zNTI3LDE1ICsyOTc4LDYgQEAKICAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKICAgICAgICAgICAgIH0KLSNpZiAwIC8qIENoYW5nZWQgdG8gYmUgYWJsZSB0byBtaXggd2l0aCB2aWRlbyBvbmx5IGZpbGVzICovCi0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID09IDAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZgogCiAgICAgICAgIH0KICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNTU5LDggKzMwMDEsOCBAQAogICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKICAgICB7CiAgICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0pLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSAmKHBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCisgICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKKyAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKIAogICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCkBAIC0zNjEzLDggKzMwNTUsOCBAQAogICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBX21hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTGVuZ3RoKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCisgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgKyAxLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJMb2NhbCBGcmFtaW5nIGZpbGUgcGF0aCIpOwogCiAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aApAQCAtMzYyNywxMCArMzA2OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvKiovCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+CisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBNNE9TQV9jaHJMZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT4KKyAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsIHN0cmxlbigKICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCkgKyAxKTsKIAogICAgICAgICAgICAgICAgIHBFeHQyID0KQEAgLTM2NDAsNyArMzA4Miw3IEBACiAjaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKIAogICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdDb250ZXh0KSwKICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwogCiAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKQEAgLTM2ODksMzIgKzMxMzEsMjcgQEAKIAogICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCiAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA8IDAKLSAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID4gMTAwICkKKyAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID4gMTAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lIDwgMAotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID4gMTAwICkKKyAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kIDwgMAotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA+IDEwMCApCisgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPCAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID4gMTAwICkKKyAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0IDwgMAotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKKyAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPSAxMDA7CiAgICAgICAgICAgICB9CkBAIC0zNzI0LDcgKzMxNjEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCiAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyAqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUiKTsKIApAQCAtMzc1OSw3ICszMTk2LDcgQEAKICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCiAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQogICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGxlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwRGVjb2RlZFBhdGgpOworICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+CkBAIC0zNzg4LDcgKzMyMjUsNyBAQAogCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX21hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAorICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCiAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKIAogICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKQEAgLTM4MDAsOCArMzIzNyw4IEBACiAgICAgICAgICAgICAgICAgLyoqLwogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKIAogICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQpAQCAtMzgxMCw3ICszMjQ3LDcgQEAKICNlbHNlCiAKICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAorICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCiAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKIAogICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCkBAIC0zODQxLDEwICszMjc4LDEwIEBACiAgICAgICAgICAgICBpZiggcEV4dDIgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogRGVjb2RlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHRvIHRoZSBlZmZlY3QsIGFuZCBmaWxsIGZyYW1pbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcEV4dDIgKz0gKE00T1NBX2Nockxlbmd0aChwRXh0MikgLSA0KTsKKyAgICAgICAgICAgICAgICBwRXh0MiArPSAoc3RybGVuKChjb25zdCBjaGFyICopcEV4dDIpIC0gNCk7CiAKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJDb21wYXJlKHBFeHQyLChNNE9TQV9DaGFyICopIi5yZ2IiLCAmcmVzdWx0MSk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfY2hyQ29tcGFyZShwRXh0MiwoTTRPU0FfQ2hhciAqKSIuUkdCIiwgJnJlc3VsdDIpOworICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7CisgICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKIAogICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKICAgICAgICAgICAgICAgICB7CkBAIC0zODUyLDcgKzMyODksNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0KICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCiAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAogICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKICAgICAgICAgICAgICAgICAgICAgICAgICopCkBAIC0zOTI0LDcgKzMzNjEsNyBAQAogI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCiAKICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAorICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwogCiAgICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQpAQCAtNDAyMiw3ICszNDU5LDcgQEAKICNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwogCiAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwogCiAgICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCkBAIC00MDYwLDcgKzM0OTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwogCiAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKKyAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKIAogICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKQEAgLTQwODgsMzQgKzM1MjUsMjcgQEAKIAogICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwogICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZQotICAgICAgICAgICAgICAgID4gMTAwICkKKyAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPCAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgPiAxMDAgKQorICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKKyAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA9IDEwMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlIDwgMAotICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQorICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA8IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPiAxMDAgKQorICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKICAgICAgICAgICAgICAgICB9CkBAIC00MTI2LDcgKzM1NTYsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLypBbGxvY2F0ZSB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlIik7CiAKQEAgLTQxNjAsNyArMzU5MCw3IEBACiAjZWxzZQogCiAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBX21hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAorICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgogICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7CiAKQEAgLTQyMzYsMTIgKzM2NjYsMTIgQEAKICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCiAKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplICsgMSwKICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgdGV4dCBidWZmZXIgZWZmZWN0Iik7CiAKICAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIgPQotICAgICAgICAgICAgICAgIC8vIE00T1NBX21hbGxvYyhNNE9TQV9jaHJMZW5ndGgocFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIpKzEsCisgICAgICAgICAgICAgICAgLy8gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSwKICAgICAgICAgICAgICAgICAvLyBNNFZTLCAiTG9jYWwgdGV4dCBidWZmZXIgZWZmZWN0Iik7CiAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCkBAIC00MjU2LDE4ICszNjg2LDE4IEBACiAKICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL000T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0KKyAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCiAgICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gTTRPU0FfY2hyTGVuZ3RoKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+CiAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgKyAxKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSB0ZXh0IFJHQiBidWZmZXIqLwogICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCisgICAgICAgICAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAogICAgICAgICAgICAgICAgICAgICBNNFZTLAogICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJSR0Igc3RydWN0dXJlIGZvciB0aGUgdGV4dCBlZmZlY3QiKTsKIApAQCAtNDMwNSw3ICszNzM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgMiAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwogICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwogICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodAogICAgICAgICAgICAgICAgICAgICAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiVGV4dCBSR0IgcGxhbmUtPnBhY19kYXRhIik7CkBAIC00NDM1LDcgKzM4NjUsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKKyAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QpLAogICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIGZpZnRpZXMgZWZmZWN0Iik7CiAKICAgICAgICAgICAgIGlmKCBmaWZ0aWVzQ3R4ID09IE00T1NBX05VTEwgKQpAQCAtNDQ3Niw3ICszOTA2LDcgQEAKICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCAqQ29sb3JDdHg7CiAKICAgICAgICAgICAgIENvbG9yQ3R4ID0KLSAgICAgICAgICAgICAgICAoTTR4VlNTX0NvbG9yU3RydWN0ICopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfQ29sb3JTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIChNNHhWU1NfQ29sb3JTdHJ1Y3QgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db2xvclN0cnVjdCksCiAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgY29sb3IgZWZmZWN0Iik7CiAKICAgICAgICAgICAgIGlmKCBDb2xvckN0eCA9PSBNNE9TQV9OVUxMICkKQEAgLTQ1MzUsMTkgKzM5NjUsMTcgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgorICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT4KICAgICAgICAgICAgICAgICAgICAgcEZpbGUpOwogICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCiAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAorICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayIpOwogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCkBAIC00NTU4LDEyICszOTg2LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBDb3B5IGlucHV0IHN0cnVjdHVyZSB0byBvdXIgc3RydWN0dXJlICovCi0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCisgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKKyAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKICAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICBNNE9TQV9tYWxsb2MoKE00T1NBX2Nockxlbmd0aChwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKKyAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQogICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCkBAIC00NTcyLDE1ICs0MDAwLDE1IEBACiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgTTRPU0FfY2hyTGVuZ3RoKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKSArIDEpOworICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAorICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKKyAgICAgICAgICAgIHN0cmxlbihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkgKyAxKTsKIAogI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAogICAgICAgICAvKiBEZWNvZGUgQkdNIHRyYWNrIHRvIHBjbSBvdXRwdXQgZmlsZSAqLwogCiAgICAgICAgIHBQYXJhbXMgPQotICAgICAgICAgICAgKE00eFZTU19NQ1NfcGFyYW1zICopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfTUNTX3BhcmFtcyksIE00VlMsCisgICAgICAgICAgICAoTTR4VlNTX01DU19wYXJhbXMgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19NQ1NfcGFyYW1zKSwgTTRWUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgTUNTIFBhcmFtcyAoZm9yIEJHTSkiKTsKIAogICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKQEAgLTQ2MDUsMTMgKzQwMzMsNiBAQAogICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBwUGFyYW1zOwogCi0jaWYgMCAvKiBOb3QgbmVjZXNzYXJ5LCBCR00gaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0cmFuc2NvZGluZyAqLwotICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGVsZW1lbnQgaW4gY2FzZSBvZiBvdGhlciBmaWxlIHRvIGNvbnZlcnQgKGNhbid0IGhhcHBlbiwgQkdNIC4uLikgKi8KLQotICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtczsKLQotI2VuZGlmCi0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTQ2MjYsMTUgKzQwNDcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc190ZW1wLT5wRmlsZUluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZUluKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVJbiA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIFBDTSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtc190ZW1wLT5wRmlsZU91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZU91dCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW4gcHJldmlvdXMgZWxlbWVudCB3aXRoIG5leHQgZWxlbWVudCA9IHJlbW92ZSBCR00gY2hhaW5lZApAQCAtNDY2NSwxMyArNDA4NiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zX3RlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfcHJldjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zX3RlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQ2OTcsMTMgKzQxMTgsNiBAQAogICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwogICAgICAgICAgICAgfQogCi0jaWYgMCAvKiBOb3QgbmVjZXNzYXJ5LCBCR00gaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0cmFuc2NvZGluZyAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHNhdmUgb2YgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAobm90IG5lY2Vzc2FyeSwgQkdNIC4uLikgKi8KLQotICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtczsKLQotI2VuZGlmCi0KICAgICAgICAgfQogCiAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX01DU19wYXJhbXMgZWxlbWVudCAqLwpAQCAtNDc2Myw3ICs0MTc3LDcgQEAKICAgICAgICAgLyogUHJlcGFyZSBvdXRwdXQgZmlsZW5hbWUgKi8KICAgICAgICAgLyogMjEgaXMgdGhlIHNpemUgb2YgInByZXZpZXdfMTYwMDBfMi5wY20iICsgXDAgKi8KICAgICAgICAgb3V0X3BjbSA9Ci0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKU00T1NBX21hbGxvYyhNNE9TQV9jaHJMZW5ndGgoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpCisgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4oeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpCiAgICAgICAgICAgICArIDIxLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZW1wIGNoYXIqIGZvciBwY21QcmV2aWV3RmlsZSIpOwogCiAgICAgICAgIGlmKCBvdXRfcGNtID09IE00T1NBX05VTEwgKQpAQCAtNDc3NSw3ICs0MTg5LDcgQEAKIAogICAgICAgICAvKiBDb3B5IHRlbXBvcmFyeSBwYXRoIHRvIGZpbmFsIHByZXZpZXcgcGF0aCBzdHJpbmcgKi8KICAgICAgICAgTTRPU0FfY2hyTkNvcHkob3V0X3BjbSwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsCi0gICAgICAgICAgICBNNE9TQV9jaHJMZW5ndGgoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpICsgMSk7CisgICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpICsgMSk7CiAKICAgICAgICAgLyogRGVwZW5kaW5nIG9mIHRoZSBvdXRwdXQgc2FtcGxlIGZyZXF1ZW5jeSBhbmQgbmIgb2YgY2hhbm5lbHMsIHdlIGNvbnN0cnVjdCBwcmV2aWV3CiAgICAgICAgIG91dHB1dCBmaWxlbmFtZSAqLwpAQCAtNDc4NSwxMiArNDE5OSwxMiBAQAogICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCiAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ2F0KG91dF9wY20sIChNNE9TQV9DaGFyICopInByZXZpZXdfMTYwMDBfMS5wY21cMCIsCisgICAgICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF9wY20sIChjb25zdCBjaGFyICopInByZXZpZXdfMTYwMDBfMS5wY21cMCIsCiAgICAgICAgICAgICAgICAgICAgIDIwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9jaHJOQ2F0KG91dF9wY20sIChNNE9TQV9DaGFyICopInByZXZpZXdfMTYwMDBfMi5wY21cMCIsCisgICAgICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF9wY20sIChjb25zdCBjaGFyICopInByZXZpZXdfMTYwMDBfMi5wY21cMCIsCiAgICAgICAgICAgICAgICAgICAgIDIwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDc5OCwxMyArNDIxMiwxMyBAQAogICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IFBDTSBmaWxlbmFtZSAqLwotICAgICAgICAgICAgTTRPU0FfY2hyTkNhdChvdXRfcGNtLCAoTTRPU0FfQ2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7CisgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18wODAwMF8xLnBjbVwwIiwgMjApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW91dF9wY20pOworICAgICAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7CiAgICAgICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKQEAgLTQ4MTcsNyArNDIzMSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfcGNtOwotICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCiAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgpAQCAtNDg0MywxMyArNDI1NywxMyBAQAogICAgICAgICAvKioKICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwogICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCisgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKIAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKICAgICAgICAgewogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpb3V0X3BjbSk7CisgICAgICAgICAgICBmcmVlKG91dF9wY20pOwogICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwogICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KQEAgLTQ4NTcsMTYgKzQyNzEsMTYgQEAKICAgICAgICAgICAgIC8qKi8KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSwgcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSwgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwogCiAgICAgICAgIC8qIEZyZWUgdGVtcG9yYXJ5IG91dHB1dCBmaWxlbmFtZSAqLwogICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKW91dF9wY20pOworICAgICAgICAgICAgZnJlZShvdXRfcGNtKTsKICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAorICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgQkdNIFBhcmFtczogZmlsZSBvdXQiKTsKIAogICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCkBAIC00ODc3LDQzICs0MjkxLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKIAotICAgICAgICBNNE9TQV9tZW1jcHkocFBhcmFtcy0+cEZpbGVPdXQsIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCiAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KIAotI2lmIDAKLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfbWFsbG9jKE00T1NBX2Nockxlbmd0aChvdXRfcGNtKSArIDEsIE00VlMsCi0gICAgICAgICAgICAicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilvdXRfcGNtKTsKLSAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBNNE9TQV9jaHJOQ29weSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlLCBvdXRfcGNtLAotICAgICAgICAgICAgTTRPU0FfY2hyTGVuZ3RoKG91dF9wY20pICsgMSk7Ci0KLSAgICAgICAgLyogRnJlZSB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmKCBvdXRfcGNtICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpb3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0jZW5kaWYKLQogICAgICAgICAvKioKICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KIAogICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCiAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgpAQCAtNDkzOSw3ICs0MzI0LDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAorICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKIAogICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKQEAgLTQ5NDgsNyArNDMzMyw3IEBACiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkocFBhcmFtcy0+cEZpbGVJbiwgcERlY29kZWRQYXRoLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCiAKICAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwpAQCAtNTAyNCwxMyArNDQwOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgdGhpcyBlbGVtZW50ICovCiAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc190ZW1wLT5wRmlsZU91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZU91dCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW4gcHJldmlvdXMgZWxlbWVudCB3aXRoIG5leHQgZWxlbWVudCAqLwpAQCAtNTA0NSw3ICs0NDMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcCA9PSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3RlbXAtPnBOZXh0ID09IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc190ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKQEAgLTUwNTQsMTQgKzQ0MzksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc190ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKICAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXNfdGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTA3OSwzMyArNDQ2NCwxNSBAQAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCiAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKKyAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIERlZmF1bHQgYmVoYXZpb3VyLCBpZiBubyBhdWRpby92aWRlbyBvdXRwdXQgZm9ybWF0IGlzIHNldCwgd2UgcHV0IEgyNjMvQU1SIGJ5IGRlZmF1bHQgKi8KLSNpZiAwCi0KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgfQotCi0jZW5kaWYKICAgICAvKiBDaGFuZ2VkIHRvIGJlIGFibGUgdG8gbWl4IHdpdGggdmlkZW8gb25seSBmaWxlcyAtPiBpbiBjYXNlIG5vIG1hc3RlciBjbGlwIGlzIGZvdW5kCiAgICAgKGkuZSBvbmx5IEpQRyBpbnB1dCBvciB2aWRlbyBvbmx5IGlucHV0KSAqLwogICAgIC8qIGFuZCBpZiB0aGVyZSBpcyBhIEJHTSwgd2UgZm9yY2UgdGhlIGFkZGVkIHZvbHVtZSB0byAxMDAgKGkuZSByZXBsYWNlIGF1ZGlvKSAqLwpAQCAtNTE0NSw3ICs0NTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IE00T1NBX2Nockxlbmd0aChwRGVjb2RlZFBhdGgpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0CiAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+CkBAIC01Mzg2LDcgKzQ3NTMsNyBAQAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICB7CiAgICAgICAgICAgICAvKml0IG1lYW5zIHRoYXQgcE91dHB1dEZpbGUgaGFzIGJlZW4gYWxsb2NhdGVkIGluIE00eFZTU19zZW5kQ29tbWFuZCgpKi8KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKICAgICAgICAgfQpAQCAtNTQxNSw3ICs0NzgyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV9tYWxsb2MoZmlsZVBhdGhTaXplICsgMSwgTTRWUywKKyAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZpbGVQYXRoU2l6ZSArIDEsIE00VlMsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBvdXRwdXQgZmlsZSIpOwogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQpAQCAtNTQyMyw3ICs0NzkwLDcgQEAKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSwgcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSwgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGZpbGVQYXRoU2l6ZSArIDEpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlW2ZpbGVQYXRoU2l6ZV0gPSAnXDAnOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGZpbGVQYXRoU2l6ZTsKQEAgLTU0MzUsNyArNDgwMiw3IEBACiAgICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KICAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwogICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBX21hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCisgICAgICAgIChNNFZTUzNHUFBfRWRpdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWRpdFNldHRpbmdzKSwKICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nLCBjb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKIAogICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzID09IE00T1NBX05VTEwgKQpAQCAtNTQ0NCwxNSArNDgxMSwxNSBAQAogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgIH0KIAogICAgIC8qIENvcHkgc2V0dGluZ3MgZnJvbSBpbnB1dCBzdHJ1Y3R1cmUgKi8KLSAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KSAmKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAorICAgIG1lbWNweSgodm9pZCAqKSAmKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MpLAorICAgICAgICAodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTKSwKICAgICAgICAgc2l6ZW9mKE00eFZTU19FZGl0U2V0dGluZ3MpKTsKIAogICAgIC8qIEluaXRpYWxpemUgcEVkaXRTYXZpbmdTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KQEAgLTU0NjYsNyArNDgzMyw3IEBACiAKICAgICAvKiBBbGxvY2F0ZSBzYXZpbmdTZXR0aW5ncy5wQ2xpcExpc3QvcFRyYW5zaXRpb25zIHN0cnVjdHVyZSAqLwogICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdCA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoKLSAgICAgICAgKiApTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopCisgICAgICAgICogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKQogICAgICAgICAqcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLAogICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTLCBzYXZpbmcgLCBjb3B5IG9mIHBDbGlwTGlzdCIpOwogCkBAIC01NDc2LDcgKzQ4NDMsNyBAQAogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwpAQCAtNTQ4NSw3ICs0ODUyLDcgQEAKICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID4gMSApCiAgICAgewogICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqCi0gICAgICAgICAgICAqIClNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKKyAgICAgICAgICAgICogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKQogICAgICAgICAgICAgKihwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSwKICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIHNhdmluZywgY29weSBvZiBwVHJhbnNpdGlvbkxpc3QiKTsKIApAQCAtNTQ5NSw3ICs0ODYyLDcgQEAKIAogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CkBAIC01NTA5LDcgKzQ4NzYsNyBAQAogICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQogICAgIHsKICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKKyAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7CiAKICAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKQEAgLTU1MTgsNyArNDg4NSw3IEBACiAKICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwpAQCAtNTUyOSw3ICs0ODk2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfbWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyksCiAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikic2F2aW5nIHRyYW5zaXRpb24gc2V0dGluZ3MiKTsKIAogICAgICAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKQEAgLTU1MzgsNyArNDkwNSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKQEAgLTU1NjYsNyArNDkzMyw3IEBACiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCiAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7CisgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKIAogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAogICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KQEAgLTU1ODgsOCArNDk1NSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNTU5OSwxMCArNDk2NSwxMCBAQAogCiAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikKKyAgICAgICAgICAgICAgICBmcmVlKAogICAgICAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKICAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV9tYWxsb2MoKGxlbmd0aCArIDEpLAorICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCiAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7CiAKICAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKQEAgLTU2MTEsMTQgKzQ5NzcsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwogICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKQEAgLTU2MjcsOSArNDk5Miw5IEBACiAgICAgICAgICAgICAgICAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCiAgICAgICAgICAgICAgICAgLSAxICkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgorICAgICAgICAgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgogICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSk7CiAgICAgICAgICAgICB9CkBAIC01NjQyLDcgKzUwMDcsNyBAQAogCiAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CkBAIC01NjY0LDcgKzUwMjksNyBAQAogICAgIGlmKCBuYkVmZmVjdHMgIT0gMCApCiAgICAgewogICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV9tYWxsb2MobmJFZmZlY3RzCisgICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwogICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKICAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKIApAQCAtNTY3NCw3ICs1MDM5LDcgQEAKIAogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CkBAIC01NjgyLDggKzUwNDcsOCBAQAogCiAgICAgICAgIC8qIEp1c3QgY29weSBlZmZlY3Qgc3RydWN0dXJlIHRvIHNhdmluZyBzdHJ1Y3R1cmUsIGFzIGVmZmVjdHMgdGltZSBhcmUgbm93ICovCiAgICAgICAgIC8qIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwIHRpbWUqLwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMsCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCisgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAogICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwogICAgIH0KICAgICBlbHNlCkBAIC01NzExLDcgKzUwNzYsNyBAQAogCiAgICAgICAgIC8qKi8KICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBX21hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKKyAgICAgICAgICAgIChNNHhWU1NfQkdNU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncyksIE00VlMsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhcgogICAgICAgICAgICAgKikiU2F2aW5nIHNldHRpbmdzLCBlZmZlY3RzIHRhYmxlIG9mIHN0cnVjdHVyZSBzZXR0aW5ncyIpOwogCkBAIC01NzIxLDcgKzUwODYsNyBAQAogCiAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKQEAgLTU3MjksMTMgKzUwOTQsMTMgQEAKIAogICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwogICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAorICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCiAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSk7CiAKICAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfbWFsbG9jKAotICAgICAgICAgICAgKE00T1NBX2Nockxlbmd0aCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQorICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCisgICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCiAgICAgICAgICAgICArIDEpLAogICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKIApAQCAtNTc0NiwxNCArNTExMSwxNCBAQAogCiAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgIE00T1NBX2Nockxlbmd0aCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQorICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCisgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCisgICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKICAgICAgICAgICAgICsgMSk7CiAKICAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwpAQCAtNTc3Nyw3ICs1MTQyLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTU3ODUsMTAgKzUxNTAsOSBAQAogICAgICAgICAgICAgcERlY29kZWRQYXRoID0KICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKIAotICAgICAgICAgICAgTTRPU0FfZnJlZSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7CisgICAgICAgICAgICBmcmVlKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7CiAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGxlbmd0aCArIDEsIE00VlMsIChNNE9TQV9DaGFyCisgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKICAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7CiAKICAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCkBAIC01Nzk3LDEzICs1MTYxLDEzIEBACiAKICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX21lbWNweShwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiovCkBAIC01ODEyLDEzICs1MTc2LDEzIEBACiAgICAgICAgIE00T1NBX2Nock5Db3B5KG91dF8zZ3BfdG1wLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwogCiAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG91dF8zZ3AsIChNNE9TQV9DaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBNNE9TQV9jaHJOQ2F0KG91dF8zZ3BfdG1wLCAoTTRPU0FfQ2hhciAqKSJzYXZldGVtcC50bXBcMCIsIDEzKTsKKyAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOworICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwogCiAgICAgICAgIC8qKgogICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBNNE9TQV9jaHJMZW5ndGgocERlY29kZWRQYXRoKTsKKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCiAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgpAQCAtNTgzNiw3ICs1MjAwLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTU4NDgsNyArNTIxMiw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCiAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfbWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCisgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAogICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogVGVtcCBmaWxlbmFtZSBpbiBjYXNlIG9mIEJHTSIpOwogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKQEAgLTU4NTcsMTkgKzUyMjEsMTkgQEAKIAogICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfbWVtY3B5KHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUsCisgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7CiAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGggKyAxOwogCiAgICAgICAgIC8qKgogICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwogICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwX3RtcDsKLSAgICAgICAgbGVuZ3RoID0gTTRPU0FfY2hyTGVuZ3RoKHBEZWNvZGVkUGF0aCk7CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAogICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKQEAgLTU4ODcsNyArNTI1MSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC01ODk5LDcgKzUyNjMsNyBAQAogICAgICAgICAvKioKICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwogICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBX21hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAorICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXBvcmFyeSBmaWxlIik7CiAKICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID09IE00T1NBX05VTEwgKQpAQCAtNTkwOCwxMyArNTI3MiwxMyBAQAogCiAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9tZW1jcHkoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOworICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKKyAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKIAogICAgICAgICAvKiBQdXQgbmIgb2Ygc3RlcCBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyB0byAyLCBiZWNhdXNlIGF1ZGlvIG1peGluZyBpcyBuZWVkZWQgKi8KICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCA9IDI7CkBAIC01OTQ0LDcgKzUzMDgsNyBAQAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTAogICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgogICAgICAgICAgICAgICAgIHBPdXRwdXRGaWxlKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwpAQCAtNTk1MywxNCArNTMxNywxNCBAQAogICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAogICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgogICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwpAQCAtNjAwOSw3ICs1MzczLDcgQEAKIAogICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTYwOTEsOSArNTQ1NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IE00T1NBX21lbWNtcChwVlNTQ29udGV4dC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtpXS5wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGUsICh2b2lkICopcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtpXS5wRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWU1NDb250ZXh0LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5maWxlUGF0aFNpemUpOwpAQCAtNjEyNSw0NSArNTQ4OSw0NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfY2hyRmluZFBhdHRlcm4oeFZTU19jb250ZXh0LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsICZ0b3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wU3RyID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NockZpbmRQYXR0ZXJuKHBWU1NDb250ZXh0LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgJnRvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPSBwVlNTQ29udGV4dC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNE5PX0VSUk9SICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9jaHJMZW5ndGgocFRtcFN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfY2hyRmluZFBhdHRlcm4ocFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImltZyIsICZ0b3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJGaW5kUGF0dGVybihwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInZpZCIsICZ0b3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXBUbXBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikidmlkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE5PX0VSUk9SICkgLyogSXQgbWVhbnMgdGhlIGZpbGUgaXMgYSB0ZW1wb3JhcnkgZmlsZSwgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBkZWxldGUgaXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHBWU1NDb250ZXh0LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjU5NSwxMiArNTk1OSwxMiBAQAogICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKICAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwogICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwogICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgICB9CkBAIC02NzAwLDg0ICs2MDY0LDI1IEBACiAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCiAgICAgICAgICE9IE00T1NBX05VTEwgKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT4KICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcik7CiAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyID0KICAgICAgICAgICAgIE00T1NBX05VTEw7CiAgICAgfQogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKKyAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7CiAKLSAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOworICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwogICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKIAotICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQpOworICAgIGZyZWUoeFZTU19jb250ZXh0KTsKICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwogICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwogCiAgICAgcmV0dXJuIE00Tk9fRVJST1I7CiB9CiAKLU00T1NBX0VSUiBNNHhWU1NfUmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlciggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhICkKLXsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICAvKiBIZXJlIHRoZSBzaXR1YXRpb24gaXMgYSBiaXQgc3BlY2lhbDogd2UgbmVlZCB0byByZWNvcmQgdGhlIHJlZ2lzdHJhdGlvbnMgdGhhdCBhcmUgbWFkZSwKLSAgICBzbyB0aGF0IHdlIGNhbiByZXBsYXkgdGhlbSBmb3IgZWFjaCBjbGlwIHdlIGNyZWF0ZS4gKi8KLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNFZEX2tWaWRlb1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbZGVjb2RlclR5cGVdLnBEZWNvZGVySW50ZXJmYWNlID0KLSAgICAgICAgcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2RlY29kZXJUeXBlXS5wVXNlckRhdGEgPSBwVXNlckRhdGE7Ci0gICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2RlY29kZXJUeXBlXS5yZWdpc3RlcmVkID0gTTRPU0FfVFJVRTsKLQotICAgIC8qIE5vdGljZSBpdCBvdmVyd3JpdGVzIGFueSBIVyBkZWNvZGVyIHRoYXQgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZTsKLSAgICB0aGlzIGlzIG5vcm1hbC4qLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLX0KLQotTTRPU0FfRVJSIE00eFZTU19SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVfRW5jb2RlclR5cGUgZW5jb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRV9JbnRlcmZhY2UgKnBFbmNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIC8qIEhlcmUgdGhlIHNpdHVhdGlvbiBpcyBhIGJpdCBzcGVjaWFsOiB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgcmVnaXN0cmF0aW9ucyB0aGF0IGFyZSBtYWRlLAotICAgIHNvIHRoYXQgd2UgY2FuIHJlcGxheSB0aGVtIGZvciBlYWNoIGNsaXAgd2UgY3JlYXRlLiAqLwotCi0gICAgaWYoIGVuY29kZXJUeXBlID49IE00VkVfa0VuY29kZXJUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2VuY29kZXJUeXBlXS5wRW5jb2RlckludGVyZmFjZSA9Ci0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlOwotICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tlbmNvZGVyVHlwZV0ucFVzZXJEYXRhID0gcFVzZXJEYXRhOwotICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tlbmNvZGVyVHlwZV0ucmVnaXN0ZXJlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKiBOb3RpY2UgaXQgb3ZlcndyaXRlcyBhbnkgSFcgZW5jb2RlciB0aGF0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGU7Ci0gICAgdGhpcyBpcyBub3JtYWwuKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHByb3RvdHlwZSAgICBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfaW50ZXJuYWwuYwppbmRleCA3MWE4OTI5Li4zOTFjOTQ1IDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKQEAgLTIzLDcgKzIzLDYgQEAKICAqLwogI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCiAjaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlRXh0cmEuaCIKIAogI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKIApAQCAtOTQsNDQgKzkzLDYgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAvKiByZXBsYXkgcmVjb3JkZWQgZXh0ZXJuYWwgZGVjb2RlciByZWdpc3RyYXRpb25zIG9uIHRoZSBNQ1MgKi8KLSAgICBmb3IgKGk9MDsgaTxNNFZEX2tWaWRlb1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICh4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucmVnaXN0ZXJlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJFeHRlcm5hbFZpZGVvRGVjb2RlcihtY3NfY29udGV4dCwgaSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxEZWNzW2ldLnBEZWNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucFVzZXJEYXRhKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZzpcCi0gICAgICAgICAgICAgICAgICAgICBNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICAvKiByZXBsYXkgcmVjb3JkZWQgZXh0ZXJuYWwgZW5jb2RlciByZWdpc3RyYXRpb25zIG9uIHRoZSBNQ1MgKi8KLSAgICBmb3IgKGk9MDsgaTxNNFZFX2tFbmNvZGVyVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5yZWdpc3RlcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19yZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKG1jc19jb250ZXh0LCBpLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbaV0ucEVuY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRW5jc1tpXS5wVXNlckRhdGEpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nOlwKLSAgICAgICAgICAgICAgICAgICAgIE00TUNTX3JlZ2lzdGVyRXh0ZXJuYWxWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCiAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAogICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LApAQCAtMTcxLDkgKzEzMiw2IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICAvKiovCi0jaWZkZWYgVElNRVNDQUxFX0JVRwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotI2VuZGlmCiAgICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCiAgICAgLy8gU2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZWZmZWN0czsgMCBmb3Igbm93LgogICAgIFBhcmFtcy5uYkVmZmVjdHMgPSAwOwpAQCAtMzA2LDcgKzI2NCw3IEBACiAgICAgTTRPU0FfRVJSIGVycj1NNE5PX0VSUk9SOwogCiAKLSAgICBNNE9TQV9VSW50OCAqcFRtcERhdGEgPSAoTTRPU0FfVUludDgqKSBNNE9TQV9tYWxsb2MoZnJhbWVTaXplX2FyZ2IsCisgICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAogICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKICAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7CkBAIC0zMjMsNyArMjgxLDcgQEAKICAgICB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAogICAgICAgICAgICAgQ2FuJ3Qgb3BlbiBpbnB1dCBBUkdCODg4OCBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOworICAgICAgICBmcmVlKHBUbXBEYXRhKTsKICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQpAQCAtMzM0LDcgKzI5Miw3IEBACiAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBDYW4ndCBjbG9zZSBBUkdCODg4OFwKICAgICAgICAgICAgICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwogICAgICAgICBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBEYXRhKTsKKyAgICAgICAgZnJlZShwVG1wRGF0YSk7CiAgICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KQEAgLTM0NCwxOCArMzAyLDE4IEBACiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAogICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wRGF0YSk7CisgICAgICAgIGZyZWUocFRtcERhdGEpOwogICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7CiAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAKLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MoZnJhbWVTaXplLCBNNFZTLAorICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsCiAgICAgICAgICAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKICAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKICAgICB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCiAgICAgICAgICAgICBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwVG1wRGF0YSk7CisgICAgICAgIGZyZWUocFRtcERhdGEpOwogICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgfQogCkBAIC0zNzEsMTkgKzMyOSwxOSBAQAogICAgICAgICByZ2JQbGFuZTEucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpXTsKICAgICAgICAgaisrOwogICAgIH0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBEYXRhKTsKKyAgICAgICAgZnJlZShwVG1wRGF0YSk7CiAKICAgICAvKiBUbyBDaGVjayBpZiByZXNpemluZyBpcyByZXF1aXJlZCB3aXRoIGNvbG9yIGNvbnZlcnNpb24gKi8KICAgICBpZih3aWR0aCAhPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggfHwgaGVpZ2h0ICE9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgUmVzaXppbmcgOiIpOwogICAgICAgICBmcmFtZVNpemUgPSAgKCBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMyk7Ci0gICAgICAgIHJnYlBsYW5lMi5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYyhmcmFtZVNpemUsIE00VlMsCisgICAgICAgIHJnYlBsYW5lMi5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemUsIE00VlMsCiAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7CiAgICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQogICAgICAgICB7CiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBEYXRhKTsKKyAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICB9CiAgICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKQEAgLTM5Niw4ICszNTQsOCBAQAogICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKICAgICAgICAgewogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcmdiUGxhbmUxLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgLypDb252ZXJ0aW5nIFJlc2l6ZWQgUkdCODg4IHRvIFlVVjQyMCAqLwpAQCAtNDA1LDEyICszNjMsMTIgQEAKICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCiAgICAgICAgIHsKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0I4ODggdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcmdiUGxhbmUxLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lMS5wYWNfZGF0YSk7CisgICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7CisgICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7CiAKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKIApAQCAtNDI0LDcgKzM4Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwogICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcmdiUGxhbmUxLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKIAogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlJHQiB0byBZVVYgZG9uZSIpOwogICAgIH0KQEAgLTQ2Myw3ICs0MjEsNyBAQAogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIE00VklGSV9JbWFnZVBsYW5lICp5dXZQbGFuZSA9IE00T1NBX05VTEw7CiAKLSAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfbWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKKyAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwogICAgIGlmKHl1dlBsYW5lID09IE00T1NBX05VTEwpIHsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCkBAIC00NzQsNyArNDMyLDcgQEAKICAgICB5dXZQbGFuZVswXS51X3dpZHRoID0gd2lkdGg7CiAgICAgeXV2UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKICAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfbWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0IFwKKyAgICB5dXZQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh5dXZQbGFuZVswXS51X2hlaWdodCBcCiAgICAgICAgICogeXV2UGxhbmVbMF0udV93aWR0aCAqIDEuNSwgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsKIAogICAgIHl1dlBsYW5lWzFdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwpAQCAtNDk1LDcgKzQ1Myw3IEBACiAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgcmV0dXJuIGVycm9yOiAweCV4XG4iLCBlcnIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeXV2UGxhbmUpOworICAgICAgICBmcmVlKHl1dlBsYW5lKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKQEAgLTYwMCw5ICs1NTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRpZ291cyBwbGFuZXMgaW4gbWVtb3J5KSAqLwogICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lLT5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lLT5wYWNfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BEZWNvZGVkUGxhbmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwogICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTYyOSw0OSArNTg3LDYgQEAKICAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCiAgICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7CiAgICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0jaWYgMAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaGVjayBzaXplIG9mIG91dHB1dCBKUEVHIGlzIGNvbXBhdGlibGUgd2l0aCBwYW4gJiB6b29tIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgIEZpcnN0LCBjaGVjayBmaW5hbCAoYikgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiV0FSTklORyA6IEJhZCBmaW5hbCBQYW4gJiBab29tIHNldHRpbmdzICEhIVwKLSAgICAgICAgICAgICAgICAgICAgTmV3IGZpbmFsIFpvb20gcmF0aW8gaXM6ICVkIiwgKDEwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiKSk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZG8gbm90IGNoYW5nZSB0aGUgdG9wbGVmdCBwYXJhbWV0ZXIgYXMgaXQgbWF5IGNvcnJlc3BvbmQgdG8gYSBwcmVjaXNlIGFyZWEKLSAgICAgICAgICAgICAgICBvZiB0aGUgcGljdHVyZSAtPiBvbmx5IHRoZSB6b29tIHJhdGlvIGlzIG1vZGlmaWVkICovCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJXQVJOSU5HIDogQmFkIGZpbmFsIFBhbiAmIFpvb20gc2V0dGluZ3MgXAotICAgICAgICAgICAgICAgICAgICAhISEgTmV3IGZpbmFsIFpvb20gcmF0aW8gaXM6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKDEwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliKSk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZG8gbm90IGNoYW5nZSB0aGUgdG9wbGVmdCBwYXJhbWV0ZXIgYXMgaXQgbWF5IGNvcnJlc3BvbmQgdG8gYQotICAgICAgICAgICAgICAgIHByZWNpc2UgYXJlYSBvZiB0aGUgcGljdHVyZSAtPiBvbmx5IHRoZSB6b29tIHJhdGlvIGlzIG1vZGlmaWVkICovCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZW4sIGNoZWNrIGluaXRpYWwgKGEpIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIldBUk5JTkcgOiBCYWQgaW5pdGlhbCBQYW4gJiBab29tIHNldHRpbmdzICEhISBcCi0gICAgICAgICAgICAgICAgICAgIE5ldyBpbml0aWFsIFpvb20gcmF0aW8gaXM6ICVkIiwoMTAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEpKTsKLSAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgY2hhbmdlIHRoZSB0b3BsZWZ0IHBhcmFtZXRlciBhcyBpdCBtYXkgY29ycmVzcG9uZCB0byBhIHByZWNpc2UKLSAgICAgICAgICAgICAgICBhcmVhIG9mIHRoZSBwaWN0dXJlLT4gb25seSB0aGUgem9vbSByYXRpbyBpcyBtb2RpZmllZCAqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSAxMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiV0FSTklORyA6IEJhZCBpbml0aWFsIFBhbiAmIFpvb20gc2V0dGluZ3MgISEhIE5ldyBpbml0aWFsXAotICAgICAgICAgICAgICAgICAgICAgWm9vbSByYXRpbyBpczogJWQiLCAoMTAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpKTsKLSAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgY2hhbmdlIHRoZSB0b3BsZWZ0IHBhcmFtZXRlciBhcyBpdCBtYXkgY29ycmVzcG9uZCB0byBhIHByZWNpc2UKLSAgICAgICAgICAgICAgICBhcmVhIG9mIHRoZSBwaWN0dXJlLT4gb25seSB0aGUgem9vbSByYXRpbyBpcyBtb2RpZmllZCAqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSAxMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgLypDaGVjayB0aGF0IHRoZSByYXRpbyBpcyBub3QgMCovCiAgICAgICAgICAgICAvKkNoZWNrIChhKSBwYXJhbWV0ZXJzKi8KICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPT0gMCkKQEAgLTg3OCwxMiArNzkzLDEyIEBACiAKICAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcEltYWdlUGxhbmVzWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSxZX1BMQU5FX0JPUkRFUl9WQUxVRSk7Ci0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBJbWFnZVBsYW5lc1sxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSksVV9QTEFORV9CT1JERVJfVkFMVUUpOwotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpLFZfUExBTkVfQk9SREVSX1ZBTFVFKTsKKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKKyAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOworICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAorICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7CisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCisgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KQEAgLTE0NzEsOCArMTM4Niw4IEBACiAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7CiAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BEZWNvZGVkUGxhbmUpOworICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7CisgICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCiAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGluaXRpYWxpemluZyBBSVI6IDB4JXgiLCBlcnIpOwpAQCAtMTQ4Niw4ICsxNDAxLDggQEAKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwogICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOworICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtMTQ5Nyw4ICsxNDEyLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZ2V0dGluZyBBSVIgcGxhbmU6IDB4JXgiLCBlcnIpOwogICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcERlY29kZWRQbGFuZSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOworICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtMTUzMyw4ICsxNDQ4LDggQEAKICAgICAgICAgfQogICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BEZWNvZGVkUGxhbmUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bV9wRGVjb2RlZFBsYW5lKTsKKyAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7CisgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwogICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOwpAQCAtMTU5NiwyNSArMTUxMSw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgLyogcmVwbGF5IHJlY29yZGVkIGV4dGVybmFsIGVuY29kZXIgcmVnaXN0cmF0aW9ucyBvbiB0aGUgUFRPM0dQUCAqLwotICAgIGZvciAoaT0wOyBpPE00VkVfa0VuY29kZXJUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAoeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2ldLnJlZ2lzdGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9SZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKHBNNFBUTzNHUFBfQ3R4dCwgaSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2ldLnBFbmNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbaV0ucFVzZXJEYXRhKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9yZWdpc3RlckV4dGVybmFsVmlkZW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfbWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCisgICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCiAgICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwogICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKICAgICB7CkBAIC0xNjI4LDcgKzE1MjUsNyBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlICJkdW1teSIgYW1yIGZpbGUgY29udGFpbmluZyBzaWxlbmNlIGluIHRlbXBvcmFyeSBmb2xkZXIgKi8KICAgICBNNE9TQV9jaHJOQ29weShvdXRfYW1yLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgIE00T1NBX2Nock5DYXQob3V0X2FtciwgKE00T1NBX0NoYXIgKikiZHVtbXkuYW1yXDAiLCAxMCk7CisgICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwogCiAgICAgLyoqCiAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCkBAIC0xNzM5LDcgKzE2MzYsNyBAQAogICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKICAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcENhbGxCYWNrQ3R4dCk7CisgICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwogICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKQEAgLTE3NzcsNyArMTY3NCw3IEBACiAgICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KICAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQpOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCk7CiAgICAgICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0xODAzLDcgKzE3MDAsNyBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwogICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgTTRPU0FfY2hyTkNhdChvdXRfYW1yLCAoTTRPU0FfQ2hhciAqKSJkdW1teS5hbXJcMCIsIDEwKTsKKyAgICBzdHJuY2F0KChjaGFyICopb3V0X2FtciwgKGNvbnN0IGNoYXIgKikiZHVtbXkuYW1yXDAiLCAxMCk7CiAKICAgICAvKioKICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCB0aGUgdGVtcG9yYXJ5IHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KQEAgLTE4MjUsMTAgKzE3MjIsMTAgQEAKICAgICB9CiAgICAgLyoqCiAgICAgKiBFbmQgb2YgdGhlIGNvbnZlcnNpb24sIG5vdyB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHBEZWNvZGVkUGF0aCk7CisgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKIAogICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24qLwotLyogICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKG91dF9hbXIpOworLyogICAgcmVtb3ZlKG91dF9hbXIpOwogICovCiAKICAgICB4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCA9IE00T1NBX05VTEw7CkBAIC0xODU2LDcgKzE3NTMsNyBAQAogCiAgICAgLyoqCiAgICAgICogQWxsb2NhdGUgb3V0cHV0IFlVViBwbGFuZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV9tYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAorICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCiAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCiAgICAgewpAQCAtMTg2OCw3ICsxNzY1LDcgQEAKICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7CiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7CiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKKyAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoXAogICAgICAgICAgICAgKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQqMyk+PjEsIE00VlMsIChNNE9TQV9DaGFyICopXAogICAgICAgICAgICAgICAgICJBbGxvYyBmb3IgdGhlIENvbnZlcnRpb24gb3V0cHV0IFlVViIpOzsKICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCkBAIC0xOTgyLDcgKzE4NzksNyBAQAogICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0IHdpZHRoIGFuZCBoZWlnaHQgJWQgJWQgIiwKICAgICAgICAgZnJhbWluZ0N0eC0+d2lkdGgsZnJhbWluZ0N0eC0+aGVpZ2h0KTsKIAotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBX21hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKVwKKyAgICBNNE9TQV9VSW50OCAqcFRtcERhdGEgPSAoTTRPU0FfVUludDgqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX2FyZ2IsIE00VlMsIChNNE9TQV9DaGFyKilcCiAgICAgICAgICJJbWFnZSBhcmdiIGRhdGEiKTsKICAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7CkBAIC0yMDAyLDcgKzE4OTksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBEYXRhKTsKKyAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwogICAgICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtMjAxOCw3ICsxOTE1LDcgQEAKICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKICAgICB7CiAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlLCBlcnIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOworICAgICAgICBmcmVlKHBUbXBEYXRhKTsKICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTIwMjcsNyArMTkyNCw3IEBACiAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCiAgICAgewogICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOworICAgICAgICBmcmVlKHBUbXBEYXRhKTsKICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTIwMzcsNyArMTkzNCw3IEBACiAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3QgY2xvc2UgaW5wdXQgcG5nIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlLCBlcnIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOworICAgICAgICBmcmVlKHBUbXBEYXRhKTsKICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTIwNDksMTIgKzE5NDYsMTIgQEAKICAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwogCiAgICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKKyAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwogICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFRtcERhdGEpOworICAgICAgICBmcmVlKHBUbXBEYXRhKTsKICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgIH0KIApAQCAtMjA4NywxOCArMTk4NCwxOCBAQAogICAgICAgICBqKys7CiAgICAgfQogCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBUbXBEYXRhKTsKKyAgICBmcmVlKHBUbXBEYXRhKTsKICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7CiAKICAgICAvKiBjb252ZXJ0IFJHQjg4OCB0byBSR0I1NjUgKi8KIAogICAgIC8qIGFsbG9jYXRlIHRlbXAgUkdCIDU2NSBidWZmZXIgKi8KLSAgICBUZW1wUGFjRGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYyhmcmFtZVNpemUgKworICAgIFRlbXBQYWNEYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSArCiAgICAgICAgICAgICAgICAgICAgICAgICg0ICogKGZyYW1pbmdDdHgtPndpZHRoICsgZnJhbWluZ0N0eC0+aGVpZ2h0ICsgMSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjU2NSBkYXRhIik7CiAgICAgaWYgKFRlbXBQYWNEYXRhID09IE00T1NBX05VTEwpIHsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShyZ2JQbGFuZS5wYWNfZGF0YSk7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAKQEAgLTIxMTMsNyArMjAxMCw3IEBACiAgICAgfQogCiAgICAgLyogZnJlZSB0aGUgUkJHODg4IGFuZCBhc3NpZ24gUkdCNTY1ICovCi0gICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lLnBhY19kYXRhKTsKKyAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IFRlbXBQYWNEYXRhOwogCiAgICAgLyoqCkBAIC0yMTUwLDE0ICsyMDQ3LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IFJHQiBvdXRwdXQgYnVmZmVyIGluIHdoaWNoIGFsbCBkZWNvZGVkIGRhdGEKICAgICAgICAgICArIHdoaXRlIGxpbmUgd2lsbCBiZSBjb3BpZWQgKi8KLSAgICAgICAgbmV3UkdCcGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MocmdiUGxhbmUudV9oZWlnaHQqcmdiUGxhbmUudV93aWR0aCoyXAorICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCiAgICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7CiAKICAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKICAgICAgICAgewogICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAogICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHI4KXJnYlBsYW5lLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICB9CiAKQEAgLTIxNjYsNyArMjA2Myw3IEBACiAKICAgICAgICAgZm9yKGk9MDtpPHJnYlBsYW5lLnVfaGVpZ2h0O2krKykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClvdXRwdXRfcGFjX2RhdGEsIChNNE9TQV9NZW1BZGRyOClpbnB1dF9wYWNfZGF0YSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW91dHB1dF9wYWNfZGF0YSwgKHZvaWQgKilpbnB1dF9wYWNfZGF0YSwKICAgICAgICAgICAgICAgICAgKHJnYlBsYW5lLnVfd2lkdGgtMSkqMik7CiAKICAgICAgICAgICAgIG91dHB1dF9wYWNfZGF0YSArPSAoKHJnYlBsYW5lLnVfd2lkdGgtMSkqMik7CkBAIC0yMTc2LDcgKzIwNzMsNyBAQAogCiAgICAgICAgICAgICBpbnB1dF9wYWNfZGF0YSArPSAoKHJnYlBsYW5lLnVfd2lkdGgtMSkqMik7CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjgpcmdiUGxhbmUucGFjX2RhdGEpOworICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBuZXdSR0JwYWNfZGF0YTsKICAgICB9CiAKQEAgLTIyNjUsNyArMjE2Miw3IEBACiAKICAgICAvKioKICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV9tYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKICAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwogICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKICAgICB7CkBAIC0yMjg5LDcgKzIxODYsNyBAQAogICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwogCiAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV9tYWxsb2MoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQqZnJhbWluZ0N0eC0+XAorICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCpmcmFtaW5nQ3R4LT5cCiAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+dV93aWR0aCoyKnNpemVvZihNNFZJRklfVUludDgpLCBNNFZTLAogICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGFjX2RhdGEgUkdCIik7CiAKQEAgLTIyOTcsOCArMjE5NCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIFwKICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcmdiUGxhbmUucGFjX2RhdGEpOworICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwogICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICB9CiAKQEAgLTIzMTgsNyArMjIxNSw3IEBACiAKICAgICAgICAgaWYocmdiUGxhbmUucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXJnYlBsYW5lLnBhY19kYXRhKTsKKyAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwogICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtMjM1MCwxMiArMjI0NywxMiBAQAogICAgIC8qKgogICAgICAqIENvbnZlcnQgIFJHQiBvdXRwdXQgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcKICAgICAgZWZmZWN0ICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfbWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAogICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7CiAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQogICAgIHsKICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOworICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgIH0KIApAQCAtMjM2NCwxNCArMjI2MSwxNCBAQAogICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7CiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwogICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfbWFsbG9jCisgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwogICAgICAgICAoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KSwgTTRWUywKICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jIGZvciB0aGUgb3V0cHV0IFkiKTsKICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKQEAgLTIzODAsMTMgKzIyNzcsMTMgQEAKICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKIAogCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYygKKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAogICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7CiAgICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAKQEAgLTIzOTYsMTQgKzIyOTMsMTQgQEAKICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKIAogCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBX21hbGxvYygKKyAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0LCBNNFZTLAogICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlICBvdXRwdXQgViIpOwogICAgIGlmIChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEpOwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7CiAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICB9CiAKQEAgLTI0MTcsNyArMjMxNCw2IEBACiAgICAgewogICAgICAgICBNNE9TQV9UUkFDRTFfMSgiU1BTIHBuZzogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKICAgICB9Ci0KICAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTI0NTMsNDQgKzIzNDksNiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIC8qIHJlcGxheSByZWNvcmRlZCBleHRlcm5hbCBkZWNvZGVyIHJlZ2lzdHJhdGlvbnMgb24gdGhlIFZTUzNHUFAgKi8KLSAgICBmb3IgKGk9MDsgaTxNNFZEX2tWaWRlb1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICh4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucmVnaXN0ZXJlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKHBWc3NDdHh0LCBpLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbERlY3NbaV0ucERlY29kZXJJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cmVnaXN0ZXJlZEV4dGVybmFsRGVjc1tpXS5wVXNlckRhdGEpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRSZWdpc3RlckV4dGVybmFsVmlkZW9EZWNvZGVyKCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRDbGVhblVwKHBWc3NDdHh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgLyogcmVwbGF5IHJlY29yZGVkIGV4dGVybmFsIGVuY29kZXIgcmVnaXN0cmF0aW9ucyBvbiB0aGUgVlNTM0dQUCAqLwotICAgIGZvciAoaT0wOyBpPE00VkVfa0VuY29kZXJUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAoeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2ldLnJlZ2lzdGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcihwVnNzQ3R4dCwgaSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5yZWdpc3RlcmVkRXh0ZXJuYWxFbmNzW2ldLnBFbmNvZGVySW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnJlZ2lzdGVyZWRFeHRlcm5hbEVuY3NbaV0ucFVzZXJEYXRhKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0UmVnaXN0ZXJFeHRlcm5hbFZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCiAgICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKICAgICB7CkBAIC0yNzMyLDcgKzI1OTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBX21hbGxvYworICAgIHBBdWRpb01peFNldHRpbmdzID0gKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKICAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopInBBdWRpb01peFNldHRpbmdzIik7CiAgICAgaWYocEF1ZGlvTWl4U2V0dGluZ3MgPT0gTTRPU0FfTlVMTCkKICAgICB7CkBAIC0yODcxLDcgKzI3MjksNyBAQAogICAgICAqIEZyZWUgVlNTIGF1ZGlvIG1peGluZyBzZXR0aW5ncyAqLwogICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKKyAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0yOTAyLDE0ICsyNzYwLDE0IEBACiAgICAgewogICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwogCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7CisgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KICAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0pKTsKKyAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTI5MTgsMTIgKzI3NzYsMTIgQEAKICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCiAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCkpOworICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOworICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTI5MzEsNyArMjc4OSw3IEBACiAgICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0yOTM5LDggKzI3OTcsOCBAQAogICAgICAqIEZyZWUgdGVtcG9yYXJ5IHByZXZpZXcgZmlsZSBwYXRoICovCiAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZpbGVFeHRyYURlbGV0ZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIE00T1NBX2ZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOworICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0yOTUwLDEwICsyODA4LDEwIEBACiAgICAgewogICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOworICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMjk2MSw3ICsyODE5LDcgQEAKICAgICAgKiBGcmVlIGN1cnJlbnQgZWRpdCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzICE9IE00T1NBX05VTEwpCiAgICAgewotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7CiAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMjk2OSw3ICsyODI3LDcgQEAKICAgICAgKiBGcmVlIHByZXZpZXcgZWZmZWN0cyBnaXZlbiB0byBhcHBsaWNhdGlvbiAqLwogICAgIGlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5FZmZlY3RzKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5FZmZlY3RzKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKICAgICAgICAgeFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwogICAgIH0KQEAgLTMwMDQsMTQgKzI4NjIsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKIAotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKKyAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gTTRPU0FfTlVMTDsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KICAgICAgICAgICAgIGlmKGkgIT0geFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTEpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKVwKKyAgICAgICAgICAgICAgICBmcmVlKFwKICAgICAgICAgICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwogICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CkBAIC0zMDIxLDE4ICsyODc5LDE4IEBACiAgICAgICAgICAqIEZyZWUgY2xpcC90cmFuc2l0aW9uIGxpc3QgKi8KICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7CisgICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7CisgICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOworICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwogICAgICAgICB9CkBAIC0zMDQzLDEyICsyOTAxLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwpAQCAtMzA1OSw4ICsyOTE3LDggQEAKICAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwogICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9maWxlRXh0cmFEZWxldGUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICAgICAgTTRPU0FfZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7CisgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCkBAIC0zMDcwLDE2ICsyOTI4LDE2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKKyAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7CiAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGcmVlIGN1cnJlbnQgZWRpdCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzID0gTTRPU0FfTlVMTDsKICAgICB9CiAKQEAgLTMxMTMsNyArMjk3MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKIAotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOworICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gTTRPU0FfTlVMTDsKICAgICAgICAgfQogCkBAIC0zMTMzLDE5ICsyOTkxLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHRcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSgoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCgoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KS0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lLT5wYWNfZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUtPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKIApAQCAtMzE1NywxNyArMzAxNSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyQ29tcGFyZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgKE00T1NBX0ludDMyICopJnBDbXBSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwU2V0dGluZ3MtPlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7CkBAIC0zMTg0LDcgKzMwNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTZXR0aW5ncy0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCk7CkBAIC0zMTkyLDcgKzMwNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKQEAgLTMyMDYsMTQgKzMwNjQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMyMjQsNyArMzA4Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7CisgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0pKTsKICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyMzQsNyArMzA5Miw3IEBACiAgICAgICogRnJlZSBjbGlwIGxpc3QgKi8KICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwU2V0dGluZ3MtPnBDbGlwTGlzdCkpOworICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBDbGlwTGlzdCkpOwogICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0zMjQyLDcgKzMxMDAsNyBAQAogICAgICAqIEZyZWUgdHJhbnNpdGlvbiBsaXN0ICovCiAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCkKICAgICB7Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKKyAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwogICAgIH0KIApAQCAtMzI3MSw2MiArMzEyOSw1OCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMV0ucGFjX2RhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzJdLnBhY19kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKWZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwpAQCAtMzMzNCwyMiArMzE4OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmlucHV0U3RyZWFtLmRhdGFfYnVmZmVyICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5pbnB1dFN0cmVhbS5kYXRhX2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+aW5wdXRTdHJlYW0uZGF0YV9idWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwogICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ICAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eCk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eCk7CiAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgIH0KICNlbHNlCkBAIC0zMzU4LDI1ICszMjA1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkgLyogQnVnZml4IDEuMi4wOiBjcmFzaCwgdHJ5aW5nIHRvIGZyZWUgbm9uCiAgICAgICAgICAgICAgICAgICAgIGV4aXN0YW50IHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTTRPU0FfTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpZnJhbWluZ0N0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMzk1LDcgKzMyMzksNyBAQAogCiAgICAgICAgICAgICAgICAgaWYoRmlmdGllc0N0eCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKUZpZnRpZXNDdHgpOworICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwogICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM0MTMsNyArMzI1Nyw3IEBACiAKICAgICAgICAgICAgICAgICBpZihDb2xvckN0eCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKUNvbG9yQ3R4KTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShDb2xvckN0eCk7CiAgICAgICAgICAgICAgICAgICAgIENvbG9yQ3R4ID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zNDIxLDIxICszMjY1LDIxIEBACiAgICAgICAgICAgICAvKiBGcmVlIHNpbXBsZSBmaWVsZHMgKi8KICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwU2V0dGluZ3MtPkVmZmVjdHMpOworICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0cyk7CiAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7CiAgICAgfQogCkBAIC0zNDUyLDkzICszMjk2LDEyIEBACiAgICAgewogICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7CisgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKICAgICB9Ci0jaWYgMAotICAgIC8qIFBhcnNlIHRyYW5zaXRpb25zIHRvIGZyZWUgaW50ZXJuYWwgImFscGhhIG1hZ2ljIiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAvKioKLSAgICAgKiBJbiBjYXNlIHRoZXJlIGlzIHR3aWNlIG9yIG1vcmUgdGhlIHNhbWUgQWxwaGEgTWFnaWMgZWZmZWN0LCB0aGUgZWZmZWN0IGNvbnRleHQKLSAgICAgKiBtYXkgYmUgZnJlZWQgdHdpY2Ugb3IgbW9yZS4KLSAgICAgKiBTbywgd2UgcGFyc2UgYWxsIHJlbWFpbmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIHRvIGtub3cgaWYgdGhlIGNvbnRleHQgY2FuIGJlCi0gICAgICogInJlLWZyZWVkIiwgYW5kIGlmIHllcywgd2UgcHV0IGl0cyBjb250ZXh0IHRvIE5VTEwgdG8gYXZvaWQgZnJlZWluZyBpdCBhZ2FpbiAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xOyBpKyspCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljOgotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLCBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMikoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPWkrMTtqPHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9PSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQ9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2NockNvbXBhcmUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgJnBDbXBSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocENtcFJlc3VsdCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIGV4dHJhIGludGVybmFsIGFscGhhIG1hZ2ljIHN0cnVjdHVyZSBhbmQgcHV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIE5VTEwgdG8gYXZvaWQgcmVmcmVlaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgogCiAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7CiAKQEAgLTM1NTEsMjggKzMzMTQsMjggQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zLT5wRmlsZUluKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwogICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9maWxlRXh0cmFEZWxldGUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUGFyYW1zLT5wRmlsZU91dCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOworICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwogICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwogI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICBNNE9TQV9maWxlRXh0cmFEZWxldGUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVUZW1wKTsKKyAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOworICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKICNlbmRpZi8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCiAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IHBQYXJhbXM7CiAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtc19zYXV2KTsKKyAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTg2LDQxICszMzQ5LDQxIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVJbik7CisgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcFBhcmFtcy0+cEZpbGVPdXQpOworICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKKyAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgTTRPU0FfZmlsZUV4dHJhRGVsZXRlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXMtPnBGaWxlVGVtcCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7CiAjZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwogICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwogICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBQYXJhbXNfc2F1dik7CisgICAgICAgICAgICBmcmVlKHBQYXJhbXNfc2F1dik7CiAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOworICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwogICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKICAgICB9CiAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQogICAgIHsKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7CisgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7CiAgICAgfQpAQCAtMzg2MCwzMiArMzYyMywzMiBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIDEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIDExNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAxMzkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKQEAgLTM5MDIsMTUgKzM2NjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwgKE00T1NBX1VJbnQ4KXUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IFYxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIChNNE9TQV9VSW50OCl2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwgKE00T1NBX1VJbnQ4KXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zOTMzLDE1ICszNjk2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgsIChNNE9TQV9VSW50OCl1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoLCAoTTRPU0FfVUludDgpdik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zOTY0LDggKzM3MjcsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDAzMSwyMiArMzc5NCw2IEBACiAjaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKICAgICBNNE9TQV9FUlIgZXJyOwogICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSNpZiAwCi0gICAgaWYoRnJhbWluZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKHVzZXJEYXRhKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmc6XAotICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgLyogSW5pdGlhbGl6ZXMgZmlyc3QgR0lGIHRpbWUgKi8KLSAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLSNlbmRpZgogICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKICAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7CiAjZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCkBAIC00MDcyLDQwICszODE5LDYgQEAKICAgICAvKioKICAgICAgKiBJZiB0aGUgY3VycmVudCBjbGlwIHRpbWUgaGFzIHJlYWNoIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUgb2YgdGhlIGZyYW1pbmcgcGljdHVyZQogICAgICAqIHdlIG5lZWQgdG8gc3RlcCB0byBuZXh0IGZyYW1pbmcgcGljdHVyZSAqLwotI2lmIDAKLSAgICBpZigoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX2FuaW1hdGVkID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICB3aGlsZSgoKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSArIGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbilcCi0gICAgICAgICA8IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lKQotICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmNsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzpcCi0gICAgICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbiAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgKz0gY3VycmVudEZyYW1pbmctPmR1cmF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgXAotICAgICAgICAgICAgICAgICArPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZWxzZQotICAgICAgICAgICAgRnJhbWluZy0+cEN1cnJlbnQgPSBjdXJyZW50RnJhbWluZy0+cE5leHQ7Ci0gICAgICAgICAgICBjdXJyZW50RnJhbWluZyA9IEZyYW1pbmctPnBDdXJyZW50OwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCiAKICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7CiAgICAgRnJhbWluZ1JHQiA9IGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKQEAgLTQxMzIsMTQgKzM4NDUsMTggQEAKIAogICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QgIT0gTTRPU0FfTlVMTCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAwICYmIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyBcCisgICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyBcCiAgICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlXAotICAgICAgICAgICAgICAgICAgICAgICAgIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKICAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXApAQCAtNDE1MSwxMSArMzg2OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAxMDAwIC0gKE00T1NBX1VJbnQzMilcCiAgICAgICAgICAgICAgICAgICAgIChhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQpKSooMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcylcCi0gICAgICAgICAgICAgICAgICAgICAgICAvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kIC8gMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQpKSooMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcylcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyhhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qKi8KQEAgLTQyMTMsMTUgKzM5MzQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSNpZiAwCi0gICAgaWYocFByb2dyZXNzLT5iSXNMYXN0ID09IE00T1NBX1RSVUUKLSAgICAgICAgJiYgKE00T1NBX0Jvb2wpKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Yl9Jc0ZpbGVHaWYgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9DbGVhbmluZygoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCiAKICAgICByZXR1cm4gTTRWSUZJX09LOwogfQpAQCAtNDMwMiwxMSArNDAxNCw5IEBACiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgeCsrKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMSA9PSBwbGFuZV9udW1iZXIpCi0gICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwT3V0Q3IsIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDExNyk7IC8qIFUgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDExNyxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBVIHZhbHVlICovCiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwT3V0Q3IsIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDEzOSk7IC8qIFYgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCiAKICAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwogICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwpAQCAtNDcwMCw3ICs0NDEwLDcgQEAKIAogICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClkZXN0V2FsaywgKE00T1NBX01lbUFkZHI4KXNvdXJjZVdhbGssIHdpZHRoKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwogICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwogICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKICAgICB9CkBAIC00NzQyLDcgKzQ0NTIsNyBAQAogICAgICAgICAvKiBGaXJzdCB0aGUgcGFydCBmcm9tIHRoZSB0b3Agc291cmNlIGNsaXAgZnJhbWUuICovCiAgICAgICAgIGZvciAoeT0wOyB5PHRvcFBhcnRIZWlnaHQ7IHkrKykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClkZXN0V2FsaywgKE00T1NBX01lbUFkZHI4KXNvdXJjZVdhbGssIHdpZHRoKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKICAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7CiAgICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKICAgICAgICAgfQpAQCAtNDc1NSw3ICs0NDY1LDcgQEAKIAogICAgICAgICBmb3IgKHk9MDsgeTxib3R0b21QYXJ0SGVpZ2h0OyB5KyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpZGVzdFdhbGssIChNNE9TQV9NZW1BZGRyOClzb3VyY2VXYWxrLCB3aWR0aCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7CiAgICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwogICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7CiAgICAgICAgIH0KQEAgLTQ4MjgsMTAgKzQ1MzgsMTAgQEAKIAogICAgICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKykKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClkZXN0V2Fsa0xlZnQsIChNNE9TQV9NZW1BZGRyOClsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa0xlZnQsICh2b2lkICopbGVmdFdhbGssIGxlZnRQYXJ0V2lkdGgpOwogICAgICAgICAgICAgbGVmdFdhbGsgKz0gbGVmdFN0cmlkZTsKIAotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClkZXN0V2Fsa1JpZ2h0LCAoTTRPU0FfTWVtQWRkcjgpcmlnaHRXYWxrLCByaWdodFBhcnRXaWR0aCk7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwogICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwogCiAgICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKQEAgLTQ5OTcsOCArNDcwNyw4IEBACiAgICAgewogICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7CiAKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSwwKTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAorICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7CiAKICAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAogICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKQEAgLTUwMDgsMTIgKzQ3MTgsMTIgQEAKICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKIAogICAgICAgICAgICAgLypmcmVlIHRvbyBzbWFsbCBidWZmZXIqLwotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXhWU1NfY29udGV4dC0+XAorICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPlwKICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwogCiAgICAgICAgICAgICAvKnJlLWFsbG9jYXRlIHRoZSBidWZmZXIqLwogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgICAgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfbWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKKyAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCiAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCiAgICAgICAgICAgICB7CkBAIC01MDIyLDkgKzQ3MzIsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9IENvbnZlcnRlZFNpemU7CiAKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplLDApOworICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCisgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKKyAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwogCiAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0KChNNE9TQV9Wb2lkKilwQnVmZmVySW4sCiAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLApAQCAtNTA3NSw5ICs0Nzg1LDkgQEAKICAgICB7CiAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKIAotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUsMCk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+XAorICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKKyAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7CiAKICAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0XAogICAgICAgICAgICAgKChNNE9TQV9Wb2lkKilwQnVmZmVySW4sKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlwKQEAgLTUwODcsMTIgKzQ3OTcsMTIgQEAKICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7CiAKICAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMil4VlNTX2NvbnRleHQtPlwKKyAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCiAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKIAogICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfbWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKKyAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7CiAgICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQogICAgICAgICAgICAgewpAQCAtNTEwMSw5ICs0ODExLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwogCi0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSwwKTsKKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+XAorICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCisgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplKTsKIAogICAgICAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0KChNNE9TQV9Wb2lkKilwQnVmZmVySW4sCiAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAppbmRleCBjNGQxYThhLi5jOTY3YWFmIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApAQCAtNDgsNiArNDgsNyBAQAogICAgIE00T1NBX0ludDMyIG91dFNhbXBsaW5nUmF0ZTsKICAgICBNNE9TQV9JbnQzMiBpblNhbXBsaW5nUmF0ZTsKIAorICAgIGludDE2X3QgKm1UbXBJbkJ1ZmZlcjsKIH07CiAKICNkZWZpbmUgTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OIDQwIC8vbXMKQEAgLTU1LDkgKzU2LDkgQEAKIHN0YXR1c190IFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewogCiAgICAgdWludDMyX3QgZGF0YVNpemUgPSBwQnVmZmVyLT5mcmFtZUNvdW50ICogdGhpcy0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICBpbnQxNl90ICpwVG1wSW5CdWZmZXIgPSAoaW50MTZfdCopbWFsbG9jKGRhdGFTaXplKTsKLSAgICBtZW1jcHkocFRtcEluQnVmZmVyLCB0aGlzLT5tSW5wdXQsIGRhdGFTaXplKTsKLSAgICBwQnVmZmVyLT5yYXcgPSAodm9pZCopcFRtcEluQnVmZmVyOworICAgIG1UbXBJbkJ1ZmZlciA9IChpbnQxNl90KiltYWxsb2MoZGF0YVNpemUpOworICAgIG1lbWNweShtVG1wSW5CdWZmZXIsIHRoaXMtPm1JbnB1dCwgZGF0YVNpemUpOworICAgIHBCdWZmZXItPnJhdyA9ICh2b2lkKiltVG1wSW5CdWZmZXI7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC02NywzMiArNjgsMzQgQEAKICAgICBpZihwQnVmZmVyLT5yYXcgIT0gTlVMTCkgewogICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7CiAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIG1UbXBJbkJ1ZmZlciA9IE5VTEw7CiAgICAgfQogICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQogCiBleHRlcm4gIkMiIHsKIAotTTRPU0FfSW50MzIgTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZShNNE9TQV9JbnQzMiBiaXREZXB0aCwgTTRPU0FfSW50MzIgaW5DaGFubmVsQ291bnQsCitNNE9TQV9Db250ZXh0ICBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKE00T1NBX0ludDMyIGJpdERlcHRoLCBNNE9TQV9JbnQzMiBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzYW1wbGVSYXRlLCBNNE9TQV9JbnQzMiBxdWFsaXR5KSB7CiAKICAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9IG5ldyBWaWRlb0VkaXRvclJlc2FtcGxlcigpOwogICAgIGNvbnRleHQtPm1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAogICAgICAgICBiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIEF1ZGlvUmVzYW1wbGVyOjpERUZBVUxUKTsKICAgICBpZiAoY29udGV4dC0+bVJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGFuZHJvaWQ6OlZpZGVvRWRpdG9yUmVzYW1wbGVyOjprRnJlcTMyMDAwSHopOwogICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7CiAgICAgY29udGV4dC0+bmJDaGFubmVscyA9IGluQ2hhbm5lbENvdW50OwogICAgIGNvbnRleHQtPm91dFNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgY29udGV4dC0+bUlucHV0ID0gTlVMTDsKKyAgICBjb250ZXh0LT5tVG1wSW5CdWZmZXIgPSBOVUxMOwogCi0gICAgcmV0dXJuICgoTTRPU0FfSW50MzIpY29udGV4dCk7CisgICAgcmV0dXJuICgoTTRPU0FfQ29udGV4dCApY29udGV4dCk7CiB9CiAKIAotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9JbnQzMiByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpIHsKK3ZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpIHsKIAogICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KICAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7CkBAIC0xMDcsMTggKzExMCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5uYkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSAvIDEwMDApOwogfQogCi12b2lkIExWQXVkaW9zZXRWb2x1bWUoTTRPU0FfSW50MzIgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIHsKK3ZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSB7CiAKICAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9CiAgICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKICAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUobGVmdCxyaWdodCk7CiB9CiAKLXZvaWQgTFZEZXN0cm95KE00T1NBX0ludDMyIHJlc2FtcGxlckNvbnRleHQpIHsKK3ZvaWQgTFZEZXN0cm95KE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewogCiAgICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQogICAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7CiAKKyAgICBpZiAoY29udGV4dC0+bVRtcEluQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShjb250ZXh0LT5tVG1wSW5CdWZmZXIpOworICAgICAgICBjb250ZXh0LT5tVG1wSW5CdWZmZXIgPSBOVUxMOworICAgIH0KKwogICAgIGlmIChjb250ZXh0LT5tSW5wdXQgIT0gTlVMTCkgewogICAgICAgICBmcmVlKGNvbnRleHQtPm1JbnB1dCk7CiAgICAgICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7CkBAIC0xMzYsNyArMTQ0LDcgQEAKIH0KIAogdm9pZCBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eShNNE9TQV9JbnQxNiogb3V0LCBNNE9TQV9JbnQxNiogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgb3V0RnJhbWVDb3VudCwgTTRPU0FfSW50MzIgcmVzYW1wbGVyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewogCiAgICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQogICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmgKaW5kZXggZTA2ZmNiYy4uODZkNjc2ZSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmgKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmgKQEAgLTYxLDcgKzYxLDcgQEAKICNkZWZpbmUgU0FGRV9GUkVFKHApIFwKIHsgXAogICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSB7IFwKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKShwKSkgOyBcCisgICAgICAgIGZyZWUoKHApKSA7IFwKICAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKICAgICB9IFwKIH0KQEAgLTc1LDkgKzc1LDkgQEAKICAqLwogI2RlZmluZSBTQUZFX01BTExPQyhwLCB0eXBlLCBjb3VudCwgY29tbWVudCkgXAogeyBcCi0gICAgKHApID0gKHR5cGUqKU00T1NBX21hbGxvYyhzaXplb2YodHlwZSkqKGNvdW50KSwgMHhGRiwoTTRPU0FfQ2hhciopY29tbWVudCk7XAorICAgIChwKSA9ICh0eXBlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKHR5cGUpKihjb3VudCksIDB4RkYsKE00T1NBX0NoYXIqKWNvbW1lbnQpO1wKICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IChwKSwgTTRFUlJfQUxMT0MpOyBcCi0gICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOCkocCksIHNpemVvZih0eXBlKSooY291bnQpLCAwKTsgXAorICAgIG1lbXNldCgodm9pZCAqKShwKSwgMCxzaXplb2YodHlwZSkqKGNvdW50KSk7IFwKIH0KIAogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKaW5kZXggZDk5NDdiOC4uNDhlM2NkOCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9BbmRyb2lkLm1rCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tawpAQCAtNTYsMTUgKzU2LDEzIEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJzdGFnZWZyaWdodCBcCiAgICAgbGlic3RhZ2VmcmlnaHRfb214IFwKLSAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgIGxpYmd1aSBcCiAgICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIKIAogTE9DQUxfQ0ZMQUdTICs9IFwKIAogCiAKLUxPQ0FMX0xERkxBR1MgKz0gLWZ1c2UtbGQ9YmZkCi0KIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgXAogICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKaW5kZXggZWI0ODcxNy4uZWE0YWJjZSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0OwogCiAgICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopTTRPU0FfbWFsbG9jKAorICAgIHBTdHJlYW1Db250ZXh0ID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgc2l6ZW9mKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQpLCBNNFJFQURFUl8zR1AsCiAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIjNHUCBCaXRTdHJlYW1QYXJzZXIgQ29udGV4dCIpOwogICAgIGlmIChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwogc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCkgewotICAgIE00T1NBX2ZyZWUoKE00T1NBX0ludDMyKilwQ29udGV4dCk7CisgICAgZnJlZSgoTTRPU0FfSW50MzIqKXBDb250ZXh0KTsKIH0KIC8qKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDYsNyArNDA2LDggQEAKICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwogICAgIHBDLT5tVmlkZW9TZWVrVGltZSA9IDA7CiAKLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHBDLT5tTWF4RHVyYXRpb24sIDApOworICAgIHBDLT5tTWF4RHVyYXRpb24gPSAwOworCiAgICAgKnBDb250ZXh0PXBDOwogCiBjbGVhblVwOgpAQCAtNDY3LDYgKzQ2OCw4IEBACiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIHRvIG9wZW4KICogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgogKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKKyogQHJldHVybiAgIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgaXMgRFJNIHByb3RlY3RlZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwogCkBAIC00OTksNiArNTAyLDE0IEBACiAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7CiAgICAgfQogCisgICAgaW50MzJfdCBpc0RSTVByb3RlY3RlZCA9IDA7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwQy0+bUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKyAgICBtZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmaXNEUk1Qcm90ZWN0ZWQpOworICAgIGlmIChpc0RSTVByb3RlY3RlZCkgeworICAgICAgICBMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOworICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKKyAgICB9CisKICAgICBMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIGVuZCAiKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNTI4LDcgKzUzOSw3IEBACiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIEF1ZGlvIik7CiAKICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAorICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAogICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8pOwogICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwogICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwpAQCAtNTQxLDI0ICs1NTIsMjQgQEAKIAogICAgICAgICAgICAgcEFVID0gKE00X0FjY2Vzc1VuaXQqKXBBdWRpb1NiclVzZXJEYXRhLT5tX3BGaXJzdEFVOwogICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEFVKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBBVSk7CisgICAgICAgICAgICAgICAgZnJlZShwQVUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXVkaW9TYnJVc2VyRGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEF1ZGlvU2JyVXNlckRhdGEtPlwKKyAgICAgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhLT5cCiAgICAgICAgICAgICAgICAgICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQXVkaW9TYnJVc2VyRGF0YSk7CisgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhKTsKICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSA9IE00T1NBX05VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOworICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwogICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOworICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwogCiAgICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0b3AoKTsKQEAgLTU2OCwyNyArNTc5LDI3IEBACiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIFZpZGVvICIpOwogCiAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAorICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAogICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8pOwogICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwogICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAorICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAogICAgICAgICAgICAgICAgIG1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKTsKICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7CiAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOworICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwogICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcik7CisgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpOwogICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7CiAKICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RvcCgpOwpAQCAtNjM2LDcgKzY0Nyw3IEBACiAgICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246CiAgICAgICAgIHsKICAgICAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBkdXJhdGlvbiAlZCIscEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICBNNE9TQV9USU1FX1NFVCgqKE00T1NBX1RpbWUqKXBWYWx1ZSwgcEMtPm1NYXhEdXJhdGlvbik7CisgICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBDLT5tTWF4RHVyYXRpb247CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbjoKQEAgLTY3MCw3ICs2ODEsNiBAQAogICAgIGJyZWFrOwogICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllczoKICAgICAgICAgewotI2lmIDAKICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICBMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gbm8gdmlkZW9TdHJlYW0gcmV0cmlldmVkIik7CiAKQEAgLTY3OCw3ICs2ODgsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyAhPSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlKSB8fCAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKKyAgICAgICAgICAgICAgICBtX3N0cmVhbVR5cGUpIHx8IChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAogICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCA3KSkgewogICAgICAgICAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBEU0kgU2l6ZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKQEAgLTY5Myw3ICs3MDMsNiBAQAogICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzZdOwogICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aUxldmVsID0KICAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s1XTsKLSNlbmRpZgogICAgICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfXAogICAgICAgICAgICAgSDI2M1Byb3BlcnRpZXMgZW5kIik7CiAgICAgICAgIH0KQEAgLTg1MSw3ICs4NjAsNiBAQAogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKICAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLSAgICBNNE9TQV9Eb3VibGUgdGltZURvdWJsZTsKIAogICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKICAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwpAQCAtODY1LDcgKzg3Myw3IEBACiAgICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7CiAgICAgICAgICpwVGltZSAtPSAxOwogICAgIH0KLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHRpbWU2NCwgKnBUaW1lKTsKKyAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7CiAKICAgICBMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7CiAKQEAgLTg5OCw4ICs5MDYsNyBAQAogICAgIHRpbWU2NCA9IHRpbWU2NCAvIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWxsaSBzZWMgKi8KICAgICBMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgbXMgYmVmb3JlIHNlZWtzZXQgJWxkICIsIHRpbWU2NCk7CiAKLSAgICBNNE9TQV9JTlQ2NF9UT19ET1VCTEUodGltZURvdWJsZSwgdGltZTY0KTsKLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZURvdWJsZTsKKyAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwogCiAgICAgTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBlbmQiKTsKICAgICBlcnIgPSBNNE5PX0VSUk9SOwpAQCAtOTIxLDE1ICs5MjgsMTMgQEAKICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwogICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKKyAgICBNNE9TQV9UaW1lIHRpbWU2NCA9IDA7CiAKICAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsCiAgICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7CiAgICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAogICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7CiAKLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHRpbWU2NCwgMCk7Ci0KICAgICBMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBiZWdpbiIpOwogCiAgICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewpAQCAtMTA3MywxMyArMTA3OCwxMyBAQAogICAgICAgICBpZiggKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgfHwgIChwQXUtPnNpemUgPCBcCiAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgewogICAgICAgICAgICAgaWYocEF1LT5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfSW50MzIqKXBBdS0+ZGF0YUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoKE00T1NBX0ludDMyKilwQXUtPmRhdGFBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExPR1YoIkJ1ZmZlciBsZW5naHQgPSAlZCAsJWQiLChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICtcCiAgICAgICAgICAgICAgICAgMykgJiB+MHgzLChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSk7CiAKLSAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAobU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDMpICYgfjB4MyxNNFJFQURFUl8zR1AsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MiICk7CiAgICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHsKQEAgLTEwODksOCArMTA5NCw4IEBACiAgICAgICAgIH0KICAgICAgICAgcEF1LT5zaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAotICAgICAgICBtZW1jcHkoKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKW1NZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbU1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcEF1LT5kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICh2b2lkICopKChjb25zdCBjaGFyICopbU1lZGlhQnVmZmVyLT5kYXRhKCkgKyBtTWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogCiAgICAgICAgIGlmKCAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSAgJiYKQEAgLTEyNjIsNyArMTI2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTOwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8gPShzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyopTTRPU0FfbWFsbG9jKHVpU3BlY0luZm9TaXplLAorICAgICAgICAgICAgcEF2Y1NwZWNJbmZvID0oc3RydWN0IF9hdmNTcGVjaWZpY0luZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aVNwZWNJbmZvU2l6ZSwKICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdmNTcGVjSW5mbykgewogICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwpAQCAtMTMwNCw3ICsxMzA5LDcgQEAKICAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwogCiAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICBNNE9TQV9mcmVlKChNNE9TQV9NZW1BZGRyMzIpcEF2Y1NwZWNJbmZvKTsKKyAgICAgICAgICAgIGZyZWUocEF2Y1NwZWNJbmZvKTsKICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgfQogCkBAIC0xMzY2LDE1ICsxMzcxLDE1IEBACiAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX1VJbnQ4KilwQXZjU3BlY0luZm87CiAgICAgfQogICAgIHBTdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAgPSAgZGVjb2RlckNvbmZpZ1NpemVMb2NhbDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gID0gKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MoCisgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvICA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsLCBNNFJFQURFUl8zR1AsCiAgICAgICAgIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KIAotICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjggKSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgIChNNE9TQV9NZW1BZGRyOCApcERlY29kZXJDb25maWdMb2NhbCwKKyAgICBtZW1jcHkoKHZvaWQgKiApIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKKyAgICAgICAgKHZvaWQgKiApcERlY29kZXJDb25maWdMb2NhbCwKICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKICAgICByZXR1cm4gTTROT19FUlJPUjsKIGNsZWFudXA6CkBAIC0xNDY4LDcgKzE0NzMsNyBAQAogICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1JZCA9IHBDLT5tQ3VyclRyYWNrOwogCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKU00T1NBX21hbGxvYworICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCiAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfVmlkZW9TdHJlYW1IYW5kbGVyIik7CiAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcFZpZGVvU3RyZWFtSGFuZGxlcikgewpAQCAtMTUyMCwzMSArMTUyNSwyOSBAQAogCiAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBEU0kgaW5mbyAqLwogICAgICAgICAgICAgICAgIGlmKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhLCAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsKE00T1NBX0NoYXIqKSJIMjYzIERTSSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlZFX2dldE5leHRTdHJlYW1IYW5kbGVyOiBIMjYzIGRzaSBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKQEAgLTE1NjAsMTUgKzE1NjMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaWYobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfSW50OCopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRSRUFERVJfM0dQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkgyNjQgRGVjb2RlclNwZWNpZmljIiApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpY0luZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3IzZ3BfZ2V0TmV4dFN0cmVhbSBpcyBOVUxMICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWRhdGEsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiRFNJIFNpemUgJWQiLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7CkBAIC0xNTg4LDcgKzE1OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKURlY29kZXJTcGVjaWZpY0luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShEZWNvZGVyU3BlY2lmaWNJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCA9PSBzdHJlYW1UeXBlKSApIHsKQEAgLTE1OTgsMTMgKzE2MDEsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWFsbG9jKCgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiSDI2MyBEZWNvZGVyU3BlY2lmaWMiICk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KSgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRVNEU0luZm8sIChNNE9TQV9NZW1BZGRyOClkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRVNEU0luZm8sICh2b2lkICopZGF0YSwgc2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7CkBAIC0xNjE0LDE0ICsxNjE3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSIgRGVjb2RlclNwZWNpZmljIiApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpY29kZWNfc3BlY2lmaWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29kZWNfc3BlY2lmaWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKQEAgLTE2NjYsNyArMTY2OSw3IEBACiAKICAgICAgICAgICAgICAgICBMT0dWKCJWRSBzdHJlYW10eXBlICVkICxpZCAlZCIsICBzdHJlYW1UeXBlLCBwQy0+bUN1cnJUcmFjayk7CiAKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfbWFsbG9jCisgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwogICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TdHJlYW1IYW5kbGVyKSB7CkBAIC0xNzE1LDE0ICsxNzE4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkgyNjMgRGVjb2RlclNwZWNpZmljIiApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWNvZGVjX3NwZWNpZmljX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwpAQCAtMTczMyw3ICsxNzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUNoYXIgQW1yRHNpW10gPQogICAgICAgICAgICAgICAgICAgICAgICAgeydQJywnSCcsJ0wnLCdQJywweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAxLH07CiAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gOTsKLSAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiSDI2MyBEZWNvZGVyU3BlY2lmaWMiICk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewpAQCAtMTc1NywxNCArMTc2MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCBPSyk7CiAKICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLCBNNFJFQURFUl8zR1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkgyNjMgRGVjb2RlclNwZWNpZmljIiApOwogICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KSgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8sCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKIApAQCAtMTc3NCwxNCArMTc3NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJIMjYzIERlY29kZXJTcGVjaWZpYyIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCljb2RlY19zcGVjaWZpY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29kZWNfc3BlY2lmaWNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKQEAgLTE4MTgsNyArMTgyMSw3IEBACiAgICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKICAgICAgICAgICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqICBwQXVkaW9TYnJVc2VyZGF0YTsKIAotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopTTRPU0FfbWFsbG9jKAorICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgICAgIHNpemVvZihNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKSxNNFJFQURFUl8zR1AsCiAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhIik7CiAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YSkgewpAQCAtMTgyOCw3ICsxODMxLDcgQEAKICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSA9IHBBdWRpb1NiclVzZXJkYXRhOwogICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fYklzU2JyRW5hYmxlZCA9IE00T1NBX0ZBTFNFOwogCi0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wRmlyc3RBVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV9tYWxsb2MoCisgICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wRmlyc3RBVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSIxc3QgQUFDIEFVIik7CiAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wRmlyc3RBVSkgewogICAgICAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZyA9IE00T1NBX05VTEw7CkBAIC0xODM2LDcgKzE4MzksNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcgPSAoTTRfQWFjRGVjb2RlckNvbmZpZyopXAotICAgICAgICAgICAgICAgIE00T1NBX21hbGxvYyhzaXplb2YoTTRfQWFjRGVjb2RlckNvbmZpZyksTTRSRUFERVJfM0dQLAorICAgICAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQWFjRGVjb2RlckNvbmZpZyksTTRSRUFERVJfM0dQLAogICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikibV9wQWFjRGVjb2RlclVzZXJDb25maWciKTsKICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZykgewogICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwpAQCAtMTg5OSw4ICsxOTAyLDggQEAKICAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKICAgICAgICAgKnBUaW1lIC09IDE7CiAgICAgfQotICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIodGltZTY0LCAqcFRpbWUpOwotICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7CisKKyAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWUgKiAxMDAwOwogCiAgICAgTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgc2VlayB0aW1lOiAlbGQiLHRpbWU2NCk7CiAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZTY0LCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CkBAIC0xOTE1LDcgKzE5MTgsNyBAQAogICAgIExPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIHJlYWQgdGltZSAlbGQsICV4IiwgdGVtcFRpbWU2NCwKICAgICAgICAgbU1lZGlhQnVmZmVyKTsKIAotICAgICgqcFRpbWUpID0gICh0ZW1wVGltZTY0KSAvIDEwMDA7CisgICAgKnBUaW1lID0gKE00T1NBX0ludDMyKSh0ZW1wVGltZTY0IC8gMTAwMCk7CiAKICAgICBpZihtTWVkaWFCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewogICAgICAgICBMT0dWKCIgbU1lZGlhQnVmZmVyIHNpemUgPSAlZCBsZW5ndGggJWQiLCBtTWVkaWFCdWZmZXItPnNpemUoKSwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKaW5kZXggYTFmNjJjYi4uOTI4ZjhlYSAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogCiAgICAgICAgICAgICAvLyBDb3B5IHRoZSBzdHJlYW0gcHJvcGVydGllcyBpbnRvIHVzZXJkYXRhCiAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwVXNlckRhdGEgKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmYWFjUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmFhY1Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBQUNfREVDX1NUUkVBTV9QUk9QUykpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC02MDQsOCArNjA0LDggQEAKIAogICAgIGlmKCBNNE9TQV9OVUxMICE9IHBJbnB1dEJ1ZmZlciApIHsKICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIHBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpOworICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCisgICAgICAgICAgICAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwogICAgIH0KICAgICBuYkJ1ZmZlciA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7CiAKQEAgLTY0Nyw4ICs2NDcsOCBAQAogICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7CiAgICAgICAgIC8vIEp1c3QgY29weSB0aGUgUENNcwogICAgICAgICBwT3VwdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KHBPdXB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICgoTTRPU0FfTWVtQWRkcjgpYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKKyAgICAgICAgICAgICh2b2lkICopKCgoTTRPU0FfTWVtQWRkcjgpYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAogICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgfSBlbHNlIGlmKCBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA8CiAgICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKaW5kZXggNzE4ODgxZi4uYmNhZTFhOCAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKQEAgLTQ1OSw4ICs0NTksOCBAQAogICAgICAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sIE00T1NBX0ludDgsCiAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1EU0kuaW5mb1NpemUsICJFbmNvZGVyIGhlYWRlciIpOwogCi0gICAgICAgIE00T1NBX21lbWNweShwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCisgICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSk7CiAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC00OTksNyArNDk5LDcgQEAKICAgICAgICAgICAgIC8vIExldCB0aGUgTWVkaWFCdWZmZXIgb3duIHRoZSBkYXRhIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBpdAogICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKICAgICAgICAgICAgIHBEYXRhID0gKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweShwRGF0YSwgcEluQnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRGF0YSwgKHZvaWQgKilwSW5CdWZmZXItPnBUYWJsZUJ1ZmZlclswXSwKICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPnBUYWJsZUJ1ZmZlclNpemVbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC01NjgsOCArNTY4LDggQEAKICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKIAogICAgICAgICAvLyBGb3JtYXQgdGhlIEFVCi0gICAgICAgIE00T1NBX21lbWNweShwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCisgICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYwppbmRleCA5ZjUwYTU4Li4zN2Y5NjBhIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCkBAIC0zMiw3ICszMiw3IEBACiB7IFwKICAgICBpZihNNE9TQV9OVUxMICE9IHApIFwKICAgICB7IFwKLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXApOyBcCisgICAgICAgIGZyZWUocCk7IFwKICAgICAgICAgcCA9IE00T1NBX05VTEw7IFwKICAgICB9IFwKIH0KQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgcHBvb2wsIG5iQnVmZmVycyk7CiAKICAgICBwb29sID0gTTRPU0FfTlVMTDsKLSAgICBwb29sID0gKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKilNNE9TQV9tYWxsb2MoCisgICAgcG9vbCA9IChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAogICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbCIpKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwb29sKQpAQCAtNzAsNyArNzAsNyBAQAogCiAgICAgTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBidWZmZXJzIik7CiAgICAgcG9vbC0+cE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV9tYWxsb2MoCisgICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIpKm5iQnVmZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2FsbG9jYXRlUG9vbDogcE5YUEJ1ZmZlciIpKTsKQEAgLTgyLDcgKzgyLDcgQEAKIAogICAgIExPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBbGxvY2F0aW5nIFBvb2wgbmFtZSBidWZmZXIiKTsKICAgICBwb29sLT5wb29sTmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cG9vbE5hbWUgPSAoTTRPU0FfQ2hhciopTTRPU0FfbWFsbG9jKAorICAgIHBvb2wtPnBvb2xOYW1lID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAogICAgICAgICAoTTRPU0FfQ2hhciopKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sOiBwb29sbmFtZSIpKTsKICAgICBpZihwb29sLT5wb29sTmFtZSA9PSBNNE9TQV9OVUxMKQpAQCAtOTMsOCArOTMsOCBAQAogCiAgICAgTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFzc2lnbmluZyBQb29sIG5hbWUgYnVmZmVyIik7CiAKLSAgICBNNE9TQV9tZW1zZXQocG9vbC0+cG9vbE5hbWUsIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLCAwKTsKLSAgICBNNE9TQV9tZW1jcHkocG9vbC0+cG9vbE5hbWUsIHBvb2xOYW1lLAorICAgIG1lbXNldCgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAwLFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFKTsKKyAgICBtZW1jcHkoKHZvaWQgKilwb29sLT5wb29sTmFtZSwgKHZvaWQgKilwb29sTmFtZSwKICAgICAgICAgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUtMSk7CiAKICAgICBwb29sLT5OQiA9IG5iQnVmZmVyczsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIHsKICAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKTsKKyAgICAgICAgICAgIGZyZWUocHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwogICAgICAgICAgICAgcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtMjA4LDIwICsyMDgsMjAgQEAKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwb29sICovCi0gICAgZm9yKGluZGV4ID0gMDsgaW5kZXg8IHBvb2wtPk5COyBpbmRleCsrKQorICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgcG9vbC0+TkI7IGluZGV4KyspCiAgICAgewogICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gKE00T1NBX1ZvaWQqKU00T1NBX21hbGxvYygKKyAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICAgICAgbFNpemUsIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKICAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIkJVRkZFUl9pbml0UG9vbEJ1ZmZlcnM6IEJ1ZmZlciBkYXRhIikpOwogICAgICAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhKQorICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSA9IE00T1NBX05VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCmluZGV4IDMyMjg4MWEuLjFhZTU2N2UgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCkBAIC05Nyw3ICs5Nyw3IEBACiAKICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciAgPSBNNE9TQV9OVUxMOwogICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSU5UNjRfRlJPTV9JTlQzMihwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uLCAwKTsKKyAgICBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uID0gMDsKICAgICAqcENvbnRleHQgPSBwUmVhZGVyQ29udGV4dDsKIAogY2xlYW5VcDoKQEAgLTE0Nyw3ICsxNDcsOCBAQAogCiAgKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgogICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCisgKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQorICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiBNNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCkBAIC0xODQsNiArMTg1LDE0IEBACiAgICAgfQogICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID0gMDsKIAorICAgIGludDMyX3QgaXNEUk1Qcm90ZWN0ZWQgPSAwOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgbWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmlzRFJNUHJvdGVjdGVkKTsKKyAgICBpZiAoaXNEUk1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlcnJvciAtIERSTSBQcm90ZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7CisgICAgfQorCiAgICAgTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlbmQiKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtMjA5LDcgKzIxOCw3IEBACiAgICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCisgICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCiAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7CiAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMuXAogICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwpAQCAtMjE4LDExICsyMjcsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfTWVtQWRkcjMyKXBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKKyAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlcik7CiAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gTTRPU0FfTlVMTDsKIAogICAgICAgICBpZiAocFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIE00T1NBX2ZyZWUoKE00T1NBX01lbUFkZHIzMilwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MpOworICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MpOwogICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTI2OCw3ICsyNzcsNyBAQAogICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICBMT0dWKCJNcDNSZWFkZXIgZHVyYXRpb249JWxkIixwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgIE00T1NBX1RJTUVfU0VUKCooTTRPU0FfVGltZSopcFZhbHVlLCBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uKTsKKyAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtMzYzLDggKzM3Miw3IEBACiAgICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0gICAgTTRPU0FfRG91YmxlIHRpbWVEb3VibGU7CisgICAgTTRPU0FfVGltZSB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7CiAKICAgICBMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIGJlZ2luIik7CiAgICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLApAQCAtMzc0LDggKzM4Miw2IEBACiAgICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAogICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKIAotICAgIE00T1NBX0lOVDY0X0ZST01fSU5UMzIodGltZTY0LCAqcFRpbWUpOwotCiAgICAgaWYocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCiAgICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpewogICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwpAQCAtMzk5LDggKzQwNSw3IEBACiAgICAgcFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSA9IHRpbWU2NDsKIAogICAgIHRpbWU2NCA9IHRpbWU2NCAvIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWxsaSBzZWMgKi8KLSAgICBNNE9TQV9JTlQ2NF9UT19ET1VCTEUodGltZURvdWJsZSwgdGltZTY0KTsKLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZURvdWJsZTsKKyAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwogICAgIExPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgZW5kICIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC00OTQsNyArNDk5LDcgQEAKICAgICBzdHJlYW1EZXNjLm1heEJpdHJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwogCiAgICAgLyogICAgQWxsb2NhdGUgdGhlIGF1ZGlvIHN0cmVhbSBoYW5kbGVyIGFuZCBzZXQgaXRzIHBhcmFtZXRlcnMgICAgKi8KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfbWFsbG9jKAorICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgIHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl9NUDMsCiAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7CiAKQEAgLTYxNCw3ICs2MTksNyBAQAogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07CiAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0OworICAgIE00T1NBX1RpbWUgdGltZTY0ID0gMDsKIAogICAgIExPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0IHN0YXJ0Iik7CiAgICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLApAQCAtNjIyLDggKzYyNyw2IEBACiAgICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAogICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7CiAKLSAgICBNNE9TQV9JTlQ2NF9GUk9NX0lOVDMyKHRpbWU2NCwgMCk7Ci0KICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCiAgICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKICAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKQEAgLTY5MSwxMCArNjk0LDEwIEBACiAgICAgICAgIGlmICgocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fAogICAgICAgICAgICAgKHBBdS0+c2l6ZSA8IG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7CiAgICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfZnJlZSgoTTRPU0FfSW50MzIqKXBBdS0+ZGF0YUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoKE00T1NBX0ludDMyKilwQXUtPmRhdGFBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBX21hbGxvYygKKyAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKICAgICAgICAgICAgICAgICAobUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDMpICYgfjB4MywKICAgICAgICAgICAgICAgICBNNFJFQURFUl9NUDMsIChNNE9TQV9DaGFyKikicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MiICk7CiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKaW5kZXggYThiOWMwYy4uM2IzZjg5ZiAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKKysrIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgICAgICAgICAgPyAoTTRPU0FfVUludDMyKW1NYXhBVVNpemUgOiBwQWNjZXNzVW5pdC0+bV9zaXplOwogICAgICAgICBMT0dWKCJWaWRlb0RlY29kZXJTb3VyY2U6UmVhZCgpIGNvcHlpbmcgQVUgdG8gaS9wIGJ1ZmZlciBvZiBkZWNvZGVyLCIKICAgICAgICAgICAgICJCdWZlciBBZGQgPSAweCV4LCBzaXplID0gJWQiLCBtQnVmZmVyLT5kYXRhKCksIGxTaXplKTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCltQnVmZmVyLT5kYXRhKCkscEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MsCisgICAgICAgIG1lbWNweSgodm9pZCAqKW1CdWZmZXItPmRhdGEoKSwodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLAogICAgICAgICAgICAgbFNpemUpOwogCiAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBsU2l6ZSk7CkBAIC02MTIsNyArNjEyLDcgQEAKICAgICAgICAgKHVpbnQxNl90ICopICYoUGxhbmVPdXRbMl0ucGFjX2RhdGFbUGxhbmVPdXRbMl0udV90b3BsZWZ0XSk7CiAKICAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKKyAgICBtZW1jcHkoKHZvaWQgKilvdXR5LCAodm9pZCAqKWlueXV2LCBvdXRZc2l6ZSk7CiAKICAgICAvKiBVICYgViBjb3B5aW5nICovCiAgICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwpAQCAtNzQ1LDkgKzc0NSw5IEBACiAgICAgICAgIGNyb3BSaWdodCA9IHZXaWR0aCAtIDE7CiAgICAgICAgIGNyb3BCb3R0b20gPSB2SGVpZ2h0IC0gMTsKIAotICAgICAgICBMT0dJKCJnb3QgZGltZW5zaW9ucyBvbmx5ICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgTE9HVigiZ290IGRpbWVuc2lvbnMgb25seSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HSSgiZ290IGNyb3AgcmVjdCAlZCwgJWQsICVkLCAlZCIsCisgICAgICAgIExPR1YoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAogICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwogICAgIH0KIApAQCAtMTMwNCw3ICsxMzA0LDYgQEAKICAgICAgICAgfSBlbHNlIGlmICggSU5GT19GT1JNQVRfQ0hBTkdFRCA9PSBlcnJTdGF0dXMgKSB7CiAgICAgICAgICAgICBMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlOnNvdXJjZSByZXR1cm5zIElORk9fRk9STUFUX0NIQU5HRUQ6VE9ETyIpOwogCi0jaWYgMQogICAgICAgICAgICAgTE9HVigiVmlkZW9EZWNvZGVyX2RlY29kZSA6IHNvdXJjZSByZXR1cm5zIElORk9fRk9STUFUX0NIQU5HRUQiKTsKICAgICAgICAgICAgIGxlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dCwKQEAgLTEzMTQsNyArMTMxMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIHJldHVybnMgMHglWCIsIGxlcnIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0xMzc5LDE1ICsxMzc3LDE1IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZiA9IChNNE9TQV9NZW1BZGRyOClwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpOwogCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSwgcFRtcEJ1ZmYsIHlQbGFuZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil0bXBEZWNCdWZmZXItPnBEYXRhLCAodm9pZCAqKXBUbXBCdWZmLCB5UGxhbmVTaXplKTsKIAogICAgICAgICAgICAgICAgICAgICBvZmZzZXRTcmMgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVG1wQnVmZiArIG9mZnNldFNyYywgdXZQbGFuZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwogCiAgICAgICAgICAgICAgICAgICAgIG9mZnNldFNyYyArPSAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMSkgKiAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplICsgdXZQbGFuZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVG1wQnVmZiArIG9mZnNldFNyYywgdXZQbGFuZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplICsgdXZQbGFuZVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocFRtcEJ1ZmYgKyBvZmZzZXRTcmMpLCB1dlBsYW5lU2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CkBAIC0xMzk3LDcgKzEzOTUsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQ7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwVG1wQnVmZkRzdCwgcFRtcEJ1ZmYsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDA1LDcgKzE0MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiAoIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCAtIGhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwVG1wQnVmZkRzdCwgcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGggPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDE7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE0MTMsNyArMTQxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9ICgocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiAocERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0IC0gaGVpZ2h0KSkgLyA0KTsKICAgICAgICAgICAgICAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGhlaWdodCA+PiAxOyBpbmRleCsrKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFRtcEJ1ZmZEc3QsIHBUbXBCdWZmLCB3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNTU0LDEzICsxNTUyLDEzIEBACiAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0KICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKIAotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEsIHRlbXBCdWZmUHRyLAorICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAogICAgICAgICAgICAgdGVtcFdpZHRoICogdGVtcEhlaWdodCk7CiAgICAgICAgIHRlbXBCdWZmUHRyICs9ICh0ZW1wV2lkdGggKiB0ZW1wSGVpZ2h0KTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOCkgcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhLCB0ZW1wQnVmZlB0ciwKKyAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKICAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7CiAgICAgICAgIHRlbXBCdWZmUHRyICs9ICgodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEsIHRlbXBCdWZmUHRyLAorICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAogICAgICAgICAgICAgKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKICAgICB9CiAKQEAgLTE1ODUsNyArMTU4Myw3IEBACiAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewogICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwogCi0gICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV9tYWxsb2MoCisgICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCiAgICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLCBNNERFQ09ERVJfRVhURVJOQUwsCiAgICAgICAgIChNNE9TQV9DaGFyKikiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlIiApOwogICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSB7CkBAIC0xNjA5LDcgKzE2MDcsNyBAQAogICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKIAotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfbWFsbG9jKAorICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAogICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAogICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAppbmRleCAzMTEyZjcxLi4wYTU5NWEyIDEwMDc1NQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAorKysgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiB9OwogCiBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgpIHsKLQ0KKwogICAgIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KICAgICAgICAgbmV3IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKCk7CiAgICAgcmV0dXJuIGFTb3VyY2U7CkBAIC0xMTgsNyArMTE4LDcgQEAKIH0KIAogVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgpIHsKLQ0KKwogICAgIC8vIFNhZmV0eSBjbGVhbiB1cAogICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKICAgICAgICAgc3RvcCgpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAKICAgICBMT0dXKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0OlRISVMgSVMgTk9UIElNUExFTUVOVEVEIik7CiAgICAgcmV0dXJuIE5VTEw7Ci19DQorfQogCiBzdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIH0KICAgICAqYnVmZmVyID0gbUZpcnN0QnVmZmVyTGluay0+YnVmZmVyOwogICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsNCisgICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwogCiAgICAgaWYgKCBOVUxMID09IG1GaXJzdEJ1ZmZlckxpbmsgKSB7CiAgICAgICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7CkBAIC0yMzUsNyArMjM1LDcgQEAKICAgICB9CiAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgZW5kIik7CiAgICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0NCit9CiAKIC8qKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgU1RBUlRFRCAgID0gMHg0LAogICAgIEJVRkZFUklORyA9IDB4OCwKICAgICBSRUFESU5HICAgPSAweDEwCi19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlOw0KK30gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfU3RhdGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9TdGF0ZSAgICAgbVN0YXRlOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAgICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGVuY29kZXJTb3VyY2UgPSBOVUxMOwogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gTlVMTDs7CiAgICAgT01YQ2xpZW50IGNsaWVudDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBiZWdpbiIpOwogICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwpAQCAtMzYwLDggKzM2MCw4IEBACiAgICAgICAgICAgICAoTTRPU0FfVUludDMyKW91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNE9TQV9JbnQ4LAogICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUsICJFbmNvZGVyIGhlYWRlciIpOwotICAgICAgICBNNE9TQV9tZW1jcHkocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsCi0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKG91dHB1dEJ1ZmZlci0+ZGF0YSgpKStvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwKKyAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkob3V0cHV0QnVmZmVyLT5kYXRhKCkpK291dHB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAogICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUpOwogICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKICAgICB9CkBAIC0zODksNyArMzg5LDcgQEAKIE00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7CiAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CiAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgYmVnaW4iKTsKICAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCiAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKQEAgLTQwNyw3ICs0MDcsNyBAQAogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIG5vIGVycm9yIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIGVuZCIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC00MTYsMTEgKzQxNiwxMSBAQAogICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLAogICAgICAgICBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7DQorICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewogCiAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CiAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgYmVnaW46IGZvcm1hdCAgJWQiLCBmb3JtYXQpOwogICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKICAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IGVuZCIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC00NTQsNyArNDU0LDcgQEAKIE00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjMoTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAogICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAogICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LCBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkKLSAgICAgICAgew0KKyAgICAgICAgewogCiAgICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tIMjYzLCBwQ29udGV4dCwKICAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UsIHBWUFBmY3QsIHBWUFBjdHh0LCBwRXh0ZXJuYWxBUEksIHBVc2VyRGF0YSk7CkBAIC00NjQsNyArNDY0LDcgQEAKIE00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKICAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsNCisgICAgICAgIHsKIAogICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rTVBFRzQsIHBDb250ZXh0LAogICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKQEAgLTQ3NCw3ICs0NzQsNyBAQAogTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2NChNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCiAgICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7DQorICAgICAgICB7CiAKICAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0gyNjQsIHBDb250ZXh0LAogICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7CiAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7CiAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGJlZ2luIik7CiAgICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawogICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7CkBAIC01MDcsNyArNTA3LDcgQEAKICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2Ugbm8gZXJyb3IiKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBlbmQiKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNTI0LDcgKzUyNCw3IEBACiAgICAgaW50MzJfdCBpUHJvZmlsZSA9IDA7CiAgICAgaW50MzJfdCBpRnJhbWVSYXRlID0gMDsKICAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQ0KKwogICAgIExPR1YoIj4+PiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGJlZ2luIik7CiAgICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawogICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7CkBAIC02NjQsNyArNjY0LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZShwRW5jb2RlckNvbnRleHQpOwogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0NCisgICAgfQogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gZW5kIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTY3OSw3ICs2NzksNyBAQAogICAgIE00VklGSV9JbWFnZVBsYW5lIHBPdXRQbGFuZVszXTsKICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKICAgICBpbnQzMl90IG5iQnVmZmVyID0gMDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbjogY3RzICAlZiIsIEN0cyk7CiAgICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawogICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7CkBAIC03NjUsMTEgKzc2NSwxMSBAQAogICAgIGlmICggT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgPT0gXAogICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlckNvbG9yRm9ybWF0ICkgewogICAgICAgICAvLyBZIHBsYW5lIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQKLSAgICAgICAgaWYgKCBwT3V0UGxhbmVbMV0ucGFjX2RhdGEgKSB7DQotICAgICAgICAgICAgU0FGRV9GUkVFKHBPdXRQbGFuZVsxXS5wYWNfZGF0YSk7DQorICAgICAgICBpZiAoIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSApIHsKKyAgICAgICAgICAgIFNBRkVfRlJFRShwT3V0UGxhbmVbMV0ucGFjX2RhdGEpOwogICAgICAgICB9Ci0gICAgICAgIGlmICggcE91dFBsYW5lWzJdLnBhY19kYXRhICkgew0KLSAgICAgICAgICAgIFNBRkVfRlJFRShwT3V0UGxhbmVbMl0ucGFjX2RhdGEpOw0KKyAgICAgICAgaWYgKCBwT3V0UGxhbmVbMl0ucGFjX2RhdGEgKSB7CisgICAgICAgICAgICBTQUZFX0ZSRUUocE91dFBsYW5lWzJdLnBhY19kYXRhKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIChNNE5PX0VSUk9SID09IGVycikgfHwgKE00V0FSX1NGX0xPV19CVUZGRVIgPT0gZXJyKSApIHsKQEAgLTc3OSw3ICs3NzksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIH0KICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0NCisgICAgfQogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNzkyLDcgKzc5Miw3IEBACiAgICAgaW50MzJfdCBpMzJUbXAgPSAwOwogICAgIGludDY0X3QgaTY0VG1wID0gMDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKICAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCiAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKQEAgLTgwOSw3ICs4MDksNiBAQAogICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gKChNNE9TQV9VSW50MzIpYnVmZmVyLT5kYXRhKCkpJTQsIE00RVJSX1BBUkFNRVRFUik7CiAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5nZXQoKSwgTTRFUlJfUEFSQU1FVEVSKTsKICAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICl7Ci0jaWYgMQogICAgICAgICB7ICAgLy8gRGlzcGxheSB0aGUgRFNJCiAgICAgICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIERTSSAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC04MTgsNyArODE3LDYgQEAKICAgICAgICAgICAgICAgICBMT0dWKCJEU0kgWyVkXSAlLjJYIiwgaSwgdG1wW2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2VuZGlmCiAKICNpZm5kZWYgVklERU9FRElUT1JfRU5DT0RFUl9HRVRfRFNJX0FUX0NSRUFUSU9OCiAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgPT0gcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsCkBAIC04MzUsOCArODMzLDggQEAKICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgICAgICAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRPU0FfSW50OCwKICAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSwgIkVuY29kZXIgaGVhZGVyIik7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLAorICAgICAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAogICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKTsKICAgICAgICAgfQogI2VuZGlmIC8qIFZJREVPRURJVE9SX0VOQ09ERVJfR0VUX0RTSV9BVF9DUkVBVElPTiAqLwpAQCAtODQ2LDggKzg0NCw4IEBACiAgICAgICAgICAgICBNNEVSUl9TVEFURSk7CiAKICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYgKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7DQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7DQorICAgICAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKKyAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwogICAgICAgICB9CiAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7CiAKQEAgLTg5Nyw5ICs4OTUsOSBAQAogICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0gKE00T1NBX1VJbnQzMilvdXRwdXRTaXplOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gVGhlIEFVIGNhbiBqdXN0IGJlIGNvcGllZAotICAgICAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5cCi0gICAgICAgICAgICAgICAgZGF0YUFkZHJlc3MsIChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+XAotICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPlwKKyAgICAgICAgICAgICAgICBkYXRhQWRkcmVzcywgKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KShidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5cCisgICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0KCkpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPQogICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKICAgICAgICAgfQpAQCAtOTEzLDkgKzkxMSw5IEBACiAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyA9IEN0czsKICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+RFRTID0gQ3RzOwogCi0gICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwNCisgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwKICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKnBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLA0KKyAgICAgICAgICAgICpwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUsCiAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5DVFMpOwogCkBAIC05MzUsNyArOTMzLDcgQEAKICAgICAgICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKTsKICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUgPSAwOwogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0NCisgICAgfQogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTk0NywyMCArOTQ1LDIwIEBACiAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKICAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSAweCVYICVmICVkIiwgcEluUGxhbmUsIEN0cywgRnJhbWVNb2RlKTsKICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwogCiAgICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIGlmICggU1RBUlRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsNCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOw0KKyAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7CisgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOwogICAgIH0KICAgICBWSURFT0VESVRPUl9DSEVDSygKICAgICAgICAgKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKIAogICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICkgew0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyA9IEN0czsNCisgICAgaWYgKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyApIHsKKyAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyA9IEN0czsKICAgICB9CiAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdElucHV0Q3RzID0gQ3RzOwogCkBAIC05OTIsMTMgKzk5MCwxMyBAQAogICAgIH0KICAgICAvLyBSZWFkCiAgICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmb3V0cHV0QnVmZmVyLCBOVUxMKTsKLSAgICBpZiggT0sgIT0gcmVzdWx0ICkgew0KLSAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlOiBlbmNvZGVyIHJldHVybnMgMHglWCIsIHJlc3VsdCk7DQotICAgIH0NCisgICAgaWYoIE9LICE9IHJlc3VsdCApIHsKKyAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlOiBlbmNvZGVyIHJldHVybnMgMHglWCIsIHJlc3VsdCk7CisgICAgfQogCiAgICAgaWYoIEVSUk9SX0VORF9PRl9TVFJFQU0gPT0gcmVzdWx0ICkgewotICAgICAgICBpZiggb3V0cHV0QnVmZmVyICE9IE5VTEwgKSB7DQotICAgICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDogRU9TIHcvIGJ1ZmZlciIpOw0KKyAgICAgICAgaWYoIG91dHB1dEJ1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDogRU9TIHcvIGJ1ZmZlciIpOwogICAgICAgICB9CiAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gVklERU9FRElUT1JfTUlOX0JVRkZFUl9OQiwgTTRFUlJfU1RBVEUpOwogICAgICAgICAvLyBObyBvdXRwdXQgcHJvdmlkZWQgaGVyZSwganVzdCBleGl0CkBAIC0xMDE3LDcgKzEwMTUsNyBAQAogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgbm8gZXJyb3IiKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQ0KKyAgICB9CiAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIGVuZCIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC0xMDI2LDcgKzEwMjQsNyBAQAogICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IE00Tk9fRVJST1I7CiAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICByZXN1bHQgICAgICAgICAgPSBPSzsKLQ0KKwogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IGJlZ2luIik7CiAgICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawogICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7CkBAIC0xMDUyLDcgKzEwNTAsNyBAQAogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBubyBlcnJvciIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0NCisgICAgfQogICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IGVuZCIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC0xMDYyLDcgKzEwNjAsNyBAQAogICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7CiAgICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0NCisKICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIGJlZ2luIik7CiAgICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawogICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7CkBAIC0xMTAyLDcgKzExMDAsNyBAQAogICAgICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIG5vIGVycm9yIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIGVuZCIpOwogICAgIHJldHVybiBlcnI7CiB9CkBAIC0xMTEwLDcgKzExMDgsNyBAQAogTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0NCisKICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9yZWd1bEJpdFJhdGUgYmVnaW4iKTsKICAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCiAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKQEAgLTExMjMsNyArMTEyMSw3IEBACiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZSBubyBlcnJvciIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9yZWd1bEJpdFJhdGUgZW5kIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTExMzIsNyArMTEzMCw3IEBACiAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0NCisKICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gc3RhcnQgb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKICAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCiAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKQEAgLTExNjAsNyArMTE1OCw3IEBACiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBubyBlcnJvciIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9DQorICAgIH0KICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gZW5kIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTExNjksNyArMTE2Nyw3IEBACiAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewogICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwogICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0NCisKICAgICBMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gYmVnaW4gb3B0aW5JZCAweCVYIiwgb3B0aW9uSUQpOwogICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwpAQCAtMTE5NSw3ICsxMTkzLDcgQEAKICAgICAgICAgTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwotfQ0KK30KIAogTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKQEAgLTEyMTUsMjMgKzEyMTMsMjMgQEAKICAgICAqcEZvcm1hdCA9IGZvcm1hdDsKIAogICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoNCi0gICAgICAgICAgICB7DQorICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjM7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6DQotICAgICAgICAgICAgew0KKyAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfTVBFRzQ7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9NUEVHNDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6DQotICAgICAgICAgICAgew0KKyAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6CisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0Ow0KLSAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2NDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSA6IHVuc3VwcG9ydGVkIGZvcm1hdCAlZCIsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCmluZGV4IDQ4MDU0OGYuLmE5MzNmOTcgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCisrKyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCkBAIC01Nyw5ICs1Nyw1IEBACiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCi0jIERvbid0IHByZWxpbmsgdGhpcyBsaWJyYXJ5LiAgRm9yIG1vcmUgZWZmaWNpZW50IGNvZGUsIHlvdSBtYXkgd2FudAotIyB0byBhZGQgdGhpcyBsaWJyYXJ5IHRvIHRoZSBwcmVsaW5rIG1hcCBhbmQgc2V0IHRoaXMgdG8gdHJ1ZS4KLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZGTF90cmFuc2l0aW9uLmMKaW5kZXggN2Q3Y2E0NC4uNjJmZmYyNyAxMDA3NTUKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCkBAIC00MSw3ICs0MSw2IEBACiB1bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFCeVN0ZXAoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX01vZGlmTHVtUGFyYW0gKmx1bV9wYXJhbSwgdm9pZCAqdXNlcl9kYXRhKQogewotI2lmIDEKICAgICB1bnNpZ25lZCBzaG9ydCAqcF9zcmMsICpwX2Rlc3QsICpwX3NyY19saW5lLCAqcF9kZXN0X2xpbmU7CiAgICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwogICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7CkBAIC03MSw3ICs3MCw3IEBACiAgICAgICAgIC8qIHZlcnkgc3BlY2lmaWMgY2FzZSA6IHNldCBsdW1hIHBsYW5lIHRvIDE2ICovCiAgICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDE2KTsKKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwxNiwgdV93aWR0aCk7CiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTIxLDgyICsxMjAsNiBAQAogICAgICAgICBwX2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgIHBfc3JjX2xpbmUgKz0gdV9zdHJpZGU7CiAgICAgfQotI2Vsc2UgLyogaWYgMCAqLwotICAgIHVuc2lnbmVkIGNoYXIgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIHVuc2lnbmVkIGxvbmcgbGYxLCBsZjIsIGxmMzsKLSAgICBsb25nIGksIGo7Ci0KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgc3dpdGNoKGx1bV9wYXJhbS0+bHVtX2ZhY3RvcikKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICAvKiB2ZXJ5IHNwZWNpZmljIGNhc2UgOiBzZXQgbHVtYSBwbGFuZSB0byAxNiAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LCB1X3dpZHRoLCAxNik7Ci0gICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAxOgotICAgICAgICAvKiAwLjI1ICovCi0gICAgICAgIGxmMSA9IDY7IGxmMiA9IDY7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgLyogMC4zNzUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gNzsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICAvKiAwLjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gNzsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICAvKiAwLjYyNSAqLwotICAgICAgICBsZjEgPSA3OyBsZjIgPSA4OyBsZjMgPSA4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAgIC8qIDAuNzUgKi8KLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgICAvKiAwLjg3NSAqLwotICAgICAgICBsZjEgPSA5OyBsZjIgPSA4OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBsZjEgPSA4OyBsZjIgPSA4OyBsZjMgPSA5OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobHVtX3BhcmFtLT5jb3B5X2Nocm9tYSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29weSBjaHJvbWEgcGxhbmUgKi8KLQotICAgIH0KLQotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGgpOyBpICE9IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGl4ID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgKnBfZGVzdCsrID0gKHVuc2lnbmVkIGNoYXIpICgoKHBpeCA8PCBsZjEpICsgKHBpeCA8PCBsZjIpICsgKHBpeCA8PCBsZjMpICkgPj5cCi0gICAgICAgICAgICAgICAgIExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBwX2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIHBfc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgfQotI2VuZGlmIC8qIGlmIDAgKi8KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjMwLDggKzE1Myw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9jZGVzdF9saW5lLCAoTTRPU0FfTWVtQWRkcjgpcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9jZGVzdCwoTTRPU0FfTWVtQWRkcjgpIHBfY3NyYywgdV93aWR0aCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdF9saW5lLCAodm9pZCAqKXBfY3NyY19saW5lLCB1X3dpZHRoKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0LCh2b2lkICopIHBfY3NyYywgdV93aWR0aCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwogICAgICAgICAgICAgcF9jZGVzdCArPSB1X3N0cmlkZV9vdXQ7CkBAIC0zMjEsMTIgKzI0NCwxMiBAQAogCiAgICAgZm9yIChqID0gKG5iX2JsYWNrX2xpbmVzID4+IDEpOyBqICE9IDA7IGotLSkKICAgICB7IC8qIHNldCBibGFjayBsaW5lcyAqLwotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwgMCx1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDApOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsIDAsdV93aWR0aCk7CiAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgdV93aWR0aHV2LCAxMjgpOwotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdHYsIHVfd2lkdGh1diwgMTI4KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0dSwgMTI4LHVfd2lkdGh1dik7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHYsIDEyOCx1X3dpZHRodXYpOwogICAgICAgICBwX2Rlc3R1ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgcF9kZXN0diArPSB1X3N0cmlkZV9vdXRfdXY7CiAgICAgfQpAQCAtMzQzLDE0ICsyNjYsMTQgQEAKICAgICAvKiBjb3B5IG90aGVyIGxpbmVzIGZyb20gc291cmNlICovCiAgICAgZm9yIChqID0gKHVfaGVpZ2h0IC0gbmJfYmxhY2tfbGluZXMpID4+IDE7IGogIT0gMDsgai0tKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIChNNE9TQV9NZW1BZGRyOClwX3NyYywgdV93aWR0aCk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdCwgKHZvaWQgKilwX3NyYywgdV93aWR0aCk7CiAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgIHBfc3JjICs9IHVfc3RyaWRlOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjLCB1X3dpZHRoKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCh2b2lkICopIHBfc3JjLCB1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjdSwgdV93aWR0aHV2KTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R2LCAoTTRPU0FfTWVtQWRkcjgpcF9zcmN2LCB1X3dpZHRodXYpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3R1LCh2b2lkICopIHBfc3JjdSwgdV93aWR0aHV2KTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwgKHZvaWQgKilwX3NyY3YsIHVfd2lkdGh1dik7CiAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2OwpAQCAtMzkzLDQyICszMTYsMzIgQEAKIAogICAgIGZvciAoaiA9ICh1X2hlaWdodCAtIG5iX2JsYWNrX2xpbmVzKSA+PiAxOyBqICE9IDA7IGotLSkKICAgICB7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LCB1X3dpZHRoLCAwKTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOwogICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwwLCB1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R1LCB1X3dpZHRodXYsIDEyOCk7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgdV93aWR0aHV2LCAxMjgpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3R1LCAxMjgsdV93aWR0aHV2KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0diwgMTI4LHVfd2lkdGh1dik7CiAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICB9CiAKICAgICBmb3IgKGogPSAobmJfYmxhY2tfbGluZXMgPj4gMSk7IGogIT0gMDsgai0tKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsKE00T1NBX01lbUFkZHI4KSBwX3NyYywgdV93aWR0aCk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdCwodm9pZCAqKSBwX3NyYywgdV93aWR0aCk7CiAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgIHBfc3JjICs9IHVfc3RyaWRlOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjLCB1X3dpZHRoKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCh2b2lkICopIHBfc3JjLCB1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjdSwgdV93aWR0aHV2KTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R2LCAoTTRPU0FfTWVtQWRkcjgpcF9zcmN2LCB1X3dpZHRodXYpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3R1LCh2b2lkICopIHBfc3JjdSwgdV93aWR0aHV2KTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwgKHZvaWQgKilwX3NyY3YsIHVfd2lkdGh1dik7CiAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2OwogICAgICAgICBwX3NyY3YgKz0gdV9zdHJpZGVfdXY7CiAgICAgfQogCi0vKiAgICBwX2Rlc3R1ID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsxXS5wYWNfZGF0YVtwbGFuZV9vdXRbMV0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3R2ID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsyXS5wYWNfZGF0YVtwbGFuZV9vdXRbMl0udV90b3BsZWZ0XTsKLSAgICBmb3IgKGogPSAodV9oZWlnaHQgPj4gMSk7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgTTRPU0FfbWVtc2V0KHBfZGVzdHUsIHVfd2lkdGh1diwgMTI4KTsKLSAgICAgICAgTTRPU0FfbWVtc2V0KHBfZGVzdHYsIHVfd2lkdGh1diwgMTI4KTsKLSAgICAgICAgcF9kZXN0dSArPSB1X3N0cmlkZV9vdXRfdXY7Ci0gICAgICAgIHBfZGVzdHYgKz0gdV9zdHJpZGVfb3V0X3V2OwotICAgIH0KLSovCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQ2MSwxNCArMzc0LDE0IEBACiAKICAgICBmb3IgKGogPSAobmJfYmxhY2tfbGluZXMgPj4gMSk7IGogIT0gMDsgai0tKQogICAgIHsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsKE00T1NBX01lbUFkZHI4KSBwX3NyYywgdV93aWR0aCk7CisgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdCwodm9pZCAqKSBwX3NyYywgdV93aWR0aCk7CiAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgIHBfc3JjICs9IHVfc3RyaWRlOwotICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjLCB1X3dpZHRoKTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCh2b2lkICopIHBfc3JjLCB1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjdSwgdV93aWR0aHV2KTsKLSAgICAgICAgTTRPU0FfbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R2LChNNE9TQV9NZW1BZGRyOCkgcF9zcmN2LCB1X3dpZHRodXYpOworICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3R1LCh2b2lkICopIHBfc3JjdSwgdV93aWR0aHV2KTsKKyAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwodm9pZCAqKSBwX3NyY3YsIHVfd2lkdGh1dik7CiAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2OwpAQCAtNDc3LDEyICszOTAsMTIgQEAKIAogICAgIGZvciAoaiA9ICh1X2hlaWdodCAtIG5iX2JsYWNrX2xpbmVzKSA+PiAxOyBqICE9IDA7IGotLSkKICAgICB7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LCB1X3dpZHRoLCAwKTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOwogICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwgMCx1X3dpZHRoKTsKICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R1LCB1X3dpZHRodXYsIDEyOCk7Ci0gICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgdV93aWR0aHV2LCAxMjgpOworICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3R1LCAxMjgsdV93aWR0aHV2KTsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0diwgMTI4LHVfd2lkdGh1dik7CiAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICB9CkBAIC01NDEsMTIgKzQ1NCwxMiBAQAogICAgICAgICAvKiB3cml0ZSBibGFjayBsaW5lcyAqLwogICAgICAgICBmb3IgKGogPSAobmJfYmxhY2tfbGluZXMgPj4gMSk7IGogIT0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgdV93aWR0aCwgMCk7CisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsIDAsdV93aWR0aCk7CiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDApOworICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOwogICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwgdV93aWR0aHV2LCAxMjgpOwotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3R2LCB1X3dpZHRodXYsIDEyOCk7CisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3R1LCAxMjgsdV93aWR0aHV2KTsKKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdHYsIDEyOCx1X3dpZHRodXYpOwogICAgICAgICAgICAgcF9kZXN0dSArPSB1X3N0cmlkZV9vdXRfdXY7CiAgICAgICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgfQpAQCAtNTU0LDE0ICs0NjcsMTQgQEAKICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBpbWFnZSAqLwogICAgICAgICBmb3IgKGogPSAodV9oZWlnaHQgLSBuYl9ibGFja19saW5lcykgPj4gMTsgaiAhPSAwOyBqLS0pCiAgICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LCAoTTRPU0FfTWVtQWRkcjgpcF9zcmMsIHVfd2lkdGgpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCAodm9pZCAqKXBfc3JjLCB1X3dpZHRoKTsKICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgICAgICBwX3NyYyArPSB1X3N0cmlkZTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LChNNE9TQV9NZW1BZGRyOCkgcF9zcmMsIHVfd2lkdGgpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0LCh2b2lkICopIHBfc3JjLCB1X3dpZHRoKTsKICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7CiAgICAgICAgICAgICBwX3NyYyArPSB1X3N0cmlkZTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0dSwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjdSwgdV93aWR0aHV2KTsKLSAgICAgICAgICAgIE00T1NBX21lbWNweSgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgKE00T1NBX01lbUFkZHI4KXBfc3JjdiwgdV93aWR0aHV2KTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdHUsKHZvaWQgKikgcF9zcmN1LCB1X3dpZHRodXYpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXN0diwgKHZvaWQgKilwX3NyY3YsIHVfd2lkdGh1dik7CiAgICAgICAgICAgICBwX2Rlc3R1ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgICAgIHBfZGVzdHYgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICAgICAgcF9zcmN1ICs9IHVfc3RyaWRlX3V2OwpAQCAtNTc4LDE0ICs0OTEsMTQgQEAKICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBpbWFnZSBpbWFnZSAqLwogICAgICAgICBmb3IgKGogPSAobmJfYmxhY2tfbGluZXMgPj4gMSk7IGogIT0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwgKE00T1NBX01lbUFkZHI4KXBfc3JjLCB1X3dpZHRoKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdCwgKHZvaWQgKilwX3NyYywgdV93aWR0aCk7CiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwogICAgICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdCwoTTRPU0FfTWVtQWRkcjgpIHBfc3JjLCB1X3dpZHRoKTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdCwodm9pZCAqKSBwX3NyYywgdV93aWR0aCk7CiAgICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwogICAgICAgICAgICAgcF9zcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdHUsKE00T1NBX01lbUFkZHI4KSBwX3NyY3UsIHVfd2lkdGh1dik7Ci0gICAgICAgICAgICBNNE9TQV9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXBfZGVzdHYsKE00T1NBX01lbUFkZHI4KSBwX3NyY3YsIHVfd2lkdGh1dik7CisgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2Rlc3R1LCh2b2lkICopIHBfc3JjdSwgdV93aWR0aHV2KTsKKyAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzdHYsKHZvaWQgKikgcF9zcmN2LCB1X3dpZHRodXYpOwogICAgICAgICAgICAgcF9kZXN0dSArPSB1X3N0cmlkZV9vdXRfdXY7CiAgICAgICAgICAgICBwX2Rlc3R2ICs9IHVfc3RyaWRlX291dF91djsKICAgICAgICAgICAgIHBfc3JjdSArPSB1X3N0cmlkZV91djsKQEAgLTU5NiwxMiArNTA5LDEyIEBACiAgICAgICAgIC8qIHRoZSBwb2ludGVycyB0byBwX2Rlc3QsIHBfZGVzdHUgYW5kIHBfZGVzdHYgYXJlIHVzZWQgdGhyb3VnaCB0aGUgdHdvIGxvb3BzICJmb3IiICovCiAgICAgICAgIGZvciAoaiA9ICh1X2hlaWdodCAtIG5iX2JsYWNrX2xpbmVzKSA+PiAxOyBqICE9IDA7IGotLSkKICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfbWVtc2V0KChNNE9TQV9NZW1BZGRyOClwX2Rlc3QsIHVfd2lkdGgsIDApOworICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0LCAwLHVfd2lkdGgpOwogICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0LCB1X3dpZHRoLCAwKTsKKyAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwgMCx1X3dpZHRoKTsKICAgICAgICAgICAgIHBfZGVzdCArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBNNE9TQV9tZW1zZXQoKE00T1NBX01lbUFkZHI4KXBfZGVzdHUsIHVfd2lkdGh1diwgMTI4KTsKLSAgICAgICAgICAgIE00T1NBX21lbXNldCgoTTRPU0FfTWVtQWRkcjgpcF9kZXN0diwgdV93aWR0aHV2LCAxMjgpOworICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9kZXN0dSwgMTI4LHVfd2lkdGh1dik7CisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3R2LCAxMjgsdV93aWR0aHV2KTsKICAgICAgICAgICAgIHBfZGVzdHUgKz0gdV9zdHJpZGVfb3V0X3V2OwogICAgICAgICAgICAgcF9kZXN0diArPSB1X3N0cmlkZV9vdXRfdXY7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jCmluZGV4IGEyMWUxZDAuLmViZDhiMTkgMTAwNzU1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYworKysgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKQEAgLTc4LDEzICs3OCwxMyBAQAogICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKIAogICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiggKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKKyAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKICAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKICAgICB9CiAKLSAgICBpZiggKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAorICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8CiAgICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKQogICAgIHsKICAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwpAQCAtMTk3LDEyICsxOTcsNDcgQEAKICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4pOwogICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KIAotICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSxwdThfc3JjX3RvcCwzKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY19ib3R0b20sMCk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDMpOwotCisgICAgICAgICAgICAgICAgaWYgKCh1MzJfd2lkdGggPT0gMSkgJiYgKHUzMl93aWR0aF9pbiA9PSB1MzJfd2lkdGhfb3V0KSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGlucHV0IGhlaWdodCBpcyBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZCBpbnB1dCB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUgY29ybmVyIHBpeGVscyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbgorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgbm90IGVxdWFsIHRvIG91dHB1dCBoZWlnaHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHdpZHRoIGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY19ib3R0b20sMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY19ib3R0b20sMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGlucHV0IGhlaWdodCBpcyBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBub3QgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIHJvdyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY190b3AsMyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY19ib3R0b20sMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY19ib3R0b20sMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCg==