LyoKICogcHRocmVhZCBlbXVsYXRpb24gYmFzZWQgb24ga2VybmVsIHRocmVhZHMKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcjsKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c2V0am1wLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0FSUEFfTkFNRVNFUl9ICiMgaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9SRVNPTFZfSAojIGluY2x1ZGUgPHJlc29sdi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVkFMR1JJTkRfTUVNQ0hFQ0tfSAojaW5jbHVkZSA8dmFsZ3JpbmQvbWVtY2hlY2suaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0xXUF9ICiMgaW5jbHVkZSA8c3lzL2x3cC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVUNPTlRFWFRfSAojIGluY2x1ZGUgPHVjb250ZXh0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TQ0hFRF9ICiNpbmNsdWRlIDxzY2hlZC5oPgojZW5kaWYKCiNpbmNsdWRlICJ3aW5lL2xpYnJhcnkuaCIKI2luY2x1ZGUgIndpbmUvcHRocmVhZC5oIgoKI2RlZmluZSBQX09VVFBVVChzdHVmZikgd3JpdGUoMixzdHVmZixzdHJsZW4oc3R1ZmYpKQoKI2RlZmluZSBQU1RSKHN0cikgX19BU01fTkFNRSgjc3RyKQoKc3RhdGljIHN0cnVjdCB3aW5lX3B0aHJlYWRfZnVuY3Rpb25zIGZ1bmNzOwoKLyogdGhyZWFkIGRlc2NyaXB0b3IgKi8KCiNkZWZpbmUgRklSU1RfS0VZIDAKI2RlZmluZSBNQVhfS0VZUyAxNiAvKiBsaWJjNiBkb2Vzbid0IHVzZSB0aGF0IG1hbnksIGJ1dC4uLiAqLwojZGVmaW5lIE1BWF9UU0QgIDE2CgpzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QKewogICAgY2hhciAgICAgICAgICAgICAgIGR1bW15WzIwNDhdOwogICAgaW50ICAgICAgICAgICAgICAgIHRocmVhZF9lcnJubzsKICAgIGludCAgICAgICAgICAgICAgICB0aHJlYWRfaF9lcnJubzsKICAgIGludCAgICAgICAgICAgICAgICBjYW5jZWxfc3RhdGU7CiAgICBpbnQgICAgICAgICAgICAgICAgY2FuY2VsX3R5cGU7CiAgICBzdHJ1Y3QgX19yZXNfc3RhdGUgcmVzX3N0YXRlOwogICAgY29uc3Qgdm9pZCAgICAgICAgKmtleV9kYXRhW01BWF9LRVlTXTsgIC8qIGZvciBub3JtYWwgcHRocmVhZCBrZXlzICovCiAgICBjb25zdCB2b2lkICAgICAgICAqdHNkX2RhdGFbTUFYX1RTRF07ICAgLyogZm9yIGxpYmMgaW50ZXJuYWwgdHNkIHZhcmlhYmxlcyAqLwp9OwoKdHlwZWRlZiBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKnB0aHJlYWRfZGVzY3I7CgpzdGF0aWMgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0IGluaXRpYWxfZGVzY3I7CgpwdGhyZWFkX2Rlc2NyIF9fcHRocmVhZF90aHJlYWRfc2VsZih2b2lkKQp7CiAgICBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKmRlc2NyOwogICAgaWYgKCFmdW5jcy5wdHJfZ2V0X3RocmVhZF9kYXRhKSByZXR1cm4gJmluaXRpYWxfZGVzY3I7CiAgICBkZXNjciA9IGZ1bmNzLnB0cl9nZXRfdGhyZWFkX2RhdGEoKTsKICAgIGlmICghZGVzY3IpIHJldHVybiAmaW5pdGlhbF9kZXNjcjsKICAgIHJldHVybiBkZXNjcjsKfQoKc3RhdGljIGludCAoKmxpYmNfdXNlbG9jYWxlKShpbnQgc2V0KTsKc3RhdGljIGludCAqbGliY19tdWx0aXBsZV90aHJlYWRzOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBfX2Vycm5vX2xvY2F0aW9uL19fZXJyb3IvX19lcnJuby9fX19lcnJuby9fX3Rocl9lcnJubwogKgogKiBHZXQgdGhlIHBlci10aHJlYWQgZXJybm8gbG9jYXRpb24uCiAqLwppbnQgKl9fZXJybm9fbG9jYXRpb24odm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGludXggKi8KewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICZkZXNjci0+dGhyZWFkX2Vycm5vOwp9CmludCAqX19lcnJvcih2b2lkKSAgICAgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBGcmVlQlNEICovCmludCAqX19lcnJubyh2b2lkKSAgICAgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBOZXRCU0QgKi8KaW50ICpfX19lcnJubyh2b2lkKSAgICB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIFNvbGFyaXMgKi8KaW50ICpfX3Rocl9lcnJubyh2b2lkKSB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIFVuaXhXYXJlICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIF9faF9lcnJub19sb2NhdGlvbgogKgogKiBHZXQgdGhlIHBlci10aHJlYWQgaF9lcnJubyBsb2NhdGlvbi4KICovCmludCAqX19oX2Vycm5vX2xvY2F0aW9uKHZvaWQpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAmZGVzY3ItPnRocmVhZF9oX2Vycm5vOwp9CgpzdHJ1Y3QgX19yZXNfc3RhdGUgKl9fcmVzX3N0YXRlKHZvaWQpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAmZGVzY3ItPnJlc19zdGF0ZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHdyaXRlanVtcCggY29uc3QgY2hhciAqc3ltYm9sLCB2b2lkICpkZXN0ICkKewojaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19pMzg2X18pCiAgICB1bnNpZ25lZCBjaGFyICphZGRyID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCBzeW1ib2wsIE5VTEwsIDAgKTsKCiAgICBpZiAoIWFkZHIpIHJldHVybjsKCiAgICAvKiB3cml0ZSBhIHJlbGF0aXZlIGp1bXAgYXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgKi8KICAgIG1wcm90ZWN0KCh2b2lkKikoKHVuc2lnbmVkIGludClhZGRyICYgfihnZXRwYWdlc2l6ZSgpLTEpKSwgNSwgUFJPVF9SRUFEfFBST1RfRVhFQ3xQUk9UX1dSSVRFKTsKICAgIGFkZHJbMF0gPSAweGU5OwogICAgKihpbnQgKikoYWRkcisxKSA9ICh1bnNpZ25lZCBjaGFyICopZGVzdCAtIChhZGRyICsgNSk7CiAgICBtcHJvdGVjdCgodm9pZCopKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4oZ2V0cGFnZXNpemUoKS0xKSksIDUsIFBST1RfUkVBRHxQUk9UX0VYRUMpOwoKIyBpZmRlZiBIQVZFX1ZBTEdSSU5EX01FTUNIRUNLX0gKICAgIFZBTEdSSU5EX0RJU0NBUkRfVFJBTlNMQVRJT05TKCBhZGRyLCA1ICk7CiMgZW5kaWYKI2VuZGlmICAvKiBfX0dMSUJDX18gJiYgX19pMzg2X18gKi8KfQoKLyogdGVtcG9yYXJ5IHN0YWNrcyB1c2VkIG9uIHRocmVhZCBleGl0ICovCiNkZWZpbmUgVEVNUF9TVEFDS19TSVpFIDEwMjQKI2RlZmluZSBOQl9URU1QX1NUQUNLUyAgOApzdGF0aWMgY2hhciB0ZW1wX3N0YWNrc1tOQl9URU1QX1NUQUNLU11bVEVNUF9TVEFDS19TSVpFXTsKc3RhdGljIExPTkcgbmV4dF90ZW1wX3N0YWNrOyAgLyogbmV4dCB0ZW1wIHN0YWNrIHRvIHVzZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfdGVtcF9zdGFjawogKgogKiBHZXQgYSB0ZW1wb3Jhcnkgc3RhY2sgYWRkcmVzcyB0byBydW4gdGhlIHRocmVhZCBleGl0IGNvZGUgb24uCiAqLwppbmxpbmUgc3RhdGljIGNoYXIgKmdldF90ZW1wX3N0YWNrKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBuZXh0ID0gaW50ZXJsb2NrZWRfeGNoZ19hZGQoICZuZXh0X3RlbXBfc3RhY2ssIDEgKTsKICAgIHJldHVybiB0ZW1wX3N0YWNrc1tuZXh0ICUgTkJfVEVNUF9TVEFDS1NdICsgVEVNUF9TVEFDS19TSVpFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBjbGVhbnVwX3RocmVhZAogKgogKiBDbGVhbnVwIHRoZSByZW1haW5zIG9mIGEgdGhyZWFkLiBSdW5zIG9uIGEgdGVtcG9yYXJ5IHN0YWNrLgogKi8Kc3RhdGljIHZvaWQgY2xlYW51cF90aHJlYWQoIHZvaWQgKnB0ciApCnsKICAgIC8qIGNvcHkgdGhlIGluZm8gc3RydWN0dXJlIHNpbmNlIGl0IGlzIG9uIHRoZSBzdGFjayB3ZSB3aWxsIGZyZWUgKi8KICAgIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gaW5mbyA9ICooc3RydWN0IHdpbmVfcHRocmVhZF90aHJlYWRfaW5mbyAqKXB0cjsKICAgIHdpbmVfbGR0X2ZyZWVfZnMoIGluZm8udGViX3NlbCApOwogICAgbXVubWFwKCBpbmZvLnN0YWNrX2Jhc2UsIGluZm8uc3RhY2tfc2l6ZSApOwogICAgbXVubWFwKCBpbmZvLnRlYl9iYXNlLCBpbmZvLnRlYl9zaXplICk7CiNpZmRlZiBIQVZFX19MV1BfQ1JFQVRFCiAgICBfbHdwX2V4aXQoKTsKI2VuZGlmCiAgICBfZXhpdCggaW5mby5leGl0X3N0YXR1cyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfaW5pdF9wcm9jZXNzCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgcHJvY2Vzcy4KICovCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfcHJvY2VzcyggY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmN0aW9ucyApCnsKICAgIG1lbWNweSggJmZ1bmNzLCBmdW5jdGlvbnMsIG1pbihmdW5jdGlvbnMtPnNpemUsc2l6ZW9mKGZ1bmNzKSkgKTsKICAgIGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEoICZpbml0aWFsX2Rlc2NyICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9pbml0X3RocmVhZAogKgogKiBJbml0aWFsaXphdGlvbiBmb3IgYSBuZXdseSBjcmVhdGVkIHRocmVhZC4KICovCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfdGhyZWFkKCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICppbmZvICkKewogICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjcjsKCiAgICBpZiAoZnVuY3MucHRyX3NldF90aHJlYWRfZGF0YSkKICAgIHsKICAgICAgICBkZXNjciA9IGNhbGxvYyggMSwgc2l6ZW9mKCpkZXNjcikgKTsKICAgICAgICBmdW5jcy5wdHJfc2V0X3RocmVhZF9kYXRhKCBkZXNjciApOwogICAgICAgIGlmIChsaWJjX211bHRpcGxlX3RocmVhZHMpICpsaWJjX211bHRpcGxlX3RocmVhZHMgPSAxOwogICAgfQogICAgZWxzZSAgLyogZmlyc3QgdGhyZWFkICovCiAgICB7CiAgICAgICAgZGVzY3IgPSAmaW5pdGlhbF9kZXNjcjsKICAgICAgICB3cml0ZWp1bXAoICJfX2Vycm5vX2xvY2F0aW9uIiwgX19lcnJub19sb2NhdGlvbiApOwogICAgICAgIHdyaXRlanVtcCggIl9faF9lcnJub19sb2NhdGlvbiIsIF9faF9lcnJub19sb2NhdGlvbiApOwogICAgICAgIHdyaXRlanVtcCggIl9fcmVzX3N0YXRlIiwgX19yZXNfc3RhdGUgKTsKICAgIH0KICAgIGRlc2NyLT5jYW5jZWxfc3RhdGUgPSBQVEhSRUFEX0NBTkNFTF9FTkFCTEU7CiAgICBkZXNjci0+Y2FuY2VsX3R5cGUgID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgd2luZV9wdGhyZWFkX2NyZWF0ZV90aHJlYWQKICovCmludCB3aW5lX3B0aHJlYWRfY3JlYXRlX3RocmVhZCggc3RydWN0IHdpbmVfcHRocmVhZF90aHJlYWRfaW5mbyAqaW5mbyApCnsKICAgIGlmICghaW5mby0+c3RhY2tfYmFzZSkKICAgIHsKICAgICAgICBpbmZvLT5zdGFja19iYXNlID0gd2luZV9hbm9uX21tYXAoIE5VTEwsIGluZm8tPnN0YWNrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLCAwICk7CiAgICAgICAgaWYgKGluZm8tPnN0YWNrX2Jhc2UgPT0gKHZvaWQgKiktMSkgcmV0dXJuIC0xOwogICAgfQojaWZkZWYgSEFWRV9DTE9ORQogICAgaWYgKGNsb25lKCAoaW50ICgqKSh2b2lkICopKWluZm8tPmVudHJ5LCAoY2hhciAqKWluZm8tPnN0YWNrX2Jhc2UgKyBpbmZvLT5zdGFja19zaXplLAogICAgICAgICAgICAgICBDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBTSUdDSExELCBpbmZvICkgPCAwKQogICAgICAgIHJldHVybiAtMTsKICAgIHJldHVybiAwOwojZWxpZiBkZWZpbmVkKEhBVkVfUkZPUkspCiAgICB7CiAgICAgICAgdm9pZCAqKnNwID0gKHZvaWQgKiopKChjaGFyICopaW5mby0+c3RhY2tfYmFzZSArIGluZm8tPnN0YWNrX3NpemUpOwogICAgICAgICotLXNwID0gaW5mbzsKICAgICAgICAqLS1zcCA9IDA7CiAgICAgICAgKi0tc3AgPSBpbmZvLT5lbnRyeTsKICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKICAgICAgICAgICAgInB1c2hsICUyO1xuXHQiICAgICAgICAgICAgIC8qIGZsYWdzICovCiAgICAgICAgICAgICJwdXNobCAkMDtcblx0IiAgICAgICAgICAgICAvKiAwID8gKi8KICAgICAgICAgICAgIm1vdmwgJTEsJSVlYXg7XG5cdCIgICAgICAgIC8qIFNZU19yZm9yayAqLwogICAgICAgICAgICAiLmJ5dGUgMHg5YTsgLmxvbmcgMDsgLndvcmQgNztcblx0IiAvKiBsY2FsbCA3OjAuLi4gRnJlZUJTRCBzeXNjYWxsICovCiAgICAgICAgICAgICJjbXBsICQwLCAlJWVkeDtcblx0IgogICAgICAgICAgICAiamUgMWY7XG5cdCIKICAgICAgICAgICAgIm1vdmwgJTAsJSVlc3A7XG5cdCIgICAgICAgIC8qIGNoaWxkIC0+IG5ldyB0aHJlYWQgKi8KICAgICAgICAgICAgInJldDtcbiIKICAgICAgICAgICAgIjE6XG5cdCIgICAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCAtPiBjYWxsZXIgdGhyZWFkICovCiAgICAgICAgICAgICJhZGRsICQ4LCUlZXNwIiA6CiAgICAgICAgICAgIDogInIiIChzcCksICJnIiAoU1lTX3Jmb3JrKSwgImciIChSRlBST0MgfCBSRk1FTSB8IFJGVEhSRUFEKQogICAgICAgICAgICA6ICJlYXgiLCAiZWR4Iik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbGlmIGRlZmluZWQoSEFWRV9fTFdQX0NSRUFURSkKICAgIHsKICAgICAgICB1Y29udGV4dF90IGNvbnRleHQ7CiAgICAgICAgX2x3cF9tYWtlY29udGV4dCggJmNvbnRleHQsICh2b2lkKCopKHZvaWQgKikpaW5mby0+ZW50cnksIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaW5mby0+c3RhY2tfYmFzZSwgaW5mby0+c3RhY2tfc2l6ZSApOwogICAgICAgIGlmICggX2x3cF9jcmVhdGUoICZjb250ZXh0LCAwLCBOVUxMICkgKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIC0xOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfaW5pdF9jdXJyZW50X3RlYgogKgogKiBTZXQgdGhlIGN1cnJlbnQgVEVCIGZvciBhIG5ldyB0aHJlYWQuCiAqLwp2b2lkIHdpbmVfcHRocmVhZF9pbml0X2N1cnJlbnRfdGViKCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICppbmZvICkKewojaWZkZWYgX19pMzg2X18KICAgIC8qIE9uIHRoZSBpMzg2LCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW4gdGhlICVmcyByZWdpc3RlciAqLwogICAgTERUX0VOVFJZIGZzX2VudHJ5OwoKICAgIHdpbmVfbGR0X3NldF9iYXNlKCAmZnNfZW50cnksIGluZm8tPnRlYl9iYXNlICk7CiAgICB3aW5lX2xkdF9zZXRfbGltaXQoICZmc19lbnRyeSwgaW5mby0+dGViX3NpemUgLSAxICk7CiAgICB3aW5lX2xkdF9zZXRfZmxhZ3MoICZmc19lbnRyeSwgV0lORV9MRFRfRkxBR1NfREFUQXxXSU5FX0xEVF9GTEFHU18zMkJJVCApOwogICAgd2luZV9sZHRfaW5pdF9mcyggaW5mby0+dGViX3NlbCwgJmZzX2VudHJ5ICk7CiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCiAgICAvKiBPbiBQb3dlclBDLCB0aGUgY3VycmVudCBURUIgaXMgaW4gdGhlIGdwcjEzIHJlZ2lzdGVyICovCiMgaWZkZWYgX19BUFBMRV9fCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibXIgcjEzLCAlMCIgOiA6ICJyIiAoaW5mby0+dGViX2Jhc2UpKTsKIyBlbHNlCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibXIgMiwgJTAiIDogOiAiciIgKGluZm8tPnRlYl9iYXNlKSk7CiMgZW5kaWYKI2VsaWYgZGVmaW5lZChIQVZFX19MV1BfQ1JFQVRFKQogICAgLyogT24gbm9uLWkzODYgU29sYXJpcywgd2UgdXNlIHRoZSBMV1AgcHJpdmF0ZSBwb2ludGVyICovCiAgICBfbHdwX3NldHByaXZhdGUoIGluZm8tPnRlYl9iYXNlICk7CiNlbmRpZgoKICAgIC8qIHNldCBwaWQgYW5kIHRpZCAqLwogICAgaW5mby0+cGlkID0gZ2V0cGlkKCk7CiNpZmRlZiBIQVZFX19MV1BfU0VMRgogICAgaW5mby0+dGlkID0gX2x3cF9zZWxmKCk7CiNlbHNlCiAgICBpbmZvLT50aWQgPSAtMTsKI2VuZGlmCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9nZXRfY3VycmVudF90ZWIKICovCnZvaWQgKndpbmVfcHRocmVhZF9nZXRfY3VycmVudF90ZWIodm9pZCkKewogICAgdm9pZCAqcmV0OwoKI2lmZGVmIF9faTM4Nl9fCiAgICBfX2FzbV9fKCAiLmJ5dGUgMHg2NFxuXHRtb3ZsIDB4MTgsJTAiIDogIj1yIiAocmV0KSApOwojZWxpZiBkZWZpbmVkKEhBVkVfX0xXUF9DUkVBVEUpCiAgICByZXQgPSBfbHdwX2dldHByaXZhdGUoKTsKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKIyBpZmRlZiBfX0FQUExFX18KICAgIF9fYXNtX18oICJtciAlMCxyMTMiIDogIj1yIiAocmV0KSApOwojIGVsc2UKICAgIF9fYXNtX18oICJtciAlMCwyIiA6ICI9ciIgKHJldCkgKTsKIyBlbmRpZgojZWxzZQojIGVycm9yIHdpbmVfcHRocmVhZF9nZXRfY3VycmVudF90ZWIgbm90IGRlZmluZWQgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCiNlbmRpZiAgLyogX19pMzg2X18gKi8KCiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfZXhpdF90aHJlYWQKICovCnZvaWQgd2luZV9wdGhyZWFkX2V4aXRfdGhyZWFkKCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICppbmZvICkKewogICAgd2luZV9zd2l0Y2hfdG9fc3RhY2soIGNsZWFudXBfdGhyZWFkLCBpbmZvLCBnZXRfdGVtcF9zdGFjaygpICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIHdpbmVfcHRocmVhZF9hYm9ydF90aHJlYWQKICovCnZvaWQgd2luZV9wdGhyZWFkX2Fib3J0X3RocmVhZCggaW50IHN0YXR1cyApCnsKI2lmZGVmIEhBVkVfX0xXUF9DUkVBVEUKICAgIF9sd3BfZXhpdCgpOwojZW5kaWYKICAgIF9leGl0KCBzdGF0dXMgKTsKfQoKCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCgovKiBhZGFwdCBhcyBuZWNlc3NhcnkgKGEgY29uc3RydWN0IGxpa2UgdGhpcyBpcyB1c2VkIGluIGdsaWJjIHNvdXJjZXMpICovCiNkZWZpbmUgc3Ryb25nX2FsaWFzKG9yaWcsIGFsaWFzKSBcCiBhc20oIi5nbG9ibCAiIFBTVFIoYWxpYXMpICJcbiIgXAogICAgICJcdC5zZXQgIiBQU1RSKGFsaWFzKSAiLCIgUFNUUihvcmlnKSkKCnN0cnVjdCBmb3JrX2Jsb2NrOwoKLyogcHRocmVhZCBmdW5jdGlvbnMgcmVkaXJlY3Rpb24gKi8KCnN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucwp7CiAgcGlkX3QgKCpwdHJfcHRocmVhZF9mb3JrKSAoc3RydWN0IGZvcmtfYmxvY2sgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9kZXN0cm95KSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8wKSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8xKSAocHRocmVhZF9hdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfYXR0cl90ICosIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5KSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NvcGUpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY29wZSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfY29uZGF0dHJfZGVzdHJveSkgKHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9jb25kYXR0cl9pbml0KSAocHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9icm9hZGNhc3QpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfZGVzdHJveSkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9pbml0KSAocHRocmVhZF9jb25kX3QgKiwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9zaWduYWwpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfd2FpdCkgKHB0aHJlYWRfY29uZF90ICosIHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9lcXVhbCkgKHB0aHJlYWRfdCwgcHRocmVhZF90KTsKICB2b2lkICgqcHRyX19fcHRocmVhZF9leGl0KSAodm9pZCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9nZXRzY2hlZHBhcmFtKSAocHRocmVhZF90LCBpbnQgKiwgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX3NldHNjaGVkcGFyYW0pIChwdGhyZWFkX3QsIGludCwgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kpIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCkgKHB0aHJlYWRfbXV0ZXhfdCAqLCBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2xvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF91bmxvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgcHRocmVhZF90ICgqcHRyX3B0aHJlYWRfc2VsZikgKHZvaWQpOwogIGludCAoKnB0cl9wdGhyZWFkX3NldGNhbmNlbHN0YXRlKSAoaW50LCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0Y2FuY2VsdHlwZSkgKGludCwgaW50ICopOwogIHZvaWQgKCpwdHJfcHRocmVhZF9kb19leGl0KSAodm9pZCAqcmV0dmFsLCBjaGFyICpjdXJyZW50ZnJhbWUpOwogIHZvaWQgKCpwdHJfcHRocmVhZF9jbGVhbnVwX3VwdG8pIChqbXBfYnVmIHRhcmdldCwgY2hhciAqdGFyZ2V0ZnJhbWUpOwogIHB0aHJlYWRfZGVzY3IgKCpwdHJfcHRocmVhZF90aHJlYWRfc2VsZikgKHZvaWQpOwogIGludCAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9zZXQpIChpbnQga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKTsKICB2b2lkICogKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0KSAoaW50IGtleSk7CiAgdm9pZCAqKiBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcykgKGludCBrZXkpOwogIGludCAoKnB0cl9wdGhyZWFkX3NpZ2FjdGlvbikgKGludCBzaWcsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiBhY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9hY3QpOwogIGludCAoKnB0cl9wdGhyZWFkX3NpZ3dhaXQpIChjb25zdCBzaWdzZXRfdCAqc2V0LCBpbnQgKnNpZyk7CiAgaW50ICgqcHRyX3B0aHJlYWRfcmFpc2UpIChpbnQgc2lnKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0KSAocHRocmVhZF9jb25kX3QgKiwgcHRocmVhZF9tdXRleF90ICosIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKTsKICB2b2lkICgqcHRyX19wdGhyZWFkX2NsZWFudXBfcHVzaCkgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqIGJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKiBhcmcpOwogIHZvaWQgKCpwdHJfX3B0aHJlYWRfY2xlYW51cF9wb3ApIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKiBidWZmZXIsIGludCBleGVjdXRlKTsKfTsKCnN0YXRpYyBwaWRfdCAoKmxpYmNfZm9yaykodm9pZCk7CnN0YXRpYyBpbnQgKCpsaWJjX3NpZ2FjdGlvbikoaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvbGRhY3QpOwpzdGF0aWMgaW50ICooKmxpYmNfcHRocmVhZF9pbml0KSggY29uc3Qgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zICpmdW5jcyApOwoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyBsaWJjX3B0aHJlYWRfZnVuY3Rpb25zOwoKc3Ryb25nX2FsaWFzKF9fcHRocmVhZF90aHJlYWRfc2VsZiwgcHRocmVhZF90aHJlYWRfc2VsZik7CgovKiByZWRlZmluZSB0aGlzIHRvIHByZXZlbnQgbGlicHRocmVhZCBmcm9tIG92ZXJyaWRpbmcgb3VyIGZ1bmN0aW9uIHBvaW50ZXJzICovCmludCAqX19saWJjX3B0aHJlYWRfaW5pdCggY29uc3Qgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zICpmdW5jcyApCnsKICAgIHJldHVybiBsaWJjX211bHRpcGxlX3RocmVhZHM7Cn0KCnR5cGVkZWYgc3RydWN0IF93aW5lX2NsZWFudXAgewogIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopOwogIHZvaWQgKmFyZzsKfSAqd2luZV9jbGVhbnVwOwoKaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCogdGhyZWFkLCBjb25zdCBwdGhyZWFkX2F0dHJfdCogYXR0ciwgdm9pZCoKICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9jcmVhdGUgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jcmVhdGUoIHRocmVhZCwgYXR0ciwgc3RhcnRfcm91dGluZSwgYXJnICk7Cn0KCmludCBwdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2NhbmNlbCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NhbmNlbCggdGhyZWFkICk7Cn0KCmludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cikKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9qb2luICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfam9pbiggdGhyZWFkLCB2YWx1ZV9wdHIgKTsKfQoKaW50IHB0aHJlYWRfZGV0YWNoKHB0aHJlYWRfdCB0aHJlYWQpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfZGV0YWNoICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfZGV0YWNoKCB0aHJlYWQgKTsKfQoKLyogRklYTUU6IHdlIGhhdmUgbm8gZXF1aXZhbGVudHMgaW4gd2luMzIgZm9yIHRoZSBwb2xpY3lzICovCi8qIHNvIGp1c3Qga2VlcCB0aGlzIGFzIGEgc3R1YiAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgcG9saWN5KQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeVxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY29wZSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjb3BlKHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgc2NvcGUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjb3BlXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyogRklYTUU6IG5vIHdpbjMyIGVxdWl2YWxlbnQgZm9yIHNjaGVkdWxlIHBhcmFtICovCmludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbShwdGhyZWFkX2F0dHJfdCAqYXR0ciwKICAgIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW1cbiIpOwogIHJldHVybiAwOyAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgovKiBGSVhNRSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrKHB0aHJlYWRfYXR0cl90ICphdHRyLCB2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkKewogIHJldHVybiAwOyAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgppbnQgX19wdGhyZWFkX29uY2UocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpCnsKICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCB0aGVfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOwogICAgbG9uZyBvbmNlX25vdzsKCiAgICBtZW1jcHkoJm9uY2Vfbm93LCZ0aGVfb25jZSxzaXplb2Yob25jZV9ub3cpKTsKICAgIGlmIChpbnRlcmxvY2tlZF9jbXB4Y2hnKChsb25nKilvbmNlX2NvbnRyb2wsIG9uY2Vfbm93KzEsIG9uY2Vfbm93KSA9PSBvbmNlX25vdykKICAgICAgICAoKmluaXRfcm91dGluZSkoKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfb25jZSwgcHRocmVhZF9vbmNlKTsKCnZvaWQgX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCh2b2lkKQp7CiAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgKi8KfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgcHRocmVhZF9tdXRleF90IGF0Zm9ya19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Cgp0eXBlZGVmIHZvaWQgKCphdGZvcmtfaGFuZGxlcikoKTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wcmVwYXJlW01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3BhcmVudFtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19jaGlsZFtNQVhfQVRGT1JLXTsKc3RhdGljIGludCBhdGZvcmtfY291bnQ7CgppbnQgX19wdGhyZWFkX2F0Zm9yayh2b2lkICgqcHJlcGFyZSkodm9pZCksIHZvaWQgKCpwYXJlbnQpKHZvaWQpLCB2b2lkICgqY2hpbGQpKHZvaWQpKQp7CiAgICBwdGhyZWFkX211dGV4X2xvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIGFzc2VydCggYXRmb3JrX2NvdW50IDwgTUFYX0FURk9SSyApOwogICAgYXRmb3JrX3ByZXBhcmVbYXRmb3JrX2NvdW50XSA9IHByZXBhcmU7CiAgICBhdGZvcmtfcGFyZW50W2F0Zm9ya19jb3VudF0gPSBwYXJlbnQ7CiAgICBhdGZvcmtfY2hpbGRbYXRmb3JrX2NvdW50XSA9IGNoaWxkOwogICAgYXRmb3JrX2NvdW50Kys7CiAgICBwdGhyZWFkX211dGV4X3VubG9jayggJmF0Zm9ya19tdXRleCApOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9hdGZvcmssIHB0aHJlYWRfYXRmb3JrKTsKCnBpZF90IF9fZm9yayh2b2lkKQp7CiAgICBwaWRfdCBwaWQ7CiAgICBpbnQgaTsKCiAgICBpZiAoIWxpYmNfZm9yaykKICAgIHsKICAgICAgICBsaWJjX2ZvcmsgPSB3aW5lX2Rsc3ltKCBSVExEX05FWFQsICJmb3JrIiwgTlVMTCwgMCApOwogICAgICAgIGFzc2VydCggbGliY19mb3JrICk7CiAgICB9CiAgICBwdGhyZWFkX211dGV4X2xvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIC8qIHByZXBhcmUgaGFuZGxlcnMgYXJlIGNhbGxlZCBpbiByZXZlcnNlIGluc2VydGlvbiBvcmRlciAqLwogICAgZm9yIChpID0gYXRmb3JrX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIGlmIChhdGZvcmtfcHJlcGFyZVtpXSkgYXRmb3JrX3ByZXBhcmVbaV0oKTsKICAgIGlmICghKHBpZCA9IGxpYmNfZm9yaygpKSkKICAgIHsKICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoICZhdGZvcmtfbXV0ZXgsIE5VTEwgKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfY2hpbGRbaV0pIGF0Zm9ya19jaGlsZFtpXSgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgaWYgKGF0Zm9ya19wYXJlbnRbaV0pIGF0Zm9ya19wYXJlbnRbaV0oKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayggJmF0Zm9ya19tdXRleCApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQpzdHJvbmdfYWxpYXMoX19mb3JrLCBmb3JrKTsKCi8qKioqKiBNVVRFWEVTICoqKioqLwoKaW50IF9fcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKm11dGV4YXR0cikKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9pbml0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9pbml0KCBtdXRleCwgbXV0ZXhhdHRyICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9pbml0LCBwdGhyZWFkX211dGV4X2luaXQpOwoKaW50IF9fcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfbG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfbG9jayggbXV0ZXggKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2xvY2ssIHB0aHJlYWRfbXV0ZXhfbG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3RyeWxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF90cnlsb2NrKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF90cnlsb2NrKCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgcHRocmVhZF9tdXRleF90cnlsb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF91bmxvY2soIG11dGV4ICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF91bmxvY2ssIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3koIG11dGV4ICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogICAgc3RhdGljIGxvbmcga2V5Y250ID0gRklSU1RfS0VZOwogICAgKmtleSA9IGludGVybG9ja2VkX3hjaGdfYWRkKCZrZXljbnQsIDEpOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfY3JlYXRlLCBwdGhyZWFkX2tleV9jcmVhdGUpOwoKaW50IF9fcHRocmVhZF9rZXlfZGVsZXRlKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfZGVsZXRlLCBwdGhyZWFkX2tleV9kZWxldGUpOwoKaW50IF9fcHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlcikKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgZGVzY3ItPmtleV9kYXRhW2tleV0gPSBwb2ludGVyOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKWRlc2NyLT5rZXlfZGF0YVtrZXldOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfZ2V0c3BlY2lmaWMsIHB0aHJlYWRfZ2V0c3BlY2lmaWMpOwoKc3RhdGljIGludCBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQoIGludCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBkZXNjci0+dHNkX2RhdGFba2V5XSA9IHBvaW50ZXI7CiAgICByZXR1cm4gMDsKfQppbnQgKCpfX2xpYmNfaW50ZXJuYWxfdHNkX3NldCkoaW50LCBjb25zdCB2b2lkICopID0gcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0OwoKc3RhdGljIHZvaWQgKnB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCggaW50IGtleSApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKWRlc2NyLT50c2RfZGF0YVtrZXldOwp9CnZvaWQqICgqX19saWJjX2ludGVybmFsX3RzZF9nZXQpKGludCkgPSBwdGhyZWFkX2ludGVybmFsX3RzZF9nZXQ7CgpzdGF0aWMgdm9pZCAqKiBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MoIGludCBrZXkgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKiopJmRlc2NyLT50c2RfZGF0YVtrZXldOwp9CnZvaWQqKiAoKl9fbGliY19pbnRlcm5hbF90c2RfYWRkcmVzcykoaW50KSA9IHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3M7CgovKioqKiogIkVYQ0VQVElPTiIgRlJBTUVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUgPSByb3V0aW5lOwogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyA9IGFyZzsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBpZiAoZXhlY3V0ZSkgKCooKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSkpKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wdXNoKGJ1ZmZlciwgcm91dGluZSwgYXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIF9wdGhyZWFkX2NsZWFudXBfcG9wKGJ1ZmZlciwgZXhlY3V0ZSk7Cn0KCnZvaWQgX19wdGhyZWFkX2NsZWFudXBfdXB0byhqbXBfYnVmIHRhcmdldCwgY2hhciAqZnJhbWUpCnsKICAgIC8qIEZJWE1FICovCn0KCi8qKioqKiBDT05ESVRJT05TICoqKioqLwoKaW50IF9fcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqY29uZF9hdHRyKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfaW5pdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9pbml0KGNvbmQsIGNvbmRfYXR0cik7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2luaXQsIHB0aHJlYWRfY29uZF9pbml0KTsKCmludCBfX3B0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveSkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9kZXN0cm95KGNvbmQpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9kZXN0cm95LCBwdGhyZWFkX2NvbmRfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfc2lnbmFsKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX3NpZ25hbChjb25kKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfc2lnbmFsLCBwdGhyZWFkX2NvbmRfc2lnbmFsKTsKCmludCBfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF9icm9hZGNhc3QpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGNvbmQpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsIHB0aHJlYWRfY29uZF9icm9hZGNhc3QpOwoKaW50IF9fcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF93YWl0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX3dhaXQoY29uZCwgbXV0ZXgpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF93YWl0LCBwdGhyZWFkX2NvbmRfd2FpdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfdGltZWR3YWl0KGNvbmQsIG11dGV4LCBhYnN0aW1lKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0LCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KTsKCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2luaXQgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfaW5pdCggcndsb2NrLCByd2xvY2tfYXR0ciApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgcHRocmVhZF9yd2xvY2tfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19yZGxvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19yZGxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgcHRocmVhZF9yd2xvY2tfcmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja193cmxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3VubG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3VubG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrLCBwdGhyZWFkX3J3bG9ja191bmxvY2spOwoKLyoqKiogUkVBRC1XUklURSBMT0NLIEFUVFJJQlVURVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfaW5pdChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveShwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95LCBwdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSk7CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldGtpbmRfbnAoY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCAqcHJlZikKewogICpwcmVmID0gMDsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9zZXRraW5kX25wKHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgcHJlZikKewogIHJldHVybiAwOwp9CgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9zZWxmICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfc2VsZigpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfZXF1YWwgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9lcXVhbCggdGhyZWFkMSwgdGhyZWFkMiApOwp9Cgp2b2lkIF9fcHRocmVhZF9kb19leGl0KHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2V4aXQgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9leGl0KCByZXR2YWwsIGN1cnJlbnRmcmFtZSApOwp9Cgp2b2lkIF9fcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogICAgX19wdGhyZWFkX2RvX2V4aXQoIHJldHZhbCwgTlVMTCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfZXhpdCwgcHRocmVhZF9leGl0KTsKCmludCBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKGludCBzdGF0ZSwgaW50ICpvbGRzdGF0ZSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgaWYgKG9sZHN0YXRlKSAqb2xkc3RhdGUgPSBkZXNjci0+Y2FuY2VsX3N0YXRlOwogICAgZGVzY3ItPmNhbmNlbF9zdGF0ZSA9IHN0YXRlOwogICAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3NldGNhbmNlbHR5cGUoaW50IHR5cGUsIGludCAqb2xkdHlwZSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgaWYgKG9sZHR5cGUpICpvbGR0eXBlID0gZGVzY3ItPmNhbmNlbF90eXBlOwogICAgZGVzY3ItPmNhbmNlbF90eXBlID0gdHlwZTsKICAgIHJldHVybiAwOwp9CgovKioqKiogQU5USS1PVkVSUklERVMgKioqKiovCi8qIHB0aHJlYWRzIHRyaWVzIHRvIG92ZXJyaWRlIHRoZXNlLCBwb2ludCB0aGVtIGJhY2sgdG8gbGliYyAqLwoKaW50IHNpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCkKewogICAgaWYgKCFsaWJjX3NpZ2FjdGlvbikKICAgIHsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgInNpZ2FjdGlvbiIsIE5VTEwsIDAgKTsKICAgICAgICBhc3NlcnQoIGxpYmNfc2lnYWN0aW9uICk7CiAgICB9CiAgICByZXR1cm4gbGliY19zaWdhY3Rpb24oc2lnbnVtLCBhY3QsIG9sZGFjdCk7Cn0KCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewogICAgc3RhdGljIGludCBkb25lOwoKICAgIGlmICghZG9uZSkKICAgIHsKICAgICAgICBkb25lID0gMTsKICAgICAgICBsaWJjX2ZvcmsgPSB3aW5lX2Rsc3ltKCBSVExEX05FWFQsICJmb3JrIiwgTlVMTCwgMCApOwogICAgICAgIGxpYmNfc2lnYWN0aW9uID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAic2lnYWN0aW9uIiwgTlVMTCwgMCApOwogICAgICAgIGxpYmNfdXNlbG9jYWxlID0gd2luZV9kbHN5bSggUlRMRF9ERUZBVUxULCAidXNlbG9jYWxlIiwgTlVMTCwgMCApOwogICAgICAgIGxpYmNfcHRocmVhZF9pbml0ID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAiX19saWJjX3B0aHJlYWRfaW5pdCIsIE5VTEwsIDAgKTsKICAgICAgICBpZiAobGliY19wdGhyZWFkX2luaXQpIGxpYmNfbXVsdGlwbGVfdGhyZWFkcyA9IGxpYmNfcHRocmVhZF9pbml0KCAmbGliY19wdGhyZWFkX2Z1bmN0aW9ucyApOwogICAgfQp9CkRFQ0xfR0xPQkFMX0NPTlNUUlVDVE9SKGluaXQpIHsgX19wdGhyZWFkX2luaXRpYWxpemUoKTsgfQoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyBsaWJjX3B0aHJlYWRfZnVuY3Rpb25zID0KewogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2ZvcmsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2Rlc3Ryb3kgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzAgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzEgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0aW5oZXJpdHNjaGVkICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0gKi8KICAgIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtLCAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlICovCiAgICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3ksICAgICAgLyogcHRyX3B0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAqLwogICAgcHRocmVhZF9jb25kYXR0cl9pbml0LCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRhdHRyX2luaXQgKi8KICAgIF9fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCwgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICovCiAgICBfX3B0aHJlYWRfY29uZF9kZXN0cm95LCAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2Rlc3Ryb3kgKi8KICAgIF9fcHRocmVhZF9jb25kX2luaXQsICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfaW5pdCAqLwogICAgX19wdGhyZWFkX2NvbmRfc2lnbmFsLCAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9zaWduYWwgKi8KICAgIF9fcHRocmVhZF9jb25kX3dhaXQsICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfd2FpdCAqLwogICAgcHRocmVhZF9lcXVhbCwgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2VxdWFsICovCiAgICBfX3B0aHJlYWRfZXhpdCwgICAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9leGl0ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZ2V0c2NoZWRwYXJhbSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldHNjaGVkcGFyYW0gKi8KICAgIF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9kZXN0cm95ICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgICAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCAqLwogICAgX19wdGhyZWFkX211dGV4X2xvY2ssICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2xvY2sgKi8KICAgIF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF90cnlsb2NrICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrICovCiAgICBwdGhyZWFkX3NlbGYsICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2VsZiAqLwogICAgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSwgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldGNhbmNlbHN0YXRlICovCiAgICBwdGhyZWFkX3NldGNhbmNlbHR5cGUsICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0Y2FuY2VsdHlwZSAqLwogICAgX19wdGhyZWFkX2RvX2V4aXQsICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2RvX2V4aXQgKi8KICAgIF9fcHRocmVhZF9jbGVhbnVwX3VwdG8sICAgICAgICAvKiBwdHJfcHRocmVhZF9jbGVhbnVwX3VwdG8gKi8KICAgIF9fcHRocmVhZF90aHJlYWRfc2VsZiwgICAgICAgICAvKiBwdHJfcHRocmVhZF90aHJlYWRfc2VsZiAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0LCAgICAgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9zZXQgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCwgICAgICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0ICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzLCAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MgKi8KICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zaWdhY3Rpb24gKi8KICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zaWd3YWl0ICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfcmFpc2UgKi8KICAgIF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdCwgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0ICovCiAgICBfcHRocmVhZF9jbGVhbnVwX3B1c2gsICAgICAgICAgLyogcHRyX19wdGhyZWFkX2NsZWFudXBfcHVzaCAqLwogICAgX3B0aHJlYWRfY2xlYW51cF9wb3AgICAgICAgICAgIC8qIHB0cl9fcHRocmVhZF9jbGVhbnVwX3BvcCAqLwp9OwoKI2VuZGlmIC8qIF9fR0xJQkNfXyB8fCBfX0ZSRUVCU0RfXyAqLwo=