LyoKICogcHRocmVhZCBlbXVsYXRpb24gYmFzZWQgb24ga2VybmVsIHRocmVhZHMKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcjsKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c2V0am1wLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0FSUEFfTkFNRVNFUl9ICiMgaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9SRVNPTFZfSAojIGluY2x1ZGUgPHJlc29sdi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVkFMR1JJTkRfTUVNQ0hFQ0tfSAojaW5jbHVkZSA8dmFsZ3JpbmQvbWVtY2hlY2suaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU0NIRURfSAojaW5jbHVkZSA8c2NoZWQuaD4KI2VuZGlmCgojaW5jbHVkZSAid2luZS9saWJyYXJ5LmgiCiNpbmNsdWRlICJ3aW5lL3B0aHJlYWQuaCIKCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCiNkZWZpbmUgUFNUUihzdHIpIF9fQVNNX05BTUUoI3N0cikKCnN0YXRpYyBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2NhbGxiYWNrcyBmdW5jczsKCi8qIHRocmVhZCBkZXNjcmlwdG9yICovCgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KI2RlZmluZSBNQVhfVFNEICAxNgoKc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0CnsKICAgIGNoYXIgICAgICAgICAgICAgICBkdW1teVsyMDQ4XTsKICAgIGludCAgICAgICAgICAgICAgICB0aHJlYWRfZXJybm87CiAgICBpbnQgICAgICAgICAgICAgICAgdGhyZWFkX2hfZXJybm87CiAgICBpbnQgICAgICAgICAgICAgICAgY2FuY2VsX3N0YXRlOwogICAgaW50ICAgICAgICAgICAgICAgIGNhbmNlbF90eXBlOwogICAgc3RydWN0IF9fcmVzX3N0YXRlIHJlc19zdGF0ZTsKICAgIGNvbnN0IHZvaWQgICAgICAgICprZXlfZGF0YVtNQVhfS0VZU107ICAvKiBmb3Igbm9ybWFsIHB0aHJlYWQga2V5cyAqLwogICAgY29uc3Qgdm9pZCAgICAgICAgKnRzZF9kYXRhW01BWF9UU0RdOyAgIC8qIGZvciBsaWJjIGludGVybmFsIHRzZCB2YXJpYWJsZXMgKi8KfTsKCnR5cGVkZWYgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpwdGhyZWFkX2Rlc2NyOwoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCBpbml0aWFsX2Rlc2NyOwoKcHRocmVhZF9kZXNjciBfX3B0aHJlYWRfdGhyZWFkX3NlbGYodm9pZCkKewogICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjcjsKICAgIGlmICghZnVuY3MucHRyX2dldF90aHJlYWRfZGF0YSkgcmV0dXJuICZpbml0aWFsX2Rlc2NyOwogICAgZGVzY3IgPSBmdW5jcy5wdHJfZ2V0X3RocmVhZF9kYXRhKCk7CiAgICBpZiAoIWRlc2NyKSByZXR1cm4gJmluaXRpYWxfZGVzY3I7CiAgICByZXR1cm4gZGVzY3I7Cn0KCnN0YXRpYyBpbnQgKCpsaWJjX3VzZWxvY2FsZSkoaW50IHNldCk7CnN0YXRpYyBpbnQgKmxpYmNfbXVsdGlwbGVfdGhyZWFkczsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgX19lcnJub19sb2NhdGlvbi9fX2Vycm9yL19fZXJybm8vX19fZXJybm8vX190aHJfZXJybm8KICoKICogR2V0IHRoZSBwZXItdGhyZWFkIGVycm5vIGxvY2F0aW9uLgogKi8KaW50ICpfX2Vycm5vX2xvY2F0aW9uKHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbnV4ICovCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAmZGVzY3ItPnRocmVhZF9lcnJubzsKfQppbnQgKl9fZXJyb3Iodm9pZCkgICAgIHsgcmV0dXJuIF9fZXJybm9fbG9jYXRpb24oKTsgfSAgLyogRnJlZUJTRCAqLwppbnQgKl9fZXJybm8odm9pZCkgICAgIHsgcmV0dXJuIF9fZXJybm9fbG9jYXRpb24oKTsgfSAgLyogTmV0QlNEICovCmludCAqX19fZXJybm8odm9pZCkgICAgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBTb2xhcmlzICovCmludCAqX190aHJfZXJybm8odm9pZCkgeyByZXR1cm4gX19lcnJub19sb2NhdGlvbigpOyB9ICAvKiBVbml4V2FyZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBfX2hfZXJybm9fbG9jYXRpb24KICoKICogR2V0IHRoZSBwZXItdGhyZWFkIGhfZXJybm8gbG9jYXRpb24uCiAqLwppbnQgKl9faF9lcnJub19sb2NhdGlvbih2b2lkKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gJmRlc2NyLT50aHJlYWRfaF9lcnJubzsKfQoKc3RydWN0IF9fcmVzX3N0YXRlICpfX3Jlc19zdGF0ZSh2b2lkKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gJmRlc2NyLT5yZXNfc3RhdGU7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWp1bXAoIGNvbnN0IGNoYXIgKnN5bWJvbCwgdm9pZCAqZGVzdCApCnsKI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQogICAgdW5zaWduZWQgY2hhciAqYWRkciA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgc3ltYm9sLCBOVUxMLCAwICk7CgogICAgaWYgKCFhZGRyKSByZXR1cm47CgogICAgLyogd3JpdGUgYSByZWxhdGl2ZSBqdW1wIGF0IHRoZSBmdW5jdGlvbiBhZGRyZXNzICovCiAgICBtcHJvdGVjdCgodm9pZCopKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4oZ2V0cGFnZXNpemUoKS0xKSksIDUsIFBST1RfUkVBRHxQUk9UX0VYRUN8UFJPVF9XUklURSk7CiAgICBhZGRyWzBdID0gMHhlOTsKICAgICooaW50ICopKGFkZHIrMSkgPSAodW5zaWduZWQgY2hhciAqKWRlc3QgLSAoYWRkciArIDUpOwogICAgbXByb3RlY3QoKHZvaWQqKSgodW5zaWduZWQgaW50KWFkZHIgJiB+KGdldHBhZ2VzaXplKCktMSkpLCA1LCBQUk9UX1JFQUR8UFJPVF9FWEVDKTsKCiMgaWZkZWYgVkFMR1JJTkRfRElTQ0FSRF9UUkFOU0xBVElPTlMKICAgIFZBTEdSSU5EX0RJU0NBUkRfVFJBTlNMQVRJT05TKCBhZGRyLCA1ICk7CiMgZW5kaWYKI2VuZGlmICAvKiBfX0dMSUJDX18gJiYgX19pMzg2X18gKi8KfQoKLyogdGVtcG9yYXJ5IHN0YWNrcyB1c2VkIG9uIHRocmVhZCBleGl0ICovCiNkZWZpbmUgVEVNUF9TVEFDS19TSVpFIDEwMjQKI2RlZmluZSBOQl9URU1QX1NUQUNLUyAgOApzdGF0aWMgY2hhciB0ZW1wX3N0YWNrc1tOQl9URU1QX1NUQUNLU11bVEVNUF9TVEFDS19TSVpFXTsKc3RhdGljIGludCBuZXh0X3RlbXBfc3RhY2s7ICAvKiBuZXh0IHRlbXAgc3RhY2sgdG8gdXNlICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGdldF90ZW1wX3N0YWNrCiAqCiAqIEdldCBhIHRlbXBvcmFyeSBzdGFjayBhZGRyZXNzIHRvIHJ1biB0aGUgdGhyZWFkIGV4aXQgY29kZSBvbi4KICovCnN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0X3RlbXBfc3RhY2sodm9pZCkKewogICAgdW5zaWduZWQgaW50IG5leHQgPSBpbnRlcmxvY2tlZF94Y2hnX2FkZCggJm5leHRfdGVtcF9zdGFjaywgMSApOwogICAgcmV0dXJuIHRlbXBfc3RhY2tzW25leHQgJSBOQl9URU1QX1NUQUNLU10gKyBURU1QX1NUQUNLX1NJWkU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGNsZWFudXBfdGhyZWFkCiAqCiAqIENsZWFudXAgdGhlIHJlbWFpbnMgb2YgYSB0aHJlYWQuIFJ1bnMgb24gYSB0ZW1wb3Jhcnkgc3RhY2suCiAqLwpzdGF0aWMgdm9pZCBjbGVhbnVwX3RocmVhZCggdm9pZCAqcHRyICkKewogICAgLyogY29weSB0aGUgaW5mbyBzdHJ1Y3R1cmUgc2luY2UgaXQgaXMgb24gdGhlIHN0YWNrIHdlIHdpbGwgZnJlZSAqLwogICAgc3RydWN0IHdpbmVfcHRocmVhZF90aHJlYWRfaW5mbyBpbmZvID0gKihzdHJ1Y3Qgd2luZV9wdGhyZWFkX3RocmVhZF9pbmZvICopcHRyOwogICAgd2luZV9sZHRfZnJlZV9mcyggaW5mby50ZWJfc2VsICk7CiAgICBpZiAoaW5mby5zdGFja19zaXplKSBtdW5tYXAoIGluZm8uc3RhY2tfYmFzZSwgaW5mby5zdGFja19zaXplICk7CiAgICBpZiAoaW5mby50ZWJfc2l6ZSkgbXVubWFwKCBpbmZvLnRlYl9iYXNlLCBpbmZvLnRlYl9zaXplICk7CiAgICBfZXhpdCggaW5mby5leGl0X3N0YXR1cyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBpbml0X3Byb2Nlc3MKICoKICogSW5pdGlhbGl6YXRpb24gZm9yIGEgbmV3bHkgY3JlYXRlZCBwcm9jZXNzLgogKi8Kc3RhdGljIHZvaWQgaW5pdF9wcm9jZXNzKCBjb25zdCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2NhbGxiYWNrcyAqY2FsbGJhY2tzLCBzaXplX3Qgc2l6ZSApCnsKICAgIG1lbWNweSggJmZ1bmNzLCBjYWxsYmFja3MsIG1pbiggc2l6ZSwgc2l6ZW9mKGZ1bmNzKSApKTsKICAgIGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEoICZpbml0aWFsX2Rlc2NyICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGluaXRfdGhyZWFkCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgdGhyZWFkLgogKi8Kc3RhdGljIHZvaWQgaW5pdF90aHJlYWQoIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gKmluZm8gKQp7CiAgICBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKmRlc2NyOwoKICAgIGlmIChmdW5jcy5wdHJfc2V0X3RocmVhZF9kYXRhKQogICAgewogICAgICAgIGRlc2NyID0gY2FsbG9jKCAxLCBzaXplb2YoKmRlc2NyKSApOwogICAgICAgIGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEoIGRlc2NyICk7CiAgICAgICAgaWYgKGxpYmNfbXVsdGlwbGVfdGhyZWFkcykgKmxpYmNfbXVsdGlwbGVfdGhyZWFkcyA9IDE7CiAgICB9CiAgICBlbHNlICAvKiBmaXJzdCB0aHJlYWQgKi8KICAgIHsKICAgICAgICBkZXNjciA9ICZpbml0aWFsX2Rlc2NyOwogICAgICAgIHdyaXRlanVtcCggIl9fZXJybm9fbG9jYXRpb24iLCBfX2Vycm5vX2xvY2F0aW9uICk7CiAgICAgICAgd3JpdGVqdW1wKCAiX19oX2Vycm5vX2xvY2F0aW9uIiwgX19oX2Vycm5vX2xvY2F0aW9uICk7CiAgICAgICAgd3JpdGVqdW1wKCAiX19yZXNfc3RhdGUiLCBfX3Jlc19zdGF0ZSApOwogICAgfQogICAgZGVzY3ItPmNhbmNlbF9zdGF0ZSA9IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRTsKICAgIGRlc2NyLT5jYW5jZWxfdHlwZSAgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgICBpZiAobGliY191c2Vsb2NhbGUpIGxpYmNfdXNlbG9jYWxlKCAtMSAvKkxDX0dMT0JBTF9MT0NBTEUqLyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBjcmVhdGVfdGhyZWFkCiAqLwpzdGF0aWMgaW50IGNyZWF0ZV90aHJlYWQoIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gKmluZm8gKQp7CiAgICBpZiAoIWluZm8tPnN0YWNrX2Jhc2UpCiAgICB7CiAgICAgICAgaW5mby0+c3RhY2tfYmFzZSA9IHdpbmVfYW5vbl9tbWFwKCBOVUxMLCBpbmZvLT5zdGFja19zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAwICk7CiAgICAgICAgaWYgKGluZm8tPnN0YWNrX2Jhc2UgPT0gKHZvaWQgKiktMSkgcmV0dXJuIC0xOwogICAgfQojaWZkZWYgSEFWRV9DTE9ORQogICAgaWYgKGNsb25lKCAoaW50ICgqKSh2b2lkICopKWluZm8tPmVudHJ5LCAoY2hhciAqKWluZm8tPnN0YWNrX2Jhc2UgKyBpbmZvLT5zdGFja19zaXplLAogICAgICAgICAgICAgICBDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBTSUdDSExELCBpbmZvICkgPCAwKQogICAgICAgIHJldHVybiAtMTsKICAgIHJldHVybiAwOwojZWxpZiBkZWZpbmVkKEhBVkVfUkZPUkspCiAgICB7CiAgICAgICAgdm9pZCAqKnNwID0gKHZvaWQgKiopKChjaGFyICopaW5mby0+c3RhY2tfYmFzZSArIGluZm8tPnN0YWNrX3NpemUpOwogICAgICAgICotLXNwID0gaW5mbzsKICAgICAgICAqLS1zcCA9IDA7CiAgICAgICAgKi0tc3AgPSBpbmZvLT5lbnRyeTsKICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKICAgICAgICAgICAgInB1c2hsICUyO1xuXHQiICAgICAgICAgICAgIC8qIGZsYWdzICovCiAgICAgICAgICAgICJwdXNobCAkMDtcblx0IiAgICAgICAgICAgICAvKiAwID8gKi8KICAgICAgICAgICAgIm1vdmwgJTEsJSVlYXg7XG5cdCIgICAgICAgIC8qIFNZU19yZm9yayAqLwogICAgICAgICAgICAiLmJ5dGUgMHg5YTsgLmxvbmcgMDsgLndvcmQgNztcblx0IiAvKiBsY2FsbCA3OjAuLi4gRnJlZUJTRCBzeXNjYWxsICovCiAgICAgICAgICAgICJjbXBsICQwLCAlJWVkeDtcblx0IgogICAgICAgICAgICAiamUgMWY7XG5cdCIKICAgICAgICAgICAgIm1vdmwgJTAsJSVlc3A7XG5cdCIgICAgICAgIC8qIGNoaWxkIC0+IG5ldyB0aHJlYWQgKi8KICAgICAgICAgICAgInJldDtcbiIKICAgICAgICAgICAgIjE6XG5cdCIgICAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCAtPiBjYWxsZXIgdGhyZWFkICovCiAgICAgICAgICAgICJhZGRsICQ4LCUlZXNwIiA6CiAgICAgICAgICAgIDogInIiIChzcCksICJyIiAoU1lTX3Jmb3JrKSwgInIiIChSRlBST0MgfCBSRk1FTSB8IFJGVEhSRUFEKQogICAgICAgICAgICA6ICJlYXgiLCAiZWR4Iik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIC0xOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBpbml0X2N1cnJlbnRfdGViCiAqCiAqIFNldCB0aGUgY3VycmVudCBURUIgZm9yIGEgbmV3IHRocmVhZC4KICovCnN0YXRpYyB2b2lkIGluaXRfY3VycmVudF90ZWIoIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gKmluZm8gKQp7CiAgICAvKiBPbiB0aGUgaTM4NiwgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGluIHRoZSAlZnMgcmVnaXN0ZXIgKi8KICAgIExEVF9FTlRSWSBmc19lbnRyeTsKCiAgICB3aW5lX2xkdF9zZXRfYmFzZSggJmZzX2VudHJ5LCBpbmZvLT50ZWJfYmFzZSApOwogICAgd2luZV9sZHRfc2V0X2xpbWl0KCAmZnNfZW50cnksIGluZm8tPnRlYl9zaXplIC0gMSApOwogICAgd2luZV9sZHRfc2V0X2ZsYWdzKCAmZnNfZW50cnksIFdJTkVfTERUX0ZMQUdTX0RBVEF8V0lORV9MRFRfRkxBR1NfMzJCSVQgKTsKICAgIHdpbmVfbGR0X2luaXRfZnMoIGluZm8tPnRlYl9zZWwsICZmc19lbnRyeSApOwoKICAgIC8qIHNldCBwaWQgYW5kIHRpZCAqLwogICAgaW5mby0+cGlkID0gZ2V0cGlkKCk7CiAgICBpbmZvLT50aWQgPSAtMTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgZ2V0X2N1cnJlbnRfdGViCiAqLwpzdGF0aWMgdm9pZCAqZ2V0X2N1cnJlbnRfdGViKHZvaWQpCnsKICAgIHZvaWQgKnJldDsKICAgIF9fYXNtX18oICIuYnl0ZSAweDY0XG5cdG1vdmwgMHgxOCwlMCIgOiAiPXIiIChyZXQpICk7CiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBleGl0X3RocmVhZAogKi8Kc3RhdGljIHZvaWQgREVDTFNQRUNfTk9SRVRVUk4gZXhpdF90aHJlYWQoIHN0cnVjdCB3aW5lX3B0aHJlYWRfdGhyZWFkX2luZm8gKmluZm8gKQp7CiAgICB3aW5lX3N3aXRjaF90b19zdGFjayggY2xlYW51cF90aHJlYWQsIGluZm8sIGdldF90ZW1wX3N0YWNrKCkgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgYWJvcnRfdGhyZWFkCiAqLwpzdGF0aWMgdm9pZCBERUNMU1BFQ19OT1JFVFVSTiBhYm9ydF90aHJlYWQoIGxvbmcgc3RhdHVzICkKewogICAgX2V4aXQoIHN0YXR1cyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBwdGhyZWFkX2Z1bmN0aW9ucwogKi8KY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgcHRocmVhZF9mdW5jdGlvbnMgPQp7CiAgICBpbml0X3Byb2Nlc3MsCiAgICBpbml0X3RocmVhZCwKICAgIGNyZWF0ZV90aHJlYWQsCiAgICBpbml0X2N1cnJlbnRfdGViLAogICAgZ2V0X2N1cnJlbnRfdGViLAogICAgZXhpdF90aHJlYWQsCiAgICBhYm9ydF90aHJlYWQsCiAgICBzaWdwcm9jbWFzawp9OwoKCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChIQVZFX1BUSFJFQURfSCkgJiYgKGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSkKCi8qIGFkYXB0IGFzIG5lY2Vzc2FyeSAoYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIGlzIHVzZWQgaW4gZ2xpYmMgc291cmNlcykgKi8KI2RlZmluZSBzdHJvbmdfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnNldCAiIFBTVFIoYWxpYXMpICIsIiBQU1RSKG9yaWcpKQoKc3RydWN0IGZvcmtfYmxvY2s7CgovKiBwdGhyZWFkIGZ1bmN0aW9ucyByZWRpcmVjdGlvbiAqLwoKc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zCnsKICBwaWRfdCAoKnB0cl9wdGhyZWFkX2ZvcmspIChzdHJ1Y3QgZm9ya19ibG9jayAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2Rlc3Ryb3kpIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzApIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzEpIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0aW5oZXJpdHNjaGVkKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNjaGVkKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0pIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKSAocHRocmVhZF9hdHRyX3QgKiwgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY29wZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KSAocHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2NvbmRhdHRyX2luaXQpIChwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9kZXN0cm95KSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2luaXQpIChwdGhyZWFkX2NvbmRfdCAqLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3NpZ25hbCkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF93YWl0KSAocHRocmVhZF9jb25kX3QgKiwgcHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2VxdWFsKSAocHRocmVhZF90LCBwdGhyZWFkX3QpOwogIHZvaWQgKCpwdHJfX19wdGhyZWFkX2V4aXQpICh2b2lkICopOwogIGludCAoKnB0cl9wdGhyZWFkX2dldHNjaGVkcGFyYW0pIChwdGhyZWFkX3QsIGludCAqLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfdCwgaW50LCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9pbml0KSAocHRocmVhZF9tdXRleF90ICosIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfbG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF90cnlsb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X3VubG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBwdGhyZWFkX3QgKCpwdHJfcHRocmVhZF9zZWxmKSAodm9pZCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUpIChpbnQsIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRjYW5jZWx0eXBlKSAoaW50LCBpbnQgKik7CiAgdm9pZCAoKnB0cl9wdGhyZWFkX2RvX2V4aXQpICh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSk7CiAgdm9pZCAoKnB0cl9wdGhyZWFkX2NsZWFudXBfdXB0bykgKGptcF9idWYgdGFyZ2V0LCBjaGFyICp0YXJnZXRmcmFtZSk7CiAgcHRocmVhZF9kZXNjciAoKnB0cl9wdGhyZWFkX3RocmVhZF9zZWxmKSAodm9pZCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCkgKGludCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIpOwogIHZvaWQgKiAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9nZXQpIChpbnQga2V5KTsKICB2b2lkICoqIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzKSAoaW50IGtleSk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2lnYWN0aW9uKSAoaW50IHNpZywgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2FjdCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2lnd2FpdCkgKGNvbnN0IHNpZ3NldF90ICpzZXQsIGludCAqc2lnKTsKICBpbnQgKCpwdHJfcHRocmVhZF9yYWlzZSkgKGludCBzaWcpOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF90aW1lZHdhaXQpIChwdGhyZWFkX2NvbmRfdCAqLCBwdGhyZWFkX211dGV4X3QgKiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICopOwogIHZvaWQgKCpwdHJfX3B0aHJlYWRfY2xlYW51cF9wdXNoKSAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICogYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqIGFyZyk7CiAgdm9pZCAoKnB0cl9fcHRocmVhZF9jbGVhbnVwX3BvcCkgKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqIGJ1ZmZlciwgaW50IGV4ZWN1dGUpOwp9OwoKc3RhdGljIHBpZF90ICgqbGliY19mb3JrKSh2b2lkKTsKc3RhdGljIGludCAoKmxpYmNfc2lnYWN0aW9uKShpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCk7CnN0YXRpYyBpbnQgKigqbGliY19wdGhyZWFkX2luaXQpKCBjb25zdCBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmNzICk7CgpzdGF0aWMgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zIGxpYmNfcHRocmVhZF9mdW5jdGlvbnM7CgpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3RocmVhZF9zZWxmLCBwdGhyZWFkX3RocmVhZF9zZWxmKTsKCi8qIHJlZGVmaW5lIHRoaXMgdG8gcHJldmVudCBsaWJwdGhyZWFkIGZyb20gb3ZlcnJpZGluZyBvdXIgZnVuY3Rpb24gcG9pbnRlcnMgKi8KaW50ICpfX2xpYmNfcHRocmVhZF9pbml0KCBjb25zdCBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmNzICkKewogICAgcmV0dXJuIGxpYmNfbXVsdGlwbGVfdGhyZWFkczsKfQoKdHlwZWRlZiBzdHJ1Y3QgX3dpbmVfY2xlYW51cCB7CiAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKik7CiAgdm9pZCAqYXJnOwp9ICp3aW5lX2NsZWFudXA7CgppbnQgcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiB0aHJlYWQsIGNvbnN0IHB0aHJlYWRfYXR0cl90KiBhdHRyLCB2b2lkKgogICAgICAgICgqc3RhcnRfcm91dGluZSkodm9pZCAqKSwgdm9pZCogYXJnKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2NyZWF0ZSApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NyZWF0ZSggdGhyZWFkLCBhdHRyLCBzdGFydF9yb3V0aW5lLCBhcmcgKTsKfQoKaW50IHB0aHJlYWRfY2FuY2VsKHB0aHJlYWRfdCB0aHJlYWQpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfY2FuY2VsICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY2FuY2VsKCB0aHJlYWQgKTsKfQoKaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkICoqdmFsdWVfcHRyKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2pvaW4gKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9qb2luKCB0aHJlYWQsIHZhbHVlX3B0ciApOwp9CgppbnQgcHRocmVhZF9kZXRhY2gocHRocmVhZF90IHRocmVhZCkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9kZXRhY2ggKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9kZXRhY2goIHRocmVhZCApOwp9CgovKiBGSVhNRTogd2UgaGF2ZSBubyBlcXVpdmFsZW50cyBpbiB3aW4zMiBmb3IgdGhlIHBvbGljeXMgKi8KLyogc28ganVzdCBrZWVwIHRoaXMgYXMgYSBzdHViICovCmludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kocHRocmVhZF9hdHRyX3QgKmF0dHIsIGludCBwb2xpY3kpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5XG4iKTsKICByZXR1cm4gMDsKfQoKLyogRklYTUU6IG5vIHdpbjMyIGVxdWl2YWxlbnQgZm9yIHNjb3BlICovCmludCBwdGhyZWFkX2F0dHJfc2V0c2NvcGUocHRocmVhZF9hdHRyX3QgKmF0dHIsIGludCBzY29wZSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NvcGVcbiIpOwogIHJldHVybiAwOyAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NoZWR1bGUgcGFyYW0gKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfYXR0cl90ICphdHRyLAogICAgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpwYXJhbSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIEZJWE1FICovCmludCBwdGhyZWFkX2F0dHJfc2V0c3RhY2socHRocmVhZF9hdHRyX3QgKmF0dHIsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQp7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCmludCBfX3B0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkKewogICAgc3RhdGljIHB0aHJlYWRfb25jZV90IHRoZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CiAgICBpbnQgb25jZV9ub3c7CgogICAgbWVtY3B5KCZvbmNlX25vdywmdGhlX29uY2Usc2l6ZW9mKG9uY2Vfbm93KSk7CiAgICBpZiAoaW50ZXJsb2NrZWRfY21weGNoZygoaW50KilvbmNlX2NvbnRyb2wsIG9uY2Vfbm93KzEsIG9uY2Vfbm93KSA9PSBvbmNlX25vdykKICAgICAgICAoKmluaXRfcm91dGluZSkoKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfb25jZSwgcHRocmVhZF9vbmNlKTsKCnZvaWQgX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCh2b2lkKQp7CiAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgKi8KfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgcHRocmVhZF9tdXRleF90IGF0Zm9ya19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Cgp0eXBlZGVmIHZvaWQgKCphdGZvcmtfaGFuZGxlcikodm9pZCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLCB2b2lkICgqcGFyZW50KSh2b2lkKSwgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgcHRocmVhZF9tdXRleF9sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfYXRmb3JrLCBwdGhyZWFkX2F0Zm9yayk7CgpwaWRfdCBfX2Zvcmsodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgaWYgKCFsaWJjX2ZvcmspCiAgICB7CiAgICAgICAgbGliY19mb3JrID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAiZm9yayIsIE5VTEwsIDAgKTsKICAgICAgICBhc3NlcnQoIGxpYmNfZm9yayApOwogICAgfQogICAgcHRocmVhZF9tdXRleF9sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoYXRmb3JrX3ByZXBhcmVbaV0pIGF0Zm9ya19wcmVwYXJlW2ldKCk7CiAgICBpZiAoIShwaWQgPSBsaWJjX2ZvcmsoKSkpCiAgICB7CiAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCAmYXRmb3JrX211dGV4LCBOVUxMICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX2NoaWxkW2ldKSBhdGZvcmtfY2hpbGRbaV0oKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfcGFyZW50W2ldKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIH0KICAgIHJldHVybiBwaWQ7Cn0Kc3Ryb25nX2FsaWFzKF9fZm9yaywgZm9yayk7CgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCggbXV0ZXgsIG11dGV4YXR0ciApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgcHRocmVhZF9tdXRleF9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2xvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2xvY2soIG11dGV4ICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9sb2NrLCBwdGhyZWFkX211dGV4X2xvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayggbXV0ZXggKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssIHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X3VubG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCBwdGhyZWFkX211dGV4X3VubG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgcHRocmVhZF9tdXRleF9kZXN0cm95KTsKCgovKioqKiogTVVURVggQVRUUklCVVRFUyAqKioqKi8KLyoganVzdCBkdW1taWVzLCBzaW5jZSBjcml0aWNhbCBzZWN0aW9ucyBhcmUgYWx3YXlzIHJlY3Vyc2l2ZSAqLwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCwgcHRocmVhZF9tdXRleGF0dHJfaW5pdCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95LCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUoY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKTsKCgovKioqKiogVEhSRUFELVNQRUNJRklDIFZBUklBQkxFUyAoS0VZUykgKioqKiovCgppbnQgX19wdGhyZWFkX2tleV9jcmVhdGUocHRocmVhZF9rZXlfdCAqa2V5LCB2b2lkICgqZGVzdHJfZnVuY3Rpb24pKHZvaWQgKikpCnsKICAgIHN0YXRpYyBpbnQga2V5Y250ID0gRklSU1RfS0VZOwogICAgKmtleSA9IGludGVybG9ja2VkX3hjaGdfYWRkKCZrZXljbnQsIDEpOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfY3JlYXRlLCBwdGhyZWFkX2tleV9jcmVhdGUpOwoKaW50IF9fcHRocmVhZF9rZXlfZGVsZXRlKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfZGVsZXRlLCBwdGhyZWFkX2tleV9kZWxldGUpOwoKaW50IF9fcHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlcikKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgZGVzY3ItPmtleV9kYXRhW2tleV0gPSBwb2ludGVyOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKWRlc2NyLT5rZXlfZGF0YVtrZXldOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfZ2V0c3BlY2lmaWMsIHB0aHJlYWRfZ2V0c3BlY2lmaWMpOwoKc3RhdGljIGludCBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQoIGludCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBkZXNjci0+dHNkX2RhdGFba2V5XSA9IHBvaW50ZXI7CiAgICByZXR1cm4gMDsKfQppbnQgKCpfX2xpYmNfaW50ZXJuYWxfdHNkX3NldCkoaW50LCBjb25zdCB2b2lkICopID0gcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0OwoKc3RhdGljIHZvaWQgKnB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCggaW50IGtleSApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKWRlc2NyLT50c2RfZGF0YVtrZXldOwp9CnZvaWQqICgqX19saWJjX2ludGVybmFsX3RzZF9nZXQpKGludCkgPSBwdGhyZWFkX2ludGVybmFsX3RzZF9nZXQ7CgpzdGF0aWMgdm9pZCAqKiBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MoIGludCBrZXkgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKiopJmRlc2NyLT50c2RfZGF0YVtrZXldOwp9CnZvaWQqKiAoKl9fbGliY19pbnRlcm5hbF90c2RfYWRkcmVzcykoaW50KSA9IHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3M7CgovKioqKiogIkVYQ0VQVElPTiIgRlJBTUVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUgPSByb3V0aW5lOwogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyA9IGFyZzsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBpZiAoZXhlY3V0ZSkgKCooKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSkpKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wdXNoKGJ1ZmZlciwgcm91dGluZSwgYXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIF9wdGhyZWFkX2NsZWFudXBfcG9wKGJ1ZmZlciwgZXhlY3V0ZSk7Cn0KCnZvaWQgX19wdGhyZWFkX2NsZWFudXBfdXB0byhqbXBfYnVmIHRhcmdldCwgY2hhciAqZnJhbWUpCnsKICAgIC8qIEZJWE1FICovCn0KCi8qKioqKiBDT05ESVRJT05TICoqKioqLwoKaW50IF9fcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqY29uZF9hdHRyKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfaW5pdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9pbml0KGNvbmQsIGNvbmRfYXR0cik7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2luaXQsIHB0aHJlYWRfY29uZF9pbml0KTsKCmludCBfX3B0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveSkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9kZXN0cm95KGNvbmQpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9kZXN0cm95LCBwdGhyZWFkX2NvbmRfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfc2lnbmFsKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX3NpZ25hbChjb25kKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfc2lnbmFsLCBwdGhyZWFkX2NvbmRfc2lnbmFsKTsKCmludCBfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF9icm9hZGNhc3QpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGNvbmQpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsIHB0aHJlYWRfY29uZF9icm9hZGNhc3QpOwoKaW50IF9fcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF93YWl0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX3dhaXQoY29uZCwgbXV0ZXgpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF93YWl0LCBwdGhyZWFkX2NvbmRfd2FpdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfdGltZWR3YWl0KGNvbmQsIG11dGV4LCBhYnN0aW1lKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0LCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KTsKCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2luaXQgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfaW5pdCggcndsb2NrLCByd2xvY2tfYXR0ciApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgcHRocmVhZF9yd2xvY2tfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19yZGxvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19yZGxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgcHRocmVhZF9yd2xvY2tfcmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja193cmxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2soIHJ3bG9jayApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3VubG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3VubG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrLCBwdGhyZWFkX3J3bG9ja191bmxvY2spOwoKLyoqKiogUkVBRC1XUklURSBMT0NLIEFUVFJJQlVURVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfaW5pdChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveShwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95LCBwdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSk7CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldGtpbmRfbnAoY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCAqcHJlZikKewogICpwcmVmID0gMDsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9zZXRraW5kX25wKHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgcHJlZikKewogIHJldHVybiAwOwp9CgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9zZWxmICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfc2VsZigpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfZXF1YWwgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9lcXVhbCggdGhyZWFkMSwgdGhyZWFkMiApOwp9Cgp2b2lkIF9fcHRocmVhZF9kb19leGl0KHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2V4aXQgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9leGl0KCByZXR2YWwsIGN1cnJlbnRmcmFtZSApOwp9Cgp2b2lkIF9fcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogICAgX19wdGhyZWFkX2RvX2V4aXQoIHJldHZhbCwgTlVMTCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfZXhpdCwgcHRocmVhZF9leGl0KTsKCmludCBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKGludCBzdGF0ZSwgaW50ICpvbGRzdGF0ZSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgaWYgKG9sZHN0YXRlKSAqb2xkc3RhdGUgPSBkZXNjci0+Y2FuY2VsX3N0YXRlOwogICAgZGVzY3ItPmNhbmNlbF9zdGF0ZSA9IHN0YXRlOwogICAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3NldGNhbmNlbHR5cGUoaW50IHR5cGUsIGludCAqb2xkdHlwZSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgaWYgKG9sZHR5cGUpICpvbGR0eXBlID0gZGVzY3ItPmNhbmNlbF90eXBlOwogICAgZGVzY3ItPmNhbmNlbF90eXBlID0gdHlwZTsKICAgIHJldHVybiAwOwp9CgovKioqKiogQU5USS1PVkVSUklERVMgKioqKiovCi8qIHB0aHJlYWRzIHRyaWVzIHRvIG92ZXJyaWRlIHRoZXNlLCBwb2ludCB0aGVtIGJhY2sgdG8gbGliYyAqLwoKaW50IHNpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCkKewogICAgaWYgKCFsaWJjX3NpZ2FjdGlvbikKICAgIHsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgInNpZ2FjdGlvbiIsIE5VTEwsIDAgKTsKICAgICAgICBhc3NlcnQoIGxpYmNfc2lnYWN0aW9uICk7CiAgICB9CiAgICByZXR1cm4gbGliY19zaWdhY3Rpb24oc2lnbnVtLCBhY3QsIG9sZGFjdCk7Cn0KCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewogICAgc3RhdGljIGludCBkb25lOwoKICAgIGlmICghZG9uZSkKICAgIHsKICAgICAgICBkb25lID0gMTsKICAgICAgICAvKiBjaGVjayBmb3IgZXhwb3J0ZWQgZXBvbGxfY3JlYXRlIHRvIGRldGVjdCBnbGliYyB2ZXJzaW9ucyB0aGF0IHdlIGNhbm5vdCBzdXBwb3J0ICovCiAgICAgICAgaWYgKHdpbmVfZGxzeW0oIFJUTERfREVGQVVMVCwgImVwb2xsX2NyZWF0ZSIsIE5VTEwsIDAgKSkKICAgICAgICB7CiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHdhcm5pbmdbXSA9CiAgICAgICAgICAgICAgICAid2luZTogZ2xpYmMgPj0gMi4zIHdpdGhvdXQgTlBUTCBvciBUTFMgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0aW9uLlxuIgogICAgICAgICAgICAgICAgIiAgICAgIEl0IHdpbGwgbW9zdCBsaWtlbHkgY3Jhc2guIFBsZWFzZSB1cGdyYWRlIHRvIGEgZ2xpYmMgd2l0aCBOUFRMIHN1cHBvcnQuXG4iOwogICAgICAgICAgICB3cml0ZSggMiwgd2FybmluZywgc2l6ZW9mKHdhcm5pbmcpLTEgKTsKICAgICAgICB9CiAgICAgICAgbGliY19mb3JrID0gd2luZV9kbHN5bSggUlRMRF9ORVhULCAiZm9yayIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgInNpZ2FjdGlvbiIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3VzZWxvY2FsZSA9IHdpbmVfZGxzeW0oIFJUTERfREVGQVVMVCwgInVzZWxvY2FsZSIsIE5VTEwsIDAgKTsKICAgICAgICBsaWJjX3B0aHJlYWRfaW5pdCA9IHdpbmVfZGxzeW0oIFJUTERfTkVYVCwgIl9fbGliY19wdGhyZWFkX2luaXQiLCBOVUxMLCAwICk7CiAgICAgICAgaWYgKGxpYmNfcHRocmVhZF9pbml0KSBsaWJjX211bHRpcGxlX3RocmVhZHMgPSBsaWJjX3B0aHJlYWRfaW5pdCggJmxpYmNfcHRocmVhZF9mdW5jdGlvbnMgKTsKICAgIH0KfQoKI2lmZGVmIF9fR05VQ19fCnN0YXRpYyB2b2lkIGluaXQodm9pZCkgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKTsKc3RhdGljIHZvaWQgaW5pdCh2b2lkKQp7CiAgICBfX3B0aHJlYWRfaW5pdGlhbGl6ZSgpOwp9CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyBsaWJjX3B0aHJlYWRfZnVuY3Rpb25zID0KewogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2ZvcmsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2Rlc3Ryb3kgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzAgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzEgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0aW5oZXJpdHNjaGVkICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0gKi8KICAgIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtLCAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlICovCiAgICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3ksICAgICAgLyogcHRyX3B0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAqLwogICAgcHRocmVhZF9jb25kYXR0cl9pbml0LCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRhdHRyX2luaXQgKi8KICAgIF9fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCwgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICovCiAgICBfX3B0aHJlYWRfY29uZF9kZXN0cm95LCAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2Rlc3Ryb3kgKi8KICAgIF9fcHRocmVhZF9jb25kX2luaXQsICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfaW5pdCAqLwogICAgX19wdGhyZWFkX2NvbmRfc2lnbmFsLCAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9zaWduYWwgKi8KICAgIF9fcHRocmVhZF9jb25kX3dhaXQsICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfd2FpdCAqLwogICAgcHRocmVhZF9lcXVhbCwgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2VxdWFsICovCiAgICBfX3B0aHJlYWRfZXhpdCwgICAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9leGl0ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZ2V0c2NoZWRwYXJhbSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldHNjaGVkcGFyYW0gKi8KICAgIF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9kZXN0cm95ICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgICAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCAqLwogICAgX19wdGhyZWFkX211dGV4X2xvY2ssICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2xvY2sgKi8KICAgIF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF90cnlsb2NrICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrICovCiAgICBwdGhyZWFkX3NlbGYsICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2VsZiAqLwogICAgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSwgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldGNhbmNlbHN0YXRlICovCiAgICBwdGhyZWFkX3NldGNhbmNlbHR5cGUsICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0Y2FuY2VsdHlwZSAqLwogICAgX19wdGhyZWFkX2RvX2V4aXQsICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2RvX2V4aXQgKi8KICAgIF9fcHRocmVhZF9jbGVhbnVwX3VwdG8sICAgICAgICAvKiBwdHJfcHRocmVhZF9jbGVhbnVwX3VwdG8gKi8KICAgIF9fcHRocmVhZF90aHJlYWRfc2VsZiwgICAgICAgICAvKiBwdHJfcHRocmVhZF90aHJlYWRfc2VsZiAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0LCAgICAgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9zZXQgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCwgICAgICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0ICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzLCAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MgKi8KICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zaWdhY3Rpb24gKi8KICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zaWd3YWl0ICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfcmFpc2UgKi8KICAgIF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdCwgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0ICovCiAgICBfcHRocmVhZF9jbGVhbnVwX3B1c2gsICAgICAgICAgLyogcHRyX19wdGhyZWFkX2NsZWFudXBfcHVzaCAqLwogICAgX3B0aHJlYWRfY2xlYW51cF9wb3AgICAgICAgICAgIC8qIHB0cl9fcHRocmVhZF9jbGVhbnVwX3BvcCAqLwp9OwoKI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9IICYmIChfX0dMSUJDX18gfHwgX19GUkVFQlNEX18pICovCg==