Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id 6645BBBDD48 for ; Fri, 18 Nov 2011 03:20:07 -0400 (AST) Received: from tama50.ecl.ntt.co.jp ([129.60.39.147]) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1RRIjx-0006y0-FF for pgsql-hackers@postgresql.org; Fri, 18 Nov 2011 07:20:06 +0000 Received: from mfs6.rdh.ecl.ntt.co.jp (mfs6.rdh.ecl.ntt.co.jp [129.60.39.149]) by tama50.ecl.ntt.co.jp (8.14.5/8.14.5) with ESMTP id pAI7JgdZ024250; Fri, 18 Nov 2011 16:19:42 +0900 (JST) Received: from mfs6.rdh.ecl.ntt.co.jp (localhost [127.0.0.1]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id BA01165F1; Fri, 18 Nov 2011 16:19:41 +0900 (JST) Received: from dmailsv1.y.ecl.ntt.co.jp (dmailsv1.y.ecl.ntt.co.jp [129.60.53.14]) by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id 9D1E965EB; Fri, 18 Nov 2011 16:19:41 +0900 (JST) Received: from mailsv01.y.ecl.ntt.co.jp by dmailsv1.y.ecl.ntt.co.jp (8.14.4/dmailsv1-2.1) with ESMTP id pAI7H7AU028695; Fri, 18 Nov 2011 16:17:07 +0900 (JST) Received: from localhost by mailsv01.y.ecl.ntt.co.jp (8.14.5/Lab-1.9) with ESMTP id pAI7H7Sf027345; Fri, 18 Nov 2011 16:17:07 +0900 (JST) Message-ID: <4EC60883.2050905@lab.ntt.co.jp> Date: Fri, 18 Nov 2011 16:25:55 +0900 From: Etsuro Fujita User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.9) Gecko/20100915 Thunderbird/3.1.4 MIME-Version: 1.0 To: Shigeru Hanada CC: pgsql-hackers@postgresql.org Subject: Re: WIP: Collecting statistics on CSV file data References: <4E6DE18B.4010505@lab.ntt.co.jp> <4E7861C1.2000607@gmail.com> <4E8EC1D8.3080700@lab.ntt.co.jp> <4E9C6573.8050507@gmail.com> <4E9FF04B.3050504@lab.ntt.co.jp> <4EB7C07A.5030205@gmail.com> In-Reply-To: <4EB7C07A.5030205@gmail.com> Content-Type: multipart/mixed; boundary="------------000503090309020405040802" X-Archive-Number: 201111/1096 X-Sequence-Number: 198581 This is a multi-part message in MIME format. --------------000503090309020405040802 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit (2011/11/07 20:26), Shigeru Hanada wrote: > (2011/10/20 18:56), Etsuro Fujita wrote: >> I revised the patch according to Hanada-san's comments. Attached is the >> updated version of the patch. >> >> Changes: >> >> * pull up of logging "analyzing foo.bar" >> * new vac_update_relstats always called >> * tab-completion in psql >> * add "foreign tables are not analyzed automatically..." to 23.1.3 >> Updating Planner Statistics >> * some other modifications > > Submission review > ================= > > - Patch can be applied, and all regression tests passed. :) Thank you for your testing. I updated the patch according to your comments. Attached is the updated version of the patch. > - file_fdw_do_analyze_rel is almost copy of do_analyze_rel. IIUC, > difference against do_analyze_rel are: > * don't logging analyze target > * don't switch userid to the owner of target table > * don't measure elapsed time for autoanalyze deamon > * don't handle index > * some comments are removed. > * sample rows are acquired by file_fdw's routine > > I don't see any problem here, but would you confirm that all of them are > intentional? Yes. But in the updated version, I've refactored analyze.c a little bit to allow FDW authors to simply call do_analyze_rel(). > - In your design, each FDW have to copy most of do_analyze_rel to their > own source. It means that FDW authors must know much details of ANALYZE > to implement ANALYZE handler. Actually, your patch exports some static > functions from analyze.c. Have you considered hooking > acquire_sample_rows()? Such handler should be more simple, and > FDW-specific. As you say, such design requires FDWs to skip some > records, but it would be difficult for some FDW (e.g. twitter_fdw) which > can't pick sample data up easily. IMHO such problem *must* be solved by > FDW itself. The updated version enables FDW authors to just write their own acquire_sample_rows(). On the other hand, by retaining to hook AnalyzeForeignTable routine at analyze_rel(), higher level than acquire_sample_rows() as before, it allows FDW authors to write AnalyzeForeignTable routine for foreign tables on a remote server to ask the server for its current stats instead, as pointed out earlier by Tom Lane. Best regards, Etsuro Fujita --------------000503090309020405040802 Content-Type: text/plain; name="postgresql-analyze-v4.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="postgresql-analyze-v4.patch" KioqIGEvY29udHJpYi9maWxlX2Zkdy9maWxlX2Zkdy5jCi0tLSBiL2NvbnRyaWIvZmlsZV9m ZHcvZmlsZV9mZHcuYwoqKioqKioqKioqKioqKioKKioqIDE2LDMxICoqKioKICAjaW5jbHVk ZSA8dW5pc3RkLmg+CiAgCiAgI2luY2x1ZGUgImFjY2Vzcy9yZWxvcHRpb25zLmgiCiAgI2lu Y2x1ZGUgImNhdGFsb2cvcGdfZm9yZWlnbl90YWJsZS5oIgogICNpbmNsdWRlICJjb21tYW5k cy9jb3B5LmgiCiAgI2luY2x1ZGUgImNvbW1hbmRzL2RlZnJlbS5oIgogICNpbmNsdWRlICJj b21tYW5kcy9leHBsYWluLmgiCiAgI2luY2x1ZGUgImZvcmVpZ24vZmR3YXBpLmgiCiAgI2lu Y2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgogICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICAj aW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiAgI2luY2x1ZGUgIm9wdGltaXplci9jb3N0 LmgiCiEgI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogICNpbmNsdWRlICJ1dGlscy9zeXNjYWNo ZS5oIgogIAogIFBHX01PRFVMRV9NQUdJQzsKLS0tIDE2LDM2IC0tLS0KICAjaW5jbHVkZSA8 dW5pc3RkLmg+CiAgCiAgI2luY2x1ZGUgImFjY2Vzcy9yZWxvcHRpb25zLmgiCisgI2luY2x1 ZGUgImFjY2Vzcy90cmFuc2FtLmgiCiAgI2luY2x1ZGUgImNhdGFsb2cvcGdfZm9yZWlnbl90 YWJsZS5oIgogICNpbmNsdWRlICJjb21tYW5kcy9jb3B5LmgiCiAgI2luY2x1ZGUgImNvbW1h bmRzL2RlZnJlbS5oIgogICNpbmNsdWRlICJjb21tYW5kcy9leHBsYWluLmgiCisgI2luY2x1 ZGUgImNvbW1hbmRzL3ZhY3V1bS5oIgogICNpbmNsdWRlICJmb3JlaWduL2Zkd2FwaS5oIgog ICNpbmNsdWRlICJmb3JlaWduL2ZvcmVpZ24uaCIKICAjaW5jbHVkZSAibWlzY2FkbWluLmgi CiAgI2luY2x1ZGUgIm5vZGVzL21ha2VmdW5jcy5oIgogICNpbmNsdWRlICJvcHRpbWl6ZXIv Y29zdC5oIgohICNpbmNsdWRlICJwYXJzZXIvcGFyc2VfcmVsYXRpb24uaCIKISAjaW5jbHVk ZSAicGdzdGF0LmgiCiEgI2luY2x1ZGUgInV0aWxzL2F0dG9wdGNhY2hlLmgiCiEgI2luY2x1 ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAgI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiAg CiAgUEdfTU9EVUxFX01BR0lDOwoqKioqKioqKioqKioqKioKKioqIDEwMSwxMDYgKioqKiBz dGF0aWMgdm9pZCBmaWxlQmVnaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2Rl LCBpbnQgZWZsYWdzKTsKLS0tIDEwNiwxMTIgLS0tLQogIHN0YXRpYyBUdXBsZVRhYmxlU2xv dCAqZmlsZUl0ZXJhdGVGb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICBz dGF0aWMgdm9pZCBmaWxlUmVTY2FuRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9k ZSk7CiAgc3RhdGljIHZvaWQgZmlsZUVuZEZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUg Km5vZGUpOworIHN0YXRpYyB2b2lkIGZpbGVBbmFseXplRm9yZWlnblRhYmxlKFJlbGF0aW9u IG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgaW50IGVsZXZlbCk7CiAgCiAgLyoKICAg KiBIZWxwZXIgZnVuY3Rpb25zCioqKioqKioqKioqKioqKgoqKiogMTEyLDExOCAqKioqIHN0 YXRpYyBMaXN0ICpnZXRfZmlsZV9mZHdfYXR0cmlidXRlX29wdGlvbnMoT2lkIHJlbGlkKTsK ICBzdGF0aWMgdm9pZCBlc3RpbWF0ZV9jb3N0cyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqYmFzZXJlbCwKICAJCQkgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKICAJCQkgICBD b3N0ICpzdGFydHVwX2Nvc3QsIENvc3QgKnRvdGFsX2Nvc3QpOwohIAogIAogIC8qCiAgICog Rm9yZWlnbi1kYXRhIHdyYXBwZXIgaGFuZGxlciBmdW5jdGlvbjogcmV0dXJuIGEgc3RydWN0 IHdpdGggcG9pbnRlcnMKLS0tIDExOCwxMjcgLS0tLQogIHN0YXRpYyB2b2lkIGVzdGltYXRl X2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVsLAogIAkJCSAg IGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogIAkJCSAgIENvc3QgKnN0YXJ0dXBfY29zdCwgQ29z dCAqdG90YWxfY29zdCk7CiEgc3RhdGljIGludAlhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0 aW9uIG9uZXJlbCwKISAJCQkgICBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJ CQkgICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzLAohIAkJCSAg IEJsb2NrTnVtYmVyICp0b3RhbHBhZ2VzLCBpbnQgZWxldmVsKTsKICAKICAvKgogICAqIEZv cmVpZ24tZGF0YSB3cmFwcGVyIGhhbmRsZXIgZnVuY3Rpb246IHJldHVybiBhIHN0cnVjdCB3 aXRoIHBvaW50ZXJzCioqKioqKioqKioqKioqKgoqKiogMTI5LDEzNCAqKioqIGZpbGVfZmR3 X2hhbmRsZXIoUEdfRlVOQ1RJT05fQVJHUykKLS0tIDEzOCwxNDQgLS0tLQogIAlmZHdyb3V0 aW5lLT5JdGVyYXRlRm9yZWlnblNjYW4gPSBmaWxlSXRlcmF0ZUZvcmVpZ25TY2FuOwogIAlm ZHdyb3V0aW5lLT5SZVNjYW5Gb3JlaWduU2NhbiA9IGZpbGVSZVNjYW5Gb3JlaWduU2NhbjsK ICAJZmR3cm91dGluZS0+RW5kRm9yZWlnblNjYW4gPSBmaWxlRW5kRm9yZWlnblNjYW47Cisg CWZkd3JvdXRpbmUtPkFuYWx5emVGb3JlaWduVGFibGUgPSBmaWxlQW5hbHl6ZUZvcmVpZ25U YWJsZTsKICAKICAJUEdfUkVUVVJOX1BPSU5URVIoZmR3cm91dGluZSk7CiAgfQoqKioqKioq KioqKioqKioKKioqIDU3NSw1ODAgKioqKiBmaWxlUmVTY2FuRm9yZWlnblNjYW4oRm9yZWln blNjYW5TdGF0ZSAqbm9kZSkKLS0tIDU4NSw2MDIgLS0tLQogIH0KICAKICAvKgorICAqIGZp bGVBbmFseXplRm9yZWlnblRhYmxlCisgICoJCUFuYWx5emUgdGFibGUKKyAgKi8KKyBzdGF0 aWMgdm9pZAorIGZpbGVBbmFseXplRm9yZWlnblRhYmxlKFJlbGF0aW9uIG9uZXJlbCwgVmFj dXVtU3RtdCAqdmFjc3RtdCwgaW50IGVsZXZlbCkKKyB7CisgCWRvX2FuYWx5emVfcmVsKG9u ZXJlbCwgdmFjc3RtdCwKKyAJCQkJICAgZWxldmVsLCBmYWxzZSwKKyAJCQkJICAgYWNxdWly ZV9zYW1wbGVfcm93cyk7CisgfQorIAorIC8qCiAgICogRXN0aW1hdGUgY29zdHMgb2Ygc2Nh bm5pbmcgYSBmb3JlaWduIHRhYmxlLgogICAqLwogIHN0YXRpYyB2b2lkCioqKioqKioqKioq KioqKgoqKiogNTg0LDU5MCAqKioqIGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpiYXNlcmVsLAogIHsKICAJc3RydWN0IHN0YXQgc3RhdF9idWY7CiAg CUJsb2NrTnVtYmVyIHBhZ2VzOwohIAlpbnQJCQl0dXBsZV93aWR0aDsKICAJZG91YmxlCQlu dHVwbGVzOwogIAlkb3VibGUJCW5yb3dzOwogIAlDb3N0CQlydW5fY29zdCA9IDA7Ci0tLSA2 MDYsNjEzIC0tLS0KICB7CiAgCXN0cnVjdCBzdGF0IHN0YXRfYnVmOwogIAlCbG9ja051bWJl ciBwYWdlczsKISAJQmxvY2tOdW1iZXIJcmVscGFnZXM7CiEgCWRvdWJsZQkJcmVsdHVwbGVz OwogIAlkb3VibGUJCW50dXBsZXM7CiAgCWRvdWJsZQkJbnJvd3M7CiAgCUNvc3QJCXJ1bl9j b3N0ID0gMDsKKioqKioqKioqKioqKioqCioqKiA2MDQsNjE5ICoqKiogZXN0aW1hdGVfY29z dHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmJhc2VyZWwsCiAgCWlmIChwYWdl cyA8IDEpCiAgCQlwYWdlcyA9IDE7CiAgCiEgCS8qCiEgCSAqIEVzdGltYXRlIHRoZSBudW1i ZXIgb2YgdHVwbGVzIGluIHRoZSBmaWxlLiAgV2UgYmFjayBpbnRvIHRoaXMgZXN0aW1hdGUK ISAJICogdXNpbmcgdGhlIHBsYW5uZXIncyBpZGVhIG9mIHRoZSByZWxhdGlvbiB3aWR0aDsg d2hpY2ggaXMgYm9ndXMgaWYgbm90CiEgCSAqIGFsbCBjb2x1bW5zIGFyZSBiZWluZyByZWFk LCBub3QgdG8gbWVudGlvbiB0aGF0IHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uCiEgCSAqIG9m IGEgcm93IHByb2JhYmx5IGlzbid0IHRoZSBzYW1lIHNpemUgYXMgaXRzIGludGVybmFsIHJl cHJlc2VudGF0aW9uLgohIAkgKiBGSVhNRSBsYXRlci4KISAJICovCiEgCXR1cGxlX3dpZHRo ID0gTUFYQUxJR04oYmFzZXJlbC0+d2lkdGgpICsgTUFYQUxJR04oc2l6ZW9mKEhlYXBUdXBs ZUhlYWRlckRhdGEpKTsKICAKISAJbnR1cGxlcyA9IGNsYW1wX3Jvd19lc3QoKGRvdWJsZSkg c3RhdF9idWYuc3Rfc2l6ZSAvIChkb3VibGUpIHR1cGxlX3dpZHRoKTsKICAKICAJLyoKICAJ ICogTm93IGVzdGltYXRlIHRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCBieSB0aGUgc2Nh biBhZnRlciBhcHBseWluZyB0aGUKLS0tIDYyNyw2NTggLS0tLQogIAlpZiAocGFnZXMgPCAx KQogIAkJcGFnZXMgPSAxOwogIAohIAlyZWxwYWdlcyA9IGJhc2VyZWwtPnBhZ2VzOwohIAly ZWx0dXBsZXMgPSBiYXNlcmVsLT50dXBsZXM7CiEgCiEgCWlmIChyZWxwYWdlcyA+IDApCiEg CXsKISAJCWRvdWJsZQkJZGVuc2l0eTsKICAKISAJCWRlbnNpdHkgPSByZWx0dXBsZXMgLyAo ZG91YmxlKSByZWxwYWdlczsKISAKISAJCW50dXBsZXMgPSBjbGFtcF9yb3dfZXN0KGRlbnNp dHkgKiAoZG91YmxlKSBwYWdlcyk7CiEgCX0KISAJZWxzZQohIAl7CiEgCQlpbnQJCQl0dXBs ZV93aWR0aDsKISAKISAJCS8qCiEgCQkgKiBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHR1cGxl cyBpbiB0aGUgZmlsZS4gIFdlIGJhY2sgaW50byB0aGlzIGVzdGltYXRlCiEgCQkgKiB1c2lu ZyB0aGUgcGxhbm5lcidzIGlkZWEgb2YgdGhlIHJlbGF0aW9uIHdpZHRoOyB3aGljaCBpcyBi b2d1cyBpZiBub3QKISAJCSAqIGFsbCBjb2x1bW5zIGFyZSBiZWluZyByZWFkLCBub3QgdG8g bWVudGlvbiB0aGF0IHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uCiEgCQkgKiBvZiBhIHJvdyBw cm9iYWJseSBpc24ndCB0aGUgc2FtZSBzaXplIGFzIGl0cyBpbnRlcm5hbCByZXByZXNlbnRh dGlvbi4KISAJCSAqIEZJWE1FIGxhdGVyLgohIAkJICovCiEgCQl0dXBsZV93aWR0aCA9IE1B WEFMSUdOKGJhc2VyZWwtPndpZHRoKSArIE1BWEFMSUdOKHNpemVvZihIZWFwVHVwbGVIZWFk ZXJEYXRhKSk7CiEgCiEgCQludHVwbGVzID0gY2xhbXBfcm93X2VzdCgoZG91YmxlKSBzdGF0 X2J1Zi5zdF9zaXplIC8gKGRvdWJsZSkgdHVwbGVfd2lkdGgpOwohIAl9CiAgCiAgCS8qCiAg CSAqIE5vdyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgYnkgdGhlIHNj YW4gYWZ0ZXIgYXBwbHlpbmcgdGhlCioqKioqKioqKioqKioqKgoqKiogNjQ1LDY0NyAqKioq IGVzdGltYXRlX2Nvc3RzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpiYXNlcmVs LAotLS0gNjg0LDg4OCAtLS0tCiAgCXJ1bl9jb3N0ICs9IGNwdV9wZXJfdHVwbGUgKiBudHVw bGVzOwogIAkqdG90YWxfY29zdCA9ICpzdGFydHVwX2Nvc3QgKyBydW5fY29zdDsKICB9Cisg CisgLyoKKyAgKiBhY3F1aXJlX3NhbXBsZV9yb3dzIC0tIGFjcXVpcmUgYSByYW5kb20gc2Ft cGxlIG9mIHJvd3MgZnJvbSB0aGUgdGFibGUKKyAgKgorICAqIFNlbGVjdGVkIHJvd3MgYXJl IHJldHVybmVkIGluIHRoZSBjYWxsZXItYWxsb2NhdGVkIGFycmF5IHJvd3NbXSwgd2hpY2gK KyAgKiBtdXN0IGhhdmUgYXQgbGVhc3QgdGFyZ3Jvd3MgZW50cmllcy4KKyAgKiBUaGUgYWN0 dWFsIG51bWJlciBvZiByb3dzIHNlbGVjdGVkIGlzIHJldHVybmVkIGFzIHRoZSBmdW5jdGlv biByZXN1bHQuCisgICogV2UgYWxzbyBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhl IHRhYmxlLCBhbmQgcmV0dXJuIGl0IGludG8gKnRvdGFscm93cy4KKyAgKgorICAqIFRoZSBy ZXR1cm5lZCBsaXN0IG9mIHR1cGxlcyBpcyBpbiBvcmRlciBieSBwaHlzaWNhbCBwb3NpdGlv biBpbiB0aGUgdGFibGUuCisgICogKFdlIHdpbGwgcmVseSBvbiB0aGlzIGxhdGVyIHRvIGRl cml2ZSBjb3JyZWxhdGlvbiBlc3RpbWF0ZXMuKQorICAqLworIHN0YXRpYyBpbnQKKyBhY3F1 aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQg dGFyZ3Jvd3MsCisgCQkJCQlkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRy b3dzLAorIAkJCQkJQmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwpCisgewor IAlpbnQJCQludW1yb3dzID0gMDsKKyAJZG91YmxlCQlzYW1wbGVyb3dzID0gMDsgIC8qIHRv dGFsICMgcm93cyBjb2xsZWN0ZWQgKi8KKyAJZG91YmxlCQlyb3dzdG9za2lwID0gLTE7IC8q IC0xIG1lYW5zIG5vdCBzZXQgeWV0ICovCisgCWRvdWJsZQkJcnN0YXRlOworIAlIZWFwVHVw bGUJdHVwbGU7CisgCVR1cGxlRGVzYwl0dXBEZXNjOworIAlUdXBsZUNvbnN0ciAqY29uc3Ry OworIAlpbnQJCQluYXR0czsKKyAJaW50CQkJYXR0ckNoazsKKyAJRGF0dW0JICAgKnZhbHVl czsKKyAJYm9vbAkgICAqbnVsbHM7CisgCWJvb2wJCWZvdW5kOworIAlib29sCQlzYW1wbGVf aXQgPSBmYWxzZTsKKyAJQmxvY2tOdW1iZXIJYmxrbnVtOworIAlPZmZzZXROdW1iZXIgb2Zm bnVtOworIAljaGFyCSAgICpmaWxlbmFtZTsKKyAJc3RydWN0IHN0YXQJc3RhdF9idWY7Cisg CUxpc3QJICAgKm9wdGlvbnM7CisgCUNvcHlTdGF0ZQljc3RhdGU7CisgCUVycm9yQ29udGV4 dENhbGxiYWNrIGVycmNvbnRleHQ7CisgCisgCUFzc2VydChvbmVyZWwpOworIAlBc3NlcnQo dGFyZ3Jvd3MgPiAwKTsKKyAKKyAJdHVwRGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Iob25lcmVs KTsKKyAJY29uc3RyID0gdHVwRGVzYy0+Y29uc3RyOworIAluYXR0cyA9IHR1cERlc2MtPm5h dHRzOworIAl2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jKHR1cERlc2MtPm5hdHRzICogc2l6 ZW9mKERhdHVtKSk7CisgCW51bGxzID0gKGJvb2wgKikgcGFsbG9jKHR1cERlc2MtPm5hdHRz ICogc2l6ZW9mKGJvb2wpKTsKKyAKKyAJLyogRmV0Y2ggb3B0aW9ucyBvZiBmb3JlaWduIHRh YmxlICovCisgCWZpbGVHZXRPcHRpb25zKFJlbGF0aW9uR2V0UmVsaWQob25lcmVsKSwgJmZp bGVuYW1lLCAmb3B0aW9ucyk7CisgCisgCS8qCisgCSAqIEdldCBzaXplIG9mIHRoZSBmaWxl LgorIAkgKi8KKyAJaWYgKHN0YXQoZmlsZW5hbWUsICZzdGF0X2J1ZikgPCAwKQorIAkJZXJl cG9ydChFUlJPUiwKKyAJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisgCQkJCSBl cnJtc2coImNvdWxkIG5vdCBzdGF0IGZpbGUgXCIlc1wiOiAlbSIsCisgCQkJCQkJZmlsZW5h bWUpKSk7CisgCisgCS8qCisgCSAqIENvbnZlcnQgc2l6ZSB0byBwYWdlcyBmb3IgdXNlIGlu IEkvTyBjb3N0IGVzdGltYXRlLgorIAkgKi8KKyAJKnRvdGFscGFnZXMgPSAoc3RhdF9idWYu c3Rfc2l6ZSArIChCTENLU1ogLSAxKSkgLyBCTENLU1o7CisgCWlmICgqdG90YWxwYWdlcyA8 IDEpCisgCQkqdG90YWxwYWdlcyA9IDE7CisgCisgCS8qCisgCSAqIENyZWF0ZSBDb3B5U3Rh dGUgZnJvbSBGRFcgb3B0aW9ucy4gIFdlIGFsd2F5cyBhY3F1aXJlIGFsbCBjb2x1bW5zLCBz bworIAkgKiBhcyB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgU2NhblR1cGxlU2xvdCBzaWduYXR1 cmUuCisgCSAqLworIAljc3RhdGUgPSBCZWdpbkNvcHlGcm9tKG9uZXJlbCwgZmlsZW5hbWUs IE5JTCwgb3B0aW9ucyk7CisgCisgCS8qIFByZXBhcmUgZm9yIHNhbXBsaW5nIHJvd3MgKi8K KyAJcnN0YXRlID0gaW5pdF9zZWxlY3Rpb25fc3RhdGUodGFyZ3Jvd3MpOworIAorIAkvKiBT ZXQgdXAgY2FsbGJhY2sgdG8gaWRlbnRpZnkgZXJyb3IgbGluZSBudW1iZXIuICovCisgCWVy cmNvbnRleHQuY2FsbGJhY2sgPSBDb3B5RnJvbUVycm9yQ2FsbGJhY2s7CisgCWVycmNvbnRl eHQuYXJnID0gKHZvaWQgKikgY3N0YXRlOworIAllcnJjb250ZXh0LnByZXZpb3VzID0gZXJy b3JfY29udGV4dF9zdGFjazsKKyAJZXJyb3JfY29udGV4dF9zdGFjayA9ICZlcnJjb250ZXh0 OworIAorIAlmb3IgKDs7KQorIAl7CisgCQlzYW1wbGVfaXQgPSB0cnVlOworIAorIAkJLyoK KyAJCSAqIENoZWNrIGZvciB1c2VyLXJlcXVlc3RlZCBhYm9ydC4KKyAJCSAqLworIAkJQ0hF Q0tfRk9SX0lOVEVSUlVQVFMoKTsKKyAKKyAJCWZvdW5kID0gTmV4dENvcHlGcm9tKGNzdGF0 ZSwgTlVMTCwgdmFsdWVzLCBudWxscywgTlVMTCk7CisgCisgCQlpZiAoIWZvdW5kKQorIAkJ CWJyZWFrOworIAorIAkJdHVwbGUgPSBoZWFwX2Zvcm1fdHVwbGUodHVwRGVzYywgdmFsdWVz LCBudWxscyk7CisgCisgCQlpZiAoY29uc3RyICYmIGNvbnN0ci0+aGFzX25vdF9udWxsKQor IAkJeworIAkJCWZvciAoYXR0ckNoayA9IDE7IGF0dHJDaGsgPD0gbmF0dHM7IGF0dHJDaGsr KykKKyAJCQl7CisgCQkJCWlmIChvbmVyZWwtPnJkX2F0dC0+YXR0cnNbYXR0ckNoayAtIDFd LT5hdHRub3RudWxsICYmCisgCQkJCQloZWFwX2F0dGlzbnVsbCh0dXBsZSwgYXR0ckNoaykp CisgCQkJCXsKKyAJCQkJCXNhbXBsZV9pdCA9IGZhbHNlOworIAkJCQkJYnJlYWs7CisgCQkJ CX0KKyAJCQl9CisgCQl9CisgCisgCQlpZiAoIXNhbXBsZV9pdCkKKyAJCXsKKyAJCQloZWFw X2ZyZWV0dXBsZSh0dXBsZSk7CisgCQkJY29udGludWU7CisgCQl9CisgCisgCQkvKgorIAkJ ICogVGhlIGZpcnN0IHRhcmdyb3dzIHNhbXBsZSByb3dzIGFyZSBzaW1wbHkgY29waWVkIGlu dG8gdGhlCisgCQkgKiByZXNlcnZvaXIuIFRoZW4gd2Ugc3RhcnQgcmVwbGFjaW5nIHR1cGxl cyBpbiB0aGUgc2FtcGxlCisgCQkgKiB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBy ZWxhdGlvbi4JVGhpcyBhbGdvcml0aG0gaXMKKyAJCSAqIGZyb20gSmVmZiBWaXR0ZXIncyBw YXBlciAoc2VlIGZ1bGwgY2l0YXRpb24gYmVsb3cpLiBJdAorIAkJICogd29ya3MgYnkgcmVw ZWF0ZWRseSBjb21wdXRpbmcgdGhlIG51bWJlciBvZiB0dXBsZXMgdG8gc2tpcAorIAkJICog YmVmb3JlIHNlbGVjdGluZyBhIHR1cGxlLCB3aGljaCByZXBsYWNlcyBhIHJhbmRvbWx5IGNo b3NlbgorIAkJICogZWxlbWVudCBvZiB0aGUgcmVzZXJ2b2lyIChjdXJyZW50IHNldCBvZiB0 dXBsZXMpLiAgQXQgYWxsCisgCQkgKiB0aW1lcyB0aGUgcmVzZXJ2b2lyIGlzIGEgdHJ1ZSBy YW5kb20gc2FtcGxlIG9mIHRoZSB0dXBsZXMKKyAJCSAqIHdlJ3ZlIHBhc3NlZCBvdmVyIHNv IGZhciwgc28gd2hlbiB3ZSBmYWxsIG9mZiB0aGUgZW5kIG9mCisgCQkgKiB0aGUgcmVsYXRp b24gd2UncmUgZG9uZS4KKyAJCSAqLworIAkJaWYgKG51bXJvd3MgPCB0YXJncm93cykKKyAJ CXsKKyAJCQlibGtudW0gPSAoQmxvY2tOdW1iZXIpIHNhbXBsZXJvd3MgLyBNYXhPZmZzZXRO dW1iZXI7CisgCQkJb2ZmbnVtID0gKE9mZnNldE51bWJlcikgc2FtcGxlcm93cyAlIE1heE9m ZnNldE51bWJlciArIDE7CisgCQkJSXRlbVBvaW50ZXJTZXQoJnR1cGxlLT50X3NlbGYsIGJs a251bSwgb2ZmbnVtKTsKKyAJCQlyb3dzW251bXJvd3MrK10gPSBoZWFwX2NvcHl0dXBsZSh0 dXBsZSk7CisgCQl9CisgCQllbHNlCisgCQl7CisgCQkJLyoKKyAJCQkgKiB0IGluIFZpdHRl cidzIHBhcGVyIGlzIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBhbHJlYWR5CisgCQkJICogcHJv Y2Vzc2VkLiAgSWYgd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IFMgdmFsdWUsIHdlCisgCQkJ ICogbXVzdCB1c2UgdGhlIG5vdC15ZXQtaW5jcmVtZW50ZWQgdmFsdWUgb2Ygc2FtcGxlcm93 cyBhcworIAkJCSAqIHQuCisgCQkJICovCisgCQkJaWYgKHJvd3N0b3NraXAgPCAwKQorIAkJ CQlyb3dzdG9za2lwID0gZ2V0X25leHRfUyhzYW1wbGVyb3dzLCB0YXJncm93cywgJnJzdGF0 ZSk7CisgCisgCQkJaWYgKHJvd3N0b3NraXAgPD0gMCkKKyAJCQl7CisgCQkJCS8qCisgCQkJ CSAqIEZvdW5kIGEgc3VpdGFibGUgdHVwbGUsIHNvIHNhdmUgaXQsIHJlcGxhY2luZyBvbmUK KyAJCQkJICogb2xkIHR1cGxlIGF0IHJhbmRvbQorIAkJCQkgKi8KKyAJCQkJaW50IGsgPSAo aW50KSAodGFyZ3Jvd3MgKiByYW5kb21fZnJhY3QoKSk7CisgCisgCQkJCUFzc2VydChrID49 IDAgJiYgayA8IHRhcmdyb3dzKTsKKyAJCQkJaGVhcF9mcmVldHVwbGUocm93c1trXSk7Cisg CisgCQkJCWJsa251bSA9IChCbG9ja051bWJlcikgc2FtcGxlcm93cyAvIE1heE9mZnNldE51 bWJlcjsKKyAJCQkJb2ZmbnVtID0gKE9mZnNldE51bWJlcikgc2FtcGxlcm93cyAlIE1heE9m ZnNldE51bWJlciArIDE7CisgCQkJCUl0ZW1Qb2ludGVyU2V0KCZ0dXBsZS0+dF9zZWxmLCBi bGtudW0sIG9mZm51bSk7CisgCQkJCXJvd3Nba10gPSBoZWFwX2NvcHl0dXBsZSh0dXBsZSk7 CisgCQkJfQorIAorIAkJCXJvd3N0b3NraXAgLT0gMTsKKyAJCX0KKyAKKyAJCXNhbXBsZXJv d3MgKz0gMTsKKyAJCWhlYXBfZnJlZXR1cGxlKHR1cGxlKTsKKyAJfQorIAorIAkvKiBSZW1v dmUgZXJyb3IgY2FsbGJhY2suICovCisgCWVycm9yX2NvbnRleHRfc3RhY2sgPSBlcnJjb250 ZXh0LnByZXZpb3VzOworIAorIAkvKgorIAkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBhcyBtYW55 IHR1cGxlcyBhcyB3ZSB3YW50ZWQgdGhlbiB3ZSdyZSBkb25lLiBObyBzb3J0CisgCSAqIGlz IG5lZWRlZCwgc2luY2UgdGhleSdyZSBhbHJlYWR5IGluIG9yZGVyLgorIAkgKgorIAkgKiBP dGhlcndpc2Ugd2UgbmVlZCB0byBzb3J0IHRoZSBjb2xsZWN0ZWQgdHVwbGVzIGJ5IHBvc2l0 aW9uCisgCSAqIChpdGVtcG9pbnRlcikuIEl0J3Mgbm90IHdvcnRoIHdvcnJ5aW5nIGFib3V0 IGNvcm5lciBjYXNlcyB3aGVyZSB0aGUKKyAJICogdHVwbGVzIGFyZSBhbHJlYWR5IHNvcnRl ZC4KKyAJICovCisgCWlmIChudW1yb3dzID09IHRhcmdyb3dzKQorIAkJcXNvcnQoKHZvaWQg Kikgcm93cywgbnVtcm93cywgc2l6ZW9mKEhlYXBUdXBsZSksIGNvbXBhcmVfcm93cyk7Cisg CisgCSp0b3RhbHJvd3MgPSBzYW1wbGVyb3dzOworIAkqdG90YWxkZWFkcm93cyA9IDA7Cisg CisgCUVuZENvcHlGcm9tKGNzdGF0ZSk7CisgCisgCXBmcmVlKHZhbHVlcyk7CisgCXBmcmVl KG51bGxzKTsKKyAKKyAJLyoKKyAJICogRW1pdCBzb21lIGludGVyZXN0aW5nIHJlbGF0aW9u IGluZm8KKyAJICovCisgCWVyZXBvcnQoZWxldmVsLAorIAkJCShlcnJtc2coIlwiJXNcIjog c2Nhbm5lZCwgIgorIAkJCQkJIiVkIHJvd3MgaW4gc2FtcGxlLCAlZCB0b3RhbCByb3dzIiwK KyAJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCksIG51bXJvd3MsIChpbnQp ICp0b3RhbHJvd3MpKSk7CisgCisgCXJldHVybiBudW1yb3dzOworIH0KKioqIGEvY29udHJp Yi9maWxlX2Zkdy9pbnB1dC9maWxlX2Zkdy5zb3VyY2UKLS0tIGIvY29udHJpYi9maWxlX2Zk dy9pbnB1dC9maWxlX2Zkdy5zb3VyY2UKKioqKioqKioqKioqKioqCioqKiAxMTEsMTE2ICoq KiogRVhFQ1VURSBzdCgxMDApOwotLS0gMTExLDEyMSAtLS0tCiAgRVhFQ1VURSBzdCgxMDAp OwogIERFQUxMT0NBVEUgc3Q7CiAgCisgLS0gc3RhdGlzdGljcyBjb2xsZWN0aW9uIHRlc3Rz CisgQU5BTFlaRSBhZ2dfY3N2OworIFNFTEVDVCByZWxwYWdlcywgcmVsdHVwbGVzIEZST00g cGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9ICdhZ2dfY3N2JzsKKyBTRUxFQ1QgKiBGUk9NIHBn X3N0YXRzIFdIRVJFIHRhYmxlbmFtZSA9ICdhZ2dfY3N2JzsKKyAKICAtLSB0YWJsZW9pZAog IFNFTEVDVCB0YWJsZW9pZDo6cmVnY2xhc3MsIGIgRlJPTSBhZ2dfY3N2OwogIAoqKiogYS9j b250cmliL2ZpbGVfZmR3L291dHB1dC9maWxlX2Zkdy5zb3VyY2UKLS0tIGIvY29udHJpYi9m aWxlX2Zkdy9vdXRwdXQvZmlsZV9mZHcuc291cmNlCioqKioqKioqKioqKioqKgoqKiogMTc0 LDE3OSAqKioqIEVYRUNVVEUgc3QoMTAwKTsKLS0tIDE3NCwxOTQgLS0tLQogICgxIHJvdykK ICAKICBERUFMTE9DQVRFIHN0OworIC0tIHN0YXRpc3RpY3MgY29sbGVjdGlvbiB0ZXN0cwor IEFOQUxZWkUgYWdnX2NzdjsKKyBTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxlcyBGUk9NIHBn X2NsYXNzIFdIRVJFIHJlbG5hbWUgPSAnYWdnX2Nzdic7CisgIHJlbHBhZ2VzIHwgcmVsdHVw bGVzIAorIC0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgICAgICAgIDEgfCAgICAgICAgIDMK KyAoMSByb3cpCisgCisgU0VMRUNUICogRlJPTSBwZ19zdGF0cyBXSEVSRSB0YWJsZW5hbWUg PSAnYWdnX2Nzdic7CisgIHNjaGVtYW5hbWUgfCB0YWJsZW5hbWUgfCBhdHRuYW1lIHwgaW5o ZXJpdGVkIHwgbnVsbF9mcmFjIHwgYXZnX3dpZHRoIHwgbl9kaXN0aW5jdCB8IG1vc3RfY29t bW9uX3ZhbHMgfCBtb3N0X2NvbW1vbl9mcmVxcyB8ICAgIGhpc3RvZ3JhbV9ib3VuZHMgICAg IHwgY29ycmVsYXRpb24gCisgLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSst LS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tCisgIHB1YmxpYyAgICAgfCBhZ2dfY3N2ICAgfCBhICAgICAg IHwgZiAgICAgICAgIHwgICAgICAgICAwIHwgICAgICAgICAyIHwgICAgICAgICAtMSB8ICAg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IHswLDQyLDEwMH0gICAgICAg ICAgICAgIHwgICAgICAgIC0wLjUKKyAgcHVibGljICAgICB8IGFnZ19jc3YgICB8IGIgICAg ICAgfCBmICAgICAgICAgfCAgICAgICAgIDAgfCAgICAgICAgIDQgfCAgICAgICAgIC0xIHwg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgezAuMDk1NjEsOTkuMDk3 LDMyNC43OH0gfCAgICAgICAgIDAuNQorICgyIHJvd3MpCisgCiAgLS0gdGFibGVvaWQKICBT RUxFQ1QgdGFibGVvaWQ6OnJlZ2NsYXNzLCBiIEZST00gYWdnX2NzdjsKICAgdGFibGVvaWQg fCAgICBiICAgIAoqKiogYS9kb2Mvc3JjL3NnbWwvZmR3aGFuZGxlci5zZ21sCi0tLSBiL2Rv Yy9zcmMvc2dtbC9mZHdoYW5kbGVyLnNnbWwKKioqKioqKioqKioqKioqCioqKiAyMjgsMjMz ICoqKiogRW5kRm9yZWlnblNjYW4gKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpOwotLS0gMjI4 LDI0NiAtLS0tCiAgICAgIDwvcGFyYT4KICAKICAgICAgPHBhcmE+CisgPHByb2dyYW1saXN0 aW5nPgorIHZvaWQKKyBBbmFseXplRm9yZWlnblRhYmxlIChSZWxhdGlvbiBvbmVyZWwsCisg ICAgICAgICAgICAgICAgICAgICAgVmFjdXVtU3RtdCAqdmFjc3RtdCwgCisgICAgICAgICAg ICAgICAgICAgICAgaW50IGVsZXZlbCk7CisgPC9wcm9ncmFtbGlzdGluZz4KKyAKKyAgICAg IENvbGxlY3Qgc3RhdGlzdGljcyBvbiBhIGZvcmVpZ24gdGFibGUgYW5kIHN0b3JlIHRoZSBy ZXN1bHRzIGluIHRoZQorICAgICAgcGdfY2xhc3MgYW5kIHBnX3N0YXRpc3RpY3Mgc3lzdGVt IGNhdGFsb2dzLgorICAgICAgVGhpcyBpcyBjYWxsZWQgd2hlbiA8Y29tbWFuZD5BTkFMWVpF PC8+IGNvbW1hbmQgaXMgcnVuLgorICAgICA8L3BhcmE+CisgCisgICAgIDxwYXJhPgogICAg ICAgVGhlIDxzdHJ1Y3RuYW1lPkZkd1JvdXRpbmU8Lz4gYW5kIDxzdHJ1Y3RuYW1lPkZkd1Bs YW48Lz4gc3RydWN0IHR5cGVzCiAgICAgICBhcmUgZGVjbGFyZWQgaW4gPGZpbGVuYW1lPnNy Yy9pbmNsdWRlL2ZvcmVpZ24vZmR3YXBpLmg8Lz4sIHdoaWNoIHNlZQogICAgICAgZm9yIGFk ZGl0aW9uYWwgZGV0YWlscy4KKioqIGEvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwK LS0tIGIvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwKKioqKioqKioqKioqKioqCioq KiAyNzksMjg0ICoqKioKLS0tIDI3OSwyODggLS0tLQogICAgICA8Y29tbWFuZD5BTkFMWVpF PC8+IHN0cmljdGx5IGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiByb3dzCiAgICAg IGluc2VydGVkIG9yIHVwZGF0ZWQ7IGl0IGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hldGhlciB0 aGF0IHdpbGwgbGVhZAogICAgICB0byBtZWFuaW5nZnVsIHN0YXRpc3RpY2FsIGNoYW5nZXMu CisgICAgIE5vdGUgdGhhdCB0aGUgYXV0b3ZhY3V1bSBkYWVtb24gZG9lcyBub3QgaXNzdWUg PGNvbW1hbmQ+QU5BTFlaRTwvPgorICAgICBjb21tYW5kcyBvbiBmb3JlaWduIHRhYmxlcy4g IEl0IGlzIHJlY29tbWVuZGVkIHRvIHJ1biBtYW51YWxseS1tYW5hZ2VkCisgICAgIDxjb21t YW5kPkFOQUxZWkU8Lz4gY29tbWFuZHMgYXMgbmVlZGVkLCB3aGljaCB0eXBpY2FsbHkgYXJl IGV4ZWN1dGVkCisgICAgIGFjY29yZGluZyB0byBhIHNjaGVkdWxlIGJ5IGNyb24gb3IgVGFz ayBTY2hlZHVsZXIgc2NyaXB0cy4KICAgICA8L3BhcmE+CiAgCiAgICAgPHBhcmE+CioqKiBh L2RvYy9zcmMvc2dtbC9yZWYvYWx0ZXJfZm9yZWlnbl90YWJsZS5zZ21sCi0tLSBiL2RvYy9z cmMvc2dtbC9yZWYvYWx0ZXJfZm9yZWlnbl90YWJsZS5zZ21sCioqKioqKioqKioqKioqKgoq KiogMzYsNDEgKioqKiBBTFRFUiBGT1JFSUdOIFRBQkxFIDxyZXBsYWNlYWJsZSBjbGFzcz0i UEFSQU1FVEVSIj5uYW1lPC9yZXBsYWNlYWJsZT4KLS0tIDM2LDQ0IC0tLS0KICAgICAgRFJP UCBbIENPTFVNTiBdIFsgSUYgRVhJU1RTIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVU RVIiPmNvbHVtbjwvcmVwbGFjZWFibGU+IFsgUkVTVFJJQ1QgfCBDQVNDQURFIF0KICAgICAg QUxURVIgWyBDT0xVTU4gXSA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+Y29sdW1u PC9yZXBsYWNlYWJsZT4gWyBTRVQgREFUQSBdIFRZUEUgPHJlcGxhY2VhYmxlIGNsYXNzPSJQ QVJBTUVURVIiPnR5cGU8L3JlcGxhY2VhYmxlPgogICAgICBBTFRFUiBbIENPTFVNTiBdIDxy ZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiB7IFNF VCB8IERST1AgfSBOT1QgTlVMTAorICAgICBBTFRFUiBbIENPTFVNTiBdIDxyZXBsYWNlYWJs ZSBjbGFzcz0iUEFSQU1FVEVSIj5jb2x1bW48L3JlcGxhY2VhYmxlPiBTRVQgU1RBVElTVElD UyA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+aW50ZWdlcjwvcmVwbGFjZWFibGU+ CisgICAgIEFMVEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIi PmNvbHVtbjwvcmVwbGFjZWFibGU+IFNFVCAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1F VEVSIj5hdHRyaWJ1dGVfb3B0aW9uPC9yZXBsYWNlYWJsZT4gPSA8cmVwbGFjZWFibGUgY2xh c3M9IlBBUkFNRVRFUiI+dmFsdWU8L3JlcGxhY2VhYmxlPiBbLCAuLi4gXSApCisgICAgIEFM VEVSIFsgQ09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwv cmVwbGFjZWFibGU+IFJFU0VUICggPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0 dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiBbLCAuLi4gXSApCiAgICAgIEFMVEVSIFsg Q09MVU1OIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPmNvbHVtbjwvcmVwbGFj ZWFibGU+IE9QVElPTlMgKCBbIEFERCB8IFNFVCB8IERST1AgXSA8cmVwbGFjZWFibGUgY2xh c3M9IlBBUkFNRVRFUiI+b3B0aW9uPC9yZXBsYWNlYWJsZT4gWyc8cmVwbGFjZWFibGUgY2xh c3M9IlBBUkFNRVRFUiI+dmFsdWU8L3JlcGxhY2VhYmxlPiddIFssIC4uLiBdKQogICAgICBP V05FUiBUTyA8cmVwbGFjZWFibGUgY2xhc3M9IlBBUkFNRVRFUiI+bmV3X293bmVyPC9yZXBs YWNlYWJsZT4KICAgICAgT1BUSU9OUyAoIFsgQUREIHwgU0VUIHwgRFJPUCBdIDxyZXBsYWNl YWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5vcHRpb248L3JlcGxhY2VhYmxlPiBbJzxyZXBsYWNl YWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFibGU+J10gWywgLi4uIF0p CioqKioqKioqKioqKioqKgoqKiogOTQsOTkgKioqKiBBTFRFUiBGT1JFSUdOIFRBQkxFIDxy ZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5uYW1lPC9yZXBsYWNlYWJsZT4KLS0tIDk3 LDE0NiAtLS0tCiAgICAgPC92YXJsaXN0ZW50cnk+CiAgCiAgICAgPHZhcmxpc3RlbnRyeT4K KyAgICAgPHRlcm0+PGxpdGVyYWw+U0VUIFNUQVRJU1RJQ1M8L2xpdGVyYWw+PC90ZXJtPgor ICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBUaGlzIGZvcm0KKyAgICAg ICBzZXRzIHRoZSBwZXItY29sdW1uIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHRhcmdldCBmb3Ig c3Vic2VxdWVudAorICAgICAgIDx4cmVmIGxpbmtlbmQ9InNxbC1hbmFseXplIj4gb3BlcmF0 aW9ucy4KKyAgICAgICBUaGUgdGFyZ2V0IGNhbiBiZSBzZXQgaW4gdGhlIHJhbmdlIDAgdG8g MTAwMDA7IGFsdGVybmF0aXZlbHksIHNldCBpdAorICAgICAgIHRvIC0xIHRvIHJldmVydCB0 byB1c2luZyB0aGUgc3lzdGVtIGRlZmF1bHQgc3RhdGlzdGljcworICAgICAgIHRhcmdldCAo PHhyZWYgbGlua2VuZD0iZ3VjLWRlZmF1bHQtc3RhdGlzdGljcy10YXJnZXQiPikuCisgICAg ICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgCisg ICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PGxpdGVyYWw+U0VUICggPHJlcGxhY2Vh YmxlIGNsYXNzPSJQQVJBTUVURVIiPmF0dHJpYnV0ZV9vcHRpb248L3JlcGxhY2VhYmxlPiA9 IDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj52YWx1ZTwvcmVwbGFjZWFibGU+IFss IC4uLiBdICk8L2xpdGVyYWw+PC90ZXJtPgorICAgICA8dGVybT48bGl0ZXJhbD5SRVNFVCAo IDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj5hdHRyaWJ1dGVfb3B0aW9uPC9yZXBs YWNlYWJsZT4gWywgLi4uIF0gKTwvbGl0ZXJhbD48L3Rlcm0+CisgICAgIDxsaXN0aXRlbT4K KyAgICAgIDxwYXJhPgorICAgICAgIFRoaXMgZm9ybQorICAgICAgIHNldHMgb3IgcmVzZXRz IGEgcGVyLWF0dHJpYnV0ZSBvcHRpb24uICBDdXJyZW50bHksIHRoZSBvbmx5IGRlZmluZWQK KyAgICAgICBwZXItYXR0cmlidXRlIG9wdGlvbiBpcyA8bGl0ZXJhbD5uX2Rpc3RpbmN0PC8+ LCB3aGljaCBvdmVycmlkZXMKKyAgICAgICB0aGUgbnVtYmVyLW9mLWRpc3RpbmN0LXZhbHVl cyBlc3RpbWF0ZXMgbWFkZSBieSBzdWJzZXF1ZW50CisgICAgICAgPHhyZWYgbGlua2VuZD0i c3FsLWFuYWx5emUiPiBvcGVyYXRpb25zLiAKKyAgICAgICBXaGVuIHNldCB0byBhIHBvc2l0 aXZlIHZhbHVlLCA8Y29tbWFuZD5BTkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQKKyAgICAg ICB0aGUgY29sdW1uIGNvbnRhaW5zIGV4YWN0bHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Yg ZGlzdGluY3Qgbm9ubnVsbAorICAgICAgIHZhbHVlcy4KKyAgICAgICBXaGVuIHNldCB0byBh IG5lZ2F0aXZlIHZhbHVlLCB3aGljaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAor ICAgICAgIHRvIC0xLCA8Y29tbWFuZD5BTkFMWVpFPC8+IHdpbGwgYXNzdW1lIHRoYXQgdGhl IG51bWJlciBvZiBkaXN0aW5jdAorICAgICAgIG5vbm51bGwgdmFsdWVzIGluIHRoZSBjb2x1 bW4gaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBmb3JlaWduCisgICAgICAgdGFibGU7 IHRoZSBleGFjdCBjb3VudCBpcyB0byBiZSBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGUg ZXN0aW1hdGVkCisgICAgICAgZm9yZWlnbiB0YWJsZSBzaXplIGJ5IHRoZSBhYnNvbHV0ZSB2 YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVtYmVyLgorICAgICAgIEZvciBleGFtcGxlLAorICAgICAg IGEgdmFsdWUgb2YgLTEgaW1wbGllcyB0aGF0IGFsbCB2YWx1ZXMgaW4gdGhlIGNvbHVtbiBh cmUgZGlzdGluY3QsCisgICAgICAgd2hpbGUgYSB2YWx1ZSBvZiAtMC41IGltcGxpZXMgdGhh dCBlYWNoIHZhbHVlIGFwcGVhcnMgdHdpY2Ugb24gdGhlCisgICAgICAgYXZlcmFnZS4KKyAg ICAgICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgZm9yZWlnbiB0 YWJsZSBjaGFuZ2VzIG92ZXIKKyAgICAgICB0aW1lLCBzaW5jZSB0aGUgbXVsdGlwbGljYXRp b24gYnkgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBmb3JlaWduCisgICAgICAgdGFibGUg aXMgbm90IHBlcmZvcm1lZCB1bnRpbCBxdWVyeSBwbGFubmluZyB0aW1lLiAgU3BlY2lmeSBh IHZhbHVlCisgICAgICAgb2YgMCB0byByZXZlcnQgdG8gZXN0aW1hdGluZyB0aGUgbnVtYmVy IG9mIGRpc3RpbmN0IHZhbHVlcyBub3JtYWxseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9s aXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5Pgog ICAgICA8dGVybT48bGl0ZXJhbD5PV05FUjwvbGl0ZXJhbD48L3Rlcm0+CiAgICAgIDxsaXN0 aXRlbT4KICAgICAgIDxwYXJhPgoqKiogYS9kb2Mvc3JjL3NnbWwvcmVmL2FuYWx5emUuc2dt bAotLS0gYi9kb2Mvc3JjL3NnbWwvcmVmL2FuYWx5emUuc2dtbAoqKioqKioqKioqKioqKioK KioqIDM5LDQ3ICoqKiogQU5BTFlaRSBbIFZFUkJPU0UgXSBbIDxyZXBsYWNlYWJsZSBjbGFz cz0iUEFSQU1FVEVSIj50YWJsZTwvcmVwbGFjZWFibGU+IFsgKCA8cmUKICAKICAgIDxwYXJh PgogICAgIFdpdGggbm8gcGFyYW1ldGVyLCA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiBl eGFtaW5lcyBldmVyeSB0YWJsZSBpbiB0aGUKISAgICBjdXJyZW50IGRhdGFiYXNlLiAgV2l0 aCBhIHBhcmFtZXRlciwgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4gZXhhbWluZXMKISAg ICBvbmx5IHRoYXQgdGFibGUuICBJdCBpcyBmdXJ0aGVyIHBvc3NpYmxlIHRvIGdpdmUgYSBs aXN0IG9mIGNvbHVtbiBuYW1lcywKISAgICBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIHN0YXRp c3RpY3MgZm9yIHRob3NlIGNvbHVtbnMgYXJlIGNvbGxlY3RlZC4KICAgIDwvcGFyYT4KICAg PC9yZWZzZWN0MT4KICAKLS0tIDM5LDQ5IC0tLS0KICAKICAgIDxwYXJhPgogICAgIFdpdGgg bm8gcGFyYW1ldGVyLCA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiBleGFtaW5lcyBldmVy eSB0YWJsZSBpbiB0aGUKISAgICBjdXJyZW50IGRhdGFiYXNlIGV4Y2VwdCBmb3IgZm9yZWln biB0YWJsZXMuICBXaXRoIGEgcGFyYW1ldGVyLCA8Y29tbWFuZD4KISAgICBBTkFMWVpFPC9j b21tYW5kPiBleGFtaW5lcyBvbmx5IHRoYXQgdGFibGUuICBGb3IgYSBmb3JlaWduIHRhYmxl LCBpdCBpcwohICAgIG5lY2Vzc2FyeSB0byBzcGNpZnkgdGhlIG5hbWUgb2YgdGhhdCB0YWJs ZS4gIEl0IGlzIGZ1cnRoZXIgcG9zc2libGUgdG8gCiEgICAgZ2l2ZSBhIGxpc3Qgb2YgY29s dW1uIG5hbWVzLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIHN0YXRpc3RpY3MgZm9yIHRob3Nl CiEgICAgY29sdW1ucyBhcmUgY29sbGVjdGVkLgogICAgPC9wYXJhPgogICA8L3JlZnNlY3Qx PgogIAoqKioqKioqKioqKioqKioKKioqIDYzLDY5ICoqKiogQU5BTFlaRSBbIFZFUkJPU0Ug XSBbIDxyZXBsYWNlYWJsZSBjbGFzcz0iUEFSQU1FVEVSIj50YWJsZTwvcmVwbGFjZWFibGU+ IFsgKCA8cmUKICAgICAgPGxpc3RpdGVtPgogICAgICAgPHBhcmE+CiAgICAgICAgVGhlIG5h bWUgKHBvc3NpYmx5IHNjaGVtYS1xdWFsaWZpZWQpIG9mIGEgc3BlY2lmaWMgdGFibGUgdG8K ISAgICAgICBhbmFseXplLiBEZWZhdWx0cyB0byBhbGwgdGFibGVzIGluIHRoZSBjdXJyZW50 IGRhdGFiYXNlLgogICAgICAgPC9wYXJhPgogICAgICA8L2xpc3RpdGVtPgogICAgIDwvdmFy bGlzdGVudHJ5PgotLS0gNjUsNzIgLS0tLQogICAgICA8bGlzdGl0ZW0+CiAgICAgICA8cGFy YT4KICAgICAgICBUaGUgbmFtZSAocG9zc2libHkgc2NoZW1hLXF1YWxpZmllZCkgb2YgYSBz cGVjaWZpYyB0YWJsZSB0bwohICAgICAgIGFuYWx5emUuIERlZmF1bHRzIHRvIGFsbCB0YWJs ZXMgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UgZXhjZXB0CiEgICAgICAgZm9yIGZvcmVpZ24g dGFibGVzLgogICAgICAgPC9wYXJhPgogICAgICA8L2xpc3RpdGVtPgogICAgIDwvdmFybGlz dGVudHJ5PgoqKioqKioqKioqKioqKioKKioqIDEzNywxNDMgKioqKiBBTkFMWVpFIFsgVkVS Qk9TRSBdIFsgPHJlcGxhY2VhYmxlIGNsYXNzPSJQQVJBTUVURVIiPnRhYmxlPC9yZXBsYWNl YWJsZT4gWyAoIDxyZQogICAgIEluIHJhcmUgc2l0dWF0aW9ucywgdGhpcyBub24tZGV0ZXJt aW5pc20gd2lsbCBjYXVzZSB0aGUgcGxhbm5lcidzCiAgICAgY2hvaWNlcyBvZiBxdWVyeSBw bGFucyB0byBjaGFuZ2UgYWZ0ZXIgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4gaXMgcnVu LgogICAgIFRvIGF2b2lkIHRoaXMsIHJhaXNlIHRoZSBhbW91bnQgb2Ygc3RhdGlzdGljcyBj b2xsZWN0ZWQgYnkKISAgICA8Y29tbWFuZD5BTkFMWVpFPC9jb21tYW5kPiwgYXMgZGVzY3Jp YmVkIGJlbG93LgogICAgPC9wYXJhPgogIAogICAgPHBhcmE+Ci0tLSAxNDAsMTQ4IC0tLS0K ICAgICBJbiByYXJlIHNpdHVhdGlvbnMsIHRoaXMgbm9uLWRldGVybWluaXNtIHdpbGwgY2F1 c2UgdGhlIHBsYW5uZXIncwogICAgIGNob2ljZXMgb2YgcXVlcnkgcGxhbnMgdG8gY2hhbmdl IGFmdGVyIDxjb21tYW5kPkFOQUxZWkU8L2NvbW1hbmQ+IGlzIHJ1bi4KICAgICBUbyBhdm9p ZCB0aGlzLCByYWlzZSB0aGUgYW1vdW50IG9mIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5CiEg ICAgPGNvbW1hbmQ+QU5BTFlaRTwvY29tbWFuZD4sIGFzIGRlc2NyaWJlZCBiZWxvdy4gIE5v dGUgdGhhdCB0aGUgdGltZQohICAgIG5lZWRlZCB0byBhbmFseXplIG9uIGZvcmVpZ24gdGFi bGVzIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mCiEgICAgdGhlIGZvcmVpZ24g ZGF0YSB3cmFwcGVyIHZpYSB3aGljaCBzdWNoIHRhYmxlcyBhcmUgYXR0YWNoZWQuCiAgICA8 L3BhcmE+CiAgCiAgICA8cGFyYT4KKioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6 ZS5jCi0tLSBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwoqKioqKioqKioqKioq KioKKioqIDIzLDI4ICoqKioKLS0tIDIzLDI5IC0tLS0KICAjaW5jbHVkZSAiYWNjZXNzL3hh Y3QuaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleC5oIgogICNpbmNsdWRlICJjYXRhbG9n L2luZGV4aW5nLmgiCisgI2luY2x1ZGUgImNhdGFsb2cvcGdfY2xhc3MuaCIKICAjaW5jbHVk ZSAiY2F0YWxvZy9wZ19jb2xsYXRpb24uaCIKICAjaW5jbHVkZSAiY2F0YWxvZy9wZ19pbmhl cml0c19mbi5oIgogICNpbmNsdWRlICJjYXRhbG9nL3BnX25hbWVzcGFjZS5oIgoqKioqKioq KioqKioqKioKKioqIDMwLDM1ICoqKioKLS0tIDMxLDM4IC0tLS0KICAjaW5jbHVkZSAiY29t bWFuZHMvdGFibGVjbWRzLmgiCiAgI2luY2x1ZGUgImNvbW1hbmRzL3ZhY3V1bS5oIgogICNp bmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgorICNpbmNsdWRlICJmb3JlaWduL2ZvcmVp Z24uaCIKKyAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICAjaW5jbHVkZSAibWlzY2Fk bWluLmgiCiAgI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogICNpbmNsdWRlICJwYXJz ZXIvcGFyc2Vfb3Blci5oIgoqKioqKioqKioqKioqKioKKioqIDc4LDkxICoqKiogdHlwZWRl ZiBzdHJ1Y3QgQW5sSW5kZXhEYXRhCiAgaW50CQkJZGVmYXVsdF9zdGF0aXN0aWNzX3Rhcmdl dCA9IDEwMDsKICAKICAvKiBBIGZldyB2YXJpYWJsZXMgdGhhdCBkb24ndCBzZWVtIHdvcnRo IHBhc3NpbmcgYXJvdW5kIGFzIHBhcmFtZXRlcnMgKi8KLSBzdGF0aWMgaW50CWVsZXZlbCA9 IC0xOwotIAogIHN0YXRpYyBNZW1vcnlDb250ZXh0IGFubF9jb250ZXh0ID0gTlVMTDsKICAK ICBzdGF0aWMgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgdmFjX3N0cmF0ZWd5OwogIAogIAotIHN0 YXRpYyB2b2lkIGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAq dmFjc3RtdCwgYm9vbCBpbmgpOwogIHN0YXRpYyB2b2lkIEJsb2NrU2FtcGxlcl9Jbml0KEJs b2NrU2FtcGxlciBicywgQmxvY2tOdW1iZXIgbmJsb2NrcywKICAJCQkJICBpbnQgc2FtcGxl c2l6ZSk7CiAgc3RhdGljIGJvb2wgQmxvY2tTYW1wbGVyX0hhc01vcmUoQmxvY2tTYW1wbGVy IGJzKTsKLS0tIDgxLDkxIC0tLS0KKioqKioqKioqKioqKioqCioqKiA5NiwxMTAgKioqKiBz dGF0aWMgdm9pZCBjb21wdXRlX2luZGV4X3N0YXRzKFJlbGF0aW9uIG9uZXJlbCwgZG91Ymxl IHRvdGFscm93cywKICAJCQkJCU1lbW9yeUNvbnRleHQgY29sX2NvbnRleHQpOwogIHN0YXRp YyBWYWNBdHRyU3RhdHMgKmV4YW1pbmVfYXR0cmlidXRlKFJlbGF0aW9uIG9uZXJlbCwgaW50 IGF0dG51bSwKICAJCQkJICBOb2RlICppbmRleF9leHByKTsKISBzdGF0aWMgaW50IGFjcXVp cmVfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsCiEgCQkJ CQlpbnQgdGFyZ3Jvd3MsIGRvdWJsZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJv d3MpOwohIHN0YXRpYyBkb3VibGUgcmFuZG9tX2ZyYWN0KHZvaWQpOwohIHN0YXRpYyBkb3Vi bGUgaW5pdF9zZWxlY3Rpb25fc3RhdGUoaW50IG4pOwohIHN0YXRpYyBkb3VibGUgZ2V0X25l eHRfUyhkb3VibGUgdCwgaW50IG4sIGRvdWJsZSAqc3RhdGVwdHIpOwohIHN0YXRpYyBpbnQJ Y29tcGFyZV9yb3dzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogIHN0YXRpYyBp bnQgYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jvd3MoUmVsYXRpb24gb25lcmVsLAogIAkJ CQkJCQkgIEhlYXBUdXBsZSAqcm93cywgaW50IHRhcmdyb3dzLAohIAkJCQkJCQkgIGRvdWJs ZSAqdG90YWxyb3dzLCBkb3VibGUgKnRvdGFsZGVhZHJvd3MpOwogIHN0YXRpYyB2b2lkIHVw ZGF0ZV9hdHRzdGF0cyhPaWQgcmVsaWQsIGJvb2wgaW5oLAogIAkJCQlpbnQgbmF0dHMsIFZh Y0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cyk7CiAgc3RhdGljIERhdHVtIHN0ZF9mZXRjaF9m dW5jKFZhY0F0dHJTdGF0c1Agc3RhdHMsIGludCByb3dudW0sIGJvb2wgKmlzTnVsbCk7Ci0t LSA5NiwxMDkgLS0tLQogIAkJCQkJTWVtb3J5Q29udGV4dCBjb2xfY29udGV4dCk7CiAgc3Rh dGljIFZhY0F0dHJTdGF0cyAqZXhhbWluZV9hdHRyaWJ1dGUoUmVsYXRpb24gb25lcmVsLCBp bnQgYXR0bnVtLAogIAkJCQkgIE5vZGUgKmluZGV4X2V4cHIpOwohIHN0YXRpYyBpbnQgYWNx dWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsCiEgCQkJCQkJCSAgIEhlYXBUdXBs ZSAqcm93cywgaW50IHRhcmdyb3dzLAohIAkJCQkJCQkgICBkb3VibGUgKnRvdGFscm93cywg ZG91YmxlICp0b3RhbGRlYWRyb3dzLAohIAkJCQkJCQkgICBCbG9ja051bWJlciAqdG90YWxw YWdlcywgaW50IGVsZXZlbCk7CiAgc3RhdGljIGludCBhY3F1aXJlX2luaGVyaXRlZF9zYW1w bGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsCiAgCQkJCQkJCSAgSGVhcFR1cGxlICpyb3dzLCBp bnQgdGFyZ3Jvd3MsCiEgCQkJCQkJCSAgZG91YmxlICp0b3RhbHJvd3MsIGRvdWJsZSAqdG90 YWxkZWFkcm93cywKISAJCQkJCQkJICBCbG9ja051bWJlciAqdG90YWxwYWdlcywgaW50IGVs ZXZlbCk7CiAgc3RhdGljIHZvaWQgdXBkYXRlX2F0dHN0YXRzKE9pZCByZWxpZCwgYm9vbCBp bmgsCiAgCQkJCWludCBuYXR0cywgVmFjQXR0clN0YXRzICoqdmFjYXR0cnN0YXRzKTsKICBz dGF0aWMgRGF0dW0gc3RkX2ZldGNoX2Z1bmMoVmFjQXR0clN0YXRzUCBzdGF0cywgaW50IHJv d251bSwgYm9vbCAqaXNOdWxsKTsKKioqKioqKioqKioqKioqCioqKiAxMTksMTI1ICoqKiog c3RhdGljIGJvb2wgc3RkX3R5cGFuYWx5emUoVmFjQXR0clN0YXRzICpzdGF0cyk7Ci0tLSAx MTgsMTI2IC0tLS0KICB2b2lkCiAgYW5hbHl6ZV9yZWwoT2lkIHJlbGlkLCBWYWN1dW1TdG10 ICp2YWNzdG10LCBCdWZmZXJBY2Nlc3NTdHJhdGVneSBic3RyYXRlZ3kpCiAgeworIAlpbnQJ CQllbGV2ZWw7CiAgCVJlbGF0aW9uCW9uZXJlbDsKKyAJRmR3Um91dGluZSAqZmR3cm91dGlu ZTsKICAKICAJLyogU2V0IHVwIHN0YXRpYyB2YXJpYWJsZXMgKi8KICAJaWYgKHZhY3N0bXQt Pm9wdGlvbnMgJiBWQUNPUFRfVkVSQk9TRSkKKioqKioqKioqKioqKioqCioqKiAxODQsMTkz ICoqKiogYW5hbHl6ZV9yZWwoT2lkIHJlbGlkLCBWYWN1dW1TdG10ICp2YWNzdG10LCBCdWZm ZXJBY2Nlc3NTdHJhdGVneSBic3RyYXRlZ3kpCiAgCX0KICAKICAJLyoKISAJICogQ2hlY2sg dGhhdCBpdCdzIGEgcGxhaW4gdGFibGU7IHdlIHVzZWQgdG8gZG8gdGhpcyBpbiBnZXRfcmVs X29pZHMoKSBidXQKICAJICogc2VlbXMgc2FmZXIgdG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9j a2VkIHRoZSByZWxhdGlvbi4KICAJICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2lu ZCAhPSBSRUxLSU5EX1JFTEFUSU9OKQogIAl7CiAgCQkvKiBObyBuZWVkIGZvciBhIFdBUk5J TkcgaWYgd2UgYWxyZWFkeSBjb21wbGFpbmVkIGR1cmluZyBWQUNVVU0gKi8KICAJCWlmICgh KHZhY3N0bXQtPm9wdGlvbnMgJiBWQUNPUFRfVkFDVVVNKSkKLS0tIDE4NSwxOTUgLS0tLQog IAl9CiAgCiAgCS8qCiEgCSAqIENoZWNrIHRoYXQgaXQncyBhIHBsYWluIHRhYmxlIG9yIGZv cmVpZ24gdGFibGU7IHdlIHVzZWQgdG8gZG8gdGhpcyBpbiBnZXRfcmVsX29pZHMoKSBidXQK ICAJICogc2VlbXMgc2FmZXIgdG8gY2hlY2sgYWZ0ZXIgd2UndmUgbG9ja2VkIHRoZSByZWxh dGlvbi4KICAJICovCiEgCWlmIChvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5E X1JFTEFUSU9OICYmCiEgCQlvbmVyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX0ZP UkVJR05fVEFCTEUpCiAgCXsKICAJCS8qIE5vIG5lZWQgZm9yIGEgV0FSTklORyBpZiB3ZSBh bHJlYWR5IGNvbXBsYWluZWQgZHVyaW5nIFZBQ1VVTSAqLwogIAkJaWYgKCEodmFjc3RtdC0+ b3B0aW9ucyAmIFZBQ09QVF9WQUNVVU0pKQoqKioqKioqKioqKioqKioKKioqIDIxMiwyMTcg KioqKiBhbmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZl ckFjY2Vzc1N0cmF0ZWd5IGJzdHJhdGVneSkKLS0tIDIxNCwyMjEgLS0tLQogIAogIAkvKgog IAkgKiBXZSBjYW4gQU5BTFlaRSBhbnkgdGFibGUgZXhjZXB0IHBnX3N0YXRpc3RpYy4gU2Vl IHVwZGF0ZV9hdHRzdGF0cworIAkgKiBXZSBjYW4gQU5BTFlaRSBmb3JlaWduIHRhYmxlcyBp ZiB0aGUgdW5kZXJseWluZyBmb3JlaWduLWRhdGEgd3JhcHBlcnMKKyAJICogaGF2ZSB0aGVp ciBBbmFseXplRm9yZWlnblRhYmxlIGNhbGxiYWNrIHJvdXRpbmVzLgogIAkgKi8KICAJaWYg KFJlbGF0aW9uR2V0UmVsaWQob25lcmVsKSA9PSBTdGF0aXN0aWNSZWxhdGlvbklkKQogIAl7 CioqKioqKioqKioqKioqKgoqKiogMjE5LDIyNCAqKioqIGFuYWx5emVfcmVsKE9pZCByZWxp ZCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5 KQotLS0gMjIzLDI0MiAtLS0tCiAgCQlyZXR1cm47CiAgCX0KICAKKyAJaWYgKG9uZXJlbC0+ cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKKyAJeworICAJCWZk d3JvdXRpbmUgPSBHZXRGZHdSb3V0aW5lQnlSZWxJZChSZWxhdGlvbkdldFJlbGlkKG9uZXJl bCkpOworIAorIAkJaWYgKGZkd3JvdXRpbmUtPkFuYWx5emVGb3JlaWduVGFibGUgPT0gTlVM TCkKKyAJCXsKKyAJCQllcmVwb3J0KFdBUk5JTkcsCisgCQkJCQkoZXJybXNnKCJza2lwcGlu ZyBcIiVzXCIgLS0tIHVuZGVybHlpbmcgZm9yZWlnbi1kYXRhIHdyYXBwZXIgY2Fubm90IGFu YWx5emUgaXQiLAorIAkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVyZWwpKSkp OworIAkJCXJlbGF0aW9uX2Nsb3NlKG9uZXJlbCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2Nr KTsKKyAJCQlyZXR1cm47CisgCQl9CisgCX0KKyAKICAJLyoKICAJICogT0ssIGxldCdzIGRv IGl0LiAgRmlyc3QgbGV0IG90aGVyIGJhY2tlbmRzIGtub3cgSSdtIGluIEFOQUxZWkUuCiAg CSAqLwoqKioqKioqKioqKioqKioKKioqIDIyNiwyNDEgKioqKiBhbmFseXplX3JlbChPaWQg cmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IGJzdHJh dGVneSkKICAJTXlQcm9jLT52YWN1dW1GbGFncyB8PSBQUk9DX0lOX0FOQUxZWkU7CiAgCUxX TG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7CiAgCiEgCS8qCiEgCSAqIERvIHRoZSBub3Jt YWwgbm9uLXJlY3Vyc2l2ZSBBTkFMWVpFLgohIAkgKi8KISAJZG9fYW5hbHl6ZV9yZWwob25l cmVsLCB2YWNzdG10LCBmYWxzZSk7CiAgCiEgCS8qCiEgCSAqIElmIHRoZXJlIGFyZSBjaGls ZCB0YWJsZXMsIGRvIHJlY3Vyc2l2ZSBBTkFMWVpFLgohIAkgKi8KISAJaWYgKG9uZXJlbC0+ cmRfcmVsLT5yZWxoYXNzdWJjbGFzcykKISAJCWRvX2FuYWx5emVfcmVsKG9uZXJlbCwgdmFj c3RtdCwgdHJ1ZSk7CiAgCiAgCS8qCiAgCSAqIENsb3NlIHNvdXJjZSByZWxhdGlvbiBub3cs IGJ1dCBrZWVwIGxvY2sgc28gdGhhdCBubyBvbmUgZGVsZXRlcyBpdAotLS0gMjQ0LDI4MCAt LS0tCiAgCU15UHJvYy0+dmFjdXVtRmxhZ3MgfD0gUFJPQ19JTl9BTkFMWVpFOwogIAlMV0xv Y2tSZWxlYXNlKFByb2NBcnJheUxvY2spOwogIAohIAlpZiAob25lcmVsLT5yZF9yZWwtPnJl bGtpbmQgPT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQohIAl7CiEgCQllcmVwb3J0KGVsZXZl bCwKISAJCQkJKGVycm1zZygiYW5hbHl6aW5nIFwiJXMuJXNcIiIsCiEgCQkJCQkJZ2V0X25h bWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKG9uZXJlbCkpLAohIAkJCQkJCVJl bGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7CiEgCQlmZHdyb3V0aW5lLT5BbmFs eXplRm9yZWlnblRhYmxlKG9uZXJlbCwgdmFjc3RtdCwgZWxldmVsKTsKISAJfQohIAllbHNl CiEgCXsKISAJCS8qCiEgCQkgKiBEbyB0aGUgbm9ybWFsIG5vbi1yZWN1cnNpdmUgQU5BTFla RS4KISAJCSAqLwohIAkJZXJlcG9ydChlbGV2ZWwsCiEgCQkJCShlcnJtc2coImFuYWx5emlu ZyBcIiVzLiVzXCIiLAohIAkJCQkJCWdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5h bWVzcGFjZShvbmVyZWwpKSwKISAJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShvbmVy ZWwpKSkpOwohIAkJZG9fYW5hbHl6ZV9yZWwob25lcmVsLCB2YWNzdG10LCBlbGV2ZWwsIGZh bHNlLCBhY3F1aXJlX3NhbXBsZV9yb3dzKTsKICAKISAJCS8qCiEgCQkgKiBJZiB0aGVyZSBh cmUgY2hpbGQgdGFibGVzLCBkbyByZWN1cnNpdmUgQU5BTFlaRS4KISAJCSAqLwohIAkJaWYg KG9uZXJlbC0+cmRfcmVsLT5yZWxoYXNzdWJjbGFzcykKISAJCXsKISAJCQllcmVwb3J0KGVs ZXZlbCwKISAJCQkJCShlcnJtc2coImFuYWx5emluZyBcIiVzLiVzXCIgaW5oZXJpdGFuY2Ug dHJlZSIsCiEgCQkJCQkJCWdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFj ZShvbmVyZWwpKSwKISAJCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkp KTsKISAJCQlkb19hbmFseXplX3JlbChvbmVyZWwsIHZhY3N0bXQsIGVsZXZlbCwgdHJ1ZSwg YWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jvd3MpOwohIAkJfQohIAl9CiAgCiAgCS8qCiAg CSAqIENsb3NlIHNvdXJjZSByZWxhdGlvbiBub3csIGJ1dCBrZWVwIGxvY2sgc28gdGhhdCBu byBvbmUgZGVsZXRlcyBpdAoqKioqKioqKioqKioqKioKKioqIDI1NywyNjQgKioqKiBhbmFs eXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIEJ1ZmZlckFjY2Vzc1N0 cmF0ZWd5IGJzdHJhdGVneSkKICAvKgogICAqCWRvX2FuYWx5emVfcmVsKCkgLS0gYW5hbHl6 ZSBvbmUgcmVsYXRpb24sIHJlY3Vyc2l2ZWx5IG9yIG5vdAogICAqLwohIHN0YXRpYyB2b2lk CiEgZG9fYW5hbHl6ZV9yZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10 LCBib29sIGluaCkKICB7CiAgCWludAkJCWF0dHJfY250LAogIAkJCQl0Y250LAotLS0gMjk2 LDMwNCAtLS0tCiAgLyoKICAgKglkb19hbmFseXplX3JlbCgpIC0tIGFuYWx5emUgb25lIHJl bGF0aW9uLCByZWN1cnNpdmVseSBvciBub3QKICAgKi8KISB2b2lkCiEgZG9fYW5hbHl6ZV9y ZWwoUmVsYXRpb24gb25lcmVsLCBWYWN1dW1TdG10ICp2YWNzdG10LCBpbnQgZWxldmVsLAoh IAkJCSAgIGJvb2wgaW5oLCBpbnQgKCpzYW1wbGVfcm93X2FjcXVpcmVyKSAoKSkKICB7CiAg CWludAkJCWF0dHJfY250LAogIAkJCQl0Y250LAoqKioqKioqKioqKioqKioKKioqIDI3Mywy NzggKioqKiBkb19hbmFseXplX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZh Y3N0bXQsIGJvb2wgaW5oKQotLS0gMzEzLDMxOSAtLS0tCiAgCQkJCW51bXJvd3M7CiAgCWRv dWJsZQkJdG90YWxyb3dzLAogIAkJCQl0b3RhbGRlYWRyb3dzOworIAlCbG9ja051bWJlciB0 b3RhbHBhZ2VzOwogIAlIZWFwVHVwbGUgICpyb3dzOwogIAlQR1JVc2FnZQlydTA7CiAgCVRp bWVzdGFtcFR6IHN0YXJ0dGltZSA9IDA7CioqKioqKioqKioqKioqKgoqKiogMjgxLDI5NyAq KioqIGRvX2FuYWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3Rt dCwgYm9vbCBpbmgpCiAgCWludAkJCXNhdmVfc2VjX2NvbnRleHQ7CiAgCWludAkJCXNhdmVf bmVzdGxldmVsOwogIAotIAlpZiAoaW5oKQotIAkJZXJlcG9ydChlbGV2ZWwsCi0gCQkJCShl cnJtc2coImFuYWx5emluZyBcIiVzLiVzXCIgaW5oZXJpdGFuY2UgdHJlZSIsCi0gCQkJCQkJ Z2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKG9uZXJlbCkpLAotIAkJ CQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG9uZXJlbCkpKSk7Ci0gCWVsc2UKLSAJCWVy ZXBvcnQoZWxldmVsLAotIAkJCQkoZXJybXNnKCJhbmFseXppbmcgXCIlcy4lc1wiIiwKLSAJ CQkJCQlnZXRfbmFtZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2Uob25lcmVsKSks Ci0gCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSkpKTsKLSAKICAJLyoK ICAJICogU2V0IHVwIGEgd29ya2luZyBjb250ZXh0IHNvIHRoYXQgd2UgY2FuIGVhc2lseSBm cmVlIHdoYXRldmVyIGp1bmsgZ2V0cwogIAkgKiBjcmVhdGVkLgotLS0gMzIyLDMyNyAtLS0t CioqKioqKioqKioqKioqKgoqKiogNDQ5LDQ1OSAqKioqIGRvX2FuYWx5emVfcmVsKFJlbGF0 aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBpbmgpCiAgCSAqLwogIAly b3dzID0gKEhlYXBUdXBsZSAqKSBwYWxsb2ModGFyZ3Jvd3MgKiBzaXplb2YoSGVhcFR1cGxl KSk7CiAgCWlmIChpbmgpCiEgCQludW1yb3dzID0gYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxl X3Jvd3Mob25lcmVsLCByb3dzLCB0YXJncm93cywKISAJCQkJCQkJCQkJCQkmdG90YWxyb3dz LCAmdG90YWxkZWFkcm93cyk7CiAgCWVsc2UKISAJCW51bXJvd3MgPSBhY3F1aXJlX3NhbXBs ZV9yb3dzKG9uZXJlbCwgcm93cywgdGFyZ3Jvd3MsCiEgCQkJCQkJCQkJICAmdG90YWxyb3dz LCAmdG90YWxkZWFkcm93cyk7CiAgCiAgCS8qCiAgCSAqIENvbXB1dGUgdGhlIHN0YXRpc3Rp Y3MuCVRlbXBvcmFyeSByZXN1bHRzIGR1cmluZyB0aGUgY2FsY3VsYXRpb25zIGZvcgotLS0g NDc5LDQ5MSAtLS0tCiAgCSAqLwogIAlyb3dzID0gKEhlYXBUdXBsZSAqKSBwYWxsb2ModGFy Z3Jvd3MgKiBzaXplb2YoSGVhcFR1cGxlKSk7CiAgCWlmIChpbmgpCiEgCQludW1yb3dzID0g c2FtcGxlX3Jvd19hY3F1aXJlcihvbmVyZWwsIHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkJ CSAgJnRvdGFscm93cywgJnRvdGFsZGVhZHJvd3MsCiEgCQkJCQkJCQkJICBOVUxMLCBlbGV2 ZWwpOwogIAllbHNlCiEgCQludW1yb3dzID0gc2FtcGxlX3Jvd19hY3F1aXJlcihvbmVyZWws IHJvd3MsIHRhcmdyb3dzLAohIAkJCQkJCQkJCSAgJnRvdGFscm93cywgJnRvdGFsZGVhZHJv d3MsCiEgCQkJCQkJCQkJICAmdG90YWxwYWdlcywgZWxldmVsKTsKICAKICAJLyoKICAJICog Q29tcHV0ZSB0aGUgc3RhdGlzdGljcy4JVGVtcG9yYXJ5IHJlc3VsdHMgZHVyaW5nIHRoZSBj YWxjdWxhdGlvbnMgZm9yCioqKioqKioqKioqKioqKgoqKiogNTM0LDU0MCAqKioqIGRvX2Fu YWx5emVfcmVsKFJlbGF0aW9uIG9uZXJlbCwgVmFjdXVtU3RtdCAqdmFjc3RtdCwgYm9vbCBp bmgpCiAgCSAqLwogIAlpZiAoIWluaCkKICAJCXZhY191cGRhdGVfcmVsc3RhdHMob25lcmVs LAohIAkJCQkJCQlSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKG9uZXJlbCksCiAgCQkJCQkJ CXRvdGFscm93cywKICAJCQkJCQkJdmlzaWJpbGl0eW1hcF9jb3VudChvbmVyZWwpLAogIAkJ CQkJCQloYXNpbmRleCwKLS0tIDU2Niw1NzIgLS0tLQogIAkgKi8KICAJaWYgKCFpbmgpCiAg CQl2YWNfdXBkYXRlX3JlbHN0YXRzKG9uZXJlbCwKISAJCQkJCQkJdG90YWxwYWdlcywKICAJ CQkJCQkJdG90YWxyb3dzLAogIAkJCQkJCQl2aXNpYmlsaXR5bWFwX2NvdW50KG9uZXJlbCks CiAgCQkJCQkJCWhhc2luZGV4LAoqKioqKioqKioqKioqKioKKioqIDEwMTcsMTAyMyAqKioq IEJsb2NrU2FtcGxlcl9OZXh0KEJsb2NrU2FtcGxlciBicykKICAgKi8KICBzdGF0aWMgaW50 CiAgYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIEhlYXBUdXBsZSAqcm93 cywgaW50IHRhcmdyb3dzLAohIAkJCQkJZG91YmxlICp0b3RhbHJvd3MsIGRvdWJsZSAqdG90 YWxkZWFkcm93cykKICB7CiAgCWludAkJCW51bXJvd3MgPSAwOwkvKiAjIHJvd3Mgbm93IGlu IHJlc2Vydm9pciAqLwogIAlkb3VibGUJCXNhbXBsZXJvd3MgPSAwOyAvKiB0b3RhbCAjIHJv d3MgY29sbGVjdGVkICovCi0tLSAxMDQ5LDEwNTYgLS0tLQogICAqLwogIHN0YXRpYyBpbnQK ICBhY3F1aXJlX3NhbXBsZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dz LCBpbnQgdGFyZ3Jvd3MsCiEgCQkJCQlkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3Rh bGRlYWRyb3dzLAohIAkJCQkJQmxvY2tOdW1iZXIgKnRvdGFscGFnZXMsIGludCBlbGV2ZWwp CiAgewogIAlpbnQJCQludW1yb3dzID0gMDsJLyogIyByb3dzIG5vdyBpbiByZXNlcnZvaXIg Ki8KICAJZG91YmxlCQlzYW1wbGVyb3dzID0gMDsgLyogdG90YWwgIyByb3dzIGNvbGxlY3Rl ZCAqLwoqKioqKioqKioqKioqKioKKioqIDEwMzIsMTAzNyAqKioqIGFjcXVpcmVfc2FtcGxl X3Jvd3MoUmVsYXRpb24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywK LS0tIDEwNjUsMTA3MiAtLS0tCiAgCUFzc2VydCh0YXJncm93cyA+IDApOwogIAogIAl0b3Rh bGJsb2NrcyA9IFJlbGF0aW9uR2V0TnVtYmVyT2ZCbG9ja3Mob25lcmVsKTsKKyAJaWYgKHRv dGFscGFnZXMpCisgCSAgKnRvdGFscGFnZXMgPSB0b3RhbGJsb2NrczsKICAKICAJLyogTmVl ZCBhIGN1dG9mZiB4bWluIGZvciBIZWFwVHVwbGVTYXRpc2ZpZXNWYWN1dW0gKi8KICAJT2xk ZXN0WG1pbiA9IEdldE9sZGVzdFhtaW4ob25lcmVsLT5yZF9yZWwtPnJlbGlzc2hhcmVkLCB0 cnVlKTsKKioqKioqKioqKioqKioqCioqKiAxMjU0LDEyNjAgKioqKiBhY3F1aXJlX3NhbXBs ZV9yb3dzKFJlbGF0aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3Ms CiAgfQogIAogIC8qIFNlbGVjdCBhIHJhbmRvbSB2YWx1ZSBSIHVuaWZvcm1seSBkaXN0cmli dXRlZCBpbiAoMCAtIDEpICovCiEgc3RhdGljIGRvdWJsZQogIHJhbmRvbV9mcmFjdCh2b2lk KQogIHsKICAJcmV0dXJuICgoZG91YmxlKSByYW5kb20oKSArIDEpIC8gKChkb3VibGUpIE1B WF9SQU5ET01fVkFMVUUgKyAyKTsKLS0tIDEyODksMTI5NSAtLS0tCiAgfQogIAogIC8qIFNl bGVjdCBhIHJhbmRvbSB2YWx1ZSBSIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbiAoMCAtIDEp ICovCiEgZG91YmxlCiAgcmFuZG9tX2ZyYWN0KHZvaWQpCiAgewogIAlyZXR1cm4gKChkb3Vi bGUpIHJhbmRvbSgpICsgMSkgLyAoKGRvdWJsZSkgTUFYX1JBTkRPTV9WQUxVRSArIDIpOwoq KioqKioqKioqKioqKioKKioqIDEyNzQsMTI4NyAqKioqIHJhbmRvbV9mcmFjdCh2b2lkKQog ICAqIGRldGVybWluZXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHRvIHNraXAgYmVmb3JlIHRo ZSBuZXh0IHJlY29yZCBpcwogICAqIHByb2Nlc3NlZC4KICAgKi8KISBzdGF0aWMgZG91Ymxl CiAgaW5pdF9zZWxlY3Rpb25fc3RhdGUoaW50IG4pCiAgewogIAkvKiBJbml0aWFsIHZhbHVl IG9mIFcgKGZvciB1c2Ugd2hlbiBBbGdvcml0aG0gWiBpcyBmaXJzdCBhcHBsaWVkKSAqLwog IAlyZXR1cm4gZXhwKC1sb2cocmFuZG9tX2ZyYWN0KCkpIC8gbik7CiAgfQogIAohIHN0YXRp YyBkb3VibGUKICBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0 cikKICB7CiAgCWRvdWJsZQkJUzsKLS0tIDEzMDksMTMyMiAtLS0tCiAgICogZGV0ZXJtaW5l cyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcCBiZWZvcmUgdGhlIG5leHQgcmVjb3Jk IGlzCiAgICogcHJvY2Vzc2VkLgogICAqLwohIGRvdWJsZQogIGluaXRfc2VsZWN0aW9uX3N0 YXRlKGludCBuKQogIHsKICAJLyogSW5pdGlhbCB2YWx1ZSBvZiBXIChmb3IgdXNlIHdoZW4g QWxnb3JpdGhtIFogaXMgZmlyc3QgYXBwbGllZCkgKi8KICAJcmV0dXJuIGV4cCgtbG9nKHJh bmRvbV9mcmFjdCgpKSAvIG4pOwogIH0KICAKISBkb3VibGUKICBnZXRfbmV4dF9TKGRvdWJs ZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0cikKICB7CiAgCWRvdWJsZQkJUzsKKioqKioq KioqKioqKioqCioqKiAxMzY2LDEzNzIgKioqKiBnZXRfbmV4dF9TKGRvdWJsZSB0LCBpbnQg biwgZG91YmxlICpzdGF0ZXB0cikKICAvKgogICAqIHFzb3J0IGNvbXBhcmF0b3IgZm9yIHNv cnRpbmcgcm93c1tdIGFycmF5CiAgICovCiEgc3RhdGljIGludAogIGNvbXBhcmVfcm93cyhj b25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogIHsKICAJSGVhcFR1cGxlCWhhID0gKihj b25zdCBIZWFwVHVwbGUgKikgYTsKLS0tIDE0MDEsMTQwNyAtLS0tCiAgLyoKICAgKiBxc29y dCBjb21wYXJhdG9yIGZvciBzb3J0aW5nIHJvd3NbXSBhcnJheQogICAqLwohIGludAogIGNv bXBhcmVfcm93cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogIHsKICAJSGVhcFR1 cGxlCWhhID0gKihjb25zdCBIZWFwVHVwbGUgKikgYTsKKioqKioqKioqKioqKioqCioqKiAx Mzk3LDE0MDMgKioqKiBjb21wYXJlX3Jvd3MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAq YikKICAgKi8KICBzdGF0aWMgaW50CiAgYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jvd3Mo UmVsYXRpb24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJCQkJ CQkJICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzKQogIHsKICAJ TGlzdAkgICAqdGFibGVPSURzOwogIAlSZWxhdGlvbiAgICpyZWxzOwotLS0gMTQzMiwxNDM5 IC0tLS0KICAgKi8KICBzdGF0aWMgaW50CiAgYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jv d3MoUmVsYXRpb24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKISAJ CQkJCQkJICBkb3VibGUgKnRvdGFscm93cywgZG91YmxlICp0b3RhbGRlYWRyb3dzLAohIAkJ CQkJCQkgIEJsb2NrTnVtYmVyICp0b3RhbHBhZ2VzLCBpbnQgZWxldmVsKQogIHsKICAJTGlz dAkgICAqdGFibGVPSURzOwogIAlSZWxhdGlvbiAgICpyZWxzOwoqKioqKioqKioqKioqKioK KioqIDE0NjAsMTQ2NSAqKioqIGFjcXVpcmVfaW5oZXJpdGVkX3NhbXBsZV9yb3dzKFJlbGF0 aW9uIG9uZXJlbCwgSGVhcFR1cGxlICpyb3dzLCBpbnQgdGFyZ3Jvd3MsCi0tLSAxNDk2LDE1 MDMgLS0tLQogIAkJdG90YWxibG9ja3MgKz0gcmVsYmxvY2tzW25yZWxzXTsKICAJCW5yZWxz Kys7CiAgCX0KKyAJaWYgKHRvdGFscGFnZXMpCisgCSAgKnRvdGFscGFnZXMgPSB0b3RhbGJs b2NrczsKICAKICAJLyoKICAJICogTm93IHNhbXBsZSByb3dzIGZyb20gZWFjaCByZWxhdGlv biwgcHJvcG9ydGlvbmFsbHkgdG8gaXRzIGZyYWN0aW9uIG9mCioqKioqKioqKioqKioqKgoq KiogMTQ5MywxNDk5ICoqKiogYWNxdWlyZV9pbmhlcml0ZWRfc2FtcGxlX3Jvd3MoUmVsYXRp b24gb25lcmVsLCBIZWFwVHVwbGUgKnJvd3MsIGludCB0YXJncm93cywKICAJCQkJCQkJCQkJ CQlyb3dzICsgbnVtcm93cywKICAJCQkJCQkJCQkJCQljaGlsZHRhcmdyb3dzLAogIAkJCQkJ CQkJCQkJCSZ0cm93cywKISAJCQkJCQkJCQkJCQkmdGRyb3dzKTsKICAKICAJCQkJLyogV2Ug bWF5IG5lZWQgdG8gY29udmVydCBmcm9tIGNoaWxkJ3Mgcm93dHlwZSB0byBwYXJlbnQncyAq LwogIAkJCQlpZiAoY2hpbGRyb3dzID4gMCAmJgotLS0gMTUzMSwxNTM5IC0tLS0KICAJCQkJ CQkJCQkJCQlyb3dzICsgbnVtcm93cywKICAJCQkJCQkJCQkJCQljaGlsZHRhcmdyb3dzLAog IAkJCQkJCQkJCQkJCSZ0cm93cywKISAJCQkJCQkJCQkJCQkmdGRyb3dzLAohIAkJCQkJCQkJ CQkJCU5VTEwsCiEgCQkJCQkJCQkJCQkJZWxldmVsKTsKICAKICAJCQkJLyogV2UgbWF5IG5l ZWQgdG8gY29udmVydCBmcm9tIGNoaWxkJ3Mgcm93dHlwZSB0byBwYXJlbnQncyAqLwogIAkJ CQlpZiAoY2hpbGRyb3dzID4gMCAmJgoqKiogYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJs ZWNtZHMuYwotLS0gYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwoqKioqKioq KioqKioqKioKKioqIDMxMSwzMTYgKioqKiBzdGF0aWMgdm9pZCBBVFByZXBTZXRTdGF0aXN0 aWNzKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwKLS0tIDMxMSwzMTggLS0t LQogIAkJCQkJTm9kZSAqbmV3VmFsdWUsIExPQ0tNT0RFIGxvY2ttb2RlKTsKICBzdGF0aWMg dm9pZCBBVEV4ZWNTZXRTdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29s TmFtZSwKICAJCQkJCU5vZGUgKm5ld1ZhbHVlLCBMT0NLTU9ERSBsb2NrbW9kZSk7Cisgc3Rh dGljIHZvaWQgQVRQcmVwU2V0T3B0aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNv bE5hbWUsCisgCQkJCSBOb2RlICpvcHRpb25zLCBMT0NLTU9ERSBsb2NrbW9kZSk7CiAgc3Rh dGljIHZvaWQgQVRFeGVjU2V0T3B0aW9ucyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNv bE5hbWUsCiAgCQkJCSBOb2RlICpvcHRpb25zLCBib29sIGlzUmVzZXQsIExPQ0tNT0RFIGxv Y2ttb2RlKTsKICBzdGF0aWMgdm9pZCBBVEV4ZWNTZXRTdG9yYWdlKFJlbGF0aW9uIHJlbCwg Y29uc3QgY2hhciAqY29sTmFtZSwKKioqKioqKioqKioqKioqCioqKiAyODg3LDI4OTIgKioq KiBBVFByZXBDbWQoTGlzdCAqKndxdWV1ZSwgUmVsYXRpb24gcmVsLCBBbHRlclRhYmxlQ21k ICpjbWQsCi0tLSAyODg5LDI4OTUgLS0tLQogIAkJY2FzZSBBVF9TZXRPcHRpb25zOgkJLyog QUxURVIgQ09MVU1OIFNFVCAoIG9wdGlvbnMgKSAqLwogIAkJY2FzZSBBVF9SZXNldE9wdGlv bnM6CS8qIEFMVEVSIENPTFVNTiBSRVNFVCAoIG9wdGlvbnMgKSAqLwogIAkJCUFUU2ltcGxl UGVybWlzc2lvbnMocmVsLCBBVFRfVEFCTEUgfCBBVFRfSU5ERVgpOworIAkJCUFUUHJlcFNl dE9wdGlvbnMocmVsLCBjbWQtPm5hbWUsIGNtZC0+ZGVmLCBsb2NrbW9kZSk7CiAgCQkJLyog VGhpcyBjb21tYW5kIG5ldmVyIHJlY3Vyc2VzICovCiAgCQkJcGFzcyA9IEFUX1BBU1NfTUlT QzsKICAJCQlicmVhazsKKioqKioqKioqKioqKioqCioqKiA0ODIyLDQ4MzEgKioqKiBBVFBy ZXBTZXRTdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwgTm9k ZSAqbmV3VmFsdWUsIExPQ0tNT0RFCiAgCSAqIGFsbG93U3lzdGVtVGFibGVNb2RzIHRvIGJl IHR1cm5lZCBvbi4KICAJICovCiAgCWlmIChyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxL SU5EX1JFTEFUSU9OICYmCiEgCQlyZWwtPnJkX3JlbC0+cmVsa2luZCAhPSBSRUxLSU5EX0lO REVYKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19P QkpFQ1RfVFlQRSksCiEgCQkJCSBlcnJtc2coIlwiJXNcIiBpcyBub3QgYSB0YWJsZSBvciBp bmRleCIsCiAgCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAKICAJ LyogUGVybWlzc2lvbnMgY2hlY2tzICovCi0tLSA0ODI1LDQ4MzUgLS0tLQogIAkgKiBhbGxv d1N5c3RlbVRhYmxlTW9kcyB0byBiZSB0dXJuZWQgb24uCiAgCSAqLwogIAlpZiAocmVsLT5y ZF9yZWwtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiAmJgohIAkJcmVsLT5yZF9yZWwt PnJlbGtpbmQgIT0gUkVMS0lORF9JTkRFWCAmJgohIAkJcmVsLT5yZF9yZWwtPnJlbGtpbmQg IT0gUkVMS0lORF9GT1JFSUdOX1RBQkxFKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVy cmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCiEgCQkJCSBlcnJtc2coIlwiJXNc IiBpcyBub3QgYSB0YWJsZSwgaW5kZXggb3IgZm9yZWlnbiB0YWJsZSIsCiAgCQkJCQkJUmVs YXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAKICAJLyogUGVybWlzc2lvbnMgY2hl Y2tzICovCioqKioqKioqKioqKioqKgoqKiogNDg5NCw0ODk5ICoqKiogQVRFeGVjU2V0U3Rh dGlzdGljcyhSZWxhdGlvbiByZWwsIGNvbnN0IGNoYXIgKmNvbE5hbWUsIE5vZGUgKm5ld1Zh bHVlLCBMT0NLTU9ERQotLS0gNDg5OCw0OTIzIC0tLS0KICB9CiAgCiAgc3RhdGljIHZvaWQK KyBBVFByZXBTZXRPcHRpb25zKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwg Tm9kZSAqb3B0aW9ucywKKyAJCQkJIExPQ0tNT0RFIGxvY2ttb2RlKQorIHsKKyAJaWYgKHJl bC0+cmRfcmVsLT5yZWxraW5kID09IFJFTEtJTkRfRk9SRUlHTl9UQUJMRSkKKyAJeworIAkJ TGlzdENlbGwgICAqY2VsbDsKKyAKKyAJCWZvcmVhY2goY2VsbCwgKExpc3QgKikgb3B0aW9u cykKKyAJCXsKKyAJCQlEZWZFbGVtICAgICpkZWYgPSAoRGVmRWxlbSAqKSBsZmlyc3QoY2Vs bCk7CisgCisgCQkJaWYgKHBnX3N0cm5jYXNlY21wKGRlZi0+ZGVmbmFtZSwgIm5fZGlzdGlu Y3RfaW5oZXJpdGVkIiwgc3RybGVuKCJuX2Rpc3RpbmN0X2luaGVyaXRlZCIpKSA9PSAwKQor IAkJCQllcmVwb3J0KEVSUk9SLAorIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKKyAJCQkJCQkgZXJybXNnKCJjYW5ub3Qgc3VwcG9ydCBvcHRpb24g XCJuX2Rpc3RpbmN0X2luaGVyaXRlZFwiIGZvciBmb3JlaWduIHRhYmxlcyIpKSk7CisgCQl9 CisgCX0KKyB9CisgCisgc3RhdGljIHZvaWQKICBBVEV4ZWNTZXRPcHRpb25zKFJlbGF0aW9u IHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwgTm9kZSAqb3B0aW9ucywKICAJCQkJIGJvb2wg aXNSZXNldCwgTE9DS01PREUgbG9ja21vZGUpCiAgewoqKiogYS9zcmMvYmluL3BzcWwvdGFi LWNvbXBsZXRlLmMKLS0tIGIvc3JjL2Jpbi9wc3FsL3RhYi1jb21wbGV0ZS5jCioqKioqKioq KioqKioqKgoqKiogMzk5LDQwNCAqKioqIHN0YXRpYyBjb25zdCBTY2hlbWFRdWVyeSBRdWVy eV9mb3JfbGlzdF9vZl90c3ZmID0gewotLS0gMzk5LDQxOSAtLS0tCiAgCU5VTEwKICB9Owog IAorIHN0YXRpYyBjb25zdCBTY2hlbWFRdWVyeSBRdWVyeV9mb3JfbGlzdF9vZl90ZiA9IHsK KyAJLyogY2F0bmFtZSAqLworIAkicGdfY2F0YWxvZy5wZ19jbGFzcyBjIiwKKyAJLyogc2Vs Y29uZGl0aW9uICovCisgCSJjLnJlbGtpbmQgSU4gKCdyJywgJ2YnKSIsCisgCS8qIHZpc2Nv bmRpdGlvbiAqLworIAkicGdfY2F0YWxvZy5wZ190YWJsZV9pc192aXNpYmxlKGMub2lkKSIs CisgCS8qIG5hbWVzcGFjZSAqLworIAkiYy5yZWxuYW1lc3BhY2UiLAorIAkvKiByZXN1bHQg Ki8KKyAJInBnX2NhdGFsb2cucXVvdGVfaWRlbnQoYy5yZWxuYW1lKSIsCisgCS8qIHF1YWxy ZXN1bHQgKi8KKyAJTlVMTAorIH07CisgCiAgc3RhdGljIGNvbnN0IFNjaGVtYVF1ZXJ5IFF1 ZXJ5X2Zvcl9saXN0X29mX3ZpZXdzID0gewogIAkvKiBjYXRuYW1lICovCiAgCSJwZ19jYXRh bG9nLnBnX2NsYXNzIGMiLAoqKioqKioqKioqKioqKioKKioqIDI3NjksMjc3NSAqKioqIHBz cWxfY29tcGxldGlvbihjaGFyICp0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpCiAgLyogQU5B TFlaRSAqLwogIAkvKiBJZiB0aGUgcHJldmlvdXMgd29yZCBpcyBBTkFMWVpFLCBwcm9kdWNl IGxpc3Qgb2YgdGFibGVzICovCiAgCWVsc2UgaWYgKHBnX3N0cmNhc2VjbXAocHJldl93ZCwg IkFOQUxZWkUiKSA9PSAwKQohIAkJQ09NUExFVEVfV0lUSF9TQ0hFTUFfUVVFUlkoUXVlcnlf Zm9yX2xpc3Rfb2ZfdGFibGVzLCBOVUxMKTsKICAKICAvKiBXSEVSRSAqLwogIAkvKiBTaW1w bGUgY2FzZSBvZiB0aGUgd29yZCBiZWZvcmUgdGhlIHdoZXJlIGJlaW5nIHRoZSB0YWJsZSBu YW1lICovCi0tLSAyNzg0LDI3OTAgLS0tLQogIC8qIEFOQUxZWkUgKi8KICAJLyogSWYgdGhl IHByZXZpb3VzIHdvcmQgaXMgQU5BTFlaRSwgcHJvZHVjZSBsaXN0IG9mIHRhYmxlcyAqLwog IAllbHNlIGlmIChwZ19zdHJjYXNlY21wKHByZXZfd2QsICJBTkFMWVpFIikgPT0gMCkKISAJ CUNPTVBMRVRFX1dJVEhfU0NIRU1BX1FVRVJZKFF1ZXJ5X2Zvcl9saXN0X29mX3RmLCBOVUxM KTsKICAKICAvKiBXSEVSRSAqLwogIAkvKiBTaW1wbGUgY2FzZSBvZiB0aGUgd29yZCBiZWZv cmUgdGhlIHdoZXJlIGJlaW5nIHRoZSB0YWJsZSBuYW1lICovCioqKiBhL3NyYy9pbmNsdWRl L2NvbW1hbmRzL3ZhY3V1bS5oCi0tLSBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3ZhY3V1bS5o CioqKioqKioqKioqKioqKgoqKiogMTY3LDE3MSAqKioqIGV4dGVybiB2b2lkIGxhenlfdmFj dXVtX3JlbChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZhY3N0bXQsCi0tLSAxNjcs MTc4IC0tLS0KICAvKiBpbiBjb21tYW5kcy9hbmFseXplLmMgKi8KICBleHRlcm4gdm9pZCBh bmFseXplX3JlbChPaWQgcmVsaWQsIFZhY3V1bVN0bXQgKnZhY3N0bXQsCiAgCQkJQnVmZmVy QWNjZXNzU3RyYXRlZ3kgYnN0cmF0ZWd5KTsKKyBleHRlcm4gdm9pZCBkb19hbmFseXplX3Jl bChSZWxhdGlvbiBvbmVyZWwsIFZhY3V1bVN0bXQgKnZhY3N0bXQsIGludCBlbGV2ZWwsIAor IAkJCQkJCSAgIGJvb2wgaW5oLCBpbnQgKCpzYW1wbGVfcm93X2FjcXVpcmVyKSAoKSk7Cisg ZXh0ZXJuIGRvdWJsZSByYW5kb21fZnJhY3Qodm9pZCk7CisgZXh0ZXJuIGRvdWJsZSBpbml0 X3NlbGVjdGlvbl9zdGF0ZShpbnQgbik7CisgZXh0ZXJuIGRvdWJsZSBnZXRfbmV4dF9TKGRv dWJsZSB0LCBpbnQgbiwgZG91YmxlICpzdGF0ZXB0cik7CisgZXh0ZXJuIGludAljb21wYXJl X3Jvd3MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisgCiAgCiAgI2VuZGlmICAg LyogVkFDVVVNX0ggKi8KKioqIGEvc3JjL2luY2x1ZGUvZm9yZWlnbi9mZHdhcGkuaAotLS0g Yi9zcmMvaW5jbHVkZS9mb3JlaWduL2Zkd2FwaS5oCioqKioqKioqKioqKioqKgoqKiogMTIs MTkgKioqKgotLS0gMTIsMjEgLS0tLQogICNpZm5kZWYgRkRXQVBJX0gKICAjZGVmaW5lIEZE V0FQSV9ICiAgCisgI2luY2x1ZGUgImZvcmVpZ24vZm9yZWlnbi5oIgogICNpbmNsdWRlICJu b2Rlcy9leGVjbm9kZXMuaCIKICAjaW5jbHVkZSAibm9kZXMvcmVsYXRpb24uaCIKKyAjaW5j bHVkZSAidXRpbHMvcmVsLmgiCiAgCiAgLyogVG8gYXZvaWQgaW5jbHVkaW5nIGV4cGxhaW4u aCBoZXJlLCByZWZlcmVuY2UgRXhwbGFpblN0YXRlIHRodXM6ICovCiAgc3RydWN0IEV4cGxh aW5TdGF0ZTsKKioqKioqKioqKioqKioqCioqKiA2OCw3MyAqKioqIHR5cGVkZWYgdm9pZCAo KlJlU2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uKSAoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSk7 Ci0tLSA3MCw3OCAtLS0tCiAgCiAgdHlwZWRlZiB2b2lkICgqRW5kRm9yZWlnblNjYW5fZnVu Y3Rpb24pIChGb3JlaWduU2NhblN0YXRlICpub2RlKTsKICAKKyB0eXBlZGVmIHZvaWQgKCpB bmFseXplRm9yZWlnblRhYmxlX2Z1bmN0aW9uKSAoUmVsYXRpb24gcmVsYXRpb24sCisgCQkJ CQkJCQkJCQkgIFZhY3V1bVN0bXQgKnZhY3N0bXQsCisgCQkJCQkJCQkJCQkgIGludCBlbGV2 ZWwpOwogIAogIC8qCiAgICogRmR3Um91dGluZSBpcyB0aGUgc3RydWN0IHJldHVybmVkIGJ5 IGEgZm9yZWlnbi1kYXRhIHdyYXBwZXIncyBoYW5kbGVyCioqKioqKioqKioqKioqKgoqKiog ODgsOTMgKioqKiB0eXBlZGVmIHN0cnVjdCBGZHdSb3V0aW5lCi0tLSA5Myw5OSAtLS0tCiAg CUl0ZXJhdGVGb3JlaWduU2Nhbl9mdW5jdGlvbiBJdGVyYXRlRm9yZWlnblNjYW47CiAgCVJl U2NhbkZvcmVpZ25TY2FuX2Z1bmN0aW9uIFJlU2NhbkZvcmVpZ25TY2FuOwogIAlFbmRGb3Jl aWduU2Nhbl9mdW5jdGlvbiBFbmRGb3JlaWduU2NhbjsKKyAJQW5hbHl6ZUZvcmVpZ25UYWJs ZV9mdW5jdGlvbiBBbmFseXplRm9yZWlnblRhYmxlOwogIH0gRmR3Um91dGluZTsKICAKICAK --------------000503090309020405040802--