LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKLyogV2luZG93cyBtYXBzIENPSU5JVCB2YWx1ZXMgdG8gMHg4MCBmb3IgYXBhcnRtZW50IHRocmVhZGVkLCAweDE0MAogKiBmb3IgZnJlZSB0aHJlYWRlZCwgYW5kIDAgZm9yIHVuaW5pdGlhbGl6ZWQgYXBhcnRtZW50cy4gVGhlcmUgaXMKICogbm8gcmVhbCBhZHZhbnRhZ2UgaW4gdXMgZG9pbmcgdGhpcyBhbmQgY2VydGFpbmx5IG5vIHJlbGVhc2UgdmVyc2lvbgogKiBvZiBhbiBhcHAgc2hvdWxkIGJlIHBva2luZyBhcm91bmQgd2l0aCB0aGVzZSBmbGFncy4gU28gd2UgbmVlZCBhCiAqIHNwZWNpYWwgdmFsdWUgZm9yIHVuaW5pdGlhbGl6ZWQgKi8KI2RlZmluZSBDT0lOSVRfVU5JTklUSUFMSVpFRCAweDEwMAoKLyogZXhwb3J0ZWQgaW50ZXJmYWNlICovCnR5cGVkZWYgc3RydWN0IHRhZ1hJRiB7CiAgc3RydWN0IHRhZ1hJRiAqbmV4dDsKICBMUFZPSUQgaWZhY2U7ICAgICAgICAgICAgLyogaW50ZXJmYWNlIHBvaW50ZXIgKi8KICBJSUQgaWlkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIElEICovCiAgSVBJRCBpcGlkOyAgICAgICAgICAgICAgIC8qIGV4cG9ydGVkIGludGVyZmFjZSBJRCAqLwogIExQUlBDU1RVQkJVRkZFUiBzdHViOyAgICAvKiBpbnRlcmZhY2Ugc3R1YiAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBleHRlcm5hbCByZWZlcmVuY2UgY291bnQgKi8KICBIUkVTVUxUIGhyZXM7ICAgICAgICAgICAgLyogcmVzdWx0IG9mIHN0dWIgY3JlYXRpb24gYXR0ZW1wdCAqLwp9IFhJRjsKCi8qIGV4cG9ydGVkIG9iamVjdCAqLwp0eXBlZGVmIHN0cnVjdCB0YWdYT0JKRUNUIHsKICBJUnBjU3R1YkJ1ZmZlclZ0YmwgKmxwVnRibDsKICBzdHJ1Y3QgdGFnQVBBUlRNRU5UICpwYXJlbnQ7CiAgc3RydWN0IHRhZ1hPQkpFQ1QgKm5leHQ7CiAgTFBVTktOT1dOIG9iajsgICAgICAgICAgIC8qIG9iamVjdCBpZGVudGl0eSAoSVVua25vd24pICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCAqLwogIERXT1JEIGlmYzsgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgSUQgY291bnRlciAqLwogIFhJRiAqaWZhY2VzOyAgICAgICAgICAgICAvKiBleHBvcnRlZCBpbnRlcmZhY2VzICovCiAgRFdPUkQgcmVmczsgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHJlZmVyZW5jZSBjb3VudCAqLwp9IFhPQkpFQ1Q7CgovKiBpbXBvcnRlZCBpbnRlcmZhY2UgKi8KdHlwZWRlZiBzdHJ1Y3QgdGFnSUlGIHsKICBzdHJ1Y3QgdGFnSUlGICpuZXh0OwogIExQVk9JRCBpZmFjZTsgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciAqLwogIElJRCBpaWQ7ICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgSUQgKi8KICBJUElEIGlwaWQ7ICAgICAgICAgICAgICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlIElEICovCiAgTFBSUENQUk9YWUJVRkZFUiBwcm94eTsgIC8qIGludGVyZmFjZSBwcm94eSAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBpbXBvcnRlZCAocHVibGljKSByZWZlcmVuY2VzICovCiAgSFJFU1VMVCBocmVzOyAgICAgICAgICAgIC8qIHJlc3VsdCBvZiBwcm94eSBjcmVhdGlvbiBhdHRlbXB0ICovCn0gSUlGOwoKLyogaW1wb3J0ZWQgb2JqZWN0ICovCnR5cGVkZWYgc3RydWN0IHRhZ0lPQkpFQ1QgewogIElSZW1Vbmtub3duVnRibCAqbHBWdGJsOwogIHN0cnVjdCB0YWdBUEFSVE1FTlQgKnBhcmVudDsKICBzdHJ1Y3QgdGFnSU9CSkVDVCAqbmV4dDsKICBMUFJQQ0NIQU5ORUxCVUZGRVIgY2hhbjsgLyogY2hhbm5lbCB0byBvYmplY3QgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVkIElEICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCAqLwogIElQSUQgaXBpZDsgICAgICAgICAgICAgICAvKiBmaXJzdCBpbXBvcnRlZCBpbnRlcmZhY2UgSUQgKi8KICBJSUYgKmlmYWNlczsgICAgICAgICAgICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlcyAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBwcm94eSByZWZlcmVuY2UgY291bnQgKi8KfSBJT0JKRUNUOwoKLyogYXBhcnRtZW50ICovCnR5cGVkZWYgc3RydWN0IHRhZ0FQQVJUTUVOVCB7CiAgc3RydWN0IHRhZ0FQQVJUTUVOVCAqbmV4dCwgKnByZXYsICpwYXJlbnQ7CiAgRFdPUkQgbW9kZWw7ICAgICAgICAgICAgIC8qIHRocmVhZGluZyBtb2RlbCAqLwogIERXT1JEIGluaXRzOyAgICAgICAgICAgICAvKiBDb0luaXRpYWxpemUgY291bnQgKi8KICBEV09SRCB0aWQ7ICAgICAgICAgICAgICAgLyogdGhyZWFkIGlkICovCiAgSEFORExFIHRocmVhZDsgICAgICAgICAgIC8qIHRocmVhZCBoYW5kbGUgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVyIElEICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyICovCiAgSFdORCB3aW47ICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2Ugd2luZG93ICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgIC8qIHRocmVhZCBzYWZldHkgKi8KICBMUE1FU1NBR0VGSUxURVIgZmlsdGVyOyAgLyogbWVzc2FnZSBmaWx0ZXIgKi8KICBYT0JKRUNUICpvYmpzOyAgICAgICAgICAgLyogZXhwb3J0ZWQgb2JqZWN0cyAqLwogIElPQkpFQ1QgKnByb3hpZXM7ICAgICAgICAvKiBpbXBvcnRlZCBvYmplY3RzICovCiAgTFBVTktOT1dOIHN0YXRlOyAgICAgICAgIC8qIHN0YXRlIG9iamVjdCAoc2VlIENvW0dldCxTZXRdU3RhdGUpICovCiAgTFBWT0lEIEVycm9ySW5mbzsgICAgICAgIC8qIHRocmVhZCBlcnJvciBpbmZvICovCn0gQVBBUlRNRU5UOwoKZXh0ZXJuIEFQQVJUTUVOVCBNVEEsICphcHRzOwoKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0NvbnN0cnVjdCgpOwpleHRlcm4gdm9pZCAgU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVfRGVzdHJveSh2b2lkKiBzZWxmKTsKZXh0ZXJuIEhSRVNVTFQgU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVfR2V0RmFjdG9yeShMUFZPSUQgKnBwdik7CgpleHRlcm4gSFJFU1VMVCBXSU5FX1N0cmluZ0Zyb21DTFNJRChjb25zdCBDTFNJRCAqaWQsTFBTVFIgaWRzdHIpOwpleHRlcm4gSFJFU1VMVCBjcmVhdGVfbWFyc2hhbGxlZF9wcm94eShSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKCmV4dGVybiB2b2lkKiBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZUluc3RhbmNlOwoKI2RlZmluZSBQSVBFUFJFRiAiXFxcXC5cXHBpcGVcXCIKI2RlZmluZSBPTEVTVFVCTUdSIFBJUEVQUkVGIldJTkVfT0xFX1N0dWJNZ3IiCgovKiBTdGFuZGFyZCBNYXJzaGFsbGluZyBkZWZpbml0aW9ucyAqLwp0eXBlZGVmIHN0cnVjdCBfd2luZV9tYXJzaGFsX2lkIHsKICAgIERXT1JECXByb2Nlc3NpZDsKICAgIERXT1JECW9iamVjdGlkOwkvKiB1bmlxdWUgdmFsdWUgY29ycmVzcC4gSVVua25vd24gb2Ygb2JqZWN0ICovCiAgICBJSUQJCWlpZDsKfSB3aW5lX21hcnNoYWxfaWQ7CgppbmxpbmUgc3RhdGljIEJPT0wKTUFSU0hBTF9Db21wYXJlX01pZHMod2luZV9tYXJzaGFsX2lkICptaWQxLHdpbmVfbWFyc2hhbF9pZCAqbWlkMikgewogICAgcmV0dXJuCgkobWlkMS0+cHJvY2Vzc2lkID09IG1pZDItPnByb2Nlc3NpZCkJJiYKCShtaWQxLT5vYmplY3RpZCA9PSBtaWQyLT5vYmplY3RpZCkJJiYKCUlzRXF1YWxJSUQoJihtaWQxLT5paWQpLCYobWlkMi0+aWlkKSkKICAgIDsKfQoKLyogY29tcGFyZSB3aXRob3V0IGludGVyZmFjZSBjb21wYXJlICovCmlubGluZSBzdGF0aWMgQk9PTApNQVJTSEFMX0NvbXBhcmVfTWlkc19Ob0ludGVyZmFjZSh3aW5lX21hcnNoYWxfaWQgKm1pZDEsIHdpbmVfbWFyc2hhbF9pZCAqbWlkMikgewogICAgcmV0dXJuCgkobWlkMS0+cHJvY2Vzc2lkID09IG1pZDItPnByb2Nlc3NpZCkJJiYKCShtaWQxLT5vYmplY3RpZCA9PSBtaWQyLT5vYmplY3RpZCkKICAgIDsKfQoKSFJFU1VMVCBNQVJTSEFMX0ZpbmRfU3R1Yl9CdWZmZXIod2luZV9tYXJzaGFsX2lkICptaWQsSVJwY1N0dWJCdWZmZXIgKipzdHViKTsKdm9pZCAgICBNQVJTSEFMX0ludmFsaWRhdGVfU3R1Yl9Gcm9tX01JRCh3aW5lX21hcnNoYWxfaWQgKm1pZCk7CkhSRVNVTFQgTUFSU0hBTF9EaXNjb25uZWN0X1Byb3hpZXMoKTsKCkhSRVNVTFQgTUFSU0hBTF9HZXRTdGFuZGFyZE1hcnNoYWxDRihMUFZPSUQgKnBwdik7Cgp2b2lkIFNUVUJNR1JfU3RhcnQoKTsKCmV4dGVybiBIUkVTVUxUIFBJUEVfR2V0TmV3UGlwZUJ1Zih3aW5lX21hcnNoYWxfaWQgKm1pZCwgSVJwY0NoYW5uZWxCdWZmZXIgKipwaXBlYnVmKTsKCi8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9Jbml0aWFsaXplKCk7CgovKiBUaGlzIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9VbkluaXRpYWxpemUoKTsKCi8qIFRoaXMgZnVuY3Rpb24gZGVjb21wb3NlcyBhIFN0cmluZyBwYXRoIHRvIGEgU3RyaW5nIFRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyAoIlwiIG9yICJzdWJEaXJlY3RvcnkiIG9yICJEaXJlY3RvcnkiIG9yICJGaWxlTmFtZSIpIG9mIHRoZSBwYXRoICovCmludCBXSU5BUEkgRmlsZU1vbmlrZXJJbXBsX0RlY29tcG9zZVBhdGgoTFBDT0xFU1RSIHN0ciwgTFBPTEVTVFIqKiBzdHJpbmdUYWJsZSk7CgpIUkVTVUxUIFdJTkFQSSBfX0NMU0lERnJvbVN0cmluZ0EoTFBDU1RSIGlkc3RyLCBDTFNJRCAqaWQpOwoKLyoKICogUGVyLXRocmVhZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgVEVCIG9uIG9mZnNldCAweEY4MCwKICogc2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMTA5OS9idWdzbGF5ZXIvYnVnc2xheWVyMTA5OS5odG0KICovCnN0YXRpYyBpbmxpbmUgQVBBUlRNRU5UKiBDT01fQ3VycmVudEluZm8odm9pZCkKewogIEFQQVJUTUVOVCogYXB0ID0gTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlOwogIHJldHVybiBhcHQ7Cn0Kc3RhdGljIGlubGluZSBBUEFSVE1FTlQqIENPTV9DdXJyZW50QXB0KHZvaWQpCnsKICBBUEFSVE1FTlQqIGFwdCA9IENPTV9DdXJyZW50SW5mbygpOwogIGlmIChhcHQgJiYgYXB0LT5wYXJlbnQpIGFwdCA9IGFwdC0+cGFyZW50OwogIHJldHVybiBhcHQ7Cn0KCi8qIGNvbXBvYmouYyAqLwpBUEFSVE1FTlQqIENPTV9DcmVhdGVBcGFydG1lbnQoRFdPUkQgbW9kZWwpOwpIV05EIENPTV9HZXRBcGFydG1lbnRXaW4oT1hJRCBveGlkKTsKCiNkZWZpbmUgSUNPTV9USElTX01VTFRJKGltcGwsZmllbGQsaWZhY2UpIGltcGwqIGNvbnN0IFRoaXM9KGltcGwqKSgoY2hhciopKGlmYWNlKSAtIG9mZnNldG9mKGltcGwsZmllbGQpKQoKI2VuZGlmIC8qIF9fV0lORV9PTEVfQ09NUE9CSl9IICovCg==