LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCi8qIFRocmVhZC1zYWZldHkgQW5ub3RhdGlvbiBMZWdlbmQ6CiAqCiAqIFJPICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb25seS4gSXQgbmV2ZXIgY2hhbmdlcyBhZnRlciBjcmVhdGlvbiwgc28gbm8KICogICAgICAgICBsb2NraW5nIGlzIHJlcXVpcmVkLgogKiBMT0NLICAtIFRoZSB2YWx1ZSBpcyB3cml0dGVuIHRvIG9ubHkgdXNpbmcgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucy4KICogQ1MgICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24uCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJDUyIgaXMgdGhlIHNwZWNpZmljIGNyaXRpY2FsIHNldGlvbiB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKiBNVVRFWCAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gd2l0aCBhIG11dGV4IGhlbGQuCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJNVVRFWCIgaXMgdGhlIHNwZWNpZmljIG11dGV4IHRoYXQKICogICAgICAgICBtdXN0IGJlIHVzZWQuCiAqLwoKdHlwZWRlZiBlbnVtIGlmc3R1Yl9zdGF0ZQp7CiAgICBTVFVCU1RBVEVfTk9STUFMX01BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9OT1JNQUxfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19VTk1BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9TVFJPTkcsCn0gU1RVQl9TVEFURTsKCi8qIGFuIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBpZnN0dWIgICAKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gc3R1Yl9tYW5hZ2VyLT5pZnN0dWJzIGxpc3QgKENTIHN0dWJfbWFuYWdlci0+bG9jaykgKi8KICAgIElScGNTdHViQnVmZmVyICAgKnN0dWJidWZmZXI7IC8qIFJPICovCiAgICBJSUQgICAgICAgICAgICAgICBpaWQ7ICAgICAgICAvKiBSTyAqLwogICAgSVBJRCAgICAgICAgICAgICAgaXBpZDsgICAgICAgLyogUk8gKi8KICAgIElVbmtub3duICAgICAgICAgKmlmYWNlOyAgICAgIC8qIFJPICovCiAgICBNU0hMRkxBR1MgICAgICAgICBmbGFnczsgICAgICAvKiBzbyB3ZSBjYW4gZW5mb3JjZSBwcm9jZXNzLWxvY2FsIG1hcnNoYWxsaW5nIHJ1bGVzIChSTykgKi8KfTsKCgovKiBzdHViIG1hbmFnZXJzIGhvbGQgcmVmcyBvbiB0aGUgb2JqZWN0IGFuZCBlYWNoIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBzdHViX21hbmFnZXIKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IHN0dWJtZ3IgbGlzdCAoQ1MgYXB0LT5jcykgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgIGlmc3R1YnM7ICAgIC8qIGxpc3Qgb2YgYWN0aXZlIGlmc3R1YnMgZm9yIHRoZSBvYmplY3QgKENTIGxvY2spICovCiAgICBDUklUSUNBTF9TRUNUSU9OICBsb2NrOwogICAgQVBBUlRNRU5UICAgICAgICAqYXB0OyAgICAgICAgLyogb3duaW5nIGFwdCAoUk8pICovCgogICAgVUxPTkcgICAgICAgICAgICAgZXh0cmVmczsgICAgLyogbnVtYmVyIG9mICdleHRlcm5hbCcgcmVmZXJlbmNlcyAoQ1MgbG9jaykgKi8KICAgIFVMT05HICAgICAgICAgICAgIHJlZnM7ICAgICAgIC8qIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCAoQ1MgYXB0LT5jcykgKi8KICAgIE9JRCAgICAgICAgICAgICAgIG9pZDsgICAgICAgIC8qIGFwYXJ0bWVudC1zY29wZWQgdW5pcXVlIGlkZW50aWZpZXIgKFJPKSAqLwogICAgSVVua25vd24gICAgICAgICAqb2JqZWN0OyAgICAgLyogdGhlIG9iamVjdCB3ZSBhcmUgbWFuYWdpbmcgdGhlIHN0dWIgZm9yIChSTykgKi8KICAgIFVMT05HICAgICAgICAgICAgIG5leHRfaXBpZDsgIC8qIGN1cnJlbnRseSB1bnVzZWQgKExPQ0spICovCgogICAgLyogV2UgbmVlZCB0byBrZWVwIGEgY291bnQgb2YgdGhlIG91dHN0YW5kaW5nIG1hcnNoYWxzLCBzbyB3ZSBjYW4gZW5mb3JjZSB0aGUKICAgICAqIG1hcnNoYWxsaW5nIHJ1bGVzIChpZSwgeW91IGNhbiBvbmx5IHVubWFyc2hhbCBub3JtYWwgbWFyc2hhbHMgb25jZSkuIE5vdGUKICAgICAqIHRoYXQgdGhlc2UgY291bnRzIGRvIE5PVCBpbmNsdWRlIHVubWFyc2hhbGxlZCBpbnRlcmZhY2VzLCBvbmNlIGEgc3RyZWFtIGlzCiAgICAgKiB1bm1hcnNoYWxsZWQgYW5kIGEgcHJveHkgc2V0IHVwLCB0aGlzIGNvdW50IGlzIGRlY3JlbWVudGVkLgogICAgICovCgogICAgVUxPTkcgICAgICAgICAgICAgbm9ybV9yZWZzOyAgLyogcmVmY291bnQgb2Ygbm9ybWFsIG1hcnNoYWxzIChDUyBsb2NrKSAqLwp9OwoKLyogaW1wb3J0ZWQgaW50ZXJmYWNlIHByb3h5ICovCnN0cnVjdCBpZnByb3h5CnsKICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgLyogZW50cnkgaW4gcHJveHlfbWFuYWdlciBsaXN0IChDUyBwYXJlbnQtPmNzKSAqLwogIHN0cnVjdCBwcm94eV9tYW5hZ2VyICpwYXJlbnQ7IC8qIG93bmluZyBwcm94eV9tYW5hZ2VyIChSTykgKi8KICBMUFZPSUQgaWZhY2U7ICAgICAgICAgICAgLyogaW50ZXJmYWNlIHBvaW50ZXIgKFJPKSAqLwogIFNURE9CSlJFRiBzdGRvYmpyZWY7ICAgICAvKiBtYXJzaGFsIGRhdGEgdGhhdCByZXByZXNlbnRzIHRoaXMgb2JqZWN0IChSTykgKi8KICBJSUQgaWlkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIElEIChSTykgKi8KICBMUFJQQ1BST1hZQlVGRkVSIHByb3h5OyAgLyogaW50ZXJmYWNlIHByb3h5IChSTykgKi8KICBEV09SRCByZWZzOyAgICAgICAgICAgICAgLyogaW1wb3J0ZWQgKHB1YmxpYykgcmVmZXJlbmNlcyAoTVVURVggcGFyZW50LT5yZW1vdGluZ19tdXRleCkgKi8KICBJUnBjQ2hhbm5lbEJ1ZmZlciAqY2hhbjsgLyogY2hhbm5lbCB0byBvYmplY3QgKENTIHBhcmVudC0+Y3MpICovCn07CgovKiBpbXBvcnRlZCBvYmplY3QgLyBwcm94eSBtYW5hZ2VyICovCnN0cnVjdCBwcm94eV9tYW5hZ2VyCnsKICBjb25zdCBJTXVsdGlRSVZ0YmwgKmxwVnRibDsKICBjb25zdCBJTWFyc2hhbFZ0YmwgKmxwVnRibE1hcnNoYWw7CiAgc3RydWN0IGFwYXJ0bWVudCAqcGFyZW50OyAvKiBvd25pbmcgYXBhcnRtZW50IChSTykgKi8KICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCAoQ1MgcGFyZW50LT5jcykgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBleHBvcnRlZCBJRCAoUk8pICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgSUQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGludGVyZmFjZXM7ICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlcyAoQ1MgY3MpICovCiAgTE9ORyByZWZzOyAgICAgICAgICAgICAgICAvKiBwcm94eSByZWZlcmVuY2UgY291bnQgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgICAvKiB0aHJlYWQgc2FmZXR5IGZvciB0aGlzIG9iamVjdCBhbmQgY2hpbGRyZW4gKi8KICBVTE9ORyBzb3JmbGFnczsgICAgICAgICAgIC8qIFNURE9CSlJFRiBmbGFncyAoUk8pICovCiAgSVJlbVVua25vd24gKnJlbXVuazsgICAgICAvKiBwcm94eSB0byBJUmVtVW5rbm93biB1c2VkIGZvciBsaWZlY3ljbGUgbWFuYWdlbWVudCAoQ1MgY3MpICovCiAgSEFORExFIHJlbW90aW5nX211dGV4OyAgICAvKiBtdXRleCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byBJUmVtVW5rbm93biAqLwp9OwoKLyogdGhpcyBuZWVkcyB0byBiZWNvbWUgYSBDT00gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBJUmVtVW5rbm93biAqLwpzdHJ1Y3QgYXBhcnRtZW50CnsKICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgCgogIExPTkcgIHJlZnM7ICAgICAgICAgICAgICAvKiByZWZjb3VudCBvZiB0aGUgYXBhcnRtZW50IChMT0NLKSAqLwogIERXT1JEIG1vZGVsOyAgICAgICAgICAgICAvKiB0aHJlYWRpbmcgbW9kZWwgKFJPKSAqLwogIERXT1JEIHRpZDsgICAgICAgICAgICAgICAvKiB0aHJlYWQgaWQgKFJPKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZXIgSUQgKFJPKSAqLwogIExPTkcgaXBpZGM7ICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSAoTE9DSykgKi8KICBIV05EIHdpbjsgICAgICAgICAgICAgICAgLyogbWVzc2FnZSB3aW5kb3cgKFJPKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgTFBNRVNTQUdFRklMVEVSIGZpbHRlcjsgIC8qIG1lc3NhZ2UgZmlsdGVyIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBwcm94aWVzOyAgICAgLyogaW1wb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgc3RydWN0IGxpc3Qgc3R1Ym1ncnM7ICAgIC8qIHN0dWIgbWFuYWdlcnMgZm9yIGV4cG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIEJPT0wgcmVtdW5rX2V4cG9ydGVkOyAgICAvKiBoYXMgdGhlIElSZW1Vbmtub3duIGludGVyZmFjZSBmb3IgdGhpcyBhcGFydG1lbnQgYmVlbiBjcmVhdGVkIHlldD8gKENTIGNzKSAqLwogIExPTkcgcmVtb3Rpbmdfc3RhcnRlZDsgICAvKiBoYXMgdGhlIFJQQyBzeXN0ZW0gYmVlbiBzdGFydGVkIGZvciB0aGlzIGFwYXJ0bWVudD8gKExPQ0spICovCgogIC8qIEZJWE1FOiBPSUQncyBzaG91bGQgYmUgZ2l2ZW4gb3V0IGJ5IFJQQ1NTICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSwgemVybyBpcyBpbnZhbGlkIE9JRCAoQ1MgY3MpICovCn07CgovKiB0aGlzIGlzIHdoYXQgaXMgc3RvcmVkIGluIFRFQi0+UmVzZXJ2ZWRGb3JPbGUgKi8Kc3RydWN0IG9sZXRscwp7CiAgICBzdHJ1Y3QgYXBhcnRtZW50ICphcHQ7CiAgICBJRXJyb3JJbmZvICAgICAgICplcnJvcmluZm87ICAgLyogc2VlIGVycm9yaW5mby5jICovCiAgICBJVW5rbm93biAgICAgICAgICpzdGF0ZTsgICAgICAgLyogc2VlIENvU2V0U3RhdGUgKi8KICAgIERXT1JEICAgICAgICAgICAgaW5pdHM7ICAgICAgICAvKiBudW1iZXIgb2YgdGltZXMgQ29Jbml0aWFsaXplRXggY2FsbGVkICovCn07CgoKLyogR2xvYmFsIEludGVyZmFjZSBUYWJsZSBGdW5jdGlvbnMgKi8KCmV4dGVybiB2b2lkKiBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9Db25zdHJ1Y3Qodm9pZCk7CmV4dGVybiB2b2lkICBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9EZXN0cm95KHZvaWQqIHNlbGYpOwpleHRlcm4gSFJFU1VMVCBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9HZXRGYWN0b3J5KExQVk9JRCAqcHB2KTsKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlSW5zdGFuY2U7CgovKiBGSVhNRTogdGhlc2Ugc2hvdWxkbid0IGJlIG5lZWRlZCwgZXhjZXB0IGZvciAxNi1iaXQgZnVuY3Rpb25zICovCmV4dGVybiBIUkVTVUxUIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCxMUFNUUiBpZHN0cik7CkhSRVNVTFQgV0lOQVBJIF9fQ0xTSURGcm9tU3RyaW5nQShMUENTVFIgaWRzdHIsIENMU0lEICppZCk7CgpIUkVTVUxUIENPTV9PcGVuS2V5Rm9yQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIExQQ1dTVFIga2V5bmFtZSwgUkVHU0FNIGFjY2VzcywgSEtFWSAqa2V5KTsKSFJFU1VMVCBNQVJTSEFMX0dldFN0YW5kYXJkTWFyc2hhbENGKExQVk9JRCAqcHB2KTsKCi8qIFN0dWIgTWFuYWdlciAqLwoKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqVGhpcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9pbnRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKc3RydWN0IHN0dWJfbWFuYWdlciAqbmV3X3N0dWJfbWFuYWdlcihBUEFSVE1FTlQgKmFwdCwgSVVua25vd24gKm9iamVjdCk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfYWRkcmVmKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMpOwpVTE9ORyBzdHViX21hbmFnZXJfZXh0X3JlbGVhc2Uoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7CnN0cnVjdCBpZnN0dWIgKnN0dWJfbWFuYWdlcl9uZXdfaWZzdHViKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIElScGNTdHViQnVmZmVyICpzYiwgSVVua25vd24gKmlwdHIsIFJFRklJRCBpaWQsIE1TSExGTEFHUyBmbGFncyk7CnN0cnVjdCBpZnN0dWIgKnN0dWJfbWFuYWdlcl9maW5kX2lmc3R1YihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBSRUZJSUQgaWlkLCBNU0hMRkxBR1MgZmxhZ3MpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBPSUQgb2lkKTsKc3RydWN0IHN0dWJfbWFuYWdlciAqZ2V0X3N0dWJfbWFuYWdlcl9mcm9tX29iamVjdChBUEFSVE1FTlQgKmFwdCwgdm9pZCAqb2JqZWN0KTsKQk9PTCBzdHViX21hbmFnZXJfbm90aWZ5X3VubWFyc2hhbChzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBjb25zdCBJUElEICppcGlkKTsKQk9PTCBzdHViX21hbmFnZXJfaXNfdGFibGVfbWFyc2hhbGVkKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwp2b2lkIHN0dWJfbWFuYWdlcl9yZWxlYXNlX21hcnNoYWxfZGF0YShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzLCBjb25zdCBJUElEICppcGlkKTsKSFJFU1VMVCBpcGlkX3RvX3N0dWJfbWFuYWdlcihjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgc3RydWN0IHN0dWJfbWFuYWdlciAqKnN0dWJtZ3JfcmV0KTsKSVJwY1N0dWJCdWZmZXIgKmlwaWRfdG9fYXB0X2FuZF9zdHViYnVmZmVyKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0KTsKSFJFU1VMVCBzdGFydF9hcGFydG1lbnRfcmVtb3RlX3Vua25vd24odm9pZCk7CgpIUkVTVUxUIG1hcnNoYWxfb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCBTVERPQkpSRUYgKnN0ZG9ianJlZiwgUkVGSUlEIHJpaWQsIElVbmtub3duICpvYmosIE1TSExGTEFHUyBtc2hsZmxhZ3MpOwoKLyogUlBDIEJhY2tlbmQgKi8KCnN0cnVjdCBkaXNwYXRjaF9wYXJhbXM7Cgp2b2lkICAgIFJQQ19TdGFydFJlbW90aW5nKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhSRVNVTFQgUlBDX0NyZWF0ZUNsaWVudENoYW5uZWwoY29uc3QgT1hJRCAqb3hpZCwgY29uc3QgSVBJRCAqaXBpZCwgSVJwY0NoYW5uZWxCdWZmZXIgKipwaXBlYnVmKTsKdm9pZCAgICBSUENfRXhlY3V0ZUNhbGwoc3RydWN0IGRpc3BhdGNoX3BhcmFtcyAqcGFyYW1zKTsKSFJFU1VMVCBSUENfUmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwp2b2lkICAgIFJQQ19VbnJlZ2lzdGVySW50ZXJmYWNlKFJFRklJRCByaWlkKTsKdm9pZCAgICBSUENfU3RhcnRMb2NhbFNlcnZlcihSRUZDTFNJRCBjbHNpZCwgSVN0cmVhbSAqc3RyZWFtKTsKSFJFU1VMVCBSUENfR2V0TG9jYWxDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKCi8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9Jbml0aWFsaXplKHZvaWQpOwoKLyogVGhpcyBmdW5jdGlvbiB1bmluaXRpYWxpemUgdGhlIFJ1bm5pbmcgT2JqZWN0IFRhYmxlICovCkhSRVNVTFQgV0lOQVBJIFJ1bm5pbmdPYmplY3RUYWJsZUltcGxfVW5Jbml0aWFsaXplKHZvaWQpOwoKLyogVGhpcyBmdW5jdGlvbiBkZWNvbXBvc2VzIGEgU3RyaW5nIHBhdGggdG8gYSBTdHJpbmcgVGFibGUgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzICgiXCIgb3IgInN1YkRpcmVjdG9yeSIgb3IgIkRpcmVjdG9yeSIgb3IgIkZpbGVOYW1lIikgb2YgdGhlIHBhdGggKi8KaW50IEZpbGVNb25pa2VySW1wbF9EZWNvbXBvc2VQYXRoKExQQ09MRVNUUiBzdHIsIExQT0xFU1RSKiogc3RyaW5nVGFibGUpOwoKCi8qIEFwYXJ0bWVudCBGdW5jdGlvbnMgKi8KCkFQQVJUTUVOVCAqYXBhcnRtZW50X2ZpbmRmcm9tb3hpZChPWElEIG94aWQsIEJPT0wgcmVmKTsKQVBBUlRNRU5UICphcGFydG1lbnRfZmluZGZyb210aWQoRFdPUkQgdGlkKTsKRFdPUkQgYXBhcnRtZW50X2FkZHJlZihzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwpEV09SRCBhcGFydG1lbnRfcmVsZWFzZShzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwpIUkVTVUxUIGFwYXJ0bWVudF9kaXNjb25uZWN0cHJveGllcyhzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwp2b2lkIGFwYXJ0bWVudF9kaXNjb25uZWN0b2JqZWN0KHN0cnVjdCBhcGFydG1lbnQgKmFwdCwgdm9pZCAqb2JqZWN0KTsKc3RhdGljIGlubGluZSBIUkVTVUxUIGFwYXJ0bWVudF9nZXRveGlkKHN0cnVjdCBhcGFydG1lbnQgKmFwdCwgT1hJRCAqb3hpZCkKewogICAgKm94aWQgPSBhcHQtPm94aWQ7CiAgICByZXR1cm4gU19PSzsKfQoKCi8qIERDT00gbWVzc2FnZXMgdXNlZCBieSB0aGUgYXBhcnRtZW50IHdpbmRvdyAobm90IGNvbXBhdGlibGUgd2l0aCBuYXRpdmUpICovCiNkZWZpbmUgRE1fRVhFQ1VURVJQQyAgIChXTV9VU0VSICsgMCkgLyogV1BBUkFNID0gMCwgTFBBUkFNID0gKHN0cnVjdCBkaXNwYXRjaF9wYXJhbXMgKikgKi8KCi8qCiAqIFBlci10aHJlYWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIFRFQiBvbiBvZmZzZXQgMHhGODAsCiAqIHNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNqLzEwOTkvYnVnc2xheWVyL2J1Z3NsYXllcjEwOTkuaHRtCiAqLwoKLyogd2lsbCBjcmVhdGUgaWYgbmVjZXNzYXJ5ICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IG9sZXRscyAqQ09NX0N1cnJlbnRJbmZvKHZvaWQpCnsKICAgIGlmICghTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlKQogICAgICAgIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2Yoc3RydWN0IG9sZXRscykpOwoKICAgIHJldHVybiBOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGU7Cn0KCnN0YXRpYyBpbmxpbmUgQVBBUlRNRU5UKiBDT01fQ3VycmVudEFwdCh2b2lkKQp7ICAKICAgIHJldHVybiBDT01fQ3VycmVudEluZm8oKS0+YXB0Owp9CgojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSBpbXBsKiBjb25zdCBUaGlzPShpbXBsKikoKGNoYXIqKShpZmFjZSkgLSBvZmZzZXRvZihpbXBsLGZpZWxkKSkKCi8qIGhlbHBlcnMgZm9yIGRlYnVnZ2luZyAqLwojIGRlZmluZSBERUJVR19TRVRfQ1JJVFNFQ19OQU1FKGNzLCBuYW1lKSAoY3MpLT5EZWJ1Z0luZm8tPlNwYXJlWzBdID0gKERXT1JEX1BUUikoX19GSUxFX18gIjogIiBuYW1lKQojIGRlZmluZSBERUJVR19DTEVBUl9DUklUU0VDX05BTUUoY3MpIChjcyktPkRlYnVnSW5mby0+U3BhcmVbMF0gPSAwCgpleHRlcm4gSElOU1RBTkNFIE9MRTMyX2hJbnN0YW5jZTsgLyogRklYTUU6IG1ha2Ugc3RhdGljICovCgojZGVmaW5lIENIQVJTX0lOX0dVSUQgMzkgLyogaW5jbHVkaW5nIE5VTEwgKi8KCi8qIEV4cG9ydGVkIG5vbi1pbnRlcmZhY2UgRGF0YSBBZHZpc2UgSG9sZGVyIGZ1bmN0aW9ucyAqLwpIUkVTVUxUIERhdGFBZHZpc2VIb2xkZXJfT25Db25uZWN0KElEYXRhQWR2aXNlSG9sZGVyICppZmFjZSwgSURhdGFPYmplY3QgKnBEZWxlZ2F0ZSk7CnZvaWQgRGF0YUFkdmlzZUhvbGRlcl9PbkRpc2Nvbm5lY3QoSURhdGFBZHZpc2VIb2xkZXIgKmlmYWNlKTsKCiNlbmRpZiAvKiBfX1dJTkVfT0xFX0NPTVBPQkpfSCAqLwo=