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.96) (envelope-from ) id 1vKOE6-00AOJO-1F for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Nov 2025 21:54:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vKOE2-00AE20-2N for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Nov 2025 21:54:30 +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.96) (envelope-from ) id 1vKOE1-00AE1r-18 for pgsql-hackers@lists.postgresql.org; Sat, 15 Nov 2025 21:54:30 +0000 Received: from fhigh-b2-smtp.messagingengine.com ([202.12.124.153]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1vKODy-007JhV-2e for pgsql-hackers@postgresql.org; Sat, 15 Nov 2025 21:54:28 +0000 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfhigh.stl.internal (Postfix) with ESMTP id DC0F47A00E1 for ; Sat, 15 Nov 2025 16:54:25 -0500 (EST) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-05.internal (MEProxy); Sat, 15 Nov 2025 16:54:25 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm3; t=1763243665; x=1763330065; bh=pEyZCFtttT M4/Q33ldFWlFZnettMTQnO+lJQl40/0JQ=; b=eXaKRATnHNG7/+P0XDxADLtpzp fzbTNEZkzrRqo+r/Jdu8rLpX+vPYs3OUNrF8B2VQaQez9I9L7E35enf3yrD3Oq+4 pum+aa7KpnUJkmjo1bJE3fF/LGizxot5ZJSRiBSQD3VnGaC+LxqXn7H3y1+4w8iu nhkff986C+rVwHtqyJoesUlqhTX5C7oV/KmEwax0lYD2JJzvbKKLGyvGeM7VzcO9 kh1bCTLoleHvBs0if2nGBGalkrWgTstq3H9VjuW0w1GW7Tylgu46hcs7xbxPOo3N TGWRsAONT+RIHLthzL3CXr+bY1l5OfJZxFUQcNmwsSiy+yrA8CRw2xg5vq7Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1763243665; x=1763330065; bh=pEyZCFtttTM4/Q33ldFWlFZnettMTQnO+lJ Ql40/0JQ=; b=akjUneBq+R1ZhuPoqOqB1i+WSU9vFlC3E/VqaFgS3tj5ELXDDN6 SGGZshdct8hX4oUsjjGI3MlcVAs2gYJw3y4FxR+n9F2bDyNTMlKe01DU0YjvJB+m BLqucst8uX7spKfGi09Mc4rSS9MWDdtoWMAq8uG93o1RBnJzjzDcYE8Yi6EXy3t4 ZU3HbLwaZ9e4lYbmm66FOyJc9ms5+eJ/LDy9va5E07Dccow48eLh0OChtMNsur1R LmFQqFZlsGsKChMmqF03CehuMyfIgIaAB9l8xd6xxL61vmt/C8u2UdW/mwIw6KmL 3r5rpHBysUTH7NuHLv0aPlc4rizBH7juHZQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddvudefkeefucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefoggffhffvkfgjfhfutgesmhdtreerre dttdenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhp ihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpeefheeutdegvdfgueeuueekieeuff ehkeeuleffveekkeegkeevhfekfffghfevleenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlhestghomhhpihhlvghrrdhorhhgpdhnsg gprhgtphhtthhopedupdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehpghhsqhhl qdhhrggtkhgvrhhssehpohhsthhgrhgvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id 1D5B418E0069; Sat, 15 Nov 2025 16:54:25 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AE1r89ybsZ1g Date: Sat, 15 Nov 2025 22:53:52 +0100 From: "Joel Jacobson" To: pgsql-hackers Message-Id: In-Reply-To: <2eeea4f1-1b4f-430c-8571-544da04f08dc@app.fastmail.com> References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> <85828f29-e72e-4400-94f3-9a69bc8dc239@app.fastmail.com> <2495353.1759860890@sss.pgh.pa.us> <8aeae418-92a6-4bbd-9c06-9574c79e59f7@app.fastmail.com> <2531672.1759868124@sss.pgh.pa.us> <474efa78-337c-41cd-a73a-f845a0115109@app.fastmail.com> <2749343.1759949176@sss.pgh.pa.us> <8bfca2be-1ec0-4e15-aafb-0b7b661fe936@app.fastmail.com> <9eba307f-f2fb-48f0-9507-2e197f39ef9e@app.fastmail.com> <8c71183a-0d28-4bcf-a806-78446ff95404@app.fastmail.com> <1009807.1760476747@sss.pgh.pa.us> <1F7227F5-C33D-4E2C-8511-33F1468590D0@gmail.com> <0a5a20d3-4621-46b3-b2ab-903f63a20dea@app.fastmail.com> <6F913129-ABEF-4004-AAF3-F22FC34!29AE8@gmail.com> <1547585.1760645808@sss.pgh.pa.us> <14865EB6-0BF4-462B-9072-10BDAC10C052@gmail.com> <0BCA1C2D-B92C-459E-B1A6-6D06BA4C62CF@gmail.com> <55d24cbb-e9ef-491f-a99b-b3dbd7cecdf9@app.fastmail.com> <38574cad-e90d-47b7-a015-753bb6bbc360@app.fastmail.com> <66631FB7-5BEA-4ED5-A694-9AD8B9CCFEE8@gmail.com> <4b7b49a5-5e1a-44a8-93e0-60457d15cb1d@app.fastmail.com> <82DEA2B6-6FC5-4A79-BDE3-1FD72F104A6E@gmail.com> <38de1036-d8cf-420c-b845-edb5a946b191@app.fastmail.com> <87E40BF8-8877-4DBD-9040-99AF8A4E6358@gmail.com> <7556f0d4-03fd-451a-bd34-5f62b424319a@app.fastmail.com> <290910DE-9A03-4AE6-B348-073D5DA96ACC@gmail.com> <4B243750-12BE-4C16-A769-A803268F40E3@gmail.com> <4605CAD6-69D5-4082-B96C-91FC0DE5399D@gmail.com> <294e1641-d658-4d43-8671-60e8ff860532@app.fastmail.com> <26d4dd6a-cfc5-4efc-9704-9cd3216ed712@app.fastmail.com> <7456ec96-7a9c-45a0-988e-ba1c7f9ec937@app.fastmail.com> <0253b822-e8fd-4067-ab24-23493c115a2a@app.fastmail.com> <2eeea4f1-1b4f-430c-8571-544da04f08dc@app.fastmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=e10b79ee8d00482a9748f612cfbccf9b List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --e10b79ee8d00482a9748f612cfbccf9b Content-Type: text/plain Content-Transfer-Encoding: 7bit On Fri, Nov 14, 2025, at 17:01, Joel Jacobson wrote: > On Thu, Nov 13, 2025, at 08:13, Joel Jacobson wrote: >> Attached, please find a new version rebased on top of the bug fix >> patches that just got committed in 0bdc777, 797e9ea, 8eeb4a0, and >> 1b46990. > > To help reviewers, here is a new write-up of the patch: > [...write-up...] While reviewing all the comments in async.c to make sure they match the patch's code, I noticed a few discrepancies. One of them was the comment above QUEUE_CLEANUP_DELAY, which again made me think about how master currently uses that value as the threshold for when to "wake laggers". In this patch, QUEUE_CLEANUP_DELAY is no longer used for that purpose; it now only determines how often we try to advance the tail pointer. I realize someone who is familiar with the current code in master, might ask the following question: Why not do direct advancement, but just use the old "wake laggers" logic for listeners that lag behind more than QUEUE_CLEANUP_DELAY? On the surface it might look like a plausible alternative, since that's what master currently does (but for other databases). I was curious to see how such alternative approach would affect performance, so I changed SignalBackends and ran some benchmarks. Below is the v27 logic: ``` if (QUEUE_BACKEND_IS_ADVANCING(i) ? QUEUE_POS_PRECEDES(QUEUE_BACKEND_ADVANCING_POS(i), queueHeadAfterWrite) : QUEUE_POS_PRECEDES(pos, queueHeadBeforeWrite)) { Assert(pid != InvalidPid); QUEUE_BACKEND_WAKEUP_PENDING(i) = true; pids[count] = pid; procnos[count] = i; count++; } else if (!QUEUE_BACKEND_IS_ADVANCING(i) && QUEUE_POS_PRECEDES(pos, queueHeadAfterWrite)) { Assert(!QUEUE_POS_PRECEDES(pos, queueHeadBeforeWrite)); QUEUE_BACKEND_POS(i) = queueHeadAfterWrite; } ``` And here is the modified "wake laggers" version I tested: ``` if (!QUEUE_BACKEND_IS_ADVANCING(i) && !QUEUE_POS_PRECEDES(pos, queueHeadBeforeWrite) && QUEUE_POS_PRECEDES(pos, queueHeadAfterWrite)) { QUEUE_BACKEND_POS(i) = queueHeadAfterWrite; } else if (asyncQueuePageDiff(QUEUE_POS_PAGE(QUEUE_HEAD), QUEUE_POS_PAGE(pos)) >= QUEUE_CLEANUP_DELAY) { QUEUE_BACKEND_WAKEUP_PENDING(i) = true; pids[count] = pid; procnos[count] = i; count++; } ``` This preserves direct advancement under the same conditions as the patch, but only sends signals to backends that are "laggers" by the QUEUE_CLEANUP_DELAY threshold, similar to master's behavior. It turns out the "wake laggers" approach is significantly slower: "wake laggers": ./pg_async_notify_test --listeners 1 --notifiers 1 --channels 1000 --sleep 0.01 --sleep-exp 1.01 20 s: 80871 sent (4650/s), 80871 received (4650/s) Notification Latency Distribution: 0.00-0.01ms 0 (0.0%) avg: 0.000ms 0.01-0.10ms # 380 (0.5%) avg: 0.085ms 0.10-1.00ms # 2765 (3.4%) avg: 0.289ms 1.00-10.00ms # 4947 (6.1%) avg: 5.870ms 10.00-100.00ms ####### 57467 (71.1%) avg: 52.101ms >100.00ms # 15312 (18.9%) avg: 119.847ms v27: % ./pg_async_notify_test --listeners 1 --notifiers 1 --channels 1000 --sleep 0.01 --sleep-exp 1.01 20 s: 229866 sent (13985/s), 229865 received (13984/s) Notification Latency Distribution: 0.00-0.01ms 0 (0.0%) avg: 0.000ms 0.01-0.10ms # 18351 (8.0%) avg: 0.072ms 0.10-1.00ms # 32899 (14.3%) avg: 0.315ms 1.00-10.00ms #### 103273 (44.9%) avg: 5.055ms 10.00-100.00ms ### 75342 (32.8%) avg: 18.197ms >100.00ms 0 (0.0%) avg: 0.000ms I reran the experiments a three times with similar results. Also tested other test permutaions, that also showed "wake laggers" was worse. At first glance, both approaches ultimately signal all backends interested in our notifies, so it may seem surprising that latency differs this much. The key point is what happens to non-interested backends: A backend that is *not* listening to our channels may have stopped at a position before the old queue head, because it woke up and read the head before all notifies for a previous commit were written. Such backend might actually be interested in the notifies that lie in between its current position and the old queue head, and it could therefore be urgent to wake it up to make it process the queue and delivery the notifies. In v27, such a backend gets signaled on the next NOTIFY, when it notice it is stationary at a pos behind the queueHeadBeforeWrite. With "wake laggers", however, it receives no signal until it becomes a "lagger" by QUEUE_CLEANUP_DELAY pages, which can be far later. This risks delaying its processing and the delivery of notifications it is interested in. In master this is fine because "wake laggers" is only applied to backends in other databases that we know are not interested in our notifications. In conclusion, the "wake laggers" mechanism seems inherently incompatible with the direct advancement mechanism, and I therefore think the current approach in v27 is sound. I just wanted to share this reasoning, not because anyone has raised any concerns about this, but because I hadn't fully internalized this myself, and thought the reasoning could possibly be helpful to others. The attached v28 is the same as v27, except some comments have been fixed to accurately reflect the code. /Joel --e10b79ee8d00482a9748f612cfbccf9b Content-Disposition: attachment; filename*0="0001-optimize_listen_notify-v28.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-optimize=5Flisten=5Fnotify-v28.patch?=" Content-Transfer-Encoding: base64 RnJvbSBhN2Y3NTQ5NWQ2NTVkYmFjZWQ0NTE1ZjlmMDRhOTViOWRhNTkwNWFkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogV2VkLCA4IE9jdCAyMDI1IDA5OjMwOjU0ICswMjAwClN1YmplY3Q6IFtQQVRD SCAxLzJdIEltcHJvdmUgTElTVEVOL05PVElGWSB0ZXN0IGNvdmVyYWdlCgpUaGlzIGFkZHMg aXNvbGF0aW9uIHRlc3RzIHRvIGNvdmVyIHByZXZpb3VzbHkgdW50ZXN0ZWQgY29kZSBwYXRo czoKCiogQ2hlY2sgc2ltcGxlIE5PVElGWSByZXBhcmVudGluZyB3aGVuIHBhcmVudCBoYXMg bm8gYWN0aW9uCiogQ2hlY2sgTElTVEVOIHJlcGFyZW50aW5nIGluIHN1YnRyYW5zYWN0aW9u CiogQ2hlY2sgTElTVEVOIG1lcmdlIHBhdGggd2hlbiBib3RoIG91dGVyIGFuZCBpbm5lciB0 cmFuc2FjdGlvbnMgaGF2ZSBhY3Rpb25zCiogQ2hlY2sgTElTVEVOIGFib3J0IHBhdGggKFJP TExCQUNLIFRPIFNBVkVQT0lOVCBkaXNjYXJkcyBwZW5kaW5nIGFjdGlvbnMpCiogQ2hlY2sg bm90aWZpY2F0aW9uX21hdGNoIGZ1bmN0aW9uICh0cmlnZ2VyZWQgYnkgaGFzaCB0YWJsZSBk dXBsaWNhdGUgZGV0ZWN0aW9uKQoqIENoZWNrIHRoYXQgbm90aWZpY2F0aW9ucyBzZW50IGZy b20gYSBiYWNrZW5kIHRoYXQgaGFzIG5vdCBkb25lIExJU1RFTgogIGFyZSBwcm9wZXJseSBk ZWxpdmVyZWQgdG8gYSBsaXN0ZW5lciBpbiBhbm90aGVyIGJhY2tlbmQKClRoaXMgYWxzbyBh ZGRzIGEgdGVzdCB0byBwcmVwYXJlIGZvciB0aGUgbmV4dCBwYXRjaDoKCiogQ2hlY2sgQ2hh bm5lbEhhc2hBZGRMaXN0ZW5lciBhcnJheSBncm93dGgKLS0tCiBzcmMvdGVzdC9pc29sYXRp b24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dCB8IDExNCArKysrKysrKysrKysrKysrKyst CiBzcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvYXN5bmMtbm90aWZ5LnNwZWMgICB8ICA2OCAr KysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCAxODEgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9hc3lu Yy1ub3RpZnkub3V0IGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2FzeW5jLW5vdGlm eS5vdXQKaW5kZXggNTU2ZTE4MDU4OTMuLjQ0M2E2ZWI2NjlmIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dAorKysgYi9zcmMvdGVz dC9pc29sYXRpb24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dApAQCAtMSw0ICsxLDQgQEAK LVBhcnNlZCB0ZXN0IHNwZWMgd2l0aCAzIHNlc3Npb25zCitQYXJzZWQgdGVzdCBzcGVjIHdp dGggNyBzZXNzaW9ucwogCiBzdGFydGluZyBwZXJtdXRhdGlvbjogbGlzdGVuYyBub3RpZnkx IG5vdGlmeTIgbm90aWZ5MyBub3RpZnlmCiBzdGVwIGxpc3RlbmM6IExJU1RFTiBjMTsgTElT VEVOIGMyOwpAQCAtNDcsNiArNDcsMTA1IEBAIG5vdGlmaWVyOiBOT1RJRlkgImMyIiB3aXRo IHBheWxvYWQgInBheWxvYWQiIGZyb20gbm90aWZpZXIKIG5vdGlmaWVyOiBOT1RJRlkgImMx IiB3aXRoIHBheWxvYWQgInBheWxvYWRzIiBmcm9tIG5vdGlmaWVyCiBub3RpZmllcjogTk9U SUZZICJjMiIgd2l0aCBwYXlsb2FkICJwYXlsb2FkcyIgZnJvbSBub3RpZmllcgogCitzdGFy dGluZyBwZXJtdXRhdGlvbjogbGlzdGVuYyBub3RpZnlzX3NpbXBsZQorc3RlcCBsaXN0ZW5j OiBMSVNURU4gYzE7IExJU1RFTiBjMjsKK3N0ZXAgbm90aWZ5c19zaW1wbGU6IAorCUJFR0lO OworCVNBVkVQT0lOVCBzMTsKKwlOT1RJRlkgYzEsICdzaW1wbGUxJzsKKwlOT1RJRlkgYzIs ICdzaW1wbGUyJzsKKwlSRUxFQVNFIFNBVkVQT0lOVCBzMTsKKwlDT01NSVQ7CisKK25vdGlm aWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgInNpbXBsZTEiIGZyb20gbm90aWZpZXIK K25vdGlmaWVyOiBOT1RJRlkgImMyIiB3aXRoIHBheWxvYWQgInNpbXBsZTIiIGZyb20gbm90 aWZpZXIKKworc3RhcnRpbmcgcGVybXV0YXRpb246IGxzYmVnaW4gbHNzYXZlcG9pbnQgbHNs aXN0ZW4gbHNyZWxlYXNlIGxzY29tbWl0IGxzbm90aWZ5CitzdGVwIGxzYmVnaW46IEJFR0lO Oworc3RlcCBsc3NhdmVwb2ludDogU0FWRVBPSU5UIHMxOworc3RlcCBsc2xpc3RlbjogTElT VEVOIGMxOyBMSVNURU4gYzI7CitzdGVwIGxzcmVsZWFzZTogUkVMRUFTRSBTQVZFUE9JTlQg czE7CitzdGVwIGxzY29tbWl0OiBDT01NSVQ7CitzdGVwIGxzbm90aWZ5OiBOT1RJRlkgYzEs ICdzdWJ4YWN0X3Rlc3QnOworbGlzdGVuX3N1YnhhY3Q6IE5PVElGWSAiYzEiIHdpdGggcGF5 bG9hZCAic3VieGFjdF90ZXN0IiBmcm9tIGxpc3Rlbl9zdWJ4YWN0CisKK3N0YXJ0aW5nIHBl cm11dGF0aW9uOiBsc2JlZ2luIGxzbGlzdGVuX291dGVyIGxzc2F2ZXBvaW50IGxzbGlzdGVu IGxzcmVsZWFzZSBsc2NvbW1pdCBsc25vdGlmeQorc3RlcCBsc2JlZ2luOiBCRUdJTjsKK3N0 ZXAgbHNsaXN0ZW5fb3V0ZXI6IExJU1RFTiBjMzsKK3N0ZXAgbHNzYXZlcG9pbnQ6IFNBVkVQ T0lOVCBzMTsKK3N0ZXAgbHNsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBs c3JlbGVhc2U6IFJFTEVBU0UgU0FWRVBPSU5UIHMxOworc3RlcCBsc2NvbW1pdDogQ09NTUlU Oworc3RlcCBsc25vdGlmeTogTk9USUZZIGMxLCAnc3VieGFjdF90ZXN0JzsKK2xpc3Rlbl9z dWJ4YWN0OiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgInN1YnhhY3RfdGVzdCIgZnJvbSBs aXN0ZW5fc3VieGFjdAorCitzdGFydGluZyBwZXJtdXRhdGlvbjogbHNiZWdpbiBsc3NhdmVw b2ludCBsc2xpc3RlbiBsc3JvbGxiYWNrIGxzY29tbWl0IGxzbm90aWZ5X2NoZWNrCitzdGVw IGxzYmVnaW46IEJFR0lOOworc3RlcCBsc3NhdmVwb2ludDogU0FWRVBPSU5UIHMxOworc3Rl cCBsc2xpc3RlbjogTElTVEVOIGMxOyBMSVNURU4gYzI7CitzdGVwIGxzcm9sbGJhY2s6IFJP TExCQUNLIFRPIFNBVkVQT0lOVCBzMTsKK3N0ZXAgbHNjb21taXQ6IENPTU1JVDsKK3N0ZXAg bHNub3RpZnlfY2hlY2s6IE5PVElGWSBjMSwgJ3Nob3VsZF9ub3RfcmVjZWl2ZSc7CisKK3N0 YXJ0aW5nIHBlcm11dGF0aW9uOiBsaXN0ZW5jIG5vdGlmeV9tYW55X3dpdGhfZHVwCitzdGVw IGxpc3RlbmM6IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBub3RpZnlfbWFueV93aXRo X2R1cDogCisJQkVHSU47CisJU0VMRUNUIHBnX25vdGlmeSgnYzEnLCAnbXNnJyB8fCBzOjp0 ZXh0KSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxNykgczsKKwlTRUxFQ1QgcGdfbm90aWZ5 KCdjMScsICdtc2cxJyk7CisJQ09NTUlUOworCitwZ19ub3RpZnkKKy0tLS0tLS0tLQorICAg ICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAg ICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisg ICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAor ICAgICAgICAgCisgICAgICAgICAKKygxNyByb3dzKQorCitwZ19ub3RpZnkKKy0tLS0tLS0t LQorICAgICAgICAgCisoMSByb3cpCisKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBh eWxvYWQgIm1zZzEiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRo IHBheWxvYWQgIm1zZzIiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3 aXRoIHBheWxvYWQgIm1zZzMiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMx IiB3aXRoIHBheWxvYWQgIm1zZzQiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkg ImMxIiB3aXRoIHBheWxvYWQgIm1zZzUiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJ RlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzYiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBO T1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzciIGZyb20gbm90aWZpZXIKK25vdGlmaWVy OiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzgiIGZyb20gbm90aWZpZXIKK25vdGlm aWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzkiIGZyb20gbm90aWZpZXIKK25v dGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEwIiBmcm9tIG5vdGlmaWVy Citub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cxMSIgZnJvbSBub3Rp Zmllcgorbm90aWZpZXI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAibXNnMTIiIGZyb20g bm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEzIiBm cm9tIG5vdGlmaWVyCitub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cx NCIgZnJvbSBub3RpZmllcgorbm90aWZpZXI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAi bXNnMTUiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxv YWQgIm1zZzE2IiBmcm9tIG5vdGlmaWVyCitub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBw YXlsb2FkICJtc2cxNyIgZnJvbSBub3RpZmllcgorCitzdGFydGluZyBwZXJtdXRhdGlvbjog bGlzdGVuYyBsbGlzdGVuIGwybGlzdGVuIGwzbGlzdGVuIGxzbGlzdGVuCitzdGVwIGxpc3Rl bmM6IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBsbGlzdGVuOiBMSVNURU4gYzE7IExJ U1RFTiBjMjsKK3N0ZXAgbDJsaXN0ZW46IExJU1RFTiBjMTsKK3N0ZXAgbDNsaXN0ZW46IExJ U1RFTiBjMTsKK3N0ZXAgbHNsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworCiBzdGFy dGluZyBwZXJtdXRhdGlvbjogbGxpc3RlbiBub3RpZnkxIG5vdGlmeTIgbm90aWZ5MyBub3Rp ZnlmIGxjaGVjawogc3RlcCBsbGlzdGVuOiBMSVNURU4gYzE7IExJU1RFTiBjMjsKIHN0ZXAg bm90aWZ5MTogTk9USUZZIGMxOwpAQCAtOTUsNiArMTk0LDggQEAgbGlzdGVuZXI6IE5PVElG WSAiYzIiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCiAKIHN0YXJ0aW5nIHBlcm11 dGF0aW9uOiBsMmxpc3RlbiBsMmJlZ2luIG5vdGlmeTEgbGJlZ2lucyBsbGlzdGVuIGxjb21t aXQgbDJjb21taXQgbDJzdG9wCiBzdGVwIGwybGlzdGVuOiBMSVNURU4gYzE7CitsaXN0ZW5l cjI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCitsaXN0ZW5l cjI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCiBzdGVwIGwy YmVnaW46IEJFR0lOOwogc3RlcCBub3RpZnkxOiBOT1RJRlkgYzE7CiBzdGVwIGxiZWdpbnM6 IEJFR0lOIElTT0xBVElPTiBMRVZFTCBTRVJJQUxJWkFCTEU7CkBAIC0xMDQsNiArMjA1LDE3 IEBAIHN0ZXAgbDJjb21taXQ6IENPTU1JVDsKIGxpc3RlbmVyMjogTk9USUZZICJjMSIgd2l0 aCBwYXlsb2FkICIiIGZyb20gbm90aWZpZXIKIHN0ZXAgbDJzdG9wOiBVTkxJU1RFTiAqOwog CitzdGFydGluZyBwZXJtdXRhdGlvbjogbGNoX2xpc3RlbiBuY2hfbm90aWZ5IGxjaF9jaGVj aworc3RlcCBsY2hfbGlzdGVuOiBMSVNURU4gY2g7CitzdGVwIG5jaF9ub3RpZnk6IE5PVElG WSBjaCwgJ2FhJzsKK3N0ZXAgbGNoX2NoZWNrOiBTRUxFQ1QgMSBBUyB4OworeAorLQorMQor KDEgcm93KQorCitsaXN0ZW5lcl9jaDogTk9USUZZICJjaCIgd2l0aCBwYXlsb2FkICJhYSIg ZnJvbSBub3RpZmllcl9jaAorCiBzdGFydGluZyBwZXJtdXRhdGlvbjogbGxpc3RlbiBsYmVn aW4gdXNhZ2UgYmlnbm90aWZ5IHVzYWdlCiBzdGVwIGxsaXN0ZW46IExJU1RFTiBjMTsgTElT VEVOIGMyOwogc3RlcCBsYmVnaW46IEJFR0lOOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNv bGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVjIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL3Nw ZWNzL2FzeW5jLW5vdGlmeS5zcGVjCmluZGV4IDBiOGNmZDkxMDgzLi4wYTAxZTc3N2I5OCAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVj CisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9hc3luYy1ub3RpZnkuc3BlYwpAQCAt MzEsNiArMzEsMjAgQEAgc3RlcCBub3RpZnlzMQl7CiAJUk9MTEJBQ0sgVE8gU0FWRVBPSU5U IHMyOwogCUNPTU1JVDsKIH0KK3N0ZXAgbm90aWZ5c19zaW1wbGUJeworCUJFR0lOOworCVNB VkVQT0lOVCBzMTsKKwlOT1RJRlkgYzEsICdzaW1wbGUxJzsKKwlOT1RJRlkgYzIsICdzaW1w bGUyJzsKKwlSRUxFQVNFIFNBVkVQT0lOVCBzMTsKKwlDT01NSVQ7Cit9CitzdGVwIG5vdGlm eV9tYW55X3dpdGhfZHVwCXsKKwlCRUdJTjsKKwlTRUxFQ1QgcGdfbm90aWZ5KCdjMScsICdt c2cnIHx8IHM6OnRleHQpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDE3KSBzOworCVNFTEVD VCBwZ19ub3RpZnkoJ2MxJywgJ21zZzEnKTsKKwlDT01NSVQ7Cit9CiBzdGVwIHVzYWdlCQl7 IFNFTEVDVCBwZ19ub3RpZmljYXRpb25fcXVldWVfdXNhZ2UoKSA+IDAgQVMgbm9uemVybzsg fQogc3RlcCBiaWdub3RpZnkJeyBTRUxFQ1QgY291bnQocGdfbm90aWZ5KCdjMScsIHM6OnRl eHQpKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwKSBzOyB9CiB0ZWFyZG93bgkJeyBV TkxJU1RFTiAqOyB9CkBAIC01Myw2ICs2NywzOCBAQCBzdGVwIGwyYmVnaW4JeyBCRUdJTjsg fQogc3RlcCBsMmNvbW1pdAl7IENPTU1JVDsgfQogc3RlcCBsMnN0b3AJCXsgVU5MSVNURU4g KjsgfQogCisjIFRoaXJkIGxpc3RlbmVyIHNlc3Npb24gZm9yIHRlc3RpbmcgYXJyYXkgZ3Jv d3RoLgorCitzZXNzaW9uIGxpc3RlbmVyMworc3RlcCBsM2xpc3Rlbgl7IExJU1RFTiBjMTsg fQordGVhcmRvd24JCXsgVU5MSVNURU4gKjsgfQorCisjIExpc3RlbmVyIHNlc3Npb24gZm9y IGNyb3NzLXNlc3Npb24gbm90aWZpY2F0aW9uIHRlc3Qgd2l0aCBjaGFubmVsICdjaCcuCisK K3Nlc3Npb24gbGlzdGVuZXJfY2gKK3N0ZXAgbGNoX2xpc3Rlbgl7IExJU1RFTiBjaDsgfQor c3RlcCBsY2hfY2hlY2sJeyBTRUxFQ1QgMSBBUyB4OyB9Cit0ZWFyZG93bgkJeyBVTkxJU1RF TiAqOyB9CisKKyMgTm90aWZpZXIgc2Vzc2lvbiBmb3IgY3Jvc3Mtc2Vzc2lvbiBub3RpZmlj YXRpb24gdGVzdCB3aXRoIGNoYW5uZWwgJ2NoJy4KKworc2Vzc2lvbiBub3RpZmllcl9jaAor c3RlcCBuY2hfbm90aWZ5CXsgTk9USUZZIGNoLCAnYWEnOyB9CisKKyMgU2Vzc2lvbiBmb3Ig dGVzdGluZyBMSVNURU4gaW4gc3VidHJhbnNhY3Rpb24gd2l0aCBzZXBhcmF0ZSBzdGVwcy4K Kworc2Vzc2lvbiBsaXN0ZW5fc3VieGFjdAorc3RlcCBsc2JlZ2luCXsgQkVHSU47IH0KK3N0 ZXAgbHNsaXN0ZW5fb3V0ZXIJeyBMSVNURU4gYzM7IH0KK3N0ZXAgbHNzYXZlcG9pbnQJeyBT QVZFUE9JTlQgczE7IH0KK3N0ZXAgbHNsaXN0ZW4JeyBMSVNURU4gYzE7IExJU1RFTiBjMjsg fQorc3RlcCBsc3JlbGVhc2UJeyBSRUxFQVNFIFNBVkVQT0lOVCBzMTsgfQorc3RlcCBsc3Jv bGxiYWNrCXsgUk9MTEJBQ0sgVE8gU0FWRVBPSU5UIHMxOyB9CitzdGVwIGxzY29tbWl0CXsg Q09NTUlUOyB9CitzdGVwIGxzbm90aWZ5CXsgTk9USUZZIGMxLCAnc3VieGFjdF90ZXN0Jzsg fQorc3RlcCBsc25vdGlmeV9jaGVjawl7IE5PVElGWSBjMSwgJ3Nob3VsZF9ub3RfcmVjZWl2 ZSc7IH0KK3RlYXJkb3duCQl7IFVOTElTVEVOICo7IH0KKwogCiAjIFRyaXZpYWwgY2FzZXMu CiBwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeTEgbm90aWZ5MiBub3RpZnkzIG5vdGlmeWYK QEAgLTYwLDYgKzEwNiwyNCBAQCBwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeTEgbm90aWZ5 MiBub3RpZnkzIG5vdGlmeWYKICMgQ2hlY2sgc2ltcGxlIGFuZCBsZXNzLXNpbXBsZSBkZWR1 cGxpY2F0aW9uLgogcGVybXV0YXRpb24gbGlzdGVuYyBub3RpZnlkMSBub3RpZnlkMiBub3Rp ZnlzMQogCisjIENoZWNrIHNpbXBsZSBOT1RJRlkgcmVwYXJlbnRpbmcgd2hlbiBwYXJlbnQg aGFzIG5vIGFjdGlvbi4KK3Blcm11dGF0aW9uIGxpc3RlbmMgbm90aWZ5c19zaW1wbGUKKwor IyBDaGVjayBMSVNURU4gcmVwYXJlbnRpbmcgaW4gc3VidHJhbnNhY3Rpb24uCitwZXJtdXRh dGlvbiBsc2JlZ2luIGxzc2F2ZXBvaW50IGxzbGlzdGVuIGxzcmVsZWFzZSBsc2NvbW1pdCBs c25vdGlmeQorCisjIENoZWNrIExJU1RFTiBtZXJnZSBwYXRoIHdoZW4gYm90aCBvdXRlciBh bmQgaW5uZXIgdHJhbnNhY3Rpb25zIGhhdmUgYWN0aW9ucy4KK3Blcm11dGF0aW9uIGxzYmVn aW4gbHNsaXN0ZW5fb3V0ZXIgbHNzYXZlcG9pbnQgbHNsaXN0ZW4gbHNyZWxlYXNlIGxzY29t bWl0IGxzbm90aWZ5CisKKyMgQ2hlY2sgTElTVEVOIGFib3J0IHBhdGggKFJPTExCQUNLIFRP IFNBVkVQT0lOVCBkaXNjYXJkcyBwZW5kaW5nIGFjdGlvbnMpLgorcGVybXV0YXRpb24gbHNi ZWdpbiBsc3NhdmVwb2ludCBsc2xpc3RlbiBsc3JvbGxiYWNrIGxzY29tbWl0IGxzbm90aWZ5 X2NoZWNrCisKKyMgQ2hlY2sgbm90aWZpY2F0aW9uX21hdGNoIGZ1bmN0aW9uICh0cmlnZ2Vy ZWQgYnkgaGFzaCB0YWJsZSBkdXBsaWNhdGUgZGV0ZWN0aW9uKS4KK3Blcm11dGF0aW9uIGxp c3RlbmMgbm90aWZ5X21hbnlfd2l0aF9kdXAKKworIyBDaGVjayBDaGFubmVsSGFzaEFkZExp c3RlbmVyIGFycmF5IGdyb3d0aC4KK3Blcm11dGF0aW9uIGxpc3RlbmMgbGxpc3RlbiBsMmxp c3RlbiBsM2xpc3RlbiBsc2xpc3RlbgorCiAjIENyb3NzLWJhY2tlbmQgbm90aWZpY2F0aW9u IGRlbGl2ZXJ5LiAgV2UgdXNlIGEgInNlbGVjdCAxIiB0byBmb3JjZSB0aGUKICMgbGlzdGVu ZXIgc2Vzc2lvbiB0byBjaGVjayBmb3Igbm90aWZpZXMuICBJbiBwcmluY2lwbGUgd2UgY291 bGQganVzdCB3YWl0CiAjIGZvciBkZWxpdmVyeSwgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBl eHRyYSBzdXBwb3J0IGluIGlzb2xhdGlvbnRlc3RlcgpAQCAtNzMsNiArMTM3LDEwIEBAIHBl cm11dGF0aW9uIGxpc3RlbmMgbGxpc3RlbiBub3RpZnkxIG5vdGlmeTIgbm90aWZ5MyBub3Rp ZnlmIGxjaGVjawogIyBhbmQgbm90aWZ5IHF1ZXVlIGlzIG5vdCBlbXB0eQogcGVybXV0YXRp b24gbDJsaXN0ZW4gbDJiZWdpbiBub3RpZnkxIGxiZWdpbnMgbGxpc3RlbiBsY29tbWl0IGwy Y29tbWl0IGwyc3RvcAogCisjIENoZWNrIHRoYXQgbm90aWZpY2F0aW9ucyBzZW50IGZyb20g YSBiYWNrZW5kIHRoYXQgaGFzIG5vdCBkb25lIExJU1RFTgorIyBhcmUgcHJvcGVybHkgZGVs aXZlcmVkIHRvIGEgbGlzdGVuZXIgaW4gYW5vdGhlciBiYWNrZW5kLgorcGVybXV0YXRpb24g bGNoX2xpc3RlbiBuY2hfbm90aWZ5IGxjaF9jaGVjaworCiAjIFZlcmlmeSB0aGF0IHBnX25v dGlmaWNhdGlvbl9xdWV1ZV91c2FnZSBjb3JyZWN0bHkgcmVwb3J0cyBhIG5vbi16ZXJvIHJl c3VsdCwKICMgYWZ0ZXIgc3VibWl0dGluZyBub3RpZmljYXRpb25zIHdoaWxlIGFub3RoZXIg Y29ubmVjdGlvbiBpcyBsaXN0ZW5pbmcgZm9yCiAjIHRob3NlIG5vdGlmaWNhdGlvbnMgYW5k IHdhaXRpbmcgaW5zaWRlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbi4gIFdlIGhhdmUgdG8KLS0g CjIuNTAuMQoK --e10b79ee8d00482a9748f612cfbccf9b Content-Disposition: attachment; filename*0="0002-optimize_listen_notify-v28.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0002-optimize=5Flisten=5Fnotify-v28.patch?=" Content-Transfer-Encoding: base64 RnJvbSA0YzlhODNiMzE5ZTFjZWI4Y2E2MzI3NGQ2NzI5ZmZiZjJhNzc0YzRkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU2F0LCAxNSBOb3YgMjAyNSAyMjoxODo1MCArMDEwMApTdWJqZWN0OiBbUEFU Q0ggMi8yXSBPcHRpbWl6ZSBMSVNURU4vTk9USUZZIHdpdGggc2hhcmVkIGNoYW5uZWwgbWFw IGFuZCBkaXJlY3QKIGFkdmFuY2VtZW50CgpUaGlzIHBhdGNoIHJld29ya3MgdGhlIExJU1RF Ti9OT1RJRlkgc2lnbmFsaW5nIHBhdGggdG8gYXZvaWQgdGhlCmxvbmctc3RhbmRpbmcgaW5l ZmZpY2llbmN5IHdoZXJlIGV2ZXJ5IGNvbW1pdCB3YWtlcyBhbGwgbGlzdGVuaW5nCmJhY2tl bmRzIGluIHRoZSBzYW1lIGRhdGFiYXNlLCBldmVuIHRob3NlIHRoYXQgYXJlIGxpc3Rlbmlu ZyBvbgpjb21wbGV0ZWx5IGRpZmZlcmVudCBjaGFubmVscy4KClByb2JsZW0KLS0tLS0tLQoK QXQgcHJlc2VudCwgU2lnbmFsQmFja2VuZHMgaGFzIG5vIGNlbnRyYWwga25vd2xlZGdlIG9m IHdoaWNoIGJhY2tlbmQKbGlzdGVucyBvbiB3aGljaCBjaGFubmVsLiBXaGVuIGEgYmFja2Vu ZCBjb21taXRzIGEgdHJhbnNhY3Rpb24gdGhhdAppc3N1ZWQgTk9USUZZLCBpdCBzaW1wbHkg aXRlcmF0ZXMgb3ZlciBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaW4gdGhlCnNhbWUgZGF0 YWJhc2UgYW5kIHNlbmRzIGVhY2ggb25lIGEgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBUIHNp Z25hbC4KClRoYXQgYmVoYXZpb3IgaXMgZmluZSB3aGVuIGFsbCBsaXN0ZW5lcnMgYXJlIG9u IHRoZSBzYW1lIGNoYW5uZWwsIGJ1dAp3aGVuIG1hbnkgYmFja2VuZHMgYXJlIGxpc3Rlbmlu ZyBvbiBkaWZmZXJlbnQgY2hhbm5lbHMsIGVhY2ggTk9USUZZCnRyaWdnZXJzIGEgc3Rvcm0g b2YgdW5uZWNlc3Nhcnkgd2FrZXVwcyBhbmQgY29udGV4dCBzd2l0Y2hlcy4gQXMgdGhlCm51 bWJlciBvZiBpZGxlIGxpc3RlbmVycyBncm93cywgdGhpcyBvZnRlbiBiZWNvbWVzIHRoZSBi b3R0bGVuZWNrIGFuZAp0aHJvdWdocHV0IGRyb3BzIHNoYXJwbHkuCgpPdmVydmlldyBvZiB0 aGUgc29sdXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGlzIHBhdGNoIGludHJv ZHVjZXMgYSBsYXppbHktY3JlYXRlZCBkeW5hbWljIHNoYXJlZCBoYXNoIChkc2hhc2gpCmJh Y2tlZCBieSBkeW5hbWljIHNoYXJlZCBtZW1vcnkgKERTQSkgdGhhdCBtYXBzIChkYm9pZCwg Y2hhbm5lbCkgdG8KYXJyYXlzIG9mIGxpc3RlbmluZyBiYWNrZW5kcyAoUHJvY051bWJlcnMp LiBUaGlzIGFsbG93cyB0aGUgc2VuZGVyIHRvCnRhcmdldCBvbmx5IHRob3NlIGJhY2tlbmRz IGFjdHVhbGx5IGxpc3RlbmluZyBvbiB0aGUgY2hhbm5lbHMgZm9yIHdoaWNoCml0IGhhcyBx dWV1ZWQgbm90aWZpY2F0aW9ucy4KCkF0IGNvbW1pdCB0aW1lOgoKKiBBdENvbW1pdF9Ob3Rp ZnkgdXBkYXRlcyB0aGUgc2hhcmVkIGNoYW5uZWxIYXNoIHRvIHJlZmxlY3QgYW55IExJU1RF TgogIG9yIFVOTElTVEVOIGFjdGlvbnMgcGVyZm9ybWVkIGluIHRoZSB0cmFuc2FjdGlvbi4K KiBTaWduYWxCYWNrZW5kcyBjb25zdWx0cyB0aGlzIGhhc2ggdG8gZmluZCB0aGUgYmFja2Vu ZHMgdGhhdCBhcmUKICBsaXN0ZW5pbmcgb24gdGhlIGNoYW5uZWxzIGJlaW5nIG5vdGlmaWVk IGluIHRoZSBjdXJyZW50IGRhdGFiYXNlLCBhbmQKICBzaWduYWxzIG9ubHkgdGhvc2UuCgpF YWNoIGJhY2tlbmQncyBlbnRyeSBpbiBBc3luY1F1ZXVlQ29udHJvbCBub3cgaW5jbHVkZXMg YSB3YWtldXBQZW5kaW5nCmZsYWcgdG8gcHJldmVudCBkdXBsaWNhdGUgc2lnbmFscyB3aGls ZSBhIHByZXZpb3VzIHdha2V1cCBpcyBzdGlsbCBiZWluZwpwcm9jZXNzZWQuCgpEaXJlY3Qg YWR2YW5jZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGZ1cnRoZXIgb3B0aW1pemF0aW9u IGF2b2lkcyBzaWduYWxpbmcgaWRsZSBiYWNrZW5kcyB0aGF0IGFyZSBub3QKbGlzdGVuaW5n IG9uIGFueSBvZiB0aGUgY2hhbm5lbHMgbm90aWZpZWQgd2l0aGluIHRoZSB0cmFuc2FjdGlv bi4KCldoaWxlIHF1ZXVpbmcgbm90aWZpY2F0aW9ucywgUHJlQ29tbWl0X05vdGlmeSByZWNv cmRzIHRoZSBxdWV1ZSBoZWFkCnBvc2l0aW9uIGJvdGggYmVmb3JlIGFuZCBhZnRlciB3cml0 aW5nIGl0cyBub3RpZmljYXRpb25zLiBCZWNhdXNlIGFsbAp3cml0ZXJzIGFyZSBzZXJpYWxp emVkIGJ5IHRoZSBleGlzdGluZyBjbHVzdGVyLXdpZGUgaGVhdnl3ZWlnaHQgbG9jayBvbgoi ZGF0YWJhc2UgMCIsIG5vIGJhY2tlbmQgKGZyb20gYW55IGRhdGFiYXNlKSBjYW4gaW5zZXJ0 IGVudHJpZXMgYmV0d2Vlbgp0aG9zZSB0d28gcG9pbnRzLiBUaGlzIGd1YXJhbnRlZXMgdGhh dCB0aGUgcmVnaW9uIFtvbGRIZWFkLCBuZXdIZWFkKQpjb250YWlucyBvbmx5IHRoZSBlbnRy aWVzIHdyaXR0ZW4gYnkgb3VyIGNvbW1pdC4KClNpZ25hbEJhY2tlbmRzIHVzZXMgdGhpcyBm YWN0IHRvIGRpcmVjdGx5IGFkdmFuY2UgYW55IGJhY2tlbmQgc3RpbGwKcG9zaXRpb25lZCBh dCBvbGRIZWFkIHVwIHRvIG5ld0hlYWQsIGF2b2lkaW5nIGEgbmVlZGxlc3Mgd2FrZXVwIGZv cgpsaXN0ZW5lcnMgdGhhdCB3b3VsZCBvdGhlcndpc2Ugbm90IGZpbmQgYW55IG5vdGlmaWVz IG9mIGludGVyZXN0LgoKVG8gaGFuZGxlIGFkdmFuY2luZyBiYWNrZW5kcyBjb3JyZWN0bHks IGVhY2ggYmFja2VuZCdzIGVudHJ5IHRyYWNrcyBib3RoCndoZXRoZXIgaXQgaXMgY3VycmVu dGx5IGFkdmFuY2luZyAoaXNBZHZhbmNpbmcpIGFuZCB0aGUgdGFyZ2V0IHBvc2l0aW9uCml0 IGlzIGFkdmFuY2luZyB0byAoYWR2YW5jaW5nUG9zKS4gVGhpcyBhbGxvd3MgU2lnbmFsQmFj a2VuZHMgdG8gc2lnbmFsCmFkdmFuY2luZyBiYWNrZW5kcyBvbmx5IHdoZW4gdGhlaXIgdGFy Z2V0IHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoZW0KYmVoaW5kIHRoZSBuZXcgcXVldWUgaGVh ZCwgd2hpbGUgc2FmZWx5IGRpcmVjdC1hZHZhbmNpbmcgaWRsZSBiYWNrZW5kcwp0aGF0IHdv dWxkIG5vdCBiZSBpbnRlcmVzdGVkIGluIHRoZSBuZXdseSB3cml0dGVuIG5vdGlmaWNhdGlv bnMuCklkbGUgYmFja2VuZHMgdGhhdCBhcmUgc3RhdGlvbmFyeSBhdCBhIHBvc2l0aW9uIGJl Zm9yZSB0aGUgb2xkIHF1ZXVlCmhlYWQgYXJlIHNpZ25hbGVkLCBzaW5jZSB0aGV5IG1pZ2h0 IGJlIGludGVyZXN0ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbnMKaW4gYmV0d2VlbiB0aGVpciBj dXJyZW50IHBvc2l0aW9uIGFuZCB0aGUgb2xkIHF1ZXVlIGhlYWQuCgpPdGhlciBub3Rlcwot LS0tLS0tLS0tLQoKKiBNYWludGFpbnMgZHVhbCBkYXRhIHN0cnVjdHVyZXM6IGEgc2hhcmVk IGNoYW5uZWxIYXNoIGZvciBkZXRlcm1pbmluZwogIHdoaWNoIGJhY2tlbmRzIHRvIHNpZ25h bCwgYW5kIGEgbG9jYWwgcGVyLWJhY2tlbmQgbGlzdGVuQ2hhbm5lbHMgbGlzdAogIGZvciBm YXN0IGxvY2stZnJlZSBsb29rdXBzIGR1cmluZyBub3RpZmljYXRpb24gcHJvY2Vzc2luZy4g VGhpcyBhdm9pZHMKICBjb250ZW50aW9uIG9uIHRoZSBzaGFyZWQgaGFzaCBkdXJpbmcgdGhl IGhpZ2gtZnJlcXVlbmN5IElzTGlzdGVuaW5nT24KICBjaGVja3MgdGhhdCBvY2N1ciBmb3Ig ZXZlcnkgbm90aWZpY2F0aW9uIHJlYWQgZnJvbSB0aGUgcXVldWUuCiogQmFja2VuZHMgcmVt YWluIHJlZ2lzdGVyZWQgaW4gdGhlIGdsb2JhbCBsaXN0ZW5lciBsaXN0IGFzIGxvbmcgYXMK ICBsaXN0ZW5DaGFubmVscyBpcyBub24tZW1wdHkuCiogQWRkcyBMV0xvY2sgdHJhbmNoZSBO T1RJRllfQ0hBTk5FTF9IQVNIIGFuZCB3YWl0IGV2ZW50CiAgTm90aWZ5Q2hhbm5lbEhhc2gg Zm9yIHZpc2liaWxpdHkuCiogTm8gdXNlci12aXNpYmxlIGJlaGF2aW9yYWwgY2hhbmdlczsg dGhpcyBpcyBhbiBpbnRlcm5hbCBvcHRpbWl6YXRpb24KICBvbmx5LgotLS0KIHNyYy9iYWNr ZW5kL2NvbW1hbmRzL2FzeW5jLmMgICAgICAgICAgICAgICAgICB8IDcxMyArKysrKysrKysr KysrKystLS0KIC4uLi91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAg ICB8ICAgMSArCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9ja2xpc3QuaCAgICAgICAgICAg ICAgfCAgIDEgKwogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAg ICAgIHwgICAyICsKIDQgZmlsZXMgY2hhbmdlZCwgNjEwIGluc2VydGlvbnMoKyksIDEwNyBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYwppbmRleCBlMWNmNjU5NDg1YS4uZGJj OTBiODg3YjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYwpAQCAtMjQsOCArMjQsMTAgQEAKICAq CSAgQWxsIG5vdGlmaWNhdGlvbiBtZXNzYWdlcyBhcmUgcGxhY2VkIGluIHRoZSBxdWV1ZSBh bmQgbGF0ZXIgcmVhZCBvdXQKICAqCSAgYnkgbGlzdGVuaW5nIGJhY2tlbmRzLgogICoKLSAq CSAgVGhlcmUgaXMgbm8gY2VudHJhbCBrbm93bGVkZ2Ugb2Ygd2hpY2ggYmFja2VuZCBsaXN0 ZW5zIG9uIHdoaWNoIGNoYW5uZWw7Ci0gKgkgIGV2ZXJ5IGJhY2tlbmQgaGFzIGl0cyBvd24g bGlzdCBvZiBpbnRlcmVzdGluZyBjaGFubmVscy4KKyAqCSAgV2UgYWxzbyBtYWludGFpbiBh IGR5bmFtaWMgc2hhcmVkIGhhc2ggdGFibGUgKGRzaGFzaCkgdGhhdCBtYXBzIGNoYW5uZWwK KyAqCSAgbmFtZXMgdG8gdGhlIHNldCBvZiBiYWNrZW5kcyBsaXN0ZW5pbmcgb24gZWFjaCBj aGFubmVsLiBUaGlzIHRhYmxlIGlzCisgKgkgIGNyZWF0ZWQgbGF6aWx5IG9uIHRoZSBmaXJz dCBMSVNURU4gY29tbWFuZCBhbmQgZ3Jvd3MgZHluYW1pY2FsbHkgYXMKKyAqCSAgbmVlZGVk LgogICoKICAqCSAgQWx0aG91Z2ggdGhlcmUgaXMgb25seSBvbmUgcXVldWUsIG5vdGlmaWNh dGlvbnMgYXJlIHRyZWF0ZWQgYXMgYmVpbmcKICAqCSAgZGF0YWJhc2UtbG9jYWw7IHRoaXMg aXMgZG9uZSBieSBpbmNsdWRpbmcgdGhlIHNlbmRlcidzIGRhdGFiYXNlIE9JRApAQCAtNjgs MTYgKzcwLDI0IEBACiAgKgkgIENvbW1pdFRyYW5zYWN0aW9uKCkgd2hpY2ggd2lsbCB0aGVu IGRvIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb24gY29tbWl0LgogICoKICAqCSAgQWZ0ZXIgY29t bWl0IHdlIGFyZSBjYWxsZWQgYW5vdGhlciB0aW1lIChBdENvbW1pdF9Ob3RpZnkoKSkuIEhl cmUgd2UKLSAqCSAgbWFrZSBhbnkgYWN0dWFsIHVwZGF0ZXMgdG8gdGhlIGVmZmVjdGl2ZSBs aXN0ZW4gc3RhdGUgKGxpc3RlbkNoYW5uZWxzKS4KLSAqCSAgVGhlbiB3ZSBzaWduYWwgYW55 IGJhY2tlbmRzIHRoYXQgbWF5IGJlIGludGVyZXN0ZWQgaW4gb3VyIG1lc3NhZ2VzCi0gKgkg IChpbmNsdWRpbmcgb3VyIG93biBiYWNrZW5kLCBpZiBsaXN0ZW5pbmcpLiAgVGhpcyBpcyBk b25lIGJ5Ci0gKgkgIFNpZ25hbEJhY2tlbmRzKCksIHdoaWNoIHNjYW5zIHRoZSBsaXN0IG9m IGxpc3RlbmluZyBiYWNrZW5kcyBhbmQgc2VuZHMgYQotICoJICBQUk9DU0lHX05PVElGWV9J TlRFUlJVUFQgc2lnbmFsIHRvIGV2ZXJ5IGxpc3RlbmluZyBiYWNrZW5kICh3ZSBkb24ndAot ICoJICBrbm93IHdoaWNoIGJhY2tlbmQgaXMgbGlzdGVuaW5nIG9uIHdoaWNoIGNoYW5uZWwg c28gd2UgbXVzdCBzaWduYWwgdGhlbQotICoJICBhbGwpLiAgV2UgY2FuIGV4Y2x1ZGUgYmFj a2VuZHMgdGhhdCBhcmUgYWxyZWFkeSB1cCB0byBkYXRlLCB0aG91Z2gsIGFuZAotICoJICB3 ZSBjYW4gYWxzbyBleGNsdWRlIGJhY2tlbmRzIHRoYXQgYXJlIGluIG90aGVyIGRhdGFiYXNl cyAodW5sZXNzIHRoZXkKLSAqCSAgYXJlIHdheSBiZWhpbmQgYW5kIHNob3VsZCBiZSBraWNr ZWQgdG8gbWFrZSB0aGVtIGFkdmFuY2UgdGhlaXIKLSAqCSAgcG9pbnRlcnMpLgorICoJICBt YWtlIGFueSBhY3R1YWwgdXBkYXRlcyB0byB0aGUgbG9jYWwgbGlzdGVuIHN0YXRlIChsaXN0 ZW5DaGFubmVsc0hhc2gpIGFuZAorICoJICBzaGFyZWQgY2hhbm5lbCBoYXNoIHRhYmxlIChj aGFubmVsSGFzaCkuICBUaGVuIHdlIHNpZ25hbCBhbnkgYmFja2VuZHMKKyAqCSAgdGhhdCBt YXkgYmUgaW50ZXJlc3RlZCBpbiBvdXIgbWVzc2FnZXMgKGluY2x1ZGluZyBvdXIgb3duIGJh Y2tlbmQsCisgKgkgIGlmIGxpc3RlbmluZykuICBUaGlzIGlzIGRvbmUgYnkgU2lnbmFsQmFj a2VuZHMoKSwgd2hpY2ggY29uc3VsdHMgdGhlCisgKgkgIHNoYXJlZCBjaGFubmVsIGhhc2gg dGFibGUgdG8gaWRlbnRpZnkgbGlzdGVuZXJzIGZvciB0aGUgY2hhbm5lbHMgdGhhdAorICoJ ICBoYXZlIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBpbiB0aGUgY3VycmVudCBkYXRhYmFzZS4g IEVhY2ggc2VsZWN0ZWQKKyAqCSAgYmFja2VuZCBpcyBtYXJrZWQgYXMgaGF2aW5nIGEgd2Fr ZXVwIHBlbmRpbmcgdG8gYXZvaWQgZHVwbGljYXRlIHNpZ25hbHMsCisgKgkgIGFuZCBhIFBS T0NTSUdfTk9USUZZX0lOVEVSUlVQVCBzaWduYWwgaXMgc2VudCB0byBpdC4KKyAqCisgKgkg IFdoZW4gd3JpdGluZyBub3RpZmljYXRpb25zLCBQcmVDb21taXRfTm90aWZ5KCkgcmVjb3Jk cyB0aGUgcXVldWUgaGVhZAorICoJICBwb3NpdGlvbiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIg dGhlIHdyaXRlLiAgQmVjYXVzZSBhbGwgd3JpdGVycyBzZXJpYWxpemUKKyAqCSAgb24gYSBj bHVzdGVyLXdpZGUgaGVhdnl3ZWlnaHQgbG9jaywgbm8gYmFja2VuZCBjYW4gaW5zZXJ0IGVu dHJpZXMgYmV0d2VlbgorICoJICB0aGVzZSB0d28gcG9pbnRzLiAgU2lnbmFsQmFja2VuZHMo KSB1c2VzIHRoaXMgZmFjdCB0byBkaXJlY3RseSBhZHZhbmNlIGFueQorICoJICBiYWNrZW5k IHRoYXQgaXMgc3RpbGwgcG9zaXRpb25lZCBhdCB0aGUgb2xkIGhlYWQsIG9yIHdpdGhpbiB0 aGUgcmFuZ2UKKyAqCSAgd3JpdHRlbiwgYXZvaWRpbmcgdW5uZWNlc3Nhcnkgd2FrZXVwcyBm b3IgaWRsZSBsaXN0ZW5lcnMgdGhhdCBoYXZlCisgKgkgIG5vdGhpbmcgdG8gcmVhZC4gIEJh Y2tlbmRzIHRoYXQgY2Fubm90IGJlIGRpcmVjdCBhZHZhbmNlZCBhcmUgc2lnbmFsZWQKKyAq CSAgaWYgdGhleSBhcmUgc3R1Y2sgYmVoaW5kIHRoZSBvbGQgcXVldWUgaGVhZCwgb3IgYWR2 YW5jaW5nIHRvIGEgcG9zaXRpb24KKyAqCSAgYmVmb3JlIHRoZSBuZXcgcXVldWUgaGVhZCwg c2luY2Ugb3RoZXJ3aXNlIG5vdGlmaWNhdGlvbnMgY291bGQgYmUgZGVsYXllZC4KICAqCiAg KgkgIEZpbmFsbHksIGFmdGVyIHdlIGFyZSBvdXQgb2YgdGhlIHRyYW5zYWN0aW9uIGFsdG9n ZXRoZXIgYW5kIGFib3V0IHRvIGdvCiAgKgkgIGlkbGUsIHdlIHNjYW4gdGhlIHF1ZXVlIGZv ciBtZXNzYWdlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byBvdXIKQEAgLTEzNywxNCArMTQ3 LDE3IEBACiAjaW5jbHVkZSAiY29tbWFuZHMvYXN5bmMuaCIKICNpbmNsdWRlICJjb21tb24v aGFzaGZuLmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgorI2luY2x1ZGUgImxpYi9kc2hhc2gu aCIKICNpbmNsdWRlICJsaWJwcS9saWJwcS5oIgogI2luY2x1ZGUgImxpYnBxL3BxZm9ybWF0 LmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAic3RvcmFnZS9kc21fcmVn aXN0cnkuaCIKICNpbmNsdWRlICJzdG9yYWdlL2lwYy5oIgogI2luY2x1ZGUgInN0b3JhZ2Uv bG1nci5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJvY3NpZ25hbC5oIgogI2luY2x1ZGUgInRj b3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUg InV0aWxzL2RzYS5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgogI2luY2x1ZGUg InV0aWxzL21lbXV0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvcHNfc3RhdHVzLmgiCkBAIC0x NjIsNiArMTc1LDI5IEBACiAgKi8KICNkZWZpbmUgTk9USUZZX1BBWUxPQURfTUFYX0xFTkdU SAkoQkxDS1NaIC0gTkFNRURBVEFMRU4gLSAxMjgpCiAKKy8qCisgKiBDaGFubmVsIGhhc2gg dGFibGUgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGhhc2ggdGFibGUgbWFwcyAoZGF0YWJh c2UgT0lELCBjaGFubmVsIG5hbWUpIGtleXMgdG8gYXJyYXlzIG9mCisgKiBQcm9jTnVtYmVy cyByZXByZXNlbnRpbmcgdGhlIGJhY2tlbmRzIGxpc3RlbmluZyBvbiBlYWNoIGNoYW5uZWwu CisgKi8KKworI2RlZmluZSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFIDQKKwordHlw ZWRlZiBzdHJ1Y3QgQ2hhbm5lbEhhc2hLZXkKK3sKKwlPaWQJCQlkYm9pZDsKKwljaGFyCQlj aGFubmVsW05BTUVEQVRBTEVOXTsKK30gQ2hhbm5lbEhhc2hLZXk7CisKK3R5cGVkZWYgc3Ry dWN0IENoYW5uZWxFbnRyeQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlkc2FfcG9pbnRl ciBsaXN0ZW5lcnNBcnJheTsgLyogRFNBIHBvaW50ZXIgdG8gUHJvY051bWJlciBhcnJheSAq LworCWludAkJCW51bUxpc3RlbmVyczsJLyogTnVtYmVyIG9mIGxpc3RlbmVycyBjdXJyZW50 bHkgc3RvcmVkICovCisJaW50CQkJYWxsb2NhdGVkTGlzdGVuZXJzOyAvKiBBbGxvY2F0ZWQg c2l6ZSBvZiBhcnJheSAqLworfSBDaGFubmVsRW50cnk7CisKIC8qCiAgKiBTdHJ1Y3QgcmVw cmVzZW50aW5nIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgbm90aWZ5IHF1ZXVlCiAgKgpAQCAt MjI0LDExICsyNjAsMTQgQEAgdHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogCSAoeCku cGFnZSAhPSAoeSkucGFnZSA/ICh4KSA6IFwKIAkgKHgpLm9mZnNldCA+ICh5KS5vZmZzZXQg PyAoeCkgOiAoeSkpCiAKKy8qIHJldHVybnMgdHJ1ZSBpZiB4IGNvbWVzIGJlZm9yZSB5IGlu IHF1ZXVlIG9yZGVyICovCisjZGVmaW5lIFFVRVVFX1BPU19QUkVDRURFUyh4LHkpIFwKKwko YXN5bmNRdWV1ZVBhZ2VQcmVjZWRlcygoeCkucGFnZSwgKHkpLnBhZ2UpIHx8IFwKKwkgKCh4 KS5wYWdlID09ICh5KS5wYWdlICYmICh4KS5vZmZzZXQgPCAoeSkub2Zmc2V0KSkKKwogLyoK ICAqIFBhcmFtZXRlciBkZXRlcm1pbmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2Ug dGhlIHRhaWwgcG9pbnRlcjoKLSAqIHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xF QU5VUF9ERUxBWSBwYWdlcyBvZiBOT1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhl IGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRz IHRvIGJlCi0gKiBiZWhpbmQgYmVmb3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2Ug aXQgdXAgdG8gYWR2YW5jZSBpdHMgcG9pbnRlci4KKyAqIHdlIGRvIHRoYXQgYWZ0ZXIgZXZl cnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBvZiBOT1RJRlkgZGF0YS4KICAqCiAgKiBS ZXNpc3QgdGhlIHRlbXB0YXRpb24gdG8gbWFrZSB0aGlzIHJlYWxseSBsYXJnZS4gIFdoaWxl IHRoYXQgd291bGQgc2F2ZQogICogd29yayBpbiBzb21lIHBsYWNlcywgaXQgd291bGQgYWRk IGNvc3QgaW4gb3RoZXJzLiAgSW4gcGFydGljdWxhciwgdGhpcwpAQCAtMjQ2LDYgKzI4NSw5 IEBAIHR5cGVkZWYgc3RydWN0IFF1ZXVlQmFja2VuZFN0YXR1cwogCU9pZAkJCWRib2lkOwkJ CS8qIGJhY2tlbmQncyBkYXRhYmFzZSBPSUQsIG9yIEludmFsaWRPaWQgKi8KIAlQcm9jTnVt YmVyCW5leHRMaXN0ZW5lcjsJLyogaWQgb2YgbmV4dCBsaXN0ZW5lciwgb3IgSU5WQUxJRF9Q Uk9DX05VTUJFUiAqLwogCVF1ZXVlUG9zaXRpb24gcG9zOwkJCS8qIGJhY2tlbmQgaGFzIHJl YWQgcXVldWUgdXAgdG8gaGVyZSAqLworCWJvb2wJCXdha2V1cFBlbmRpbmc7CS8qIHNpZ25h bCBzZW50IGJ1dCBub3QgeWV0IHByb2Nlc3NlZCAqLworCWJvb2wJCWlzQWR2YW5jaW5nOwkv KiBiYWNrZW5kIGlzIGFkdmFuY2luZyBpdHMgcG9zaXRpb24gKi8KKwlRdWV1ZVBvc2l0aW9u IGFkdmFuY2luZ1BvczsgLyogdGFyZ2V0IHBvc2l0aW9uIGJhY2tlbmQgaXMgYWR2YW5jaW5n IHRvICovCiB9IFF1ZXVlQmFja2VuZFN0YXR1czsKIAogLyoKQEAgLTI2MCw5ICszMDIsMTAg QEAgdHlwZWRlZiBzdHJ1Y3QgUXVldWVCYWNrZW5kU3RhdHVzCiAgKiAoc2luY2Ugbm8gb3Ro ZXIgYmFja2VuZCB3aWxsIGluc3BlY3QgaXQpLgogICoKICAqIFdoZW4gaG9sZGluZyBOb3Rp ZnlRdWV1ZUxvY2sgaW4gRVhDTFVTSVZFIG1vZGUsIGJhY2tlbmRzIGNhbiBpbnNwZWN0IHRo ZQotICogZW50cmllcyBvZiBvdGhlciBiYWNrZW5kcyBhbmQgYWxzbyBjaGFuZ2UgdGhlIGhl YWQgcG9pbnRlci4gV2hlbiBob2xkaW5nCi0gKiBib3RoIE5vdGlmeVF1ZXVlTG9jayBhbmQg Tm90aWZ5UXVldWVUYWlsTG9jayBpbiBFWENMVVNJVkUgbW9kZSwgYmFja2VuZHMKLSAqIGNh biBjaGFuZ2UgdGhlIHRhaWwgcG9pbnRlcnMuCisgKiBlbnRyaWVzIG9mIG90aGVyIGJhY2tl bmRzIGFuZCBhbHNvIGNoYW5nZSB0aGUgaGVhZCBwb2ludGVyLiBUaGV5IGNhbgorICogYWxz byBhZHZhbmNlIG90aGVyIGJhY2tlbmRzJyBxdWV1ZSBwb3NpdGlvbnMsIHVubGVzcyB0aGV5 IGFyZSBub3QKKyAqIGluIHRoZSBwcm9jZXNzIG9mIGRvaW5nIHRoYXQgdGhlbXNlbHZlcy4g V2hlbiBob2xkaW5nIGJvdGggTm90aWZ5UXVldWVMb2NrIGFuZAorICogTm90aWZ5UXVldWVU YWlsTG9jayBpbiBFWENMVVNJVkUgbW9kZSwgYmFja2VuZHMgY2FuIGNoYW5nZSB0aGUgdGFp bCBwb2ludGVycy4KICAqCiAgKiBTTFJVIGJ1ZmZlciBwb29sIGlzIGRpdmlkZWQgaW4gYmFu a3MgYW5kIGJhbmsgd2lzZSBTTFJVIGxvY2sgaXMgdXNlZCBhcwogICogdGhlIGNvbnRyb2wg bG9jayBmb3IgdGhlIHBnX25vdGlmeSBTTFJVIGJ1ZmZlcnMuCkBAIC0yODgsMTEgKzMzMSwx NiBAQCB0eXBlZGVmIHN0cnVjdCBBc3luY1F1ZXVlQ29udHJvbAogCVByb2NOdW1iZXIJZmly c3RMaXN0ZW5lcjsJLyogaWQgb2YgZmlyc3QgbGlzdGVuZXIsIG9yCiAJCQkJCQkJCSAqIElO VkFMSURfUFJPQ19OVU1CRVIgKi8KIAlUaW1lc3RhbXBUeiBsYXN0UXVldWVGaWxsV2FybjsJ LyogdGltZSBvZiBsYXN0IHF1ZXVlLWZ1bGwgbXNnICovCisJZHNhX2hhbmRsZQljaGFubmVs SGFzaERTQTsKKwlkc2hhc2hfdGFibGVfaGFuZGxlIGNoYW5uZWxIYXNoRFNIOwogCVF1ZXVl QmFja2VuZFN0YXR1cyBiYWNrZW5kW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07CiB9IEFzeW5j UXVldWVDb250cm9sOwogCiBzdGF0aWMgQXN5bmNRdWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVD b250cm9sOwogCitzdGF0aWMgZHNhX2FyZWEgKmNoYW5uZWxEU0EgPSBOVUxMOworc3RhdGlj IGRzaGFzaF90YWJsZSAqY2hhbm5lbEhhc2ggPSBOVUxMOworCiAjZGVmaW5lIFFVRVVFX0hF QUQJCQkJCShhc3luY1F1ZXVlQ29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJTAkJ CQkJKGFzeW5jUXVldWVDb250cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BBR0UJ CQkJKGFzeW5jUXVldWVDb250cm9sLT5zdG9wUGFnZSkKQEAgLTMwMSw2ICszNDksOSBAQCBz dGF0aWMgQXN5bmNRdWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVDb250cm9sOwogI2RlZmluZSBR VUVVRV9CQUNLRU5EX0RCT0lEKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0u ZGJvaWQpCiAjZGVmaW5lIFFVRVVFX05FWFRfTElTVEVORVIoaSkJCShhc3luY1F1ZXVlQ29u dHJvbC0+YmFja2VuZFtpXS5uZXh0TGlzdGVuZXIpCiAjZGVmaW5lIFFVRVVFX0JBQ0tFTkRf UE9TKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0ucG9zKQorI2RlZmluZSBR VUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKGkpCShhc3luY1F1ZXVlQ29udHJvbC0+YmFj a2VuZFtpXS53YWtldXBQZW5kaW5nKQorI2RlZmluZSBRVUVVRV9CQUNLRU5EX0lTX0FEVkFO Q0lORyhpKQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0uaXNBZHZhbmNpbmcpCisj ZGVmaW5lIFFVRVVFX0JBQ0tFTkRfQURWQU5DSU5HX1BPUyhpKQkoYXN5bmNRdWV1ZUNvbnRy b2wtPmJhY2tlbmRbaV0uYWR2YW5jaW5nUG9zKQogCiAvKgogICogVGhlIFNMUlUgYnVmZmVy IGFyZWEgdGhyb3VnaCB3aGljaCB3ZSBhY2Nlc3MgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZQpA QCAtMzEzLDE2ICszNjQsMTYgQEAgc3RhdGljIFNscnVDdGxEYXRhIE5vdGlmeUN0bERhdGE7 CiAjZGVmaW5lIFFVRVVFX0ZVTExfV0FSTl9JTlRFUlZBTAk1MDAwCS8qIHdhcm4gYXQgbW9z dCBvbmNlIGV2ZXJ5IDVzICovCiAKIC8qCi0gKiBsaXN0ZW5DaGFubmVscyBpZGVudGlmaWVz IHRoZSBjaGFubmVscyB3ZSBhcmUgYWN0dWFsbHkgbGlzdGVuaW5nIHRvCi0gKiAoaWUsIGhh dmUgY29tbWl0dGVkIGEgTElTVEVOIG9uKS4gIEl0IGlzIGEgc2ltcGxlIGxpc3Qgb2YgY2hh bm5lbCBuYW1lcywKKyAqIGxpc3RlbkNoYW5uZWxzSGFzaCBpZGVudGlmaWVzIHRoZSBjaGFu bmVscyB3ZSBhcmUgYWN0dWFsbHkgbGlzdGVuaW5nIHRvCisgKiAoaWUsIGhhdmUgY29tbWl0 dGVkIGEgTElTVEVOIG9uKS4gIEl0IGlzIGEgaGFzaCB0YWJsZSBvZiBjaGFubmVsIG5hbWVz LAogICogYWxsb2NhdGVkIGluIFRvcE1lbW9yeUNvbnRleHQuCiAgKi8KLXN0YXRpYyBMaXN0 ICpsaXN0ZW5DaGFubmVscyA9IE5JTDsJLyogbGlzdCBvZiBDIHN0cmluZ3MgKi8KK3N0YXRp YyBIVEFCICpsaXN0ZW5DaGFubmVsc0hhc2ggPSBOVUxMOwogCiAvKgogICogU3RhdGUgZm9y IHBlbmRpbmcgTElTVEVOL1VOTElTVEVOIGFjdGlvbnMgY29uc2lzdHMgb2YgYW4gb3JkZXJl ZCBsaXN0IG9mCiAgKiBhbGwgYWN0aW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGN1cnJlbnQgdHJh bnNhY3Rpb24uICBBcyBleHBsYWluZWQgYWJvdmUsCi0gKiB3ZSBkb24ndCBhY3R1YWxseSBj aGFuZ2UgbGlzdGVuQ2hhbm5lbHMgdW50aWwgd2UgcmVhY2ggdHJhbnNhY3Rpb24gY29tbWl0 LgorICogd2UgZG9uJ3QgYWN0dWFsbHkgY2hhbmdlIGxpc3RlbkNoYW5uZWxzSGFzaCB1bnRp bCB3ZSByZWFjaCB0cmFuc2FjdGlvbiBjb21taXQuCiAgKgogICogVGhlIGxpc3QgaXMga2Vw dCBpbiBDdXJUcmFuc2FjdGlvbkNvbnRleHQuICBJbiBzdWJ0cmFuc2FjdGlvbnMsIGVhY2gK ICAqIHN1YnRyYW5zYWN0aW9uIGhhcyBpdHMgb3duIGxpc3QgaW4gaXRzIG93biBDdXJUcmFu c2FjdGlvbkNvbnRleHQsIGJ1dApAQCAtMzkxLDYgKzQ0Miw3IEBAIHR5cGVkZWYgc3RydWN0 IE5vdGlmaWNhdGlvbkxpc3QKIAlpbnQJCQluZXN0aW5nTGV2ZWw7CS8qIGN1cnJlbnQgdHJh bnNhY3Rpb24gbmVzdGluZyBkZXB0aCAqLwogCUxpc3QJICAgKmV2ZW50czsJCQkvKiBsaXN0 IG9mIE5vdGlmaWNhdGlvbiBzdHJ1Y3RzICovCiAJSFRBQgkgICAqaGFzaHRhYjsJCS8qIGhh c2ggb2YgTm90aWZpY2F0aW9uSGFzaCBzdHJ1Y3RzLCBvciBOVUxMICovCisJSFRBQgkgICAq Y2hhbm5lbEhhc2h0YWI7IC8qIGhhc2ggb2YgdW5pcXVlIGNoYW5uZWwgbmFtZXMsIG9yIE5V TEwgKi8KIAlzdHJ1Y3QgTm90aWZpY2F0aW9uTGlzdCAqdXBwZXI7IC8qIGRldGFpbHMgZm9y IHVwcGVyIHRyYW5zYWN0aW9uIGxldmVscyAqLwogfSBOb3RpZmljYXRpb25MaXN0OwogCkBA IC00MDEsNiArNDUzLDExIEBAIHN0cnVjdCBOb3RpZmljYXRpb25IYXNoCiAJTm90aWZpY2F0 aW9uICpldmVudDsJCS8qID0+IHRoZSBhY3R1YWwgTm90aWZpY2F0aW9uIHN0cnVjdCAqLwog fTsKIAorc3RydWN0IENoYW5uZWxIYXNoCit7CisJY2hhcgkJY2hhbm5lbFtOQU1FREFUQUxF Tl07Cit9OworCiBzdGF0aWMgTm90aWZpY2F0aW9uTGlzdCAqcGVuZGluZ05vdGlmaWVzID0g TlVMTDsKIAogLyoKQEAgLTQxOCw2ICs0NzUsMjAgQEAgc3RhdGljIGJvb2wgdW5saXN0ZW5F eGl0UmVnaXN0ZXJlZCA9IGZhbHNlOwogLyogVHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgcmVn aXN0ZXJlZCBhcyBhIGxpc3RlbmVyIGluIGFzeW5jUXVldWVDb250cm9sICovCiBzdGF0aWMg Ym9vbCBhbVJlZ2lzdGVyZWRMaXN0ZW5lciA9IGZhbHNlOwogCisvKgorICogUXVldWUgaGVh ZCBwb3NpdGlvbnMgZm9yIGRpcmVjdCBhZHZhbmNlbWVudC4KKyAqIFRoZXNlIGFyZSBjYXB0 dXJlZCBkdXJpbmcgUHJlQ29tbWl0X05vdGlmeSB3aGlsZSBob2xkaW5nIHRoZSBoZWF2eXdl aWdodAorICogbG9jayBvbiBkYXRhYmFzZSAwLCBlbnN1cmluZyBubyBvdGhlciBiYWNrZW5k IGNhbiBpbnNlcnQgbm90aWZpY2F0aW9ucworICogYmV0d2VlbiB0aGVtLiAgU2lnbmFsQmFj a2VuZHMgdXNlcyB0aGVzZSB0byBhZHZhbmNlIGlkbGUgYmFja2VuZHMuCisgKi8KK3N0YXRp YyBRdWV1ZVBvc2l0aW9uIHF1ZXVlSGVhZEJlZm9yZVdyaXRlOworc3RhdGljIFF1ZXVlUG9z aXRpb24gcXVldWVIZWFkQWZ0ZXJXcml0ZTsKKworLyoKKyAqIExpc3Qgb2YgY2hhbm5lbHMg d2l0aCBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24u CisgKi8KK3N0YXRpYyBMaXN0ICpwZW5kaW5nTm90aWZ5Q2hhbm5lbHMgPSBOSUw7CisKIC8q IGhhdmUgd2UgYWR2YW5jZWQgdG8gYSBwYWdlIHRoYXQncyBhIG11bHRpcGxlIG9mIFFVRVVF X0NMRUFOVVBfREVMQVk/ICovCiBzdGF0aWMgYm9vbCB0cnlBZHZhbmNlVGFpbCA9IGZhbHNl OwogCkBAIC00MjgsNyArNDk5LDYgQEAgYm9vbAkJVHJhY2Vfbm90aWZ5ID0gZmFsc2U7CiBp bnQJCQltYXhfbm90aWZ5X3F1ZXVlX3BhZ2VzID0gMTA0ODU3NjsKIAogLyogbG9jYWwgZnVu Y3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIGlubGluZSBpbnQ2NCBhc3luY1F1ZXVlUGFn ZURpZmYoaW50NjQgcCwgaW50NjQgcSk7CiBzdGF0aWMgaW5saW5lIGJvb2wgYXN5bmNRdWV1 ZVBhZ2VQcmVjZWRlcyhpbnQ2NCBwLCBpbnQ2NCBxKTsKIHN0YXRpYyB2b2lkIHF1ZXVlX2xp c3RlbihMaXN0ZW5BY3Rpb25LaW5kIGFjdGlvbiwgY29uc3QgY2hhciAqY2hhbm5lbCk7CiBz dGF0aWMgdm9pZCBBc3luY19Vbmxpc3Rlbk9uRXhpdChpbnQgY29kZSwgRGF0dW0gYXJnKTsK QEAgLTQ1NiwxNiArNTI2LDkgQEAgc3RhdGljIHZvaWQgQWRkRXZlbnRUb1BlbmRpbmdOb3Rp ZmllcyhOb3RpZmljYXRpb24gKm4pOwogc3RhdGljIHVpbnQzMiBub3RpZmljYXRpb25faGFz aChjb25zdCB2b2lkICprZXksIFNpemUga2V5c2l6ZSk7CiBzdGF0aWMgaW50CW5vdGlmaWNh dGlvbl9tYXRjaChjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyLCBTaXplIGtl eXNpemUpOwogc3RhdGljIHZvaWQgQ2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZv aWQpOwotCi0vKgotICogQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBxdWV1 ZSBwYWdlIG51bWJlcnMuCi0gKiBQcmV2aW91c2x5IHRoaXMgZnVuY3Rpb24gYWNjb3VudGVk IGZvciBhIHdyYXBhcm91bmQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50NjQKLWFzeW5jUXVl dWVQYWdlRGlmZihpbnQ2NCBwLCBpbnQ2NCBxKQotewotCXJldHVybiBwIC0gcTsKLX0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBDaGFubmVsSGFzaFByZXBhcmVLZXkoQ2hhbm5lbEhhc2hLZXkg KmtleSwgT2lkIGRib2lkLCBjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyBkc2hhc2hf aGFzaCBjaGFubmVsSGFzaEZ1bmMoY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qgc2l6ZSwgdm9p ZCAqYXJnKTsKK3N0YXRpYyB2b2lkIGluaXRDaGFubmVsSGFzaCh2b2lkKTsKIAogLyoKICAq IERldGVybWluZXMgd2hldGhlciBwIHByZWNlZGVzIHEuCkBAIC00NzcsNiArNTQwLDEwNSBA QCBhc3luY1F1ZXVlUGFnZVByZWNlZGVzKGludDY0IHAsIGludDY0IHEpCiAJcmV0dXJuIHAg PCBxOwogfQogCisvKgorICogY2hhbm5lbEhhc2hGdW5jCisgKgkJSGFzaCBmdW5jdGlvbiBm b3IgY2hhbm5lbCBrZXlzLgorICovCitzdGF0aWMgZHNoYXNoX2hhc2gKK2NoYW5uZWxIYXNo RnVuYyhjb25zdCB2b2lkICprZXksIHNpemVfdCBzaXplLCB2b2lkICphcmcpCit7CisJY29u c3QgQ2hhbm5lbEhhc2hLZXkgKmsgPSAoY29uc3QgQ2hhbm5lbEhhc2hLZXkgKikga2V5Owor CWRzaGFzaF9oYXNoIGg7CisKKwloID0gRGF0dW1HZXRVSW50MzIoaGFzaF91aW50MzIoay0+ ZGJvaWQpKTsKKwloIF49IERhdHVtR2V0VUludDMyKGhhc2hfYW55KChjb25zdCB1bnNpZ25l ZCBjaGFyICopIGstPmNoYW5uZWwsCisJCQkJCQkJCSBzdHJubGVuKGstPmNoYW5uZWwsIE5B TUVEQVRBTEVOKSkpOworCisJcmV0dXJuIGg7Cit9CisKKy8qIHBhcmFtZXRlcnMgZm9yIHRo ZSBjaGFubmVsIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBjb25zdCBkc2hhc2hfcGFyYW1ldGVy cyBjaGFubmVsRFNIUGFyYW1zID0geworCXNpemVvZihDaGFubmVsSGFzaEtleSksCisJc2l6 ZW9mKENoYW5uZWxFbnRyeSksCisJZHNoYXNoX21lbWNtcCwKKwljaGFubmVsSGFzaEZ1bmMs CisJZHNoYXNoX21lbWNweSwKKwlMV1RSQU5DSEVfTk9USUZZX0NIQU5ORUxfSEFTSAorfTsK KworLyoKKyAqIGluaXRDaGFubmVsSGFzaAorICoJCUxhenkgaW5pdGlhbGl6YXRpb24gb2Yg dGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQKK2luaXRDaGFubmVs SGFzaCh2b2lkKQoreworCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dDsKKworCS8qIFF1aWNr IGV4aXQgaWYgd2UgYWxyZWFkeSBkaWQgdGhpcyAqLworCWlmIChhc3luY1F1ZXVlQ29udHJv bC0+Y2hhbm5lbEhhc2hEU0ggIT0gRFNIQVNIX0hBTkRMRV9JTlZBTElEICYmCisJCWNoYW5u ZWxIYXNoICE9IE5VTEwpCisJCXJldHVybjsKKworCS8qIE90aGVyd2lzZSwgdXNlIGEgbG9j ayB0byBlbnN1cmUgb25seSBvbmUgcHJvY2VzcyBjcmVhdGVzIHRoZSB0YWJsZSAqLworCUxX TG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOworCisJLyogQmUg c3VyZSBhbnkgbG9jYWwgbWVtb3J5IGFsbG9jYXRlZCBieSBEU0Egcm91dGluZXMgaXMgcGVy c2lzdGVudCAqLworCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVt b3J5Q29udGV4dCk7CisKKwlpZiAoYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxIYXNoRFNI ID09IERTSEFTSF9IQU5ETEVfSU5WQUxJRCkKKwl7CisJCS8qIEluaXRpYWxpemUgZHluYW1p YyBzaGFyZWQgaGFzaCB0YWJsZSBmb3IgY2hhbm5lbCBoYXNoICovCisJCWNoYW5uZWxEU0Eg PSBkc2FfY3JlYXRlKExXVFJBTkNIRV9OT1RJRllfQ0hBTk5FTF9IQVNIKTsKKwkJZHNhX3Bp bihjaGFubmVsRFNBKTsKKwkJZHNhX3Bpbl9tYXBwaW5nKGNoYW5uZWxEU0EpOworCQljaGFu bmVsSGFzaCA9IGRzaGFzaF9jcmVhdGUoY2hhbm5lbERTQSwgJmNoYW5uZWxEU0hQYXJhbXMs IE5VTEwpOworCisJCS8qIFN0b3JlIGhhbmRsZXMgaW4gc2hhcmVkIG1lbW9yeSBmb3Igb3Ro ZXIgYmFja2VuZHMgdG8gdXNlICovCisJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFz aERTQSA9IGRzYV9nZXRfaGFuZGxlKGNoYW5uZWxEU0EpOworCQlhc3luY1F1ZXVlQ29udHJv bC0+Y2hhbm5lbEhhc2hEU0ggPQorCQkJZHNoYXNoX2dldF9oYXNoX3RhYmxlX2hhbmRsZShj aGFubmVsSGFzaCk7CisJfQorCWVsc2UgaWYgKCFjaGFubmVsSGFzaCkKKwl7CisJCS8qIEF0 dGFjaCB0byBleGlzdGluZyBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlICovCisJCWNoYW5u ZWxEU0EgPSBkc2FfYXR0YWNoKGFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFzaERTQSk7 CisJCWRzYV9waW5fbWFwcGluZyhjaGFubmVsRFNBKTsKKwkJY2hhbm5lbEhhc2ggPSBkc2hh c2hfYXR0YWNoKGNoYW5uZWxEU0EsICZjaGFubmVsRFNIUGFyYW1zLAorCQkJCQkJCQkJYXN5 bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxIYXNoRFNILAorCQkJCQkJCQkJTlVMTCk7CisJfQor CisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCUxXTG9ja1JlbGVhc2Uo Tm90aWZ5UXVldWVMb2NrKTsKK30KKworLyoKKyAqIGluaXRMaXN0ZW5DaGFubmVsc0hhc2gK KyAqCQlMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBsb2NhbCBsaXN0ZW4gY2hhbm5lbHMg aGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQKK2luaXRMaXN0ZW5DaGFubmVsc0hhc2go dm9pZCkKK3sKKwlIQVNIQ1RMCQloYXNoX2N0bDsKKworCS8qIFF1aWNrIGV4aXQgaWYgd2Ug YWxyZWFkeSBkaWQgdGhpcyAqLworCWlmIChsaXN0ZW5DaGFubmVsc0hhc2ggIT0gTlVMTCkK KwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSBsb2NhbCBoYXNoIHRhYmxlIGZvciB0aGlz IGJhY2tlbmQncyBsaXN0ZW5lZCBjaGFubmVscyAqLworCW1lbXNldCgmaGFzaF9jdGwsIDAs IHNpemVvZihoYXNoX2N0bCkpOworCWhhc2hfY3RsLmtleXNpemUgPSBOQU1FREFUQUxFTjsK KwloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2Yoc3RydWN0IENoYW5uZWxIYXNoKTsKKwor CWxpc3RlbkNoYW5uZWxzSGFzaCA9CisJCWhhc2hfY3JlYXRlKCJMaXN0ZW4gQ2hhbm5lbHMi LAorCQkJCQk2NCwKKwkJCQkJJmhhc2hfY3RsLAorCQkJCQlIQVNIX0VMRU0gfCBIQVNIX1NU UklOR1MpOworfQorCiAvKgogICogUmVwb3J0IHNwYWNlIG5lZWRlZCBmb3Igb3VyIHNoYXJl ZCBtZW1vcnkgYXJlYQogICovCkBAIC01MjAsMTIgKzY4MiwxNyBAQCBBc3luY1NobWVtSW5p dCh2b2lkKQogCQlRVUVVRV9TVE9QX1BBR0UgPSAwOwogCQlRVUVVRV9GSVJTVF9MSVNURU5F UiA9IElOVkFMSURfUFJPQ19OVU1CRVI7CiAJCWFzeW5jUXVldWVDb250cm9sLT5sYXN0UXVl dWVGaWxsV2FybiA9IDA7CisJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFzaERTQSA9 IERTQV9IQU5ETEVfSU5WQUxJRDsKKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxIYXNo RFNIID0gRFNIQVNIX0hBTkRMRV9JTlZBTElEOwogCQlmb3IgKGludCBpID0gMDsgaSA8IE1h eEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJCVFVRVVFX0JBQ0tFTkRfUElEKGkpID0gSW52YWxp ZFBpZDsKIAkJCVFVRVVFX0JBQ0tFTkRfREJPSUQoaSkgPSBJbnZhbGlkT2lkOwogCQkJUVVF VUVfTkVYVF9MSVNURU5FUihpKSA9IElOVkFMSURfUFJPQ19OVU1CRVI7CiAJCQlTRVRfUVVF VUVfUE9TKFFVRVVFX0JBQ0tFTkRfUE9TKGkpLCAwLCAwKTsKKwkJCVNFVF9RVUVVRV9QT1Mo UVVFVUVfQkFDS0VORF9BRFZBTkNJTkdfUE9TKGkpLCAwLCAwKTsKKwkJCVFVRVVFX0JBQ0tF TkRfV0FLRVVQX1BFTkRJTkcoaSkgPSBmYWxzZTsKKwkJCVFVRVVFX0JBQ0tFTkRfSVNfQURW QU5DSU5HKGkpID0gZmFsc2U7CiAJCX0KIAl9CiAKQEAgLTY1Niw2ICs4MjMsNyBAQCBBc3lu Y19Ob3RpZnkoY29uc3QgY2hhciAqY2hhbm5lbCwgY29uc3QgY2hhciAqcGF5bG9hZCkKIAkJ bm90aWZpZXMtPmV2ZW50cyA9IGxpc3RfbWFrZTEobik7CiAJCS8qIFdlIGNlcnRhaW5seSBk b24ndCBuZWVkIGEgaGFzaHRhYmxlIHlldCAqLwogCQlub3RpZmllcy0+aGFzaHRhYiA9IE5V TEw7CisJCW5vdGlmaWVzLT5jaGFubmVsSGFzaHRhYiA9IE5VTEw7CiAJCW5vdGlmaWVzLT51 cHBlciA9IHBlbmRpbmdOb3RpZmllczsKIAkJcGVuZGluZ05vdGlmaWVzID0gbm90aWZpZXM7 CiAJfQpAQCAtNjgyLDcgKzg1MCw3IEBAIEFzeW5jX05vdGlmeShjb25zdCBjaGFyICpjaGFu bmVsLCBjb25zdCBjaGFyICpwYXlsb2FkKQogICoJCUNvbW1vbiBjb2RlIGZvciBsaXN0ZW4s IHVubGlzdGVuLCB1bmxpc3RlbiBhbGwgY29tbWFuZHMuCiAgKgogICoJCUFkZHMgdGhlIHJl cXVlc3QgdG8gdGhlIGxpc3Qgb2YgcGVuZGluZyBhY3Rpb25zLgotICoJCUFjdHVhbCB1cGRh dGUgb2YgdGhlIGxpc3RlbkNoYW5uZWxzIGxpc3QgaGFwcGVucyBkdXJpbmcgdHJhbnNhY3Rp b24KKyAqCQlBY3R1YWwgdXBkYXRlIG9mIHRoZSBsaXN0ZW5DaGFubmVsc0hhc2ggaGFwcGVu cyBkdXJpbmcgdHJhbnNhY3Rpb24KICAqCQljb21taXQuCiAgKi8KIHN0YXRpYyB2b2lkCkBA IC03ODIsMzAgKzk1MCw0OSBAQCBBc3luY19Vbmxpc3RlbkFsbCh2b2lkKQogICogU1FMIGZ1 bmN0aW9uOiByZXR1cm4gYSBzZXQgb2YgdGhlIGNoYW5uZWwgbmFtZXMgdGhpcyBiYWNrZW5k IGlzIGFjdGl2ZWx5CiAgKiBsaXN0ZW5pbmcgdG8uCiAgKgotICogTm90ZTogdGhpcyBjb2Rp bmcgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGxpc3RlbkNoYW5uZWxzIGxpc3QgY2Fu bm90CisgKiBOb3RlOiB0aGlzIGNvZGluZyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUg bGlzdGVuQ2hhbm5lbHNIYXNoIGNhbm5vdAogICogY2hhbmdlIHdpdGhpbiBhIHRyYW5zYWN0 aW9uLgogICovCiBEYXR1bQogcGdfbGlzdGVuaW5nX2NoYW5uZWxzKFBHX0ZVTkNUSU9OX0FS R1MpCiB7CiAJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUhBU0hfU0VRX1NUQVRVUyAq c3RhdHVzOwogCiAJLyogc3R1ZmYgZG9uZSBvbmx5IG9uIHRoZSBmaXJzdCBjYWxsIG9mIHRo ZSBmdW5jdGlvbiAqLwogCWlmIChTUkZfSVNfRklSU1RDQUxMKCkpCiAJeworCQlNZW1vcnlD b250ZXh0IG9sZGNvbnRleHQ7CisKIAkJLyogY3JlYXRlIGEgZnVuY3Rpb24gY29udGV4dCBm b3IgY3Jvc3MtY2FsbCBwZXJzaXN0ZW5jZSAqLwogCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FM TF9JTklUKCk7CisKKwkJLyogSW5pdGlhbGl6ZSBoYXNoIHRhYmxlIGl0ZXJhdGlvbiBpZiB3 ZSBoYXZlIGFueSBjaGFubmVscyAqLworCQlpZiAobGlzdGVuQ2hhbm5lbHNIYXNoICE9IE5V TEwpCisJCXsKKwkJCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0 eC0+bXVsdGlfY2FsbF9tZW1vcnlfY3R4KTsKKwkJCXN0YXR1cyA9IChIQVNIX1NFUV9TVEFU VVMgKikgcGFsbG9jKHNpemVvZihIQVNIX1NFUV9TVEFUVVMpKTsKKwkJCWhhc2hfc2VxX2lu aXQoc3RhdHVzLCBsaXN0ZW5DaGFubmVsc0hhc2gpOworCQkJZnVuY2N0eC0+dXNlcl9mY3R4 ID0gc3RhdHVzOworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCQl9 CisJCWVsc2UKKwkJeworCQkJZnVuY2N0eC0+dXNlcl9mY3R4ID0gTlVMTDsKKwkJfQogCX0K IAogCS8qIHN0dWZmIGRvbmUgb24gZXZlcnkgY2FsbCBvZiB0aGUgZnVuY3Rpb24gKi8KIAlm dW5jY3R4ID0gU1JGX1BFUkNBTExfU0VUVVAoKTsKKwlzdGF0dXMgPSAoSEFTSF9TRVFfU1RB VFVTICopIGZ1bmNjdHgtPnVzZXJfZmN0eDsKIAotCWlmIChmdW5jY3R4LT5jYWxsX2NudHIg PCBsaXN0X2xlbmd0aChsaXN0ZW5DaGFubmVscykpCisJaWYgKHN0YXR1cyAhPSBOVUxMKQog CXsKLQkJY2hhcgkgICAqY2hhbm5lbCA9IChjaGFyICopIGxpc3RfbnRoKGxpc3RlbkNoYW5u ZWxzLAotCQkJCQkJCQkJCQkJZnVuY2N0eC0+Y2FsbF9jbnRyKTsKKwkJc3RydWN0IENoYW5u ZWxIYXNoICplbnRyeTsKIAotCQlTUkZfUkVUVVJOX05FWFQoZnVuY2N0eCwgQ1N0cmluZ0dl dFRleHREYXR1bShjaGFubmVsKSk7CisJCWVudHJ5ID0gKHN0cnVjdCBDaGFubmVsSGFzaCAq KSBoYXNoX3NlcV9zZWFyY2goc3RhdHVzKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpCisJCQlT UkZfUkVUVVJOX05FWFQoZnVuY2N0eCwgQ1N0cmluZ0dldFRleHREYXR1bShlbnRyeS0+Y2hh bm5lbCkpOwogCX0KIAogCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKQEAgLTg5Myw2ICsx MDgwLDM2IEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAlpZiAocGVuZGluZ05vdGlmaWVz KQogCXsKIAkJTGlzdENlbGwgICAqbmV4dE5vdGlmeTsKKwkJYm9vbAkJZmlyc3RJdGVyYXRp b24gPSB0cnVlOworCisJCS8qCisJCSAqIEJ1aWxkIGxpc3Qgb2YgdW5pcXVlIGNoYW5uZWxz IGZvciBTaWduYWxCYWNrZW5kcygpLgorCQkgKgorCQkgKiBJZiB3ZSBoYXZlIGEgY2hhbm5l bEhhc2h0YWIsIHVzZSBpdCB0byBlZmZpY2llbnRseSBnZXQgdGhlIHVuaXF1ZQorCQkgKiBj aGFubmVscy4gIE90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIHRoZSBsaW5lYXIgYXBwcm9hY2gu CisJCSAqLworCQlwZW5kaW5nTm90aWZ5Q2hhbm5lbHMgPSBOSUw7CisJCWlmIChwZW5kaW5n Tm90aWZpZXMtPmNoYW5uZWxIYXNodGFiICE9IE5VTEwpCisJCXsKKwkJCUhBU0hfU0VRX1NU QVRVUyBzdGF0dXM7CisJCQlzdHJ1Y3QgQ2hhbm5lbEhhc2ggKmNoYW5uZWxFbnRyeTsKKwor CQkJaGFzaF9zZXFfaW5pdCgmc3RhdHVzLCBwZW5kaW5nTm90aWZpZXMtPmNoYW5uZWxIYXNo dGFiKTsKKwkJCXdoaWxlICgoY2hhbm5lbEVudHJ5ID0gKHN0cnVjdCBDaGFubmVsSGFzaCAq KSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwpCisJCQkJcGVuZGluZ05vdGlm eUNoYW5uZWxzID0gbGFwcGVuZChwZW5kaW5nTm90aWZ5Q2hhbm5lbHMsIGNoYW5uZWxFbnRy eS0+Y2hhbm5lbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBMaW5lYXIgYXBwcm9hY2gg Zm9yIHNtYWxsIG51bWJlciBvZiBub3RpZmljYXRpb25zICovCisJCQlmb3JlYWNoX3B0cihO b3RpZmljYXRpb24sIG4sIHBlbmRpbmdOb3RpZmllcy0+ZXZlbnRzKQorCQkJeworCQkJCWNo YXIJICAgKmNoYW5uZWwgPSBuLT5kYXRhOworCisJCQkJLyogQWRkIGlmIG5vdCBhbHJlYWR5 IGluIGxpc3QgKi8KKwkJCQlpZiAoIWxpc3RfbWVtYmVyX3B0cihwZW5kaW5nTm90aWZ5Q2hh bm5lbHMsIGNoYW5uZWwpKQorCQkJCQlwZW5kaW5nTm90aWZ5Q2hhbm5lbHMgPSBsYXBwZW5k KHBlbmRpbmdOb3RpZnlDaGFubmVscywgY2hhbm5lbCk7CisJCQl9CisJCX0KIAogCQkvKgog CQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFuIFhJRCBhc3NpZ25lZCB0byB0aGUgY3Vy cmVudCB0cmFuc2FjdGlvbi4KQEAgLTkyMSw2ICsxMTM4LDIyIEBAIFByZUNvbW1pdF9Ob3Rp Znkodm9pZCkKIAkJTG9ja1NoYXJlZE9iamVjdChEYXRhYmFzZVJlbGF0aW9uSWQsIEludmFs aWRPaWQsIDAsCiAJCQkJCQkgQWNjZXNzRXhjbHVzaXZlTG9jayk7CiAKKwkJLyoKKwkJICog Rm9yIHRoZSBkaXJlY3QgYWR2YW5jZW1lbnQgb3B0aW1pemF0aW9uIGluIFNpZ25hbEJhY2tl bmRzKCksIHdlCisJCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgbm8gb3RoZXIgYmFja2VuZCBj YW4gaW5zZXJ0IHF1ZXVlIGVudHJpZXMKKwkJICogYmV0d2VlbiBxdWV1ZUhlYWRCZWZvcmVX cml0ZSBhbmQgcXVldWVIZWFkQWZ0ZXJXcml0ZS4gIFRoZQorCQkgKiBoZWF2eXdlaWdodCBs b2NrIGFib3ZlIHByb3ZpZGVzIHRoaXMgZ3VhcmFudGVlLCBzaW5jZSBpdCBzZXJpYWxpemVz CisJCSAqIGFsbCB3cml0ZXJzLgorCQkgKgorCQkgKiBOb3RlOiBpZiB0aGUgaGVhdnl3ZWln aHQgbG9jayB3ZXJlIGV2ZXIgcmVtb3ZlZCBmb3Igc2NhbGFiaWxpdHkKKwkJICogcmVhc29u cywgd2UgY291bGQgYWNoaWV2ZSB0aGUgc2FtZSBndWFyYW50ZWUgYnkgaG9sZGluZworCQkg KiBOb3RpZnlRdWV1ZUxvY2sgaW4gRVhDTFVTSVZFIG1vZGUgYWNyb3NzIGFsbCBvdXIgaW5z ZXJ0aW9ucywgcmF0aGVyCisJCSAqIHRoYW4gcmVsZWFzaW5nIGFuZCByZWFjcXVpcmluZyBp dCBmb3IgZWFjaCBwYWdlIGFzIHdlIGRvIGJlbG93LgorCQkgKi8KKworCQkvKiBJbml0aWFs aXplIHF1ZXVlSGVhZEJlZm9yZVdyaXRlIHRvIGEgc2FmZSBkZWZhdWx0ICovCisJCVNFVF9R VUVVRV9QT1MocXVldWVIZWFkQmVmb3JlV3JpdGUsIDAsIDApOworCiAJCS8qIE5vdyBwdXNo IHRoZSBub3RpZmljYXRpb25zIGludG8gdGhlIHF1ZXVlICovCiAJCW5leHROb3RpZnkgPSBs aXN0X2hlYWQocGVuZGluZ05vdGlmaWVzLT5ldmVudHMpOwogCQl3aGlsZSAobmV4dE5vdGlm eSAhPSBOVUxMKQpAQCAtOTM4LDEyICsxMTcxLDIwIEBAIFByZUNvbW1pdF9Ob3RpZnkodm9p ZCkKIAkJCSAqIHBvaW50IGluIHRpbWUgd2UgY2FuIHN0aWxsIHJvbGwgdGhlIHRyYW5zYWN0 aW9uIGJhY2suCiAJCQkgKi8KIAkJCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBM V19FWENMVVNJVkUpOworCQkJaWYgKGZpcnN0SXRlcmF0aW9uKQorCQkJeworCQkJCXF1ZXVl SGVhZEJlZm9yZVdyaXRlID0gUVVFVUVfSEVBRDsKKwkJCQlmaXJzdEl0ZXJhdGlvbiA9IGZh bHNlOworCQkJfQorCiAJCQlhc3luY1F1ZXVlRmlsbFdhcm5pbmcoKTsKIAkJCWlmIChhc3lu Y1F1ZXVlSXNGdWxsKCkpCiAJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVS UkNPREVfUFJPR1JBTV9MSU1JVF9FWENFRURFRCksCiAJCQkJCQkgZXJybXNnKCJ0b28gbWFu eSBub3RpZmljYXRpb25zIGluIHRoZSBOT1RJRlkgcXVldWUiKSkpOwogCQkJbmV4dE5vdGlm eSA9IGFzeW5jUXVldWVBZGRFbnRyaWVzKG5leHROb3RpZnkpOworCQkJcXVldWVIZWFkQWZ0 ZXJXcml0ZSA9IFFVRVVFX0hFQUQ7CisKIAkJCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVM b2NrKTsKIAkJfQogCkBAIC05NTYsNyArMTE5Nyw3IEBAIFByZUNvbW1pdF9Ob3RpZnkodm9p ZCkKICAqCiAgKgkJVGhpcyBpcyBjYWxsZWQgYXQgdHJhbnNhY3Rpb24gY29tbWl0LCBhZnRl ciBjb21taXR0aW5nIHRvIGNsb2cuCiAgKgotICoJCVVwZGF0ZSBsaXN0ZW5DaGFubmVscyBh bmQgY2xlYXIgdHJhbnNhY3Rpb24tbG9jYWwgc3RhdGUuCisgKgkJVXBkYXRlIGxpc3RlbkNo YW5uZWxzSGFzaCBhbmQgY2xlYXIgdHJhbnNhY3Rpb24tbG9jYWwgc3RhdGUuCiAgKgogICoJ CUlmIHdlIGlzc3VlZCBhbnkgbm90aWZpY2F0aW9ucyBpbiB0aGUgdHJhbnNhY3Rpb24sIHNl bmQgc2lnbmFscyB0bwogICoJCWxpc3RlbmluZyBiYWNrZW5kcyAocG9zc2libHkgaW5jbHVk aW5nIG91cnNlbHZlcykgdG8gcHJvY2VzcyB0aGVtLgpAQCAtMTAwMSw3ICsxMjQyLDggQEAg QXRDb21taXRfTm90aWZ5KHZvaWQpCiAJfQogCiAJLyogSWYgbm8gbG9uZ2VyIGxpc3Rlbmlu ZyB0byBhbnl0aGluZywgZ2V0IG91dCBvZiBsaXN0ZW5lciBhcnJheSAqLwotCWlmIChhbVJl Z2lzdGVyZWRMaXN0ZW5lciAmJiBsaXN0ZW5DaGFubmVscyA9PSBOSUwpCisJaWYgKGFtUmVn aXN0ZXJlZExpc3RlbmVyICYmCisJCShsaXN0ZW5DaGFubmVsc0hhc2ggPT0gTlVMTCB8fCBo YXNoX2dldF9udW1fZW50cmllcyhsaXN0ZW5DaGFubmVsc0hhc2gpID09IDApKQogCQlhc3lu Y1F1ZXVlVW5yZWdpc3RlcigpOwogCiAJLyoKQEAgLTExMzQsNTAgKzEzNzYsMTQ1IEBAIEV4 ZWNfTGlzdGVuUHJlQ29tbWl0KHZvaWQpCiBzdGF0aWMgdm9pZAogRXhlY19MaXN0ZW5Db21t aXQoY29uc3QgY2hhciAqY2hhbm5lbCkKIHsKLQlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7 CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCUNoYW5uZWxFbnRyeSAqZW50cnk7CisJYm9vbAkJ Zm91bmQ7CisJUHJvY051bWJlciAqbGlzdGVuZXJzOwogCiAJLyogRG8gbm90aGluZyBpZiB3 ZSBhcmUgYWxyZWFkeSBsaXN0ZW5pbmcgb24gdGhpcyBjaGFubmVsICovCiAJaWYgKElzTGlz dGVuaW5nT24oY2hhbm5lbCkpCiAJCXJldHVybjsKIAogCS8qCi0JICogQWRkIHRoZSBuZXcg Y2hhbm5lbCBuYW1lIHRvIGxpc3RlbkNoYW5uZWxzLgorCSAqIEFkZCB0aGUgbmV3IGNoYW5u ZWwgbmFtZSB0byBsaXN0ZW5DaGFubmVsc0hhc2guCiAJICoKIAkgKiBYWFggSXQgaXMgdGhl b3JldGljYWxseSBwb3NzaWJsZSB0byBnZXQgYW4gb3V0LW9mLW1lbW9yeSBmYWlsdXJlIGhl cmUsCiAJICogd2hpY2ggd291bGQgYmUgYmFkIGJlY2F1c2Ugd2UgYWxyZWFkeSBjb21taXR0 ZWQuICBGb3IgdGhlIG1vbWVudCBpdAogCSAqIGRvZXNuJ3Qgc2VlbSB3b3J0aCB0cnlpbmcg dG8gZ3VhcmQgYWdhaW5zdCB0aGF0LCBidXQgbWF5YmUgaW1wcm92ZSB0aGlzCiAJICogbGF0 ZXIuCiAJICovCi0Jb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BNZW1v cnlDb250ZXh0KTsKLQlsaXN0ZW5DaGFubmVscyA9IGxhcHBlbmQobGlzdGVuQ2hhbm5lbHMs IHBzdHJkdXAoY2hhbm5lbCkpOwotCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0 KTsKKwlpbml0TGlzdGVuQ2hhbm5lbHNIYXNoKCk7CisJKHZvaWQpIGhhc2hfc2VhcmNoKGxp c3RlbkNoYW5uZWxzSGFzaCwgY2hhbm5lbCwgSEFTSF9FTlRFUiwgTlVMTCk7CisKKwkvKiBO b3cgdXBkYXRlIHRoZSBzaGFyZWQgY2hhbm5lbEhhc2ggZm9yIFNpZ25hbEJhY2tlbmRzKCkg dG8gdXNlICovCisJaW5pdENoYW5uZWxIYXNoKCk7CisKKwlDaGFubmVsSGFzaFByZXBhcmVL ZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFubmVsKTsKKworCS8qCisJICogRm9yIG5ldyBl bnRyaWVzLCB3ZSBpbml0aWFsaXplIGxpc3RlbmVyc0FycmF5IHRvIEludmFsaWREc2FQb2lu dGVyIGFzIGEKKwkgKiBtYXJrZXIuIFRoaXMgaGFuZGxlcyBib3RoIHRoZSBpbml0aWFsIGNy ZWF0aW9uIGFuZCBwb3RlbnRpYWwgcmV0cnkKKwkgKiBhZnRlciBPT00uCisJICovCisJZW50 cnkgPSBkc2hhc2hfZmluZF9vcl9pbnNlcnQoY2hhbm5lbEhhc2gsICZrZXksICZmb3VuZCk7 CisKKwlpZiAoIWZvdW5kKQorCQllbnRyeS0+bGlzdGVuZXJzQXJyYXkgPSBJbnZhbGlkRHNh UG9pbnRlcjsKKworCWlmICghRHNhUG9pbnRlcklzVmFsaWQoZW50cnktPmxpc3RlbmVyc0Fy cmF5KSkKKwl7CisJCS8qIEZpcnN0IGxpc3RlbmVyIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJ ZW50cnktPmxpc3RlbmVyc0FycmF5ID0gZHNhX2FsbG9jYXRlKGNoYW5uZWxEU0EsCisJCQkJ CQkJCQkJCSBzaXplb2YoUHJvY051bWJlcikgKiBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9T SVpFKTsKKwkJZW50cnktPm51bUxpc3RlbmVycyA9IDA7CisJCWVudHJ5LT5hbGxvY2F0ZWRM aXN0ZW5lcnMgPSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFOworCX0KKworCWxpc3Rl bmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsRFNBLAorCQkJ CQkJCQkJCQkgICBlbnRyeS0+bGlzdGVuZXJzQXJyYXkpOworCisJZm9yIChpbnQgaSA9IDA7 IGkgPCBlbnRyeS0+bnVtTGlzdGVuZXJzOyBpKyspCisJeworCQlpZiAobGlzdGVuZXJzW2ld ID09IE15UHJvY051bWJlcikKKwkJeworCQkJZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVs SGFzaCwgZW50cnkpOworCQkJcmV0dXJuOwkJCQkvKiBBbHJlYWR5IHJlZ2lzdGVyZWQgKi8K KwkJfQorCX0KKworCWlmIChlbnRyeS0+bnVtTGlzdGVuZXJzID49IGVudHJ5LT5hbGxvY2F0 ZWRMaXN0ZW5lcnMpCisJeworCQlpbnQJCQluZXdfc2l6ZSA9IGVudHJ5LT5hbGxvY2F0ZWRM aXN0ZW5lcnMgKiAyOworCQlkc2FfcG9pbnRlciBuZXdfYXJyYXkgPSBkc2FfYWxsb2NhdGUo Y2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJIHNpemVvZihQcm9jTnVtYmVyKSAqIG5ld19zaXpl KTsKKwkJUHJvY051bWJlciAqbmV3X2xpc3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9n ZXRfYWRkcmVzcyhjaGFubmVsRFNBLAorCQkJCQkJCQkJCQkJCQkJCSAgIG5ld19hcnJheSk7 CisKKwkJbWVtY3B5KG5ld19saXN0ZW5lcnMsIGxpc3RlbmVycywKKwkJCSAgIHNpemVvZihQ cm9jTnVtYmVyKSAqIGVudHJ5LT5udW1MaXN0ZW5lcnMpOworCisJCWRzYV9mcmVlKGNoYW5u ZWxEU0EsIGVudHJ5LT5saXN0ZW5lcnNBcnJheSk7CisJCWVudHJ5LT5saXN0ZW5lcnNBcnJh eSA9IG5ld19hcnJheTsKKwkJZW50cnktPmFsbG9jYXRlZExpc3RlbmVycyA9IG5ld19zaXpl OworCQlsaXN0ZW5lcnMgPSBuZXdfbGlzdGVuZXJzOworCX0KKworCWxpc3RlbmVyc1tlbnRy eS0+bnVtTGlzdGVuZXJzXSA9IE15UHJvY051bWJlcjsKKwllbnRyeS0+bnVtTGlzdGVuZXJz Kys7CisKKwlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5uZWxIYXNoLCBlbnRyeSk7CiB9CiAK IC8qCiAgKiBFeGVjX1VubGlzdGVuQ29tbWl0IC0tLSBzdWJyb3V0aW5lIGZvciBBdENvbW1p dF9Ob3RpZnkKICAqCi0gKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjaGFubmVsIG5hbWUgZnJv bSBsaXN0ZW5DaGFubmVscy4KKyAqCQlVbmxpc3RlbiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwg Zm9yIHRoaXMgYmFja2VuZC4KICAqLwogc3RhdGljIHZvaWQKIEV4ZWNfVW5saXN0ZW5Db21t aXQoY29uc3QgY2hhciAqY2hhbm5lbCkKIHsKLQlMaXN0Q2VsbCAgICpxOworCUNoYW5uZWxI YXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVudHJ5OworCVByb2NOdW1iZXIgKmxpc3Rl bmVyczsKKwlpbnQJCQlpOwogCiAJaWYgKFRyYWNlX25vdGlmeSkKIAkJZWxvZyhERUJVRzEs ICJFeGVjX1VubGlzdGVuQ29tbWl0KCVzLCVkKSIsIGNoYW5uZWwsIE15UHJvY1BpZCk7CiAK LQlmb3JlYWNoKHEsIGxpc3RlbkNoYW5uZWxzKQorCS8qIFJlbW92ZSBmcm9tIG91ciBsb2Nh bCBjYWNoZSAqLworCWlmIChsaXN0ZW5DaGFubmVsc0hhc2ggIT0gTlVMTCkKKwkJKHZvaWQp IGhhc2hfc2VhcmNoKGxpc3RlbkNoYW5uZWxzSGFzaCwgY2hhbm5lbCwgSEFTSF9SRU1PVkUs IE5VTEwpOworCisJLyogTm93IHJlbW92ZSBmcm9tIHRoZSBzaGFyZWQgY2hhbm5lbEhhc2gg Ki8KKwlpZiAoY2hhbm5lbEhhc2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ2hhbm5lbEhh c2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwkvKiBMb29r IHVwIHRoZSBjaGFubmVsIHdpdGggZXhjbHVzaXZlIGxvY2sgc28gd2UgY2FuIG1vZGlmeSBp dCAqLworCWVudHJ5ID0gZHNoYXNoX2ZpbmQoY2hhbm5lbEhhc2gsICZrZXksIHRydWUpOwor CWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlsaXN0ZW5lcnMgPSAoUHJvY051 bWJlciAqKSBkc2FfZ2V0X2FkZHJlc3MoY2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJICAgZW50 cnktPmxpc3RlbmVyc0FycmF5KTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+bnVtTGlz dGVuZXJzOyBpKyspCiAJewotCQljaGFyCSAgICpsY2hhbiA9IChjaGFyICopIGxmaXJzdChx KTsKLQotCQlpZiAoc3RyY21wKGxjaGFuLCBjaGFubmVsKSA9PSAwKQorCQlpZiAobGlzdGVu ZXJzW2ldID09IE15UHJvY051bWJlcikKIAkJewotCQkJbGlzdGVuQ2hhbm5lbHMgPSBmb3Jl YWNoX2RlbGV0ZV9jdXJyZW50KGxpc3RlbkNoYW5uZWxzLCBxKTsKLQkJCXBmcmVlKGxjaGFu KTsKLQkJCWJyZWFrOworCQkJZW50cnktPm51bUxpc3RlbmVycy0tOworCQkJaWYgKGkgPCBl bnRyeS0+bnVtTGlzdGVuZXJzKQorCQkJCW1lbW1vdmUoJmxpc3RlbmVyc1tpXSwgJmxpc3Rl bmVyc1tpICsgMV0sCisJCQkJCQlzaXplb2YoUHJvY051bWJlcikgKiAoZW50cnktPm51bUxp c3RlbmVycyAtIGkpKTsKKworCQkJaWYgKGVudHJ5LT5udW1MaXN0ZW5lcnMgPT0gMCkKKwkJ CXsKKwkJCQkvKiBMYXN0IGxpc3RlbmVyIGZvciB0aGlzIGNoYW5uZWwgKi8KKwkJCQlkc2Ff ZnJlZShjaGFubmVsRFNBLCBlbnRyeS0+bGlzdGVuZXJzQXJyYXkpOworCQkJCWRzaGFzaF9k ZWxldGVfZW50cnkoY2hhbm5lbEhhc2gsIGVudHJ5KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsK KwkJCQlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5uZWxIYXNoLCBlbnRyeSk7CisJCQl9CisK KwkJCXJldHVybjsKIAkJfQogCX0KIAorCWRzaGFzaF9yZWxlYXNlX2xvY2soY2hhbm5lbEhh c2gsIGVudHJ5KTsKKwogCS8qCiAJICogV2UgZG8gbm90IGNvbXBsYWluIGFib3V0IHVubGlz dGVuaW5nIHNvbWV0aGluZyBub3QgYmVpbmcgbGlzdGVuZWQ7CiAJICogc2hvdWxkIHdlPwpA QCAtMTE5MiwzNCArMTUyOSw2OCBAQCBFeGVjX1VubGlzdGVuQ29tbWl0KGNvbnN0IGNoYXIg KmNoYW5uZWwpCiBzdGF0aWMgdm9pZAogRXhlY19Vbmxpc3RlbkFsbENvbW1pdCh2b2lkKQog eworCWRzaGFzaF9zZXFfc3RhdHVzIHN0YXR1czsKKwlDaGFubmVsRW50cnkgKmVudHJ5Owor CiAJaWYgKFRyYWNlX25vdGlmeSkKIAkJZWxvZyhERUJVRzEsICJFeGVjX1VubGlzdGVuQWxs Q29tbWl0KCVkKSIsIE15UHJvY1BpZCk7CiAKLQlsaXN0X2ZyZWVfZGVlcChsaXN0ZW5DaGFu bmVscyk7Ci0JbGlzdGVuQ2hhbm5lbHMgPSBOSUw7CisJLyogQ2xlYXIgb3VyIGxvY2FsIGNh Y2hlICovCisJaWYgKGxpc3RlbkNoYW5uZWxzSGFzaCAhPSBOVUxMKQorCXsKKwkJaGFzaF9k ZXN0cm95KGxpc3RlbkNoYW5uZWxzSGFzaCk7CisJCWxpc3RlbkNoYW5uZWxzSGFzaCA9IE5V TEw7CisJfQorCisJLyogTm93IHJlbW92ZSBmcm9tIHRoZSBzaGFyZWQgY2hhbm5lbEhhc2gg Ki8KKwlpZiAoY2hhbm5lbEhhc2ggPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHNoYXNoX3Nl cV9pbml0KCZzdGF0dXMsIGNoYW5uZWxIYXNoLCB0cnVlKTsKKwl3aGlsZSAoKGVudHJ5ID0g ZHNoYXNoX3NlcV9uZXh0KCZzdGF0dXMpKSAhPSBOVUxMKQorCXsKKwkJaWYgKGVudHJ5LT5r ZXkuZGJvaWQgPT0gTXlEYXRhYmFzZUlkKQorCQl7CisJCQlQcm9jTnVtYmVyICpsaXN0ZW5l cnM7CisJCQlpbnQJCQlpOworCisJCQlsaXN0ZW5lcnMgPSAoUHJvY051bWJlciAqKSBkc2Ff Z2V0X2FkZHJlc3MoY2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJCQkgICBlbnRyeS0+bGlzdGVu ZXJzQXJyYXkpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgZW50cnktPm51bUxpc3RlbmVyczsg aSsrKQorCQkJeworCQkJCWlmIChsaXN0ZW5lcnNbaV0gPT0gTXlQcm9jTnVtYmVyKQorCQkJ CXsKKwkJCQkJZW50cnktPm51bUxpc3RlbmVycy0tOworCQkJCQlpZiAoaSA8IGVudHJ5LT5u dW1MaXN0ZW5lcnMpCisJCQkJCQltZW1tb3ZlKCZsaXN0ZW5lcnNbaV0sICZsaXN0ZW5lcnNb aSArIDFdLAorCQkJCQkJCQlzaXplb2YoUHJvY051bWJlcikgKiAoZW50cnktPm51bUxpc3Rl bmVycyAtIGkpKTsKKworCQkJCQlpZiAoZW50cnktPm51bUxpc3RlbmVycyA9PSAwKQorCQkJ CQl7CisJCQkJCQlkc2FfZnJlZShjaGFubmVsRFNBLCBlbnRyeS0+bGlzdGVuZXJzQXJyYXkp OworCQkJCQkJZHNoYXNoX2RlbGV0ZV9jdXJyZW50KCZzdGF0dXMpOworCQkJCQl9CisJCQkJ CWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlkc2hhc2hfc2VxX3Rlcm0oJnN0YXR1 cyk7CiB9CiAKIC8qCiAgKiBUZXN0IHdoZXRoZXIgd2UgYXJlIGFjdGl2ZWx5IGxpc3Rlbmlu ZyBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCBuYW1lLgogICoKICAqIE5vdGU6IHRoaXMgZnVuY3Rp b24gaXMgZXhlY3V0ZWQgZm9yIGV2ZXJ5IG5vdGlmaWNhdGlvbiBmb3VuZCBpbiB0aGUgcXVl dWUuCi0gKiBQZXJoYXBzIGl0IGlzIHdvcnRoIGZ1cnRoZXIgb3B0aW1pemF0aW9uLCBlZyBj b252ZXJ0IHRoZSBsaXN0IHRvIGEgc29ydGVkCi0gKiBhcnJheSBzbyB3ZSBjYW4gYmluYXJ5 LXNlYXJjaCBpdC4gIEluIHByYWN0aWNlIHRoZSBsaXN0IGlzIGxpa2VseSB0byBiZQotICog ZmFpcmx5IHNob3J0LCB0aG91Z2guCiAgKi8KIHN0YXRpYyBib29sCiBJc0xpc3RlbmluZ09u KGNvbnN0IGNoYXIgKmNoYW5uZWwpCiB7Ci0JTGlzdENlbGwgICAqcDsKKwlpZiAobGlzdGVu Q2hhbm5lbHNIYXNoID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKIAotCWZvcmVhY2gocCwg bGlzdGVuQ2hhbm5lbHMpCi0JewotCQljaGFyCSAgICpsY2hhbiA9IChjaGFyICopIGxmaXJz dChwKTsKLQotCQlpZiAoc3RyY21wKGxjaGFuLCBjaGFubmVsKSA9PSAwKQotCQkJcmV0dXJu IHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gKGhhc2hfc2VhcmNoKGxpc3Rl bkNoYW5uZWxzSGFzaCwgY2hhbm5lbCwgSEFTSF9GSU5ELCBOVUxMKSAhPSBOVUxMKTsKIH0K IAogLyoKQEAgLTEyMjksNyArMTYwMCw3IEBAIElzTGlzdGVuaW5nT24oY29uc3QgY2hhciAq Y2hhbm5lbCkKIHN0YXRpYyB2b2lkCiBhc3luY1F1ZXVlVW5yZWdpc3Rlcih2b2lkKQogewot CUFzc2VydChsaXN0ZW5DaGFubmVscyA9PSBOSUwpOwkvKiBlbHNlIGNhbGxlciBlcnJvciAq LworCUFzc2VydChsaXN0ZW5DaGFubmVsc0hhc2ggPT0gTlVMTCB8fCBoYXNoX2dldF9udW1f ZW50cmllcyhsaXN0ZW5DaGFubmVsc0hhc2gpID09IDApOwkvKiBlbHNlIGNhbGxlciBlcnJv ciAqLwogCiAJaWYgKCFhbVJlZ2lzdGVyZWRMaXN0ZW5lcikJLyogbm90aGluZyB0byBkbyAq LwogCQlyZXR1cm47CkBAIC0xMjQxLDYgKzE2MTIsNyBAQCBhc3luY1F1ZXVlVW5yZWdpc3Rl cih2b2lkKQogCS8qIE1hcmsgb3VyIGVudHJ5IGFzIGludmFsaWQgKi8KIAlRVUVVRV9CQUNL RU5EX1BJRChNeVByb2NOdW1iZXIpID0gSW52YWxpZFBpZDsKIAlRVUVVRV9CQUNLRU5EX0RC T0lEKE15UHJvY051bWJlcikgPSBJbnZhbGlkT2lkOworCVFVRVVFX0JBQ0tFTkRfV0FLRVVQ X1BFTkRJTkcoTXlQcm9jTnVtYmVyKSA9IGZhbHNlOwogCS8qIGFuZCByZW1vdmUgaXQgZnJv bSB0aGUgbGlzdCAqLwogCWlmIChRVUVVRV9GSVJTVF9MSVNURU5FUiA9PSBNeVByb2NOdW1i ZXIpCiAJCVFVRVVFX0ZJUlNUX0xJU1RFTkVSID0gUVVFVUVfTkVYVF9MSVNURU5FUihNeVBy b2NOdW1iZXIpOwpAQCAtMTU2NSwxMiArMTkzNywyMSBAQCBhc3luY1F1ZXVlRmlsbFdhcm5p bmcodm9pZCkKIC8qCiAgKiBTZW5kIHNpZ25hbHMgdG8gbGlzdGVuaW5nIGJhY2tlbmRzLgog ICoKLSAqIE5vcm1hbGx5IHdlIHNpZ25hbCBvbmx5IGJhY2tlbmRzIGluIG91ciBvd24gZGF0 YWJhc2UsIHNpbmNlIG9ubHkgdGhvc2UKLSAqIGJhY2tlbmRzIGNvdWxkIGJlIGludGVyZXN0 ZWQgaW4gbm90aWZpZXMgd2Ugc2VuZC4gIEhvd2V2ZXIsIGlmIHRoZXJlJ3MKLSAqIG5vdGlm eSB0cmFmZmljIGluIG91ciBkYXRhYmFzZSBidXQgbm8gdHJhZmZpYyBpbiBhbm90aGVyIGRh dGFiYXNlIHRoYXQKLSAqIGRvZXMgaGF2ZSBsaXN0ZW5lcihzKSwgdGhvc2UgbGlzdGVuZXJz IHdpbGwgZmFsbCBmdXJ0aGVyIGFuZCBmdXJ0aGVyCi0gKiBiZWhpbmQuICBXYWtlbiB0aGVt IGFueXdheSBpZiB0aGV5J3JlIGZhciBlbm91Z2ggYmVoaW5kLCBzbyB0aGF0IHRoZXknbGwK LSAqIGFkdmFuY2UgdGhlaXIgcXVldWUgcG9zaXRpb24gcG9pbnRlcnMsIGFsbG93aW5nIHRo ZSBnbG9iYWwgdGFpbCB0byBhZHZhbmNlLgorICogTm9ybWFsbHkgd2Ugc2lnbmFsIG9ubHkg YmFja2VuZHMgaW4gb3VyIG93biBkYXRhYmFzZSwgdGhhdCBhcmUKKyAqIGxpc3RlbmluZyBv biB0aGUgY2hhbm5lbHMgd2l0aCBwZW5kaW5nIG5vdGlmaWVzLCBzaW5jZSBvbmx5IHRob3Nl CisgKiBiYWNrZW5kcyBhcmUgaW50ZXJlc3RlZCBpbiBub3RpZmllcyB3ZSBzZW5kLgorICoK KyAqIEJhY2tlbmRzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGVkIGluIG91ciBub3RpZmllcywg dGhhdCBhcmUga25vd24KKyAqIHRvIHN0aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIG9sZCBx dWV1ZSBoZWFkLCBvciBhbnl3aGVyZSBpbiB0aGUKKyAqIHF1ZXVlIHJlZ2lvbiB3ZSBqdXN0 IHdyb3RlLCBjYW4gYmUgc2FmZWx5IGFkdmFuY2VkIGRpcmVjdGx5IHRvIHRoZQorICogbmV3 IGhlYWQsIHNpbmNlIHRoYXQgcmVnaW9uIGlzIGtub3duIHRvIGNvbnRhaW4gb25seSBvdXIg b3duCisgKiBub3RpZmljYXRpb25zLiAgVGhpcyBhdm9pZHMgdW5uZWNlc3Nhcnkgd2FrZXVw cyB3aGVuIHRoZXJlIGlzCisgKiBub3RoaW5nIG9mIGludGVyZXN0IHRvIHRoZW0uCisgKgor ICogQmFja2VuZHMgdGhhdCBhcmUgbm90IGludGVyZXN0ZWQgaW4gb3VyIG5vdGlmaWVzLCB0 aGF0IGFyZSBhZHZhbmNpbmcKKyAqIHRvIGEgdGFyZ2V0IHBvc2l0aW9uIGJlZm9yZSB0aGUg bmV3IHF1ZXVlIGhlYWQsIG9yIHRoYXQgYXJlIG5vdAorICogYWR2YW5jaW5nIGFuZCBhcmUg c3RhdGlvbmFyeSBhdCBhIHBvc2l0aW9uIGJlZm9yZSB0aGUgb2xkIHF1ZXVlIGhlYWQKKyAq IG5lZWRzIHRvIGJlIHNpZ25hbGVkIHNpbmNlIG5vdGlmaWNhdGlvbnMgY291bGQgb3RoZXJ3 aXNlIGJlIGRlbGF5ZWQuCiAgKgogICogU2luY2Ugd2Uga25vdyB0aGUgUHJvY051bWJlciBh bmQgdGhlIFBpZCB0aGUgc2lnbmFsaW5nIGlzIHF1aXRlIGNoZWFwLgogICoKQEAgLTE1ODMs NiArMTk2NCwxMyBAQCBTaWduYWxCYWNrZW5kcyh2b2lkKQogCWludDMyCSAgICpwaWRzOwog CVByb2NOdW1iZXIgKnByb2Nub3M7CiAJaW50CQkJY291bnQ7CisJTGlzdENlbGwgICAqbGM7 CisKKwkvKgorCSAqIEF0dGFjaCB0byB0aGUgY2hhbm5lbCBoYXNoIGlmIG5lZWRlZC4gIFdl IG1pZ2h0IG5vdCBoYXZlIG9uZSBpZiB0aGlzCisJICogYmFja2VuZCBoYXNuJ3QgZG9uZSBM SVNURU4sIGJ1dCB3ZSBuZWVkIGl0IHRvIGZpbmQgbGlzdGVuZXJzLgorCSAqLworCWluaXRD aGFubmVsSGFzaCgpOwogCiAJLyoKIAkgKiBJZGVudGlmeSBiYWNrZW5kcyB0aGF0IHdlIG5l ZWQgdG8gc2lnbmFsLiAgV2UgZG9uJ3Qgd2FudCB0byBzZW5kCkBAIC0xNTk3LDM2ICsxOTg1 LDg3IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAJY291bnQgPSAwOwogCiAJTFdMb2NrQWNx dWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX0VYQ0xVU0lWRSk7Ci0JZm9yIChQcm9jTnVtYmVy IGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsgaSAhPSBJTlZBTElEX1BST0NfTlVNQkVSOyBp ID0gUVVFVUVfTkVYVF9MSVNURU5FUihpKSkKKwlmb3JlYWNoKGxjLCBwZW5kaW5nTm90aWZ5 Q2hhbm5lbHMpCiAJewotCQlpbnQzMgkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7Ci0J CVF1ZXVlUG9zaXRpb24gcG9zOworCQljaGFyCSAgICpjaGFubmVsID0gKGNoYXIgKikgbGZp cnN0KGxjKTsKKwkJQ2hhbm5lbEVudHJ5ICplbnRyeSA9IE5VTEw7CisJCVByb2NOdW1iZXIg Kmxpc3RlbmVyczsKIAotCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOwotCQlwb3MgPSBR VUVVRV9CQUNLRU5EX1BPUyhpKTsKLQkJaWYgKFFVRVVFX0JBQ0tFTkRfREJPSUQoaSkgPT0g TXlEYXRhYmFzZUlkKQorCQlpZiAoY2hhbm5lbEhhc2ggIT0gTlVMTCkKIAkJewotCQkJLyoK LQkJCSAqIEFsd2F5cyBzaWduYWwgbGlzdGVuZXJzIGluIG91ciBvd24gZGF0YWJhc2UsIHVu bGVzcyB0aGV5J3JlCi0JCQkgKiBhbHJlYWR5IGNhdWdodCB1cCAodW5saWtlbHksIGJ1dCBw b3NzaWJsZSkuCi0JCQkgKi8KKwkJCUNoYW5uZWxIYXNoS2V5IGtleTsKKworCQkJQ2hhbm5l bEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisJCQllbnRy eSA9IGRzaGFzaF9maW5kKGNoYW5uZWxIYXNoLCAma2V5LCBmYWxzZSk7CisJCX0KKworCQlp ZiAoZW50cnkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwkJCS8qIE5vIGxpc3RlbmVycyByZWdp c3RlcmVkIGZvciB0aGlzIGNoYW5uZWwgKi8KKworCQlsaXN0ZW5lcnMgPSAoUHJvY051bWJl ciAqKSBkc2FfZ2V0X2FkZHJlc3MoY2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJCSAgIGVudHJ5 LT5saXN0ZW5lcnNBcnJheSk7CisKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyeS0+bnVt TGlzdGVuZXJzOyBqKyspCisJCXsKKwkJCVByb2NOdW1iZXIJaSA9IGxpc3RlbmVyc1tqXTsK KwkJCWludDMyCQlwaWQ7CisJCQlRdWV1ZVBvc2l0aW9uIHBvczsKKworCQkJaWYgKFFVRVVF X0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkpCisJCQkJY29udGludWU7CisKKwkJCXBvcyA9 IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOworCQkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7 CisKKwkJCS8qIFNraXAgaWYgY2F1Z2h0IHVwICovCiAJCQlpZiAoUVVFVUVfUE9TX0VRVUFM KHBvcywgUVVFVUVfSEVBRCkpCiAJCQkJY29udGludWU7CisKKwkJCUFzc2VydChwaWQgIT0g SW52YWxpZFBpZCk7CisKKwkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSB0 cnVlOworCQkJcGlkc1tjb3VudF0gPSBwaWQ7CisJCQlwcm9jbm9zW2NvdW50XSA9IGk7CisJ CQljb3VudCsrOwogCQl9Ci0JCWVsc2UKKworCQlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5u ZWxIYXNoLCBlbnRyeSk7CisJfQorCisJaWYgKHBlbmRpbmdOb3RpZmllcyAhPSBOVUxMKQor CXsKKwkJZm9yIChQcm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsKKwkJCSBp ICE9IElOVkFMSURfUFJPQ19OVU1CRVI7CisJCQkgaSA9IFFVRVVFX05FWFRfTElTVEVORVIo aSkpCiAJCXsKLQkJCS8qCi0JCQkgKiBMaXN0ZW5lcnMgaW4gb3RoZXIgZGF0YWJhc2VzIHNo b3VsZCBiZSBzaWduYWxlZCBvbmx5IGlmIHRoZXkKLQkJCSAqIGFyZSBmYXIgYmVoaW5kLgot CQkJICovCi0JCQlpZiAoYXN5bmNRdWV1ZVBhZ2VEaWZmKFFVRVVFX1BPU19QQUdFKFFVRVVF X0hFQUQpLAotCQkJCQkJCQkgICBRVUVVRV9QT1NfUEFHRShwb3MpKSA8IFFVRVVFX0NMRUFO VVBfREVMQVkpCisJCQlRdWV1ZVBvc2l0aW9uIHBvczsKKwkJCWludDMyCQlwaWQ7CisKKwkJ CWlmIChRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKGkpKQogCQkJCWNvbnRpbnVlOwor CisJCQlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhpKTsKKwkJCXBpZCA9IFFVRVVFX0JBQ0tF TkRfUElEKGkpOworCisJCQlpZiAoUVVFVUVfQkFDS0VORF9JU19BRFZBTkNJTkcoaSkgPwor CQkJCVFVRVVFX1BPU19QUkVDRURFUyhRVUVVRV9CQUNLRU5EX0FEVkFOQ0lOR19QT1MoaSks IHF1ZXVlSGVhZEFmdGVyV3JpdGUpIDoKKwkJCQlRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBx dWV1ZUhlYWRCZWZvcmVXcml0ZSkpCisJCQl7CisJCQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlk UGlkKTsKKworCQkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSB0cnVlOwor CQkJCXBpZHNbY291bnRdID0gcGlkOworCQkJCXByb2Nub3NbY291bnRdID0gaTsKKwkJCQlj b3VudCsrOworCQkJfQorCQkJZWxzZSBpZiAoIVFVRVVFX0JBQ0tFTkRfSVNfQURWQU5DSU5H KGkpICYmCisJCQkJCSBRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBxdWV1ZUhlYWRBZnRlcldy aXRlKSkKKwkJCXsKKwkJCQlBc3NlcnQoIVFVRVVFX1BPU19QUkVDRURFUyhwb3MsIHF1ZXVl SGVhZEJlZm9yZVdyaXRlKSk7CisKKwkJCQlRVUVVRV9CQUNLRU5EX1BPUyhpKSA9IHF1ZXVl SGVhZEFmdGVyV3JpdGU7CisJCQl9CiAJCX0KLQkJLyogT0ssIG5lZWQgdG8gc2lnbmFsIHRo aXMgb25lICovCi0JCXBpZHNbY291bnRdID0gcGlkOwotCQlwcm9jbm9zW2NvdW50XSA9IGk7 Ci0JCWNvdW50Kys7CiAJfQogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKIApA QCAtMTY3Myw5ICsyMTEyLDEwIEBAIEF0QWJvcnRfTm90aWZ5KHZvaWQpCiAJLyoKIAkgKiBJ ZiB3ZSBMSVNURU4gYnV0IHRoZW4gcm9sbCBiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlciBQ cmVDb21taXRfTm90aWZ5LAogCSAqIHdlIGhhdmUgcmVnaXN0ZXJlZCBhcyBhIGxpc3RlbmVy IGJ1dCBoYXZlIG5vdCBtYWRlIGFueSBlbnRyeSBpbgotCSAqIGxpc3RlbkNoYW5uZWxzLiAg SW4gdGhhdCBjYXNlLCBkZXJlZ2lzdGVyIGFnYWluLgorCSAqIGxpc3RlbkNoYW5uZWxzSGFz aC4gIEluIHRoYXQgY2FzZSwgZGVyZWdpc3RlciBhZ2Fpbi4KIAkgKi8KLQlpZiAoYW1SZWdp c3RlcmVkTGlzdGVuZXIgJiYgbGlzdGVuQ2hhbm5lbHMgPT0gTklMKQorCWlmIChhbVJlZ2lz dGVyZWRMaXN0ZW5lciAmJgorCQkobGlzdGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFz aF9nZXRfbnVtX2VudHJpZXMobGlzdGVuQ2hhbm5lbHNIYXNoKSA9PSAwKSkKIAkJYXN5bmNR dWV1ZVVucmVnaXN0ZXIoKTsKIAogCS8qIEFuZCBjbGVhbiB1cCAqLwpAQCAtMTg1NCwyMCAr MjI5NCwyOSBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9pZCkKIAlRdWV1 ZVBvc2l0aW9uIGhlYWQ7CiAJU25hcHNob3QJc25hcHNob3Q7CiAKLQkvKiBGZXRjaCBjdXJy ZW50IHN0YXRlICovCisJLyoKKwkgKiBGZXRjaCBjdXJyZW50IHN0YXRlLCBpbmRpY2F0ZSB0 byBvdGhlcnMgdGhhdCB3ZSBoYXZlIHdva2VuIHVwLCBhbmQgdGhhdAorCSAqIHdlIG5vdyB3 aWxsIGJlIGFkdmFuY2luZyBvdXIgcG9zaXRpb24uCisJICovCiAJTFdMb2NrQWNxdWlyZShO b3RpZnlRdWV1ZUxvY2ssIExXX1NIQVJFRCk7CiAJLyogQXNzZXJ0IGNoZWNrcyB0aGF0IHdl IGhhdmUgYSB2YWxpZCBzdGF0ZSBlbnRyeSAqLwogCUFzc2VydChNeVByb2NQaWQgPT0gUVVF VUVfQkFDS0VORF9QSUQoTXlQcm9jTnVtYmVyKSk7CisJUVVFVUVfQkFDS0VORF9XQUtFVVBf UEVORElORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CisJaGVhZCA9IFFVRVVFX0hFQUQ7CiAJ cG9zID0gUVVFVUVfQkFDS0VORF9QT1MoTXlQcm9jTnVtYmVyKTsKLQloZWFkID0gUVVFVUVf SEVBRDsKLQlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiAKIAlpZiAoUVVFVUVf UE9TX0VRVUFMKHBvcywgaGVhZCkpCiAJewogCQkvKiBOb3RoaW5nIHRvIGRvLCB3ZSBoYXZl IHJlYWQgYWxsIG5vdGlmaWNhdGlvbnMgYWxyZWFkeS4gKi8KKwkJTFdMb2NrUmVsZWFzZShO b3RpZnlRdWV1ZUxvY2spOwogCQlyZXR1cm47CiAJfQogCisJUVVFVUVfQkFDS0VORF9JU19B RFZBTkNJTkcoTXlQcm9jTnVtYmVyKSA9IHRydWU7CisJUVVFVUVfQkFDS0VORF9BRFZBTkNJ TkdfUE9TKE15UHJvY051bWJlcikgPSBoZWFkOworCisJTFdMb2NrUmVsZWFzZShOb3RpZnlR dWV1ZUxvY2spOworCiAJLyotLS0tLS0tLS0tCiAJICogR2V0IHNuYXBzaG90IHdlJ2xsIHVz ZSB0byBkZWNpZGUgd2hpY2ggeGFjdHMgYXJlIHN0aWxsIGluIHByb2dyZXNzLgogCSAqIFRo aXMgaXMgdHJpY2tpZXIgdGhhbiBpdCBtaWdodCBzZWVtLCBiZWNhdXNlIG9mIHJhY2UgY29u ZGl0aW9ucy4KQEAgLTE5NTQsNiArMjQwMyw4IEBAIGFzeW5jUXVldWVSZWFkQWxsTm90aWZp Y2F0aW9ucyh2b2lkKQogCiAJCS8qIFVwZGF0ZSBzaGFyZWQgc3RhdGUgKi8KIAkJTFdMb2Nr QWNxdWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX1NIQVJFRCk7CisKKwkJUVVFVUVfQkFDS0VO RF9JU19BRFZBTkNJTkcoTXlQcm9jTnVtYmVyKSA9IGZhbHNlOwogCQlRVUVVRV9CQUNLRU5E X1BPUyhNeVByb2NOdW1iZXIpID0gcG9zOwogCQlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVl TG9jayk7CiAKQEAgLTIwNTUsNyArMjUwNiw3IEBAIGFzeW5jUXVldWVQcm9jZXNzUGFnZUVu dHJpZXMoUXVldWVQb3NpdGlvbiAqY3VycmVudCwKIAkJCSAqIG92ZXIgaXQgb24gdGhlIGZp cnN0IExJU1RFTiBpbiBhIHNlc3Npb24sIGFuZCBub3QgZ2V0IHN0dWNrIG9uCiAJCQkgKiBp dCBpbmRlZmluaXRlbHkuCiAJCQkgKi8KLQkJCWlmIChsaXN0ZW5DaGFubmVscyA9PSBOSUwp CisJCQlpZiAobGlzdGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFzaF9nZXRfbnVtX2Vu dHJpZXMobGlzdGVuQ2hhbm5lbHNIYXNoKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCiAJCQlp ZiAoVHJhbnNhY3Rpb25JZERpZENvbW1pdChxZS0+eGlkKSkKQEAgLTIzMTAsNyArMjc2MSw3 IEBAIFByb2Nlc3NJbmNvbWluZ05vdGlmeShib29sIGZsdXNoKQogCW5vdGlmeUludGVycnVw dFBlbmRpbmcgPSBmYWxzZTsKIAogCS8qIERvIG5vdGhpbmcgZWxzZSBpZiB3ZSBhcmVuJ3Qg YWN0aXZlbHkgbGlzdGVuaW5nICovCi0JaWYgKGxpc3RlbkNoYW5uZWxzID09IE5JTCkKKwlp ZiAobGlzdGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFzaF9nZXRfbnVtX2VudHJpZXMo bGlzdGVuQ2hhbm5lbHNIYXNoKSA9PSAwKQogCQlyZXR1cm47CiAKIAlpZiAoVHJhY2Vfbm90 aWZ5KQpAQCAtMjQxNCwxMyArMjg2NSwxNSBAQCBBZGRFdmVudFRvUGVuZGluZ05vdGlmaWVz KE5vdGlmaWNhdGlvbiAqbikKIHsKIAlBc3NlcnQocGVuZGluZ05vdGlmaWVzLT5ldmVudHMg IT0gTklMKTsKIAotCS8qIENyZWF0ZSB0aGUgaGFzaCB0YWJsZSBpZiBpdCdzIHRpbWUgdG8g Ki8KKwkvKiBDcmVhdGUgdGhlIGhhc2ggdGFibGVzIGlmIGl0J3MgdGltZSB0byAqLwogCWlm IChsaXN0X2xlbmd0aChwZW5kaW5nTm90aWZpZXMtPmV2ZW50cykgPj0gTUlOX0hBU0hBQkxF X05PVElGSUVTICYmCiAJCXBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiA9PSBOVUxMKQogCXsK IAkJSEFTSENUTAkJaGFzaF9jdGw7CiAJCUxpc3RDZWxsICAgKmw7CiAKKwkJQXNzZXJ0KHBl bmRpbmdOb3RpZmllcy0+Y2hhbm5lbEhhc2h0YWIgPT0gTlVMTCk7CisKIAkJLyogQ3JlYXRl IHRoZSBoYXNoIHRhYmxlICovCiAJCWhhc2hfY3RsLmtleXNpemUgPSBzaXplb2YoTm90aWZp Y2F0aW9uICopOwogCQloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2Yoc3RydWN0IE5vdGlm aWNhdGlvbkhhc2gpOwpAQCAtMjQzMywxMCArMjg4NiwyMiBAQCBBZGRFdmVudFRvUGVuZGlu Z05vdGlmaWVzKE5vdGlmaWNhdGlvbiAqbikKIAkJCQkJCSZoYXNoX2N0bCwKIAkJCQkJCUhB U0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX0NPTVBBUkUgfCBIQVNIX0NPTlRFWFQp OwogCisJCS8qIENyZWF0ZSB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlICovCisJCW1lbXNldCgm aGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0bC5rZXlzaXplID0g TkFNRURBVEFMRU47CisJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihzdHJ1Y3QgQ2hh bm5lbEhhc2gpOworCQloYXNoX2N0bC5oY3h0ID0gQ3VyVHJhbnNhY3Rpb25Db250ZXh0Owor CQlwZW5kaW5nTm90aWZpZXMtPmNoYW5uZWxIYXNodGFiID0KKwkJCWhhc2hfY3JlYXRlKCJQ ZW5kaW5nIE5vdGlmeSBDaGFubmVscyIsCisJCQkJCQk2NEwsCisJCQkJCQkmaGFzaF9jdGws CisJCQkJCQlIQVNIX0VMRU0gfCBIQVNIX1NUUklOR1MgfCBIQVNIX0NPTlRFWFQpOworCiAJ CS8qIEluc2VydCBhbGwgdGhlIGFscmVhZHktZXhpc3RpbmcgZXZlbnRzICovCiAJCWZvcmVh Y2gobCwgcGVuZGluZ05vdGlmaWVzLT5ldmVudHMpCiAJCXsKIAkJCU5vdGlmaWNhdGlvbiAq b2xkbiA9IChOb3RpZmljYXRpb24gKikgbGZpcnN0KGwpOworCQkJY2hhcgkgICAqY2hhbm5l bCA9IG9sZG4tPmRhdGE7CiAJCQlib29sCQlmb3VuZDsKIAogCQkJKHZvaWQpIGhhc2hfc2Vh cmNoKHBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiwKQEAgLTI0NDQsMjIgKzI5MDksNDIgQEAg QWRkRXZlbnRUb1BlbmRpbmdOb3RpZmllcyhOb3RpZmljYXRpb24gKm4pCiAJCQkJCQkJICAg SEFTSF9FTlRFUiwKIAkJCQkJCQkgICAmZm91bmQpOwogCQkJQXNzZXJ0KCFmb3VuZCk7CisK KwkJCS8qIEluc2VydCBjaGFubmVsIGludG8gY2hhbm5lbEhhc2h0YWIgKi8KKwkJCSh2b2lk KSBoYXNoX3NlYXJjaChwZW5kaW5nTm90aWZpZXMtPmNoYW5uZWxIYXNodGFiLAorCQkJCQkJ CSAgIGNoYW5uZWwsCisJCQkJCQkJICAgSEFTSF9FTlRFUiwKKwkJCQkJCQkgICAmZm91bmQp OworCQkJLyogZm91bmQgbWF5IGJlIHRydWUgaWYgbXVsdGlwbGUgZXZlbnRzIG9uIHNhbWUg Y2hhbm5lbCAqLwogCQl9CiAJfQogCiAJLyogQWRkIG5ldyBldmVudCB0byB0aGUgbGlzdCwg aW4gb3JkZXIgKi8KIAlwZW5kaW5nTm90aWZpZXMtPmV2ZW50cyA9IGxhcHBlbmQocGVuZGlu Z05vdGlmaWVzLT5ldmVudHMsIG4pOwogCi0JLyogQWRkIGV2ZW50IHRvIHRoZSBoYXNoIHRh YmxlIGlmIG5lZWRlZCAqLworCS8qIEFkZCBldmVudCB0byB0aGUgaGFzaCB0YWJsZXMgaWYg bmVlZGVkICovCiAJaWYgKHBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiAhPSBOVUxMKQogCXsK IAkJYm9vbAkJZm91bmQ7CiAKKwkJQXNzZXJ0KHBlbmRpbmdOb3RpZmllcy0+Y2hhbm5lbEhh c2h0YWIgIT0gTlVMTCk7CisKIAkJKHZvaWQpIGhhc2hfc2VhcmNoKHBlbmRpbmdOb3RpZmll cy0+aGFzaHRhYiwKIAkJCQkJCSAgICZuLAogCQkJCQkJICAgSEFTSF9FTlRFUiwKIAkJCQkJ CSAgICZmb3VuZCk7CiAJCUFzc2VydCghZm91bmQpOworCisJCS8qIEFkZCBjaGFubmVsIHRv IGNoYW5uZWxIYXNodGFiICovCisJCXsKKwkJCWNoYXIJICAgKmNoYW5uZWwgPSBuLT5kYXRh OworCisJCQkodm9pZCkgaGFzaF9zZWFyY2gocGVuZGluZ05vdGlmaWVzLT5jaGFubmVsSGFz aHRhYiwKKwkJCQkJCQkgICBjaGFubmVsLAorCQkJCQkJCSAgIEhBU0hfRU5URVIsCisJCQkJ CQkJICAgJmZvdW5kKTsKKwkJCS8qIGZvdW5kIG1heSBiZSB0cnVlIGlmIHdlIGFscmVhZHkg aGF2ZSBhbiBldmVudCBvbiB0aGlzIGNoYW5uZWwgKi8KKwkJfQogCX0KIH0KIApAQCAtMjQ5 Nyw3ICsyOTgyLDcgQEAgbm90aWZpY2F0aW9uX21hdGNoKGNvbnN0IHZvaWQgKmtleTEsIGNv bnN0IHZvaWQgKmtleTIsIFNpemUga2V5c2l6ZSkKIAlyZXR1cm4gMTsJCQkJCS8qIG5vdCBl cXVhbCAqLwogfQogCi0vKiBDbGVhciB0aGUgcGVuZGluZ0FjdGlvbnMgYW5kIHBlbmRpbmdO b3RpZmllcyBsaXN0cy4gKi8KKy8qIENsZWFyIHRoZSBwZW5kaW5nQWN0aW9ucywgcGVuZGlu Z05vdGlmaWVzLCBhbmQgcGVuZGluZ05vdGlmeUNoYW5uZWxzIGxpc3RzLiAqLwogc3RhdGlj IHZvaWQKIENsZWFyUGVuZGluZ0FjdGlvbnNBbmROb3RpZmllcyh2b2lkKQogewpAQCAtMjUw OSw2ICsyOTk0LDcgQEAgQ2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpCiAJ ICovCiAJcGVuZGluZ0FjdGlvbnMgPSBOVUxMOwogCXBlbmRpbmdOb3RpZmllcyA9IE5VTEw7 CisJcGVuZGluZ05vdGlmeUNoYW5uZWxzID0gTklMOwogfQogCiAvKgpAQCAtMjUxOSwzICsz MDA1LDE2IEBAIGNoZWNrX25vdGlmeV9idWZmZXJzKGludCAqbmV3dmFsLCB2b2lkICoqZXh0 cmEsIEd1Y1NvdXJjZSBzb3VyY2UpCiB7CiAJcmV0dXJuIGNoZWNrX3NscnVfYnVmZmVycygi bm90aWZ5X2J1ZmZlcnMiLCBuZXd2YWwpOwogfQorCisKKy8qCisgKiBDaGFubmVsSGFzaFBy ZXBhcmVLZXkKKyAqCQlQcmVwYXJlIGEgY2hhbm5lbCBrZXkgZm9yIHVzZSBhcyBhIGhhc2gg a2V5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NoYW5uZWxIYXNoUHJlcGFyZUtleShD aGFubmVsSGFzaEtleSAqa2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7 CisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9p ZCA9IGRib2lkOworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxF Tik7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2 ZW50X25hbWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRf bmFtZXMudHh0CmluZGV4IGMxYWM3MWZmN2YyLi43YzJjZjk2MDA5MyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIv c3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTM2 OSw2ICszNjksNyBAQCBTdWJ0cmFuc0J1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgc3Vi LXRyYW5zYWN0aW9uIFNMUlUgYnVmZmVyLiIKIE11bHRpWGFjdE9mZnNldEJ1ZmZlcgkiV2Fp dGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG9mZnNldCBTTFJVIGJ1ZmZlci4iCiBNdWx0 aVhhY3RNZW1iZXJCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIG11bHRpeGFjdCBtZW1i ZXIgU0xSVSBidWZmZXIuIgogTm90aWZ5QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSA8 Y29tbWFuZD5OT1RJRlk8L2NvbW1hbmQ+IG1lc3NhZ2UgU0xSVSBidWZmZXIuIgorTm90aWZ5 Q2hhbm5lbEhhc2gJIldhaXRpbmcgdG8gYWNjZXNzIHRoZSA8Y29tbWFuZD5OT1RJRlk8L2Nv bW1hbmQ+IGNoYW5uZWwgaGFzaCB0YWJsZS4iCiBTZXJpYWxCdWZmZXIJIldhaXRpbmcgZm9y IEkvTyBvbiBhIHNlcmlhbGl6YWJsZSB0cmFuc2FjdGlvbiBjb25mbGljdCBTTFJVIGJ1ZmZl ci4iCiBXQUxJbnNlcnQJIldhaXRpbmcgdG8gaW5zZXJ0IFdBTCBkYXRhIGludG8gYSBtZW1v cnkgYnVmZmVyLiIKIEJ1ZmZlckNvbnRlbnQJIldhaXRpbmcgdG8gYWNjZXNzIGEgZGF0YSBw YWdlIGluIG1lbW9yeS4iCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9j a2xpc3QuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCmluZGV4IDViMGNl MzgzNDA4Li40MjM2OTY1ZTcyYSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9s d2xvY2tsaXN0LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKQEAg LTEwMSw2ICsxMDEsNyBAQCBQR19MV0xPQ0tUUkFOQ0hFKFNVQlRSQU5TX0JVRkZFUiwgU3Vi dHJhbnNCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKE1VTFRJWEFDVE9GRlNFVF9CVUZGRVIs IE11bHRpWGFjdE9mZnNldEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNUTUVN QkVSX0JVRkZFUiwgTXVsdGlYYWN0TWVtYmVyQnVmZmVyKQogUEdfTFdMT0NLVFJBTkNIRShO T1RJRllfQlVGRkVSLCBOb3RpZnlCdWZmZXIpCitQR19MV0xPQ0tUUkFOQ0hFKE5PVElGWV9D SEFOTkVMX0hBU0gsIE5vdGlmeUNoYW5uZWxIYXNoKQogUEdfTFdMT0NLVFJBTkNIRShTRVJJ QUxfQlVGRkVSLCBTZXJpYWxCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKFdBTF9JTlNFUlQs IFdBTEluc2VydCkKIFBHX0xXTE9DS1RSQU5DSEUoQlVGRkVSX0NPTlRFTlQsIEJ1ZmZlckNv bnRlbnQpCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBi L3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDIzYmNlNzJhZTY0Li5j OTkxN2U4N2Q0NSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTQxMiw2ICs0 MTIsOCBAQCBDYXRhbG9nSWRNYXBFbnRyeQogQ2F0YWxvZ0luZGV4U3RhdGUKIENoYW5nZVZh ck5vZGVzX2NhbGxiYWNrCiBDaGFuZ2VWYXJOb2Rlc19jb250ZXh0CitDaGFubmVsRW50cnkK K0NoYW5uZWxIYXNoS2V5CiBDaGVja1BvaW50CiBDaGVja1BvaW50U3RtdAogQ2hlY2twb2lu dFN0YXRzRGF0YQotLSAKMi41MC4xCgo= --e10b79ee8d00482a9748f612cfbccf9b--