LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgX19FTEZfXwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgImRvc21vZC5oIgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIF9faW5saW5lX18gaW50IHZtODZwbHVzKCBpbnQgZnVuYywgc3RydWN0IHZtODZwbHVzX3N0cnVjdCAqcHRyICkKewogICAgaW50IHJlczsKI2lmZGVmIF9fUElDX18KICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCAicHVzaGwgJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZsICUyLCUlZWJ4XG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ICQweDgwXG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wbCAlJWVieCIKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOwojZWxzZQogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MCIKICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImIiIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbmRpZiAgLyogX19QSUNfXyAqLwogICAgaWYgKHJlcyA+PSAwKSByZXR1cm4gcmVzOwogICAgZXJybm8gPSAtcmVzOwogICAgcmV0dXJuIC0xOwp9CgppbnQgWFJFQUQoaW50IGZkLHZvaWQqYnVmLGludCBzaXplKSB7CiBpbnQgcmVzOwoKIHdoaWxlICgxKSB7CiAgcmVzID0gcmVhZChmZCwgYnVmLCBzaXplKTsKICBpZiAocmVzPT1zaXplKQogICByZXR1cm4gcmVzOwogIGlmIChyZXM9PS0xKSB7CiAgIGlmIChlcnJubz09RUlOVFIpCiAgICBjb250aW51ZTsKICAgcGVycm9yKCJkb3Ntb2QgcmVhZCIpOwogICByZXR1cm4gLTE7CiAgfQogIGlmIChyZXMpIC8qIGRvbid0IHByaW50IHRoZSBFT0YgY29uZGl0aW9uICovCiAgIGZwcmludGYoc3RkZXJyLCJkb3Ntb2QgcmVhZCBvbmx5ICVkIG9mICVkIGJ5dGVzLlxuIixyZXMsc2l6ZSk7CiAgcmV0dXJuIHJlczsKIH0KfQppbnQgWFdSSVRFKGludCBmZCx2b2lkKmJ1ZixpbnQgc2l6ZSkgewogaW50IHJlczsKCiB3aGlsZSAoMSkgewogIHJlcyA9IHdyaXRlKGZkLCBidWYsIHNpemUpOwogIGlmIChyZXM9PXNpemUpCiAgIHJldHVybiByZXM7CiAgaWYgKHJlcz09LTEpIHsKICAgaWYgKGVycm5vPT1FSU5UUikKICAgIGNvbnRpbnVlOwogICBwZXJyb3IoImRvc21vZCB3cml0ZSIpOwogICByZXR1cm4gLTE7CiAgfQogIGZwcmludGYoc3RkZXJyLCJkb3Ntb2Qgd3JpdGUgb25seSAlZCBvZiAlZCBieXRlcy5cbiIscmVzLHNpemUpOwogIHJldHVybiByZXM7CiB9Cn0KCnZvaWQgc2V0X3RpbWVyKHN0cnVjdCB0aW1ldmFsKnRpbSkKewogc3RydWN0IGl0aW1lcnZhbCBjdXI7CgogY3VyLml0X2ludGVydmFsPSp0aW07CiBjdXIuaXRfdmFsdWU9KnRpbTsKIHNldGl0aW1lcihJVElNRVJfUkVBTCwmY3VyLE5VTEwpOwp9Cgp2b2lkIGdldF90aW1lcihzdHJ1Y3QgdGltZXZhbCp0aW0pCnsKIHN0cnVjdCBpdGltZXJ2YWwgY3VyOwoKIGdldGl0aW1lcihJVElNRVJfUkVBTCwmY3VyKTsKICp0aW09Y3VyLml0X3ZhbHVlOwp9Cgp2b2xhdGlsZSBpbnQgc2lnX3BlbmQsc2lnX2ZhdGFsPTAsc2lnX2Fscm09MCxzaWdfY2I9MDsKdm9pZCppbWc7CnN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKCnZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZykKewogaWYgKHNpZ19wZW5kKSBmcHJpbnRmKHN0ZGVyciwiRE9TTU9EIHByZXZpb3VzIHNpZ25hbCAlZCBsb3N0XG4iLHNpZ19wZW5kKTsKIHNpZ19wZW5kPXNpZzsKIHNpZ25hbChzaWcsc2lnX2hhbmRsZXIpOwp9Cgp2b2lkIGJhZF9oYW5kbGVyKGludCBzaWcpCnsKIGlmIChzaWchPVNJR1RFUk0pIHsKICBmcHJpbnRmKHN0ZGVyciwiRE9TTU9EIGNhdWdodCBmYXRhbCBzaWduYWwgJWRcbiIsc2lnKTsKICBmcHJpbnRmKHN0ZGVyciwiKExhc3Qga25vd24gVk04NiBDUzpJUCB3YXMgJTA0eDolMDRseClcbiIsVk04Ni5yZWdzLmNzLFZNODYucmVncy5laXApOwogfQogc2lnX3BlbmQ9c2lnOyBzaWdfZmF0YWwrKzsKIHNpZ25hbChzaWcsYmFkX2hhbmRsZXIpOwp9Cgp2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZykKewogc2lnX2Fscm0rKzsKIHNpZ25hbChzaWcsYWxhcm1faGFuZGxlcik7Cn0KCnZvaWQgY2JfaGFuZGxlcihpbnQgc2lnKQp7CiBzaWdfY2IrKzsKIHNpZ25hbChzaWcsY2JfaGFuZGxlcik7Cn0KCmludCBtYWluKGludCBhcmdjLGNoYXIqKmFyZ3YpCnsKIGludCBtZmQ9b3Blbihhcmd2WzBdLE9fUkRXUik7CiBzdHJ1Y3QgdGltZXZhbCB0aW07CiBpbnQgZnVuYyxyZXQ7CiBvZmZfdCBmb2ZzPTA7CiBwaWRfdCBwcGlkPWdldHBwaWQoKTsKIAovKiBmcHJpbnRmKHN0ZGVyciwibWFpbiBpcyBhdCAlMDhseCwgZmlsZSBpcyAlcywgZmQ9JWRcbiIsKHVuc2lnbmVkIGxvbmcpJm1haW4sYXJndlswXSxtZmQpOyAqLwogaWYgKG1mZDwwKSByZXR1cm4gMTsKLyogTWFwIGluIG91ciBET1MgaW1hZ2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KIGlmIChhcmd2WzFdKSB7CiAgLyogVWxyaWNoIFdlaWdhbmQgc3VnZ2VzdGVkIG1hcHBpbmcgaW4gdGhlIERPUyBpbWFnZSBkaXJlY3RseSBmcm9tIHRoZSBXaW5lCiAgICAgYWRkcmVzcyBzcGFjZSAqLwogIGZvZnM9YXRvbChhcmd2WzFdKTsKICAvKiBsaW51eCBjdXJyZW50bHkgb25seSBhbGxvd3MgbWFwcGluZyBhIHByb2Nlc3MgbWVtb3J5IGlmIGl0J3MgYmVpbmcgcHRyYWNlZCAqLwogIC8qIExpbnVzIGRvZXNuJ3QgbGlrZSBpdCwgc28gdGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIHRoZSBmdXR1cmUgKi8KICAvKiBpdCBkb2Vzbid0IGV2ZW4gd29yayBmb3IgbWUgcmlnaHQgbm93ICovCiAga2lsbChwcGlkLFNJR1NUT1ApOwogIHB0cmFjZShQVFJBQ0VfQVRUQUNILHBwaWQsMCwwKTsKICB3YWl0cGlkKHBwaWQsTlVMTCwwKTsKIH0KIGltZz1tbWFwKE5VTEwsMHgxMTAwMDAsUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLE1BUF9GSVhFRHxNQVBfU0hBUkVELG1mZCxmb2ZzKTsKIGlmIChhcmd2WzFdKSB7CiAgcHRyYWNlKFBUUkFDRV9ERVRBQ0gscHBpZCwwLDApOwogIGtpbGwocHBpZCxTSUdDT05UKTsKIH0KIGlmIChpbWc9PSh2b2lkKiktMSkgewogIGZwcmludGYoc3RkZXJyLCJET1MgbWVtb3J5IG1hcCBmYWlsZWQsIGVycm9yPSVzXG4iLHN0cmVycm9yKGVycm5vKSk7CiAgZnByaW50ZihzdGRlcnIsImluIGF0dGVtcHQgdG8gbWFwICVzLCBvZmZzZXQgJTA4bFgsIGxlbmd0aCAxMTAwMDAsIHRvIG9mZnNldCAwXG4iLGFyZ3ZbMF0sZm9mcyk7CiAgcmV0dXJuIDE7CiB9Ci8qIGluaXRpYWxpemUgc2lnbmFscyBhbmQgc3lzdGVtIHRpbWVyICovCiBzaWduYWwoU0lHSFVQLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdJTlQsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR1VTUjEsc2lnX2hhbmRsZXIpOwogc2lnbmFsKFNJR1VTUjIsY2JfaGFuZGxlcik7CiBzaWduYWwoU0lHQUxSTSxhbGFybV9oYW5kbGVyKTsKCiBzaWduYWwoU0lHUVVJVCxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHSUxMLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdCVVMsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0ZQRSxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHU0VHVixiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHVEVSTSxiYWRfaGFuZGxlcik7CiNpZiAwCiB0aW0udHZfc2VjPTA7IHRpbS50dl91c2VjPTU0OTI1Owogc2V0X3RpbWVyKCZ0aW0pOwojZW5kaWYKLyogcmVwb3J0IGJhY2sgdG8gdGhlIG1haW4gcHJvZ3JhbSB0aGF0IHdlJ3JlIHJlYWR5ICovCiByZXQ9MjsgLyogZG9zbW9kIHByb3RvY29sIHJldmlzaW9uICovCiBYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKTsKLyogY29udGV4dCBleGNoYW5nZSBsb29wICovCiBkbyB7CiAgaWYgKFhSRUFEKDAsJmZ1bmMsc2l6ZW9mKGZ1bmMpKSE9c2l6ZW9mKGZ1bmMpKSByZXR1cm4gMTsKICBpZiAoZnVuYzwwKSBicmVhazsKICBzd2l0Y2ggKGZ1bmMpIHsKICAgY2FzZSBET1NNT0RfU0VUX1RJTUVSOgogICAgaWYgKFhSRUFEKDAsJnRpbSxzaXplb2YodGltKSkhPXNpemVvZih0aW0pKSByZXR1cm4gMTsKICAgIHNldF90aW1lcigmdGltKTsKICAgIC8qIG5vIHJlc3BvbnNlICovCiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfR0VUX1RJTUVSOgogICAgZ2V0X3RpbWVyKCZ0aW0pOwogICAgaWYgKFhXUklURSgxLCZ0aW0sc2l6ZW9mKHRpbSkpIT1zaXplb2YodGltKSkgcmV0dXJuIDE7CiAgICBicmVhazsKICAgY2FzZSBET1NNT0RfRU5URVI6CiAgIGRlZmF1bHQ6CiAgICBpZiAoWFJFQUQoMCwmVk04NixzaXplb2YoVk04NikpIT1zaXplb2YoVk04NikpIHJldHVybiAxOwogICAgaWYgKHNpZ19wZW5kfHxzaWdfYWxybXx8c2lnX2NiKSByZXQ9RE9TTU9EX1NJR05BTDsgZWxzZQogICAgIHJldD12bTg2cGx1cyhmdW5jLCZWTTg2KTsKICAgIGlmIChYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogICAgaWYgKFhXUklURSgxLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CiAgICBzd2l0Y2ggKHJldCYweGZmKSB7CiAgICAgY2FzZSBET1NNT0RfU0lHTkFMOgogICAgICByZXQ9c2lnX3BlbmQ7IHNpZ19wZW5kPTA7CiAgICAgIGlmICghcmV0KSB7CiAgICAgICBpZiAoc2lnX2Fscm0pIHsKICAgICAgICByZXQ9U0lHQUxSTTsgc2lnX2Fscm0tLTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0PVNJR1VTUjI7IHNpZ19jYi0tOwogICAgICAgfQogICAgICB9CiAgICAgIGlmIChYV1JJVEUoMSwmcmV0LHNpemVvZihyZXQpKSE9c2l6ZW9mKHJldCkpIHJldHVybiAxOwogICAgICBpZiAoc2lnX2ZhdGFsKSByZXR1cm4gMTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogfSB3aGlsZSAoMSk7CiByZXR1cm4gMDsKfQoKI2Vsc2UgLyogIWxpbnV4LWkzODYgKi8KaW50IG1haW4odm9pZCkge3JldHVybiAxO30KI2VuZGlmCg==