Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgoKLyogRHJpdmVyIGlkZW50aWZpY2F0aW9uICovCiNkZWZpbmUgRFJJVkVSX05BTUUJImlibWFzbSIKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgIjEuMCIKI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIk1heCBBc2JvY2sgPG1hc2JvY2tAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgIklCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRHJpdmVyIgoKI2RlZmluZSBlcnIobXNnKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKI2RlZmluZSBpbmZvKG1zZykgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgbXNnICJcbiIsIERSSVZFUl9OQU1FKQoKZXh0ZXJuIGludCBpYm1hc21fZGVidWc7CiNkZWZpbmUgZGJnKFNUUiwgQVJHUy4uLikJCQkJCVwKCWRvIHsJCQkJCQkJXAoJCWlmIChpYm1hc21fZGVidWcpCQkJCVwKCQkJcHJpbnRrKEtFUk5fREVCVUcgU1RSICwgIyNBUkdTKTsJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0X3RpbWVzdGFtcChjaGFyICpidWYpCnsKCXN0cnVjdCB0aW1ldmFsIG5vdzsKCWRvX2dldHRpbWVvZmRheSgmbm93KTsKCXNwcmludGYoYnVmLCAiJWx1LiVsdSIsIG5vdy50dl9zZWMsIG5vdy50dl91c2VjKTsKCXJldHVybiBidWY7Cn0KCiNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAJCiNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQojZGVmaW5lIElCTUFTTV9DTURfRkFJTEVECTIKCiNkZWZpbmUgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTAk0NQojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9FWFRSQQkyNDAKCiNkZWZpbmUgSUJNQVNNX0NNRF9NQVhfQlVGRkVSX1NJWkUJMHg4MDAwCgojZGVmaW5lIFJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQJMTIwCgojZGVmaW5lIEhFQVJUQkVBVF9CVUZGRVJfU0laRQkJMHg0MDAKCiNpZmRlZiBJQTY0CiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjY0IDYuMDggICAgICAiCiNlbHNlCiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjMyIDYuMDggICAgICAiCiNlbmRpZgoKI2RlZmluZSBTWVNURU1fU1RBVEVfT1NfVVAgICAgICA1CiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX0RPV04gICAgNAoKI2RlZmluZSBJQk1BU01fTkFNRV9TSVpFCTE2CgojZGVmaW5lIElCTUFTTV9OVU1fRVZFTlRTCTEwCiNkZWZpbmUgSUJNQVNNX0VWRU5UX01BWF9TSVpFCTIwNDh1CgoKc3RydWN0IGNvbW1hbmQgewoJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOwoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CglzaXplX3QJCQlidWZmZXJfc2l6ZTsKCWludAkJCXN0YXR1czsKCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwoJc3BpbmxvY2tfdAkJKmxvY2s7Cn07CiNkZWZpbmUgdG9fY29tbWFuZChjKSBjb250YWluZXJfb2YoYywgc3RydWN0IGNvbW1hbmQsIGtvYmopCgpzdGF0aWMgaW5saW5lIHZvaWQgY29tbWFuZF9wdXQoc3RydWN0IGNvbW1hbmQgKmNtZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZShjbWQtPmxvY2ssIGZsYWdzKTsKICAgICAgICBrb2JqZWN0X3B1dCgmY21kLT5rb2JqKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY21kLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjb21tYW5kX2dldChzdHJ1Y3QgY29tbWFuZCAqY21kKQp7CiAgICAgICAga29iamVjdF9nZXQoJmNtZC0+a29iaik7Cn0KCgpzdHJ1Y3QgaWJtYXNtX2V2ZW50IHsKCXVuc2lnbmVkIGludAlzZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJZGF0YVtJQk1BU01fRVZFTlRfTUFYX1NJWkVdOwp9OwoKc3RydWN0IGV2ZW50X2J1ZmZlciB7CglzdHJ1Y3QgaWJtYXNtX2V2ZW50CWV2ZW50c1tJQk1BU01fTlVNX0VWRU5UU107Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXVuc2lnbmVkIGludAkJbmV4dF9pbmRleDsKCXN0cnVjdCBsaXN0X2hlYWQJcmVhZGVyczsKfTsKCnN0cnVjdCBldmVudF9yZWFkZXIgewoJaW50CQkJY2FuY2VsbGVkOwoJdW5zaWduZWQgaW50CQluZXh0X3NlcmlhbF9udW1iZXI7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJc3RydWN0IGxpc3RfaGVhZAlub2RlOwoJdW5zaWduZWQgaW50CQlkYXRhX3NpemU7Cgl1bnNpZ25lZCBjaGFyCQlkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgewoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGludAkJc3RvcHBlZDsKfTsKCnN0cnVjdCBpYm1hc21fcmVtb3RlIHsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleWJkX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKm1vdXNlX2RldjsKfTsKCnN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciB7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CglzcGlubG9ja190CQlsb2NrOwoJdm9pZCBfX2lvbWVtCQkqYmFzZV9hZGRyZXNzOwoJdW5zaWduZWQgaW50CQlpcnE7CglzdHJ1Y3QgY29tbWFuZAkJKmN1cnJlbnRfY29tbWFuZDsKCXN0cnVjdCBjb21tYW5kCQkqaGVhcnRiZWF0OwoJc3RydWN0IGxpc3RfaGVhZAljb21tYW5kX3F1ZXVlOwoJc3RydWN0IGV2ZW50X2J1ZmZlcgkqZXZlbnRfYnVmZmVyOwoJY2hhcgkJCWRpcm5hbWVbSUJNQVNNX05BTUVfU0laRV07CgljaGFyCQkJZGV2bmFtZVtJQk1BU01fTkFNRV9TSVpFXTsKCXVuc2lnbmVkIGludAkJbnVtYmVyOwoJc3RydWN0IGlibWFzbV9yZW1vdGUJcmVtb3RlOwoJaW50CQkJc2VyaWFsX2xpbmU7CglzdHJ1Y3QgZGV2aWNlCQkqZGV2Owp9OwoKLyogY29tbWFuZCBwcm9jZXNzaW5nICovCmV4dGVybiBzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7CmV4dGVybiB2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCk7CmV4dGVybiB2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCk7CmV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CgovKiBldmVudCBwcm9jZXNzaW5nICovCmV4dGVybiBpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fZXZlbnRfYnVmZmVyX2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gdm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3VucmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKZXh0ZXJuIGludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CgovKiBoZWFydGJlYXQgLSBmcm9tIFNQIHRvIE9TICovCmV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfcGFuaWNfbm90aWZpZXIodm9pZCk7CmV4dGVybiBpbnQgaWJtYXNtX2hlYXJ0YmVhdF9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21faGVhcnRiZWF0X2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCAgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IHNpemUpOwoKLyogcmV2ZXJzZSBoZWFydGJlYXQgLSBmcm9tIE9TIHRvIFNQICovCmV4dGVybiB2b2lkIGlibWFzbV9pbml0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKZXh0ZXJuIGludCBpYm1hc21fc3RhcnRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwpleHRlcm4gdm9pZCBpYm1hc21fc3RvcF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CgovKiBkb3QgY29tbWFuZHMgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCBpbnQgZGF0YV9zaXplKTsKZXh0ZXJuIGludCBpYm1hc21fc2VuZF9kcml2ZXJfdnBkKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSk7CgovKiBsb3cgbGV2ZWwgbWVzc2FnZSBwcm9jZXNzaW5nICovCmV4dGVybiBpbnQgaWJtYXNtX3NlbmRfaTJvX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiBpcnFyZXR1cm5fdCBpYm1hc21faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwoKLyogcmVtb3RlIGNvbnNvbGUgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpleHRlcm4gaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiBmaWxlIHN5c3RlbSAqLwpleHRlcm4gaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiB1YXJ0ICovCiNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiNlbHNlCiNkZWZpbmUgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQojZGVmaW5lIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQojZW5kaWYK