LyoKICoJdzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIKICoKICoJKGMpIENvcHlyaWdodCAyMDA3IFZsYWQgRHJ1a2tlciA8dmxhZEBzdG9yZXdpei5jb20+CiAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMywyMDA3IFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CiAqCiAqCUJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgogKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CiAqCiAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCiAqCiAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqCU5laXRoZXIgQWxhbiBDb3ggbm9yIEN5bXJ1TmV0IEx0ZC4gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCiAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAogKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqCShjKSBDb3B5cmlnaHQgMTk5NSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9pby5oPgojaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KCiNkZWZpbmUgV0FUQ0hET0dfTkFNRSAidzgzNjI3aGYvdGhmL2hnIFdEVCIKI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CnN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKc3RhdGljIERFRklORV9TUElOTE9DSyhpb19sb2NrKTsKCi8qIFlvdSBtdXN0IHNldCB0aGlzIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuICovCnN0YXRpYyBpbnQgd2R0X2lvID0gMHgyRTsKbW9kdWxlX3BhcmFtKHdkdF9pbywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh3ZHRfaW8sICJ3ODM2MjdoZi90aGYgV0RUIGlvIHBvcnQgKGRlZmF1bHQgMHgyRSkiKTsKCnN0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwKCQkiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAxIDw9IHRpbWVvdXQgPD0gMjU1LCBkZWZhdWx0PSIKCQkJCV9fTU9EVUxFX1NUUklORyhXQVRDSERPR19USU1FT1VUKSAiLiIpOwoKc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwptb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsCgkJIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iCgkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CgovKgogKglLZXJuZWwgbWV0aG9kcy4KICovCgojZGVmaW5lIFdEVF9FRkVSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCiNkZWZpbmUgV0RUX0VGSVIgKHdkdF9pbyswKSAgIC8qIEV4dGVuZGVkIEZ1bmN0aW9uIEluZGV4IFJlZ2lzdGVyCgkJCQkJCQkoc2FtZSBhcyBFRkVSKSAqLwojZGVmaW5lIFdEVF9FRkRSIChXRFRfRUZJUisxKSAvKiBFeHRlbmRlZCBGdW5jdGlvbiBEYXRhIFJlZ2lzdGVyICovCgpzdGF0aWMgdm9pZCB3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIodm9pZCkKewoJdW5zaWduZWQgY2hhciBjOwoJb3V0Yl9wKDB4ODcsIFdEVF9FRkVSKTsgLyogRW50ZXIgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwoJb3V0Yl9wKDB4ODcsIFdEVF9FRkVSKTsgLyogQWdhaW4gYWNjb3JkaW5nIHRvIG1hbnVhbCAqLwoKCW91dGIoMHgyMCwgV0RUX0VGRVIpOwkvKiBjaGVjayBjaGlwIHZlcnNpb24JKi8KCWMgPSBpbmIoV0RUX0VGRFIpOwoJaWYgKGMgPT0gMHg4MikgewkvKiBXODM2MjdUSEYJCSovCgkJb3V0Yl9wKDB4MmIsIFdEVF9FRkVSKTsgLyogc2VsZWN0IEdQSU8zICovCgkJYyA9ICgoaW5iX3AoV0RUX0VGRFIpICYgMHhmNykgfCAweDA0KTsgLyogc2VsZWN0IFdEVDAgKi8KCQlvdXRiX3AoMHgyYiwgV0RUX0VGRVIpOwoJCW91dGJfcChjLCBXRFRfRUZEUik7CS8qIHNldCBHUElPMyB0byBXRFQwICovCgl9CgoJb3V0Yl9wKDB4MDcsIFdEVF9FRkVSKTsgLyogcG9pbnQgdG8gbG9naWNhbCBkZXZpY2UgbnVtYmVyIHJlZyAqLwoJb3V0Yl9wKDB4MDgsIFdEVF9FRkRSKTsgLyogc2VsZWN0IGxvZ2ljYWwgZGV2aWNlIDggKEdQSU8yKSAqLwoJb3V0Yl9wKDB4MzAsIFdEVF9FRkVSKTsgLyogc2VsZWN0IENSMzAgKi8KCW91dGJfcCgweDAxLCBXRFRfRUZEUik7IC8qIHNldCBiaXQgMCB0byBhY3RpdmF0ZSBHUElPMiAqLwp9CgpzdGF0aWMgdm9pZCB3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQp7CglvdXRiX3AoMHhBQSwgV0RUX0VGRVIpOyAvKiBMZWF2ZSBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCn0KCi8qIHR5YW4gbW90aGVyYm9hcmRzIHNlZW0gdG8gc2V0IEY1IHRvIDB4NEMgPwogKiBTbyBleHBsaWNpdGx5IGluaXQgdG8gYXBwcm9wcmlhdGUgdmFsdWUuICovCgpzdGF0aWMgdm9pZCB3ODM2MjdoZl9pbml0KHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgdDsKCgl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKCglvdXRiX3AoMHhGNiwgV0RUX0VGRVIpOyAvKiBTZWxlY3QgQ1JGNiAqLwoJdCA9IGluYl9wKFdEVF9FRkRSKTsgICAgICAvKiByZWFkIENSRjYgKi8KCWlmICh0ICE9IDApIHsKCQlwcmludGsoS0VSTl9JTkZPIFBGWAoJCSAgICAgIldhdGNoZG9nIGFscmVhZHkgcnVubmluZy4gUmVzZXR0aW5nIHRpbWVvdXQgdG8gJWQgc2VjXG4iLAoJCQkJCQkJCXRpbWVvdXQpOwoJCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNiAqLwoJfQoKCW91dGJfcCgweEY1LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY1ICovCgl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNSAqLwoJdCAmPSB+MHgwQzsgICAgICAgICAgICAgICAvKiBzZXQgc2Vjb25kIG1vZGUgJiBkaXNhYmxlIGtleWJvYXJkCgkJCQkgICAgdHVybmluZyBvZmYgd2F0Y2hkb2cgKi8KCW91dGJfcCh0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNSAqLwoKCW91dGJfcCgweEY3LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY3ICovCgl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNyAqLwoJdCAmPSB+MHhDMDsgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGtleWJvYXJkICYgbW91c2UgdHVybmluZyBvZmYKCQkJCSAgICB3YXRjaGRvZyAqLwoJb3V0Yl9wKHQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY3ICovCgoJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKfQoKc3RhdGljIHZvaWQgd2R0X2N0cmwoaW50IHRpbWVvdXQpCnsKCXNwaW5fbG9jaygmaW9fbG9jayk7CgoJdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CgoJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgICAgLyogU2VsZWN0IENSRjYgKi8KCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7IC8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY2ICovCgoJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKCglzcGluX3VubG9jaygmaW9fbG9jayk7Cn0KCnN0YXRpYyBpbnQgd2R0X3Bpbmcodm9pZCkKewoJd2R0X2N0cmwodGltZW91dCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB3ZHRfZGlzYWJsZSh2b2lkKQp7Cgl3ZHRfY3RybCgwKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdkdF9zZXRfaGVhcnRiZWF0KGludCB0KQp7CglpZiAodCA8IDEgfHwgdCA+IDI1NSkKCQlyZXR1cm4gLUVJTlZBTDsKCXRpbWVvdXQgPSB0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCnsKCWlmIChjb3VudCkgewoJCWlmICghbm93YXlvdXQpIHsKCQkJc2l6ZV90IGk7CgoJCQlleHBlY3RfY2xvc2UgPSAwOwoKCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CgkJCQljaGFyIGM7CgkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQlpZiAoYyA9PSAnVicpCgkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CgkJCX0KCQl9CgkJd2R0X3BpbmcoKTsKCX0KCXJldHVybiBjb3VudDsKfQoKc3RhdGljIGxvbmcgd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CglpbnQgX191c2VyICpwID0gYXJncDsKCWludCBuZXdfdGltZW91dDsKCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwKCQkJCQkJCVdESU9GX01BR0lDQ0xPU0UsCgkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAoJCS5pZGVudGl0eSA9ICJXODM2MjdIRiBXRFQiLAoJfTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFdESU9DX0dFVFNUQVRVUzoKCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CgljYXNlIFdESU9DX1NFVE9QVElPTlM6Cgl7CgkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CgoJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKG9wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgewoJCQl3ZHRfZGlzYWJsZSgpOwoJCQlyZXR2YWwgPSAwOwoJCX0KCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpIHsKCQkJd2R0X3BpbmcoKTsKCQkJcmV0dmFsID0gMDsKCQl9CgkJcmV0dXJuIHJldHZhbDsKCX0KCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgoJCXdkdF9waW5nKCk7CgkJYnJlYWs7CgljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CgkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJd2R0X3BpbmcoKTsKCQkvKiBGYWxsICovCgljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CgkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVOT1RUWTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQoJCXJldHVybiAtRUJVU1k7CgkvKgoJICoJQWN0aXZhdGUKCSAqLwoKCXdkdF9waW5nKCk7CglyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cn0KCnN0YXRpYyBpbnQgd2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglpZiAoZXhwZWN0X2Nsb3NlID09IDQyKQoJCXdkdF9kaXNhYmxlKCk7CgllbHNlIHsKCQlwcmludGsoS0VSTl9DUklUIFBGWAoJCQkiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CgkJd2R0X3BpbmcoKTsKCX0KCWV4cGVjdF9jbG9zZSA9IDA7CgljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKCXJldHVybiAwOwp9CgovKgogKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KICovCgpzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAoJdm9pZCAqdW51c2VkKQp7CglpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQoJCXdkdF9kaXNhYmxlKCk7CS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KCglyZXR1cm4gTk9USUZZX0RPTkU7Cn0KCi8qCiAqCUtlcm5lbCBJbnRlcmZhY2VzCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubGxzZWVrCQk9IG5vX2xsc2VlaywKCS53cml0ZQkJPSB3ZHRfd3JpdGUsCgkudW5sb2NrZWRfaW9jdGwJPSB3ZHRfaW9jdGwsCgkub3BlbgkJPSB3ZHRfb3BlbiwKCS5yZWxlYXNlCT0gd2R0X2Nsb3NlLAp9OwoKc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0gewoJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCgkubmFtZSA9ICJ3YXRjaGRvZyIsCgkuZm9wcyA9ICZ3ZHRfZm9wcywKfTsKCi8qCiAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KICovCgpzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCn07CgpzdGF0aWMgaW50IF9faW5pdCB3ZHRfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoKCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIHRoZSBXaW5ib25kKFRNKSBXODM2MjdIRi9USEYvSEcgU3VwZXIgSS9PIGNoaXAgaW5pdGlhbGlzaW5nLlxuIik7CgoJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CgkJd2R0X3NldF9oZWFydGJlYXQoV0FUQ0hET0dfVElNRU9VVCk7CgkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKCQkgICAgICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMSA8PSB0aW1lb3V0IDw9IDI1NSwgdXNpbmcgJWRcbiIsCgkJCQlXQVRDSERPR19USU1FT1VUKTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKHdkdF9pbywgMSwgV0FUQ0hET0dfTkFNRSkpIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCgkJCXdkdF9pbyk7CgkJcmV0ID0gLUVJTzsKCQlnb3RvIG91dDsKCX0KCgl3ODM2MjdoZl9pbml0KCk7CgoJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSIFBGWAoJCQkiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwgcmV0KTsKCQlnb3RvIHVucmVnX3JlZ2lvbnM7Cgl9CgoJcmV0ID0gbWlzY19yZWdpc3Rlcigmd2R0X21pc2NkZXYpOwoJaWYgKHJldCAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSIFBGWAoJCQkiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCgkJCQkJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKCQlnb3RvIHVucmVnX3JlYm9vdDsKCX0KCglwcmludGsoS0VSTl9JTkZPIFBGWAoJCQkiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCgkJCQkJCQl0aW1lb3V0LCBub3dheW91dCk7CgpvdXQ6CglyZXR1cm4gcmV0Owp1bnJlZ19yZWJvb3Q6Cgl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKdW5yZWdfcmVnaW9uczoKCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7Cglnb3RvIG91dDsKfQoKc3RhdGljIHZvaWQgX19leGl0IHdkdF9leGl0KHZvaWQpCnsKCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOwoJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDEpOwp9Cgptb2R1bGVfaW5pdCh3ZHRfaW5pdCk7Cm1vZHVsZV9leGl0KHdkdF9leGl0KTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiUOFkcmFpZyBCcmFkeSA8UEBkcmFpZ0JyYWR5LmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJ3ODM2MjdoZi90aGYgV0RUIGRyaXZlciIpOwpNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7Cg==