LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCi8qIFRocmVhZC1zYWZldHkgQW5ub3RhdGlvbiBMZWdlbmQ6CiAqCiAqIFJPICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb25seS4gSXQgbmV2ZXIgY2hhbmdlcyBhZnRlciBjcmVhdGlvbiwgc28gbm8KICogICAgICAgICBsb2NraW5nIGlzIHJlcXVpcmVkLgogKiBMT0NLICAtIFRoZSB2YWx1ZSBpcyB3cml0dGVuIHRvIG9ubHkgdXNpbmcgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucy4KICogQ1MgICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24uCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJDUyIgaXMgdGhlIHNwZWNpZmljIGNyaXRpY2FsIHNldGlvbiB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKiBNVVRFWCAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gd2l0aCBhIG11dGV4IGhlbGQuCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJNVVRFWCIgaXMgdGhlIHNwZWNpZmljIG11dGV4IHRoYXQKICogICAgICAgICBtdXN0IGJlIHVzZWQuCiAqLwoKdHlwZWRlZiBlbnVtIGlmc3R1Yl9zdGF0ZQp7CiAgICBTVFVCU1RBVEVfTk9STUFMX01BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9OT1JNQUxfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19VTk1BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9TVFJPTkcsCn0gU1RVQl9TVEFURTsKCi8qIGFuIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBpZnN0dWIgICAKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gc3R1Yl9tYW5hZ2VyLT5pZnN0dWJzIGxpc3QgKENTIHN0dWJfbWFuYWdlci0+bG9jaykgKi8KICAgIElScGNTdHViQnVmZmVyICAgKnN0dWJidWZmZXI7IC8qIFJPICovCiAgICBJSUQgICAgICAgICAgICAgICBpaWQ7ICAgICAgICAvKiBSTyAqLwogICAgSVBJRCAgICAgICAgICAgICAgaXBpZDsgICAgICAgLyogUk8gKi8KICAgIElVbmtub3duICAgICAgICAgKmlmYWNlOyAgICAgIC8qIFJPICovCn07CgoKLyogc3R1YiBtYW5hZ2VycyBob2xkIHJlZnMgb24gdGhlIG9iamVjdCBhbmQgZWFjaCBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCBzdHVibWdyIGxpc3QgKENTIGFwdC0+Y3MpICovCiAgICBzdHJ1Y3QgbGlzdCAgICAgICBpZnN0dWJzOyAgICAvKiBsaXN0IG9mIGFjdGl2ZSBpZnN0dWJzIGZvciB0aGUgb2JqZWN0IChDUyBsb2NrKSAqLwogICAgQ1JJVElDQUxfU0VDVElPTiAgbG9jazsKICAgIEFQQVJUTUVOVCAgICAgICAgKmFwdDsgICAgICAgIC8qIG93bmluZyBhcHQgKFJPKSAqLwoKICAgIFVMT05HICAgICAgICAgICAgIGV4dHJlZnM7ICAgIC8qIG51bWJlciBvZiAnZXh0ZXJuYWwnIHJlZmVyZW5jZXMgKENTIGxvY2spICovCiAgICBVTE9ORyAgICAgICAgICAgICByZWZzOyAgICAgICAvKiBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQgKENTIGFwdC0+Y3MpICovCiAgICBPSUQgICAgICAgICAgICAgICBvaWQ7ICAgICAgICAvKiBhcGFydG1lbnQtc2NvcGVkIHVuaXF1ZSBpZGVudGlmaWVyIChSTykgKi8KICAgIElVbmtub3duICAgICAgICAgKm9iamVjdDsgICAgIC8qIHRoZSBvYmplY3Qgd2UgYXJlIG1hbmFnaW5nIHRoZSBzdHViIGZvciAoUk8pICovCiAgICBVTE9ORyAgICAgICAgICAgICBuZXh0X2lwaWQ7ICAvKiBjdXJyZW50bHkgdW51c2VkIChMT0NLKSAqLwogICAgU1RVQl9TVEFURSAgICAgICAgc3RhdGU7ICAgICAgLyogc3RhdGUgbWFjaGluZSAoQ1MgbG9jaykgKi8KfTsKCi8qIGltcG9ydGVkIGludGVyZmFjZSBwcm94eSAqLwpzdHJ1Y3QgaWZwcm94eQp7CiAgc3RydWN0IGxpc3QgZW50cnk7ICAgICAgIC8qIGVudHJ5IGluIHByb3h5X21hbmFnZXIgbGlzdCAoQ1MgcGFyZW50LT5jcykgKi8KICBzdHJ1Y3QgcHJveHlfbWFuYWdlciAqcGFyZW50OyAvKiBvd25pbmcgcHJveHlfbWFuYWdlciAoUk8pICovCiAgTFBWT0lEIGlmYWNlOyAgICAgICAgICAgIC8qIGludGVyZmFjZSBwb2ludGVyIChSTykgKi8KICBJSUQgaWlkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIElEIChSTykgKi8KICBJUElEIGlwaWQ7ICAgICAgICAgICAgICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlIElEIChSTykgKi8KICBMUFJQQ1BST1hZQlVGRkVSIHByb3h5OyAgLyogaW50ZXJmYWNlIHByb3h5IChSTykgKi8KICBEV09SRCByZWZzOyAgICAgICAgICAgICAgLyogaW1wb3J0ZWQgKHB1YmxpYykgcmVmZXJlbmNlcyAoTVVURVggcGFyZW50LT5yZW1vdGluZ19tdXRleCkgKi8KICBJUnBjQ2hhbm5lbEJ1ZmZlciAqY2hhbjsgLyogY2hhbm5lbCB0byBvYmplY3QgKENTIHBhcmVudC0+Y3MpICovCn07CgovKiBpbXBvcnRlZCBvYmplY3QgLyBwcm94eSBtYW5hZ2VyICovCnN0cnVjdCBwcm94eV9tYW5hZ2VyCnsKICBjb25zdCBJTXVsdGlRSVZ0YmwgKmxwVnRibDsKICBzdHJ1Y3QgYXBhcnRtZW50ICpwYXJlbnQ7IC8qIG93bmluZyBhcGFydG1lbnQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IChDUyBwYXJlbnQtPmNzKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVkIElEIChSTykgKi8KICBPSUQgb2lkOyAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCAoUk8pICovCiAgc3RydWN0IGxpc3QgaW50ZXJmYWNlczsgICAvKiBpbXBvcnRlZCBpbnRlcmZhY2VzIChDUyBjcykgKi8KICBMT05HIHJlZnM7ICAgICAgICAgICAgICAgIC8qIHByb3h5IHJlZmVyZW5jZSBjb3VudCAoTE9DSykgKi8KICBDUklUSUNBTF9TRUNUSU9OIGNzOyAgICAgIC8qIHRocmVhZCBzYWZldHkgZm9yIHRoaXMgb2JqZWN0IGFuZCBjaGlsZHJlbiAqLwogIFVMT05HIHNvcmZsYWdzOyAgICAgICAgICAgLyogU1RET0JKUkVGIGZsYWdzIChSTykgKi8KICBJUmVtVW5rbm93biAqcmVtdW5rOyAgICAgIC8qIHByb3h5IHRvIElSZW1Vbmtub3duIHVzZWQgZm9yIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChDUyBjcykgKi8KICBIQU5ETEUgcmVtb3RpbmdfbXV0ZXg7ICAgIC8qIG11dGV4IHVzZWQgZm9yIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIElSZW1Vbmtub3duICovCn07CgovKiB0aGlzIG5lZWRzIHRvIGJlY29tZSBhIENPTSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIElSZW1Vbmtub3duICovCnN0cnVjdCBhcGFydG1lbnQKewogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAKCiAgTE9ORyAgcmVmczsgICAgICAgICAgICAgIC8qIHJlZmNvdW50IG9mIHRoZSBhcGFydG1lbnQgKExPQ0spICovCiAgRFdPUkQgbW9kZWw7ICAgICAgICAgICAgIC8qIHRocmVhZGluZyBtb2RlbCAoUk8pICovCiAgRFdPUkQgdGlkOyAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZCAoUk8pICovCiAgSEFORExFIHRocmVhZDsgICAgICAgICAgIC8qIHRocmVhZCBoYW5kbGUgKFJPKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZXIgSUQgKFJPKSAqLwogIExPTkcgaXBpZGM7ICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSAoTE9DSykgKi8KICBIV05EIHdpbjsgICAgICAgICAgICAgICAgLyogbWVzc2FnZSB3aW5kb3cgKFJPKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgTFBNRVNTQUdFRklMVEVSIGZpbHRlcjsgIC8qIG1lc3NhZ2UgZmlsdGVyIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBwcm94aWVzOyAgICAgLyogaW1wb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgc3RydWN0IGxpc3Qgc3R1Ym1ncnM7ICAgIC8qIHN0dWIgbWFuYWdlcnMgZm9yIGV4cG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIEJPT0wgcmVtdW5rX2V4cG9ydGVkOyAgICAvKiBoYXMgdGhlIElSZW1Vbmtub3duIGludGVyZmFjZSBmb3IgdGhpcyBhcGFydG1lbnQgYmVlbiBjcmVhdGVkIHlldD8gKENTIGNzKSAqLwogIExPTkcgcmVtb3Rpbmdfc3RhcnRlZDsgICAvKiBoYXMgdGhlIFJQQyBzeXN0ZW0gYmVlbiBzdGFydGVkIGZvciB0aGlzIGFwYXJ0bWVudD8gKExPQ0spICovCgogIC8qIEZJWE1FOiBPSUQncyBzaG91bGQgYmUgZ2l2ZW4gb3V0IGJ5IFJQQ1NTICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSwgemVybyBpcyBpbnZhbGlkIE9JRCAoQ1MgY3MpICovCn07CgovKiB0aGlzIGlzIHdoYXQgaXMgc3RvcmVkIGluIFRFQi0+UmVzZXJ2ZWRGb3JPbGUgKi8Kc3RydWN0IG9sZXRscwp7CiAgICBzdHJ1Y3QgYXBhcnRtZW50ICphcHQ7CiAgICBJRXJyb3JJbmZvICAgICAgICplcnJvcmluZm87ICAgLyogc2VlIGVycm9yaW5mby5jICovCiAgICBJVW5rbm93biAgICAgICAgICpzdGF0ZTsgICAgICAgLyogc2VlIENvU2V0U3RhdGUgKi8KICAgIERXT1JEICAgICAgICAgICAgaW5pdHM7ICAgICAgICAvKiBudW1iZXIgb2YgdGltZXMgQ29Jbml0aWFsaXplRXggY2FsbGVkICovCn07CgoKLyogR2xvYmFsIEludGVyZmFjZSBUYWJsZSBGdW5jdGlvbnMgKi8KCmV4dGVybiB2b2lkKiBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9Db25zdHJ1Y3Qodm9pZCk7CmV4dGVybiB2b2lkICBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9EZXN0cm95KHZvaWQqIHNlbGYpOwpleHRlcm4gSFJFU1VMVCBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9HZXRGYWN0b3J5KExQVk9JRCAqcHB2KTsKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlSW5zdGFuY2U7CgovKiBGSVhNRTogdGhlc2Ugc2hvdWxkbid0IGJlIG5lZWRlZCwgZXhjZXB0IGZvciAxNi1iaXQgZnVuY3Rpb25zICovCmV4dGVybiBIUkVTVUxUIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCxMUFNUUiBpZHN0cik7CkhSRVNVTFQgV0lOQVBJIF9fQ0xTSURGcm9tU3RyaW5nQShMUENTVFIgaWRzdHIsIENMU0lEICppZCk7CgpEV09SRCBDT01fT3BlbktleUZvckNMU0lEKFJFRkNMU0lEIGNsc2lkLCBSRUdTQU0gYWNjZXNzLCBIS0VZICprZXkpOwpIUkVTVUxUIE1BUlNIQUxfR2V0U3RhbmRhcmRNYXJzaGFsQ0YoTFBWT0lEICpwcHYpOwoKLyogU3R1YiBNYW5hZ2VyICovCgpVTE9ORyBzdHViX21hbmFnZXJfaW50X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpuZXdfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBJVW5rbm93biAqb2JqZWN0LCBNU0hMRkxBR1MgbXNobGZsYWdzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX25ld19pZnN0dWIoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgSVJwY1N0dWJCdWZmZXIgKnNiLCBJVW5rbm93biAqaXB0ciwgUkVGSUlEIGlpZCk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIE9JRCBvaWQpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyX2Zyb21fb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCB2b2lkICpvYmplY3QpOwpCT09MIHN0dWJfbWFuYWdlcl9ub3RpZnlfdW5tYXJzaGFsKHN0cnVjdCBzdHViX21hbmFnZXIgKm0pOwpCT09MIHN0dWJfbWFuYWdlcl9pc190YWJsZV9tYXJzaGFsZWQoc3RydWN0IHN0dWJfbWFuYWdlciAqbSk7CnZvaWQgc3R1Yl9tYW5hZ2VyX3JlbGVhc2VfbWFyc2hhbF9kYXRhKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMpOwpIUkVTVUxUIGlwaWRfdG9fc3R1Yl9tYW5hZ2VyKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0LCBzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICoqc3R1Ym1ncl9yZXQpOwpJUnBjU3R1YkJ1ZmZlciAqaXBpZF90b19hcHRfYW5kX3N0dWJidWZmZXIoY29uc3QgSVBJRCAqaXBpZCwgQVBBUlRNRU5UICoqc3R1Yl9hcHQpOwpIUkVTVUxUIHN0YXJ0X2FwYXJ0bWVudF9yZW1vdGVfdW5rbm93bih2b2lkKTsKCkhSRVNVTFQgbWFyc2hhbF9vYmplY3QoQVBBUlRNRU5UICphcHQsIFNURE9CSlJFRiAqc3Rkb2JqcmVmLCBSRUZJSUQgcmlpZCwgSVVua25vd24gKm9iaiwgTVNITEZMQUdTIG1zaGxmbGFncyk7CgovKiBSUEMgQmFja2VuZCAqLwoKc3RydWN0IGRpc3BhdGNoX3BhcmFtczsKCnZvaWQgICAgUlBDX1N0YXJ0UmVtb3Rpbmcoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBSUENfQ3JlYXRlQ2xpZW50Q2hhbm5lbChjb25zdCBPWElEICpveGlkLCBjb25zdCBJUElEICppcGlkLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKnBpcGVidWYpOwpIUkVTVUxUIFJQQ19FeGVjdXRlQ2FsbChzdHJ1Y3QgZGlzcGF0Y2hfcGFyYW1zICpwYXJhbXMpOwpIUkVTVUxUIFJQQ19SZWdpc3RlckludGVyZmFjZShSRUZJSUQgcmlpZCk7CnZvaWQgICAgUlBDX1VucmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwp2b2lkICAgIFJQQ19TdGFydExvY2FsU2VydmVyKFJFRkNMU0lEIGNsc2lkLCBJU3RyZWFtICpzdHJlYW0pOwpIUkVTVUxUIFJQQ19HZXRMb2NhbENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpOwoKLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX0luaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9VbkluaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIGRlY29tcG9zZXMgYSBTdHJpbmcgcGF0aCB0byBhIFN0cmluZyBUYWJsZSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgKCJcIiBvciAic3ViRGlyZWN0b3J5IiBvciAiRGlyZWN0b3J5IiBvciAiRmlsZU5hbWUiKSBvZiB0aGUgcGF0aCAqLwppbnQgRmlsZU1vbmlrZXJJbXBsX0RlY29tcG9zZVBhdGgoTFBDT0xFU1RSIHN0ciwgTFBPTEVTVFIqKiBzdHJpbmdUYWJsZSk7CgoKLyogQXBhcnRtZW50IEZ1bmN0aW9ucyAqLwoKQVBBUlRNRU5UICphcGFydG1lbnRfZmluZGZyb21veGlkKE9YSUQgb3hpZCwgQk9PTCByZWYpOwpBUEFSVE1FTlQgKmFwYXJ0bWVudF9maW5kZnJvbXRpZChEV09SRCB0aWQpOwpEV09SRCBhcGFydG1lbnRfYWRkcmVmKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkRXT1JEIGFwYXJ0bWVudF9yZWxlYXNlKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhSRVNVTFQgYXBhcnRtZW50X2Rpc2Nvbm5lY3Rwcm94aWVzKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CnZvaWQgYXBhcnRtZW50X2Rpc2Nvbm5lY3RvYmplY3Qoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCB2b2lkICpvYmplY3QpOwpzdGF0aWMgaW5saW5lIEhSRVNVTFQgYXBhcnRtZW50X2dldG94aWQoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCBPWElEICpveGlkKQp7CiAgICAqb3hpZCA9IGFwdC0+b3hpZDsKICAgIHJldHVybiBTX09LOwp9CgoKLyogRENPTSBtZXNzYWdlcyB1c2VkIGJ5IHRoZSBhcGFydG1lbnQgd2luZG93IChub3QgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSkgKi8KI2RlZmluZSBETV9FWEVDVVRFUlBDICAgKFdNX1VTRVIgKyAwKSAvKiBXUEFSQU0gPSAwLCBMUEFSQU0gPSAoc3RydWN0IGRpc3BhdGNoX3BhcmFtcyAqKSAqLwoKLyoKICogUGVyLXRocmVhZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgVEVCIG9uIG9mZnNldCAweEY4MCwKICogc2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMTA5OS9idWdzbGF5ZXIvYnVnc2xheWVyMTA5OS5odG0KICovCgovKiB3aWxsIGNyZWF0ZSBpZiBuZWNlc3NhcnkgKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2xldGxzICpDT01fQ3VycmVudEluZm8odm9pZCkKewogICAgaWYgKCFOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGUpCiAgICAgICAgTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihzdHJ1Y3Qgb2xldGxzKSk7CgogICAgcmV0dXJuIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZTsKfQoKc3RhdGljIGlubGluZSBBUEFSVE1FTlQqIENPTV9DdXJyZW50QXB0KHZvaWQpCnsgIAogICAgcmV0dXJuIENPTV9DdXJyZW50SW5mbygpLT5hcHQ7Cn0KCiNkZWZpbmUgSUNPTV9USElTX01VTFRJKGltcGwsZmllbGQsaWZhY2UpIGltcGwqIGNvbnN0IFRoaXM9KGltcGwqKSgoY2hhciopKGlmYWNlKSAtIG9mZnNldG9mKGltcGwsZmllbGQpKQoKLyogaGVscGVycyBmb3IgZGVidWdnaW5nICovCiNpZmRlZiBfX2kzODZfXwojIGRlZmluZSBERUJVR19TRVRfQ1JJVFNFQ19OQU1FKGNzLCBuYW1lKSAoY3MpLT5EZWJ1Z0luZm8tPlNwYXJlWzFdID0gKERXT1JEKShfX0ZJTEVfXyAiOiAiIG5hbWUpCiMgZGVmaW5lIERFQlVHX0NMRUFSX0NSSVRTRUNfTkFNRShjcykgKGNzKS0+RGVidWdJbmZvLT5TcGFyZVsxXSA9IDAKI2Vsc2UKIyBkZWZpbmUgREVCVUdfU0VUX0NSSVRTRUNfTkFNRShjcywgbmFtZSkKIyBkZWZpbmUgREVCVUdfQ0xFQVJfQ1JJVFNFQ19OQU1FKGNzKQojZW5kaWYKCmV4dGVybiBISU5TVEFOQ0UgT0xFMzJfaEluc3RhbmNlOyAvKiBGSVhNRTogbWFrZSBzdGF0aWMgKi8KCiNkZWZpbmUgQ0hBUlNfSU5fR1VJRCAzOSAvKiBpbmNsdWRpbmcgTlVMTCAqLwoKI2VuZGlmIC8qIF9fV0lORV9PTEVfQ09NUE9CSl9IICovCg==