ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9tYWluLmMgYi9zdXB3aXNkb20vbWFpbi5jCmluZGV4IGM1ZmRjOTcuLjdiODllZGIgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9tYWluLmMKKysrIGIvc3Vwd2lzZG9tL21haW4uYwpAQCAtMzQsMTEgKzM0LDcgQEAKICAgICBzcF9jb21tdW5pY2F0ZSgmUE9TKTsKICAgICBpZihQT1MucGF5bW9kZSA9PSBQQVlNT0RFX1FSQ09ERSkKICAgICB7Ci0gICAgICBpZih0aWNrIC0gbGFzdHRpY2sgPj0gREVMQVlfVElNRTEwMG1zKQotICAgICAgewotICAgICAgICBsYXN0dGljayA9IHRpY2s7Ci0gICAgICAgIHNwX3FyY29kZV9oYW5kbGUoJlBPUywgJmNhcmRXb3JrU3RhdGUpOwotICAgICAgfQorICAgICAgc3BfcXJjb2RlX2hhbmRsZSgmUE9TLCAmY2FyZFdvcmtTdGF0ZSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfY2FyZC5jIGIvc3Vwd2lzZG9tL3NwX2NhcmQuYwppbmRleCA4MWJhYmNiLi40ZmNiZDY1IDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfY2FyZC5jCisrKyBiL3N1cHdpc2RvbS9zcF9jYXJkLmMKQEAgLTQxLDcgKzQxLDYgQEAKIAogdWludDggc3BfY2FyZF9yZXF1ZXN0KHNwX2NhcmRfdCogY2FyZHBjZCkKIHsKLQogICB1aW50OCBzYWs7CiAgIHVpbnQ4IHNucls4XTsKIApAQCAtODAsNyArNzksNyBAQAogCiBzdGF0aWMgdWludDE2IHNwX3NlbGVjdF9hZGYxNSgpCiB7Ci0gIHVpbnQxNiByZXQgPSAwOworICB1aW50MTYgcmV0OwogICB1aW50OCogdGVtcF9idWZmID0gTlVMTDsKICAgdWludDggYnVmZl9sZW4gPSAwOwogICB1aW50OCBjbWRfYnVmZltdID0geyJceDAwXHhBNFx4MDBceDAwXHgwMlx4M0ZceDAwIn07CkBAIC05NCw3ICs5Myw3IEBACiAKIHN0YXRpYyB1aW50MTYgc3BfcmVhZF9iaW5hcnlfZmlsZSh1aW50OCBvdXRbXSkKIHsKLSAgdWludDE2IHJldCA9IDA7CisgIHVpbnQxNiByZXQ7CiAgIHVpbnQ4KiB0ZW1wX2J1ZmYgPSBOVUxMOwogICB1aW50OCBidWZmX2xlbiA9IDA7CiAgIHVpbnQ4IGNtZF9idWZmWzVdID0geyJceDAwXHhCMFx4OTVceDAwXHg0NyJ9OwpAQCAtMTA4LDkgKzEwNyw5IEBACiB9CiBzdGF0aWMgdWludDE2IHNwX2NwdV9yZWFkKHNwX2NhcmRfdCogY2FyZCkKIHsKLSAgdWludDE2IHJldCA9IDA7CisgIHVpbnQxNiByZXQ7CiAgIHVpbnQ4IGJ1ZmZbNzJdOwotICB1aW50OCBvZmZzZXQgPSAwOworICB1aW50OCBvZmZzZXQ7CiAgIE1FTUNMRUFSKGJ1ZmYsIHNpemVvZihidWZmKSk7CiAgIHJldCA9IHNwX3NlbGVjdF9hZGYxNSgpOwogICBpZihyZXQpCkBAIC0xMjMsNiArMTIyLDcgQEAKICAgewogICAgIHJldHVybiByZXQ7CiAgIH0KKyAgb2Zmc2V0ID0gMDsKICAgTUVNQ0xFQVIoY2FyZC0+Y2l0aXplbl9jYXJkbm8sIHNpemVvZihjYXJkLT5jaXRpemVuX2NhcmRubykpOwogICBvZmZzZXQgKz0gMzE7CiAgIE1FTUNQWShjYXJkLT5jaXRpemVuX2NhcmRubywgYnVmZitvZmZzZXQsIHNpemVvZihjYXJkLT5jaXRpemVuX2NhcmRubykpOwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmMgYi9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuYwppbmRleCBjODY2OTBhLi4yOGRmZTgzIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuYworKysgYi9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuYwpAQCAtOCw0MSArOCw2OSBAQAogI2luY2x1ZGUgInNwX3VwZ3JhZGUuaCIKICNpbmNsdWRlICIuLi9zeXNfaHcvZHJ2X3VzYXJ0LmgiCiAKK3N0YXRpYyB1aW50OCByeEJ1Zls1MTJdID0gezB9Oworc3RhdGljIHVpbnQxNiByeEJ1ZkxlbiA9IDA7CisKIHN0YXRpYyB2b2lkIHNwX3VzYXJ0X3NlbmQoc3BfcG9zX3QqIHBvcywgc3BfcHJvdG9jb2xfcmVxdWVzdF90KiByZXEpCiB7Ci0gIHVpbnQ4IHNlbmRCdWZmWzI2NF07Ci0gIE1FTUNMRUFSKHNlbmRCdWZmLCBzaXplb2Yoc2VuZEJ1ZmYpKTsKKyAgdWludDggYnVmW3NpemVvZihzcF9wcm90b2NvbF9yZXF1ZXN0X3QpXTsKKyAgTUVNQ0xFQVIoYnVmLCBzaXplb2YoYnVmKSk7CisgIHNwX3Byb3RvY29sX2NyYygodWludDgqKXJlcSArMiwgcmVxLT5kYXRhbGVuLCAodWludDgqKXJlcSArMiArcmVxLT5kYXRhbGVuKTsKKyAgcmVxLT5kYXRhbGVuICs9IDI7CisgIE1FTUNQWShidWYsIHJlcSwgcmVxLT5kYXRhbGVuKzIpOworICB1c2FydF9zZW5kKGJ1ZiwgcmVxLT5kYXRhbGVuKzIpOwogCiAgIHBvcy0+bGFzdF9jb21tX3N0YXR1cy5jb21tYW5kID0gcmVxLT5leGNtZDsKICAgcG9zLT5sYXN0X2NvbW1fc3RhdHVzLnNlbmR0aW1lID0gc3BfZ2V0X3RpY2tlcigpOwotCi0gIHNwX3Byb3RvY29sX2NyYygodWludDgqKXJlcSArMiwgcmVxLT5kYXRhbGVuLCAodWludDgqKXJlcSArMiArcmVxLT5kYXRhbGVuKTsKLSAgcmVxLT5kYXRhbGVuICs9IDI7Ci0gIE1FTUNQWShzZW5kQnVmZiwgcmVxLCByZXEtPmRhdGFsZW4rMik7Ci0gIHVzYXJ0X3NlbmQoc2VuZEJ1ZmYsIHJlcS0+ZGF0YWxlbisyKTsKKyAgTUVNQ0xFQVIocnhCdWYsc2l6ZW9mIHJ4QnVmKTsKKyAgcnhCdWZMZW4gPSAwOwogfQogCi1zdGF0aWMgdWludDggc3BfdXNhcnRfcmVjdihzcF9wb3NfdCogcG9zLCBzcF9wcm90b2NvbF9yZXNwb25zZV90KiByZXNwLCBpbnQzMiB0aW1lb3V0X21zKQorc3RhdGljIHVpbnQ4IHNwX3VzYXJ0X3JlY3Yoc3BfcG9zX3QqIHBvcywgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZW91dF9tcykKIHsKLSAgdWludDMyIHRpY2sgPSAwOworICB1aW50MzIgdGljazsKKyAgdWludDE2IGxlbjsKKyAgaW50MTYgZGF0YWxlbjsKKyAgdWludDggY3JjWzJdOworICB1aW50OCB0ZW1wW3NpemVvZihzcF9wcm90b2NvbF9yZXNwb25zZV90KV07CiAgIHRpY2sgPSBzcF9nZXRfdGlja2VyKCk7CisgIE1FTUNMRUFSKHRlbXAsc2l6ZW9mIHRlbXApOwogICB3aGlsZSgxKQogICB7Ci0gICAgTUVNQ0xFQVIocmVzcCwgc2l6ZW9mKHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QpKTsKLSAgICB1c2FydF9yZWFkKCh1OCopcmVzcCwgc2l6ZW9mKHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QpKTsKLSAgICBpZihwb3MtPmxhc3RfY29tbV9zdGF0dXMuY29tbWFuZCA9PSByZXNwLT5leGNtZCkKKworICAgIGxlbiA9IHVzYXJ0X3JlYWQoKHU4Kil0ZW1wLHNpemVvZiB0ZW1wKTsKKyAgICBpZihsZW4gPiAwKQogICAgIHsKLSAgICAgIE1FTUNMRUFSKCYocG9zLT5sYXN0X2NvbW1fc3RhdHVzKSwgc2l6ZW9mKHNwX2NvbW1fc3RhdHVzX3QpKTsKLSAgICAgIHJldHVybiByZXNwLT5yZXRjb2RlOworICAgICAgTUVNQ1BZKHJ4QnVmICtyeEJ1ZkxlbiwgdGVtcCxsZW4pOworICAgICAgcnhCdWZMZW4gKz0gbGVuOworICAgICAgZGF0YWxlbiA9IGdldF8yYnl0ZV9pbnRfbGUocnhCdWYpOworICAgICAgaWYoKGRhdGFsZW4rMikgPD0gcnhCdWZMZW4pCisgICAgICB7CisgICAgICAgIE1FTUNMRUFSKHJlc3AsIHNpemVvZihzcF9wcm90b2NvbF9yZXNwb25zZV90KSk7CisgICAgICAgIE1FTUNQWSgodWludDgqKXJlc3AscnhCdWYscnhCdWZMZW4pOworICAgICAgICBNRU1DTEVBUihyeEJ1ZixzaXplb2YgcnhCdWYpOworICAgICAgICByeEJ1ZkxlbiA9IDA7CisgICAgICAgIGlmKHBvcy0+bGFzdF9jb21tX3N0YXR1cy5jb21tYW5kID09IHJlc3AtPmV4Y21kKQorICAgICAgICB7CisgICAgICAgICAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopcmVzcCArMixkYXRhbGVuIC0yLCBjcmMpOworICAgICAgICAgIGlmKE1FTUNNUCgodWludDgqKXJlc3AgK2RhdGFsZW4sY3JjLDIpID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgTUVNQ0xFQVIoJihwb3MtPmxhc3RfY29tbV9zdGF0dXMpLCBzaXplb2Yoc3BfY29tbV9zdGF0dXNfdCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3AtPnJldGNvZGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAgICAgfQogICAgIGlmKChzcF9nZXRfdGlja2VyKCkgLSB0aWNrKSA+PSB0aW1lb3V0X21zKQogICAgIHsKLSAgICAgIHJldHVybiAxOworICAgICAgcmV0dXJuIFJDX0NPTU1fVElNRU9VVDsKICAgICB9CiAgIH0KIH0KKwogdWludDggc3BfY29tbV9jYWxsKHNwX3Bvc190KiBwb3MsIHNwX3Byb3RvY29sX3JlcXVlc3RfdCogcmVxLAotICAgICAgICAgICAgICAgICAgIHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QqIHJlc3AsIGludDMyIHRpbWVvdXRfbXMpCisgICAgICAgICAgICAgICAgICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgdWludDMyIHRpbWVvdXRfbXMpCiB7CiAgIHNwX3VzYXJ0X3NlbmQocG9zLCByZXEpOwogICByZXR1cm4gc3BfdXNhcnRfcmVjdihwb3MsIHJlc3AsIHRpbWVvdXRfbXMpOwpAQCAtNjIsMTMgKzkwLDEyIEBACiB7CiAgIHVpbnQ4IHNpemU7CiAgIHVpbnQxNiByZXQ7Ci0gIGludDMyIHRpbWVvdXRfbXMgPSBDT01NX1dBSVRfVElNRTsKICAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOwogICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOwogCi0gIGRpc3BfaGludF9pbmZvKHBvcywi1f3U2sntt93Iz9ak1tAiLERFTEFZX1RJTUUycyk7Ci0gIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgdGltZW91dF9tcyk7CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIsntt93It8jP1tAiLCLH68nUtcguLi4iLDApOworICByZXQgPSBzcF91c2FydF9yZWN2KHBvcywgJnJlc3AsIENPTU1fV0FJVF9USU1FKTsKICAgaWYocmV0KQogICB7CiAgICAgcmV0ID0gUkNfQ0FSRF9BVVRIRU5USUNBVElPTjsKQEAgLTEwOSw3ICsxMzYsNyBAQAogICAgICAgY2FyZC0+ZmVlcGFyYS5mZWVfc3RhcnQgPSBmaWVsZC52YWwuaW50dmFsOwogICAgIH0KICAgfQotICBkaXNwX2hpbnRfaW5mbyhwb3MsIsntt93Iz9aks8m5piIsREVMQVlfVElNRTFzKTsKKyAgLy9kaXNwX2hpbnRfaW5mbyhwb3MsIsntt93Iz9aks8m5piIsREVMQVlfVElNRTFzKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2Myw2ICsxOTAsMzAgQEAKICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgc3BfbG9naW4oc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDE2IHJldDsKKyAgY2hhciBtc2dbMjBdOworICBzcF9wcm90b2NvbF9yZXNwb25zZV90IHJlc3A7CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsItX91Nq1x8K8Iiwix+vJ1LXILi4uIiwwKTsKKyAgcmV0ID0gc3BfYXN5bmNfZXF1aXBtZW50X2xvZ2luKHBvcyk7CisgIGlmKHJldCkKKyAgeworICAgIHNwcmludGYobXNnLCK07c7zwus9JWQiLHJldCk7CisgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywitcfCvMqnsNwiLG1zZyxERUxBWV9USU1FM3MpOworICAgIHJldHVybjsKKyAgfQorICBNRU1DTEVBUigmcmVzcCxzaXplb2YgcmVzcCk7CisgIHNwX3VzYXJ0X3JlY3YocG9zLCZyZXNwLENPTU1fV0FJVF9USU1FKTsKKyAgcmV0ID0gc3BfY29uZmlybV9sb2dpbigmcmVzcCxwb3MpOworICBpZihyZXQpCisgIHsKKyAgICBkaXNwX3NlcnZlcl9lcnJtc2cocG9zLCK1x8K8yqew3CIscmVzcC5kYXRhLHJlc3AuZGF0YWxlbik7CisgICAgcmV0dXJuOworICB9CisgIGRpc3BfaGludF9pbmZvKHBvcywitcfCvLPJuaYiLERFTEFZX1RJTUUzcyk7Cit9CisKIC8v0MTM+Mi3yM+jrLzssuLN+MLnyse38dX9s6MKIHVpbnQxNiBzcF9hc3luY19oZWFydGJlYXQoc3BfcG9zX3QqIHBvcykKIHsKQEAgLTIwMiwxMiArMjUzLDExIEBACiB7CiAgIHVpbnQ4IHNpemU7CiAgIHVpbnQxNiByZXQ7Ci0gIGludDMyIHRpbWVvdXRfbXMgPSBDT01NX1dBSVRfVElNRTsKICAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOwogICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOwogCi0gIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgdGltZW91dF9tcyk7CisgIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgQ09NTV9XQUlUX1RJTUUpOwogICBpZihyZXQpCiAgIHsKICAgICByZXQgPSBSQ19RUkNPREVfRkFJTFVSRTsKQEAgLTI2MSwxMiArMzExLDExIEBACiB7CiAgIHVpbnQ4IHNpemU7CiAgIHVpbnQxNiByZXQ7Ci0gIGludDMyIHRpbWVvdXRfbXMgPSBDT01NX1dBSVRfVElNRTsKICAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOwogICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOwogCi0gIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgdGltZW91dF9tcyk7CisgIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgQ09NTV9XQUlUX1RJTUUpOwogICBpZihyZXQpCiAgIHsKICAgICByZXQgPSBSQ19RUkNPREVfUVVFUllfRkFJTDsKQEAgLTQwMSw3ICs0NTAsNyBAQAogICB1aW50OCBzaXplOwogICB1aW50OCBjdGltZVs2XTsKICAgdWludDggc3lzdGltZVs3XTsKLSAgdWludDggbG9naW5fZmxhZyA9IDA7CisgIHVpbnQ4IGxvZ2luX2ZsYWc7CiAgIGN3X3VucGFja19jb250ZXh0IHVucGFjazsKICAgdW5wYWNrX2ZpZWxkX3QgZmllbGQ7CiAKQEAgLTQxMCw3ICs0NTksNyBAQAogICAgIHJldHVybiByZXNwLT5yZXRjb2RlOwogICB9CiAgIHBvcy0+aGVhcnRiZWF0LmhlYXJ0X3N0YXR1cyA9IEhFQVJUX1JFQ1Y7Ci0KKyAgbG9naW5fZmxhZyA9IDA7CiAgIHNwX3VucGFja19pbml0KCZ1bnBhY2sscmVzcC0+ZGF0YSxyZXNwLT5kYXRhbGVuKTsKICAgc2l6ZSA9IHNwX3VucGFja19tYXBfc2l6ZSgmdW5wYWNrKTsKICAgd2hpbGUoc2l6ZS0tID4gMCkKQEAgLTUyNCwxMCArNTczLDkgQEAKIHsKICAgdWludDggcmV0ID0gMDsKICAgdWludDggaSA9IDA7Ci0gIGludDMyIHRpbWVvdXRfbXMgPSBDT01NX1dBSVRfVElNRTsKICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOwogCi0gIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgdGltZW91dF9tcyk7CisgIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgMTAwKTsKICAgaWYocmV0KQogICB7CiAgICAgcmV0dXJuIHJldDsKQEAgLTU2Miw4ICs2MTAsOCBAQAogCiB2b2lkIHNwX2NvbW11bmljYXRlKHNwX3Bvc190KiBwb3MpCiB7Ci0gIHVpbnQxNiByZXQgPSAwOwotICB1aW50MzIgdGlja2VyID0gMDsKKyAgdWludDE2IHJldDsKKyAgdWludDMyIHRpY2tlcjsKICAgc3BfdHJhbnNkdGxfdCB0cmFuc2R0bDsKIAogICBpZihwb3MtPmRldmljZW5vID09IDApCkBAIC01NzYsMTQgKzYyNCwxNCBAQAogICAgIGlmKHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPT0gMCB8fCBwb3MtPmRldmxvZ2luLmxvZ2luX2ZsYWcgPT0gMAogICAgICAgICB8fCB0aWNrZXIgLSBwb3MtPmRldmxvZ2luLmxhc3RfbG9naW5fdGlja2VyID4gREVMQVlfVElNRTYwcyozMCkKICAgICB7Ci0gICAgICAgIHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPSB0aWNrZXI7Ci0gICAgICAgIHNwX2FzeW5jX2VxdWlwbWVudF9sb2dpbihwb3MpOworICAgICAgcG9zLT5kZXZsb2dpbi5sYXN0X2xvZ2luX3RpY2tlciA9IHRpY2tlcjsKKyAgICAgIHNwX2FzeW5jX2VxdWlwbWVudF9sb2dpbihwb3MpOwogICAgIH0KICAgICBpZihwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPT0gMAogICAgICAgICB8fCB0aWNrZXIgLSBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPiBERUxBWV9USU1FNjBzKQogICAgIHsKLSAgICAgICAgcG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyID0gdGlja2VyOwotICAgICAgICBzcF9hc3luY19oZWFydGJlYXQocG9zKTsKKyAgICAgIHBvcy0+aGVhcnRiZWF0Lmxhc3RfaGVhcnRiZWF0X3RpY2tlciA9IHRpY2tlcjsKKyAgICAgIHNwX2FzeW5jX2hlYXJ0YmVhdChwb3MpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmggYi9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuaAppbmRleCAzMjU4ZWZmLi44YTZmNTlhIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuaAorKysgYi9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuaApAQCAtMTMyLDEwICsxMzIsMTEgQEAKIHVpbnQxNiBzcF9hc3luY191cGxvYWRfdHJhbnNkdGwoc3BfcG9zX3QqIHBvcywgc3BfdHJhbnNkdGxfdCogZHRsKTsKIHVpbnQxNiBzcF9xcmNvZGVfaW5pdChzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpOwogdWludDE2IHNwX3FyY29kZV9xdWVyeShzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpOwordm9pZCBzcF9sb2dpbihzcF9wb3NfdCogcG9zKTsKIAogLy/NqNG2CiB1aW50OCBzcF9jb21tX2NhbGwoc3BfcG9zX3QqIHBvcywgc3BfcHJvdG9jb2xfcmVxdWVzdF90KiByZXEsCi0gICAgICAgICAgICAgICAgICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgaW50MzIgdGltZW91dF9tcyk7CisgICAgICAgICAgICAgICAgICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgdWludDMyIHRpbWVvdXRfbXMpOwogdm9pZCBzcF9wcm90b2NvbF9yZXFfaW5pdChzcF9wcm90b2NvbF9yZXF1ZXN0X3QqIHJlcSwgdWludDggY29tbWFuZCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NvbmZpZy5oIGIvc3Vwd2lzZG9tL3NwX2NvbmZpZy5oCmluZGV4IDk0OGU4NmEuLjUwMzlhYjYgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9jb25maWcuaAorKysgYi9zdXB3aXNkb20vc3BfY29uZmlnLmgKQEAgLTMyLDcgKzMyLDcgQEAKICNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQogI2VuZGlmCiAKLSNkZWZpbmUgREVWX1RZUEUgIkc0MDEzMDIiCisjZGVmaW5lIERFVl9UWVBFICJHNDAxMjAxIgogI2RlZmluZSBERVZfT0ZGTElORV9ERUZBVUxUX0hPVVIgMTY4CiAjZGVmaW5lIERFVl9CTEtCSVRNQVBfRE9ORSAxOTg0CiAjZGVmaW5lIERFVl9NQVhfREVWSUNFTk8gOTkKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25zdGFudC5oIGIvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKaW5kZXggYTdkZDk1Yi4uZWE3OWQwOSAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKQEAgLTUxLDYgKzUxLDcgQEAKICNkZWZpbmUgUkNfREVWX05PVF9MT0dJTgkJCQk2NQkvL8nosbjOtMeptb0KICNkZWZpbmUgUkNfREVWX0ZBVUxUCQkJCQk2NiAgLy/J6LG40snLxrnK1c8KICNkZWZpbmUgUkNfREVWX05PU0VUX0ZMT1dTRU5TT1JfVU5JVAk2NyAgLy/J6LG4wffBv7zGy+O1pc67zrTJ6NbDCisjZGVmaW5lIFJDX0NPTU1fVElNRU9VVAkJCQkJNjggIC8vzajRtrOsyrEKICNkZWZpbmUgU1RBVFVTX0tFRVBPUEVOCQkJCQkxCS8vs6O/qr+oCiAjZGVmaW5lIFNUQVRVU19DTE9TRUQJCQkJCTAJLy/Ioc/7s6O/qr+oCiAKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMgYi9zdXB3aXNkb20vc3BfY29uc3VtZS5jCmluZGV4IGUxYTljNDYuLjU3OWEzYWYgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuYwpAQCAtNTcsNyArNTcsNyBAQAogCiB2b2lkIHNwX3Rlc3RfY2FyZF9zdGF0ZShzcF9wb3NfdCogcG9zLCBzcF9jYXJkd29ya3N0YXRlX3QqIGNhcmRXb3JrU3RhdGUsIHVpbnQzMiB0aWNrKQogewotICB1aW50OCByZXQgPSAwOworICB1aW50OCByZXQ7CiAgIHNwX2NhcmRfdCBjYXJkcGNkOwogICBzd2l0Y2gocG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlKQogICB7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogc3RhdGljIHVpbnQxNiBzcF9jaGVja19kZXYoY29uc3Qgc3BfcG9zX3QqIHBvcykKIHsKLSAgdWludDE2IHJldCA9IDA7CisgIHVpbnQxNiByZXQ7CiAgIHVpbnQ4IGN0aW1lWzZdOwogICBNRU1DTEVBUihjdGltZSwgc2l6ZW9mKGN0aW1lKSk7CiAgIHNwX2dldF9iY2R0aW1lKGN0aW1lKTsKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiBzdGF0aWMgdWludDE2IGRvX25ldyhzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpCiB7Ci0gIHVpbnQxNiByZXQgPSAwOworICB1aW50MTYgcmV0OwogICBzcF90cmFuc2R0bF90IHJlY29yZDsKICAgTUVNQ0xFQVIoJnJlY29yZCwgc2l6ZW9mKHJlY29yZCkpOwogICBjYXJkLT5jYXJkdHlwZSA9IHBvcy0+Y2FyZFN0YXRlLnRhZ190eXBlOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAKIHN0YXRpYyB1aW50MTYgZG9fd29yayhzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpCiB7Ci0gIHVpbnQxNiByZXQgPSAwOworICB1aW50MTYgcmV0OwogICBzcF92YWx2ZV9vbigpOwogICAvL7zGy+PP+7fRvfC27gogICByZXQgPSBzcF9jYWxjX3BheWFtdF9ieV9mbG93c2Vuc29yKHBvcywgY2FyZCk7CkBAIC00MzgsNyArNDM4LDcgQEAKICAgICB9CiAgICAgaWYocG9zLT5wdXJjaGFzZS5wYWlkX251bSA+IGNhcmQtPndhdGVybGltaXQpCiAgICAgewotICAgICAgZGlzcF9oaW50X2luZm8ocG9zLCLS0bTvtaW0zrP2y67Jz8/eIixERUxBWV9USU1FMnMpOworICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywizaPWubP2y64iLCLS0bTvtaW0zrP2y67Jz8/eIixERUxBWV9USU1FMnMpOwogICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOwogICAgIH0KICAgICBjYXJkV29ya1N0YXRlLT5wYXVzZV90aWNrID0gdGltZXJfZ2V0X3RpY2tlcigpOwpAQCAtNDU0LDcgKzQ1NCw3IEBACiAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQRUQ7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ0FSRFdPUktTVEFUVVNfU1RPUFBFRDoKLSAgICBkaXNwX2hpbnRfaW5mbyhwb3MsICLH67DOv6giLCBERUxBWV9USU1FMnMpOworICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIs2j1rmz9suuIiwgIsfrxMPX37+oIiwgREVMQVlfVElNRTJzKTsKICAgICBicmVhazsKICAgY2FzZSBDQVJEV09SS1NUQVRVU19GRUVDQVJEX1dPUktJTkc6CiAgICAgaWYoTUVNQ01QKHBvcy0+Y2FyZFN0YXRlLnNuciwgY2FyZC0+Y2FyZHBoeWlkLCA0KSAhPSAwKQpAQCAtNjEzLDcgKzYxMyw3IEBACiB9CiAKIC8vtv7OrMLrz/u30bSmwO0KLXVpbnQzMiB0aWNrID0gMDsKK3N0YXRpYyB1aW50MzIgdGljayA9IDA7CiB2b2lkIHNwX3FyY29kZV9oYW5kbGUoc3BfcG9zX3QqIHBvcywgc3BfY2FyZHdvcmtzdGF0ZV90KiBjYXJkV29ya1N0YXRlKQogewogICB1aW50MTYgcmV0ID0gMDsKQEAgLTYyOSw2ICs2MjksNyBAQAogICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX0VSUk9SOwogICAgICAgYnJlYWs7CiAgICAgfQorCWRpc3BfaGludF9pbmZvX3R3byhwb3MsICLH68fztv7OrMLrIiwix+vJ1LXILi4uIiwwKTsKICAgICByZXQgPSBzcF9xcmNvZGVfaW5pdChwb3MsICZDQVJEKTsKICAgICBpZihyZXQpCiAgICAgewpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgICAgfQogICAgIHBvcy0+c3lzY29uZi53b3JrX21vZGUgPSAxOwogICAgIENBUkQucXJjb2RlLnN0YXJ0dGltZSA9IHNwX2dldF90aWNrZXIoKTsKLSAgICBkaXNwX2hpbnRfaW5mbyhwb3MsICLV/dTayfqzybb+zqzC6yIsIERFTEFZX1RJTUUycyk7CisgICAgLy9kaXNwX2hpbnRfaW5mbyhwb3MsICLJ+rPJtv7OrMLrIiwgMCk7CiAgICAgY2FyZFdvcmtTdGF0ZS0+bGFzdF9zdGF0ZSA9IGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGU7CiAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1JFQURZOwogICAgIGJyZWFrOwpAQCAtNjk2LDcgKzY5Nyw3IEBACiAgICAgfQogICAgIGlmKHBvcy0+cHVyY2hhc2UucGFpZF9udW0gPiBDQVJELndhdGVybGltaXQpCiAgICAgewotICAgICAgZGlzcF9oaW50X2luZm8ocG9zLCAi0tG077WltM6z9suuyc/P3iIsIERFTEFZX1RJTUUycyk7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAizaPWubP2y64iLCLS0bTvtaW0zrP2y67Jz8/eIiwgREVMQVlfVElNRTJzKTsKICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKICAgICB9CiAgICAgY2FyZFdvcmtTdGF0ZS0+bGFzdF9zdGF0ZSA9IGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGU7CkBAIC03MDYsNyArNzA3LDcgQEAKICAgICBpZihjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID09IENBUkRXT1JLU1RBVFVTX05PTkUKICAgICAgICAgfHwgY2FyZFdvcmtTdGF0ZS0+bGFzdF9zdGF0ZSA9PSBDQVJEV09SS1NUQVRVU19SRUFEWSkKICAgICB7Ci0gICAgICBkaXNwX2hpbnRfaW5mbyhwb3MsIsihz/vLosLrISIsIERFTEFZX1RJTUUycyk7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLNo9a5s/bLriIsIsihz/vLosLrISIsIERFTEFZX1RJTUUycyk7CiAgICAgICBwb3MtPnBheW1vZGUgPSBQQVlNT0RFX0lOSVQ7CiAgICAgICBwb3MtPnN5c2NvbmYud29ya19tb2RlID0gMDsKICAgICB9CmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfZGF0YS5jIGIvc3Vwd2lzZG9tL3NwX2RhdGEuYwppbmRleCBhNmJhZDQ1Li5mMmZkYWMzIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfZGF0YS5jCisrKyBiL3N1cHdpc2RvbS9zcF9kYXRhLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogICB1aW50OCBjcmNbMl07CiAgIHNwX2NvbmZpZ190IGNvbmZpZzsKICAgTUVNQ0xFQVIoJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOwotICBkaXNwX2hpbnRfaW5mbyhwb3MsIsnosbiyzsr9s/XKvLuvIiwgREVMQVlfVElNRTJzKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiyeixuLLOyv2z9cq8u68iLCAix+vJ1LXILi4uIiwwKTsKICAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopJmNvbmZpZyxzaXplb2Yoc3BfY29uZmlnX3QpLTIsY29uZmlnLmNyYyk7CiAgIHNwX2ZsYXNoX2VyYXNlKEFERFJfQ09ORklHX1BBUkEpOwogICBzcF9mbGFzaF93cml0ZShBRERSX0NPTkZJR19QQVJBLCh1aW50OCopJmNvbmZpZyxzaXplb2Yoc3BfY29uZmlnX3QpKTsKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9kaXNwbGF5LmMgYi9zdXB3aXNkb20vc3BfZGlzcGxheS5jCmluZGV4IDg2MGE0NTEuLmI4MTY3MmEgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9kaXNwbGF5LmMKKysrIGIvc3Vwd2lzZG9tL3NwX2Rpc3BsYXkuYwpAQCAtMTQsNyArMTQsNyBAQAogI2RlZmluZSBHTENEX0JVVFRPTV9ZIDU2CiAjZGVmaW5lIEdMQ0RfTElORV9MRU5HVEggMHgxMAogCi1zdGF0aWMgY2hhciBsaW5lX2J1ZmZbMTddOworc3RhdGljIGNoYXIgbGluZV9idWZmWzMyXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqILqvyv0oTmFtZSkgICAgICA6IHZvaWQgIFNob3dfTW9uZXkodWludDMyIG1vbmV5KQpAQCAtNTksOCArNTksOCBAQAogCiBzdGF0aWMgdm9pZCBzaG93X2JvdHRvbShzcF9wb3NfdCogcG9zKQogewotICBzcHJpbnRmKGxpbmVfYnVmZiwiJTAyZDolMDJ4JTAyeCUwMnglMDJ4Iixwb3MtPmRldmljZW5vLCBwb3MtPmRldnBoeWlkWzBdLAotICAgICAgICAgIHBvcy0+ZGV2cGh5aWRbMV0sIHBvcy0+ZGV2cGh5aWRbMl0sIHBvcy0+ZGV2cGh5aWRbM10pOworICBzcHJpbnRmKGxpbmVfYnVmZiwiJTAyZDolMDJ4JTAyeCUwMnglMDJ4ICAgIHYlcyIscG9zLT5kZXZpY2VubywgcG9zLT5kZXZwaHlpZFswXSwKKyAgICAgICAgICBwb3MtPmRldnBoeWlkWzFdLCBwb3MtPmRldnBoeWlkWzJdLCBwb3MtPmRldnBoeWlkWzNdLFBST19WRVJTSU9OKTsKICAgZ2xjZF9kcmF3X3N0cmluZ194eSgwLCBHTENEX0JVVFRPTV9ZLCBsaW5lX2J1ZmYpOwogfQogCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgaWYoTUVNQ01QKGN0aW1lLGxhc3RfY3RpbWUsNikgIT0gMCkKICAgewogICAgIE1FTUNQWShsYXN0X2N0aW1lLGN0aW1lLDYpOwotICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIkaw5rG+IixQUk9fVkVSU0lPTiwwKTsKKyAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCI+PsuiytDD8b+os/bLriIsIj4+sLTIt8jPvPzJqMLrIiwwKTsKICAgfQogfQogCkBAIC0zMzUsOCArMzM1LDggQEAKICAgdWludDggc3RybGVuOwogICBjaGFyIGVycm1zZ1s2NF07CiAgIHN0cmxlbiA9IGRhdGFbMF07Ci0gIC8vY29tbWFuZCtjYW5pZCtleGNtZCtmbGFnK3JldGNvZGUrbGVuK2NyYwotICBpZigoc3RybGVuICs4KSAhPSBsZW4pCisgIC8vY29tbWFuZCtleGNtZCtmbGFnK3JldGNvZGUrbGVuK2NyYworICBpZigoc3RybGVuICs3KSAhPSBsZW4pCiAgIHsKICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLGhpbnQsIsfrx/OzrMqxIixERUxBWV9USU1FM3MpOwogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9tZW51LmMgYi9zdXB3aXNkb20vc3BfbWVudS5jCmluZGV4IDU3MmY3ODguLmQ5ZDFiMGEgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9tZW51LmMKKysrIGIvc3Vwd2lzZG9tL3NwX21lbnUuYwpAQCAtODAsNiArODAsNyBAQAogICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CiAgIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcykKICAgeworICAgIHNwX2ZlZWRfZG9nKCk7CiAgICAga2V5Y29kZSA9IHNwX2dldF9rZXkoKTsKICAgICBpZihrZXljb2RlICE9IFNQX0tFWV9OT05FKQogICAgIHsKQEAgLTI5Niw2ICsyOTcsNyBAQAogICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CiAgIHdoaWxlKHNwX2dldF90aWNrZXIoKSAtdGlja2VyIDwgREVMQVlfVElNRTYwcykKICAgeworICAgIHNwX2ZlZWRfZG9nKCk7CiAgICAga2NvZGUgPSBzcF9nZXRfa2V5KCk7CiAgICAgaWYoa2NvZGUgIT0gU1BfS0VZX05PTkUpCiAgICAgewpAQCAtMzU0LDQxICszNTYsNiBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHNwX21hbnVhbF9sb2dpbihzcF9wb3NfdCogcG9zKQotewotICB1aW50MTYgcmV0OwotICB1aW50MzIgdGljazsKLSAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOwotICBNRU1DTEVBUigmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKLSAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywi1f3U2rXHwrwiLCLH68nUtcguLi4iLDApOwotICBzcF9hc3luY19lcXVpcG1lbnRfbG9naW4ocG9zKTsKLSAgdGljayA9IHNwX2dldF90aWNrZXIoKTsKLSAgd2hpbGUoc3BfZ2V0X3RpY2tlcigpIC0gdGljayA8IERFTEFZX1RJTUUzcyoyKQotICB7Ci0gICAgTUVNQ0xFQVIoJnJlc3AsIHNpemVvZihyZXNwKSk7Ci0gICAgdXNhcnRfcmVhZCgodTgqKSZyZXNwLCBzaXplb2YocmVzcCkpOwotICAgIGlmKHJlc3AuZXhjbWQgPT0gU1BfQ01EX0xPR0lOKQotICAgIHsKLSAgICAgIHJldCA9IHNwX2NvbmZpcm1fbG9naW4oJnJlc3AsIHBvcyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldCA9IFJDX0RFVl9MT0dJTl9GQUlMOwotICAgIH0KLSAgfQotICBpZihyZXQpCi0gIHsKLSAgICBjaGFyIG1zZ1szMl07Ci0gICAgc3ByaW50Zihtc2csIrTtzvPC6z0lZCIscmV0KTsKLSAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLHqbW9yqew3CIsbXNnLERFTEFZX1RJTUUzcyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgZGlzcF9oaW50X2luZm8ocG9zLCLHqbW9s8m5piIsREVMQVlfVElNRTNzKTsKLSAgfQotfQotCiBzdGF0aWMgdm9pZCBzcF9zZXRfZGV2cGh5aWQoc3BfcG9zX3QqIHBvcykKIHsKICAgdWludDMyIHRpY2tlcjsKQEAgLTQwNyw2ICszNzQsNyBAQAogICBzcF9oZXhfdG9fc3RyKGRldnBoeWlkLDQsc3RyKTsKICAgd2hpbGUoc3BfZ2V0X3RpY2tlcigpIC10aWNrZXIgPCBERUxBWV9USU1FNjBzKQogICB7CisgICAgc3BfZmVlZF9kb2coKTsKICAgICBrY29kZSA9IHNwX2dldF9rZXkoKTsKICAgICBpZihrY29kZSAhPSBTUF9LRVlfTk9ORSkKICAgICB7CkBAIC00ODUsNiArNDUzLDcgQEAKICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOwogICB3aGlsZShzcF9nZXRfdGlja2VyKCkgLXRpY2tlciA8IERFTEFZX1RJTUU2MHMpCiAgIHsKKyAgICBzcF9mZWVkX2RvZygpOwogICAgIGtjb2RlID0gc3BfZ2V0X2tleSgpOwogICAgIGlmKGtjb2RlICE9IFNQX0tFWV9OT05FKQogICAgIHsKQEAgLTYwNSw2ICs1NzQsNyBAQAogICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CiAgIHdoaWxlKHNwX2dldF90aWNrZXIoKSAtdGlja2VyIDwgREVMQVlfVElNRTYwcykKICAgeworICAgIHNwX2ZlZWRfZG9nKCk7CiAgICAgc3BfdmFsdmVfY29udHJvbCgpOwogICAgIGtjb2RlID0gc3BfZ2V0X2tleSgpOwogICAgIGlmKGtjb2RlICE9IFNQX0tFWV9OT05FKQpAQCAtNjMxLDEyICs2MDEsMTEgQEAKIAogc3RhdGljIHZvaWQgdGVzdF9mYWN0b3J5X29wdGlvbnMoc3BfcG9zX3QqIHBvcykKIHsKLSAgdWludDMyIHRpY2tlciA9IDA7CisgIHVpbnQzMiB0aWNrZXI7CiAgIHVpbnQ4IGtleWNvZGU7CiAgIHVpbnQ4IHBhZ2U7CiAgIHVpbnQ4IG1heF9jbnQ7Ci0gIHVpbnQ4IGtleV9wcmVzcyA9IDE7Ci0KKyAgdWludDgga2V5X3ByZXNzOwogICBtZW51X3QgbWVudXNbXSA9CiAgIHsKICAgICB7IjEusLS8/NCj17wiLCBkb19rZXlib2FyZF9jYWxpYnJhdGV9LApAQCAtNjQ4LDggKzYxNyw5IEBACiAgIH07CiAgIG1heF9jbnQgPSAoc2l6ZW9mKG1lbnVzKS9zaXplb2YobWVudV90KSAtMSkvMyArIDE7CiAgIHBhZ2UgPSAwOworICBrZXlfcHJlc3MgPSAxOwogICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7Ci0gIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcyo1KQorICB3aGlsZShzcF9nZXRfdGlja2VyKCktdGlja2VyIDw9IERFTEFZX1RJTUU2MHMpCiAgIHsKICAgICBzcF9mZWVkX2RvZygpOwogICAgIGtleWNvZGUgPSBzcF9nZXRfa2V5KCk7CkBAIC02NzYsNiArNjQ2LDcgQEAKICAgICAgICAgaWYobWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyAhPSBOVUxMKQogICAgICAgICB7CiAgICAgICAgICAgbWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyhwb3MpOworICAgICAgICAgIGtleV9wcmVzcyA9IDE7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFNQX0tFWV9DTEVBUjoKQEAgLTcwMCwyOCArNjcxLDI5IEBACiAKIHZvaWQgc3BfbWVudV9vcHRpb25zKHNwX3Bvc190KiBwb3MpCiB7Ci0gIHVpbnQzMiB0aWNrZXIgPSAwOworICB1aW50MzIgdGlja2VyOwogICB1aW50OCBrZXljb2RlOwogICB1aW50OCBwYWdlOwogICB1aW50OCBtYXhfY250OwotICB1aW50OCBrZXlfcHJlc3MgPSAxOworICB1aW50OCBrZXlfcHJlc3M7CiAKICAgbWVudV90IG1lbnVzW10gPQogICB7CiAgICAgeyIxLrLpv7Syzsr9Iiwgc3Bfc2hvd19zeXNwYXJhfSwKICAgICB7IjIuuaSzp7LiytQiLCB0ZXN0X2ZhY3Rvcnlfb3B0aW9uc30sCiAgICAgeyIzLsno1sPKsbzkIiwgc3Bfc2V0X2RldnRpbWV9LAotICAgIHsiNC7K1ravtcfCvCIsIHNwX21hbnVhbF9sb2dpbn0sCisgICAgeyI0LsrWtq+1x8K8Iiwgc3BfbG9naW59LAogICAgIHsiNS7J6NbDzu/A7WlkIiwgc3Bfc2V0X2RldnBoeWlkfSwKICAgICB7IjYuyejWw7v6usUiLCBzcF9zZXRfZGV2aWNlbm99LAogICAgIHsiNy7H5b/VwffLriIsIGNsZWFyX3RyYW5zZHRsfSwKICAgICB7Ijgu1NrP38n9vLYiLCBtYW51YWxfdXBncmFkZX0sCiAgICAgeyI5LrvWuLSz9rOnIiwgcmVzZXRfZmFjdG9yeX0KICAgfTsKKyAga2V5X3ByZXNzID0gMTsKICAgbWF4X2NudCA9IChzaXplb2YobWVudXMpL3NpemVvZihtZW51X3QpIC0xKS8zICsgMTsKICAgcGFnZSA9IDA7CiAgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKLSAgd2hpbGUoc3BfZ2V0X3RpY2tlcigpLXRpY2tlciA8PSBERUxBWV9USU1FNjBzKjUpCisgIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcykKICAgewogICAgIHNwX2ZlZWRfZG9nKCk7CiAgICAga2V5Y29kZSA9IHNwX2dldF9rZXkoKTsKQEAgLTc0OCw2ICs3MjAsNyBAQAogICAgICAgICBpZihtZW51c1trZXljb2RlLVNQX0tFWV8xXS5mdW5jICE9IE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICBtZW51c1trZXljb2RlLVNQX0tFWV8xXS5mdW5jKHBvcyk7CisgICAgICAgICAga2V5X3ByZXNzID0gMTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgU1BfS0VZX0NMRUFSOgpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX3VwZ3JhZGUuYyBiL3N1cHdpc2RvbS9zcF91cGdyYWRlLmMKaW5kZXggNmYyZmRiOC4uNmQwNGE4MyAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX3VwZ3JhZGUuYworKysgYi9zdXB3aXNkb20vc3BfdXBncmFkZS5jCkBAIC0zMTEsNyArMzExLDcgQEAKICAgICAgIG9mZnNldCArPSAodWludDMyKWRhdGFfbGVuOwogICAgICAgaWYoQUREUl9VUEdSQURFX0JFR0lOICsgb2Zmc2V0ID49IEFERFJfVVBHUkFERV9FTkQpCiAgICAgICB7Ci0gICAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgIs/C1NjOxLz+uf208yIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiyf28tsqnsNwiLCAiz8LU2M7EvP65/bTzIixERUxBWV9USU1FM3MpOwogICAgICAgICByZXR1cm4gMTsKICAgICAgIH0KICAgICB9CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICB7CiAgICAgICBpZigzIDwgdGltZW91dF90cnljbnQpCiAgICAgICB7Ci0gICAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgIs/C1NjOxLz+s6zKsSIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiyf28tsqnsNwiLCAiz8LU2M7EvP6zrMqxIixERUxBWV9USU1FM3MpOwogICAgICAgICByZXR1cm4gMTsKICAgICAgIH0KICAgICAgIERlbGF5X21zKERFTEFZX1RJTUUxcyk7CkBAIC0zNzQsNyArMzc0LDcgQEAKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKLSAgICAgICAgZGlzcF9oaW50X2luZm8ocG9zLCAizsS8/tCj0em07c7zIixERUxBWV9USU1FM3MpOworICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ/by2yqew3CIsICLOxLz+0KPR6bTtzvMiLERFTEFZX1RJTUUzcyk7CiAgICAgICAgIHJldHVybiAxOwogICAgICAgfQogICAgIH0K