LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCiNpbmNsdWRlICJjb25maWcuaCIKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgLyogX19FTEZfXyAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaWZkZWYgSEFWRV9TWVNfTU1BTl9ICiMgaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19WTTg2X0gKIyBpbmNsdWRlIDxzeXMvdm04Ni5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1BUUkFDRV9ICiMgaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAojIGluY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgojaW5jbHVkZSAiZG9zbW9kLmgiCgogLyogRklYTUU6IGhhY2sgYmVjYXVzZSBsaWJjIHZtODYgbWF5IGJlIHRoZSBvbGQgc3lzY2FsbCB2ZXJzaW9uICovCgojZGVmaW5lIFNZU192bTg2ICAgMTY2CgpzdGF0aWMgaW5saW5lIGludCB2bTg2cGx1cyggaW50IGZ1bmMsIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgKnB0ciApCnsKICAgIGludCByZXM7CiNpZmRlZiBfX1BJQ19fCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyggInB1c2hsICUlZWJ4XG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAibW92bCAlMiwlJWVieFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImludCAkMHg4MFxuXHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcGwgJSVlYngiCiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnIiAoZnVuYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIgKHB0cikgKTsKI2Vsc2UKICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQgJDB4ODAiCiAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiIiAoZnVuYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOwojZW5kaWYgIC8qIF9fUElDX18gKi8KICAgIGlmIChyZXMgPj0gMCkgcmV0dXJuIHJlczsKICAgIGVycm5vID0gLXJlczsKICAgIHJldHVybiAtMTsKfQoKaW50IFhSRUFEKGludCBmZCx2b2lkKmJ1ZixpbnQgc2l6ZSkgewogaW50IHJlczsKCiB3aGlsZSAoMSkgewogIHJlcyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSk7CiAgaWYgKHJlcz09c2l6ZSkKICAgcmV0dXJuIHJlczsKICBpZiAocmVzPT0tMSkgewogICBpZiAoZXJybm89PUVJTlRSKQogICAgY29udGludWU7CiAgIHBlcnJvcigiZG9zbW9kIHJlYWQiKTsKICAgcmV0dXJuIC0xOwogIH0KICBpZiAocmVzKSAvKiBkb24ndCBwcmludCB0aGUgRU9GIGNvbmRpdGlvbiAqLwogICBmcHJpbnRmKHN0ZGVyciwiZG9zbW9kIHJlYWQgb25seSAlZCBvZiAlZCBieXRlcy5cbiIscmVzLHNpemUpOwogIHJldHVybiByZXM7CiB9Cn0KaW50IFhXUklURShpbnQgZmQsdm9pZCpidWYsaW50IHNpemUpIHsKIGludCByZXM7Cgogd2hpbGUgKDEpIHsKICByZXMgPSB3cml0ZShmZCwgYnVmLCBzaXplKTsKICBpZiAocmVzPT1zaXplKQogICByZXR1cm4gcmVzOwogIGlmIChyZXM9PS0xKSB7CiAgIGlmIChlcnJubz09RUlOVFIpCiAgICBjb250aW51ZTsKICAgcGVycm9yKCJkb3Ntb2Qgd3JpdGUiKTsKICAgcmV0dXJuIC0xOwogIH0KICBmcHJpbnRmKHN0ZGVyciwiZG9zbW9kIHdyaXRlIG9ubHkgJWQgb2YgJWQgYnl0ZXMuXG4iLHJlcyxzaXplKTsKICByZXR1cm4gcmVzOwogfQp9Cgp2b2lkIHNldF90aW1lcihzdHJ1Y3QgdGltZXZhbCp0aW0pCnsKIHN0cnVjdCBpdGltZXJ2YWwgY3VyOwoKIGN1ci5pdF9pbnRlcnZhbD0qdGltOwogY3VyLml0X3ZhbHVlPSp0aW07CiBzZXRpdGltZXIoSVRJTUVSX1JFQUwsJmN1cixOVUxMKTsKfQoKdm9pZCBnZXRfdGltZXIoc3RydWN0IHRpbWV2YWwqdGltKQp7CiBzdHJ1Y3QgaXRpbWVydmFsIGN1cjsKCiBnZXRpdGltZXIoSVRJTUVSX1JFQUwsJmN1cik7CiAqdGltPWN1ci5pdF92YWx1ZTsKfQoKdm9sYXRpbGUgaW50IHNpZ19wZW5kLHNpZ19mYXRhbD0wLHNpZ19hbHJtPTAsc2lnX2NiPTA7CnZvaWQqaW1nOwpzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IFZNODY7Cgp2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcpCnsKIGlmIChzaWdfcGVuZCkgZnByaW50ZihzdGRlcnIsIkRPU01PRCBwcmV2aW91cyBzaWduYWwgJWQgbG9zdFxuIixzaWdfcGVuZCk7CiBzaWdfcGVuZD1zaWc7CiBzaWduYWwoc2lnLHNpZ19oYW5kbGVyKTsKfQoKdm9pZCBiYWRfaGFuZGxlcihpbnQgc2lnKQp7CiBpZiAoc2lnIT1TSUdURVJNKSB7CiAgZnByaW50ZihzdGRlcnIsIkRPU01PRCBjYXVnaHQgZmF0YWwgc2lnbmFsICVkXG4iLHNpZyk7CiAgZnByaW50ZihzdGRlcnIsIihMYXN0IGtub3duIFZNODYgQ1M6SVAgd2FzICUwNHg6JTA0bHgpXG4iLFZNODYucmVncy5jcyxWTTg2LnJlZ3MuZWlwKTsKIH0KIHNpZ19wZW5kPXNpZzsgc2lnX2ZhdGFsKys7CiBzaWduYWwoc2lnLGJhZF9oYW5kbGVyKTsKfQoKdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWcpCnsKIHNpZ19hbHJtKys7CiBzaWduYWwoc2lnLGFsYXJtX2hhbmRsZXIpOwp9Cgp2b2lkIGNiX2hhbmRsZXIoaW50IHNpZykKewogc2lnX2NiKys7CiBzaWduYWwoc2lnLGNiX2hhbmRsZXIpOwp9CgppbnQgc2VuZF9zaWduYWwodm9pZCkKewogaW50IHJldD1zaWdfcGVuZDsgc2lnX3BlbmQ9MDsKIGlmICghcmV0KSB7CiAgaWYgKHNpZ19hbHJtKSB7CiAgIHJldD1TSUdBTFJNOyBzaWdfYWxybS0tOwogIH0gZWxzZSB7CiAgIHJldD1TSUdVU1IyOyBzaWdfY2ItLTsKICB9CiB9CiBpZiAoWFdSSVRFKDEsJnJldCxzaXplb2YocmV0KSkhPXNpemVvZihyZXQpKSByZXR1cm4gMTsKIGlmIChzaWdfZmF0YWwpIHJldHVybiAxOwogcmV0dXJuIDA7Cn0KCmludCBzZW5kX2VudGVyX3JlcGx5KGludCByZXQpCnsKIGlmIChYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogaWYgKFhXUklURSgxLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiBzd2l0Y2ggKHJldCYweGZmKSB7CiAgY2FzZSBET1NNT0RfU0lHTkFMOgogICByZXR1cm4gc2VuZF9zaWduYWwoKTsKIH0KIHJldHVybiAwOwp9CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyKiphcmd2KQp7CiBpbnQgbWZkPW9wZW4oYXJndlswXSxPX1JEV1IpOwogc3RydWN0IHRpbWV2YWwgdGltOwogbXByb3RfaW5mbyBtcHI7CiBpbnQgZnVuYyxyZXQsaWRsZTsKIG9mZl90IGZvZnM9MDsKIHBpZF90IHBwaWQ9Z2V0cHBpZCgpOwogCi8qIGZwcmludGYoc3RkZXJyLCJtYWluIGlzIGF0ICUwOGx4LCBmaWxlIGlzICVzLCBmZD0lZFxuIiwodW5zaWduZWQgbG9uZykmbWFpbixhcmd2WzBdLG1mZCk7ICovCiBpZiAobWZkPDApIHJldHVybiAxOwovKiBNYXAgaW4gb3VyIERPUyBpbWFnZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSAqLwogaWYgKGFyZ3ZbMV0pIHsKICAvKiBVbHJpY2ggV2VpZ2FuZCBzdWdnZXN0ZWQgbWFwcGluZyBpbiB0aGUgRE9TIGltYWdlIGRpcmVjdGx5IGZyb20gdGhlIFdpbmUKICAgICBhZGRyZXNzIHNwYWNlICovCiAgZm9mcz1hdG9sKGFyZ3ZbMV0pOwogIC8qIGxpbnV4IGN1cnJlbnRseSBvbmx5IGFsbG93cyBtYXBwaW5nIGEgcHJvY2VzcyBtZW1vcnkgaWYgaXQncyBiZWluZyBwdHJhY2VkICovCiAgLyogTGludXMgZG9lc24ndCBsaWtlIGl0LCBzbyB0aGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gdGhlIGZ1dHVyZSAqLwogIC8qIGl0IGRvZXNuJ3QgZXZlbiB3b3JrIGZvciBtZSByaWdodCBub3cgKi8KICBraWxsKHBwaWQsU0lHU1RPUCk7CiAgcHRyYWNlKFBUUkFDRV9BVFRBQ0gscHBpZCwwLDApOwogIHdhaXRwaWQocHBpZCxOVUxMLDApOwogfQogaW1nPW1tYXAoTlVMTCwweDExMDAwMCxQUk9UX0VYRUN8UFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX0ZJWEVEfE1BUF9TSEFSRUQsbWZkLGZvZnMpOwogaWYgKGFyZ3ZbMV0pIHsKICBwdHJhY2UoUFRSQUNFX0RFVEFDSCxwcGlkLDAsMCk7CiAga2lsbChwcGlkLFNJR0NPTlQpOwogfQogaWYgKGltZz09KHZvaWQqKS0xKSB7CiAgZnByaW50ZihzdGRlcnIsIkRPUyBtZW1vcnkgbWFwIGZhaWxlZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKICBmcHJpbnRmKHN0ZGVyciwiaW4gYXR0ZW1wdCB0byBtYXAgJXMsIG9mZnNldCAlMDhsWCwgbGVuZ3RoIDExMDAwMCwgdG8gb2Zmc2V0IDBcbiIsYXJndlswXSxmb2ZzKTsKICByZXR1cm4gMTsKIH0KLyogaW5pdGlhbGl6ZSBzaWduYWxzIGFuZCBzeXN0ZW0gdGltZXIgKi8KIHNpZ25hbChTSUdIVVAsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR0lOVCxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHVVNSMSxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHVVNSMixjYl9oYW5kbGVyKTsKIHNpZ25hbChTSUdBTFJNLGFsYXJtX2hhbmRsZXIpOwoKIHNpZ25hbChTSUdRVUlULGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdJTEwsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0JVUyxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHRlBFLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdTRUdWLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdURVJNLGJhZF9oYW5kbGVyKTsKI2lmIDAKIHRpbS50dl9zZWM9MDsgdGltLnR2X3VzZWM9NTQ5MjU7CiBzZXRfdGltZXIoJnRpbSk7CiNlbmRpZgovKiByZXBvcnQgYmFjayB0byB0aGUgbWFpbiBwcm9ncmFtIHRoYXQgd2UncmUgcmVhZHkgKi8KIHJldD0zOyAvKiBkb3Ntb2QgcHJvdG9jb2wgcmV2aXNpb24gKi8KIFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpOwovKiBjb250ZXh0IGV4Y2hhbmdlIGxvb3AgKi8KIGlkbGU9MDsKIGRvIHsKICBpZiAoaWRsZSkgewogICB3aGlsZSAoMSkgewogICAgaW50IHJlczsKICAgIC8qIHBhcmVudCBpcyBpZGxlLCB0cmFuc21pdCBhbnkgc2lnbmFscyAocGFydGljdWxhcmx5IFNJR0FMUk0pICovCiAgICBpZiAoc2lnX3BlbmR8fHNpZ19hbHJtfHxzaWdfY2IpIHsKICAgICByZXQ9RE9TTU9EX1NJR05BTDsKICAgICBpZiAoWFdSSVRFKDEsJnJldCxzaXplb2YocmV0KSkhPXNpemVvZihyZXQpKSByZXR1cm4gMTsKICAgICByZXQ9c2VuZF9zaWduYWwoKTsKICAgICBpZiAocmV0KSByZXR1cm4gcmV0OwogICAgIGJyZWFrOwogICAgfQogICAgcmVzID0gcmVhZCgwLCZmdW5jLHNpemVvZihmdW5jKSk7CiAgICBpZiAocmVzPT1zaXplb2YoZnVuYykpCiAgICAgYnJlYWs7CiAgICBpZiAocmVzPT0tMSkgewogICAgIGlmIChlcnJubz09RUlOVFIpCiAgICAgIGNvbnRpbnVlOwogICAgIHBlcnJvcigiZG9zbW9kIHJlYWQiKTsKICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmIChyZXMpIC8qIGRvbid0IHByaW50IHRoZSBFT0YgY29uZGl0aW9uICovCiAgICAgZnByaW50ZihzdGRlcnIsImRvc21vZCByZWFkIG9ubHkgJWQgb2YgJWQgYnl0ZXMuXG4iLHJlcyxzaXplb2YoZnVuYykpOwogICAgcmV0dXJuIDE7CiAgIH0KICAgcmV0PURPU01PRF9MRUZUSURMRTsKICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgIGlkbGUtLTsKICB9IGVsc2UKICAgaWYgKFhSRUFEKDAsJmZ1bmMsc2l6ZW9mKGZ1bmMpKSE9c2l6ZW9mKGZ1bmMpKSByZXR1cm4gMTsKICBpZiAoZnVuYzwwKSBicmVhazsKICBzd2l0Y2ggKGZ1bmMpIHsKICAgY2FzZSBET1NNT0RfU0VUX1RJTUVSOiAvKiByZXYgMSAqLwogICAgaWYgKFhSRUFEKDAsJnRpbSxzaXplb2YodGltKSkhPXNpemVvZih0aW0pKSByZXR1cm4gMTsKICAgIHNldF90aW1lcigmdGltKTsKICAgIC8qIG5vIHJlc3BvbnNlICovCiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfR0VUX1RJTUVSOiAvKiByZXYgMSAqLwogICAgZ2V0X3RpbWVyKCZ0aW0pOwogICAgaWYgKFhXUklURSgxLCZ0aW0sc2l6ZW9mKHRpbSkpIT1zaXplb2YodGltKSkgcmV0dXJuIDE7CiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfTVBST1RFQ1Q6IC8qIHJldiAzICovCiAgICBpZiAoWFJFQUQoMCwmbXByLHNpemVvZihtcHIpKSE9c2l6ZW9mKG1wcikpIHJldHVybiAxOwogICAgbXByb3RlY3QobXByLmFkZHIsbXByLmxlbixtcHIucHJvdCk7CiAgICAvKiBubyByZXNwb25zZSAqLwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX0VOVEVSSURMRTogLyogcmV2IDMgKi8KICAgIGlkbGUrKzsKICAgIGJyZWFrOwogICBjYXNlIERPU01PRF9MRUFWRUlETEU6IC8qIHJldiAzICovCiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfRU5URVI6IC8qIHJldiAwICovCiAgIGRlZmF1bHQ6CiAgICBpZiAoWFJFQUQoMCwmVk04NixzaXplb2YoVk04NikpIT1zaXplb2YoVk04NikpIHJldHVybiAxOwogICAgaWYgKHNpZ19wZW5kfHxzaWdfYWxybXx8c2lnX2NiKSByZXQ9RE9TTU9EX1NJR05BTDsgZWxzZQogICAgIHJldD12bTg2cGx1cyhmdW5jLCZWTTg2KTsKCiAgICByZXQ9c2VuZF9lbnRlcl9yZXBseShyZXQpOwogICAgaWYgKHJldCkgcmV0dXJuIHJldDsKICB9CiB9IHdoaWxlICgxKTsKIHJldHVybiAwOwp9CgojZWxzZSAvKiAhbGludXgtaTM4NiAqLwppbnQgbWFpbih2b2lkKSB7cmV0dXJuIDE7fQojZW5kaWYK