LyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCiAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCiNpZmRlZiBQQUNLQUdFCiNlcnJvciBzeXNkZXAuaCBtdXN0IGJlIGluY2x1ZGVkIGluIGxpZXUgb2YgY29uZmlnLmgKI2VuZGlmCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJhbnNpZGVjbC5oIgoKI2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDx1bml4aW8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpbmNsdWRlICJmaWxlbmFtZXMuaCIKI2luY2x1ZGUgImZvcGVuLXZtcy5oIgoKI2RlZmluZSBOT19GQ05UTCAxCgojaWZuZGVmIE9fQUNDTU9ERQojZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKI2VuZGlmCgpleHRlcm4gaW50IGdldHBhZ2VzaXplICh2b2lkKTsKZXh0ZXJuIGNoYXIgKnN0cGNweSAoY2hhciAqLCBjb25zdCBjaGFyICopOwoKLyogTm8gaW50bC4gICovCiNkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQojZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoTXNnaWQpCiNkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQojZGVmaW5lIG5nZXR0ZXh0KE1zZ2lkMSwgTXNnaWQyLCBuKSBcCiAgKG4gPT0gMSA/IE1zZ2lkMSA6IE1zZ2lkMikKI2RlZmluZSBkbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIG4pIFwKICAobiA9PSAxID8gTXNnaWQxIDogTXNnaWQyKQojZGVmaW5lIGRjbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIG4sIENhdGVnb3J5KSBcCiAgKG4gPT0gMSA/IE1zZ2lkMSA6IE1zZ2lkMikKI2RlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpIGRvIHt9IHdoaWxlICgwKQojZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIGRvIHt9IHdoaWxlICgwKQojZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQojZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykK