Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sU4e8-000EVK-IP for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Jul 2024 13:24:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sU4e6-000jXw-7t for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Jul 2024 13:24:38 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sU4e5-000jWo-DH for pgsql-hackers@lists.postgresql.org; Wed, 17 Jul 2024 13:24:38 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sU4e0-0001dv-5K for pgsql-hackers@postgresql.org; Wed, 17 Jul 2024 13:24:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1721222668; bh=5S8BL3q1ZweNh0w7AzEPROb07Aub/HxsIwK/X5t5d0o=; h=Date:From:To:Subject:User-Agent:Message-ID:From; b=VG0HYrmrAC1sxSqlP/I7T/Pr9o9g/tuRnr1pyp8I8BBjW/yJR8XtJsBp2xu2kz5wo 4PNTdNLKD+VcKtecxRaOvbRjsrPBBIj7Axj/FT+8f+SYKX3Kewd1/VF2HYbSp5mJr7 dbyQXA+ZDxDmSu+k5q40gWJEVLBIXxphS83LFV0GrZM+10biUPzWuJTXotYKohzdJS e/8Qu6MagObdSuHK/DPbRNsO6YfxoleqIgSUx+W+k7QIUGcrpX1HaRjDf1uP8rOcC/ dTb12uJsPp6UzqSua8ErDuZApEFXU9YhVmO3VKh5g97Oud6fxGIss5CE0gYV/Nd8bX upzpbCajKkHxg== Received: from mail.postgrespro.ru (unknown [192.168.2.28]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.pyhalov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id C9C1960788 for ; Wed, 17 Jul 2024 16:24:28 +0300 (MSK) MIME-Version: 1.0 Date: Wed, 17 Jul 2024 16:24:28 +0300 From: Alexander Pyhalov To: Pgsql Hackers Subject: Asynchronous MergeAppend User-Agent: Roundcube Webmail/1.6.7 Message-ID: <59be194c5a409fb9fc9f2031581b8a44@postgrespro.ru> X-Sender: a.pyhalov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_ba7398485aff33236aa688392ddcfe9d" X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2024/07/17 10:22:00 #26050312 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_ba7398485aff33236aa688392ddcfe9d Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Hello. I'd like to make MergeAppend node Async-capable like Append node. Nowadays when planner chooses MergeAppend plan, asynchronous execution is not possible. With attached patches you can see plans like EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM async_pt WHERE b % 100 = 0 ORDER BY b, a; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ Merge Append Sort Key: async_pt.b, async_pt.a -> Async Foreign Scan on public.async_p1 async_pt_1 Output: async_pt_1.a, async_pt_1.b, async_pt_1.c Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE (((b % 100) = 0)) ORDER BY b ASC NULLS LAST, a ASC NULLS LAST -> Async Foreign Scan on public.async_p2 async_pt_2 Output: async_pt_2.a, async_pt_2.b, async_pt_2.c Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE (((b % 100) = 0)) ORDER BY b ASC NULLS LAST, a ASC NULLS LAST This can be quite profitable (in our test cases you can gain up to two times better speed with MergeAppend async execution on remote servers). Code for asynchronous execution in Merge Append was mostly borrowed from Append node. What significantly differs - in ExecMergeAppendAsyncGetNext() you must return tuple from the specified slot. Subplan number determines tuple slot where data should be retrieved to. When subplan is ready to provide some data, it's cached in ms_asyncresults. When we get tuple for subplan, specified in ExecMergeAppendAsyncGetNext(), ExecMergeAppendAsyncRequest() returns true and loop in ExecMergeAppendAsyncGetNext() ends. We can fetch data for subplans which either don't have cached result ready or have already returned them to the upper node. This flag is stored in ms_has_asyncresults. As we can get data for some subplan either earlier or after loop in ExecMergeAppendAsyncRequest(), we check this flag twice in this function. Unlike ExecAppendAsyncEventWait(), it seems ExecMergeAppendAsyncEventWait() doesn't need a timeout - as there's no need to get result from synchronous subplan if a tuple form async one was explicitly requested. Also we had to fix postgres_fdw to avoid directly looking at Append fields. Perhaps, accesors to Append fields look strange, but allows to avoid some code duplication. I suppose, duplication could be even less if we reworked async Append implementation, but so far I haven't tried to do this to avoid big diff from master. Also mark_async_capable() believes that path corresponds to plan. This can be not true when create_[merge_]append_plan() inserts sort node. In this case mark_async_capable() can treat Sort plan node as some other and crash, so there's a small fix for this. -- Best regards, Alexander Pyhalov, Postgres Professional --=_ba7398485aff33236aa688392ddcfe9d Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v1-0001-mark_async_capable-subpath-should-match-subplan.patch Content-Disposition: attachment; filename=v1-0001-mark_async_capable-subpath-should-match-subplan.patch; size=1962 RnJvbSA3OWU0MGQ2YmNkZmE5NjQzNWMwNmQyYzY2OGVmZDc2ZjNiY2Q1MzI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgUHloYWxvdiA8YS5weWhhbG92QHBvc3RncmVz cHJvLnJ1PgpEYXRlOiBGcmksIDIxIEp1bCAyMDIzIDEyOjA1OjA3ICswMzAwClN1YmplY3Q6IFtQ QVRDSCAxLzJdIG1hcmtfYXN5bmNfY2FwYWJsZSgpOiBzdWJwYXRoIHNob3VsZCBtYXRjaCBzdWJw bGFuCgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYyB8IDE2ICsr KysrKysrLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDggZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxh bi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jCmluZGV4IDZiNjRj NGEzNjJkLi5jMmU4Nzk4MTViMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3Bs YW4vY3JlYXRlcGxhbi5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBs YW4uYwpAQCAtMTE0NiwxMCArMTE0NiwxMCBAQCBtYXJrX2FzeW5jX2NhcGFibGVfcGxhbihQbGFu ICpwbGFuLCBQYXRoICpwYXRoKQogCQkJCVN1YnF1ZXJ5U2NhbiAqc2Nhbl9wbGFuID0gKFN1YnF1 ZXJ5U2NhbiAqKSBwbGFuOwogCiAJCQkJLyoKLQkJCQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4g bm9kZSBpbmNsdWRlcyBhIGdhdGluZyBSZXN1bHQgbm9kZSwKLQkJCQkgKiB3ZSBjYW4ndCBleGVj dXRlIGl0IGFzeW5jaHJvbm91c2x5LgorCQkJCSAqIElmIHRoZSBnZW5lcmF0ZWQgcGxhbiBub2Rl IGluY2x1ZGVzIGEgZ2F0aW5nIFJlc3VsdCBub2RlIG9yCisJCQkJICogYSBTb3J0IG5vZGUsIHdl IGNhbid0IGV4ZWN1dGUgaXQgYXN5bmNocm9ub3VzbHkuCiAJCQkJICovCi0JCQkJaWYgKElzQShw bGFuLCBSZXN1bHQpKQorCQkJCWlmIChJc0EocGxhbiwgUmVzdWx0KSB8fCBJc0EocGxhbiwgU29y dCkpCiAJCQkJCXJldHVybiBmYWxzZTsKIAogCQkJCS8qCkBAIC0xMTY3LDEwICsxMTY3LDEwIEBA IG1hcmtfYXN5bmNfY2FwYWJsZV9wbGFuKFBsYW4gKnBsYW4sIFBhdGggKnBhdGgpCiAJCQkJRmR3 Um91dGluZSAqZmR3cm91dGluZSA9IHBhdGgtPnBhcmVudC0+ZmR3cm91dGluZTsKIAogCQkJCS8q Ci0JCQkJICogSWYgdGhlIGdlbmVyYXRlZCBwbGFuIG5vZGUgaW5jbHVkZXMgYSBnYXRpbmcgUmVz dWx0IG5vZGUsCi0JCQkJICogd2UgY2FuJ3QgZXhlY3V0ZSBpdCBhc3luY2hyb25vdXNseS4KKwkJ CQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4gbm9kZSBpbmNsdWRlcyBhIGdhdGluZyBSZXN1bHQg bm9kZSBvcgorCQkJCSAqIGEgU29ydCBub2RlLCB3ZSBjYW4ndCBleGVjdXRlIGl0IGFzeW5jaHJv bm91c2x5LgogCQkJCSAqLwotCQkJCWlmIChJc0EocGxhbiwgUmVzdWx0KSkKKwkJCQlpZiAoSXNB KHBsYW4sIFJlc3VsdCkgfHwgSXNBKHBsYW4sIFNvcnQpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAK IAkJCQlBc3NlcnQoZmR3cm91dGluZSAhPSBOVUxMKTsKQEAgLTExODMsOSArMTE4Myw5IEBAIG1h cmtfYXN5bmNfY2FwYWJsZV9wbGFuKFBsYW4gKnBsYW4sIFBhdGggKnBhdGgpCiAKIAkJCS8qCiAJ CQkgKiBJZiB0aGUgZ2VuZXJhdGVkIHBsYW4gbm9kZSBpbmNsdWRlcyBhIFJlc3VsdCBub2RlIGZv ciB0aGUKLQkJCSAqIHByb2plY3Rpb24sIHdlIGNhbid0IGV4ZWN1dGUgaXQgYXN5bmNocm9ub3Vz bHkuCisJCQkgKiBwcm9qZWN0aW9uIG9yIGEgU29ydCBub2RlLCB3ZSBjYW4ndCBleGVjdXRlIGl0 IGFzeW5jaHJvbm91c2x5LgogCQkJICovCi0JCQlpZiAoSXNBKHBsYW4sIFJlc3VsdCkpCisJCQlp ZiAoSXNBKHBsYW4sIFJlc3VsdCkgfHwgSXNBKHBsYW4sIFNvcnQpKQogCQkJCXJldHVybiBmYWxz ZTsKIAogCQkJLyoKLS0gCjIuMzQuMQoK --=_ba7398485aff33236aa688392ddcfe9d Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v1-0002-MergeAppend-should-support-Async-Foreign-Scan-subpla.patch Content-Disposition: attachment; filename*0*=UTF-8''v1-0002-MergeAppend-should-support-Async-Foreign-Scan-; filename*1*=subpla.patch; size=35542 RnJvbSA3NDU0NmI3ZWViY2I2MWI1YzE2MjM5YTA1NmJjZWUzMDhjZGVmMDllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgUHloYWxvdiA8YS5weWhhbG92QHBvc3RncmVz cHJvLnJ1PgpEYXRlOiBXZWQsIDE5IEp1bCAyMDIzIDE1OjQyOjI0ICswMzAwClN1YmplY3Q6IFtQ QVRDSCAyLzJdIE1lcmdlQXBwZW5kIHNob3VsZCBzdXBwb3J0IEFzeW5jIEZvcmVpZ24gU2NhbiBz dWJwbGFucwoKLS0tCiAuLi4vcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQg ICAgfCAxMDAgKysrKwogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgICAgICAg ICAgIHwgIDEwICstCiBjb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCAg ICAgfCAgMTUgKwogZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sICAgICAgICAgICAgICAgICAgICAg IHwgIDE0ICsKIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNBc3luYy5jICAgICAgICAgICAgICB8 ICAgNCArCiBzcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTWVyZ2VBcHBlbmQuYyAgICAgICAgfCA0 NTggKysrKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6 ZS5jICAgICAgICAgfCAgIDEgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxh bi5jICAgICAgIHwgICA4ICsKIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jICAg ICAgICAgICB8ICAxMCArCiBzcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5z YW1wbGUgfCAgIDEgKwogc3JjL2luY2x1ZGUvZXhlY3V0b3Ivbm9kZU1lcmdlQXBwZW5kLmggICAg ICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oICAgICAgICAgICAgICAg ICB8ICA1NiArKysKIHNyYy9pbmNsdWRlL29wdGltaXplci9jb3N0LmggICAgICAgICAgICAgICAg ICB8ICAgMSArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICAgICAg fCAgIDMgKy0KIDE0IGZpbGVzIGNoYW5nZWQsIDY3NiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVz X2Zkdy5vdXQgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0 CmluZGV4IDBjYzc3MTkwZGM0Li5mOTNlYTJlMDVhNyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAorKysgYi9jb250cmliL3Bvc3RncmVz X2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC0xMTE1NCw2ICsxMTE1NCw0NiBAQCBT RUxFQ1QgKiBGUk9NIHJlc3VsdF90YmwgT1JERVIgQlkgYTsKICgyIHJvd3MpCiAKIERFTEVURSBG Uk9NIHJlc3VsdF90Ymw7CistLSBUZXN0IE1lcmdlQXBwZW5kCitFWFBMQUlOIChWRVJCT1NFLCBD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJFIGIgJSAxMDAgPSAwIE9SREVS IEJZIGIsIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEFwcGVuZAorICAg U29ydCBLZXk6IGFzeW5jX3B0LmIsIGFzeW5jX3B0LmEKKyAgIC0+ICBBc3luYyBGb3JlaWduIFNj YW4gb24gcHVibGljLmFzeW5jX3AxIGFzeW5jX3B0XzEKKyAgICAgICAgIE91dHB1dDogYXN5bmNf cHRfMS5hLCBhc3luY19wdF8xLmIsIGFzeW5jX3B0XzEuYworICAgICAgICAgUmVtb3RlIFNRTDog U0VMRUNUIGEsIGIsIGMgRlJPTSBwdWJsaWMuYmFzZV90YmwxIFdIRVJFICgoKGIgJSAxMDApID0g MCkpIE9SREVSIEJZIGIgQVNDIE5VTExTIExBU1QsIGEgQVNDIE5VTExTIExBU1QKKyAgIC0+ICBB c3luYyBGb3JlaWduIFNjYW4gb24gcHVibGljLmFzeW5jX3AyIGFzeW5jX3B0XzIKKyAgICAgICAg IE91dHB1dDogYXN5bmNfcHRfMi5hLCBhc3luY19wdF8yLmIsIGFzeW5jX3B0XzIuYworICAgICAg ICAgUmVtb3RlIFNRTDogU0VMRUNUIGEsIGIsIGMgRlJPTSBwdWJsaWMuYmFzZV90YmwyIFdIRVJF ICgoKGIgJSAxMDApID0gMCkpIE9SREVSIEJZIGIgQVNDIE5VTExTIExBU1QsIGEgQVNDIE5VTExT IExBU1QKKyg4IHJvd3MpCisKK1NFTEVDVCAqIEZST00gYXN5bmNfcHQgV0hFUkUgYiAlIDEwMCA9 IDAgT1JERVIgQlkgYiwgYTsKKyAgYSAgIHwgIGIgIHwgIGMgICAKKy0tLS0tLSstLS0tLSstLS0t LS0KKyAxMDAwIHwgICAwIHwgMDAwMAorIDIwMDAgfCAgIDAgfCAwMDAwCisgMTEwMCB8IDEwMCB8 IDAxMDAKKyAyMTAwIHwgMTAwIHwgMDEwMAorIDEyMDAgfCAyMDAgfCAwMjAwCisgMjIwMCB8IDIw MCB8IDAyMDAKKyAxMzAwIHwgMzAwIHwgMDMwMAorIDIzMDAgfCAzMDAgfCAwMzAwCisgMTQwMCB8 IDQwMCB8IDA0MDAKKyAyNDAwIHwgNDAwIHwgMDQwMAorIDE1MDAgfCA1MDAgfCAwNTAwCisgMjUw MCB8IDUwMCB8IDA1MDAKKyAxNjAwIHwgNjAwIHwgMDYwMAorIDI2MDAgfCA2MDAgfCAwNjAwCisg MTcwMCB8IDcwMCB8IDA3MDAKKyAyNzAwIHwgNzAwIHwgMDcwMAorIDE4MDAgfCA4MDAgfCAwODAw CisgMjgwMCB8IDgwMCB8IDA4MDAKKyAxOTAwIHwgOTAwIHwgMDkwMAorIDI5MDAgfCA5MDAgfCAw OTAwCisoMjAgcm93cykKKwogLS0gVGVzdCBlcnJvciBoYW5kbGluZywgaWYgYWNjZXNzaW5nIG9u ZSBvZiB0aGUgZm9yZWlnbiBwYXJ0aXRpb25zIGVycm9ycyBvdXQKIENSRUFURSBGT1JFSUdOIFRB QkxFIGFzeW5jX3BfYnJva2VuIFBBUlRJVElPTiBPRiBhc3luY19wdCBGT1IgVkFMVUVTIEZST00g KDEwMDAwKSBUTyAoMTAwMDEpCiAgIFNFUlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1l ICdub25fZXhpc3RlbnRfdGFibGUnKTsKQEAgLTExMTk3LDYgKzExMjM3LDM1IEBAIFNFTEVDVCAq IEZST00gcmVzdWx0X3RibCBPUkRFUiBCWSBhOwogKDMgcm93cykKIAogREVMRVRFIEZST00gcmVz dWx0X3RibDsKKy0tIFRlc3QgTWVyZ2VBcHBlbmQKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9G RikKK1NFTEVDVCAqIEZST00gYXN5bmNfcHQgV0hFUkUgYiA9PT0gNTA1IE9SREVSIEJZIGIsIGE7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEFwcGVuZAorICAg U29ydCBLZXk6IGFzeW5jX3B0LmIsIGFzeW5jX3B0LmEKKyAgIC0+ICBBc3luYyBGb3JlaWduIFNj YW4gb24gcHVibGljLmFzeW5jX3AxIGFzeW5jX3B0XzEKKyAgICAgICAgIE91dHB1dDogYXN5bmNf cHRfMS5hLCBhc3luY19wdF8xLmIsIGFzeW5jX3B0XzEuYworICAgICAgICAgRmlsdGVyOiAoYXN5 bmNfcHRfMS5iID09PSA1MDUpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSwgYiwgYyBG Uk9NIHB1YmxpYy5iYXNlX3RibDEgT1JERVIgQlkgYiBBU0MgTlVMTFMgTEFTVCwgYSBBU0MgTlVM TFMgTEFTVAorICAgLT4gIEFzeW5jIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuYXN5bmNfcDIgYXN5 bmNfcHRfMgorICAgICAgICAgT3V0cHV0OiBhc3luY19wdF8yLmEsIGFzeW5jX3B0XzIuYiwgYXN5 bmNfcHRfMi5jCisgICAgICAgICBGaWx0ZXI6IChhc3luY19wdF8yLmIgPT09IDUwNSkKKyAgICAg ICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhLCBiLCBjIEZST00gcHVibGljLmJhc2VfdGJsMiBPUkRF UiBCWSBiIEFTQyBOVUxMUyBMQVNULCBhIEFTQyBOVUxMUyBMQVNUCisgICAtPiAgQXN5bmMgRm9y ZWlnbiBTY2FuIG9uIHB1YmxpYy5hc3luY19wMyBhc3luY19wdF8zCisgICAgICAgICBPdXRwdXQ6 IGFzeW5jX3B0XzMuYSwgYXN5bmNfcHRfMy5iLCBhc3luY19wdF8zLmMKKyAgICAgICAgIEZpbHRl cjogKGFzeW5jX3B0XzMuYiA9PT0gNTA1KQorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEs IGIsIGMgRlJPTSBwdWJsaWMuYmFzZV90YmwzIE9SREVSIEJZIGIgQVNDIE5VTExTIExBU1QsIGEg QVNDIE5VTExTIExBU1QKKygxNCByb3dzKQorCitTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJF IGIgPT09IDUwNSBPUkRFUiBCWSBiLCBhOworICBhICAgfCAgYiAgfCAgYyAgIAorLS0tLS0tKy0t LS0tKy0tLS0tLQorIDE1MDUgfCA1MDUgfCAwNTA1CisgMjUwNSB8IDUwNSB8IDA1MDUKKyAzNTA1 IHwgNTA1IHwgMDUwNQorKDMgcm93cykKKwogRFJPUCBGT1JFSUdOIFRBQkxFIGFzeW5jX3AzOwog RFJPUCBUQUJMRSBiYXNlX3RibDM7CiAtLSBDaGVjayBjYXNlIHdoZXJlIHRoZSBwYXJ0aXRpb25l ZCB0YWJsZSBoYXMgbG9jYWwvcmVtb3RlIHBhcnRpdGlvbnMKQEAgLTExMjMyLDYgKzExMzAxLDM3 IEBAIFNFTEVDVCAqIEZST00gcmVzdWx0X3RibCBPUkRFUiBCWSBhOwogKDMgcm93cykKIAogREVM RVRFIEZST00gcmVzdWx0X3RibDsKKy0tIFRlc3QgTWVyZ2VBcHBlbmQKK0VYUExBSU4gKFZFUkJP U0UsIENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gYXN5bmNfcHQgV0hFUkUgYiA9PT0gNTA1IE9S REVSIEJZIGIsIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdl IEFwcGVuZAorICAgU29ydCBLZXk6IGFzeW5jX3B0LmIsIGFzeW5jX3B0LmEKKyAgIC0+ICBBc3lu YyBGb3JlaWduIFNjYW4gb24gcHVibGljLmFzeW5jX3AxIGFzeW5jX3B0XzEKKyAgICAgICAgIE91 dHB1dDogYXN5bmNfcHRfMS5hLCBhc3luY19wdF8xLmIsIGFzeW5jX3B0XzEuYworICAgICAgICAg RmlsdGVyOiAoYXN5bmNfcHRfMS5iID09PSA1MDUpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxF Q1QgYSwgYiwgYyBGUk9NIHB1YmxpYy5iYXNlX3RibDEgT1JERVIgQlkgYiBBU0MgTlVMTFMgTEFT VCwgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIEFzeW5jIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMu YXN5bmNfcDIgYXN5bmNfcHRfMgorICAgICAgICAgT3V0cHV0OiBhc3luY19wdF8yLmEsIGFzeW5j X3B0XzIuYiwgYXN5bmNfcHRfMi5jCisgICAgICAgICBGaWx0ZXI6IChhc3luY19wdF8yLmIgPT09 IDUwNSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhLCBiLCBjIEZST00gcHVibGljLmJh c2VfdGJsMiBPUkRFUiBCWSBiIEFTQyBOVUxMUyBMQVNULCBhIEFTQyBOVUxMUyBMQVNUCisgICAt PiAgU29ydAorICAgICAgICAgT3V0cHV0OiBhc3luY19wdF8zLmEsIGFzeW5jX3B0XzMuYiwgYXN5 bmNfcHRfMy5jCisgICAgICAgICBTb3J0IEtleTogYXN5bmNfcHRfMy5iLCBhc3luY19wdF8zLmEK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMuYXN5bmNfcDMgYXN5bmNfcHRfMworICAg ICAgICAgICAgICAgT3V0cHV0OiBhc3luY19wdF8zLmEsIGFzeW5jX3B0XzMuYiwgYXN5bmNfcHRf My5jCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhc3luY19wdF8zLmIgPT09IDUwNSkKKygxNiBy b3dzKQorCitTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJFIGIgPT09IDUwNSBPUkRFUiBCWSBi LCBhOworICBhICAgfCAgYiAgfCAgYyAgIAorLS0tLS0tKy0tLS0tKy0tLS0tLQorIDE1MDUgfCA1 MDUgfCAwNTA1CisgMjUwNSB8IDUwNSB8IDA1MDUKKyAzNTA1IHwgNTA1IHwgMDUwNQorKDMgcm93 cykKKwogLS0gcGFydGl0aW9ud2lzZSBqb2lucwogU0VUIGVuYWJsZV9wYXJ0aXRpb253aXNlX2pv aW4gVE8gdHJ1ZTsKIENSRUFURSBUQUJMRSBqb2luX3RibCAoYTEgaW50LCBiMSBpbnQsIGMxIHRl eHQsIGEyIGludCwgYjIgaW50LCBjMiB0ZXh0KTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3 LmMKaW5kZXggMGJiOWE1YWU4ZjYuLmE4YWQwZWIxZDA0IDEwMDY0NAotLS0gYS9jb250cmliL3Bv c3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0 Z3Jlc19mZHcuYwpAQCAtNzI1MiwxMiArNzI1MiwxNiBAQCBwb3N0Z3Jlc0ZvcmVpZ25Bc3luY0Nv bmZpZ3VyZVdhaXQoQXN5bmNSZXF1ZXN0ICphcmVxKQogCUZvcmVpZ25TY2FuU3RhdGUgKm5vZGUg PSAoRm9yZWlnblNjYW5TdGF0ZSAqKSBhcmVxLT5yZXF1ZXN0ZWU7CiAJUGdGZHdTY2FuU3RhdGUg KmZzc3RhdGUgPSAoUGdGZHdTY2FuU3RhdGUgKikgbm9kZS0+ZmR3X3N0YXRlOwogCUFzeW5jUmVx dWVzdCAqcGVuZGluZ0FyZXEgPSBmc3N0YXRlLT5jb25uX3N0YXRlLT5wZW5kaW5nQXJlcTsKLQlB cHBlbmRTdGF0ZSAqcmVxdWVzdG9yID0gKEFwcGVuZFN0YXRlICopIGFyZXEtPnJlcXVlc3RvcjsK LQlXYWl0RXZlbnRTZXQgKnNldCA9IHJlcXVlc3Rvci0+YXNfZXZlbnRzZXQ7CisJUGxhblN0YXRl ICAqcmVxdWVzdG9yID0gYXJlcS0+cmVxdWVzdG9yOworCVdhaXRFdmVudFNldCAqc2V0OworCUJp dG1hcHNldCAgKm5lZWRyZXF1ZXN0OwogCiAJLyogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCB1 bmxlc3MgY2FsbGJhY2tfcGVuZGluZyAqLwogCUFzc2VydChhcmVxLT5jYWxsYmFja19wZW5kaW5n KTsKIAorCXNldCA9IEdldEFwcGVuZEV2ZW50U2V0KHJlcXVlc3Rvcik7CisJbmVlZHJlcXVlc3Qg PSBHZXROZWVkUmVxdWVzdChyZXF1ZXN0b3IpOworCiAJLyoKIAkgKiBJZiBwcm9jZXNzX3BlbmRp bmdfcmVxdWVzdCgpIGhhcyBiZWVuIGludm9rZWQgb24gdGhlIGdpdmVuIHJlcXVlc3QKIAkgKiBi ZWZvcmUgd2UgZ2V0IGhlcmUsIHdlIG1pZ2h0IGhhdmUgc29tZSB0dXBsZXMgYWxyZWFkeTsgaW4g d2hpY2ggY2FzZQpAQCAtNzI5NSw3ICs3Mjk5LDcgQEAgcG9zdGdyZXNGb3JlaWduQXN5bmNDb25m aWd1cmVXYWl0KEFzeW5jUmVxdWVzdCAqYXJlcSkKIAkJICogYmVsb3csIGJlY2F1c2Ugd2UgbWln aHQgb3RoZXJ3aXNlIGVuZCB1cCB3aXRoIG5vIGNvbmZpZ3VyZWQgZXZlbnRzCiAJCSAqIG90aGVy IHRoYW4gdGhlIHBvc3RtYXN0ZXIgZGVhdGggZXZlbnQuCiAJCSAqLwotCQlpZiAoIWJtc19pc19l bXB0eShyZXF1ZXN0b3ItPmFzX25lZWRyZXF1ZXN0KSkKKwkJaWYgKCFibXNfaXNfZW1wdHkobmVl ZHJlcXVlc3QpKQogCQkJcmV0dXJuOwogCQlpZiAoR2V0TnVtUmVnaXN0ZXJlZFdhaXRFdmVudHMo c2V0KSA+IDEpCiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9z cWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19m ZHcuc3FsCmluZGV4IGI1N2Y4Y2ZkYTY4Li43NDQwMDY5M2MwOCAxMDA2NDQKLS0tIGEvY29udHJp Yi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIvY29udHJpYi9wb3N0Z3Jl c19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTM3NjQsNiArMzc2NCwxMSBAQCBJTlNFUlQg SU5UTyByZXN1bHRfdGJsIFNFTEVDVCBhLCBiLCAnQUFBJyB8fCBjIEZST00gYXN5bmNfcHQgV0hF UkUgYiA9PT0gNTA1OwogU0VMRUNUICogRlJPTSByZXN1bHRfdGJsIE9SREVSIEJZIGE7CiBERUxF VEUgRlJPTSByZXN1bHRfdGJsOwogCistLSBUZXN0IE1lcmdlQXBwZW5kCitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJFIGIgJSAxMDAgPSAw IE9SREVSIEJZIGIsIGE7CitTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJFIGIgJSAxMDAgPSAw IE9SREVSIEJZIGIsIGE7CisKIC0tIFRlc3QgZXJyb3IgaGFuZGxpbmcsIGlmIGFjY2Vzc2luZyBv bmUgb2YgdGhlIGZvcmVpZ24gcGFydGl0aW9ucyBlcnJvcnMgb3V0CiBDUkVBVEUgRk9SRUlHTiBU QUJMRSBhc3luY19wX2Jyb2tlbiBQQVJUSVRJT04gT0YgYXN5bmNfcHQgRk9SIFZBTFVFUyBGUk9N ICgxMDAwMCkgVE8gKDEwMDAxKQogICBTRVJWRVIgbG9vcGJhY2sgT1BUSU9OUyAodGFibGVfbmFt ZSAnbm9uX2V4aXN0ZW50X3RhYmxlJyk7CkBAIC0zNzg0LDYgKzM3ODksMTEgQEAgSU5TRVJUIElO VE8gcmVzdWx0X3RibCBTRUxFQ1QgKiBGUk9NIGFzeW5jX3B0IFdIRVJFIGIgPT09IDUwNTsKIFNF TEVDVCAqIEZST00gcmVzdWx0X3RibCBPUkRFUiBCWSBhOwogREVMRVRFIEZST00gcmVzdWx0X3Ri bDsKIAorLS0gVGVzdCBNZXJnZUFwcGVuZAorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBhc3luY19wdCBXSEVSRSBiID09PSA1MDUgT1JERVIgQlkgYiwgYTsKK1NF TEVDVCAqIEZST00gYXN5bmNfcHQgV0hFUkUgYiA9PT0gNTA1IE9SREVSIEJZIGIsIGE7CisKIERS T1AgRk9SRUlHTiBUQUJMRSBhc3luY19wMzsKIERST1AgVEFCTEUgYmFzZV90YmwzOwogCkBAIC0z Nzk5LDYgKzM4MDksMTEgQEAgSU5TRVJUIElOVE8gcmVzdWx0X3RibCBTRUxFQ1QgKiBGUk9NIGFz eW5jX3B0IFdIRVJFIGIgPT09IDUwNTsKIFNFTEVDVCAqIEZST00gcmVzdWx0X3RibCBPUkRFUiBC WSBhOwogREVMRVRFIEZST00gcmVzdWx0X3RibDsKIAorLS0gVGVzdCBNZXJnZUFwcGVuZAorRVhQ TEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBhc3luY19wdCBXSEVSRSBi ID09PSA1MDUgT1JERVIgQlkgYiwgYTsKK1NFTEVDVCAqIEZST00gYXN5bmNfcHQgV0hFUkUgYiA9 PT0gNTA1IE9SREVSIEJZIGIsIGE7CisKIC0tIHBhcnRpdGlvbndpc2Ugam9pbnMKIFNFVCBlbmFi bGVfcGFydGl0aW9ud2lzZV9qb2luIFRPIHRydWU7CiAKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9jb25maWcuc2dtbCBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbAppbmRleCBiMTRjNWQ4MWEx NS4uNzdiMDM3MjNkZDcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbAorKysg Yi9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKQEAgLTUzMTAsNiArNTMxMCwyMCBAQCBBTlkgPHJl cGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm51bV9zeW5jPC9yZXBsYWNlYWJsZT4gKCA8cmVw bGFjZWFibGUgY2xhc3M9IgogICAgICAgPC9saXN0aXRlbT4KICAgICAgPC92YXJsaXN0ZW50cnk+ CiAKKyAgICAgPHZhcmxpc3RlbnRyeSBpZD0iZ3VjLWVuYWJsZS1hc3luYy1tZXJnZS1hcHBlbmQi IHhyZWZsYWJlbD0iZW5hYmxlX2FzeW5jX21lcmdlX2FwcGVuZCI+CisgICAgICA8dGVybT48dmFy bmFtZT5lbmFibGVfYXN5bmNfbWVyZ2VfYXBwZW5kPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwv dHlwZT4pCisgICAgICA8aW5kZXh0ZXJtPgorICAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPmVuYWJs ZV9hc3luY19tZXJnZV9hcHBlbmQ8L3Zhcm5hbWU+IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyPC9w cmltYXJ5PgorICAgICAgPC9pbmRleHRlcm0+CisgICAgICA8L3Rlcm0+CisgICAgICA8bGlzdGl0 ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHF1ZXJ5 IHBsYW5uZXIncyB1c2Ugb2YgYXN5bmMtYXdhcmUKKyAgICAgICAgbWVyZ2UgYXBwZW5kIHBsYW4g dHlwZXMuIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPm9uPC9saXRlcmFsPi4KKyAgICAgICA8L3Bh cmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKwogICAgICA8dmFy bGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlLWJpdG1hcHNjYW4iIHhyZWZsYWJlbD0iZW5hYmxlX2Jp dG1hcHNjYW4iPgogICAgICAgPHRlcm0+PHZhcm5hbWU+ZW5hYmxlX2JpdG1hcHNjYW48L3Zhcm5h bWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKICAgICAgIDxpbmRleHRlcm0+CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjQXN5bmMuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L2V4ZWNBc3luYy5jCmluZGV4IDYxMjliODAzMzcwLi45ZDRhNGJmYTdjMSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0FzeW5jLmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0 b3IvZXhlY0FzeW5jLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJleGVjdXRvci9leGVj QXN5bmMuaCIKICNpbmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgogI2luY2x1ZGUgImV4ZWN1 dG9yL25vZGVBcHBlbmQuaCIKKyNpbmNsdWRlICJleGVjdXRvci9ub2RlTWVyZ2VBcHBlbmQuaCIK ICNpbmNsdWRlICJleGVjdXRvci9ub2RlRm9yZWlnbnNjYW4uaCIKIAogLyoKQEAgLTEyMSw2ICsx MjIsOSBAQCBFeGVjQXN5bmNSZXNwb25zZShBc3luY1JlcXVlc3QgKmFyZXEpCiAJCWNhc2UgVF9B cHBlbmRTdGF0ZToKIAkJCUV4ZWNBc3luY0FwcGVuZFJlc3BvbnNlKGFyZXEpOwogCQkJYnJlYWs7 CisJCWNhc2UgVF9NZXJnZUFwcGVuZFN0YXRlOgorCQkJRXhlY0FzeW5jTWVyZ2VBcHBlbmRSZXNw b25zZShhcmVxKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogSWYgdGhlIG5vZGUgZG9l c24ndCBzdXBwb3J0IGFzeW5jLCBjYWxsZXIgbWVzc2VkIHVwLiAqLwogCQkJZWxvZyhFUlJPUiwg InVucmVjb2duaXplZCBub2RlIHR5cGU6ICVkIiwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVNZXJnZUFwcGVuZC5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZU1lcmdl QXBwZW5kLmMKaW5kZXggZTFiOWI5ODRhN2EuLjc3NDMzNjhjMjBkIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9leGVjdXRvci9ub2RlTWVyZ2VBcHBlbmQuYworKysgYi9zcmMvYmFja2VuZC9leGVj dXRvci9ub2RlTWVyZ2VBcHBlbmQuYwpAQCAtMzksMTAgKzM5LDE1IEBACiAjaW5jbHVkZSAicG9z dGdyZXMuaCIKIAogI2luY2x1ZGUgImV4ZWN1dG9yL2V4ZWN1dG9yLmgiCisjaW5jbHVkZSAiZXhl Y3V0b3IvZXhlY0FzeW5jLmgiCiAjaW5jbHVkZSAiZXhlY3V0b3IvZXhlY1BhcnRpdGlvbi5oIgog I2luY2x1ZGUgImV4ZWN1dG9yL25vZGVNZXJnZUFwcGVuZC5oIgogI2luY2x1ZGUgImxpYi9iaW5h cnloZWFwLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAic3RvcmFnZS9sYXRj aC5oIgorI2luY2x1ZGUgInV0aWxzL3dhaXRfZXZlbnQuaCIKKworI2RlZmluZSBFVkVOVF9CVUZG RVJfU0laRSAgICAgICAgICAgICAgICAgICAgIDE2CiAKIC8qCiAgKiBXZSBoYXZlIG9uZSBzbG90 IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGhlYXAgYXJyYXkuICBXZSB1c2UgU2xvdE51bWJlcgpAQCAt NTQsNiArNTksMTIgQEAgdHlwZWRlZiBpbnQzMiBTbG90TnVtYmVyOwogc3RhdGljIFR1cGxlVGFi bGVTbG90ICpFeGVjTWVyZ2VBcHBlbmQoUGxhblN0YXRlICpwc3RhdGUpOwogc3RhdGljIGludAlo ZWFwX2NvbXBhcmVfc2xvdHMoRGF0dW0gYSwgRGF0dW0gYiwgdm9pZCAqYXJnKTsKIAorc3RhdGlj IHZvaWQgY2xhc3NpZnlfbWF0Y2hpbmdfc3VicGxhbnMoTWVyZ2VBcHBlbmRTdGF0ZSAqbm9kZSk7 CitzdGF0aWMgdm9pZCBFeGVjTWVyZ2VBcHBlbmRBc3luY0JlZ2luKE1lcmdlQXBwZW5kU3RhdGUg Km5vZGUpOworc3RhdGljIHZvaWQgRXhlY01lcmdlQXBwZW5kQXN5bmNHZXROZXh0KE1lcmdlQXBw ZW5kU3RhdGUgKm5vZGUsIGludCBtcGxhbik7CitzdGF0aWMgYm9vbCBFeGVjTWVyZ2VBcHBlbmRB c3luY1JlcXVlc3QoTWVyZ2VBcHBlbmRTdGF0ZSAqbm9kZSwgaW50IG1wbGFuKTsKK3N0YXRpYyB2 b2lkIEV4ZWNNZXJnZUFwcGVuZEFzeW5jRXZlbnRXYWl0KE1lcmdlQXBwZW5kU3RhdGUgKm5vZGUp OworCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KICAqCQlFeGVjSW5pdE1lcmdlQXBwZW5kCkBAIC03MCw2ICs4MSw4 IEBAIEV4ZWNJbml0TWVyZ2VBcHBlbmQoTWVyZ2VBcHBlbmQgKm5vZGUsIEVTdGF0ZSAqZXN0YXRl LCBpbnQgZWZsYWdzKQogCWludAkJCW5wbGFuczsKIAlpbnQJCQlpLAogCQkJCWo7CisJQml0bWFw c2V0ICAqYXN5bmNwbGFuczsKKwlpbnQJCQluYXN5bmNwbGFuczsKIAogCS8qIGNoZWNrIGZvciB1 bnN1cHBvcnRlZCBmbGFncyAqLwogCUFzc2VydCghKGVmbGFncyAmIChFWEVDX0ZMQUdfQkFDS1dB UkQgfCBFWEVDX0ZMQUdfTUFSSykpKTsKQEAgLTEwNCw3ICsxMTcsMTAgQEAgRXhlY0luaXRNZXJn ZUFwcGVuZChNZXJnZUFwcGVuZCAqbm9kZSwgRVN0YXRlICplc3RhdGUsIGludCBlZmxhZ3MpCiAJ CSAqIGxhdGVyIGNhbGxzIHRvIEV4ZWNGaW5kTWF0Y2hpbmdTdWJQbGFucy4KIAkJICovCiAJCWlm ICghcHJ1bmVzdGF0ZS0+ZG9fZXhlY19wcnVuZSAmJiBucGxhbnMgPiAwKQorCQl7CiAJCQltZXJn ZXN0YXRlLT5tc192YWxpZF9zdWJwbGFucyA9IGJtc19hZGRfcmFuZ2UoTlVMTCwgMCwgbnBsYW5z IC0gMSk7CisJCQltZXJnZXN0YXRlLT5tc192YWxpZF9zdWJwbGFuc19pZGVudGlmaWVkID0gdHJ1 ZTsKKwkJfQogCX0KIAllbHNlCiAJewpAQCAtMTE3LDYgKzEzMyw3IEBAIEV4ZWNJbml0TWVyZ2VB cHBlbmQoTWVyZ2VBcHBlbmQgKm5vZGUsIEVTdGF0ZSAqZXN0YXRlLCBpbnQgZWZsYWdzKQogCQlB c3NlcnQobnBsYW5zID4gMCk7CiAJCW1lcmdlc3RhdGUtPm1zX3ZhbGlkX3N1YnBsYW5zID0gdmFs aWRzdWJwbGFucyA9CiAJCQlibXNfYWRkX3JhbmdlKE5VTEwsIDAsIG5wbGFucyAtIDEpOworCQlt ZXJnZXN0YXRlLT5tc192YWxpZF9zdWJwbGFuc19pZGVudGlmaWVkID0gdHJ1ZTsKIAkJbWVyZ2Vz dGF0ZS0+bXNfcHJ1bmVfc3RhdGUgPSBOVUxMOwogCX0KIApAQCAtMTQ1LDE2ICsxNjIsNjkgQEAg RXhlY0luaXRNZXJnZUFwcGVuZChNZXJnZUFwcGVuZCAqbm9kZSwgRVN0YXRlICplc3RhdGUsIGlu dCBlZmxhZ3MpCiAJICogdGhlIHJlc3VsdHMgaW50byB0aGUgbWVyZ2VwbGFuc3RhdGVzIGFycmF5 LgogCSAqLwogCWogPSAwOworCWFzeW5jcGxhbnMgPSBOVUxMOworCW5hc3luY3BsYW5zID0gMDsK KwogCWkgPSAtMTsKIAl3aGlsZSAoKGkgPSBibXNfbmV4dF9tZW1iZXIodmFsaWRzdWJwbGFucywg aSkpID49IDApCiAJewogCQlQbGFuCSAgICppbml0Tm9kZSA9IChQbGFuICopIGxpc3RfbnRoKG5v ZGUtPm1lcmdlcGxhbnMsIGkpOwogCisJCS8qCisJCSAqIFJlY29yZCBhc3luYyBzdWJwbGFucy4g IFdoZW4gZXhlY3V0aW5nIEV2YWxQbGFuUXVhbCwgd2UgdHJlYXQgdGhlbQorCQkgKiBhcyBzeW5j IG9uZXM7IGRvbid0IGRvIHRoaXMgd2hlbiBpbml0aWFsaXppbmcgYW4gRXZhbFBsYW5RdWFsIHBs YW4KKwkJICogdHJlZS4KKwkJICovCisJCWlmIChpbml0Tm9kZS0+YXN5bmNfY2FwYWJsZSAmJiBl c3RhdGUtPmVzX2VwcV9hY3RpdmUgPT0gTlVMTCkKKwkJeworCQkJYXN5bmNwbGFucyA9IGJtc19h ZGRfbWVtYmVyKGFzeW5jcGxhbnMsIGopOworCQkJbmFzeW5jcGxhbnMrKzsKKwkJfQorCiAJCW1l cmdlcGxhbnN0YXRlc1tqKytdID0gRXhlY0luaXROb2RlKGluaXROb2RlLCBlc3RhdGUsIGVmbGFn cyk7CiAJfQogCiAJbWVyZ2VzdGF0ZS0+cHMucHNfUHJvakluZm8gPSBOVUxMOwogCisJLyogSW5p dGlhbGl6ZSBhc3luYyBzdGF0ZSAqLworCW1lcmdlc3RhdGUtPm1zX2FzeW5jcGxhbnMgPSBhc3lu Y3BsYW5zOworCW1lcmdlc3RhdGUtPm1zX25hc3luY3BsYW5zID0gbmFzeW5jcGxhbnM7CisJbWVy Z2VzdGF0ZS0+bXNfYXN5bmNyZXF1ZXN0cyA9IE5VTEw7CisJbWVyZ2VzdGF0ZS0+bXNfYXN5bmNy ZXN1bHRzID0gTlVMTDsKKwltZXJnZXN0YXRlLT5tc19oYXNfYXN5bmNyZXN1bHRzID0gTlVMTDsK KwltZXJnZXN0YXRlLT5tc19hc3luY3JlbWFpbiA9IE5VTEw7CisJbWVyZ2VzdGF0ZS0+bXNfbmVl ZHJlcXVlc3QgPSBOVUxMOworCW1lcmdlc3RhdGUtPm1zX2V2ZW50c2V0ID0gTlVMTDsKKwltZXJn ZXN0YXRlLT5tc192YWxpZF9hc3luY3BsYW5zID0gTlVMTDsKKworCWlmIChuYXN5bmNwbGFucyA+ IDApCisJeworCQltZXJnZXN0YXRlLT5tc19hc3luY3JlcXVlc3RzID0gKEFzeW5jUmVxdWVzdCAq KikKKwkJCXBhbGxvYzAobnBsYW5zICogc2l6ZW9mKEFzeW5jUmVxdWVzdCAqKSk7CisKKwkJaSA9 IC0xOworCQl3aGlsZSAoKGkgPSBibXNfbmV4dF9tZW1iZXIoYXN5bmNwbGFucywgaSkpID49IDAp CisJCXsKKwkJCUFzeW5jUmVxdWVzdCAqYXJlcTsKKworCQkJYXJlcSA9IHBhbGxvYyhzaXplb2Yo QXN5bmNSZXF1ZXN0KSk7CisJCQlhcmVxLT5yZXF1ZXN0b3IgPSAoUGxhblN0YXRlICopIG1lcmdl c3RhdGU7CisJCQlhcmVxLT5yZXF1ZXN0ZWUgPSBtZXJnZXBsYW5zdGF0ZXNbaV07CisJCQlhcmVx LT5yZXF1ZXN0X2luZGV4ID0gaTsKKwkJCWFyZXEtPmNhbGxiYWNrX3BlbmRpbmcgPSBmYWxzZTsK KwkJCWFyZXEtPnJlcXVlc3RfY29tcGxldGUgPSBmYWxzZTsKKwkJCWFyZXEtPnJlc3VsdCA9IE5V TEw7CisKKwkJCW1lcmdlc3RhdGUtPm1zX2FzeW5jcmVxdWVzdHNbaV0gPSBhcmVxOworCQl9CisK KwkJbWVyZ2VzdGF0ZS0+bXNfYXN5bmNyZXN1bHRzID0gKFR1cGxlVGFibGVTbG90ICoqKQorCQkJ cGFsbG9jMChucGxhbnMgKiBzaXplb2YoVHVwbGVUYWJsZVNsb3QgKikpOworCisJCWlmIChtZXJn ZXN0YXRlLT5tc192YWxpZF9zdWJwbGFuc19pZGVudGlmaWVkKQorCQkJY2xhc3NpZnlfbWF0Y2hp bmdfc3VicGxhbnMobWVyZ2VzdGF0ZSk7CisJfQorCiAJLyoKIAkgKiBpbml0aWFsaXplIHNvcnQt a2V5IGluZm9ybWF0aW9uCiAJICovCkBAIC0yMTYsOSArMjg2LDE2IEBAIEV4ZWNNZXJnZUFwcGVu ZChQbGFuU3RhdGUgKnBzdGF0ZSkKIAkJICogcnVuLXRpbWUgcHJ1bmluZyBpcyBkaXNhYmxlZCB0 aGVuIHRoZSB2YWxpZCBzdWJwbGFucyB3aWxsIGFsd2F5cyBiZQogCQkgKiBzZXQgdG8gYWxsIHN1 YnBsYW5zLgogCQkgKi8KLQkJaWYgKG5vZGUtPm1zX3ZhbGlkX3N1YnBsYW5zID09IE5VTEwpCisJ CWlmICghbm9kZS0+bXNfdmFsaWRfc3VicGxhbnNfaWRlbnRpZmllZCkKKwkJewogCQkJbm9kZS0+ bXNfdmFsaWRfc3VicGxhbnMgPQogCQkJCUV4ZWNGaW5kTWF0Y2hpbmdTdWJQbGFucyhub2RlLT5t c19wcnVuZV9zdGF0ZSwgZmFsc2UpOworCQkJbm9kZS0+bXNfdmFsaWRfc3VicGxhbnNfaWRlbnRp ZmllZCA9IHRydWU7CisJCX0KKworCQkvKiBJZiB0aGVyZSBhcmUgYW55IGFzeW5jIHN1YnBsYW5z LCBiZWdpbiBleGVjdXRpbmcgdGhlbS4gKi8KKwkJaWYgKG5vZGUtPm1zX25hc3luY3BsYW5zID4g MCkKKwkJCUV4ZWNNZXJnZUFwcGVuZEFzeW5jQmVnaW4obm9kZSk7CiAKIAkJLyoKIAkJICogRmly c3QgdGltZSB0aHJvdWdoOiBwdWxsIHRoZSBmaXJzdCB0dXBsZSBmcm9tIGVhY2ggdmFsaWQgc3Vi cGxhbiwKQEAgLTIzMSw2ICszMDgsMTYgQEAgRXhlY01lcmdlQXBwZW5kKFBsYW5TdGF0ZSAqcHN0 YXRlKQogCQkJaWYgKCFUdXBJc051bGwobm9kZS0+bXNfc2xvdHNbaV0pKQogCQkJCWJpbmFyeWhl YXBfYWRkX3Vub3JkZXJlZChub2RlLT5tc19oZWFwLCBJbnQzMkdldERhdHVtKGkpKTsKIAkJfQor CisJCS8qIExvb2sgYXQgYXN5bmMgc3VicGxhbnMgKi8KKwkJaSA9IC0xOworCQl3aGlsZSAoKGkg PSBibXNfbmV4dF9tZW1iZXIobm9kZS0+bXNfYXN5bmNwbGFucywgaSkpID49IDApCisJCXsKKwkJ CUV4ZWNNZXJnZUFwcGVuZEFzeW5jR2V0TmV4dChub2RlLCBpKTsKKwkJCWlmICghVHVwSXNOdWxs KG5vZGUtPm1zX3Nsb3RzW2ldKSkKKwkJCQliaW5hcnloZWFwX2FkZF91bm9yZGVyZWQobm9kZS0+ bXNfaGVhcCwgSW50MzJHZXREYXR1bShpKSk7CisJCX0KKwogCQliaW5hcnloZWFwX2J1aWxkKG5v ZGUtPm1zX2hlYXApOwogCQlub2RlLT5tc19pbml0aWFsaXplZCA9IHRydWU7CiAJfQpAQCAtMjQ1 LDcgKzMzMiwxMyBAQCBFeGVjTWVyZ2VBcHBlbmQoUGxhblN0YXRlICpwc3RhdGUpCiAJCSAqIHRv IG5vdCBwdWxsIHR1cGxlcyB1bnRpbCBuZWNlc3NhcnkuKQogCQkgKi8KIAkJaSA9IERhdHVtR2V0 SW50MzIoYmluYXJ5aGVhcF9maXJzdChub2RlLT5tc19oZWFwKSk7Ci0JCW5vZGUtPm1zX3Nsb3Rz W2ldID0gRXhlY1Byb2NOb2RlKG5vZGUtPm1lcmdlcGxhbnNbaV0pOworCQlpZiAoYm1zX2lzX21l bWJlcihpLCBub2RlLT5tc19hc3luY3BsYW5zKSkKKwkJCUV4ZWNNZXJnZUFwcGVuZEFzeW5jR2V0 TmV4dChub2RlLCBpKTsKKwkJZWxzZQorCQl7CisJCQlBc3NlcnQoYm1zX2lzX21lbWJlcihpLCBu b2RlLT5tc192YWxpZF9zdWJwbGFucykpOworCQkJbm9kZS0+bXNfc2xvdHNbaV0gPSBFeGVjUHJv Y05vZGUobm9kZS0+bWVyZ2VwbGFuc1tpXSk7CisJCX0KIAkJaWYgKCFUdXBJc051bGwobm9kZS0+ bXNfc2xvdHNbaV0pKQogCQkJYmluYXJ5aGVhcF9yZXBsYWNlX2ZpcnN0KG5vZGUtPm1zX2hlYXAs IEludDMyR2V0RGF0dW0oaSkpOwogCQllbHNlCkBAIC0yNjEsNiArMzU0LDggQEAgRXhlY01lcmdl QXBwZW5kKFBsYW5TdGF0ZSAqcHN0YXRlKQogCXsKIAkJaSA9IERhdHVtR2V0SW50MzIoYmluYXJ5 aGVhcF9maXJzdChub2RlLT5tc19oZWFwKSk7CiAJCXJlc3VsdCA9IG5vZGUtPm1zX3Nsb3RzW2ld OworCQkvKiAgRm9yIGFzeW5jIHBsYW4gcmVjb3JkIHRoYXQgd2UgY2FuIGdldCB0aGUgbmV4dCB0 dXBsZSAqLworCQlub2RlLT5tc19oYXNfYXN5bmNyZXN1bHRzID0gYm1zX2RlbF9tZW1iZXIobm9k ZS0+bXNfaGFzX2FzeW5jcmVzdWx0cywgaSk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM0 MCw2ICs0MzUsNyBAQCB2b2lkCiBFeGVjUmVTY2FuTWVyZ2VBcHBlbmQoTWVyZ2VBcHBlbmRTdGF0 ZSAqbm9kZSkKIHsKIAlpbnQJCQlpOworCWludAkJCW5hc3luY3BsYW5zID0gbm9kZS0+bXNfbmFz eW5jcGxhbnM7CiAKIAkvKgogCSAqIElmIGFueSBQQVJBTV9FWEVDIFBhcmFtcyB1c2VkIGluIHBy dW5pbmcgZXhwcmVzc2lvbnMgaGF2ZSBjaGFuZ2VkLCB0aGVuCkBAIC0zNTAsOCArNDQ2LDExIEBA IEV4ZWNSZVNjYW5NZXJnZUFwcGVuZChNZXJnZUFwcGVuZFN0YXRlICpub2RlKQogCQlibXNfb3Zl cmxhcChub2RlLT5wcy5jaGdQYXJhbSwKIAkJCQkJbm9kZS0+bXNfcHJ1bmVfc3RhdGUtPmV4ZWNw YXJhbWlkcykpCiAJeworCQlub2RlLT5tc192YWxpZF9zdWJwbGFuc19pZGVudGlmaWVkID0gZmFs c2U7CiAJCWJtc19mcmVlKG5vZGUtPm1zX3ZhbGlkX3N1YnBsYW5zKTsKIAkJbm9kZS0+bXNfdmFs aWRfc3VicGxhbnMgPSBOVUxMOworCQlibXNfZnJlZShub2RlLT5tc192YWxpZF9hc3luY3BsYW5z KTsKKwkJbm9kZS0+bXNfdmFsaWRfYXN5bmNwbGFucyA9IE5VTEw7CiAJfQogCiAJZm9yIChpID0g MDsgaSA8IG5vZGUtPm1zX25wbGFuczsgaSsrKQpAQCAtMzcyLDYgKzQ3MSwzNjEgQEAgRXhlY1Jl U2Nhbk1lcmdlQXBwZW5kKE1lcmdlQXBwZW5kU3RhdGUgKm5vZGUpCiAJCWlmIChzdWJub2RlLT5j aGdQYXJhbSA9PSBOVUxMKQogCQkJRXhlY1JlU2NhbihzdWJub2RlKTsKIAl9CisKKwkvKiBSZXNl dCBhc3luYyBzdGF0ZSAqLworCWlmIChuYXN5bmNwbGFucyA+IDApCisJeworCQlpID0gLTE7CisJ CXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcihub2RlLT5tc19hc3luY3BsYW5zLCBpKSkgPj0g MCkKKwkJeworCQkJQXN5bmNSZXF1ZXN0ICphcmVxID0gbm9kZS0+bXNfYXN5bmNyZXF1ZXN0c1tp XTsKKworCQkJYXJlcS0+Y2FsbGJhY2tfcGVuZGluZyA9IGZhbHNlOworCQkJYXJlcS0+cmVxdWVz dF9jb21wbGV0ZSA9IGZhbHNlOworCQkJYXJlcS0+cmVzdWx0ID0gTlVMTDsKKwkJfQorCisJCWJt c19mcmVlKG5vZGUtPm1zX2FzeW5jcmVtYWluKTsKKwkJbm9kZS0+bXNfYXN5bmNyZW1haW4gPSBO VUxMOworCQlibXNfZnJlZShub2RlLT5tc19uZWVkcmVxdWVzdCk7CisJCW5vZGUtPm1zX25lZWRy ZXF1ZXN0ID0gTlVMTDsKKwkJYm1zX2ZyZWUobm9kZS0+bXNfaGFzX2FzeW5jcmVzdWx0cyk7CisJ CW5vZGUtPm1zX2hhc19hc3luY3Jlc3VsdHMgPSBOVUxMOworCX0KIAliaW5hcnloZWFwX3Jlc2V0 KG5vZGUtPm1zX2hlYXApOwogCW5vZGUtPm1zX2luaXRpYWxpemVkID0gZmFsc2U7CiB9CisKKy8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqICAgICAgICAgICAgICBjbGFzc2lmeV9tYXRjaGluZ19zdWJwbGFucworICoK KyAqICAgICAgICAgICAgICBDbGFzc2lmeSB0aGUgbm9kZSdzIG1zX3ZhbGlkX3N1YnBsYW5zIGlu dG8gc3luYyBvbmVzIGFuZAorICogICAgICAgICAgICAgIGFzeW5jIG9uZXMsIGFkanVzdCBpdCB0 byBjb250YWluIHN5bmMgb25lcyBvbmx5LCBhbmQgc2F2ZQorICogICAgICAgICAgICAgIGFzeW5j IG9uZXMgaW4gdGhlIG5vZGUncyBtc192YWxpZF9hc3luY3BsYW5zLgorICogLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICov CitzdGF0aWMgdm9pZAorY2xhc3NpZnlfbWF0Y2hpbmdfc3VicGxhbnMoTWVyZ2VBcHBlbmRTdGF0 ZSAqbm9kZSkKK3sKKwlCaXRtYXBzZXQgICp2YWxpZF9hc3luY3BsYW5zOworCisJQXNzZXJ0KG5v ZGUtPm1zX3ZhbGlkX3N1YnBsYW5zX2lkZW50aWZpZWQpOworCUFzc2VydChub2RlLT5tc192YWxp ZF9hc3luY3BsYW5zID09IE5VTEwpOworCisJLyogTm90aGluZyB0byBkbyBpZiB0aGVyZSBhcmUg bm8gdmFsaWQgc3VicGxhbnMuICovCisJaWYgKGJtc19pc19lbXB0eShub2RlLT5tc192YWxpZF9z dWJwbGFucykpCisJeworCQlub2RlLT5tc19hc3luY3JlbWFpbiA9IE5VTEw7CisJCXJldHVybjsK Kwl9CisKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBhc3luYyBzdWJw bGFucy4gKi8KKwlpZiAoIWJtc19vdmVybGFwKG5vZGUtPm1zX3ZhbGlkX3N1YnBsYW5zLCBub2Rl LT5tc19hc3luY3BsYW5zKSkKKwl7CisJCW5vZGUtPm1zX2FzeW5jcmVtYWluID0gTlVMTDsKKwkJ cmV0dXJuOworCX0KKworCS8qIEdldCB2YWxpZCBhc3luYyBzdWJwbGFucy4gKi8KKwl2YWxpZF9h c3luY3BsYW5zID0gYm1zX2ludGVyc2VjdChub2RlLT5tc19hc3luY3BsYW5zLAorCQkJCQkJCQkg ICBub2RlLT5tc192YWxpZF9zdWJwbGFucyk7CisKKwkvKiBBZGp1c3QgdGhlIHZhbGlkIHN1YnBs YW5zIHRvIGNvbnRhaW4gc3luYyBzdWJwbGFucyBvbmx5LiAqLworCW5vZGUtPm1zX3ZhbGlkX3N1 YnBsYW5zID0gYm1zX2RlbF9tZW1iZXJzKG5vZGUtPm1zX3ZhbGlkX3N1YnBsYW5zLAorCQkJCQkJ CQkJCQkgIHZhbGlkX2FzeW5jcGxhbnMpOworCisJLyogU2F2ZSB2YWxpZCBhc3luYyBzdWJwbGFu cy4gKi8KKwlub2RlLT5tc192YWxpZF9hc3luY3BsYW5zID0gdmFsaWRfYXN5bmNwbGFuczsKK30K KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgIEV4ZWNNZXJnZUFwcGVuZEFzeW5jQmVnaW4K KyAqCisgKiAgICAgICAgICAgICAgQmVnaW4gZXhlY3V0aW5nIGRlc2lnbmVkIGFzeW5jLWNhcGFi bGUgc3VicGxhbnMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkCitFeGVjTWVyZ2VBcHBl bmRBc3luY0JlZ2luKE1lcmdlQXBwZW5kU3RhdGUgKm5vZGUpCit7CisJaW50CQkJaTsKKworCS8q IEJhY2t3YXJkIHNjYW4gaXMgbm90IHN1cHBvcnRlZCBieSBhc3luYy1hd2FyZSBNZXJnZUFwcGVu ZHMuICovCisJQXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQobm9kZS0+cHMuc3RhdGUtPmVz X2RpcmVjdGlvbikpOworCisJLyogV2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHRoZXJl IGFyZSBubyBzdWJwbGFucyAqLworCUFzc2VydChub2RlLT5tc19ucGxhbnMgPiAwKTsKKworCS8q IFdlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgbm8gYXN5bmMgc3VicGxh bnMuICovCisJQXNzZXJ0KG5vZGUtPm1zX25hc3luY3BsYW5zID4gMCk7CisKKwkvKiBJZiB3ZSd2 ZSB5ZXQgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCBzdWJwbGFucyB0aGVuIGRvIHNvIG5vdy4gKi8K KwlpZiAoIW5vZGUtPm1zX3ZhbGlkX3N1YnBsYW5zX2lkZW50aWZpZWQpCisJeworCQlub2RlLT5t c192YWxpZF9zdWJwbGFucyA9CisJCQlFeGVjRmluZE1hdGNoaW5nU3ViUGxhbnMobm9kZS0+bXNf cHJ1bmVfc3RhdGUsIGZhbHNlKTsKKwkJbm9kZS0+bXNfdmFsaWRfc3VicGxhbnNfaWRlbnRpZmll ZCA9IHRydWU7CisKKwkJY2xhc3NpZnlfbWF0Y2hpbmdfc3VicGxhbnMobm9kZSk7CisJfQorCisJ LyogSW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMuICovCisJbm9kZS0+bXNfYXN5bmNyZW1haW4g PSBibXNfY29weShub2RlLT5tc192YWxpZF9hc3luY3BsYW5zKTsKKworCS8qIE5vdGhpbmcgdG8g ZG8gaWYgdGhlcmUgYXJlIG5vIHZhbGlkIGFzeW5jIHN1YnBsYW5zLiAqLworCWlmIChibXNfaXNf ZW1wdHkobm9kZS0+bXNfYXN5bmNyZW1haW4pKQorCQlyZXR1cm47CisKKwkvKiBNYWtlIGEgcmVx dWVzdCBmb3IgZWFjaCBvZiB0aGUgdmFsaWQgYXN5bmMgc3VicGxhbnMuICovCisJaSA9IC0xOwor CXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcihub2RlLT5tc192YWxpZF9hc3luY3BsYW5zLCBp KSkgPj0gMCkKKwl7CisJCUFzeW5jUmVxdWVzdCAqYXJlcSA9IG5vZGUtPm1zX2FzeW5jcmVxdWVz dHNbaV07CisKKwkJQXNzZXJ0KGFyZXEtPnJlcXVlc3RfaW5kZXggPT0gaSk7CisJCUFzc2VydCgh YXJlcS0+Y2FsbGJhY2tfcGVuZGluZyk7CisKKwkJLyogRG8gdGhlIGFjdHVhbCB3b3JrLiAqLwor CQlFeGVjQXN5bmNSZXF1ZXN0KGFyZXEpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAg ICAgICAgIEV4ZWNNZXJnZUFwcGVuZEFzeW5jR2V0TmV4dAorICoKKyAqICAgICAgICAgICAgICBH ZXQgdGhlIG5leHQgdHVwbGUgZnJvbSBzcGVjaWZpZWQgYXN5bmNocm9ub3VzIHN1YnBsYW4uCisg KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkCitFeGVjTWVyZ2VBcHBlbmRBc3luY0dldE5leHQo TWVyZ2VBcHBlbmRTdGF0ZSAqbm9kZSwgaW50IG1wbGFuKQoreworCW5vZGUtPm1zX3Nsb3RzW21w bGFuXSA9IE5VTEw7CisKKwkvKiBSZXF1ZXN0IGEgdHVwbGUgYXN5bmNocm9ub3VzbHkuICovCisJ aWYgKEV4ZWNNZXJnZUFwcGVuZEFzeW5jUmVxdWVzdChub2RlLCBtcGxhbikpCisJCXJldHVybjsK KworCS8qCisJICogbm9kZS0+bXNfYXN5bmNyZW1haW4gY2FuIGJlIE5VTEwgaWYgd2UgaGF2ZSBm ZXRjaGVkIHR1cGxlcywgYnV0IGhhdmVuJ3QKKwkgKiByZXR1cm5lZCB0aGVtIHlldC4gSW4gdGhp cyBjYXNlIEV4ZWNNZXJnZUFwcGVuZEFzeW5jUmVxdWVzdCgpIGFib3ZlIGp1c3QKKwkgKiByZXR1 cm5zIHR1cGxlcyB3aXRob3V0IHBlcmZvcm1pbmcgYSByZXF1ZXN0LgorCSAqLworCXdoaWxlIChi bXNfaXNfbWVtYmVyKG1wbGFuLCBub2RlLT5tc19hc3luY3JlbWFpbikpCisJeworCQlDSEVDS19G T1JfSU5URVJSVVBUUygpOworCisJCS8qIFdhaXQgb3IgcG9sbCBmb3IgYXN5bmMgZXZlbnRzLiAq LworCQlFeGVjTWVyZ2VBcHBlbmRBc3luY0V2ZW50V2FpdChub2RlKTsKKworCQkvKiBSZXF1ZXN0 IGEgdHVwbGUgYXN5bmNocm9ub3VzbHkuICovCisJCWlmIChFeGVjTWVyZ2VBcHBlbmRBc3luY1Jl cXVlc3Qobm9kZSwgbXBsYW4pKQorCQkJcmV0dXJuOworCisJCS8qCisJCSAqIFdhaXRpbmcgdW50 aWwgdGhlcmUncyBubyBhc3luYyByZXF1ZXN0cyBwZW5kaW5nIG9yIHdlIGdvdCBzb21lCisJCSAq IHR1cGxlcyBmcm9tIG91ciByZXF1ZXN0CisJCSAqLworCX0KKworCS8qIE5vIHR1cGxlcyAqLwor CXJldHVybjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgIEV4ZWNNZXJnZUFwcGVu ZEFzeW5jUmVxdWVzdAorICoKKyAqICAgICAgICAgICAgICBSZXF1ZXN0IGEgdHVwbGUgYXN5bmNo cm9ub3VzbHkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBib29sCitFeGVjTWVyZ2VBcHBlbmRB c3luY1JlcXVlc3QoTWVyZ2VBcHBlbmRTdGF0ZSAqbm9kZSwgaW50IG1wbGFuKQoreworCUJpdG1h cHNldCAgKm5lZWRyZXF1ZXN0OworCWludAkJCWk7CisKKwkvKgorCSAqIElmIHdlJ3ZlIGFscmVh ZHkgZmV0Y2hlZCBuZWNlc3NhcnkgZGF0YSwganVzdCByZXR1cm4gaXQKKwkgKi8KKwlpZiAoYm1z X2lzX21lbWJlcihtcGxhbiwgbm9kZS0+bXNfaGFzX2FzeW5jcmVzdWx0cykpCisJeworCQlub2Rl LT5tc19zbG90c1ttcGxhbl0gPSBub2RlLT5tc19hc3luY3Jlc3VsdHNbbXBsYW5dOworCQlyZXR1 cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIEdldCBhIGxpc3Qgb2YgbWVtYmVycyB3aGljaCBjYW4g cHJvY2VzcyByZXF1ZXN0IGFuZCBkb24ndCBoYXZlIGRhdGEKKwkgKiByZWFkeS4KKwkgKi8KKwlu ZWVkcmVxdWVzdCA9IE5VTEw7CisJaSA9IC0xOworCXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJl cihub2RlLT5tc19uZWVkcmVxdWVzdCwgaSkpID49IDApCisJeworCQlpZiAoIWJtc19pc19tZW1i ZXIoaSwgbm9kZS0+bXNfaGFzX2FzeW5jcmVzdWx0cykpCisJCQluZWVkcmVxdWVzdCA9IGJtc19h ZGRfbWVtYmVyKG5lZWRyZXF1ZXN0LCBpKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8g bWVtYmVycywgd2hpY2ggc3RpbGwgbmVlZCByZXF1ZXN0LCBubyBuZWVkIHRvIHNlbmQgaXQuCisJ ICovCisJaWYgKGJtc19pc19lbXB0eShuZWVkcmVxdWVzdCkpCisJCXJldHVybiBmYWxzZTsKKwor CS8qIENsZWFyIG1zX25lZWRyZXF1ZXN0IGZsYWcsIGFzIHdlIGFyZSBnb2luZyB0byBzZW5kIHJl cXVlc3RzIG5vdyAqLworCW5vZGUtPm1zX25lZWRyZXF1ZXN0ID0gYm1zX2RlbF9tZW1iZXJzKG5v ZGUtPm1zX25lZWRyZXF1ZXN0LCBuZWVkcmVxdWVzdCk7CisKKwkvKiBNYWtlIGEgbmV3IHJlcXVl c3QgZm9yIGVhY2ggb2YgdGhlIGFzeW5jIHN1YnBsYW5zIHRoYXQgbmVlZCBpdC4gKi8KKwlpID0g LTE7CisJd2hpbGUgKChpID0gYm1zX25leHRfbWVtYmVyKG5lZWRyZXF1ZXN0LCBpKSkgPj0gMCkK Kwl7CisJCUFzeW5jUmVxdWVzdCAqYXJlcSA9IG5vZGUtPm1zX2FzeW5jcmVxdWVzdHNbaV07CisK KwkJLyoKKwkJICogV2UndmUganVzdCBjaGVja2VkIHRoYXQgc3VicGxhbiBkb2Vzbid0IGFscmVh ZHkgaGF2ZSBzb21lIGZldGNoZWQKKwkJICogZGF0YQorCQkgKi8KKwkJQXNzZXJ0KCFibXNfaXNf bWVtYmVyKGksIG5vZGUtPm1zX2hhc19hc3luY3Jlc3VsdHMpKTsKKworCQkvKiBEbyB0aGUgYWN0 dWFsIHdvcmsuICovCisJCUV4ZWNBc3luY1JlcXVlc3QoYXJlcSk7CisJfQorCWJtc19mcmVlKG5l ZWRyZXF1ZXN0KTsKKworCS8qIFJldHVybiBuZWVkZWQgYXN5bmNocm9ub3VzbHktZ2VuZXJhdGVk IHJlc3VsdHMgaWYgYW55LiAqLworCWlmIChibXNfaXNfbWVtYmVyKG1wbGFuLCBub2RlLT5tc19o YXNfYXN5bmNyZXN1bHRzKSkKKwl7CisJCW5vZGUtPm1zX3Nsb3RzW21wbGFuXSA9IG5vZGUtPm1z X2FzeW5jcmVzdWx0c1ttcGxhbl07CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxz ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgIEV4ZWNBc3luY01lcmdlQXBwZW5k UmVzcG9uc2UKKyAqCisgKiAgICAgICAgICAgICAgUmVjZWl2ZSBhIHJlc3BvbnNlIGZyb20gYW4g YXN5bmNocm9ub3VzIHJlcXVlc3Qgd2UgbWFkZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZAorRXhl Y0FzeW5jTWVyZ2VBcHBlbmRSZXNwb25zZShBc3luY1JlcXVlc3QgKmFyZXEpCit7CisJTWVyZ2VB cHBlbmRTdGF0ZSAqbm9kZSA9IChNZXJnZUFwcGVuZFN0YXRlICopIGFyZXEtPnJlcXVlc3RvcjsK KwlUdXBsZVRhYmxlU2xvdCAqc2xvdCA9IGFyZXEtPnJlc3VsdDsKKworCS8qIFRoZSByZXN1bHQg c2hvdWxkIGJlIGEgVHVwbGVUYWJsZVNsb3Qgb3IgTlVMTC4gKi8KKwlBc3NlcnQoc2xvdCA9PSBO VUxMIHx8IElzQShzbG90LCBUdXBsZVRhYmxlU2xvdCkpOworCUFzc2VydCghYm1zX2lzX21lbWJl cihhcmVxLT5yZXF1ZXN0X2luZGV4LCBub2RlLT5tc19oYXNfYXN5bmNyZXN1bHRzKSk7CisKKwlu b2RlLT5tc19hc3luY3Jlc3VsdHNbYXJlcS0+cmVxdWVzdF9pbmRleF0gPSBOVUxMOworCS8qIE5v dGhpbmcgdG8gZG8gaWYgdGhlIHJlcXVlc3QgaXMgcGVuZGluZy4gKi8KKwlpZiAoIWFyZXEtPnJl cXVlc3RfY29tcGxldGUpCisJeworCQkvKiBUaGUgcmVxdWVzdCB3b3VsZCBoYXZlIGJlZW4gcGVu ZGluZyBmb3IgYSBjYWxsYmFjay4gKi8KKwkJQXNzZXJ0KGFyZXEtPmNhbGxiYWNrX3BlbmRpbmcp OworCQlyZXR1cm47CisJfQorCisJLyogSWYgdGhlIHJlc3VsdCBpcyBOVUxMIG9yIGFuIGVtcHR5 IHNsb3QsIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvLiAqLworCWlmIChUdXBJc051bGwoc2xv dCkpCisJeworCQkvKiBUaGUgZW5kaW5nIHN1YnBsYW4gd291bGRuJ3QgaGF2ZSBiZWVuIHBlbmRp bmcgZm9yIGEgY2FsbGJhY2suICovCisJCUFzc2VydCghYXJlcS0+Y2FsbGJhY2tfcGVuZGluZyk7 CisJCW5vZGUtPm1zX2FzeW5jcmVtYWluID0gYm1zX2RlbF9tZW1iZXIobm9kZS0+bXNfYXN5bmNy ZW1haW4sIGFyZXEtPnJlcXVlc3RfaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJbm9kZS0+bXNf aGFzX2FzeW5jcmVzdWx0cyA9IGJtc19hZGRfbWVtYmVyKG5vZGUtPm1zX2hhc19hc3luY3Jlc3Vs dHMsIGFyZXEtPnJlcXVlc3RfaW5kZXgpOworCS8qIFNhdmUgcmVzdWx0IHNvIHdlIGNhbiByZXR1 cm4gaXQuICovCisJbm9kZS0+bXNfYXN5bmNyZXN1bHRzW2FyZXEtPnJlcXVlc3RfaW5kZXhdID0g c2xvdDsKKworCS8qCisJICogTWFyayB0aGUgc3VicGxhbiB0aGF0IHJldHVybmVkIGEgcmVzdWx0 IGFzIHJlYWR5IGZvciBhIG5ldyByZXF1ZXN0LiAgV2UKKwkgKiBkb24ndCBsYXVuY2ggYW5vdGhl ciBvbmUgaGVyZSBpbW1lZGlhdGVseSBiZWNhdXNlIGl0IG1pZ2h0IGNvbXBsZXRlLgorCSAqLwor CW5vZGUtPm1zX25lZWRyZXF1ZXN0ID0gYm1zX2FkZF9tZW1iZXIobm9kZS0+bXNfbmVlZHJlcXVl c3QsCisJCQkJCQkJCQkJICBhcmVxLT5yZXF1ZXN0X2luZGV4KTsKK30KKworLyogLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor ICoJCUV4ZWNNZXJnZUFwcGVuZEFzeW5jRXZlbnRXYWl0CisgKgorICoJCVdhaXQgb3IgcG9sbCBm b3IgZmlsZSBkZXNjcmlwdG9yIGV2ZW50cyBhbmQgZmlyZSBjYWxsYmFja3MuCisgKiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKi8KK3N0YXRpYyB2b2lkCitFeGVjTWVyZ2VBcHBlbmRBc3luY0V2ZW50V2FpdChNZXJnZUFw cGVuZFN0YXRlICpub2RlKQoreworCWludAkJCW5ldmVudHMgPSBub2RlLT5tc19uYXN5bmNwbGFu cyArIDE7IC8qIG9uZSBmb3IgUE0gZGVhdGggKi8KKwlXYWl0RXZlbnQJb2NjdXJyZWRfZXZlbnRb RVZFTlRfQlVGRkVSX1NJWkVdOworCWludAkJCW5vY2N1cnJlZDsKKwlpbnQJCQlpOworCisJLyog V2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBubyB2YWxpZCBhc3luYyBz dWJwbGFucy4gKi8KKwlBc3NlcnQoYm1zX251bV9tZW1iZXJzKG5vZGUtPm1zX2FzeW5jcmVtYWlu KSA+IDApOworCisJbm9kZS0+bXNfZXZlbnRzZXQgPSBDcmVhdGVXYWl0RXZlbnRTZXQoQ3VycmVu dFJlc291cmNlT3duZXIsIG5ldmVudHMpOworCUFkZFdhaXRFdmVudFRvU2V0KG5vZGUtPm1zX2V2 ZW50c2V0LCBXTF9FWElUX09OX1BNX0RFQVRILCBQR0lOVkFMSURfU09DS0VULAorCQkJCQkgIE5V TEwsIE5VTEwpOworCisJLyogR2l2ZSBlYWNoIHdhaXRpbmcgc3VicGxhbiBhIGNoYW5jZSB0byBh ZGQgYW4gZXZlbnQuICovCisJaSA9IC0xOworCXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcihu b2RlLT5tc19hc3luY3BsYW5zLCBpKSkgPj0gMCkKKwl7CisJCUFzeW5jUmVxdWVzdCAqYXJlcSA9 IG5vZGUtPm1zX2FzeW5jcmVxdWVzdHNbaV07CisKKwkJaWYgKGFyZXEtPmNhbGxiYWNrX3BlbmRp bmcpCisJCQlFeGVjQXN5bmNDb25maWd1cmVXYWl0KGFyZXEpOworCX0KKworCS8qCisJICogTm8g bmVlZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGlmIHRoZXJlIGFyZSBubyBjb25maWd1cmVkIGV2 ZW50cyBvdGhlcgorCSAqIHRoYW4gdGhlIHBvc3RtYXN0ZXIgZGVhdGggZXZlbnQuCisJICovCisJ aWYgKEdldE51bVJlZ2lzdGVyZWRXYWl0RXZlbnRzKG5vZGUtPm1zX2V2ZW50c2V0KSA9PSAxKQor CXsKKwkJRnJlZVdhaXRFdmVudFNldChub2RlLT5tc19ldmVudHNldCk7CisJCW5vZGUtPm1zX2V2 ZW50c2V0ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIHdhaXQgb24gYXQgbW9zdCBF VkVOVF9CVUZGRVJfU0laRSBldmVudHMuICovCisJaWYgKG5ldmVudHMgPiBFVkVOVF9CVUZGRVJf U0laRSkKKwkJbmV2ZW50cyA9IEVWRU5UX0JVRkZFUl9TSVpFOworCisJLyoKKwkgKiBXYWl0IHVu dGlsIGF0IGxlYXN0IG9uZSBldmVudCBvY2N1cnMuCisJICovCisJbm9jY3VycmVkID0gV2FpdEV2 ZW50U2V0V2FpdChub2RlLT5tc19ldmVudHNldCwgLTEgLyogbm8gdGltZW91dCAqLywgb2NjdXJy ZWRfZXZlbnQsCisJCQkJCQkJCSBuZXZlbnRzLCBXQUlUX0VWRU5UX0FQUEVORF9SRUFEWSk7CisJ RnJlZVdhaXRFdmVudFNldChub2RlLT5tc19ldmVudHNldCk7CisJbm9kZS0+bXNfZXZlbnRzZXQg PSBOVUxMOworCWlmIChub2NjdXJyZWQgPT0gMCkKKwkJcmV0dXJuOworCisJLyogRGVsaXZlciBu b3RpZmljYXRpb25zLiAqLworCWZvciAoaSA9IDA7IGkgPCBub2NjdXJyZWQ7IGkrKykKKwl7CisJ CVdhaXRFdmVudCAgKncgPSAmb2NjdXJyZWRfZXZlbnRbaV07CisKKwkJLyoKKwkJICogRWFjaCB3 YWl0aW5nIHN1YnBsYW4gc2hvdWxkIGhhdmUgcmVnaXN0ZXJlZCBpdHMgd2FpdCBldmVudCB3aXRo CisJCSAqIHVzZXJfZGF0YSBwb2ludGluZyBiYWNrIHRvIGl0cyBBc3luY1JlcXVlc3QuCisJCSAq LworCQlpZiAoKHctPmV2ZW50cyAmIFdMX1NPQ0tFVF9SRUFEQUJMRSkgIT0gMCkKKwkJeworCQkJ QXN5bmNSZXF1ZXN0ICphcmVxID0gKEFzeW5jUmVxdWVzdCAqKSB3LT51c2VyX2RhdGE7CisKKwkJ CWlmIChhcmVxLT5jYWxsYmFja19wZW5kaW5nKQorCQkJeworCQkJCS8qCisJCQkJICogTWFyayBp dCBhcyBubyBsb25nZXIgbmVlZGluZyBhIGNhbGxiYWNrLiAgV2UgbXVzdCBkbyB0aGlzCisJCQkJ ICogYmVmb3JlIGRpc3BhdGNoaW5nIHRoZSBjYWxsYmFjayBpbiBjYXNlIHRoZSBjYWxsYmFjayBy ZXNldHMKKwkJCQkgKiB0aGUgZmxhZy4KKwkJCQkgKi8KKwkJCQlhcmVxLT5jYWxsYmFja19wZW5k aW5nID0gZmFsc2U7CisKKwkJCQkvKiBEbyB0aGUgYWN0dWFsIHdvcmsuICovCisJCQkJRXhlY0Fz eW5jTm90aWZ5KGFyZXEpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2Nvc3RzaXplLmMKaW5kZXggZWUyM2VkNzgzNWQuLjg2MzQ3YjIwODM5IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCisrKyBiL3NyYy9iYWNrZW5kL29w dGltaXplci9wYXRoL2Nvc3RzaXplLmMKQEAgLTE1Miw2ICsxNTIsNyBAQCBib29sCQllbmFibGVf cGFyYWxsZWxfaGFzaCA9IHRydWU7CiBib29sCQllbmFibGVfcGFydGl0aW9uX3BydW5pbmcgPSB0 cnVlOwogYm9vbAkJZW5hYmxlX3ByZXNvcnRlZF9hZ2dyZWdhdGUgPSB0cnVlOwogYm9vbAkJZW5h YmxlX2FzeW5jX2FwcGVuZCA9IHRydWU7Citib29sCQllbmFibGVfYXN5bmNfbWVyZ2VfYXBwZW5k ID0gdHJ1ZTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29w dGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2Ny ZWF0ZXBsYW4uYwppbmRleCBjMmU4Nzk4MTViMS4uNTRjN2Q4Mzg4YWYgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYworKysgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFuLmMKQEAgLTE0NDcsNiArMTQ0Nyw3IEBAIGNyZWF0ZV9t ZXJnZV9hcHBlbmRfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTWVyZ2VBcHBlbmRQYXRoICpiZXN0 X3BhdGgsCiAJTGlzdENlbGwgICAqc3VicGF0aHM7CiAJUmVsT3B0SW5mbyAqcmVsID0gYmVzdF9w YXRoLT5wYXRoLnBhcmVudDsKIAlQYXJ0aXRpb25QcnVuZUluZm8gKnBhcnRwcnVuZWluZm8gPSBO VUxMOworCWJvb2wJCWNvbnNpZGVyX2FzeW5jID0gZmFsc2U7CiAKIAkvKgogCSAqIFdlIGRvbid0 IGhhdmUgdGhlIGFjdHVhbCBjcmVhdGlvbiBvZiB0aGUgTWVyZ2VBcHBlbmQgbm9kZSBzcGxpdCBv dXQKQEAgLTE0NjEsNiArMTQ2Miw5IEBAIGNyZWF0ZV9tZXJnZV9hcHBlbmRfcGxhbihQbGFubmVy SW5mbyAqcm9vdCwgTWVyZ2VBcHBlbmRQYXRoICpiZXN0X3BhdGgsCiAJcGxhbi0+cmlnaHR0cmVl ID0gTlVMTDsKIAlub2RlLT5hcHByZWxpZHMgPSByZWwtPnJlbGlkczsKIAorCWNvbnNpZGVyX2Fz eW5jID0gKGVuYWJsZV9hc3luY19tZXJnZV9hcHBlbmQgJiYKKwkJCQkJICAhYmVzdF9wYXRoLT5w YXRoLnBhcmFsbGVsX3NhZmUgJiYKKwkJCQkJICBsaXN0X2xlbmd0aChiZXN0X3BhdGgtPnN1YnBh dGhzKSA+IDEpOwogCS8qCiAJICogQ29tcHV0ZSBzb3J0IGNvbHVtbiBpbmZvLCBhbmQgYWRqdXN0 IE1lcmdlQXBwZW5kJ3MgdGxpc3QgYXMgbmVlZGVkLgogCSAqIEJlY2F1c2Ugd2UgcGFzcyBhZGp1 c3RfdGxpc3RfaW5fcGxhY2UgPSB0cnVlLCB3ZSBtYXkgaWdub3JlIHRoZQpAQCAtMTUzNiw2ICsx NTQwLDEwIEBAIGNyZWF0ZV9tZXJnZV9hcHBlbmRfcGxhbihQbGFubmVySW5mbyAqcm9vdCwgTWVy Z2VBcHBlbmRQYXRoICpiZXN0X3BhdGgsCiAJCQlzdWJwbGFuID0gKFBsYW4gKikgc29ydDsKIAkJ fQogCisJCS8qIElmIG5lZWRlZCwgY2hlY2sgdG8gc2VlIGlmIHN1YnBsYW4gY2FuIGJlIGV4ZWN1 dGVkIGFzeW5jaHJvbm91c2x5ICovCisJCWlmIChjb25zaWRlcl9hc3luYykKKwkJCW1hcmtfYXN5 bmNfY2FwYWJsZV9wbGFuKHN1YnBsYW4sIHN1YnBhdGgpOworCiAJCXN1YnBsYW5zID0gbGFwcGVu ZChzdWJwbGFucywgc3VicGxhbik7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5j CmluZGV4IDYzMGVkMGYxNjI5Li4wZGRkYWM3MDQwNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv dXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNf dGFibGVzLmMKQEAgLTk4OCw2ICs5ODgsMTYgQEAgc3RydWN0IGNvbmZpZ19ib29sIENvbmZpZ3Vy ZU5hbWVzQm9vbFtdID0KIAkJdHJ1ZSwKIAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCisJeworCQl7 ImVuYWJsZV9hc3luY19tZXJnZV9hcHBlbmQiLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01F VEhPRCwKKwkJCWdldHRleHRfbm9vcCgiRW5hYmxlcyB0aGUgcGxhbm5lcidzIHVzZSBvZiBhc3lu YyBtZXJnZSBhcHBlbmQgcGxhbnMuIiksCisJCQlOVUxMLAorCQkJR1VDX0VYUExBSU4KKwkJfSwK KwkJJmVuYWJsZV9hc3luY19tZXJnZV9hcHBlbmQsCisJCXRydWUsCisJCU5VTEwsIE5VTEwsIE5V TEwKKwl9LAogCXsKIAkJeyJlbmFibGVfZ3JvdXBfYnlfcmVvcmRlcmluZyIsIFBHQ19VU0VSU0VU LCBRVUVSWV9UVU5JTkdfTUVUSE9ELAogCQkJZ2V0dGV4dF9ub29wKCJFbmFibGVzIHJlb3JkZXJp bmcgb2YgR1JPVVAgQlkga2V5cy4iKSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21p c2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdy ZXNxbC5jb25mLnNhbXBsZQppbmRleCA5ZWM5Zjk3ZTkyNi4uYjRlOGI3ODkyNWMgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9z cmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTM5Miw2ICsz OTIsNyBAQAogIyAtIFBsYW5uZXIgTWV0aG9kIENvbmZpZ3VyYXRpb24gLQogCiAjZW5hYmxlX2Fz eW5jX2FwcGVuZCA9IG9uCisjZW5hYmxlX2FzeW5jX21lcmdlX2FwcGVuZCA9IG9uCiAjZW5hYmxl X2JpdG1hcHNjYW4gPSBvbgogI2VuYWJsZV9nYXRoZXJtZXJnZSA9IG9uCiAjZW5hYmxlX2hhc2hh Z2cgPSBvbgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvZXhlY3V0b3Ivbm9kZU1lcmdlQXBwZW5k LmggYi9zcmMvaW5jbHVkZS9leGVjdXRvci9ub2RlTWVyZ2VBcHBlbmQuaAppbmRleCBjMzlhOWZj MGNiMi4uNDM3MTQyNmJlYTEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL25vZGVN ZXJnZUFwcGVuZC5oCisrKyBiL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL25vZGVNZXJnZUFwcGVuZC5o CkBAIC0xOSw1ICsxOSw2IEBACiBleHRlcm4gTWVyZ2VBcHBlbmRTdGF0ZSAqRXhlY0luaXRNZXJn ZUFwcGVuZChNZXJnZUFwcGVuZCAqbm9kZSwgRVN0YXRlICplc3RhdGUsIGludCBlZmxhZ3MpOwog ZXh0ZXJuIHZvaWQgRXhlY0VuZE1lcmdlQXBwZW5kKE1lcmdlQXBwZW5kU3RhdGUgKm5vZGUpOwog ZXh0ZXJuIHZvaWQgRXhlY1JlU2Nhbk1lcmdlQXBwZW5kKE1lcmdlQXBwZW5kU3RhdGUgKm5vZGUp OworZXh0ZXJuIHZvaWQgRXhlY0FzeW5jTWVyZ2VBcHBlbmRSZXNwb25zZShBc3luY1JlcXVlc3Qg KmFyZXEpOwogCiAjZW5kaWYJCQkJCQkJLyogTk9ERU1FUkdFQVBQRU5EX0ggKi8KZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvZXhl Y25vZGVzLmgKaW5kZXggY2FjNjg0ZDliM2EuLjQ0MGFiNDBmOWU5IDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9k ZXMuaApAQCAtMTQ4NywxMCArMTQ4Nyw2NiBAQCB0eXBlZGVmIHN0cnVjdCBNZXJnZUFwcGVuZFN0 YXRlCiAJVHVwbGVUYWJsZVNsb3QgKiptc19zbG90czsJLyogYXJyYXkgb2YgbGVuZ3RoIG1zX25w bGFucyAqLwogCXN0cnVjdCBiaW5hcnloZWFwICptc19oZWFwOyAvKiBiaW5hcnkgaGVhcCBvZiBz bG90IGluZGljZXMgKi8KIAlib29sCQltc19pbml0aWFsaXplZDsgLyogYXJlIHN1YnBsYW5zIHN0 YXJ0ZWQ/ICovCisJQml0bWFwc2V0ICAqbXNfYXN5bmNwbGFuczsJLyogYXN5bmNocm9ub3VzIHBs YW5zIGluZGV4ZXMgKi8KKwlpbnQJCQltc19uYXN5bmNwbGFuczsgLyogIyBvZiBhc3luY2hyb25v dXMgcGxhbnMgKi8KKwlBc3luY1JlcXVlc3QgKiptc19hc3luY3JlcXVlc3RzOwkvKiBhcnJheSBv ZiBBc3luY1JlcXVlc3RzICovCisJVHVwbGVUYWJsZVNsb3QgKiptc19hc3luY3Jlc3VsdHM7CS8q IHVucmV0dXJuZWQgcmVzdWx0cyBvZiBhc3luYyBwbGFucyAqLworCUJpdG1hcHNldCAgICptc19o YXNfYXN5bmNyZXN1bHRzOwkvKiBwbGFucyB3aGljaCBoYXZlIGFzeW5jIHJlc3VsdHMgKi8KKwlC aXRtYXBzZXQgICptc19hc3luY3JlbWFpbjsgLyogcmVtYWluaW5nIGFzeW5jaHJvbm91cyBwbGFu cyAqLworCUJpdG1hcHNldCAgKm1zX25lZWRyZXF1ZXN0OyAvKiBhc3luY2hyb25vdXMgcGxhbnMg bmVlZGluZyBhIG5ldyByZXF1ZXN0ICovCisJc3RydWN0IFdhaXRFdmVudFNldCAqbXNfZXZlbnRz ZXQ7CS8qIFdhaXRFdmVudFNldCB1c2VkIHRvIGNvbmZpZ3VyZSBmaWxlCisJCQkJCQkJCQkJICog ZGVzY3JpcHRvciB3YWl0IGV2ZW50cyAqLwogCXN0cnVjdCBQYXJ0aXRpb25QcnVuZVN0YXRlICpt c19wcnVuZV9zdGF0ZTsKKwlib29sCQltc192YWxpZF9zdWJwbGFuc19pZGVudGlmaWVkOyAgIC8q IGlzIG1zX3ZhbGlkX3N1YnBsYW5zIHZhbGlkPyAqLwogCUJpdG1hcHNldCAgKm1zX3ZhbGlkX3N1 YnBsYW5zOworCUJpdG1hcHNldCAgKm1zX3ZhbGlkX2FzeW5jcGxhbnM7CS8qIHZhbGlkIGFzeW5j aHJvbm91cyBwbGFucyBpbmRleGVzICovCiB9IE1lcmdlQXBwZW5kU3RhdGU7CiAKKy8qIEdldHRl cnMgZm9yIEFwcGVuZFN0YXRlIGFuZCBNZXJnZUFwcGVuZFN0YXRlICovCitzdGF0aWMgaW5saW5l IHN0cnVjdCBXYWl0RXZlbnRTZXQgKgorR2V0QXBwZW5kRXZlbnRTZXQoUGxhblN0YXRlICpwcykK K3sKKwlBc3NlcnQgKElzQShwcywgQXBwZW5kU3RhdGUpIHx8IElzQShwcywgTWVyZ2VBcHBlbmRT dGF0ZSkpOworCisJaWYgKElzQShwcywgQXBwZW5kU3RhdGUpKQorCQlyZXR1cm4gKChBcHBlbmRT dGF0ZSAqKXBzKS0+YXNfZXZlbnRzZXQ7CisJZWxzZQorCQlyZXR1cm4gKChNZXJnZUFwcGVuZFN0 YXRlICopcHMpLT5tc19ldmVudHNldDsKK30KKworc3RhdGljIGlubGluZSBCaXRtYXBzZXQgKgor R2V0TmVlZFJlcXVlc3QoUGxhblN0YXRlICpwcykKK3sKKwlBc3NlcnQgKElzQShwcywgQXBwZW5k U3RhdGUpIHx8IElzQShwcywgTWVyZ2VBcHBlbmRTdGF0ZSkpOworCisJaWYgKElzQShwcywgQXBw ZW5kU3RhdGUpKQorCQlyZXR1cm4gKChBcHBlbmRTdGF0ZSAqKXBzKS0+YXNfbmVlZHJlcXVlc3Q7 CisJZWxzZQorCQlyZXR1cm4gKChNZXJnZUFwcGVuZFN0YXRlICopcHMpLT5tc19uZWVkcmVxdWVz dDsKK30KKworc3RhdGljIGlubGluZSBCaXRtYXBzZXQgKgorR2V0VmFsaWRBc3luY3BsYW5zKFBs YW5TdGF0ZSAqcHMpCit7CisJQXNzZXJ0IChJc0EocHMsIEFwcGVuZFN0YXRlKSB8fCBJc0EocHMs IE1lcmdlQXBwZW5kU3RhdGUpKTsKKworCWlmIChJc0EocHMsIEFwcGVuZFN0YXRlKSkKKwkJcmV0 dXJuICgoQXBwZW5kU3RhdGUgKilwcyktPmFzX3ZhbGlkX2FzeW5jcGxhbnM7CisJZWxzZQorCQly ZXR1cm4gKChNZXJnZUFwcGVuZFN0YXRlICopcHMpLT5tc192YWxpZF9hc3luY3BsYW5zOworfQor CitzdGF0aWMgaW5saW5lIEFzeW5jUmVxdWVzdCoKK0dldFZhbGlkQXN5bmNSZXF1ZXN0KFBsYW5T dGF0ZSAqcHMsIGludCBucmVxKQoreworCUFzc2VydCAoSXNBKHBzLCBBcHBlbmRTdGF0ZSkgfHwg SXNBKHBzLCBNZXJnZUFwcGVuZFN0YXRlKSk7CisKKwlpZiAoSXNBKHBzLCBBcHBlbmRTdGF0ZSkp CisJCXJldHVybiAoKEFwcGVuZFN0YXRlICopcHMpLT5hc19hc3luY3JlcXVlc3RzW25yZXFdOwor CWVsc2UKKwkJcmV0dXJuICgoTWVyZ2VBcHBlbmRTdGF0ZSAqKXBzKS0+bXNfYXN5bmNyZXF1ZXN0 c1tucmVxXTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLQogICoJIFJlY3Vyc2l2ZVVuaW9uU3Rh dGUgaW5mb3JtYXRpb24KICAqCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvY29z dC5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL2Nvc3QuaAppbmRleCBiMWM1MWE0ZTcwZi4uZWUx OTFhZTQ0NWEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9jb3N0LmgKKysrIGIv c3JjL2luY2x1ZGUvb3B0aW1pemVyL2Nvc3QuaApAQCAtNzAsNiArNzAsNyBAQCBleHRlcm4gUEdE TExJTVBPUlQgYm9vbCBlbmFibGVfcGFyYWxsZWxfaGFzaDsKIGV4dGVybiBQR0RMTElNUE9SVCBi b29sIGVuYWJsZV9wYXJ0aXRpb25fcHJ1bmluZzsKIGV4dGVybiBQR0RMTElNUE9SVCBib29sIGVu YWJsZV9wcmVzb3J0ZWRfYWdncmVnYXRlOwogZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgZW5hYmxl X2FzeW5jX2FwcGVuZDsKK2V4dGVybiBQR0RMTElNUE9SVCBib29sIGVuYWJsZV9hc3luY19tZXJn ZV9hcHBlbmQ7CiBleHRlcm4gUEdETExJTVBPUlQgaW50IGNvbnN0cmFpbnRfZXhjbHVzaW9uOwog CiBleHRlcm4gZG91YmxlIGluZGV4X3BhZ2VzX2ZldGNoZWQoZG91YmxlIHR1cGxlc19mZXRjaGVk LCBCbG9ja051bWJlciBwYWdlcywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvc3lzdmlld3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQK aW5kZXggNzI5NjIwZGUxM2MuLjI0Njc1Y2YxOTgyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N5c3ZpZXdzLm91dApAQCAtMTM1LDYgKzEzNSw3IEBAIHNlbGVjdCBuYW1lLCBzZXR0aW5nIGZy b20gcGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFibGUlJzsKICAgICAgICAgICAgICAg bmFtZSAgICAgICAgICAgICAgfCBzZXR0aW5nIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tCiAgZW5hYmxlX2FzeW5jX2FwcGVuZCAgICAgICAgICAgIHwgb24KKyBl bmFibGVfYXN5bmNfbWVyZ2VfYXBwZW5kICAgICAgfCBvbgogIGVuYWJsZV9iaXRtYXBzY2FuICAg ICAgICAgICAgICB8IG9uCiAgZW5hYmxlX2dhdGhlcm1lcmdlICAgICAgICAgICAgIHwgb24KICBl bmFibGVfZ3JvdXBfYnlfcmVvcmRlcmluZyAgICAgfCBvbgpAQCAtMTU2LDcgKzE1Nyw3IEBAIHNl bGVjdCBuYW1lLCBzZXR0aW5nIGZyb20gcGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFi bGUlJzsKICBlbmFibGVfc2Vxc2NhbiAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9zb3J0 ICAgICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3RpZHNjYW4gICAgICAgICAgICAgICAg IHwgb24KLSgyMiByb3dzKQorKDIzIHJvd3MpCiAKIC0tIFRoZXJlIGFyZSBhbHdheXMgd2FpdCBl dmVudCBkZXNjcmlwdGlvbnMgZm9yIHZhcmlvdXMgdHlwZXMuICBJbmplY3Rpb25Qb2ludAogLS0g bWF5IGJlIHByZXNlbnQgb3IgYWJzZW50LCBkZXBlbmRpbmcgb24gaGlzdG9yeSBzaW5jZSBsYXN0 IHBvc3RtYXN0ZXIgc3RhcnQuCi0tIAoyLjM0LjEKCg== --=_ba7398485aff33236aa688392ddcfe9d--