LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgLyogX19FTEZfXyAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgImRvc21vZC5oIgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIGlubGluZSBpbnQgdm04NnBsdXMoIGludCBmdW5jLCBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0ICpwdHIgKQp7CiAgICBpbnQgcmVzOwojaWZkZWYgX19QSUNfXwogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJwdXNobCAlJWVieFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdmwgJTIsJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgJDB4ODBcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4IgogICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbHNlCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwIgogICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYiIgKGZ1bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIgKHB0cikgKTsKI2VuZGlmICAvKiBfX1BJQ19fICovCiAgICBpZiAocmVzID49IDApIHJldHVybiByZXM7CiAgICBlcnJubyA9IC1yZXM7CiAgICByZXR1cm4gLTE7Cn0KCmludCBYUkVBRChpbnQgZmQsdm9pZCpidWYsaW50IHNpemUpIHsKIGludCByZXM7Cgogd2hpbGUgKDEpIHsKICByZXMgPSByZWFkKGZkLCBidWYsIHNpemUpOwogIGlmIChyZXM9PXNpemUpCiAgIHJldHVybiByZXM7CiAgaWYgKHJlcz09LTEpIHsKICAgaWYgKGVycm5vPT1FSU5UUikKICAgIGNvbnRpbnVlOwogICBwZXJyb3IoImRvc21vZCByZWFkIik7CiAgIHJldHVybiAtMTsKICB9CiAgaWYgKHJlcykgLyogZG9uJ3QgcHJpbnQgdGhlIEVPRiBjb25kaXRpb24gKi8KICAgZnByaW50ZihzdGRlcnIsImRvc21vZCByZWFkIG9ubHkgJWQgb2YgJWQgYnl0ZXMuXG4iLHJlcyxzaXplKTsKICByZXR1cm4gcmVzOwogfQp9CmludCBYV1JJVEUoaW50IGZkLHZvaWQqYnVmLGludCBzaXplKSB7CiBpbnQgcmVzOwoKIHdoaWxlICgxKSB7CiAgcmVzID0gd3JpdGUoZmQsIGJ1Ziwgc2l6ZSk7CiAgaWYgKHJlcz09c2l6ZSkKICAgcmV0dXJuIHJlczsKICBpZiAocmVzPT0tMSkgewogICBpZiAoZXJybm89PUVJTlRSKQogICAgY29udGludWU7CiAgIHBlcnJvcigiZG9zbW9kIHdyaXRlIik7CiAgIHJldHVybiAtMTsKICB9CiAgZnByaW50ZihzdGRlcnIsImRvc21vZCB3cml0ZSBvbmx5ICVkIG9mICVkIGJ5dGVzLlxuIixyZXMsc2l6ZSk7CiAgcmV0dXJuIHJlczsKIH0KfQoKdm9pZCBzZXRfdGltZXIoc3RydWN0IHRpbWV2YWwqdGltKQp7CiBzdHJ1Y3QgaXRpbWVydmFsIGN1cjsKCiBjdXIuaXRfaW50ZXJ2YWw9KnRpbTsKIGN1ci5pdF92YWx1ZT0qdGltOwogc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZjdXIsTlVMTCk7Cn0KCnZvaWQgZ2V0X3RpbWVyKHN0cnVjdCB0aW1ldmFsKnRpbSkKewogc3RydWN0IGl0aW1lcnZhbCBjdXI7CgogZ2V0aXRpbWVyKElUSU1FUl9SRUFMLCZjdXIpOwogKnRpbT1jdXIuaXRfdmFsdWU7Cn0KCnZvbGF0aWxlIGludCBzaWdfcGVuZCxzaWdfZmF0YWw9MCxzaWdfYWxybT0wLHNpZ19jYj0wOwp2b2lkKmltZzsKc3RydWN0IHZtODZwbHVzX3N0cnVjdCBWTTg2OwoKdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnKQp7CiBpZiAoc2lnX3BlbmQpIGZwcmludGYoc3RkZXJyLCJET1NNT0QgcHJldmlvdXMgc2lnbmFsICVkIGxvc3RcbiIsc2lnX3BlbmQpOwogc2lnX3BlbmQ9c2lnOwogc2lnbmFsKHNpZyxzaWdfaGFuZGxlcik7Cn0KCnZvaWQgYmFkX2hhbmRsZXIoaW50IHNpZykKewogaWYgKHNpZyE9U0lHVEVSTSkgewogIGZwcmludGYoc3RkZXJyLCJET1NNT0QgY2F1Z2h0IGZhdGFsIHNpZ25hbCAlZFxuIixzaWcpOwogIGZwcmludGYoc3RkZXJyLCIoTGFzdCBrbm93biBWTTg2IENTOklQIHdhcyAlMDR4OiUwNGx4KVxuIixWTTg2LnJlZ3MuY3MsVk04Ni5yZWdzLmVpcCk7CiB9CiBzaWdfcGVuZD1zaWc7IHNpZ19mYXRhbCsrOwogc2lnbmFsKHNpZyxiYWRfaGFuZGxlcik7Cn0KCnZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnKQp7CiBzaWdfYWxybSsrOwogc2lnbmFsKHNpZyxhbGFybV9oYW5kbGVyKTsKfQoKdm9pZCBjYl9oYW5kbGVyKGludCBzaWcpCnsKIHNpZ19jYisrOwogc2lnbmFsKHNpZyxjYl9oYW5kbGVyKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsY2hhcioqYXJndikKewogaW50IG1mZD1vcGVuKGFyZ3ZbMF0sT19SRFdSKTsKIHN0cnVjdCB0aW1ldmFsIHRpbTsKIGludCBmdW5jLHJldDsKIG9mZl90IGZvZnM9MDsKIHBpZF90IHBwaWQ9Z2V0cHBpZCgpOwogCi8qIGZwcmludGYoc3RkZXJyLCJtYWluIGlzIGF0ICUwOGx4LCBmaWxlIGlzICVzLCBmZD0lZFxuIiwodW5zaWduZWQgbG9uZykmbWFpbixhcmd2WzBdLG1mZCk7ICovCiBpZiAobWZkPDApIHJldHVybiAxOwovKiBNYXAgaW4gb3VyIERPUyBpbWFnZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSAqLwogaWYgKGFyZ3ZbMV0pIHsKICAvKiBVbHJpY2ggV2VpZ2FuZCBzdWdnZXN0ZWQgbWFwcGluZyBpbiB0aGUgRE9TIGltYWdlIGRpcmVjdGx5IGZyb20gdGhlIFdpbmUKICAgICBhZGRyZXNzIHNwYWNlICovCiAgZm9mcz1hdG9sKGFyZ3ZbMV0pOwogIC8qIGxpbnV4IGN1cnJlbnRseSBvbmx5IGFsbG93cyBtYXBwaW5nIGEgcHJvY2VzcyBtZW1vcnkgaWYgaXQncyBiZWluZyBwdHJhY2VkICovCiAgLyogTGludXMgZG9lc24ndCBsaWtlIGl0LCBzbyB0aGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gdGhlIGZ1dHVyZSAqLwogIC8qIGl0IGRvZXNuJ3QgZXZlbiB3b3JrIGZvciBtZSByaWdodCBub3cgKi8KICBraWxsKHBwaWQsU0lHU1RPUCk7CiAgcHRyYWNlKFBUUkFDRV9BVFRBQ0gscHBpZCwwLDApOwogIHdhaXRwaWQocHBpZCxOVUxMLDApOwogfQogaW1nPW1tYXAoTlVMTCwweDExMDAwMCxQUk9UX0VYRUN8UFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX0ZJWEVEfE1BUF9TSEFSRUQsbWZkLGZvZnMpOwogaWYgKGFyZ3ZbMV0pIHsKICBwdHJhY2UoUFRSQUNFX0RFVEFDSCxwcGlkLDAsMCk7CiAga2lsbChwcGlkLFNJR0NPTlQpOwogfQogaWYgKGltZz09KHZvaWQqKS0xKSB7CiAgZnByaW50ZihzdGRlcnIsIkRPUyBtZW1vcnkgbWFwIGZhaWxlZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKICBmcHJpbnRmKHN0ZGVyciwiaW4gYXR0ZW1wdCB0byBtYXAgJXMsIG9mZnNldCAlMDhsWCwgbGVuZ3RoIDExMDAwMCwgdG8gb2Zmc2V0IDBcbiIsYXJndlswXSxmb2ZzKTsKICByZXR1cm4gMTsKIH0KLyogaW5pdGlhbGl6ZSBzaWduYWxzIGFuZCBzeXN0ZW0gdGltZXIgKi8KIHNpZ25hbChTSUdIVVAsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR0lOVCxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHVVNSMSxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHVVNSMixjYl9oYW5kbGVyKTsKIHNpZ25hbChTSUdBTFJNLGFsYXJtX2hhbmRsZXIpOwoKIHNpZ25hbChTSUdRVUlULGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdJTEwsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0JVUyxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHRlBFLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdTRUdWLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdURVJNLGJhZF9oYW5kbGVyKTsKI2lmIDAKIHRpbS50dl9zZWM9MDsgdGltLnR2X3VzZWM9NTQ5MjU7CiBzZXRfdGltZXIoJnRpbSk7CiNlbmRpZgovKiByZXBvcnQgYmFjayB0byB0aGUgbWFpbiBwcm9ncmFtIHRoYXQgd2UncmUgcmVhZHkgKi8KIHJldD0yOyAvKiBkb3Ntb2QgcHJvdG9jb2wgcmV2aXNpb24gKi8KIFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpOwovKiBjb250ZXh0IGV4Y2hhbmdlIGxvb3AgKi8KIGRvIHsKICBpZiAoWFJFQUQoMCwmZnVuYyxzaXplb2YoZnVuYykpIT1zaXplb2YoZnVuYykpIHJldHVybiAxOwogIGlmIChmdW5jPDApIGJyZWFrOwogIHN3aXRjaCAoZnVuYykgewogICBjYXNlIERPU01PRF9TRVRfVElNRVI6CiAgICBpZiAoWFJFQUQoMCwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHJldHVybiAxOwogICAgc2V0X3RpbWVyKCZ0aW0pOwogICAgLyogbm8gcmVzcG9uc2UgKi8KICAgIGJyZWFrOwogICBjYXNlIERPU01PRF9HRVRfVElNRVI6CiAgICBnZXRfdGltZXIoJnRpbSk7CiAgICBpZiAoWFdSSVRFKDEsJnRpbSxzaXplb2YodGltKSkhPXNpemVvZih0aW0pKSByZXR1cm4gMTsKICAgIGJyZWFrOwogICBjYXNlIERPU01PRF9FTlRFUjoKICAgZGVmYXVsdDoKICAgIGlmIChYUkVBRCgwLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiAgICBpZiAoc2lnX3BlbmR8fHNpZ19hbHJtfHxzaWdfY2IpIHJldD1ET1NNT0RfU0lHTkFMOyBlbHNlCiAgICAgcmV0PXZtODZwbHVzKGZ1bmMsJlZNODYpOwogICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgICBpZiAoWFdSSVRFKDEsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIHN3aXRjaCAocmV0JjB4ZmYpIHsKICAgICBjYXNlIERPU01PRF9TSUdOQUw6CiAgICAgIHJldD1zaWdfcGVuZDsgc2lnX3BlbmQ9MDsKICAgICAgaWYgKCFyZXQpIHsKICAgICAgIGlmIChzaWdfYWxybSkgewogICAgICAgIHJldD1TSUdBTFJNOyBzaWdfYWxybS0tOwogICAgICAgfSBlbHNlIHsKICAgICAgICByZXQ9U0lHVVNSMjsgc2lnX2NiLS07CiAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgICAgIGlmIChzaWdfZmF0YWwpIHJldHVybiAxOwogICAgICBicmVhazsKICAgIH0KICB9CiB9IHdoaWxlICgxKTsKIHJldHVybiAwOwp9CgojZWxzZSAvKiAhbGludXgtaTM4NiAqLwppbnQgbWFpbih2b2lkKSB7cmV0dXJuIDE7fQojZW5kaWYK