LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgojaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CgoKI2RlZmluZSBSRUFMTU9ERV9CQVNFICAgICgoY2hhciopMHg3YzApCiNkZWZpbmUgUkVBTE1PREVfTUFJTEJPWCAoKGNoYXIqKTB4ZTAwKQoKCmV4dGVybiBjaGFyIHJlYWxtb2RlX2VudGVyOwoKaW50IHJlYWxtb2RlX3NldHVwKHZvaWQpCnsKCS8qIGNvcHkgdGhlIHJlYWxtb2RlIHN3aXRjaCBjb2RlICovCglpZiAoaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA+IChSRUFMTU9ERV9NQUlMQk9YLVJFQUxNT0RFX0JBU0UpKSB7CgkJcHJpbnRmKCJyZWFsbW9kZSBzd2l0Y2ggdG9vIGxhcmdlICglbGQgYnl0ZXMsIG1heCBpcyAlZClcbiIsCgkJICAgICAgIGkzODZib290X3JlYWxtb2RlX3NpemUsIChSRUFMTU9ERV9NQUlMQk9YLVJFQUxNT0RFX0JBU0UpKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtY3B5KFJFQUxNT0RFX0JBU0UsICh2b2lkKilpMzg2Ym9vdF9yZWFsbW9kZSwgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSk7Cglhc20oIndiaW52ZFxuIik7CgoJcmV0dXJuIDA7Cn0KCmludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCnsKCgkvKiBzZXR1cCBvdXQgdGhpbiBiaW9zIGVtdWxhdGlvbiAqLwoJaWYgKGJpb3Nfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpZiAocmVhbG1vZGVfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCglpbi0+ZWlwID0gb2ZmOwoJaW4tPnhjcyA9IHNlZzsKCWlmICgzPihpbi0+ZXNwICYgMHhmZmZmKSkgewoJCXByaW50ZigiV2FybmluZzogZW50ZXJpbmcgcmVhbG1vZGUgd2l0aCBzcCA8IDQgd2lsbCBmYWlsXG4iKTsKCX0KCgltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwoJYXNtKCJ3YmludmRcbiIpOwoKCV9fYXNtX18gdm9sYXRpbGUgKAoJCSAibGNhbGwgJDB4MjAsJTBcbiIgIDogOiAgImkiICgmcmVhbG1vZGVfZW50ZXIpICk7CgoJYXNtKCJ3YmludmRcbiIpOwoJbWVtY3B5KG91dCwgUkVBTE1PREVfTUFJTEJPWCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CgoJcmV0dXJuIG91dC0+ZWF4Owp9CgoKLyogVGhpcyBjb2RlIGlzIHN1cHBvc2VkIHRvIGFjY2VzcyBhIHJlYWxtb2RlIGludGVycnVwdAogKiBpdCBkb2VzIGN1cnJlbnRseSBub3Qgd29yayBmb3IgbWUgKi8KaW50IGVudGVyX3JlYWxtb2RlX2ludCh1OCBsdmwsIHN0cnVjdCBwdF9yZWdzICppbiwgc3RydWN0IHB0X3JlZ3MgKm91dCkKewoJLyogcGxhY2UgdHdvIGluc3RydWN0aW9ucyBhdCAweDcwMCAqLwoJd3JpdGViKDB4Y2QsIDB4NzAwKTsgIC8qIGludCAkbHZsICovCgl3cml0ZWIobHZsLCAweDcwMSk7Cgl3cml0ZWIoMHhjYiwgMHg3MDIpOyAgLyogbHJldCAqLwoJYXNtKCJ3YmludmRcbiIpOwoKCWVudGVyX3JlYWxtb2RlKDB4MDAsIDB4NzAwLCBpbiwgb3V0KTsKCglyZXR1cm4gb3V0LT5lZmxhZ3MmMTsKfQo=