ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9tZW51LmMgYi9zdXB3aXNkb20vc3BfbWVudS5jCmluZGV4IDg4ZGVhOWIuLjU3MmY3ODggMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9tZW51LmMKKysrIGIvc3Vwd2lzZG9tL3NwX21lbnUuYwpAQCAtNjExLDYgKzYxMSw3IEBACiAgICAgewogICAgICAgaWYoa2NvZGUgPT0gU1BfS0VZX0NMRUFSKQogICAgICAgeworICAgICAgICBzcF92YWx2ZV9vZmYoKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOwpAQCAtNjIzLDYgKzYyNCw3IEBACiAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLB98G/suLK1NbQIixtc2csREVMQVlfVElNRTEwMG1zKTsKICAgICB9CiAgIH0KKyAgc3BfdmFsdmVfb2ZmKCk7CiAgIHNwcmludGYobXNnLCLB98G/vMbK/TolZCIsc3BfZmxvd3NlbnNvcl9nZXRfY291bnQoKSk7CiAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIsH3wb+y4srUveHK+CIsbXNnLERFTEFZX1RJTUUzcyk7CiB9CmRpZmYgLS1naXQgYS9zeXNfaHcvZHJ2X2FkYy5jIGIvc3lzX2h3L2Rydl9hZGMuYwppbmRleCBhZDU0MDk2Li5lYzQ2NjRhIDEwMDY0NAotLS0gYS9zeXNfaHcvZHJ2X2FkYy5jCisrKyBiL3N5c19ody9kcnZfYWRjLmMKQEAgLTEsMzIxICsxLDM2NyBAQAotI2luY2x1ZGUgImRydl9hZGMuaCIKLSNpbmNsdWRlICJzdG0zMmYxMHguaCIKLSNpbmNsdWRlICJrZXlwYWQuaCIKLSNpbmNsdWRlICJzdHJpbmcuaCIKLSNpbmNsdWRlICIuLi9zdXB3aXNkb20vc3BfdXRpbC5oIgotI2luY2x1ZGUgIi4uL3N1cHdpc2RvbS9zcF9mbGFzaC5oIgotCi0vLyNpbmNsdWRlICJtaWZhcmVfb25lX2h3X2xpYi5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0jaW5jbHVkZSAiZGF0YV90b29scy5oIgotLy8jaW5jbHVkZSAiY3JjLmgiCi0vLyNpbmNsdWRlICJkYmcuaCIKLQotI2RlZmluZSBQRERUaHJlc2hvZF9Wb3RhZ2UgICAgODAKLSNkZWZpbmUgUEREVGhyZXNob2RfQURDVmFsICAgIChQRERUaHJlc2hvZF9Wb3RhZ2UqNDA5NUwvNzEzTCkKLQotI2RlZmluZSBSZXNldF9Wb3RhZ2UgICAgICAgICAgNzQgICAgICAgLy9UUFM1NDE2MM2j1rm5pNf3tefRuTcuMVYKLSNkZWZpbmUgUmVzZXRfQURDVmFsICAgICAgICAgIChSZXNldF9Wb3RhZ2UqNDA5NUwvNzEzTCkKLQotCi10eXBlZGVmIHZvaWQgKCphZGNfdGltZXJfdGlja190KSh2b2lkKTsKLQotdm9sYXRpbGUgdWludDhfdCAgYWRjX3RpbWVyOwotdm9sYXRpbGUgdWludDhfdCAgY2hfaWR4Owotdm9sYXRpbGUgdWludDE2X3QgYWRjX3ZhbF92ZGQ9NDA5NTsKLXZvbGF0aWxlIHVpbnQxNl90IGFkY192YWw7Ci1kYWNfcGFyYV90IGRhY19wYXJhID0gezg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCA4OTAsIDB9OyAvL2RhY8rks/a159G5xKzIzzMuM1YKLWFkY190aW1lcl90aWNrX3QgcF9hZGNfdGltZXJfdGljayA9IDA7Ci12b2xhdGlsZSB1aW50MTZfdCBhZGNfYnVmZltBRENfTUFYX0NIX05VTV07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBhZGNfY2hfdGJsW0FEQ19NQVhfQ0hfTlVNXSA9Ci17Ci0gIEFEQ19DaGFubmVsXzksICAgICAgICAgLy9rZXlfYWRjMSxwYjEKLSAgQURDX0NoYW5uZWxfNCwgICAgICAgICAvL2tleV9hZGMyLHBhNAotICBBRENfQ2hhbm5lbF8xLCAgICAgICAgIC8va2V5X2FkYzMscGExCi0gIEFEQ19DaGFubmVsXzgsICAgICAgICAgLy9rZXlfYWRjNCxwYjAKLSAgQURDX0NoYW5uZWxfMywgICAgICAgICAvL2tleV9hZGM1LHBhMwotICBBRENfQ2hhbm5lbF8wLCAgICAgICAgIC8va2V5X2FkYzYscGEwCi0gIEFEQ19DaGFubmVsXzE1LCAgICAgICAgLy9rZXlfYWRjNyxwYzUKLSAgQURDX0NoYW5uZWxfMiwgICAgICAgICAvL2tleV9hZGM4LHBhMgotICBBRENfQ2hhbm5lbF8xMywgICAgICAgIC8va2V5X2FkYzkscGMzCi0gIEFEQ19DaGFubmVsXzExLCAgICAgICAgLy9rZXlfYWRjMTAscGMxCi0gIEFEQ19DaGFubmVsXzEwLCAgICAgICAgLy9rZXlfYWRjMTEscGMwCi0gIEFEQ19DaGFubmVsXzEyLCAgICAgICAgLy9rZXlfYWRjMTIscGMyCi0gIEFEQ19DaGFubmVsXzYsICAgICAgICAgLy92Y2NfYWRjX2luLHBhNgotICBBRENfQ2hhbm5lbF8xNCwgICAgICAgIC8vZmFfYWRjX2luLHBjNAotICBBRENfQ2hhbm5lbF83ICAgICAgICAgIC8vaGFsbF9hZGNfaW4scGE3Ci19OwotCi12b2lkIGFkY190aW1lcl90aWNrKHZvaWQpOwotc3RhdGljIHZvaWQgdGltZXI0X2luaXQodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIGFkY19ncGlvX2luaXQodm9pZCkKLXsKLSAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3R1cmU7Ci0KLSAgUkNDX0FQQjJQZXJpcGhDbG9ja0NtZChSQ0NfQVBCMlBlcmlwaF9HUElPQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0FQQjJQZXJpcGhfR1BJT0IgfAotICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19BUEIyUGVyaXBoX0dQSU9DLCBFTkFCTEUpOwotCi0gIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX01vZGUgPSBHUElPX01vZGVfQUlOOwotCi0gIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IEdQSU9fUGluXzAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl8xIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl80IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fNiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzc7Ci0gIEdQSU9fSW5pdChHUElPQSwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7Ci0KLSAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzE7Ci0gIEdQSU9fSW5pdChHUElPQiwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7Ci0KLSAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl8yIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fMyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl81OwotICBHUElPX0luaXQoR1BJT0MsICZHUElPX0luaXRTdHJ1Y3R1cmUpOwotfQotCi1zdGF0aWMgdm9pZCBhZGNfY2hhbm5lbHNfaW5pdCh2b2lkKQotewotICBBRENfSW5pdFR5cGVEZWYgQURDX0luaXRTdHJ1Y3R1cmU7Ci0KLSAgUkNDX0FEQ0NMS0NvbmZpZyhSQ0NfUENMSzJfRGl2Nik7Ci0gIFJDQ19BUEIyUGVyaXBoQ2xvY2tDbWQoUkNDX0FQQjJQZXJpcGhfQURDMSwgRU5BQkxFKTsKLQotICBBRENfSW5pdFN0cnVjdHVyZS5BRENfTW9kZSA9IEFEQ19Nb2RlX0luZGVwZW5kZW50OwotICBBRENfSW5pdFN0cnVjdHVyZS5BRENfU2NhbkNvbnZNb2RlID0gRElTQUJMRTsKLSAgQURDX0luaXRTdHJ1Y3R1cmUuQURDX0NvbnRpbnVvdXNDb252TW9kZSA9IERJU0FCTEU7Ci0gIEFEQ19Jbml0U3RydWN0dXJlLkFEQ19FeHRlcm5hbFRyaWdDb252ID0gQURDX0V4dGVybmFsVHJpZ0NvbnZfTm9uZTsKLSAgQURDX0luaXRTdHJ1Y3R1cmUuQURDX0RhdGFBbGlnbiA9IEFEQ19EYXRhQWxpZ25fUmlnaHQ7Ci0gIEFEQ19Jbml0U3RydWN0dXJlLkFEQ19OYnJPZkNoYW5uZWwgPSAxOwotICBBRENfSW5pdChBREMxLCAmQURDX0luaXRTdHJ1Y3R1cmUpOwotICBBREMxLT5DUjIgfD0gMHgwMDEwMDAwOwotCi0gIC8va2V5IGFkYyAxIC0gMTIKLSAgY2hfaWR4ID0gMDsKLSAgQURDX1JlZ3VsYXJDaGFubmVsQ29uZmlnKEFEQzEsIGFkY19jaF90YmxbY2hfaWR4XSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ19TYW1wbGVUaW1lXzIzOUN5Y2xlczUpOwotICBBRENfQ21kKEFEQzEsIEVOQUJMRSk7Ci0KLSAgQURDX1Jlc2V0Q2FsaWJyYXRpb24oQURDMSk7Ci0gIHdoaWxlKEFEQ19HZXRSZXNldENhbGlicmF0aW9uU3RhdHVzKEFEQzEpKTsKLQotICBBRENfU3RhcnRDYWxpYnJhdGlvbihBREMxKTsKLSAgd2hpbGUoQURDX0dldENhbGlicmF0aW9uU3RhdHVzKEFEQzEpKTsKLSAgQURDX1NvZnR3YXJlU3RhcnRDb252Q21kKEFEQzEsIEVOQUJMRSk7Ci0gIHBfYWRjX3RpbWVyX3RpY2sgPSBhZGNfdGltZXJfdGljazsKLX0KLQotc3RhdGljIHZvaWQgYWRjX2RtYV9pbml0KHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGFkY19udmljX2luaXQodm9pZCkKLXsKLQotfQotCi1zdGF0aWMgdm9pZCBkYWNfaW5pdCh2b2lkKQotewotICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdHVyZTsKLQotICBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKFJDQ19BUEIyUGVyaXBoX0dQSU9BLCBFTkFCTEUpOwotCi0gIERBQ19EZUluaXQoKTsKLQotICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19Nb2RlID0gR1BJT19Nb2RlX0FJTjsKLQotICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBHUElPX1Bpbl81OwotICBHUElPX0luaXQoR1BJT0EsICZHUElPX0luaXRTdHJ1Y3R1cmUpOwotCi0KLSAgUkNDX0FQQjFQZXJpcGhDbG9ja0NtZChSQ0NfQVBCMVBlcmlwaF9EQUMsIEVOQUJMRSk7Ci0KLSAgREFDLT5DUiB8PSAweDAwMDEwMDAwOwotICBEQUNfU2V0Q2hhbm5lbDJEYXRhKERBQ19BbGlnbl8xMmJfUiwgZGFjX3BhcmEudmFsWzBdKTsKLX0KLS8qKgotKirQo9e8sLS8/AotKiovCi12b2lkIGNhbGlicmF0ZV9rZXkodWludDggY2FjaGVfZW5hYmxlKQotewotICBjb25zdCB1aW50OCBsZW4gPSBzaXplb2YoZGFjX3BhcmEpICsyOwotICB1aW50OCBidWZbbGVuXTsKLSAgaWYoY2FjaGVfZW5hYmxlKQotICB7Ci0gICAgdWludDggY3JjWzJdOwotICAgIHNwX2ZsYXNoX3JlYWQoQUREUl9LRVlfUEFSQSxidWYsbGVuKTsKLSAgICBzcF9wcm90b2NvbF9jcmMoYnVmICxsZW4gLTIsY3JjKTsKLSAgICBpZihtZW1jbXAoYnVmICtsZW4gLTIsY3JjLDIpID09IDApCi0gICAgewotICAgICAgbWVtY3B5KCh1aW50OCopJmRhY19wYXJhLGJ1ZixzaXplb2YoZGFjX3BhcmEpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZGFjX3BhcmFfYXV0b19zZXQoKTsKLSAgbWVtY3B5KGJ1ZiwodWludDgqKSZkYWNfcGFyYSxzaXplb2YoZGFjX3BhcmEpKTsKLSAgc3BfcHJvdG9jb2xfY3JjKGJ1ZixsZW4gLTIsYnVmICtsZW4gLTIpOwotICBzcF9mbGFzaF9lcmFzZShBRERSX0tFWV9QQVJBKTsKLSAgc3BfZmxhc2hfd3JpdGUoQUREUl9LRVlfUEFSQSxidWYsbGVuKTsKLX0KLQotdm9pZCBhZGNfaW5pdCh2b2lkKQotewotICB0aW1lcjRfaW5pdCgpOwotICBkYWNfaW5pdCgpOwotICBhZGNfZ3Bpb19pbml0KCk7Ci0gIGFkY19udmljX2luaXQoKTsKLSAgYWRjX2RtYV9pbml0KCk7Ci0gIGFkY19jaGFubmVsc19pbml0KCk7Ci0gIGNhbGlicmF0ZV9rZXkoMSk7Ci19Ci0KLXVpbnQxNl90IGFkY19nZXRfdmFsKHVpbnQ4X3QgY2gpCi17Ci0gIGlmKGNoPEFEQ19NQVhfQ0hfTlVNKQotICB7Ci0gICAgcmV0dXJuIGFkY19idWZmW2NoXTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi12b2lkIGFkY190aW1lcl90aWNrKHZvaWQpCi17Ci0gIGFkY190aW1lciArKzsKLSAgaWYoYWRjX3RpbWVyPj04KQotICB7Ci0gICAgYWRjX3RpbWVyID0gMDsKLSAgfQotICBpZihhZGNfdGltZXI9PTApCi0gIHsKLSAgICBhZGNfYnVmZltjaF9pZHhdID0gQURDX0dldENvbnZlcnNpb25WYWx1ZShBREMxKTsKLSAgICBjaF9pZHggKys7Ci0gICAgaWYoY2hfaWR4ID49IEFEQ19NQVhfQ0hfTlVNKQotICAgIHsKLSAgICAgIGtleXBhZF9zY2FuKCk7Ci0gICAgICBjaF9pZHggPSAwOwotICAgIH0KLQotICAgIGlmKGNoX2lkeCA8IDEyKQotICAgIHsKLSAgICAgIERBQ19TZXRDaGFubmVsMkRhdGEoREFDX0FsaWduXzEyYl9SLCBkYWNfcGFyYS52YWxbY2hfaWR4XSk7Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYoYWRjX3RpbWVyID09IDcpCi0gIHsKLSAgICBBRENfUmVndWxhckNoYW5uZWxDb25maWcoQURDMSwgYWRjX2NoX3RibFtjaF9pZHhdLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1KTsKLSAgICBBRENfU29mdHdhcmVTdGFydENvbnZDbWQoQURDMSwgRU5BQkxFKTsKLSAgfQotfQotCi12b2lkIGFkY190aW1lcl90YXNrKHZvaWQpCi17Ci0gIGlmKHBfYWRjX3RpbWVyX3RpY2spCi0gIHsKLSAgICAvL9LRvq2z9cq8u6/N6rPJCi0gICAgcF9hZGNfdGltZXJfdGljaygpOwotICB9Ci19Ci0KLXZvaWQgZGFjX3BhcmFfYXV0b19zZXQodm9pZCkKLXsKLSAgdWludDhfdCBpOwotICB1aW50MTZfdCBkYWNfdmFsID0gNDA5NTsKLSAgdWludDhfdCAgYWRqX2ZsYWdzWzEyXTsKLQotICBwX2FkY190aW1lcl90aWNrID0gMDsKLSAgZGVsYXlfbXMoMTApOwotICBtZW1zZXQoYWRqX2ZsYWdzLCAxLCBzaXplb2YoYWRqX2ZsYWdzKSk7Ci0gIHdoaWxlKChkYWNfdmFsKjMzMDB1bCo2Ni80MDk1MCkgPiAyMDAwKSAgICAgLy/Uy7fFyuSz9rK7tc3T2jJWCi0gIHsKLSAgICBmb3IoaT0wOyBpPDEyOyBpKyspCi0gICAgewotICAgICAgaWYoYWRqX2ZsYWdzW2ldKQotICAgICAgewotICAgICAgICBkYWNfcGFyYS52YWxbaV0gPSBkYWNfdmFsOwotICAgICAgfQotICAgICAgREFDX1NldENoYW5uZWwyRGF0YShEQUNfQWxpZ25fMTJiX1IsIGRhY192YWwpOwotICAgICAgZGVsYXlfbXMoNik7Ci0gICAgICBBRENfUmVndWxhckNoYW5uZWxDb25maWcoQURDMSwgYWRjX2NoX3RibFtpXSwgMSwgQURDX1NhbXBsZVRpbWVfMjM5Q3ljbGVzNSk7Ci0gICAgICBBRENfU29mdHdhcmVTdGFydENvbnZDbWQoQURDMSwgRU5BQkxFKTsKLSAgICAgIGRlbGF5X21zKDIpOwotICAgICAgaWYoQURDX0dldENvbnZlcnNpb25WYWx1ZShBREMxKSA8IDMwMHVsKQotICAgICAgewotICAgICAgICBhZGpfZmxhZ3NbaV0gPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGpfZmxhZ3NbaV0gPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIGlmKG1lbV90ZXN0KGFkal9mbGFncywgMCwgc2l6ZW9mKGFkal9mbGFncykpID09IDApCi0gICAgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRhY192YWwgLT0gMTI0OwotICB9Ci0gIHBfYWRjX3RpbWVyX3RpY2sgPSBhZGNfdGltZXJfdGljazsKLQotfQotCi1zdGF0aWMgdm9pZCB0aW1lcjRfaW5pdCh2b2lkKQotewotICB1aW50MTZfdCBQcmVzY2FsZXJWYWx1ZSA9IDA7Ci0gIFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmICBUSU1fVGltZUJhc2VTdHJ1Y3R1cmU7Ci0gIFRJTV9PQ0luaXRUeXBlRGVmICBUSU1fT0NJbml0U3RydWN0dXJlOwotCi0gIEdQSU9fSW5pdFR5cGVEZWYgR1BJT19Jbml0U3RydWN0dXJlOwotCi0gIC8qIFRJTTQgY2xvY2sgZW5hYmxlICovCi0gIFJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoUkNDX0FQQjFQZXJpcGhfVElNNCwgRU5BQkxFKTsKLQotICAvKiBHUElPQSBhbmQgR1BJT0IgY2xvY2sgZW5hYmxlICovCi0gIFJDQ19BUEIyUGVyaXBoQ2xvY2tDbWQoUkNDX0FQQjJQZXJpcGhfR1BJT0J8UkNDX0FQQjJQZXJpcGhfQUZJTywgRU5BQkxFKTsKLQotICAvKkdQSU9CIENvbmZpZ3VyYXRpb246IFRJTTQgY2hhbm5lbDMgYW5kIDQgKi8KLSAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gIEdQSU9fUGluXzggfCBHUElPX1Bpbl85OwotICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19Nb2RlID0gR1BJT19Nb2RlX0FGX1BQOwotICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19TcGVlZCA9IEdQSU9fU3BlZWRfNTBNSHo7Ci0gIEdQSU9fSW5pdChHUElPQiwgJkdQSU9fSW5pdFN0cnVjdHVyZSk7Ci0KLSAgUHJlc2NhbGVyVmFsdWUgPSAodWludDE2X3QpKFN5c3RlbUNvcmVDbG9jayAvIDcyMDAwMDAwKSAtIDE7Ci0gIC8qIFRpbWUgYmFzZSBjb25maWd1cmF0aW9uICovCi0gIFRJTV9UaW1lQmFzZVN0cnVjdHVyZS5USU1fUGVyaW9kID0gNzE5OwotICBUSU1fVGltZUJhc2VTdHJ1Y3R1cmUuVElNX1ByZXNjYWxlciA9IFByZXNjYWxlclZhbHVlOwotICBUSU1fVGltZUJhc2VTdHJ1Y3R1cmUuVElNX0Nsb2NrRGl2aXNpb24gPSAwOwotICBUSU1fVGltZUJhc2VTdHJ1Y3R1cmUuVElNX0NvdW50ZXJNb2RlID0gVElNX0NvdW50ZXJNb2RlX1VwOwotCi0gIFRJTV9UaW1lQmFzZUluaXQoVElNNCwgJlRJTV9UaW1lQmFzZVN0cnVjdHVyZSk7Ci0KLSAgLyogUFdNMSBNb2RlIGNvbmZpZ3VyYXRpb246IENoYW5uZWwxICovCi0gIFRJTV9PQ0luaXRTdHJ1Y3R1cmUuVElNX09DTW9kZSA9IFRJTV9PQ01vZGVfUFdNMTsKLSAgVElNX09DSW5pdFN0cnVjdHVyZS5USU1fT3V0cHV0U3RhdGUgPSBUSU1fT3V0cHV0U3RhdGVfRW5hYmxlOwotICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9QdWxzZSA9IDM1OTsKLSAgVElNX09DSW5pdFN0cnVjdHVyZS5USU1fT0NQb2xhcml0eSA9IFRJTV9PQ1BvbGFyaXR5X0hpZ2g7Ci0gIFRJTV9PQzNJbml0KFRJTTQsICZUSU1fT0NJbml0U3RydWN0dXJlKTsKLSAgVElNX09DM1ByZWxvYWRDb25maWcoVElNNCwgVElNX09DUHJlbG9hZF9FbmFibGUpOwotCi0gIC8qIFBXTTEgTW9kZSBjb25maWd1cmF0aW9uOiBDaGFubmVsMiAqLwotICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9PQ01vZGUgPSBUSU1fT0NNb2RlX1BXTTE7Ci0gIFRJTV9PQ0luaXRTdHJ1Y3R1cmUuVElNX091dHB1dFN0YXRlID0gVElNX091dHB1dFN0YXRlX0VuYWJsZTsKLSAgVElNX09DSW5pdFN0cnVjdHVyZS5USU1fUHVsc2UgPSAzNTk7Ci0gIFRJTV9PQ0luaXRTdHJ1Y3R1cmUuVElNX09DUG9sYXJpdHkgPSBUSU1fT0NQb2xhcml0eV9Mb3c7Ci0gIFRJTV9PQzRJbml0KFRJTTQsICZUSU1fT0NJbml0U3RydWN0dXJlKTsKLSAgVElNX09DNFByZWxvYWRDb25maWcoVElNNCwgVElNX09DUHJlbG9hZF9FbmFibGUpOwotCi0gIFRJTV9BUlJQcmVsb2FkQ29uZmlnKFRJTTQsIEVOQUJMRSk7Ci0KLSAgLyogVElNNCBlbmFibGUgY291bnRlciAqLwotICBUSU1fQ21kKFRJTTQsIEVOQUJMRSk7Ci19CisjaW5jbHVkZSAiZHJ2X2FkYy5oIg0KKyNpbmNsdWRlICJzdG0zMmYxMHguaCINCisjaW5jbHVkZSAia2V5cGFkLmgiDQorI2luY2x1ZGUgInN0cmluZy5oIg0KKyNpbmNsdWRlICIuLi9zdXB3aXNkb20vc3BfdXRpbC5oIg0KKyNpbmNsdWRlICIuLi9zdXB3aXNkb20vc3BfZmxhc2guaCINCisNCisvLyNpbmNsdWRlICJtaWZhcmVfb25lX2h3X2xpYi5oIg0KKyNpbmNsdWRlICJ0aW1lci5oIg0KKyNpbmNsdWRlICJkYXRhX3Rvb2xzLmgiDQorLy8jaW5jbHVkZSAiY3JjLmgiDQorLy8jaW5jbHVkZSAiZGJnLmgiDQorDQorI2RlZmluZSBQRERUaHJlc2hvZF9Wb3RhZ2UgICAgODANCisjZGVmaW5lIFBERFRocmVzaG9kX0FEQ1ZhbCAgICAoUEREVGhyZXNob2RfVm90YWdlKjQwOTVMLzcxM0wpDQorDQorI2RlZmluZSBSZXNldF9Wb3RhZ2UgICAgICAgICAgNzQgICAgICAgLy9UUFM1NDE2MM2j1rm5pNf3tefRuTcuMVYNCisjZGVmaW5lIFJlc2V0X0FEQ1ZhbCAgICAgICAgICAoUmVzZXRfVm90YWdlKjQwOTVMLzcxM0wpDQorDQorDQordHlwZWRlZiB2b2lkICgqYWRjX3RpbWVyX3RpY2tfdCkodm9pZCk7DQorDQordm9sYXRpbGUgdWludDhfdCAgYWRjX3RpbWVyOw0KK3ZvbGF0aWxlIHVpbnQ4X3QgIGNoX2lkeDsNCit2b2xhdGlsZSB1aW50MTZfdCBhZGNfdmFsX3ZkZD00MDk1Ow0KK3ZvbGF0aWxlIHVpbnQxNl90IGFkY192YWw7DQorZGFjX3BhcmFfdCBkYWNfcGFyYSA9IHs4OTAsIDg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCA4OTAsIDg5MCwgODkwLCAwfTsgLy9kYWPK5LP2tefRucSsyM8zLjNWDQorYWRjX3RpbWVyX3RpY2tfdCBwX2FkY190aW1lcl90aWNrID0gMDsNCit2b2xhdGlsZSB1aW50MTZfdCBhZGNfYnVmZltBRENfTUFYX0NIX05VTV07DQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWRjX2NoX3RibFtBRENfTUFYX0NIX05VTV0gPQ0KK3sNCisgIEFEQ19DaGFubmVsXzksDQorICBBRENfQ2hhbm5lbF80LA0KKyAgQURDX0NoYW5uZWxfMSwNCisgIEFEQ19DaGFubmVsXzgsDQorICBBRENfQ2hhbm5lbF8zLA0KKyAgQURDX0NoYW5uZWxfMCwNCisgIEFEQ19DaGFubmVsXzE1LA0KKyAgQURDX0NoYW5uZWxfMiwNCisgIEFEQ19DaGFubmVsXzEzLA0KKyAgQURDX0NoYW5uZWxfMTEsDQorICBBRENfQ2hhbm5lbF8xMCwNCisgIEFEQ19DaGFubmVsXzEyLA0KKyAgQURDX0NoYW5uZWxfMTQsDQorICBBRENfQ2hhbm5lbF83DQorfTsNCisNCit2b2lkIGFkY190aW1lcl90aWNrKHZvaWQpOw0KK3N0YXRpYyB2b2lkIGFkY19wZGRfcHJvY2Vzcyh2b2lkKTsNCitzdGF0aWMgdm9pZCB0aW1lcjRfaW5pdCh2b2lkKTsNCisNCitzdGF0aWMgdm9pZCBhZGNfZ3Bpb19pbml0KHZvaWQpDQorew0KKyAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3R1cmU7DQorDQorICBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKFJDQ19BUEIyUGVyaXBoX0dQSU9BIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX0FQQjJQZXJpcGhfR1BJT0IgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfQVBCMlBlcmlwaF9HUElPQywgRU5BQkxFKTsNCisNCisgIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX01vZGUgPSBHUElPX01vZGVfQUlOOw0KKw0KKyAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl8xIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzIgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fMyB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl80IHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzc7DQorICBHUElPX0luaXQoR1BJT0EsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KKw0KKyAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fUGluID0gR1BJT19QaW5fMCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl8xOw0KKyAgR1BJT19Jbml0KEdQSU9CLCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCisNCisgIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9IEdQSU9fUGluXzAgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fMSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl8yIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fUGluXzMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19QaW5fNCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX1Bpbl81Ow0KKyAgR1BJT19Jbml0KEdQSU9DLCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCit9DQorDQorc3RhdGljIHZvaWQgYWRjX2NoYW5uZWxzX2luaXQodm9pZCkNCit7DQorICBBRENfSW5pdFR5cGVEZWYgQURDX0luaXRTdHJ1Y3R1cmU7DQorDQorICBSQ0NfQURDQ0xLQ29uZmlnKFJDQ19QQ0xLMl9EaXY2KTsNCisgIFJDQ19BUEIyUGVyaXBoQ2xvY2tDbWQoUkNDX0FQQjJQZXJpcGhfQURDMSwgRU5BQkxFKTsNCisNCisgIEFEQ19Jbml0U3RydWN0dXJlLkFEQ19Nb2RlID0gQURDX01vZGVfSW5kZXBlbmRlbnQ7DQorICBBRENfSW5pdFN0cnVjdHVyZS5BRENfU2NhbkNvbnZNb2RlID0gRElTQUJMRTsNCisgIEFEQ19Jbml0U3RydWN0dXJlLkFEQ19Db250aW51b3VzQ29udk1vZGUgPSBESVNBQkxFOw0KKyAgQURDX0luaXRTdHJ1Y3R1cmUuQURDX0V4dGVybmFsVHJpZ0NvbnYgPSBBRENfRXh0ZXJuYWxUcmlnQ29udl9Ob25lOw0KKyAgQURDX0luaXRTdHJ1Y3R1cmUuQURDX0RhdGFBbGlnbiA9IEFEQ19EYXRhQWxpZ25fUmlnaHQ7DQorICBBRENfSW5pdFN0cnVjdHVyZS5BRENfTmJyT2ZDaGFubmVsID0gMTsNCisgIEFEQ19Jbml0KEFEQzEsICZBRENfSW5pdFN0cnVjdHVyZSk7DQorICBBREMxLT5DUjIgfD0gMHgwMDEwMDAwOw0KKw0KKyAgLy9rZXkgYWRjIDEgLSAxMg0KKyAgY2hfaWR4ID0gMDsNCisgIEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZyhBREMxLCBhZGNfY2hfdGJsW2NoX2lkeF0sIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDX1NhbXBsZVRpbWVfMjM5Q3ljbGVzNSk7DQorICBBRENfQ21kKEFEQzEsIEVOQUJMRSk7DQorDQorICBBRENfUmVzZXRDYWxpYnJhdGlvbihBREMxKTsNCisgIHdoaWxlKEFEQ19HZXRSZXNldENhbGlicmF0aW9uU3RhdHVzKEFEQzEpKTsNCisNCisgIEFEQ19TdGFydENhbGlicmF0aW9uKEFEQzEpOw0KKyAgd2hpbGUoQURDX0dldENhbGlicmF0aW9uU3RhdHVzKEFEQzEpKTsNCisgIEFEQ19Tb2Z0d2FyZVN0YXJ0Q29udkNtZChBREMxLCBFTkFCTEUpOw0KKyAgcF9hZGNfdGltZXJfdGljayA9IGFkY190aW1lcl90aWNrOw0KK30NCisNCitzdGF0aWMgdm9pZCBhZGNfZG1hX2luaXQodm9pZCkNCit7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGFkY19udmljX2luaXQodm9pZCkNCit7DQorDQorfQ0KKw0KK3N0YXRpYyB2b2lkIGRhY19pbml0KHZvaWQpDQorew0KKyAgR1BJT19Jbml0VHlwZURlZiBHUElPX0luaXRTdHJ1Y3R1cmU7DQorDQorICBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKFJDQ19BUEIyUGVyaXBoX0dQSU9BLCBFTkFCTEUpOw0KKw0KKyAgREFDX0RlSW5pdCgpOw0KKw0KKyAgR1BJT19Jbml0U3RydWN0dXJlLkdQSU9fTW9kZSA9IEdQSU9fTW9kZV9BSU47DQorDQorICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19QaW4gPSBHUElPX1Bpbl81Ow0KKyAgR1BJT19Jbml0KEdQSU9BLCAmR1BJT19Jbml0U3RydWN0dXJlKTsNCisNCisNCisgIFJDQ19BUEIxUGVyaXBoQ2xvY2tDbWQoUkNDX0FQQjFQZXJpcGhfREFDLCBFTkFCTEUpOw0KKw0KKyAgREFDLT5DUiB8PSAweDAwMDEwMDAwOw0KKyAgREFDX1NldENoYW5uZWwyRGF0YShEQUNfQWxpZ25fMTJiX1IsIGRhY19wYXJhLnZhbFswXSk7DQorfQ0KKw0KKy8qKg0KKyoq0KPXvLC0vPwNCisqKi8NCit2b2lkIGNhbGlicmF0ZV9rZXkodWludDggY2FjaGVfZW5hYmxlKQ0KK3sNCisgIGNvbnN0IHVpbnQ4IGxlbiA9IHNpemVvZihkYWNfcGFyYSkgKzI7DQorICB1aW50OCBidWZbbGVuXTsNCisgIGlmKGNhY2hlX2VuYWJsZSkNCisgIHsNCisgICAgdWludDggY3JjWzJdOw0KKyAgICBzcF9mbGFzaF9yZWFkKEFERFJfS0VZX1BBUkEsYnVmLGxlbik7DQorICAgIHNwX3Byb3RvY29sX2NyYyhidWYgLGxlbiAtMixjcmMpOw0KKyAgICBpZihtZW1jbXAoYnVmICtsZW4gLTIsY3JjLDIpID09IDApDQorICAgIHsNCisgICAgICBtZW1jcHkoKHVpbnQ4KikmZGFjX3BhcmEsYnVmLHNpemVvZihkYWNfcGFyYSkpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgZGFjX3BhcmFfYXV0b19zZXQoKTsNCisgIG1lbWNweShidWYsKHVpbnQ4KikmZGFjX3BhcmEsc2l6ZW9mKGRhY19wYXJhKSk7DQorICBzcF9wcm90b2NvbF9jcmMoYnVmLGxlbiAtMixidWYgK2xlbiAtMik7DQorICBzcF9mbGFzaF9lcmFzZShBRERSX0tFWV9QQVJBKTsNCisgIHNwX2ZsYXNoX3dyaXRlKEFERFJfS0VZX1BBUkEsYnVmLGxlbik7DQorfQ0KKw0KK3ZvaWQgYWRjX2luaXQodm9pZCkNCit7DQorICB0aW1lcjRfaW5pdCgpOw0KKyAgZGFjX2luaXQoKTsNCisgIGFkY19ncGlvX2luaXQoKTsNCisgIGFkY19udmljX2luaXQoKTsNCisgIGFkY19kbWFfaW5pdCgpOw0KKyAgYWRjX2NoYW5uZWxzX2luaXQoKTsNCisgIGNhbGlicmF0ZV9rZXkoMSk7DQorfQ0KKw0KK3VpbnQxNl90IGFkY19nZXRfdmFsKHVpbnQ4X3QgY2gpDQorew0KKyAgaWYoY2g8QURDX01BWF9DSF9OVU0pDQorICB7DQorICAgIHJldHVybiBhZGNfYnVmZltjaF07DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KK30NCisNCit2b2lkIGFkY190aW1lcl90aWNrKHZvaWQpDQorew0KKyAgYWRjX3RpbWVyICsrOw0KKyAgaWYoYWRjX3RpbWVyPj04KQ0KKyAgew0KKyAgICBhZGNfdGltZXIgPSAwOw0KKyAgfQ0KKyAgaWYoYWRjX3RpbWVyPT0wKQ0KKyAgew0KKyAgICBhZGNfYnVmZltjaF9pZHhdID0gQURDX0dldENvbnZlcnNpb25WYWx1ZShBREMxKTsNCisgICAgY2hfaWR4ICsrOw0KKyAgICBpZihjaF9pZHggPj0gQURDX01BWF9DSF9OVU0pDQorICAgIHsNCisgICAgICBrZXlwYWRfc2NhbigpOw0KKyAgICAgIGNoX2lkeCA9IDA7DQorICAgICAgYWRjX3BkZF9wcm9jZXNzKCk7ICAgLy+87LLpyse38bX0tecNCisgICAgfQ0KKw0KKyAgICBpZihjaF9pZHggPCAxMikNCisgICAgew0KKyAgICAgIERBQ19TZXRDaGFubmVsMkRhdGEoREFDX0FsaWduXzEyYl9SLCBkYWNfcGFyYS52YWxbY2hfaWR4XSk7DQorICAgIH0NCisgIH0NCisgIGVsc2UgaWYoYWRjX3RpbWVyID09IDcpDQorICB7DQorICAgIEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZyhBREMxLCBhZGNfY2hfdGJsW2NoX2lkeF0sIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1KTsNCisgICAgQURDX1NvZnR3YXJlU3RhcnRDb252Q21kKEFEQzEsIEVOQUJMRSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgYWRjX3RpbWVyX3Rhc2sodm9pZCkNCit7DQorICBpZihwX2FkY190aW1lcl90aWNrKQ0KKyAgew0KKyAgICAvL9LRvq2z9cq8u6/N6rPJDQorICAgIHBfYWRjX3RpbWVyX3RpY2soKTsNCisgIH0NCit9DQorDQordnU4IFBWREZpbHRlckNudCA9IDA7DQorc3RhdGljIHZvaWQgYWRjX3BkZF9wcm9jZXNzKHZvaWQpDQorew0KKyAgc3RhdGljIHUxNiBQcmVBRENWYWx1ZSA9IFBERFRocmVzaG9kX0FEQ1ZhbDsNCisNCisgIGFkY192YWxfdmRkID0gKGFkY192YWxfdmRkKjgwdWwgKyBhZGNfZ2V0X3ZhbCgxMikqMjApLzEwMDsNCisgIGlmKGFkY192YWxfdmRkIDwgUHJlQURDVmFsdWUpDQorICB7DQorICAgIGlmKFBWREZpbHRlckNudCA8IDIwKQ0KKyAgICB7DQorICAgICAgUFZERmlsdGVyQ250ICsrOw0KKyAgICB9DQorICAgIFByZUFEQ1ZhbHVlID1hZGNfdmFsX3ZkZDsNCisgIH0NCisgIGVsc2UgaWYoYWRjX3ZhbF92ZGQgPiBQcmVBRENWYWx1ZSkNCisgIHsNCisgICAgUFZERmlsdGVyQ250ID0gMDsNCisgICAgUHJlQURDVmFsdWUgPSBQRERUaHJlc2hvZF9BRENWYWw7DQorICB9DQorICAvKiBhZGNfdmFsX3ZkZCA9IFByZUFEQ1ZhbHVlIMu1w/dhZGNfdmFsX3ZkZA0KKyAgICAgzrTN6rPJuPzQwqOsu/K159G5zrS8zND4tfjC5KOssrvX9sjOus60psDtDQorICBlbHNlDQorICB7DQorDQorICB9DQorICAqLw0KKw0KKyAgaWYoKFBWREZpbHRlckNudCA+IDEwKSkgLy8gJiYgKGFkY192YWxfdmRkIDwgUmVzZXRfQURDVmFsKSkNCisgIHsNCisgICAgLy+52LHVtsG/qA0KKyAgICAvKgkJTTFfSGFyZFB3ckR3bigpOw0KKw0KKyAgICAJCS8vtee2r8fyt6e52LentKbA7Q0KKyAgICAJCUdQSU9fUmVzZXRCaXRzKEdQSU9DLCBHUElPX1Bpbl85KTsNCisgICAgCQlHUElPX1NldEJpdHMoR1BJT0EsIEdQSU9fUGluXzkpOw0KKw0KKyAgICAJCS8vuLTOuw0KKyAgICAJCUlXREdfV3JpdGVBY2Nlc3NDbWQoSVdER19Xcml0ZUFjY2Vzc19FbmFibGUpIDsNCisgICAgCQlJV0RHX1NldFByZXNjYWxlcihJV0RHX1ByZXNjYWxlcl8xMjgpIDsNCisgICAgCQlJV0RHX1NldFJlbG9hZCgxNTAwKSA7ICAgICAgICAgICAgICAgLy/J6NbDv7TDxbm3uLTOu8qxvOQ2U6Ostee7+renxNzN6sirudix1Q0KKyAgICAJCUlXREdfUmVsb2FkQ291bnRlcigpOw0KKyAgICAJCUlXREdfRW5hYmxlKCk7DQorICAgIAkJd2hpbGUoMSk7ICAqLw0KKyAgfQ0KK30NCisNCit2b2lkIGRhY19wYXJhX2F1dG9fc2V0KHZvaWQpDQorew0KKyAgdWludDhfdCBpOw0KKyAgdWludDE2X3QgZGFjX3ZhbCA9IDQwOTU7DQorICB1aW50OF90ICBhZGpfZmxhZ3NbMTJdOw0KKw0KKyAgcF9hZGNfdGltZXJfdGljayA9IDA7DQorICBkZWxheV9tcygxMCk7DQorICBtZW1zZXQoYWRqX2ZsYWdzLCAxLCBzaXplb2YoYWRqX2ZsYWdzKSk7DQorICB3aGlsZSgoZGFjX3ZhbCozMzAwdWwqNDYvNDA5NTApID4gMjAwMCkgICAgIC8v1Mu3xcrks/ayu7XN09oyVg0KKyAgew0KKyAgICBmb3IoaT0wOyBpPDEyOyBpKyspDQorICAgIHsNCisgICAgICBpZihhZGpfZmxhZ3NbaV0pDQorICAgICAgew0KKyAgICAgICAgZGFjX3BhcmEudmFsW2ldID0gZGFjX3ZhbDsNCisgICAgICB9DQorICAgICAgREFDX1NldENoYW5uZWwyRGF0YShEQUNfQWxpZ25fMTJiX1IsIGRhY192YWwpOw0KKyAgICAgIGRlbGF5X21zKDYpOw0KKyAgICAgIEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZyhBREMxLCBhZGNfY2hfdGJsW2ldLCAxLCBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1KTsNCisgICAgICBBRENfU29mdHdhcmVTdGFydENvbnZDbWQoQURDMSwgRU5BQkxFKTsNCisgICAgICBkZWxheV9tcygyKTsNCisgICAgICBpZihBRENfR2V0Q29udmVyc2lvblZhbHVlKEFEQzEpIDwgMzAwdWwpDQorICAgICAgew0KKyAgICAgICAgYWRqX2ZsYWdzW2ldID0gMDsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGFkal9mbGFnc1tpXSA9IDE7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmKG1lbV90ZXN0KGFkal9mbGFncywgMCwgc2l6ZW9mKGFkal9mbGFncykpID09IDApDQorICAgIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkYWNfdmFsIC09IDEyNDsNCisgIH0NCisgIHBfYWRjX3RpbWVyX3RpY2sgPSBhZGNfdGltZXJfdGljazsNCit9DQorDQorc3RhdGljIHZvaWQgdGltZXI0X2luaXQodm9pZCkNCit7DQorICB1aW50MTZfdCBQcmVzY2FsZXJWYWx1ZSA9IDA7DQorICBUSU1fVGltZUJhc2VJbml0VHlwZURlZiAgVElNX1RpbWVCYXNlU3RydWN0dXJlOw0KKyAgVElNX09DSW5pdFR5cGVEZWYgIFRJTV9PQ0luaXRTdHJ1Y3R1cmU7DQorDQorICBHUElPX0luaXRUeXBlRGVmIEdQSU9fSW5pdFN0cnVjdHVyZTsNCisNCisgIC8qIFRJTTQgY2xvY2sgZW5hYmxlICovDQorICBSQ0NfQVBCMVBlcmlwaENsb2NrQ21kKFJDQ19BUEIxUGVyaXBoX1RJTTQsIEVOQUJMRSk7DQorDQorICAvKiBHUElPQSBhbmQgR1BJT0IgY2xvY2sgZW5hYmxlICovDQorICBSQ0NfQVBCMlBlcmlwaENsb2NrQ21kKFJDQ19BUEIyUGVyaXBoX0dQSU9CfFJDQ19BUEIyUGVyaXBoX0FGSU8sIEVOQUJMRSk7DQorDQorICAvKkdQSU9CIENvbmZpZ3VyYXRpb246IFRJTTQgY2hhbm5lbDMgYW5kIDQgKi8NCisgIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX1BpbiA9ICBHUElPX1Bpbl84IHwgR1BJT19QaW5fOTsNCisgIEdQSU9fSW5pdFN0cnVjdHVyZS5HUElPX01vZGUgPSBHUElPX01vZGVfQUZfUFA7DQorICBHUElPX0luaXRTdHJ1Y3R1cmUuR1BJT19TcGVlZCA9IEdQSU9fU3BlZWRfNTBNSHo7DQorICBHUElPX0luaXQoR1BJT0IsICZHUElPX0luaXRTdHJ1Y3R1cmUpOw0KKw0KKyAgUHJlc2NhbGVyVmFsdWUgPSAodWludDE2X3QpKFN5c3RlbUNvcmVDbG9jayAvIDcyMDAwMDAwKSAtIDE7DQorICAvKiBUaW1lIGJhc2UgY29uZmlndXJhdGlvbiAqLw0KKyAgVElNX1RpbWVCYXNlU3RydWN0dXJlLlRJTV9QZXJpb2QgPSA3MTk7DQorICBUSU1fVGltZUJhc2VTdHJ1Y3R1cmUuVElNX1ByZXNjYWxlciA9IFByZXNjYWxlclZhbHVlOw0KKyAgVElNX1RpbWVCYXNlU3RydWN0dXJlLlRJTV9DbG9ja0RpdmlzaW9uID0gMDsNCisgIFRJTV9UaW1lQmFzZVN0cnVjdHVyZS5USU1fQ291bnRlck1vZGUgPSBUSU1fQ291bnRlck1vZGVfVXA7DQorDQorICBUSU1fVGltZUJhc2VJbml0KFRJTTQsICZUSU1fVGltZUJhc2VTdHJ1Y3R1cmUpOw0KKw0KKyAgLyogUFdNMSBNb2RlIGNvbmZpZ3VyYXRpb246IENoYW5uZWwxICovDQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9PQ01vZGUgPSBUSU1fT0NNb2RlX1BXTTE7DQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9PdXRwdXRTdGF0ZSA9IFRJTV9PdXRwdXRTdGF0ZV9FbmFibGU7DQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9QdWxzZSA9IDM1OTsNCisgIFRJTV9PQ0luaXRTdHJ1Y3R1cmUuVElNX09DUG9sYXJpdHkgPSBUSU1fT0NQb2xhcml0eV9IaWdoOw0KKyAgVElNX09DM0luaXQoVElNNCwgJlRJTV9PQ0luaXRTdHJ1Y3R1cmUpOw0KKyAgVElNX09DM1ByZWxvYWRDb25maWcoVElNNCwgVElNX09DUHJlbG9hZF9FbmFibGUpOw0KKw0KKyAgLyogUFdNMSBNb2RlIGNvbmZpZ3VyYXRpb246IENoYW5uZWwyICovDQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9PQ01vZGUgPSBUSU1fT0NNb2RlX1BXTTE7DQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9PdXRwdXRTdGF0ZSA9IFRJTV9PdXRwdXRTdGF0ZV9FbmFibGU7DQorICBUSU1fT0NJbml0U3RydWN0dXJlLlRJTV9QdWxzZSA9IDM1OTsNCisgIFRJTV9PQ0luaXRTdHJ1Y3R1cmUuVElNX09DUG9sYXJpdHkgPSBUSU1fT0NQb2xhcml0eV9Mb3c7DQorICBUSU1fT0M0SW5pdChUSU00LCAmVElNX09DSW5pdFN0cnVjdHVyZSk7DQorICBUSU1fT0M0UHJlbG9hZENvbmZpZyhUSU00LCBUSU1fT0NQcmVsb2FkX0VuYWJsZSk7DQorDQorICBUSU1fQVJSUHJlbG9hZENvbmZpZyhUSU00LCBFTkFCTEUpOw0KKw0KKyAgLyogVElNNCBlbmFibGUgY291bnRlciAqLw0KKyAgVElNX0NtZChUSU00LCBFTkFCTEUpOw0KK30NCmRpZmYgLS1naXQgYS9zeXNfaHcvZHJ2X2FkYy5oIGIvc3lzX2h3L2Rydl9hZGMuaAppbmRleCA5ZGU0YzVkLi5lZGJlYzliIDEwMDY0NAotLS0gYS9zeXNfaHcvZHJ2X2FkYy5oCisrKyBiL3N5c19ody9kcnZfYWRjLmgKQEAgLTEsMjkgKzEsMjQgQEAKLSNpZm5kZWYgX19hZGNfaF9fCi0jZGVmaW5lIF9fYWRjX2hfXwotCi0jaW5jbHVkZSAic3RtMzJmMTB4LmgiCi0KLSNkZWZpbmUgQURDX01BWF9DSF9OVU0gICAgICgxNXUpCi0KLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0Jdm9sYXRpbGUgdWludDE2X3QgdmFsWzEyXTsKLQl1aW50MTZfdCBjcmM7Ci19IGRhY19wYXJhX3Q7Ci0KLSNwcmFnbWEgcGFjayhwb3ApCi0KLWV4dGVybiBkYWNfcGFyYV90IGRhY19wYXJhOwotCi1leHRlcm4gdm9sYXRpbGUgdWludDE2X3QgYWRjX2J1ZmZbQURDX01BWF9DSF9OVU1dOwotCi1leHRlcm4gdm9pZCBhZGNfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGFkY190aW1lcl90YXNrKHZvaWQpOwotZXh0ZXJuIHVpbnQxNl90IGFkY19nZXRfdmFsKHVpbnQ4X3QgY2gpOwotZXh0ZXJuIHZvaWQgZGFjX3BhcmFfYXV0b19zZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBjYWxpYnJhdGVfa2V5KHVpbnQ4X3QgZm9yY2UpOwotCi0jZW5kaWYKKyNpZm5kZWYgX19hZGNfaF9fDQorI2RlZmluZSBfX2FkY19oX18NCisNCisjaW5jbHVkZSAic3RtMzJmMTB4LmgiDQorDQorI2RlZmluZSBBRENfTUFYX0NIX05VTSAgICAgKDE0dSkNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIHZvbGF0aWxlIHVpbnQxNl90IHZhbFsxMl07DQorICB1aW50MTZfdCBjcmM7DQorfSBkYWNfcGFyYV90Ow0KKw0KK2V4dGVybiBkYWNfcGFyYV90IGRhY19wYXJhOw0KKw0KK2V4dGVybiB2b2xhdGlsZSB1aW50MTZfdCBhZGNfYnVmZltBRENfTUFYX0NIX05VTV07DQorDQorZXh0ZXJuIHZvaWQgYWRjX2luaXQodm9pZCk7DQorZXh0ZXJuIHZvaWQgYWRjX3RpbWVyX3Rhc2sodm9pZCk7DQorZXh0ZXJuIHVpbnQxNl90IGFkY19nZXRfdmFsKHVpbnQ4X3QgY2gpOw0KK2V4dGVybiB2b2lkIGRhY19wYXJhX2F1dG9fc2V0KHZvaWQpOw0KK2V4dGVybiB2b2lkIGNhbGlicmF0ZV9rZXkodWludDhfdCBmb3JjZSk7DQorDQorI2VuZGlmDQo=