LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCi8qIFRocmVhZC1zYWZldHkgQW5ub3RhdGlvbiBMZWdlbmQ6CiAqCiAqIFJPICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvbmx5LiBJdCBuZXZlciBjaGFuZ2VzIGFmdGVyIGNyZWF0aW9uLCBzbyBubwogKiAgICAgICAgbG9ja2luZyBpcyByZXF1aXJlZC4KICogTE9DSyAtIFRoZSB2YWx1ZSBpcyB3cml0dGVuIHRvIG9ubHkgdXNpbmcgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucy4KICogQ1MgICAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24gaGVsZC4KICogICAgICAgIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyAiQ1MiIGlzIHRoZSBzcGVjaWZpYyBjcml0aWNhbCBzZWN0aW9uIHRoYXQKICogICAgICAgIG11c3QgYmUgdXNlZC4KICovCgp0eXBlZGVmIGVudW0gaWZzdHViX3N0YXRlCnsKICAgIElGU1RVQl9TVEFURV9OT1JNQUxfTUFSU0hBTEVELAogICAgSUZTVFVCX1NUQVRFX05PUk1BTF9VTk1BUlNIQUxFRCwKICAgIElGU1RVQl9TVEFURV9UQUJMRV9NQVJTSEFMRUQKfSBJRlNUVUJfU1RBVEU7CgovKiBhbiBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3QgaWZzdHViICAgCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIHN0dWJfbWFuYWdlci0+aWZzdHVicyBsaXN0IChDUyBzdHViX21hbmFnZXItPmxvY2spICovCiAgICBJUnBjU3R1YkJ1ZmZlciAgICpzdHViYnVmZmVyOyAvKiBSTyAqLwogICAgSUlEICAgICAgICAgICAgICAgaWlkOyAgICAgICAgLyogUk8gKi8KICAgIElQSUQgICAgICAgICAgICAgIGlwaWQ7ICAgICAgIC8qIFJPICovCiAgICBJVW5rbm93biAgICAgICAgICppZmFjZTsgICAgICAvKiBSTyAqLwogICAgSUZTVFVCX1NUQVRFICAgICAgc3RhdGU7ICAgICAgLyogQ1Mgc3R1Yl9tYW5hZ2VyLT5sb2NrICovCn07CgoKLyogc3R1YiBtYW5hZ2VycyBob2xkIHJlZnMgb24gdGhlIG9iamVjdCBhbmQgZWFjaCBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCBzdHVibWdyIGxpc3QgKENTIGFwdC0+Y3MpICovCiAgICBzdHJ1Y3QgbGlzdCAgICAgICBpZnN0dWJzOyAgICAvKiBsaXN0IG9mIGFjdGl2ZSBpZnN0dWJzIGZvciB0aGUgb2JqZWN0IChDUyBsb2NrKSAqLwogICAgQ1JJVElDQUxfU0VDVElPTiAgbG9jazsKICAgIEFQQVJUTUVOVCAgICAgICAgKmFwdDsgICAgICAgIC8qIG93bmluZyBhcHQgKFJPKSAqLwoKICAgIFVMT05HICAgICAgICAgICAgIGV4dHJlZnM7ICAgIC8qIG51bWJlciBvZiAnZXh0ZXJuYWwnIHJlZmVyZW5jZXMgKExPQ0spICovCiAgICBVTE9ORyAgICAgICAgICAgICByZWZzOyAgICAgICAvKiBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQgKENTIGFwdC0+Y3MpICovCiAgICBPSUQgICAgICAgICAgICAgICBvaWQ7ICAgICAgICAvKiBhcGFydG1lbnQtc2NvcGVkIHVuaXF1ZSBpZGVudGlmaWVyIChSTykgKi8KICAgIElVbmtub3duICAgICAgICAgKm9iamVjdDsgICAgIC8qIHRoZSBvYmplY3Qgd2UgYXJlIG1hbmFnaW5nIHRoZSBzdHViIGZvciAoUk8pICovCiAgICBVTE9ORyAgICAgICAgICAgICBuZXh0X2lwaWQ7ICAvKiBjdXJyZW50bHkgdW51c2VkIChMT0NLKSAqLwp9OwoKLyogaW1wb3J0ZWQgaW50ZXJmYWNlIHByb3h5ICovCnN0cnVjdCBpZnByb3h5CnsKICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgLyogZW50cnkgaW4gcHJveHlfbWFuYWdlciBsaXN0IChDUyBwYXJlbnQtPmNzKSAqLwogIHN0cnVjdCBwcm94eV9tYW5hZ2VyICpwYXJlbnQ7IC8qIG93bmluZyBwcm94eV9tYW5hZ2VyIChSTykgKi8KICBMUFZPSUQgaWZhY2U7ICAgICAgICAgICAgLyogaW50ZXJmYWNlIHBvaW50ZXIgKFJPKSAqLwogIElJRCBpaWQ7ICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgSUQgKFJPKSAqLwogIElQSUQgaXBpZDsgICAgICAgICAgICAgICAvKiBpbXBvcnRlZCBpbnRlcmZhY2UgSUQgKFJPKSAqLwogIExQUlBDUFJPWFlCVUZGRVIgcHJveHk7ICAvKiBpbnRlcmZhY2UgcHJveHkgKFJPKSAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBpbXBvcnRlZCAocHVibGljKSByZWZlcmVuY2VzIChDUyBwYXJlbnQtPmNzKSAqLwp9OwoKLyogaW1wb3J0ZWQgb2JqZWN0IC8gcHJveHkgbWFuYWdlciAqLwpzdHJ1Y3QgcHJveHlfbWFuYWdlcgp7CiAgY29uc3QgSU11bHRpUUlWdGJsICpscFZ0Ymw7CiAgc3RydWN0IGFwYXJ0bWVudCAqcGFyZW50OyAvKiBvd25pbmcgYXBhcnRtZW50IChSTykgKi8KICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCAoQ1MgcGFyZW50LT5jcykgKi8KICBMUFJQQ0NIQU5ORUxCVUZGRVIgY2hhbjsgIC8qIGNoYW5uZWwgdG8gb2JqZWN0IChDUyBjcykgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBleHBvcnRlZCBJRCAoUk8pICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgSUQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGludGVyZmFjZXM7ICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlcyAoQ1MgY3MpICovCiAgRFdPUkQgcmVmczsgICAgICAgICAgICAgICAvKiBwcm94eSByZWZlcmVuY2UgY291bnQgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgICAvKiB0aHJlYWQgc2FmZXR5IGZvciB0aGlzIG9iamVjdCBhbmQgY2hpbGRyZW4gKi8KICBVTE9ORyBzb3JmbGFnczsgICAgICAgICAgIC8qIFNURE9CSlJFRiBmbGFncyAoUk8pICovCiAgSVJlbVVua25vd24gKnJlbXVuazsgICAgICAvKiBwcm94eSB0byBJUmVtVW5rbm93biB1c2VkIGZvciBsaWZlY3ljbGUgbWFuYWdlbWVudCAoQ1MgY3MpICovCn07CgovKiB0aGlzIG5lZWRzIHRvIGJlY29tZSBhIENPTSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIElSZW1Vbmtub3duICovCnN0cnVjdCBhcGFydG1lbnQKewogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAKCiAgRFdPUkQgcmVmczsgICAgICAgICAgICAgIC8qIHJlZmNvdW50IG9mIHRoZSBhcGFydG1lbnQgKExPQ0spICovCiAgRFdPUkQgbW9kZWw7ICAgICAgICAgICAgIC8qIHRocmVhZGluZyBtb2RlbCAoUk8pICovCiAgRFdPUkQgdGlkOyAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZCAoUk8pICovCiAgSEFORExFIHRocmVhZDsgICAgICAgICAgIC8qIHRocmVhZCBoYW5kbGUgKFJPKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZXIgSUQgKFJPKSAqLwogIERXT1JEIGlwaWRjOyAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSAoTE9DSykgKi8KICBIV05EIHdpbjsgICAgICAgICAgICAgICAgLyogbWVzc2FnZSB3aW5kb3cgKFJPKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgTFBNRVNTQUdFRklMVEVSIGZpbHRlcjsgIC8qIG1lc3NhZ2UgZmlsdGVyIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBwcm94aWVzOyAgICAgLyogaW1wb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgc3RydWN0IGxpc3Qgc3R1Ym1ncnM7ICAgIC8qIHN0dWIgbWFuYWdlcnMgZm9yIGV4cG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIEJPT0wgcmVtdW5rX2V4cG9ydGVkOyAgICAvKiBoYXMgdGhlIElSZW1Vbmtub3duIGludGVyZmFjZSBmb3IgdGhpcyBhcGFydG1lbnQgYmVlbiBjcmVhdGVkIHlldD8gKENTIGNzKSAqLwoKICAvKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGFsbCBiZSByZW1vdmVkIGxvbmcgdGVybSBhcyB0aGV5IGxlYWsgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgZW5jYXBzdWxhdGVkICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSwgemVybyBpcyBpbnZhbGlkIE9JRCAoQ1MgY3MpICovCiAgRFdPUkQgbGlzdGVuZXJ0aWQ7ICAgICAgIC8qIGlkIG9mIGFwYXJ0bWVudF9saXN0ZW5lcl90aHJlYWQgKi8KICBIQU5ETEUgc2h1dGRvd25fZXZlbnQ7ICAgLyogZXZlbnQgdXNlZCB0byB0ZWxsIHRoZSBjbGllbnRfZGlzcGF0Y2hfdGhyZWFkIHRvIHNodXQgZG93biAqLwp9OwoKLyogdGhpcyBpcyB3aGF0IGlzIHN0b3JlZCBpbiBURUItPlJlc2VydmVkRm9yT2xlICovCnN0cnVjdCBvbGV0bHMKewogICAgc3RydWN0IGFwYXJ0bWVudCAqYXB0OwogICAgSUVycm9ySW5mbyAgICAgICAqZXJyb3JpbmZvOyAgIC8qIHNlZSBlcnJvcmluZm8uYyAqLwogICAgSVVua25vd24gICAgICAgICAqc3RhdGU7ICAgICAgIC8qIHNlZSBDb1NldFN0YXRlICovCiAgICBEV09SRCAgICAgICAgICAgIGluaXRzOyAgICAgICAgLyogbnVtYmVyIG9mIHRpbWVzIENvSW5pdGlhbGl6ZUV4IGNhbGxlZCAqLwp9OwoKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0NvbnN0cnVjdCh2b2lkKTsKZXh0ZXJuIHZvaWQgIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0Rlc3Ryb3kodm9pZCogc2VsZik7CmV4dGVybiBIUkVTVUxUIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0dldEZhY3RvcnkoTFBWT0lEICpwcHYpOwoKLyogRklYTUU6IHRoZXNlIHNob3VsZG4ndCBiZSBuZWVkZWQsIGV4Y2VwdCBmb3IgMTYtYml0IGZ1bmN0aW9ucyAqLwpleHRlcm4gSFJFU1VMVCBXSU5FX1N0cmluZ0Zyb21DTFNJRChjb25zdCBDTFNJRCAqaWQsTFBTVFIgaWRzdHIpOwpIUkVTVUxUIFdJTkFQSSBfX0NMU0lERnJvbVN0cmluZ0EoTFBDU1RSIGlkc3RyLCBDTFNJRCAqaWQpOwoKZXh0ZXJuIEhSRVNVTFQgY3JlYXRlX21hcnNoYWxsZWRfcHJveHkoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CgpleHRlcm4gdm9pZCogU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVJbnN0YW5jZTsKCi8qIFN0YW5kYXJkIE1hcnNoYWxsaW5nIGRlZmluaXRpb25zICovCnR5cGVkZWYgc3RydWN0IF93aW5lX21hcnNoYWxfaWQgewogICAgT1hJRCAgICBveGlkOyAgICAgICAvKiBpZCBvZiBhcGFydG1lbnQgKi8KICAgIE9JRCAgICAgb2lkOyAgICAgICAgLyogaWQgb2Ygc3R1YiBtYW5hZ2VyICovCiAgICBJUElEICAgIGlwaWQ7ICAgICAgIC8qIGlkIG9mIGludGVyZmFjZSBwb2ludGVyICovCn0gd2luZV9tYXJzaGFsX2lkOwoKaW5saW5lIHN0YXRpYyBCT09MCk1BUlNIQUxfQ29tcGFyZV9NaWRzKHdpbmVfbWFyc2hhbF9pZCAqbWlkMSx3aW5lX21hcnNoYWxfaWQgKm1pZDIpIHsKICAgIHJldHVybgoJKG1pZDEtPm94aWQgPT0gbWlkMi0+b3hpZCkJJiYKCShtaWQxLT5vaWQgPT0gbWlkMi0+b2lkKQkmJgoJSXNFcXVhbEdVSUQoJihtaWQxLT5pcGlkKSwmKG1pZDItPmlwaWQpKQogICAgOwp9CgpIUkVTVUxUIE1BUlNIQUxfRGlzY29ubmVjdF9Qcm94aWVzKEFQQVJUTUVOVCAqYXB0KTsKSFJFU1VMVCBNQVJTSEFMX0dldFN0YW5kYXJkTWFyc2hhbENGKExQVk9JRCAqcHB2KTsKClVMT05HIHN0dWJfbWFuYWdlcl9pbnRfYWRkcmVmKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpVTE9ORyBzdHViX21hbmFnZXJfaW50X3JlbGVhc2Uoc3RydWN0IHN0dWJfbWFuYWdlciAqVGhpcyk7CnN0cnVjdCBzdHViX21hbmFnZXIgKm5ld19zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIElVbmtub3duICpvYmplY3QpOwpVTE9ORyBzdHViX21hbmFnZXJfZXh0X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMpOwpzdHJ1Y3QgaWZzdHViICpzdHViX21hbmFnZXJfbmV3X2lmc3R1YihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBJUnBjU3R1YkJ1ZmZlciAqc2IsIElVbmtub3duICppcHRyLCBSRUZJSUQgaWlkLCBCT09MIHRhYmxlbWFyc2hhbCk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIE9JRCBvaWQpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyX2Zyb21fb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCB2b2lkICpvYmplY3QpOwp2b2lkIGFwYXJ0bWVudF9kaXNjb25uZWN0X29iamVjdChBUEFSVE1FTlQgKmFwdCwgdm9pZCAqb2JqZWN0KTsKQk9PTCBzdHViX21hbmFnZXJfbm90aWZ5X3VubWFyc2hhbChzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBjb25zdCBJUElEICppcGlkKTsKQk9PTCBzdHViX21hbmFnZXJfaXNfdGFibGVfbWFyc2hhbGVkKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwpIUkVTVUxUIHJlZ2lzdGVyX2lmc3R1YihBUEFSVE1FTlQgKmFwdCwgU1RET0JKUkVGICpzdGRvYmpyZWYsIFJFRklJRCByaWlkLCBJVW5rbm93biAqb2JqLCBNU0hMRkxBR1MgbXNobGZsYWdzKTsKSFJFU1VMVCBpcGlkX3RvX3N0dWJfbWFuYWdlcihjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgc3RydWN0IHN0dWJfbWFuYWdlciAqKnN0dWJtZ3JfcmV0KTsKSVJwY1N0dWJCdWZmZXIgKmlwaWRfdG9fc3R1YmJ1ZmZlcihjb25zdCBJUElEICppcGlkKTsKSFJFU1VMVCBzdGFydF9hcGFydG1lbnRfcmVtb3RlX3Vua25vd24odm9pZCk7CgpJUnBjU3R1YkJ1ZmZlciAqbWlkX3RvX3N0dWJidWZmZXIod2luZV9tYXJzaGFsX2lkICptaWQpOwoKdm9pZCBzdGFydF9hcGFydG1lbnRfbGlzdGVuZXJfdGhyZWFkKHZvaWQpOwoKZXh0ZXJuIEhSRVNVTFQgUElQRV9HZXROZXdQaXBlQnVmKHdpbmVfbWFyc2hhbF9pZCAqbWlkLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKnBpcGVidWYpOwp2b2lkIFJQQ19TdGFydExvY2FsU2VydmVyKFJFRkNMU0lEIGNsc2lkLCBJU3RyZWFtICpzdHJlYW0pOwoKLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX0luaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9VbkluaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIGRlY29tcG9zZXMgYSBTdHJpbmcgcGF0aCB0byBhIFN0cmluZyBUYWJsZSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgKCJcIiBvciAic3ViRGlyZWN0b3J5IiBvciAiRGlyZWN0b3J5IiBvciAiRmlsZU5hbWUiKSBvZiB0aGUgcGF0aCAqLwppbnQgV0lOQVBJIEZpbGVNb25pa2VySW1wbF9EZWNvbXBvc2VQYXRoKExQQ09MRVNUUiBzdHIsIExQT0xFU1RSKiogc3RyaW5nVGFibGUpOwoKLyogY29tcG9iai5jICovCkFQQVJUTUVOVCAqQ09NX0FwYXJ0bWVudEZyb21PWElEKE9YSUQgb3hpZCwgQk9PTCByZWYpOwpBUEFSVE1FTlQgKkNPTV9BcGFydG1lbnRGcm9tVElEKERXT1JEIHRpZCk7CkRXT1JEIENPTV9BcGFydG1lbnRBZGRSZWYoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKRFdPUkQgQ09NX0FwYXJ0bWVudFJlbGVhc2Uoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKCi8qCiAqIFBlci10aHJlYWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIFRFQiBvbiBvZmZzZXQgMHhGODAsCiAqIHNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNqLzEwOTkvYnVnc2xheWVyL2J1Z3NsYXllcjEwOTkuaHRtCiAqLwoKLyogd2lsbCBjcmVhdGUgaWYgbmVjZXNzYXJ5ICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IG9sZXRscyAqQ09NX0N1cnJlbnRJbmZvKHZvaWQpCnsKICAgIGlmICghTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlKQogICAgICAgIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2Yoc3RydWN0IG9sZXRscykpOwoKICAgIHJldHVybiBOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGU7Cn0KCnN0YXRpYyBpbmxpbmUgQVBBUlRNRU5UKiBDT01fQ3VycmVudEFwdCh2b2lkKQp7ICAKICAgIHJldHVybiBDT01fQ3VycmVudEluZm8oKS0+YXB0Owp9CgojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSBpbXBsKiBjb25zdCBUaGlzPShpbXBsKikoKGNoYXIqKShpZmFjZSkgLSBvZmZzZXRvZihpbXBsLGZpZWxkKSkKCiNlbmRpZiAvKiBfX1dJTkVfT0xFX0NPTVBPQkpfSCAqLwo=