LyogdGltc2ttb2R1dGlscy5jCiAqCiAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCiAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqLwoKI2luY2x1ZGUgInVuaWtsb2cuaCIKI2luY2x1ZGUgInRpbXNrbW9kLmgiCgojZGVmaW5lIE1ZRFJWTkFNRSAidGltc2ttb2R1dGlscyIKCi8qKiBDYWxsZXJzIHRvIGludGVyZmFjZXMgdGhhdCBzZXQgX19HRlBfTk9SRVRSWSBmbGFnIGJlbG93CiAqICBtdXN0IGNoZWNrIGZvciBhIE5VTEwgKGVycm9yKSByZXN1bHQgYXMgd2UgYXJlIHRlbGxpbmcgdGhlCiAqICBrZXJuZWwgaW50ZXJmYWNlIHRoYXQgaXQgaXMgb2theSB0byBmYWlsLgogKi8KCnZvaWQgKmttYWxsb2Nfa2VybmVsKHNpemVfdCBzaXopCnsKCXJldHVybiBrbWFsbG9jKHNpeiwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwp9CgovKiAgVXNlIHRoZXNlIGhhbmR5LWRhbmR5IHNlcV9maWxlX3h4eCBmdW5jdGlvbnMgaWYgeW91IHdhbnQgdG8gY2FsbCBzb21lCiAqICBmdW5jdGlvbnMgdGhhdCB3cml0ZSBzdHVmZiBpbnRvIGEgc2VxX2ZpbGUsIGJ1dCB5b3UgYWN0dWFsbHkganVzdCB3YW50CiAqICB0byBkdW1wIHRoYXQgb3V0cHV0IGludG8gYSBidWZmZXIuICBVc2UgdGhlbSBhcyBmb2xsb3dzOgogKiAgLSBjYWxsIHZpc29yX3NlcV9maWxlX25ld19idWZmZXIgdG8gY3JlYXRlIHRoZSBzZXFfZmlsZSAoeW91IHN1cHBseSB0aGUgYnVmKQogKiAgLSBjYWxsIHdoYXRldmVyIGZ1bmN0aW9ucyB5b3Ugd2FudCB0aGF0IHRha2UgYSBzZXFfZmlsZSBhcyBhbiBhcmd1bWVudAogKiAgICAodGhlIGJ1ZiB5b3Ugc3VwcGxpZWQgd2lsbCBnZXQgdGhlIG91dHB1dCBkYXRhKQogKiAgLSBjYWxsIHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyIHRvIGRpc3Bvc2Ugb2YgeW91ciBzZXFfZmlsZQogKi8Kc3RydWN0IHNlcV9maWxlICp2aXNvcl9zZXFfZmlsZV9uZXdfYnVmZmVyKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQp7CglzdHJ1Y3Qgc2VxX2ZpbGUgKnJjID0gTlVMTDsKCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGttYWxsb2Nfa2VybmVsKHNpemVvZihzdHJ1Y3Qgc2VxX2ZpbGUpKTsKCglpZiAobSA9PSBOVUxMKSB7CgkJcmMgPSBOVUxMOwoJCWdvdG8gQXdheTsKCX0KCW1lbXNldChtLCAwLCBzaXplb2Yoc3RydWN0IHNlcV9maWxlKSk7CgltLT5idWYgPSBidWY7CgltLT5zaXplID0gYnVmX3NpemU7CglyYyA9IG07CkF3YXk6CglpZiAocmMgPT0gTlVMTCkgewoJCXZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKG0pOwoJCW0gPSBOVUxMOwoJfQoJcmV0dXJuIHJjOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NlcV9maWxlX25ld19idWZmZXIpOwoKCgp2b2lkIHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKewoJaWYgKCFtKQoJCXJldHVybjsKCWtmcmVlKG0pOwp9CkVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3NlcV9maWxlX2RvbmVfYnVmZmVyKTsK