LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnRzIHB0aHJlYWRzIHVzZSBXaW5lJ3Mgb3duIHRocmVhZGluZyBpbnN0ZWFkLi4uCiAqCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgInRocmVhZC5oIgoKLyogQ3VycmVudGx5IHRoaXMgcHJvYmFibHkgd29ya3Mgb25seSBmb3IgZ2xpYmMyLAogKiB3aGljaCBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBkb3VibGUtdW5kZXJzY29yZS1wcmVwZW5kZWQKICogcHRocmVhZCBwcmltaXRpdmVzLCBhbmQgdXNlIHRoZW0gaWYgYXZhaWxhYmxlLgogKiBJZiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgbGliYyBkZWZhdWx0cyB0bwogKiBub24tdGhyZWFkc2FmZSBvcGVyYXRpb24gKG5vdCBnb29kKS4gKi8KCiNpZiBkZWZpbmVkKF9fR0xJQkNfXykKI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgoKI2lmZGVmIE5FRURfVU5ERVJTQ09SRV9QUkVGSVgKIyBkZWZpbmUgUFJFRklYICJfIgojZWxzZQojIGRlZmluZSBQUkVGSVgKI2VuZGlmCgojZGVmaW5lIFBTVFIoc3RyKSBQUkVGSVggI3N0cgoKLyogYWRhcHQgYXMgbmVjZXNzYXJ5IChhIGNvbnN0cnVjdCBsaWtlIHRoaXMgaXMgdXNlZCBpbiBnbGliYyBzb3VyY2VzKSAqLwojZGVmaW5lIHN0cm9uZ19hbGlhcyhvcmlnLCBhbGlhcykgXAogYXNtKCIuZ2xvYmwgIiBQU1RSKGFsaWFzKSAiXG4iIFwKICAgICAiXHQuc2V0ICIgUFNUUihhbGlhcykgIiwiIFBTVFIob3JpZykpCgovKiBzdHJvbmdfYWxpYXMgZG9lcyBub3Qgd29yayBvbiBleHRlcm5hbCBzeW1ib2xzICgubyBmb3JtYXQgbGltaXRhdGlvbj8pLAogKiBzbyBmb3IgdGhvc2UsIHdlIG5lZWQgdG8gdXNlIHRoZSBwb2dvIHN0aWNrICovCiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX1BJQ19fKQovKiBGSVhNRTogUElDICovCiNkZWZpbmUganVtcF9hbGlhcyhvcmlnLCBhbGlhcykgXAogYXNtKCIuZ2xvYmwgIiBQU1RSKGFsaWFzKSAiXG4iIFwKICAgICAiXHQudHlwZSAiIFBTVFIoYWxpYXMpICIsQGZ1bmN0aW9uXG4iIFwKICAgICBQU1RSKGFsaWFzKSAiOlxuIiBcCiAgICAgIlx0am1wICIgUFNUUihvcmlnKSkKI2VuZGlmCgovKiBnZXQgbmVjZXNzYXJ5IGxpYmMgc3ltYm9scyAqLwojaWYgKF9fR0xJQkNfXyA9PSAyKSAmJiAoX19HTElCQ19NSU5PUl9fID49IDEpICYmIGRlZmluZWQoSEFWRV9fX0xJQkNfRk9SSykKI2RlZmluZSBMSUJDX0ZPUksgX19saWJjX2ZvcmsKI2RlZmluZSBQVEhSRUFEX0ZPUksgX19mb3JrCiNkZWZpbmUgQUxJQVNfRk9SSwojZWxzZQojZGVmaW5lIExJQkNfRk9SSyBfX2ZvcmsKI2RlZmluZSBQVEhSRUFEX0ZPUksgZm9yawojZW5kaWYKZXh0ZXJuIHBpZF90IExJQkNfRk9SSyh2b2lkKTsKCiNkZWZpbmUgTElCQ19TSUdBQ1RJT04gX19zaWdhY3Rpb24KCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpICovCnR5cGVkZWYgc3RydWN0IHsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCnR5cGVkZWYgc3RydWN0IF93aW5lX2NsZWFudXAgewogIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopOwogIHZvaWQgKmFyZzsKfSAqd2luZV9jbGVhbnVwOwoKdHlwZWRlZiBjb25zdCB2b2lkICprZXlfZGF0YTsKCiNkZWZpbmUgRklSU1RfS0VZIDAKI2RlZmluZSBNQVhfS0VZUyAxNiAvKiBsaWJjNiBkb2Vzbid0IHVzZSB0aGF0IG1hbnksIGJ1dC4uLiAqLwoKI2RlZmluZSBQX09VVFBVVChzdHVmZikgd3JpdGUoMixzdHVmZixzdHJsZW4oc3R1ZmYpKQoKdm9pZCBfX3B0aHJlYWRfaW5pdGlhbGl6ZSh2b2lkKQp7Cn0KCmludCBfX3B0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkKewogIHN0YXRpYyBwdGhyZWFkX29uY2VfdCB0aGVfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOwogIExPTkcgb25jZV9ub3cgPSAqKExPTkcgKikmdGhlX29uY2U7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgoUFZPSUQqKW9uY2VfY29udHJvbCwgKFBWT0lEKShvbmNlX25vdysxKSwgKFBWT0lEKW9uY2Vfbm93KSA9PSAoUFZPSUQpb25jZV9ub3cpCiAgICAoKmluaXRfcm91dGluZSkoKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX29uY2UsIHB0aHJlYWRfb25jZSk7Cgp2b2lkIF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAodm9pZCkKewogIC8qIEZJWE1FOiB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIHByZXBhcmF0aW9uIGZvciBleGVjKCkgKi8KICBpZiAoU3lzdGVtSGVhcCkgUF9PVVRQVVQoImZpeG1lOnB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wXG4iKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBhdGZvcmtfc2VjdGlvbiA9IENSSVRJQ0FMX1NFQ1RJT05fSU5JVDsKdHlwZWRlZiB2b2lkICgqYXRmb3JrX2hhbmRsZXIpKCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLAoJCSAgICAgdm9pZCAoKnBhcmVudCkodm9pZCksCgkJICAgICB2b2lkICgqY2hpbGQpKHZvaWQpKQp7CiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9hdGZvcmssIHB0aHJlYWRfYXRmb3JrKTsKCnBpZF90IFBUSFJFQURfRk9SSyh2b2lkKQp7CiAgICBwaWRfdCBwaWQ7CiAgICBpbnQgaTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBhdGZvcmtfcHJlcGFyZVtpXSgpOwogICAgaWYgKCEocGlkID0gTElCQ19GT1JLKCkpKQogICAgewogICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgYXRmb3JrX2NoaWxkW2ldKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQojaWZkZWYgQUxJQVNfRk9SSwpzdHJvbmdfYWxpYXMoUFRIUkVBRF9GT1JLLCBmb3JrKTsKI2VuZGlmCgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9pbml0LCBwdGhyZWFkX211dGV4X2luaXQpOwoKc3RhdGljIHZvaWQgbXV0ZXhfcmVhbF9pbml0KCBwdGhyZWFkX211dGV4X3QgKm11dGV4ICkKewogIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXRzZWN0ID0gSGVhcEFsbG9jKFN5c3RlbUhlYXAsIDAsIHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CiAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgoUFZPSUQqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIGNyaXRzZWN0KTsKICB9Cn0KCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFTeXN0ZW1IZWFwKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfbG9jaywgcHRocmVhZF9tdXRleF9sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFTeXN0ZW1IZWFwKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgcHRocmVhZF9tdXRleF90cnlsb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF91bmxvY2ssIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgaWYgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkgewojaWYgMCAvKiB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJjNiB0aGF0IG1ha2VzIHRoaXMgYSBiYWQgaWRlYSAqLwogICAgcmV0dXJuIEVCVVNZOwojZWxzZQogICAgd2hpbGUgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkKICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwojZW5kaWYKICB9CiAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogIHN0YXRpYyBMT05HIGtleWNudCA9IEZJUlNUX0tFWTsKICAqa2V5ID0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgma2V5Y250LCAxKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSB7CiAgICB0ZWItPnB0aHJlYWRfZGF0YSA9IGNhbGxvYyhNQVhfS0VZUyxzaXplb2Yoa2V5X2RhdGEpKTsKICB9CiAgKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSA9IHBvaW50ZXI7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOwogIGlmICghdGViKSByZXR1cm4gTlVMTDsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSByZXR1cm4gTlVMTDsKICByZXR1cm4gKHZvaWQgKikoKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgoKLyoqKioqICJFWENFUFRJT04iIEZSQU1FUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2goc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lID0gcm91dGluZTsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcgPSBhcmc7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3Aoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgaWYgKGV4ZWN1dGUpICgqKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUpKSgoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcihzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogIF9wdGhyZWFkX2NsZWFudXBfcHVzaChidWZmZXIsIHJvdXRpbmUsIGFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZShzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBfcHRocmVhZF9jbGVhbnVwX3BvcChidWZmZXIsIGV4ZWN1dGUpOwp9CgoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Rlc3Ryb3lcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfc2lnbmFsXG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Jyb2FkY2FzdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogIHJldHVybiAocHRocmVhZF90KUdldEN1cnJlbnRUaHJlYWRJZCgpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICByZXR1cm4gKERXT1JEKXRocmVhZDEgPT0gKERXT1JEKXRocmVhZDI7Cn0KCnZvaWQgcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogIC8qIEZJWE1FOiBwdGhyZWFkIGNsZWFudXAgKi8KICBFeGl0VGhyZWFkKChEV09SRClyZXR2YWwpOwp9CgppbnQgcHRocmVhZF9zZXRjYW5jZWx0eXBlKGludCB0eXBlLCBpbnQgKm9sZHR5cGUpCnsKICBpZiAob2xkdHlwZSkgKm9sZHR5cGUgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBBTlRJLU9WRVJSSURFUyAqKioqKi8KLyogcHRocmVhZHMgdHJpZXMgdG8gb3ZlcnJpZGUgdGhlc2UsIHBvaW50IHRoZW0gYmFjayB0byBsaWJjICovCgojaWZkZWYganVtcF9hbGlhcwpqdW1wX2FsaWFzKExJQkNfU0lHQUNUSU9OLCBzaWdhY3Rpb24pOwojZWxzZQppbnQgc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KQp7CiAgcmV0dXJuIExJQkNfU0lHQUNUSU9OKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CiNlbmRpZgoKI2VuZGlmIC8qIF9fR0xJQkNfXyAqLwo=