LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgojaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CgoKI2RlZmluZSBSRUFMTU9ERV9CQVNFICAgICgoY2hhciopMHg3YzApCiNkZWZpbmUgUkVBTE1PREVfTUFJTEJPWCAoKGNoYXIqKTB4ZTAwKQoKCmV4dGVybiB1bG9uZyBfaTM4NmJvb3RfcmVhbG1vZGU7CmV4dGVybiB1bG9uZyBfaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZTsKZXh0ZXJuIGNoYXIgcmVhbG1vZGVfZW50ZXI7CgppbnQgcmVhbG1vZGVfc2V0dXAodm9pZCkKewoJdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGUgICAgICA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlICsgZ2QtPnJlbG9jX29mZjsKCXVsb25nIGkzODZib290X3JlYWxtb2RlX3NpemUgPSAodWxvbmcpJl9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplOwoKCS8qIGNvcHkgdGhlIHJlYWxtb2RlIHN3aXRjaCBjb2RlICovCglpZiAoaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA+IChSRUFMTU9ERV9NQUlMQk9YLVJFQUxNT0RFX0JBU0UpKSB7CgkJcHJpbnRmKCJyZWFsbW9kZSBzd2l0Y2ggdG9vIGxhcmdlICglbGQgYnl0ZXMsIG1heCBpcyAlZClcbiIsCgkJICAgICAgIGkzODZib290X3JlYWxtb2RlX3NpemUsIChSRUFMTU9ERV9NQUlMQk9YLVJFQUxNT0RFX0JBU0UpKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtY3B5KFJFQUxNT0RFX0JBU0UsICh2b2lkKilpMzg2Ym9vdF9yZWFsbW9kZSwgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSk7Cglhc20oIndiaW52ZFxuIik7CgoJcmV0dXJuIDA7Cn0KCmludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCnsKCgkvKiBzZXR1cCBvdXQgdGhpbiBiaW9zIGVtdWxhdGlvbiAqLwoJaWYgKGJpb3Nfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocmVhbG1vZGVfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpbi0+ZWlwID0gb2ZmOwoJaW4tPnhjcyA9IHNlZzsKCWlmICgzPihpbi0+ZXNwICYgMHhmZmZmKSkgewoJCXByaW50ZigiV2FybmluZzogZW50ZXJpbmcgcmVhbG1vZGUgd2l0aCBzcCA8IDQgd2lsbCBmYWlsXG4iKTsKCX0KCgltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwoJYXNtKCJ3YmludmRcbiIpOwoKCV9fYXNtX18gdm9sYXRpbGUgKAoJCSAibGNhbGwgJDB4MjAsJTBcbiIgIDogOiAgImkiICgmcmVhbG1vZGVfZW50ZXIpICk7CgoJYXNtKCJ3YmludmRcbiIpOwoJbWVtY3B5KG91dCwgUkVBTE1PREVfTUFJTEJPWCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CgoJcmV0dXJuIG91dC0+ZWF4Owp9CgoKLyogVGhpcyBjb2RlIGlzIHN1cHBvc2VkIHRvIGFjY2VzcyBhIHJlYWxtb2RlIGludGVycnVwdAogKiBpdCBkb2VzIGN1cnJlbnRseSBub3Qgd29yayBmb3IgbWUgKi8KaW50IGVudGVyX3JlYWxtb2RlX2ludCh1OCBsdmwsIHN0cnVjdCBwdF9yZWdzICppbiwgc3RydWN0IHB0X3JlZ3MgKm91dCkKewoJLyogcGxhY2UgdHdvIGluc3RydWN0aW9ucyBhdCAweDcwMCAqLwoJd3JpdGViKDB4Y2QsIDB4NzAwKTsgIC8qIGludCAkbHZsICovCgl3cml0ZWIobHZsLCAweDcwMSk7Cgl3cml0ZWIoMHhjYiwgMHg3MDIpOyAgLyogbHJldCAqLwoJYXNtKCJ3YmludmRcbiIpOwoKCWVudGVyX3JlYWxtb2RlKDB4MDAsIDB4NzAwLCBpbiwgb3V0KTsKCglyZXR1cm4gb3V0LT5lZmxhZ3MmMTsKfQo=