Received: from localhost (unknown [200.46.204.183]) by developer.postgresql.org (Postfix) with ESMTP id BF08C2E0072 for ; Wed, 14 May 2008 15:09:31 -0300 (ADT) Received: from developer.postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 47578-03 for ; Wed, 14 May 2008 15:09:15 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail.esilo.com (downloads.esilo.com [63.150.152.211]) by developer.postgresql.org (Postfix) with ESMTP id 3ABB02E0055 for ; Wed, 14 May 2008 15:09:15 -0300 (ADT) Received: from [10.0.0.84] (fwext-esilo-jupiter.esilo.com [64.135.45.146]) (authenticated bits=0) by mail.esilo.com (8.13.1/8.13.1) with ESMTP id m4EI991A008640; Wed, 14 May 2008 14:09:10 -0400 Message-ID: <482B2AC5.7000503@esilo.com> Date: Wed, 14 May 2008 14:09:09 -0400 From: Andrew Chernow User-Agent: Thunderbird 2.0.0.14 (Windows/20080421) MIME-Version: 1.0 To: Merlin Moncure CC: Tom Lane , Andrew Dunstan , Alvaro Herrera , "Patches (PostgreSQL)" Subject: Re: libpq object hooks References: <482A58D8.2030205@dunslane.net> <20080514043313.GS6966@alvh.no-ip.org> <482AD896.4000504@dunslane.net> <19342.1210776271@sss.pgh.pa.us> <482B1480.1070705@esilo.com> In-Reply-To: <482B1480.1070705@esilo.com> Content-Type: multipart/mixed; boundary="------------080002070302080708020509" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200805/246 X-Sequence-Number: 6272 This is a multi-part message in MIME format. --------------080002070302080708020509 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Attached is an updated patch. The only change to this patch is that hookNames are now compared with strcmp rather than strcasecmp. The comparisons occur in fe-mics.c (bottom of file) during PQhookData and PQresultHookData. Not sure this needs clarification, but PQcopyResult, PQresultAlloc and PQsetvalue are not part of the object hooks API. They are part of libpq's result management functions (at least that is what I call them). Hook API - PQaddObjectHooks - PQaddGlobalObjectHooks ** CAN BE REMOVED, SEE BELOW - PQhookData - PQresultHookData Result Management (I would put PQmakeEmptyResult here) - PQcopyResult - PQsetvalue - PQresultAlloc (light wrapper to internal pqResultAlloc) PROPOSAL: PQaddGlobalObjectHooks can be removed by handling per-conn and global hook registeration through PQaddObjectHooks. If the provided PGconn is NULL, add hooks to global libpq list: int PQaddObjectHooks(PGconn *conn, PGobjectHooks *hooks) { if(conn == NULL) ;// global hook register else ;// per-conn register } This would make the Object Hooks API 3 functions instead of 4. The same rules apply to global hook registeration, do this from main() before using libpq as the ObjectHooks list is not thread-safe (no locking). NOTE: The patch is called objhooks.patch which is a misleading. The patch is really comprised of the API calls needed to make libpqtypes work. If anyone feels this should be broken into two patches (like objhooks.patch and resmgnt.patch), let us know. -- Andrew Chernow eSilo, LLC every bit counts http://www.esilo.com/ --------------080002070302080708020509 Content-Type: text/plain; name="objhooks.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="objhooks.patch" SW5kZXg6IGV4cG9ydHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9j dnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0LHYKcmV0cmll dmluZyByZXZpc2lvbiAxLjE5CmRpZmYgLUM2IC1yMS4xOSBleHBvcnRzLnR4dAoqKiogZXhw b3J0cy50eHQJMTkgTWFyIDIwMDggMDA6Mzk6MzMgLTAwMDAJMS4xOQotLS0gZXhwb3J0cy50 eHQJMTQgTWF5IDIwMDggMTc6NDc6NTkgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxMzgs MTQzICoqKioKLS0tIDEzOCwxNTAgLS0tLQogIFBRc2VuZERlc2NyaWJlUG9ydGFsICAgICAg MTM2CiAgbG9fdHJ1bmNhdGUgICAgICAgICAgICAgICAxMzcKICBQUWNvbm5lY3Rpb25Vc2Vk UGFzc3dvcmQgIDEzOAogIHBnX3ZhbGlkX3NlcnZlcl9lbmNvZGluZ19pZCAxMzkKICBQUWNv bm5lY3Rpb25OZWVkc1Bhc3N3b3JkIDE0MAogIGxvX2ltcG9ydF93aXRoX29pZAkJICAxNDEK KyBQUWNvcHlSZXN1bHQgICAgICAgICAgICAgIDE0MgorIFBRc2V0dmFsdWUgICAgICAgICAg ICAgICAgMTQzCisgUFFyZXN1bHRBbGxvYyAgICAgICAgICAgICAxNDQKKyBQUWFkZE9iamVj dEhvb2tzICAgICAgICAgIDE0NQorIFBRYWRkR2xvYmFsT2JqZWN0SG9va3MgICAgMTQ2Cisg UFFob29rRGF0YSAgICAgICAgICAgICAgICAxNDcKKyBQUXJlc3VsdEhvb2tEYXRhICAgICAg ICAgIDE0OApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IGZlLWNvbm5lY3Qu Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMv aW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEu MzU3CmRpZmYgLUM2IC1yMS4zNTcgZmUtY29ubmVjdC5jCioqKiBmZS1jb25uZWN0LmMJMzEg TWFyIDIwMDggMDI6NDM6MTQgLTAwMDAJMS4zNTcKLS0tIGZlLWNvbm5lY3QuYwkxNCBNYXkg MjAwOCAxNzo0Nzo1OSAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI0MSwyNTMgKioqKgog IAkJCQkgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKTsKICBzdGF0aWMgY2hhciAqcHdkZk1h dGNoZXNTdHJpbmcoY2hhciAqYnVmLCBjaGFyICp0b2tlbik7CiAgc3RhdGljIGNoYXIgKlBh c3N3b3JkRnJvbUZpbGUoY2hhciAqaG9zdG5hbWUsIGNoYXIgKnBvcnQsIGNoYXIgKmRibmFt ZSwKICAJCQkJIGNoYXIgKnVzZXJuYW1lKTsKICBzdGF0aWMgdm9pZCBkZWZhdWx0X3RocmVh ZGxvY2soaW50IGFjcXVpcmUpOwogIAotIAogIC8qIGdsb2JhbCB2YXJpYWJsZSBiZWNhdXNl IGZlLWF1dGguYyBuZWVkcyB0byBhY2Nlc3MgaXQgKi8KICBwZ3RocmVhZGxvY2tfdCBwZ19n X3RocmVhZGxvY2sgPSBkZWZhdWx0X3RocmVhZGxvY2s7CiAgCiAgCiAgLyoKICAgKgkJQ29u bmVjdGluZyB0byBhIERhdGFiYXNlCi0tLSAyNDEsMjUyIC0tLS0KKioqKioqKioqKioqKioq CioqKiA5NzksOTkwICoqKioKLS0tIDk3OCw5OTAgLS0tLQogICAqCSBvCUlmIHlvdXIgYmFj a2VuZCB3YW50cyB0byB1c2UgS2VyYmVyb3MgYXV0aGVudGljYXRpb24gdGhlbiB5b3UgbXVz dAogICAqCQlzdXBwbHkgYm90aCBhIGhvc3QgbmFtZSBhbmQgYSBob3N0IGFkZHJlc3MsIG90 aGVyd2lzZSB0aGlzIGZ1bmN0aW9uCiAgICoJCW1heSBibG9jayBvbiBnZXRob3N0bmFtZS4K ICAgKgogICAqIC0tLS0tLS0tLS0tLS0tLS0KICAgKi8KKyAKICBQb3N0Z3Jlc1BvbGxpbmdT dGF0dXNUeXBlCiAgUFFjb25uZWN0UG9sbChQR2Nvbm4gKmNvbm4pCiAgewogIAlQR3Jlc3Vs dCAgICpyZXM7CiAgCWNoYXIJCXNlYnVmWzI1Nl07CiAgCioqKioqKioqKioqKioqKgoqKiog OTk4LDEwMDkgKioqKgotLS0gOTk4LDEwMTAgLS0tLQogIAkJCSAqIFdlIHJlYWxseSBzaG91 bGRuJ3QgaGF2ZSBiZWVuIHBvbGxlZCBpbiB0aGVzZSB0d28gY2FzZXMsIGJ1dCB3ZQogIAkJ CSAqIGNhbiBoYW5kbGUgaXQuCiAgCQkJICovCiAgCQljYXNlIENPTk5FQ1RJT05fQkFEOgog IAkJCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICAJCWNhc2UgQ09OTkVDVElPTl9P SzoKKyAJCQlwcUluaXRPYmplY3RIb29rcyhjb25uKTsKICAJCQlyZXR1cm4gUEdSRVNfUE9M TElOR19PSzsKICAKICAJCQkvKiBUaGVzZSBhcmUgcmVhZGluZyBzdGF0ZXMgKi8KICAJCWNh c2UgQ09OTkVDVElPTl9BV0FJVElOR19SRVNQT05TRToKICAJCWNhc2UgQ09OTkVDVElPTl9B VVRIX09LOgogIAkJCXsKKioqKioqKioqKioqKioqCioqKiAxODE2LDE4MjcgKioqKgotLS0g MTgxNywxODI5IC0tLS0KICAJCQkJCWNvbm4tPm5leHRfZW8gPSBFbnZpcm9ubWVudE9wdGlv bnM7CiAgCQkJCQlyZXR1cm4gUEdSRVNfUE9MTElOR19XUklUSU5HOwogIAkJCQl9CiAgCiAg CQkJCS8qIE90aGVyd2lzZSwgd2UgYXJlIG9wZW4gZm9yIGJ1c2luZXNzISAqLwogIAkJCQlj b25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX09LOworIAkJCQlwcUluaXRPYmplY3RIb29rcyhj b25uKTsKICAJCQkJcmV0dXJuIFBHUkVTX1BPTExJTkdfT0s7CiAgCQkJfQogIAogIAkJY2Fz ZSBDT05ORUNUSU9OX1NFVEVOVjoKICAKICAJCQkvKgoqKioqKioqKioqKioqKioKKioqIDE4 NDgsMTg1OSAqKioqCi0tLSAxODUwLDE4NjIgLS0tLQogIAkJCQlkZWZhdWx0OgogIAkJCQkJ Z290byBlcnJvcl9yZXR1cm47CiAgCQkJfQogIAogIAkJCS8qIFdlIGFyZSBvcGVuIGZvciBi dXNpbmVzcyEgKi8KICAJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX09LOworIAkJCXBx SW5pdE9iamVjdEhvb2tzKGNvbm4pOwogIAkJCXJldHVybiBQR1JFU19QT0xMSU5HX09LOwog IAogIAkJZGVmYXVsdDoKICAJCQlwcmludGZQUUV4cEJ1ZmZlcigmY29ubi0+ZXJyb3JNZXNz YWdlLAogIAkJCQkJCQkgIGxpYnBxX2dldHRleHQoCiAgCQkJCQkJCQkJCQkiaW52YWxpZCBj b25uZWN0aW9uIHN0YXRlICVjLCAiCioqKioqKioqKioqKioqKgoqKiogMTg3NSwxODg3ICoq KioKICAJICogdGhlIGNvbm5lY3Rpb24gc3RydWN0dXJlIG11c3QgYmUgZnJlZWQpLgogIAkg Ki8KICAJY29ubi0+c3RhdHVzID0gQ09OTkVDVElPTl9CQUQ7CiAgCXJldHVybiBQR1JFU19Q T0xMSU5HX0ZBSUxFRDsKICB9CiAgCi0gCiAgLyoKICAgKiBtYWtlRW1wdHlQR2Nvbm4KICAg KgkgLSBjcmVhdGUgYSBQR2Nvbm4gZGF0YSBzdHJ1Y3R1cmUgd2l0aCAoYXMgeWV0KSBubyBp bnRlcmVzdGluZyBkYXRhCiAgICovCiAgc3RhdGljIFBHY29ubiAqCiAgbWFrZUVtcHR5UEdj b25uKHZvaWQpCi0tLSAxODc4LDE4ODkgLS0tLQoqKioqKioqKioqKioqKioKKioqIDE5NzAs MTk4MSAqKioqCi0tLSAxOTcyLDIwMDEgLS0tLQogICAqIHJlbGVhc2UgZGF0YSB0aGF0IGlz IHRvIGJlIGhlbGQgZm9yIHRoZSBsaWZlIG9mIHRoZSBQR2Nvbm4gc3RydWN0dXJlLgogICAq IElmIGEgdmFsdWUgb3VnaHQgdG8gYmUgY2xlYXJlZC9mcmVlZCBkdXJpbmcgUFFyZXNldCgp LCBkbyBpdCB0aGVyZSBub3QgaGVyZS4KICAgKi8KICBzdGF0aWMgdm9pZAogIGZyZWVQR2Nv bm4oUEdjb25uICpjb25uKQogIHsKKyAJaW50IGk7CisgCisgCWZvcihpPTA7IGkgPCBjb25u LT5vYmpIb29rc0NvdW50OyBpKyspCisgCXsKKyAJCWlmKGNvbm4tPm9iakhvb2tzW2ldLmNv bm5EZXN0cm95KQorIAkJeworIAkJCWNvbm4tPm9iakhvb2tzW2ldLmNvbm5EZXN0cm95KChj b25zdCBQR2Nvbm4gKiljb25uKTsKKyAJCQlmcmVlKGNvbm4tPm9iakhvb2tzW2ldLm5hbWUp OworIAkJfQorIAl9CisgCisgCWlmKGNvbm4tPm9iakhvb2tzKQorIAl7CisgCQlmcmVlKGNv bm4tPm9iakhvb2tzKTsKKyAJCWNvbm4tPm9iakhvb2tzID0gTlVMTDsKKyAJCWNvbm4tPm9i akhvb2tzQ291bnQgPSBjb25uLT5vYmpIb29rc1NpemUgPSAwOworIAl9CisgCiAgCWlmIChj b25uLT5wZ2hvc3QpCiAgCQlmcmVlKGNvbm4tPnBnaG9zdCk7CiAgCWlmIChjb25uLT5wZ2hv c3RhZGRyKQogIAkJZnJlZShjb25uLT5wZ2hvc3RhZGRyKTsKICAJaWYgKGNvbm4tPnBncG9y dCkKICAJCWZyZWUoY29ubi0+cGdwb3J0KTsKKioqKioqKioqKioqKioqCioqKiAyMTUxLDIx NjQgKioqKgogIFBRcmVzZXQoUEdjb25uICpjb25uKQogIHsKICAJaWYgKGNvbm4pCiAgCXsK ICAJCWNsb3NlUEdjb25uKGNvbm4pOwogIAohIAkJaWYgKGNvbm5lY3REQlN0YXJ0KGNvbm4p KQohIAkJCSh2b2lkKSBjb25uZWN0REJDb21wbGV0ZShjb25uKTsKICAJfQogIH0KICAKICAK ICAvKgogICAqIFBRcmVzZXRTdGFydDoKLS0tIDIxNzEsMjE4OSAtLS0tCiAgUFFyZXNldChQ R2Nvbm4gKmNvbm4pCiAgewogIAlpZiAoY29ubikKICAJewogIAkJY2xvc2VQR2Nvbm4oY29u bik7CiAgCiEgCQlpZiAoY29ubmVjdERCU3RhcnQoY29ubikgJiYgY29ubmVjdERCQ29tcGxl dGUoY29ubikpCiEgCQl7CiEgCQkJaW50IGk7CiEgCQkJZm9yKGk9MDsgaSA8IGNvbm4tPm9i akhvb2tzQ291bnQ7IGkrKykKISAJCQkJaWYoY29ubi0+b2JqSG9va3NbaV0uY29ublJlc2V0 KQohIAkJCQkJY29ubi0+b2JqSG9va3NbaV0uY29ublJlc2V0KChjb25zdCBQR2Nvbm4gKilj b25uKTsKISAJCX0KICAJfQogIH0KICAKICAKICAvKgogICAqIFBRcmVzZXRTdGFydDoKKioq KioqKioqKioqKioqCioqKiAyMTc2LDIxOTggKioqKgogIAkJcmV0dXJuIGNvbm5lY3REQlN0 YXJ0KGNvbm4pOwogIAl9CiAgCiAgCXJldHVybiAwOwogIH0KICAKLSAKICAvKgogICAqIFBR cmVzZXRQb2xsOgogICAqIHJlc2V0cyB0aGUgY29ubmVjdGlvbiB0byB0aGUgYmFja2VuZAog ICAqIGNsb3NlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBhbmQgbWFrZXMgYSBuZXcgb25l CiAgICovCiAgUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZQogIFBRcmVzZXRQb2xsKFBHY29u biAqY29ubikKICB7CiAgCWlmIChjb25uKQohIAkJcmV0dXJuIFBRY29ubmVjdFBvbGwoY29u bik7CiAgCiAgCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICB9CiAgCiAgLyoKICAg KiBQUWNhbmNlbEdldDogZ2V0IGEgUEdjYW5jZWwgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcg dG8gYSBjb25uZWN0aW9uLgotLS0gMjIwMSwyMjM0IC0tLS0KICAJCXJldHVybiBjb25uZWN0 REJTdGFydChjb25uKTsKICAJfQogIAogIAlyZXR1cm4gMDsKICB9CiAgCiAgLyoKICAgKiBQ UXJlc2V0UG9sbDoKICAgKiByZXNldHMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tlbmQK ICAgKiBjbG9zZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYW5kIG1ha2VzIGEgbmV3IG9u ZQogICAqLwogIFBvc3RncmVzUG9sbGluZ1N0YXR1c1R5cGUKICBQUXJlc2V0UG9sbChQR2Nv bm4gKmNvbm4pCiAgewogIAlpZiAoY29ubikKISAJewohIAkJUG9zdGdyZXNQb2xsaW5nU3Rh dHVzVHlwZSBzdGF0dXMgPSBQUWNvbm5lY3RQb2xsKGNvbm4pOwohIAohIAkJaWYoc3RhdHVz ID09IFBHUkVTX1BPTExJTkdfT0spCiEgCQl7CiEgCQkJaW50IGk7CiEgCQkJZm9yKGk9MDsg aSA8IGNvbm4tPm9iakhvb2tzQ291bnQ7IGkrKykKISAJCQkJaWYoY29ubi0+b2JqSG9va3Nb aV0uY29ublJlc2V0KQohIAkJCQkJY29ubi0+b2JqSG9va3NbaV0uY29ublJlc2V0KChjb25z dCBQR2Nvbm4gKiljb25uKTsKISAJCX0KISAKISAJCXJldHVybiBzdGF0dXM7CiEgCX0KICAK ICAJcmV0dXJuIFBHUkVTX1BPTExJTkdfRkFJTEVEOwogIH0KICAKICAvKgogICAqIFBRY2Fu Y2VsR2V0OiBnZXQgYSBQR2NhbmNlbCBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGNv bm5lY3Rpb24uCioqKioqKioqKioqKioqKgoqKiogMzg1NSwzODYwICoqKioKLS0tIDM4OTEs Mzg5NyAtLS0tCiAgCQlwZ19nX3RocmVhZGxvY2sgPSBuZXdoYW5kbGVyOwogIAllbHNlCiAg CQlwZ19nX3RocmVhZGxvY2sgPSBkZWZhdWx0X3RocmVhZGxvY2s7CiAgCiAgCXJldHVybiBw cmV2OwogIH0KKyAKSW5kZXg6IGZlLWV4ZWMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAv cHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVjLmMs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTk0CmRpZmYgLUM2IC1yMS4xOTQgZmUtZXhlYy5j CioqKiBmZS1leGVjLmMJMSBKYW4gMjAwOCAxOTo0NjowMCAtMDAwMAkxLjE5NAotLS0gZmUt ZXhlYy5jCTE0IE1heSAyMDA4IDE3OjQ4OjAwIC0wMDAwCioqKioqKioqKioqKioqKgoqKiog NjAsNzIgKioqKgogIAkJCQlpbnQgcmVzdWx0Rm9ybWF0KTsKICBzdGF0aWMgdm9pZCBwYXJz ZUlucHV0KFBHY29ubiAqY29ubik7CiAgc3RhdGljIGJvb2wgUFFleGVjU3RhcnQoUEdjb25u ICpjb25uKTsKICBzdGF0aWMgUEdyZXN1bHQgKlBRZXhlY0ZpbmlzaChQR2Nvbm4gKmNvbm4p OwogIHN0YXRpYyBpbnQgUFFzZW5kRGVzY3JpYmUoUEdjb25uICpjb25uLCBjaGFyIGRlc2Nf dHlwZSwKICAJCQkgICBjb25zdCBjaGFyICpkZXNjX3RhcmdldCk7CiEgCiAgCiAgLyogLS0t LS0tLS0tLS0tLS0tLQogICAqIFNwYWNlIG1hbmFnZW1lbnQgZm9yIFBHcmVzdWx0LgogICAq CiAgICogRm9ybWVybHksIGxpYnBxIGRpZCBhIHNlcGFyYXRlIG1hbGxvYygpIGZvciBlYWNo IGZpZWxkIG9mIGVhY2ggdHVwbGUKICAgKiByZXR1cm5lZCBieSBhIHF1ZXJ5LiAgVGhpcyB3 YXMgcmVtYXJrYWJseSBleHBlbnNpdmUgLS0tIG1hbGxvYy9mcmVlCi0tLSA2MCw3MiAtLS0t CiAgCQkJCWludCByZXN1bHRGb3JtYXQpOwogIHN0YXRpYyB2b2lkIHBhcnNlSW5wdXQoUEdj b25uICpjb25uKTsKICBzdGF0aWMgYm9vbCBQUWV4ZWNTdGFydChQR2Nvbm4gKmNvbm4pOwog IHN0YXRpYyBQR3Jlc3VsdCAqUFFleGVjRmluaXNoKFBHY29ubiAqY29ubik7CiAgc3RhdGlj IGludCBQUXNlbmREZXNjcmliZShQR2Nvbm4gKmNvbm4sIGNoYXIgZGVzY190eXBlLAogIAkJ CSAgIGNvbnN0IGNoYXIgKmRlc2NfdGFyZ2V0KTsKISBzdGF0aWMgaW50IGNoZWNrX2ZpZWxk X251bWJlcihjb25zdCBQR3Jlc3VsdCAqcmVzLCBpbnQgZmllbGRfbnVtKTsKICAKICAvKiAt LS0tLS0tLS0tLS0tLS0tCiAgICogU3BhY2UgbWFuYWdlbWVudCBmb3IgUEdyZXN1bHQuCiAg ICoKICAgKiBGb3JtZXJseSwgbGlicHEgZGlkIGEgc2VwYXJhdGUgbWFsbG9jKCkgZm9yIGVh Y2ggZmllbGQgb2YgZWFjaCB0dXBsZQogICAqIHJldHVybmVkIGJ5IGEgcXVlcnkuICBUaGlz IHdhcyByZW1hcmthYmx5IGV4cGVuc2l2ZSAtLS0gbWFsbG9jL2ZyZWUKKioqKioqKioqKioq KioqCioqKiAxMjEsMTQxICoqKioKLS0tIDEyMSwxNzAgLS0tLQogICNkZWZpbmUgUEdSRVNV TFRfREFUQV9CTE9DS1NJWkUJCTIwNDgKICAjZGVmaW5lIFBHUkVTVUxUX0FMSUdOX0JPVU5E QVJZCQlNQVhJTVVNX0FMSUdOT0YJCS8qIGZyb20gY29uZmlndXJlICovCiAgI2RlZmluZSBQ R1JFU1VMVF9CTE9DS19PVkVSSEVBRAkJTWF4KHNpemVvZihQR3Jlc3VsdF9kYXRhKSwgUEdS RVNVTFRfQUxJR05fQk9VTkRBUlkpCiAgI2RlZmluZSBQR1JFU1VMVF9TRVBfQUxMT0NfVEhS RVNIT0xECShQR1JFU1VMVF9EQVRBX0JMT0NLU0laRSAvIDIpCiAgCiAgCisgLyogRG9lcyBu b3QgZHVwbGljYXRlIHRoZSBob29rIGRhdGEsIHNldHMgdGhpcyB0byBOVUxMICovCisgc3Rh dGljIFBHb2JqZWN0SG9va3MgKgorIGR1cE9iamVjdEhvb2tzKFBHb2JqZWN0SG9va3MgKmhv b2tzLCBpbnQgY291bnQpCisgeworIAlpbnQgaTsKKyAJUEdvYmplY3RIb29rcyAqbmV3SG9v a3M7CisgCisgCWlmKCFob29rcyB8fCBjb3VudCA8PSAwKQorIAkJcmV0dXJuIE5VTEw7Cisg CisgCW5ld0hvb2tzID0gKFBHb2JqZWN0SG9va3MgKiltYWxsb2MoY291bnQgKiBzaXplb2Yo UEdvYmplY3RIb29rcykpOworIAlpZighbmV3SG9va3MpCisgCQlyZXR1cm4gTlVMTDsKKyAK KyAJbWVtY3B5KG5ld0hvb2tzLCBob29rcywgY291bnQgKiBzaXplb2YoUEdvYmplY3RIb29r cykpOworIAorIAkvKiBOVUxMIG91dCB0aGUgaG9vayBkYXRhIHBvaW50ZXIgKi8KKyAJZm9y KGk9MDsgaSA8IGNvdW50OyBpKyspCisgCXsKKyAJCW5ld0hvb2tzW2ldLmRhdGEgPSBOVUxM OworIAkJbmV3SG9va3NbaV0ubmFtZSA9IHN0cmR1cChob29rc1tpXS5uYW1lKTsKKyAJfQor IAorIAlyZXR1cm4gbmV3SG9va3M7CisgfQorIAogIC8qCiAgICogUFFtYWtlRW1wdHlQR3Jl c3VsdAogICAqCSByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkLCBpbml0aWFsaXplZCBQR3Jl c3VsdCB3aXRoIGdpdmVuIHN0YXR1cy4KICAgKgkgSWYgY29ubiBpcyBub3QgTlVMTCBhbmQg c3RhdHVzIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIGNvbm4ncwogICAqCSBlcnJvck1lc3Nh Z2UgaXMgY29waWVkLgogICAqCiAgICogTm90ZSB0aGlzIGlzIGV4cG9ydGVkIC0tLSB5b3Ug d291bGRuJ3QgdGhpbmsgYW4gYXBwbGljYXRpb24gd291bGQgbmVlZAogICAqIHRvIGJ1aWxk IGl0cyBvd24gUEdyZXN1bHRzLCBidXQgdGhpcyBoYXMgcHJvdmVuIHVzZWZ1bCBpbiBib3Ro IGxpYnBndGNsCiAgICogYW5kIHRoZSBQZXJsNSBpbnRlcmZhY2UsIHNvIG1heWJlIGl0J3Mg bm90IHNvIHVucmVhc29uYWJsZS4KKyAgKgorICAqIFVwZGF0ZWQgQXByaWwgMjAwOCAtIElm IGNvbm4gaXMgbm90IE5VTEwsIE9iamVjdEhvb2tzIHdpbGwgYmUgY29waWVkCisgICogZnJv bSB0aGUgUEdjb25uIHRvIHRoZSBjcmVhdGVkIFBHcmVzdWx0LgogICAqLwogIAogIFBHcmVz dWx0ICoKICBQUW1ha2VFbXB0eVBHcmVzdWx0KFBHY29ubiAqY29ubiwgRXhlY1N0YXR1c1R5 cGUgc3RhdHVzKQogIHsKICAJUEdyZXN1bHQgICAqcmVzdWx0OwoqKioqKioqKioqKioqKioK KioqIDE1NywxNzUgKioqKgotLS0gMTg2LDIxOSAtLS0tCiAgCXJlc3VsdC0+ZXJyTXNnID0g TlVMTDsKICAJcmVzdWx0LT5lcnJGaWVsZHMgPSBOVUxMOwogIAlyZXN1bHQtPm51bGxfZmll bGRbMF0gPSAnXDAnOwogIAlyZXN1bHQtPmN1ckJsb2NrID0gTlVMTDsKICAJcmVzdWx0LT5j dXJPZmZzZXQgPSAwOwogIAlyZXN1bHQtPnNwYWNlTGVmdCA9IDA7CisgCXJlc3VsdC0+b2Jq SG9va3NDb3VudCA9IDA7CisgCXJlc3VsdC0+b2JqSG9va3MgPSBOVUxMOwogIAogIAlpZiAo Y29ubikKICAJewogIAkJLyogY29weSBjb25uZWN0aW9uIGRhdGEgd2UgbWlnaHQgbmVlZCBm b3Igb3BlcmF0aW9ucyBvbiBQR3Jlc3VsdCAqLwogIAkJcmVzdWx0LT5ub3RpY2VIb29rcyA9 IGNvbm4tPm5vdGljZUhvb2tzOwogIAkJcmVzdWx0LT5jbGllbnRfZW5jb2RpbmcgPSBjb25u LT5jbGllbnRfZW5jb2Rpbmc7CiAgCisgCQkvKiBjb3B5IG9iamVjdCBob29rcyBmcm9tIGNv bm5lY3Rpb24gKi8KKyAJCWlmKGNvbm4tPm9iakhvb2tzQ291bnQgPiAwKQorIAkJeworIAkJ CXJlc3VsdC0+b2JqSG9va3MgPSBkdXBPYmplY3RIb29rcyhjb25uLT5vYmpIb29rcywgY29u bi0+b2JqSG9va3NDb3VudCk7CisgCQkJaWYoIXJlc3VsdC0+b2JqSG9va3MpCisgCQkJewor IAkJCQlQUWNsZWFyKHJlc3VsdCk7CisgCQkJCXJldHVybiBOVUxMOworIAkJCX0KKyAKKyAJ CQlyZXN1bHQtPm9iakhvb2tzQ291bnQgPSBjb25uLT5vYmpIb29rc0NvdW50OworIAkJfQor IAogIAkJLyogY29uc2lkZXIgY29weWluZyBjb25uJ3MgZXJyb3JNZXNzYWdlICovCiAgCQlz d2l0Y2ggKHN0YXR1cykKICAJCXsKICAJCQljYXNlIFBHUkVTX0VNUFRZX1FVRVJZOgogIAkJ CWNhc2UgUEdSRVNfQ09NTUFORF9PSzoKICAJCQljYXNlIFBHUkVTX1RVUExFU19PSzoKKioq KioqKioqKioqKioqCioqKiAxOTMsMjA0ICoqKioKLS0tIDIzNyw0NzYgLS0tLQogIAl9CiAg CiAgCXJldHVybiByZXN1bHQ7CiAgfQogIAogIC8qCisgICogUFFjb3B5UmVzdWx0CisgICog UmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgcHJvdmlkZWQgJ3NyYycgUEdyZXN1bHQsIHdo aWNoIGNhbm5vdCBiZSBOVUxMLgorICAqIFRoZSAnb3B0aW9ucycgYXJndW1lbnQgY29udHJv bHMgd2hpY2ggcG9ydGlvbnMgb2YgdGhlIHJlc3VsdCB3aWxsIG9yIHdpbGwKKyAgKiBOT1Qg YmUgY29waWVkLiAgSWYgdGhpcyB2YWx1ZSBpcyAwLCB0aGUgZW50aXJlIHJlc3VsdCBpcyBk ZWVwIGNvcGllZC4KKyAgKiBUaGUgY3JlYXRlZCByZXN1bHQgaXMgYWx3YXlzIHB1dCBpbnRv IHRoZSBQR1JFU19UVVBMRVNfT0sgc3RhdHVzLiAgVGhlCisgICogc291cmNlIHJlc3VsdCBl cnJvciBtZXNzYWdlIGlzIG5vdCBjb3BpZWQsIGFsdGhvdWdoIGNtZFN0YXR1cyBpcy4KKyAg KgorICAqIE9wdGlvbnM6CisgICogICBQR19DT1BZUkVTX05PX1RVUExFUyAtIERvIG5vdCBj b3B5IHRoZSB0dXBsZXMuICBUaGlzIG9wdGlvbiBpcworICAqICAgYXV0b21hdGljYWxseSBl bmFibGVkIHdoZW4gUEdfQ09QWVJFU19VU0VfQVRUUlMgaXMgc2V0LgorICAqCisgICogICBQ R19DT1BZUkVTX1VTRV9BVFRSUyAtIEluZGljYXRlcyB0aGF0IHRoZSAnbnVtQXR0cmlidXRl cycgYW5kICdhdHREZXNjcycKKyAgKiAgIGFyZ3VtZW50cyBzaG91bGQgYmUgdXNlZCBhcyB0 aGUgZmllbGRzIGZvciB0aGUgY3JlYXRlZCByZXN1bHQsIHJhdGhlcgorICAqICAgdGhhbiBj b3B5aW5nIHRoZW0gZnJvbSB0aGUgc291cmNlIHJlc3VsdC4gIFdoZW4gdGhpcyBvcHRpb24g aXMgc2V0LAorICAqICAgdGhlIHR1cGxlcyB3aWxsIE5PVCBiZSBjb3BpZWQ7IGJlaGF2aW5n IGlkZW50aWNhbGx5IHRvIHNldHRpbmcgdGhlCisgICogICBQR19DT1BZUkVTX05PX1RVUExF UyBvcHRpb24uICBPbmUgbXVzdCB1c2UgUFFzZXR2YWx1ZSB0byBtYW51YWxseQorICAqICAg YWRkIHR1cGxlcyB0byB0aGUgcmV0dXJuZWQgcmVzdWx0LiAgTk9URTogbnVtQXR0cmlidXRl cyBhbmQgYXR0RGVzY3MKKyAgKiAgIGFyZ3VtZW50cyBhcmUgaWdub3JlZCB1bmxlc3MgdGhp cyBvcHRpb24gaXMgc2V0IQorICAqCisgICogICBQR19DT1BZUkVTX05PX09CSkVDVEhPT0tT IC0gSW5kaWNhdGVzIHRoYXQgdGhlIHNvdXJjZSByZXN1bHQncworICAqICAgT2JqZWN0SG9v a3Mgc2hvdWxkIE5PVCBiZSBjb3BpZWQgdG8gdGhlIGNyZWF0ZWQgcmVzdWx0LgorICAqCisg ICogICBQR19DT1BZUkVTX05PX05PVElDRUhPT0tTIC0gSW5kaWNhdGVzIHRoYXQgdGhlIHNv dXJjZSByZXN1bHQncworICAqICAgTm90aWNlSG9va3Mgc2hvdWxkIE5PVCBiZSBjb3BpZWQg dG8gdGhlIGNyZWF0ZWQgcmVzdWx0LgorICAqLworIAorIFBHcmVzdWx0ICoKKyBQUWNvcHlS ZXN1bHQoY29uc3QgUEdyZXN1bHQgKnNyYywgaW50IG51bUF0dHJpYnV0ZXMsCisgCVBHcmVz QXR0RGVzYyAqYXR0RGVzY3MsIGludCBvcHRpb25zKQorIHsKKyAJaW50IGk7CisgCVBHcmVz dWx0ICpkZXN0OworIAorIAlpZighc3JjKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCS8qIEF1 dG9tYXRpY2FsbHkgdHVybiBvbiBub190dXBsZXMgc2luY2UgdXNlX2F0dHJzIGlzIHNldC4g IEl0IG1ha2VzCisgCSAqIG5vIHNlbnNlIHRvIGNvcHkgdHVwbGVzIGludG8gYW4gdW5rbm93 biBzZXQgb2YgY29sdW1ucy4KKyAJICovCisgCWlmKG9wdGlvbnMgJiBQR19DT1BZUkVTX1VT RV9BVFRSUykKKyAJCW9wdGlvbnMgfD0gUEdfQ09QWVJFU19OT19UVVBMRVM7CisgCisgCS8q IElmIHVzZV9hdHRycyBpcyBzZXQsIHZlcmlmeSBhdHRyIGFyZ3VtZW50cy4gKi8KKyAJaWYo KG9wdGlvbnMgJiBQR19DT1BZUkVTX1VTRV9BVFRSUykgJiYgKG51bUF0dHJpYnV0ZXMgPD0g MCB8fCAhYXR0RGVzY3MpKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCWRlc3QgPSBQUW1ha2VF bXB0eVBHcmVzdWx0KChQR2Nvbm4gKilOVUxMLCBQR1JFU19UVVBMRVNfT0spOworIAlpZigh ZGVzdCkKKyAJCXJldHVybiBOVUxMOworIAorIAkvKiBhbHdheXMgY29weSB0aGVzZSBvdmVy LiAgSXMgY21kU3RhdHVzIHVzZWZ1bCBoZXJlPyAqLworIAlkZXN0LT5jbGllbnRfZW5jb2Rp bmcgPSBzcmMtPmNsaWVudF9lbmNvZGluZzsKKyAJc3RyY3B5KGRlc3QtPmNtZFN0YXR1cywg c3JjLT5jbWRTdGF0dXMpOworIAorIAkvKiBXYW50cyB0byBjb3B5IG5vdGljZSBob29rcyAq LworIAlpZighKG9wdGlvbnMgJiBQR19DT1BZUkVTX05PX05PVElDRUhPT0tTKSkKKyAJCWRl c3QtPm5vdGljZUhvb2tzID0gc3JjLT5ub3RpY2VIb29rczsKKyAKKyAJLyogQ29weSBmcm9t IHNyYyByZXN1bHQgd2hlbiBub3Qgc3VwcGx5aW5nIGF0dHJzICovCisgCWlmKCEob3B0aW9u cyAmIFBHX0NPUFlSRVNfVVNFX0FUVFJTKSAmJiBzcmMtPm51bUF0dHJpYnV0ZXMgPiAwKQor IAl7CisgCQludW1BdHRyaWJ1dGVzID0gc3JjLT5udW1BdHRyaWJ1dGVzOworIAkJYXR0RGVz Y3MgPSBzcmMtPmF0dERlc2NzOworIAl9CisgCisgCS8qIGNvcHkgYXR0cnMgKi8KKyAJaWYo bnVtQXR0cmlidXRlcyA+IDApCisgCXsKKyAJCWRlc3QtPmF0dERlc2NzID0gKFBHcmVzQXR0 RGVzYyAqKVBRcmVzdWx0QWxsb2MoZGVzdCwKKyAJCQludW1BdHRyaWJ1dGVzICogc2l6ZW9m KFBHcmVzQXR0RGVzYykpOworIAorIAkJaWYoIWRlc3QtPmF0dERlc2NzKQorIAkJeworIAkJ CVBRY2xlYXIoZGVzdCk7CisgCQkJcmV0dXJuIE5VTEw7CisgCQl9CisgCisgCQlkZXN0LT5u dW1BdHRyaWJ1dGVzID0gbnVtQXR0cmlidXRlczsKKyAJCW1lbWNweShkZXN0LT5hdHREZXNj cywgYXR0RGVzY3MsIG51bUF0dHJpYnV0ZXMgKiBzaXplb2YoUEdyZXNBdHREZXNjKSk7Cisg CisgCQkvKiByZXN1bHRhbGxvYyB0aGUgYXR0cmlidXRlIG5hbWVzLiAgVGhlIGFib3ZlIG1l bWNweSBoYXMgdGhlIGF0dHIKKyAJCSAqIG5hbWVzIHBvaW50aW5nIGF0IHRoZSBzb3VyY2Ug cmVzdWx0J3MgcHJpdmF0ZSBtZW1vcnkgKG9yIGF0IHRoZQorIAkJICogY2FsbGVycyBwcm92 aWRlZCBhdHREZXNjcyBtZW1vcnkpLgorIAkJICovCisgCQlkZXN0LT5iaW5hcnkgPSAxOwor IAkJZm9yKGk9MDsgaSA8IG51bUF0dHJpYnV0ZXM7IGkrKykKKyAJCXsKKyAJCQlpZihhdHRE ZXNjc1tpXS5uYW1lKQorIAkJCQlkZXN0LT5hdHREZXNjc1tpXS5uYW1lID0gcHFSZXN1bHRT dHJkdXAoZGVzdCwgYXR0RGVzY3NbaV0ubmFtZSk7CisgCQkJZWxzZQorIAkJCQlkZXN0LT5h dHREZXNjc1tpXS5uYW1lID0gZGVzdC0+bnVsbF9maWVsZDsKKyAKKyAJCQlpZighZGVzdC0+ YXR0RGVzY3NbaV0ubmFtZSkKKyAJCQl7CisgCQkJCVBRY2xlYXIoZGVzdCk7CisgCQkJCXJl dHVybiBOVUxMOworIAkJCX0KKyAKKyAJCQkvKiBBbHRob3VnaCBkZXByZWNhdGVkLCBiZWNh dXNlIHJlc3VsdHMgY2FuIGhhdmUgdGV4dCtiaW5hcnkgY29sdW1ucywKKyAJCQkgKiBpdHMg ZWFzeSBlbm91Z2ggdG8gZGVkdWNlIHNvIHNldCBpdCBmb3IgY29tcGxldGVuZXNzLgorIAkJ CSAqLworIAkJCWlmKGRlc3QtPmF0dERlc2NzW2ldLmZvcm1hdCA9PSAwKQorIAkJCQlkZXN0 LT5iaW5hcnkgPSAwOworIAkJfQorIAl9CisgCisgCS8qIFdhbnRzIHRvIGNvcHkgcmVzdWx0 IHR1cGxlczogdXNlIFBRc2V0dmFsdWUoKS4gKi8KKyAJaWYoIShvcHRpb25zICYgUEdfQ09Q WVJFU19OT19UVVBMRVMpICYmIHNyYy0+bnR1cHMgPiAwKQorIAl7CisgCQlpbnQgdHVwLCBm aWVsZDsKKyAJCWZvcih0dXA9MDsgdHVwIDwgc3JjLT5udHVwczsgdHVwKyspCisgCQkJZm9y KGZpZWxkPTA7IGZpZWxkIDwgc3JjLT5udW1BdHRyaWJ1dGVzOyBmaWVsZCsrKQorIAkJCQlQ UXNldHZhbHVlKGRlc3QsIHR1cCwgZmllbGQsIHNyYy0+dHVwbGVzW3R1cF1bZmllbGRdLnZh bHVlLAorIAkJCQkJc3JjLT50dXBsZXNbdHVwXVtmaWVsZF0ubGVuKTsKKyAJfQorIAorIAkv KiBXYW50cyB0byBjb3B5IG9iakhvb2tzLiAqLworIAlpZighKG9wdGlvbnMgJiBQR19DT1BZ UkVTX05PX09CSkVDVEhPT0tTKSAmJiBzcmMtPm9iakhvb2tzQ291bnQgPiAwKQorIAl7Cisg CQlkZXN0LT5vYmpIb29rcyA9IGR1cE9iamVjdEhvb2tzKHNyYy0+b2JqSG9va3MsIHNyYy0+ b2JqSG9va3NDb3VudCk7CisgCQlpZighZGVzdC0+b2JqSG9va3MpCisgCQl7CisgCQkJUFFj bGVhcihkZXN0KTsKKyAJCQlyZXR1cm4gTlVMTDsKKyAJCX0KKyAKKyAJCWRlc3QtPm9iakhv b2tzQ291bnQgPSBzcmMtPm9iakhvb2tzQ291bnQ7CisgCX0KKyAKKyAJLyogSW52b2tlIHJl c3VsdENvcHkgZm9yIGVhY2ggT2JqZWN0IEhvb2sgKi8KKyAJZm9yKGk9MDsgaSA8IGRlc3Qt Pm9iakhvb2tzQ291bnQ7IGkrKykKKyAJCWlmKGRlc3QtPm9iakhvb2tzW2ldLnJlc3VsdENv cHkpCisgCQkJZGVzdC0+b2JqSG9va3NbaV0uZGF0YSA9IGRlc3QtPm9iakhvb2tzW2ldLnJl c3VsdENvcHkoZGVzdCwgc3JjKTsKKyAKKyAJcmV0dXJuIGRlc3Q7CisgfQorIAorIGludAor IFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHR1cF9udW0sIGludCBmaWVsZF9udW0s CisgCWNoYXIgKnZhbHVlLCBpbnQgbGVuKQorIHsKKyAJUEdyZXNBdHRWYWx1ZSAqYXR0dmFs OworIAorIAlpZighY2hlY2tfZmllbGRfbnVtYmVyKHJlcywgZmllbGRfbnVtKSkKKyAJCXJl dHVybiBGQUxTRTsKKyAKKyAJLyogSW52YWxpZCB0dXBfbnVtLCBtdXN0IGJlIDw9IG50dXBz ICovCisgCWlmKHR1cF9udW0gPiByZXMtPm50dXBzKQorIAkJcmV0dXJuIEZBTFNFOworIAor IAkvKiBuZWVkIHRvIGdyb3cgdGhlIHR1cGxlIHRhYmxlICovCisgCWlmKHJlcy0+bnR1cHMg Pj0gcmVzLT50dXBBcnJTaXplKQorIAl7CisgCQlpbnQgbiA9IHJlcy0+dHVwQXJyU2l6ZSA/ IChyZXMtPnR1cEFyclNpemUqMykvMiA6IDY0OworIAkJUEdyZXNBdHRWYWx1ZSAqKnR1cHMg PSAoUEdyZXNBdHRWYWx1ZSAqKikKKyAJCQkocmVzLT50dXBsZXMgPyByZWFsbG9jKHJlcy0+ dHVwbGVzLCBuKnNpemVvZihQR3Jlc0F0dFZhbHVlICopKSA6CisgCQkJIG1hbGxvYyhuKnNp emVvZihQR3Jlc0F0dFZhbHVlICopKSk7CisgCisgCQlpZighdHVwcykKKyAJCQlyZXR1cm4g RkFMU0U7CisgCisgCQltZW1zZXQodHVwcyArIHJlcy0+dHVwQXJyU2l6ZSwgMCwKKyAJCQko biAtIHJlcy0+dHVwQXJyU2l6ZSkgKiBzaXplb2YoUEdyZXNBdHRWYWx1ZSAqKSk7CisgCQly ZXMtPnR1cGxlcyA9IHR1cHM7CisgCQlyZXMtPnR1cEFyclNpemUgPSBuOworIAl9CisgCisg CS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgdHVwbGUgKi8KKyAJaWYodHVwX251bSA9PSBy ZXMtPm50dXBzICYmICFyZXMtPnR1cGxlc1t0dXBfbnVtXSkKKyAJeworIAkJaW50IGk7Cisg CQlQR3Jlc0F0dFZhbHVlICp0dXAgPSAoUEdyZXNBdHRWYWx1ZSAqKVBRcmVzdWx0QWxsb2Mo CisgCQkJcmVzLCByZXMtPm51bUF0dHJpYnV0ZXMgKiBzaXplb2YoUEdyZXNBdHRWYWx1ZSkp OworIAorIAkJaWYoIXR1cCkKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQkvKiBpbml0aWFs aXplIGVhY2ggY29sdW1uIHRvIE5VTEwgKi8KKyAJCWZvcihpPTA7IGkgPCByZXMtPm51bUF0 dHJpYnV0ZXM7IGkrKykKKyAJCXsKKyAJCQl0dXBbaV0ubGVuID0gTlVMTF9MRU47CisgCQkJ dHVwW2ldLnZhbHVlID0gcmVzLT5udWxsX2ZpZWxkOworIAkJfQorIAorIAkJcmVzLT50dXBs ZXNbdHVwX251bV0gPSB0dXA7CisgCQlyZXMtPm50dXBzKys7CisgCX0KKyAKKyAJYXR0dmFs ID0gJnJlcy0+dHVwbGVzW3R1cF9udW1dW2ZpZWxkX251bV07CisgCisgCS8qIE9uIHRvcCBv ZiBOVUxMX0xFTiwgdHJlYXQgYSBOVUxMIHZhbHVlIGFzIGEgTlVMTCBmaWVsZCAqLworIAlp ZihsZW4gPT0gTlVMTF9MRU4gfHwgdmFsdWUgPT0gTlVMTCkKKyAJeworIAkJYXR0dmFsLT5s ZW4gPSBOVUxMX0xFTjsKKyAJCWF0dHZhbC0+dmFsdWUgPSByZXMtPm51bGxfZmllbGQ7Cisg CX0KKyAJZWxzZQorIAl7CisgCQlpZihsZW4gPCAwKQorIAkJCWxlbiA9IDA7CisgCisgCQlp ZihsZW4gPT0gMCkKKyAJCXsKKyAJCQlhdHR2YWwtPmxlbiA9IDA7CisgCQkJYXR0dmFsLT52 YWx1ZSA9IHJlcy0+bnVsbF9maWVsZDsKKyAJCX0KKyAJCWVsc2UKKyAJCXsKKyAJCQlhdHR2 YWwtPnZhbHVlID0gKGNoYXIgKilQUXJlc3VsdEFsbG9jKHJlcywgbGVuICsgMSk7CisgCQkJ aWYoIWF0dHZhbC0+dmFsdWUpCisgCQkJCXJldHVybiBGQUxTRTsKKyAKKyAJCQlhdHR2YWwt PmxlbiA9IGxlbjsKKyAJCQltZW1jcHkoYXR0dmFsLT52YWx1ZSwgdmFsdWUsIGxlbik7Cisg CQkJYXR0dmFsLT52YWx1ZVtsZW5dID0gJ1wwJzsKKyAJCX0KKyAJfQorIAorIAlyZXR1cm4g VFJVRTsKKyB9CisgCisgdm9pZCAqCisgUFFyZXN1bHRBbGxvYyhQR3Jlc3VsdCAqcmVzLCBz aXplX3QgbkJ5dGVzKQorIHsKKyAJcmV0dXJuIHBxUmVzdWx0QWxsb2MocmVzLCBuQnl0ZXMs IFRSVUUpOworIH0KKyAKKyAvKgogICAqIHBxUmVzdWx0QWxsb2MgLQogICAqCQlBbGxvY2F0 ZSBzdWJzaWRpYXJ5IHN0b3JhZ2UgZm9yIGEgUEdyZXN1bHQuCiAgICoKICAgKiBuQnl0ZXMg aXMgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBvYmplY3QuCiAgICogSWYg aXNCaW5hcnkgaXMgdHJ1ZSwgd2UgYXNzdW1lIHRoYXQgd2UgbmVlZCB0byBhbGlnbiB0aGUg b2JqZWN0IG9uCiAgICogYSBtYWNoaW5lIGFsbG9jYXRpb24gYm91bmRhcnkuCioqKioqKioq KioqKioqKgoqKiogMzQ5LDM2NSAqKioqCi0tLSA2MjEsNjU0IC0tLS0KICAgKiBQUWNsZWFy IC0KICAgKgkgIGZyZWUncyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIFBHcmVzdWx0 CiAgICovCiAgdm9pZAogIFBRY2xlYXIoUEdyZXN1bHQgKnJlcykKICB7CisgCWludCBpOwog IAlQR3Jlc3VsdF9kYXRhICpibG9jazsKICAKICAJaWYgKCFyZXMpCiAgCQlyZXR1cm47CiAg CisgCWZvcihpPTA7IGkgPCByZXMtPm9iakhvb2tzQ291bnQ7IGkrKykKKyAJeworIAkJaWYo cmVzLT5vYmpIb29rc1tpXS5yZXN1bHREZXN0cm95KQorIAkJeworIAkJCXJlcy0+b2JqSG9v a3NbaV0ucmVzdWx0RGVzdHJveSgoY29uc3QgUEdyZXN1bHQgKilyZXMpOworIAkJCWZyZWUo cmVzLT5vYmpIb29rc1tpXS5uYW1lKTsKKyAJCX0KKyAJfQorIAorIAlpZihyZXMtPm9iakhv b2tzKQorIAl7CisgCQlmcmVlKHJlcy0+b2JqSG9va3MpOworIAkJcmVzLT5vYmpIb29rcyA9 IE5VTEw7CisgCQlyZXMtPm9iakhvb2tzQ291bnQgPSAwOworIAl9CisgCiAgCS8qIEZyZWUg YWxsIHRoZSBzdWJzaWRpYXJ5IGJsb2NrcyAqLwogIAl3aGlsZSAoKGJsb2NrID0gcmVzLT5j dXJCbG9jaykgIT0gTlVMTCkKICAJewogIAkJcmVzLT5jdXJCbG9jayA9IGJsb2NrLT5uZXh0 OwogIAkJZnJlZShibG9jayk7CiAgCX0KKioqKioqKioqKioqKioqCioqKiAxMTc5LDEyMDIg KioqKgogIAlwYXJzZUlucHV0KGNvbm4pOwogIAogIAkvKiBQUWdldFJlc3VsdCB3aWxsIHJl dHVybiBpbW1lZGlhdGVseSBpbiBhbGwgc3RhdGVzIGV4Y2VwdCBCVVNZLiAqLwogIAlyZXR1 cm4gY29ubi0+YXN5bmNTdGF0dXMgPT0gUEdBU1lOQ19CVVNZOwogIH0KICAKLSAKICAvKgog ICAqIFBRZ2V0UmVzdWx0CiAgICoJICBHZXQgdGhlIG5leHQgUEdyZXN1bHQgcHJvZHVjZWQg YnkgYSBxdWVyeS4gIFJldHVybnMgTlVMTCBpZiBubwogICAqCSAgcXVlcnkgd29yayByZW1h aW5zIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZCAoZS5nLiBvdXQgb2YKICAgKgkgIG1lbW9y eSkuCiAgICovCiAgCiAgUEdyZXN1bHQgKgogIFBRZ2V0UmVzdWx0KFBHY29ubiAqY29ubikK ICB7CiEgCVBHcmVzdWx0ICAgKnJlczsKICAKICAJaWYgKCFjb25uKQogIAkJcmV0dXJuIE5V TEw7CiAgCiAgCS8qIFBhcnNlIGFueSBhdmFpbGFibGUgZGF0YSwgaWYgb3VyIHN0YXRlIHBl cm1pdHMuICovCiAgCXBhcnNlSW5wdXQoY29ubik7Ci0tLSAxNDY4LDE0OTAgLS0tLQogIAlw YXJzZUlucHV0KGNvbm4pOwogIAogIAkvKiBQUWdldFJlc3VsdCB3aWxsIHJldHVybiBpbW1l ZGlhdGVseSBpbiBhbGwgc3RhdGVzIGV4Y2VwdCBCVVNZLiAqLwogIAlyZXR1cm4gY29ubi0+ YXN5bmNTdGF0dXMgPT0gUEdBU1lOQ19CVVNZOwogIH0KICAKICAvKgogICAqIFBRZ2V0UmVz dWx0CiAgICoJICBHZXQgdGhlIG5leHQgUEdyZXN1bHQgcHJvZHVjZWQgYnkgYSBxdWVyeS4g IFJldHVybnMgTlVMTCBpZiBubwogICAqCSAgcXVlcnkgd29yayByZW1haW5zIG9yIGFuIGVy cm9yIGhhcyBvY2N1cnJlZCAoZS5nLiBvdXQgb2YKICAgKgkgIG1lbW9yeSkuCiAgICovCiAg CiAgUEdyZXN1bHQgKgogIFBRZ2V0UmVzdWx0KFBHY29ubiAqY29ubikKICB7CiEgCVBHcmVz dWx0ICAgKnJlcz1OVUxMOwogIAogIAlpZiAoIWNvbm4pCiAgCQlyZXR1cm4gTlVMTDsKICAK ICAJLyogUGFyc2UgYW55IGF2YWlsYWJsZSBkYXRhLCBpZiBvdXIgc3RhdGUgcGVybWl0cy4g Ki8KICAJcGFyc2VJbnB1dChjb25uKTsKKioqKioqKioqKioqKioqCioqKiAxMjY1LDEyNzYg KioqKgotLS0gMTU1MywxNTc0IC0tLS0KICAJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJ1bmV4 cGVjdGVkIGFzeW5jU3RhdHVzOiAlZFxuIiksCiAgCQkJCQkJCSAgKGludCkgY29ubi0+YXN5 bmNTdGF0dXMpOwogIAkJCXJlcyA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoY29ubiwgUEdSRVNf RkFUQUxfRVJST1IpOwogIAkJCWJyZWFrOwogIAl9CiAgCisgCWlmKHJlcyAmJiAocmVzLT5y ZXN1bHRTdGF0dXMgPT0gUEdSRVNfQ09NTUFORF9PSyB8fAorIAkJIHJlcy0+cmVzdWx0U3Rh dHVzID09IFBHUkVTX1RVUExFU19PSykpCisgCXsKKyAJCWludCBpOworIAkJZm9yKGk9MDsg aSA8IHJlcy0+b2JqSG9va3NDb3VudDsgaSsrKQorIAkJCWlmKHJlcy0+b2JqSG9va3NbaV0u cmVzdWx0Q3JlYXRlKQorIAkJCQlyZXMtPm9iakhvb2tzW2ldLmRhdGEgPSByZXMtPm9iakhv b2tzW2ldLnJlc3VsdENyZWF0ZSgKKyAJCQkJCShjb25zdCBQR2Nvbm4gKiljb25uLCAoY29u c3QgUEdyZXN1bHQgKilyZXMpOworIAl9CisgCiAgCXJldHVybiByZXM7CiAgfQogIAogIAog IC8qCiAgICogUFFleGVjCioqKioqKioqKioqKioqKgoqKiogMTI5MSwxMzAzICoqKioKICAJ aWYgKCFQUXNlbmRRdWVyeShjb25uLCBxdWVyeSkpCiAgCQlyZXR1cm4gTlVMTDsKICAJcmV0 dXJuIFBRZXhlY0ZpbmlzaChjb25uKTsKICB9CiAgCiAgLyoKISAgKiBQUWV4ZWNQYXJhbXMK ICAgKgkJTGlrZSBQUWV4ZWMsIGJ1dCB1c2UgcHJvdG9jb2wgMy4wIHNvIHdlIGNhbiBwYXNz IHBhcmFtZXRlcnMKICAgKi8KICBQR3Jlc3VsdCAqCiAgUFFleGVjUGFyYW1zKFBHY29ubiAq Y29ubiwKICAJCQkgY29uc3QgY2hhciAqY29tbWFuZCwKICAJCQkgaW50IG5QYXJhbXMsCi0t LSAxNTg5LDE2MDEgLS0tLQogIAlpZiAoIVBRc2VuZFF1ZXJ5KGNvbm4sIHF1ZXJ5KSkKICAJ CXJldHVybiBOVUxMOwogIAlyZXR1cm4gUFFleGVjRmluaXNoKGNvbm4pOwogIH0KICAKICAv KgohICAqCiAgICoJCUxpa2UgUFFleGVjLCBidXQgdXNlIHByb3RvY29sIDMuMCBzbyB3ZSBj YW4gcGFzcyBwYXJhbWV0ZXJzCiAgICovCiAgUEdyZXN1bHQgKgogIFBRZXhlY1BhcmFtcyhQ R2Nvbm4gKmNvbm4sCiAgCQkJIGNvbnN0IGNoYXIgKmNvbW1hbmQsCiAgCQkJIGludCBuUGFy YW1zLApJbmRleDogZmUtbWlzYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0 cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLW1pc2MuYyx2CnJldHJp ZXZpbmcgcmV2aXNpb24gMS4xMzMKZGlmZiAtQzYgLXIxLjEzMyBmZS1taXNjLmMKKioqIGZl LW1pc2MuYwkxIEphbiAyMDA4IDE5OjQ2OjAwIC0wMDAwCTEuMTMzCi0tLSBmZS1taXNjLmMJ MTQgTWF5IDIwMDggMTc6NDg6MDAgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxMTUyLDEx NTcgKioqKgotLS0gMTE1MiwxMzAyIC0tLS0KICAJfQogIAogIAlyZXR1cm4gZGdldHRleHQo ImxpYnBxIiwgbXNnaWQpOwogIH0KICAKICAjZW5kaWYgICAvKiBFTkFCTEVfTkxTICovCisg CisgCisgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogT2JqZWN0SG9va3MKKyAgKi8K KyAKKyAvKiBnbG9iYWwgb2JqZWN0IGhvb2tzLCBzZWUgUFFhZGRHbG9iYWxPYmplY3RIb29r cyAqLworIHN0YXRpYyBpbnQgZ19vYmpIb29rc0NvdW50ID0gMDsKKyBzdGF0aWMgaW50IGdf b2JqSG9va3NTaXplID0gMDsKKyBzdGF0aWMgUEdvYmplY3RIb29rcyAqZ19vYmpIb29rcyA9 IE5VTEw7CisgCisgc3RhdGljIGludAorIGhvb2tFeGlzdHMoUEdvYmplY3RIb29rcyAqb2Jq SG9va3MsIGludCBvYmpIb29rc0NvdW50LCBjb25zdCBjaGFyICpuYW1lKQorIHsKKyAJaW50 IGk7CisgCWZvcihpPTA7IGkgPCBvYmpIb29rc0NvdW50OyBpKyspCisgCQlpZihzdHJjbXAo b2JqSG9va3NbaV0ubmFtZSwgbmFtZSk9PTApCisgCQkJcmV0dXJuIFRSVUU7CisgCXJldHVy biBGQUxTRTsKKyB9CisgCisgc3RhdGljIGludAorIGdyb3dIb29rcyhQR29iamVjdEhvb2tz ICoqb2JqSG9va3MsIGludCAqb2JqSG9va3NTaXplLAorIAlpbnQgb2JqSG9va3NDb3VudCkK KyB7CisgCS8qIGdyb3cgbGlzdCAqLworIAlpZihvYmpIb29rc0NvdW50ID09ICpvYmpIb29r c1NpemUpCisgCXsKKyAJCVBHb2JqZWN0SG9va3MgKm9oOworIAkJaW50IG4gPSAqb2JqSG9v a3NTaXplID8gKCpvYmpIb29rc1NpemUqMykvMiA6IDQ7CisgCisgCQlpZigqb2JqSG9va3Mp CisgCQkJb2ggPSAoUEdvYmplY3RIb29rcyAqKXJlYWxsb2MoCisgCQkJCSpvYmpIb29rcywg bipzaXplb2YoUEdvYmplY3RIb29rcykpOworIAkJZWxzZQorIAkJCW9oID0gKFBHb2JqZWN0 SG9va3MgKiltYWxsb2MobipzaXplb2YoUEdvYmplY3RIb29rcykpOworIAorIAkJaWYoIW9o KQorIAkJCXJldHVybiBGQUxTRTsKKyAKKyAJCSpvYmpIb29rcyA9IG9oOworIAkJKm9iakhv b2tzU2l6ZSA9IG47CisgCX0KKyAKKyAJcmV0dXJuIFRSVUU7CisgfQorIAorIHN0YXRpYyBp bnQKKyBob29rQ29weShQR29iamVjdEhvb2tzICpkc3QsIFBHb2JqZWN0SG9va3MgKnNyYykK KyB7CisgCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKFBHb2JqZWN0SG9va3MpKTsKKyAJZHN0 LT5kYXRhID0gTlVMTDsKKyAJZHN0LT5uYW1lID0gc3RyZHVwKHNyYy0+bmFtZSk7CisgCXJl dHVybiBkc3QtPm5hbWUgPyBUUlVFIDogRkFMU0U7CisgfQorIAorIGludAorIFBRYWRkR2xv YmFsT2JqZWN0SG9va3MoUEdvYmplY3RIb29rcyAqaG9va3MpCisgeworIAlpZighaG9va3Mg fHwgIWhvb2tzLT5uYW1lIHx8ICEqaG9va3MtPm5hbWUpCisgCQlyZXR1cm4gRkFMU0U7Cisg CisgCWlmKGhvb2tFeGlzdHMoZ19vYmpIb29rcywgZ19vYmpIb29rc0NvdW50LCBob29rcy0+ bmFtZSkgfHwKKyAJCSAhZ3Jvd0hvb2tzKCZnX29iakhvb2tzLCAmZ19vYmpIb29rc1NpemUs IGdfb2JqSG9va3NDb3VudCkgfHwKKyAJCSAhaG9va0NvcHkoZ19vYmpIb29rcyArIGdfb2Jq SG9va3NDb3VudCwgaG9va3MpKQorIAkJcmV0dXJuIEZBTFNFOworIAorIAlnX29iakhvb2tz Q291bnQrKzsKKyAJcmV0dXJuIFRSVUU7CisgfQorIAorIC8qIGluaXRzIHRoZSBnbG9iYWwg aG9va3MgZm9yIGEgY29ubiBvYmplY3QuICBJZiB0aGUgaG9va3Mgd2VyZSBhbHJlYWR5Cisg ICogaW5zdGFsbGVkLCB0aGUgcmVxdWVzdCBpcyBpZ25vcmVkIGFuZCBhIHN1Y2Nlc3MgdmFs dWUgaXMgcmV0dXJuZWQuCisgICogVGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgYSBQUXJlc2V0 IGFuZCBQUXJlc2V0UG9sbC4KKyAgKiBSZXR1cm5zIG5vbi16ZXJvIGZvciBzdWNjZXNzIGFu ZCB6ZXJvIG9uIGVycm9yLgorICAqLworIGludAorIHBxSW5pdE9iamVjdEhvb2tzKFBHY29u biAqY29ubikKKyB7CisgCWludCBpOworIAorIAkvKiBBbHJlYWR5IGluc3RhbGxlZCwgb2Nj dXJzIG9uIFBRcmVzZXQgYW5kIFBRcmVzZXRQb2xsICovCisgCWlmKGNvbm4tPm9iakhvb2tz Q291bnQgPiAwKQorIAkJcmV0dXJuIFRSVUU7CisgCisgCWZvcihpPTA7IGkgPCBnX29iakhv b2tzQ291bnQ7IGkrKykKKyAJCWlmKCFQUWFkZE9iamVjdEhvb2tzKGNvbm4sICZnX29iakhv b2tzW2ldKSkKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCXJldHVybiBUUlVFOworIH0KKyAK KyBpbnQKKyBQUWFkZE9iamVjdEhvb2tzKFBHY29ubiAqY29ubiwgUEdvYmplY3RIb29rcyAq aG9va3MpCisgeworIAlQR29iamVjdEhvb2tzICpvaDsKKyAKKyAJaWYoIWNvbm4gfHwgIWhv b2tzIHx8ICFob29rcy0+bmFtZSB8fCAhKmhvb2tzLT5uYW1lKQorIAkJcmV0dXJuIEZBTFNF OworIAorIAkvKiBuYW1lcyBtdXN0IGJlIHVuaXF1ZSAqLworIAlpZihob29rRXhpc3RzKGNv bm4tPm9iakhvb2tzLCBjb25uLT5vYmpIb29rc0NvdW50LCBob29rcy0+bmFtZSkgfHwKKyAJ CSAhZ3Jvd0hvb2tzKCZjb25uLT5vYmpIb29rcywgJmNvbm4tPm9iakhvb2tzU2l6ZSwgY29u bi0+b2JqSG9va3NDb3VudCkgfHwKKyAJCSAhaG9va0NvcHkoY29ubi0+b2JqSG9va3MgKyBj b25uLT5vYmpIb29rc0NvdW50LCBob29rcykpCisgCQlyZXR1cm4gRkFMU0U7CisgCisgCW9o ID0gJmNvbm4tPm9iakhvb2tzW2Nvbm4tPm9iakhvb2tzQ291bnQrK107CisgCWlmKG9oLT5p bml0SG9va0RhdGEpCisgCQlvaC0+ZGF0YSA9IG9oLT5pbml0SG9va0RhdGEoKGNvbnN0IFBH Y29ubiAqKWNvbm4pOworIAorIAlyZXR1cm4gVFJVRTsKKyB9CisgCisgdm9pZCAqCisgUFFo b29rRGF0YShjb25zdCBQR2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKmhvb2tOYW1lKQorIHsK KyAJaWYoY29ubiAmJiBob29rTmFtZSAmJiAqaG9va05hbWUpCisgCXsKKyAJCWludCBpOwor IAkJUEdvYmplY3RIb29rcyAqaG9va3MgPSBjb25uLT5vYmpIb29rczsKKyAKKyAJCWZvcihp PTA7IGkgPCBjb25uLT5vYmpIb29rc0NvdW50OyBpKyspCisgCQkJaWYoc3RyY21wKGhvb2tz W2ldLm5hbWUsIGhvb2tOYW1lKT09MCkKKyAJCQkJcmV0dXJuIGhvb2tzW2ldLmRhdGE7Cisg CX0KKyAKKyAJcmV0dXJuIE5VTEw7CisgfQorIAorIHZvaWQgKgorIFBRcmVzdWx0SG9va0Rh dGEoY29uc3QgUEdyZXN1bHQgKnJlcywgY29uc3QgY2hhciAqaG9va05hbWUpCisgeworIAlp ZihyZXMgJiYgaG9va05hbWUgJiYgKmhvb2tOYW1lKQorIAl7CisgCQlpbnQgaTsKKyAJCVBH b2JqZWN0SG9va3MgKmhvb2tzID0gcmVzLT5vYmpIb29rczsKKyAKKyAJCWZvcihpPTA7IGkg PCByZXMtPm9iakhvb2tzQ291bnQ7IGkrKykKKyAJCQlpZihzdHJjbXAoaG9va3NbaV0ubmFt ZSwgaG9va05hbWUpPT0wKQorIAkJCQlyZXR1cm4gaG9va3NbaV0uZGF0YTsKKyAJfQorIAor IAlyZXR1cm4gTlVMTDsKKyB9CisgCkluZGV4OiBsaWJwcS1mZS5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K UkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBx L2xpYnBxLWZlLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTQyCmRpZmYgLUM2IC1yMS4x NDIgbGlicHEtZmUuaAoqKiogbGlicHEtZmUuaAkxOSBNYXIgMjAwOCAwMDozOTozMyAtMDAw MAkxLjE0MgotLS0gbGlicHEtZmUuaAkxNCBNYXkgMjAwOCAxNzo0ODowMCAtMDAwMAoqKioq KioqKioqKioqKioKKioqIDI1LDM2ICoqKioKLS0tIDI1LDQ1IC0tLS0KICAvKgogICAqIHBv c3RncmVzX2V4dC5oIGRlZmluZXMgdGhlIGJhY2tlbmQncyBleHRlcm5hbGx5IHZpc2libGUg dHlwZXMsCiAgICogc3VjaCBhcyBPaWQuCiAgICovCiAgI2luY2x1ZGUgInBvc3RncmVzX2V4 dC5oIgogIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogT3B0aW9ucyBmb3Ig UFFjb3B5UmVzdWx0CisgICovCisgCisgI2RlZmluZSBQR19DT1BZUkVTX05PX1RVUExFUyAg ICAgIDB4MDEKKyAjZGVmaW5lIFBHX0NPUFlSRVNfVVNFX0FUVFJTICAgICAgMHgwMgorICNk ZWZpbmUgUEdfQ09QWVJFU19OT19PQkpFQ1RIT09LUyAweDA0CisgI2RlZmluZSBQR19DT1BZ UkVTX05PX05PVElDRUhPT0tTIDB4MDgKKyAKICAvKiBBcHBsaWNhdGlvbi12aXNpYmxlIGVu dW0gdHlwZXMgKi8KICAKICB0eXBlZGVmIGVudW0KICB7CiAgCS8qCiAgCSAqIEFsdGhvdWdo IGl0IGlzIG9rYXkgdG8gYWRkIHRvIHRoaXMgbGlzdCwgdmFsdWVzIHdoaWNoIGJlY29tZSB1 bnVzZWQKKioqKioqKioqKioqKioqCioqKiAxOTAsMjAxICoqKioKLS0tIDE5OSwyNjAgLS0t LQogIAkJaW50CQkgICAqcHRyOwkJLyogY2FuJ3QgdXNlIHZvaWQgKGRlYyBjb21waWxlciBi YXJmcykJICovCiAgCQlpbnQJCQlpbnRlZ2VyOwogIAl9CQkJdTsKICB9IFBRQXJnQmxvY2s7 CiAgCiAgLyogLS0tLS0tLS0tLS0tLS0tLQorICAqIFBHcmVzQXR0RGVzYyAtLSBEYXRhIGFi b3V0IGEgc2luZ2xlIGF0dHJpYnV0ZSAoY29sdW1uKSBvZiBhIHF1ZXJ5IHJlc3VsdAorICAq IC0tLS0tLS0tLS0tLS0tLS0KKyAgKi8KKyB0eXBlZGVmIHN0cnVjdCBwZ3Jlc0F0dERlc2MK KyB7CisgCWNoYXIJICAgKm5hbWU7CQkJLyogY29sdW1uIG5hbWUgKi8KKyAJT2lkCQkJdGFi bGVpZDsJCS8qIHNvdXJjZSB0YWJsZSwgaWYga25vd24gKi8KKyAJaW50CQkJY29sdW1uaWQ7 CQkvKiBzb3VyY2UgY29sdW1uLCBpZiBrbm93biAqLworIAlpbnQJCQlmb3JtYXQ7CQkJLyog Zm9ybWF0IGNvZGUgZm9yIHZhbHVlICh0ZXh0L2JpbmFyeSkgKi8KKyAJT2lkCQkJdHlwaWQ7 CQkJLyogdHlwZSBpZCAqLworIAlpbnQJCQl0eXBsZW47CQkJLyogdHlwZSBzaXplICovCisg CWludAkJCWF0dHR5cG1vZDsgIC8qIHR5cGUtc3BlY2lmaWMgbW9kaWZpZXIgaW5mbyAqLwor IH0gUEdyZXNBdHREZXNjOworIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0KKyAgKiBQR29iamVj dEhvb2tzIC0tIHN0cnVjdHVyZSBmb3IgYWRkaW5nIGxpYnBxIG9iamVjdCBob29rcworICAq IE1vbml0b3JzIHRoZSBjcmVhdGlvbiBhbmQgZGVsZXRpb24gb2Ygb2JqZWN0cy4KKyAgKiAt LS0tLS0tLS0tLS0tLS0tCisgICovCisgCisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgCWNoYXIg Km5hbWU7CisgCisgCXZvaWQgKmRhdGE7CisgCisgCS8qIEludm9rZWQgd2hlbiBQUXNldE9i amVjdEhvb2sgaXMgY2FsbGVkLiAgVGhlIHBvaW50ZXIgcmV0dXJuZWQKKyAJICogYnkgdGhl IGhvb2sgaW1wbGVtZW50YXRpb24gaXMgc3RvcmVkIGluIHRoZSBwcml2YXRlIHN0b3JhZ2Ug b2YKKyAJICogdGhlIFBHY29ubiwgYWNjZXNzaWJsZSB2aWEgUFFob29rRGF0YShQR2Nvbm4q KS4gIElmIG5vCisgCSAqIHN0b3JhZ2UgaXMgbmVlZGVkLCByZXR1cm4gTlVMTCBvciBzZXQg dGhpcyBob29rIHRvIE5VTEwuCisgCSAqLworIAl2b2lkICooKmluaXRIb29rRGF0YSkoY29u c3QgUEdjb25uICpjb25uKTsKKyAKKyAJLyogSW52b2tlZCBvbiBQUXJlc2V0IGFuZCBQUXJl c2V0UG9sbCAqLworIAl2b2lkICgqY29ublJlc2V0KShjb25zdCBQR2Nvbm4gKmNvbm4pOwor IAorIAkvKiBJbnZva2VkIG9uIFBRZmluaXNoLiAqLworIAl2b2lkICgqY29ubkRlc3Ryb3kp KGNvbnN0IFBHY29ubiAqY29ubik7CisgCisgCS8qIEludm9rZWQgb24gUFFnZXRSZXN1bHQs IGludGVybmFsbHkgY2FsbGVkIGJ5IGFsbCBleGVjIGZ1bmNzICovCisgCXZvaWQgKigqcmVz dWx0Q3JlYXRlKShjb25zdCBQR2Nvbm4gKmNvbm4sIGNvbnN0IFBHcmVzdWx0ICpyZXN1bHQp OworIAorIAkvKiBJbnZva2VkIG9uIFBRY29weVJlc3VsdCAqLworIAl2b2lkICooKnJlc3Vs dENvcHkpKFBHcmVzdWx0ICpkZXN0LCBjb25zdCBQR3Jlc3VsdCAqc3JjKTsKKyAKKyAJLyog SW52b2tlZCB3aGVuIFBRY2xlYXIgaXMgY2FsbGVkICovCisgCXZvaWQgKCpyZXN1bHREZXN0 cm95KShjb25zdCBQR3Jlc3VsdCAqcmVzdWx0KTsKKyB9IFBHb2JqZWN0SG9va3M7CisgCisg LyogLS0tLS0tLS0tLS0tLS0tLQogICAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBvZiBsaWJwcQog ICAqIC0tLS0tLS0tLS0tLS0tLS0KICAgKi8KICAKICAvKiA9PT0JaW4gZmUtY29ubmVjdC5j ID09PSAqLwogIAoqKioqKioqKioqKioqKioKKioqIDQzNCw0NDUgKioqKgotLS0gNDkzLDUy MyAtLS0tCiAgICogTWFrZSBhbiBlbXB0eSBQR3Jlc3VsdCB3aXRoIGdpdmVuIHN0YXR1cyAo c29tZSBhcHBzIGZpbmQgdGhpcwogICAqIHVzZWZ1bCkuIElmIGNvbm4gaXMgbm90IE5VTEwg YW5kIHN0YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZQogICAqIGNvbm4ncyBlcnJvck1l c3NhZ2UgaXMgY29waWVkLgogICAqLwogIGV4dGVybiBQR3Jlc3VsdCAqUFFtYWtlRW1wdHlQ R3Jlc3VsdChQR2Nvbm4gKmNvbm4sIEV4ZWNTdGF0dXNUeXBlIHN0YXR1cyk7CiAgCisgZXh0 ZXJuIFBHcmVzdWx0ICoKKyBQUWNvcHlSZXN1bHQoY29uc3QgUEdyZXN1bHQgKnNyYywgaW50 IG51bUF0dHJpYnV0ZXMsCisgCVBHcmVzQXR0RGVzYyAqYXR0RGVzY3MsIGludCBvcHRpb25z KTsKKyAKKyBleHRlcm4gdm9pZCAqCisgUFFyZXN1bHRBbGxvYyhQR3Jlc3VsdCAqcmVzLCBz aXplX3QgbkJ5dGVzKTsKKyAKKyAvKgorICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHR1cGxl IGZpZWxkLiAgVGhlIHR1cF9udW0gbXVzdCBiZSBsZXNzIHRoYW4gb3IKKyAgKiBlcXVhbCB0 byBQUW50dXBsZXMocmVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSB0dXBsZXMg YXMgbmVlZGVkLgorICAqIEEgbmV3IHR1cGxlIGlzIGdlbmVyYXRlZCB3aGVuIHR1cF9udW0g ZXF1YWxzIFBRbnR1cGxlcyhyZXMpIGFuZCB0aGVyZQorICAqIGFyZSBubyBmaWVsZHMgZGVm aW5lZCBmb3IgdGhhdCB0dXBsZS4KKyAgKgorICAqIFJldHVybnMgYSBub24temVybyB2YWx1 ZSBmb3Igc3VjY2VzcyBhbmQgemVybyBmb3IgZmFpbHVyZS4KKyAgKi8KKyBleHRlcm4gaW50 CisgUFFzZXR2YWx1ZShQR3Jlc3VsdCAqcmVzLCBpbnQgdHVwX251bSwgaW50IGZpZWxkX251 bSwKKyAJY2hhciAqdmFsdWUsIGludCBsZW4pOworIAogIAogIC8qIFF1b3Rpbmcgc3RyaW5n cyBiZWZvcmUgaW5jbHVzaW9uIGluIHF1ZXJpZXMuICovCiAgZXh0ZXJuIHNpemVfdCBQUWVz Y2FwZVN0cmluZ0Nvbm4oUEdjb25uICpjb25uLAogIAkJCQkgICBjaGFyICp0bywgY29uc3Qg Y2hhciAqZnJvbSwgc2l6ZV90IGxlbmd0aCwKICAJCQkJICAgaW50ICplcnJvcik7CiAgZXh0 ZXJuIHVuc2lnbmVkIGNoYXIgKlBRZXNjYXBlQnl0ZWFDb25uKFBHY29ubiAqY29ubiwKKioq KioqKioqKioqKioqCioqKiA1MDYsNTE3ICoqKioKLS0tIDU4NCw2MTcgLS0tLQogIC8qIERl dGVybWluZSBkaXNwbGF5IGxlbmd0aCBvZiBtdWx0aWJ5dGUgZW5jb2RlZCBjaGFyIGF0ICpz ICovCiAgZXh0ZXJuIGludAlQUWRzcGxlbihjb25zdCBjaGFyICpzLCBpbnQgZW5jb2Rpbmcp OwogIAogIC8qIEdldCBlbmNvZGluZyBpZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlIFBH Q0xJRU5URU5DT0RJTkcgKi8KICBleHRlcm4gaW50CVBRZW52MmVuY29kaW5nKHZvaWQpOwog IAorIC8qIEFkZHMgYSBzZXQgb2YgZ2xvYmFsIG9iamVjdCBob29rcywgd2hpY2ggd2lsbCBi ZSBpbmhlcml0ZWQgYnkgZXZlcnkKKyAgKiBQR2Nvbm4uICBPYmplY3QgaG9va3MgYWRkZWQg aW4gdGhpcyBmYXNoaW9uIGRvIG5vdCByZXF1aXJlIGJlaW5nCisgICogYWRkZWQgb24gYSBw ZXItY29ubmVjdGlvbiBiYXNpcy4gIEFueSBudW1iZXIgb2Ygb2JqZWN0IGhvb2tzIGNhbiBi ZQorICAqIGJlIGFkZGVkLgorICAqCisgICogV0FSTklORzogVGhpcyBzaG91bGQgb25seSBi ZSBjYWxsZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQKKyAgKiBiZWZvcmUg dXNpbmcgYW55IG90aGVyIGxpYnBxIGZ1bmN0aW9ucy4gIFRoaXMgaXMgbm90IHRocmVhZC1z YWZlIGFuZAorICAqIHNob3VsZCBiZSB1c2VkIHByaW9yIHRvIGNyZWF0aW5nIGFueSBhcHBs aWNhdGlvbiB0aHJlYWRzLgorICAqLworIGV4dGVybiBpbnQKKyBQUWFkZEdsb2JhbE9iamVj dEhvb2tzKFBHb2JqZWN0SG9va3MgKmhvb2tzKTsKKyAKKyAvKiBBZGRzIGEgc2V0IG9mIG9i amVjdCBob29rcyB0byB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4gKi8KKyBleHRlcm4gaW50Cisg UFFhZGRPYmplY3RIb29rcyhQR2Nvbm4gKmNvbm4sIFBHb2JqZWN0SG9va3MgKmhvb2tzKTsK KyAKKyBleHRlcm4gdm9pZCAqCisgUFFob29rRGF0YShjb25zdCBQR2Nvbm4gKmNvbm4sIGNv bnN0IGNoYXIgKmhvb2tOYW1lKTsKKyAKKyBleHRlcm4gdm9pZCAqCisgUFFyZXN1bHRIb29r RGF0YShjb25zdCBQR3Jlc3VsdCAqcmVzLCBjb25zdCBjaGFyICpob29rTmFtZSk7CisgCiAg LyogPT09IGluIGZlLWF1dGguYyA9PT0gKi8KICAKICBleHRlcm4gY2hhciAqUFFlbmNyeXB0 UGFzc3dvcmQoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCBjaGFyICp1c2VyKTsKICAKICAv KiA9PT0gaW4gZW5jbmFtZXMuYyA9PT0gKi8KICAKSW5kZXg6IGxpYnBxLWludC5oCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZh Y2VzL2xpYnBxL2xpYnBxLWludC5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjEyOQpkaWZm IC1DNiAtcjEuMTI5IGxpYnBxLWludC5oCioqKiBsaWJwcS1pbnQuaAkxIEphbiAyMDA4IDE5 OjQ2OjAwIC0wMDAwCTEuMTI5Ci0tLSBsaWJwcS1pbnQuaAkxNCBNYXkgMjAwOCAxNzo0ODow MCAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDk3LDEyMSAqKioqCiAgdW5pb24gcGdyZXN1 bHRfZGF0YQogIHsKICAJUEdyZXN1bHRfZGF0YSAqbmV4dDsJCS8qIGxpbmsgdG8gbmV4dCBi bG9jaywgb3IgTlVMTCAqLwogIAljaGFyCQlzcGFjZVsxXTsJCS8qIGR1bW15IGZvciBhY2Nl c3NpbmcgYmxvY2sgYXMgYnl0ZXMgKi8KICB9OwogIAotIC8qIERhdGEgYWJvdXQgYSBzaW5n bGUgYXR0cmlidXRlIChjb2x1bW4pIG9mIGEgcXVlcnkgcmVzdWx0ICovCi0gCi0gdHlwZWRl ZiBzdHJ1Y3QgcGdyZXNBdHREZXNjCi0gewotIAljaGFyCSAgICpuYW1lOwkJCS8qIGNvbHVt biBuYW1lICovCi0gCU9pZAkJCXRhYmxlaWQ7CQkvKiBzb3VyY2UgdGFibGUsIGlmIGtub3du ICovCi0gCWludAkJCWNvbHVtbmlkOwkJLyogc291cmNlIGNvbHVtbiwgaWYga25vd24gKi8K LSAJaW50CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBjb2RlIGZvciB2YWx1ZSAodGV4dC9iaW5h cnkpICovCi0gCU9pZAkJCXR5cGlkOwkJCS8qIHR5cGUgaWQgKi8KLSAJaW50CQkJdHlwbGVu OwkJCS8qIHR5cGUgc2l6ZSAqLwotIAlpbnQJCQlhdHR0eXBtb2Q7CQkvKiB0eXBlLXNwZWNp ZmljIG1vZGlmaWVyIGluZm8gKi8KLSB9IFBHcmVzQXR0RGVzYzsKLSAKICAvKiBEYXRhIGFi b3V0IGEgc2luZ2xlIHBhcmFtZXRlciBvZiBhIHByZXBhcmVkIHN0YXRlbWVudCAqLwogIHR5 cGVkZWYgc3RydWN0IHBncmVzUGFyYW1EZXNjCiAgewogIAlPaWQJCQl0eXBpZDsJCQkvKiB0 eXBlIGlkICovCiAgfSBQR3Jlc1BhcmFtRGVzYzsKICAKLS0tIDk3LDEwOCAtLS0tCioqKioq KioqKioqKioqKgoqKiogMTgxLDE5MiAqKioqCi0tLSAxNjgsMTgzIC0tLS0KICAJICogVGhl c2UgZmllbGRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgb3JpZ2luYXRpbmcgUEdjb25uLCBzbyB0 aGF0IG9wZXJhdGlvbnMKICAJICogb24gdGhlIFBHcmVzdWx0IGRvbid0IGhhdmUgdG8gcmVm ZXJlbmNlIHRoZSBQR2Nvbm4uCiAgCSAqLwogIAlQR05vdGljZUhvb2tzIG5vdGljZUhvb2tz OwogIAlpbnQJCQljbGllbnRfZW5jb2Rpbmc7CS8qIGVuY29kaW5nIGlkICovCiAgCisgCS8q IE9iamVjdCBIb29rcyAqLworIAlpbnQgb2JqSG9va3NDb3VudDsKKyAJUEdvYmplY3RIb29r cyAqb2JqSG9va3M7CisgCiAgCS8qCiAgCSAqIEVycm9yIGluZm9ybWF0aW9uIChhbGwgTlVM TCBpZiBub3QgYW4gZXJyb3IgcmVzdWx0KS4gIGVyck1zZyBpcyB0aGUKICAJICogIm92ZXJh bGwiIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgYnkgUFFyZXN1bHRFcnJvck1lc3NhZ2UuICBJ ZiB3ZSBoYXZlCiAgCSAqIHBlci1maWVsZCBpbmZvIHRoZW4gaXQgaXMgc3RvcmVkIGluIGEg bGlua2VkIGxpc3QuCiAgCSAqLwogIAljaGFyCSAgICplcnJNc2c7CQkJLyogZXJyb3IgbWVz c2FnZSwgb3IgTlVMTCBpZiBubyBlcnJvciAqLwoqKioqKioqKioqKioqKioKKioqIDIwMiwy MTMgKioqKgotLS0gMTkzLDIwNSAtLS0tCiAgCSAqLwogIAlQR3Jlc3VsdF9kYXRhICpjdXJC bG9jazsJLyogbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2sgKi8KICAJaW50CQkJY3Vy T2Zmc2V0OwkJLyogc3RhcnQgb2Zmc2V0IG9mIGZyZWUgc3BhY2UgaW4gYmxvY2sgKi8KICAJ aW50CQkJc3BhY2VMZWZ0OwkJLyogbnVtYmVyIG9mIGZyZWUgYnl0ZXMgcmVtYWluaW5nIGlu IGJsb2NrICovCiAgfTsKICAKKyAKICAvKiBQR0FzeW5jU3RhdHVzVHlwZSBkZWZpbmVzIHRo ZSBzdGF0ZSBvZiB0aGUgcXVlcnktZXhlY3V0aW9uIHN0YXRlIG1hY2hpbmUgKi8KICB0eXBl ZGVmIGVudW0KICB7CiAgCVBHQVNZTkNfSURMRSwJCQkJLyogbm90aGluZydzIGhhcHBlbmlu ZywgZHVkZSAqLwogIAlQR0FTWU5DX0JVU1ksCQkJCS8qIHF1ZXJ5IGluIHByb2dyZXNzICov CiAgCVBHQVNZTkNfUkVBRFksCQkJCS8qIHJlc3VsdCByZWFkeSBmb3IgUFFnZXRSZXN1bHQg Ki8KKioqKioqKioqKioqKioqCioqKiAzMDAsMzExICoqKioKLS0tIDI5MiwzMDggLS0tLQog IAkvKiBPcHRpb25hbCBmaWxlIHRvIHdyaXRlIHRyYWNlIGluZm8gdG8gKi8KICAJRklMRQkg ICAqUGZkZWJ1ZzsKICAKICAJLyogQ2FsbGJhY2sgcHJvY2VkdXJlcyBmb3Igbm90aWNlIG1l c3NhZ2UgcHJvY2Vzc2luZyAqLwogIAlQR05vdGljZUhvb2tzIG5vdGljZUhvb2tzOwogIAor IAkvKiBPYmplY3QgSG9va3MgKi8KKyAJaW50IG9iakhvb2tzQ291bnQ7CisgCWludCBvYmpI b29rc1NpemU7CisgCVBHb2JqZWN0SG9va3MgKm9iakhvb2tzOworIAogIAkvKiBTdGF0dXMg aW5kaWNhdG9ycyAqLwogIAlDb25uU3RhdHVzVHlwZSBzdGF0dXM7CiAgCVBHQXN5bmNTdGF0 dXNUeXBlIGFzeW5jU3RhdHVzOwogIAlQR1RyYW5zYWN0aW9uU3RhdHVzVHlwZSB4YWN0U3Rh dHVzOyAvKiBuZXZlciBjaGFuZ2VzIHRvIEFDVElWRSAqLwogIAlQR1F1ZXJ5Q2xhc3MgcXVl cnljbGFzczsKICAJY2hhcgkgICAqbGFzdF9xdWVyeTsJCS8qIGxhc3QgU1FMIGNvbW1hbmQs IG9yIE5VTEwgaWYgdW5rbm93biAqLwoqKioqKioqKioqKioqKioKKioqIDUxNiw1MzEgKioq KgogIGV4dGVybiBpbnQJcHFQdXRJbnQoaW50IHZhbHVlLCBzaXplX3QgYnl0ZXMsIFBHY29u biAqY29ubik7CiAgZXh0ZXJuIGludAlwcVB1dE1zZ1N0YXJ0KGNoYXIgbXNnX3R5cGUsIGJv b2wgZm9yY2VfbGVuLCBQR2Nvbm4gKmNvbm4pOwogIGV4dGVybiBpbnQJcHFQdXRNc2dFbmQo UEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxUmVhZERhdGEoUEdjb25uICpjb25uKTsK ICBleHRlcm4gaW50CXBxRmx1c2goUEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxV2Fp dChpbnQgZm9yUmVhZCwgaW50IGZvcldyaXRlLCBQR2Nvbm4gKmNvbm4pOwohIGV4dGVybiBp bnQgcHFXYWl0VGltZWQoaW50IGZvclJlYWQsIGludCBmb3JXcml0ZSwgUEdjb25uICpjb25u LAogIAkJCXRpbWVfdCBmaW5pc2hfdGltZSk7CiAgZXh0ZXJuIGludAlwcVJlYWRSZWFkeShQ R2Nvbm4gKmNvbm4pOwogIGV4dGVybiBpbnQJcHFXcml0ZVJlYWR5KFBHY29ubiAqY29ubik7 CiAgCiAgLyogPT09IGluIGZlLXNlY3VyZS5jID09PSAqLwogIAogIGV4dGVybiBpbnQJcHFz ZWN1cmVfaW5pdGlhbGl6ZShQR2Nvbm4gKik7CiAgZXh0ZXJuIHZvaWQgcHFzZWN1cmVfZGVz dHJveSh2b2lkKTsKICBleHRlcm4gUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZSBwcXNlY3Vy ZV9vcGVuX2NsaWVudChQR2Nvbm4gKik7Ci0tLSA1MTMsNTI5IC0tLS0KICBleHRlcm4gaW50 CXBxUHV0SW50KGludCB2YWx1ZSwgc2l6ZV90IGJ5dGVzLCBQR2Nvbm4gKmNvbm4pOwogIGV4 dGVybiBpbnQJcHFQdXRNc2dTdGFydChjaGFyIG1zZ190eXBlLCBib29sIGZvcmNlX2xlbiwg UEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxUHV0TXNnRW5kKFBHY29ubiAqY29ubik7 CiAgZXh0ZXJuIGludAlwcVJlYWREYXRhKFBHY29ubiAqY29ubik7CiAgZXh0ZXJuIGludAlw cUZsdXNoKFBHY29ubiAqY29ubik7CiAgZXh0ZXJuIGludAlwcVdhaXQoaW50IGZvclJlYWQs IGludCBmb3JXcml0ZSwgUEdjb25uICpjb25uKTsKISBleHRlcm4gaW50CXBxV2FpdFRpbWVk KGludCBmb3JSZWFkLCBpbnQgZm9yV3JpdGUsIFBHY29ubiAqY29ubiwKICAJCQl0aW1lX3Qg ZmluaXNoX3RpbWUpOwogIGV4dGVybiBpbnQJcHFSZWFkUmVhZHkoUEdjb25uICpjb25uKTsK ICBleHRlcm4gaW50CXBxV3JpdGVSZWFkeShQR2Nvbm4gKmNvbm4pOworIGV4dGVybiBpbnQg cHFJbml0T2JqZWN0SG9va3MoUEdjb25uICpjb25uKTsKICAKICAvKiA9PT0gaW4gZmUtc2Vj dXJlLmMgPT09ICovCiAgCiAgZXh0ZXJuIGludAlwcXNlY3VyZV9pbml0aWFsaXplKFBHY29u biAqKTsKICBleHRlcm4gdm9pZCBwcXNlY3VyZV9kZXN0cm95KHZvaWQpOwogIGV4dGVybiBQ b3N0Z3Jlc1BvbGxpbmdTdGF0dXNUeXBlIHBxc2VjdXJlX29wZW5fY2xpZW50KFBHY29ubiAq KTsK --------------080002070302080708020509--