From: Alexander Barkov Date: February 17 2011 2:05pm Subject: WL#5331 Unicode API for Windows command line client List-Archive: http://lists.mysql.com/commits/131548 Message-Id: <4D5D2B43.4040002@oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000104080905090102060608" --------------000104080905090102060608 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Version 3, with old API code removed. --------------000104080905090102060608 Content-Type: text/plain; name="w5331.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="w5331.diff" CldMIzUzMzEgU3VwcG9ydCBVbmljb2RlIGZvciBXaW5kb3dzIGNvbW1hbmQgbGluZSBjbGll bnQKCkJhc2VkIG9uIHRoZSBvcmlnaW5hbCBwYXRjaCBmb3JtIFZsYWRpc2xhdiBWYWludHJv dWI6Cmh0dHA6Ly9saXN0cy5teXNxbC5jb20vY29tbWl0cy8xMDUzNzkKCgogIEAgY2xpZW50 L215c3FsLmNjCiAgLSBpbnRyb2R1Y2luZyBuZXcgZnVuY3Rpb24gdGVlX3dyaXRlKCksIHRv IHJldXNlCiAgICBpbiBhIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgc2ltaWxhciBsb29wcyBk aXNwbGF5aW5nCiAgICBkYXRhIG9jY3Vycy4KICAtIGludHJvZHVjaW5nIGZsYWdzIGZvciB0 ZWVfd3JpdGUoKSwgdG8gc3VwcG9ydCBkaWZmZXJlbnQKICAgIHByaW50aW5nIG1vZGVzLCBh Y2NvcmRpbmcgdG8gLS14bWwsIC0tcmF3LCAtLXRhYiwgZXRjLAogICAgcGFyYW1ldGVycwog IC0gSW5zdGVhZCBpZiB1c2luZyBhcmd2ICh3aGljaCBpcyBhbHdheXMgaW4gQU5TSSBjb2Rl IHBhZ2UpLAogICAgd2Ugbm93IHVzZSBVVEYxNkxFIEFQSSB0byBhY2Nlc3MgY29tbWFuZCBs aW5lIGFyZ3VtZW50cyBvbiBXaW5kb3dzLAogICAgdXNpbmcgdGhpcyBzY2VuYXJpbzoKICAg IGEuIFdlIHRyYW5zbGF0ZSBhcmd1bWVudHMgdG8gVVRGOE1CNCBvbiBzdGFydHVwLgogICAg Yi4gVGhlbiB3ZSBwcm9jZXNzIGFyZ3VtZW50cyBhbmQgZGV0ZWN0IGNvbm5lY3Rpb24gY2hh cmFjdGVyIHNldAogICAgICAgZnJvbSAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldCBhcmd1bWVu dHMgKG9yIG15LmluaSB2YWx1ZSksCiAgICAgICBvciBmcm9tIHRoZSBPUyBsb2NhbGl6YXRp b24gaW5mb3JtYXRpb24gYnkgZGVmYXVsdC4KICAgIGMuIFRoZW4gd2UgY29udmVydCB1c2Vy LCBkYXRhYmFzZSBhbmQgdGhlIC0tZXhlY3V0ZSAoLWUpIGJ1ZmZlcgogICAgICAgZnJvbSBV VEY4TUI0IHRvIHRoZSBjb25uZWN0aW9uIGNoYXJhY3RlciBzZXQuCiAgICBkLiBDb25uZWN0 CiAgLSBJbnN0ZWFkIG9mIHByaW50aW5nIHVzaW5nIHByaW50aWYvZnB1dHMgZmFtaWx5IGZ1 bmN0aW9ucyBvbiBXaW5kb3dzLAogICAgd2hpY2ggYXJlIGxpbWl0ZWQgdG8gdGhlIGN1cnJl bnQgRE9TIGNvZGUgcGFnZSAoY3A4NTAgb24gYSBXZXN0ZXJuIG1hY2hpbmUpCiAgICB3ZSBu b3cgdXNlIFVURjE2TEUgY29uc29sZSBBUEkgdGhyb3VnaCB0aGUgbmV3IG15X3dpbl9jb25z b2xlX3h4eCgpIAogICAgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIG15X2NvbmlvLmMKICAt IFVzaW5nIG15c3FsX3NldF9jaGFyYWN0ZXJfc2V0KCkgaW5zdGVhZCBvZgogICAgbXlzcWxf b3B0aW9uKE9QVF9DSEFSQUNURVJfU0VUX05BTUUpIHRvIGtub3cgdGhlIG9uZ29pbmcKICAg IHNlc3Npb24gY2hhcmFjdGVyIHNldCAqYmVmb3JlKiBteXNxbF9yZWFsX2Nvbm5lY3QoKSBj YWxsLAogICAgdG8gY29udmVydCB1c2VyIGFuZCBkYXRhYmFzZSBwcm9wZXJseS4KCiAgQCBj bGllbnQvbXlzcWx0ZXN0LmNjCiAgLSBJbnRyb2R1Y2luZyBhIG5ldyBteXNxbHRlc3QgY29t bWFuZDogLS1leGVjdywgdG8gCiAgICBleGVjdXRlIGNvbW1hbmRzIHdpdGggbm9uLUFTQ0lJ IGNoYXJhY3RlcnMgY29ycmVjdGx5IGluIFdpbmRvd3MuCgoKICBAIGluY2x1ZGUvbXlfc3lz LmgKICAtIEFkZGluZyBwcm90b3R5cGVzIGZvciB0aGUgbXlfd2luX2NvbnNvbGVfeHh4KCkg ZnVuY3Rpb25zCgogIEAgbXlzcWwtdGVzdC9ncmFudC50ZXN0CiAgQCBteXNxbC10ZXN0L3Qv bXlzcWwudGVzdAogIEAgbXlzcWwtdGVzdC90L215c3FsX2NwOTMyLnRlc3QKICBAIG15c3Fs LXRlc3QvdC9teXNxbGJpbmxvZy1jcDkzMi50ZXN0CiAgLSBVc2luZyAtLWV4ZWN3IGluc3Rl YWQgb2YgLS1leGVjIGZvciB0aGUgYWZmZWN0ZWQgdGVzdHMKCiAgQCBteXN5cy9teV9jb25p by5jCiAgLSBJbXBsZW1lbnRpbmcgZnVuY3Rpb25zIGZvciBXaW5kb3dzIGNvbnNvbGUgcmVh ZC93cml0ZSBhbmQKICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwcm9jZXNzaW5nLgogIC0g UmVtb3ZpbmcgbXlfY2dldHMoKSwgYXMgaXQncyBub3QgdXNlZCBhbnkgbW9yZS4KCiAgQCBz cWwtY29tbW9uL2NsaWVudC5jCiAgLSBGaXhpbmcgbXlzcWxfc2V0X2NoYXJhY3Rlcl9zZXQo KSB0byBzZXQgbXlzcWwuY2hhcnNldCBvbgogICAgYSBub24tY29ubmVjdGVkICJteXNxbCIu IFByZXZpb3VzbHkgc3VjaCBhIGNhbGwgY3Jhc2hlZC4KICAgIFRoaXMgY2hhbmdlIGFsbG93 cyB0byBrbm93IHdoYXQgY2hhcmFjdGVyIHNldCBmb3IgdGhlCiAgICBvbmdvaW5nIHNlc3Np b25zIGlzIGdvaW5nIHRvIGJlICpiZWZvcmUqIGNhbGxpbmcgbXlzcWxfcmVhbF9jb25uZWN0 KCksCiAgICB3aGljaCBpcyB1c2VkIGluIG15c3FsLmNjLgoKPT09IG1vZGlmaWVkIGZpbGUg J2NsaWVudC9teXNxbC5jYycKLS0tIGNsaWVudC9teXNxbC5jYwkyMDExLTAyLTE1IDEyOjM4 OjM5ICswMDAwCisrKyBjbGllbnQvbXlzcWwuY2MJMjAxMS0wMi0xNyAxMjowNTowNCArMDAw MApAQCAtMTk1LDYgKzE5NSwyMiBAQAogCiBjb25zdCBjaGFyICpkZWZhdWx0X2RidWdfb3B0 aW9uPSJkOnQ6bywvdG1wL215c3FsLnRyYWNlIjsKIAorI2lmZGVmIF9fV0lOX18KKyAvKgor ICAgQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIC0tZXhlY3V0ZSBidWZmZXIgaGFzIGFscmVh ZHkgYmVlbiBjb252ZXJ0ZWQsCisgICB0byBhdm9pZCBkb3VibGUgY29udmVyc2lvbiBvbiBy ZWNvbm5lY3QKKyAqLworc3RhdGljIG15X2Jvb2wgY29udmVyc2lvbl9kb25lPSAwOworI2Vu ZGlmIC8qIF9fV0lOX18gKi8KKworLyogVmFyaW91cyBwcmludGluZyBmbGFncyAqLworI2Rl ZmluZSBNWV9QUklOVF9FU0NfMCAxICAvKiBSZXBsYWNlIDB4MDAgYnl0ZXMgdG8gIlwwIiAg ICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVlfUFJJTlRfU1BTXzAgMiAgLyogUmVwbGFjZSAw eDAwIGJ5dGVzIHRvIHNwYWNlICAgICAgICAgICAgICovCisjZGVmaW5lIE1ZX1BSSU5UX1hN TCAgIDQgIC8qIEVuY29kZSBYTUwgZW50aXRpZXMgICAgICAgICAgICAgICAgICAgICAqLwor I2RlZmluZSBNWV9QUklOVF9NQiAgICA4ICAvKiBSZWNvZ25pemUgbXVsdGktYnl0ZSBjaGFy YWN0ZXJzICAgICAgICAgKi8KKyNkZWZpbmUgTVlfUFJJTlRfQ1RSTCAxNiAgLyogUmVwbGFj ZSBUQUIsIE5MLCBDUiB0byAiXHQiLCAiXG4iLCAiXHIiICovCisKK3ZvaWQgdGVlX3dyaXRl KEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzbGVuLCBpbnQgZmxhZ3MpOwog dm9pZCB0ZWVfZnByaW50ZihGSUxFICpmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiB2 b2lkIHRlZV9mcHV0cyhjb25zdCBjaGFyICpzLCBGSUxFICpmaWxlKTsKIHZvaWQgdGVlX3B1 dHMoY29uc3QgY2hhciAqcywgRklMRSAqZmlsZSk7CkBAIC0xMTEzLDYgKzExMjksMTEgQEAK ICAgICAgIGNsb3NlKHN0ZG91dF9maWxlbm9fY29weSk7ICAgICAgICAgICAgIC8qIENsZWFu IHVwIGR1cCgpLiAqLwogICB9CiAKKyNpZmRlZiBfX1dJTl9fCisgIC8qIENvbnZlcnQgY29t bWFuZCBsaW5lIHBhcmFtZXRlcnMgZnJvbSBVVEYxNkxFIHRvIFVURjhNQjQuICovCisgIG15 X3dpbl90cmFuc2xhdGVfY29tbWFuZF9saW5lX2FyZ3MoJm15X2NoYXJzZXRfdXRmOG1iNF9i aW4sICZhcmdjLCAmYXJndik7CisjZW5kaWYKKwogICBpZiAobG9hZF9kZWZhdWx0cygibXki LGxvYWRfZGVmYXVsdF9ncm91cHMsJmFyZ2MsJmFyZ3YpKQogICB7CiAgICAgbXlfZW5kKDAp OwpAQCAtMTg4NSwyMiArMTkwNiw5IEBACiAgICAgICAgIHRtcGJ1Zi5hbGxvYyg2NTUzNSk7 CiAgICAgICB0bXBidWYubGVuZ3RoKDApOwogICAgICAgYnVmZmVyLmxlbmd0aCgwKTsKLSAg ICAgIHNpemVfdCBjbGVuOwotICAgICAgZG8KLSAgICAgIHsKLQlsaW5lPSBteV9jZ2V0cygo Y2hhciopdG1wYnVmLnB0cigpLCB0bXBidWYuYWxsb2NlZF9sZW5ndGgoKS0xLCAmY2xlbik7 Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZSwgY2xlbik7Ci0gICAgICAgIC8qIAotICAg ICAgICAgICBpZiB3ZSBnb3QgYnVmZmVyIGZ1bGx5IGZpbGxlZCB0aGFuIHRoZXJlIGlzIGEg Y2hhbmNlIHRoYXQKLSAgICAgICAgICAgc29tZXRoaW5nIGVsc2UgaXMgc3RpbGwgaW4gY29u c29sZSBpbnB1dCBidWZmZXIKLSAgICAgICAgKi8KLSAgICAgIH0gd2hpbGUgKHRtcGJ1Zi5h bGxvY2VkX2xlbmd0aCgpIDw9IGNsZW4pOwotICAgICAgLyogCi0gICAgICAgIEFuIGVtcHR5 IGxpbmUgaXMgcmV0dXJuZWQgZnJvbSBteV9jZ2V0cyB3aGVuIHRoZXJlJ3MgZXJyb3IgcmVh ZGluZyA6Ci0gICAgICAgIEN0cmwtYyBmb3IgZXhhbXBsZQotICAgICAgKi8KLSAgICAgIGlm IChsaW5lKQotICAgICAgICBsaW5lPSBidWZmZXIuY19wdHIoKTsKKyAgICAgIGxpbmU9IG15 X3dpbl9jb25zb2xlX3JlYWRsaW5lKGNoYXJzZXRfaW5mbywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjaGFyKikgdG1wYnVmLnB0cigpLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdG1wYnVmLmFsbG9jZWRfbGVuZ3RoKCkpOwogI2Vs c2UKICAgICAgIGlmIChvcHRfb3V0ZmlsZSkKIAlmcHV0cyhwcm9tcHQsIE9VVEZJTEUpOwpA QCAtMzQ1NSwxOSArMzQ2MywxMiBAQAogICAgIGdyaWQuICAoVGhlIFwwIGlzIGFsc28gdGhl IHJlYXNvbiB3ZSBjYW4ndCB1c2UgZnByaW50ZigpIC4pIAogICAqLwogICB1bnNpZ25lZCBp bnQgaTsKLSAgY29uc3QgY2hhciAqcDsKIAogICBpZiAocmlnaHRfanVzdGlmaWVkKSAKICAg ICBmb3IgKGk9IGRhdGFfbGVuZ3RoOyBpIDwgdG90YWxfYnl0ZXNfdG9fc2VuZDsgaSsrKQog ICAgICAgdGVlX3B1dGMoKGludCknICcsIFBBR0VSKTsKIAotICBmb3IgKGk9IDAsIHA9IGRh dGE7IGkgPCBkYXRhX2xlbmd0aDsgaSs9IDEsIHArPSAxKQotICB7Ci0gICAgaWYgKCpwID09 ICdcMCcpCi0gICAgICB0ZWVfcHV0YygoaW50KScgJywgUEFHRVIpOwotICAgIGVsc2UKLSAg ICAgIHRlZV9wdXRjKChpbnQpKnAsIFBBR0VSKTsKLSAgfQorICB0ZWVfd3JpdGUoUEFHRVIs IGRhdGEsIGRhdGFfbGVuZ3RoLCBNWV9QUklOVF9TUFNfMHxNWV9QUklOVF9NQik7CiAKICAg aWYgKCEgcmlnaHRfanVzdGlmaWVkKSAKICAgICBmb3IgKGk9IGRhdGFfbGVuZ3RoOyBpIDwg dG90YWxfYnl0ZXNfdG9fc2VuZDsgaSsrKQpAQCAtMzU4NywxNiArMzU4OCw3IEBACiAgICAg ICAgIHRlZV9mcHJpbnRmKFBBR0VSLCAiJSpzOiAiLChpbnQpIG1heF9sZW5ndGgsZmllbGQt Pm5hbWUpOwogICAgICAgaWYgKGN1cltvZmZdKQogICAgICAgewotICAgICAgICB1bnNpZ25l ZCBpbnQgaTsKLSAgICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgICBmb3IgKGk9IDAs IHA9IGN1cltvZmZdOyBpIDwgbGVuZ3Roc1tvZmZdOyBpKz0gMSwgcCs9IDEpCi0gICAgICAg IHsKLSAgICAgICAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICAgICAgIHRlZV9wdXRjKChp bnQpJyAnLCBQQUdFUik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGVlX3B1dGMo KGludCkqcCwgUEFHRVIpOwotICAgICAgICB9CisgICAgICAgIHRlZV93cml0ZShQQUdFUiwg Y3VyW29mZl0sIGxlbmd0aHNbb2ZmXSwgTVlfUFJJTlRfU1BTXzB8TVlfUFJJTlRfTUIpOwog ICAgICAgICB0ZWVfcHV0YygnXG4nLCBQQUdFUik7CiAgICAgICB9CiAgICAgICBlbHNlCkBA IC0zNjY2LDE2ICszNjU4LDcgQEAKICAgaWYgKCFzcmMpCiAgICAgdGVlX2ZwdXRzKCJOVUxM IiwgUEFHRVIpOwogICBlbHNlCi0gIHsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBzcmM7 IGxlbmd0aDsgcCsrLCBsZW5ndGgtLSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0Owot ICAgICAgaWYgKCh0ID0gYXJyYXlfdmFsdWUoeG1sbWV0YSwgKnApKSkKLQl0ZWVfZnB1dHMo dCwgUEFHRVIpOwotICAgICAgZWxzZQotCXRlZV9wdXRjKCpwLCBQQUdFUik7Ci0gICAgfQot ICB9CisgICAgdGVlX3dyaXRlKFBBR0VSLCBzcmMsIGxlbmd0aCwgTVlfUFJJTlRfWE1MfE1Z X1BSSU5UX01CKTsKIH0KIAogCkBAIC0zNjg2LDM3ICszNjY5LDkgQEAKICAgICB0ZWVfZnB1 dHMoIk5VTEwiLCBQQUdFUik7CiAgIGVsc2UKICAgewotICAgIGlmIChvcHRfcmF3X2RhdGEp Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpOwotICAgICAgLyogQ2FuJ3QgdXNlIHRl ZV9mcHV0cygpLCBpdCBzdG9wcyB3aXRoIE5VTCBjaGFyYWN0ZXJzLiAqLwotICAgICAgZm9y IChpPSAwOyBpIDwgbGVuZ3RoOyBpKyssIHBvcysrKQotICAgICAgICB0ZWVfcHV0YygqcG9z LCBQQUdFUik7Ci0gICAgfQotICAgIGVsc2UgZm9yIChjb25zdCBjaGFyICplbmQ9cG9zK2xl bmd0aCA7IHBvcyAhPSBlbmQgOyBwb3MrKykKLSAgICB7Ci0jaWZkZWYgVVNFX01CCi0gICAg ICBpbnQgbDsKLSAgICAgIGlmICh1c2VfbWIoY2hhcnNldF9pbmZvKSAmJgotICAgICAgICAg IChsID0gbXlfaXNtYmNoYXIoY2hhcnNldF9pbmZvLCBwb3MsIGVuZCkpKQotICAgICAgewot CSAgd2hpbGUgKGwtLSkKLQkgICAgdGVlX3B1dGMoKnBvcysrLCBQQUdFUik7Ci0JICBwb3Mt LTsKLQkgIGNvbnRpbnVlOwotICAgICAgfQotI2VuZGlmCi0gICAgICBpZiAoISpwb3MpCi0J dGVlX2ZwdXRzKCJcXDAiLCBQQUdFUik7IC8vIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBoYXJk Ci0gICAgICBlbHNlIGlmICgqcG9zID09ICdcdCcpCi0JdGVlX2ZwdXRzKCJcXHQiLCBQQUdF Uik7IC8vIFRoaXMgd291bGQgZGVzdHJveSB0YWIgZm9ybWF0Ci0gICAgICBlbHNlIGlmICgq cG9zID09ICdcbicpCi0JdGVlX2ZwdXRzKCJcXG4iLCBQQUdFUik7IC8vIFRoaXMgdG9vCi0g ICAgICBlbHNlIGlmICgqcG9zID09ICdcXCcpCi0JdGVlX2ZwdXRzKCJcXFxcIiwgUEFHRVIp OwotCWVsc2UKLQl0ZWVfcHV0YygqcG9zLCBQQUdFUik7Ci0gICAgfQorICAgIGludCBmbGFn cz0gTVlfUFJJTlRfTUIgfCAob3B0X3Jhd19kYXRhID8gMCA6IChNWV9QUklOVF9FU0NfMHxN WV9QUklOVF9DVFJMKSk7CisgICAgLyogQ2FuJ3QgdXNlIHRlZV9mcHV0cygpLCBpdCBzdG9w cyB3aXRoIE5VTCBjaGFyYWN0ZXJzLiAqLworICAgIHRlZV93cml0ZShQQUdFUiwgcG9zLCBs ZW5ndGgsIGZsYWdzKTsKICAgfQogfQogCkBAIC00MzE3LDcgKzQyNzIsMjkgQEAKICAgICBt eXNxbF9vcHRpb25zKCZteXNxbCwgTVlTUUxfSU5JVF9DT01NQU5ELCBpbml0X2NvbW1hbmQp OwogICB9CiAKLSAgbXlzcWxfb3B0aW9ucygmbXlzcWwsIE1ZU1FMX1NFVF9DSEFSU0VUX05B TUUsIGRlZmF1bHRfY2hhcnNldCk7CisgIG15c3FsX3NldF9jaGFyYWN0ZXJfc2V0KCZteXNx bCwgZGVmYXVsdF9jaGFyc2V0KTsKKyNpZmRlZiBfX1dJTl9fCisgIHVpbnQgY252X2Vycm9y czsKKyAgU3RyaW5nIGNvbnZlcnRlZF9kYXRhYmFzZSwgY29udmVydGVkX3VzZXI7CisgIGlm ICghbXlfY2hhcnNldF9zYW1lKCZteV9jaGFyc2V0X3V0ZjhtYjRfYmluLCBteXNxbC5jaGFy c2V0KSkKKyAgeworICAgIC8qIENvbnZlcnQgdXNlciBhbmQgZGF0YWJhc2UgZnJvbSBVVEY4 TUI0IHRvIGNvbm5lY3Rpb24gY2hhcmFjdGVyIHNldCAqLworICAgIGlmICh1c2VyKQorICAg IHsKKyAgICAgIGNvbnZlcnRlZF91c2VyLmNvcHkodXNlciwgc3RybGVuKHVzZXIpICsgMSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X2NoYXJzZXRfdXRmOG1iNF9iaW4sIG15 c3FsLmNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbnZfZXJyb3JzKTsK KyAgICAgIHVzZXI9IChjaGFyKikgY29udmVydGVkX3VzZXIucHRyKCk7CisgICAgfQorICAg IGlmIChkYXRhYmFzZSkKKyAgICB7CisgICAgICBjb252ZXJ0ZWRfZGF0YWJhc2UuY29weShk YXRhYmFzZSwgc3RybGVuKGRhdGFiYXNlKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmbXlfY2hhcnNldF91dGY4bWI0X2JpbiwgbXlzcWwuY2hhcnNldCwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICZjbnZfZXJyb3JzKTsKKyAgICAgIGRhdGFiYXNl PSAoY2hhciopIGNvbnZlcnRlZF9kYXRhYmFzZS5wdHIoKTsKKyAgICB9CisgIH0KKyNlbmRp ZgogICAKICAgaWYgKG9wdF9wbHVnaW5fZGlyICYmICpvcHRfcGx1Z2luX2RpcikKICAgICBt eXNxbF9vcHRpb25zKCZteXNxbCwgTVlTUUxfUExVR0lOX0RJUiwgb3B0X3BsdWdpbl9kaXIp OwpAQCAtNDMzOSw3ICs0MzE2LDM4IEBACiAgICAgfQogICAgIHJldHVybiAtMTsJCQkJCS8v IFJldHJ5YWJsZQogICB9Ci0gIAorCisjaWZkZWYgX19XSU5fXworICAvKiBDb252ZXJ0IC0t ZXhlY3V0ZSBidWZmZXIgZnJvbSBVVEY4TUI0IHRvIGNvbm5lY3Rpb24gY2hhcmFjdGVyIHNl dCAqLworICBpZiAoIWNvbnZlcnNpb25fZG9uZSsrICYmCisgICAgICBzdGF0dXMubGluZV9i dWZmICYmCisgICAgICAhc3RhdHVzLmxpbmVfYnVmZi0+ZmlsZSAmJiAvKiBDb252ZXJ0IG9u bHkgLWUgYnVmZmVyLCBub3QgcmVhbCBmaWxlICovCisgICAgICBzdGF0dXMubGluZV9idWZm LT5idWZmZXIgPCBzdGF0dXMubGluZV9idWZmLT5lbmQgJiYgLyogTm9uLWVtcHR5ICovCisg ICAgICAhbXlfY2hhcnNldF9zYW1lKCZteV9jaGFyc2V0X3V0ZjhtYjRfYmluLCBteXNxbC5j aGFyc2V0KSkKKyAgeworICAgIFN0cmluZyB0bXA7CisgICAgc2l6ZV90IGxlbj0gc3RhdHVz LmxpbmVfYnVmZi0+ZW5kIC0gc3RhdHVzLmxpbmVfYnVmZi0+YnVmZmVyOworICAgIHVpbnQg ZHVtbXlfZXJyb3JzOworICAgIC8qCisgICAgICBEb24ndCBjb252ZXJ0IHRyYWlsaW5nICdc bicgY2hhcmFjdGVyIC0gaXQgd2FzIGFwcGVuZGVkIGR1cmluZworICAgICAgbGFzdCBiYXRj aF9yZWFkbGluZV9jb21tYW5kKCkgY2FsbC4gCisgICAgICBPaGVyd2lzZSB3ZSdsbCBnZXQg YW4gZXh0cmEgbGluZSwgd2hpY2ggbWFrZXMgc29tZSB0ZXN0cyBmYWlsLgorICAgICovCisg ICAgaWYgKHN0YXR1cy5saW5lX2J1ZmYtPmJ1ZmZlcltsZW4gLSAxXSA9PSAnXG4nKQorICAg ICAgbGVuLS07CisgICAgaWYgKHRtcC5jb3B5KHN0YXR1cy5saW5lX2J1ZmYtPmJ1ZmZlciwg bGVuLAorICAgICAgICAgICAgICAgICAmbXlfY2hhcnNldF91dGY4bWI0X2JpbiwgbXlzcWwu Y2hhcnNldCwgJmR1bW15X2Vycm9ycykpCisgICAgICByZXR1cm4gMTsKKworICAgIC8qIEZy ZWUgdGhlIG9sZCBsaW5lIGJ1ZmZlciAqLworICAgIGJhdGNoX3JlYWRsaW5lX2VuZChzdGF0 dXMubGluZV9idWZmKTsKKworICAgIC8qIFJlLWluaXRpYWxpemUgbGluZSBidWZmZXIgZnJv bSB0aGUgY29udmVydGVkIHN0cmluZyAqLworICAgIGlmICghKHN0YXR1cy5saW5lX2J1ZmY9 IGJhdGNoX3JlYWRsaW5lX2NvbW1hbmQoTlVMTCwgKGNoYXIqKSB0bXAuY19wdHJfc2FmZSgp KSkpCisgICAgICByZXR1cm4gMTsKKyAgfQorI2VuZGlmIC8qIF9fV0lOX18gKi8KKwogICBj aGFyc2V0X2luZm89IG15c3FsLmNoYXJzZXQ7CiAgIAogICBjb25uZWN0ZWQ9MTsKQEAgLTQ2 NDUsMTEgKzQ2NTMsNzUgQEAKIH0KIAogCisvKioKKyAgV3JpdGUgZGF0YSB0byBhIHN0cmVh bS4KKyAgVmFyaW91cyBtb2RlcywgY29ycmVzcG9uZGluZyB0byAtLXRhYiwgLS14bWwsIC0t cmF3IHBhcmFtZXRlcnMsCisgIGFyZSBzdXBwb3J0ZWQuCisKKyAgQHBhcmFtIGZpbGUgICBT dHJlYW0gdG8gd3JpdGUgdG8KKyAgQHBhcmFtIHMgICAgICBTdHJpbmcgdG8gd3JpdGUKKyAg QHBhcmFtIHNsZW4gICBTdHJpbmcgbGVuZ3RoCisgIEBmbGFncyAgICAgICAgRmxhZ3MgZm9y IC0tdGFiLCAtLXhtbCwgLS1yYXcuCisqLwordm9pZCB0ZWVfd3JpdGUoRklMRSAqZmlsZSwg Y29uc3QgY2hhciAqcywgc2l6ZV90IHNsZW4sIGludCBmbGFncykKK3sKKyAgY29uc3QgY2hh ciAqc2U7CisKKyAgZm9yIChzZT0gcyArIHNsZW47IHMgPCBzZTsgcysrKQorICB7CisgICAg Y29uc3QgY2hhciAqdDsKKworICAgIGlmIChmbGFncyAmIE1ZX1BSSU5UX01CKQorICAgIHsK KyAgICAgIGludCBtYmxlbiwgaTsKKyAgICAgIGlmICh1c2VfbWIoY2hhcnNldF9pbmZvKSAm JgorICAgICAgICAgIChtYmxlbj0gbXlfaXNtYmNoYXIoY2hhcnNldF9pbmZvLCBzLCBzZSkp KQorICAgICAgeworI2lmZGVmIF9fV0lOX18KKyAgICAgICAgaWYgKG15X3dpbl9pc19jb25z b2xlKGZpbGUpKQorICAgICAgICAgIG15X3dpbl9jb25zb2xlX3dyaXRlKGNoYXJzZXRfaW5m bywgcywgbWJsZW4pOworICAgICAgICBlbHNlCisgICAgICAgICAgZndyaXRlKHMsIDEsIG1i bGVuLCBmaWxlKTsKKyAgICAgICAgaWYgKG9wdF9vdXRmaWxlKQorICAgICAgICAgIGZ3cml0 ZShzLCAxLCBtYmxlbiwgT1VURklMRSk7CisgICAgICAgIHMrPSBtYmxlbiAtIDE7CisgICAg ICAgIGNvbnRpbnVlOworI2VuZGlmCisgICAgICAgIGZvciAoaT0gMDsgaSA8IG1ibGVuOyBp KyspCisJICAgICAgICB0ZWVfcHV0YyhzW2ldLCBmaWxlKTsKKyAgICAgICAgcys9IG1ibGVu IC0gMTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZs YWdzICYgTVlfUFJJTlRfWE1MKSAmJiAodD0gYXJyYXlfdmFsdWUoeG1sbWV0YSwgKnMpKSkK KyAgICAgIHRlZV9mcHV0cyh0LCBmaWxlKTsKKyAgICBlbHNlIGlmICgoZmxhZ3MgJiBNWV9Q UklOVF9TUFNfMCkgJiYgKnMgPT0gJ1wwJykKKyAgICAgIHRlZV9wdXRjKChpbnQpICcgJywg ZmlsZSk7ICAgLy8gVGhpcyBtYWtlcyBldmVyeXRoaW5nIGhhcmQKKyAgICBlbHNlIGlmICgo ZmxhZ3MgJiBNWV9QUklOVF9FU0NfMCkgJiYgKnMgPT0gJ1wwJykKKyAgICAgIHRlZV9mcHV0 cygiXFwwIiwgZmlsZSk7ICAgLy8gVGhpcyBtYWtlcyBldmVyeXRoaW5nIGhhcmQKKyAgICBl bHNlIGlmICgoZmxhZ3MgJiBNWV9QUklOVF9DVFJMKSAmJiAqcyA9PSAnXHQnKQorICAgICAg dGVlX2ZwdXRzKCJcXHQiLCBmaWxlKTsgICAgICAvLyBUaGlzIHdvdWxkIGRlc3Ryb3kgdGFi IGZvcm1hdAorICAgIGVsc2UgaWYgKChmbGFncyAmIE1ZX1BSSU5UX0NUUkwpICYmICpzID09 ICdcbicpCisgICAgICB0ZWVfZnB1dHMoIlxcbiIsIGZpbGUpOyAgICAgIC8vIFRoaXMgdG9v CisgICAgZWxzZSBpZiAoKGZsYWdzICYgTVlfUFJJTlRfQ1RSTCkgJiYgKnMgPT0gJ1xcJykK KyAgICAgIHRlZV9mcHV0cygiXFxcXCIsIGZpbGUpOworICAgIGVsc2UKKyAgICAgIHRlZV9w dXRjKChpbnQpICpzLCBmaWxlKTsKKyAgfQorfQorCisKIHZvaWQgdGVlX2ZwcmludGYoRklM RSAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAgIHZhX2xpc3QgYXJnczsKIAog ICB2YV9zdGFydChhcmdzLCBmbXQpOworI2lmZGVmIF9fV0lOX18KKyAgaWYgKG15X3dpbl9p c19jb25zb2xlKGZpbGUpKQorICAgIG15X3dpbl9jb25zb2xlX3ZmcHJpbnRmKGNoYXJzZXRf aW5mbywgZm10LCBhcmdzKTsKKyAgZWxzZQorI2VuZGlmCiAgICh2b2lkKSB2ZnByaW50Zihm aWxlLCBmbXQsIGFyZ3MpOwogICB2YV9lbmQoYXJncyk7CiAKQEAgLTQ2NjQsNiArNDczNiwx MSBAQAogCiB2b2lkIHRlZV9mcHV0cyhjb25zdCBjaGFyICpzLCBGSUxFICpmaWxlKQogewor I2lmZGVmIF9fV0lOX18KKyAgaWYgKG15X3dpbl9pc19jb25zb2xlKGZpbGUpKQorICAgIG15 X3dpbl9jb25zb2xlX2ZwdXRzKGNoYXJzZXRfaW5mbywgcyk7CisgIGVsc2UKKyNlbmRpZgog ICBmcHV0cyhzLCBmaWxlKTsKICAgaWYgKG9wdF9vdXRmaWxlKQogICAgIGZwdXRzKHMsIE9V VEZJTEUpOwpAQCAtNDY3MiwxNyArNDc0OSwxNyBAQAogCiB2b2lkIHRlZV9wdXRzKGNvbnN0 IGNoYXIgKnMsIEZJTEUgKmZpbGUpCiB7Ci0gIGZwdXRzKHMsIGZpbGUpOwotICBmcHV0Yygn XG4nLCBmaWxlKTsKLSAgaWYgKG9wdF9vdXRmaWxlKQotICB7Ci0gICAgZnB1dHMocywgT1VU RklMRSk7Ci0gICAgZnB1dGMoJ1xuJywgT1VURklMRSk7Ci0gIH0KKyAgdGVlX2ZwdXRzKHMs IGZpbGUpOworICB0ZWVfcHV0YygnXG4nLCBmaWxlKTsKIH0KIAogdm9pZCB0ZWVfcHV0Yyhp bnQgYywgRklMRSAqZmlsZSkKIHsKKyNpZmRlZiBfX1dJTl9fCisgIGlmIChteV93aW5faXNf Y29uc29sZShmaWxlKSkKKyAgICBteV93aW5fY29uc29sZV9wdXRjKGNoYXJzZXRfaW5mbywg Yyk7CisgIGVsc2UKKyNlbmRpZgogICBwdXRjKGMsIGZpbGUpOwogICBpZiAob3B0X291dGZp bGUpCiAgICAgcHV0YyhjLCBPVVRGSUxFKTsKCj09PSBtb2RpZmllZCBmaWxlICdjbGllbnQv bXlzcWx0ZXN0LmNjJwotLS0gY2xpZW50L215c3FsdGVzdC5jYwkyMDExLTAxLTI2IDIwOjEz OjMxICswMDAwCisrKyBjbGllbnQvbXlzcWx0ZXN0LmNjCTIwMTEtMDItMTcgMTE6MzI6MDYg KzAwMDAKQEAgLTMwMiw3ICszMDIsNyBAQAogICBRX0VOQUJMRV9XQVJOSU5HUywgUV9ESVNB QkxFX1dBUk5JTkdTLAogICBRX0VOQUJMRV9JTkZPLCBRX0RJU0FCTEVfSU5GTywKICAgUV9F TkFCTEVfTUVUQURBVEEsIFFfRElTQUJMRV9NRVRBREFUQSwKLSAgUV9FWEVDLCBRX0RFTElN SVRFUiwKKyAgUV9FWEVDLCBRX0VYRUNXLCBRX0RFTElNSVRFUiwKICAgUV9ESVNBQkxFX0FC T1JUX09OX0VSUk9SLCBRX0VOQUJMRV9BQk9SVF9PTl9FUlJPUiwKICAgUV9ESVNQTEFZX1ZF UlRJQ0FMX1JFU1VMVFMsIFFfRElTUExBWV9IT1JJWk9OVEFMX1JFU1VMVFMsCiAgIFFfUVVF UllfVkVSVElDQUwsIFFfUVVFUllfSE9SSVpPTlRBTCwgUV9TT1JURURfUkVTVUxULApAQCAt MzczLDYgKzM3Myw3IEBACiAgICJlbmFibGVfbWV0YWRhdGEiLAogICAiZGlzYWJsZV9tZXRh ZGF0YSIsCiAgICJleGVjIiwKKyAgImV4ZWN3IiwKICAgImRlbGltaXRlciIsCiAgICJkaXNh YmxlX2Fib3J0X29uX2Vycm9yIiwKICAgImVuYWJsZV9hYm9ydF9vbl9lcnJvciIsCkBAIC0y NzUwLDggKzI3NTEsNTIgQEAKICNlbmRpZgogCiAKLUZJTEUqIG15X3BvcGVuKERZTkFNSUNf U1RSSU5HICpkc19jbWQsIGNvbnN0IGNoYXIgKm1vZGUpCitGSUxFKiBteV9wb3BlbihEWU5B TUlDX1NUUklORyAqZHNfY21kLCBjb25zdCBjaGFyICptb2RlLAorICAgICAgICAgICAgICAg c3RydWN0IHN0X2NvbW1hbmQgKmNvbW1hbmQpCiB7CisjaWYgX19XSU5fXw0KKyAgLyoNCisg ICAgLS1leGVjdyBpcyBmb3IgdGVzdHMgZXhlY3V0aW5nIGNvbW1hbmRzIGNvbnRhaW5pbmcg bm9uLUFTQ0lJIGNoYXJhY3RlcnMuDQorDQorICAgIFRvIGNvcnJlY3RseSBzdGFydCBzdWNo IGEgcHJvZ3JhbSBvbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHVzZSB0aGUgIndpZGUiDQorICAg IHZlcnNpb24gb2YgcG9wZW4sIHdpdGggcHJpb3IgdHJhbnNsYXRpb24gb2YgdGhlIGNvbW1h bmQgbGluZSBmcm9tDQorICAgIHRoZSBmaWxlIGNoYXJhY3RlciBzZXQgdG8gd2lkZSBzdHJp bmcuIFdlIHVzZSB0aGUgY3VycmVudCB2YWx1ZQ0KKyAgICBvZiAtLWNoYXJhY3Rlcl9zZXQg YXMgYSBmaWxlIGNoYXJhY3RlciBzZXQsIHNvIGJlZm9yZSB1c2luZyAtLWV4ZWN3DQorICAg IG1ha2Ugc3VyZSB0byBzZXQgLS1jaGFyYWN0ZXJfc2V0IHByb3Blcmx5Lg0KKw0KKyAgICBJ ZiB3ZSB1c2UgdGhlIG5vbi13aWRlIHZlcnNpb24gb2YgcG9wZW4sIFdpbmRvd3MgaW50ZXJu YWxseQ0KKyAgICBjb252ZXJ0cyBjb21tYW5kIGxpbmUgZnJvbSB0aGUgY3VycmVudCBBTlNJ IGNvZGUgcGFnZSB0byB3aWRlIHN0cmluZy4NCisgICAgSW4gY2FzZSB3aGVuIGNoYXJhY3Rl ciBzZXQgb2YgdGhlIGNvbW1hbmQgbGluZSBkb2VzIG5vdCBtYXRjaCB0aGUNCisgICAgY3Vy cmVudCBBTlNJIGNvZGUgcGFnZSwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGdhcmJsZWQg aW4gbW9zdCBjYXNlcy4NCisNCisgICAgT24gTGludXgsIHRoZSBjb21tYW5kIGxpbmUgcGFz c2VkIHRvIHBvcGVuKCkgaXMgY29uc2lkZXJlZA0KKyAgICBhcyBhIGJpbmFyeSBzdHJpbmcs IG5vIGFueSBpbnRlcm5hbCB0by13aWRlIGFuZCBmcm9tLXdpZGUNCisgICAgY2hhcmFjdGVy IHNldCBjb252ZXJzaW9uIGhhcHBlbnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhp bmcuDQorICAgIE9uIExpbnV4IC0tZXhlY3cgaXMganVzdCBhIHN5bm9ueW0gdG8gLS1leGVj Lg0KKw0KKyAgICBGb3Igc2ltcGxpY2l0eSwgYXNzdW1lIHRoYXQgIGNvbW1hbmQgbGluZSBp cyBsaW1pdGVkIHRvIDRLQg0KKyAgICAobGlrZSBpbiBjbWQuZXhlKSBhbmQgdGhhdCBtb2Rl IGF0IG1vc3QgMTAgY2hhcmFjdGVycy4NCisgICovDQorICBpZiAoY29tbWFuZC0+dHlwZSA9 PSBRX0VYRUNXKQ0KKyAgew0KKyAgICB3Y2hhcl90IHdjbWRbNDA5Nl07DQorICAgIHdjaGFy X3Qgd21vZGVbMTBdOw0KKyAgICBjb25zdCBjaGFyICpjbWQ9IGRzX2NtZC0+c3RyOw0KKyAg ICB1aW50IGR1bW15X2Vycm9yczsNCisgICAgc2l6ZV90IGxlbjsNCisgICAgbGVuPSBteV9j b252ZXJ0KChjaGFyKikgd2NtZCwgc2l6ZW9mKHdjbWQpIC0gc2l6ZW9mKHdjbWRbMF0pLA0K KyAgICAgICAgICAgICAgICAgICAgJm15X2NoYXJzZXRfdXRmMTZsZV9iaW4sDQorICAgICAg ICAgICAgICAgICAgICBkc19jbWQtPnN0ciwgc3RybGVuKGRzX2NtZC0+c3RyKSwgY2hhcnNl dF9pbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgJmR1bW15X2Vycm9ycyk7DQorICAgIHdj bWRbbGVuIC8gc2l6ZW9mKHdjaGFyX3QpXT0gMDsNCisgICAgbGVuPSBteV9jb252ZXJ0KChj aGFyKikgd21vZGUsIHNpemVvZih3bW9kZSkgLSBzaXplb2Yod21vZGVbMF0pLA0KKyAgICAg ICAgICAgICAgICAgICAgJm15X2NoYXJzZXRfdXRmMTZsZV9iaW4sDQorICAgICAgICAgICAg ICAgICAgICBtb2RlLCBzdHJsZW4obW9kZSksIGNoYXJzZXRfaW5mbywgJmR1bW15X2Vycm9y cyk7DQorICAgIHdtb2RlW2xlbiAvIHNpemVvZih3Y2hhcl90KV09IDA7DQorICAgIHJldHVy biBfd3BvcGVuKHdjbWQsIHdtb2RlKTsKKyAgfQorI2VuZGlmIF9fV0lOX18KKwogI2lmIGRl ZmluZWQgX19XSU5fXyAmJiBkZWZpbmVkIFVTRV9DWUdXSU4KICAgLyogRHVtcCB0aGUgY29t bWFuZCBpbnRvIGEgc2ggc2NyaXB0IGZpbGUgYW5kIGV4ZWN1dGUgd2l0aCBwb3BlbiAqLwog ICBzdHJfdG9fZmlsZSh0bXBfc2hfbmFtZSwgZHNfY21kLT5zdHIsIGRzX2NtZC0+bGVuZ3Ro KTsKQEAgLTI4ODgsNyArMjkzMyw3IEBACiAgIERCVUdfUFJJTlQoImluZm8iLCAoIkV4ZWN1 dGluZyAnJXMnIGFzICclcyciLAogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZp cnN0X2FyZ3VtZW50LCBkc19jbWQuc3RyKSk7CiAKLSAgaWYgKCEocmVzX2ZpbGU9IG15X3Bv cGVuKCZkc19jbWQsICJyIikpICYmIGNvbW1hbmQtPmFib3J0X29uX2Vycm9yKQorICBpZiAo IShyZXNfZmlsZT0gbXlfcG9wZW4oJmRzX2NtZCwgInIiLCBjb21tYW5kKSkgJiYgY29tbWFu ZC0+YWJvcnRfb25fZXJyb3IpCiAgIHsKICAgICBkeW5zdHJfZnJlZSgmZHNfY21kKTsKICAg ICBkaWUoInBvcGVuKFwiJXNcIiwgXCJyXCIpIGZhaWxlZCIsIGNvbW1hbmQtPmZpcnN0X2Fy Z3VtZW50KTsKQEAgLTg3NjMsNiArODgwOCw3IEBACiAgICAgICAgIGRvX3NodXRkb3duX3Nl cnZlcihjb21tYW5kKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFFfRVhFQzoKKyAg ICAgIGNhc2UgUV9FWEVDVzoKIAlkb19leGVjKGNvbW1hbmQpOwogCWNvbW1hbmRfZXhlY3V0 ZWQrKzsKIAlicmVhazsKCj09PSBtb2RpZmllZCBmaWxlICdpbmNsdWRlL215X3N5cy5oJwot LS0gaW5jbHVkZS9teV9zeXMuaAkyMDExLTAyLTA4IDE1OjU0OjEyICswMDAwCisrKyBpbmNs dWRlL215X3N5cy5oCTIwMTEtMDItMTcgMTI6Mzk6NTAgKzAwMDAKQEAgLTk0Niw5ICs5NDYs MTQgQEAKIHZvaWQgbXlfc2VjdXJpdHlfYXR0cl9mcmVlKFNFQ1VSSVRZX0FUVFJJQlVURVMg KnNhKTsKIAogLyogaW1wbGVtZW50ZWQgaW4gbXlfY29uaW8uYyAqLwotY2hhciogbXlfY2dl dHMoY2hhciAqc3RyaW5nLCBzaXplX3QgY2xlbiwgc2l6ZV90KiBwbGVuKTsKLQotI2VuZGlm CitteV9ib29sIG15X3dpbl9pc19jb25zb2xlKEZJTEUgKmZpbGUpOworY2hhciAqbXlfd2lu X2NvbnNvbGVfcmVhZGxpbmUoQ0hBUlNFVF9JTkZPICpjcywgY2hhciAqbWJidWYsIHNpemVf dCBtYmJ1ZnNpemUpOwordm9pZCBteV93aW5fY29uc29sZV93cml0ZShDSEFSU0VUX0lORk8g KmNzLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YWxlbik7Cit2b2lkIG15X3dpbl9j b25zb2xlX2ZwdXRzKENIQVJTRVRfSU5GTyAqY3MsIGNvbnN0IGNoYXIgKmRhdGEpOwordm9p ZCBteV93aW5fY29uc29sZV9wdXRjKENIQVJTRVRfSU5GTyAqY3MsIGludCBjKTsKK3ZvaWQg bXlfd2luX2NvbnNvbGVfdmZwcmludGYoQ0hBUlNFVF9JTkZPICpjcywgY29uc3QgY2hhciAq Zm10LCB2YV9saXN0IGFyZ3MpOworaW50IG15X3dpbl90cmFuc2xhdGVfY29tbWFuZF9saW5l X2FyZ3MoQ0hBUlNFVF9JTkZPICpjcywgaW50ICphYywgY2hhciAqKiphdik7CisjZW5kaWYg LyogX19XSU5fXyAqLwogCiAjaW5jbHVkZSA8bXlzcWwvcHNpL3BzaS5oPgogCgo9PT0gbW9k aWZpZWQgZmlsZSAnbXlzcWwtdGVzdC90L2dyYW50LnRlc3QnCi0tLSBteXNxbC10ZXN0L3Qv Z3JhbnQudGVzdAkyMDEwLTEyLTE1IDE2OjE1OjQwICswMDAwCisrKyBteXNxbC10ZXN0L3Qv Z3JhbnQudGVzdAkyMDExLTAyLTE3IDA5OjQxOjA2ICswMDAwCkBAIC0xNDAxLDkgKzE0MDEs MTAgQEAKICMKICMgQnVnIzIxNDMyIERhdGFiYXNlL1RhYmxlIG5hbWUgbGltaXRlZCB0byA2 NCBieXRlcywgbm90IGNoYXJzLCBwcm9ibGVtcyB3aXRoIG11bHRpLWJ5dGUKICMKKy0tY2hh cmFjdGVyX3NldCB1dGY4CiBzZXQgbmFtZXMgdXRmODsKIGdyYW50IHNlbGVjdCBvbiB0ZXN0 LiogdG8g0Y7Qt9C10YBf0Y7Qt9C10YBAbG9jYWxob3N0OwotLS1leGVjICRNWVNRTCAtLWRl ZmF1bHQtY2hhcmFjdGVyLXNldD11dGY4IC0tdXNlcj3RjtC30LXRgF/RjtC30LXRgCAtZSAi c2VsZWN0IHVzZXIoKSIKKy0tZXhlY3cgJE1ZU1FMIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0 PXV0ZjggLS11c2VyPdGO0LfQtdGAX9GO0LfQtdGAIC1lICJzZWxlY3QgdXNlcigpIgogcmV2 b2tlIGFsbCBvbiB0ZXN0LiogZnJvbSDRjtC30LXRgF/RjtC30LXRgEBsb2NhbGhvc3Q7CiBk cm9wIHVzZXIg0Y7Qt9C10YBf0Y7Qt9C10YBAbG9jYWxob3N0OwogLS1lcnJvciBFUl9XUk9O R19TVFJJTkdfTEVOR1RICgo9PT0gbW9kaWZpZWQgZmlsZSAnbXlzcWwtdGVzdC90L215c3Fs LnRlc3QnCi0tLSBteXNxbC10ZXN0L3QvbXlzcWwudGVzdAkyMDExLTAyLTA1IDA1OjA2OjI5 ICswMDAwCisrKyBteXNxbC10ZXN0L3QvbXlzcWwudGVzdAkyMDExLTAyLTE3IDExOjA5OjE2 ICswMDAwCkBAIC01MSwxMyArNTEsMTQgQEAKICMKICMgQnVnIzE3OTM5IFdyb25nIHRhYmxl IGZvcm1hdCB3aGVuIHVzaW5nIFVURjggc3RyaW5ncwogIwotLS1leGVjICRNWVNRTCAtLWRl ZmF1bHQtY2hhcmFjdGVyLXNldD11dGY4IC0tdGFibGUgLWUgIlNFTEVDVCAnSm9obiBEb2Un IGFzICdfX3Rhw7Fnw6ggw5HDo23DqSciIDI+JjEKLS0tZXhlYyAkTVlTUUwgLS1kZWZhdWx0 LWNoYXJhY3Rlci1zZXQ9dXRmOCAtLXRhYmxlIC1lICJTRUxFQ1QgJ19fdGHDsWfDqCDDkcOj bcOpJyBhcyAnSm9obiBEb2UnIiAyPiYxCistLWNoYXJhY3Rlcl9zZXQgdXRmOAorLS1leGVj dyAkTVlTUUwgLS1kZWZhdWx0LWNoYXJhY3Rlci1zZXQ9dXRmOCAtLXRhYmxlIC1lICJTRUxF Q1QgJ0pvaG4gRG9lJyBhcyAnX190YcOxZ8OoIMORw6Ntw6knIiAyPiYxCistLWV4ZWN3ICRN WVNRTCAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldD11dGY4IC0tdGFibGUgLWUgIlNFTEVDVCAn X190YcOxZ8OoIMORw6Ntw6knIGFzICdKb2huIERvZSciIDI+JjEKIAogIwogIyBCdWcjMTgy NjUgLS0gbXlzcWwgY2xpZW50OiBObyBsb25nZXIgcmlnaHQtanVzdGlmaWVzIG51bWVyaWMg Y29sdW1ucwogIwotLS1leGVjICRNWVNRTCAtdCAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldCB1 dGY4IHRlc3QgLWUgImNyZWF0ZSB0YWJsZSB0MSAoaSBpbnQsIGogaW50LCBrIGNoYXIoMjUp IGNoYXJzZXQgdXRmOCk7IGluc2VydCBpbnRvIHQxIChpKSB2YWx1ZXMgKDEpOyBpbnNlcnQg aW50byB0MSAoaykgdmFsdWVzICgnPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPicpOyBpbnNl cnQgaW50byB0MSAoaykgdmFsdWVzICgnPC0tLS0tJyk7IGluc2VydCBpbnRvIHQxIChrKSB2 YWx1ZXMgKCfOpM63IM6zzrvPjs+Dz4POsScpOyBpbnNlcnQgaW50byB0MSAoaykgdmFsdWVz ICgn4ZuW4Zq0IOGat+GbluGbjycpOyBzZWxlY3QgKiBmcm9tIHQxOyBEUk9QIFRBQkxFIHQx OyIKKy0tZXhlY3cgJE1ZU1FMIC10IC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0IHV0ZjggdGVz dCAtZSAiY3JlYXRlIHRhYmxlIHQxIChpIGludCwgaiBpbnQsIGsgY2hhcigyNSkgY2hhcnNl dCB1dGY4KTsgaW5zZXJ0IGludG8gdDEgKGkpIHZhbHVlcyAoMSk7IGluc2VydCBpbnRvIHQx IChrKSB2YWx1ZXMgKCc8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+Jyk7IGluc2VydCBpbnRv IHQxIChrKSB2YWx1ZXMgKCc8LS0tLS0nKTsgaW5zZXJ0IGludG8gdDEgKGspIHZhbHVlcyAo J86kzrcgzrPOu8+Oz4PPg86xJyk7IGluc2VydCBpbnRvIHQxIChrKSB2YWx1ZXMgKCfhm5bh mrQg4Zq34ZuW4ZuPJyk7IHNlbGVjdCAqIGZyb20gdDE7IERST1AgVEFCTEUgdDE7IgogCiAj CiAjICJERVNDUklCRSIgY29tbWFuZHMgbWF5IHJldHVybiBzdHJhbmdlIE5VTExuZXNzIGZs YWdzLgoKPT09IG1vZGlmaWVkIGZpbGUgJ215c3FsLXRlc3QvdC9teXNxbF9jcDkzMi50ZXN0 JwotLS0gbXlzcWwtdGVzdC90L215c3FsX2NwOTMyLnRlc3QJMjAwNy0wMi0yMSAxNjo1MDo0 OCArMDAwMAorKysgbXlzcWwtdGVzdC90L215c3FsX2NwOTMyLnRlc3QJMjAxMS0wMi0xNyAx MToxMzoxNiArMDAwMApAQCAtMTUsOCArMTUsOSBAQAogLS1leGVjICRNWVNRTCAtLWRlZmF1 bHQtY2hhcmFjdGVyLXNldD1jcDkzMiB0ZXN0IC1lICJjaGFyc2V0IHV0Zjg7IgogCiAjIGl0 cyB1c2FnZSB0byBzd2l0Y2ggaW50ZXJuYWxseSBpbiBteXNxbCB0byByZXF1ZXN0ZWQgY2hh cnNldAotLS1leGVjICRNWVNRTCAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldD11dGY4IHRlc3Qg LWUgImNoYXJzZXQgY3A5MzI7IHNlbGVjdCAng1wnOyBjcmVhdGUgdGFibGUgdDEgKGNfY3A5 MzIgVEVYVCBDSEFSQUNURVIgU0VUIGNwOTMyKTsgaW5zZXJ0IGludG8gdDEgdmFsdWVzKCeD XCcpOyBzZWxlY3QgKiBmcm9tIHQxOyAgZHJvcCB0YWJsZSB0MTsiCi0tLWV4ZWMgJE1ZU1FM IC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PXV0ZjggdGVzdCAtZSAiY2hhcnNldCBjcDkzMjsg c2VsZWN0ICeDXCciCi0tLWV4ZWMgJE1ZU1FMIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PXV0 ZjggdGVzdCAtZSAiLypjaGFyc2V0IGNwOTMyICovOyBzZXQgY2hhcmFjdGVyX3NldF9jbGll bnQ9IGNwOTMyOyBzZWxlY3QgJ4NcJyIKLS0tZXhlYyAkTVlTUUwgLS1kZWZhdWx0LWNoYXJh Y3Rlci1zZXQ9dXRmOCB0ZXN0IC1lICIvKiFcQyBjcDkzMiAqLzsgc2V0IGNoYXJhY3Rlcl9z ZXRfY2xpZW50PSBjcDkzMjsgc2VsZWN0ICeDXCciCistLWNoYXJhY3Rlcl9zZXQgbGF0aW4x CistLWV4ZWN3ICRNWVNRTCAtLWRlZmF1bHQtY2hhcmFjdGVyLXNldD1sYXRpbjEgdGVzdCAt ZSAiY2hhcnNldCBjcDkzMjsgc2VsZWN0ICeDXCc7IGNyZWF0ZSB0YWJsZSB0MSAoY19jcDkz MiBURVhUIENIQVJBQ1RFUiBTRVQgY3A5MzIpOyBpbnNlcnQgaW50byB0MSB2YWx1ZXMoJ4Nc Jyk7IHNlbGVjdCAqIGZyb20gdDE7ICBkcm9wIHRhYmxlIHQxOyIKKy0tZXhlY3cgJE1ZU1FM IC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PWxhdGluMSB0ZXN0IC1lICJjaGFyc2V0IGNwOTMy OyBzZWxlY3QgJ4NcJyIKKy0tZXhlY3cgJE1ZU1FMIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0 PWxhdGluMSB0ZXN0IC1lICIvKmNoYXJzZXQgY3A5MzIgKi87IHNldCBuYW1lcyBjcDkzMiwg Y2hhcmFjdGVyX3NldF9yZXN1bHRzPXV0Zjg7IHNlbGVjdCAng1wnIgorLS1leGVjdyAkTVlT UUwgLS1kZWZhdWx0LWNoYXJhY3Rlci1zZXQ9bGF0aW4xIHRlc3QgLWUgIi8qIVxDIGNwOTMy ICovOyBzZXQgY2hhcmFjdGVyX3NldF9jbGllbnQ9IGNwOTMyOyBzZWxlY3QgJ4NcJyIKIAoK PT09IG1vZGlmaWVkIGZpbGUgJ215c3FsLXRlc3QvdC9teXNxbGJpbmxvZy1jcDkzMi50ZXN0 JwotLS0gbXlzcWwtdGVzdC90L215c3FsYmlubG9nLWNwOTMyLnRlc3QJMjAwOS0wOS0wNyAw NTo0Mjo1NCArMDAwMAorKysgbXlzcWwtdGVzdC90L215c3FsYmlubG9nLWNwOTMyLnRlc3QJ MjAxMS0wMi0xNyAwOToxNjozNCArMDAwMApAQCAtMTAsOCArMTAsMTAgQEAKICMgQnVnIzE2 MjE3IChteXNxbCBjbGllbnQgZGlkIG5vdCBrbm93IGhvdyBub3Qgc3dpdGNoIGl0cyBpbnRl cm5hbCBjaGFyc2V0KQogY3JlYXRlIHRhYmxlIHQzIChmIHRleHQgY2hhcmFjdGVyIHNldCB1 dGY4KTsKIGNyZWF0ZSB0YWJsZSB0NCAoZiB0ZXh0IGNoYXJhY3RlciBzZXQgY3A5MzIpOyAK LS0tZXhlYyAkTVlTUUwgLS1kZWZhdWx0LWNoYXJhY3Rlci1zZXQ9dXRmOCB0ZXN0IC1lICJp bnNlcnQgaW50byB0MyB2YWx1ZXMoX3V0Zjgn44K9JykiCi0tLWV4ZWMgJE1ZU1FMIC0tZGVm YXVsdC1jaGFyYWN0ZXItc2V0PWNwOTMyIHRlc3QgLWUgImluc2VydCBpbnRvIHQ0IHZhbHVl cyhfY3A5MzIng1wnKTsiCistLWNoYXJhY3Rlcl9zZXQgdXRmOAorLS1leGVjdyAkTVlTUUwg LS1kZWZhdWx0LWNoYXJhY3Rlci1zZXQ9dXRmOCB0ZXN0IC1lICJpbnNlcnQgaW50byB0MyB2 YWx1ZXMoX3V0Zjgn44K9JykiCistLWNoYXJhY3Rlcl9zZXQgY3A5MzIKKy0tZXhlY3cgJE1Z U1FMIC0tZGVmYXVsdC1jaGFyYWN0ZXItc2V0PWNwOTMyIHRlc3QgLWUgImluc2VydCBpbnRv IHQ0IHZhbHVlcyhfY3A5MzIng1wnKTsiCiBmbHVzaCBsb2dzOwogcmVuYW1lIHRhYmxlIHQz IHRvIHQwMywgdDQgdG8gdDA0OwogbGV0ICRNWVNRTERfREFUQURJUj0gYHNlbGVjdCBAQGRh dGFkaXJgOwoKPT09IG1vZGlmaWVkIGZpbGUgJ215c3lzL215X2NvbmlvLmMnCi0tLSBteXN5 cy9teV9jb25pby5jCTIwMDktMDItMTMgMTY6NDE6NDcgKzAwMDAKKysrIG15c3lzL215X2Nv bmlvLmMJMjAxMS0wMi0xNyAxMzozNjo0NSArMDAwMApAQCAtMTgsMjA1ICsxOCwyNjEgQEAK IAogI2lmZGVmIF9fV0lOX18KIAotc3RhdGljIEhBTkRMRSBteV9jb25pbnBmaD0gMDsgICAg IC8qIGNvbnNvbGUgaW5wdXQgKi8KLQotLyoKLSAgZnVuY3Rpb25zIG15X3B0aHJlYWRfYXV0 b19tdXRleF9sb2NrICYgbXlfcHRocmVhZF9hdXRvX211dGV4X2ZyZWUKLSAgYXJlIGV4cGVy aW1lbnRhbCBhdCB0aGlzIG1vbWVudCwgdGhleSBhcmUgaW50ZW5kZWQgdG8gYnJpbmcKLSAg YWJpbGl0eSBvZiBwcm90ZWN0aW5nIGNvZGUgc2VjdGlvbnMgd2l0aG91dCBuZWNlc3NpdHkg dG8gZXhwbGljaXRseQotICBpbml0aWFsaXplIHN5bmNocm9uaXphdGlvbiBvYmplY3QgaW4g b25lIG9mIHRocmVhZHMKLQotICBpZiBmb3VuZCB1c2VmdWwgdGhleSBhcmUgdG8gYmUgZXhw b3J0ZWQgaW4gbXlzeXMKLSovCi0KLQotLyoKLSAgaW50IG15X3B0aHJlYWRfYXV0b19tdXRl eF9sb2NrKEhBTkRMRSogcGgsIGNvbnN0IGNoYXIqIG5hbWUsIAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaW50IGlkLCBpbnQgdGltZSkKLSAgTk9URVMKLSAgICBjcmVh dGVzIGEgbXV0ZXggd2l0aCBnaXZlbiBuYW1lIGFuZCB0cmllcyB0byBsb2NrIGl0IHRpbWUg bXNlYy4KLSAgICBtdXRleCBuYW1lIGlzIGFwcGVuZGVkIHdpdGggaWQgdG8gYWxsb3cgc3lz dGVtIHdpZGUgb3IgcHJvY2VzcyB3aWRlCi0gICAgbG9ja3MuIEhhbmRsZSB0byBjcmVhdGVk IG11dGV4IHJldHVybmVkIGluIHBoIGFyZ3VtZW50LgotCi0gIFJFVFVSTgotICAgIDAJICAg ICAgICAgICAgICB0aHJlYWQgb3ducyBtdXRleAotICAgIDw+MAkgICAgICAgICAgICBlcnJv cgotKi8KLQotc3RhdGljCi1pbnQgbXlfcHRocmVhZF9hdXRvX211dGV4X2xvY2soSEFORExF KiBwaCwgY29uc3QgY2hhciogbmFtZSwgaW50IGlkLCBpbnQgdGltZSkKLXsKLSAgaW50IHJl czsKLSAgY2hhciB0bmFtZVtGTl9SRUZMRU5dOwotICAKLSAgc3ByaW50Zih0bmFtZSwgIiVz LSUwOFgiLCBuYW1lLCBpZCk7Ci0gIAotICAqcGg9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNF LCB0bmFtZSk7Ci0gIGlmICgqcGggPT0gTlVMTCkKLSAgICByZXR1cm4gR2V0TGFzdEVycm9y KCk7Ci0KLSAgcmVzPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCpwaCwgdGltZSk7Ci0gIAotICBp ZiAocmVzID09IFdBSVRfVElNRU9VVCkKLSAgICByZXR1cm4gRVJST1JfU0VNX1RJTUVPVVQ7 Ci0KLSAgaWYgKHJlcyA9PSBXQUlUX0ZBSUxFRCkKLSAgICByZXR1cm4gR2V0TGFzdEVycm9y KCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gIGludCBteV9wdGhyZWFkX2F1dG9fbXV0 ZXhfZnJlZShIQU5ETEUqIHBoKQotCi0gIE5PVEVTCi0gICAgcmVsZWFzZXMgYSBtdXRleC4K LQotICBSRVRVUk4KLSAgICAwCSAgICAgICAgICAgICAgdGhyZWFkIHJlbGVhc2VkIG11dGV4 Ci0gICAgPD4wCSAgICAgICAgICAgIGVycm9yCi0KLSovCi1zdGF0aWMKLWludCBteV9wdGhy ZWFkX2F1dG9fbXV0ZXhfZnJlZShIQU5ETEUqIHBoKQotewotICBpZiAoKnBoKQotICB7Ci0g ICAgUmVsZWFzZU11dGV4KCpwaCk7Ci0gICAgQ2xvc2VIYW5kbGUoKnBoKTsKLSAgICAqcGg9 IE5VTEw7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0jZGVmaW5lIHB0aHJlYWRfYXV0 b19tdXRleF9kZWNsKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBIQU5E TEUgX19oIyNuYW1lPSBOVUxMOwotCi0jZGVmaW5lIHB0aHJlYWRfYXV0b19tdXRleF9sb2Nr KG5hbWUsIHByb2MsIHRpbWUpICAgICAgICAgICAgICAgXAotICBteV9wdGhyZWFkX2F1dG9f bXV0ZXhfbG9jaygmX19oIyNuYW1lLCAjbmFtZSwgKHByb2MpLCAodGltZSkpCi0KLSNkZWZp bmUgcHRocmVhZF9hdXRvX211dGV4X2ZyZWUobmFtZSkgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gIG15X3B0aHJlYWRfYXV0b19tdXRleF9mcmVlKCZfX2gjI25hbWUpCi0KLQot LyoKLSAgY2hhciogbXlfY2dldHMoKQotCi0gIE5PVEVTCi0gICAgUmVwbGFjZXMgX2NnZXRz IGZyb20gbGliYyB0byBzdXBwb3J0IGlucHV0IG9mIG1vcmUgdGhhbiAyNTUgY2hhcnMuCi0g ICAgUmVhZHMgZnJvbSB0aGUgY29uc29sZSB2aWEgUmVhZENvbnNvbGUgaW50byBidWZmZXIg d2hpY2ggCi0gICAgc2hvdWxkIGJlIGF0IGxlYXN0IGNsZW4gY2hhcmFjdGVycy4KLSAgICBB Y3R1YWwgbGVuZ3RoIG9mIHN0cmluZyByZXR1cm5lZCBpbiBwbGVuLgotCi0gIFdBUk5JTkcK LSAgICBteV9jZ2V0cygpIGRvZXMgTk9UIGNoZWNrIHRoZSBwdXNoYmFjayBjaGFyYWN0ZXIg YnVmZmVyIChpLmUuLCBfY2hidWYpLgotICAgIFRodXMsIG15X2NnZXRzKCkgd2lsbCBub3Qg cmV0dXJuIGFueSBjaGFyYWN0ZXIgdGhhdCBpcyBwdXNoZWQgYmFjayBieSAKLSAgICB0aGUg X3VuZ2V0Y2goKSBjYWxsLgotCi0gIFJFVFVSTgotICAgIHN0cmluZyBwb2ludGVyCW9rCi0g ICAgTlVMTAkgICAgICAgICAgRXJyb3IKLQotKi8KLQotY2hhciogbXlfY2dldHMoY2hhciAq YnVmZmVyLCBzaXplX3QgY2xlbiwgc2l6ZV90KiBwbGVuKQotewotICBVTE9ORyBzdGF0ZTsK LSAgY2hhciAqcmVzdWx0OwotICBEV09SRCBwbGVuX3JlczsKLSAgQ09OU09MRV9TQ1JFRU5f QlVGRkVSX0lORk8gY3NiaTsKLSAgCi0gIHB0aHJlYWRfYXV0b19tdXRleF9kZWNsKG15X2Nv bmlvX2NzKTsKLSAKLSAgLyogbG9jayB0aGUgY29uc29sZSBmb3IgdGhlIGN1cnJlbnQgcHJv Y2VzcyovCi0gIGlmIChwdGhyZWFkX2F1dG9fbXV0ZXhfbG9jayhteV9jb25pb19jcywgR2V0 Q3VycmVudFByb2Nlc3NJZCgpLCBJTkZJTklURSkpCi0gIHsKLSAgICAvKiBjYW4gbm90IGxv Y2sgY29uc29sZSAqLwotICAgIHB0aHJlYWRfYXV0b19tdXRleF9mcmVlKG15X2NvbmlvX2Nz KTsgIAotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLyogaW5pdCBjb25zb2xlIGlucHV0 ICovCi0gIGlmIChteV9jb25pbnBmaCA9PSAwKQotICB7Ci0gICAgLyogc2FtZSBoYW5kbGUg d2lsbCBiZSB1c2VkIHVudGlsIHByb2Nlc3MgdGVybWluYXRpb24gKi8KLSAgICBteV9jb25p bnBmaD0gQ3JlYXRlRmlsZSgiQ09OSU4kIiwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklU RSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxF X1NIQVJFX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE9QRU5f RVhJU1RJTkcsIDAsIE5VTEwpOwotICB9Ci0KLSAgaWYgKG15X2NvbmlucGZoID09IElOVkFM SURfSEFORExFX1ZBTFVFKSAKLSAgewotICAgIC8qIHVubG9jayB0aGUgY29uc29sZSAqLwot ICAgIHB0aHJlYWRfYXV0b19tdXRleF9mcmVlKG15X2NvbmlvX2NzKTsgIAotICAgIHJldHVy bihOVUxMKTsKLSAgfQotCi0gIEdldENvbnNvbGVNb2RlKChIQU5ETEUpbXlfY29uaW5wZmgs ICZzdGF0ZSk7Ci0gIFNldENvbnNvbGVNb2RlKChIQU5ETEUpbXlfY29uaW5wZmgsIEVOQUJM RV9MSU5FX0lOUFVUIHwgCi0gICAgICAgICAgICAgICAgIEVOQUJMRV9QUk9DRVNTRURfSU5Q VVQgfCBFTkFCTEVfRUNIT19JTlBVVCk7Ci0KLSAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlcklu Zm8oR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwgJmNzYmkpOwotCi0gIC8qIAot ICAgIHRoZXJlIGlzIG5vIGtub3duIHdheSB0byBkZXRlcm1pbmUgYWxsb3dlZCBidWZmZXIg c2l6ZSBmb3IgaW5wdXQKLSAgICB0aG91Z2ggaXQgaXMga25vd24gaXQgc2hvdWxkIG5vdCBi ZSBtb3JlIHRoYW4gNjRLICAgICAgICAgICAgICAgCi0gICAgc28gd2UgY3V0IDY0SyBhbmQg dHJ5IGZpcnN0IHNpemUgb2Ygc2NyZWVuIGJ1ZmZlciAgICAgICAgICAgICAgIAotICAgIGlm IGl0IGlzIHN0aWxsIHRvIGxhcmdlIHdlIGN1dCBoYWxmIG9mIGl0IGFuZCB0cnkgYWdhaW4g ICAgICAgICAKLSAgICBsYXRlciB3ZSBtYXkgd2FudCB0byBjeWNsZSBmcm9tIG1pbihjbGVu LCA2NTUzNSkgdG8gYWxsb3dlZCBzaXplCi0gICAgd2l0aCBzbWFsbCBkZWNyZW1lbnQgdG8g ZGV0ZXJtaW5lIGV4YWN0IGFsbG93ZWQgYnVmZmVyICAgICAgICAgICAKLSAgKi8KLSAgY2xl bj0gbWluKGNsZW4sIDY1NTM1KTsKLSAgZG8KLSAgewotICAgIGNsZW49IG1pbihjbGVuLCAo c2l6ZV90KSBjc2JpLmR3U2l6ZS5YKmNzYmkuZHdTaXplLlkpOwotICAgIGlmICghUmVhZENv bnNvbGUoKEhBTkRMRSlteV9jb25pbnBmaCwgKExQVk9JRClidWZmZXIsIChEV09SRCkgY2xl biAtIDEsICZwbGVuX3JlcywKLSAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQotICAgIHsK LSAgICAgIHJlc3VsdD0gTlVMTDsKLSAgICAgIGNsZW4+Pj0gMTsKKworLyogV2luZG93cyBj b25zb2xlIGhhbmRsaW5nICovCisKKy8qIE1heGltdW0gbGluZSBsZW5ndGggb24gV2luZG93 cyBjb25zb2xlICovCisjZGVmaW5lIE1BWF9DT05TT0xFX0xJTkVfU0laRSA2NTUzNQorCisv KioKKyAgRGV0ZXJtaW5lIGlmIGEgZmlsZSBpcyBhIHdpbmRvd3MgY29uc29sZQorCisgIEBw YXJhbSBmaWxlIElucHV0IHN0cmVhbQorCisgIEByZXR1cm4KKyAgQHJldHZhbCAgMCBpZiBm aWxlIGlzIG5vdCBXaW5kb3dzIGNvbnNvbGUKKyAgQHJldHZhbCAgMSBpZiBmaWxlIGlzIFdp bmRvd3MgY29uc29sZQorKi8KK215X2Jvb2wKK215X3dpbl9pc19jb25zb2xlKEZJTEUgKmZp bGUpCit7CisgIERXT1JEIG1vZGU7CisgIGlmIChHZXRDb25zb2xlTW9kZSgoSEFORExFKSBf Z2V0X29zZmhhbmRsZShfZmlsZW5vKGZpbGUpKSwgJm1vZGUpKQorICAgIHJldHVybiAxOwor ICByZXR1cm4gMDsKK30KKworCisvKioKKyAgUmVhZCBsaW5lIGZyb20gV2luZG93cyBjb25z b2xlIHVzaW5nIFVuaWNvZGUgQVBJCisgIGFuZCB0cmFuc2xhdGUgaW5wdXQgdG8gc2Vzc2lv biBjaGFyYWN0ZXIgc2V0LgorICBOb3RlLCBhcyBXaW5kb3dzIEFQSSBicmVha3Mgc3VwcGxl bWVudGFyeSBjaGFyYWN0ZXJzCisgIGludG8gdHdvIHdjaGFyX3QgcGllY2VzLCB3ZSBjYW5u b3QgcmVhZCBhbmQgY29udmVydCBpbmRpdmlkdWFsCisgIHdjaGFyX3QgdmFsdWVzIHNlcGFy YXRlbHkuIFNvIGxldCdzIHVzZSBhIGJ1ZmZlciBmb3IKKyAgVW5pY29kZSBjb25zb2xlIGlu cHV0LCBhbmQgdGhlbiBjb252ZXJ0IGl0IHRvICJjcyIgaW4gYSBzaW5nbGUgc2hvdC4KKyAg U3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCAnXDAnIGNoYXJhY3Rlci4KKworICBAcGFyYW0g Y3MgICAgICAgICBDaGFyYWN0ZXIgc3RyaW5nIHRvIGNvbnZlcnQgdG8uCisgIEBwYXJhbSBt YmJ1ZiAgICAgIFdyaXRlIGlucHV0IGRhdGEgaGVyZS4KKyAgQHBhcmFtIG1iYnVmc2l6ZSAg TnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiBtYmJ1Zi4KKworICBAcmVydmFsICAgICAg ICAgICBQb2ludGVyIHRvIG1iYnVmLCBvciBOVUxMIG9uIEkvMCBlcnJvci4KKyovCitjaGFy ICoKK215X3dpbl9jb25zb2xlX3JlYWRsaW5lKENIQVJTRVRfSU5GTyAqY3MsIGNoYXIgKm1i YnVmLCBzaXplX3QgbWJidWZzaXplKQoreworICB1aW50IGR1bW15X2Vycm9yczsKKyAgc3Rh dGljIHdjaGFyX3QgdTE2YnVmW01BWF9DT05TT0xFX0xJTkVfU0laRSArIDFdOworICBzaXpl X3QgcG9zLCBtYmxlbjsKKyAgRFdPUkQgY29uc29sZV9tb2RlOworICBIQU5ETEUgY29uc29s ZT0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOworCisgIERCVUdfQVNTRVJUKG1i YnVmc2l6ZSA+IDApOyAvKiBOZWVkIHNwYWNlIGZvciBhdCBsZWFzdCB0cmFpbGluZyAnXDAn ICovCisgIEdldENvbnNvbGVNb2RlKGNvbnNvbGUsICZjb25zb2xlX21vZGUpOworICBTZXRD b25zb2xlTW9kZShjb25zb2xlLCBFTkFCTEVfTElORV9JTlBVVCB8CisJICAgICAgICAgICAg ICAgICAgICAgICAgRU5BQkxFX1BST0NFU1NFRF9JTlBVVCB8IEVOQUJMRV9FQ0hPX0lOUFVU KTsKKyAgZm9yKHBvcz0gMDsgOyApCisgIHsKKyAgICBEV09SRCBuY2hhcnM7CisgICAgQk9P TCBvaz0gUmVhZENvbnNvbGVXKGNvbnNvbGUsICZ1MTZidWZbcG9zXSwgMSwgJm5jaGFycywg TlVMTCk7CisgICAgaWYgKCFvayB8fCBuY2hhcnMgPT0gMCkKKyAgICB7CisgICAgICBTZXRD b25zb2xlTW9kZShjb25zb2xlLCBjb25zb2xlX21vZGUpOworICAgICAgcmV0dXJuIE5VTEw7 CisgICAgfQorICAgIGlmICh1MTZidWZbcG9zXSA9PSBMJ1xyJykKKyAgICAgIGNvbnRpbnVl OworICAgIGlmIChwb3MgPT0gTUFYX0NPTlNPTEVfTElORV9TSVpFIHx8IHUxNmJ1Zltwb3Nd ID09IEwnXG4nKQorICAgICAgYnJlYWs7CisgICAgcG9zKys7CisgIH0KKyAgU2V0Q29uc29s ZU1vZGUoY29uc29sZSwgY29uc29sZV9tb2RlKTsKKyAgLyogQ29udmVydCBVbmljb2RlIHRv IHNlc3Npb24gY2hhcmFjdGVyIHNldCAqLworICBtYmxlbj0gbXlfY29udmVydChtYmJ1Ziwg bWJidWZzaXplIC0gMSwgY3MsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICop IHUxNmJ1ZiwgcG9zICogc2l6ZW9mKHdjaGFyX3QpLAorCSAgICAgICAgICAgICAgICAgICAm bXlfY2hhcnNldF91dGYxNmxlX2JpbiwgJmR1bW15X2Vycm9ycyk7CisgIERCVUdfQVNTRVJU KG1ibGVuIDwgbWJidWZzaXplKTsgLyogU2FmZXR5ICovCisgIG1iYnVmW21ibGVuXT0gMDsK KyAgcmV0dXJuIG1iYnVmOworfQorCisKKy8qKgorICBUcmFuc2xhdGUgY2xpZW50IGNoYXJz ZXQgdG8gV2luZG93cyB3Y2hhcnMgZm9yIGNvbnNvbGUgSS9PLgorICBVbmxpa2UgY29weV9h bmRfY29udmVydCgpLCBpbiBjYXNlIG9mIGEgd3JvbmcgbXVsdGktYnl0ZSBzZXF1ZW5jZQor ICB3ZSBkb24ndCBwcmludCAnPycgY2hhcmFjdGVyLCB3ZSBmYWxsYmFjayB0byBJU08tODg1 OS0xIGluc3RlYWQuCisgIFRoaXMgZ2l2ZXMgYSBiZXR0ZXIgaWRlYSBob3cgYmluYXJ5IGRh dGEgKGUuZy4gQkxPQikgbG9vayBsaWtlLgorCisgIEBwYXJhbSBjcyAgICAgICAgICAgQ2hh cmFjdGVyIHNldCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgIEBwYXJhbSBmcm9tICAgICAgICAg SW5wdXQgc3RyaW5nCisgIEBwYXJhbSBmcm9tX2xlbmd0aCAgTGVuZ3RoIG9mIHRoZSBpbnB1 dCBzdHJpbmcKKyAgQHBhcmFtIHRvW09VVF0gICAgICBXcml0ZSBVbmljb2RlIGRhdGEgaGVy ZQorICBAcGFyYW0gdG9fY2hhcnMgICAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGF2YWlsYWJs ZSBpbiAidG8iCisqLworc3RhdGljIHNpemVfdAorbXlfbWJzdG91MTZzKENIQVJTRVRfSU5G TyAqY3MsIGNvbnN0IHVjaGFyICogZnJvbSwgc2l6ZV90IGZyb21fbGVuZ3RoLAorICAgICAg ICAgICAgIHdjaGFyX3QgKnRvLCBzaXplX3QgdG9fY2hhcnMpCit7CisgIENIQVJTRVRfSU5G TyAqdG9fY3M9ICZteV9jaGFyc2V0X3V0ZjE2bGVfYmluOworICBjb25zdCB1Y2hhciAqZnJv bV9lbmQ9IGZyb20gKyBmcm9tX2xlbmd0aDsKKyAgd2NoYXJfdCAqdG9fb3JpZz0gdG8sICp0 b19lbmQ9IHRvICsgdG9fY2hhcnM7CisgIG15X2NoYXJzZXRfY29udl9tYl93YyBtYl93Yz0g Y3MtPmNzZXQtPm1iX3djOworICBteV9jaGFyc2V0X2NvbnZfd2NfbWIgd2NfbWI9IHRvX2Nz LT5jc2V0LT53Y19tYjsKKyAgd2hpbGUgKGZyb20gPCBmcm9tX2VuZCkKKyAgeworICAgIGlu dCBjbnZyZXM7CisgICAgbXlfd2NfdCB3YzsKKyAgICBpZiAoKGNudnJlcz0gKCptYl93Yyko Y3MsICZ3YywgZnJvbSwgZnJvbV9lbmQpKSA+IDApCisgICAgeworICAgICAgaWYgKCF3YykK KyAgICAgICAgYnJlYWs7CisgICAgICBmcm9tKz0gY252cmVzOworICAgIH0KKyAgICBlbHNl IGlmIChjbnZyZXMgPT0gTVlfQ1NfSUxTRVEpCisgICAgeworICAgICAgd2M9IChteV93Y190 KSAodWNoYXIpICpmcm9tOyAvKiBGYWxsYmFjayB0byBJU08tODg1OS0xICovCisgICAgICBm cm9tKz0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoY252cmVzID4gTVlfQ1NfVE9PU01BTEwp CisgICAgeworICAgICAgLyoKKyAgICAgICAgQSBjb3JyZWN0IG11bHRpYnl0ZSBzZXF1ZW5j ZSBkZXRlY3RlZAorICAgICAgICBCdXQgaXQgZG9lc24ndCBoYXZlIFVuaWNvZGUgbWFwcGlu Zy4gCisgICAgICAqLworICAgICAgZnJvbSs9ICgtY252cmVzKTsKKyAgICAgIHdjPSAnPyc7 CisgICAgfQorICAgIGVsc2UgLyogSW5jb21wbGV0ZSBjaGFyYWN0ZXIgKi8KKyAgICB7Cisg ICAgICB3Yz0gKG15X3djX3QpICh1Y2hhcikgKmZyb207IC8qIEZhbGxiYWNrIHRvIElTTy04 ODU5LTEgKi8KKyAgICAgIGZyb20rPSAxOworICAgIH0KK291dHA6CisgICAgaWYgKChjbnZy ZXM9ICgqd2NfbWIpKHRvX2NzLCB3YywgKHVjaGFyKikgdG8sICh1Y2hhciopIHRvX2VuZCkp ID4gMCkKKyAgICB7CisgICAgICAvKiBXZSBjYW4gbmV2ZXIgY29udmVydCBvbmx5IGEgcGFy dCBvZiB3Y2hhcl90ICovCisgICAgICBEQlVHX0FTU0VSVCgoY252cmVzICUgc2l6ZW9mKHdj aGFyX3QpKSA9PSAwKTsKKyAgICAgIC8qIGNudnJlcyByZXR1cm5zIG51bW5lciBvZiBieXRl cywgY29udmVydCB0byBudW1iZXIgb2Ygd2NoYXJfdCdzICovCisgICAgICB0bys9IGNudnJl cyAvIHNpemVvZih3Y2hhcl90KTsKKyAgICB9CisgICAgZWxzZSBpZiAoY252cmVzID09IE1Z X0NTX0lMVU5JICYmIHdjICE9ICc/JykKKyAgICB7CisgICAgICB3Yz0gJz8nOworICAgICAg Z290byBvdXRwOwogICAgIH0KICAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0PSBidWZm ZXI7Ci0gICAgICBicmVhazsKLSAgICB9CisgICAgICBicmVhazsgLyogTm90IGVub3VnaCBz cGFjZSAqLwogICB9Ci0gIHdoaWxlIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT1RfRU5P VUdIX01FTU9SWSk7Ci0gICpwbGVuPSBwbGVuX3JlczsKLQotICAvKiBXZSBnbyBoZXJlIG9u IGVycm9yIHJlYWRpbmcgdGhlIHN0cmluZyAoQ3RybC1DIGZvciBleGFtcGxlKSAqLwotICBp ZiAoISpwbGVuKQotICAgIHJlc3VsdD0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvKiBwdXJlY292OiBpbnNwZWN0ZWQgKi8KLQotICBpZiAocmVzdWx0ICE9IE5VTEwp CisgIHJldHVybiB0byAtIHRvX29yaWc7Cit9CisKKworLyoqCisgIFdyaXRlIGEgc3RyaW5n IGluIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2V0IHRvIFdpbmRvd3MgY29uc29sZS4gCisgIEFz IFdpbmRvdyBicmVha3Mgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzIGludG8gdHdvIHBhcnRz LAorICB3ZSBjYW5ub3QgdXNlIGEgc2ltcGxlIGxvb3Agc2VuZGluZyB0aGUgcmVzdWx0IG9m CisgIGNzLT5jc2V0LT5tYl93YygpIHRvIGNvbnNvbGUuCisgIFNvIHdlIGNvbnZlcnRzIHN0 cmluZyBmcm9tIGNsaWVudCBjaGFyc2V0IHRvIGFuIGFycmF5IG9mIHdjaGFyX3QsCisgIHRo ZW4gd3JpdGUgdGhlIGFycmF5IHRvIGNvbnNvbGUgaW4gYSBzaW5nbGUgc2hvdC4KKworICBA cGFyYW0gY3MgICAgICAgQ2hhcmFjdGVyIHNldCBvZiB0aGUgc3RyaW5nCisgIEBwYXJhbSBk YXRhICAgICBTdHJpbmcgdG8gcHJpbnQKKyAgQHBhcmFtIGRhdGFsZW4gIExlbmd0aCBvZiBp bnB1dCBzdHJpbmcgaW4gYnl0ZXMKKyovCit2b2lkCitteV93aW5fY29uc29sZV93cml0ZShD SEFSU0VUX0lORk8gKmNzLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sK KyAgc3RhdGljIHdjaGFyX3QgdTE2YnVmW01BWF9DT05TT0xFX0xJTkVfU0laRSArIDFdOwor ICBzaXplX3QgbmNoYXJzPSBteV9tYnN0b3UxNnMoY3MsIChjb25zdCB1Y2hhciopIGRhdGEs IGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZidWYsIHNpemVv Zih1MTZidWYpKTsKKyAgRFdPUkQgbndyaXR0ZW47CisgIFdyaXRlQ29uc29sZVcoR2V0U3Rk SGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwKKyAgICAgICAgICAgICAgICB1MTZidWYsIChE V09SRCluY2hhcnMsICZud3JpdHRlbiwgTlVMTCk7Cit9CisKKworLyoqCisgIFdyaXRlIGEg c2luZ2xlLWJ5dGUgY2hhcmFjdGVyIHRvIGNvbnNvbGUuCisgIE5vdGU6IG9uZSBzaG91bGQg bm90IHNlbmQgcGFydHMgb2YgdGhlIHNhbWUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIKKyAgaW4g c2VwYXJhdGUgY29uc2VxdWVudCBteV93aW5fY29uc29sZV9wdXRjKCkgY2FsbHMuCisgIEZv ciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgdXNlIG15X3dpbl9jb2xzb2xlX3dyaXRlKCkgaW5z dGVhZC4KKworICBAcGFyYW0gY3MgIENoYXJhY3RlciBzZXQgb2YgdGhlIGlucHV0IGNoYXJh Y3RlcgorICBAcGFyYW0gYyAgIENoYXJhY3RlciAoc2luZ2xlIGJ5dGUpCisqLwordm9pZAor bXlfd2luX2NvbnNvbGVfcHV0YyhDSEFSU0VUX0lORk8gKmNzLCBpbnQgYykKK3sKKyAgY2hh ciBjaD0gKGNoYXIpIGM7CisgIG15X3dpbl9jb25zb2xlX3dyaXRlKGNzLCAmY2gsIDEpOwor fQorCisKKy8qKgorICBXcml0ZSBhIDAtdGVybWluYXRlZCBzdHJpbmcgdG8gV2luZG93cyBj b25zb2xlLgorCisgIEBwYXJhbSBjcyAgICBDaGFyYWN0ZXIgc2V0IG9mIHRoZSBzdHJpbmcg dG8gcHJpbnQKKyAgQHBhcmFtIGRhdGEgIFN0cmluZyB0byBwcmludAorKi8KK3ZvaWQKK215 X3dpbl9jb25zb2xlX2ZwdXRzKENIQVJTRVRfSU5GTyAqY3MsIGNvbnN0IGNoYXIgKmRhdGEp Cit7CisgIG15X3dpbl9jb25zb2xlX3dyaXRlKGNzLCBkYXRhLCBzdHJsZW4oZGF0YSkpOwor fQorCisKKy8qCisgIEhhbmRsZSBmb3JtYXR0ZWQgb3V0cHV0IG9uIHRoZSBXaW5kb3dzIGNv bnNvbGUuCisqLwordm9pZAorbXlfd2luX2NvbnNvbGVfdmZwcmludGYoQ0hBUlNFVF9JTkZP ICpjcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisgIHN0YXRpYyBjaGFy IGJ1ZmZbTUFYX0NPTlNPTEVfTElORV9TSVpFICsgMV07CisgIHNpemVfdCBsZW49IHZzbnBy aW50ZihidWZmLCBzaXplb2YoYnVmZikgLSAxLCBmbXQsIGFyZ3MpOworICBteV93aW5fY29u c29sZV93cml0ZShjcywgYnVmZiwgbGVuKTsKK30KKworCisjaW5jbHVkZSA8c2hlbGxhcGku aD4KKworLyoqCisgIFRyYW5zbGF0ZSBVbmljb2RlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJz IHRvIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2V0CisgIChUeXBpY2FsbHkgdG8gdXRmOG1iNCku CisgIFRyYW5zbGF0ZWQgcGFyYW1ldGVycyBhcmUgYWxsb2NhdGVkIHVzaW5nIG15X29uY2Vf YWxsb2MoKS4KKworICBAcGFyYW0gICAgICB0b2NzICAgIENoYXJhY3RlciBzZXQgdG8gY29u dmVydCBwYXJhbWV0ZXJzIHRvLgorICBAcGFyYW1bT1VUXSBhcmdjICAgIFdyaXRlIG51bWJl ciBvZiBwYXJhbWV0ZXJzIGhlcmUKKyAgQHBhcmFtW09VVF0gYXJndiAgICBXcml0ZSBwb2lu dGVyIHRvIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIGhlcmUuCisqLworaW50CitteV93aW5fdHJh bnNsYXRlX2NvbW1hbmRfbGluZV9hcmdzKENIQVJTRVRfSU5GTyAqY3MsIGludCAqYXJnYywg Y2hhciAqKiphcmd2KQoreworICBpbnQgaSwgYWM7CisgIGNoYXIgKiphdjsKKyAgd2NoYXJf dCAqY29tbWFuZF9saW5lPSBHZXRDb21tYW5kTGluZVcoKTsKKyAgd2NoYXJfdCAqKndhcmdz PSBDb21tYW5kTGluZVRvQXJndlcoY29tbWFuZF9saW5lLCAmYWMpOworICBzaXplX3QgbmJ5 dGVzPSAoYWMgKyAxKSAqIHNpemVvZihjaGFyKik7CisKKyAgLyogQWxsb2NhdGUgbmV3IGNv bW1hbmQgbGluZSBwYXJhbWV0ZXIgKi8KKyAgYXY9IChjaGFyKiopIG15X29uY2VfYWxsb2Mo bmJ5dGVzLCBNWUYoTVlfWkVST0ZJTEwpKTsKKworICBmb3IoaT0gMDsgaSA8ICphcmdjOyBp KyspCiAgIHsKLSAgICBpZiAoKnBsZW4gPiAxICYmIGJ1ZmZlclsqcGxlbiAtIDJdID09ICdc cicpCi0gICAgewotICAgICAgKnBsZW49ICpwbGVuIC0gMjsKLSAgICB9Ci0gICAgZWxzZSAK LSAgICB7Ci0gICAgICBpZiAoKnBsZW4gPiAwICYmIGJ1ZmZlclsqcGxlbiAtIDFdID09ICdc cicpCi0gICAgICB7Ci0gICAgICAgIGNoYXIgdG1wWzNdOwotICAgICAgICBpbnQgIHRtcGxl bj0gc2l6ZW9mKHRtcCk7Ci0KLSAgICAgICAgKnBsZW49ICpwbGVuIC0gMTsKLSAgICAgICAg LyogcmVhZCAvbiBsZWZ0IGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgUmVhZENvbnNvbGUo KEhBTkRMRSlteV9jb25pbnBmaCwgKExQVk9JRCl0bXAsIHRtcGxlbiwgJnRtcGxlbiwgTlVM TCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGJ1ZmZlclsqcGxlbl09ICdcMCc7CisgICAgdWlu dCBkdW1teV9lcnJvcnM7CisgICAgc2l6ZV90IGFyZ19sZW49IHdjc2xlbih3YXJnc1tpXSk7 CisgICAgc2l6ZV90IGxlbiwgYWxsb2NlZF9sZW49IGFyZ19sZW4gKiBjcy0+bWJtYXhsZW4g KyAxOworICAgIGF2W2ldPSAoY2hhciAqKSBteV9vbmNlX2FsbG9jKGFsbG9jZWRfbGVuLCBN WUYoMCkpOworICAgIGxlbj0gbXlfY29udmVydChhdltpXSwgYWxsb2NlZF9sZW4sIGNzLAor ICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSB3YXJnc1tpXSwgYXJnX2xlbiAq IHNpemVvZih3Y2hhcl90KSwKKyAgICAgICAgICAgICAgICAgICAgJm15X2NoYXJzZXRfdXRm MTZsZV9iaW4sICZkdW1teV9lcnJvcnMpOworICAgIERCVUdfQVNTRVJUKGxlbiA8IGFsbG9j ZWRfbGVuKTsKKyAgICBhdltpXVtsZW5dPSAnXDAnOwogICB9Ci0KLSAgU2V0Q29uc29sZU1v ZGUoKEhBTkRMRSlteV9jb25pbnBmaCwgc3RhdGUpOwotICAvKiB1bmxvY2sgdGhlIGNvbnNv bGUgKi8KLSAgcHRocmVhZF9hdXRvX211dGV4X2ZyZWUobXlfY29uaW9fY3MpOyAgCi0KLSAg cmV0dXJuIHJlc3VsdDsKKyAgKmFyZ3Y9IGF2OworICAqYXJnYz0gYWM7CisgIC8qIENsZWFu dXAgb24gZXhpdCAqLworICBMb2NhbEZyZWUoKEhMT0NBTCkgd2FyZ3MpOworICByZXR1cm4g MDsKIH0KIAogI2VuZGlmIC8qIF9fV0lOX18gKi8KCj09PSBtb2RpZmllZCBmaWxlICdzcWwt Y29tbW9uL2NsaWVudC5jJwotLS0gc3FsLWNvbW1vbi9jbGllbnQuYwkyMDExLTAxLTMxIDE1 OjU1OjU4ICswMDAwCisrKyBzcWwtY29tbW9uL2NsaWVudC5jCTIwMTEtMDItMTYgMTY6NDc6 MTQgKzAwMDAKQEAgLTQyNDYsMTEgKzQyNDYsMjUgQEAKICAgaWYgKG15c3FsLT5vcHRpb25z LmNoYXJzZXRfZGlyKQogICAgIGNoYXJzZXRzX2Rpcj0gbXlzcWwtPm9wdGlvbnMuY2hhcnNl dF9kaXI7CiAKKyAgaWYgKCFteXNxbC0+bmV0LnZpbykKKyAgeworICAgIC8qIEluaXRpYWxp emUgd2l0aCBhdXRvbWF0aWMgT1MgY2hhcmFjdGVyIHNldCBkZXRlY3Rpb24uICovCisgICAg bXlzcWxfb3B0aW9ucyhteXNxbCwgTVlTUUxfU0VUX0NIQVJTRVRfTkFNRSwgY3NfbmFtZSk7 CisgICAgbXlzcWxfaW5pdF9jaGFyYWN0ZXJfc2V0KG15c3FsKTsKKyAgICBjc19uYW1lPSBt eXNxbC0+b3B0aW9ucy5jaGFyc2V0X25hbWU7CisgIH0KKwogICBpZiAoc3RybGVuKGNzX25h bWUpIDwgTVlfQ1NfTkFNRV9TSVpFICYmCiAgICAgIChjcz0gZ2V0X2NoYXJzZXRfYnlfY3Nu YW1lKGNzX25hbWUsIE1ZX0NTX1BSSU1BUlksIE1ZRigwKSkpKQogICB7CiAgICAgY2hhciBi dWZmW01ZX0NTX05BTUVfU0laRSArIDEwXTsKICAgICBjaGFyc2V0c19kaXI9IHNhdmVfY3Nk aXI7CisgICAgaWYgKCFteXNxbC0+bmV0LnZpbykKKyAgICB7CisgICAgICAvKiBJZiB0aGVy ZSBpcyBubyBjb25uZWN0aW9uIHlldCB3ZSBkb24ndCBzZW5kICJTRVQgTkFNRVMiIHF1ZXJ5 ICovCisgICAgICBteXNxbC0+Y2hhcnNldD0gY3M7CisgICAgICByZXR1cm4gMDsKKyAgICB9 CiAgICAgLyogU2tpcCBleGVjdXRpb24gb2YgIlNFVCBOQU1FUyIgZm9yIHByZS00LjEgc2Vy dmVycyAqLwogICAgIGlmIChteXNxbF9nZXRfc2VydmVyX3ZlcnNpb24obXlzcWwpIDwgNDAx MDApCiAgICAgICByZXR1cm4gMDsKCg== --------------000104080905090102060608--