LyogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojZGVmaW5lIEVYUE9SVF9TWU1UQUIKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCiNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIGZvciBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgKi8KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGZvciBtZW1jcHkgKi8KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CgojaW5jbHVkZSAiY2hhbm5lbC5oIgojaW5jbHVkZSAiY2hhbnN0dWIuaCIKI2luY2x1ZGUgInZlcnNpb24uaCIKCnN0YXRpYyBfX2luaXQgaW50CmNoYW5uZWxfbW9kX2luaXQodm9pZCkKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBfX2V4aXQgdm9pZApjaGFubmVsX21vZF9leGl0KHZvaWQpCnsKfQoKdW5zaWduZWQgY2hhcgpTaWduYWxJbnNlcnRfd2l0aExvY2soQ0hBTk5FTF9IRUFERVIgX19pb21lbSAqcENoYW5uZWwsIFUzMiBRdWV1ZSwKCQkgICAgICB2b2lkICpwU2lnbmFsLCBzcGlubG9ja190ICpsb2NrKQp7Cgl1bnNpZ25lZCBjaGFyIHJlc3VsdDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CglyZXN1bHQgPSB2aXNvcl9zaWduYWxfaW5zZXJ0KHBDaGFubmVsLCBRdWV1ZSwgcFNpZ25hbCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKCXJldHVybiByZXN1bHQ7Cn0KCnVuc2lnbmVkIGNoYXIKU2lnbmFsUmVtb3ZlX3dpdGhMb2NrKENIQU5ORUxfSEVBREVSIF9faW9tZW0gKnBDaGFubmVsLCBVMzIgUXVldWUsCgkJICAgICAgdm9pZCAqcFNpZ25hbCwgc3BpbmxvY2tfdCAqbG9jaykKewoJdW5zaWduZWQgY2hhciByZXN1bHQ7CglzcGluX2xvY2sobG9jayk7CglyZXN1bHQgPSB2aXNvcl9zaWduYWxfcmVtb3ZlKHBDaGFubmVsLCBRdWV1ZSwgcFNpZ25hbCk7CglzcGluX3VubG9jayhsb2NrKTsKCXJldHVybiByZXN1bHQ7Cn0KCm1vZHVsZV9pbml0KGNoYW5uZWxfbW9kX2luaXQpOwptb2R1bGVfZXhpdChjaGFubmVsX21vZF9leGl0KTsKCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigiQnJ5YW4gR2xhdWRlbCIpOwpNT0RVTEVfQUxJQVMoInVpc2NoYW4iKTsKCS8qIHRoaXMgaXMgZXh0cmFjdGVkIGR1cmluZyBkZXBtb2QgYW5kIGtlcHQgaW4gbW9kdWxlcy5kZXAgKi8K