LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCi8qIFRocmVhZC1zYWZldHkgQW5ub3RhdGlvbiBMZWdlbmQ6CiAqCiAqIFJPICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb25seS4gSXQgbmV2ZXIgY2hhbmdlcyBhZnRlciBjcmVhdGlvbiwgc28gbm8KICogICAgICAgICBsb2NraW5nIGlzIHJlcXVpcmVkLgogKiBMT0NLICAtIFRoZSB2YWx1ZSBpcyB3cml0dGVuIHRvIG9ubHkgdXNpbmcgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucy4KICogQ1MgICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24uCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJDUyIgaXMgdGhlIHNwZWNpZmljIGNyaXRpY2FsIHNldGlvbiB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKiBNVVRFWCAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gd2l0aCBhIG11dGV4IGhlbGQuCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJNVVRFWCIgaXMgdGhlIHNwZWNpZmljIG11dGV4IHRoYXQKICogICAgICAgICBtdXN0IGJlIHVzZWQuCiAqLwoKdHlwZWRlZiBlbnVtIGlmc3R1Yl9zdGF0ZQp7CiAgICBTVFVCU1RBVEVfTk9STUFMX01BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9OT1JNQUxfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19VTk1BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9TVFJPTkcsCn0gU1RVQl9TVEFURTsKCi8qIGFuIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBpZnN0dWIgICAKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gc3R1Yl9tYW5hZ2VyLT5pZnN0dWJzIGxpc3QgKENTIHN0dWJfbWFuYWdlci0+bG9jaykgKi8KICAgIElScGNTdHViQnVmZmVyICAgKnN0dWJidWZmZXI7IC8qIFJPICovCiAgICBJSUQgICAgICAgICAgICAgICBpaWQ7ICAgICAgICAvKiBSTyAqLwogICAgSVBJRCAgICAgICAgICAgICAgaXBpZDsgICAgICAgLyogUk8gKi8KICAgIElVbmtub3duICAgICAgICAgKmlmYWNlOyAgICAgIC8qIFJPICovCiAgICBNU0hMRkxBR1MgICAgICAgICBmbGFnczsgICAgICAvKiBzbyB3ZSBjYW4gZW5mb3JjZSBwcm9jZXNzLWxvY2FsIG1hcnNoYWxsaW5nIHJ1bGVzIChSTykgKi8KICAgIElScGNDaGFubmVsQnVmZmVyKmNoYW47ICAgICAgIC8qIGNoYW5uZWwgcGFzc2VkIHRvIElScGNTdHViQnVmZmVyOjpJbnZva2UgKFJPKSAqLwp9OwoKCi8qIHN0dWIgbWFuYWdlcnMgaG9sZCByZWZzIG9uIHRoZSBvYmplY3QgYW5kIGVhY2ggaW50ZXJmYWNlIHN0dWIgKi8Kc3RydWN0IHN0dWJfbWFuYWdlcgp7CiAgICBzdHJ1Y3QgbGlzdCAgICAgICBlbnRyeTsgICAgICAvKiBlbnRyeSBpbiBhcGFydG1lbnQgc3R1Ym1nciBsaXN0IChDUyBhcHQtPmNzKSAqLwogICAgc3RydWN0IGxpc3QgICAgICAgaWZzdHViczsgICAgLyogbGlzdCBvZiBhY3RpdmUgaWZzdHVicyBmb3IgdGhlIG9iamVjdCAoQ1MgbG9jaykgKi8KICAgIENSSVRJQ0FMX1NFQ1RJT04gIGxvY2s7CiAgICBBUEFSVE1FTlQgICAgICAgICphcHQ7ICAgICAgICAvKiBvd25pbmcgYXB0IChSTykgKi8KCiAgICBVTE9ORyAgICAgICAgICAgICBleHRyZWZzOyAgICAvKiBudW1iZXIgb2YgJ2V4dGVybmFsJyByZWZlcmVuY2VzIChDUyBsb2NrKSAqLwogICAgVUxPTkcgICAgICAgICAgICAgcmVmczsgICAgICAgLyogaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50IChDUyBhcHQtPmNzKSAqLwogICAgT0lEICAgICAgICAgICAgICAgb2lkOyAgICAgICAgLyogYXBhcnRtZW50LXNjb3BlZCB1bmlxdWUgaWRlbnRpZmllciAoUk8pICovCiAgICBJVW5rbm93biAgICAgICAgICpvYmplY3Q7ICAgICAvKiB0aGUgb2JqZWN0IHdlIGFyZSBtYW5hZ2luZyB0aGUgc3R1YiBmb3IgKFJPKSAqLwogICAgVUxPTkcgICAgICAgICAgICAgbmV4dF9pcGlkOyAgLyogY3VycmVudGx5IHVudXNlZCAoTE9DSykgKi8KCiAgICAvKiBXZSBuZWVkIHRvIGtlZXAgYSBjb3VudCBvZiB0aGUgb3V0c3RhbmRpbmcgbWFyc2hhbHMsIHNvIHdlIGNhbiBlbmZvcmNlIHRoZQogICAgICogbWFyc2hhbGxpbmcgcnVsZXMgKGllLCB5b3UgY2FuIG9ubHkgdW5tYXJzaGFsIG5vcm1hbCBtYXJzaGFscyBvbmNlKS4gTm90ZQogICAgICogdGhhdCB0aGVzZSBjb3VudHMgZG8gTk9UIGluY2x1ZGUgdW5tYXJzaGFsbGVkIGludGVyZmFjZXMsIG9uY2UgYSBzdHJlYW0gaXMKICAgICAqIHVubWFyc2hhbGxlZCBhbmQgYSBwcm94eSBzZXQgdXAsIHRoaXMgY291bnQgaXMgZGVjcmVtZW50ZWQuCiAgICAgKi8KCiAgICBVTE9ORyAgICAgICAgICAgICBub3JtX3JlZnM7ICAvKiByZWZjb3VudCBvZiBub3JtYWwgbWFyc2hhbHMgKENTIGxvY2spICovCn07CgovKiBpbXBvcnRlZCBpbnRlcmZhY2UgcHJveHkgKi8Kc3RydWN0IGlmcHJveHkKewogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAvKiBlbnRyeSBpbiBwcm94eV9tYW5hZ2VyIGxpc3QgKENTIHBhcmVudC0+Y3MpICovCiAgc3RydWN0IHByb3h5X21hbmFnZXIgKnBhcmVudDsgLyogb3duaW5nIHByb3h5X21hbmFnZXIgKFJPKSAqLwogIExQVk9JRCBpZmFjZTsgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciAoUk8pICovCiAgU1RET0JKUkVGIHN0ZG9ianJlZjsgICAgIC8qIG1hcnNoYWwgZGF0YSB0aGF0IHJlcHJlc2VudHMgdGhpcyBvYmplY3QgKFJPKSAqLwogIElJRCBpaWQ7ICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgSUQgKFJPKSAqLwogIExQUlBDUFJPWFlCVUZGRVIgcHJveHk7ICAvKiBpbnRlcmZhY2UgcHJveHkgKFJPKSAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBpbXBvcnRlZCAocHVibGljKSByZWZlcmVuY2VzIChNVVRFWCBwYXJlbnQtPnJlbW90aW5nX211dGV4KSAqLwogIElScGNDaGFubmVsQnVmZmVyICpjaGFuOyAvKiBjaGFubmVsIHRvIG9iamVjdCAoQ1MgcGFyZW50LT5jcykgKi8KfTsKCi8qIGltcG9ydGVkIG9iamVjdCAvIHByb3h5IG1hbmFnZXIgKi8Kc3RydWN0IHByb3h5X21hbmFnZXIKewogIGNvbnN0IElNdWx0aVFJVnRibCAqbHBWdGJsOwogIGNvbnN0IElNYXJzaGFsVnRibCAqbHBWdGJsTWFyc2hhbDsKICBzdHJ1Y3QgYXBhcnRtZW50ICpwYXJlbnQ7IC8qIG93bmluZyBhcGFydG1lbnQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IChDUyBwYXJlbnQtPmNzKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVkIElEIChSTykgKi8KICBPSUQgb2lkOyAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCAoUk8pICovCiAgc3RydWN0IGxpc3QgaW50ZXJmYWNlczsgICAvKiBpbXBvcnRlZCBpbnRlcmZhY2VzIChDUyBjcykgKi8KICBMT05HIHJlZnM7ICAgICAgICAgICAgICAgIC8qIHByb3h5IHJlZmVyZW5jZSBjb3VudCAoTE9DSykgKi8KICBDUklUSUNBTF9TRUNUSU9OIGNzOyAgICAgIC8qIHRocmVhZCBzYWZldHkgZm9yIHRoaXMgb2JqZWN0IGFuZCBjaGlsZHJlbiAqLwogIFVMT05HIHNvcmZsYWdzOyAgICAgICAgICAgLyogU1RET0JKUkVGIGZsYWdzIChSTykgKi8KICBJUmVtVW5rbm93biAqcmVtdW5rOyAgICAgIC8qIHByb3h5IHRvIElSZW1Vbmtub3duIHVzZWQgZm9yIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChDUyBjcykgKi8KICBIQU5ETEUgcmVtb3RpbmdfbXV0ZXg7ICAgIC8qIG11dGV4IHVzZWQgZm9yIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIElSZW1Vbmtub3duICovCiAgTVNIQ1RYIGRlc3RfY29udGV4dDsgICAgICAvKiBjb250ZXh0IHVzZWQgZm9yIGFjdGl2YXRpbmcgb3B0aW1pc2F0aW9ucyAoTE9DSykgKi8KICB2b2lkICpkZXN0X2NvbnRleHRfZGF0YTsgIC8qIHJlc2VydmVkIGNvbnRleHQgdmFsdWUgKExPQ0spICovCn07CgovKiB0aGlzIG5lZWRzIHRvIGJlY29tZSBhIENPTSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIElSZW1Vbmtub3duICovCnN0cnVjdCBhcGFydG1lbnQKewogIHN0cnVjdCBsaXN0IGVudHJ5OwoKICBMT05HICByZWZzOyAgICAgICAgICAgICAgLyogcmVmY291bnQgb2YgdGhlIGFwYXJ0bWVudCAoTE9DSykgKi8KICBCT09MIG11bHRpX3RocmVhZGVkOyAgICAgLyogbXVsdGktdGhyZWFkZWQgb3Igc2luZ2xlLXRocmVhZGVkIGFwYXJ0bWVudD8gKFJPKSAqLwogIERXT1JEIHRpZDsgICAgICAgICAgICAgICAvKiB0aHJlYWQgaWQgKFJPKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZXIgSUQgKFJPKSAqLwogIExPTkcgaXBpZGM7ICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSAoTE9DSykgKi8KICBIV05EIHdpbjsgICAgICAgICAgICAgICAgLyogbWVzc2FnZSB3aW5kb3cgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgIC8qIHRocmVhZCBzYWZldHkgKi8KICBMUE1FU1NBR0VGSUxURVIgZmlsdGVyOyAgLyogbWVzc2FnZSBmaWx0ZXIgKENTIGNzKSAqLwogIHN0cnVjdCBsaXN0IHByb3hpZXM7ICAgICAvKiBpbXBvcnRlZCBvYmplY3RzIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBzdHVibWdyczsgICAgLyogc3R1YiBtYW5hZ2VycyBmb3IgZXhwb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgQk9PTCByZW11bmtfZXhwb3J0ZWQ7ICAgIC8qIGhhcyB0aGUgSVJlbVVua25vd24gaW50ZXJmYWNlIGZvciB0aGlzIGFwYXJ0bWVudCBiZWVuIGNyZWF0ZWQgeWV0PyAoQ1MgY3MpICovCiAgTE9ORyByZW1vdGluZ19zdGFydGVkOyAgIC8qIGhhcyB0aGUgUlBDIHN5c3RlbSBiZWVuIHN0YXJ0ZWQgZm9yIHRoaXMgYXBhcnRtZW50PyAoTE9DSykgKi8KCiAgLyogRklYTUU6IE9JRCdzIHNob3VsZCBiZSBnaXZlbiBvdXQgYnkgUlBDU1MgKi8KICBPSUQgb2lkYzsgICAgICAgICAgICAgICAgLyogb2JqZWN0IElEIGNvdW50ZXIsIHN0YXJ0cyBhdCAxLCB6ZXJvIGlzIGludmFsaWQgT0lEIChDUyBjcykgKi8KfTsKCi8qIHRoaXMgaXMgd2hhdCBpcyBzdG9yZWQgaW4gVEVCLT5SZXNlcnZlZEZvck9sZSAqLwpzdHJ1Y3Qgb2xldGxzCnsKICAgIHN0cnVjdCBhcGFydG1lbnQgKmFwdDsKICAgIElFcnJvckluZm8gICAgICAgKmVycm9yaW5mbzsgICAvKiBzZWUgZXJyb3JpbmZvLmMgKi8KICAgIElVbmtub3duICAgICAgICAgKnN0YXRlOyAgICAgICAvKiBzZWUgQ29TZXRTdGF0ZSAqLwogICAgRFdPUkQgICAgICAgICAgICBpbml0czsgICAgICAgIC8qIG51bWJlciBvZiB0aW1lcyBDb0luaXRpYWxpemVFeCBjYWxsZWQgKi8KfTsKCgovKiBHbG9iYWwgSW50ZXJmYWNlIFRhYmxlIEZ1bmN0aW9ucyAqLwoKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0NvbnN0cnVjdCh2b2lkKTsKZXh0ZXJuIHZvaWQgIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0Rlc3Ryb3kodm9pZCogc2VsZik7CmV4dGVybiBIUkVTVUxUIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0dldEZhY3RvcnkoTFBWT0lEICpwcHYpOwpleHRlcm4gdm9pZCogU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVJbnN0YW5jZTsKCi8qIEZJWE1FOiB0aGVzZSBzaG91bGRuJ3QgYmUgbmVlZGVkLCBleGNlcHQgZm9yIDE2LWJpdCBmdW5jdGlvbnMgKi8KZXh0ZXJuIEhSRVNVTFQgV0lORV9TdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLExQU1RSIGlkc3RyKTsKCkhSRVNVTFQgQ09NX09wZW5LZXlGb3JDTFNJRChSRUZDTFNJRCBjbHNpZCwgTFBDV1NUUiBrZXluYW1lLCBSRUdTQU0gYWNjZXNzLCBIS0VZICprZXkpOwpIUkVTVUxUIE1BUlNIQUxfR2V0U3RhbmRhcmRNYXJzaGFsQ0YoTFBWT0lEICpwcHYpOwoKLyogU3R1YiBNYW5hZ2VyICovCgpVTE9ORyBzdHViX21hbmFnZXJfaW50X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpuZXdfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBJVW5rbm93biAqb2JqZWN0KTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX25ld19pZnN0dWIoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgSVJwY1N0dWJCdWZmZXIgKnNiLCBJVW5rbm93biAqaXB0ciwgUkVGSUlEIGlpZCwgTVNITEZMQUdTIGZsYWdzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX2ZpbmRfaWZzdHViKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFJFRklJRCBpaWQsIE1TSExGTEFHUyBmbGFncyk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIE9JRCBvaWQpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyX2Zyb21fb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCB2b2lkICpvYmplY3QpOwpCT09MIHN0dWJfbWFuYWdlcl9ub3RpZnlfdW5tYXJzaGFsKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwpCT09MIHN0dWJfbWFuYWdlcl9pc190YWJsZV9tYXJzaGFsZWQoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgY29uc3QgSVBJRCAqaXBpZCk7CnZvaWQgc3R1Yl9tYW5hZ2VyX3JlbGVhc2VfbWFyc2hhbF9kYXRhKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMsIGNvbnN0IElQSUQgKmlwaWQpOwpIUkVTVUxUIGlwaWRfdG9fc3R1Yl9tYW5hZ2VyKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0LCBzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICoqc3R1Ym1ncl9yZXQpOwpIUkVTVUxUIGlwaWRfZ2V0X2Rpc3BhdGNoX3BhcmFtcyhjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgSVJwY1N0dWJCdWZmZXIgKipzdHViLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwpIUkVTVUxUIHN0YXJ0X2FwYXJ0bWVudF9yZW1vdGVfdW5rbm93bih2b2lkKTsKCkhSRVNVTFQgbWFyc2hhbF9vYmplY3QoQVBBUlRNRU5UICphcHQsIFNURE9CSlJFRiAqc3Rkb2JqcmVmLCBSRUZJSUQgcmlpZCwgSVVua25vd24gKm9iaiwgTVNITEZMQUdTIG1zaGxmbGFncyk7CgovKiBSUEMgQmFja2VuZCAqLwoKc3RydWN0IGRpc3BhdGNoX3BhcmFtczsKCnZvaWQgICAgUlBDX1N0YXJ0UmVtb3Rpbmcoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBSUENfQ3JlYXRlQ2xpZW50Q2hhbm5lbChjb25zdCBPWElEICpveGlkLCBjb25zdCBJUElEICppcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRlc3RfY29udGV4dCwgdm9pZCAqZGVzdF9jb250ZXh0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJwY0NoYW5uZWxCdWZmZXIgKipjaGFuKTsKSFJFU1VMVCBSUENfQ3JlYXRlU2VydmVyQ2hhbm5lbChJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwp2b2lkICAgIFJQQ19FeGVjdXRlQ2FsbChzdHJ1Y3QgZGlzcGF0Y2hfcGFyYW1zICpwYXJhbXMpOwpIUkVTVUxUIFJQQ19SZWdpc3RlckludGVyZmFjZShSRUZJSUQgcmlpZCk7CnZvaWQgICAgUlBDX1VucmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwp2b2lkICAgIFJQQ19TdGFydExvY2FsU2VydmVyKFJFRkNMU0lEIGNsc2lkLCBJU3RyZWFtICpzdHJlYW0pOwpIUkVTVUxUIFJQQ19HZXRMb2NhbENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpOwoKLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX0luaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9VbkluaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIGRlY29tcG9zZXMgYSBTdHJpbmcgcGF0aCB0byBhIFN0cmluZyBUYWJsZSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgKCJcIiBvciAic3ViRGlyZWN0b3J5IiBvciAiRGlyZWN0b3J5IiBvciAiRmlsZU5hbWUiKSBvZiB0aGUgcGF0aCAqLwppbnQgRmlsZU1vbmlrZXJJbXBsX0RlY29tcG9zZVBhdGgoTFBDT0xFU1RSIHN0ciwgTFBPTEVTVFIqKiBzdHJpbmdUYWJsZSk7CgoKLyogQXBhcnRtZW50IEZ1bmN0aW9ucyAqLwoKQVBBUlRNRU5UICphcGFydG1lbnRfZmluZGZyb21veGlkKE9YSUQgb3hpZCwgQk9PTCByZWYpOwpBUEFSVE1FTlQgKmFwYXJ0bWVudF9maW5kZnJvbXRpZChEV09SRCB0aWQpOwpEV09SRCBhcGFydG1lbnRfYWRkcmVmKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkRXT1JEIGFwYXJ0bWVudF9yZWxlYXNlKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhSRVNVTFQgYXBhcnRtZW50X2Rpc2Nvbm5lY3Rwcm94aWVzKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CnZvaWQgYXBhcnRtZW50X2Rpc2Nvbm5lY3RvYmplY3Qoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCB2b2lkICpvYmplY3QpOwpzdGF0aWMgaW5saW5lIEhSRVNVTFQgYXBhcnRtZW50X2dldG94aWQoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCBPWElEICpveGlkKQp7CiAgICAqb3hpZCA9IGFwdC0+b3hpZDsKICAgIHJldHVybiBTX09LOwp9CkhSRVNVTFQgYXBhcnRtZW50X2NyZWF0ZXdpbmRvd2lmbmVlZGVkKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhXTkQgYXBhcnRtZW50X2dldHdpbmRvdyhzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwp2b2lkIGFwYXJ0bWVudF9qb2lubXRhKHZvaWQpOwoKCi8qIERDT00gbWVzc2FnZXMgdXNlZCBieSB0aGUgYXBhcnRtZW50IHdpbmRvdyAobm90IGNvbXBhdGlibGUgd2l0aCBuYXRpdmUpICovCiNkZWZpbmUgRE1fRVhFQ1VURVJQQyAgIChXTV9VU0VSICsgMCkgLyogV1BBUkFNID0gMCwgTFBBUkFNID0gKHN0cnVjdCBkaXNwYXRjaF9wYXJhbXMgKikgKi8KCi8qCiAqIFBlci10aHJlYWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIFRFQiBvbiBvZmZzZXQgMHhGODAsCiAqIHNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNqLzEwOTkvYnVnc2xheWVyL2J1Z3NsYXllcjEwOTkuaHRtCiAqLwoKLyogd2lsbCBjcmVhdGUgaWYgbmVjZXNzYXJ5ICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IG9sZXRscyAqQ09NX0N1cnJlbnRJbmZvKHZvaWQpCnsKICAgIGlmICghTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlKQogICAgICAgIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2Yoc3RydWN0IG9sZXRscykpOwoKICAgIHJldHVybiBOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGU7Cn0KCnN0YXRpYyBpbmxpbmUgQVBBUlRNRU5UKiBDT01fQ3VycmVudEFwdCh2b2lkKQp7ICAKICAgIHJldHVybiBDT01fQ3VycmVudEluZm8oKS0+YXB0Owp9CgojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSBpbXBsKiBjb25zdCBUaGlzPShpbXBsKikoKGNoYXIqKShpZmFjZSkgLSBvZmZzZXRvZihpbXBsLGZpZWxkKSkKCi8qIGhlbHBlcnMgZm9yIGRlYnVnZ2luZyAqLwojIGRlZmluZSBERUJVR19TRVRfQ1JJVFNFQ19OQU1FKGNzLCBuYW1lKSAoY3MpLT5EZWJ1Z0luZm8tPlNwYXJlWzBdID0gKERXT1JEX1BUUikoX19GSUxFX18gIjogIiBuYW1lKQojIGRlZmluZSBERUJVR19DTEVBUl9DUklUU0VDX05BTUUoY3MpIChjcyktPkRlYnVnSW5mby0+U3BhcmVbMF0gPSAwCgpleHRlcm4gSElOU1RBTkNFIE9MRTMyX2hJbnN0YW5jZTsgLyogRklYTUU6IG1ha2Ugc3RhdGljICovCgojZGVmaW5lIENIQVJTX0lOX0dVSUQgMzkgLyogaW5jbHVkaW5nIE5VTEwgKi8KCi8qIEV4cG9ydGVkIG5vbi1pbnRlcmZhY2UgRGF0YSBBZHZpc2UgSG9sZGVyIGZ1bmN0aW9ucyAqLwpIUkVTVUxUIERhdGFBZHZpc2VIb2xkZXJfT25Db25uZWN0KElEYXRhQWR2aXNlSG9sZGVyICppZmFjZSwgSURhdGFPYmplY3QgKnBEZWxlZ2F0ZSk7CnZvaWQgRGF0YUFkdmlzZUhvbGRlcl9PbkRpc2Nvbm5lY3QoSURhdGFBZHZpc2VIb2xkZXIgKmlmYWNlKTsKCiNlbmRpZiAvKiBfX1dJTkVfT0xFX0NPTVBPQkpfSCAqLwo=