LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnRzIHB0aHJlYWRzIHVzZSBXaW5lJ3Mgb3duIHRocmVhZGluZyBpbnN0ZWFkLi4uCiAqCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInRocmVhZC5oIgoKc3RhdGljIGludCBpbml0X2RvbmU7Cgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKICAgIGluaXRfZG9uZSA9IDE7Cn0KCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChfX0dMSUJDX18pCiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCiNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCiMgZGVmaW5lIFBSRUZJWCAiXyIKI2Vsc2UKIyBkZWZpbmUgUFJFRklYCiNlbmRpZgoKI2RlZmluZSBQU1RSKHN0cikgUFJFRklYICNzdHIKCi8qIGFkYXB0IGFzIG5lY2Vzc2FyeSAoYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIGlzIHVzZWQgaW4gZ2xpYmMgc291cmNlcykgKi8KI2RlZmluZSBzdHJvbmdfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnNldCAiIFBTVFIoYWxpYXMpICIsIiBQU1RSKG9yaWcpKQoKLyogc3Ryb25nX2FsaWFzIGRvZXMgbm90IHdvcmsgb24gZXh0ZXJuYWwgc3ltYm9scyAoLm8gZm9ybWF0IGxpbWl0YXRpb24/KSwKICogc28gZm9yIHRob3NlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgcG9nbyBzdGljayAqLwojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19QSUNfXykKLyogRklYTUU6IFBJQyAqLwojZGVmaW5lIGp1bXBfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnR5cGUgIiBQU1RSKGFsaWFzKSAiLEBmdW5jdGlvblxuIiBcCiAgICAgUFNUUihhbGlhcykgIjpcbiIgXAogICAgICJcdGptcCAiIFBTVFIob3JpZykpCiNlbmRpZgoKLyogZ2V0IG5lY2Vzc2FyeSBsaWJjIHN5bWJvbHMgKi8KI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAxKSAmJiBkZWZpbmVkKEhBVkVfX19MSUJDX0ZPUkspCiNkZWZpbmUgTElCQ19GT1JLIF9fbGliY19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIF9fZm9yawojZGVmaW5lIEFMSUFTX0ZPUksKI2Vsc2UKI2RlZmluZSBMSUJDX0ZPUksgX19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIGZvcmsKI2VuZGlmCmV4dGVybiBwaWRfdCBMSUJDX0ZPUksodm9pZCk7CgojZGVmaW5lIExJQkNfU0lHQUNUSU9OIF9fc2lnYWN0aW9uCgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KSAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCnR5cGVkZWYgY29uc3Qgdm9pZCAqa2V5X2RhdGE7CgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewp9CgppbnQgX19wdGhyZWFkX29uY2UocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpCnsKICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICBMT05HIG9uY2Vfbm93ID0gKihMT05HICopJnRoZV9vbmNlOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKW9uY2VfY29udHJvbCwgb25jZV9ub3crMSwgb25jZV9ub3cpID09IG9uY2Vfbm93KQogICAgKCppbml0X3JvdXRpbmUpKCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9vbmNlLCBwdGhyZWFkX29uY2UpOwoKdm9pZCBfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKHZvaWQpCnsKICAvKiBGSVhNRTogdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBwcmVwYXJhdGlvbiBmb3IgZXhlYygpICovCiAgaWYgKGluaXRfZG9uZSkgUF9PVVRQVVQoImZpeG1lOnB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wXG4iKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBhdGZvcmtfc2VjdGlvbiA9IENSSVRJQ0FMX1NFQ1RJT05fSU5JVCgiYXRmb3JrX3NlY3Rpb24iKTsKdHlwZWRlZiB2b2lkICgqYXRmb3JrX2hhbmRsZXIpKCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLAoJCSAgICAgdm9pZCAoKnBhcmVudCkodm9pZCksCgkJICAgICB2b2lkICgqY2hpbGQpKHZvaWQpKQp7CiAgICBpZiAoaW5pdF9kb25lKSBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgaWYgKGluaXRfZG9uZSkgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9hdGZvcmssIHB0aHJlYWRfYXRmb3JrKTsKCnBpZF90IFBUSFJFQURfRk9SSyh2b2lkKQp7CiAgICBwaWRfdCBwaWQ7CiAgICBpbnQgaTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBhdGZvcmtfcHJlcGFyZVtpXSgpOwogICAgaWYgKCEocGlkID0gTElCQ19GT1JLKCkpKQogICAgewogICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgYXRmb3JrX2NoaWxkW2ldKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQojaWZkZWYgQUxJQVNfRk9SSwpzdHJvbmdfYWxpYXMoUFRIUkVBRF9GT1JLLCBmb3JrKTsKI2VuZGlmCgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9pbml0LCBwdGhyZWFkX211dGV4X2luaXQpOwoKc3RhdGljIHZvaWQgbXV0ZXhfcmVhbF9pbml0KCBwdGhyZWFkX211dGV4X3QgKm11dGV4ICkKewogIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXRzZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CiAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoKHZvaWQqKikmKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSxjcml0c2VjdCxOVUxMKSAhPSBOVUxMKSB7CiAgICAvKiB0b28gbGF0ZSwgc29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBkaWQgaXQgKi8KICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcml0c2VjdCk7CiAgfQp9CgppbnQgX19wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfbG9jaywgcHRocmVhZF9tdXRleF9sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIAogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBpZiAoIVRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCBwdGhyZWFkX211dGV4X3RyeWxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIHJldHVybiAwOwogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3VubG9jaywgcHRocmVhZF9tdXRleF91bmxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBpZiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KSB7CiNpZiAwIC8qIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIGxpYmM2IHRoYXQgbWFrZXMgdGhpcyBhIGJhZCBpZGVhICovCiAgICByZXR1cm4gRUJVU1k7CiNlbHNlCiAgICB3aGlsZSAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KQogICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiNlbmRpZgogIH0KICBEZWxldGVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSk7CgoKLyoqKioqIE1VVEVYIEFUVFJJQlVURVMgKioqKiovCi8qIGp1c3QgZHVtbWllcywgc2luY2UgY3JpdGljYWwgc2VjdGlvbnMgYXJlIGFsd2F5cyByZWN1cnNpdmUgKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQsIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSwgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlA7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlA7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSk7CgoKLyoqKioqIFRIUkVBRC1TUEVDSUZJQyBWQVJJQUJMRVMgKEtFWVMpICoqKioqLwoKaW50IF9fcHRocmVhZF9rZXlfY3JlYXRlKHB0aHJlYWRfa2V5X3QgKmtleSwgdm9pZCAoKmRlc3RyX2Z1bmN0aW9uKSh2b2lkICopKQp7CiAgc3RhdGljIExPTkcga2V5Y250ID0gRklSU1RfS0VZOwogICprZXkgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZrZXljbnQsIDEpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2NyZWF0ZSwgcHRocmVhZF9rZXlfY3JlYXRlKTsKCmludCBfX3B0aHJlYWRfa2V5X2RlbGV0ZShwdGhyZWFkX2tleV90IGtleSkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2V5X2RlbGV0ZSwgcHRocmVhZF9rZXlfZGVsZXRlKTsKCmludCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIpCnsKICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOwogIGlmICghdGViLT5wdGhyZWFkX2RhdGEpIHsKICAgIHRlYi0+cHRocmVhZF9kYXRhID0gY2FsbG9jKE1BWF9LRVlTLHNpemVvZihrZXlfZGF0YSkpOwogIH0KICAoKGtleV9kYXRhKikodGViLT5wdGhyZWFkX2RhdGEpKVtrZXldID0gcG9pbnRlcjsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3NldHNwZWNpZmljLCBwdGhyZWFkX3NldHNwZWNpZmljKTsKCnZvaWQgKl9fcHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSkKewogIFRFQiAqdGViID0gTnRDdXJyZW50VGViKCk7CiAgaWYgKCF0ZWIpIHJldHVybiBOVUxMOwogIGlmICghdGViLT5wdGhyZWFkX2RhdGEpIHJldHVybiBOVUxMOwogIHJldHVybiAodm9pZCAqKSgoKGtleV9kYXRhKikodGViLT5wdGhyZWFkX2RhdGEpKVtrZXldKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2dldHNwZWNpZmljLCBwdGhyZWFkX2dldHNwZWNpZmljKTsKCgovKioqKiogIkVYQ0VQVElPTiIgRlJBTUVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUgPSByb3V0aW5lOwogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyA9IGFyZzsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBpZiAoZXhlY3V0ZSkgKCooKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSkpKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wdXNoKGJ1ZmZlciwgcm91dGluZSwgYXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIF9wdGhyZWFkX2NsZWFudXBfcG9wKGJ1ZmZlciwgZXhlY3V0ZSk7Cn0KCgovKioqKiogQ09ORElUSU9OUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKmNvbmRfYXR0cikKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfaW5pdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfZGVzdHJveVxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9zaWduYWxcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX2Jyb2FkY2FzdChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfYnJvYWRjYXN0XG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF93YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF93YWl0XG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF90aW1lZHdhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWJzdGltZSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfdGltZWR3YWl0XG4iKTsKICByZXR1cm4gMDsKfQoKLyoqKiogQ09ORElUSU9OIEFUVFJJQlVURVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRhdHRyX2luaXQocHRocmVhZF9jb25kYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kocHRocmVhZF9jb25kYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCiNpZiAoX19HTElCQ19fID09IDIpICYmIChfX0dMSUJDX01JTk9SX18gPj0gMikKLyoqKioqIFJFQUQtV1JJVEUgTE9DS1MgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9yd2xvY2tfaW5pdFxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgcHRocmVhZF9yd2xvY2tfaW5pdCk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX3J3bG9ja19kZXN0cm95XG4iKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19kZXN0cm95LCBwdGhyZWFkX3J3bG9ja19kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3JkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9yd2xvY2tfcmRsb2NrXG4iKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssIHB0aHJlYWRfcndsb2NrX3JkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfcndsb2NrX3RyeXJkbG9ja1xuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrLCBwdGhyZWFkX3J3bG9ja190cnlyZGxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX3dybG9ja19yZGxvY2tcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrXG4iKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXdybG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja191bmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfcndsb2NrX3VubG9ja1xuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrLCBwdGhyZWFkX3J3bG9ja191bmxvY2spOwoKLyoqKiogUkVBRC1XUklURSBMT0NLIEFUVFJJQlVURVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfaW5pdChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveShwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95LCBwdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSk7CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldGtpbmRfbnAoY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCAqcHJlZikKewogICpwcmVmID0gMDsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9zZXRraW5kX25wKHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgcHJlZikKewogIHJldHVybiAwOwp9CiNlbmRpZiAvKiBnbGliYyAyLjIgKi8KCi8qKioqKiBNSVNDICoqKioqLwoKcHRocmVhZF90IHB0aHJlYWRfc2VsZih2b2lkKQp7CiAgcmV0dXJuIChwdGhyZWFkX3QpR2V0Q3VycmVudFRocmVhZElkKCk7Cn0KCmludCBwdGhyZWFkX2VxdWFsKHB0aHJlYWRfdCB0aHJlYWQxLCBwdGhyZWFkX3QgdGhyZWFkMikKewogIHJldHVybiAoRFdPUkQpdGhyZWFkMSA9PSAoRFdPUkQpdGhyZWFkMjsKfQoKdm9pZCBwdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsKQp7CiAgLyogRklYTUU6IHB0aHJlYWQgY2xlYW51cCAqLwogIEV4aXRUaHJlYWQoKERXT1JEKXJldHZhbCk7Cn0KCmludCBwdGhyZWFkX3NldGNhbmNlbHR5cGUoaW50IHR5cGUsIGludCAqb2xkdHlwZSkKewogIGlmIChvbGR0eXBlKSAqb2xkdHlwZSA9IFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUzsKICByZXR1cm4gMDsKfQoKLyoqKioqIEFOVEktT1ZFUlJJREVTICoqKioqLwovKiBwdGhyZWFkcyB0cmllcyB0byBvdmVycmlkZSB0aGVzZSwgcG9pbnQgdGhlbSBiYWNrIHRvIGxpYmMgKi8KCiNpZmRlZiBqdW1wX2FsaWFzCmp1bXBfYWxpYXMoTElCQ19TSUdBQ1RJT04sIHNpZ2FjdGlvbik7CiNlbHNlCmludCBzaWdhY3Rpb24oaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvbGRhY3QpCnsKICByZXR1cm4gTElCQ19TSUdBQ1RJT04oc2lnbnVtLCBhY3QsIG9sZGFjdCk7Cn0KI2VuZGlmCgojZW5kaWYgLyogX19HTElCQ19fICovCg==