LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwojaW5jbHVkZSAic2lnX2NvbnRleHQuaCIKCnR5cGVkZWYgc3RydWN0IF9ET1NTWVNURU0gewogIGludCBpZDsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TU1lTVEVNICpuZXh0Owp9IERPU1NZU1RFTTsKCnN0cnVjdCBfRE9TRVZFTlQ7Cgp0eXBlZGVmIHN0cnVjdCBfRE9TVEFTSyB7CiBMUFZPSUQgaW1nOwogdW5zaWduZWQgaW1nX29mczsKIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKIFdPUkQgaW5pdF9jcyxpbml0X2lwLGluaXRfc3MsaW5pdF9zcDsKIFdPUkQgeG1zX3NlZzsKIFdPUkQgZHBtaV9zZWcsZHBtaV9zZWwsZHBtaV9mbGFnOwogSE1PRFVMRTE2IGhNb2R1bGU7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIEhBTkRMRSBoUmVhZFBpcGUsaFhQaXBlLGhDb25JbnB1dCxoQ29uT3V0cHV0OwogaW50IHJlYWRfcGlwZSx3cml0ZV9waXBlOwogcGlkX3QgdGFzazsKIGludCBzaWdfc2VudDsKIHN0cnVjdCBfRE9TRVZFTlQgKnBlbmRpbmcsKmN1cnJlbnQ7CiBET1NTWVNURU0gKnN5czsKfSBET1NUQVNLLCAqTFBET1NUQVNLOwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU0VWRU5UIHsKICBpbnQgaXJxLHByaW9yaXR5OwogIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLFBDT05URVhULHZvaWQqKTsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TRVZFTlQgKm5leHQ7Cn0gRE9TRVZFTlQsICpMUERPU0VWRU5UOwoKI2RlZmluZSBET1NfUFJJT1JJVFlfUkVBTFRJTUUgMCAgLyogSVJRMCAqLwojZGVmaW5lIERPU19QUklPUklUWV9LRVlCT0FSRCAxICAvKiBJUlExICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1ZHQSAgICAgIDIgIC8qIElSUTkgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfTU9VU0UgICAgNSAgLyogSVJRMTIgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfU0VSSUFMICAgMTAgLyogSVJRNCAqLwoKI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoX19pMzg2X18pCgojZGVmaW5lIE1aX1NVUFBPUlRFRAoKZXh0ZXJuIEJPT0wgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIHZvaWQgTVpfS2lsbE1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gTFBET1NUQVNLIE1aX0FsbG9jRFBNSVRhc2soIEhNT0RVTEUxNiBoTW9kdWxlICk7CgojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgpleHRlcm4gQk9PTCBNWl9DcmVhdGVQcm9jZXNzKCBIRklMRSBoRmlsZSwgT0ZTVFJVQ1QgKm9mcywgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgdHNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGluaGVyaXQsIERXT1JEIGZsYWdzLCBMUFNUQVJUVVBJTkZPQSBzdGFydHVwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQUk9DRVNTX0lORk9STUFUSU9OIGluZm8gKTsKZXh0ZXJuIExQRE9TVEFTSyBNWl9DdXJyZW50KCB2b2lkICk7CmV4dGVybiBpbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUXVldWVFdmVudCggaW50IGlycSwgaW50IHByaW9yaXR5LCB2b2lkICgqcmVsYXkpKExQRE9TVEFTSyxQQ09OVEVYVCx2b2lkKiksIHZvaWQgKmRhdGEgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICk7CmV4dGVybiB1bnNpZ25lZCBET1NWTV9HZXRUaW1lciggdm9pZCApOwpleHRlcm4gdm9pZCBET1NWTV9TZXRTeXN0ZW1EYXRhKCBpbnQgaWQsIHZvaWQgKmRhdGEgKTsKZXh0ZXJuIHZvaWQqIERPU1ZNX0dldFN5c3RlbURhdGEoIGludCBpZCApOwoKI2VuZGlmIC8qIF9fV0lORV9ET1NFWEVfSCAqLwo=