QmxvY2sgSW1wbGVtZW50YXRpb24gU3BlY2lmaWNhdGlvbgoKQ29weXJpZ2h0IDIwMDgtMjAwOSBBcHBsZSwgSW5jLgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKMC4gSGlzdG9yeQoKMjAwOC83LzE0ICAtIGNyZWF0ZWQKMjAwOC84LzIxICAtIHJldmlzZWQsIEMrKwoyMDA4LzkvMjQgIC0gYWRkIE5VTEwgaXNhIGZpZWxkIHRvIF9fYmxvY2sgc3RvcmFnZQoyMDA4LzEwLzEgIC0gcmV2aXNlIGJsb2NrIGxheW91dCB0byB1c2UgYSBzdGF0aWMgZGVzY3JpcHRvciBzdHJ1Y3R1cmUKMjAwOC8xMC82ICAtIHJldmlzZSBibG9jayBsYXlvdXQgdG8gdXNlIGFuIHVuc2lnbmVkIGxvbmcgaW50IGZsYWdzCjIwMDgvMTAvMjggLSBzcGVjaWZ5IHVzZSBvZiBfQmxvY2tfb2JqZWN0X2Fzc2lnbi9kaXNwb3NlIGZvciBhbGwgIk9iamVjdCIgdHlwZXMgaW4gaGVscGVyIGZ1bmN0aW9ucwoyMDA4LzEwLzMwIC0gcmV2aXNlIG5ldyBsYXlvdXQgdG8gaGF2ZSBpbnZva2UgZnVuY3Rpb24gaW4gc2FtZSBwbGFjZQoyMDA4LzEwLzMwIC0gYWRkIF9fd2VhayBzdXBwb3J0CgpUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQXBwbGUgQUJJIGltcGxlbWVudGF0aW9uIHNwZWNpZmljYXRpb24gb2YgQmxvY2tzLgoKMS4gSGlnaCBMZXZlbAoKQSBCbG9jayBjb25zaXN0cyBvZiBhIHN0cnVjdHVyZSBvZiB0aGUgZm9sbG93aW5nIGZvcm06CgpzdHJ1Y3QgQmxvY2tfbGl0ZXJhbF8xIHsKICAgIHZvaWQgKmlzYTsgLy8gaW5pdGlhbGl6ZWQgdG8gJl9OU0NvbmNyZXRlU3RhY2tCbG9jayBvciAmX05TQ29uY3JldGVHbG9iYWxCbG9jawogICAgaW50IGZsYWdzOwogICAgaW50IHJlc2VydmVkOyAKICAgIHZvaWQgKCppbnZva2UpKHZvaWQgKiwgLi4uKTsKICAgIHN0cnVjdCBCbG9ja19kZXNjcmlwdG9yXzEgewoJdW5zaWduZWQgbG9uZyBpbnQgcmVzZXJ2ZWQ7CS8vIE5VTEwKICAgIAl1bnNpZ25lZCBsb25nIGludCBzaXplOyAgLy8gc2l6ZW9mKHN0cnVjdCBCbG9ja19saXRlcmFsXzEpCgkvLyBvcHRpb25hbCBoZWxwZXIgZnVuY3Rpb25zCiAgICAJdm9pZCAoKmNvcHlfaGVscGVyKSh2b2lkICpkc3QsIHZvaWQgKnNyYyk7CiAgICAJdm9pZCAoKmRpc3Bvc2VfaGVscGVyKSh2b2lkICpzcmMpOyAKICAgIH0gKmRlc2NyaXB0b3I7CiAgICAvLyBpbXBvcnRlZCB2YXJpYWJsZXMKfTsKClRoZSBmb2xsb3dpbmcgZmxhZ3MgYml0cyBhcmUgdXNlZCBieSB0aGUgY29tcGlsZXI6CgplbnVtIHsKICAgIEJMT0NLX0hBU19DT1BZX0RJU1BPU0UgPSAgKDEgPDwgMjUpLAogICAgQkxPQ0tfSEFTX0NUT1IgPSAgICAgICAgICAoMSA8PCAyNiksIC8vIGhlbHBlcnMgaGF2ZSBDKysgY29kZQogICAgQkxPQ0tfSVNfR0xPQkFMID0gICAgICAgICAoMSA8PCAyOCksCiAgICBCTE9DS19IQVNfREVTQ1JJUFRPUiA9ICAgICgxIDw8IDI5KSwgLy8gaW50ZXJpbSB1bnRpbCBjb21wbGV0ZSB3b3JsZCBidWlsZCBpcyBhY2NvbXBsaXNoZWQKfTsKCkJsb2NrIGxpdGVyYWxzIG1heSBvY2N1ciB3aXRoaW4gZnVuY3Rpb25zIHdoZXJlIHRoZSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCBpbiBzdGFjayBsb2NhbCBtZW1vcnkuICBUaGV5IG1heSBhbHNvIGFwcGVhciBhcyBpbml0aWFsaXphdGlvbiBleHByZXNzaW9ucyBmb3IgQmxvY2sgdmFyaWFibGVzIG9mIGdsb2JhbCBvciBzdGF0aWMgbG9jYWwgdmFyaWFibGVzLgoKV2hlbiBhIEJsb2NrIGxpdGVyYWwgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgdGhlIHN0YWNrIGJhc2VkIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBhcyBmb2xsb3dzOgoKMSkgc3RhdGljIGRlc2NyaXB0b3Igc3RydWN0dXJlIGlzIGRlY2xhcmVkIGFuZCBpbml0aWFsaXplZCBhcyBmb2xsb3dzOgoxYSkgdGhlIGludm9rZSBmdW5jdGlvbiBwb2ludGVyIGlzIHNldCB0byBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIEJsb2NrIHN0cnVjdHVyZSBhcyBpdHMgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgKGlmIGFueSkgdG8gdGhlIEJsb2NrIGFuZCBleGVjdXRlcyB0aGUgQmxvY2sgY29tcG91bmQgc3RhdGVtZW50LgoxYikgdGhlIHNpemUgZmllbGQgaXMgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBmb2xsb3dpbmcgQmxvY2sgbGl0ZXJhbCBzdHJ1Y3R1cmUuCjFjKSB0aGUgY29weV9oZWxwZXIgYW5kIGRpc3Bvc2VfaGVscGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzZXQgdG8gcmVzcGVjdGl2ZSBoZWxwZXIgZnVuY3Rpb25zIGlmIHRoZXkgYXJlIHJlcXVpcmVkIGJ5IHRoZSBCbG9jayBsaXRlcmFsCjIpIGEgc3RhY2sgKG9yIGdsb2JhbCkgQmxvY2sgbGl0ZXJhbCBkYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBhcyBmb2xsb3dzOgoyYSkgdGhlIGlzYSBmaWVsZCBpcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGV4dGVybmFsIF9OU0NvbmNyZXRlU3RhY2tCbG9jaywgd2hpY2ggaXMgYSBibG9jayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBzdXBwbGllZCBpbiBsaWJTeXN0ZW0sIG9yIF9OU0NvbmNyZXRlR2xvYmFsQmxvY2sgaWYgdGhpcyBpcyBhIHN0YXRpYyBvciBmaWxlIGxldmVsIGJsb2NrIGxpdGVyYWwuCjIpIFRoZSBmbGFncyBmaWVsZCBpcyBzZXQgdG8gemVybyB1bmxlc3MgdGhlcmUgYXJlIHZhcmlhYmxlcyBpbXBvcnRlZCBpbnRvIHRoZSBibG9jayB0aGF0IG5lZWQgaGVscGVyIGZ1bmN0aW9ucyBmb3IgcHJvZ3JhbSBsZXZlbCBCbG9ja19jb3B5KCkgYW5kIEJsb2NrX3JlbGVhc2UoKSBvcGVyYXRpb25zLCBpbiB3aGljaCBjYXNlIHRoZSAoMTw8MjUpIGZsYWdzIGJpdCBpcyBzZXQuCgpBcyBhbiBleGFtcGxlLCB0aGUgQmxvY2sgbGl0ZXJhbCBleHByZXNzaW9uCiAgIF4geyBwcmludGYoImhlbGxvIHdvcmxkXG4iKTsgfQp3b3VsZCBjYXVzZSB0byBiZSBjcmVhdGVkIG9uIGEgMzItYml0IHN5c3RlbToKCnN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMSB7CiAgICB2b2lkICppc2E7CiAgICBpbnQgZmxhZ3M7CiAgICBpbnQgcmVzZXJ2ZWQ7IAogICAgdm9pZCAoKmludm9rZSkoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xICopOwogICAgc3RydWN0IF9fYmxvY2tfZGVzY3JpcHRvcl8xICpkZXNjcmlwdG9yOwp9OwoKdm9pZCBfX2Jsb2NrX2ludm9rZV8xKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMSAqX2Jsb2NrKSB7CiAgICBwcmludGYoImhlbGxvIHdvcmxkXG4iKTsKfQoKc3RhdGljIHN0cnVjdCBfX2Jsb2NrX2Rlc2NyaXB0b3JfMSB7CiAgICB1bnNpZ25lZCBsb25nIGludCByZXNlcnZlZDsKICAgIHVuc2lnbmVkIGxvbmcgaW50IEJsb2NrX3NpemU7Cn0gX19ibG9ja19kZXNjcmlwdG9yXzEgPSB7IDAsIHNpemVvZihzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzEpLCBfX2Jsb2NrX2ludm9rZV8xIH07CgphbmQgd2hlcmUgdGhlIGJsb2NrIGxpdGVyYWwgYXBwZWFyZWQKCiAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xIF9ibG9ja19saXRlcmFsID0gewoJJl9OU0NvbmNyZXRlU3RhY2tCbG9jaywKCSgxPDwyOSksIDx1bmluaXRpYWxpemVkPiwKCV9fYmxvY2tfaW52b2tlXzEsCgkmX19ibG9ja19kZXNjcmlwdG9yXzEKICAgfTsKCkJsb2NrcyBpbXBvcnQgb3RoZXIgQmxvY2sgcmVmZXJlbmNlcywgY29uc3QgY29waWVzIG9mIG90aGVyIHZhcmlhYmxlcywgYW5kIHZhcmlhYmxlcyBtYXJrZWQgX19ibG9jay4gIEluIE9iamVjdGl2ZS1DIHZhcmlhYmxlcyBtYXkgYWRkaXRpb25hbGx5IGJlIG9iamVjdHMuCgpXaGVuIGEgQmxvY2sgbGl0ZXJhbCBleHByZXNzaW9uIHVzZWQgYXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSBnbG9iYWwgb3Igc3RhdGljIGxvY2FsIHZhcmlhYmxlIGl0IGlzIGluaXRpYWxpemVkIGFzIGZvbGxvd3M6CiAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xIF9fYmxvY2tfbGl0ZXJhbF8xID0gewoJJl9OU0NvbmNyZXRlR2xvYmFsQmxvY2ssCgkoMTw8MjgpfCgxPDwyOSksIDx1bmluaXRpYWxpemVkPiwKCV9fYmxvY2tfaW52b2tlXzEsCgkmX19ibG9ja19kZXNjcmlwdG9yXzEKICAgfTsKdGhhdCBpcywgYSBkaWZmZXJlbnQgYWRkcmVzcyBpcyBwcm92aWRlZCBhcyB0aGUgZmlyc3QgdmFsdWUgYW5kIGEgcGFydGljdWxhciAoMTw8MjgpIGJpdCBpcyBzZXQgaW4gdGhlIGZsYWdzIGZpZWxkLCBhbmQgb3RoZXJ3aXNlIGl0IGlzIHRoZSBzYW1lIGFzIGZvciBzdGFjayBiYXNlZCBCbG9jayBsaXRlcmFscy4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGFueSBCbG9jayBsaXRlcmFsIHRoYXQgaW1wb3J0cyBubyBjb25zdCBvciBfX2Jsb2NrIHN0b3JhZ2UgdmFyaWFibGVzLgoKCjIuIEltcG9ydGVkIFZhcmlhYmxlcwoKVmFyaWFibGVzIG9mICJhdXRvIiBzdG9yYWdlIGNsYXNzIGFyZSBpbXBvcnRlZCBhcyBjb25zdCBjb3BpZXMuICBWYXJpYWJsZXMgb2YgIl9fYmxvY2siIHN0b3JhZ2UgY2xhc3MgYXJlIGltcG9ydGVkIGFzIGEgcG9pbnRlciB0byBhbiBlbmNsb3NpbmcgZGF0YSBzdHJ1Y3R1cmUuICBHbG9iYWwgdmFyaWFibGVzIGFyZSBzaW1wbHkgcmVmZXJlbmNlZCBhbmQgbm90IGNvbnNpZGVyZWQgYXMgaW1wb3J0ZWQuCgoyLjEgSW1wb3J0ZWQgY29uc3QgY29weSB2YXJpYWJsZXMKCkF1dG9tYXRpYyBzdG9yYWdlIHZhcmlhYmxlcyBub3QgbWFya2VkIHdpdGggX19ibG9jayBhcmUgaW1wb3J0ZWQgYXMgY29uc3QgY29waWVzLgoKVGhlIHNpbXBsZXN0IGV4YW1wbGUgaXMgdGhhdCBvZiBpbXBvcnRpbmcgYSB2YXJpYWJsZSBvZiB0eXBlIGludC4KCiAgIGludCB4ID0gMTA7CiAgIHZvaWQgKF52dikodm9pZCkgPSBeeyBwcmludGYoInggaXMgJWRcbiIsIHgpOyB9CiAgIHggPSAxMTsKICAgdnYoKTsKCndvdWxkIGJlIGNvbXBpbGVkCgpzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzIgewogICAgdm9pZCAqaXNhOwogICAgaW50IGZsYWdzOwogICAgaW50IHJlc2VydmVkOyAKICAgIHZvaWQgKCppbnZva2UpKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMiAqKTsKICAgIHN0cnVjdCBfX2Jsb2NrX2Rlc2NyaXB0b3JfMiAqZGVzY3JpcHRvcjsKICAgIGNvbnN0IGludCB4Owp9OwoKdm9pZCBfX2Jsb2NrX2ludm9rZV8yKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMiAqX2Jsb2NrKSB7CiAgICBwcmludGYoInggaXMgJWRcbiIsIF9ibG9jay0+eCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgX19ibG9ja19kZXNjcmlwdG9yXzIgewogICAgdW5zaWduZWQgbG9uZyBpbnQgcmVzZXJ2ZWQ7CiAgICB1bnNpZ25lZCBsb25nIGludCBCbG9ja19zaXplOwp9IF9fYmxvY2tfZGVzY3JpcHRvcl8yID0geyAwLCBzaXplb2Yoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8yKSB9OwoKYW5kCgogIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMiBfX2Jsb2NrX2xpdGVyYWxfMiA9IHsKCSZfTlNDb25jcmV0ZVN0YWNrQmxvY2ssCgkoMTw8MjkpLCA8dW5pbml0aWFsaXplZD4sCglfX2Jsb2NrX2ludm9rZV8yLAoJJl9fYmxvY2tfZGVzY3JpcHRvcl8yLAogICAgICAgIHgKICAgfTsKCkluIHN1bW1hcnksIHNjYWxhcnMsIHN0cnVjdHVyZXMsIHVuaW9ucywgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBnZW5lcmFsbHkgaW1wb3J0ZWQgYXMgY29uc3QgY29waWVzIHdpdGggbm8gbmVlZCBmb3IgaGVscGVyIGZ1bmN0aW9ucy4KCjIuMiBJbXBvcnRlZCBjb25zdCBjb3B5IG9mIEJsb2NrIHJlZmVyZW5jZQoKVGhlIGZpcnN0IGNhc2Ugd2hlcmUgY29weSBhbmQgZGlzcG9zZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCBpcyBmb3IgdGhlIGNhc2Ugb2Ygd2hlbiBhIGJsb2NrIGl0c2VsZiBpcyBpbXBvcnRlZC4gIEluIHRoaXMgY2FzZSBib3RoIGEgY29weV9oZWxwZXIgZnVuY3Rpb24gYW5kIGEgZGlzcG9zZV9oZWxwZXIgZnVuY3Rpb24gYXJlIG5lZWRlZC4gIFRoZSBjb3B5X2hlbHBlciBmdW5jdGlvbiBpcyBwYXNzZWQgYm90aCB0aGUgZXhpc3Rpbmcgc3RhY2sgYmFzZWQgcG9pbnRlciBhbmQgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoZWFwIHZlcnNpb24gYW5kIHNob3VsZCBjYWxsIGJhY2sgaW50byB0aGUgcnVudGltZSB0byBhY3R1YWxseSBkbyB0aGUgY29weSBvcGVyYXRpb24gb24gdGhlIGltcG9ydGVkIGZpZWxkcyB3aXRoaW4gdGhlIGJsb2NrLiAgVGhlIHJ1bnRpbWUgZnVuY3Rpb25zIGFyZSBhbGwgZGVzY3JpYmVkIGluIFNlY3Rpb24gNS4wIFJ1bnRpbWUgSGVscGVyIEZ1bmN0aW9ucy4KCkFuIGV4YW1wbGU6CgogICB2b2lkICheZXhpc3RpbmdCbG9jaykodm9pZCkgPSAuLi47CiAgIHZvaWQgKF52dikodm9pZCkgPSBeeyBleGlzdGluZ0Jsb2NrKCk7IH0KICAgdnYoKTsKCnN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMyB7CiAgIC4uLjsgLy8gZXhpc3RpbmcgYmxvY2sKfTsKCnN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNCB7CiAgICB2b2lkICppc2E7CiAgICBpbnQgZmxhZ3M7CiAgICBpbnQgcmVzZXJ2ZWQ7IAogICAgdm9pZCAoKmludm9rZSkoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF80ICopOwogICAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8zICpjb25zdCBleGlzdGluZ0Jsb2NrOwp9OwoKdm9pZCBfX2Jsb2NrX2ludm9rZV80KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMiAqX2Jsb2NrKSB7CiAgIF9fYmxvY2stPmV4aXN0aW5nQmxvY2stPmludm9rZShfX2Jsb2NrLT5leGlzdGluZ0Jsb2NrKTsKfQoKdm9pZCBfX2Jsb2NrX2NvcHlfNChzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzQgKmRzdCwgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF80ICpzcmMpIHsKICAgICAvL19CbG9ja19jb3B5X2Fzc2lnbigmZHN0LT5leGlzdGluZ0Jsb2NrLCBzcmMtPmV4aXN0aW5nQmxvY2ssIDApOwogICAgIF9CbG9ja19vYmplY3RfYXNzaWduKCZkc3QtPmV4aXN0aW5nQmxvY2ssIHNyYy0+ZXhpc3RpbmdCbG9jaywgQkxPQ0tfRklFTERfSVNfQkxPQ0spOwp9Cgp2b2lkIF9fYmxvY2tfZGlzcG9zZV80KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNCAqc3JjKSB7CiAgICAgLy8gd2FzIF9CbG9ja19kZXN0cm95CiAgICAgX0Jsb2NrX29iamVjdF9kaXNwb3NlKHNyYy0+ZXhpc3RpbmdCbG9jaywgQkxPQ0tfRklFTERfSVNfQkxPQ0spOwp9CgpzdGF0aWMgc3RydWN0IF9fYmxvY2tfZGVzY3JpcHRvcl80IHsKICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlc2VydmVkOwogICAgdW5zaWduZWQgbG9uZyBpbnQgQmxvY2tfc2l6ZTsKICAgIHZvaWQgKCpjb3B5X2hlbHBlcikoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF80ICpkc3QsIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNCAqc3JjKTsKICAgIHZvaWQgKCpkaXNwb3NlX2hlbHBlcikoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF80ICopOwp9IF9fYmxvY2tfZGVzY3JpcHRvcl80ID0gewoJMCwKCXNpemVvZihzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzQpLAoJX19ibG9ja19jb3B5XzQsCglfX2Jsb2NrX2Rpc3Bvc2VfNCwKfTsKCmFuZCB3aGVyZSBpdCBpcyB1c2VkCgogIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNCBfYmxvY2tfbGl0ZXJhbCA9IHsKCSZfTlNDb25jcmV0ZVN0YWNrQmxvY2ssCgkoMTw8MjUpfCgxPDwyOSksIDx1bmluaXRpYWxpemVkPgoJX19ibG9ja19pbnZva2VfNCwKCSYgX19ibG9ja19kZXNjcmlwdG9yXzQKICAgICAgICBleGlzdGluZ0Jsb2NrLAogICB9OwoKMi4yLjEgSW1wb3J0aW5nIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgdmFyaWFibGVzLgoKR0NDIGludHJvZHVjZXMgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSBvbiBzdHJ1Y3R1cmUgcG9pbnRlcnMgdG8gbWVhbiAidGhpcyBpcyBhbiBvYmplY3QiLiAgVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBtYW55IGxvdyBsZXZlbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGFzIG9wYXF1ZSBzdHJ1Y3R1cmUgcG9pbnRlcnMsIGUuZy4gQ0ZTdHJpbmdSZWYsIENGQXJyYXlSZWYsIGV0Yy4gIFdoZW4gdXNlZCBmcm9tIEMsIGhvd2V2ZXIsIHRoZXNlIGFyZSBzdGlsbCByZWFsbHkgb2JqZWN0cyBhbmQgYXJlIHRoZSBzZWNvbmQgY2FzZSB3aGVyZSB0aGF0IHJlcXVpcmVzIGNvcHkgYW5kIGRpc3Bvc2UgaGVscGVyIGZ1bmN0aW9ucyB0byBiZSBnZW5lcmF0ZWQuICBUaGUgY29weSBoZWxwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgc2hvdWxkIHVzZSB0aGUgX0Jsb2NrX29iamVjdF9hc3NpZ24gcnVudGltZSBoZWxwZXIgZnVuY3Rpb24gYW5kIGluIHRoZSBkaXNwb3NlIGhlbHBlciB0aGUgX0Jsb2NrX29iamVjdF9kaXNwb3NlIHJ1bnRpbWUgaGVscGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuCgpGb3IgZXhhbXBsZSwgYmxvY2sgeHl6enkgaW4gdGhlIGZvbGxvd2luZwoKICAgIHN0cnVjdCBPcGFxdWUgKl9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgb2JqZWN0UG9pbnRlciA9IC4uLjsKICAgIC4uLgogICAgdm9pZCAoXnh5enp5KSh2b2lkKSA9IF57ICBDRlByaW50KG9iamVjdFBvaW50ZXIpOyB9OwoKd291bGQgaGF2ZSBoZWxwZXIgZnVuY3Rpb25zCgp2b2lkIF9fYmxvY2tfY29weV94eXp6eShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKmRzdCwgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICpzcmMpIHsKICAgICBfQmxvY2tfb2JqZWN0X2Fzc2lnbigmZHN0LT5vYmplY3RQb2ludGVyLCBzcmMtPiBvYmplY3RQb2ludGVyLCBCTE9DS19GSUVMRF9JU19PQkpFQ1QpOwp9Cgp2b2lkIF9fYmxvY2tfZGlzcG9zZV94eXp6eShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKnNyYykgewogICAgIF9CbG9ja19vYmplY3RfZGlzcG9zZShzcmMtPm9iamVjdFBvaW50ZXIsIEJMT0NLX0ZJRUxEX0lTX09CSkVDVCk7Cn0KCmdlbmVyYXRlZC4KCgoyLjMgSW1wb3J0ZWQgX19ibG9jayBtYXJrZWQgdmFyaWFibGVzLgoKMi4zLjEgTGF5b3V0IG9mIF9fYmxvY2sgbWFya2VkIHZhcmlhYmxlcwoKVGhlIGNvbXBpbGVyIG11c3QgZW1iZWQgdmFyaWFibGVzIHRoYXQgYXJlIG1hcmtlZCBfX2Jsb2NrIGluIGEgc3BlY2lhbGl6ZWQgc3RydWN0dXJlIG9mIHRoZSBmb3JtOgoKc3RydWN0IF9ibG9ja19ieXJlZl94eHh4IHsKICAgIHZvaWQgKmlzYTsKICAgIHN0cnVjdCBCbG9ja19ieXJlZiAqZm9yd2FyZGluZzsKICAgIGludCBmbGFnczsgICAvL3JlZmNvdW50OwogICAgaW50IHNpemU7CiAgICB0eXBlb2YobWFya2VkX3ZhcmlhYmxlKSBtYXJrZWRfdmFyaWFibGU7Cn07CgpWYXJpYWJsZXMgb2YgY2VydGFpbiB0eXBlcyByZXF1aXJlIGhlbHBlciBmdW5jdGlvbnMgZm9yIHdoZW4gQmxvY2tfY29weSgpIGFuZCBCbG9ja19yZWxlYXNlKCkgYXJlIHBlcmZvcm1lZCB1cG9uIGEgcmVmZXJlbmNpbmcgQmxvY2suICBBdCB0aGUgIkMiIGxldmVsIG9ubHkgdmFyaWFibGVzIHRoYXQgYXJlIG9mIHR5cGUgQmxvY2sgb3Igb25lcyB0aGF0IGhhdmUgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSBtYXJrZWQgcmVxdWlyZSBoZWxwZXIgZnVuY3Rpb25zLiAgSW4gT2JqZWN0aXZlLUMgb2JqZWN0cyByZXF1aXJlIGhlbHBlciBmdW5jdGlvbnMgYW5kIGluIEMrKyBzdGFjayBiYXNlZCBvYmplY3RzIHJlcXVpcmUgaGVscGVyIGZ1bmN0aW9ucy4gVmFyaWFibGVzIHRoYXQgcmVxdWlyZSBoZWxwZXIgZnVuY3Rpb25zIHVzZSB0aGUgZm9ybToKCnN0cnVjdCBfYmxvY2tfYnlyZWZfeHh4eCB7CiAgICB2b2lkICppc2E7CiAgICBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX3h4eHggKmZvcndhcmRpbmc7CiAgICBpbnQgZmxhZ3M7ICAgLy9yZWZjb3VudDsKICAgIGludCBzaXplOwogICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBjYWxsZWQgdmlhIEJsb2NrX2NvcHkoKSBhbmQgQmxvY2tfcmVsZWFzZSgpCiAgICB2b2lkICgqYnlyZWZfa2VlcCkodm9pZCAgKmRzdCwgdm9pZCAqc3JjKTsKICAgIHZvaWQgKCpieXJlZl9kaXNwb3NlKSh2b2lkICopOwogICAgdHlwZW9mKG1hcmtlZF92YXJpYWJsZSkgbWFya2VkX3ZhcmlhYmxlOwp9OwoKVGhlIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCBzdWNoIHRoYXQKIGEpIHRoZSBmb3J3YXJkaW5nIHBvaW50ZXIgaXMgc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgaXRzIGVuY2xvc2luZyBzdHJ1Y3R1cmUsCiBiKSB0aGUgc2l6ZSBmaWVsZCBpcyBpbml0aWFsaXplZCB0byB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZSwKIGMpIHRoZSBmbGFncyBmaWVsZCBpcyBzZXQgdG8gZWl0aGVyIDAgaWYgbm8gaGVscGVyIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9yICgxPDwyNSkgaWYgdGhleSBhcmUsCiBkKSB0aGUgaGVscGVyIGZ1bmN0aW9ucyBhcmUgaW5pdGlhbGl6ZWQgKGlmIHByZXNlbnQpCiBlKSB0aGUgdmFyaWFibGUgaXRzZWxmIGlzIHNldCB0byBpdHMgaW5pdGlhbCB2YWx1ZS4KIGYpIHRoZSBpc2EgZmllbGQgaXMgc2V0IHRvIE5VTEwKCjIuMy4yIEFjY2VzcyB0byBfX2Jsb2NrIHZhcmlhYmxlcyBmcm9tIHdpdGhpbiBpdHMgbGV4aWNhbCBzY29wZS4KCkluIG9yZGVyIHRvICJtb3ZlIiB0aGUgdmFyaWFibGUgdG8gdGhlIGhlYXAgdXBvbiBhIGNvcHlfaGVscGVyIG9wZXJhdGlvbiB0aGUgY29tcGlsZXIgbXVzdCByZXdyaXRlIGFjY2VzcyB0byBzdWNoIGEgdmFyaWFibGUgdG8gYmUgaW5kaXJlY3QgdGhyb3VnaCB0aGUgc3RydWN0dXJlcyBmb3J3YXJkaW5nIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgaW50IF9fYmxvY2sgaSA9IDEwOwogIGkgPSAxMTsKCndvdWxkIGJlIHJld3JpdHRlbiB0byBiZToKCiAgc3RydWN0IF9ibG9ja19ieXJlZl9pIHsKICAgIHZvaWQgKmlzYTsKICAgIHN0cnVjdCBfYmxvY2tfYnlyZWZfaSAqZm9yd2FyZGluZzsKICAgIGludCBmbGFnczsgICAvL3JlZmNvdW50OwogICAgaW50IHNpemU7CiAgICBpbnQgY2FwdHVyZWRfaTsKICB9IGkgPSB7IE5VTEwsICZpLCAwLCBzaXplb2Yoc3RydWN0IF9ibG9ja19ieXJlZl9pKSwgMTEgfTsKCiAgaS5mb3J3YXJkaW5nLT5jYXB0dXJlZF9pID0gMTE7CgpJbiB0aGUgY2FzZSBvZiBhIEJsb2NrIHJlZmVyZW5jZSB2YXJpYWJsZSBiZWluZyBtYXJrZWQgX19ibG9jayB0aGUgaGVscGVyIGNvZGUgZ2VuZXJhdGVkIG11c3QgdXNlIHRoZSBfQmxvY2tfb2JqZWN0X2Fzc2lnbiBhbmQgX0Jsb2NrX29iamVjdF9kaXNwb3NlIHJvdXRpbmVzIHN1cHBsaWVkIGJ5IHRoZSBydW50aW1lIHRvIG1ha2UgdGhlIGNvcGllcy4gIEZvciBleGFtcGxlOgoKICAgX19ibG9jayB2b2lkICh2b2lkQmxvY2spKHZvaWQpID0gYmxvY2tBOwogICB2b2lkQmxvY2sgPSBibG9ja0I7Cgp3b3VsZCB0cmFuc2xhdGUgaW50bwoKc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgewogICAgdm9pZCAqaXNhOwogICAgc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKmZvcndhcmRpbmc7CiAgICBpbnQgZmxhZ3M7ICAgLy9yZWZjb3VudDsKICAgIGludCBzaXplOwogICAgdm9pZCAoKmJ5cmVmX2tlZXApKHN0cnVjdCBfYmxvY2tfYnlyZWZfdm9pZEJsb2NrICpkc3QsIHN0cnVjdCBfYmxvY2tfYnlyZWZfdm9pZEJsb2NrICpzcmMpOwogICAgdm9pZCAoKmJ5cmVmX2Rpc3Bvc2UpKHN0cnVjdCBfYmxvY2tfYnlyZWZfdm9pZEJsb2NrICopOwogICAgdm9pZCAoXmNhcHR1cmVkX3ZvaWRCbG9jaykodm9pZCk7Cn07Cgp2b2lkIF9ibG9ja19ieXJlZl9rZWVwX2hlbHBlcihzdHJ1Y3QgX2Jsb2NrX2J5cmVmX3ZvaWRCbG9jayAqZHN0LCBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX3ZvaWRCbG9jayAqc3JjKSB7CiAgICAvL19CbG9ja19jb3B5X2Fzc2lnbigmZHN0LT5jYXB0dXJlZF92b2lkQmxvY2ssIHNyYy0+Y2FwdHVyZWRfdm9pZEJsb2NrLCAwKTsKICAgIF9CbG9ja19vYmplY3RfYXNzaWduKCZkc3QtPmNhcHR1cmVkX3ZvaWRCbG9jaywgc3JjLT5jYXB0dXJlZF92b2lkQmxvY2ssIEJMT0NLX0ZJRUxEX0lTX0JMT0NLIHwgQkxPQ0tfQllSRUZfQ0FMTEVSKTsKfQoKdm9pZCBfYmxvY2tfYnlyZWZfZGlzcG9zZV9oZWxwZXIoc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKnBhcmFtKSB7CiAgICAvL19CbG9ja19kZXN0cm95KHBhcmFtLT5jYXB0dXJlZF92b2lkQmxvY2ssIDApOwogICAgX0Jsb2NrX29iamVjdF9kaXNwb3NlKHBhcmFtLT5jYXB0dXJlZF92b2lkQmxvY2ssIEJMT0NLX0ZJRUxEX0lTX0JMT0NLIHwgQkxPQ0tfQllSRUZfQ0FMTEVSKX0KCmFuZAogIHN0cnVjdCBfYmxvY2tfYnlyZWZfdm9pZEJsb2NrIHZvaWRCbG9jayA9IHsoIC5mb3J3YXJkaW5nPSZ2b2lkQmxvY2ssIC5mbGFncz0oMTw8MjUpLCAuc2l6ZT1zaXplb2Yoc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKiksCiAgICAgIC5ieXJlZl9rZWVwPV9ibG9ja19ieXJlZl9rZWVwX2hlbHBlciwgLmJ5cmVmX2Rpc3Bvc2U9X2Jsb2NrX2J5cmVmX2Rpc3Bvc2VfaGVscGVyLAogICAgICAuY2FwdHVyZWRfdm9pZEJsb2NrPWJsb2NrQSB9OwoKICB2b2lkQmxvY2suZm9yd2FyZGluZy0+Y2FwdHVyZWRfdm9pZEJsb2NrID0gYmxvY2tCOwogIAoKMi4zLjMgSW1wb3J0aW5nIF9fYmxvY2sgdmFyaWFibGVzIGludG8gQmxvY2tzCgpBIEJsb2NrIHRoYXQgdXNlcyBhIF9fYmxvY2sgdmFyaWFibGUgaW4gaXRzIGNvbXBvdW5kIHN0YXRlbWVudCBib2R5IG11c3QgaW1wb3J0IHRoZSB2YXJpYWJsZSBhbmQgZW1pdCBjb3B5X2hlbHBlciBhbmQgZGlzcG9zZV9oZWxwZXIgaGVscGVyIGZ1bmN0aW9ucyB0aGF0LCBpbiB0dXJuLCBjYWxsIGJhY2sgaW50byB0aGUgcnVudGltZSB0byBhY3R1YWxseSBjb3B5IG9yIHJlbGVhc2UgdGhlIGJ5cmVmIGRhdGEgYmxvY2sgdXNpbmcgdGhlIGZ1bmN0aW9ucyBfQmxvY2tfb2JqZWN0X2Fzc2lnbiBhbmQgX0Jsb2NrX29iamVjdF9kaXNwb3NlLgoKRm9yIGV4YW1wbGU6CgogICBpbnQgX19ibG9jayBpID0gMjsKICAgZnVuY3Rpb25jYWxsKF57IGkgPSAxMDsgfSk7Cgp3b3VsZCB0cmFuc2xhdGUgdG8KCnN0cnVjdCBfYmxvY2tfYnlyZWZfaSB7CiAgICB2b2lkICppc2E7ICAvLyBzZXQgdG8gTlVMTAogICAgc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKmZvcndhcmRpbmc7CiAgICBpbnQgZmxhZ3M7ICAgLy9yZWZjb3VudDsKICAgIGludCBzaXplOwogICAgdm9pZCAoKmJ5cmVmX2tlZXApKHN0cnVjdCBfYmxvY2tfYnlyZWZfaSAqZHN0LCBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX2kgKnNyYyk7CiAgICB2b2lkICgqYnlyZWZfZGlzcG9zZSkoc3RydWN0IF9ibG9ja19ieXJlZl9pICopOwogICAgaW50IGNhcHR1cmVkX2k7Cn07CgoKc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81IHsKICAgIHZvaWQgKmlzYTsKICAgIGludCBmbGFnczsKICAgIGludCByZXNlcnZlZDsgCiAgICB2b2lkICgqaW52b2tlKShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKik7CiAgICBzdHJ1Y3QgX19ibG9ja19kZXNjcmlwdG9yXzUgKmRlc2NyaXB0b3I7CiAgICBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX2kgKmlfaG9sZGVyOwp9OwoKdm9pZCBfX2Jsb2NrX2ludm9rZV81KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSAqX2Jsb2NrKSB7CiAgIF9ibG9jay0+Zm9yd2FyZGluZy0+Y2FwdHVyZWRfaSA9IDEwOwp9Cgp2b2lkIF9fYmxvY2tfY29weV81KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSAqZHN0LCBzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKnNyYykgewogICAgIC8vX0Jsb2NrX2J5cmVmX2Fzc2lnbl9jb3B5KCZkc3QtPmNhcHR1cmVkX2ksIHNyYy0+Y2FwdHVyZWRfaSk7CiAgICAgX0Jsb2NrX29iamVjdF9hc3NpZ24oJmRzdC0+Y2FwdHVyZWRfaSwgc3JjLT5jYXB0dXJlZF9pLCBCTE9DS19GSUVMRF9JU19CWVJFRiB8IEJMT0NLX0JZUkVGX0NBTExFUik7Cn0KCnZvaWQgX19ibG9ja19kaXNwb3NlXzUoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICpzcmMpIHsKICAgICAvL19CbG9ja19ieXJlZl9yZWxlYXNlKHNyYy0+Y2FwdHVyZWRfaSk7CiAgICAgX0Jsb2NrX29iamVjdF9kaXNwb3NlKHNyYy0+Y2FwdHVyZWRfaSwgQkxPQ0tfRklFTERfSVNfQllSRUYgfCBCTE9DS19CWVJFRl9DQUxMRVIpOwp9CgpzdGF0aWMgc3RydWN0IF9fYmxvY2tfZGVzY3JpcHRvcl81IHsKICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlc2VydmVkOwogICAgdW5zaWduZWQgbG9uZyBpbnQgQmxvY2tfc2l6ZTsKICAgIHZvaWQgKCpjb3B5X2hlbHBlcikoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICpkc3QsIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSAqc3JjKTsKICAgIHZvaWQgKCpkaXNwb3NlX2hlbHBlcikoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICopOwp9IF9fYmxvY2tfZGVzY3JpcHRvcl81ID0geyAwLCBzaXplb2Yoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81KSBfX2Jsb2NrX2NvcHlfNSwgX19ibG9ja19kaXNwb3NlXzUgfTsKCmFuZAoKICBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX2kgaSA9IHsoIC5mb3J3YXJkaW5nPSZpLCAuZmxhZ3M9MCwgLnNpemU9c2l6ZW9mKHN0cnVjdCBfYmxvY2tfYnlyZWZfaSkgKX07CiAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81IF9ibG9ja19saXRlcmFsID0gewoJJl9OU0NvbmNyZXRlU3RhY2tCbG9jaywKCSgxPDwyNSl8KDE8PDI5KSwgPHVuaW5pdGlhbGl6ZWQ+LAoJX19ibG9ja19pbnZva2VfNSwKCSZfX2Jsb2NrX2Rlc2NyaXB0b3JfNSwKICAgICAgICAyLAogICB9OwoKMi4zLjQgSW1wb3J0aW5nIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgX19ibG9jayB2YXJpYWJsZXMKCkEgX19ibG9jayB2YXJpYWJsZSB0aGF0IGlzIGFsc28gbWFya2VkIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgc2hvdWxkIGhhdmUgYnlyZWZfa2VlcCBhbmQgYnlyZWZfZGlzcG9zZSBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgdXNlIF9CbG9ja19vYmplY3RfYXNzaWduIGFuZCBfQmxvY2tfb2JqZWN0X2Rpc3Bvc2UuCgoyLjMuNSBfX2Jsb2NrIGVzY2FwZXMKCkJlY2F1c2UgQmxvY2tzIHJlZmVyZW5jaW5nIF9fYmxvY2sgdmFyaWFibGVzIG1heSBoYXZlIEJsb2NrX2NvcHkoKSBwZXJmb3JtZWQgdXBvbiB0aGVtIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgZm9yIHRoZSB2YXJpYWJsZXMgbWF5IG1vdmUgdG8gdGhlIGhlYXAuICBJbiBPYmplY3RpdmUtQyBHYXJiYWdlIENvbGxlY3Rpb24gT25seSBjb21waWxhdGlvbiBlbnZpcm9ubWVudHMgdGhlIGhlYXAgdXNlZCBpcyB0aGUgZ2FyYmFnZSBjb2xsZWN0ZWQgb25lIGFuZCBubyBmdXJ0aGVyIGFjdGlvbiBpcyByZXF1aXJlZC4gIE90aGVyd2lzZSB0aGUgY29tcGlsZXIgbXVzdCBpc3N1ZSBhIGNhbGwgdG8gcG90ZW50aWFsbHkgcmVsZWFzZSBhbnkgaGVhcCBzdG9yYWdlIGZvciBfX2Jsb2NrIHZhcmlhYmxlcyBhdCBhbGwgZXNjYXBlcyBvciB0ZXJtaW5hdGlvbnMgb2YgdGhlaXIgc2NvcGUuCgoKMi4zLjYgTmVzdGluZwoKQmxvY2tzIG1heSBjb250YWluIEJsb2NrIGxpdGVyYWwgZXhwcmVzc2lvbnMuICBBbnkgdmFyaWFibGVzIHVzZWQgd2l0aGluIGlubmVyIGJsb2NrcyBhcmUgaW1wb3J0ZWQgaW50byBhbGwgZW5jbG9zaW5nIEJsb2NrIHNjb3BlcyBldmVuIGlmIHRoZSB2YXJpYWJsZXMgYXJlIG5vdCB1c2VkLiAgVGhpcyBpbmNsdWRlcyBjb25zdCBpbXBvcnRzIGFzIHdlbGwgYXMgX19ibG9jayB2YXJpYWJsZXMuCgozLiBPYmplY3RpdmUgQyBFeHRlbnNpb25zIHRvIEJsb2NrcwoKMy4xIEltcG9ydGluZyBPYmplY3RzCgpPYmplY3RzIHNob3VsZCBiZSB0cmVhdGVkIGFzIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgdmFyaWFibGVzOyBhbGwgY29weV9oZWxwZXIsIGRpc3Bvc2VfaGVscGVyLCBieXJlZl9rZWVwLCBhbmQgYnlyZWZfZGlzcG9zZSBoZWxwZXIgZnVuY3Rpb25zIHNob3VsZCB1c2UgX0Jsb2NrX29iamVjdF9hc3NpZ24gYW5kIF9CbG9ja19vYmplY3RfZGlzcG9zZS4gIFRoZXJlIHNob3VsZCBiZSBubyBjb2RlIGdlbmVyYXRlZCB0aGF0IHVzZXMgLXJldGFpbiBvciAtcmVsZWFzZSBtZXRob2RzLgoKCjMuMiBCbG9ja3MgYXMgT2JqZWN0cwoKVGhlIGNvbXBpbGVyIHdpbGwgdHJlYXQgQmxvY2tzIGFzIG9iamVjdHMgd2hlbiBzeW50aGVzaXppbmcgcHJvcGVydHkgc2V0dGVycyBhbmQgZ2V0dGVycywgd2lsbCBjaGFyYWN0ZXJpemUgdGhlbSBhcyBvYmplY3RzIHdoZW4gZ2VuZXJhdGluZyBnYXJiYWdlIGNvbGxlY3Rpb24gc3Ryb25nIGFuZCB3ZWFrIGxheW91dCBpbmZvcm1hdGlvbiBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgb2JqZWN0cywgYW5kIHdpbGwgaXNzdWUgc3Ryb25nIGFuZCB3ZWFrIHdyaXRlLWJhcnJpZXIgYXNzaWdubWVudHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIG9iamVjdHMuCgozLjMgX193ZWFrIF9fYmxvY2sgU3VwcG9ydAoKT2JqZWN0aXZlLUMgKGFuZCBPYmplY3RpdmUtQysrKSBzdXBwb3J0IHRoZSBfX3dlYWsgYXR0cmlidXRlIG9uIF9fYmxvY2sgdmFyaWFibGVzLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgdGhlIGNvbXBpbGVyIHVzZXMgdGhlIE9iamVjdGl2ZS1DIHJ1bnRpbWUgaGVscGVyIHN1cHBvcnQgZnVuY3Rpb25zIG9iamNfYXNzaWduX3dlYWsgYW5kIG9iamNfcmVhZF93ZWFrLiAgQm90aCBzaG91bGQgY29udGludWUgdG8gYmUgdXNlZCBmb3IgYWxsIHJlYWRzIGFuZCB3cml0ZXMgb2YgX193ZWFrIF9fYmxvY2sgdmFyaWFibGVzOgoJb2JqY19yZWFkX3dlYWsoJmJsb2NrLT5ieXJlZl9pLT5mb3J3YXJkaW5nLT5pKQoKVGhlIF9fd2VhayB2YXJpYWJsZSBpcyBzdG9yZWQgaW4gYSBfYmxvY2tfYnlyZWZfeHh4eCBzdHJ1Y3R1cmUgYW5kIHRoZSBCbG9jayBoYXMgY29weSBhbmQgZGlzcG9zZSBoZWxwZXJzIGZvciB0aGlzIHN0cnVjdHVyZSB0aGF0IGNhbGw6CglfQmxvY2tfb2JqZWN0X2Fzc2lnbigmZGVzdC0+X2Jsb2NrX2J5cmVmX2ksIHNyYy0+IF9ibG9ja19ieXJlZl9pLCBCTE9DS19GSUVMRF9JU19XRUFLIHwgQkxPQ0tfRklFTERfSVNfQllSRUYpOwphbmQKCV9CbG9ja19vYmplY3RfZGlzcG9zZShzcmMtPl9ibG9ja19ieXJlZl9pLCBCTE9DS19GSUVMRF9JU19XRUFLIHwgQkxPQ0tfRklFTERfSVNfQllSRUYpOwoKCkluIHR1cm4sIHRoZSBibG9ja19ieXJlZiBjb3B5IHN1cHBvcnQgaGVscGVycyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHdoZXRoZXIgdGhlIF9fYmxvY2sgdmFyaWFibGUgaXMgYSBCbG9jayBvciBub3QgYW5kIHNob3VsZCBlaXRoZXIgY2FsbDoKCV9CbG9ja19vYmplY3RfYXNzaWduKCZkZXN0LT5fYmxvY2tfYnlyZWZfaSwgc3JjLT5fYmxvY2tfYnlyZWZfaSwgQkxPQ0tfRklFTERfSVNfV0VBSyB8IEJMT0NLX0ZJRUxEX0lTX09CSkVDVCB8IEJMT0NLX0JZUkVGX0NBTExFUik7CmZvciBzb21ldGhpbmcgZGVjbGFyZWQgYXMgYW4gb2JqZWN0IG9yCglfQmxvY2tfb2JqZWN0X2Fzc2lnbigmZGVzdC0+X2Jsb2NrX2J5cmVmX2ksIHNyYy0+X2Jsb2NrX2J5cmVmX2ksIEJMT0NLX0ZJRUxEX0lTX1dFQUsgfCBCTE9DS19GSUVMRF9JU19CTE9DSyB8IEJMT0NLX0JZUkVGX0NBTExFUik7CmZvciBzb21ldGhpbmcgZGVjbGFyZWQgYXMgYSBCbG9jay4KCkEgZnVsbCBleGFtcGxlIGZvbGxvd3M6CgoKICAgX19ibG9jayBfX3dlYWsgaWQgb2JqID0gPGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24+OwogICBmdW5jdGlvbmNhbGwoXnsgW29iaiBzb21lbWVzc2FnZV07IH0pOwoKd291bGQgdHJhbnNsYXRlIHRvCgpzdHJ1Y3QgX2Jsb2NrX2J5cmVmX29iaiB7CiAgICB2b2lkICppc2E7ICAvLyB1bmluaXRpYWxpemVkCiAgICBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX29iaiAqZm9yd2FyZGluZzsKICAgIGludCBmbGFnczsgICAvL3JlZmNvdW50OwogICAgaW50IHNpemU7CiAgICB2b2lkICgqYnlyZWZfa2VlcCkoc3RydWN0IF9ibG9ja19ieXJlZl9pICpkc3QsIHN0cnVjdCBfYmxvY2tfYnlyZWZfaSAqc3JjKTsKICAgIHZvaWQgKCpieXJlZl9kaXNwb3NlKShzdHJ1Y3QgX2Jsb2NrX2J5cmVmX2kgKik7CiAgICBpbnQgY2FwdHVyZWRfb2JqOwp9OwoKdm9pZCBfYmxvY2tfYnlyZWZfb2JqX2tlZXAoc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKmRzdCwgc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKnNyYykgewogICAgLy9fQmxvY2tfY29weV9hc3NpZ24oJmRzdC0+Y2FwdHVyZWRfb2JqLCBzcmMtPmNhcHR1cmVkX29iaiwgMCk7CiAgICBfQmxvY2tfb2JqZWN0X2Fzc2lnbigmZHN0LT5jYXB0dXJlZF9vYmosIHNyYy0+Y2FwdHVyZWRfb2JqLCBCTE9DS19GSUVMRF9JU19PQkpFQ1QgfCBCTE9DS19GSUVMRF9JU19XRUFLIHwgQkxPQ0tfQllSRUZfQ0FMTEVSKTsKfQoKdm9pZCBfYmxvY2tfYnlyZWZfb2JqX2Rpc3Bvc2Uoc3RydWN0IF9ibG9ja19ieXJlZl92b2lkQmxvY2sgKnBhcmFtKSB7CiAgICAvL19CbG9ja19kZXN0cm95KHBhcmFtLT5jYXB0dXJlZF9vYmosIDApOwogICAgX0Jsb2NrX29iamVjdF9kaXNwb3NlKHBhcmFtLT5jYXB0dXJlZF9vYmosIEJMT0NLX0ZJRUxEX0lTX09CSkVDVCB8IEJMT0NLX0ZJRUxEX0lTX1dFQUsgfCBCTE9DS19CWVJFRl9DQUxMRVIpOwp9OwoKZm9yIHRoZSBibG9jayBieXJlZiBwYXJ0IGFuZAoKc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81IHsKICAgIHZvaWQgKmlzYTsKICAgIGludCBmbGFnczsKICAgIGludCByZXNlcnZlZDsgCiAgICB2b2lkICgqaW52b2tlKShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKik7CiAgICBzdHJ1Y3QgX19ibG9ja19kZXNjcmlwdG9yXzUgKmRlc2NyaXB0b3I7CiAgICBzdHJ1Y3QgX2Jsb2NrX2J5cmVmX29iaiAqYnlyZWZfb2JqOwp9OwoKdm9pZCBfX2Jsb2NrX2ludm9rZV81KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSAqX2Jsb2NrKSB7CiAgIFtvYmpjX3JlYWRfd2VhaygmX2Jsb2NrLT5ieXJlZl9vYmotPmZvcndhcmRpbmctPmNhcHR1cmVkX29iaikgc29tZW1lc3NhZ2VdOwp9Cgp2b2lkIF9fYmxvY2tfY29weV81KHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSAqZHN0LCBzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKnNyYykgewogICAgIC8vX0Jsb2NrX2J5cmVmX2Fzc2lnbl9jb3B5KCZkc3QtPmJ5cmVmX29iaiwgc3JjLT5ieXJlZl9vYmopOwogICAgIF9CbG9ja19vYmplY3RfYXNzaWduKCZkc3QtPmJ5cmVmX29iaiwgc3JjLT5ieXJlZl9vYmosIEJMT0NLX0ZJRUxEX0lTX0JZUkVGIHwgQkxPQ0tfRklFTERfSVNfV0VBSyk7Cn0KCnZvaWQgX19ibG9ja19kaXNwb3NlXzUoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICpzcmMpIHsKICAgICAvL19CbG9ja19ieXJlZl9yZWxlYXNlKHNyYy0+YnlyZWZfb2JqKTsKICAgICBfQmxvY2tfb2JqZWN0X2Rpc3Bvc2Uoc3JjLT5ieXJlZl9vYmosIEJMT0NLX0ZJRUxEX0lTX0JZUkVGIHwgQkxPQ0tfRklFTERfSVNfV0VBSyk7Cn0KCnN0YXRpYyBzdHJ1Y3QgX19ibG9ja19kZXNjcmlwdG9yXzUgewogICAgdW5zaWduZWQgbG9uZyBpbnQgcmVzZXJ2ZWQ7CiAgICB1bnNpZ25lZCBsb25nIGludCBCbG9ja19zaXplOwogICAgdm9pZCAoKmNvcHlfaGVscGVyKShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKmRzdCwgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF81ICpzcmMpOwogICAgdm9pZCAoKmRpc3Bvc2VfaGVscGVyKShzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUgKik7Cn0gX19ibG9ja19kZXNjcmlwdG9yXzUgPSB7IDAsIHNpemVvZihzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzUpLCBfX2Jsb2NrX2NvcHlfNSwgX19ibG9ja19kaXNwb3NlXzUgfTsKCmFuZCB3aXRoaW4gdGhlIGNvbXBvdW5kIHN0YXRlbWVudDoKCiAgc3RydWN0IF9ibG9ja19ieXJlZl9vYmogb2JqID0geyggLmZvcndhcmRpbmc9Jm9iaiwgLmZsYWdzPSgxPDwyNSksIC5zaXplPXNpemVvZihzdHJ1Y3QgX2Jsb2NrX2J5cmVmX29iaiksCgkJCQkuYnlyZWZfa2VlcD1fYmxvY2tfYnlyZWZfb2JqX2tlZXAsIC5ieXJlZl9kaXNwb3NlPV9ibG9ja19ieXJlZl9vYmpfZGlzcG9zZSwKCQkJCS5jYXB0dXJlZF9vYmogPSA8aW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbj4gKX07CgogIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfNSBfYmxvY2tfbGl0ZXJhbCA9IHsKCSZfTlNDb25jcmV0ZVN0YWNrQmxvY2ssCgkoMTw8MjUpfCgxPDwyOSksIDx1bmluaXRpYWxpemVkPiwKCV9fYmxvY2tfaW52b2tlXzUsCgkmX19ibG9ja19kZXNjcmlwdG9yXzUsCiAgICAgICAgJm9iaiwJCS8vIGEgcmVmZXJlbmNlIHRvIHRoZSBvbi1zdGFjayBzdHJ1Y3R1cmUgY29udGFpbmluZyAiY2FwdHVyZWRfb2JqIgogICB9OwoKCiAgIGZ1bmN0aW9uY2FsbChfYmxvY2tfbGl0ZXJhbC0+aW52b2tlKCZfYmxvY2tfbGl0ZXJhbCkpOwoKCjQuMCBDKysgU3VwcG9ydAoKV2l0aGluIGEgYmxvY2sgc3RhY2sgYmFzZWQgQysrIG9iamVjdHMgYXJlIGNvcGllZCBhcyBjb25zdCBjb3BpZXMgdXNpbmcgdGhlIGNvbnN0IGNvcHkgY29uc3RydWN0b3IuICBJdCBpcyBhbiBlcnJvciBpZiBhIHN0YWNrIGJhc2VkIEMrKyBvYmplY3QgaXMgdXNlZCB3aXRoaW4gYSBibG9jayBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgY29uc3QgY29weSBjb25zdHJ1Y3Rvci4gIEluIGFkZGl0aW9uIGJvdGggY29weSBhbmQgZGVzdHJveSBoZWxwZXIgcm91dGluZXMgbXVzdCBiZSBzeW50aGVzaXplZCBmb3IgdGhlIGJsb2NrIHRvIHN1cHBvcnQgdGhlIEJsb2NrX2NvcHkoKSBvcGVyYXRpb24sIGFuZCB0aGUgZmxhZ3Mgd29yayBtYXJrZWQgd2l0aCB0aGUgKDE8PDI2KSBiaXQgaW4gYWRkaXRpb24gdG8gdGhlICgxPDwyNSkgYml0LiAgVGhlIGNvcHkgaGVscGVyIHNob3VsZCBjYWxsIHRoZSBjb25zdHJ1Y3RvciB1c2luZyBhcHByb3ByaWF0ZSBvZmZzZXRzIG9mIHRoZSB2YXJpYWJsZSB3aXRoaW4gdGhlIHN1cHBsaWVkIHN0YWNrIGJhc2VkIGJsb2NrIHNvdXJjZSBhbmQgaGVhcCBiYXNlZCBkZXN0aW5hdGlvbiBmb3IgYWxsIGNvbnN0IGNvbnN0cnVjdGVkIGNvcGllcywgYW5kIHNpbWlsYXJseSBzaG91bGQgY2FsbCB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgZGVzdHJveSByb3V0aW5lLgoKQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSBhIEMrKyBjbGFzcyBGT08gZXhpc3RlZCB3aXRoIGEgY29uc3QgY29weSBjb25zdHJ1Y3Rvci4gIFdpdGhpbiBhIGNvZGUgYmxvY2sgYSBzdGFjayB2ZXJzaW9uIG9mIGEgRk9PIG9iamVjdCBpcyBkZWNsYXJlZCBhbmQgdXNlZCB3aXRoaW4gYSBCbG9jayBsaXRlcmFsIGV4cHJlc3Npb246Cgp7CiAgICBGT08gZm9vOwogICAgdm9pZCAoXmJsb2NrKSh2b2lkKSA9IF57IHByaW50ZigiJWRcbiIsIGZvby52YWx1ZSgpKTsgfTsKfQoKVGhlIGNvbXBpbGVyIHdvdWxkIHN5bnRoZXNpemUKCnN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMTAgewogICAgdm9pZCAqaXNhOwogICAgaW50IGZsYWdzOwogICAgaW50IHJlc2VydmVkOyAKICAgIHZvaWQgKCppbnZva2UpKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMTAgKik7CiAgICBzdHJ1Y3QgX19ibG9ja19kZXNjcmlwdG9yXzEwICpkZXNjcmlwdG9yOwogICAgY29uc3QgRk9PIGZvbzsKfTsKCnZvaWQgX19ibG9ja19pbnZva2VfMTAoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xMCAqX2Jsb2NrKSB7CiAgIHByaW50ZigiJWRcbiIsIF9ibG9jay0+Zm9vLnZhbHVlKCkpOwp9Cgp2b2lkIF9fYmxvY2tfbGl0ZXJhbF8xMChzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzEwICpkc3QsIHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMTAgKnNyYykgewogICAgIGNvbXBfY3RvcigmZHN0LT5mb28sICZzcmMtPmZvbyk7Cn0KCnZvaWQgX19ibG9ja19kaXNwb3NlXzEwKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMTAgKnNyYykgewogICAgIGNvbXBfZHRvcigmc3JjLT5mb28pOwp9CgpzdGF0aWMgc3RydWN0IF9fYmxvY2tfZGVzY3JpcHRvcl8xMCB7CiAgICB1bnNpZ25lZCBsb25nIGludCByZXNlcnZlZDsKICAgIHVuc2lnbmVkIGxvbmcgaW50IEJsb2NrX3NpemU7CiAgICB2b2lkICgqY29weV9oZWxwZXIpKHN0cnVjdCBfX2Jsb2NrX2xpdGVyYWxfMTAgKmRzdCwgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xMCAqc3JjKTsKICAgIHZvaWQgKCpkaXNwb3NlX2hlbHBlcikoc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xMCAqKTsKfSBfX2Jsb2NrX2Rlc2NyaXB0b3JfMTAgPSB7IDAsIHNpemVvZihzdHJ1Y3QgX19ibG9ja19saXRlcmFsXzEwKSwgX19ibG9ja19jb3B5XzEwLCBfX2Jsb2NrX2Rpc3Bvc2VfMTAgfTsKCmFuZCB0aGUgY29kZSB3b3VsZCBiZToKewogIEZPTyBmb287CiAgY29tcF9jdG9yKCZmb28pOyAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xMCBfYmxvY2tfbGl0ZXJhbCA9IHsKCSZfTlNDb25jcmV0ZVN0YWNrQmxvY2ssCgkoMTw8MjUpfCgxPDwyNil8KDE8PDI5KSwgPHVuaW5pdGlhbGl6ZWQ+LAoJX19ibG9ja19pbnZva2VfMTAsCgkmX19ibG9ja19kZXNjcmlwdG9yXzEwLAogICB9OwogICBjb21wX2N0b3IoJl9ibG9ja19saXRlcmFsLT5mb28sICZmb28pOyAgLy8gY29uc3QgY29weSBpbnRvIHN0YWNrIHZlcnNpb24KICAgc3RydWN0IF9fYmxvY2tfbGl0ZXJhbF8xMCAmYmxvY2sgPSAmX2Jsb2NrX2xpdGVyYWw7ICAvLyBhc3NpZ24gbGl0ZXJhbCB0byBibG9jayB2YXJpYWJsZQogICBibG9jay0+aW52b2tlKGJsb2NrKTsJLy8gaW52b2tlIGJsb2NrCiAgIGNvbXBfZHRvcigmX2Jsb2NrX2xpdGVyYWwtPmZvbyk7IC8vIGRlc3Ryb3kgc3RhY2sgdmVyc2lvbiBvZiBjb25zdCBibG9jayBjb3B5CiAgIGNvbXBfZHRvcigmZm9vKTsgLy8gZGVzdHJveSBvcmlnaW5hbCB2ZXJzaW9uCn0KCgpDKysgb2JqZWN0cyBzdG9yZWQgaW4gX19ibG9jayBzdG9yYWdlIHN0YXJ0IG91dCBvbiB0aGUgc3RhY2sgaW4gYSBibG9ja19ieXJlZiBkYXRhIHN0cnVjdHVyZSBhcyBkbyBvdGhlciB2YXJpYWJsZXMuICBTdWNoIG9iamVjdHMgKGlmIG5vdCBjb25zdCBvYmplY3RzKSBtdXN0IHN1cHBvcnQgYSByZWd1bGFyIGNvcHkgY29uc3RydWN0b3IuICBUaGUgYmxvY2tfYnlyZWYgZGF0YSBzdHJ1Y3R1cmUgd2lsbCBoYXZlIGNvcHkgYW5kIGRlc3Ryb3kgaGVscGVyIHJvdXRpbmVzIHN5bnRoZXNpemVkIGJ5IHRoZSBjb21waWxlci4gIFRoZSBjb3B5IGhlbHBlciB3aWxsIGhhdmUgY29kZSBjcmVhdGVkIHRvIHBlcmZvcm0gdGhlIGNvcHkgY29uc3RydWN0b3IgYmFzZWQgb24gdGhlIGluaXRpYWwgc3RhY2sgYmxvY2tfYnlyZWYgZGF0YSBzdHJ1Y3R1cmUsIGFuZCB3aWxsIGFsc28gc2V0IHRoZSAoMTw8MjYpIGJpdCBpbiBhZGRpdGlvbiB0byB0aGUgKDE8PDI1KSBiaXQuICBUaGUgZGVzdHJveSBoZWxwZXIgd2lsbCBoYXZlIGNvZGUgdG8gZG8gdGhlIGRlc3RydWN0b3Igb24gdGhlIG9iamVjdCBzdG9yZWQgd2l0aGluIHRoZSBzdXBwbGllZCBibG9ja19ieXJlZiBoZWFwIGRhdGEgc3RydWN0dXJlLgoKVG8gc3VwcG9ydCBtZW1iZXIgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIGFjY2VzcyB0aGUgY29tcGlsZXIgd2lsbCBzeW50aGVzaXplIGEgY29uc3QgcG9pbnRlciB0byBhIGJsb2NrIHZlcnNpb24gb2YgdGhlIHRoaXMgcG9pbnRlci4KCjUuMCBSdW50aW1lIEhlbHBlciBGdW5jdGlvbnMKClRoZSBydW50aW1lIGhlbHBlciBmdW5jdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiAvdXNyL2xvY2FsL2luY2x1ZGUvQmxvY2tfcHJpdmF0ZS5oLiAgVG8gc3VtbWFyaXplIHRoZWlyIHVzZSwgYSBibG9jayByZXF1aXJlcyBjb3B5L2Rpc3Bvc2UgaGVscGVycyBpZiBpdCBpbXBvcnRzIGFueSBibG9jayB2YXJpYWJsZXMsIF9fYmxvY2sgc3RvcmFnZSB2YXJpYWJsZXMsIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgdmFyaWFibGVzLCBvciBDKysgY29uc3QgY29waWVkIG9iamVjdHMgd2l0aCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycy4gIFRoZSAoMTw8MjYpIGJpdCBpcyBzZXQgYW5kIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkLgoKVGhlIGJsb2NrIGNvcHkgaGVscGVyIGZ1bmN0aW9uIHNob3VsZCwgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcyBvZiB0aGUgdHlwZSBtZW50aW9uZWQgYWJvdmUsIGNhbGwKICAgICBfQmxvY2tfb2JqZWN0X2Fzc2lnbigmZHN0LT50YXJnZXQsIHNyYy0+dGFyZ2V0LCBCTE9DS19GSUVMRF88YXBwcm9wbz4pOwppbiB0aGUgY29weSBoZWxwZXIgYW5kCiAgICBfQmxvY2tfb2JqZWN0X2Rpc3Bvc2UoLT50YXJnZXQsIEJMT0NLX0ZJRUxEXzxhcHByb3BvPik7CmluIHRoZSBkaXNwb3NlIGhlbHBlciB3aGVyZQogICAgICA8YXBwcm9wbz4gaXMKCmVudW0gewogICAgQkxPQ0tfRklFTERfSVNfT0JKRUNUICAgPSAgMywgIC8vIGlkLCBOU09iamVjdCwgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSwgYmxvY2ssIC4uLgogICAgQkxPQ0tfRklFTERfSVNfQkxPQ0sgICAgPSAgNywgIC8vIGEgYmxvY2sgdmFyaWFibGUKICAgIEJMT0NLX0ZJRUxEX0lTX0JZUkVGICAgID0gIDgsICAvLyB0aGUgb24gc3RhY2sgc3RydWN0dXJlIGhvbGRpbmcgdGhlIF9fYmxvY2sgdmFyaWFibGUKCiAgICBCTE9DS19GSUVMRF9JU19XRUFLICAgICA9IDE2LCAgLy8gZGVjbGFyZWQgX193ZWFrCgogICAgQkxPQ0tfQllSRUZfQ0FMTEVSICAgICAgPSAxMjgsIC8vIGNhbGxlZCBmcm9tIGJ5cmVmIGNvcHkvZGlzcG9zZSBoZWxwZXJzCn07CgphbmQgb2YgY291cnNlIHRoZSBDVE9Scy9EVE9ScyBmb3IgY29uc3QgY29waWVkIEMrKyBvYmplY3RzLgoKVGhlIGJsb2NrX2J5cmVmIGRhdGEgc3RydWN0dXJlIHNpbWlsYXJseSByZXF1aXJlcyBjb3B5L2Rpc3Bvc2UgaGVscGVycyBmb3IgYmxvY2sgdmFyaWFibGVzLCBfX2F0dHJpYnV0ZV9fKChOU09iamVjdCkpIHZhcmlhYmxlcywgb3IgQysrIGNvbnN0IGNvcGllZCBvYmplY3RzIHdpdGggY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMsIGFuZCBhZ2FpbiB0aGUgKDE8PDI2KSBiaXQgaXMgc2V0IGFuZCBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBtYW5uZXIuCgpVbmRlciBPYmpDIHdlIGFsbG93IF9fd2VhayBhcyBhbiBhdHRyaWJ1dGUgb24gX19ibG9jayB2YXJpYWJsZXMsIGFuZCB0aGlzIGNhdXNlcyB0aGUgYWRkaXRpb24gb2YgQkxPQ0tfRklFTERfSVNfV0VBSyBvcnJlZCBvbnRvIHRoZSBCTE9DS19GSUVMRF9JU19CWVJFRiBmbGFnIHdoZW4gY29weWluZyB0aGUgYmxvY2tfYnlyZWYgc3RydWN0dXJlIGluIHRoZSBibG9jayBjb3B5IGhlbHBlciwgYW5kIG9udG8gdGhlIEJMT0NLX0ZJRUxEXzxhcHByb3BvPiBmaWVsZCB3aXRoaW4gdGhlIGJsb2NrX2J5cmVmIGNvcHkvZGlzcG9zZSBoZWxwZXIgY2FsbHMuCgpUaGUgcHJvdG90eXBlcywgYW5kIHN1bW1hcnksIG9mIHRoZSBoZWxwZXIgZnVuY3Rpb25zIGFyZQoKLyogQ2VydGFpbiBmaWVsZCB0eXBlcyByZXF1aXJlIHJ1bnRpbWUgYXNzaXN0YW5jZSB3aGVuIGJlaW5nIGNvcGllZCB0byB0aGUgaGVhcC4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdXNlZAogICB0byBjb3B5IGZpZWxkcyBvZiB0eXBlczogYmxvY2tzLCBwb2ludGVycyB0byBieXJlZiBzdHJ1Y3R1cmVzLCBhbmQgb2JqZWN0cyAoaW5jbHVkaW5nIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgcG9pbnRlcnMuCiAgIEJMT0NLX0ZJRUxEX0lTX1dFQUsgaXMgb3J0aG9nb25hbCB0byB0aGUgb3RoZXIgY2hvaWNlcyB3aGljaCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICBPbmx5IGluIGEgQmxvY2sgY29weSBoZWxwZXIgd2lsbCBvbmUgc2VlIEJMT0NLX0ZJRUxEX0lTX0JZUkVGLgogKi8Kdm9pZCBfQmxvY2tfb2JqZWN0X2Fzc2lnbih2b2lkICpkZXN0QWRkciwgY29uc3Qgdm9pZCAqb2JqZWN0LCBjb25zdCBpbnQgZmxhZ3MpOwoKLyogU2ltaWxhcmx5IGEgY29tcGlsZXIgZ2VuZXJhdGVkIGRpc3Bvc2UgaGVscGVyIG5lZWRzIHRvIGNhbGwgYmFjayBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgYnlyZWYgZGF0YSBzdHJ1Y3R1cmUuCiAgIChDdXJyZW50bHkgdGhlIGltcGxlbWVudGF0aW9uIG9ubHkgcGFja3Mgb25lIGZpZWxkIGludG8gdGhlIGJ5cmVmIHN0cnVjdHVyZSBidXQgaW4gcHJpbmNpcGxlIHRoZXJlIGNvdWxkIGJlIG1vcmUpLgogICBUaGUgc2FtZSBmbGFncyB1c2VkIGluIHRoZSBjb3B5IGhlbHBlciBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCBjYWxsIGdlbmVyYXRlZCB0byB0aGlzIGZ1bmN0aW9uOgogKi8Kdm9pZCBfQmxvY2tfb2JqZWN0X2Rpc3Bvc2UoY29uc3Qgdm9pZCAqb2JqZWN0LCBjb25zdCBpbnQgZmxhZ3MpOwoKVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaGF2ZSBiZWVuIHVzZWQgYW5kIHdpbGwgY29udGludWUgdG8gYmUgc3VwcG9ydGVkIHVudGlsIG5ldyBjb21waWxlciBzdXBwb3J0IGlzIGNvbXBsZXRlLgoKLy8gT2Jzb2xldGUgZnVuY3Rpb25zLgovLyBDb3B5IGhlbHBlciBjYWxsYmFjayBmb3IgY29weWluZyBhIGJsb2NrIGltcG9ydGVkIGludG8gYSBCbG9jawovLyBDYWxsZWQgYnkgY29weV9oZWxwZXIgaGVscGVyIGZ1bmN0aW9ucyBzeW50aGVzaXplZCBieSB0aGUgY29tcGlsZXIuCi8vIFRoZSBhZGRyZXNzIGluIHRoZSBkZXN0aW5hdGlvbiBibG9jayBvZiBhbiBpbXBvcnRlZCBCbG9jayBpcyBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLy8gYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZXhpc3RpbmcgaW1wb3J0ZWQgQmxvY2sgaXMgdGhlIHNlY29uZC4KLy8gVXNlOiBfQmxvY2tfb2JqZWN0X2Fzc2lnbihkZXN0LCBzcmMsIEJMT0NLX0ZJRUxEX0lTX0JMT0NLIHt8IEJMT0NLX0ZJRUxEX0lTX1dFQUt9KTsKdm9pZCBfQmxvY2tfY29weV9hc3NpZ24oc3RydWN0IEJsb2NrX2Jhc2ljICoqZGVzdCwgY29uc3Qgc3RydWN0IEJsb2NrX2Jhc2ljICpzcmMsIGNvbnN0IGludCBmbGFncyk7CgovLyBEZXN0cm95IGhlbHBlciBjYWxsYmFjayBmb3IgcmVsZWFzaW5nIEJsb2NrcyBpbXBvcnRlZCBpbnRvIGEgQmxvY2sKLy8gQ2FsbGVkIGJ5IGRpc3Bvc2VfaGVscGVyIGhlbHBlciBmdW5jdGlvbnMgc3ludGhlc2l6ZWQgYnkgdGhlIGNvbXBpbGVyLgovLyBUaGUgdmFsdWUgb2YgdGhlIGltcG9ydGVkIEJsb2NrIHZhcmlhYmxlIGlzIHBhc3NlZCBiYWNrLgovLyBVc2U6IF9CbG9ja19vYmplY3RfZGlzcG9zZShzcmMsIEJMT0NLX0ZJRUxEX0lTX0JMT0NLIHt8IEJMT0NLX0ZJRUxEX0lTX1dFQUt9KTsKdm9pZCBfQmxvY2tfZGVzdHJveShjb25zdCBzdHJ1Y3QgQmxvY2tfYmFzaWMgKnNyYywgY29uc3QgaW50IGZsYWdzKTsKCi8vIEJ5cmVmIGRhdGEgYmxvY2sgY29weSBoZWxwZXIgY2FsbGJhY2sKLy8gQ2FsbGVkIGJ5IGJsb2NrIGNvcHkgaGVscGVycyB3aGVuIGNvcHlpbmcgX19ibG9jayBzdHJ1Y3R1cmVzCi8vIFVzZTogX0Jsb2NrX29iamVjdF9hc3NpZ24oZGVzdCwgc3JjLCBCTE9DS19GSUVMRF9JU19CWVJFRiB7fCBCTE9DS19GSUVMRF9JU19XRUFLfSk7CnZvaWQgX0Jsb2NrX2J5cmVmX2Fzc2lnbl9jb3B5KHN0cnVjdCBCbG9ja19ieXJlZiAqKmRlc3RwLCBzdHJ1Y3QgQmxvY2tfYnlyZWYgKnNyYyk7CgovLyBCeXJlZiBkYXRhIGJsb2NrIHJlbGVhc2UgaGVscGVyIGNhbGxiYWNrCi8vIENhbGxlZCBieSBibG9jayByZWxlYXNlIGhlbHBlcnMgd2hlbiByZWxlYXNpbmcgYSBCbG9jayAKLy8gQ2FsbGVkIGF0IGVzY2FwZSBwb2ludHMgaW4gc2NvcGUgd2hlcmUgX19ibG9jayB2YXJpYWJsZXMgbGl2ZSAodW5kZXIgbm9uLUdDLW9ubHkgY29uZGl0aW9ucykgCi8vIFVzZTogX0Jsb2NrX29iamVjdF9kaXNwb3NlKHNyYywgQkxPQ0tfRklFTERfSVNfQllSRUYge3wgQkxPQ0tfRklFTERfSVNfV0VBS30pOwp2b2lkIKcoc3RydWN0IEJsb2NrX2J5cmVmICpzaGFyZWRfc3RydWN0KTsKCgo=