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 1uAcvE-00HaiJ-GO for pgsql-hackers@arkaria.postgresql.org; Thu, 01 May 2025 23:02:29 +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 1uAcvA-005qDo-Lu for pgsql-hackers@arkaria.postgresql.org; Thu, 01 May 2025 23:02:25 +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 1uAcv9-005qDg-Iv for pgsql-hackers@lists.postgresql.org; Thu, 01 May 2025 23:02:25 +0000 Received: from relay9-d.mail.gandi.net ([2001:4b98:dc4:8::229]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uAcv0-000axt-1N for pgsql-hackers@lists.postgresql.org; Thu, 01 May 2025 23:02:22 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id CACCD439B3; Thu, 1 May 2025 23:02:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1746140530; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=vUImq8ThvHnyWdj1zpXaBAgAvXNVZBAr5vQY0N/I6so=; b=aIsDaKQLe50ROwVJ6vVb1jYj+9alb+5MUEqf9qyerOV2aFJJqx4KrXAMgDoox8kyjLqXYX cM+mgV0OdySafu4wJYHctGQEBBo3lT5vWhh3YrMk9171P8antCNTkx30gen1YMoSDGsJU/ tkq0ZnGFIORD+dBvHNVxk1CN/Hpbz11lYj805ZBJzzdxfIRCHwKh6JwpDPCGAtrrehW2jI KXYq9u92KCyj5wk1RgbyeYKYgmRx0B5rl/NXFIK/PUmSSg23I4Is4FuT6XNWDdURb4iV0j mYOfzoNVWqt/qUnAFS47aoap2e25Moe+9b6Ikd6Wve8tAzzEC0RJxIrcezV9gg== Content-Type: multipart/mixed; boundary="------------M6LdRa0Fp1G9COZVqFEBU3jU" Message-ID: <32c15a30-6e25-4f6d-9191-76a19482c556@vondra.me> Date: Fri, 2 May 2025 01:02:06 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: index prefetching From: Tomas Vondra To: Andres Freund Cc: Robert Haas , Peter Geoghegan , Melanie Plageman , PostgreSQL Hackers , Georgios , Thomas Munro , Konstantin Knizhnik , Dilip Kumar References: <57d0e292-73d5-4ab9-9855-110ee9cbd90a@vondra.me> Content-Language: en-US In-Reply-To: X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddvjedtkeehucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpegtkfffgggfuffhvfevfhgjsehmtderredtvdejnecuhfhrohhmpefvohhmrghsucggohhnughrrgcuoehtohhmrghssehvohhnughrrgdrmhgvqeenucggtffrrghtthgvrhhnpefggfegkeeujeffveffjeejhfeuheffteefgeetueeihfdtteekjefhtdehgfeiheenucffohhmrghinhepghhithhhuhgsrdgtohhmnecukfhppeekiedrgeelrddvfedtrddvtdeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepkeeirdegledrvdeftddrvddtiedphhgvlhhopegluddtrddufeejrddtrddukegnpdhmrghilhhfrhhomhepthhomhgrshesvhhonhgurhgrrdhmvgdpnhgspghrtghpthhtohepledprhgtphhtthhopegrnhgurhgvshesrghnrghrrgiivghlrdguvgdprhgtphhtthhopehrohgsvghrthhmhhgrrghssehgmhgrihhlrdgtohhmpdhrtghpthhtohepphhgsegsohifthdrihgvpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhmrghilhdrtghomhdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrghdpr hgtphhtthhopehgkhhokhholhgrthhoshesphhrohhtohhnmhgrihhlrdgtohhmpdhrtghpthhtohepthhhohhmrghsrdhmuhhnrhhosehgmhgrihhlrdgtohhmpdhrtghpthhtohepkhhnihiihhhnihhksehgrghrrhgvthdrrhhu X-GND-Sasl: tomas@vondra.me List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, Here's a rebased version of the patch, addressing a couple bugs with scrollable cursors that Peter reported to me off-list. The patch did not handle that quite right, resulting either in incorrect results (when the position happened to be off by one), or crashes (when it got out of sync with the read stream). But then there are some issues with array keys and mark/restore, triggered by Peter's "dynamic SAOP advancement" tests in extra tests (some of the tests use data files too large to post on hackers, it's available in the github branch). The patch used to handle mark/restore entirely in indexam.c, and for simple scans that works. But with array keys the btree code needs to update the moreLeft/moreRight/needPrimScan flags, so that after restoring it knows where to continue. There's two "fix" patches trying to make this work - it does not crash, and almost all the "incorrect" query results are actually stats about buffer hits etc. And that is expected to change with prefetching, not a bug. But then there are a bunch of explains where the number of index scans changed, e.g. like - Index Searches: 5 + Index Searches: 4 And that is almost certainly a bug. I haven't figured this out yet, and I feel a bit lost again :-( It made me think again whether it makes sense to make this fundamental redesign of the index AM interface a prerequisite for prefetching. I don't dispute the advantages of this new design, with indexam.c responsible for more stuff (e.g. when a batch gets freed). It seems more flexible and might make some stuff easier, and if we were designing it now, we'd do it that way ... Even if I eventually to fix this issue, will I ever be sufficiently confident about correctness of the new code, enough to commit that? Perhaps I'm too skeptical, but I'm not really sure about that anymore. After thinking about this for a while, I decided to revisit the approach used in the experimental patch I spoke about at pgconf.dev unconference in 2023, and see if maybe it could be made to work. That patch was pretty dumb - it simply initiated prefetches from the AM, by calling PrefetchBuffer(). And the arguments against that doing this from the AM seems like a layering violation, that every AM would need to do a copy of this, because each AM has a different representation of the internal scan state. But after looking at it with fresh eyes, this seems fixable. It might have been "more true" with the fadvise-based prefetching, but with the ReadStream the amount of new AM code is *much* smaller. It doesn't need to track the distance, or anything like that - that's handled by the ReadStream. It just needs to respond to read_next callback. It also doesn't feel like a layering violation, for the same reason. I gave this a try last week, and I was surprised how easy it was to make this work, and how small and simple the patches are - see the attached simple-prefetch.tgz archive: infrastructure - 22kB btree - 10kB hash - 7kB gist - 10kB spgist - 16kB That's a grand total of ~64kB (there might be some more improvements necessary, esp. in the gist/spgist part). Now compare that with the more complex patch, where we have infrastructure - 100kB nbtree - 100kB And that's just one index type. The other index types would probably need a comparable amount of new code eventually ... Sure, it can probably be made somewhat smaller (e.g. the nbtree code copies a lot of stuff to support both the old and new approach, and that might be reduced if we ditch the old one), and some of the diff are comments. But even considering all that the size/complexity difference will remain significant. The one real limitation of the simpler approach is that prefetching is limited to a single leaf page - we can't prefetch from the next one, until the scan advances to it. But based on experiments comparing this simpler and the "complex" approach, I don't think that really matters that much. I haven't seen any difference for regular queries. The one case where I think it might matter is queries with array keys, where each array key matches a single tuple on a different leaf page. The complex patch might prefetch tuples for later array values, while the simpler patch won't be able to do that. If an array key matches multiple tuples, the simple patch can prefetch those just fine, of course. I don't know which case is more likely. One argument for moving more stuff (including prefetching) to indexam.c was it seems desirable to have one "component" aware of all the relevant information, so that it can adjust prefetching in some way. I believe that's still possible even with the simpler patch - nothing prevents adding a "struct" to the scan descriptor, and using it from the read_next callback or something like that. regards [1] https://github.com/tvondra/postgres/tree/index-prefetch-2025 -- Tomas Vondra --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/x-patch; charset=UTF-8; name="v20250501-0001-WIP-index-prefetching.patch" Content-Disposition: attachment; filename="v20250501-0001-WIP-index-prefetching.patch" Content-Transfer-Encoding: base64 RnJvbSAzMzYxMGY5MmE0Mzg1M2M2NmEzM2M4OGUzMGJjY2ViMTM0NjlhYjY2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogTW9uLCAzMCBTZXAgMjAyNCAyMjo0ODoxMiArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjUwNTAxIDEvN10gV0lQOiBpbmRleCBwcmVmZXRjaGluZwoKQWxsb3dzIHRoZSBpbmRl eCBBTSB0byBwcm92aWRlIGl0ZW1zIChUSURzIGFuZCB0dXBsZXMpIGluIGJhdGNoZXMsIHdo aWNoCmlzIHRoZW4gdXNlZCB0byBpbXBsZW1lbnQgcHJlZmV0Y2hpbmcgb2YgaGVhcCB0dXBs ZXMgaW4gaW5kZXggc2NhbnMKKGluY2x1ZGluZyBpbmRleC1vbmx5IHNjYW5zKS4gVGhpcyBp cyBzaW1pbGFyIHRvIHByZWZldGNoaW5nIGFscmVhZHkKZG9uZSBpbiBiaXRtYXAgc2NhbnMs IGFuZCBjYW4gcmVzdWx0IGluIHNpZ25pZmljYW50IHNwZWVkdXBzLgoKVGhlIGluZGV4IEFN IG1heSBpbXBsZW1lbnQgYW4gb3B0aW9uYWwgImFtZ2V0YmF0Y2giIGNhbGxiYWNrLCByZXR1 cm5pbmcKYSBiYXRjaCBvZiBpdGVtcy4gVGhlIGluZGV4YW0uYyBjb2RlIHRoZW4gaGFuZGxl cyB0aGlzIHRyYW5zcGFyZW50bHkKdGhyb3VnaCB0aGUgZXhpc3RpbmcgImdldG5leHQiIGlu dGVyZmFjZS4KCkl0IGlzIHVwIHRvIHRoZSBpbmRleCBBTSB0byByZXR1cm4gb25seSBiYXRj aGVzIHRoYXQgaXQgY2FuIGhhbmRsZQppbnRlcm5hbGx5LiBGb3IgZXhhbXBsZSwgbW9zdCBv ZiB0aGUgbGF0ZXIgcGF0Y2hlcyBhZGRpbmcgc3VwcG9ydCBmb3IKYmF0Y2hpbmcgdG8gcmVs ZXZhbnQgaW5kZXggQU1zIChidHJlZSwgaGFzaCwgZ2lzdCwgc3AtZ2lzdCkgcmVzdHJpY3Qg dGhlCmJhdGNoZXMgdG8gYSBzaW5nbGUgbGVhZiBwYWdlLiBUaGlzIG1ha2VzIGltcGxlbWVu dGF0aW9uIG9mIGJhdGNoaW5nCm11Y2ggc2ltcGxlciwgd2l0aCBvbmx5IG1pbmltYWwgY2hh bmdlcyB0byB0aGUgaW5kZXggQU1zLCBidXQgaXQncyBub3QgYQpoYXJkIHJlcXVpcmVtZW50 LiBUaGUgaW5kZXggQU0gY2FuIHByb2R1Y2UgYmF0Y2hlcyBzcGFubmluZyBhcmJpdHJhcnkK bnVtYmVyIG9mIGxlYWYgcGFnZXMuIFRoaXMgaXMgbGVmdCBhcyBhIHBvc3NpYmxlIGZ1dHVy ZSBpbXByb3ZlbWVudC4KCk1vc3Qgb2YgdGhlIGJhdGNoaW5nL3ByZWZldGNoaW5nIGxvZ2lj IGhhcHBlbnMgaW4gaW5kZXhhbS5jLiBUaGlzIG1lYW5zCnRoZSBleGVjdXRvciBjb2RlIGNh biBjb250aW51ZSB0byBjYWxsIHRoZSBpbnRlcmZhY2UganVzdCBsaWtlIGJlZm9yZS4KClRo ZSBvbmx5ICJ2aW9sYXRpb24iIGhhcHBlbnMgaW4gaW5kZXgtb25seSBzY2Fucywgd2hpY2gg bmVlZCB0byBjaGVjawp0aGUgdmlzaWJpbGl0eSBtYXAgYm90aCB3aGVuIHRoZSBwcmVmZXRj aGluZyBwYWdlcyAod2UgZG9uJ3Qgd2FudCB0bwpwcmVmZXRjaCBwYWdlcyB0aGF0IGFyZSB1 bm5lY2Vzc2FyeSkgYW5kIGxhdGVyIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KRm9yIGNhY2hl ZCBkYXRhIHRoZSB2aXNpYmlsaXR5IG1hcCBjaGVja3MgY2FuIGJlIGZhaXJseSBleHBlbnNp dmUsIHNvCml0J3MgZGVzaXJhYmxlIHRvIGtlZXAgYW5kIHJldXNlIHRoZSByZXN1bHQgb2Yg dGhlIGZpcnN0IGNoZWNrLgoKQXQgdGhlIG1vbWVudCwgdGhlIHByZWZldGNoaW5nIGRvZXMg bm90IGhhbmRsZSBtYXJrL3Jlc3RvcmUgcGxhbnMuIFRoaXMKaXMgZG9hYmxlLCBidXQgcmVx dWlyZXMgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgYmF0Y2hpbmcK YW5kIGluZGV4IEFNIGNvZGUgaW4gdGhlICJvcHBvc2l0ZSBkaXJlY3Rpb24iLgoKVGhpcyBw YXRjaCBkb2VzIG5vdCBhY3R1YWxseSBhZGQgYmF0Y2hpbmcgdG8gYW55IG9mIHRoZSBpbmRl eCBBTXMsIGl0J3MKanVzdCB0aGUgY29tbW9uIGluZnJhc3RydWN0dXJlLgoKVE9ETyBBZGQg dGhlIG5ldyBpbmRleCBBTSBjYWxsYmFjayB0byBzZ21sIGRvY3MuCgpSZS1pbnRyb2R1Y2Ug dGhlIGNhbGxiYWNrIHRvIGNoZWNrIFZNIGFuZCByZW1lbWJlciB0aGUgcmVzdWx0LgoKSXQg Y2FuIGhhcHBlbiB0aGUgZmlyc3QgZmV3IGJhdGNoZXMgKGxlYWYgcGFnZXMpIG1heSBiZSBy ZXR1cm5lZCBmcm9tCnRoZSBpbmRleCwgc2tpcHBpbmcgdGhlIGhlYXAgZmV0Y2hlcy4gV2hp Y2ggbWVhbnMgdGhlIHJlYWQgc3RyZWFtIGRvZXMKbm8gcmVhZHMgdW50aWwgbXVjaCBsYXRl ciBhZnRlciB0aGUgZmlyc3QgYmF0Y2hlcyBhcmUgYWxyZWFkeSBmcmVlZC4KQmVjYXVzZSB0 aGUgcmVhZHMgb25seSBoYXBwZW4gd2hlbiBmaXJzdCByZWFkaW5nIGZyb20gdGhlIHN0cmVh bS4gSW4KdGhhdCBjYXNlIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCBpbml0aWFsaXpp bmcgdGhlIHN0cmVhbSBwb3NpdGlvbgpiZWNhdXNlIHNldHRpbmcgaXQgdG8gKDAsMCkgd291 bGQgYmUgd3JvbmcgYXMgdGhlIGJhdGNoIGlzIGFscmVhZHkgZ29uZS4KU28ganVzdCBpbml0 aWFsaXplIHRvIHJlYWRQb3N0LCB3aGljaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYWxyZWFk eS4KCkNvdWxkIGl0IGhhcHBlbiBsYXRlciwgb3IganVzdCBvbiBmaXJzdCBjYWxsPyBQcm9i YWJseSBmaXJzdCBjYWxsIG9ubHksCmFzIHRoZSByZWFkIHN0cmVhbSBhbHdheXMgbG9va3Mg YWhlYWQgZm9yIHRoZSBibG9jayB0aGF0IGFjdHVhbGx5IG5lZWRzCnJlYWRpbmcuCi0tLQog c3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYyAgICAgIHwgICA4MSAr LQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2dlbmFtLmMgICAgICAgICAgICAgIHwgICAz MCArLQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICAgICAgIHwg MTQyNCArKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RhYmxlL3RhYmxl YW0uYyAgICAgICAgICAgIHwgICAgMiArLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29uc3Ry YWludC5jICAgICAgICAgICAgIHwgICAgMyArLQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y0luZGV4aW5nLmMgICAgICAgICAgIHwgICAxMiArLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY1JlcGxpY2F0aW9uLmMgICAgICAgIHwgICAgOSArLQogc3JjL2JhY2tlbmQvZXhlY3V0 b3Ivbm9kZUluZGV4b25seXNjYW4uYyAgICAgIHwgIDEzMyArLQogc3JjL2JhY2tlbmQvZXhl Y3V0b3Ivbm9kZUluZGV4c2Nhbi5jICAgICAgICAgIHwgICAzMiArLQogc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgICAgIHwgICAgNyArLQogc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgICAgIHwgICAxMCArCiBzcmMvYmFj a2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAgICAxICsKIHNyYy9p bmNsdWRlL2FjY2Vzcy9hbWFwaS5oICAgICAgICAgICAgICAgICAgICB8ICAgMTAgKwogc3Jj L2luY2x1ZGUvYWNjZXNzL2dlbmFtLmggICAgICAgICAgICAgICAgICAgIHwgICAxMyArLQog c3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCAgICAgICAgICAgICAgICAgIHwgIDE2MCAr Kwogc3JjL2luY2x1ZGUvYWNjZXNzL3RhYmxlYW0uaCAgICAgICAgICAgICAgICAgIHwgICAx MiArLQogc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggICAgICAgICAgICAgICAgIHwg ICAgNyArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICAgICAg fCAgICAzICstCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICAg ICAgfCAgICA1ICsKIDE5IGZpbGVzIGNoYW5nZWQsIDE5MTUgaW5zZXJ0aW9ucygrKSwgMzkg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVh cGFtX2hhbmRsZXIuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVy LmMKaW5kZXggYWMwODJmZWZhNzcuLmY3OWQ5N2E4YzY0IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMKQEAgLTc5LDExICs3OSwxMiBAQCBoZWFwYW1f c2xvdF9jYWxsYmFja3MoUmVsYXRpb24gcmVsYXRpb24pCiAgKi8KIAogc3RhdGljIEluZGV4 RmV0Y2hUYWJsZURhdGEgKgotaGVhcGFtX2luZGV4X2ZldGNoX2JlZ2luKFJlbGF0aW9uIHJl bCkKK2hlYXBhbV9pbmRleF9mZXRjaF9iZWdpbihSZWxhdGlvbiByZWwsIFJlYWRTdHJlYW0g KnJzKQogewogCUluZGV4RmV0Y2hIZWFwRGF0YSAqaHNjYW4gPSBwYWxsb2MwKHNpemVvZihJ bmRleEZldGNoSGVhcERhdGEpKTsKIAogCWhzY2FuLT54c19iYXNlLnJlbCA9IHJlbDsKKwlo c2Nhbi0+eHNfYmFzZS5ycyA9IHJzOwogCWhzY2FuLT54c19jYnVmID0gSW52YWxpZEJ1ZmZl cjsKIAogCXJldHVybiAmaHNjYW4tPnhzX2Jhc2U7CkBAIC05NCw2ICs5NSw5IEBAIGhlYXBh bV9pbmRleF9mZXRjaF9yZXNldChJbmRleEZldGNoVGFibGVEYXRhICpzY2FuKQogewogCUlu ZGV4RmV0Y2hIZWFwRGF0YSAqaHNjYW4gPSAoSW5kZXhGZXRjaEhlYXBEYXRhICopIHNjYW47 CiAKKwlpZiAoc2Nhbi0+cnMpCisJCXJlYWRfc3RyZWFtX3Jlc2V0KHNjYW4tPnJzKTsKKwog CWlmIChCdWZmZXJJc1ZhbGlkKGhzY2FuLT54c19jYnVmKSkKIAl7CiAJCVJlbGVhc2VCdWZm ZXIoaHNjYW4tPnhzX2NidWYpOwpAQCAtMTA4LDYgKzExMiw5IEBAIGhlYXBhbV9pbmRleF9m ZXRjaF9lbmQoSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbikKIAogCWhlYXBhbV9pbmRleF9m ZXRjaF9yZXNldChzY2FuKTsKIAorCWlmIChzY2FuLT5ycykKKwkJcmVhZF9zdHJlYW1fZW5k KHNjYW4tPnJzKTsKKwogCXBmcmVlKGhzY2FuKTsKIH0KIApAQCAtMTMwLDE1ICsxMzcsNzIg QEAgaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxlKHN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRh ICpzY2FuLAogCQkvKiBTd2l0Y2ggdG8gY29ycmVjdCBidWZmZXIgaWYgd2UgZG9uJ3QgaGF2 ZSBpdCBhbHJlYWR5ICovCiAJCUJ1ZmZlcgkJcHJldl9idWYgPSBoc2Nhbi0+eHNfY2J1ZjsK IAotCQloc2Nhbi0+eHNfY2J1ZiA9IFJlbGVhc2VBbmRSZWFkQnVmZmVyKGhzY2FuLT54c19j YnVmLAotCQkJCQkJCQkJCQkgIGhzY2FuLT54c19iYXNlLnJlbCwKLQkJCQkJCQkJCQkJICBJ dGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCkpOworCQkvKgorCQkgKiBSZWFkIHRoZSBi bG9jayBmb3IgdGhlIHJlcXVlc3RlZCBUSUQuIFdpdGggYSByZWFkIHN0cmVhbSwgc2ltcGx5 CisJCSAqIHJlYWQgdGhlIG5leHQgYmxvY2sgd2UgcXVldWVkIGVhcmxpZXIgKGZyb20gdGhl IGNhbGxiYWNrKS4KKwkJICogT3RoZXJ3aXNlIGp1c3QgZG8gdGhlIHJlZ3VsYXIgcmVhZCB1 c2luZyB0aGUgVElELgorCQkgKgorCQkgKiBYWFggSXQncyBhIGJpdCBmcmFnaWxlIHRvIGp1 c3QgcmVhZCBidWZmZXJzLCBleHBlY3RpbmcgdGhlIHJpZ2h0CisJCSAqIGJsb2NrLCB3aGlj aCB3ZSBxdWV1ZWQgZnJvbSB0aGUgY2FsbGJhY2sgc29tZXRpbWUgbXVjaCBlYXJsaWVyLiBJ ZgorCQkgKiB0aGUgdHdvIHN0cmVhbXMgZ2V0IG91dCBvZiBzeW5jIGluIGFueSB3YXkgKHdo aWNoIGNhbiBoYXBwZW4KKwkJICogZWFzaWx5LCBkdWUgdG8gc29tZSBvcHRpbWl6YXRpb24g aGV1cmlzdGljcyksIGl0IG1heSBtaXNiZWhhdmUgaW4KKwkJICogc3RyYW5nZSB3YXlzLgor CQkgKgorCQkgKiBYWFggV2UgbmVlZCB0byBzdXBwb3J0IGJvdGggdGhlIG9sZCBSZWFkQnVm ZmVyIGFuZCBSZWFkU3RyZWFtLCBhcworCQkgKiBzb21lIHBsYWNlcyBhcmUgdW5saWtlbHkg dG8gYmVuZWZpdCBmcm9tIGEgcmVhZCBzdHJlYW0gLSBlLmcuCisJCSAqIGJlY2F1c2UgdGhl eSBvbmx5IGZldGNoIGEgc2luZ2xlIHR1cGxlLiBTbyBiZXR0ZXIgdG8gc3VwcG9ydCB0aGlz LgorCQkgKgorCQkgKiBYWFggQW5vdGhlciByZWFzb24gaXMgdGhhdCBzb21lIGluZGV4IEFN cyBtYXkgbm90IHN1cHBvcnQgdGhlCisJCSAqIGJhdGNoaW5nIGludGVyZmFjZSwgd2hpY2gg aXMgYSBwcmVyZXF1aXNpdGUgZm9yIHVzaW5nIHJlYWRfc3RyZWFtCisJCSAqIEFQSS4KKwkJ ICovCisJCWlmIChzY2FuLT5ycykKKwkJCWhzY2FuLT54c19jYnVmID0gcmVhZF9zdHJlYW1f bmV4dF9idWZmZXIoc2Nhbi0+cnMsIE5VTEwpOworCQllbHNlCisJCQloc2Nhbi0+eHNfY2J1 ZiA9IFJlbGVhc2VBbmRSZWFkQnVmZmVyKGhzY2FuLT54c19jYnVmLAorCQkJCQkJCQkJCQkJ ICBoc2Nhbi0+eHNfYmFzZS5yZWwsCisJCQkJCQkJCQkJCQkgIEl0ZW1Qb2ludGVyR2V0Qmxv Y2tOdW1iZXIodGlkKSk7CisKKwkJLyogV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSB2YWxpZCBi dWZmZXIgZm9yIGEgdmFsaWQgVElELiAqLworCQlBc3NlcnQoQnVmZmVySXNWYWxpZChoc2Nh bi0+eHNfY2J1ZikpOworCisJCS8qCisJCSAqIERpZCB3ZSByZWFkIHRoZSBleHBlY3RlZCBi bG9jayBudW1iZXIgKHBlciB0aGUgVElEKT8gRm9yIHRoZQorCQkgKiByZWd1bGFyIGJ1ZmZl ciByZWFkcyB0aGlzIHNob3VsZCBhbHdheXMgbWF0Y2gsIGJ1dCB3aXRoIHRoZSByZWFkCisJ CSAqIHN0cmVhbSBpdCBtaWdodCBkaXNhZ3JlZSBkdWUgdG8gYSBidWcgZWxzZXdoZXJlICho YXBwZW5lZAorCQkgKiByZXBlYXRlZGx5KS4KKwkJICovCisJCUFzc2VydChCdWZmZXJHZXRC bG9ja051bWJlcihoc2Nhbi0+eHNfY2J1ZikgPT0gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJl cih0aWQpKTsKIAogCQkvKgogCQkgKiBQcnVuZSBwYWdlLCBidXQgb25seSBpZiB3ZSB3ZXJl bid0IGFscmVhZHkgb24gdGhpcyBwYWdlCiAJCSAqLwogCQlpZiAocHJldl9idWYgIT0gaHNj YW4tPnhzX2NidWYpCiAJCQloZWFwX3BhZ2VfcHJ1bmVfb3B0KGhzY2FuLT54c19iYXNlLnJl bCwgaHNjYW4tPnhzX2NidWYpOworCisJCS8qCisJCSAqIFdoZW4gdXNpbmcgdGhlIHJlYWQg c3RyZWFtLCByZWxlYXNlIHRoZSBvbGQgYnVmZmVyLgorCQkgKgorCQkgKiBYWFggTm90IHN1 cmUgdGhpcyBpcyByZWFsbHkgbmVlZGVkLCBvciBtYXliZSB0aGlzIGlzIG5vdCB0aGUgcmln aHQKKwkJICogcGxhY2UgdG8gZG8gdGhpcywgYW5kIGJ1ZmZlcnMgc2hvdWxkIGJlIHJlbGVh c2VkIGVsc2V3aGVyZS4gVGhlCisJCSAqIHByb2JsZW0gaXMgdGhhdCBvdGhlciBwbGFjZSBt YXkgbm90IHJlYWxseSBrbm93IGlmIHRoZSBpbmRleCBzY2FuCisJCSAqIHVzZXMgcmVhZCBz dHJlYW0gQVBJLgorCQkgKgorCQkgKiBYWFggV2UgbmVlZCB0byBkbyB0aGlzLCBiZWNhdXNl IG90aGVyd2lzZSB0aGUgY2FsbGVyIHdvdWxkIG5lZWQgdG8KKwkJICogZG8gZGlmZmVyZW50 IHRoaW5ncyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmVhZF9zdHJlYW0gd2FzIHVzZWQK KwkJICogb3Igbm90LiBXaXRoIHRoZSByZWFkX3N0cmVhbSBpdCdkIGhhdmUgdG8gYWxzbyBl eHBsaWNpdGx5IHJlbGVhc2UKKwkJICogdGhlIGJ1ZmZlcnMsIGJ1dCBkb2luZyB0aGF0IGZv ciBldmVyeSBjYWxsZXIgc2VlbXMgZXJyb3IgcHJvbmUKKwkJICogKGVhc3kgdG8gZm9yZ2V0 KS4gSXQncyBhbHNvIG5vdCBjbGVhciB3aGV0aGVyIGl0IHdvdWxkIGZyZWUgdGhlCisJCSAq IGJ1ZmZlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGluZGV4X2ZldGNoX3R1cGxlIGNhbGwgKHdl IGRvbid0IGtub3cgaWYKKwkJICogdGhlIGJ1ZmZlciBjaGFuZ2VkIHVudGlsICphZnRlciog dGhlIGNhbGwsIGV0Yy4pLgorCQkgKgorCQkgKiBYWFggRG9lcyB0aGlzIGRvIHRoZSByaWdo dCB0aGluZyB3aGVuIHJlYWRpbmcgdGhlIHNhbWUgcGFnZT8gVGhhdAorCQkgKiBzaG91bGQg cmV0dXJuIHRoZSBzYW1lIGJ1ZmZlciwgc28gd29uJ3Qgd2UgcmVsZWFzZSBpdCBwcmVtYXR1 cmVseT8KKwkJICovCisJCWlmIChzY2FuLT5ycyAmJiAocHJldl9idWYgIT0gSW52YWxpZEJ1 ZmZlcikpCisJCXsKKwkJCVJlbGVhc2VCdWZmZXIocHJldl9idWYpOworCQl9CiAJfQogCiAJ LyogT2J0YWluIHNoYXJlLWxvY2sgb24gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gZXhhbWluZSB2 aXNpYmlsaXR5ICovCkBAIC03NTMsNyArODE3LDE0IEBAIGhlYXBhbV9yZWxhdGlvbl9jb3B5 X2Zvcl9jbHVzdGVyKFJlbGF0aW9uIE9sZEhlYXAsIFJlbGF0aW9uIE5ld0hlYXAsCiAKIAkJ dGFibGVTY2FuID0gTlVMTDsKIAkJaGVhcFNjYW4gPSBOVUxMOwotCQlpbmRleFNjYW4gPSBp bmRleF9iZWdpbnNjYW4oT2xkSGVhcCwgT2xkSW5kZXgsIFNuYXBzaG90QW55LCBOVUxMLCAw LCAwKTsKKworCQkvKgorCQkgKiBYWFggTWF5YmUgZW5hYmxlIGJhdGNoaW5nL3ByZWZldGNo IGZvciBjbHVzdGVyaW5nPyBTZWVtcyBsaWtlIGl0CisJCSAqIG1pZ2h0IGJlIGEgcHJldHR5 IHN1YnN0YW50aWFsIHdpbiBpZiB0aGUgdGFibGUgaXMgbm90IHlldCB3ZWxsCisJCSAqIGNs dXN0ZXJlZCBieSB0aGUgaW5kZXguCisJCSAqLworCQlpbmRleFNjYW4gPSBpbmRleF9iZWdp bnNjYW4oT2xkSGVhcCwgT2xkSW5kZXgsIFNuYXBzaG90QW55LCBOVUxMLCAwLCAwLAorCQkJ CQkJCQkJZmFsc2UpOwogCQlpbmRleF9yZXNjYW4oaW5kZXhTY2FuLCBOVUxMLCAwLCBOVUxM LCAwKTsKIAl9CiAJZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4 L2dlbmFtLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvZ2VuYW0uYwppbmRleCA4ZjUz MmUxNDU5MC4uODI2NmQ1ZTBlODcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9p bmRleC9nZW5hbS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9nZW5hbS5jCkBA IC00NDYsOCArNDQ2LDIxIEBAIHN5c3RhYmxlX2JlZ2luc2NhbihSZWxhdGlvbiBoZWFwUmVs YXRpb24sCiAJCQkJZWxvZyhFUlJPUiwgImNvbHVtbiBpcyBub3QgaW4gaW5kZXgiKTsKIAkJ fQogCisJCS8qCisJCSAqIE5vIGJhdGNoaW5nL3ByZWZldGNoIGZvciBjYXRhbG9ncy4gV2Ug ZG9uJ3QgZXhwZWN0IHRoYXQgdG8gaGVscAorCQkgKiB2ZXJ5IG11Y2gsIGJlY2F1c2Ugd2Ug dXN1YWxseSBuZWVkIGp1c3Qgb25lIHJvdywgYW5kIGV2ZW4gaWYgd2UKKwkJICogbmVlZCBt dWx0aXBsZSByb3dzLCB0aGV5IHRlbmQgdG8gYmUgY29sb2NhdGVkIGluIGhlYXAuCisJCSAq CisJCSAqIFhYWCBNYXliZSB3ZSBjb3VsZCBkbyB0aGF0LCB0aGUgcHJlZmV0Y2hpbmcgb25s eSByYW1wcyB1cCBvdmVyIHRpbWUKKwkJICogYW55d2F5PyBUaGVyZSB3YXMgYSBwcm9ibGVt IHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gbG9va2luZyB1cAorCQkgKiBlZmZlY3Rp dmVfaW9fY29uY3VycmVuY3kgZm9yIGEgdGFibGVzcGFjZSAod2hpY2ggbWF5IGRvIGFuIGlu ZGV4CisJCSAqIHNjYW4gaW50ZXJuYWxseSksIGJ1dCB0aGUgcmVhZF9zdHJlYW0gc2hvdWxk IGNhcmUgb2YgdGhhdC4gU3RpbGwsCisJCSAqIHdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGhl bHAgYSBsb3QuCisJCSAqCisJCSAqIFhYWCBUaGlzIGFsc28gbWVhbnMgc2NhbnMgb24gY2F0 YWxvZ3Mgd29uJ3QgdXNlIHJlYWRfc3RyZWFtLgorCQkgKi8KIAkJc3lzc2Nhbi0+aXNjYW4g PSBpbmRleF9iZWdpbnNjYW4oaGVhcFJlbGF0aW9uLCBpcmVsLAotCQkJCQkJCQkJCSBzbmFw c2hvdCwgTlVMTCwgbmtleXMsIDApOworCQkJCQkJCQkJCSBzbmFwc2hvdCwgTlVMTCwgbmtl eXMsIDAsIGZhbHNlKTsKIAkJaW5kZXhfcmVzY2FuKHN5c3NjYW4tPmlzY2FuLCBpZHhrZXks IG5rZXlzLCBOVUxMLCAwKTsKIAkJc3lzc2Nhbi0+c2NhbiA9IE5VTEw7CiAKQEAgLTcwNyw4 ICs3MjAsMjEgQEAgc3lzdGFibGVfYmVnaW5zY2FuX29yZGVyZWQoUmVsYXRpb24gaGVhcFJl bGF0aW9uLAogCQkJZWxvZyhFUlJPUiwgImNvbHVtbiBpcyBub3QgaW4gaW5kZXgiKTsKIAl9 CiAKKwkvKgorCSAqIE5vIGJhdGNoaW5nL3ByZWZldGNoIGZvciBjYXRhbG9ncy4gV2UgZG9u J3QgZXhwZWN0IHRoYXQgdG8gaGVscCB2ZXJ5CisJICogbXVjaCwgYmVjYXVzZSB3ZSB1c3Vh bGx5IG5lZWQganVzdCBvbmUgcm93LCBhbmQgZXZlbiBpZiB3ZSBuZWVkCisJICogbXVsdGlw bGUgcm93cywgdGhleSB0ZW5kIHRvIGJlIGNvbG9jYXRlZCBpbiBoZWFwLgorCSAqCisJICog WFhYIE1heWJlIHdlIGNvdWxkIGRvIHRoYXQsIHRoZSBwcmVmZXRjaGluZyBvbmx5IHJhbXBz IHVwIG92ZXIgdGltZQorCSAqIGFueXdheT8gVGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIGlu ZmluaXRlIHJlY3Vyc2lvbiB3aGVuIGxvb2tpbmcgdXAKKwkgKiBlZmZlY3RpdmVfaW9fY29u Y3VycmVuY3kgZm9yIGEgdGFibGVzcGFjZSAod2hpY2ggbWF5IGRvIGFuIGluZGV4IHNjYW4K KwkgKiBpbnRlcm5hbGx5KSwgYnV0IHRoZSByZWFkX3N0cmVhbSBzaG91bGQgY2FyZSBvZiB0 aGF0LiBTdGlsbCwgd2UgZG9uJ3QKKwkgKiBleHBlY3QgdGhpcyB0byBoZWxwIGEgbG90Lgor CSAqCisJICogWFhYIFRoaXMgYWxzbyBtZWFucyBzY2FucyBvbiBjYXRhbG9ncyB3b24ndCB1 c2UgcmVhZF9zdHJlYW0uCisJICovCiAJc3lzc2Nhbi0+aXNjYW4gPSBpbmRleF9iZWdpbnNj YW4oaGVhcFJlbGF0aW9uLCBpbmRleFJlbGF0aW9uLAotCQkJCQkJCQkJIHNuYXBzaG90LCBO VUxMLCBua2V5cywgMCk7CisJCQkJCQkJCQkgc25hcHNob3QsIE5VTEwsIG5rZXlzLCAwLCBm YWxzZSk7CiAJaW5kZXhfcmVzY2FuKHN5c3NjYW4tPmlzY2FuLCBpZHhrZXksIG5rZXlzLCBO VUxMLCAwKTsKIAlzeXNzY2FuLT5zY2FuID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRl eC9pbmRleGFtLmMKaW5kZXggMjE5ZGYxOTcxZGEuLmM1YmE4OTQ5OWYxIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCisrKyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJw b3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAiYWNjZXNzL2FtYXBpLmgiCisjaW5jbHVkZSAiYWNj ZXNzL25idHJlZS5oIgkJLyogWFhYIGZvciBNYXhUSURzUGVyQlRyZWVQYWdlIChzaG91bGQg cmVtb3ZlKSAqLwogI2luY2x1ZGUgImFjY2Vzcy9yZWxhdGlvbi5oIgogI2luY2x1ZGUgImFj Y2Vzcy9yZWxvcHRpb25zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3JlbHNjYW4uaCIKQEAgLTU4 LDYgKzU5LDggQEAKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCiAjaW5jbHVkZSAidXRp bHMvc3lzY2FjaGUuaCIKIAorLyogZW5hYmxlIGJhdGNoaW5nIC8gcHJlZmV0Y2hpbmcgZHVy aW5nIGluZGV4IHNjYW5zICovCitib29sCQllbmFibGVfaW5kZXhzY2FuX2JhdGNoaW5nID0g ZmFsc2U7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQkJCQltYWNyb3MgdXNlZCBpbiBpbmRleF8g cm91dGluZXMKQEAgLTEwOSw2ICsxMTIsMzYgQEAgc3RhdGljIEluZGV4U2NhbkRlc2MgaW5k ZXhfYmVnaW5zY2FuX2ludGVybmFsKFJlbGF0aW9uIGluZGV4UmVsYXRpb24sCiAJCQkJCQkJ CQkJCSAgUGFyYWxsZWxJbmRleFNjYW5EZXNjIHBzY2FuLCBib29sIHRlbXBfc25hcCk7CiBz dGF0aWMgaW5saW5lIHZvaWQgdmFsaWRhdGVfcmVsYXRpb25fa2luZChSZWxhdGlvbiByKTsK IAorLyogaW5kZXggYmF0Y2hpbmcgKi8KK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX2luaXQo SW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX3Jlc2V0KElu ZGV4U2NhbkRlc2Mgc2NhbiwgYm9vbCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBpbmRleF9i YXRjaF9lbmQoSW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyBib29sIGluZGV4X2JhdGNo X2dldG5leHQoSW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNo X2ZyZWUoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCk7CitzdGF0 aWMgSXRlbVBvaW50ZXIgaW5kZXhfYmF0Y2hfZ2V0bmV4dF90aWQoSW5kZXhTY2FuRGVzYyBz Y2FuLAorCQkJCQkJCQkJCSAgIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworc3RhdGlj IEJsb2NrTnVtYmVyIGluZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dChSZWFkU3RyZWFtICpz dHJlYW0sCisJCQkJCQkJCQkJCSAgIHZvaWQgKmNhbGxiYWNrX3ByaXZhdGVfZGF0YSwKKwkJ CQkJCQkJCQkJICAgdm9pZCAqcGVyX2J1ZmZlcl9kYXRhKTsKKworc3RhdGljIGJvb2wgaW5k ZXhfYmF0Y2hfcG9zX2FkdmFuY2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRj aFBvcyAqcG9zKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX3Bvc19yZXNldChJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoUG9zICpwb3MpOworc3RhdGljIHZvaWQgaW5k ZXhfYmF0Y2hfa2lsbF9pdGVtKEluZGV4U2NhbkRlc2Mgc2Nhbik7CisKK3N0YXRpYyB2b2lk IEFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoUG9zICpwb3MpOworc3RhdGljIHZvaWQgQXNzZXJ0Q2hlY2tCYXRjaChJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoIGJhdGNoKTsKK3N0YXRpYyB2b2lkIEFzc2Vy dENoZWNrQmF0Y2hlcyhJbmRleFNjYW5EZXNjIHNjYW4pOworCisKKyNkZWZpbmUgSU5ERVhf U0NBTl9CQVRDSChzY2FuLCBpZHgpCVwKKwkJKChzY2FuKS0+eHNfYmF0Y2hlcy0+YmF0Y2hl c1soaWR4KSAlIChzY2FuKS0+eHNfYmF0Y2hlcy0+bWF4QmF0Y2hlc10pCisKKyNpZmRlZiBJ TkRFWEFNX0RFQlVHCisjZGVmaW5lIERFQlVHX0xPRyguLi4pIGVsb2coV0FSTklORywgX19W QV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBERUJVR19MT0coLi4uKQorI2VuZGlmCiAKIC8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICAqCQkJCSAgIGluZGV4XyBpbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC0y NTAsNiArMjgzLDEwIEBAIGluZGV4X2luc2VydF9jbGVhbnVwKFJlbGF0aW9uIGluZGV4UmVs YXRpb24sCiAvKgogICogaW5kZXhfYmVnaW5zY2FuIC0gc3RhcnQgYSBzY2FuIG9mIGFuIGlu ZGV4IHdpdGggYW1nZXR0dXBsZQogICoKKyAqIGVuYWJsZV9iYXRjaGluZyBkZXRlcm1pbmVz IHdoZXRoZXIgdGhlIHNjYW4gc2hvdWxkIHRyeSB1c2luZyB0aGUgYmF0Y2hpbmcKKyAqIGlu dGVyZmFjZSAoYW1nZXRiYXRjaC9hbWZyZWViYXRjaCksIGlmIHN1cHBvcnRlZCBieSB0aGUg aW5kZXggQU0sIG9yIHRoZQorICogcmVndWxhciBhbWdldHR1cGxlIGludGVyZmFjZS4KKyAq CiAgKiBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIHN1aXRhYmxlIGxvY2tzIG9uIHRoZSBoZWFw IGFuZCB0aGUgaW5kZXguCiAgKi8KIEluZGV4U2NhbkRlc2MKQEAgLTI1Nyw4ICsyOTQsMTAg QEAgaW5kZXhfYmVnaW5zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAkJCQlSZWxhdGlv biBpbmRleFJlbGF0aW9uLAogCQkJCVNuYXBzaG90IHNuYXBzaG90LAogCQkJCUluZGV4U2Nh bkluc3RydW1lbnRhdGlvbiAqaW5zdHJ1bWVudCwKLQkJCQlpbnQgbmtleXMsIGludCBub3Jk ZXJieXMpCisJCQkJaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzLAorCQkJCWJvb2wgZW5hYmxl X2JhdGNoaW5nKQogeworCVJlYWRTdHJlYW0gKnJzID0gTlVMTDsKIAlJbmRleFNjYW5EZXNj IHNjYW47CiAKIAlBc3NlcnQoc25hcHNob3QgIT0gSW52YWxpZFNuYXBzaG90KTsKQEAgLTI3 Myw4ICszMTIsNDUgQEAgaW5kZXhfYmVnaW5zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwK IAlzY2FuLT54c19zbmFwc2hvdCA9IHNuYXBzaG90OwogCXNjYW4tPmluc3RydW1lbnQgPSBp bnN0cnVtZW50OwogCisJLyoKKwkgKiBJZiBleHBsaWNpdGx5IHJlcXVlc3RlZCBhbmQgc3Vw cG9ydGVkIGJ5IGJvdGggdGhlIGluZGV4IEFNIGFuZCB0aGUKKwkgKiBwbGFuLCBpbml0aWFs aXplIGJhdGNoaW5nIGluZm8uIFdlIG9ubHkgdXNlIHN0cmVhbSByZWFkIEFQSSB3aXRoCisJ ICogYmF0Y2hpbmcgZW5hYmxlZCAoc28gbm90IHdpdGggc3lzdGFibGUgc2NhbnMpLiBCdXQg bWF5YmUgd2Ugc2hvdWxkCisJICogY2hhbmdlIHRoYXQsIGFuZCBqdXN0IHVzZSBkaWZmZXJl bnQgcmVhZF9uZXh0IGNhbGxiYWNrcyAob3Igc29tZXRoaW5nCisJICogbGlrZSB0aGF0KT8K KwkgKgorCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgaGF2ZSBhIHNlcGFyYXRlICJhbWNhbmJh dGNoIiBjYWxsLCB0byBsZXQgdGhlIEFNCisJICogZGVjaWRlIGlmIGJhdGNoaW5nIGlzIHN1 cHBvcnRlZCBkZXBlbmRpbmcgb24gdGhlIHNjYW4gZGV0YWlscy4gVGhhdAorCSAqIG1pZ2h0 IGJlIG5lZWRlZCBmb3IgY2VydGFpbiBpbmRleCBBTXMsIHRoYXQgY2FuIGRvIGJhdGNoaW5n IG9ubHkgZm9yCisJICogc29tZSBzY2FucyAoSSdtIHRoaW5raW5nIGFib3V0IEdpU1QvU1At R2lTVCBpbmRleGVzLCB3aXRoIE9SREVSIEJZKS4KKwkgKgorCSAqIFhYWCBEbyB0aGlzIGJl Zm9yZSBpbml0aWFsaXppbmcgeHNfaGVhcGZldGNoLCBzbyB0aGF0IHdlIGNhbiBwYXNzIHRo ZQorCSAqIHJlYWQgc3RyZWFtIHRvIGl0LgorCSAqLworCWlmICgoaW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW0tPmFtZ2V0YmF0Y2ggIT0gTlVMTCkgJiYKKwkJZW5hYmxlX2JhdGNoaW5nICYm CisJCWVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcpCisJeworCQkvKgorCQkgKiBYWFggV2Ug ZG8gdGhpcyBhZnRlciBpbmRleF9iZWdpbnNjYW5faW50ZXJuYWwoKSwgd2hpY2ggbWVhbnMg d2UKKwkJICogY2FuJ3QgaW5pdCB0aGUgYmF0Y2ggc3RhdGUgaW4gdGhlcmUgKGl0IGRvZXNu J3QgZXZlbiBrbm93IGlmCisJCSAqIGJhdGNoaW5nIHdpbGwgYmUgdXNlZCBhdCB0aGF0IHBv aW50KS4gV2UgY2FuJ3QgaW5pdCB0aGUgcmVhZF9zdHJlYW0KKwkJICogdGhlcmUsIGJlY2F1 c2UgaXQgbmVlZHMgdGhlIGhlYXBSZWxhdGlvbi4KKwkJICovCisJCWluZGV4X2JhdGNoX2lu aXQoc2Nhbik7CisKKwkJLyogaW5pdGlhbGl6ZSBzdHJlYW0gKi8KKwkJcnMgPSByZWFkX3N0 cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFEX1NUUkVBTV9ERUZBVUxULAorCQkJCQkJCQkJCU5V TEwsCisJCQkJCQkJCQkJaGVhcFJlbGF0aW9uLAorCQkJCQkJCQkJCU1BSU5fRk9SS05VTSwK KwkJCQkJCQkJCQlpbmRleF9zY2FuX3N0cmVhbV9yZWFkX25leHQsCisJCQkJCQkJCQkJc2Nh biwKKwkJCQkJCQkJCQkwKTsKKwl9CisKIAkvKiBwcmVwYXJlIHRvIGZldGNoIGluZGV4IG1h dGNoZXMgZnJvbSB0YWJsZSAqLwotCXNjYW4tPnhzX2hlYXBmZXRjaCA9IHRhYmxlX2luZGV4 X2ZldGNoX2JlZ2luKGhlYXBSZWxhdGlvbik7CisJc2Nhbi0+eHNfaGVhcGZldGNoID0gdGFi bGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcFJlbGF0aW9uLCBycyk7CiAKIAlyZXR1cm4gc2Nh bjsKIH0KQEAgLTMzNyw2ICs0MTMsMTIgQEAgaW5kZXhfYmVnaW5zY2FuX2ludGVybmFsKFJl bGF0aW9uIGluZGV4UmVsYXRpb24sCiAJc2Nhbi0+cGFyYWxsZWxfc2NhbiA9IHBzY2FuOwog CXNjYW4tPnhzX3RlbXBfc25hcCA9IHRlbXBfc25hcDsKIAorCS8qCisJICogTm8gYmF0Y2hp bmcgYnkgZGVmYXVsdCwgc28gc2V0IGl0IHRvIE5VTEwuIFdpbGwgYmUgaW5pdGlhbGl6ZWQg bGF0ZXIgaWYKKwkgKiBiYXRjaGluZyBpcyByZXF1ZXN0ZWQgYW5kIEFNIHN1cHBvcnRzIGl0 LgorCSAqLworCXNjYW4tPnhzX2JhdGNoZXMgPSBOVUxMOworCiAJcmV0dXJuIHNjYW47CiB9 CiAKQEAgLTM3MCw2ICs0NTIsMTkgQEAgaW5kZXhfcmVzY2FuKEluZGV4U2NhbkRlc2Mgc2Nh biwKIAlzY2FuLT5raWxsX3ByaW9yX3R1cGxlID0gZmFsc2U7IC8qIGZvciBzYWZldHkgKi8K IAlzY2FuLT54c19oZWFwX2NvbnRpbnVlID0gZmFsc2U7CiAKKwkvKgorCSAqIFJlc2V0IHRo ZSBiYXRjaGluZy4gVGhpcyBtYWtlcyBpdCBsb29rIGxpa2UgdGhlcmUgYXJlIG5vIGJhdGNo ZXMsCisJICogZGlzY2FyZHMgcmVhZHMgYWxyZWFkeSBzY2hlZHVsZWQgdG8gdGhlIHJlYWQg c3RyZWFtLCBldGMuCisJICoKKwkgKiBYWFggV2UgZG8gdGhpcyBiZWZvcmUgY2FsbGluZyBh bXJlc2Nhbiwgc28gdGhhdCBpdCBjb3VsZCByZWluaXRpYWxpemUKKwkgKiBldmVyeXRoaW5n ICh0aGlzIHByb2JhYmx5IGRvZXMgbm90IG1hdHRlciB2ZXJ5IG11Y2gsIG5vdyB0aGF0IHdl J3ZlCisJICogbW92ZWQgYWxsIHRoZSBiYXRjaGluZyBsb2dpYyB0byBpbmRleGFtLmMsIGl0 IHdhcyBtb3JlIGltcG9ydGFudCB3aGVuCisJICogdGhlIGluZGV4IEFNIHdhcyByZXNwb25z aWJsZSBmb3IgbW9yZSBvZiBpdCkuCisJICoKKwkgKiBYWFggTWF5YmUgdGhpcyBzaG91bGQg YWxzbyBoYXBwZW4gYmVmb3JlIHRhYmxlX2luZGV4X2ZldGNoX3Jlc2V0PworCSAqLworCWlu ZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIHRydWUpOworCiAJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW0tPmFtcmVzY2FuKHNjYW4sIGtleXMsIG5rZXlzLAogCQkJCQkJCQkJCQlvcmRl cmJ5cywgbm9yZGVyYnlzKTsKIH0KQEAgLTM4NCw2ICs0NzksOSBAQCBpbmRleF9lbmRzY2Fu KEluZGV4U2NhbkRlc2Mgc2NhbikKIAlTQ0FOX0NIRUNLUzsKIAlDSEVDS19TQ0FOX1BST0NF RFVSRShhbWVuZHNjYW4pOwogCisJLyogQ2xlYW51cCBiYXRjaGluZywgc28gdGhhdCB0aGUg QU0gY2FuIHJlbGVhc2UgcGlucyBhbmQgc28gb24uICovCisJaW5kZXhfYmF0Y2hfZW5kKHNj YW4pOworCiAJLyogUmVsZWFzZSByZXNvdXJjZXMgKGxpa2UgYnVmZmVyIHBpbnMpIGZyb20g dGFibGUgYWNjZXNzZXMgKi8KIAlpZiAoc2Nhbi0+eHNfaGVhcGZldGNoKQogCXsKQEAgLTQx NCw3ICs1MTIsNDYgQEAgaW5kZXhfbWFya3BvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJU0NB Tl9DSEVDS1M7CiAJQ0hFQ0tfU0NBTl9QUk9DRURVUkUoYW1tYXJrcG9zKTsKIAotCXNjYW4t PmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbW1hcmtwb3Moc2Nhbik7CisJLyoKKwkgKiBX aXRob3V0IGJhdGNoaW5nLCBqdXN0IHVzZSB0aGUgYW1tYXJrcG9zKCkgY2FsbGJhY2suIFdp dGggYmF0Y2hpbmcKKwkgKiBldmVyeXRoaW5nIGlzIGhhbmRsZWQgYXQgdGhpcyBsYXllciwg d2l0aG91dCBjYWxsaW5nIHRoZSBBTS4KKwkgKi8KKwlpZiAoc2Nhbi0+eHNfYmF0Y2hlcyA9 PSBOVUxMKQorCXsKKwkJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtbWFya3Bv cyhzY2FuKTsKKwl9CisJZWxzZQorCXsKKwkJSW5kZXhTY2FuQmF0Y2hlcyAqYmF0Y2hlcyA9 IHNjYW4tPnhzX2JhdGNoZXM7CisJCUluZGV4U2NhbkJhdGNoUG9zICpwb3MgPSAmYmF0Y2hl cy0+bWFya1BvczsKKwkJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IGJhdGNoZXMtPm1h cmtCYXRjaDsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBwcmV2aW91cyBtYXJrIGJhdGNoIChp ZiBhbnkpLCBidXQgb25seSBpZiB0aGUgYmF0Y2ggaXMgbm8KKwkJICogbG9uZ2VyIHZhbGlk IChpbiB0aGUgY3VycmVudCBmaXJzdC9uZXh0IHJhbmdlKS4gVGhpcyBtZWFucyB0aGF0IGlm CisJCSAqIHdlJ3JlIG1hcmtpbmcgdGhlIHNhbWUgYmF0Y2ggKGRpZmZlcmVudCBpdGVtKSwg d2UgZG9uJ3QgcmVhbGx5IGRvCisJCSAqIGFueXRoaW5nLgorCQkgKgorCQkgKiBYWFggU2hv dWxkIGhhdmUgc29tZSBtYWNybyBmb3IgdGhpcyBjaGVjaywgSSBndWVzcy4KKwkJICovCisJ CWlmICgoYmF0Y2ggIT0gTlVMTCkgJiYKKwkJCShwb3MtPmJhdGNoIDwgYmF0Y2hlcy0+Zmly c3RCYXRjaCB8fCBwb3MtPmJhdGNoID49IGJhdGNoZXMtPm5leHRCYXRjaCkpCisJCXsKKwkJ CWJhdGNoZXMtPm1hcmtCYXRjaCA9IE5VTEw7CisJCQlpbmRleF9iYXRjaF9mcmVlKHNjYW4s IGJhdGNoKTsKKwkJfQorCisJCS8qIGp1c3QgY29weSB0aGUgcmVhZCBwb3NpdGlvbiAod2hp Y2ggaGFzIHRvIGJlIHZhbGlkKSAqLworCQliYXRjaGVzLT5tYXJrUG9zID0gYmF0Y2hlcy0+ cmVhZFBvczsKKwkJYmF0Y2hlcy0+bWFya0JhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2Fu LCBiYXRjaGVzLT5tYXJrUG9zLmJhdGNoKTsKKworCQkvKgorCQkgKiBGSVhNRSB3ZSBuZWVk IHRvIG1ha2Ugc3VyZSB0aGUgYmF0Y2ggZG9lcyBub3QgZ2V0IGZyZWVkIGR1cmluZyB0aGUK KwkJICogcmVndWxhciBhZHZhbmNlcy4KKwkJICovCisKKwkJQXNzZXJ0Q2hlY2tCYXRjaFBv c1ZhbGlkKHNjYW4sICZiYXRjaGVzLT5tYXJrUG9zKTsKKwl9CiB9CiAKIC8qIC0tLS0tLS0t LS0tLS0tLS0KQEAgLTQ0Nyw3ICs1ODQsNTggQEAgaW5kZXhfcmVzdHJwb3MoSW5kZXhTY2Fu RGVzYyBzY2FuKQogCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBmYWxzZTsgLyogZm9yIHNh ZmV0eSAqLwogCXNjYW4tPnhzX2hlYXBfY29udGludWUgPSBmYWxzZTsKIAotCXNjYW4tPmlu ZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXJlc3RycG9zKHNjYW4pOworCS8qCisJICogV2l0 aG91dCBiYXRjaGluZywganVzdCB1c2UgdGhlIGFtcmVzdHJwb3MoKSBjYWxsYmFjay4gV2l0 aCBiYXRjaGluZworCSAqIGV2ZXJ5dGhpbmcgaXMgaGFuZGxlZCBhdCB0aGlzIGxheWVyLCB3 aXRob3V0IGNhbGxpbmcgdGhlIEFNLgorCSAqLworCWlmIChzY2FuLT54c19iYXRjaGVzID09 IE5VTEwpCisJCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXJlc3RycG9zKHNj YW4pOworCWVsc2UKKwl7CisJCUluZGV4U2NhbkJhdGNoZXMgKmJhdGNoZXMgPSBzY2FuLT54 c19iYXRjaGVzOworCQlJbmRleFNjYW5CYXRjaFBvcyAqcG9zID0gJmJhdGNoZXMtPm1hcmtQ b3M7CisJCUluZGV4U2NhbkJhdGNoRGF0YSAqYmF0Y2ggPSBzY2FuLT54c19iYXRjaGVzLT5t YXJrQmF0Y2g7CisKKwkJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCisJCS8qCisJCSAqIFhY WCBUaGUgcG9zIGNhbiBiZSBpbnZhbGlkLCBpZiB3ZSBhbHJlYWR5IGFkdmFuY2VkIHBhc3Qg dGhlIHRoZQorCQkgKiBtYXJrZWQgYmF0Y2ggKGFuZCBzdGFzaGVkIGl0IGluIG1hcmtCYXRj aCBpbnN0ZWFkIG9mIGZyZWVpbmcpLiBTbworCQkgKiB0aGlzIGFzc2VydCB3b3VsZCBiZSBp bmNvcnJlY3QuCisJCSAqLworCQkvKiBBc3NlcnRDaGVja0JhdGNoUG9zVmFsaWQoc2Nhbiwg JnBvcyk7ICovCisKKwkJLyogRklYTUUgd2Ugc2hvdWxkIHN0aWxsIGNoZWNrIHRoZSBiYXRj aCB3YXMgbm90IGZyZWVkIHlldCAqLworCisJCS8qCisJCSAqIFJlc2V0IHRoZSBiYXRjaGlu ZyBzdGF0ZSwgZXhjZXB0IGZvciB0aGUgbWFya2VkIGJhdGNoLCBhbmQgbWFrZSBpdAorCQkg KiBsb29rIGxpa2Ugd2UgaGF2ZSBhIHNpbmdsZSBiYXRjaCAtIHRoZSBtYXJrZWQgb25lLgor CQkgKgorCQkgKiBYWFggVGhpcyBzZWVtcyBhIGJpdCB1Z2x5IC8gaGFja3ksIG1heWJlIHRo ZXJlJ3MgYSBtb3JlIGVsZWdhbnQgd2F5CisJCSAqIHRvIGRvIHRoaXM/CisJCSAqLworCQlp bmRleF9iYXRjaF9yZXNldChzY2FuLCBmYWxzZSk7CisKKwkJYmF0Y2hlcy0+bWFya1BvcyA9 ICpwb3M7CisJCWJhdGNoZXMtPnJlYWRQb3MgPSAqcG9zOworCQliYXRjaGVzLT5maXJzdEJh dGNoID0gcG9zLT5iYXRjaDsKKwkJYmF0Y2hlcy0+bmV4dEJhdGNoID0gKGJhdGNoZXMtPmZp cnN0QmF0Y2ggKyAxKTsKKworCQlJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGJhdGNoZXMtPm1h cmtQb3MuYmF0Y2gpID0gYmF0Y2g7CisKKwkJLyoKKwkJICogWFhYIEkgcmVhbGx5IGRpc2xp a2UgdGhhdCB3ZSBoYXZlIHNvIG1hbnkgZGVmaW5pdGlvbnMgb2YgImN1cnJlbnQiCisJCSAq IGJhdGNoLiBXZSBoYXZlIHJlYWRQb3MsIHN0cmVhbVBvcywgY3VycmVudEJhdGNoLCAuLi4g c2VlbXMgdmVyeSBhZAorCQkgKiBob2MgLSBJIGp1c3QgYWRkZWQgYSBuZXcgImN1cnJlbnQi IGZpZWxkIHdoZW4gSSBuZWVkZWQgb25lLiBXZQorCQkgKiBzaG91bGQgbWFrZSB0aGF0IHNv bWV3aGF0IG1vcmUgY29uc2lzdGVudCwgb3IgYXQgbGVhc3QgZXhwbGFpbiBpdAorCQkgKiBj bGVhcmx5IHNvbWV3aGVyZS4KKwkJICoKKwkJICogWFhYIERvIHdlIGV2ZW4gbmVlZCBjdXJy ZW50QmF0Y2g/IEl0J3Mgbm90IGFjY2Vzc2VkIGFueXdoZXJlLCBhdAorCQkgKiBsZWFzdCBu b3QgaW4gdGhpcyBwYXRjaC4KKwkJICovCisJCS8vIGJhdGNoZXMtPmN1cnJlbnRCYXRjaCA9 IGJhdGNoOworCQliYXRjaGVzLT5tYXJrQmF0Y2ggPSBiYXRjaDsgLyogYWxzbyByZW1lbWJl ciB0aGlzICovCisJfQogfQogCiAvKgpAQCAtNTY5LDYgKzc1NywxOCBAQCBpbmRleF9wYXJh bGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAJaWYgKHNjYW4tPnhzX2hlYXBmZXRj aCkKIAkJdGFibGVfaW5kZXhfZmV0Y2hfcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoKTsKIAor CS8qCisJICogUmVzZXQgdGhlIGJhdGNoaW5nLiBUaGlzIG1ha2VzIGl0IGxvb2sgbGlrZSB0 aGVyZSBhcmUgbm8gYmF0Y2hlcywKKwkgKiBkaXNjYXJkcyByZWFkcyBhbHJlYWR5IHNjaGVk dWxlZCB0byB0aGUgcmVhZCBzdHJlYW0sIGV0Yy4gV2UgRG8gdGhpcworCSAqIGJlZm9yZSBj YWxsaW5nIGFtcmVzY2FuLCBzbyB0aGF0IGl0IGNhbiByZWluaXRpYWxpemUgZXZlcnl0aGlu Zy4KKwkgKgorCSAqIFhYWCBXZSBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nIGFtcGFyYWxsZWxy ZXNjYW4sIHNvIHRoYXQgaXQgY291bGQKKwkgKiByZWluaXRpYWxpemUgZXZlcnl0aGluZyAo dGhpcyBwcm9iYWJseSBkb2VzIG5vdCBtYXR0ZXIgdmVyeSBtdWNoLCBub3cKKwkgKiB0aGF0 IHdlJ3ZlIG1vdmVkIGFsbCB0aGUgYmF0Y2hpbmcgbG9naWMgdG8gaW5kZXhhbS5jLCBpdCB3 YXMgbW9yZQorCSAqIGltcG9ydGFudCB3aGVuIHRoZSBpbmRleCBBTSB3YXMgcmVzcG9uc2li bGUgZm9yIG1vcmUgb2YgaXQpLgorCSAqLworCWluZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIHRy dWUpOworCiAJLyogYW1wYXJhbGxlbHJlc2NhbiBpcyBvcHRpb25hbDsgYXNzdW1lIG5vLW9w IGlmIG5vdCBwcm92aWRlZCBieSBBTSAqLwogCWlmIChzY2FuLT5pbmRleFJlbGF0aW9uLT5y ZF9pbmRhbS0+YW1wYXJhbGxlbHJlc2NhbiAhPSBOVUxMKQogCQlzY2FuLT5pbmRleFJlbGF0 aW9uLT5yZF9pbmRhbS0+YW1wYXJhbGxlbHJlc2NhbihzY2FuKTsKQEAgLTU4MywxMCArNzgz LDEyIEBAIEluZGV4U2NhbkRlc2MKIGluZGV4X2JlZ2luc2Nhbl9wYXJhbGxlbChSZWxhdGlv biBoZWFwcmVsLCBSZWxhdGlvbiBpbmRleHJlbCwKIAkJCQkJCSBJbmRleFNjYW5JbnN0cnVt ZW50YXRpb24gKmluc3RydW1lbnQsCiAJCQkJCQkgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlz LAotCQkJCQkJIFBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwc2NhbikKKwkJCQkJCSBQYXJhbGxl bEluZGV4U2NhbkRlc2MgcHNjYW4sCisJCQkJCQkgYm9vbCBlbmFibGVfYmF0Y2hpbmcpCiB7 CiAJU25hcHNob3QJc25hcHNob3Q7CiAJSW5kZXhTY2FuRGVzYyBzY2FuOworCVJlYWRTdHJl YW0gKnJzID0gTlVMTDsKIAogCUFzc2VydChSZWxGaWxlTG9jYXRvckVxdWFscyhoZWFwcmVs LT5yZF9sb2NhdG9yLCBwc2Nhbi0+cHNfbG9jYXRvcikpOwogCUFzc2VydChSZWxGaWxlTG9j YXRvckVxdWFscyhpbmRleHJlbC0+cmRfbG9jYXRvciwgcHNjYW4tPnBzX2luZGV4bG9jYXRv cikpOwpAQCAtNjA0LDggKzgwNiw0OCBAQCBpbmRleF9iZWdpbnNjYW5fcGFyYWxsZWwoUmVs YXRpb24gaGVhcHJlbCwgUmVsYXRpb24gaW5kZXhyZWwsCiAJc2Nhbi0+eHNfc25hcHNob3Qg PSBzbmFwc2hvdDsKIAlzY2FuLT5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudDsKIAorCS8qCisJ ICogSWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgYW5kIHN1cHBvcnRlZCBieSBib3RoIHRoZSBp bmRleCBBTSBhbmQgdGhlCisJICogcGxhbiwgaW5pdGlhbGl6ZSBiYXRjaGluZyBpbmZvLiBX ZSBvbmx5IHVzZSBzdHJlYW0gcmVhZCBBUEkgd2l0aAorCSAqIGJhdGNoaW5nIGVuYWJsZWQg KHNvIG5vdCB3aXRoIHN5c3RhYmxlIHNjYW5zKS4gQnV0IG1heWJlIHdlIHNob3VsZAorCSAq IGNoYW5nZSB0aGF0LCBhbmQganVzdCB1c2UgZGlmZmVyZW50IHJlYWRfbmV4dCBjYWxsYmFj a3MgKG9yIHNvbWV0aGluZworCSAqIGxpa2UgdGhhdCk/CisJICoKKwkgKiBYWFggTWF5YmUg d2Ugc2hvdWxkIGhhdmUgYSBzZXBhcmF0ZSAiYW1jYW5iYXRjaCIgY2FsbCwgdG8gbGV0IHRo ZSBBTQorCSAqIGRlY2lkZSBpZiBiYXRjaGluZyBpcyBzdXBwb3J0ZWQgZGVwZW5kaW5nIG9u IHRoZSBzY2FuIGRldGFpbHMuIFRoYXQKKwkgKiBtaWdodCBiZSBuZWVkZWQgZm9yIGNlcnRh aW4gaW5kZXggQU1zLCB0aGF0IGNhbiBkbyBiYXRjaGluZyBvbmx5IGZvcgorCSAqIHNvbWUg c2NhbnMgKEknbSB0aGlua2luZyBhYm91dCBHaVNUL1NQLUdpU1QgaW5kZXhlcywgd2l0aCBP UkRFUiBCWSkuCisJICoKKwkgKiBYWFggRG8gdGhpcyBiZWZvcmUgaW5pdGlhbGl6aW5nIHhz X2hlYXBmZXRjaCwgc28gdGhhdCB3ZSBjYW4gcGFzcyB0aGUKKwkgKiByZWFkIHN0cmVhbSB0 byBpdC4KKwkgKgorCSAqIFhYWCBQcmV0dHkgZHVwbGljYXRlIHdpdGggdGhlIGNvZGUgaW4g aW5kZXhfYmVnaW5zY2FuKCksIHNvIG1heWJlIG1vdmUKKwkgKiBpbnRvIGEgc2hhcmVkIGZ1 bmN0aW9uLgorCSAqLworCWlmICgoaW5kZXhyZWwtPnJkX2luZGFtLT5hbWdldGJhdGNoICE9 IE5VTEwpICYmCisJCWVuYWJsZV9iYXRjaGluZyAmJgorCQllbmFibGVfaW5kZXhzY2FuX2Jh dGNoaW5nKQorCXsKKwkJLyoKKwkJICogWFhYIFdlIGRvIHRoaXMgYWZ0ZXIgaW5kZXhfYmVn aW5zY2FuX2ludGVybmFsKCksIHdoaWNoIG1lYW5zIHdlCisJCSAqIGNhbid0IGluaXQgdGhl IGJhdGNoIHN0YXRlIGluIHRoZXJlIChpdCBkb2Vzbid0IGV2ZW4ga25vdyBpZgorCQkgKiBi YXRjaGluZyB3aWxsIGJlIHVzZWQgYXQgdGhhdCBwb2ludCkuIFdlIGNhbid0IGluaXQgdGhl IHJlYWRfc3RyZWFtCisJCSAqIHRoZXJlLCBiZWNhdXNlIGl0IG5lZWRzIHRoZSBoZWFwUmVs YXRpb24uCisJCSAqLworCQlpbmRleF9iYXRjaF9pbml0KHNjYW4pOworCisJCS8qIGluaXRp YWxpemUgc3RyZWFtICovCisJCXJzID0gcmVhZF9zdHJlYW1fYmVnaW5fcmVsYXRpb24oUkVB RF9TVFJFQU1fREVGQVVMVCwKKwkJCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkJCWhlYXByZWws CisJCQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCWluZGV4X3NjYW5fc3RyZWFt X3JlYWRfbmV4dCwKKwkJCQkJCQkJCQlzY2FuLAorCQkJCQkJCQkJCTApOworCX0KKwogCS8q IHByZXBhcmUgdG8gZmV0Y2ggaW5kZXggbWF0Y2hlcyBmcm9tIHRhYmxlICovCi0Jc2Nhbi0+ eHNfaGVhcGZldGNoID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcHJlbCk7CisJc2Nh bi0+eHNfaGVhcGZldGNoID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcHJlbCwgcnMp OwogCiAJcmV0dXJuIHNjYW47CiB9CkBAIC02MjgsNiArODcwLDI3IEBAIGluZGV4X2dldG5l eHRfdGlkKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pCiAJ LyogWFhYOiB3ZSBzaG91bGQgYXNzZXJ0IHRoYXQgYSBzbmFwc2hvdCBpcyBwdXNoZWQgb3Ig cmVnaXN0ZXJlZCAqLwogCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChSZWNlbnRYbWlu KSk7CiAKKwkvKgorCSAqIFdoZW4gdXNpbmcgYmF0Y2hpbmcgKHdoaWNoIG1heSBiZSBkaXNh YmxlZCBmb3IgdmFyaW91cyByZWFzb25zIC0gZS5nLgorCSAqIHRocm91Z2ggYSBHVUMsIHRo ZSBpbmRleCBBTSBub3Qgc3VwcG9ydGluZyBpdCksIHJlZGlyZWN0IHRoZSBjb2RlIHRvCisJ ICogdGhlICJiYXRjaCIgdmFyaWFudC4gSWYgbmVlZGVkIChlLmcuIGZvciB0aGUgZmlyc3Qg Y2FsbCkgdGhlIGNhbGwgbWF5CisJICogcmVhZCB0aGUgbmV4dCBiYXRjaCAobGVhZiBwYWdl KSBmcm9tIHRoZSBpbmRleCAoYnV0IHRoYXQncyBkcml2ZW4gYnkKKwkgKiB0aGUgcmVhZCBz dHJlYW0pLgorCSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBlbmFibGUgYmF0Y2hpbmcg YmFzZWQgb24gdGhlIHBsYW4gdG9vLCBzbyB0aGF0IHdlCisJICogZG9uJ3QgZG8gYmF0Y2hp bmcgd2hlbiBpdCdzIHByb2JhYmx5IHVzZWxlc3MgKGUuZy4gc2VtaWpvaW5zIG9yIHF1ZXJp ZXMKKwkgKiB3aXRoIExJTUlUIDEgZXRjLikuIFRoZSBhbWNhbmJhdGNoKCkgY2FsbGJhY2sg bWlnaHQgY29uc2lkZXIgdGhpbmdzCisJICogbGlrZSB0aGF0LCBvciBtYXliZSB0aGF0IHNo b3VsZCBiZSBjb25zaWRlcmVkIG91dHNpZGUgQU0uIEhvd2V2ZXIsIHRoZQorCSAqIHNsb3cg cmFtcC11cCAoc3RhcnRpbmcgd2l0aCBzbWFsbCBiYXRjaGVzKSBpbiByZWFkX3N0cmVhbSBz aG91bGQgaGFuZGxlCisJICogdGhpcyB3ZWxsIGVub3VnaC4KKwkgKgorCSAqIFhYWCBQZXJo YXBzIGl0J2QgYmUgcG9zc2libGUgdG8gZG8gYm90aCBpbiBpbmRleF9nZXRuZXh0X3Nsb3Qo KSwgaS5lLgorCSAqIGNhbGwgZWl0aGVyIHRoZSBvcmlnaW5hbCBjb2RlIHdpdGhvdXQgYmF0 Y2hpbmcsIG9yIHRoZSBuZXcgYmF0Y2hpbmcKKwkgKiBjb2RlIGlmIHN1cHBvcnRlZC9lbmFi bGVkLiBJdCdzIG5vdCBncmVhdCB0byBoYXZlIGR1cGxpY2F0ZWQgY29kZS4KKwkgKi8KKwlp ZiAoc2Nhbi0+eHNfYmF0Y2hlcyAhPSBOVUxMKQorCQlyZXR1cm4gaW5kZXhfYmF0Y2hfZ2V0 bmV4dF90aWQoc2NhbiwgZGlyZWN0aW9uKTsKKwogCS8qCiAJICogVGhlIEFNJ3MgYW1nZXR0 dXBsZSBwcm9jIGZpbmRzIHRoZSBuZXh0IGluZGV4IGVudHJ5IG1hdGNoaW5nIHRoZSBzY2Fu CiAJICoga2V5cywgYW5kIHB1dHMgdGhlIFRJRCBpbnRvIHNjYW4tPnhzX2hlYXB0aWQuICBJ dCBzaG91bGQgYWxzbyBzZXQKQEAgLTY5NCw5ICs5NTcsMjIgQEAgaW5kZXhfZmV0Y2hfaGVh cChJbmRleFNjYW5EZXNjIHNjYW4sIFR1cGxlVGFibGVTbG90ICpzbG90KQogCSAqIGFtZ2V0 dHVwbGUgY2FsbCwgaW4gaW5kZXhfZ2V0bmV4dF90aWQpLiAgV2UgZG8gbm90IGRvIHRoaXMg d2hlbiBpbgogCSAqIHJlY292ZXJ5IGJlY2F1c2UgaXQgbWF5IHZpb2xhdGUgTVZDQyB0byBk byBzby4gIFNlZSBjb21tZW50cyBpbgogCSAqIFJlbGF0aW9uR2V0SW5kZXhTY2FuKCkuCisJ ICoKKwkgKiBYWFggRm9yIHNjYW5zIHVzaW5nIGJhdGNoaW5nLCByZWNvcmQgdGhlIGZsYWcg aW4gdGhlIGJhdGNoICh3ZSB3aWxsCisJICogcGFzcyBpdCB0byB0aGUgQU0gbGF0ZXIsIHdo ZW4gZnJlZWluZyBpdCkuIE90aGVyd2lzZSBqdXN0IHBhc3MgaXQgdG8KKwkgKiB0aGUgQU0g dXNpbmcgdGhlIGtpbGxfcHJpb3JfdHVwbGUgZmllbGQuCiAJICovCiAJaWYgKCFzY2FuLT54 YWN0U3RhcnRlZEluUmVjb3ZlcnkpCi0JCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBhbGxf ZGVhZDsKKwl7CisJCWlmIChzY2FuLT54c19iYXRjaGVzID09IE5VTEwpCisJCXsKKwkJCXNj YW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBhbGxfZGVhZDsKKwkJfQorCQllbHNlIGlmIChhbGxf ZGVhZCkKKwkJeworCQkJaW5kZXhfYmF0Y2hfa2lsbF9pdGVtKHNjYW4pOworCQl9CisJfQog CiAJcmV0dXJuIGZvdW5kOwogfQpAQCAtMTA4NCwzICsxMzYwLDExMzcgQEAgaW5kZXhfb3Bj bGFzc19vcHRpb25zKFJlbGF0aW9uIGluZHJlbCwgQXR0ck51bWJlciBhdHRudW0sIERhdHVt IGF0dG9wdGlvbnMsCiAKIAlyZXR1cm4gYnVpbGRfbG9jYWxfcmVsb3B0aW9ucygmcmVsb3B0 cywgYXR0b3B0aW9ucywgdmFsaWRhdGUpOwogfQorCisvKgorICogSU5ERVggQkFUQ0hJTkcg KEFORCBQUkVGRVRDSElORykKKyAqCisgKiBUaGUgdHJhZGl0aW9uYWwgQU0gaW50ZXJmYWNl IChhbWdldHR1cGxlKSBpcyBkZXNpZ25lZCB0byB3YWxrIHRoZSBpbmRleCBvbmUKKyAqIGxl YWYgcGFnZSBhdCBhIHRpbWUsIGFuZCB0aGUgc3RhdGUgKHJlcHJlc2VudGluZyB0aGUgbGVh ZiBwYWdlKSBpcyBtYW5hZ2VkCisgKiBieSB0aGUgQU0gaW1wbGVtZW50YXRpb24uIEJlZm9y ZSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgbGVhZiBwYWdlLCB0aGUgaW5kZXgKKyAqIEFNIGZv cmdldHMgdGhlICJjdXJyZW50IiBsZWFmIHBhZ2UuIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJs ZSB0byBpbXBsZW1lbnQKKyAqIGZlYXR1cmVzIHRoYXQgb3BlcmF0ZSBvbiBtdWx0aXBsZSBs ZWFmIHBhZ2VzIC0gbGlrZSBmb3IgZXhhbXBsZSBwcmVmZXRjaC4KKyAqCisgKiBUaGUgYmF0 Y2hpbmcgcmVsYXhlcyB0aGlzIGJ5IGV4dGVuZGluZyB0aGUgQU0gQVBJIHdpdGggdHdvIG5l dyBtZXRob2RzLAorICogYW1nZXRiYXRjaCBhbmQgYW1mcmVlYmF0Y2gsIHRoYXQgc2VwYXJh dGUgdGhlICJhZHZhbmNlIiB0byB0aGUgbmV4dCBsZWFmCisgKiBwYWdlLCBhbmQgImZvcmdl dHRpbmciIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgbWVhbnMgdGhlcmUgbWF5IGJlIG11bHRp cGxlCisgKiBsZWFmIHBhZ2VzIGxvYWRlZCBhdCBvbmNlLCBpZiBuZWNlc3NhcnkuIEl0J3Mg YSBiaXQgbGlrZSBoYXZpbmcgbXVsdGlwbGUKKyAqICJwb3NpdGlvbnMiIHdpdGhpbiB0aGUg aW5kZXguCisgKgorICogVGhlIEFNIGlzIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgbWFu YWdlbWVudCBvZiB0aGVzZSAiYmF0Y2hlcyIgLSBvbmNlCisgKiBhIGJhdGNoIGlzIHJldHVy bmVkIGZyb20gYW1nZXRiYXRjaCgpLCBpdCdzIHVwIHRvIGluZGV4YW0uYyB0byBkZXRlcm1p bmUKKyAqIHdoZW4gaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5LCBhbmQgY2FsbCBhbWZyZWVi YXRjaCgpLiBUaGF0IGlzLCB0aGUgQU0KKyAqIGNhbiBubyBsb25nZXIgZGlzY2FyZCBhIGxl YWYgcGFnZSB3aGVuIGFkdmFuY2luZyB0byB0aGUgbmV4dCBvbmUuCisgKgorICogVGhpcyBh bGxvd3Mgb3BlcmF0aW5nIG9uICJmdXR1cmUiIGluZGV4IGVudHJpZXMsIGUuZy4gdG8gcHJl ZmV0Y2ggdHVwbGVzCisgKiBmcm9tIHRoZSB0YWJsZS4gV2l0aG91dCB0aGUgYmF0Y2hpbmcs IHdlIGNvdWxkIGRvIHRoaXMgd2l0aGluIHRoZSBzaW5nbGUKKyAqIGxlYWYgcGFnZSwgd2hp Y2ggaGFzIGxpbWl0YXRpb25zLCBlLmcuIGluYWJpbGl0eSB0byBwcmVmZXRjaCBiZXlvbmQg dGhlCisgKiBvZiB0aGUgY3VycmVudCBsZWFmIHBhZ2UsIGFuZCB0aGUgcHJlZmV0Y2ggZGlz dGFuY2UgZHJvcCB0byAwLiAoTW9zdAorICogaW5kZXhlcyBoYXZlIG1hbnkgaW5kZXggaXRl bXMgcGVyIGxlYWYgcGFnZSwgc28gdGhlIHByZWZldGNoaW5nIHdvdWxkCisgKiBiZSBiZW5l ZmljaWFsIGV2ZW4gd2l0aCB0aGlzIGxpbWl0YXRpb24sIGJ1dCBpdCdzIG5vdCBncmVhdCBl aXRoZXIuKQorICoKKyAqIE1vdmluZyB0aGUgYmF0Y2ggbWFuYWdlbWVudCB0byB0aGUgaW5k ZXhhbS5jIGFsc28gbWVhbnMgZGVmaW5pbmcgYSBjb21tb24KKyAqIGJhdGNoIHN0YXRlLCBp bnN0ZWFkIG9mIGVhY2ggaW5kZXggQU0gZGVmaW5pbmcgaXQncyBvd24gb3BhcXVlIHN0YXRl LiBUaGUKKyAqIEFNIG1lcmVseSAiZmlsbHMiIHRoZSBiYXRjaCwgYW5kIGV2ZXJ5dGhpbmcg ZWxzZSBpcyBoYW5kbGVkIGJ5IGNvZGUgaW4KKyAqIGluZGV4YW0uYyAoc28gbm90IEFNLXNw ZWNpZmljKS4gSW5jbHVkaW5nIHByZWZldGNoaW5nLgorICoKKyAqIFdpdGhvdXQgdGhpcyAi Y29tbW9uIiBiYXRjaCBkZWZpbml0aW9uLCBlYWNoIEFNIHdvdWxkIG5lZWQgdG8gZG8gYSBm YWlyCisgKiBiaXQgb2YgdGhlIHByZWZldGNoaW5nIG9uIGl0J3Mgb3duLgorICoKKyAqCisg KiBub3RlOiBTdHJpY3RseSBzcGVha2luZywgdGhlIEFNIG1heSBrZWVwIGEgc2Vjb25kIGxl YWYgcGFnZSBiZWNhdXNlIG9mCisgKiBtYXJrL3Jlc3RvcmUgbWF5LCBidXQgdGhhdCdzIGEg bWlub3IgZGV0YWlsLgorICoKKyAqIG5vdGU6IFRoZXJlIGFyZSBkaWZmZXJlbnQgZGVmaW5p dGlvbnMgb2YgImJhdGNoIiAtIEkgdXNlIGl0IGFzIGEgc3lub255bQorICogZm9yIGEgbGVh ZiBwYWdlLCBvciB0aGUgaW5kZXggdHVwbGVzIHJlYWQgZnJvbSBvbmUgbGVhZiBwYWdlLiBP dGhlcnMgdXNlCisgKiAiYmF0Y2giIHdoZW4gdGFsa2luZyBhYm91dCBhbGwgdGhlIGxlYWYg cGFnZXMga2VwdCBpbiBtZW1vcnkgYXQgYSBnaXZlbgorICogbW9tZW50IGluIHRpbWUgKHNv IGluIGEgd2F5LCB0aGVyZSdzIGEgc2luZ2xlIGJhdGNoLCBjaGFuZ2luZyBvdmVyIHRpbWUp LgorICogSXQncyBub3QgbXkgYW1iaXRpb24gdG8gcHJlc2VudCBhIGJpbmRpbmcgZGVmaW5p dGlvbiBvZiBhIGJhdGNoLCBidXQgaXQncworICogZ29vZCB0byBjb25zaWRlciB0aGlzIHdo ZW4gcmVhZGluZyBjb21tZW50cyBieSBvdGhlciBwZW9wbGUuCisgKgorICogbm90ZTogSW4g dGhlb3J5LCBob3cgdGhlIGJhdGNoIG1hcHMgdG8gbGVhZiBwYWdlcyBpcyBtb3N0bHkgdXAg dG8gdGhlIGluZGV4CisgKiBBTSAtIGFzIGxvbmcgYXMgaXQgY2FuICJhZHZhbmNlIiBiZXR3 ZWVuIGJhdGNoZXMsIGV0Yy4gaXQgY291bGQgdXNlIGJhdGNoZXMKKyAqIHRoYXQgcmVwcmVz ZW50IGEgc3Vic2V0IG9mIGEgbGVhZiBwYWdlLCBvciBtdWx0aXBsZSBsZWFmIHBhZ2VzIGF0 IG9uY2UuCisgKgorICogbm90ZTogT3IgbWF5YmUgaXQgZG9lc24ndCBuZWVkIHRvIG1hcCB0 byBsZWFmIHBhZ2VzIGF0IGFsbCwgYXQgbGVhc3Qgbm90CisgKiBpbiBhIHNpbXBsZSB3YXku IENvbnNpZGVyIGZvciBleGFtcGxlIG9yZGVyZWQgc2NhbnMgb24gU1AtR2lTVCBpbmRleGVz LAorICogb3Igc2ltaWxhciBjYXNlcy4gSSB0aGluayB0aGF0IGNvdWxkIGJlIGhhbmRsZWQg YnkgaGF2aW5nICJhYnN0cmFjdCIKKyAqIGJhdGNoZXMgLSBzdWNoIGluZGV4ZXMgZG9uJ3Qg c3VwcG9ydCBtYXJrL3Jlc3RvcmUgb3IgY2hhbmdpbmcgZGlyZWN0aW9uLAorICogc28gdGhp cyBzaG91bGQgYmUgT0suCisgKgorICogbm90ZTogV2hlbiB0aGlua2luZyBhYm91dCBhbiBp bmRleCBBTSwgdGhpbmsgYWJvdXQgQlRSRUUsIHVubGVzcyBhbm90aGVyCisgKiBBTSBpcyBt ZW50aW9uZWQgZXhwbGljaXRseS4gTW9zdCBBTXMgYXJlIGJhc2VkIG9uIC8gZGVyaXZlZCBm cm9tIEJUUkVFLAorICogYW5kIGV2ZXJ5dGhpbmcgYWJvdXQgQlRSRUUgZGlyZWN0bHkgZXh0 ZW5kcyB0byB0aGVtLgorICoKKyAqIG5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGV4dCAiaW5k ZXggQU0iIHJlZmVycyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhCisgKiBwYXJ0aWN1bGFy IGluZGV4IEFNIChlLmcuIEJUUkVFKSwgaS5lLiBjb2RlIHNyYy9iYWNrZW5kL2FjY2Vzcy9u YnRyZWUpLAorICogd2hpbGUgImluZGV4YW0uYyIgaXMgdGhlIHNoYXJlZCBleGVjdXRvciBs ZXZlbCB1c2VkIHRvIGludGVyYWN0IHdpdGgKKyAqIGluZGV4ZXMuCisgKgorICoKKyAqIGlu ZGV4IHNjYW4gc3RhdGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIFdpdGggdGhlIHRyYWRp dGlvbmFsIEFQSSAoYW1nZXR0dXBsZSksIGluZGV4IHNjYW4gc3RhdGUgaXMgc3RvcmVkIGF0 IHRoZQorICogc2Nhbi1sZXZlbCBpbiBBTS1zcGVjaWZpYyBzdHJ1Y3RzIC0gZS5nLiBpbiBC VFNjYW5PcGFxdWUgZm9yIEJUUkVFKS4gU28KKyAqIHRoZXJlIGNhbiBiZSBvbmx5IGEgc2lu Z2xlIGxlYWYgcGFnZSAibG9hZGVkIiBmb3IgYSBzY2FuIGF0IGEgdGltZS4KKyAqCisgKiBX aXRoIHRoZSBuZXcgQVBJIChhbWdldGJhdGNoL2FtZnJlZWJhdGNoKSwgYW4gaW5kZXggc2Nh biBuZWVkcyB0byBzdG9yZQorICogbXVsdGlwbGUgYmF0Y2hlcyAtIGJ1dCBub3QgaW4gcHJp dmF0ZSAic2NhbiBvcGFxdWUiIHN0cnVjdC4gSW5zdGVhZCwKKyAqIHRoZSBxdWV1ZSBvZiBi YXRjaGVzIGFuZCBzb21lIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiB3YXMgbW92ZWQgdG8g dGhlCisgKiBJbmRleFNjYW5EZXNjLCBpbnRvIGEgY29tbW9uIHN0cnVjdC4gU28gdGhlIEFN LXNwZWNpZmljIHNjYW4tb3BhcXVlCisgKiBzdHJ1Y3RzIGdldCBzcGxpdCBhbmQgbW92ZWQg aW50byB0aHJlZSBwbGFjZXM6CisgKgorICogMSkgc2Nhbi1vcGFxdWUgLSBGaWVsZHMgdGhh dCBhcmUgdHJ1bHkgcmVsYXRlZCB0byB0aGUgc2NhbiBhcyBhIHdob2xlCisgKiAgICByZW1h aW4gaW4gdGhlIHN0cnVjdCAod2hpY2ggaXMgQU0tc3BlY2lmaWMsIGkuZS4gZWFjaCBBTSBt ZXRob2QgbWF5CisgKiAgICBrZWVwIHNvbWV0aGluZyBkaWZmZXJlbnQpLiBFeGFtcGxlOiBz Y2Fua2V5cy9hcnJheWtleXMgYXJlIHN0aWxsCisgKiAgICBrZXB0IGluIEJUU2Nhbk9wYXF1 ZS4KKyAqCisgKiAyKSBiYXRjaC1vcGFxdWUgLSBBTS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBy ZWxhdGVkIHRvIGEgcGFydGljdWxhciBsZWFmCisgKiAgICBwYWdlIGFyZSBtb3ZlZCB0byBh IG5ldyBiYXRjaC1sZXZlbCBzdHJ1Y3QuIEEgZ29vZCBleGFtcGxlIGFyZSBmb3IKKyAqICAg IGV4YW1wbGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsZWFmIHBhZ2UgLyBiYXRjaCBpbiB0aGUg aW5kZXggKGN1cnJlbnQKKyAqICAgIHBhZ2UsIGxlZnQvcmlnaCBwYWdlcywgZXRjLikuCisg KgorICogMykgYmF0Y2ggLSBBIHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIHBhdGNoIGlzIGlu dHJvZHVjaW5nIGEgY29tbW9uCisgKiAgICByZXByZXNlbnRhdGlvbiBvZiBhIGJhdGNoLCBj b21tb24gdG8gYWxsIHRoZSBpbmRleCBBTXMuIFVudGlsIG5vdworICogICAgZWFjaCBBTSBo YWQgaXQncyBvd24gd2F5IG9mIHJlcHJlc2VudGluZyB0dXBsZXMgZnJvbSBhIGxlYWYgcGFn ZSwKKyAqICAgIGFuZCBhY2Nlc3NpbmcgaXQgcmVxdWlyZWQgZ29pbmcgdGhyb3VnaCB0aGUg QU0gYWdhaW4uIFRoZSBjb21tb24KKyAqICAgIHJlcHJlc2VudGF0aW9uIGFsbG93cyBhY2Nl c3NpbmcgdGhlIGJhdGNoZXMgdGhyb3VnaCB0aGUgaW5kZXhhbS5jCisgKiAgICBsYXllciwg d2l0aG91dCBoYXZpbmcgdG8gZ28gdGhyb3VnaCB0aGUgQU0uCisgKgorICoKKyAqIGFtZ2V0 YmF0Y2gvYW1mcmVlYmF0Y2gKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRvIHN1 cHBvcnQgYmF0Y2hpbmcsIHRoZSBpbmRleCBBTSBuZWVkcyB0byBpbXBsZW1lbnQgdHdvIG9w dGlvbmFsCisgKiBjYWxsYmFja3MgLSBhbWdldGJhdGNoKCkgYW5kIGFtZnJlZWJhdGNoKCks IHdoaWNoIGxvYWQgZGF0YSBmcm9tIHRoZQorICogIm5leHQiIGxlYWYgcGFnZSwgYW5kIHRo ZW4gZnJlZSBpdCB3aGVuIHRoZSBiYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkLgorICoKKyAq IEZvciBub3cgdGhlIGFtZ2V0dHVwbGUoKSBjYWxsYmFjayBpcyBzdGlsbCByZXF1aXJlZCBl dmVuIGZvciBBTXMgdGhhdAorICogc3VwcG9ydCBiYXRjaGluZywgc28gdGhhdCB3ZSBjYW4g ZmFsbC1iYWNrIHRvIHRoZSBub24tYmF0Y2hlZCBzY2FuCisgKiBmb3IgY2FzZXMgd2hlbiBi YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIChlLmcuIHNjYW5zIG9mIHN5c3RlbSB0YWJsZXMp CisgKiBvciB3aGVuIGJhdGNoaW5nIGlzIGRpc2FibGVkIHVzaW5nIHRoZSBlbmFibGVfaW5k ZXhzY2FuX2JhdGNoaW5nIEdVQy4KKyAqCisgKgorICogYmF0Y2gKKyAqIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqIEEgZ29vZCB3YXkgdG8gdmlzdWFsaXplIGJhdGNoaW5nIGlzIGEg c2xpZGluZyB3aW5kb3cgb3ZlciB0aGUga2V5IHNwYWNlIG9mCisgKiBhbiBpbmRleC4gQXQg YW55IGdpdmVuIG1vbWVudCwgd2UgaGF2ZSBhICJ3aW5kb3ciIHJlcHJlc2VudGluZyBhIHJh bmdlIG9mCisgKiB0aGUga2V5cywgY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSBiYXRjaGVz LCBlYWNoIHdpdGggaXRlbXMgZnJvbSBhIHNpbmdsZQorICogbGVhZiBwYWdlLgorICoKKyAq IEZvciBub3csIGVhY2ggYmF0Y2ggaXMgZXhhY3RseSBvbmUgd2hvbGUgbGVhZiBwYWdlLiBX ZSBtaWdodCBhbGxvdyBiYXRjaGVzCisgKiB0byBiZSBzbWFsbGVyIG9yIGxhcmdlciwgYnV0 IHRoYXQgZG9lc24ndCBzZWVtIHZlcnkgdXNlZnVsLiBJdCB3b3VsZCBtYWtlCisgKiB0aGlu Z3MgbW9yZSBjb21wbGV4LCB3aXRob3V0IHByb3ZpZGluZyBtdWNoIGJlbmVmaXQuIFVsdGlt YXRlbHkgaXQncyB1cCB0bworICogdGhlIGluZGV4IEFNIC0gaXQgY2FuIHByb2R1Y2UgYW55 IGJhdGNoZXMgaXQgd2FudHMsIGFzIGxvbmcgYXMgaXQga2VlcHMKKyAqIG5lY2Vzc2FyeSBp bmZvcm1hdGlvbiBpbiB0aGUgYmF0Y2gtb3BhcXVlIHN0cnVjdCwgYW5kIGhhbmRsZXMgdGhp cyBpbiB0aGUKKyAqIGFtZ2V0YmF0Y2gvYW1mcmVlYmF0Y2ggY2FsbGJhY2tzLgorICoKKyAq CisgKiBwcmVmZXRjaGluZzogbGVhZiBwYWdlcyB2cy4gaGVhcCBwYWdlcworICogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgcGF0Y2ggaXMgb25s eSBhYm91dCBwcmVmZXRjaGluZyBwYWdlcyBmcm9tIHRoZSBpbmRleGVkIHJlbGF0aW9uIChl LmcuCisgKiBoZWFwKSwgbm90IGFib3V0IHByZWZldGNoaW5nIGluZGV4IGxlYWYgcGFnZXMg ZXRjLiBUaGUgcmVhZF9uZXh0IGNhbGxiYWNrCisgKiBkb2VzIHJlYWQgbGVhZiBwYWdlcyB3 aGVuIG5lZWRlZCAoYWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgY3VycmVudAorICog YmF0Y2gpLCBidXQgdGhpcyBpcyBzeW5jaHJvbm91cywgYW5kIHRoZSBjYWxsYmFjayB3aWxs IGJsb2NrIHVudGlsIHRoZSBsZWFmCisgKiBwYWdlIGlzIHJlYWQuCisgKgorICoKKyAqIGdy YWR1YWwgcmFtcCB1cAorICogLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgcHJlZmV0Y2hpbmcg aXMgZHJpdmVuIGJ5IHRoZSByZWFkX3N0cmVhbSBBUEkgLyBpbXBsZW1lbnRhdGlvbi4gVGhl cmUKKyAqIGFyZSBubyBleHBsaWNpdCBmYWR2aXNlIGNhbGxzIGluIHRoZSBpbmRleCBjb2Rl LCB0aGF0IGFsbCBoYXBwZW5zIGluIHRoZQorICogcmVhZCBzdHJlYW0uIFRoZSByZWFkIHN0 cmVhbSBkb2VzIHRoZSB1c3VhbCBncmFkdWFsIHJhbXAgdXAgdG8gbm90IHJlZ3Jlc3MKKyAq IExJTUlUIDEgcXVlcmllcyBldGMuCisgKgorICoKKyAqIGtpbGxfcHJpb3JfdHVwbGVzCisg KiAtLS0tLS0tLS0tLS0tLS0tLQorICogSWYgd2UgZGVjaWRlIGEgdHVwbGUgc2hvdWxkIGJl ICJraWxsZWQiIGluIHRoZSBpbmRleCwgdGhlIGEgZmxhZyBpcyB1c2VkIHRvCisgKiBwYXNz IHRoaXMgaW5mb3JtYXRpb24gdG8gaW5kZXhhbS5jIC0gdGhlIGl0ZW0gaXMgcmVjb3JkZWQg aW4gdGhlIGJhdGNoLCBhbmQKKyAqIHRoZSBhY3R1YWwga2lsbGluZyBpcyBwb3N0cG9uZWQg dW50aWwgdGhlIGJhdGNoIGlzIGZyZWVkIHVzaW5nIGFtZnJlZWJhdGNoKCkuCisgKiBUaGUg c2NhbiBmbGFnIGlzIHJlc2V0IHRvIGZhbHNlLCBzbyB0aGF0IHRoZSBpbmRleCBBTSBkb2Vz IG5vdCBnZXQgY29uZnVzZWQKKyAqIGFuZCBkb2VzIG5vdCBkbyBzb21ldGhpbmcgZm9yIGEg ZGlmZmVyZW50ICJjdXJyZW50IiBpdGVtLgorICoKKyAqIFRoYXQgaXMsIHRoaXMgaXMgdmVy eSBzaW1pbGFyIHRvIHdoYXQgaGFwcGVucyB3aXRob3V0IGJhdGNoaW5nLCBleGNlcHQgdGhh dAorICogdGhlIGtpbGxlZCBpdGVtcyBhcmUgYWNjdW11bGF0ZWQgaW4gaW5kZXhhbS5jLCBu b3QgaW4gdGhlIEFNLgorICovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBiYXRjaGVz IChsZWFmIHBhZ2VzKSB3ZSBjYW4ga2VlcCBpbiBtZW1vcnkuCisgKgorICogVGhlIHZhbHVl IDY0IHZhbHVlIGlzIGFyYml0cmFyeSwgaXQncyBhYm91dCAxTUIgb2YgZGF0YSB3aXRoIDhL QiBwYWdlcy4gV2UKKyAqIHNob3VsZCBub3QgcmVhbGx5IG5lZWQgdGhpcyBtYW55IGJhdGNo ZXMgLSB3ZSBuZWVkIGEgY2VydGFpbiBudW1iZXIgb2YgVElEcywKKyAqIHRvIHNhdGlzZnkg dGhlIHByZWZldGNoIGRpc3RhbmNlLCBhbmQgdGhlcmUgdXN1YWxseSBhcmUgbWFueSBpbmRl eCB0dXBsZXMKKyAqIHBlciBwYWdlLiBJbiB0aGUgd29yc3QgY2FzZSB3ZSBtaWdodCBoYXZl IG9uZSBpbmRleCB0dXBsZSBwZXIgbGVhZiBwYWdlLAorICogYnV0IGV2ZW4gdGhhdCBtYXkg bm90IHF1aXRlIHdvcmsgaW4gc29tZSBjYXNlcy4KKyAqCisgKiBCdXQgdGhlcmUgbWF5IGJl IGNhc2VzIHdoZW4gdGhpcyBkb2VzIG5vdCB3b3JrIC0gc29tZSBleGFtcGxlczoKKyAqCisg KiBhKSB0aGUgaW5kZXggbWF5IGJlIGJsb2F0ZWQsIHdpdGggbWFueSBwYWdlcyBvbmx5IGhh dmUgYSBzaW5nbGUgaW5kZXggaXRlbQorICoKKyAqIGIpIHRoZSBpbmRleCBpcyBjb3JyZWxh dGVkLCBhbmQgd2Ugc2tpcCBwcmVmZXRjaGVzIG9mIGR1cGxpY2F0ZSBibG9ja3MKKyAqCisg KiBjKSB3ZSBtYXkgYmUgZG9pbmcgaW5kZXgtb25seSBzY2FuLCBhbmQgd2UgZG9uJ3QgcHJl ZmV0Y2ggYWxsLXZpc2libGUgcGFnZXMKKyAqCisgKiBTbyB3ZSBtaWdodCBuZWVkIHRvIGxv YWQgaHVnZSBudW1iZXIgb2YgYmF0Y2hlcyBiZWZvcmUgd2UgZmluZCB0aGUgZmlyc3QKKyAq IGJsb2NrIHRvIGxvYWQgZnJvbSB0aGUgdGFibGUuIE9yIGVub3VnaCBwYWdlcyB0byBzYXRp c2Z5IHRoZSBwcmVmZXRjaAorICogZGlzdGFuY2UuCisgKgorICogWFhYIEN1cnJlbnRseSwg b25jZSB3ZSBoaXQgdGhpcyBudW1iZXIgb2YgYmF0Y2hlcywgd2UgZmFpbCBpbiB0aGUgc3Ry ZWFtCisgKiBjYWxsYmFjayAob3IgcmF0aGVyIGluIGluZGV4X2JhdGNoX2dldG5leHQpLCBi ZWNhdXNlIHRoYXQncyB3aGVyZSB3ZSBsb2FkCisgKiBiYXRjaGVzLiBJdCdkIGJlIG5pY2Ug dG8gInBhdXNlIiB0aGUgcmVhZCBzdHJlYW0gZm9yIGEgYml0IGluc3RlYWQsIGJ1dAorICog dGhlcmUncyBubyBidWlsdC1pbiB3YXkgdG8gZG8gdGhhdC4gU28gd2UgY2FuIG9ubHkgInN0 b3AiIHRoZSBzdHJlYW0gYnkKKyAqIHJldHVybmluZyBJbnZhbGlkQmxvY2tOdW1iZXIuIEJ1 dCB3ZSBjb3VsZCBhbHNvIHJlbWVtYmVyIHRoaXMsIGFuZCBkbworICogcmVhZF9zdHJlYW1f cmVzZXQoKSB0byBjb250aW51ZSwgYWZ0ZXIgY29uc3VtaW5nIGFsbCB0aGUgYWxyZWFkeSBz Y2hlZHVsZWQKKyAqIGJsb2Nrcy4KKyAqCisgKiBYWFggTWF5YmUgNjQgaXMgdG9vIGhpZ2gg LSBpdCBhbHNvIGRlZmluZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJoZWFkCisgKiBh bGxvd2VkLiBJbiB0aGUgd29yc3QgY2FzZSwgcmVhZGluZyBhIHNpbmdsZSByb3cgbWlnaHQg dHJpZ2dlciByZWFkaW5nIHRoaXMKKyAqIG1hbnkgbGVhZiBwYWdlcyAoZS5nLiB3aXRoIElP UykuIFdoaWNoIG1pZ2h0IGJlIGFuIGlzc3VlIHdpdGggTElNSVQgcXVlcmllcywKKyAqIHdo ZW4gd2UgYWN0dWFsbHkgd29uJ3QgbmVlZCBtb3N0IG9mIHRoZSBsZWFmIHBhZ2VzLgorICoK KyAqIFhYWCBXZSBjb3VsZC9zaG91bGQgdXNlIGEgbG93ZXIgdmFsdWUgZm9yIHRlc3Rpbmcs IHRvIG1ha2UgaXQgbW9yZSBsaWtlbHkKKyAqIHdlIGhpdCB0aGlzIGlzc3VlLiBXaXRoIDY0 IHRoZSB3aG9sZSBjaGVjay13b3JsZCBwYXNzZXMgd2l0aG91dCBoaXR0aW5nCisgKiB0aGUg bGltaXQsIHdvIHdlIHdvdWxkbid0IHRlc3QgaXQncyBoYW5kbGVkIGNvcnJlY3RseS4KKyAq LworI2RlZmluZSBJTkRFWF9TQ0FOX01BWF9CQVRDSEVTCTY0CisKKyNkZWZpbmUgSU5ERVhf U0NBTl9CQVRDSF9DT1VOVChzY2FuKSBcCisJKChzY2FuKS0+eHNfYmF0Y2hlcy0+bmV4dEJh dGNoIC0gKHNjYW4pLT54c19iYXRjaGVzLT5maXJzdEJhdGNoKQorCisjZGVmaW5lIElOREVY X1NDQU5fQkFUQ0hfTE9BREVEKHNjYW4sIGlkeCkgXAorCSgoaWR4KSA8IChzY2FuKS0+eHNf YmF0Y2hlcy0+bmV4dEJhdGNoKQorCisjZGVmaW5lIElOREVYX1NDQU5fQkFUQ0hfRlVMTChz Y2FuKSBcCisJKElOREVYX1NDQU5fQkFUQ0hfQ09VTlQoc2NhbikgPT0gc2Nhbi0+eHNfYmF0 Y2hlcy0+bWF4QmF0Y2hlcykKKworLyoKKyAqIENoZWNrIHRoYXQgYSBwb3NpdGlvbiAoYmF0 Y2gsaXRlbSkgaXMgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXRjaGVzIHdlCisgKiBo YXZlIGN1cnJlbnRseSBsb2FkZWQuCisgKgorICogWFhYIFRoZSAibWFya2VkIiBiYXRjaCBp cyBhbiBleGNlcHRpb24uIFRoZSBtYXJrZWQgYmF0Y2ggbWF5IGdldCBvdXRzaWRlCisgKiB0 aGUgcmFuZ2Ugb2YgY3VycmVudCBiYXRjaGVzLCBzbyBtYWtlIHN1cmUgdG8gbmV2ZXIgY2hl Y2sgdGhlIHBvc2l0aW9uCisgKiBmb3IgdGhhdC4KKyAqLworc3RhdGljIHZvaWQKK0Fzc2Vy dENoZWNrQmF0Y2hQb3NWYWxpZChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNo UG9zICpwb3MpCit7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCUluZGV4U2NhbkJh dGNoZXMgKmJhdGNoID0gc2Nhbi0+eHNfYmF0Y2hlczsKKworCS8qIG1ha2Ugc3VyZSB0aGUg cG9zaXRpb24gaXMgdmFsaWQgZm9yIGN1cnJlbnRseSBsb2FkZWQgYmF0Y2hlcyAqLworCUFz c2VydChwb3MtPmJhdGNoID49IGJhdGNoLT5maXJzdEJhdGNoKTsKKwlBc3NlcnQocG9zLT5i YXRjaCA8IGJhdGNoLT5uZXh0QmF0Y2gpOworI2VuZGlmCit9CisKKy8qCisgKiBDaGVjayBh IHNpbmdsZSBiYXRjaCBpcyB2YWxpZC4KKyAqLworc3RhdGljIHZvaWQKK0Fzc2VydENoZWNr QmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCkKK3sKKyNp ZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJLyogdGhlcmUgbXVzdCBiZSB2YWxpZCByYW5n ZSBvZiBpdGVtcyAqLworCUFzc2VydChiYXRjaC0+Zmlyc3RJdGVtIDw9IGJhdGNoLT5sYXN0 SXRlbSk7CisJQXNzZXJ0KGJhdGNoLT5maXJzdEl0ZW0gPj0gMCk7CisJQXNzZXJ0KGJhdGNo LT5sYXN0SXRlbSA8PSBNYXhUSURzUGVyQlRyZWVQYWdlKTsgLyogWFhYIHRpZWQgdG8gQlRS RUUgKi8KKworCS8qIHdlIHNob3VsZCBoYXZlIGl0ZW1zIChidWZmZXIgYW5kIHBvaW50ZXJz KSAqLworCUFzc2VydChiYXRjaC0+aXRlbXMgIT0gTlVMTCk7CisJLy8gQXNzZXJ0KGJhdGNo LT5jdXJyVHVwbGVzICE9IE5VTEwpOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIGtpbGxl ZCBpdGVtcyBtdXN0IGJlIHZhbGlkLCBhbmQgdGhlcmUgbXVzdCBiZSBhbiBhcnJheSBvZgor CSAqIGluZGV4ZXMgaWYgdGhlcmUgYXJlIGl0ZW1zLgorCSAqLworCUFzc2VydChiYXRjaC0+ bnVtS2lsbGVkID49IDApOworCUFzc2VydChiYXRjaC0+bnVtS2lsbGVkIDw9IE1heFRJRHNQ ZXJCVHJlZVBhZ2UpOwkvKiBYWFggdGllZCB0byBCVFJFRSAqLworCUFzc2VydCghKChiYXRj aC0+bnVtS2lsbGVkID4gMCkgJiYgKGJhdGNoLT5raWxsZWRJdGVtcyA9PSBOVUxMKSkpOwor CisJLyogWFhYIGNhbiB3ZSBjaGVjayBzb21lIG9mIHRoZSBvdGhlciBiYXRjaCBmaWVsZHM/ ICovCisjZW5kaWYKK30KKworLyoKKyAqIENoZWNrIGludmFyaWFudHMgb24gY3VycmVudCBi YXRjaGVzCisgKgorICogTWFrZXMgc3VyZSB0aGUgaW5kZXhlcyBhcmUgc2V0IGFzIGV4cGVj dGVkLCB0aGUgYnVmZmVyIHNpemUgaXMgd2l0aGluCisgKiBsaW1pdHMsIGFuZCBzbyBvbi4K KyAqLworc3RhdGljIHZvaWQKK0Fzc2VydENoZWNrQmF0Y2hlcyhJbmRleFNjYW5EZXNjIHNj YW4pCit7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCUluZGV4U2NhbkJhdGNoZXMg KmJhdGNoZXMgPSBzY2FuLT54c19iYXRjaGVzOworCisJLyogd2Ugc2hvdWxkIGhhdmUgYmF0 Y2hlcyBpbml0aWFsaXplZCAqLworCUFzc2VydChiYXRjaGVzICE9IE5VTEwpOworCisJLyog V2Ugc2hvdWxkIG5vdCBoYXZlIHRvbyBtYW55IGJhdGNoZXMuICovCisJQXNzZXJ0KChiYXRj aGVzLT5tYXhCYXRjaGVzID4gMCkgJiYKKwkJICAgKGJhdGNoZXMtPm1heEJhdGNoZXMgPD0g SU5ERVhfU0NBTl9NQVhfQkFUQ0hFUykpOworCisJLyoKKwkgKiBUaGUgZmlyc3QvbmV4dCBp bmRleGVzIHNob3VsZCBkZWZpbmUgYSB2YWxpZCByYW5nZSAoaW4gdGhlIGN5Y2xpYworCSAq IGJ1ZmZlciwgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cgbWF4QmF0Y2hlcy4KKwkgKi8KKwlB c3NlcnQoKGJhdGNoZXMtPmZpcnN0QmF0Y2ggPj0gMCkgJiYKKwkJICAgKGJhdGNoZXMtPmZp cnN0QmF0Y2ggPD0gYmF0Y2hlcy0+bmV4dEJhdGNoKSk7CisJQXNzZXJ0KChiYXRjaGVzLT5u ZXh0QmF0Y2ggLSBiYXRjaGVzLT5maXJzdEJhdGNoKSA8PSBiYXRjaGVzLT5tYXhCYXRjaGVz KTsKKworCS8qIENoZWNrIGFsbCBjdXJyZW50IGJhdGNoZXMgKi8KKwlmb3IgKGludCBpID0g YmF0Y2hlcy0+Zmlyc3RCYXRjaDsgaSA8IGJhdGNoZXMtPm5leHRCYXRjaDsgaSsrKQorCXsK KwkJSW5kZXhTY2FuQmF0Y2ggYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGkpOwor CisJCUFzc2VydENoZWNrQmF0Y2goc2NhbiwgYmF0Y2gpOworCX0KKyNlbmRpZgorfQorCisv KiBkZWJ1ZzogcHJpbnQgaW5mbyBhYm91dCBjdXJyZW50IGJhdGNoZXMgKi8KK3N0YXRpYyB2 b2lkCitpbmRleF9iYXRjaF9wcmludChjb25zdCBjaGFyICpsYWJlbCwgSW5kZXhTY2FuRGVz YyBzY2FuKQoreworI2lmZGVmIElOREVYQU1fREVCVUcKKwlJbmRleFNjYW5CYXRjaGVzICpi YXRjaGVzID0gc2Nhbi0+eHNfYmF0Y2hlczsKKworCWlmICghc2Nhbi0+eHNfYmF0Y2hlcykK KwkJcmV0dXJuOworCisJREVCVUdfTE9HKCIlczogYmF0Y2hlcyBmaXJzdEJhdGNoICVkIG5l eHRCYXRjaCAlZCBtYXhCYXRjaGVzICVkIiwKKwkJCSAgbGFiZWwsCisJCQkgIGJhdGNoZXMt PmZpcnN0QmF0Y2gsIGJhdGNoZXMtPm5leHRCYXRjaCwgYmF0Y2hlcy0+bWF4QmF0Y2hlcyk7 CisKKwlmb3IgKGludCBpID0gYmF0Y2hlcy0+Zmlyc3RCYXRjaDsgaSA8IGJhdGNoZXMtPm5l eHRCYXRjaDsgaSsrKQorCXsKKwkJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IElOREVY X1NDQU5fQkFUQ0goc2NhbiwgaSk7CisKKwkJREVCVUdfTE9HKCIlczogYmF0Y2ggJWQgJXAg Zmlyc3QgJWQgbGFzdCAlZCBpdGVtICVkIGtpbGxlZCAlZCIsCisJCQkJICBsYWJlbCwgaSwg YmF0Y2gsIGJhdGNoLT5maXJzdEl0ZW0sIGJhdGNoLT5sYXN0SXRlbSwKKwkJCQkgIGJhdGNo LT5pdGVtSW5kZXgsIGJhdGNoLT5udW1LaWxsZWQpOworCX0KKyNlbmRpZgorfQorCisvKgor ICogaW5kZXhfYmF0Y2hfcG9zX2FkdmFuY2UKKyAqCQlBZHZhbmNlIHRoZSBwb3NpdGlvbiB0 byB0aGUgbmV4dCBpdGVtLCBkZXBlbmRpbmcgb24gc2NhbiBkaXJlY3Rpb24uCisgKgorICog QWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhlIG5leHQgaXRlbSwgZWl0aGVyIGluIHRoZSBz YW1lIGJhdGNoIG9yIHRoZQorICogZm9sbG93aW5nIG9uZSAoaWYgYWxyZWFkeSBhdmFpbGFi bGUpLgorICoKKyAqIFdlIGNhbiBhZHZhbmNlIG9ubHkgaWYgd2UgYWxyZWFkeSBoYXZlIHNv bWUgYmF0Y2hlcyBsb2FkZWQsIGFuZCB0aGVyZSdzCisgKiBlaXRoZXIgZW5vdWdoIGl0ZW1z IGluIHRoZSBjdXJyZW50IGJhdGNoLCBvciBzb21lIG1vcmUgaXRlbXMgaW4gdGhlCisgKiBz dWJzZXF1ZW50IGJhdGNoZXMuCisgKgorICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYWR2YW5j ZSwgcmlnaHQgYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgYmF0Y2gsIHRoZQorICogcG9zaXRp b24gaXMgc3RpbGwgYmUgdW5kZWZpbmVkLiBPdGhlcndpc2Ugd2UgZXhwZWN0IHRoZSBwb3Np dGlvbiB0byBiZQorICogdmFsaWQuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb3Np dGlvbiB3YXMgYWR2YW5jZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBUaGUgcG9pc2l0 aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSBhZnRlciBhbiBhZHZhbmNlLgor ICovCitzdGF0aWMgYm9vbAoraW5kZXhfYmF0Y2hfcG9zX2FkdmFuY2UoSW5kZXhTY2FuRGVz YyBzY2FuLCBJbmRleFNjYW5CYXRjaFBvcyAqcG9zKQoreworCUluZGV4U2NhbkJhdGNoRGF0 YSAqYmF0Y2g7CisJU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBzY2FuLT54c19iYXRjaGVz LT5kaXJlY3Rpb247CisKKwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBiYXRjaGluZyBpbml0aWFs aXplZCBhbmQgY29uc2lzdGVudCAqLworCUFzc2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKKwor CS8qIHNob3VsZCBrbm93IGRpcmVjdGlvbiBieSBub3cgKi8KKwlBc3NlcnQoZGlyZWN0aW9u ICE9IE5vTW92ZW1lbnRTY2FuRGlyZWN0aW9uKTsKKworCS8qIFdlIGNhbid0IGFkdmFuY2Ug aWYgdGhlcmUgYXJlIG5vIGJhdGNoZXMgYXZhaWxhYmxlLiAqLworCWlmIChJTkRFWF9TQ0FO X0JBVENIX0NPVU5UKHNjYW4pID09IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICog SWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgYmVlbiBhZHZhbmNlZCB5ZXQsIGl0IGhhcyB0byBi ZSByaWdodCBhZnRlciB3ZQorCSAqIGxvYWRlZCB0aGUgZmlyc3QgYmF0Y2guIEluIHRoYXQg Y2FzZSBqdXN0IGluaXRpYWxpemUgaXQgdG8gdGhlIGZpcnN0CisJICogaXRlbSBpbiB0aGUg YmF0Y2ggKG9yIGxhc3QgaXRlbSwgaWYgaXQncyBiYWNrd2FyZHMgc2NhYSkuCisJICoKKwkg KiBYWFggTWF5YmUgd2Ugc2hvdWxkIGp1c3QgZXhwbGljaXRseSBpbml0aWFsaXplIHRoZSBw b3N0aXRpb24gYWZ0ZXIKKwkgKiBsb2FkaW5nIHRoZSBmaXJzdCBiYXRjaCwgd2l0aG91dCBo YXZpbmcgdG8gZ28gdGhyb3VnaCB0aGUgYWR2YW5jZS4KKwkgKgorCSAqIFhYWCBBZGQgYSBt YWNybyBJTkRFWF9TQ0FOX1BPU19ERUZJTkVEKCkgb3Igc29tZXRoaW5nIGxpa2UgdGhpcywg dG8KKwkgKiBtYWtlIHRoaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCisJICovCisJaWYgKChw b3MtPmJhdGNoID09IC0xKSAmJiAocG9zLT5pbmRleCA9PSAtMSkpCisJeworCQkvKgorCQkg KiB3ZSBzaG91bGQgaGF2ZSBsb2FkZWQgdGhlIHZlcnkgZmlyc3QgYmF0Y2gKKwkJICoKKwkJ ICogWFhYIEFjdHVhbGx5LCB3ZSBtaWdodCBoYXZlIGNoYW5nZWQgdGhlIGRpcmVjdGlvbiBv ZiB0aGUgc2NhbiwKKwkJICogYW5kIHNjYW5uZWQgYWxsIHRoZSB3YXkgdG8gdGhlIGJlZ2lu bmluZy9lbmQuIFdlIHJlc2V0IHRoZQorCQkgKiBwb3NpdGlvbiwgYnV0IHdlJ3JlIG5vdCBv biB0aGUgZmlyc3QgYmF0Y2ggLSB3ZSBzaG91bGQgaGF2ZQorCQkgKiBvbmx5IG9uZSBiYXRj aCwgdGhvdWdoLgorCQkgKi8KKwkJLy8gQXNzZXJ0KHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0 QmF0Y2ggPT0gMCk7CisKKwkJYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIHNjYW4t PnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2gpOworCQlBc3NlcnQoYmF0Y2ggIT0gTlVMTCk7CisK KwkJcG9zLT5iYXRjaCA9IHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2g7CisKKwkJaWYg KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyZWN0aW9uKSkKKwkJCXBvcy0+aW5kZXggPSBi YXRjaC0+Zmlyc3RJdGVtOworCQllbHNlCisJCQlwb3MtPmluZGV4ID0gYmF0Y2gtPmxhc3RJ dGVtOworCisJCS8qIHRoZSBwb3NpdGlvbiB3ZSBqdXN0IHNldCBoYXMgdG8gYmUgdmFsaWQg Ki8KKwkJQXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBvcyk7CisKKwkJcmV0dXJu IHRydWU7CisJfQorCisJLyoKKwkgKiBUaGUgcG9zaXRpb24gaXMgYWxyZWFkeSBkZWZpbmVk LCBzbyB3ZSBzaG91bGQgaGF2ZSBzb21lIGJhdGNoZXMgbG9hZGVkCisJICogYW5kIHRoZSBw b3NpdGlvbiBoYXMgdG8gYmUgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRob3NlLgorCSAqLwor CUFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChzY2FuLCBwb3MpOworCisJLyoKKwkgKiBBZHZh bmNlIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHNhbWUgYmF0Y2guIElmIHRoZSBwb3NpdGlv biBpcyBmb3IgdGhlCisJICogbGFzdCBpdGVtIGluIHRoZSBiYXRjaCwgdHJ5IGFkdmFuY2lu ZyB0byB0aGUgbmV4dCBiYXRjaCAoaWYgbG9hZGVkKS4KKwkgKi8KKwliYXRjaCA9IElOREVY X1NDQU5fQkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisKKwlpZiAoU2NhbkRpcmVjdGlvbklz Rm9yd2FyZChkaXJlY3Rpb24pKQorCXsKKwkJaWYgKHBvcy0+aW5kZXggPCBiYXRjaC0+bGFz dEl0ZW0pCisJCXsKKwkJCXBvcy0+aW5kZXgrKzsKKworCQkJLyogdGhlIHBvc2l0aW9uIGhh cyB0byBiZSB2YWxpZCAqLworCQkJQXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBv cyk7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWVsc2UJCQkJCQkvKiBTY2FuRGly ZWN0aW9uSXNCYWNrd2FyZCAqLworCXsKKwkJaWYgKHBvcy0+aW5kZXggPiBiYXRjaC0+Zmly c3RJdGVtKQorCQl7CisJCQlwb3MtPmluZGV4LS07CisKKwkJCS8qIHRoZSBwb3NpdGlvbiBo YXMgdG8gYmUgdmFsaWQgKi8KKwkJCUFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChzY2FuLCBw b3MpOworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCS8qCisJICogV2UgY291bGRu J3QgYWR2YW5jZSB3aXRoaW4gdGhlIHNhbWUgYmF0Y2gsIHRyeSBhZHZhbmNpbmcgdG8gdGhl IG5leHQKKwkgKiBiYXRjaCwgaWYgaXQncyBhbHJlYWR5IGxvYWRlZC4KKwkgKi8KKwlpZiAo SU5ERVhfU0NBTl9CQVRDSF9MT0FERUQoc2NhbiwgcG9zLT5iYXRjaCArIDEpKQorCXsKKwkJ LyogYWR2YW5jZSB0byB0aGUgbmV4dCBiYXRjaCAqLworCQlwb3MtPmJhdGNoKys7CisKKwkJ YmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIHBvcy0+YmF0Y2gpOworCQlBc3NlcnQo YmF0Y2ggIT0gTlVMTCk7CisKKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyZWN0 aW9uKSkKKwkJCXBvcy0+aW5kZXggPSBiYXRjaC0+Zmlyc3RJdGVtOworCQllbHNlCisJCQlw b3MtPmluZGV4ID0gYmF0Y2gtPmxhc3RJdGVtOworCisJCS8qIHRoZSBwb3NpdGlvbiBoYXMg dG8gYmUgdmFsaWQgKi8KKwkJQXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBvcyk7 CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogY2FuJ3QgYWR2YW5jZSAqLworCXJldHVy biBmYWxzZTsKK30KKworLyoKKyAqIGluZGV4X2JhdGNoX3Bvc19yZXNldAorICoJCVJlc2V0 IHRoZSBwb3NpdGlvbiwgc28gdGhhdCBpdCBsb29rcyBhcyBpZiBuZXZlciBhZHZhbmNlZC4K KyAqLworc3RhdGljIHZvaWQKK2luZGV4X2JhdGNoX3Bvc19yZXNldChJbmRleFNjYW5EZXNj IHNjYW4sIEluZGV4U2NhbkJhdGNoUG9zICpwb3MpCit7CisJcG9zLT5iYXRjaCA9IC0xOwor CXBvcy0+aW5kZXggPSAtMTsKK30KKworLyoKKyAqIGluZGV4X3NjYW5fc3RyZWFtX3JlYWRf bmV4dAorICoJCXJldHVybiB0aGUgbmV4dCBibG9jayB0byBwYXNzIHRvIHRoZSByZWFkIHN0 cmVhbQorICoKKyAqIFRoaXMgYXNzdW1lcyB0aGUgImN1cnJlbnQiIHNjYW4gZGlyZWN0aW9u LCByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlci4gSWYKKyAqIHRoYXQgY2hhbmdlcyBiZWZvcmUg Y29uc3VtaW5nIGFsbCBidWZmZXJzLCB3ZSdsbCByZXNldCB0aGUgc3RyZWFtIGFuZAorICog c3RhcnQgZnJvbSBzY3JhdGNoLiBXaGljaCBtYXkgc2VlbSBpbmVmZmljaWVudCwgYnV0IGl0 J3Mgbm8gd29yc2UgdGhhbgorICogd2hhdCB3ZSBkbyBub3csIGFuZCBpdCdzIG5vdCBhIHZl cnkgY29tbW9uIGNhc2UuCisgKgorICogVGhlIHBvc2l0aW9uIG9mIHRoZSByZWFkX3N0cmVh bSBpcyBzdG9yZWQgaW4gc3RyZWFtUG9zLCB3aGljaCBtYXkgYmUKKyAqIGFoZWFkIG9mIHRo ZSBjdXJyZW50IHJlYWRQb3MgKHdoaWNoIGlzIHdoYXQgZ290IGNvbnN1bWVkIGJ5IHRoZSBz Y2FuKS4KKyAqCisgKiBUaGUgc2NhbiBkaXJlY3Rpb24gY2hhbmdlIGlzIGNoZWNrZWQgLyBo YW5kbGVkIGVsc2V3aGVyZS4gSGVyZSB3ZSByZWx5CisgKiBvbiBoYXZpbmcgdGhlIGNvcnJl Y3QgdmFsdWUgaW4geHNfYmF0Y2hlcy0+ZGlyZWN0aW9uLgorICovCitzdGF0aWMgQmxvY2tO dW1iZXIKK2luZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dChSZWFkU3RyZWFtICpzdHJlYW0s CisJCQkJCQkJdm9pZCAqY2FsbGJhY2tfcHJpdmF0ZV9kYXRhLAorCQkJCQkJCXZvaWQgKnBl cl9idWZmZXJfZGF0YSkKK3sKKwlJbmRleFNjYW5EZXNjIHNjYW4gPSAoSW5kZXhTY2FuRGVz YykgY2FsbGJhY2tfcHJpdmF0ZV9kYXRhOworCUluZGV4U2NhbkJhdGNoUG9zICpwb3MgPSAm c2Nhbi0+eHNfYmF0Y2hlcy0+c3RyZWFtUG9zOworCisJLyogd2Ugc2hvdWxkIGhhdmUgc2V0 IHRoZSBkaXJlY3Rpb24gYWxyZWFkeSAqLworCUFzc2VydChzY2FuLT54c19iYXRjaGVzLT5k aXJlY3Rpb24gIT0gTm9Nb3ZlbWVudFNjYW5EaXJlY3Rpb24pOworCisJLyoKKwkgKiBUaGUg cmVhZCBwb3NpdGlvbiBoYXMgdG8gYmUgdmFsaWQsIGJlY2F1c2Ugd2UgaW5pdGlhbGl6ZS9h ZHZhbmNlIGl0CisJICogYmVmb3JlIG1heWJlIGV2ZW4gYXR0ZW1wdGluZyB0byByZWFkIHRo ZSBoZWFwIHR1cGxlLiBBbmQgaXQgbGFncyBiZWhpbmQKKwkgKiB0aGUgc3RyZWFtIHBvc2l0 aW9uLCBzbyBpdCBjYW4ndCBiZSBpbnZhbGlkIHlldC4gSWYgdGhpcyBpcyB0aGUgZmlyc3QK KwkgKiB0aW1lIGZvciB0aGlzIGNhbGxiYWNrLCB3ZSB3aWxsIHVzZSB0aGUgcmVhZFBvcyB0 byBpbml0IHN0cmVhbVBvcywgc28KKwkgKiBiZXR0ZXIgY2hlY2sgaXQncyB2YWxpZC4KKwkg Ki8KKwlBc3NlcnRDaGVja0JhdGNoUG9zVmFsaWQoc2NhbiwgJnNjYW4tPnhzX2JhdGNoZXMt PnJlYWRQb3MpOworCisJLyoKKwkgKiBUcnkgdG8gYWR2YW5jZSB0byB0aGUgbmV4dCBpdGVt LCBhbmQgaWYgdGhlcmUncyBub25lIGluIHRoZSBjdXJyZW50CisJICogYmF0Y2gsIHRyeSBs b2FkaW5nIHRoZSBuZXh0IGJhdGNoLgorCSAqCisJICogWFhYIFRoaXMgbG9vcCBzaG91bGRu J3QgaGFwcGVuIG1vcmUgdGhhbiB0d2ljZSwgYmVjYXVzZSBpZiB3ZSBmYWlsIHRvCisJICog YWR2YW5jZSB0aGUgcG9zaXRpb24sIHdlJ2xsIHRyeSB0byBsb2FkIHRoZSBuZXh0IGJhdGNo IGFuZCB0aGVuIGluIHRoZQorCSAqIG5leHQgbG9vcCB0aGUgYWR2YW5jZSBoYXMgdG8gc3Vj Y2VlZC4KKwkgKi8KKwl3aGlsZSAodHJ1ZSkKKwl7CisJCWJvb2wJCWFkdmFuY2VkID0gZmFs c2U7CisKKwkJLyoKKwkJICogSWYgdGhlIHN0cmVhbSBwb3NpdGlvbiBpcyB1bmRlZmluZWQs IGp1c3QgdXNlIHRoZSByZWFkIHBvc2l0aW9uLgorCQkgKgorCQkgKiBJdCdzIHBvc3NpYmxl IHdlIGdvdCBoZXJlIG9ubHkgZmFpcmx5IGxhdGUgaW4gdGhlIHNjYW4sIGUuZy4gaWYKKwkJ ICogbWFueSB0dXBsZXMgZ290IHNraXBwZWQgaW4gdGhlIGluZGV4LW9ubHkgc2NhbiwgZXRj LiBJbiB0aGlzIGNhc2UKKwkJICoganVzdCB1c2UgdGhlIHJlYWQgcG9zaXRpb24gYXMgYSBz dGFydGluZyBwb2ludC4KKwkJICoKKwkJICogVGhlIGZpcnN0IGJhdGNoIGlzIGxvYWRlZCBm cm9tIGluZGV4X2JhdGNoX2dldG5leHRfdGlkKCksIGJlY2F1c2UKKwkJICogd2UgZG9uJ3Qg Z2V0IGhlcmUgdW50aWwgdGhlIGZpcnN0IGluZGV4X2ZldGNoX2hlYXAoKSBjYWxsIC0gb25s eQorCQkgKiB0aGVuIGNhbiByZWFkX3N0cmVhbSBzdGFydCBsb2FkaW5nIG1vcmUgYmF0Y2hl cy4gSXQncyBhbHNvIHBvc3NpYmxlCisJCSAqIHRvIGRpc2FibGUgcHJlZmV0Y2hpbmcgKGVm ZmVjdGl2ZV9pb19jb25jdXJyZW5jeT0wKSwgaW4gd2hpY2ggY2FzZQorCQkgKiBhbGwgYmF0 Y2hlcyBnZXQgbG9hZGVkIGluIGluZGV4X2JhdGNoX2dldG5leHRfdGlkLgorCQkgKi8KKwkJ aWYgKChwb3MtPmJhdGNoID09IC0xKSAmJiAocG9zLT5pbmRleCA9PSAtMSkpCisJCXsKKwkJ CSpwb3MgPSBzY2FuLT54c19iYXRjaGVzLT5yZWFkUG9zOworCQkJYWR2YW5jZWQgPSB0cnVl OworCQl9CisJCWVsc2UgaWYgKGluZGV4X2JhdGNoX3Bvc19hZHZhbmNlKHNjYW4sIHBvcykp CisJCXsKKwkJCWFkdmFuY2VkID0gdHJ1ZTsKKwkJfQorCisJCS8qIEZJWE1FIG1heWJlIGNo ZWNrIHRoZSBzdHJlYW1Qb3MgaXMgbm90IGJlaGluZCByZWFkUG9zPyAqLworCisJCS8qIElm IHdlIGFkdmFuY2VkIHRoZSBwb3NpdGlvbiwgcmV0dXJuIHRoZSBibG9jayBmb3IgdGhlIFRJ RC4gKi8KKwkJaWYgKGFkdmFuY2VkKQorCQl7CisJCQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9 IElOREVYX1NDQU5fQkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisJCQlJdGVtUG9pbnRlciB0 aWQgPSAmYmF0Y2gtPml0ZW1zW3Bvcy0+aW5kZXhdLmhlYXBUaWQ7CisKKwkJCURFQlVHX0xP RygiaW5kZXhfc2Nhbl9zdHJlYW1fcmVhZF9uZXh0OiBpbmRleCAlZCBUSUQgKCV1LCV1KSIs CisJCQkJCSAgcG9zLT5pbmRleCwKKwkJCQkJICBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVy KHRpZCksCisJCQkJCSAgSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIodGlkKSk7CisKKwkJ CS8qCisJCQkgKiBpZiB0aGVyZSdzIGEgcHJlZmV0Y2ggY2FsbGJhY2ssIHVzZSBpdCB0byBk ZWNpZGUgaWYgd2Ugd2lsbAorCQkJICogbmVlZCB0byByZWFkIHRoZSBibG9jaworCQkJICov CisJCQlpZiAoc2Nhbi0+eHNfYmF0Y2hlcy0+cHJlZmV0Y2hDYWxsYmFjayAmJgorCQkJCSFz Y2FuLT54c19iYXRjaGVzLT5wcmVmZXRjaENhbGxiYWNrKHNjYW4sIHNjYW4tPnhzX2JhdGNo ZXMtPnByZWZldGNoQXJndW1lbnQsIHBvcykpCisJCQl7CisJCQkJREVCVUdfTE9HKCJpbmRl eF9zY2FuX3N0cmVhbV9yZWFkX25leHQ6IHNraXAgYmxvY2sgKGNhbGxiYWNrKSIpOworCQkJ CWNvbnRpbnVlOworCQkJfQorCisJCQlyZXR1cm4gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJl cih0aWQpOworCQl9CisKKwkJLyoKKwkJICogQ291bGRuJ3QgYWR2YW5jZSB0aGUgcG9zaXRp b24sIHNvIGVpdGhlciB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyBpbgorCQkgKiB0aGUgY3Vy cmVudCBiYXRjaCwgb3IgbWF5YmUgd2UgZG9uJ3QgaGF2ZSBhbnkgYmF0Y2hlcyB5ZXQgKGlm IGlzCisJCSAqIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gpLiBUcnkgbG9hZGluZyB0aGUgbmV4 dCBiYXRjaCAtIGlmIHRoYXQKKwkJICogc3VjY2VlZHMsIHRyeSB0aGUgYWR2YW5jZSBhZ2Fp biAoYW5kIHRoaXMgdGltZSB0aGUgYWR2YW5jZSBzaG91bGQKKwkJICogd29yaykuCisJCSAq CisJCSAqIElmIHdlIGZhaWwgdG8gbG9hZCB0aGUgbmV4dCBiYXRjaCwgd2UncmUgZG9uZS4K KwkJICovCisJCWlmICghaW5kZXhfYmF0Y2hfZ2V0bmV4dChzY2FuKSkKKwkJCWJyZWFrOwor CX0KKworCS8qIG5vIG1vcmUgaXRlbXMgaW4gdGhpcyBzY2FuICovCisJcmV0dXJuIEludmFs aWRCbG9ja051bWJlcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLQorICoJCWluZGV4X2Jh dGNoX2dldG5leHQgLSBnZXQgdGhlIG5leHQgYmF0Y2ggb2YgVElEcyBmcm9tIGEgc2Nhbgor ICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB3ZSBtYW5hZ2VkIHRvIHJlYWQgYXQgbGVhc3Qgc29t ZSBUSURzIGludG8gdGhlIGJhdGNoLCBvcgorICogZmFsc2UgaWYgdGhlcmUgYXJlIG5vIG1v cmUgVElEcyBpbiB0aGUgc2Nhbi4gVGhlIGJhdGNoIGxvYWQgbWF5IGZhaWwgZm9yCisgKiBt dWx0aXBsZSByZWFzb25zIC0gdGhlcmUgcmVhbGx5IG1heSBub3QgYmUgbW9yZSBiYXRjaGVz IGluIHRoZSBzY2FuLCBvcgorICogbWF5YmUgd2UgcmVhY2hlZCBJTkRFWF9TQ0FOX01BWF9C QVRDSEVTLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmF0Y2ggd2FzIGxvYWRlZCBz dWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBYWFggVGhpcyBvbmx5IGxv YWRzIHRoZSBUSURzIGFuZCByZXNldHMgdGhlIHZhcmlvdXMgYmF0Y2ggZmllbGRzIHRvCisg KiBmcmVzaCBzdGF0ZS4gSXQgZG9lcyBub3Qgc2V0IHhzX2hlYXB0aWQveHNfaXR1cC94c19o aXR1cCwgdGhhdCdzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGZvbGxvd2luZyBp bmRleF9iYXRjaF9nZXRuZXh0X3RpZCgpIGNhbGxzLgorICogLS0tLS0tLS0tLS0tLS0tLQor ICovCitzdGF0aWMgYm9vbAoraW5kZXhfYmF0Y2hfZ2V0bmV4dChJbmRleFNjYW5EZXNjIHNj YW4pCit7CisJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaDsKKwlJdGVtUG9pbnRlckRhdGEg dGlkOworCVNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uID0gc2Nhbi0+eHNfYmF0Y2hlcy0+ZGly ZWN0aW9uOworCUluZGV4VHVwbGUJaXR1cDsKKworCVNDQU5fQ0hFQ0tTOworCUNIRUNLX1ND QU5fUFJPQ0VEVVJFKGFtZ2V0YmF0Y2gpOworCisJLyogWFhYOiB3ZSBzaG91bGQgYXNzZXJ0 IHRoYXQgYSBzbmFwc2hvdCBpcyBwdXNoZWQgb3IgcmVnaXN0ZXJlZCAqLworCUFzc2VydChU cmFuc2FjdGlvbklkSXNWYWxpZChSZWNlbnRYbWluKSk7CisKKwkvKgorCSAqIElmIHdlIGFs cmVhZHkgdXNlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmF0Y2ggc2xvdHMgYXZhaWxhYmxl LCBpdCdzCisJICogcG9pbnRsZXNzIHRvIHRyeSBsb2FkaW5nIGFub3RoZXIgb25lLiBUaGlz IGNhbiBoYXBwZW4gZm9yIHZhcmlvdXMKKwkgKiByZWFzb25zLCBlLmcuIGZvciBpbmRleC1v bmx5IHNjYW5zIG9uIGFsbC12aXNpYmxlIHRhYmxlLCBvciBza2lwcGluZworCSAqIGR1cGxp Y2F0ZSBibG9ja3Mgb24gcGVyZmVjdGx5IGNvcnJlbGF0ZWQgaW5kZXhlcywgZXRjLgorCSAq CisJICogV2UgY291bGQgZW5sYXJnZSB0aGUgYXJyYXkgdG8gYWxsb3cgbW9yZSBiYXRjaGVz LCBidXQgdGhhdCdzIGZ1dGlsZSwgd2UKKwkgKiBjYW4gYWx3YXlzIGNvbnN0cnVjdCBhIGNh c2UgdXNpbmcgbW9yZSBtZW1vcnkuIE5vdCBvbmx5IGl0IHdvdWxkIHJpc2sKKwkgKiBPT00s IGl0J2QgYWxzbyBiZSBpbmVmZmljaWVudCBiZWNhdXNlIHRoaXMgaGFwcGVucyBlYXJseSBp biB0aGUgc2NhbgorCSAqIChzbyBpdCdkIGludGVyZmVyZSB3aXRoIExJTUlUIHF1ZXJpZXMp LgorCSAqCisJICogWFhYIEZvciBub3cgd2UganVzdCBlcnJvciBvdXQsIGJ1dCB0aGUgY29y cmVjdCBzb2x1dGlvbiBpcyB0byBwYXVzZSB0aGUKKwkgKiBzdHJlYW0gYnkgcmV0dXJuaW5n IEludmFsaWRCbG9ja051bWJlciBhbmQgdGhlbiB1bnBhdXNlIGl0IGJ5IGRvaW5nCisJICog cmVhZF9zdHJlYW1fcmVzZXQuCisJICovCisJaWYgKElOREVYX1NDQU5fQkFUQ0hfRlVMTChz Y2FuKSkKKwl7CisJCURFQlVHX0xPRygiaW5kZXhfYmF0Y2hfZ2V0bmV4dDogcmFuIG91dCBv ZiBzcGFjZSBmb3IgYmF0Y2hlcyIpOworCQlzY2FuLT54c19iYXRjaGVzLT5yZXNldCA9IHRy dWU7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZmlsbCB0aGUgYmF0Y2ggcXVldWUsIGVpdGhl ciBpbiB0aGlzIG9yIHNvbWUgZWFybGllciBjYWxsPworCSAqIElmIHllcywgd2UgaGF2ZSB0 byBjb25zdW1lIGV2ZXJ5dGhpbmcgZnJvbSBjdXJyZW50bHkgbG9hZGVkIGJhdGNoCisJICog YmVmb3JlIHdlIHJlc2V0IHRoZSBzdHJlYW0gYW5kIGNvbnRpbnVlLiBJdCdzIGEgYml0IGxp a2UgJ2ZpbmlzaGVkJworCSAqIGJ1dCBpdCdzIG9ubHkgYSB0ZW1wb3JhcnkgcGF1c2UsIG5v dCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisJICovCisJaWYgKHNjYW4tPnhzX2JhdGNoZXMt PnJlc2V0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRGlkIHdlIGFscmVhZHkgcmVh ZCB0aGUgbGFzdCBiYXRjaCBmb3IgdGhpcyBzY2FuPworCSAqCisJICogV2UgbWF5IHJlYWQg dGhlIGJhdGNoZXMgaW4gdHdvIHBsYWNlcywgc28gd2UgbmVlZCB0byByZW1lbWJlciB0aGF0 LAorCSAqIG90aGVyd2lzZSB0aGUgcmV0cnkgcmVzdGFydHMgdGhlIHNjYW4uCisJICoKKwkg KiBYWFggVGhpcyBjb21tZW50IG1pZ2h0IGJlIG9ic29sZXRlLCBmcm9tIGJlZm9yZSB1c2lu ZyB0aGUgcmVhZF9zdHJlYW0uCisJICoKKwkgKiBYWFggQWxzbywgbWF5YmUgd2Ugc2hvdWxk IGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgSU5ERVhfU0NBTl9CQVRDSF9GVUxMPworCSAqLwor CWlmIChzY2FuLT54c19iYXRjaGVzLT5maW5pc2hlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlp bmRleF9iYXRjaF9wcmludCgiaW5kZXhfYmF0Y2hfZ2V0bmV4dCAvIHN0YXJ0Iiwgc2Nhbik7 CisKKwkvKgorCSAqIEZJWE1FIGJ0Z2V0YmF0Y2ggY2FsbHMgX2J0X3JldHVybml0ZW0sIHdo aWNoIGhvd2V2ZXIgc2V0cyB4c19oZWFwdGlkLAorCSAqIGFuZCBzbyB3b3VsZCBpbnRlcmZl cmUgd2l0aCBpbmRleCBzY2FucyAoYmVjYXVzZSB0aGlzIG1heSBnZXQgZXhlY3V0ZWQKKwkg KiBmcm9tIHRoZSByZWFkX3N0cmVhbV9uZXh0X2J1ZmZlciBjYWxsYmFjayBkdXJpbmcgdGhl IHNjYW4gKGZldGNoaW5nCisJICogaGVhcCB0dXBsZXMgaW4gaGVhcGFtX2luZGV4X2ZldGNo X3R1cGxlKS4gVWx0aW1hdGVseSB3ZSBzaG91bGQgbm90IGRvCisJICogX2J0X3JldHVybml0 ZW0gYXQgYWxsLCBqdXN0IGZ1bmN0aW9ucyBsaWtlIF9idF9zdGVwcGFnZSBldGMuIHdoaWxl CisJICogbG9hZGluZyB0aGUgbmV4dCBiYXRjaC4KKwkgKgorCSAqIFhYWCBJIHRoaW5rIHRo aXMgaXMgbm8gbG9uZ2VyIHRydWUsIHRoZSBhbWdldGJhdGNoIGRvZXMgbm90IGRvIHRoYXQg SQorCSAqIGJlbGlldmUgKF9idF9yZXR1cm5pdGVtX2JhdGNoIHNob3VsZCBub3Qgc2V0IHRo ZXNlIGZpZWxkcykuCisJICovCisJdGlkID0gc2Nhbi0+eHNfaGVhcHRpZDsKKwlpdHVwID0g c2Nhbi0+eHNfaXR1cDsKKworCWJhdGNoID0gc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5k YW0tPmFtZ2V0YmF0Y2goc2NhbiwgZGlyZWN0aW9uKTsKKwlpZiAoYmF0Y2ggIT0gTlVMTCkK Kwl7CisJCS8qCisJCSAqIFdlIGdvdCB0aGUgYmF0Y2ggZnJvbSB0aGUgQU0sIGJ1dCB3ZSBu ZWVkIHRvIGFkZCBpdCB0byB0aGUgcXVldWUuCisJCSAqIE1heWJlIHRoYXQgc2hvdWxkIGJl IHBhcnQgb2YgdGhlICJiYXRjaCBhbGxvY2F0aW9uIiB0aGF0IGhhcHBlbnMgaW4KKwkJICog dGhlIEFNPworCQkgKi8KKwkJaW50CQkJYmF0Y2hJbmRleCA9IHNjYW4tPnhzX2JhdGNoZXMt Pm5leHRCYXRjaDsKKworCQlJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGJhdGNoSW5kZXgpID0g YmF0Y2g7CisKKwkJc2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoKys7CisKKwkJLyoKKwkJ ICogWFhYIFdoeSBkbyB3ZSBuZWVkIGN1cnJlbnRCYXRjaCwgYWN0dWFsbHk/IEl0IGRvZXNu J3Qgc2VlbSB0byBiZQorCQkgKiB1c2VkIGFueXdoZXJlLCBqdXN0IHNldCAuLi4KKwkJICov CisJCS8vIHNjYW4tPnhzX2JhdGNoZXMtPmN1cnJlbnRCYXRjaCA9IGJhdGNoOworCisJCURF QlVHX0xPRygiaW5kZXhfYmF0Y2hfZ2V0bmV4dCBmaXJzdEJhdGNoICVkIG5leHRCYXRjaCAl ZCBiYXRjaCAlcCIsCisJCQkJICBzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoLCBzY2Fu LT54c19iYXRjaGVzLT5uZXh0QmF0Y2gsIGJhdGNoKTsKKwl9CisJZWxzZQorCQlzY2FuLT54 c19iYXRjaGVzLT5maW5pc2hlZCA9IHRydWU7CisKKwkvKiBYWFggc2VlIEZJWE1FIGFib3Zl ICovCisJc2Nhbi0+eHNfaGVhcHRpZCA9IHRpZDsKKwlzY2FuLT54c19pdHVwID0gaXR1cDsK KworCUFzc2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKKworCWluZGV4X2JhdGNoX3ByaW50KCJp bmRleF9iYXRjaF9nZXRuZXh0IC8gZW5kIiwgc2Nhbik7CisKKwlyZXR1cm4gKGJhdGNoICE9 IE5VTEwpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tCisgKgkJaW5kZXhfZ2V0bmV4dF9i YXRjaF90aWQgLSBnZXQgdGhlIG5leHQgVElEIGZyb20gdGhlIGN1cnJlbnQgYmF0Y2gKKyAq CisgKiBUaGUgY2FsbGluZyBjb252ZW50aW9uIGlzIHNpbWlsYXIgdG8gaW5kZXhfZ2V0bmV4 dF90aWQoKSAtIE5VTEwgbWVhbnMgbm8KKyAqIG1vcmUgaXRlbXMgaW4gdGhlIGN1cnJlbnQg YmF0Y2gsIGFuZCBubyBtb3JlIGJhdGNoZXMuCisgKgorICogSWYgd2UgYWR2YW5jZSB0byB0 aGUgbmV4dCBiYXRjaCwgd2UgcmVsZWFzZSB0aGUgcHJldmlvdXMgb25lICh1bmxlc3MgaXQn cworICogdHJhY2tlZCBmb3IgbWFyay9yZXN0b3JlKS4KKyAqCisgKiBSZXR1cm5zIHRoZSBu ZXh0IFRJRCwgb3IgTlVMTCBpZiBubyBtb3JlIGl0ZW1zIChvciBiYXRjaGVzKS4KKyAqCisg KiBGSVhNRSBUaGlzIG9ubHkgc2V0cyB4c19oZWFwdGlkIGFuZCB4c19pdHVwIChpZiByZXF1 ZXN0ZWQpLiBOb3Qgc3VyZSBpZgorICogd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgd2l0aCB4 c19oaXR1cC4gU2hvdWxkIHRoaXMgc2V0IHhzX2hpdHVwPworICoKKyAqIFhYWCBNYXliZSBp ZiB3ZSBhZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgbmV4dCBiYXRjaCwgd2UgY291bGQg a2VlcCB0aGUKKyAqIGJhdGNoIGZvciBhIGJpdCBtb3JlLCBpbiBjYXNlIHRoZSBzY2FuIGRp cmVjdGlvbiBjaGFuZ2VzIChhcyBsb25nIGFzIGl0CisgKiBmaXRzIGludG8gbWF4QmF0Y2hl cyk/IEJ1dCBtYXliZSB0aGF0J3MgdW5uZWNlc3NhcnkgY29tcGxleGl0eSBmb3IgdG9vCisg KiBsaXR0bGUgZ2Fpbiwgd2UnZCBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgcmVsZWFzaW5n IHRoZSBiYXRjaGVzIGxhemlseS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGlj IEl0ZW1Qb2ludGVyCitpbmRleF9iYXRjaF9nZXRuZXh0X3RpZChJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUluZGV4U2NhbkJhdGNoUG9zICpw b3M7CisKKwkvKiBzaG91bGRuJ3QgZ2V0IGhlcmUgd2l0aG91dCBiYXRjaGluZyAqLworCUFz c2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKKworCS8qIHJlYWQgdGhlIG5leHQgVElEIGZyb20g dGhlIGluZGV4ICovCisJcG9zID0gJnNjYW4tPnhzX2JhdGNoZXMtPnJlYWRQb3M7CisKKwkv KgorCSAqIEhhbmRsZSBjaGFuZ2Ugb2Ygc2NhbiBkaXJlY3Rpb24gKHJlc2V0IHN0cmVhbSwg Li4uKS4KKwkgKgorCSAqIFJlbGVhc2UgZnV0dXJlIGJhdGNoZXMgcHJvcGVybHksIHRvIG1h a2UgaXQgbG9vayBsaWtlIHRoZSBjdXJyZW50IGJhdGNoCisJICogaXMgdGhlIGxhc3Qgb25l IHdlIGxvYWRlZC4gQWxzbyByZXNldCB0aGUgc3RyZWFtIHBvc2l0aW9uLCBhcyBpZiB3ZSBh cmUKKwkgKiBqdXN0IHN0YXJ0aW5nIHRoZSBzY2FuLgorCSAqLworCWlmIChzY2FuLT54c19i YXRjaGVzLT5kaXJlY3Rpb24gIT0gZGlyZWN0aW9uKQorCXsKKwkJLyogcmVsZWFzZSAiZnV0 dXJlIiBiYXRjaGVzIGluIHRoZSB3cm9uZyBkaXJlY3Rpb24gKi8KKwkJd2hpbGUgKHNjYW4t PnhzX2JhdGNoZXMtPm5leHRCYXRjaCA+IHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2gg KyAxKQorCQl7CisJCQlJbmRleFNjYW5CYXRjaCBiYXRjaDsKKwkJCXNjYW4tPnhzX2JhdGNo ZXMtPm5leHRCYXRjaC0tOworCQkJYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIHNj YW4tPnhzX2JhdGNoZXMtPm5leHRCYXRjaCk7CisJCQlpbmRleF9iYXRjaF9mcmVlKHNjYW4s IGJhdGNoKTsKKwkJfQorCisJCS8qCisJCSAqIFJlbWVtYmVyIHRoZSBuZXcgZGlyZWN0aW9u LCBhbmQgbWFrZSBzdXJlIHRoZSBzY2FuIGlzIG5vdCBtYXJrZWQKKwkJICogYXMgImZpbmlz aGVkIiAod2UgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlIGxhc3QgYmF0Y2gsIGJ1dCBu b3cKKwkJICogd2UgbmVlZCB0byBzdGFydCBvdmVyKS4gRG8gdGhpcyBiZWZvcmUgcmVzZXR0 aW5nIHRoZSBzdHJlYW0gLSBpdAorCQkgKiBzaG91bGQgbm90IGludm9rZSB0aGUgY2FsbGJh Y2sgdW50aWwgdGhlIGZpcnN0IHJlYWQsIGJ1dCBpdCBtYXkKKwkJICogc2VlbSBhIGJpdCBj b25mdXNpbmcgb3RoZXJ3aXNlLgorCQkgKi8KKwkJc2Nhbi0+eHNfYmF0Y2hlcy0+ZGlyZWN0 aW9uID0gZGlyZWN0aW9uOworCQlzY2FuLT54c19iYXRjaGVzLT5maW5pc2hlZCA9IGZhbHNl OworCisJCWluZGV4X2JhdGNoX3Bvc19yZXNldChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+ c3RyZWFtUG9zKTsKKwkJcmVhZF9zdHJlYW1fcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoLT5y cyk7CisJfQorCisJREVCVUdfTE9HKCJpbmRleF9iYXRjaF9nZXRuZXh0X3RpZCBwb3MgJWQg JWQgZGlyZWN0aW9uICVkIiwKKwkJCSAgcG9zLT5iYXRjaCwgcG9zLT5pbmRleCwgZGlyZWN0 aW9uKTsKKworCS8qCisJICogVHJ5IGFkdmFuY2luZyB0aGUgYmF0Y2ggcG9zaXRpb24uIElm IHRoYXQgZG9lc24ndCBzdWNjZWVkLCBpdCBtZWFucyB3ZQorCSAqIGRvbid0IGhhdmUgbW9y ZSBpdGVtcyBpbiB0aGUgY3VycmVudCBiYXRjaCwgYW5kIHRoZXJlJ3Mgbm8gZnV0dXJlIGJh dGNoCisJICogbG9hZGVkLiBTbyB0cnkgbG9hZGluZyBhbm90aGVyIGJhdGNoLCBhbmQgbWF5 YmUgcmV0cnkuCisJICoKKwkgKiBGSVhNRSBUaGlzIGxvb3Agc2hvdWxkbid0IGhhcHBlbiBt b3JlIHRoYW4gdHdpY2UuIE1heWJlIHdlIHNob3VsZCBoYXZlCisJICogc29tZSBwcm90ZWN0 aW9uIGFnYWluc3QgaW5maW5pdGUgbG9vcHM/IElmIHRoZSBhZHZhbmNlL2dldG5leHQKKwkg KiBmdW5jdGlvbnMgZ2V0IHRvIGRpc2FncmVlPworCSAqLworCXdoaWxlICh0cnVlKQorCXsK KwkJLyoKKwkJICogSWYgd2UgbWFuYWdlIHRvIGFkdmFuY2UgdG8gdGhlIG5leHQgaXRlbXMs IHJldHVybiBpdCBhbmQgd2UncmUKKwkJICogZG9uZS4gT3RoZXJ3aXNlIHRyeSBsb2FkaW5n IGFub3RoZXIgYmF0Y2guCisJCSAqLworCQlpZiAoaW5kZXhfYmF0Y2hfcG9zX2FkdmFuY2Uo c2NhbiwgcG9zKSkKKwkJeworCQkJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IElOREVY X1NDQU5fQkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisKKwkJCUFzc2VydChiYXRjaCAhPSBO VUxMKTsKKworCQkJLyogc2V0IHRoZSBUSUQgLyBpdHVwIGZvciB0aGUgc2NhbiAqLworCQkJ c2Nhbi0+eHNfaGVhcHRpZCA9IGJhdGNoLT5pdGVtc1twb3MtPmluZGV4XS5oZWFwVGlkOwor CQkJc2Nhbi0+eHNfaXR1cCA9IChJbmRleFR1cGxlKSAoYmF0Y2gtPmN1cnJUdXBsZXMgKyBi YXRjaC0+aXRlbXNbcG9zLT5pbmRleF0udHVwbGVPZmZzZXQpOworCisJCQlERUJVR19MT0co InBvcyBiYXRjaCAlcCBmaXJzdCAlZCBsYXN0ICVkIHBvcyAlZC8lZCBUSUQgKCV1LCV1KSIs CisJCQkJCSAgYmF0Y2gsIGJhdGNoLT5maXJzdEl0ZW0sIGJhdGNoLT5sYXN0SXRlbSwKKwkJ CQkJICBwb3MtPmJhdGNoLCBwb3MtPmluZGV4LAorCQkJCQkgIEl0ZW1Qb2ludGVyR2V0Qmxv Y2tOdW1iZXIoJnNjYW4tPnhzX2hlYXB0aWQpLAorCQkJCQkgIEl0ZW1Qb2ludGVyR2V0T2Zm c2V0TnVtYmVyKCZzY2FuLT54c19oZWFwdGlkKSk7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBh ZHZhbmNlZCB0byB0aGUgbmV4dCBiYXRjaCwgcmVsZWFzZSB0aGUgYmF0Y2ggd2Ugbm8KKwkJ CSAqIGxvbmdlciBuZWVkLiBUaGUgcG9zaXRpb25zIGlzIHRoZSAicmVhZCIgcG9zaXRpb24s IGFuZCB3ZSBjYW4KKwkJCSAqIGNvbXBhcmUgaXQgdG8gZmlyc3RCYXRjaC4KKwkJCSAqLwor CQkJaWYgKHBvcy0+YmF0Y2ggIT0gc2Nhbi0+eHNfYmF0Y2hlcy0+Zmlyc3RCYXRjaCkKKwkJ CXsKKwkJCQliYXRjaCA9IElOREVYX1NDQU5fQkFUQ0goc2Nhbiwgc2Nhbi0+eHNfYmF0Y2hl cy0+Zmlyc3RCYXRjaCk7CisJCQkJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCisJCQkJLyoK KwkJCQkgKiBYWFggV2hlbiBhZHZhbmNpbmcgcmVhZFBvcywgdGhlIHN0cmVhbVBvcyBtYXkg Z2V0IGJlaGluZCBhcworCQkJCSAqIHdlJ3JlIG9ubHkgYWR2YW5jaW5nIGl0IHdoZW4gYWN0 dWFsbHkgcmVxdWVzdGluZyBoZWFwIGJsb2Nrcy4KKwkJCQkgKiBCdXQgd2UgbWF5IG5vdCBk byB0aGF0IG9mdGVuIGVub3VnaCAtIGUuZy4gSU9TIG1heSBub3QgbmVlZAorCQkJCSAqIHRv IGFjY2VzcyBhbGwtdmlzaWJsZSBoZWFwIGJsb2Nrcywgc28gdGhlIHJlYWRfbmV4dCBjYWxs YmFjaworCQkJCSAqIGRvZXMgbm90IGdldCBpbnZva2VkIGZvciBhIGxvbmcgdGltZS4gSXQn cyBwb3NzaWJsZSB0aGUKKwkJCQkgKiBzdHJlYW0gZ2V0cyBzbyBtdWN1IGJlaGluZCB0aGUg cG9zaXRpb24gZ2V0cyBpbnZhbGlkLCBhcyB3ZQorCQkJCSAqIGFscmVhZHkgcmVtb3ZlZCB0 aGUgYmF0Y2guIEJ1dCB0aGF0IG1lYW5zIHdlIGRvbid0IG5lZWQgYW55CisJCQkJICogaGVh cCBibG9ja3MgdW50aWwgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiAtIGlmIHdlIGRpZCwg d2UKKwkJCQkgKiB3b3VsZCBub3QgYmUgaW4gdGhpcyBzaXR1YXRpb24gKG9yIGl0J3MgYSBz aWduIG9mIGEgYnVnLCBhcworCQkJCSAqIHRob3NlIHR3byBwbGFjZXMgYXJlIGV4cGVjdGVk IHRvIGJlIGluIHN5bmMpLiBTbyBpZiB0aGUKKwkJCQkgKiBzdHJlYW1Qb3Mgc3RpbGwgcG9p bnRzIGF0IHRoZSBiYXRjaCB3ZSdyZSBhYm91dCB0byBmcmVlLAorCQkJCSAqIGp1c3QgcmVz ZXQgdGhlIHBvc2l0aW9uIC0gd2UnbGwgc2V0IGl0IHRvIHJlYWRQb3MgaW4gdGhlCisJCQkJ ICogcmVhZF9uZXh0IGNhbGxiYWNrIGxhdGVyLgorCQkJCSAqCisJCQkJICogWFhYIFRoaXMg Y2FuIGhhcHBlbiBhZnRlciB0aGUgcXVldWUgZ2V0cyBmdWxsLCB3ZSAicGF1c2UiCisJCQkJ ICogdGhlIHN0cmVhbSwgYW5kIHRoZW4gcmVzZXQgaXQgdG8gY29udGludWUuIEJ1dCBJIHRo aW5rIHRoYXQKKwkJCQkgKiBqdXN0IGluY3JlYXNlcyB0aGUgcHJvYmFiaWxpdHkgb2YgaGl0 dGluZyB0aGUgaXNzdWUsIGl0J3MKKwkJCQkgKiBqdXN0IG1vcmUgY2hhbmNlIHRvIHRvIG5v dCBhZHZhbmNlIHRoZSBzdHJlYW1Qb3MsIHdoaWNoCisJCQkJICogZGVwZW5kcyBvbiB3aGVu IHdlIHRyeSB0byBmZXRjaCB0aGUgZmlyc3QgaGVhcCBibG9jayBhZnRlcgorCQkJCSAqIGNh bGxpbmcgcmVhZF9zdHJlYW1fcmVzZXQoKS4KKwkJCQkgKi8KKwkJCQlpZiAoc2Nhbi0+eHNf YmF0Y2hlcy0+c3RyZWFtUG9zLmJhdGNoID09IHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0 Y2gpCisJCQkJeworCQkJCQlpbmRleF9iYXRjaF9wb3NfcmVzZXQoc2NhbiwgJnNjYW4tPnhz X2JhdGNoZXMtPnN0cmVhbVBvcyk7CisJCQkJfQorCisJCQkJREVCVUdfTE9HKCJpbmRleF9i YXRjaF9nZXRuZXh0X3RpZCBmcmVlIGJhdGNoICVwIGZpcnN0QmF0Y2ggJWQgbmV4dEJhdGNo ICVkIiwKKwkJCQkJCSAgYmF0Y2gsCisJCQkJCQkgIHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0 QmF0Y2gsCisJCQkJCQkgIHNjYW4tPnhzX2JhdGNoZXMtPm5leHRCYXRjaCk7CisKKwkJCQkv KiBGcmVlIHRoZSBiYXRjaCAoZXhjZXB0IHdoZW4gaXQncyBuZWVkZWQgZm9yIG1hcmsvcmVz dG9yZSkuICovCisJCQkJaW5kZXhfYmF0Y2hfZnJlZShzY2FuLCBiYXRjaCk7CisKKwkJCQkv KgorCQkJCSAqIEluIGFueSBjYXNlLCByZW1vdmUgdGhlIGJhdGNoIGZyb20gdGhlIHJlZ3Vs YXIgcXVldWUsIGV2ZW4KKwkJCQkgKiBpZiB3ZSBrZXB0IGl0IGZvciBtYXIvcmVzdG9yZS4K KwkJCQkgKi8KKwkJCQlzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoKys7CisKKwkJCQlE RUJVR19MT0coImluZGV4X2JhdGNoX2dldG5leHRfdGlkIGJhdGNoIGZyZWVkIGZpcnN0QmF0 Y2ggJWQgbmV4dEJhdGNoICVkIiwKKwkJCQkJCSAgc2Nhbi0+eHNfYmF0Y2hlcy0+Zmlyc3RC YXRjaCwKKwkJCQkJCSAgc2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoKTsKKworCQkJCWlu ZGV4X2JhdGNoX3ByaW50KCJpbmRleF9iYXRjaF9nZXRuZXh0X3RpZCAvIGZyZWUgb2xkIGJh dGNoIiwgc2Nhbik7CisKKwkJCQkvKiB3ZSBjYW4ndCBza2lwIGFueSBiYXRjaGVzICovCisJ CQkJQXNzZXJ0KHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2ggPT0gcG9zLT5iYXRjaCk7 CisJCQl9CisKKwkJCXJldHVybiAmc2Nhbi0+eHNfaGVhcHRpZDsKKwkJfQorCisJCS8qCisJ CSAqIFdlIGZhaWxlZCB0byBhZHZhbmNlLCBpLmUuIHdlIHJhbiBvdXQgb2YgY3VycmVudGx5 IGxvYWRlZCBiYXRjaGVzLgorCQkgKiBTbyBpZiB3ZSBmaWxsZWQgdGhlIHF1ZXVlLCB0aGlz IGlzIGEgZ29vZCB0aW1lIHRvIHJlc2V0IHRoZSBzdHJlYW0KKwkJICogKGJlZm9yZSB3ZSB0 cnkgbG9hZGluZyB0aGUgbmV4dCBiYXRjaCkuCisJCSAqLworCQlpZiAoc2Nhbi0+eHNfYmF0 Y2hlcy0+cmVzZXQpCisJCXsKKwkJCURFQlVHX0xPRygicmVzZXR0aW5nIHJlYWQgc3RyZWFt IHBvcyAlZCwlZCIsCisJCQkJCSAgc2Nhbi0+eHNfYmF0Y2hlcy0+cmVhZFBvcy5iYXRjaCwg c2Nhbi0+eHNfYmF0Y2hlcy0+cmVhZFBvcy5pbmRleCk7CisKKwkJCXNjYW4tPnhzX2JhdGNo ZXMtPnJlc2V0ID0gZmFsc2U7CisKKwkJCS8qCisJCQkgKiBOZWVkIHRvIHJlc2V0IHRoZSBz dHJlYW0gcG9zaXRpb24sIGl0IG1pZ2h0IGJlIHRvbyBmYXIgYmVoaW5kLgorCQkJICogVWx0 aW1hdGVseSB3ZSB3YW50IHRvIHNldCBpdCB0byByZWFkUG9zLCBidXQgd2UgY2FuJ3QgZG8g dGhhdAorCQkJICogeWV0IC0gcmVhZFBvcyBzdGlsbCBwb2ludCBzYXQgdGhlIG9sZCBiYXRj aCwgc28ganVzdCByZXNldCBpdAorCQkJICogYW5kIHdlJ2xsIGluaXQgaXQgdG8gcmVhZFBv cyBsYXRlciBpbiB0aGUgY2FsbGJhY2suCisJCQkgKi8KKwkJCWluZGV4X2JhdGNoX3Bvc19y ZXNldChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+c3RyZWFtUG9zKTsKKworCQkJcmVhZF9z dHJlYW1fcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoLT5ycyk7CisJCX0KKworCQkvKgorCQkg KiBGYWlsZWQgdG8gYWR2YW5jZSB0aGUgcmVhZCBwb3NpdGlvbiwgc28gdHJ5IHJlYWRpbmcg dGhlIG5leHQgYmF0Y2guCisJCSAqIElmIHRoaXMgZmFpbHMsIHdlJ3JlIGRvbmUgLSB0aGVy ZSdzIG5vdGhpbmcgbW9yZSB0byBsb2FkLgorCQkgKgorCQkgKiBNb3N0IG9mIHRoZSBiYXRj aGVzIHNob3VsZCBiZSBsb2FkZWQgZnJvbSByZWFkX3N0cmVhbV9uZXh0X2J1ZmZlciwKKwkJ ICogYnV0IHdlIG5lZWQgdG8gY2FsbCBpbmRleF9iYXRjaF9nZXRuZXh0IGhlcmUgdG9vLCBm b3IgdHdvIHJlYXNvbnMuCisJCSAqIEZpcnN0LCB0aGUgcmVhZF9zdHJlYW0gb25seSBnZXRz IHdvcmtpbmcgYWZ0ZXIgd2UgdHJ5IGZldGNoaW5nIHRoZQorCQkgKiBmaXJzdCBoZWFwIHR1 cGxlLCBzbyB3ZSBuZWVkIHRvIGxvYWQgdGhlIGZpcnN0IGJhdGNoIGZyb20gaGVyZS4KKwkJ ICogU2Vjb25kLCB3aGlsZSBtb3N0IGJhdGNoZXMgd2lsbCBiZSBwcmVsb2FkZWQgYnkgdGhl IHN0cmVhbSB0aGFuaydzCisJCSAqIHRvIHByZWZldGNoaW5nLCBpdCdzIHBvc3NpYmxlIHRv IHNldCBlZmZlY3RpdmVfaW9fY29uY3VycmVuY3k9MCwgaW4KKwkJICogd2hpY2ggY2FzZSBh bGwgdGhlIGJhdGNoIGxvYWRzIGhhcHBlbiBmcm9tIGhlcmUuCisJCSAqLworCQlpZiAoIWlu ZGV4X2JhdGNoX2dldG5leHQoc2NhbikpCisJCQlicmVhazsKKworCQlERUJVR19MT0coImxv YWRlZCBuZXh0IGJhdGNoLCByZXRyeSB0byBhZHZhbmNlIHBvc2l0aW9uIik7CisJfQorCisJ LyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgZmFpbGVkIHRvIGFkdmFuY2UgdGhlIHBvc2l0 aW9uIGFuZCB0aGVyZSBhcmUgbm8gbW9yZQorCSAqIGJhdGNoZXMsIHNvIHdlJ3JlIGRvbmUu CisJICovCisJREVCVUdfTE9HKCJubyBtb3JlIGJhdGNoZXMgdG8gcHJvY2VzcyIpOworCisJ LyoKKwkgKiBSZXNldCB0aGUgcG9zaXRpb24gLSB3ZSBtdXN0IG5vdCBrZWVwIHRoZSBsYXN0 IHZhbGlkIHBvc2l0aW9uLCBpbiBjYXNlCisJICogd2UgY2hhbmdlIGRpcmVjdGlvbiBvZiB0 aGUgc2NhbiBhbmQgc3RhcnQgc2Nhbm5pbmcgYWdhaW4uIElmIHdlIGtlcHQKKwkgKiB0aGUg cG9zaXRpb24sIHdlJ2Qgc2tpcCB0aGUgZmlyc3QgaXRlbS4KKwkgKi8KKwlpbmRleF9iYXRj aF9wb3NfcmVzZXQoc2NhbiwgcG9zKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICog aW5kZXhfYmF0Y2hfaW5pdAorICoJCUluaXRpYWxpemUgdmFyaW91cyBmaWVsZHMgLyBhcnJh eXMgbmVlZGVkIGJ5IGJhdGNoaW5nLgorICoKKyAqIEZJWE1FIFRoaXMgaXMgYSBiaXQgYWQt aG9jIGhvZGdlIHBvZGdlLCBkdWUgdG8gaG93IEkgd2FzIGFkZGluZyBtb3JlIGFuZAorICog bW9yZSBwaWVjZXMuIFNvbWUgb2YgdGhlIGZpZWxkcyBtYXkgYmUgbm90IHF1aXRlIG5lY2Vz c2FyeSwgbmVlZHMgY2xlYW51cC4KKyAqLworc3RhdGljIHZvaWQKK2luZGV4X2JhdGNoX2lu aXQoSW5kZXhTY2FuRGVzYyBzY2FuKQoreworCS8qIGluaXQgYmF0Y2hpbmcgaW5mbywgYXNz dW1lIGJhdGNoaW5nIGlzIHN1cHBvcnRlZCBieSB0aGUgQU0gKi8KKwlBc3NlcnQoc2Nhbi0+ aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtZ2V0YmF0Y2ggIT0gTlVMTCk7CisJQXNzZXJ0 KHNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbWZyZWViYXRjaCAhPSBOVUxMKTsK KworCXNjYW4tPnhzX2JhdGNoZXMgPSBwYWxsb2MwKHNpemVvZihJbmRleFNjYW5CYXRjaGVz KSk7CisKKwkvKiBXZSBkb24ndCBrbm93IGRpcmVjdGlvbiBvZiB0aGUgc2NhbiB5ZXQuICov CisJc2Nhbi0+eHNfYmF0Y2hlcy0+ZGlyZWN0aW9uID0gTm9Nb3ZlbWVudFNjYW5EaXJlY3Rp b247CisKKwkvKiBJbml0aWFsaXplIHRoZSBiYXRjaCAqLworCXNjYW4tPnhzX2JhdGNoZXMt Pm1heEJhdGNoZXMgPSBJTkRFWF9TQ0FOX01BWF9CQVRDSEVTOworCXNjYW4tPnhzX2JhdGNo ZXMtPmZpcnN0QmF0Y2ggPSAwOwkvKiBmaXJzdCBiYXRjaCAqLworCXNjYW4tPnhzX2JhdGNo ZXMtPm5leHRCYXRjaCA9IDA7CS8qIGZpcnN0IGJhdGNoIGlzIGVtcHR5ICovCisKKwlzY2Fu LT54c19iYXRjaGVzLT5iYXRjaGVzCisJCT0gcGFsbG9jKHNpemVvZihJbmRleFNjYW5CYXRj aERhdGEgKikgKiBzY2FuLT54c19iYXRjaGVzLT5tYXhCYXRjaGVzKTsKKworCS8qIHBvc2l0 aW9ucyBpbiB0aGUgcXVldWUgb2YgYmF0Y2hlcyAqLworCWluZGV4X2JhdGNoX3Bvc19yZXNl dChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+cmVhZFBvcyk7CisJaW5kZXhfYmF0Y2hfcG9z X3Jlc2V0KHNjYW4sICZzY2FuLT54c19iYXRjaGVzLT5zdHJlYW1Qb3MpOworCWluZGV4X2Jh dGNoX3Bvc19yZXNldChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+bWFya1Bvcyk7CisKKwkv LyBzY2FuLT54c19iYXRjaGVzLT5jdXJyZW50QmF0Y2ggPSBOVUxMOworfQorCisvKgorICog aW5kZXhfYmF0Y2hfcmVzZXQKKyAqCQlSZXNldCB0aGUgYmF0Y2ggYmVmb3JlIHJlYWRpbmcg dGhlIG5leHQgY2h1bmsgb2YgZGF0YS4KKyAqCisgKiBjb21wbGV0ZSAtIHRydWUgbWVhbnMg d2UgcmVzZXQgZXZlbiBtYXJrZWQgYmF0Y2gKKyAqCisgICogWFhYIFNob3VsZCB0aGlzIHJl c2V0IHRoZSBiYXRjaCBtZW1vcnkgY29udGV4dCwgeHNfaXR1cCwgeHNfaGl0dXAsIGV0Yz8K KyAqLworc3RhdGljIHZvaWQKK2luZGV4X2JhdGNoX3Jlc2V0KEluZGV4U2NhbkRlc2Mgc2Nh biwgYm9vbCBjb21wbGV0ZSkKK3sKKwlJbmRleFNjYW5CYXRjaGVzICpiYXRjaGVzID0gc2Nh bi0+eHNfYmF0Y2hlczsKKworCS8qIGJhaWwgb3V0IGlmIGJhdGNoaW5nIG5vdCBlbmFibGVk ICovCisJaWYgKCFiYXRjaGVzKQorCQlyZXR1cm47CisKKwlBc3NlcnRDaGVja0JhdGNoZXMo c2Nhbik7CisKKwlpbmRleF9iYXRjaF9wcmludCgiaW5kZXhfYmF0Y2hfcmVzZXQiLCBzY2Fu KTsKKworCS8qIFdpdGggYmF0Y2hpbmcgZW5hYmxlZCwgd2Ugc2hvdWxkIGhhdmUgYSByZWFk IHN0cmVhbS4gUmVzZXQgaXQuICovCisJQXNzZXJ0KHNjYW4tPnhzX2hlYXBmZXRjaCk7CisJ cmVhZF9zdHJlYW1fcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoLT5ycyk7CisKKwkvKiByZXNl dCB0aGUgcG9zaXRpb25zICovCisJaW5kZXhfYmF0Y2hfcG9zX3Jlc2V0KHNjYW4sICZiYXRj aGVzLT5yZWFkUG9zKTsKKwlpbmRleF9iYXRjaF9wb3NfcmVzZXQoc2NhbiwgJmJhdGNoZXMt PnN0cmVhbVBvcyk7CisKKwkvKgorCSAqIFdpdGggImNvbXBsZXRlIiByZXNldCwgbWFrZSBz dXJlIHRvIGFsc28gZnJlZSB0aGUgbWFya2VkIGJhdGNoLCBlaXRoZXIKKwkgKiBieSBqdXN0 IGZvcmdldHRpbmcgaXQgKGlmIGl0J3Mgc3RpbGwgaW4gdGhlIHF1ZXVlKSwgb3IgYnkgZXhw bGljaXRseQorCSAqIGZyZWVpbmcgaXQuCisJICoKKwkgKiBYWFggRG8gdGhpcyBiZWZvcmUg dGhlIGxvb3AsIHNvIHRoYXQgaXQgY2FsbHMgdGhlIGFtZnJlZWJhdGNoKCkuCisJICovCisJ aWYgKGNvbXBsZXRlICYmIChiYXRjaGVzLT5tYXJrQmF0Y2ggIT0gTlVMTCkpCisJeworCQlJ bmRleFNjYW5CYXRjaFBvcyAqcG9zID0gJmJhdGNoZXMtPm1hcmtQb3M7CisJCUluZGV4U2Nh bkJhdGNoIGJhdGNoID0gYmF0Y2hlcy0+bWFya0JhdGNoOworCisJCS8qIGFsd2F5cyByZXNl dCB0aGUgcG9zaXRpb24sIGZvcmdldCB0aGUgbWFya2VkIGJhdGNoICovCisJCWJhdGNoZXMt Pm1hcmtCYXRjaCA9IE5VTEw7CisKKwkJLyoKKwkJICogSWYgd2UndmUgYWxyZWFkeSBtb3Zl ZCBwYXN0IHRoZSBtYXJrZWQgYmF0Y2ggKGl0J3Mgbm90IGluIHRoZQorCQkgKiBjdXJyZW50 IHF1ZXVlKSwgZnJlZSBpdCBleHBsaWNpdGx5LiBPdGhlcndpc2UgaXQnbGwgYmUgaW4gdGhl IGZyZWVkCisJCSAqIGxhdGVyLgorCQkgKi8KKwkJaWYgKChwb3MtPmJhdGNoIDwgYmF0Y2hl cy0+Zmlyc3RCYXRjaCkgfHwKKwkJCShwb3MtPmJhdGNoID49IGJhdGNoZXMtPm5leHRCYXRj aCkpCisJCXsKKwkJCWluZGV4X2JhdGNoX2ZyZWUoc2NhbiwgYmF0Y2gpOworCQl9CisKKwkJ LyogcmVzZXQgcG9zaXRpb24gb25seSBhZnRlciB0aGUgcXVldWUgcmFuZ2UgY2hlY2sgKi8K KwkJaW5kZXhfYmF0Y2hfcG9zX3Jlc2V0KHNjYW4sICZiYXRjaGVzLT5tYXJrUG9zKTsKKwl9 CisKKwkvKiByZWxlYXNlIGFsbCBjdXJyZW50bHkgbG9hZGVkIGJhdGNoZXMgKi8KKwl3aGls ZSAoYmF0Y2hlcy0+Zmlyc3RCYXRjaCA8IGJhdGNoZXMtPm5leHRCYXRjaCkKKwl7CisJCUlu ZGV4U2NhbkJhdGNoIGJhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2FuLCBiYXRjaGVzLT5m aXJzdEJhdGNoKTsKKworCQlERUJVR19MT0coImZyZWVpbmcgYmF0Y2ggJWQgJXAiLCBiYXRj aGVzLT5maXJzdEJhdGNoLCBiYXRjaCk7CisKKwkJaW5kZXhfYmF0Y2hfZnJlZShzY2FuLCBi YXRjaCk7CisKKwkJLyogdXBkYXRlIHRoZSB2YWxpZCByYW5nZSwgc28gdGhhdCBhc3NlcnRz IC8gZGVidWdnaW5nIHdvcmtzICovCisJCWJhdGNoZXMtPmZpcnN0QmF0Y2grKzsKKwl9CisK KwkvKiByZXNldCByZWxldmFudCBJbmRleFNjYW5CYXRjaGVzIGZpZWxkcyAqLworCWJhdGNo ZXMtPm1heEJhdGNoZXMgPSBJTkRFWF9TQ0FOX01BWF9CQVRDSEVTOworCWJhdGNoZXMtPmZp cnN0QmF0Y2ggPSAwOwkvKiBmaXJzdCBiYXRjaCAqLworCWJhdGNoZXMtPm5leHRCYXRjaCA9 IDA7CQkvKiBmaXJzdCBiYXRjaCBpcyBlbXB0eSAqLworCisJYmF0Y2hlcy0+ZmluaXNoZWQg PSBmYWxzZTsKKwliYXRjaGVzLT5yZXNldCA9IGZhbHNlOworCS8vIGJhdGNoZXMtPmN1cnJl bnRCYXRjaCA9IE5VTEw7CisKKwlBc3NlcnRDaGVja0JhdGNoZXMoc2Nhbik7Cit9CisKK3N0 YXRpYyB2b2lkCitpbmRleF9iYXRjaF9raWxsX2l0ZW0oSW5kZXhTY2FuRGVzYyBzY2FuKQor eworCUluZGV4U2NhbkJhdGNoUG9zICpwb3MgPSAmc2Nhbi0+eHNfYmF0Y2hlcy0+cmVhZFBv czsKKwlJbmRleFNjYW5CYXRjaERhdGEgKmJhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2Fu LCBwb3MtPmJhdGNoKTsKKworCS8qIEZJWE1FIG1hcmsgaXRlbSBhdCBjdXJyZW50IHJlYWRQ b3MgYXMgZGVsZXRlZCAqLworCUFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChzY2FuLCBwb3Mp OworCisJLyoKKwkgKiBYWFggVG9vIHRpZWQgdG8gYnRyZWUgKHRocm91Z2ggTWF4VElEc1Bl ckJUcmVlUGFnZSksIHdlIHNob3VsZCBtYWtlCisJICogdGhpcyBBTSBhZ25vc3RpYy4gV2Ug Y291bGQgbWF5YmUgZXZlbiByZXBsYWNlIHRoaXMgd2l0aCBCaXRtYXBzZXQuIEl0CisJICog bWlnaHQgYmUgbW9yZSBleHBlbnNpdmUgaWYgd2Ugb25seSBraWxsIGl0ZW1zIGF0IHRoZSBl bmQgb2YgdGhlIHBhZ2UKKwkgKiAoaW4gd2hpY2ggY2FzZSB3ZSBzdGlsbCBoYXZlIHRvIHdh bGsgdGhlIGZpcnN0IHBhcnQgdG8gZmluZCB0aGUgYml0cyBhdAorCSAqIHRoZSBlbmQpLiBC dXQgZ2l2ZW4gdGhlIGxvd2VyIG1lbW9yeSB1c2FnZSBpdCBzdGlsbCBzZWVzIGxpa2UgYSBn b29kCisJICogdHJhZGVvZmYgb3ZlcmFsbC4KKwkgKi8KKwlpZiAoYmF0Y2gtPmtpbGxlZEl0 ZW1zID09IE5VTEwpCisJCWJhdGNoLT5raWxsZWRJdGVtcyA9IChpbnQgKikKKwkJCXBhbGxv YyhNYXhUSURzUGVyQlRyZWVQYWdlICogc2l6ZW9mKGludCkpOworCWlmIChiYXRjaC0+bnVt S2lsbGVkIDwgTWF4VElEc1BlckJUcmVlUGFnZSkKKwkJYmF0Y2gtPmtpbGxlZEl0ZW1zW2Jh dGNoLT5udW1LaWxsZWQrK10gPSBwb3MtPmluZGV4OworCisJLyogZWxvZyhXQVJOSU5HLCAi aW5kZXhfYmF0Y2hfa2lsbF9pdGVtICglZCwlZCkiLCBwb3MtPmJhdGNoLCBwb3MtPmluZGV4 KTsgKi8KKwkvKiBGSVhNRSBpbmRleF9iYXRjaF9raWxsX2l0ZW0gbm90IGltcGxlbWVudGVk ICovCit9CisKK3N0YXRpYyB2b2lkCitpbmRleF9iYXRjaF9mcmVlKEluZGV4U2NhbkRlc2Mg c2NhbiwgSW5kZXhTY2FuQmF0Y2ggYmF0Y2gpCit7CisJU0NBTl9DSEVDS1M7CisJQ0hFQ0tf U0NBTl9QUk9DRURVUkUoYW1mcmVlYmF0Y2gpOworCisJQXNzZXJ0Q2hlY2tCYXRjaChzY2Fu LCBiYXRjaCk7CisKKwkvKiBkb24ndCBmcmVlIHRoZSBiYXRjaCB0aGF0IGlzIG1hcmtlZCAq LworCWlmIChiYXRjaCA9PSBzY2FuLT54c19iYXRjaGVzLT5tYXJrQmF0Y2gpCisJCXJldHVy bjsKKworCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbWZyZWViYXRjaChzY2Fu LCBiYXRjaCk7Cit9CisKKy8qICovCitzdGF0aWMgdm9pZAoraW5kZXhfYmF0Y2hfZW5kKElu ZGV4U2NhbkRlc2Mgc2NhbikKK3sKKwlpbmRleF9iYXRjaF9yZXNldChzY2FuLCB0cnVlKTsK K30KKworSW5kZXhTY2FuQmF0Y2gKK2luZGV4X2JhdGNoX2FsbG9jKGludCBtYXhpdGVtcywg Ym9vbCB3YW50X2l0dXApCit7CisJSW5kZXhTY2FuQmF0Y2ggYmF0Y2ggPSBwYWxsb2Moc2l6 ZW9mKEluZGV4U2NhbkJhdGNoRGF0YSkpOworCisJYmF0Y2gtPmZpcnN0SXRlbSA9IC0xOwor CWJhdGNoLT5sYXN0SXRlbSA9IC0xOworCWJhdGNoLT5pdGVtSW5kZXggPSAtMTsKKworCWJh dGNoLT5raWxsZWRJdGVtcyA9IE5VTEw7CS8qIEZJWE1FIGFsbG9jYXRlIGFuIGFycmF5LCBh Y3R1YWxseSAqLworCWJhdGNoLT5udW1LaWxsZWQgPSAwOwkJLyogbm90aGluZyBraWxsZWQg eWV0ICovCisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBhbiBpbmRleC1vbmx5IHNjYW4s IHRoZXNlIGFyZSB0aGUgdHVwbGUgc3RvcmFnZQorCSAqIHdvcmtzcGFjZXMgZm9yIHRoZSBj dXJyUG9zIGFuZCBtYXJrUG9zIHJlc3BlY3RpdmVseS4gIEVhY2ggaXMgb2Ygc2l6ZQorCSAq IEJMQ0tTWiwgc28gaXQgY2FuIGhvbGQgYXMgbXVjaCBhcyBhIGZ1bGwgcGFnZSdzIHdvcnRo IG9mIHR1cGxlcy4KKwkgKgorCSAqIFhYWCBhbGxvY2F0ZQorCSAqLworCWJhdGNoLT5jdXJy VHVwbGVzID0gTlVMTDsJLyogdHVwbGUgc3RvcmFnZSBmb3IgY3VyclBvcyAqLworCWlmICh3 YW50X2l0dXApCisJCWJhdGNoLT5jdXJyVHVwbGVzID0gcGFsbG9jKEJMQ0tTWik7CisKKwkv KgorCSAqIFhYWCBNYXliZSBkb24ndCBzaXplIHRvIE1heFRJRHNQZXJCVHJlZVBhZ2U/IFdl IGRvbid0IHJldXNlIGJhdGNoZXMKKwkgKiAodW5saWtlIGN1cnJQb3MpLCBzbyB3ZSBjYW4g c2l6ZSBpdCBmb3IganVzdCB3aGF0IHdlIG5lZWQuCisJICovCisJYmF0Y2gtPml0ZW1zID0g cGFsbG9jMChzaXplb2YoSW5kZXhTY2FuQmF0Y2hQb3NJdGVtKSAqIG1heGl0ZW1zKTsKKwor CS8qCisJICogYmF0Y2ggY29udGVudHMgKFRJRHMsIGluZGV4IHR1cGxlcywga2lsbCBiaXRt YXAsIC4uLikKKwkgKgorCSAqIFhYWCBhbGxvY2F0ZSBhcyBuZWVkZWQ/CisJICovCisJYmF0 Y2gtPml0dXBzID0gTlVMTDsJCS8qIEluZGV4VHVwbGVzLCBpZiByZXF1ZXN0ZWQgKi8KKwli YXRjaC0+aHR1cHMgPSBOVUxMOwkJLyogSGVhcFR1cGxlcywgaWYgcmVxdWVzdGVkICovCisJ YmF0Y2gtPnJlY2hlY2sgPSBOVUxMOwkJLyogcmVjaGVjayBmbGFncyAqLworCWJhdGNoLT5w cml2YXRlRGF0YSA9IE5VTEw7CS8qIHByaXZhdGUgZGF0YSBmb3IgYmF0Y2ggKi8KKworCS8q IHhzX29yZGVyYnl2YWxzIC8geHNfb3JkZXJieW51bGxzICovCisJYmF0Y2gtPm9yZGVyYnl2 YWxzID0gTlVMTDsKKwliYXRjaC0+b3JkZXJieW51bGxzID0gTlVMTDsKKworCS8qIEFNLXNw ZWNpZmljIHBlci1iYXRjaCBzdGF0ZSAqLworCWJhdGNoLT5vcGFxdWUgPSBOVUxMOworCisJ cmV0dXJuIGJhdGNoOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RhYmxl L3RhYmxlYW0uYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90YWJsZS90YWJsZWFtLmMKaW5kZXgg YTU2YzVlY2ViMTQuLmJlOGUwMmE5YzQ1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nl c3MvdGFibGUvdGFibGVhbS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90YWJsZS90YWJs ZWFtLmMKQEAgLTIxNyw3ICsyMTcsNyBAQCB0YWJsZV9pbmRleF9mZXRjaF90dXBsZV9jaGVj ayhSZWxhdGlvbiByZWwsCiAJYm9vbAkJZm91bmQ7CiAKIAlzbG90ID0gdGFibGVfc2xvdF9j cmVhdGUocmVsLCBOVUxMKTsKLQlzY2FuID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4ocmVs KTsKKwlzY2FuID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4ocmVsLCBOVUxMKTsKIAlmb3Vu ZCA9IHRhYmxlX2luZGV4X2ZldGNoX3R1cGxlKHNjYW4sIHRpZCwgc25hcHNob3QsIHNsb3Qs ICZjYWxsX2FnYWluLAogCQkJCQkJCQkJYWxsX2RlYWQpOwogCXRhYmxlX2luZGV4X2ZldGNo X2VuZChzY2FuKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvbnN0cmFp bnQuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvbnN0cmFpbnQuYwppbmRleCAzNDk3YTgy MjFmMi4uOGE1ZDc5YTI3YTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Nv bnN0cmFpbnQuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb25zdHJhaW50LmMKQEAg LTEwNiw3ICsxMDYsOCBAQCB1bmlxdWVfa2V5X3JlY2hlY2soUEdfRlVOQ1RJT05fQVJHUykK IAkgKi8KIAl0bXB0aWQgPSBjaGVja3RpZDsKIAl7Ci0JCUluZGV4RmV0Y2hUYWJsZURhdGEg KnNjYW4gPSB0YWJsZV9pbmRleF9mZXRjaF9iZWdpbih0cmlnZGF0YS0+dGdfcmVsYXRpb24p OworCQlJbmRleEZldGNoVGFibGVEYXRhICpzY2FuID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVn aW4odHJpZ2RhdGEtPnRnX3JlbGF0aW9uLAorCQkJCQkJCQkJCQkJCQkJTlVMTCk7CiAJCWJv b2wJCWNhbGxfYWdhaW4gPSBmYWxzZTsKIAogCQlpZiAoIXRhYmxlX2luZGV4X2ZldGNoX3R1 cGxlKHNjYW4sICZ0bXB0aWQsIFNuYXBzaG90U2VsZiwgc2xvdCwKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0 b3IvZXhlY0luZGV4aW5nLmMKaW5kZXggYmRmODYyYjI0MDYuLjFlYzA0NmFkZWZmIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYworKysgYi9zcmMv YmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYwpAQCAtODE1LDcgKzgxNSwxNyBAQCBj aGVja19leGNsdXNpb25fb3JfdW5pcXVlX2NvbnN0cmFpbnQoUmVsYXRpb24gaGVhcCwgUmVs YXRpb24gaW5kZXgsCiByZXRyeToKIAljb25mbGljdCA9IGZhbHNlOwogCWZvdW5kX3NlbGYg PSBmYWxzZTsKLQlpbmRleF9zY2FuID0gaW5kZXhfYmVnaW5zY2FuKGhlYXAsIGluZGV4LCAm RGlydHlTbmFwc2hvdCwgTlVMTCwgaW5kbmtleWF0dHMsIDApOworCisJLyoKKwkgKiBJdCBk b2Vzbid0IHNlZW0gdmVyeSB1c2VmdWwgdG8gYWxsb3cgYmF0Y2hpbmcvcHJlZmV0Y2hpbmcg d2hlbiBjaGVja2luZworCSAqIGV4Y2x1c2lvbi91bmlxdWVuZXNzIGNvbnN0cmFpbnRzLiBX ZSBzaG91bGQgb25seSBmaW5kIGVpdGhlciBubyBvciBqdXN0CisJICogb25lIHJvdywgSSB0 aGluay4KKwkgKgorCSAqIFhYWCBNYXliZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgY291 bGQgZmluZCBtdWx0aXBsZSAiY2FuZGlkYXRlIgorCSAqIHJvd3MsIGUuZy4gd2l0aCBleGNs dXNpb24gY29uc3RyYWludHM/IE5vdCBzdXJlLgorCSAqLworCWluZGV4X3NjYW4gPSBpbmRl eF9iZWdpbnNjYW4oaGVhcCwgaW5kZXgsICZEaXJ0eVNuYXBzaG90LCBOVUxMLCBpbmRua2V5 YXR0cywgMCwKKwkJCQkJCQkJIGZhbHNlKTsKIAlpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwg c2NhbmtleXMsIGluZG5rZXlhdHRzLCBOVUxMLCAwKTsKIAogCXdoaWxlIChpbmRleF9nZXRu ZXh0X3Nsb3QoaW5kZXhfc2NhbiwgRm9yd2FyZFNjYW5EaXJlY3Rpb24sIGV4aXN0aW5nX3Ns b3QpKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1JlcGxpY2F0aW9u LmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUmVwbGljYXRpb24uYwppbmRleCA1M2Rk ZDI1YzQyZC4uOWM3ZGY5YjljY2IgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L2V4ZWNSZXBsaWNhdGlvbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSZXBs aWNhdGlvbi5jCkBAIC0yMDEsOCArMjAxLDEzIEBAIFJlbGF0aW9uRmluZFJlcGxUdXBsZUJ5 SW5kZXgoUmVsYXRpb24gcmVsLCBPaWQgaWR4b2lkLAogCS8qIEJ1aWxkIHNjYW4ga2V5LiAq LwogCXNrZXlfYXR0b2ZmID0gYnVpbGRfcmVwbGluZGV4X3NjYW5fa2V5KHNrZXksIHJlbCwg aWR4cmVsLCBzZWFyY2hzbG90KTsKIAotCS8qIFN0YXJ0IGFuIGluZGV4IHNjYW4uICovCi0J c2NhbiA9IGluZGV4X2JlZ2luc2NhbihyZWwsIGlkeHJlbCwgJnNuYXAsIE5VTEwsIHNrZXlf YXR0b2ZmLCAwKTsKKwkvKgorCSAqIFN0YXJ0IGFuIGluZGV4IHNjYW4uCisJICoKKwkgKiBY WFggTm8gcHJlZmV0Y2hpbmcgZm9yIHJlcGxpY2F0aW9uIGlkZW50aXR5LiBXZSBleHBlY3Qg dG8gZmluZCBqdXN0IG9uZQorCSAqIHJvdywgc28gcHJlZmV0Y2hpbmcgd291bGQgYmUgcG9p bnRsZXNzLgorCSAqLworCXNjYW4gPSBpbmRleF9iZWdpbnNjYW4ocmVsLCBpZHhyZWwsICZz bmFwLCBOVUxMLCBza2V5X2F0dG9mZiwgMCwgZmFsc2UpOwogCiByZXRyeToKIAlmb3VuZCA9 IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4b25s eXNjYW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleG9ubHlzY2FuLmMKaW5k ZXggZjQ2NGNjYTk1MDcuLjFhMTRmNWZhYTY4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9l eGVjdXRvci9ub2RlSW5kZXhvbmx5c2Nhbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L25vZGVJbmRleG9ubHlzY2FuLmMKQEAgLTQ5LDcgKzQ5LDEzIEBACiBzdGF0aWMgVHVwbGVU YWJsZVNsb3QgKkluZGV4T25seU5leHQoSW5kZXhPbmx5U2NhblN0YXRlICpub2RlKTsKIHN0 YXRpYyB2b2lkIFN0b3JlSW5kZXhUdXBsZShJbmRleE9ubHlTY2FuU3RhdGUgKm5vZGUsIFR1 cGxlVGFibGVTbG90ICpzbG90LAogCQkJCQkJCUluZGV4VHVwbGUgaXR1cCwgVHVwbGVEZXNj IGl0dXBkZXNjKTsKK3N0YXRpYyBib29sIGlvc19wcmVmZXRjaF9ibG9jayhJbmRleFNjYW5E ZXNjIHNjYW4sIHZvaWQgKmRhdGEsCisJCQkJCQkJICAgSW5kZXhTY2FuQmF0Y2hQb3MgKnBv cyk7CiAKKy8qIHZhbHVlcyBzdG9yZWQgaW4gaW9zX3ByZWZldGNoX2Jsb2NrIGluIHRoZSBi YXRjaCBjYWNoZSAqLworI2RlZmluZQkJSU9TX1VOS05PV05fVklTSUJJTElUWQkJMAkvKiBk ZWZhdWx0IHZhbHVlICovCisjZGVmaW5lCQlJT1NfQUxMX1ZJU0lCTEUJCQkJMQorI2RlZmlu ZQkJSU9TX05PVF9BTExfVklTSUJMRQkJCTIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoJCUluZGV4 T25seU5leHQKQEAgLTk0LDE1ICsxMDAsMjYgQEAgSW5kZXhPbmx5TmV4dChJbmRleE9ubHlT Y2FuU3RhdGUgKm5vZGUpCiAJCQkJCQkJCSAgIGVzdGF0ZS0+ZXNfc25hcHNob3QsCiAJCQkJ CQkJCSAgICZub2RlLT5pb3NzX0luc3RydW1lbnQsCiAJCQkJCQkJCSAgIG5vZGUtPmlvc3Nf TnVtU2NhbktleXMsCi0JCQkJCQkJCSAgIG5vZGUtPmlvc3NfTnVtT3JkZXJCeUtleXMpOwor CQkJCQkJCQkgICBub2RlLT5pb3NzX051bU9yZGVyQnlLZXlzLAorCQkJCQkJCQkgICBub2Rl LT5pb3NzX0NhbkJhdGNoKTsKIAogCQlub2RlLT5pb3NzX1NjYW5EZXNjID0gc2NhbmRlc2M7 CiAKLQogCQkvKiBTZXQgaXQgdXAgZm9yIGluZGV4LW9ubHkgc2NhbiAqLwogCQlub2RlLT5p b3NzX1NjYW5EZXNjLT54c193YW50X2l0dXAgPSB0cnVlOwogCQlub2RlLT5pb3NzX1ZNQnVm ZmVyID0gSW52YWxpZEJ1ZmZlcjsKIAorCQkvKgorCQkgKiBTZXQgdGhlIHByZWZldGNoIGNh bGxiYWNrIGluZm8sIGlmIHRoZSBzY2FuIGhhcyBiYXRjaGluZyBlbmFibGVkCisJCSAqICh3 ZSBvbmx5IGtub3cgd2hhdCBhZnRlciBpbmRleF9iZWdpbnNjYW4sIHdoaWNoIGFsc28gY2hl Y2tzIHdoaWNoCisJCSAqIGNhbGxiYWNrcyBhcmUgZGVmaW5lZCBmb3IgdGhlIEFNLgorCQkg Ki8KKwkJaWYgKHNjYW5kZXNjLT54c19iYXRjaGVzICE9IE5VTEwpCisJCXsKKwkJCXNjYW5k ZXNjLT54c19iYXRjaGVzLT5wcmVmZXRjaENhbGxiYWNrID0gaW9zX3ByZWZldGNoX2Jsb2Nr OworCQkJc2NhbmRlc2MtPnhzX2JhdGNoZXMtPnByZWZldGNoQXJndW1lbnQgPSAodm9pZCAq KSBub2RlOworCQl9CisKIAkJLyoKIAkJICogSWYgbm8gcnVuLXRpbWUga2V5cyB0byBjYWxj dWxhdGUgb3IgdGhleSBhcmUgcmVhZHksIGdvIGFoZWFkIGFuZAogCQkgKiBwYXNzIHRoZSBz Y2Fua2V5cyB0byB0aGUgaW5kZXggQU0uCkBAIC0xMjAsMTAgKzEzNyw0MiBAQCBJbmRleE9u bHlOZXh0KEluZGV4T25seVNjYW5TdGF0ZSAqbm9kZSkKIAkgKi8KIAl3aGlsZSAoKHRpZCA9 IGluZGV4X2dldG5leHRfdGlkKHNjYW5kZXNjLCBkaXJlY3Rpb24pKSAhPSBOVUxMKQogCXsK KwkJYm9vbAkJYWxsX3Zpc2libGU7CiAJCWJvb2wJCXR1cGxlX2Zyb21faGVhcCA9IGZhbHNl OwogCiAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiAKKwkJLyoKKwkJICogV2l0aG91dCBi YXRjaGluZywgaW5zcGVjdCB0aGUgVk0gZGlyZWN0bHkuIFdpdGggYmF0Y2hpbmcsIHdlIG5l ZWQKKwkJICogdG8gcmV0cmlldmUgdGhlIHZpc2liaWxpdHkgaW5mb3JtYXRpb24gc2VlbiBi eSB0aGUgcmVhZF9zdHJlYW0KKwkJICogY2FsbGJhY2sgKG9yIHJhdGhlciBieSBpb3NfcHJl ZmV0Y2hfYmxvY2spLCBvdGhlcndpc2UgdGhlCisJCSAqIHJlYWRfc3RyZWFtIG1pZ2h0IGdl dCBvdXQgb2Ygc3luYyAoaWYgdGhlIFZNIGdvdCB1cGRhdGVkIHNpbmNlCisJCSAqIHRoZW4p LgorCQkgKi8KKwkJaWYgKHNjYW5kZXNjLT54c19iYXRjaGVzID09IE5VTEwpCisJCXsKKwkJ CWFsbF92aXNpYmxlID0gVk1fQUxMX1ZJU0lCTEUoc2NhbmRlc2MtPmhlYXBSZWxhdGlvbiwK KwkJCQkJCQkJCQkgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpLAorCQkJCQkJCQkJ CSAmbm9kZS0+aW9zc19WTUJ1ZmZlcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJ ICogUmV1c2UgdGhlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBwYWdlIHZpc2liaWxpdHkgaW5m bywgb3IKKwkJCSAqIGNhbGN1bGF0ZSBpdCBub3cuIElmIHdlIGRlY2lkZWQgbm90IHRvIHBy ZWZldGNoIHRoZSBibG9jaywgdGhlCisJCQkgKiBwYWdlIGhhZCB0byBiZSBhbGwtdmlzaWJs ZSBhdCB0aGF0IHBvaW50LiBUaGUgVk0gYml0IG1pZ2h0IGhhdmUKKwkJCSAqIGNoYW5nZWQg c2luY2UgdGhlbiwgYnV0IHRoZSB0dXBsZSB2aXNpYmlsaXR5IGNvdWxkIG5vdCBoYXZlLgor CQkJICoKKwkJCSAqIFhYWCBJdCdzIGEgYml0IHdlaXJkIHdlIHVzZSB0aGUgdmlzaWJpbGl0 eSB0byBkZWNpZGUgaWYgd2UKKwkJCSAqIHNob3VsZCBza2lwIHByZWZldGNoaW5nIHRoZSBi bG9jaywgYW5kIHRoZW4gZGVkdWNlIHRoZQorCQkJICogdmlzaWJpbGl0eSBmcm9tIHRoYXQg KGV2ZW4gaWYgaXQgbWF0Y2hlcyBwcmV0dHkgY2xlYXJseSkuIEJ1dAorCQkJICogbWF5YmUg d2UgY291bGQvc2hvdWxkIGhhdmUgYSBtb3JlIGRpcmVjdCB3YXkgdG8gcmVhZCB0aGUKKwkJ CSAqIHByaXZhdGUgc3RhdGU/CisJCQkgKi8KKwkJCWFsbF92aXNpYmxlID0gIWlvc19wcmVm ZXRjaF9ibG9jayhzY2FuZGVzYywgbm9kZSwKKwkJCQkJCQkJCQkJICAmc2NhbmRlc2MtPnhz X2JhdGNoZXMtPnJlYWRQb3MpOworCQl9CisKIAkJLyoKIAkJICogV2UgY2FuIHNraXAgdGhl IGhlYXAgZmV0Y2ggaWYgdGhlIFRJRCByZWZlcmVuY2VzIGEgaGVhcCBwYWdlIG9uCiAJCSAq IHdoaWNoIGFsbCB0dXBsZXMgYXJlIGtub3duIHZpc2libGUgdG8gZXZlcnlib2R5LiAgSW4g YW55IGNhc2UsCkBAIC0xNTgsOSArMjA3LDcgQEAgSW5kZXhPbmx5TmV4dChJbmRleE9ubHlT Y2FuU3RhdGUgKm5vZGUpCiAJCSAqIEl0J3Mgd29ydGggZ29pbmcgdGhyb3VnaCB0aGlzIGNv bXBsZXhpdHkgdG8gYXZvaWQgbmVlZGluZyB0byBsb2NrCiAJCSAqIHRoZSBWTSBidWZmZXIs IHdoaWNoIGNvdWxkIGNhdXNlIHNpZ25pZmljYW50IGNvbnRlbnRpb24uCiAJCSAqLwotCQlp ZiAoIVZNX0FMTF9WSVNJQkxFKHNjYW5kZXNjLT5oZWFwUmVsYXRpb24sCi0JCQkJCQkJSXRl bVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpLAotCQkJCQkJCSZub2RlLT5pb3NzX1ZNQnVm ZmVyKSkKKwkJaWYgKCFhbGxfdmlzaWJsZSkKIAkJewogCQkJLyoKIAkJCSAqIFJhdHMsIHdl IGhhdmUgdG8gdmlzaXQgdGhlIGhlYXAgdG8gY2hlY2sgdmlzaWJpbGl0eS4KQEAgLTU5Niw2 ICs2NDMsMjAgQEAgRXhlY0luaXRJbmRleE9ubHlTY2FuKEluZGV4T25seVNjYW4gKm5vZGUs IEVTdGF0ZSAqZXN0YXRlLCBpbnQgZWZsYWdzKQogCWluZGV4c3RhdGUtPnJlY2hlY2txdWFs ID0KIAkJRXhlY0luaXRRdWFsKG5vZGUtPnJlY2hlY2txdWFsLCAoUGxhblN0YXRlICopIGlu ZGV4c3RhdGUpOwogCisJLyoKKwkgKiBBbGwgaW5kZXggc2NhbnMgY2FuIGRvIGJhdGNoaW5n LgorCSAqCisJICogWFhYIE1heWJlIHRoaXMgc2hvdWxkIGNoZWNrIGlmIHRoZSBpbmRleCBB TSBzdXBwb3J0cyBiYXRjaGluZywgb3IgZXZlbgorCSAqIGNhbGwgc29tZXRoaW5nIGxpa2Ug ImFtY2FuYmF0Y2giIChkb2VzIG5vdCBleGlzdCB5ZXQpLiBPciBjaGVjayB0aGUKKwkgKiBl bmFibGVfaW5kZXhzY2FuX2JhdGNoaW5nIEdVQz8KKwkgKgorCSAqIFhYWCBGb3Igbm93IHdl IG9ubHkga25vdyBpZiB0aGUgc2NhbiBnZXRzIHRvIHVzZSBiYXRjaGluZyBhZnRlciB0aGUK KwkgKiBpbmRleF9iZWdpbnNjYW4oKSByZXR1cm5zLCBzbyBtYXliZSB0aGlzIG5hbWUgaXMg YSBiaXQgbWlzbGVhZGluZy4gSXQncworCSAqIG1vcmUgYWJvdXQgImFsbG93IGJhdGNoaW5n Ii4gQnV0IG1heWJlIHRoaXMgZmllbGQgaXMgdW5uZWNlc3NhcnkgLSB3ZQorCSAqIGNoZWNr IGFsbCB0aGUgaW50ZXJlc3Rpbmcgc3R1ZmYgaW4gaW5kZXhfYmVnaW5zY2FuKCkgYW55d2F5 LgorCSAqLworCWluZGV4c3RhdGUtPmlvc3NfQ2FuQmF0Y2ggPSB0cnVlOworCiAJLyoKIAkg KiBJZiB3ZSBhcmUganVzdCBkb2luZyBFWFBMQUlOIChpZSwgYXJlbid0IGdvaW5nIHRvIHJ1 biB0aGUgcGxhbiksIHN0b3AKIAkgKiBoZXJlLiAgVGhpcyBhbGxvd3MgYW4gaW5kZXgtYWR2 aXNvciBwbHVnaW4gdG8gRVhQTEFJTiBhIHBsYW4gY29udGFpbmluZwpAQCAtNzgzLDEzICs4 NDQsMjEgQEAgRXhlY0luZGV4T25seVNjYW5Jbml0aWFsaXplRFNNKEluZGV4T25seVNjYW5T dGF0ZSAqbm9kZSwKIAkJcmV0dXJuOwogCX0KIAorCS8qCisJICogWFhYIERvIHdlIGFjdHVh bGx5IHdhbnQgcHJlZmV0Y2hpbmcgZm9yIHBhcmFsbGVsIGluZGV4IHNjYW5zPyBNYXliZQor CSAqIG5vdCwgYnV0IHRoZW4gd2UgbmVlZCB0byBiZSBjYXJlZnVsIG5vdCB0byBjYWxsIGlu ZGV4X2JhdGNoX2dldG5leHRfdGlkCisJICogKHdoaWNoIG5vdyBjYW4gaGFwcGVuLCBiZWNh dXNlIHdlJ2xsIGNhbGwgSW5kZXhPbmx5TmV4dCBldmVuIGZvcgorCSAqIHBhcmFsbGVsIHBs YW5zKS4gQWx0aG91Z2gsIHRoYXQgc2hvdWxkIG5vdCBoYXBwZW4sIGJlY2F1c2Ugd2Ugb25s eSBjYWxsCisJICogdGhhdCB3aXRoICh4c19iYXRjaGVzICE9IE5VTEwpLgorCSAqLwogCW5v ZGUtPmlvc3NfU2NhbkRlc2MgPQogCQlpbmRleF9iZWdpbnNjYW5fcGFyYWxsZWwobm9kZS0+ c3Muc3NfY3VycmVudFJlbGF0aW9uLAogCQkJCQkJCQkgbm9kZS0+aW9zc19SZWxhdGlvbkRl c2MsCiAJCQkJCQkJCSAmbm9kZS0+aW9zc19JbnN0cnVtZW50LAogCQkJCQkJCQkgbm9kZS0+ aW9zc19OdW1TY2FuS2V5cywKIAkJCQkJCQkJIG5vZGUtPmlvc3NfTnVtT3JkZXJCeUtleXMs Ci0JCQkJCQkJCSBwaXNjYW4pOworCQkJCQkJCQkgcGlzY2FuLAorCQkJCQkJCQkgbm9kZS0+ aW9zc19DYW5CYXRjaCk7CiAJbm9kZS0+aW9zc19TY2FuRGVzYy0+eHNfd2FudF9pdHVwID0g dHJ1ZTsKIAlub2RlLT5pb3NzX1ZNQnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKIApAQCAtODQ5 LDEzICs5MTgsMTUgQEAgRXhlY0luZGV4T25seVNjYW5Jbml0aWFsaXplV29ya2VyKEluZGV4 T25seVNjYW5TdGF0ZSAqbm9kZSwKIAkJcmV0dXJuOwogCX0KIAorCS8qIFhYWCBEbyB3ZSBh Y3R1YWxseSB3YW50IHByZWZldGNoaW5nIGZvciBwYXJhbGxlbCBpbmRleCBzY2Fucz8gKi8K IAlub2RlLT5pb3NzX1NjYW5EZXNjID0KIAkJaW5kZXhfYmVnaW5zY2FuX3BhcmFsbGVsKG5v ZGUtPnNzLnNzX2N1cnJlbnRSZWxhdGlvbiwKIAkJCQkJCQkJIG5vZGUtPmlvc3NfUmVsYXRp b25EZXNjLAogCQkJCQkJCQkgJm5vZGUtPmlvc3NfSW5zdHJ1bWVudCwKIAkJCQkJCQkJIG5v ZGUtPmlvc3NfTnVtU2NhbktleXMsCiAJCQkJCQkJCSBub2RlLT5pb3NzX051bU9yZGVyQnlL ZXlzLAotCQkJCQkJCQkgcGlzY2FuKTsKKwkJCQkJCQkJIHBpc2NhbiwKKwkJCQkJCQkJIG5v ZGUtPmlvc3NfQ2FuQmF0Y2gpOwogCW5vZGUtPmlvc3NfU2NhbkRlc2MtPnhzX3dhbnRfaXR1 cCA9IHRydWU7CiAKIAkvKgpAQCAtODg5LDMgKzk2MCw1MSBAQCBFeGVjSW5kZXhPbmx5U2Nh blJldHJpZXZlSW5zdHJ1bWVudGF0aW9uKEluZGV4T25seVNjYW5TdGF0ZSAqbm9kZSkKIAlu b2RlLT5pb3NzX1NoYXJlZEluZm8gPSBwYWxsb2Moc2l6ZSk7CiAJbWVtY3B5KG5vZGUtPmlv c3NfU2hhcmVkSW5mbywgU2hhcmVkSW5mbywgc2l6ZSk7CiB9CisKKy8qIEZJWE1FIGR1cGxp Y2F0ZSBmcm9tIGluZGV4YW0uYyAqLworI2RlZmluZSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4s IGlkeCkJXAorCQkoKHNjYW4pLT54c19iYXRjaGVzLT5iYXRjaGVzWyhpZHgpICUgKHNjYW4p LT54c19iYXRjaGVzLT5tYXhCYXRjaGVzXSkKKworLyoKKyAqIGlvc19wcmVmZXRjaF9ibG9j aworICoJCUNhbGxiYWNrIHRvIG9ubHkgcHJlZmV0Y2ggYmxvY2tzIHRoYXQgYXJlIG5vdCBh bGwtdmlzaWJsZS4KKyAqCisgKiBXZSBkb24ndCB3YW50IHRvIGluc3BlY3QgdGhlIHZpc2li aWxpdHkgbWFwIHJlcGVhdGVkbHksIHNvIHRoZSByZXN1bHQgb2YKKyAqIFZNX0FMTF9WSVNJ QkxFIGlzIHN0b3JlZCBpbiB0aGUgYmF0Y2ggcHJpdmF0ZSBkYXRhLiBUaGUgdmFsdWVzIGFy ZSBzZXQKKyAqIHRvIDAgYnkgZGVmYXVsdCwgc28gd2UgdXNlIHR3byBjb25zdGFudHMgdG8g cmVtZW1iZXIgaWYgYWxsLXZpc2libGUgb3IKKyAqIG5vdCBhbGwtdmlzaWJsZS4KKyAqCisg KiBIb3dldmVyLCB0aGlzIGlzIG5vdCBtZXJlbHkgYSBxdWVzdGlvbiBvZiBwZXJmb3JtYW5j ZS4gVGhlIFZNIG1heSBnZXQKKyAqIG1vZGlmaWVkIGR1cmluZyB0aGUgc2NhbiwgYW5kIHdl IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSB0d28gcGxhY2VzICh0aGUKKyAqIHJlYWRfbmV4dCBj YWxsYmFjayBhbmQgdGhlIGluZGV4X2ZldGNoX2hlYXAgaGVyZSkgbWFrZSB0aGUgc2FtZSBk ZWNpc2lvbiwKKyAqIG90aGVyd2lzZSB3ZSBtaWdodCBnZXQgb3V0IG9mIHN5bmMgd2l0aCB0 aGUgc3RyZWFtLiBGb3IgZXhhbXBsZSwgdGhlCisgKiBjYWxsYmFjayBtaWdodCBmaW5kIGEg cGFnZSBpcyBhbGwtdmlzaWJsZSAoYW5kIHNraXBzIHJlYWRpbmcgdGhlIGJsb2NrKSwKKyAq IGFuZCB0aGVuIHNvbWVvbmUgbWlnaHQgdXBkYXRlIHRoZSBwYWdlLCByZXNldHRpbmcgdGhl IFZNIGJpdC4gSWYgdGhpcworICogcGxhY2UgYXR0ZW1wdHMgdG8gcmVhZCB0aGUgcGFnZSBm cm9tIHRoZSBzdHJlYW0sIGl0J2xsIGZhaWwgYmVjYXVzZSBpdAorICogd2lsbCBwcm9iYWJs eSByZWNlaXZlIGFuIGVudGlyZWx5IGRpZmZlcmVudCBwYWdlLgorICovCitzdGF0aWMgYm9v bAoraW9zX3ByZWZldGNoX2Jsb2NrKEluZGV4U2NhbkRlc2Mgc2Nhbiwgdm9pZCAqYXJnLCBJ bmRleFNjYW5CYXRjaFBvcyAqcG9zKQoreworCUluZGV4T25seVNjYW5TdGF0ZSAqbm9kZSA9 IChJbmRleE9ubHlTY2FuU3RhdGUgKikgYXJnOworCUluZGV4U2NhbkJhdGNoIGJhdGNoID0g SU5ERVhfU0NBTl9CQVRDSChzY2FuLCBwb3MtPmJhdGNoKTsKKworCWlmIChiYXRjaC0+cHJp dmF0ZURhdGEgPT0gTlVMTCkKKwkJYmF0Y2gtPnByaXZhdGVEYXRhID0gcGFsbG9jMChzaXpl b2YoRGF0dW0pICogKGJhdGNoLT5sYXN0SXRlbSArIDEpKTsKKworCWlmIChiYXRjaC0+cHJp dmF0ZURhdGFbcG9zLT5pbmRleF0gPT0gSU9TX1VOS05PV05fVklTSUJJTElUWSkKKwl7CisJ CWJvb2wJCWFsbF92aXNpYmxlOworCQlJdGVtUG9pbnRlciB0aWQgPSAmYmF0Y2gtPml0ZW1z W3Bvcy0+aW5kZXhdLmhlYXBUaWQ7CisKKwkJYWxsX3Zpc2libGUgPSBWTV9BTExfVklTSUJM RShzY2FuLT5oZWFwUmVsYXRpb24sCisJCQkJCQkJCQkgSXRlbVBvaW50ZXJHZXRCbG9ja051 bWJlcih0aWQpLAorCQkJCQkJCQkJICZub2RlLT5pb3NzX1ZNQnVmZmVyKTsKKworCQliYXRj aC0+cHJpdmF0ZURhdGFbcG9zLT5pbmRleF0KKwkJCT0gYWxsX3Zpc2libGUgPyBJT1NfQUxM X1ZJU0lCTEUgOiBJT1NfTk9UX0FMTF9WSVNJQkxFOworCX0KKworCS8qIHByZWZldGNoIG9u bHkgYmxvY2tzIHRoYXQgYXJlIG5vdCBhbGwtdmlzaWJsZSAqLworCXJldHVybiAoYmF0Y2gt PnByaXZhdGVEYXRhW3Bvcy0+aW5kZXhdID09IElPU19OT1RfQUxMX1ZJU0lCTEUpOworfQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jIGIvc3Jj L2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jCmluZGV4IDdmY2FhMzdmZTYyLi4x NzdkNzRjMmMyNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4 c2Nhbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYwpAQCAt MTExLDcgKzExMSw4IEBAIEluZGV4TmV4dChJbmRleFNjYW5TdGF0ZSAqbm9kZSkKIAkJCQkJ CQkJICAgZXN0YXRlLT5lc19zbmFwc2hvdCwKIAkJCQkJCQkJICAgJm5vZGUtPmlzc19JbnN0 cnVtZW50LAogCQkJCQkJCQkgICBub2RlLT5pc3NfTnVtU2NhbktleXMsCi0JCQkJCQkJCSAg IG5vZGUtPmlzc19OdW1PcmRlckJ5S2V5cyk7CisJCQkJCQkJCSAgIG5vZGUtPmlzc19OdW1P cmRlckJ5S2V5cywKKwkJCQkJCQkJICAgbm9kZS0+aXNzX0NhbkJhdGNoKTsKIAogCQlub2Rl LT5pc3NfU2NhbkRlc2MgPSBzY2FuZGVzYzsKIApAQCAtMjAxLDEzICsyMDIsMTYgQEAgSW5k ZXhOZXh0V2l0aFJlb3JkZXIoSW5kZXhTY2FuU3RhdGUgKm5vZGUpCiAJCS8qCiAJCSAqIFdl IHJlYWNoIGhlcmUgaWYgdGhlIGluZGV4IHNjYW4gaXMgbm90IHBhcmFsbGVsLCBvciBpZiB3 ZSdyZQogCQkgKiBzZXJpYWxseSBleGVjdXRpbmcgYW4gaW5kZXggc2NhbiB0aGF0IHdhcyBw bGFubmVkIHRvIGJlIHBhcmFsbGVsLgorCQkgKgorCQkgKiBYWFggU2hvdWxkIHdlIHVzZSBi YXRjaGluZyBoZXJlPyBEb2VzIGl0IGV2ZW4gd29yayBmb3IgcmVvcmRlcmluZz8KIAkJICov CiAJCXNjYW5kZXNjID0gaW5kZXhfYmVnaW5zY2FuKG5vZGUtPnNzLnNzX2N1cnJlbnRSZWxh dGlvbiwKIAkJCQkJCQkJICAgbm9kZS0+aXNzX1JlbGF0aW9uRGVzYywKIAkJCQkJCQkJICAg ZXN0YXRlLT5lc19zbmFwc2hvdCwKIAkJCQkJCQkJICAgJm5vZGUtPmlzc19JbnN0cnVtZW50 LAogCQkJCQkJCQkgICBub2RlLT5pc3NfTnVtU2NhbktleXMsCi0JCQkJCQkJCSAgIG5vZGUt Pmlzc19OdW1PcmRlckJ5S2V5cyk7CisJCQkJCQkJCSAgIG5vZGUtPmlzc19OdW1PcmRlckJ5 S2V5cywKKwkJCQkJCQkJICAgZmFsc2UpOwogCiAJCW5vZGUtPmlzc19TY2FuRGVzYyA9IHNj YW5kZXNjOwogCkBAIC05NjUsNiArOTY5LDE4IEBAIEV4ZWNJbml0SW5kZXhTY2FuKEluZGV4 U2NhbiAqbm9kZSwgRVN0YXRlICplc3RhdGUsIGludCBlZmxhZ3MpCiAJaW5kZXhzdGF0ZS0+ aW5kZXhvcmRlcmJ5b3JpZyA9CiAJCUV4ZWNJbml0RXhwckxpc3Qobm9kZS0+aW5kZXhvcmRl cmJ5b3JpZywgKFBsYW5TdGF0ZSAqKSBpbmRleHN0YXRlKTsKIAorCS8qCisJICogQWxsIGlu ZGV4IHNjYW5zIGNhbiBkbyBiYXRjaGluZy4KKwkgKgorCSAqIFhYWCBNYXliZSB0aGlzIHNo b3VsZCBjaGVjayBpZiB0aGUgaW5kZXggQU0gc3VwcG9ydHMgYmF0Y2hpbmcsIG9yIGV2ZW4K KwkgKiBjYWxsIHNvbWV0aGluZyBsaWtlICJhbWNhbmJhdGNoIiAoZG9lcyBub3QgZXhpc3Qg eWV0KS4gT3IgY2hlY2sgdGhlCisJICogZW5hYmxlX2luZGV4c2Nhbl9iYXRjaGluZyBHVUM/ CisJICoKKwkgKiBYWFggV2VsbCwgd2UgZGlzYWJsZSBiYXRjaGluZyBmb3IgcmVvcmRlcmlu Zywgc28gbWF5YmUgd2Ugc2hvdWxkIGNoZWNrCisJICogdGhhdCBoZXJlIGluc3RlYWQ/IEJ1 dCBtYXliZSBpdCdzIHVubmVjZXNzYXJ5IGxpbWl0YXRpb24/CisJICovCisJaW5kZXhzdGF0 ZS0+aXNzX0NhbkJhdGNoID0gdHJ1ZTsKKwogCS8qCiAJICogSWYgd2UgYXJlIGp1c3QgZG9p bmcgRVhQTEFJTiAoaWUsIGFyZW4ndCBnb2luZyB0byBydW4gdGhlIHBsYW4pLCBzdG9wCiAJ ICogaGVyZS4gIFRoaXMgYWxsb3dzIGFuIGluZGV4LWFkdmlzb3IgcGx1Z2luIHRvIEVYUExB SU4gYSBwbGFuIGNvbnRhaW5pbmcKQEAgLTE3MTksMTMgKzE3MzUsMTcgQEAgRXhlY0luZGV4 U2NhbkluaXRpYWxpemVEU00oSW5kZXhTY2FuU3RhdGUgKm5vZGUsCiAJCXJldHVybjsKIAl9 CiAKKwkvKgorCSAqIFhYWCBEbyB3ZSBhY3R1YWxseSB3YW50IHByZWZldGNoaW5nIGZvciBw YXJhbGxlbCBpbmRleCBzY2Fucz8KKwkgKi8KIAlub2RlLT5pc3NfU2NhbkRlc2MgPQogCQlp bmRleF9iZWdpbnNjYW5fcGFyYWxsZWwobm9kZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uLAog CQkJCQkJCQkgbm9kZS0+aXNzX1JlbGF0aW9uRGVzYywKIAkJCQkJCQkJICZub2RlLT5pc3Nf SW5zdHJ1bWVudCwKIAkJCQkJCQkJIG5vZGUtPmlzc19OdW1TY2FuS2V5cywKIAkJCQkJCQkJ IG5vZGUtPmlzc19OdW1PcmRlckJ5S2V5cywKLQkJCQkJCQkJIHBpc2Nhbik7CisJCQkJCQkJ CSBwaXNjYW4sCisJCQkJCQkJCSBub2RlLT5pc3NfQ2FuQmF0Y2gpOwogCiAJLyoKIAkgKiBJ ZiBubyBydW4tdGltZSBrZXlzIHRvIGNhbGN1bGF0ZSBvciB0aGV5IGFyZSByZWFkeSwgZ28g YWhlYWQgYW5kIHBhc3MKQEAgLTE3ODMsMTMgKzE4MDMsMTcgQEAgRXhlY0luZGV4U2Nhbklu aXRpYWxpemVXb3JrZXIoSW5kZXhTY2FuU3RhdGUgKm5vZGUsCiAJCXJldHVybjsKIAl9CiAK KwkvKgorCSAqIFhYWCBEbyB3ZSBhY3R1YWxseSB3YW50IHByZWZldGNoaW5nIGZvciBwYXJh bGxlbCBpbmRleCBzY2Fucz8KKwkgKi8KIAlub2RlLT5pc3NfU2NhbkRlc2MgPQogCQlpbmRl eF9iZWdpbnNjYW5fcGFyYWxsZWwobm9kZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uLAogCQkJ CQkJCQkgbm9kZS0+aXNzX1JlbGF0aW9uRGVzYywKIAkJCQkJCQkJICZub2RlLT5pc3NfSW5z dHJ1bWVudCwKIAkJCQkJCQkJIG5vZGUtPmlzc19OdW1TY2FuS2V5cywKIAkJCQkJCQkJIG5v ZGUtPmlzc19OdW1PcmRlckJ5S2V5cywKLQkJCQkJCQkJIHBpc2Nhbik7CisJCQkJCQkJCSBw aXNjYW4sCisJCQkJCQkJCSBub2RlLT5pc3NfQ2FuQmF0Y2gpOwogCiAJLyoKIAkgKiBJZiBu byBydW4tdGltZSBrZXlzIHRvIGNhbGN1bGF0ZSBvciB0aGV5IGFyZSByZWFkeSwgZ28gYWhl YWQgYW5kIHBhc3MKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5j cy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKaW5kZXggYTk2YjFiOWMw YmMuLmZhY2M4M2JiODNhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs ZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYwpAQCAtNjcx OSw5ICs2NzE5LDE0IEBAIGdldF9hY3R1YWxfdmFyaWFibGVfZW5kcG9pbnQoUmVsYXRpb24g aGVhcFJlbCwKIAlJbml0Tm9uVmFjdXVtYWJsZVNuYXBzaG90KFNuYXBzaG90Tm9uVmFjdXVt YWJsZSwKIAkJCQkJCQkgIEdsb2JhbFZpc1Rlc3RGb3IoaGVhcFJlbCkpOwogCisJLyoKKwkg KiBYWFggSSdtIG5vdCBzdXJlIGFib3V0IGJhdGNoaW5nL3ByZWZldGNoaW5nIGhlcmUuIElu IG1vc3QgY2FzZXMgd2UKKwkgKiBleHBlY3QgdG8gZmluZCB0aGUgZW5kcG9pbnRzIGltbWVk aWF0ZWx5LCBidXQgc29tZXRpbWVzIHdlIGhhdmUgYSBsb3QKKwkgKiBvZiBkZWFkIHR1cGxl cyAtIGFuZCB0aGVuIHByZWZldGNoaW5nIG1pZ2h0IGhlbHAuCisJICovCiAJaW5kZXhfc2Nh biA9IGluZGV4X2JlZ2luc2NhbihoZWFwUmVsLCBpbmRleFJlbCwKIAkJCQkJCQkJICZTbmFw c2hvdE5vblZhY3V1bWFibGUsIE5VTEwsCi0JCQkJCQkJCSAxLCAwKTsKKwkJCQkJCQkJIDEs IDAsIGZhbHNlKTsKIAkvKiBTZXQgaXQgdXAgZm9yIGluZGV4LW9ubHkgc2NhbiAqLwogCWlu ZGV4X3NjYW4tPnhzX3dhbnRfaXR1cCA9IHRydWU7CiAJaW5kZXhfcmVzY2FuKGluZGV4X3Nj YW4sIHNjYW5rZXlzLCAxLCBOVUxMLCAwKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0 aWxzL21pc2MvZ3VjX3RhYmxlcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFi bGVzLmMKaW5kZXggMmY4Y2JkODY3NTkuLjM2ZDJiN2YxZTY4IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYworKysgYi9zcmMvYmFja2VuZC91dGls cy9taXNjL2d1Y190YWJsZXMuYwpAQCAtODA5LDYgKzgwOSwxNiBAQCBzdHJ1Y3QgY29uZmln X2Jvb2wgQ29uZmlndXJlTmFtZXNCb29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxMLCBO VUxMCiAJfSwKKwl7CisJCXsiZW5hYmxlX2luZGV4c2Nhbl9iYXRjaGluZyIsIFBHQ19VU0VS U0VULCBRVUVSWV9UVU5JTkdfTUVUSE9ELAorCQkJZ2V0dGV4dF9ub29wKCJFbmFibGVzIHRo ZSBwbGFubmVyJ3MgdXNlIG9mIGluZGV4LXNjYW4gYmF0Y2hpbmcuIiksCisJCQlOVUxMLAor CQkJR1VDX0VYUExBSU4KKwkJfSwKKwkJJmVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcsCisJ CXRydWUsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAogCXsKIAkJeyJlbmFibGVfaW5kZXhv bmx5c2NhbiIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdfTUVUSE9ELAogCQkJZ2V0dGV4 dF9ub29wKCJFbmFibGVzIHRoZSBwbGFubmVyJ3MgdXNlIG9mIGluZGV4LW9ubHktc2NhbiBw bGFucy4iKSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNx bC5jb25mLnNhbXBsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25m LnNhbXBsZQppbmRleCAzNDgyNmQwMTM4MC4uNjQ5ZGYyYjA2YTAgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9zcmMv YmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTQxNSw2ICs0 MTUsNyBAQAogI2VuYWJsZV9oYXNoam9pbiA9IG9uCiAjZW5hYmxlX2luY3JlbWVudGFsX3Nv cnQgPSBvbgogI2VuYWJsZV9pbmRleHNjYW4gPSBvbgorI2VuYWJsZV9pbmRleHNjYW5fYmF0 Y2hpbmcgPSBvbgogI2VuYWJsZV9pbmRleG9ubHlzY2FuID0gb24KICNlbmFibGVfbWF0ZXJp YWwgPSBvbgogI2VuYWJsZV9tZW1vaXplID0gb24KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L2FjY2Vzcy9hbWFwaS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2FtYXBpLmgKaW5kZXggNTI5 MTZiYWI3YTMuLjAwMjhiYjU1ODQzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv YW1hcGkuaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvYW1hcGkuaApAQCAtMTk2LDYgKzE5 NiwxNCBAQCB0eXBlZGVmIHZvaWQgKCphbXJlc2Nhbl9mdW5jdGlvbikgKEluZGV4U2NhbkRl c2Mgc2NhbiwKIHR5cGVkZWYgYm9vbCAoKmFtZ2V0dHVwbGVfZnVuY3Rpb24pIChJbmRleFNj YW5EZXNjIHNjYW4sCiAJCQkJCQkJCQkgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pOwogCisv KiBuZXh0IGJhdGNoIG9mIHZhbGlkIHR1cGxlcyAqLwordHlwZWRlZiBJbmRleFNjYW5CYXRj aCgqYW1nZXRiYXRjaF9mdW5jdGlvbikgKEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJ CQkJICBTY2FuRGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKy8qIHJlbGVhc2UgYmF0Y2ggb2Yg dmFsaWQgdHVwbGVzICovCit0eXBlZGVmIHZvaWQgKCphbWZyZWViYXRjaF9mdW5jdGlvbikg KEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJCSAgSW5kZXhTY2FuQmF0Y2ggYmF0Y2gp OworCiAvKiBmZXRjaCBhbGwgdmFsaWQgdHVwbGVzICovCiB0eXBlZGVmIGludDY0ICgqYW1n ZXRiaXRtYXBfZnVuY3Rpb24pIChJbmRleFNjYW5EZXNjIHNjYW4sCiAJCQkJCQkJCQkgICBU SURCaXRtYXAgKnRibSk7CkBAIC0zMDcsNiArMzE1LDggQEAgdHlwZWRlZiBzdHJ1Y3QgSW5k ZXhBbVJvdXRpbmUKIAlhbWJlZ2luc2Nhbl9mdW5jdGlvbiBhbWJlZ2luc2NhbjsKIAlhbXJl c2Nhbl9mdW5jdGlvbiBhbXJlc2NhbjsKIAlhbWdldHR1cGxlX2Z1bmN0aW9uIGFtZ2V0dHVw bGU7IC8qIGNhbiBiZSBOVUxMICovCisJYW1nZXRiYXRjaF9mdW5jdGlvbiBhbWdldGJhdGNo OyAvKiBjYW4gYmUgTlVMTCAqLworCWFtZnJlZWJhdGNoX2Z1bmN0aW9uIGFtZnJlZWJhdGNo OwkvKiBjYW4gYmUgTlVMTCAqLwogCWFtZ2V0Yml0bWFwX2Z1bmN0aW9uIGFtZ2V0Yml0bWFw OwkvKiBjYW4gYmUgTlVMTCAqLwogCWFtZW5kc2Nhbl9mdW5jdGlvbiBhbWVuZHNjYW47CiAJ YW1tYXJrcG9zX2Z1bmN0aW9uIGFtbWFya3BvczsJLyogY2FuIGJlIE5VTEwgKi8KZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9nZW5hbS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNz L2dlbmFtLmgKaW5kZXggNWIyYWIxODFiNWYuLjhiZWY5NDJiMTFkIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2Vu YW0uaApAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBHRU5BTV9ICiAKICNpbmNsdWRlICJh Y2Nlc3MvaHR1cC5oIgorI2luY2x1ZGUgImFjY2Vzcy9pdHVwLmgiCiAjaW5jbHVkZSAiYWNj ZXNzL3NkaXIuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc2tleS5oIgogI2luY2x1ZGUgIm5vZGVz L3RpZGJpdG1hcC5oIgpAQCAtMTExLDYgKzExMiw3IEBAIHR5cGVkZWYgYm9vbCAoKkluZGV4 QnVsa0RlbGV0ZUNhbGxiYWNrKSAoSXRlbVBvaW50ZXIgaXRlbXB0ciwgdm9pZCAqc3RhdGUp OwogCiAvKiBzdHJ1Y3QgZGVmaW5pdGlvbnMgYXBwZWFyIGluIHJlbHNjYW4uaCAqLwogdHlw ZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuRGVzY0RhdGEgKkluZGV4U2NhbkRlc2M7Cit0eXBlZGVm IHN0cnVjdCBJbmRleFNjYW5CYXRjaERhdGEgKkluZGV4U2NhbkJhdGNoOwogdHlwZWRlZiBz dHJ1Y3QgU3lzU2NhbkRlc2NEYXRhICpTeXNTY2FuRGVzYzsKIAogdHlwZWRlZiBzdHJ1Y3Qg UGFyYWxsZWxJbmRleFNjYW5EZXNjRGF0YSAqUGFyYWxsZWxJbmRleFNjYW5EZXNjOwpAQCAt MTU1LDYgKzE1Nyw4IEBAIHR5cGVkZWYgc3RydWN0IEluZGV4T3JkZXJCeURpc3RhbmNlCiAg KiBnZW5lcmFsaXplZCBpbmRleF8gaW50ZXJmYWNlIHJvdXRpbmVzIChpbiBpbmRleGFtLmMp CiAgKi8KIAorZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgZW5hYmxlX2luZGV4c2Nhbl9iYXRj aGluZzsKKwogLyoKICAqIEluZGV4U2NhbklzVmFsaWQKICAqCQlUcnVlIGlmZiB0aGUgaW5k ZXggc2NhbiBpcyB2YWxpZC4KQEAgLTE3OSw3ICsxODMsOCBAQCBleHRlcm4gSW5kZXhTY2Fu RGVzYyBpbmRleF9iZWdpbnNjYW4oUmVsYXRpb24gaGVhcFJlbGF0aW9uLAogCQkJCQkJCQkJ IFJlbGF0aW9uIGluZGV4UmVsYXRpb24sCiAJCQkJCQkJCQkgU25hcHNob3Qgc25hcHNob3Qs CiAJCQkJCQkJCQkgSW5kZXhTY2FuSW5zdHJ1bWVudGF0aW9uICppbnN0cnVtZW50LAotCQkJ CQkJCQkJIGludCBua2V5cywgaW50IG5vcmRlcmJ5cyk7CisJCQkJCQkJCQkgaW50IG5rZXlz LCBpbnQgbm9yZGVyYnlzLAorCQkJCQkJCQkJIGJvb2wgZW5hYmxlX2JhdGNoaW5nKTsKIGV4 dGVybiBJbmRleFNjYW5EZXNjIGluZGV4X2JlZ2luc2Nhbl9iaXRtYXAoUmVsYXRpb24gaW5k ZXhSZWxhdGlvbiwKIAkJCQkJCQkJCQkJU25hcHNob3Qgc25hcHNob3QsCiAJCQkJCQkJCQkJ CUluZGV4U2Nhbkluc3RydW1lbnRhdGlvbiAqaW5zdHJ1bWVudCwKQEAgLTIwNSw3ICsyMTAs OCBAQCBleHRlcm4gSW5kZXhTY2FuRGVzYyBpbmRleF9iZWdpbnNjYW5fcGFyYWxsZWwoUmVs YXRpb24gaGVhcHJlbCwKIAkJCQkJCQkJCQkJICBSZWxhdGlvbiBpbmRleHJlbCwKIAkJCQkJ CQkJCQkJICBJbmRleFNjYW5JbnN0cnVtZW50YXRpb24gKmluc3RydW1lbnQsCiAJCQkJCQkJ CQkJCSAgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzLAotCQkJCQkJCQkJCQkgIFBhcmFsbGVs SW5kZXhTY2FuRGVzYyBwc2Nhbik7CisJCQkJCQkJCQkJCSAgUGFyYWxsZWxJbmRleFNjYW5E ZXNjIHBzY2FuLAorCQkJCQkJCQkJCQkgIGJvb2wgZW5hYmxlX2JhdGNoaW5nKTsKIGV4dGVy biBJdGVtUG9pbnRlciBpbmRleF9nZXRuZXh0X3RpZChJbmRleFNjYW5EZXNjIHNjYW4sCiAJ CQkJCQkJCQkgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pOwogc3RydWN0IFR1cGxlVGFibGVT bG90OwpAQCAtMjEzLDcgKzIxOSw2IEBAIGV4dGVybiBib29sIGluZGV4X2ZldGNoX2hlYXAo SW5kZXhTY2FuRGVzYyBzY2FuLCBzdHJ1Y3QgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOwogZXh0 ZXJuIGJvb2wgaW5kZXhfZ2V0bmV4dF9zbG90KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRp cmVjdGlvbiBkaXJlY3Rpb24sCiAJCQkJCQkJICAgc3RydWN0IFR1cGxlVGFibGVTbG90ICpz bG90KTsKIGV4dGVybiBpbnQ2NCBpbmRleF9nZXRiaXRtYXAoSW5kZXhTY2FuRGVzYyBzY2Fu LCBUSURCaXRtYXAgKmJpdG1hcCk7Ci0KIGV4dGVybiBJbmRleEJ1bGtEZWxldGVSZXN1bHQg KmluZGV4X2J1bGtfZGVsZXRlKEluZGV4VmFjdXVtSW5mbyAqaW5mbywKIAkJCQkJCQkJCQkJ CUluZGV4QnVsa0RlbGV0ZVJlc3VsdCAqaXN0YXQsCiAJCQkJCQkJCQkJCQlJbmRleEJ1bGtE ZWxldGVDYWxsYmFjayBjYWxsYmFjaywKQEAgLTIzMSw3ICsyMzYsNyBAQCBleHRlcm4gdm9p ZCBpbmRleF9zdG9yZV9mbG9hdDhfb3JkZXJieV9kaXN0YW5jZXMoSW5kZXhTY2FuRGVzYyBz Y2FuLAogCQkJCQkJCQkJCQkJIGJvb2wgcmVjaGVja09yZGVyQnkpOwogZXh0ZXJuIGJ5dGVh ICppbmRleF9vcGNsYXNzX29wdGlvbnMoUmVsYXRpb24gaW5kcmVsLCBBdHRyTnVtYmVyIGF0 dG51bSwKIAkJCQkJCQkJCURhdHVtIGF0dG9wdGlvbnMsIGJvb2wgdmFsaWRhdGUpOwotCitl eHRlcm4gSW5kZXhTY2FuQmF0Y2ggaW5kZXhfYmF0Y2hfYWxsb2MoaW50IG1heGl0ZW1zLCBi b29sIHdhbnRfaXR1cCk7CiAKIC8qCiAgKiBpbmRleCBhY2Nlc3MgbWV0aG9kIHN1cHBvcnQg cm91dGluZXMgKGluIGdlbmFtLmMpCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv cmVsc2Nhbi5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaAppbmRleCBiNWUwZmIz ODZjMC4uYjYzYWY4NDVjYTYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9yZWxz Y2FuLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaApAQCAtMTYsOSArMTYs MTEgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKICNpbmNsdWRlICJh Y2Nlc3MvaXR1cC5oIgorI2luY2x1ZGUgImFjY2Vzcy9zZGlyLmgiCiAjaW5jbHVkZSAibm9k ZXMvdGlkYml0bWFwLmgiCiAjaW5jbHVkZSAicG9ydC9hdG9taWNzLmgiCiAjaW5jbHVkZSAi c3RvcmFnZS9idWYuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3JlYWRfc3RyZWFtLmgiCiAjaW5j bHVkZSAic3RvcmFnZS9yZWxmaWxlbG9jYXRvci5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc3Bp bi5oIgogI2luY2x1ZGUgInV0aWxzL3JlbGNhY2hlLmgiCkBAIC0xMjEsMTAgKzEyMywxNjIg QEAgdHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxCbG9ja1RhYmxlU2NhbldvcmtlckRhdGEgKlBh cmFsbGVsQmxvY2tUYWJsZVNjYW5Xb3JrZXI7CiB0eXBlZGVmIHN0cnVjdCBJbmRleEZldGNo VGFibGVEYXRhCiB7CiAJUmVsYXRpb24JcmVsOworCVJlYWRTdHJlYW0gKnJzOwogfSBJbmRl eEZldGNoVGFibGVEYXRhOwogCiBzdHJ1Y3QgSW5kZXhTY2FuSW5zdHJ1bWVudGF0aW9uOwog CisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLCB0aGUgcHJlZmV0Y2ggY2FsbGJhY2sgbmVlZHMg SW5kZXhTY2FuRGVzY0RhdGEuICovCit0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5CYXRjaERh dGEgSW5kZXhTY2FuQmF0Y2hEYXRhOworCisvKgorICogWFhYIHBhcnRzIG9mIEJUU2Nhbk9w YXF1ZURhdGEsIEJUU2NhblBvc0l0ZW0gYW5kIEJUU2NhblBvc0RhdGEgcmVsZXZhbnQKKyAq IGZvciBvbmUgYmF0Y2guCisgKi8KK3R5cGVkZWYgc3RydWN0IEluZGV4U2NhbkJhdGNoUG9z SXRlbQkvKiB3aGF0IHdlIHJlbWVtYmVyIGFib3V0IGVhY2ggbWF0Y2ggKi8KK3sKKwlJdGVt UG9pbnRlckRhdGEgaGVhcFRpZDsJLyogVElEIG9mIHJlZmVyZW5jZWQgaGVhcCBpdGVtICov CisJT2Zmc2V0TnVtYmVyIGluZGV4T2Zmc2V0OwkvKiBpbmRleCBpdGVtJ3MgbG9jYXRpb24g d2l0aGluIHBhZ2UgKi8KKwlMb2NhdGlvbkluZGV4IHR1cGxlT2Zmc2V0OwkvKiBJbmRleFR1 cGxlJ3Mgb2Zmc2V0IGluIHdvcmtzcGFjZSwgaWYgYW55ICovCit9IEluZGV4U2NhbkJhdGNo UG9zSXRlbTsKKworLyoKKyAqIERhdGEgYWJvdXQgb25lIGJhdGNoIG9mIGl0ZW1zIHJldHVy bmVkIGJ5IHRoZSBpbmRleCBBTS4gVGhpcyBpcyBzaW1pbGFyCisgKiB0byB0aGUgQU0tc3Bl Y2lmaWMgIm9wYXF1ZSIgc3RydWN0cywgdXNlZCBieSBlYWNoIEFNIHRvIHRyYWNrIGl0ZW1z CisgKiBsb2FkZWQgZnJvbSBvbmUgbGVhZiBwYWdlLCBidXQgZ2VuZXJhbGl6ZWQgZm9yIGFs bCBBTXMuCisgKgorICogWFhYIE5vdCBzdXJlIHdoaWNoIG9mIHRoZXJlIGZpZWxkcyBhcmUg MTAwJSBuZWVkZWQgZm9yIGFsbCBpbmRleCBBTXMsCisgKiBtb3N0IG9mIHRoaXMgY29tZXMg ZnJvbSBuYnRyZWUuCisgKgorICogWFhYIE1vc3RseSBhIGNvcHkgb2YgQlRTY2FuUG9zRGF0 YSwgYnV0IG90aGVyIEFNcyBtYXkgbmVlZCBkaWZmZXJlbnQgKG9yCisgKiBvbmx5IHNvbWUg b2YgdGhvc2UpIGZpZWxkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuQmF0Y2hE YXRhCit7CisJLyoKKwkgKiBBTS1zcGVjaWZpYyBjb25jZXB0IG9mIHBvc2l0aW9uIHdpdGhp biB0aGUgaW5kZXgsIGFuZCBvdGhlciBzdHVmZiB0aGUKKwkgKiBBTSBtaWdodCBuZWVkIHRv IHN0b3JlIGZvciBlYWNoIGJhdGNoLgorCSAqCisJICogWFhYIG1heWJlICJwb3NpdGlvbiIg aXMgbm90IHRoZSBiZXN0IG5hbWUsIGl0IGNhbiBoYXZlIG90aGVyIHN0dWZmIHRoZQorCSAq IEFNIG5lZWRzIHRvIGtlZXAgcGVyLWJhdGNoIChldmVuIG9ubHkgZm9yIHJlYWRpbmcgdGhl IGxlYWYgaXRlbXMsIGxpa2UKKwkgKiBuZXh0VHVwbGVPZmZzZXQpLgorCSAqLworCXZvaWQJ ICAgKm9wYXF1ZTsKKworCS8qCisJICogVGhlIGl0ZW1zIGFycmF5IGlzIGFsd2F5cyBvcmRl cmVkIGluIGluZGV4IG9yZGVyIChpZSwgaW5jcmVhc2luZworCSAqIGluZGV4b2Zmc2V0KS4g IFdoZW4gc2Nhbm5pbmcgYmFja3dhcmRzIGl0IGlzIGNvbnZlbmllbnQgdG8gZmlsbCB0aGUK KwkgKiBhcnJheSBiYWNrLXRvLWZyb250LCBzbyB3ZSBzdGFydCBhdCB0aGUgbGFzdCBzbG90 IGFuZCBmaWxsIGRvd253YXJkcy4KKwkgKiBIZW5jZSB3ZSBuZWVkIGJvdGggYSBmaXJzdC12 YWxpZC1lbnRyeSBhbmQgYSBsYXN0LXZhbGlkLWVudHJ5IGNvdW50ZXIuCisJICogaXRlbUlu ZGV4IGlzIGEgY3Vyc29yIHNob3dpbmcgd2hpY2ggZW50cnkgd2FzIGxhc3QgcmV0dXJuZWQg dG8gY2FsbGVyLgorCSAqCisJICogWFhYIERvIHdlIG5lZWQgYWxsIHRoZXNlIGluZGV4ZXMs IG9yIHdvdWxkIGl0IGJlIGVub3VnaCB0byBoYXZlIGp1c3QKKwkgKiAwLWluZGV4ZWQgYXJy YXkgd2l0aCBvbmx5IGl0ZW1JbmRleD8KKwkgKi8KKwlpbnQJCQlmaXJzdEl0ZW07CQkvKiBm aXJzdCB2YWxpZCBpbmRleCBpbiBpdGVtc1tdICovCisJaW50CQkJbGFzdEl0ZW07CQkvKiBs YXN0IHZhbGlkIGluZGV4IGluIGl0ZW1zW10gKi8KKwlpbnQJCQlpdGVtSW5kZXg7CQkvKiBj dXJyZW50IGluZGV4IGluIGl0ZW1zW10gKi8KKworCS8qIGluZm8gYWJvdXQga2lsbGVkIGl0 ZW1zIGlmIGFueSAoa2lsbGVkSXRlbXMgaXMgTlVMTCBpZiBuZXZlciB1c2VkKSAqLworCWlu dAkJICAgKmtpbGxlZEl0ZW1zOwkvKiBpbmRleGVzIG9mIGtpbGxlZCBpdGVtcyAqLworCWlu dAkJCW51bUtpbGxlZDsJCS8qIG51bWJlciBvZiBjdXJyZW50bHkgc3RvcmVkIGl0ZW1zICov CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBhbiBpbmRleC1vbmx5IHNjYW4sIHRoZXNl IGFyZSB0aGUgdHVwbGUgc3RvcmFnZQorCSAqIHdvcmtzcGFjZXMgZm9yIHRoZSBjdXJyUG9z IGFuZCBtYXJrUG9zIHJlc3BlY3RpdmVseS4gIEVhY2ggaXMgb2Ygc2l6ZQorCSAqIEJMQ0tT Wiwgc28gaXQgY2FuIGhvbGQgYXMgbXVjaCBhcyBhIGZ1bGwgcGFnZSdzIHdvcnRoIG9mIHR1 cGxlcy4KKwkgKgorCSAqIFhYWCBtYXliZSBjdXJyVHVwbGVzIHNob3VsZCBiZSBwYXJ0IG9m IHRoZSBhbS1zcGVjaWZpYyBwZXItYmF0Y2ggc3RhdGUKKwkgKiBzdG9yZWQgaW4gInBvc2l0 aW9uIiBmaWVsZD8KKwkgKi8KKwljaGFyCSAgICpjdXJyVHVwbGVzOwkJLyogdHVwbGUgc3Rv cmFnZSBmb3IgY3VyclBvcyAqLworCUluZGV4U2NhbkJhdGNoUG9zSXRlbSAqaXRlbXM7CS8q IFhYWCBkb24ndCBzaXplIHRvIE1heFRJRHNQZXJCVHJlZVBhZ2UgKi8KKworCS8qCisJICog YmF0Y2ggY29udGVudHMgKFRJRHMsIGluZGV4IHR1cGxlcywga2lsbCBiaXRtYXAsIC4uLikK KwkgKgorCSAqIFhYWCBTaG91bGRuJ3QgdGhpcyBiZSBwYXJ0IG9mIHRoZSAiSW5kZXhTY2Fu QmF0Y2hQb3NJdGVtIiBzdHJ1Y3Q/IFRvCisJICoga2VlcCBldmVyeXRoaW5nIGluIG9uZSBw bGFjZT8gT3Igd2h5IHNob3VsZCB3ZSBoYXZlIHNlcGFyYXRlIGFycmF5cz8KKwkgKiBPbmUg YWR2YW50YWdlIGlzIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9y IGFycmF5cyB0aGF0CisJICogd2UgZG9uJ3QgbmVlZCAuLi4gZS5nLiBpZiB3ZSBkb24ndCBu ZWVkIGhlYXAgdHVwbGVzLCB3ZSBkb24ndCBhbGxvY2F0ZQorCSAqIHRoYXQuIFdlIGNvdWxk bid0IGRvIHRoYXQgd2l0aCBldmVyeXRoaW5nIGluIG9uZSBzdHJ1Y3QuCisJICovCisJSW5k ZXhUdXBsZSAqaXR1cHM7CQkJLyogSW5kZXhUdXBsZXMsIGlmIHJlcXVlc3RlZCAqLworCUhl YXBUdXBsZSAgKmh0dXBzOwkJCS8qIEhlYXBUdXBsZXMsIGlmIHJlcXVlc3RlZCAqLworCWJv b2wJICAgKnJlY2hlY2s7CQkvKiByZWNoZWNrIGZsYWdzICovCisKKwkvKiBYWFggd2h5IGRv IHdlIG5lZWQgdGhpcyBvbiB0b3Agb2YgIm9wYXF1ZSIgcG9pbnRlcj8gKi8KKwlEYXR1bQkg ICAqcHJpdmF0ZURhdGE7CS8qIHByaXZhdGUgZGF0YSBmb3IgYmF0Y2ggKi8KKworCS8qIHhz X29yZGVyYnl2YWxzIC8geHNfb3JkZXJieW51bGxzICovCisJRGF0dW0JICAgKm9yZGVyYnl2 YWxzOworCWJvb2wJICAgKm9yZGVyYnludWxsczsKKworfSBJbmRleFNjYW5CYXRjaERhdGE7 CisKKy8qCisgKiBQb3NpdGlvbiBpbiB0aGUgcXVldWUgb2YgYmF0Y2hlcyAtIGluZGV4IG9m IGEgYmF0Y2gsIGluZGV4IG9mIGl0ZW0gaW4gYSBiYXRjaC4KKyAqLwordHlwZWRlZiBzdHJ1 Y3QgSW5kZXhTY2FuQmF0Y2hQb3MKK3sKKwlpbnQJCQliYXRjaDsKKwlpbnQJCQlpbmRleDsK K30gSW5kZXhTY2FuQmF0Y2hQb3M7CisKK3R5cGVkZWYgc3RydWN0IEluZGV4U2NhbkRlc2NE YXRhIEluZGV4U2NhbkRlc2NEYXRhOwordHlwZWRlZiBib29sICgqSW5kZXhQcmVmZXRjaENh bGxiYWNrKSAoSW5kZXhTY2FuRGVzY0RhdGEgKiBzY2FuLCB2b2lkICphcmcsIEluZGV4U2Nh bkJhdGNoUG9zICpwb3MpOworCisvKgorICogUXVldWUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qg SW5kZXhTY2FuQmF0Y2hlcworeworCS8qCisJICogRGlkIHdlIHJlYWQgdGhlIGxhc3QgYmF0 Y2g/IFRoZSBiYXRjaGVzIG1heSBiZSBsb2FkZWQgZnJvbSBtdWx0aXBsZQorCSAqIHBsYWNl cywgYW5kIHdlIG5lZWQgdG8gcmVtZW1iZXIgd2hlbiB3ZSBmYWlsIHRvIGxvYWQgdGhlIG5l eHQgYmF0Y2ggaW4KKwkgKiBhIGdpdmVuIHNjYW4gKHdoaWNoIG1lYW5zICJubyBtb3JlIGJh dGNoZXMiKS4gYW1nZXRiYXRjaCBtYXkgcmVzdGFydAorCSAqIHRoZSBzY2FuIG9uIHRoZSBn ZXQgY2FsbCwgc28gd2UgbmVlZCB0byByZW1lbWJlciBpdCdzIG92ZXIuCisJICovCisJYm9v bAkJZmluaXNoZWQ7CisJYm9vbAkJcmVzZXQ7CisKKwkvKgorCSAqIEN1cnJlbnQgc2NhbiBk aXJlY3Rpb24sIGZvciB0aGUgY3VycmVudGx5IGxvYWRlZCBiYXRjaGVzLiBUaGlzIGlzIHVz ZWQKKwkgKiB0byBsb2FkIGRhdGEgaW4gdGhlIHJlYWQgc3RyZWFtIEFQSSBjYWxsYmFjaywg ZXRjLgorCSAqCisJICogWFhYIE1heSBuZWVkIHNvbWUgd29yayB0byB1c2UgYWxyZWFkeSBs b2FkZWQgYmF0Y2hlcyBhZnRlciBjaGFuZ2Ugb2YKKwkgKiBkaXJlY3Rpb24sIGluc3RlYWQg b2YganVzdCB0aHJvd2luZyBldmVyeXRoaW5nIGF3YXkuIE1heSBuZWVkIHRvIHJlc2V0CisJ ICogdGhlIHN0cmVhbSBidXQga2VlcCB0aGUgYmF0Y2hlcz8KKwkgKi8KKwlTY2FuRGlyZWN0 aW9uIGRpcmVjdGlvbjsKKworCS8qIHBvc2l0aW9ucyBpbiB0aGUgcXVldWUgb2YgYmF0Y2hl cyAoYmF0Y2ggKyBpdGVtKSAqLworCUluZGV4U2NhbkJhdGNoUG9zIHJlYWRQb3M7CS8qIHJl YWQgcG9zaXRpb24gKi8KKwlJbmRleFNjYW5CYXRjaFBvcyBzdHJlYW1Qb3M7CS8qIHByZWZl dGNoIHBvc2l0aW9uIChmb3IgcmVhZCBzdHJlYW0gQVBJKSAqLworCUluZGV4U2NhbkJhdGNo UG9zIG1hcmtQb3M7CS8qIG1hcmsvcmVzdG9yZSBwb3NpdGlvbiAqLworCisJSW5kZXhTY2Fu QmF0Y2hEYXRhICptYXJrQmF0Y2g7CisJLy8gSW5kZXhTY2FuQmF0Y2hEYXRhICpjdXJyZW50 QmF0Y2g7CisKKwkvKgorCSAqIEFycmF5IG9mIGJhdGNoZXMgcmV0dXJuZWQgYnkgdGhlIEFN LiBUaGUgYXJyYXkgaGFzIGEgY2FwYWNpdHkgKGJ1dCBjYW4KKwkgKiBiZSByZXNpemVkIGlm IG5lZWRlZCkuIFRoZSBmaXJzdEJhdGNoIGlzIGFuIGluZGV4IG9mIHRoZSBmaXJzdCBiYXRj aCwKKwkgKiBidXQgbmVlZHMgdG8gYmUgdHJhbnNsYXRlZCBieSAobW9kdWxvIG1heEJhdGNo ZXMpIGludG8gaW5kZXggaW4gdGhlCisJICogYmF0Y2hlcyBhcnJheS4KKwkgKgorCSAqIEZJ WE1FIE1heWJlIHRoZXNlIGZpZWxkcyBzaG91bGQgYmUgdWludDMyLCBvciBzb21ldGhpbmcg bGlrZSB0aGF0PworCSAqLworCWludAkJCW1heEJhdGNoZXM7CQkvKiBzaXplIG9mIHRoZSBi YXRjaGVzIGFycmF5ICovCisJaW50CQkJZmlyc3RCYXRjaDsJCS8qIGZpcnN0IHVzZWQgYmF0 Y2ggc2xvdCAqLworCWludAkJCW5leHRCYXRjaDsJCS8qIG5leHQgZW1wdHkgYmF0Y2ggc2xv dCAqLworCisJSW5kZXhTY2FuQmF0Y2hEYXRhICoqYmF0Y2hlczsKKworCS8qIGNhbGxiYWNr IHRvIHNraXAgcHJlZmV0Y2hpbmcgaW4gSU9TIGV0Yy4gKi8KKwlJbmRleFByZWZldGNoQ2Fs bGJhY2sgcHJlZmV0Y2hDYWxsYmFjazsKKwl2b2lkCSAgICpwcmVmZXRjaEFyZ3VtZW50Owor fSBJbmRleFNjYW5CYXRjaGVzOworCiAvKgogICogV2UgdXNlIHRoZSBzYW1lIEluZGV4U2Nh bkRlc2NEYXRhIHN0cnVjdHVyZSBmb3IgYm90aCBhbWdldHR1cGxlLWJhc2VkCiAgKiBhbmQg YW1nZXRiaXRtYXAtYmFzZWQgaW5kZXggc2NhbnMuICBTb21lIGZpZWxkcyBhcmUgb25seSBy ZWxldmFudCBpbgpAQCAtMTc2LDYgKzMzMCwxMiBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNj YW5EZXNjRGF0YQogCiAJYm9vbAkJeHNfcmVjaGVjazsJCS8qIFQgbWVhbnMgc2NhbiBrZXlz IG11c3QgYmUgcmVjaGVja2VkICovCiAKKwkvKgorCSAqIEJhdGNoZXMgaW5kZXggc2NhbiBr ZWVwIGEgbGlzdCBvZiBiYXRjaGVzIGxvYWRlZCBmcm9tIHRoZSBpbmRleCBpbiBhCisJICog Y2lyY3VsYXIgYnVmZmVyLgorCSAqLworCUluZGV4U2NhbkJhdGNoZXMgKnhzX2JhdGNoZXM7 CisKIAkvKgogCSAqIFdoZW4gZmV0Y2hpbmcgd2l0aCBhbiBvcmRlcmluZyBvcGVyYXRvciwg dGhlIHZhbHVlcyBvZiB0aGUgT1JERVIgQlkKIAkgKiBleHByZXNzaW9ucyBvZiB0aGUgbGFz dCByZXR1cm5lZCB0dXBsZSwgYWNjb3JkaW5nIHRvIHRoZSBpbmRleC4gIElmCmRpZmYgLS1n aXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvdGFibGVhbS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNz L3RhYmxlYW0uaAppbmRleCA4NzEzZTEyY2JmYi4uNWJlZDM1OWNmMTMgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2FjY2Vzcy90YWJsZWFtLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNz L3RhYmxlYW0uaApAQCAtNDEzLDggKzQxMywxNCBAQCB0eXBlZGVmIHN0cnVjdCBUYWJsZUFt Um91dGluZQogCSAqIHN0cnVjdHVyZSB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAJ ICoKIAkgKiBUdXBsZXMgZm9yIGFuIGluZGV4IHNjYW4gY2FuIHRoZW4gYmUgZmV0Y2hlZCB2 aWEgaW5kZXhfZmV0Y2hfdHVwbGUuCisJICoKKwkgKiBUaGUgUmVhZFN0cmVhbSBwb2ludGVy IGlzIG9wdGlvbmFsIC0gTlVMTCBtZWFucyB0aGUgcmVndWxhciBidWZmZXIKKwkgKiByZWFk cyBhcmUgdXNlZC4gSWYgYSB2YWxpZCBSZWFkU3RyZWFtIGlzIHByb3ZpZGVkLCB0aGUgY2Fs bGJhY2sKKwkgKiAoZ2VuZXJhdGluZyB0aGUgYmxvY2tzIHRvIHJlYWQpIGFuZCBpbmRleF9m ZXRjaF90dXBsZSAoY29uc3VtaW5nIHRoZQorCSAqIGJ1ZmZlcnMpIG5lZWQgdG8gYWdyZWUg b24gdGhlIGV4YWN0IG9yZGVyLgogCSAqLwotCXN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRh ICooKmluZGV4X2ZldGNoX2JlZ2luKSAoUmVsYXRpb24gcmVsKTsKKwlzdHJ1Y3QgSW5kZXhG ZXRjaFRhYmxlRGF0YSAqKCppbmRleF9mZXRjaF9iZWdpbikgKFJlbGF0aW9uIHJlbCwKKwkJ CQkJCQkJCQkJCQkgIFJlYWRTdHJlYW0gKnJzKTsKIAogCS8qCiAJICogUmVzZXQgaW5kZXgg ZmV0Y2guIFR5cGljYWxseSB0aGlzIHdpbGwgcmVsZWFzZSBjcm9zcyBpbmRleCBmZXRjaApA QCAtMTE0OSw5ICsxMTU1LDkgQEAgdGFibGVfcGFyYWxsZWxzY2FuX3JlaW5pdGlhbGl6ZShS ZWxhdGlvbiByZWwsIFBhcmFsbGVsVGFibGVTY2FuRGVzYyBwc2NhbikKICAqIFR1cGxlcyBm b3IgYW4gaW5kZXggc2NhbiBjYW4gdGhlbiBiZSBmZXRjaGVkIHZpYSB0YWJsZV9pbmRleF9m ZXRjaF90dXBsZSgpLgogICovCiBzdGF0aWMgaW5saW5lIEluZGV4RmV0Y2hUYWJsZURhdGEg KgotdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4oUmVsYXRpb24gcmVsKQordGFibGVfaW5kZXhf ZmV0Y2hfYmVnaW4oUmVsYXRpb24gcmVsLCBSZWFkU3RyZWFtICpycykKIHsKLQlyZXR1cm4g cmVsLT5yZF90YWJsZWFtLT5pbmRleF9mZXRjaF9iZWdpbihyZWwpOworCXJldHVybiByZWwt PnJkX3RhYmxlYW0tPmluZGV4X2ZldGNoX2JlZ2luKHJlbCwgcnMpOwogfQogCiAvKgpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggYi9zcmMvaW5jbHVkZS9u b2Rlcy9leGVjbm9kZXMuaAppbmRleCA1YjZjYWRiNWE2Yy4uZWY2NzJlMjAzZDAgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRl L25vZGVzL2V4ZWNub2Rlcy5oCkBAIC0xNjk3LDYgKzE2OTcsNyBAQCB0eXBlZGVmIHN0cnVj dAogICoJCU9yZGVyQnlUeXBCeVZhbHMgICBpcyB0aGUgZGF0YXR5cGUgb2Ygb3JkZXIgYnkg ZXhwcmVzc2lvbiBwYXNzLWJ5LXZhbHVlPwogICoJCU9yZGVyQnlUeXBMZW5zCSAgIHR5cGxl bnMgb2YgdGhlIGRhdGF0eXBlcyBvZiBvcmRlciBieSBleHByZXNzaW9ucwogICoJCVBzY2Fu TGVuCQkgICBzaXplIG9mIHBhcmFsbGVsIGluZGV4IHNjYW4gZGVzY3JpcHRvcgorICoJCUNh bkJhdGNoCQkgICBiYXRjaGluZyAoYW5kIHByZWZldGNoaW5nKSBlbmFibGVkCiAgKiAtLS0t LS0tLS0tLS0tLS0tCiAgKi8KIHR5cGVkZWYgc3RydWN0IEluZGV4U2NhblN0YXRlCkBAIC0x NzI2LDYgKzE3MjcsMTAgQEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuU3RhdGUKIAlib29s CSAgICppc3NfT3JkZXJCeVR5cEJ5VmFsczsKIAlpbnQxNgkgICAqaXNzX09yZGVyQnlUeXBM ZW5zOwogCVNpemUJCWlzc19Qc2NhbkxlbjsKKworCS8qIGJhdGNoaW5nL3ByZWZldGNoaW5n IGVuYWJsZWQ/ICovCisJYm9vbAkJaXNzX0NhbkJhdGNoOworCiB9IEluZGV4U2NhblN0YXRl OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzQ5LDYgKzE3NTQsNyBAQCB0eXBlZGVm IHN0cnVjdCBJbmRleFNjYW5TdGF0ZQogICoJCVBzY2FuTGVuCQkgICBzaXplIG9mIHBhcmFs bGVsIGluZGV4LW9ubHkgc2NhbiBkZXNjcmlwdG9yCiAgKgkJTmFtZUNTdHJpbmdBdHROdW1z IGF0dG51bXMgb2YgbmFtZSB0eXBlZCBjb2x1bW5zIHRvIHBhZCB0byBOQU1FREFUQUxFTgog ICoJCU5hbWVDU3RyaW5nQ291bnQgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIE5hbWVD U3RyaW5nQXR0TnVtcyBhcnJheQorICoJCUNhbkJhdGNoCQkgICBiYXRjaGluZyAoYW5kIHBy ZWZldGNoaW5nKSBlbmFibGVkCiAgKiAtLS0tLS0tLS0tLS0tLS0tCiAgKi8KIHR5cGVkZWYg c3RydWN0IEluZGV4T25seVNjYW5TdGF0ZQpAQCAtMTc3Miw2ICsxNzc4LDcgQEAgdHlwZWRl ZiBzdHJ1Y3QgSW5kZXhPbmx5U2NhblN0YXRlCiAJU2l6ZQkJaW9zc19Qc2NhbkxlbjsKIAlB dHRyTnVtYmVyICppb3NzX05hbWVDU3RyaW5nQXR0TnVtczsKIAlpbnQJCQlpb3NzX05hbWVD U3RyaW5nQ291bnQ7CisJYm9vbAkJaW9zc19DYW5CYXRjaDsKIH0gSW5kZXhPbmx5U2NhblN0 YXRlOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv c3lzdmlld3Mub3V0CmluZGV4IGFlMTdkMDI4ZWQzLi4yMjBiNjFmYWQyZCAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKQEAgLTE1OCw2ICsxNTgsNyBAQCBz ZWxlY3QgbmFtZSwgc2V0dGluZyBmcm9tIHBnX3NldHRpbmdzIHdoZXJlIG5hbWUgbGlrZSAn ZW5hYmxlJSc7CiAgZW5hYmxlX2luY3JlbWVudGFsX3NvcnQgICAgICAgIHwgb24KICBlbmFi bGVfaW5kZXhvbmx5c2NhbiAgICAgICAgICAgfCBvbgogIGVuYWJsZV9pbmRleHNjYW4gICAg ICAgICAgICAgICB8IG9uCisgZW5hYmxlX2luZGV4c2Nhbl9iYXRjaGluZyAgICAgIHwgb24K ICBlbmFibGVfbWF0ZXJpYWwgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9tZW1vaXpl ICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX21lcmdlam9pbiAgICAgICAgICAgICAg IHwgb24KQEAgLTE3Miw3ICsxNzMsNyBAQCBzZWxlY3QgbmFtZSwgc2V0dGluZyBmcm9tIHBn X3NldHRpbmdzIHdoZXJlIG5hbWUgbGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxlX3NlcXNjYW4g ICAgICAgICAgICAgICAgIHwgb24KICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAgICAg fCBvbgogIGVuYWJsZV90aWRzY2FuICAgICAgICAgICAgICAgICB8IG9uCi0oMjQgcm93cykK KygyNSByb3dzKQogCiAtLSBUaGVyZSBhcmUgYWx3YXlzIHdhaXQgZXZlbnQgZGVzY3JpcHRp b25zIGZvciB2YXJpb3VzIHR5cGVzLiAgSW5qZWN0aW9uUG9pbnQKIC0tIG1heSBiZSBwcmVz ZW50IG9yIGFic2VudCwgZGVwZW5kaW5nIG9uIGhpc3Rvcnkgc2luY2UgbGFzdCBwb3N0bWFz dGVyIHN0YXJ0LgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRleCBlNTg3OWUwMGRm Zi4uMDYwZDk2NGUzOTkgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0xMjYw LDYgKzEyNjAsMTAgQEAgSW5kZXhPcmRlckJ5RGlzdGFuY2UKIEluZGV4UGF0aAogSW5kZXhS dW50aW1lS2V5SW5mbwogSW5kZXhTY2FuCitJbmRleFNjYW5CYXRjaERhdGEKK0luZGV4U2Nh bkJhdGNoUG9zCitJbmRleFNjYW5CYXRjaFBvc0l0ZW0KK0luZGV4U2NhbkJhdGNoZXMKIElu ZGV4U2NhbkRlc2MKIEluZGV4U2Nhbkluc3RydW1lbnRhdGlvbgogSW5kZXhTY2FuU3RhdGUK QEAgLTMzOTYsNiArMzQwMCw3IEBAIGFtZW5kc2Nhbl9mdW5jdGlvbgogYW1lc3RpbWF0ZXBh cmFsbGVsc2Nhbl9mdW5jdGlvbgogYW1nZXRiaXRtYXBfZnVuY3Rpb24KIGFtZ2V0dHVwbGVf ZnVuY3Rpb24KK2FtZ2V0YmF0Y2hfZnVuY3Rpb24KIGFtaW5pdHBhcmFsbGVsc2Nhbl9mdW5j dGlvbgogYW1pbnNlcnRfZnVuY3Rpb24KIGFtaW5zZXJ0Y2xlYW51cF9mdW5jdGlvbgotLSAK Mi40OS4wCgo= --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/x-patch; charset=UTF-8; name="v20250501-0002-WIP-batching-for-nbtree-indexes.patch" Content-Disposition: attachment; filename="v20250501-0002-WIP-batching-for-nbtree-indexes.patch" Content-Transfer-Encoding: base64 RnJvbSAzNWQzZmVjOGMxYWI2YzFlMmI5OGY2ZjgwZDY2ODdhODA4NzIyZjczIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogTW9uLCAzMCBTZXAgMjAyNCAyMjo0ODozOSArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjUwNTAxIDIvN10gV0lQOiBiYXRjaGluZyBmb3IgbmJ0cmVlIGluZGV4ZXMKCkFkZHMg YmF0Y2hpbmcvcHJlZmV0Y2hpbmcgZm9yIGJ0cmVlIGluZGV4ZXMuIFJldHVybnMgb25seSBi YXRjaGVzIGZyb20gYQpzaW5nbGUgbGVhZiBwYWdlLiBEb2VzIG5vdCBzdXBwb3J0IG1hcmsv cmVzdG9yZSB5ZXQuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyAg ICB8ICAzMTkgKysrKwogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYyB8 IDE5OTggKysrKysrKysrKysrKysrKysrKysrKystLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR1dGlscy5jICB8ICAxNzkgKysrCiBzcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVl LmggICAgICAgICAgIHwgICA3MiArLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgICAgICB8ICAgIDIgKwogNSBmaWxlcyBjaGFuZ2VkLCAyNDE3IGluc2VydGlvbnMoKyks IDE1MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0 cmVlL25idHJlZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwppbmRl eCA3NjU2NTk4ODdhZi4uNDA1YzYwMWQzZmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnRyZWUuYwpAQCAtMTU5LDYgKzE1OSw4IEBAIGJ0aGFuZGxlcihQR19GVU5DVElPTl9BUkdT KQogCWFtcm91dGluZS0+YW1iZWdpbnNjYW4gPSBidGJlZ2luc2NhbjsKIAlhbXJvdXRpbmUt PmFtcmVzY2FuID0gYnRyZXNjYW47CiAJYW1yb3V0aW5lLT5hbWdldHR1cGxlID0gYnRnZXR0 dXBsZTsKKwlhbXJvdXRpbmUtPmFtZ2V0YmF0Y2ggPSBidGdldGJhdGNoOworCWFtcm91dGlu ZS0+YW1mcmVlYmF0Y2ggPSBidGZyZWViYXRjaDsKIAlhbXJvdXRpbmUtPmFtZ2V0Yml0bWFw ID0gYnRnZXRiaXRtYXA7CiAJYW1yb3V0aW5lLT5hbWVuZHNjYW4gPSBidGVuZHNjYW47CiAJ YW1yb3V0aW5lLT5hbW1hcmtwb3MgPSBidG1hcmtwb3M7CkBAIC0yNzksNiArMjgxLDE1OCBA QCBidGdldHR1cGxlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJ cmV0dXJuIHJlczsKIH0KIAorLyogRklYTUUgZHVwbGljYXRlIGZyb20gaW5kZXhhbS5jICov CisjZGVmaW5lIElOREVYX1NDQU5fQkFUQ0goc2NhbiwgaWR4KQlcCisJCSgoc2NhbiktPnhz X2JhdGNoZXMtPmJhdGNoZXNbKGlkeCkgJSAoc2NhbiktPnhzX2JhdGNoZXMtPm1heEJhdGNo ZXNdKQorCisvKgorICoJYnRnZXRiYXRjaCgpIC0tIEdldCB0aGUgbmV4dCBiYXRjaCBvZiB0 dXBsZXMgaW4gdGhlIHNjYW4uCisgKgorICogWFhYIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBi dGdldHR1cGxlKCksIGJ1dCBmb3IgYmF0Y2hlcyBvZiB0dXBsZXMuCisgKi8KK0luZGV4U2Nh bkJhdGNoCitidGdldGJhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVl OworCUluZGV4U2NhbkJhdGNoIHJlczsKKwlCVEJhdGNoU2NhblBvcyBwb3MgPSBOVUxMOwor CisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBw b3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsK KwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qIGJ0cmVl IGluZGV4ZXMgYXJlIG5ldmVyIGxvc3N5ICovCisJc2Nhbi0+eHNfcmVjaGVjayA9IGZhbHNl OworCisJaWYgKHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2ggPCBzY2FuLT54c19iYXRj aGVzLT5uZXh0QmF0Y2gpCisJeworCQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9IElOREVYX1ND QU5fQkFUQ0goc2Nhbiwgc2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoLTEpOworCQlwb3Mg PSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisJfQorCisJLyogRWFjaCBsb29w IGl0ZXJhdGlvbiBwZXJmb3JtcyBhbm90aGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuICovCisJ ZG8KKwl7CisJCS8qCisJCSAqIElmIHdlJ3ZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhpcyBz Y2FuLCB3ZSBjYW4ganVzdCBhZHZhbmNlIGl0IGluCisJCSAqIHRoZSBhcHByb3ByaWF0ZSBk aXJlY3Rpb24uICBJZiB3ZSBoYXZlbid0IGRvbmUgc28geWV0LCB3ZSBjYWxsCisJCSAqIF9i dF9maXJzdCgpIHRvIGdldCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgc2Nhbi4KKwkJICovCisJ CWlmIChwb3MgPT0gTlVMTCkKKwkJCXJlcyA9IF9idF9maXJzdF9iYXRjaChzY2FuLCBkaXIp OworCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBOb3cgY29udGludWUgdGhlIHNjYW4uCisJ CQkgKi8KKwkJCXJlcyA9IF9idF9uZXh0X2JhdGNoKHNjYW4sIHBvcywgZGlyKTsKKwkJfQor CisJCS8qIElmIHdlIGhhdmUgYSBiYXRjaCwgcmV0dXJuIGl0IC4uLiAqLworCQlpZiAocmVz KQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogWFhYIHdlIG5lZWQgdG8gaW52b2tlIF9idF9m aXJzdF9iYXRjaCBvbiB0aGUgbmV4dCBpdGVyYXRpb24sIHRvCisJCSAqIGFkdmFuY2UgU0FP UCBrZXlzIGV0Yy4gQnV0IGluZGV4YW0uYyBhbHJlYWR5IGRvZXMgdGhpcywgYnV0IHRoYXQn cworCQkgKiBvbmx5IGFmdGVyIHRoaXMgcmV0dXJucywgc28gbWF5YmUgdGhpcyBzaG91bGQg ZG8gdGhpcyBpbiBzb21lIG90aGVyCisJCSAqIHdheSwgbm90IHN1cmUgd2hvIHNob3VsZCBi ZSByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBjdXJyZW50QmF0Y2guCisJCSAqCisJCSAqIFhY WCBNYXliZSB3ZSBkb24ndCBldmVuIG5lZWQgdGhhdCBmaWVsZD8gV2hhdCBpcyBhIGN1cnJl bnQgYmF0Y2gKKwkJICogYW55d2F5PyBUaGVyZSBzZWVtIHRvIGJlIGF0IGxlYXN0IG11bHRp cGxlIGNvbmNlcHRzIG9mICJjdXJyZW50IgorCQkgKiBiYXRjaCwgb25lIGZvciB0aGUgcmVh ZCBzdHJlYW0sIGFub3RoZXIgZm9yIGV4ZWN1dG9yIC4uLgorCQkgKi8KKwkJLy8gc2Nhbi0+ eHNfYmF0Y2hlcy0+Y3VycmVudEJhdGNoID0gcmVzOworCisJCS8qCisJCSAqIFdlIG1heSBk byBhIG5ldyBzY2FuLCBkZXBlbmRpbmcgb24gd2hhdCBfYnRfc3RhcnRfcHJpbV9zY2FuIHNh eXMuCisJCSAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHN0YXJ0IGZyb20gc2NyYXRjaCwg bm90IGZyb20gdGhlIHBvc2l0aW9uCisJCSAqIG9mIHRoZSBsYXN0IGJhdGNoLiBJbiByZWd1 bGFyIG5vbi1iYXRjaGVkIHNjYW5zIHdlIGhhdmUgY3VyclBvcywKKwkJICogYmVjYXVzZSB3 ZSBoYXZlIGp1c3Qgb25lIGxlYWYgcGFnZSBmb3IgdGhlIHdob2xlIHNjYW4sIGFuZCB3ZQor CQkgKiBpbnZhbGlkYXRlIGl0IGJlZm9yZSBsb2FkaW5nIHRoZSBuZXh0IG9uZS4gQnV0IHdp dGggYmF0Y2hpbmcgdGhhdAorCQkgKiBkb2Vzbid0IHdvcmsgLSB3ZSBoYXZlIG1hbnkgbGVh ZnMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9uZSBpcworCQkgKiAnY3VycmVudCcgKHdlbGws IGl0J3MgdGhlIGxhc3QpLCBhbmQgd2UgY2FuJ3QgaW52YWxpZGF0ZSBpdCwKKwkJICogdGhh dCdzIHVwIHRvIGFtZnJlZWJhdGNoKCkuIEZvciBub3cgd2UgZGVkdWNlIHRoZSBwb3NpdGlv biBhbmQKKwkJICogcmVzZXQgaXQgdG8gTlVMTCwgdG8gaW5kaWNhdGUgdGhlIHNhbWUgdGhp bmcuCisJCSAqCisJCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcgbGlr ZSAnY3VycmVudEJhdGNoJz8gQnV0IHRoZW4KKwkJICogdGhhdCBwcm9iYWJseSBzaG91bGQg YmUgaW4gQlRTY2FuT3BhcXVlLCBub3QgaW4gdGhlIGdlbmVyaWMKKwkJICogaW5kZXhhbS5j IHBhcnQ/IE9yIGl0IGl0IGEgc3VmZmljaWVudGx5IGdlbmVyaWMgdGhpbmc/IEhvdyB3b3Vs ZAorCQkgKiB3ZSBrZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgYmF0Y2ggcXVldWU/IElmIGZy ZWVpbmcgYmF0Y2hlcyBpcworCQkgKiB1cCB0byBpbmRleGFtLCBob3cgZG8gd2UgZW5zdXJl IHRoZSBjdXJyZW50QmF0Y2ggZG9lcyBub3QgcG9pbnQKKwkJICogdG8gYWxyZWFkeSByZW1v dmVkIGJhdGNoPworCQkgKi8KKwkJcG9zID0gTlVMTDsKKworCQkvKiAuLi4gb3RoZXJ3aXNl IHNlZSBpZiB3ZSBuZWVkIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KKwl9IHdo aWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9zdGFydF9wcmltX3NjYW4oc2NhbiwgZGly KSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoJYnRnZXRiYXRjaCgpIC0tIEdldCB0 aGUgbmV4dCBiYXRjaCBvZiB0dXBsZXMgaW4gdGhlIHNjYW4uCisgKgorICogWFhYIFByZXR0 eSBtdWNoIGxpa2UgYnRnZXR0dXBsZSgpLCBidXQgZm9yIGJhdGNoZXMgb2YgdHVwbGVzLgor ICovCit2b2lkCitidGZyZWViYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJh dGNoIGJhdGNoKQoreworCUJUU2Nhbk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRTX09O TFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwkvKiBiYXRjaGluZyBkb2Vz IG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2Vy dCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9z SXNWYWxpZChzby0+bWFya1BvcykpOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2Ug c2hvdWxkIGtpbGwgdHVwbGVzIGZyb20gdGhlIHByZXZpb3VzIGJhdGNoLgorCSAqLworCV9i dF9raWxsX2JhdGNoKHNjYW4sIGJhdGNoKTsKKworCS8qIGZyZWUgYWxsIHRoZSBzdHVmZiB0 aGF0IG1pZ2h0IGJlIGFsbG9jYXRlZCAqLworCisJaWYgKGJhdGNoLT5pdGVtcykKKwkJcGZy ZWUoYmF0Y2gtPml0ZW1zKTsKKworCWlmIChiYXRjaC0+aXR1cHMpCisJCXBmcmVlKGJhdGNo LT5pdHVwcyk7CisKKwlpZiAoYmF0Y2gtPmh0dXBzKQorCQlwZnJlZShiYXRjaC0+aHR1cHMp OworCisJaWYgKGJhdGNoLT5yZWNoZWNrKQorCQlwZnJlZShiYXRjaC0+cmVjaGVjayk7CisK KwlpZiAoYmF0Y2gtPnByaXZhdGVEYXRhKQorCQlwZnJlZShiYXRjaC0+cHJpdmF0ZURhdGEp OworCisJaWYgKGJhdGNoLT5vcmRlcmJ5dmFscykKKwkJcGZyZWUoYmF0Y2gtPm9yZGVyYnl2 YWxzKTsKKworCWlmIChiYXRjaC0+b3JkZXJieW51bGxzKQorCQlwZnJlZShiYXRjaC0+b3Jk ZXJieW51bGxzKTsKKworCWlmIChiYXRjaC0+Y3VyclR1cGxlcykKKwkJcGZyZWUoYmF0Y2gt PmN1cnJUdXBsZXMpOworCisJaWYgKGJhdGNoLT5vcGFxdWUpCisJeworCQlCVEJhdGNoU2Nh blBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisKKwkJQlRCYXRj aFNjYW5Qb3NJc1ZhbGlkKCpwb3MpOworCQlCVEJhdGNoU2NhblBvc0lzUGlubmVkKCpwb3Mp OworCisJCUJUQmF0Y2hTY2FuUG9zVW5waW5JZlBpbm5lZCgqcG9zKTsKKworCQlwZnJlZShi YXRjaC0+b3BhcXVlKTsKKwl9CisKKwkvKiBhbmQgZmluYWxseSBmcmVlIHRoZSBiYXRjaCBp dHNlbGYgKi8KKwlwZnJlZShiYXRjaCk7CisKKwlyZXR1cm47Cit9CisKIC8qCiAgKiBidGdl dGJpdG1hcCgpIC0tIGdldHMgYWxsIG1hdGNoaW5nIHR1cGxlcywgYW5kIGFkZHMgdGhlbSB0 byBhIGJpdG1hcAogICovCkBAIC0zNzYsNiArNTMwLDEwIEBAIGJ0YmVnaW5zY2FuKFJlbGF0 aW9uIHJlbCwgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzKQogCiAvKgogICoJYnRyZXNjYW4o KSAtLSByZXNjYW4gYW4gaW5kZXggcmVsYXRpb24KKyAqCisgKiBCYXRjaGVzIHNob3VsZCBo YXZlIGJlZW4gZnJlZWQgZnJvbSBpbmRleGFtIHVzaW5nIGJ0ZnJlZWJhdGNoKCkgYmVmb3Jl IHdlCisgKiBnZXQgaGVyZSwgYnV0IHRoZW4gc29tZSBvZiB0aGUgZ2VuZXJpYyBzY2FuIHN0 dWZmIG5lZWRzIHRvIGJlIHJlc2V0IGhlcmUuCisgKiBCdXQgd2Ugc2hvdWxkbid0IG5lZWQg dG8gZG8gYW55dGhpbmcgcGFydGljdWxhciBoZXJlLCBJIHRoaW5rLgogICovCiB2b2lkCiBi dHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2NhbmtleSwgaW50IG5zY2Fu a2V5cywKQEAgLTQwMCw2ICs1NTgsMTAgQEAgYnRyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJQlRTY2FuUG9zVW5waW5JZlBp bm5lZChzby0+bWFya1Bvcyk7CiAJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+bWFya1Bvcyk7 CiAKKwkvKiBGSVhNRSBzaG91bGQgYmUgaW4gaW5kZXhhbS5jIEkgdGhpbmsgKi8KKwkvLyBp ZiAoc2Nhbi0+eHNfYmF0Y2hlcykKKwkvLwlzY2FuLT54c19iYXRjaGVzLT5jdXJyZW50QmF0 Y2ggPSBOVUxMOworCiAJLyoKIAkgKiBBbGxvY2F0ZSB0dXBsZSB3b3Jrc3BhY2UgYXJyYXlz LCBpZiBuZWVkZWQgZm9yIGFuIGluZGV4LW9ubHkgc2NhbiBhbmQKIAkgKiBub3QgYWxyZWFk eSBkb25lIGluIGEgcHJldmlvdXMgcmVzY2FuIGNhbGwuICBUbyBzYXZlIG9uIHBhbGxvYwpA QCAtNDMzLDYgKzU5NSwxMCBAQCBidHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5L ZXkgc2NhbmtleSwgaW50IG5zY2Fua2V5cywKIAogLyoKICAqCWJ0ZW5kc2NhbigpIC0tIGNs b3NlIGRvd24gYSBzY2FuCisgKgorICogQmF0Y2hlcyBzaG91bGQgaGF2ZSBiZWVuIGZyZWVk IGZyb20gaW5kZXhhbSB1c2luZyBidGZyZWViYXRjaCgpIGJlZm9yZSB3ZQorICogZ2V0IGhl cmUsIGJ1dCB0aGVuIHNvbWUgb2YgdGhlIGdlbmVyaWMgc2NhbiBzdHVmZiBuZWVkcyB0byBi ZSByZXNldCBoZXJlLgorICogQnV0IHdlIHNob3VsZG4ndCBuZWVkIHRvIGRvIGFueXRoaW5n IHBhcnRpY3VsYXIgaGVyZSwgSSB0aGluay4KICAqLwogdm9pZAogYnRlbmRzY2FuKEluZGV4 U2NhbkRlc2Mgc2NhbikKQEAgLTQ2OSwxMiArNjM1LDE4IEBAIGJ0ZW5kc2NhbihJbmRleFNj YW5EZXNjIHNjYW4pCiAKIC8qCiAgKglidG1hcmtwb3MoKSAtLSBzYXZlIGN1cnJlbnQgc2Nh biBwb3NpdGlvbgorICoKKyAqIFdpdGggYmF0Y2hpbmcsIGFsbCB0aGUgaW50ZXJlc3Rpbmcg bWFya3BvcygpIHN0dWZmIGhhcHBlbnMgaW4gaW5kZXhhbS5jLiBXZQorICogc2hvdWxkIG5v dCBldmVuIGdldCBoZXJlLgogICovCiB2b2lkCiBidG1hcmtwb3MoSW5kZXhTY2FuRGVzYyBz Y2FuKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKIAorCS8qIHdpdGggYmF0Y2hpbmcsIG1hcmsvcmVzdG9yZSBpcyBoYW5kbGVkIGluIGlu ZGV4YW0gKi8KKwlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2hlcyA9PSBOVUxMKTsKKwogCS8qIFRo ZXJlIG1heSBiZSBhbiBvbGQgbWFyayB3aXRoIGEgcGluIChidXQgbm8gbG9jaykuICovCiAJ QlRTY2FuUG9zVW5waW5JZlBpbm5lZChzby0+bWFya1Bvcyk7CiAKQEAgLTQ5NSwxMiArNjY3 LDE4IEBAIGJ0bWFya3BvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAKIC8qCiAgKglidHJlc3Ry cG9zKCkgLS0gcmVzdG9yZSBzY2FuIHRvIGxhc3Qgc2F2ZWQgcG9zaXRpb24KKyAqCisgKiBX aXRoIGJhdGNoaW5nLCBhbGwgdGhlIGludGVyZXN0aW5nIHJlc3RycG9zKCkgc3R1ZmYgaGFw cGVucyBpbiBpbmRleGFtLmMuIFdlCisgKiBzaG91bGQgbm90IGV2ZW4gZ2V0IGhlcmUuCiAg Ki8KIHZvaWQKIGJ0cmVzdHJwb3MoSW5kZXhTY2FuRGVzYyBzY2FuKQogewogCUJUU2Nhbk9w YXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAorCS8qIHdpdGggYmF0 Y2hpbmcsIG1hcmsvcmVzdG9yZSBpcyBoYW5kbGVkIGluIGluZGV4YW0gKi8KKwlBc3NlcnQo c2Nhbi0+eHNfYmF0Y2hlcyA9PSBOVUxMKTsKKwogCWlmIChzby0+bWFya0l0ZW1JbmRleCA+ PSAwKQogCXsKIAkJLyoKQEAgLTkwMCw2ICsxMDc4LDE0NyBAQCBfYnRfcGFyYWxsZWxfc2Vp emUoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciAqbmV4dF9zY2FuX3BhZ2UsCiAJ cmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIF9idF9wYXJhbGxlbF9zZWl6ZSgpIC0tIEJl Z2luIHRoZSBwcm9jZXNzIG9mIGFkdmFuY2luZyB0aGUgc2NhbiB0byBhIG5ldworICoJCXBh Z2UuICBPdGhlciBzY2FucyBtdXN0IHdhaXQgdW50aWwgd2UgY2FsbCBfYnRfcGFyYWxsZWxf cmVsZWFzZSgpCisgKgkJb3IgX2J0X3BhcmFsbGVsX2RvbmUoKS4KKyAqCisgKiBUaGUgcmV0 dXJuIHZhbHVlIGlzIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHNlaXplZCB0aGUgc2NhbiBh bmQgZmFsc2UKKyAqIGlmIHdlIGRpZCBub3QuICBUaGUgbGF0dGVyIGNhc2Ugb2NjdXJzIHdo ZW4gbm8gcGFnZXMgcmVtYWluLCBvciB3aGVuCisgKiBhbm90aGVyIHByaW1pdGl2ZSBpbmRl eCBzY2FuIGlzIHNjaGVkdWxlZCB0aGF0IGNhbGxlcidzIGJhY2tlbmQgY2Fubm90CisgKiBz dGFydCBqdXN0IHlldCAob25seSBiYWNrZW5kcyB0aGF0IGNhbGwgZnJvbSBfYnRfZmlyc3Qg YXJlIGNhcGFibGUgb2YKKyAqIHN0YXJ0aW5nIHByaW1pdGl2ZSBpbmRleCBzY2Fucywgd2hp Y2ggdGhleSBpbmRpY2F0ZSBieSBwYXNzaW5nIGZpcnN0PXRydWUpLgorICoKKyAqIElmIHRo ZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgKm5leHRfc2Nhbl9wYWdlIHJldHVybnMgdGhlIG5l eHQgcGFnZSBvZiB0aGUKKyAqIHNjYW4sIGFuZCAqbGFzdF9jdXJyX3BhZ2UgcmV0dXJucyB0 aGUgcGFnZSB0aGF0ICpuZXh0X3NjYW5fcGFnZSBjYW1lIGZyb20uCisgKiBBbiBpbnZhbGlk ICpuZXh0X3NjYW5fcGFnZSBtZWFucyB0aGUgc2NhbiBoYXNuJ3QgeWV0IHN0YXJ0ZWQsIG9y IHRoYXQKKyAqIGNhbGxlciBuZWVkcyB0byBzdGFydCB0aGUgbmV4dCBwcmltaXRpdmUgaW5k ZXggc2NhbiAoaWYgaXQncyB0aGUgbGF0dGVyCisgKiBjYXNlIHdlJ2xsIHNldCBzby5uZWVk UHJpbVNjYW4pLgorICoKKyAqIENhbGxlcnMgc2hvdWxkIGlnbm9yZSB0aGUgdmFsdWUgb2Yg Km5leHRfc2Nhbl9wYWdlIGFuZCAqbGFzdF9jdXJyX3BhZ2UgaWYKKyAqIHRoZSByZXR1cm4g dmFsdWUgaXMgZmFsc2UuCisgKi8KK2Jvb2wKK19idF9wYXJhbGxlbF9zZWl6ZV9iYXRjaChJ bmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywKKwkJCQkJCSBCbG9ja051 bWJlciAqbmV4dF9zY2FuX3BhZ2UsCisJCQkJCQkgQmxvY2tOdW1iZXIgKmxhc3RfY3Vycl9w YWdlLCBib29sIGZpcnN0KQoreworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRp b247CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwor CWJvb2wJCWV4aXRfbG9vcCA9IGZhbHNlLAorCQkJCXN0YXR1cyA9IHRydWUsCisJCQkJZW5k c2NhbiA9IGZhbHNlOworCVBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwYXJhbGxlbF9zY2FuID0g c2Nhbi0+cGFyYWxsZWxfc2NhbjsKKwlCVFBhcmFsbGVsU2NhbkRlc2MgYnRzY2FuOworCisJ Km5leHRfc2Nhbl9wYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOworCSpsYXN0X2N1cnJfcGFn ZSA9IEludmFsaWRCbG9ja051bWJlcjsKKworCS8qCisJICogUmVzZXQgc28tPmN1cnJQb3Ms IGFuZCBpbml0aWFsaXplIG1vcmVMZWZ0L21vcmVSaWdodCBzdWNoIHRoYXQgdGhlIG5leHQK KwkgKiBjYWxsIHRvIF9idF9yZWFkbmV4dHBhZ2UgdHJlYXRzIHRoaXMgYmFja2VuZCBzaW1p bGFybHkgdG8gYSBzZXJpYWwKKwkgKiBiYWNrZW5kIHRoYXQgc3RlcHMgZnJvbSAqbGFzdF9j dXJyX3BhZ2UgdG8gKm5leHRfc2Nhbl9wYWdlICh1bmxlc3MgdGhpcworCSAqIGJhY2tlbmQn cyBzby0+Y3VyclBvcyBpcyBpbml0aWFsaXplZCBieSBfYnRfcmVhZGZpcnN0cGFnZSBiZWZv cmUgdGhlbikuCisJICovCisJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7CisJ cG9zLT5tb3JlTGVmdCA9IHBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKworCWlmIChmaXJzdCkK Kwl7CisJCS8qCisJCSAqIEluaXRpYWxpemUgYXJyYXkgcmVsYXRlZCBzdGF0ZSB3aGVuIGNh bGxlZCBmcm9tIF9idF9maXJzdCwgYXNzdW1pbmcKKwkJICogdGhhdCB0aGlzIHdpbGwgYmUg dGhlIGZpcnN0IHByaW1pdGl2ZSBpbmRleCBzY2FuIGZvciB0aGUgc2NhbgorCQkgKi8KKwkJ c28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCQlzby0+c2NhbkJlaGluZCA9IGZhbHNlOwor CQlzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOworCX0KKwllbHNlCisJeworCQkvKgor CQkgKiBEb24ndCBhdHRlbXB0IHRvIHNlaXplIHRoZSBzY2FuIHdoZW4gaXQgcmVxdWlyZXMg YW5vdGhlciBwcmltaXRpdmUKKwkJICogaW5kZXggc2Nhbiwgc2luY2UgY2FsbGVyJ3MgYmFj a2VuZCBjYW5ub3Qgc3RhcnQgaXQgcmlnaHQgbm93CisJCSAqLworCQlpZiAoc28tPm5lZWRQ cmltU2NhbikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlidHNjYW4gPSAoQlRQYXJhbGxl bFNjYW5EZXNjKSBPZmZzZXRUb1BvaW50ZXIocGFyYWxsZWxfc2NhbiwKKwkJCQkJCQkJCQkJ CSAgcGFyYWxsZWxfc2Nhbi0+cHNfb2Zmc2V0X2FtKTsKKworCXdoaWxlICgxKQorCXsKKwkJ TFdMb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX2xvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkJ aWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID09IEJUUEFSQUxMRUxfRE9ORSkKKwkJewor CQkJLyogV2UncmUgZG9uZSB3aXRoIHRoaXMgcGFyYWxsZWwgaW5kZXggc2NhbiAqLworCQkJ c3RhdHVzID0gZmFsc2U7CisJCX0KKwkJZWxzZSBpZiAoYnRzY2FuLT5idHBzX3BhZ2VTdGF0 dXMgPT0gQlRQQVJBTExFTF9JRExFICYmCisJCQkJIGJ0c2Nhbi0+YnRwc19uZXh0U2NhblBh Z2UgPT0gUF9OT05FKQorCQl7CisJCQkvKiBFbmQgdGhpcyBwYXJhbGxlbCBpbmRleCBzY2Fu ICovCisJCQlzdGF0dXMgPSBmYWxzZTsKKwkJCWVuZHNjYW4gPSB0cnVlOworCQl9CisJCWVs c2UgaWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID09IEJUUEFSQUxMRUxfTkVFRF9QUklN U0NBTikKKwkJeworCQkJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJCQlpZiAoZmly c3QpCisJCQl7CisJCQkJLyogQ2FuIHN0YXJ0IHNjaGVkdWxlZCBwcmltaXRpdmUgc2NhbiBy aWdodCBhd2F5LCBzbyBkbyBzbyAqLworCQkJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0g QlRQQVJBTExFTF9BRFZBTkNJTkc7CisKKwkJCQkvKiBSZXN0b3JlIHNjYW4ncyBhcnJheSBr ZXlzIGZyb20gc2VyaWFsaXplZCB2YWx1ZXMgKi8KKwkJCQlfYnRfcGFyYWxsZWxfcmVzdG9y ZV9hcnJheXMocmVsLCBidHNjYW4sIHNvKTsKKwkJCQlleGl0X2xvb3AgPSB0cnVlOworCQkJ fQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICogRG9uJ3QgYXR0ZW1wdCB0byBzZWl6 ZSB0aGUgc2NhbiB3aGVuIGl0IHJlcXVpcmVzIGFub3RoZXIKKwkJCQkgKiBwcmltaXRpdmUg aW5kZXggc2Nhbiwgc2luY2UgY2FsbGVyJ3MgYmFja2VuZCBjYW5ub3Qgc3RhcnQKKwkJCQkg KiBpdCByaWdodCBub3cKKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBmYWxzZTsKKwkJCX0KKwor CQkJLyoKKwkJCSAqIEVpdGhlciB3YXksIHVwZGF0ZSBiYWNrZW5kIGxvY2FsIHN0YXRlIHRv IGluZGljYXRlIHRoYXQgYQorCQkJICogcGVuZGluZyBwcmltaXRpdmUgc2NhbiBpcyByZXF1 aXJlZAorCQkJICovCisJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwkJCXNvLT5zY2Fu QmVoaW5kID0gZmFsc2U7CisJCQlzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOworCQl9 CisJCWVsc2UgaWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzICE9IEJUUEFSQUxMRUxfQURW QU5DSU5HKQorCQl7CisJCQkvKgorCQkJICogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VpemVk IGNvbnRyb2wgb2YgdGhlIHNjYW4gZm9yIHRoZSBwdXJwb3NlCisJCQkgKiBvZiBhZHZhbmNp bmcgaXQgdG8gYSBuZXcgcGFnZSEKKwkJCSAqLworCQkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0 dXMgPSBCVFBBUkFMTEVMX0FEVkFOQ0lORzsKKwkJCUFzc2VydChidHNjYW4tPmJ0cHNfbmV4 dFNjYW5QYWdlICE9IFBfTk9ORSk7CisJCQkqbmV4dF9zY2FuX3BhZ2UgPSBidHNjYW4tPmJ0 cHNfbmV4dFNjYW5QYWdlOworCQkJKmxhc3RfY3Vycl9wYWdlID0gYnRzY2FuLT5idHBzX2xh c3RDdXJyUGFnZTsKKwkJCWV4aXRfbG9vcCA9IHRydWU7CisJCX0KKwkJTFdMb2NrUmVsZWFz ZSgmYnRzY2FuLT5idHBzX2xvY2spOworCQlpZiAoZXhpdF9sb29wIHx8ICFzdGF0dXMpCisJ CQlicmVhazsKKwkJQ29uZGl0aW9uVmFyaWFibGVTbGVlcCgmYnRzY2FuLT5idHBzX2N2LCBX QUlUX0VWRU5UX0JUUkVFX1BBR0UpOworCX0KKwlDb25kaXRpb25WYXJpYWJsZUNhbmNlbFNs ZWVwKCk7CisKKwkvKiBXaGVuIHRoZSBzY2FuIGhhcyByZWFjaGVkIHRoZSByaWdodG1vc3Qg KG9yIGxlZnRtb3N0KSBwYWdlLCBlbmQgaXQgKi8KKwlpZiAoZW5kc2NhbikKKwkJX2J0X3Bh cmFsbGVsX2RvbmUoc2Nhbik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKgogICogX2J0 X3BhcmFsbGVsX3JlbGVhc2UoKSAtLSBDb21wbGV0ZSB0aGUgcHJvY2VzcyBvZiBhZHZhbmNp bmcgdGhlIHNjYW4gdG8gYQogICoJCW5ldyBwYWdlLiAgV2Ugbm93IGhhdmUgdGhlIG5ldyB2 YWx1ZSBidHBzX25leHRTY2FuUGFnZTsgYW5vdGhlciBiYWNrZW5kCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRzZWFyY2guYwppbmRleCA3NzI2NGRkZWVjYi4uMTBiMjhhNzZjMGYg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwpAQCAtMjQsOCArMjQs MjAgQEAKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9y ZWwuaCIKIAorLyoKKyAqIFhYWCBBIGxvdCBvZiB0aGUgbmV3IGZ1bmN0aW9ucyBhcmUgY29w aWVzIG9mIHRoZSBub24tYmF0Y2hpbmcgdmVyc2lvbiwgd2l0aAorICogY2hhbmdlcyB0byBt YWtlIGl0IHdvcmsgd2l0aCBiYXRjaGluZyAod2hpY2ggbWVhbnMgd2l0aCBwb3NpdGlvbiBw cm92aWRlZAorICogYnkgdGhlIGNhbGxlciwgbm90IGZyb20gdGhlIEJUU2Nhbk9wYXF1ZSku IFRoZSBkdXBsaWNhdGlvbiBpcyBub3QgZ3JlYXQsCisgKiBidXQgaXQncyBhIGJpdCB1bmNs ZWFyIHdoYXQgdG8gZG8gYWJvdXQgaXQuIE9uZSBvcHRpb24gd291bGQgYmUgdG8gcmVtb3Zl CisgKiB0aGUgYW1nZXR0dXBsZSgpIGludGVyZmFjZSBhbHRvZ2V0aGVyLCBvbmNlIHRoZSBi YXRjaGluZyBBUEkgd29ya3MsIGJ1dCB3ZQorICogbWF5IGFsc28gY2hvb3NlIHRvIGtlZXAg Ym90aCAoZS5nLiBmb3IgY2FzZXMgdGhhdCBkb24ndCBzdXBwb3J0IGJhdGNoaW5nLAorICog bGlrZSBzY2FucyBvZiBjYXRhbG9ncykuIEluIHRoYXQgY2FzZSB3ZSdkIG5lZWQgdG8gZG8g c29tZSByZWZhY3RvcmluZyB0bworICogc2hhcmUgYXMgbXVjaCBjb2RlIGFzIHBvc3NpYmxl LgorICovCiAKIHN0YXRpYyB2b2lkIF9idF9kcm9wX2xvY2tfYW5kX21heWJlX3BpbihJbmRl eFNjYW5EZXNjIHNjYW4sIEJUU2NhblBvcyBzcCk7CisKKy8qIHN0YXRpYyB2b2lkIF9idF9k cm9wX2xvY2tfYW5kX21heWJlX3Bpbl9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0 Y2hTY2FuUG9zIHNwKTsgKi8KIHN0YXRpYyBCdWZmZXIgX2J0X21vdmVyaWdodChSZWxhdGlv biByZWwsIFJlbGF0aW9uIGhlYXByZWwsIEJUU2Nhbkluc2VydCBrZXksCiAJCQkJCQkJQnVm ZmVyIGJ1ZiwgYm9vbCBmb3J1cGRhdGUsIEJUU3RhY2sgc3RhY2ssCiAJCQkJCQkJaW50IGFj Y2Vzcyk7CkBAIC0zNCwyNCArNDYsNDQgQEAgc3RhdGljIGludAlfYnRfYmluc3JjaF9wb3N0 aW5nKEJUU2Nhbkluc2VydCBrZXksIFBhZ2UgcGFnZSwKIAkJCQkJCQkJT2Zmc2V0TnVtYmVy IG9mZm51bSk7CiBzdGF0aWMgYm9vbCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuRGlyZWN0aW9uIGRpciwKIAkJCQkJCSBPZmZzZXROdW1iZXIgb2ZmbnVtLCBib29s IGZpcnN0cGFnZSk7CitzdGF0aWMgSW5kZXhTY2FuQmF0Y2ggX2J0X3JlYWRwYWdlX2JhdGNo KEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLAorCQkJCQkJCQkJCSBT Y2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkJCQkJCQkgYm9v bCBmaXJzdFBhZ2UpOwogc3RhdGljIHZvaWQgX2J0X3NhdmVpdGVtKEJUU2Nhbk9wYXF1ZSBz bywgaW50IGl0ZW1JbmRleCwKIAkJCQkJCSBPZmZzZXROdW1iZXIgb2ZmbnVtLCBJbmRleFR1 cGxlIGl0dXApOworc3RhdGljIHZvaWQgX2J0X3NhdmVpdGVtX2JhdGNoKEluZGV4U2NhbkJh dGNoIGJhdGNoLCBpbnQgaXRlbUluZGV4LAorCQkJCQkJCSAgIE9mZnNldE51bWJlciBvZmZu dW0sIEluZGV4VHVwbGUgaXR1cCk7CiBzdGF0aWMgaW50CV9idF9zZXR1cHBvc3RpbmdpdGVt cyhCVFNjYW5PcGFxdWUgc28sIGludCBpdGVtSW5kZXgsCiAJCQkJCQkJCSAgT2Zmc2V0TnVt YmVyIG9mZm51bSwgSXRlbVBvaW50ZXIgaGVhcFRpZCwKIAkJCQkJCQkJICBJbmRleFR1cGxl IGl0dXApOworc3RhdGljIGludAlfYnRfc2V0dXBwb3N0aW5naXRlbXNfYmF0Y2goSW5kZXhT Y2FuQmF0Y2ggYmF0Y2gsIGludCBpdGVtSW5kZXgsCisJCQkJCQkJCQkJT2Zmc2V0TnVtYmVy IG9mZm51bSwgSXRlbVBvaW50ZXIgaGVhcFRpZCwKKwkJCQkJCQkJCQlJbmRleFR1cGxlIGl0 dXApOwogc3RhdGljIGlubGluZSB2b2lkIF9idF9zYXZlcG9zdGluZ2l0ZW0oQlRTY2FuT3Bh cXVlIHNvLCBpbnQgaXRlbUluZGV4LAogCQkJCQkJCQkJICAgT2Zmc2V0TnVtYmVyIG9mZm51 bSwKIAkJCQkJCQkJCSAgIEl0ZW1Qb2ludGVyIGhlYXBUaWQsIGludCB0dXBsZU9mZnNldCk7 CitzdGF0aWMgaW5saW5lIHZvaWQgX2J0X3NhdmVwb3N0aW5naXRlbV9iYXRjaChJbmRleFNj YW5CYXRjaCBiYXRjaCwgaW50IGl0ZW1JbmRleCwKKwkJCQkJCQkJCQkJIE9mZnNldE51bWJl ciBvZmZudW0sCisJCQkJCQkJCQkJCSBJdGVtUG9pbnRlciBoZWFwVGlkLCBpbnQgdHVwbGVP ZmZzZXQpOwogc3RhdGljIGlubGluZSB2b2lkIF9idF9yZXR1cm5pdGVtKEluZGV4U2NhbkRl c2Mgc2NhbiwgQlRTY2FuT3BhcXVlIHNvKTsKIHN0YXRpYyBib29sIF9idF9zdGVwcGFnZShJ bmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyBJbmRleFNj YW5CYXRjaCBfYnRfc3RlcHBhZ2VfYmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNo U2NhblBvcyBwb3MsCisJCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyKTsKIHN0YXRpYyBi b29sIF9idF9yZWFkZmlyc3RwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgT2Zmc2V0TnVtYmVy IG9mZm51bSwKIAkJCQkJCQkgIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyBJbmRleFNj YW5CYXRjaCBfYnRfcmVhZGZpcnN0cGFnZV9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJU QmF0Y2hTY2FuUG9zIHBvcywKKwkJCQkJCQkJCQkJICBPZmZzZXROdW1iZXIgb2ZmbnVtLAor CQkJCQkJCQkJCQkgIFNjYW5EaXJlY3Rpb24gZGlyKTsKIHN0YXRpYyBib29sIF9idF9yZWFk bmV4dHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBibGtubywKIAkJCQkJ CQkgQmxvY2tOdW1iZXIgbGFzdGN1cnJibGtubywgU2NhbkRpcmVjdGlvbiBkaXIsCiAJCQkJ CQkJIGJvb2wgc2VpemVkKTsKK3N0YXRpYyBJbmRleFNjYW5CYXRjaCBfYnRfcmVhZG5leHRw YWdlX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLAorCQkJ CQkJCQkJCQkgQmxvY2tOdW1iZXIgYmxrbm8sIEJsb2NrTnVtYmVyIGxhc3RjdXJyYmxrbm8s CisJCQkJCQkJCQkJCSBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCBzZWl6ZWQpOwogc3RhdGlj IEJ1ZmZlciBfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVmdChSZWxhdGlvbiByZWwsIEJsb2Nr TnVtYmVyICpibGtubywKIAkJCQkJCQkJCQkgQmxvY2tOdW1iZXIgbGFzdGN1cnJibGtubyk7 CiBzdGF0aWMgYm9vbCBfYnRfZW5kcG9pbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGly ZWN0aW9uIGRpcik7CitzdGF0aWMgSW5kZXhTY2FuQmF0Y2ggX2J0X2VuZHBvaW50X2JhdGNo KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpOwogCiAKIC8qCkBAIC03 Nyw2ICsxMDksMjAgQEAgX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluKEluZGV4U2NhbkRl c2Mgc2NhbiwgQlRTY2FuUG9zIHNwKQogCX0KIH0KIAorLyogc3RhdGljIHZvaWQgKi8KKy8q IF9idF9kcm9wX2xvY2tfYW5kX21heWJlX3Bpbl9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4s IEJUQmF0Y2hTY2FuUG9zIHNwKSAqLworLyogeyAqLworLyogCV9idF91bmxvY2tidWYoc2Nh bi0+aW5kZXhSZWxhdGlvbiwgc3AtPmJ1Zik7ICovCisvKiAgKi8KKy8qIC8JaWYgKElzTVZD Q1NuYXBzaG90KHNjYW4tPnhzX3NuYXBzaG90KSAmJiAqLworLyogCQlSZWxhdGlvbk5lZWRz V0FMKHNjYW4tPmluZGV4UmVsYXRpb24pICYmICovCisvKiAJCSFzY2FuLT54c193YW50X2l0 dXApICovCisvKiAJeyAqLworLyogCQlSZWxlYXNlQnVmZmVyKHNwLT5idWYpOyAqLworLyog CQlzcC0+YnVmID0gSW52YWxpZEJ1ZmZlcjsgKi8KKy8qIAl9ICovCisvKiB9ICovCisKIC8q CiAgKglfYnRfc2VhcmNoKCkgLS0gU2VhcmNoIHRoZSB0cmVlIGZvciBhIHBhcnRpY3VsYXIg c2NhbmtleSwKICAqCQlvciBtb3JlIHByZWNpc2VseSBmb3IgdGhlIGZpcnN0IGxlYWYgcGFn ZSBpdCBjb3VsZCBiZSBvbi4KQEAgLTE1NzAsMTM2ICsxNjE2LDEzNDQgQEAgX2J0X25leHQo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIH0KIAogLyoKLSAqCV9i dF9yZWFkcGFnZSgpIC0tIExvYWQgZGF0YSBmcm9tIGN1cnJlbnQgaW5kZXggcGFnZSBpbnRv IHNvLT5jdXJyUG9zCisgKglfYnRfZmlyc3RfYmF0Y2goKSAtLSBMb2FkIHRoZSBmaXJzdCBi YXRjaCBpbiBhIHNjYW4uCiAgKgotICogQ2FsbGVyIG11c3QgaGF2ZSBwaW5uZWQgYW5kIHJl YWQtbG9ja2VkIHNvLT5jdXJyUG9zLmJ1ZjsgdGhlIGJ1ZmZlcidzIHN0YXRlCi0gKiBpcyBu b3QgY2hhbmdlZCBoZXJlLiAgQWxzbywgY3VyclBvcy5tb3JlTGVmdCBhbmQgbW9yZVJpZ2h0 IG11c3QgYmUgdmFsaWQ7Ci0gKiB0aGV5IGFyZSB1cGRhdGVkIGFzIGFwcHJvcHJpYXRlLiAg QWxsIG90aGVyIGZpZWxkcyBvZiBzby0+Y3VyclBvcyBhcmUKLSAqIGluaXRpYWxpemVkIGZy b20gc2NyYXRjaCBoZXJlLgorICogQSBiYXRjaCB2YXJpYW50IG9mIF9idF9maXJzdCgpLiBN b3N0IG9mIHRoZSBjb21tZW50cyBmb3IgdGhhdCBmdW5jdGlvbgorICogYXBwbHkgaGVyZSB0 b28uCiAgKgotICogV2Ugc2NhbiB0aGUgY3VycmVudCBwYWdlIHN0YXJ0aW5nIGF0IG9mZm51 bSBhbmQgbW92aW5nIGluIHRoZSBpbmRpY2F0ZWQKLSAqIGRpcmVjdGlvbi4gIEFsbCBpdGVt cyBtYXRjaGluZyB0aGUgc2NhbiBrZXlzIGFyZSBsb2FkZWQgaW50byBjdXJyUG9zLml0ZW1z LgotICogbW9yZUxlZnQgb3IgbW9yZVJpZ2h0IChhcyBhcHByb3ByaWF0ZSkgaXMgY2xlYXJl ZCBpZiBfYnRfY2hlY2trZXlzIHJlcG9ydHMKLSAqIHRoYXQgdGhlcmUgY2FuIGJlIG5vIG1v cmUgbWF0Y2hpbmcgdHVwbGVzIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uCi0gKiAo Y291bGQganVzdCBiZSBmb3IgdGhlIGN1cnJlbnQgcHJpbWl0aXZlIGluZGV4IHNjYW4gd2hl biBzY2FuIGhhcyBhcnJheXMpLgorICogWFhYIFRoaXMgb25seSBwb3B1bGF0ZXMgdGhlIGJh dGNoLCBpdCBkb2VzIG5vdCBzZXQgYW55IG90aGVyIGZpZWxkcyBsaWtlCisgKiBzY2FuLT54 c19oZWFwdGlkIG9yIHNjYW4tPnhzX2l0dXAuIFRoYXQgaGFwcGVucyBpbiBnZXRuZXh0X3Rp ZCgpIGNhbGxzLgogICoKLSAqIEluIHRoZSBjYXNlIG9mIGEgcGFyYWxsZWwgc2NhbiwgY2Fs bGVyIG11c3QgaGF2ZSBjYWxsZWQgX2J0X3BhcmFsbGVsX3NlaXplCi0gKiBwcmlvciB0byBj YWxsaW5nIHRoaXMgZnVuY3Rpb247IHRoaXMgZnVuY3Rpb24gd2lsbCBpbnZva2UKLSAqIF9i dF9wYXJhbGxlbF9yZWxlYXNlIGJlZm9yZSByZXR1cm5pbmcuCisgKiBYWFggSSdtIG5vdCBz dXJlIGl0IHdvcmtzIHRvIG1peCBiYXRjaGVkIGFuZCBub24tYmF0Y2hlcyBjYWxscywgZS5n LiBnZXQKKyAqIGEgVElEIGFuZCB0aGVuIGEgYmF0Y2ggb2YgVElEcy4gSXQgcHJvYmFibHkg c2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB3ZQorICogdXBkYXRlIGl0ZW1JbmRleCBjb3JyZWN0 bHksIGJ1dCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQga2lsbGVkIGl0ZW1zCisgKiAo cmlnaHQgbm93IHRoZSB0d28gcGxhY2VzIHVzZSBkaWZmZXJlbnQgd2F5cyB0byBjb21tdW5p Y2F0ZSB3aGljaCBpdGVtcworICogc2hvdWxkIGJlIGtpbGxlZCkuCiAgKgotICogUmV0dXJu cyB0cnVlIGlmIGFueSBtYXRjaGluZyBpdGVtcyBmb3VuZCBvbiB0aGUgcGFnZSwgZmFsc2Ug aWYgbm9uZS4KKyAqIFhYWCBXZSBwcm9iYWJseSBzaG91bGQgbm90IHJlbHkgb24gX2J0X2Zp cnN0L19idF9zdGVwcGFnZSwgYmVjYXVzZSB0aGF0CisgKiB2ZXJ5IG11Y2ggcmVsaWVzIG9u IGN1cnJQb3MsIGFuZCBpdCdzIGp1c3QgbGF6aW5lc3MgdG8gcmVseSBvbiB0aGF0LiBGb3IK KyAqIGJhdGNoaW5nIHdlIHByb2JhYmx5IG5lZWQgc29tZXRoaW5nIGVsc2UgYW55d2F5Lgog ICovCi1zdGF0aWMgYm9vbAotX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCi0JCQkgYm9vbCBmaXJzdHBh Z2UpCitJbmRleFNjYW5CYXRjaAorX2J0X2ZpcnN0X2JhdGNoKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIpCiB7CiAJUmVsYXRpb24JcmVsID0gc2Nhbi0+aW5kZXhS ZWxhdGlvbjsKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFx dWU7Ci0JUGFnZQkJcGFnZTsKLQlCVFBhZ2VPcGFxdWUgb3BhcXVlOwotCU9mZnNldE51bWJl ciBtaW5vZmY7Ci0JT2Zmc2V0TnVtYmVyIG1heG9mZjsKLQlCVFJlYWRQYWdlU3RhdGUgcHN0 YXRlOwotCWJvb2wJCWFycmF5S2V5czsKLQlpbnQJCQlpdGVtSW5kZXgsCi0JCQkJaW5kbmF0 dHM7CisJQlRTdGFjawkJc3RhY2s7CisJT2Zmc2V0TnVtYmVyIG9mZm51bTsKKwlCVFNjYW5J bnNlcnREYXRhIGluc2tleTsKKwlTY2FuS2V5CQlzdGFydEtleXNbSU5ERVhfTUFYX0tFWVNd OworCVNjYW5LZXlEYXRhIG5vdG51bGxrZXlzW0lOREVYX01BWF9LRVlTXTsKKwlpbnQJCQlr ZXlzeiA9IDA7CisJU3RyYXRlZ3lOdW1iZXIgc3RyYXRfdG90YWw7CisJQmxvY2tOdW1iZXIg Ymxrbm8gPSBJbnZhbGlkQmxvY2tOdW1iZXIsCisJCQkJbGFzdGN1cnJibGtubzsKKwlCVEJh dGNoU2NhblBvc0RhdGEgcG9zOwogCi0JLyogc2F2ZSB0aGUgcGFnZS9idWZmZXIgYmxvY2sg bnVtYmVyLCBhbG9uZyB3aXRoIGl0cyBzaWJsaW5nIGxpbmtzICovCi0JcGFnZSA9IEJ1ZmZl ckdldFBhZ2Uoc28tPmN1cnJQb3MuYnVmKTsKLQlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUo cGFnZSk7Ci0Jc28tPmN1cnJQb3MuY3VyclBhZ2UgPSBCdWZmZXJHZXRCbG9ja051bWJlcihz by0+Y3VyclBvcy5idWYpOwotCXNvLT5jdXJyUG9zLnByZXZQYWdlID0gb3BhcXVlLT5idHBv X3ByZXY7Ci0Jc28tPmN1cnJQb3MubmV4dFBhZ2UgPSBvcGFxdWUtPmJ0cG9fbmV4dDsKKwlC VEJhdGNoU2NhblBvc0ludmFsaWRhdGUocG9zKTsKIAotCUFzc2VydCghUF9JR05PUkUob3Bh cXVlKSk7Ci0JQXNzZXJ0KEJUU2NhblBvc0lzUGlubmVkKHNvLT5jdXJyUG9zKSk7Ci0JQXNz ZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdp dGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9z SXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ bWFya1BvcykpOwogCi0JaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4pCi0JewotCQkvKiBhbGxv dyBuZXh0L3ByZXYgcGFnZSB0byBiZSByZWFkIGJ5IG90aGVyIHdvcmtlciB3aXRob3V0IGRl bGF5ICovCi0JCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCi0JCQlfYnRfcGFy YWxsZWxfcmVsZWFzZShzY2FuLCBzby0+Y3VyclBvcy5uZXh0UGFnZSwKLQkJCQkJCQkJIHNv LT5jdXJyUG9zLmN1cnJQYWdlKTsKLQkJZWxzZQotCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uo c2Nhbiwgc28tPmN1cnJQb3MucHJldlBhZ2UsCi0JCQkJCQkJCSBzby0+Y3VyclBvcy5jdXJy UGFnZSk7Ci0JfQorCS8qIEZJWE1FIG1heWJlIGNoZWNrIHRoZXJlJ3Mgbm8gYWN0aXZlIGJh dGNoIHlldCAqLworCS8qIEFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykp OyAqLwogCi0JLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgY3VyclBvcyBmaWVsZHMgcmVsYXRl ZCB0byBjdXJyZW50IHBhZ2UgKi8KLQlzby0+Y3VyclBvcy5sc24gPSBCdWZmZXJHZXRMU05B dG9taWMoc28tPmN1cnJQb3MuYnVmKTsKLQlzby0+Y3VyclBvcy5kaXIgPSBkaXI7Ci0Jc28t PmN1cnJQb3MubmV4dFR1cGxlT2Zmc2V0ID0gMDsKLQkvKiBlaXRoZXIgbW9yZUxlZnQgb3Ig bW9yZVJpZ2h0IHNob3VsZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIpICovCi0J QXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHNvLT5jdXJyUG9zLm1vcmVS aWdodCA6Ci0JCSAgIHNvLT5jdXJyUG9zLm1vcmVMZWZ0KTsKKwkvKgorCSAqIEV4YW1pbmUg dGhlIHNjYW4ga2V5cyBhbmQgZWxpbWluYXRlIGFueSByZWR1bmRhbnQga2V5czsgYWxzbyBt YXJrIHRoZQorCSAqIGtleXMgdGhhdCBtdXN0IGJlIG1hdGNoZWQgdG8gY29udGludWUgdGhl IHNjYW4uCisJICovCisJX2J0X3ByZXByb2Nlc3Nfa2V5cyhzY2FuKTsKIAotCVByZWRpY2F0 ZUxvY2tQYWdlKHJlbCwgc28tPmN1cnJQb3MuY3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90 KTsKKwkvKgorCSAqIFF1aXQgbm93IGlmIF9idF9wcmVwcm9jZXNzX2tleXMoKSBkaXNjb3Zl cmVkIHRoYXQgdGhlIHNjYW4ga2V5cyBjYW4KKwkgKiBuZXZlciBiZSBzYXRpc2ZpZWQgKGVn LCB4ID09IDEgQU5EIHggPiAyKS4KKwkgKi8KKwlpZiAoIXNvLT5xdWFsX29rKQorCXsKKwkJ QXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7 CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkvKiBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxl cyAqLwotCWluZG5hdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mQXR0cmlidXRlcyhy ZWwpOwotCWFycmF5S2V5cyA9IHNvLT5udW1BcnJheUtleXMgIT0gMDsKLQltaW5vZmYgPSBQ X0ZJUlNUREFUQUtFWShvcGFxdWUpOwotCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXROdW1i ZXIocGFnZSk7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFyYWxsZWwgc2Nhbiwgd2UgbXVz dCBzZWl6ZSB0aGUgc2Nhbi4gIF9idF9yZWFkZmlyc3RwYWdlCisJICogd2lsbCBsaWtlbHkg cmVsZWFzZSB0aGUgcGFyYWxsZWwgc2NhbiBsYXRlciBvbi4KKwkgKi8KKwlpZiAoc2Nhbi0+ cGFyYWxsZWxfc2NhbiAhPSBOVUxMICYmCisJCSFfYnRfcGFyYWxsZWxfc2VpemVfYmF0Y2go c2NhbiwgJnBvcywgJmJsa25vLCAmbGFzdGN1cnJibGtubywgdHJ1ZSkpCisJCXJldHVybiBm YWxzZTsKIAotCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBzdGF0ZSB0aGF0IHdlJ2xsIHBh c3MgdG8gX2J0X2NoZWNra2V5cyAqLwotCXBzdGF0ZS5taW5vZmYgPSBtaW5vZmY7Ci0JcHN0 YXRlLm1heG9mZiA9IG1heG9mZjsKLQlwc3RhdGUuZmluYWx0dXAgPSBOVUxMOwotCXBzdGF0 ZS5wYWdlID0gcGFnZTsKLQlwc3RhdGUuZmlyc3RwYWdlID0gZmlyc3RwYWdlOwotCXBzdGF0 ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7Ci0JcHN0YXRlLnN0YXJ0aWtleSA9IDA7Ci0J cHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7Ci0JcHN0YXRlLnNraXAgPSBJ bnZhbGlkT2Zmc2V0TnVtYmVyOwotCXBzdGF0ZS5jb250aW51ZXNjYW4gPSB0cnVlOyAvKiBk ZWZhdWx0IGFzc3VtcHRpb24gKi8KLQlwc3RhdGUucmVjaGVja3MgPSAwOwotCXBzdGF0ZS50 YXJnZXRkaXN0YW5jZSA9IDA7Ci0JcHN0YXRlLm5za2lwYWR2YW5jZXMgPSAwOworCS8qCisJ ICogSW5pdGlhbGl6ZSB0aGUgc2NhbidzIGFycmF5cyAoaWYgYW55KSBmb3IgdGhlIGN1cnJl bnQgc2NhbiBkaXJlY3Rpb24KKwkgKiAoZXhjZXB0IHdoZW4gdGhleSB3ZXJlIGFscmVhZHkg c2V0IHRvIGxhdGVyIHZhbHVlcyBhcyBwYXJ0IG9mCisJICogc2NoZWR1bGluZyB0aGUgcHJp bWl0aXZlIGluZGV4IHNjYW4gdGhhdCBpcyBub3cgdW5kZXJ3YXkpCisJICovCisJaWYgKHNv LT5udW1BcnJheUtleXMgJiYgIXNvLT5uZWVkUHJpbVNjYW4pCisJCV9idF9zdGFydF9hcnJh eV9rZXlzKHNjYW4sIGRpcik7CiAKLQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIp KQorCWlmIChibGtubyAhPSBJbnZhbGlkQmxvY2tOdW1iZXIpCiAJewotCQkvKiBTS19TRUFS Q0hBUlJBWSBmb3J3YXJkIHNjYW5zIG11c3QgcHJvdmlkZSBoaWdoIGtleSB1cCBmcm9udCAq LwotCQlpZiAoYXJyYXlLZXlzKQotCQl7Ci0JCQlpZiAoIVBfUklHSFRNT1NUKG9wYXF1ZSkp Ci0JCQl7Ci0JCQkJSXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkp OworCQkvKgorCQkgKiBXZSBhbnRpY2lwYXRlZCBjYWxsaW5nIF9idF9zZWFyY2gsIGJ1dCBh bm90aGVyIHdvcmtlciBiZXQgdXMgdG8gaXQuCisJCSAqIF9idF9yZWFkbmV4dHBhZ2UgcmVs ZWFzZXMgdGhlIHNjYW4gZm9yIHVzIChub3QgX2J0X3JlYWRmaXJzdHBhZ2UpLgorCQkgKi8K KwkJQXNzZXJ0KHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCk7CisJCUFzc2VydCghc28t Pm5lZWRQcmltU2Nhbik7CisJCUFzc2VydChibGtubyAhPSBQX05PTkUpOwogCi0JCQkJcHN0 YXRlLmZpbmFsdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7CisJ CXJldHVybiBfYnRfcmVhZG5leHRwYWdlX2JhdGNoKHNjYW4sICZwb3MsIGJsa25vLCBsYXN0 Y3VycmJsa25vLCBkaXIsIHRydWUpOworCX0KIAotCQkJCWlmIChzby0+c2NhbkJlaGluZCAm JgotCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZp bmFsdHVwKSkKLQkJCQl7Ci0JCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGlu ZGV4IHNjYW4gYWZ0ZXIgYWxsICovCi0JCQkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZh bHNlOwotCQkJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKLQkJCQkJaWYgKHNjYW4tPnBh cmFsbGVsX3NjYW4pCi0JCQkJCQlfYnRfcGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUoc2Nh biwKLQkJCQkJCQkJCQkJCQkgICBzby0+Y3VyclBvcy5jdXJyUGFnZSk7Ci0JCQkJCXJldHVy biBmYWxzZTsKLQkJCQl9Ci0JCQl9CisJLyoKKwkgKiBDb3VudCBhbiBpbmRleHNjYW4gZm9y IHN0YXRzLCBub3cgdGhhdCB3ZSBrbm93IHRoYXQgd2UnbGwgY2FsbAorCSAqIF9idF9zZWFy Y2gvX2J0X2VuZHBvaW50IGJlbG93CisJICovCisJcGdzdGF0X2NvdW50X2luZGV4X3NjYW4o cmVsKTsKKwlpZiAoc2Nhbi0+aW5zdHJ1bWVudCkKKwkJc2Nhbi0+aW5zdHJ1bWVudC0+bnNl YXJjaGVzKys7CiAKLQkJCXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGlyQ2hlY2sg PSBmYWxzZTsJLyogcmVzZXQgKi8KLQkJfQorCS8qLS0tLS0tLS0tLQorCSAqIEV4YW1pbmUg dGhlIHNjYW4ga2V5cyB0byBkaXNjb3ZlciB3aGVyZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBz Y2FuLgorCSAqCisJICogV2Ugd2FudCB0byBpZGVudGlmeSB0aGUga2V5cyB0aGF0IGNhbiBi ZSB1c2VkIGFzIHN0YXJ0aW5nIGJvdW5kYXJpZXM7CisJICogdGhlc2UgYXJlID0sID4sIG9y ID49IGtleXMgZm9yIGEgZm9yd2FyZCBzY2FuIG9yID0sIDwsIDw9IGtleXMgZm9yCisJICog YSBiYWNrd2FyZHMgc2Nhbi4gIFdlIGNhbiB1c2Uga2V5cyBmb3IgbXVsdGlwbGUgYXR0cmli dXRlcyBzbyBsb25nIGFzCisJICogdGhlIHByaW9yIGF0dHJpYnV0ZXMgaGFkIG9ubHkgPSwg Pj0gKHJlc3AuID0sIDw9KSBrZXlzLiAgT25jZSB3ZSBhY2NlcHQKKwkgKiBhID4gb3IgPCBi b3VuZGFyeSBvciBmaW5kIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIGJvdW5kYXJ5ICh3aGljaCBj YW4gYmUKKwkgKiB0aG91Z2h0IG9mIGFzIHRoZSBzYW1lIGFzICI+IC1pbmZpbml0eSIpLCB3 ZSBjYW4ndCB1c2Uga2V5cyBmb3IgYW55CisJICogYXR0cmlidXRlcyB0byBpdHMgcmlnaHQs IGJlY2F1c2UgaXQgd291bGQgYnJlYWsgb3VyIHNpbXBsaXN0aWMgbm90aW9uCisJICogb2Yg d2hhdCBpbml0aWFsIHBvc2l0aW9uaW5nIHN0cmF0ZWd5IHRvIHVzZS4KKwkgKgorCSAqIFdo ZW4gdGhlIHNjYW4ga2V5cyBpbmNsdWRlIGNyb3NzLXR5cGUgb3BlcmF0b3JzLCBfYnRfcHJl cHJvY2Vzc19rZXlzCisJICogbWF5IG5vdCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRh bnQga2V5czsgaW4gc3VjaCBjYXNlcyB3ZSB3aWxsCisJICogYXJiaXRyYXJpbHkgcGljayBh IHVzYWJsZSBvbmUgZm9yIGVhY2ggYXR0cmlidXRlLiAgVGhpcyBpcyBjb3JyZWN0CisJICog YnV0IHBvc3NpYmx5IG5vdCBvcHRpbWFsIGJlaGF2aW9yLiAgKEZvciBleGFtcGxlLCB3aXRo IGtleXMgbGlrZQorCSAqICJ4ID49IDQgQU5EIHggPj0gNSIgd2Ugd291bGQgZWxlY3QgdG8g c2NhbiBzdGFydGluZyBhdCB4PTQgd2hlbgorCSAqIHg9NSB3b3VsZCBiZSBtb3JlIGVmZmlj aWVudC4pICBTaW5jZSB0aGUgc2l0dWF0aW9uIG9ubHkgYXJpc2VzIGdpdmVuCisJICogYSBw b29ybHktd29yZGVkIHF1ZXJ5IHBsdXMgYW4gaW5jb21wbGV0ZSBvcGZhbWlseSwgbGl2ZSB3 aXRoIGl0LgorCSAqCisJICogV2hlbiBib3RoIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IGtl eXMgYXBwZWFyIGZvciBhIHNpbmdsZSBhdHRyaWJ1dGUKKwkgKiAoYWdhaW4sIG9ubHkgcG9z c2libGUgd2hlbiBjcm9zcy10eXBlIG9wZXJhdG9ycyBhcHBlYXIpLCB3ZSAqbXVzdCoKKwkg KiBzZWxlY3Qgb25lIG9mIHRoZSBlcXVhbGl0eSBrZXlzIGZvciB0aGUgc3RhcnRpbmcgcG9p bnQsIGJlY2F1c2UKKwkgKiBfYnRfY2hlY2trZXlzKCkgd2lsbCBzdG9wIHRoZSBzY2FuIGFz IHNvb24gYXMgYW4gZXF1YWxpdHkgcXVhbCBmYWlscy4KKwkgKiBGb3IgZXhhbXBsZSwgaWYg d2UgaGF2ZSBrZXlzIGxpa2UgInggPj0gNCBBTkQgeCA9IDEwIiBhbmQgd2UgZWxlY3QgdG8K KwkgKiBzdGFydCBhdCB4PTQsIHdlIHdpbGwgZmFpbCBhbmQgc3RvcCBiZWZvcmUgcmVhY2hp bmcgeD0xMC4gIElmIG11bHRpcGxlCisJICogZXF1YWxpdHkgcXVhbHMgc3Vydml2ZSBwcmVw cm9jZXNzaW5nLCBob3dldmVyLCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaAorCSAqIG9uZSB3 ZSB1c2UgLS0tIGJ5IGRlZmluaXRpb24sIHRoZXkgYXJlIGVpdGhlciByZWR1bmRhbnQgb3IK KwkgKiBjb250cmFkaWN0b3J5LgorCSAqCisJICogSW4gcHJhY3RpY2Ugd2UgcmFyZWx5IHNl ZSBhbnkgImF0dHJpYnV0ZSBib3VuZGFyeSBrZXkgZ2FwcyIgaGVyZS4KKwkgKiBQcmVwcm9j ZXNzaW5nIGNhbiB1c3VhbGx5IGJhY2tmaWxsIHNraXAgYXJyYXkga2V5cyBmb3IgYW55IGF0 dHJpYnV0ZXMKKwkgKiB0aGF0IHdlcmUgb21pdHRlZCBmcm9tIHRoZSBvcmlnaW5hbCBzY2Fu LT5rZXlEYXRhW10gaW5wdXQga2V5cy4gIEFsbAorCSAqIGFycmF5IGtleXMgYXJlIGFsd2F5 cyBjb25zaWRlcmVkID0ga2V5cywgYnV0IHdlJ2xsIHNvbWV0aW1lcyBuZWVkIHRvCisJICog dHJlYXQgdGhlIGN1cnJlbnQga2V5IHZhbHVlIGFzIGlmIHdlIHdlcmUgdXNpbmcgYW4gaW5l cXVhbGl0eSBzdHJhdGVneS4KKwkgKiBUaGlzIGhhcHBlbnMgd2l0aCByYW5nZSBza2lwIGFy cmF5cywgd2hpY2ggc3RvcmUgaW5lcXVhbGl0eSBrZXlzIGluIHRoZQorCSAqIGFycmF5J3Mg bG93X2NvbXBhcmUvaGlnaF9jb21wYXJlIGZpZWxkcyAodXNlZCB0byBmaW5kIHRoZSBmaXJz dC9sYXN0CisJICogc2V0IG9mIG1hdGNoZXMsIHdoZW4gPSBrZXkgd2lsbCBsYWNrIGEgdXNh YmxlIHNrX2FyZ3VtZW50IHZhbHVlKS4KKwkgKiBUaGVzZSBhcmUgYWx3YXlzIHByZWZlcnJl ZCBvdmVyIGFueSByZWR1bmRhbnQgInN0YW5kYXJkIiBpbmVxdWFsaXR5CisJICoga2V5cyBv biB0aGUgc2FtZSBjb2x1bW4gKHBlciB0aGUgdXN1YWwgcnVsZSBhYm91dCBwcmVmZXJyaW5n ID0ga2V5cykuCisJICogTm90ZSBhbHNvIHRoYXQgYW55IGNvbHVtbiB3aXRoIGFuID0gc2tp cCBhcnJheSBrZXkgY2FuIG5ldmVyIGhhdmUgYW4KKwkgKiBhZGRpdGlvbmFsLCBjb250cmFk aWN0b3J5ID0ga2V5LgorCSAqCisJICogQWxsIGtleXMgKHdpdGggdGhlIGV4Y2VwdGlvbiBv ZiBTS19TRUFSQ0hOVUxMIGtleXMgYW5kIFNLX0JUX1NLSVAKKwkgKiBhcnJheSBrZXlzIHdo b3NlIGFycmF5IGlzICJudWxsX2VsZW09dHJ1ZSIpIGltcGx5IGEgTk9UIE5VTEwgcXVhbGlm aWVyLgorCSAqIElmIHRoZSBpbmRleCBzdG9yZXMgbnVsbHMgYXQgdGhlIGVuZCBvZiB0aGUg aW5kZXggd2UnbGwgYmUgc3RhcnRpbmcKKwkgKiBmcm9tLCBhbmQgd2UgaGF2ZSBubyBib3Vu ZGFyeSBrZXkgZm9yIHRoZSBjb2x1bW4gKHdoaWNoIG1lYW5zIHRoZSBrZXkKKwkgKiB3ZSBk ZWR1Y2VkIE5PVCBOVUxMIGZyb20gaXMgYW4gaW5lcXVhbGl0eSBrZXkgdGhhdCBjb25zdHJh aW5zIHRoZSBvdGhlcgorCSAqIGVuZCBvZiB0aGUgaW5kZXgpLCB0aGVuIHdlIGNvbnMgdXAg YW4gZXhwbGljaXQgU0tfU0VBUkNITk9UTlVMTCBrZXkgdG8KKwkgKiB1c2UgYXMgYSBib3Vu ZGFyeSBrZXkuICBJZiB3ZSBkaWRuJ3QgZG8gdGhpcywgd2UgbWlnaHQgZmluZCBvdXJzZWx2 ZXMKKwkgKiB0cmF2ZXJzaW5nIGEgbG90IG9mIG51bGwgZW50cmllcyBhdCB0aGUgc3RhcnQg b2YgdGhlIHNjYW4uCisJICoKKwkgKiBJbiB0aGlzIGxvb3AsIHJvdy1jb21wYXJpc29uIGtl eXMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMga2V5cyBvbiB0aGVpcgorCSAqIGZpcnN0IChs ZWZ0bW9zdCkgY29sdW1ucy4gIFdlJ2xsIGFkZCBvbiBsb3dlci1vcmRlciBjb2x1bW5zIG9m IHRoZSByb3cKKwkgKiBjb21wYXJpc29uIGJlbG93LCBpZiBwb3NzaWJsZS4KKwkgKgorCSAq IFRoZSBzZWxlY3RlZCBzY2FuIGtleXMgKGF0IG1vc3Qgb25lIHBlciBpbmRleCBjb2x1bW4p IGFyZSByZW1lbWJlcmVkIGJ5CisJICogc3RvcmluZyB0aGVpciBhZGRyZXNzZXMgaW50byB0 aGUgbG9jYWwgc3RhcnRLZXlzW10gYXJyYXkuCisJICoKKwkgKiBfYnRfY2hlY2trZXlzL19i dF9hZHZhbmNlX2FycmF5X2tleXMgZGVjaWRlIHdoZXRoZXIgYW5kIHdoZW4gdG8gc3RhcnQK KwkgKiB0aGUgbmV4dCBwcmltaXRpdmUgaW5kZXggc2NhbiAoZm9yIHNjYW5zIHdpdGggYXJy YXkga2V5cykgYmFzZWQgaW4gcGFydAorCSAqIG9uIGFuIHVuZGVyc3RhbmRpbmcgb2YgaG93 IGl0J2xsIGVuYWJsZSB1cyB0byByZXBvc2l0aW9uIHRoZSBzY2FuLgorCSAqIFRoZXkncmUg ZGlyZWN0bHkgYXdhcmUgb2YgaG93IHdlJ2xsIHNvbWV0aW1lcyBjb25zIHVwIGFuIGV4cGxp Y2l0CisJICogU0tfU0VBUkNITk9UTlVMTCBrZXkuICBUaGV5J2xsIGV2ZW4gZW5kIHByaW1p dGl2ZSBzY2FucyBieSBhcHBseWluZyBhCisJICogc3ltbWV0cmljICJkZWR1Y2UgTk9UIE5V TEwiIHJ1bGUgb2YgdGhlaXIgb3duLiAgVGhpcyBhbGxvd3MgdG9wLWxldmVsCisJICogc2Nh bnMgdG8gc2tpcCBsYXJnZSBncm91cHMgb2YgTlVMTHMgdGhyb3VnaCByZXBlYXRlZCBkZWR1 Y3Rpb25zIGFib3V0CisJICoga2V5IHN0cmljdG5lc3MgKGZvciBhIHJlcXVpcmVkIGluZXF1 YWxpdHkga2V5KSBhbmQgd2hldGhlciBOVUxMcyBpbiB0aGUKKwkgKiBrZXkncyBpbmRleCBj b2x1bW4gYXJlIHN0b3JlZCBsYXN0IG9yIGZpcnN0IChyZWxhdGl2ZSB0byBub24tTlVMTHMp LgorCSAqIElmIHlvdSB1cGRhdGUgYW55dGhpbmcgaGVyZSwgX2J0X2NoZWNra2V5cy9fYnRf YWR2YW5jZV9hcnJheV9rZXlzIG1pZ2h0CisJICogbmVlZCB0byBiZSBrZXB0IGluIHN5bmMu CisJICotLS0tLS0tLS0tCisJICovCisJc3RyYXRfdG90YWwgPSBCVEVxdWFsU3RyYXRlZ3lO dW1iZXI7CisJaWYgKHNvLT5udW1iZXJPZktleXMgPiAwKQorCXsKKwkJQXR0ck51bWJlcglj dXJhdHRyOworCQlTY2FuS2V5CQljaG9zZW47CisJCVNjYW5LZXkJCWltcGxpZXNOTjsKKwkJ U2NhbktleQkJY3VyOwogCiAJCS8qCi0JCSAqIENvbnNpZGVyIHBzdGF0ZS5zdGFydGlrZXkg b3B0aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0aXZlCi0JCSAqIGluZGV4IHNj YW4gaGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFnZQorCQkgKiBjaG9zZW4gaXMg dGhlIHNvLWZhci1jaG9zZW4ga2V5IGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUsIGlmIGFu eS4KKwkJICogV2UgZG9uJ3QgY2FzdCB0aGUgZGVjaXNpb24gaW4gc3RvbmUgdW50aWwgd2Ug cmVhY2gga2V5cyBmb3IgdGhlCisJCSAqIG5leHQgYXR0cmlidXRlLgogCQkgKi8KLQkJaWYg KCFwc3RhdGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikKLQkJCV9idF9zZXRfc3Rh cnRpa2V5KHNjYW4sICZwc3RhdGUpOwotCi0JCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRp bmcgb3JkZXIgKi8KLQkJaXRlbUluZGV4ID0gMDsKLQotCQlvZmZudW0gPSBNYXgob2ZmbnVt LCBtaW5vZmYpOworCQljdXIgPSBzby0+a2V5RGF0YTsKKwkJY3VyYXR0ciA9IDE7CisJCWNo b3NlbiA9IE5VTEw7CisJCS8qIEFsc28gcmVtZW1iZXIgYW55IHNjYW5rZXkgdGhhdCBpbXBs aWVzIGEgTk9UIE5VTEwgY29uc3RyYWludCAqLworCQlpbXBsaWVzTk4gPSBOVUxMOwogCi0J CXdoaWxlIChvZmZudW0gPD0gbWF4b2ZmKQorCQkvKgorCQkgKiBMb29wIGl0ZXJhdGVzIGZy b20gMCB0byBudW1iZXJPZktleXMgaW5jbHVzaXZlOyB3ZSB1c2UgdGhlIGxhc3QKKwkJICog cGFzcyB0byBoYW5kbGUgYWZ0ZXItbGFzdC1rZXkgcHJvY2Vzc2luZy4gIEFjdHVhbCBleGl0 IGZyb20gdGhlCisJCSAqIGxvb3AgaXMgYXQgb25lIG9mIHRoZSAiYnJlYWsiIHN0YXRlbWVu dHMgYmVsb3cuCisJCSAqLworCQlmb3IgKGludCBpID0gMDs7IGN1cisrLCBpKyspCiAJCXsK LQkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBvZmZudW0pOwotCQkJSW5k ZXhUdXBsZQlpdHVwOworCQkJaWYgKGkgPj0gc28tPm51bWJlck9mS2V5cyB8fCBjdXItPnNr X2F0dG5vICE9IGN1cmF0dHIpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBEb25lIGxvb2tpbmcg YXQga2V5cyBmb3IgY3VyYXR0ci4KKwkJCQkgKgorCQkJCSAqIElmIHRoaXMgaXMgYSBzY2Fu IGtleSBmb3IgYSBza2lwIGFycmF5IHdob3NlIGN1cnJlbnQKKwkJCQkgKiBlbGVtZW50IGlz IE1JTlZBTCwgY2hvb3NlIGxvd19jb21wYXJlICh3aGVuIHNjYW5uaW5nCisJCQkJICogYmFj a3dhcmRzIGl0J2xsIGJlIE1BWFZBTCwgYW5kIHdlJ2xsIGNob29zZSBoaWdoX2NvbXBhcmUp LgorCQkJCSAqCisJCQkJICogTm90ZTogaWYgdGhlIGFycmF5J3MgbG93X2NvbXBhcmUga2V5 IG1ha2VzICdjaG9zZW4nIE5VTEwsCisJCQkJICogdGhlbiB3ZSBiZWhhdmUgYXMgaWYgdGhl IGFycmF5J3MgZmlyc3QgZWxlbWVudCBpcyAtaW5mLAorCQkJCSAqIGV4Y2VwdCB3aGVuICFh cnJheS0+bnVsbF9lbGVtIGltcGxpZXMgYSB1c2FibGUgTk9UIE5VTEwKKwkJCQkgKiBjb25z dHJhaW50LgorCQkJCSAqLworCQkJCWlmIChjaG9zZW4gIT0gTlVMTCAmJgorCQkJCQkoY2hv c2VuLT5za19mbGFncyAmIChTS19CVF9NSU5WQUwgfCBTS19CVF9NQVhWQUwpKSkKKwkJCQl7 CisJCQkJCWludAkJCWlrZXkgPSBjaG9zZW4gLSBzby0+a2V5RGF0YTsKKwkJCQkJU2Nhbktl eQkJc2tpcGVxdWFsaXR5a2V5ID0gY2hvc2VuOworCQkJCQlCVEFycmF5S2V5SW5mbyAqYXJy YXkgPSBOVUxMOworCisJCQkJCWZvciAoaW50IGFycmlkeCA9IDA7IGFycmlkeCA8IHNvLT5u dW1BcnJheUtleXM7IGFycmlkeCsrKQorCQkJCQl7CisJCQkJCQlhcnJheSA9ICZzby0+YXJy YXlLZXlzW2FycmlkeF07CisJCQkJCQlpZiAoYXJyYXktPnNjYW5fa2V5ID09IGlrZXkpCisJ CQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2Fy ZChkaXIpKQorCQkJCQl7CisJCQkJCQlBc3NlcnQoIShza2lwZXF1YWxpdHlrZXktPnNrX2Zs YWdzICYgU0tfQlRfTUFYVkFMKSk7CisJCQkJCQljaG9zZW4gPSBhcnJheS0+bG93X2NvbXBh cmU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBc3NlcnQoIShza2lwZXF1 YWxpdHlrZXktPnNrX2ZsYWdzICYgU0tfQlRfTUlOVkFMKSk7CisJCQkJCQljaG9zZW4gPSBh cnJheS0+aGlnaF9jb21wYXJlOworCQkJCQl9CisKKwkJCQkJQXNzZXJ0KGNob3NlbiA9PSBO VUxMIHx8CisJCQkJCQkgICBjaG9zZW4tPnNrX2F0dG5vID09IHNraXBlcXVhbGl0eWtleS0+ c2tfYXR0bm8pOworCisJCQkJCWlmICghYXJyYXktPm51bGxfZWxlbSkKKwkJCQkJCWltcGxp ZXNOTiA9IHNraXBlcXVhbGl0eWtleTsKKwkJCQkJZWxzZQorCQkJCQkJQXNzZXJ0KGNob3Nl biA9PSBOVUxMICYmIGltcGxpZXNOTiA9PSBOVUxMKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJ CSAqIElmIHdlIGRpZG4ndCBmaW5kIGEgdXNhYmxlIGJvdW5kYXJ5IGtleSwgc2VlIGlmIHdl IGNhbgorCQkJCSAqIGRlZHVjZSBhIE5PVCBOVUxMIGtleQorCQkJCSAqLworCQkJCWlmIChj aG9zZW4gPT0gTlVMTCAmJiBpbXBsaWVzTk4gIT0gTlVMTCAmJgorCQkJCQkoKGltcGxpZXNO Ti0+c2tfZmxhZ3MgJiBTS19CVF9OVUxMU19GSVJTVCkgPworCQkJCQkgU2NhbkRpcmVjdGlv bklzRm9yd2FyZChkaXIpIDoKKwkJCQkJIFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikp KQorCQkJCXsKKwkJCQkJLyogWWVzLCBzbyBidWlsZCB0aGUga2V5IGluIG5vdG51bGxrZXlz W2tleXN6XSAqLworCQkJCQljaG9zZW4gPSAmbm90bnVsbGtleXNba2V5c3pdOworCQkJCQlT Y2FuS2V5RW50cnlJbml0aWFsaXplKGNob3NlbiwKKwkJCQkJCQkJCQkgICAoU0tfU0VBUkNI Tk9UTlVMTCB8IFNLX0lTTlVMTCB8CisJCQkJCQkJCQkJCShpbXBsaWVzTk4tPnNrX2ZsYWdz ICYKKwkJCQkJCQkJCQkJIChTS19CVF9ERVNDIHwgU0tfQlRfTlVMTFNfRklSU1QpKSksCisJ CQkJCQkJCQkJICAgY3VyYXR0ciwKKwkJCQkJCQkJCQkgICAoKGltcGxpZXNOTi0+c2tfZmxh Z3MgJiBTS19CVF9OVUxMU19GSVJTVCkgPworCQkJCQkJCQkJCQlCVEdyZWF0ZXJTdHJhdGVn eU51bWJlciA6CisJCQkJCQkJCQkJCUJUTGVzc1N0cmF0ZWd5TnVtYmVyKSwKKwkJCQkJCQkJ CQkgICBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJCQkJCQkJ ICAgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkgICAoRGF0dW0pIDApOworCQkJCX0KKworCQkJ CS8qCisJCQkJICogSWYgd2Ugc3RpbGwgZGlkbid0IGZpbmQgYSB1c2FibGUgYm91bmRhcnkg a2V5LCBxdWl0OyBlbHNlCisJCQkJICogc2F2ZSB0aGUgYm91bmRhcnkga2V5IHBvaW50ZXIg aW4gc3RhcnRLZXlzLgorCQkJCSAqLworCQkJCWlmIChjaG9zZW4gPT0gTlVMTCkKKwkJCQkJ YnJlYWs7CisJCQkJc3RhcnRLZXlzW2tleXN6KytdID0gY2hvc2VuOworCisJCQkJLyoKKwkJ CQkgKiBXZSBjYW4gb25seSBjb25zaWRlciBhZGRpbmcgbW9yZSBib3VuZGFyeSBrZXlzIHdo ZW4gdGhlIG9uZQorCQkJCSAqIHRoYXQgd2UganVzdCBjaG9zZSB0byBhZGQgdXNlcyBlaXRo ZXIgdGhlID0gb3IgPj0gc3RyYXRlZ3kKKwkJCQkgKiAoZHVyaW5nIGJhY2t3YXJkcyBzY2Fu cyB3ZSBjYW4gb25seSBkbyBzbyB3aGVuIHRoZSBrZXkgdGhhdAorCQkJCSAqIHdlIGp1c3Qg YWRkZWQgdG8gc3RhcnRLZXlzW10gdXNlcyB0aGUgPSBvciA8PSBzdHJhdGVneSkKKwkJCQkg Ki8KKwkJCQlzdHJhdF90b3RhbCA9IGNob3Nlbi0+c2tfc3RyYXRlZ3k7CisJCQkJaWYgKHN0 cmF0X3RvdGFsID09IEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyIHx8CisJCQkJCXN0cmF0X3Rv dGFsID09IEJUTGVzc1N0cmF0ZWd5TnVtYmVyKQorCQkJCQlicmVhazsKKworCQkJCS8qCisJ CQkJICogSWYgdGhlIGtleSB0aGF0IHdlIGp1c3QgYWRkZWQgdG8gc3RhcnRLZXlzW10gaXMg YSBza2lwCisJCQkJICogYXJyYXkgPSBrZXkgd2hvc2UgY3VycmVudCBlbGVtZW50IGlzIG1h cmtlZCBORVhUIG9yIFBSSU9SLAorCQkJCSAqIG1ha2Ugc3RyYXRfdG90YWwgPiBvciA8IChh bmQgc3RvcCBhZGRpbmcgYm91bmRhcnkga2V5cykuCisJCQkJICogVGhpcyBjYW4gb25seSBo YXBwZW4gd2l0aCBvcGNsYXNzZXMgdGhhdCBsYWNrIHNraXAgc3VwcG9ydC4KKwkJCQkgKi8K KwkJCQlpZiAoY2hvc2VuLT5za19mbGFncyAmIChTS19CVF9ORVhUIHwgU0tfQlRfUFJJT1Ip KQorCQkJCXsKKwkJCQkJQXNzZXJ0KGNob3Nlbi0+c2tfZmxhZ3MgJiBTS19CVF9TS0lQKTsK KwkJCQkJQXNzZXJ0KHN0cmF0X3RvdGFsID09IEJURXF1YWxTdHJhdGVneU51bWJlcik7CisK KwkJCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCQkJeworCQkJCQkJ QXNzZXJ0KCEoY2hvc2VuLT5za19mbGFncyAmIFNLX0JUX1BSSU9SKSk7CisJCQkJCQlzdHJh dF90b3RhbCA9IEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOworCQkJCQl9CisJCQkJCWVsc2UK KwkJCQkJeworCQkJCQkJQXNzZXJ0KCEoY2hvc2VuLT5za19mbGFncyAmIFNLX0JUX05FWFQp KTsKKwkJCQkJCXN0cmF0X3RvdGFsID0gQlRMZXNzU3RyYXRlZ3lOdW1iZXI7CisJCQkJCX0K KworCQkJCQkvKgorCQkJCQkgKiBXZSdyZSBkb25lLiAgV2UnbGwgbmV2ZXIgZmluZCBhbiBl eGFjdCA9IG1hdGNoIGZvciBhCisJCQkJCSAqIE5FWFQgb3IgUFJJT1Igc2VudGluZWwgc2tf YXJndW1lbnQgdmFsdWUuICBUaGVyZSdzIG5vCisJCQkJCSAqIHNlbnNlIGluIHRyeWluZyB0 byBhZGQgbW9yZSBrZXlzIHRvIHN0YXJ0S2V5c1tdLgorCQkJCQkgKi8KKwkJCQkJYnJlYWs7 CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBEb25lIGlmIHRoYXQgd2FzIHRoZSBsYXN0IHNj YW4ga2V5IG91dHB1dCBieSBwcmVwcm9jZXNzaW5nLgorCQkJCSAqIEFsc28gZG9uZSBpZiB0 aGVyZSBpcyBhIGdhcCBpbmRleCBhdHRyaWJ1dGUgdGhhdCBsYWNrcyBhCisJCQkJICogdXNh YmxlIGtleSAob25seSBwb3NzaWJsZSB3aGVuIHByZXByb2Nlc3Npbmcgd2FzIHVuYWJsZSB0 bworCQkJCSAqIGdlbmVyYXRlIGEgc2tpcCBhcnJheSBrZXkgdG8gImZpbGwgaW4gdGhlIGdh cCIpLgorCQkJCSAqLworCQkJCWlmIChpID49IHNvLT5udW1iZXJPZktleXMgfHwKKwkJCQkJ Y3VyLT5za19hdHRubyAhPSBjdXJhdHRyICsgMSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvKgor CQkJCSAqIFJlc2V0IGZvciBuZXh0IGF0dHIuCisJCQkJICovCisJCQkJY3VyYXR0ciA9IGN1 ci0+c2tfYXR0bm87CisJCQkJY2hvc2VuID0gTlVMTDsKKwkJCQlpbXBsaWVzTk4gPSBOVUxM OworCQkJfQorCisJCQkvKgorCQkJICogQ2FuIHdlIHVzZSB0aGlzIGtleSBhcyBhIHN0YXJ0 aW5nIGJvdW5kYXJ5IGZvciB0aGlzIGF0dHI/CisJCQkgKgorCQkJICogSWYgbm90LCBkb2Vz IGl0IGltcGx5IGEgTk9UIE5VTEwgY29uc3RyYWludD8gIChCZWNhdXNlCisJCQkgKiBTS19T RUFSQ0hOVUxMIGtleXMgYXJlIGFsd2F5cyBhc3NpZ25lZCBCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIsCisJCQkgKiAqYW55KiBpbmVxdWFsaXR5IGtleSB3b3JrcyBmb3IgdGhhdDsgd2UgbmVl ZCBub3QgdGVzdC4pCisJCQkgKi8KKwkJCXN3aXRjaCAoY3VyLT5za19zdHJhdGVneSkKKwkJ CXsKKwkJCQljYXNlIEJUTGVzc1N0cmF0ZWd5TnVtYmVyOgorCQkJCWNhc2UgQlRMZXNzRXF1 YWxTdHJhdGVneU51bWJlcjoKKwkJCQkJaWYgKGNob3NlbiA9PSBOVUxMKQorCQkJCQl7CisJ CQkJCQlpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkKKwkJCQkJCQljaG9zZW4g PSBjdXI7CisJCQkJCQllbHNlCisJCQkJCQkJaW1wbGllc05OID0gY3VyOworCQkJCQl9CisJ CQkJCWJyZWFrOworCQkJCWNhc2UgQlRFcXVhbFN0cmF0ZWd5TnVtYmVyOgorCQkJCQkvKiBv dmVycmlkZSBhbnkgbm9uLWVxdWFsaXR5IGNob2ljZSAqLworCQkJCQljaG9zZW4gPSBjdXI7 CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRHcmVhdGVyRXF1YWxTdHJhdGVneU51bWJlcjoK KwkJCQljYXNlIEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOgorCQkJCQlpZiAoY2hvc2VuID09 IE5VTEwpCisJCQkJCXsKKwkJCQkJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikp CisJCQkJCQkJY2hvc2VuID0gY3VyOworCQkJCQkJZWxzZQorCQkJCQkJCWltcGxpZXNOTiA9 IGN1cjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICog SWYgd2UgZm91bmQgbm8gdXNhYmxlIGJvdW5kYXJ5IGtleXMsIHdlIGhhdmUgdG8gc3RhcnQg ZnJvbSBvbmUgZW5kIG9mCisJICogdGhlIHRyZWUuICBXYWxrIGRvd24gdGhhdCBlZGdlIHRv IHRoZSBmaXJzdCBvciBsYXN0IGtleSwgYW5kIHNjYW4gZnJvbQorCSAqIHRoZXJlLgorCSAq CisJICogTm90ZTogY2FsbHMgX2J0X3JlYWRmaXJzdHBhZ2UgZm9yIHVzLCB3aGljaCByZWxl YXNlcyB0aGUgcGFyYWxsZWwgc2Nhbi4KKwkgKi8KKwlpZiAoa2V5c3ogPT0gMCkKKwkJcmV0 dXJuIF9idF9lbmRwb2ludF9iYXRjaChzY2FuLCBkaXIpOworCisJLyoKKwkgKiBXZSB3YW50 IHRvIHN0YXJ0IHRoZSBzY2FuIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGluZGV4LiAgU2V0IHVw IGFuCisJICogaW5zZXJ0aW9uIHNjYW5rZXkgd2UgY2FuIHVzZSB0byBzZWFyY2ggZm9yIHRo ZSBib3VuZGFyeSBwb2ludCB3ZQorCSAqIGlkZW50aWZpZWQgYWJvdmUuICBUaGUgaW5zZXJ0 aW9uIHNjYW5rZXkgaXMgYnVpbHQgdXNpbmcgdGhlIGtleXMKKwkgKiBpZGVudGlmaWVkIGJ5 IHN0YXJ0S2V5c1tdLiAgKFJlbWFpbmluZyBpbnNlcnRpb24gc2NhbmtleSBmaWVsZHMgYXJl CisJICogaW5pdGlhbGl6ZWQgYWZ0ZXIgaW5pdGlhbC1wb3NpdGlvbmluZyBzY2FuIGtleXMg YXJlIGZpbmFsaXplZC4pCisJICovCisJQXNzZXJ0KGtleXN6IDw9IElOREVYX01BWF9LRVlT KTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGtleXN6OyBpKyspCisJeworCQlTY2FuS2V5CQlj dXIgPSBzdGFydEtleXNbaV07CisKKwkJQXNzZXJ0KGN1ci0+c2tfYXR0bm8gPT0gaSArIDEp OworCisJCWlmIChjdXItPnNrX2ZsYWdzICYgU0tfUk9XX0hFQURFUikKKwkJeworCQkJLyoK KwkJCSAqIFJvdyBjb21wYXJpc29uIGhlYWRlcjogbG9vayB0byB0aGUgZmlyc3Qgcm93IG1l bWJlciBpbnN0ZWFkCisJCQkgKi8KKwkJCVNjYW5LZXkJCXN1YmtleSA9IChTY2FuS2V5KSBE YXR1bUdldFBvaW50ZXIoY3VyLT5za19hcmd1bWVudCk7CisKKwkJCS8qCisJCQkgKiBDYW5u b3QgYmUgYSBOVUxMIGluIHRoZSBmaXJzdCByb3cgbWVtYmVyOiBfYnRfcHJlcHJvY2Vzc19r ZXlzCisJCQkgKiB3b3VsZCd2ZSBtYXJrZWQgdGhlIHF1YWwgYXMgdW5zYXRpc2ZpYWJsZSwg cHJldmVudGluZyB1cyBmcm9tCisJCQkgKiBldmVyIGdldHRpbmcgdGhpcyBmYXIKKwkJCSAq LworCQkJQXNzZXJ0KHN1YmtleS0+c2tfZmxhZ3MgJiBTS19ST1dfTUVNQkVSKTsKKwkJCUFz c2VydChzdWJrZXktPnNrX2F0dG5vID09IGN1ci0+c2tfYXR0bm8pOworCQkJQXNzZXJ0KCEo c3Via2V5LT5za19mbGFncyAmIFNLX0lTTlVMTCkpOworCisJCQkvKgorCQkJICogVGhlIG1l bWJlciBzY2Fua2V5cyBhcmUgYWxyZWFkeSBpbiBpbnNlcnRpb24gZm9ybWF0IChpZSwgdGhl eQorCQkJICogaGF2ZSBza19mdW5jID0gMy13YXktY29tcGFyaXNvbiBmdW5jdGlvbikKKwkJ CSAqLworCQkJbWVtY3B5KGluc2tleS5zY2Fua2V5cyArIGksIHN1YmtleSwgc2l6ZW9mKFNj YW5LZXlEYXRhKSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgcm93IGNvbXBhcmlzb24gaXMg dGhlIGxhc3QgcG9zaXRpb25pbmcga2V5IHdlIGFjY2VwdGVkLAorCQkJICogdHJ5IHRvIGFk ZCBhZGRpdGlvbmFsIGtleXMgZnJvbSB0aGUgbG93ZXItb3JkZXIgcm93IG1lbWJlcnMuCisJ CQkgKiAoSWYgd2UgYWNjZXB0ZWQgaW5kZXBlbmRlbnQgY29uZGl0aW9ucyBvbiBhZGRpdGlv bmFsIGluZGV4CisJCQkgKiBjb2x1bW5zLCB3ZSB1c2UgdGhvc2UgaW5zdGVhZCAtLS0gZG9l c24ndCBzZWVtIHdvcnRoIHRyeWluZyB0bworCQkJICogZGV0ZXJtaW5lIHdoaWNoIGlzIG1v cmUgcmVzdHJpY3RpdmUuKSAgTm90ZSB0aGF0IHRoaXMgaXMgT0sKKwkJCSAqIGV2ZW4gaWYg dGhlIHJvdyBjb21wYXJpc29uIGlzIG9mICI+IiBvciAiPCIgdHlwZSwgYmVjYXVzZSB0aGUK KwkJCSAqIGNvbmRpdGlvbiBhcHBsaWVkIHRvIGFsbCBidXQgdGhlIGxhc3Qgcm93IG1lbWJl ciBpcyBlZmZlY3RpdmVseQorCQkJICogIj49IiBvciAiPD0iLCBhbmQgc28gdGhlIGV4dHJh IGtleXMgZG9uJ3QgYnJlYWsgdGhlIHBvc2l0aW9uaW5nCisJCQkgKiBzY2hlbWUuICBCdXQs IGJ5IHRoZSBzYW1lIHRva2VuLCBpZiB3ZSBhcmVuJ3QgYWJsZSB0byB1c2UgYWxsCisJCQkg KiB0aGUgcm93IG1lbWJlcnMsIHRoZW4gdGhlIHBhcnQgb2YgdGhlIHJvdyBjb21wYXJpc29u IHRoYXQgd2UKKwkJCSAqIGRpZCB1c2UgaGFzIHRvIGJlIHRyZWF0ZWQgYXMganVzdCBhICI+ PSIgb3IgIjw9IiBjb25kaXRpb24sIGFuZAorCQkJICogc28gd2UnZCBiZXR0ZXIgYWRqdXN0 IHN0cmF0X3RvdGFsIGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAoaSA9PSBrZXlzeiAt IDEpCisJCQl7CisJCQkJYm9vbAkJdXNlZF9hbGxfc3Via2V5cyA9IGZhbHNlOworCisJCQkJ QXNzZXJ0KCEoc3Via2V5LT5za19mbGFncyAmIFNLX1JPV19FTkQpKTsKKwkJCQlmb3IgKDs7 KQorCQkJCXsKKwkJCQkJc3Via2V5Kys7CisJCQkJCUFzc2VydChzdWJrZXktPnNrX2ZsYWdz ICYgU0tfUk9XX01FTUJFUik7CisJCQkJCWlmIChzdWJrZXktPnNrX2F0dG5vICE9IGtleXN6 ICsgMSkKKwkJCQkJCWJyZWFrOwkvKiBvdXQtb2Ytc2VxdWVuY2UsIGNhbid0IHVzZSBpdCAq LworCQkJCQlpZiAoc3Via2V5LT5za19zdHJhdGVneSAhPSBjdXItPnNrX3N0cmF0ZWd5KQor CQkJCQkJYnJlYWs7CS8qIHdyb25nIGRpcmVjdGlvbiwgY2FuJ3QgdXNlIGl0ICovCisJCQkJ CWlmIChzdWJrZXktPnNrX2ZsYWdzICYgU0tfSVNOVUxMKQorCQkJCQkJYnJlYWs7CS8qIGNh bid0IHVzZSBudWxsIGtleXMgKi8KKwkJCQkJQXNzZXJ0KGtleXN6IDwgSU5ERVhfTUFYX0tF WVMpOworCQkJCQltZW1jcHkoaW5za2V5LnNjYW5rZXlzICsga2V5c3osIHN1YmtleSwKKwkJ CQkJCSAgIHNpemVvZihTY2FuS2V5RGF0YSkpOworCQkJCQlrZXlzeisrOworCQkJCQlpZiAo c3Via2V5LT5za19mbGFncyAmIFNLX1JPV19FTkQpCisJCQkJCXsKKwkJCQkJCXVzZWRfYWxs X3N1YmtleXMgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYg KCF1c2VkX2FsbF9zdWJrZXlzKQorCQkJCXsKKwkJCQkJc3dpdGNoIChzdHJhdF90b3RhbCkK KwkJCQkJeworCQkJCQkJY2FzZSBCVExlc3NTdHJhdGVneU51bWJlcjoKKwkJCQkJCQlzdHJh dF90b3RhbCA9IEJUTGVzc0VxdWFsU3RyYXRlZ3lOdW1iZXI7CisJCQkJCQkJYnJlYWs7CisJ CQkJCQljYXNlIEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOgorCQkJCQkJCXN0cmF0X3RvdGFs ID0gQlRHcmVhdGVyRXF1YWxTdHJhdGVneU51bWJlcjsKKwkJCQkJCQlicmVhazsKKwkJCQkJ fQorCQkJCX0KKwkJCQlicmVhazsJCQkvKiBkb25lIHdpdGggb3V0ZXIgbG9vcCAqLworCQkJ fQorCQl9CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSAqIE9yZGluYXJ5IGNvbXBhcmlzb24g a2V5LiAgVHJhbnNmb3JtIHRoZSBzZWFyY2gtc3R5bGUgc2NhbiBrZXkKKwkJCSAqIHRvIGFu IGluc2VydGlvbiBzY2FuIGtleSBieSByZXBsYWNpbmcgdGhlIHNrX2Z1bmMgd2l0aCB0aGUK KwkJCSAqIGFwcHJvcHJpYXRlIGJ0cmVlIGNvbXBhcmlzb24gZnVuY3Rpb24uCisJCQkgKgor CQkJICogSWYgc2NhbmtleSBvcGVyYXRvciBpcyBub3QgYSBjcm9zcy10eXBlIGNvbXBhcmlz b24sIHdlIGNhbiB1c2UKKwkJCSAqIHRoZSBjYWNoZWQgY29tcGFyaXNvbiBmdW5jdGlvbjsg b3RoZXJ3aXNlIGdvdHRhIGxvb2sgaXQgdXAgaW4KKwkJCSAqIHRoZSBjYXRhbG9ncy4gIChU aGF0IGNhbid0IGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLCBzaW5jZSBubworCQkJICog aW5kZXhzY2FuIGluaXRpYXRlZCBieSBzeXNjYWNoZSBsb29rdXAgd2lsbCB1c2UgY3Jvc3Mt ZGF0YS10eXBlCisJCQkgKiBvcGVyYXRvcnMuKQorCQkJICoKKwkJCSAqIFdlIHN1cHBvcnQg dGhlIGNvbnZlbnRpb24gdGhhdCBza19zdWJ0eXBlID09IEludmFsaWRPaWQgbWVhbnMKKwkJ CSAqIHRoZSBvcGNsYXNzIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBoYWNrIHRvIHNpbXBsaWZ5 IGxpZmUgZm9yCisJCQkgKiBTY2FuS2V5SW5pdCgpLgorCQkJICovCisJCQlpZiAoY3VyLT5z a19zdWJ0eXBlID09IHJlbC0+cmRfb3BjaW50eXBlW2ldIHx8CisJCQkJY3VyLT5za19zdWJ0 eXBlID09IEludmFsaWRPaWQpCisJCQl7CisJCQkJRm1nckluZm8gICAqcHJvY2luZm87CisK KwkJCQlwcm9jaW5mbyA9IGluZGV4X2dldHByb2NpbmZvKHJlbCwgY3VyLT5za19hdHRubywg QlRPUkRFUl9QUk9DKTsKKwkJCQlTY2FuS2V5RW50cnlJbml0aWFsaXplV2l0aEluZm8oaW5z a2V5LnNjYW5rZXlzICsgaSwKKwkJCQkJCQkJCQkJICAgY3VyLT5za19mbGFncywKKwkJCQkJ CQkJCQkJICAgY3VyLT5za19hdHRubywKKwkJCQkJCQkJCQkJICAgSW52YWxpZFN0cmF0ZWd5 LAorCQkJCQkJCQkJCQkgICBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkJCSAgIGN1ci0+ c2tfY29sbGF0aW9uLAorCQkJCQkJCQkJCQkgICBwcm9jaW5mbywKKwkJCQkJCQkJCQkJICAg Y3VyLT5za19hcmd1bWVudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUmVnUHJvY2Vk dXJlIGNtcF9wcm9jOworCisJCQkJY21wX3Byb2MgPSBnZXRfb3BmYW1pbHlfcHJvYyhyZWwt PnJkX29wZmFtaWx5W2ldLAorCQkJCQkJCQkJCQkgcmVsLT5yZF9vcGNpbnR5cGVbaV0sCisJ CQkJCQkJCQkJCSBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkJCSBCVE9SREVSX1BST0Mp OworCQkJCWlmICghUmVnUHJvY2VkdXJlSXNWYWxpZChjbXBfcHJvYykpCisJCQkJCWVsb2co RVJST1IsICJtaXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQoJXUsJXUpIGZvciBhdHRyaWJ1 dGUgJWQgb2YgaW5kZXggXCIlc1wiIiwKKwkJCQkJCSBCVE9SREVSX1BST0MsIHJlbC0+cmRf b3BjaW50eXBlW2ldLCBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkgY3VyLT5za19hdHRubywg UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJCQkJU2NhbktleUVudHJ5SW5pdGlh bGl6ZShpbnNrZXkuc2NhbmtleXMgKyBpLAorCQkJCQkJCQkJICAgY3VyLT5za19mbGFncywK KwkJCQkJCQkJCSAgIGN1ci0+c2tfYXR0bm8sCisJCQkJCQkJCQkgICBJbnZhbGlkU3RyYXRl Z3ksCisJCQkJCQkJCQkgICBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkgICBjdXItPnNr X2NvbGxhdGlvbiwKKwkJCQkJCQkJCSAgIGNtcF9wcm9jLAorCQkJCQkJCQkJICAgY3VyLT5z a19hcmd1bWVudCk7CisJCQl9CisJCX0KKwl9CisKKwkvKi0tLS0tLS0tLS0KKwkgKiBFeGFt aW5lIHRoZSBzZWxlY3RlZCBpbml0aWFsLXBvc2l0aW9uaW5nIHN0cmF0ZWd5IHRvIGRldGVy bWluZSBleGFjdGx5CisJICogd2hlcmUgd2UgbmVlZCB0byBzdGFydCB0aGUgc2NhbiwgYW5k IHNldCBmbGFnIHZhcmlhYmxlcyB0byBjb250cm9sIHRoZQorCSAqIGluaXRpYWwgZGVzY2Vu dCBieSBfYnRfc2VhcmNoIChhbmQgb3VyIF9idF9iaW5zcmNoIGNhbGwgZm9yIHRoZSBsZWFm CisJICogcGFnZSBfYnRfc2VhcmNoIHJldHVybnMpLgorCSAqLS0tLS0tLS0tLQorCSAqLwor CV9idF9tZXRhdmVyc2lvbihyZWwsICZpbnNrZXkuaGVhcGtleXNwYWNlLCAmaW5za2V5LmFs bGVxdWFsaW1hZ2UpOworCWluc2tleS5hbnludWxsa2V5cyA9IGZhbHNlOyAvKiB1bnVzZWQg Ki8KKwlpbnNrZXkuc2NhbnRpZCA9IE5VTEw7CisJaW5za2V5LmtleXN6ID0ga2V5c3o7CisJ c3dpdGNoIChzdHJhdF90b3RhbCkKKwl7CisJCWNhc2UgQlRMZXNzU3RyYXRlZ3lOdW1iZXI6 CisKKwkJCWluc2tleS5uZXh0a2V5ID0gZmFsc2U7CisJCQlpbnNrZXkuYmFja3dhcmQgPSB0 cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVExlc3NFcXVhbFN0cmF0ZWd5TnVtYmVyOgor CisJCQlpbnNrZXkubmV4dGtleSA9IHRydWU7CisJCQlpbnNrZXkuYmFja3dhcmQgPSB0cnVl OworCQkJYnJlYWs7CisKKwkJY2FzZSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXI6CisKKwkJCS8q CisJCQkgKiBJZiBhIGJhY2t3YXJkIHNjYW4gd2FzIHNwZWNpZmllZCwgbmVlZCB0byBzdGFy dCB3aXRoIGxhc3QgZXF1YWwKKwkJCSAqIGl0ZW0gbm90IGZpcnN0IG9uZS4KKwkJCSAqLwor CQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpCisJCQl7CisJCQkJLyoKKwkJ CQkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSA8PSBzdHJhdGVneQorCQkJCSAqLworCQkJ CWluc2tleS5uZXh0a2V5ID0gdHJ1ZTsKKwkJCQlpbnNrZXkuYmFja3dhcmQgPSB0cnVlOwor CQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgc2FtZSBh cyB0aGUgPj0gc3RyYXRlZ3kKKwkJCQkgKi8KKwkJCQlpbnNrZXkubmV4dGtleSA9IGZhbHNl OworCQkJCWluc2tleS5iYWNrd2FyZCA9IGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisKKwkJ Y2FzZSBCVEdyZWF0ZXJFcXVhbFN0cmF0ZWd5TnVtYmVyOgorCisJCQkvKgorCQkJICogRmlu ZCBmaXJzdCBpdGVtID49IHNjYW5rZXkKKwkJCSAqLworCQkJaW5za2V5Lm5leHRrZXkgPSBm YWxzZTsKKwkJCWluc2tleS5iYWNrd2FyZCA9IGZhbHNlOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBCVEdyZWF0ZXJTdHJhdGVneU51bWJlcjoKKworCQkJLyoKKwkJCSAqIEZpbmQgZmlyc3Qg aXRlbSA+IHNjYW5rZXkKKwkJCSAqLworCQkJaW5za2V5Lm5leHRrZXkgPSB0cnVlOworCQkJ aW5za2V5LmJhY2t3YXJkID0gZmFsc2U7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJ LyogY2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJCQllbG9n KEVSUk9SLCAidW5yZWNvZ25pemVkIHN0cmF0X3RvdGFsOiAlZCIsIChpbnQpIHN0cmF0X3Rv dGFsKTsKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFVzZSB0aGUgbWFudWZh Y3R1cmVkIGluc2VydGlvbiBzY2FuIGtleSB0byBkZXNjZW5kIHRoZSB0cmVlIGFuZAorCSAq IHBvc2l0aW9uIG91cnNlbHZlcyBvbiB0aGUgdGFyZ2V0IGxlYWYgcGFnZS4KKwkgKi8KKwlB c3NlcnQoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSA9PSBpbnNrZXkuYmFja3dhcmQp OworCXN0YWNrID0gX2J0X3NlYXJjaChyZWwsIE5VTEwsICZpbnNrZXksICZwb3MuYnVmLCBC VF9SRUFEKTsKKworCS8qIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgc3RhY2sgYXJvdW5kLi4u ICovCisJX2J0X2ZyZWVzdGFjayhzdGFjayk7CisKKwlpZiAoIUJ1ZmZlcklzVmFsaWQocG9z LmJ1ZikpCisJeworCQkvKgorCQkgKiBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZSBpbmRleCBp cyBjb21wbGV0ZWx5IGVtcHR5LiBMb2NrIHJlbGF0aW9uCisJCSAqIGJlY2F1c2Ugbm90aGlu ZyBmaW5lciB0byBsb2NrIGV4aXN0cy4gIFdpdGhvdXQgYSBidWZmZXIgbG9jaywgaXQncwor CQkgKiBwb3NzaWJsZSBmb3IgYW5vdGhlciB0cmFuc2FjdGlvbiB0byBpbnNlcnQgZGF0YSBi ZXR3ZWVuCisJCSAqIF9idF9zZWFyY2goKSBhbmQgUHJlZGljYXRlTG9ja1JlbGF0aW9uKCku ICBXZSBoYXZlIHRvIHRyeSBhZ2FpbgorCQkgKiBhZnRlciB0YWtpbmcgdGhlIHJlbGF0aW9u LWxldmVsIHByZWRpY2F0ZSBsb2NrLCB0byBjbG9zZSBhIG5hcnJvdworCQkgKiB3aW5kb3cg d2hlcmUgd2Ugd291bGRuJ3Qgc2NhbiBjb25jdXJyZW50bHkgaW5zZXJ0ZWQgdHVwbGVzLCBi dXQgdGhlCisJCSAqIHdyaXRlciB3b3VsZG4ndCBzZWUgb3VyIHByZWRpY2F0ZSBsb2NrLgor CQkgKi8KKwkJaWYgKElzb2xhdGlvbklzU2VyaWFsaXphYmxlKCkpCisJCXsKKwkJCVByZWRp Y2F0ZUxvY2tSZWxhdGlvbihyZWwsIHNjYW4tPnhzX3NuYXBzaG90KTsKKwkJCXN0YWNrID0g X2J0X3NlYXJjaChyZWwsIE5VTEwsICZpbnNrZXksICZwb3MuYnVmLCBCVF9SRUFEKTsKKwkJ CV9idF9mcmVlc3RhY2soc3RhY2spOworCQl9CisKKwkJaWYgKCFCdWZmZXJJc1ZhbGlkKHBv cy5idWYpKQorCQl7CisJCQlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCQkJX2J0X3Bh cmFsbGVsX2RvbmUoc2Nhbik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKiBw b3NpdGlvbiB0byB0aGUgcHJlY2lzZSBpdGVtIG9uIHRoZSBwYWdlICovCisJb2ZmbnVtID0g X2J0X2JpbnNyY2gocmVsLCAmaW5za2V5LCBwb3MuYnVmKTsKKworCS8qCisJICogTm93IGxv YWQgZGF0YSBmcm9tIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBzY2FuICh1c3VhbGx5IHRoZSBw YWdlCisJICogY3VycmVudGx5IGluIHNvLT5jdXJyUG9zLmJ1ZikuCisJICoKKwkgKiBJZiBp bnNrZXkubmV4dGtleSA9IGZhbHNlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSBmYWxzZSwgb2Zm bnVtIGlzCisJICogcG9zaXRpb25lZCBhdCB0aGUgZmlyc3Qgbm9uLXBpdm90IHR1cGxlID49 IGluc2tleS5zY2Fua2V5cy4KKwkgKgorCSAqIElmIGluc2tleS5uZXh0a2V5ID0gZmFsc2Ug YW5kIGluc2tleS5iYWNrd2FyZCA9IHRydWUsIG9mZm51bSBpcworCSAqIHBvc2l0aW9uZWQg YXQgdGhlIGxhc3Qgbm9uLXBpdm90IHR1cGxlIDwgaW5za2V5LnNjYW5rZXlzLgorCSAqCisJ ICogSWYgaW5za2V5Lm5leHRrZXkgPSB0cnVlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSBmYWxz ZSwgb2ZmbnVtIGlzCisJICogcG9zaXRpb25lZCBhdCB0aGUgZmlyc3Qgbm9uLXBpdm90IHR1 cGxlID4gaW5za2V5LnNjYW5rZXlzLgorCSAqCisJICogSWYgaW5za2V5Lm5leHRrZXkgPSB0 cnVlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSB0cnVlLCBvZmZudW0gaXMKKwkgKiBwb3NpdGlv bmVkIGF0IHRoZSBsYXN0IG5vbi1waXZvdCB0dXBsZSA8PSBpbnNrZXkuc2NhbmtleXMuCisJ ICoKKwkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgX2J0X2JpbnNyY2ggcmV0dXJuZWQgYW4gb2Zm bnVtIHRoYXQgaXMgb3V0IG9mIGJvdW5kcworCSAqIGZvciB0aGUgcGFnZS4gIEZvciBleGFt cGxlLCB3aGVuIGluc2tleSBpcyBib3RoIDwgdGhlIGxlYWYgcGFnZSdzIGhpZ2gKKwkgKiBr ZXkgYW5kID4gYWxsIG9mIGl0cyBub24tcGl2b3QgdHVwbGVzLCBvZmZudW0gd2lsbCBiZSAi bWF4b2ZmICsgMSIuCisJICovCisJcmV0dXJuIF9idF9yZWFkZmlyc3RwYWdlX2JhdGNoKHNj YW4sICZwb3MsIG9mZm51bSwgZGlyKTsKK30KKworLyoKKyAqCV9idF9uZXh0X2JhdGNoKCkg LS0gR2V0IHRoZSBuZXh0IGJhdGNoIG9mIGl0ZW1zIGluIGEgc2Nhbi4KKyAqCisgKiBBIGJh dGNoIHZhcmlhbnQgb2YgX2J0X25leHQoKS4gTW9zdCBvZiB0aGUgY29tbWVudHMgZm9yIHRo YXQgZnVuY3Rpb24KKyAqIGFwcGx5IGhlcmUgdG9vLgorICoKKyAqIFdlIHNob3VsZCBvbmx5 IGdldCBoZXJlIG9ubHkgd2hlbiB0aGUgY3VycmVudCBiYXRjaCBoYXMgbm8gbW9yZSBpdGVt cworICogaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gV2UgZG9uJ3QgZ2V0IGhlcmUgd2l0aCBl bXB0eSBiYXRjaGVzLCB0aGF0J3MKKyAqIGhhbmRsZWQgYnkgX2J0X2Zpc3RfYmF0Y2goKS4K KyAqCisgKiBYWFggU2VlIGFsc28gdGhlIGNvbW1lbnRzIGF0IF9idF9maXJzdF9iYXRjaCgp IGFib3V0IHJldHVybmluZyBhIHNpbmdsZQorICogYmF0Y2ggZm9yIHRoZSBwYWdlLCBldGMu CisgKi8KK0luZGV4U2NhbkJhdGNoCitfYnRfbmV4dF9iYXRjaChJbmRleFNjYW5EZXNjIHNj YW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywgU2NhbkRpcmVjdGlvbiBkaXIpCit7CisJQlRTY2Fu T3BhcXVlIHNvIFBHX1VTRURfRk9SX0FTU0VSVFNfT05MWSA9IChCVFNjYW5PcGFxdWUpIHNj YW4tPm9wYXF1ZTsKKwkvLyBCVEJhdGNoU2NhblBvcyBwb3M7CisJQlRCYXRjaFNjYW5Qb3NE YXRhIHRtcDsKKwkvLyBJbmRleFNjYW5CYXRjaAliYXRjaDsKKwkvLyBpbnQgCQkJaWR4Owor CisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBw b3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsK KwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qCisJICog cmVzdG9yZSB0aGUgQlRTY2FuT3BhcXVlIGZyb20gdGhlIGN1cnJlbnQgYmF0Y2gKKwkgKgor CSAqIFhYWCBUaGlzIGlzIHByZXR0eSB1Z2x5L2V4cGVuc2l2ZS4gSWRlYWxseSB3ZSdkIGhh dmUgYWxsIHRoZSBmaWVsZHMKKwkgKiBuZWVkZWQgdG8gZGV0ZXJtaW5lICJsb2NhdGlvbiIg aW4gdGhlIGluZGV4IChlc3NlbnRpYWxseSBCVFNjYW5Qb3NEYXRhKQorCSAqIGluIHRoZSBi YXRjaCwgd2l0aG91dCBjbG9uaW5nIGFsbCB0aGUgb3RoZXIgc3R1ZmYuCisJICovCisJLy8g QXNzZXJ0KHNjYW4tPnhzX2JhdGNoZXMtPmN1cnJlbnRCYXRjaCAhPSBOVUxMKTsKKworCS8q CisJICogVXNlIHRoZSBsYXN0IGJhdGNoIGFzIHRoZSAiY3VycmVudCIgYmF0Y2guIFdlIHVz ZSB0aGUgc3RyZWFtUG9zIGlmCisJICogaW5pdGlhbGl6ZWQsIG9yIHRoZSByZWFkUG9zIGFz IGEgZmFsbGJhY2suIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkCisJICogc2ltcGx5IHVzZSB0 aGUgbGFzdCBiYXRjaCBpbiB0aGUgcXVldWUsIGkuZS4gKG5leHRCYXRjaCAtIDEpLgorCSAq CisJICogRXZlbiBiZXR0ZXIsIHdlIGNvdWxkIHBhc3MgdGhlICJjb3JyZWN0IiBiYXRjaCBm cm9tIGluZGV4YW0uYywgYW5kCisJICogbGV0IHRoYXQgZmlndXJlIG91dCB3aGljaCBwb3Np dGlvbiB0byBtb3ZlIGZyb20uCisJICovCisvKgorCWlkeCA9IHNjYW4tPnhzX2JhdGNoZXMt PnN0cmVhbVBvcy5iYXRjaDsKKwlpZiAoaWR4ID09IC0xKQorCQlpZHggPSBzY2FuLT54c19i YXRjaGVzLT5yZWFkUG9zLmJhdGNoOworCisJYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNj YW4sIGlkeCk7CisJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCXBvcyA9IChCVEJhdGNoU2Nh blBvcykgYmF0Y2gtPm9wYXF1ZTsKKyovCisKKwlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJc1Bp bm5lZCgqcG9zKSk7CisKKwltZW1jcHkoJnRtcCwgcG9zLCBzaXplb2YodG1wKSk7CisKKwkv KgorCSAqIEFkdmFuY2UgdG8gbmV4dCBwYWdlLCBsb2FkIHRoZSBkYXRhIGludG8gdGhlIGlu ZGV4IGJhdGNoLgorCSAqCisJICogRklYTUUgSXQgbWF5IG5vdCBiZSBxdWl0ZSBjb3JyZWN0 IHRvIGp1c3QgcGFzcyB0aGUgcG9zaXRpb24gZnJvbQorCSAqIGN1cnJlbnQgYmF0Y2gsIHNv bWUgb2YgdGhlIGZ1bmN0aW9ucyBzY3JpYmJsZSBvdmVyIGl0IChlLmcuCisJICogX2J0X3Jl YWRwYWdlX2JhdGNoKS4gTWF5YmUgd2Ugc2hvdWxkIGNyZWF0ZSBhIGNvcHksIG9yIHNvbWV0 aGluZz8KKwkgKgorCSAqIFhYWCBGb3Igbm93IHdlIHBhc3MgYSBsb2NhbCBjb3B5ICJ0bXAi LgorCSAqLworCXJldHVybiBfYnRfc3RlcHBhZ2VfYmF0Y2goc2NhbiwgJnRtcCwgZGlyKTsK K30KKworLyoKKyAqCV9idF9raWxsX2JhdGNoKCkgLS0gcmVtZW1iZXIgdGhlIGl0ZW1zLXRv LWJlLWtpbGxlZCBmcm9tIHRoZSBjdXJyZW50IGJhdGNoCisgKgorICogV2Ugc2ltcGx5IHRy YW5zbGF0ZSB0aGUgYml0bWFwIGludG8gdGhlICJyZWd1bGFyIiBraWxsZWRJdGVtcyBhcnJh eSwgYW5kIGxldAorICogdGhhdCB0byBkcml2ZSB3aGljaCBpdGVtcyBhcmUga2lsbGVkLgor ICovCit2b2lkCitfYnRfa2lsbF9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoIGJhdGNoKQoreworCUJUU2Nhbk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRT X09OTFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwkvKiBiYXRjaGluZyBk b2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFz c2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2Fu UG9zSXNWYWxpZChzby0+bWFya1BvcykpOworCisJLyogd2Ugc2hvdWxkIG9ubHkgZ2V0IGhl cmUgZm9yIHNjYW5zIHdpdGggYmF0Y2hpbmcgKi8KKwlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2hl cyk7CisKKwkvKiBiYWlsIG91dCBpZiB0aGUgYmF0Y2ggaGFzIG5vIGtpbGxlZCBpdGVtcyAq LworCWlmIChiYXRjaC0+bnVtS2lsbGVkID09IDApCisJCXJldHVybjsKKworCS8qCisJICog WFhYIE5vdyB3aGF0PyB3ZSBkb24ndCBoYXZlIHRoZSBjdXJyUG9zIGFyb3VuZCBhbnltb3Jl LCBzbyB3ZSBzaG91bGQKKwkgKiBsb2FkIHRoYXQsIGFuZCBhcHBseSB0aGUga2lsbGVkIGl0 ZW1zIHRvIHRoYXQsIHNvbWVob3c/CisJICovCisJLyogRklYTUU6IF9idF9raWxsX2JhdGNo IG5vdCBpbXBsZW1lbnRlZCAqLworCisJLyoKKwkgKiBYWFggbWF5YmUgd2Ugc2hvdWxkIGhh dmUgYSBzZXBhcmF0ZSBjYWxsYmFjayBmb3IgdGhpcywgYW5kIGNhbGwgaXQgZnJvbQorCSAq IHRoZSBpbmRleGFtLmMgZGlyZWN0bHkgd2hlbmV2ZXIgd2UgdGhpbmsgaXQncyBhcHByb3By aWF0ZT8gQW5kIG5vdCBvbmx5CisJICogZnJvbSBoZXJlIHdoZW4gZnJlZWluZyB0aGUgYmF0 Y2g/CisJICovCisJX2J0X2tpbGxpdGVtc19iYXRjaChzY2FuLCBiYXRjaCk7Cit9CisKKy8q CisgKglfYnRfcmVhZHBhZ2UoKSAtLSBMb2FkIGRhdGEgZnJvbSBjdXJyZW50IGluZGV4IHBh Z2UgaW50byBzby0+Y3VyclBvcworICoKKyAqIENhbGxlciBtdXN0IGhhdmUgcGlubmVkIGFu ZCByZWFkLWxvY2tlZCBzby0+Y3VyclBvcy5idWY7IHRoZSBidWZmZXIncyBzdGF0ZQorICog aXMgbm90IGNoYW5nZWQgaGVyZS4gIEFsc28sIGN1cnJQb3MubW9yZUxlZnQgYW5kIG1vcmVS aWdodCBtdXN0IGJlIHZhbGlkOworICogdGhleSBhcmUgdXBkYXRlZCBhcyBhcHByb3ByaWF0 ZS4gIEFsbCBvdGhlciBmaWVsZHMgb2Ygc28tPmN1cnJQb3MgYXJlCisgKiBpbml0aWFsaXpl ZCBmcm9tIHNjcmF0Y2ggaGVyZS4KKyAqCisgKiBXZSBzY2FuIHRoZSBjdXJyZW50IHBhZ2Ug c3RhcnRpbmcgYXQgb2ZmbnVtIGFuZCBtb3ZpbmcgaW4gdGhlIGluZGljYXRlZAorICogZGly ZWN0aW9uLiAgQWxsIGl0ZW1zIG1hdGNoaW5nIHRoZSBzY2FuIGtleXMgYXJlIGxvYWRlZCBp bnRvIGN1cnJQb3MuaXRlbXMuCisgKiBtb3JlTGVmdCBvciBtb3JlUmlnaHQgKGFzIGFwcHJv cHJpYXRlKSBpcyBjbGVhcmVkIGlmIF9idF9jaGVja2tleXMgcmVwb3J0cworICogdGhhdCB0 aGVyZSBjYW4gYmUgbm8gbW9yZSBtYXRjaGluZyB0dXBsZXMgaW4gdGhlIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24KKyAqIChjb3VsZCBqdXN0IGJlIGZvciB0aGUgY3VycmVudCBwcmltaXRp dmUgaW5kZXggc2NhbiB3aGVuIHNjYW4gaGFzIGFycmF5cykuCisgKgorICogSW4gdGhlIGNh c2Ugb2YgYSBwYXJhbGxlbCBzY2FuLCBjYWxsZXIgbXVzdCBoYXZlIGNhbGxlZCBfYnRfcGFy YWxsZWxfc2VpemUKKyAqIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjsgdGhpcyBm dW5jdGlvbiB3aWxsIGludm9rZQorICogX2J0X3BhcmFsbGVsX3JlbGVhc2UgYmVmb3JlIHJl dHVybmluZy4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYW55IG1hdGNoaW5nIGl0ZW1zIGZv dW5kIG9uIHRoZSBwYWdlLCBmYWxzZSBpZiBub25lLgorICovCitzdGF0aWMgYm9vbAorX2J0 X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNl dE51bWJlciBvZmZudW0sCisJCQkgYm9vbCBmaXJzdHBhZ2UpCit7CisJUmVsYXRpb24JcmVs ID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3Bh cXVlKSBzY2FuLT5vcGFxdWU7CisJUGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVl OworCU9mZnNldE51bWJlciBtaW5vZmY7CisJT2Zmc2V0TnVtYmVyIG1heG9mZjsKKwlCVFJl YWRQYWdlU3RhdGUgcHN0YXRlOworCWJvb2wJCWFycmF5S2V5czsKKwlpbnQJCQlpdGVtSW5k ZXgsCisJCQkJaW5kbmF0dHM7CisKKwkvKiBzYXZlIHRoZSBwYWdlL2J1ZmZlciBibG9jayBu dW1iZXIsIGFsb25nIHdpdGggaXRzIHNpYmxpbmcgbGlua3MgKi8KKwlwYWdlID0gQnVmZmVy R2V0UGFnZShzby0+Y3VyclBvcy5idWYpOworCW9wYXF1ZSA9IEJUUGFnZUdldE9wYXF1ZShw YWdlKTsKKwlzby0+Y3VyclBvcy5jdXJyUGFnZSA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKHNv LT5jdXJyUG9zLmJ1Zik7CisJc28tPmN1cnJQb3MucHJldlBhZ2UgPSBvcGFxdWUtPmJ0cG9f cHJldjsKKwlzby0+Y3VyclBvcy5uZXh0UGFnZSA9IG9wYXF1ZS0+YnRwb19uZXh0OworCisJ QXNzZXJ0KCFQX0lHTk9SRShvcGFxdWUpKTsKKwlBc3NlcnQoQlRTY2FuUG9zSXNQaW5uZWQo c28tPmN1cnJQb3MpKTsKKwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJaWYgKHNj YW4tPnBhcmFsbGVsX3NjYW4pCisJeworCQkvKiBhbGxvdyBuZXh0L3ByZXYgcGFnZSB0byBi ZSByZWFkIGJ5IG90aGVyIHdvcmtlciB3aXRob3V0IGRlbGF5ICovCisJCWlmIChTY2FuRGly ZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBz by0+Y3VyclBvcy5uZXh0UGFnZSwKKwkJCQkJCQkJIHNvLT5jdXJyUG9zLmN1cnJQYWdlKTsK KwkJZWxzZQorCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2Nhbiwgc28tPmN1cnJQb3MucHJl dlBhZ2UsCisJCQkJCQkJCSBzby0+Y3VyclBvcy5jdXJyUGFnZSk7CisJfQorCisJLyogaW5p dGlhbGl6ZSByZW1haW5pbmcgY3VyclBvcyBmaWVsZHMgcmVsYXRlZCB0byBjdXJyZW50IHBh Z2UgKi8KKwlzby0+Y3VyclBvcy5sc24gPSBCdWZmZXJHZXRMU05BdG9taWMoc28tPmN1cnJQ b3MuYnVmKTsKKwlzby0+Y3VyclBvcy5kaXIgPSBkaXI7CisJc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0ID0gMDsKKwkvKiBlaXRoZXIgbW9yZUxlZnQgb3IgbW9yZVJpZ2h0IHNob3Vs ZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIpICovCisJQXNzZXJ0KFNjYW5EaXJl Y3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHNvLT5jdXJyUG9zLm1vcmVSaWdodCA6CisJCSAgIHNv LT5jdXJyUG9zLm1vcmVMZWZ0KTsKKworCVByZWRpY2F0ZUxvY2tQYWdlKHJlbCwgc28tPmN1 cnJQb3MuY3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90KTsKKworCS8qIGluaXRpYWxpemUg bG9jYWwgdmFyaWFibGVzICovCisJaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVy T2ZBdHRyaWJ1dGVzKHJlbCk7CisJYXJyYXlLZXlzID0gc28tPm51bUFycmF5S2V5cyAhPSAw OworCW1pbm9mZiA9IFBfRklSU1REQVRBS0VZKG9wYXF1ZSk7CisJbWF4b2ZmID0gUGFnZUdl dE1heE9mZnNldE51bWJlcihwYWdlKTsKKworCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBz dGF0ZSB0aGF0IHdlJ2xsIHBhc3MgdG8gX2J0X2NoZWNra2V5cyAqLworCXBzdGF0ZS5taW5v ZmYgPSBtaW5vZmY7CisJcHN0YXRlLm1heG9mZiA9IG1heG9mZjsKKwlwc3RhdGUuZmluYWx0 dXAgPSBOVUxMOworCXBzdGF0ZS5wYWdlID0gcGFnZTsKKwlwc3RhdGUuZmlyc3RwYWdlID0g Zmlyc3RwYWdlOworCXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJcHN0YXRl LnN0YXJ0aWtleSA9IDA7CisJcHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7 CisJcHN0YXRlLnNraXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCXBzdGF0ZS5jb250aW51 ZXNjYW4gPSB0cnVlOyAvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KKwlwc3RhdGUucmVjaGVj a3MgPSAwOworCXBzdGF0ZS50YXJnZXRkaXN0YW5jZSA9IDA7CisJcHN0YXRlLm5za2lwYWR2 YW5jZXMgPSAwOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwl7CisJ CS8qIFNLX1NFQVJDSEFSUkFZIGZvcndhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGhpZ2gga2V5 IHVwIGZyb250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmICghUF9SSUdIVE1P U1Qob3BhcXVlKSkKKwkJCXsKKwkJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFn ZSwgUF9ISUtFWSk7CisKKwkJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFn ZUdldEl0ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChzby0+c2NhbkJlaGluZCAmJgorCQkJ CQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZpbmFsdHVw KSkKKwkJCQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNj YW4gYWZ0ZXIgYWxsICovCisJCQkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZhbHNlOwor CQkJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwkJCQkJaWYgKHNjYW4tPnBhcmFsbGVs X3NjYW4pCisJCQkJCQlfYnRfcGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUoc2NhbiwKKwkJ CQkJCQkJCQkJCQkgICBzby0+Y3VyclBvcy5jdXJyUGFnZSk7CisJCQkJCXJldHVybiBmYWxz ZTsKKwkJCQl9CisJCQl9CisKKwkJCXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGly Q2hlY2sgPSBmYWxzZTsJLyogcmVzZXQgKi8KKwkJfQorCisJCS8qCisJCSAqIENvbnNpZGVy IHBzdGF0ZS5zdGFydGlrZXkgb3B0aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0 aXZlCisJCSAqIGluZGV4IHNjYW4gaGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFn ZQorCQkgKi8KKwkJaWYgKCFwc3RhdGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikK KwkJCV9idF9zZXRfc3RhcnRpa2V5KHNjYW4sICZwc3RhdGUpOworCisJCS8qIGxvYWQgaXRl bXNbXSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KKwkJaXRlbUluZGV4ID0gMDsKKworCQlvZmZu dW0gPSBNYXgob2ZmbnVtLCBtaW5vZmYpOworCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2Zm KQorCQl7CisJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsK KwkJCUluZGV4VHVwbGUJaXR1cDsKKwkJCWJvb2wJCXBhc3Nlc19xdWFsczsKKworCQkJLyoK KwkJCSAqIElmIHRoZSBzY2FuIHNwZWNpZmllcyBub3QgdG8gcmV0dXJuIGtpbGxlZCB0dXBs ZXMsIHRoZW4gd2UKKwkJCSAqIHRyZWF0IGEga2lsbGVkIHR1cGxlIGFzIG5vdCBwYXNzaW5n IHRoZSBxdWFsCisJCQkgKi8KKwkJCWlmIChzY2FuLT5pZ25vcmVfa2lsbGVkX3R1cGxlcyAm JiBJdGVtSWRJc0RlYWQoaWlkKSkKKwkJCXsKKwkJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJO ZXh0KG9mZm51bSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWl0dXAgPSAoSW5kZXhU dXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJCUFzc2VydCghQlRyZWVUdXBsZUlz UGl2b3QoaXR1cCkpOworCisJCQlwc3RhdGUub2ZmbnVtID0gb2ZmbnVtOworCQkJcGFzc2Vz X3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBhcnJheUtleXMsCisJCQkJ CQkJCQkJIGl0dXAsIGluZG5hdHRzKTsKKworCQkJLyoKKwkJCSAqIENoZWNrIGlmIHdlIG5l ZWQgdG8gc2tpcCBhaGVhZCB0byBhIGxhdGVyIHR1cGxlIChvbmx5IHBvc3NpYmxlCisJCQkg KiB3aGVuIHRoZSBzY2FuIHVzZXMgYXJyYXkga2V5cykKKwkJCSAqLworCQkJaWYgKGFycmF5 S2V5cyAmJiBPZmZzZXROdW1iZXJJc1ZhbGlkKHBzdGF0ZS5za2lwKSkKKwkJCXsKKwkJCQlB c3NlcnQoIXBhc3Nlc19xdWFscyAmJiBwc3RhdGUuY29udGludWVzY2FuKTsKKwkJCQlBc3Nl cnQob2ZmbnVtIDwgcHN0YXRlLnNraXApOworCQkJCUFzc2VydCghcHN0YXRlLmZvcmNlbm9u cmVxdWlyZWQpOworCisJCQkJb2ZmbnVtID0gcHN0YXRlLnNraXA7CisJCQkJcHN0YXRlLnNr aXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlp ZiAocGFzc2VzX3F1YWxzKQorCQkJeworCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBr ZXkgY29uZGl0aW9ucyAqLworCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhpdHVwKSkK KwkJCQl7CisJCQkJCS8qIFJlbWVtYmVyIGl0ICovCisJCQkJCV9idF9zYXZlaXRlbShzbywg aXRlbUluZGV4LCBvZmZudW0sIGl0dXApOworCQkJCQlpdGVtSW5kZXgrKzsKKwkJCQl9CisJ CQkJZWxzZQorCQkJCXsKKwkJCQkJaW50CQkJdHVwbGVPZmZzZXQ7CisKKwkJCQkJLyoKKwkJ CQkJICogU2V0IHVwIHN0YXRlIHRvIHJldHVybiBwb3N0aW5nIGxpc3QsIGFuZCByZW1lbWJl ciBmaXJzdAorCQkJCQkgKiBUSUQKKwkJCQkJICovCisJCQkJCXR1cGxlT2Zmc2V0ID0KKwkJ CQkJCV9idF9zZXR1cHBvc3RpbmdpdGVtcyhzbywgaXRlbUluZGV4LCBvZmZudW0sCisJCQkJ CQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIDApLAorCQkJCQkJCQkJCQkg IGl0dXApOworCQkJCQlpdGVtSW5kZXgrKzsKKwkJCQkJLyogUmVtZW1iZXIgYWRkaXRpb25h bCBUSURzICovCisJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgQlRyZWVUdXBsZUdldE5Qb3N0 aW5nKGl0dXApOyBpKyspCisJCQkJCXsKKwkJCQkJCV9idF9zYXZlcG9zdGluZ2l0ZW0oc28s IGl0ZW1JbmRleCwgb2ZmbnVtLAorCQkJCQkJCQkJCQlCVHJlZVR1cGxlR2V0UG9zdGluZ04o aXR1cCwgaSksCisJCQkJCQkJCQkJCXR1cGxlT2Zmc2V0KTsKKwkJCQkJCWl0ZW1JbmRleCsr OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyogV2hlbiAhY29udGludWVzY2FuLCB0aGVy ZSBjYW4ndCBiZSBhbnkgbW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCisJCQlpZiAoIXBzdGF0 ZS5jb250aW51ZXNjYW4pCisJCQkJYnJlYWs7CisKKwkJCW9mZm51bSA9IE9mZnNldE51bWJl ck5leHQob2ZmbnVtKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGRvbid0IG5lZWQgdG8gdmlz aXQgcGFnZSB0byB0aGUgcmlnaHQgd2hlbiB0aGUgaGlnaCBrZXkKKwkJICogaW5kaWNhdGVz IHRoYXQgbm8gbW9yZSBtYXRjaGVzIHdpbGwgYmUgZm91bmQgdGhlcmUuCisJCSAqCisJCSAq IENoZWNraW5nIHRoZSBoaWdoIGtleSBsaWtlIHRoaXMgd29ya3Mgb3V0IG1vcmUgb2Z0ZW4g dGhhbiB5b3UgbWlnaHQKKwkJICogdGhpbmsuICBMZWFmIHBhZ2Ugc3BsaXRzIHBpY2sgYSBz cGxpdCBwb2ludCBiZXR3ZWVuIHRoZSB0d28gbW9zdAorCQkgKiBkaXNzaW1pbGFyIHR1cGxl cyAodGhpcyBpcyB3ZWlnaGVkIGFnYWluc3QgdGhlIG5lZWQgdG8gZXZlbmx5IHNoYXJlCisJ CSAqIGZyZWUgc3BhY2UpLiAgTGVhZiBwYWdlcyB3aXRoIGhpZ2gga2V5IGF0dHJpYnV0ZSB2 YWx1ZXMgdGhhdCBjYW4KKwkJICogb25seSBhcHBlYXIgb24gbm9uLXBpdm90IHR1cGxlcyBv biB0aGUgcmlnaHQgc2libGluZyBwYWdlIGFyZQorCQkgKiBjb21tb24uCisJCSAqLworCQlp ZiAocHN0YXRlLmNvbnRpbnVlc2NhbiAmJiAhc28tPnNjYW5CZWhpbmQgJiYgIVBfUklHSFRN T1NUKG9wYXF1ZSkpCisJCXsKKwkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdl LCBQX0hJS0VZKTsKKwkJCUluZGV4VHVwbGUJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0 SXRlbShwYWdlLCBpaWQpOworCQkJaW50CQkJdHJ1bmNhdHQ7CisKKwkJCXRydW5jYXR0ID0g QlRyZWVUdXBsZUdldE5BdHRzKGl0dXAsIHJlbCk7CisJCQlwc3RhdGUuZm9yY2Vub25yZXF1 aXJlZCA9IGZhbHNlOworCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7CS8qIF9idF9zZXRfc3Rh cnRpa2V5IGlnbm9yZXMgUF9ISUtFWSAqLworCQkJX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0 YXRlLCBhcnJheUtleXMsIGl0dXAsIHRydW5jYXR0KTsKKwkJfQorCisJCWlmICghcHN0YXRl LmNvbnRpbnVlc2NhbikKKwkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZhbHNlOworCisJ CUFzc2VydChpdGVtSW5kZXggPD0gTWF4VElEc1BlckJUcmVlUGFnZSk7CisJCXNvLT5jdXJy UG9zLmZpcnN0SXRlbSA9IDA7CisJCXNvLT5jdXJyUG9zLmxhc3RJdGVtID0gaXRlbUluZGV4 IC0gMTsKKwkJc28tPmN1cnJQb3MuaXRlbUluZGV4ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJ LyogU0tfU0VBUkNIQVJSQVkgYmFja3dhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGZpbmFsIHR1 cGxlIHVwIGZyb250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmIChtaW5vZmYg PD0gbWF4b2ZmICYmICFQX0xFRlRNT1NUKG9wYXF1ZSkpCisJCQl7CisJCQkJSXRlbUlkCQlp aWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIG1pbm9mZik7CisKKwkJCQlwc3RhdGUuZmluYWx0 dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChz by0+c2NhbkJlaGluZCAmJgorCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4s IGRpciwgcHN0YXRlLmZpbmFsdHVwKSkKKwkJCQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3Ro ZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0ZXIgYWxsICovCisJCQkJCXNvLT5jdXJyUG9z Lm1vcmVMZWZ0ID0gZmFsc2U7CisJCQkJCXNvLT5uZWVkUHJpbVNjYW4gPSB0cnVlOworCQkJ CQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwkJCQkJCV9idF9wYXJhbGxlbF9wcmltc2Nh bl9zY2hlZHVsZShzY2FuLAorCQkJCQkJCQkJCQkJCSAgIHNvLT5jdXJyUG9zLmN1cnJQYWdl KTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJc28tPnNjYW5CZWhp bmQgPSBzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOwkvKiByZXNldCAqLworCQl9CisK KwkJLyoKKwkJICogQ29uc2lkZXIgcHN0YXRlLnN0YXJ0aWtleSBvcHRpbWl6YXRpb24gb25j ZSB0aGUgb25nb2luZyBwcmltaXRpdmUKKwkJICogaW5kZXggc2NhbiBoYXMgYWxyZWFkeSBy ZWFkIGF0IGxlYXN0IG9uZSBwYWdlCisJCSAqLworCQlpZiAoIXBzdGF0ZS5maXJzdHBhZ2Ug JiYgbWlub2ZmIDwgbWF4b2ZmKQorCQkJX2J0X3NldF9zdGFydGlrZXkoc2NhbiwgJnBzdGF0 ZSk7CisKKwkJLyogbG9hZCBpdGVtc1tdIGluIGRlc2NlbmRpbmcgb3JkZXIgKi8KKwkJaXRl bUluZGV4ID0gTWF4VElEc1BlckJUcmVlUGFnZTsKKworCQlvZmZudW0gPSBNaW4ob2ZmbnVt LCBtYXhvZmYpOworCisJCXdoaWxlIChvZmZudW0gPj0gbWlub2ZmKQorCQl7CisJCQlJdGVt SWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsKKwkJCUluZGV4VHVwbGUJ aXR1cDsKKwkJCWJvb2wJCXR1cGxlX2FsaXZlOworCQkJYm9vbAkJcGFzc2VzX3F1YWxzOwor CisJCQkvKgorCQkJICogSWYgdGhlIHNjYW4gc3BlY2lmaWVzIG5vdCB0byByZXR1cm4ga2ls bGVkIHR1cGxlcywgdGhlbiB3ZQorCQkJICogdHJlYXQgYSBraWxsZWQgdHVwbGUgYXMgbm90 IHBhc3NpbmcgdGhlIHF1YWwuICBNb3N0IG9mIHRoZQorCQkJICogdGltZSwgaXQncyBhIHdp biB0byBub3QgYm90aGVyIGV4YW1pbmluZyB0aGUgdHVwbGUncyBpbmRleAorCQkJICoga2V5 cywgYnV0IGp1c3Qgc2tpcCB0byB0aGUgbmV4dCB0dXBsZSAocHJldmlvdXMsIGFjdHVhbGx5 LAorCQkJICogc2luY2Ugd2UncmUgc2Nhbm5pbmcgYmFja3dhcmRzKS4gIEhvd2V2ZXIsIGlm IHRoaXMgaXMgdGhlIGZpcnN0CisJCQkgKiB0dXBsZSBvbiB0aGUgcGFnZSwgd2UgZG8gY2hl Y2sgdGhlIGluZGV4IGtleXMsIHRvIHByZXZlbnQKKwkJCSAqIHVzZWxlc3NseSBhZHZhbmNp bmcgdG8gdGhlIHBhZ2UgdG8gdGhlIGxlZnQuICBUaGlzIGlzIHNpbWlsYXIKKwkJCSAqIHRv IHRoZSBoaWdoIGtleSBvcHRpbWl6YXRpb24gdXNlZCBieSBmb3J3YXJkIHNjYW5zLgorCQkJ ICovCisJCQlpZiAoc2Nhbi0+aWdub3JlX2tpbGxlZF90dXBsZXMgJiYgSXRlbUlkSXNEZWFk KGlpZCkpCisJCQl7CisJCQkJaWYgKG9mZm51bSA+IG1pbm9mZikKKwkJCQl7CisJCQkJCW9m Zm51bSA9IE9mZnNldE51bWJlclByZXYob2ZmbnVtKTsKKwkJCQkJY29udGludWU7CisJCQkJ fQorCisJCQkJdHVwbGVfYWxpdmUgPSBmYWxzZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0dXBs ZV9hbGl2ZSA9IHRydWU7CisKKwkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0o cGFnZSwgaWlkKTsKKwkJCUFzc2VydCghQlRyZWVUdXBsZUlzUGl2b3QoaXR1cCkpOworCisJ CQlwc3RhdGUub2ZmbnVtID0gb2ZmbnVtOworCQkJaWYgKGFycmF5S2V5cyAmJiBvZmZudW0g PT0gbWlub2ZmICYmIHBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkKQorCQkJeworCQkJCXBzdGF0 ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7 CisJCQl9CisJCQlwYXNzZXNfcXVhbHMgPSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUs IGFycmF5S2V5cywKKwkJCQkJCQkJCQkgaXR1cCwgaW5kbmF0dHMpOworCisJCQlpZiAoYXJy YXlLZXlzICYmIHNvLT5zY2FuQmVoaW5kKQorCQkJeworCQkJCS8qCisJCQkJICogRG9uZSBz Y2FubmluZyB0aGlzIHBhZ2UsIGJ1dCBub3QgZG9uZSB3aXRoIHRoZSBjdXJyZW50CisJCQkJ ICogcHJpbXNjYW4uCisJCQkJICoKKwkJCQkgKiBOb3RlOiBGb3J3YXJkIHNjYW5zIGRvbid0 IGNoZWNrIHRoaXMgZXhwbGljaXRseSwgc2luY2UgdGhleQorCQkJCSAqIHByZWZlciB0byBy ZXVzZSBwc3RhdGUuc2tpcCBmb3IgdGhpcyBpbnN0ZWFkLgorCQkJCSAqLworCQkJCUFzc2Vy dCghcGFzc2VzX3F1YWxzICYmIHBzdGF0ZS5jb250aW51ZXNjYW4pOworCQkJCUFzc2VydCgh cHN0YXRlLmZvcmNlbm9ucmVxdWlyZWQpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8q CisJCQkgKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNraXAgYWhlYWQgdG8gYSBsYXRlciB0dXBs ZSAob25seSBwb3NzaWJsZQorCQkJICogd2hlbiB0aGUgc2NhbiB1c2VzIGFycmF5IGtleXMp CisJCQkgKi8KKwkJCWlmIChhcnJheUtleXMgJiYgT2Zmc2V0TnVtYmVySXNWYWxpZChwc3Rh dGUuc2tpcCkpCisJCQl7CisJCQkJQXNzZXJ0KCFwYXNzZXNfcXVhbHMgJiYgcHN0YXRlLmNv bnRpbnVlc2Nhbik7CisJCQkJQXNzZXJ0KG9mZm51bSA+IHBzdGF0ZS5za2lwKTsKKwkJCQlB c3NlcnQoIXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkKTsKKworCQkJCW9mZm51bSA9IHBzdGF0 ZS5za2lwOworCQkJCXBzdGF0ZS5za2lwID0gSW52YWxpZE9mZnNldE51bWJlcjsKKwkJCQlj b250aW51ZTsKKwkJCX0KKworCQkJaWYgKHBhc3Nlc19xdWFscyAmJiB0dXBsZV9hbGl2ZSkK KwkJCXsKKwkJCQkvKiB0dXBsZSBwYXNzZXMgYWxsIHNjYW4ga2V5IGNvbmRpdGlvbnMgKi8K KwkJCQlpZiAoIUJUcmVlVHVwbGVJc1Bvc3RpbmcoaXR1cCkpCisJCQkJeworCQkJCQkvKiBS ZW1lbWJlciBpdCAqLworCQkJCQlpdGVtSW5kZXgtLTsKKwkJCQkJX2J0X3NhdmVpdGVtKHNv LCBpdGVtSW5kZXgsIG9mZm51bSwgaXR1cCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJ CQkJCWludAkJCXR1cGxlT2Zmc2V0OworCisJCQkJCS8qCisJCQkJCSAqIFNldCB1cCBzdGF0 ZSB0byByZXR1cm4gcG9zdGluZyBsaXN0LCBhbmQgcmVtZW1iZXIgZmlyc3QKKwkJCQkJICog VElELgorCQkJCQkgKgorCQkJCQkgKiBOb3RlIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IHNhdmUv cmV0dXJuIGl0ZW1zIGZyb20KKwkJCQkJICogcG9zdGluZyBsaXN0cyBpbiBhc2NlbmRpbmcg aGVhcCBUSUQgb3JkZXIgZm9yIGJhY2t3YXJkcworCQkJCQkgKiBzY2Fucy4gIFRoaXMgYWxs b3dzIF9idF9raWxsaXRlbXMoKSB0byBtYWtlIGEKKwkJCQkJICogY29uc2lzdGVudCBhc3N1 bXB0aW9uIGFib3V0IHRoZSBvcmRlciBvZiBpdGVtcworCQkJCQkgKiBhc3NvY2lhdGVkIHdp dGggdGhlIHNhbWUgcG9zdGluZyBsaXN0IHR1cGxlLgorCQkJCQkgKi8KKwkJCQkJaXRlbUlu ZGV4LS07CisJCQkJCXR1cGxlT2Zmc2V0ID0KKwkJCQkJCV9idF9zZXR1cHBvc3RpbmdpdGVt cyhzbywgaXRlbUluZGV4LCBvZmZudW0sCisJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBv c3RpbmdOKGl0dXAsIDApLAorCQkJCQkJCQkJCQkgIGl0dXApOworCQkJCQkvKiBSZW1lbWJl ciBhZGRpdGlvbmFsIFRJRHMgKi8KKwkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBCVHJlZVR1 cGxlR2V0TlBvc3RpbmcoaXR1cCk7IGkrKykKKwkJCQkJeworCQkJCQkJaXRlbUluZGV4LS07 CisJCQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKKwkJ CQkJCQkJCQkJQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAorCQkJCQkJCQkJCQl0 dXBsZU9mZnNldCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKiBXaGVuICFjb250aW51 ZXNjYW4sIHRoZXJlIGNhbid0IGJlIGFueSBtb3JlIG1hdGNoZXMsIHNvIHN0b3AgKi8KKwkJ CWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKKwkJCQlicmVhazsKKworCQkJb2ZmbnVtID0g T2Zmc2V0TnVtYmVyUHJldihvZmZudW0pOworCQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3Qg bmVlZCB0byB2aXNpdCBwYWdlIHRvIHRoZSBsZWZ0IHdoZW4gbm8gbW9yZSBtYXRjaGVzIHdp bGwKKwkJICogYmUgZm91bmQgdGhlcmUKKwkJICovCisJCWlmICghcHN0YXRlLmNvbnRpbnVl c2NhbikKKwkJCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gZmFsc2U7CisKKwkJQXNzZXJ0KGl0 ZW1JbmRleCA+PSAwKTsKKwkJc28tPmN1cnJQb3MuZmlyc3RJdGVtID0gaXRlbUluZGV4Owor CQlzby0+Y3VyclBvcy5sYXN0SXRlbSA9IE1heFRJRHNQZXJCVHJlZVBhZ2UgLSAxOworCQlz by0+Y3VyclBvcy5pdGVtSW5kZXggPSBNYXhUSURzUGVyQlRyZWVQYWdlIC0gMTsKKwl9CisK KwkvKgorCSAqIElmIF9idF9zZXRfc3RhcnRpa2V5IHRvbGQgdXMgdG8gdGVtcG9yYXJpbHkg dHJlYXQgdGhlIHNjYW4ncyBrZXlzIGFzCisJICogbm9ucmVxdWlyZWQgKHBvc3NpYmxlIG9u bHkgZHVyaW5nIHNjYW5zIHdpdGggYXJyYXkga2V5cyksIHRoZXJlIG11c3QgYmUKKwkgKiBu byBsYXN0aW5nIGNvbnNlcXVlbmNlcyBmb3IgdGhlIHNjYW4ncyBhcnJheSBrZXlzLiAgVGhl IHNjYW4ncyBhcnJheXMKKwkgKiBzaG91bGQgbm93IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBl bGVtZW50cyBhcyB0aGV5IHdvdWxkIGhhdmUgaGFkIGlmIHRoZQorCSAqIG5vbnJlcXVpcmVk IGJlaGF2aW9yIGhhZCBuZXZlciBiZWVuIHVzZWQuICAoSW4gZ2VuZXJhbCwgYSBzY2FuJ3Mg YXJyYXlzCisJICogYXJlIGV4cGVjdGVkIHRvIHRyYWNrIGl0cyBwcm9ncmVzcyB0aHJvdWdo IHRoZSBpbmRleCdzIGtleSBzcGFjZS4pCisJICoKKwkgKiBXZSBhcmUgcmVxdWlyZWQgKGJ5 IF9idF9zZXRfc3RhcnRpa2V5KSB0byBjYWxsIF9idF9jaGVja2tleXMgYWdhaW5zdAorCSAq IHBzdGF0ZS5maW5hbHR1cCB3aXRoIHBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkPWZhbHNlIHRv IGFsbG93IHRoZSBzY2FuJ3MKKwkgKiBhcnJheXMgdG8gcmVjb3Zlci4gIEFzc2VydCB0aGF0 IHRoYXQgc3RlcCBoYXNuJ3QgYmVlbiBtaXNzZWQuCisJICovCisJQXNzZXJ0KCFwc3RhdGUu Zm9yY2Vub25yZXF1aXJlZCk7CisKKwlyZXR1cm4gKHNvLT5jdXJyUG9zLmZpcnN0SXRlbSA8 PSBzby0+Y3VyclBvcy5sYXN0SXRlbSk7Cit9CisKK3N0YXRpYyBJbmRleFNjYW5CYXRjaAor X2J0X3JlYWRwYWdlX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3Mg cG9zLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkgICBi b29sIGZpcnN0cGFnZSkKK3sKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9u OworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlQ YWdlCQlwYWdlOworCUJUUGFnZU9wYXF1ZSBvcGFxdWU7CisJT2Zmc2V0TnVtYmVyIG1pbm9m ZjsKKwlPZmZzZXROdW1iZXIgbWF4b2ZmOworCUJUUmVhZFBhZ2VTdGF0ZSBwc3RhdGU7CisJ Ym9vbAkJYXJyYXlLZXlzOworCWludAkJCWl0ZW1JbmRleCwKKwkJCQlpbmRuYXR0czsKKwor CS8qIHJlc3VsdCAqLworCS8qIEluZGV4U2NhbkJhdGNoIGJhdGNoID0gZGRkOyAqLworCUlu ZGV4U2NhbkJhdGNoIGJhdGNoOworCisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRo IHJlZ3VsYXIgc2Nhbi1sZXZlbCBwb3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lz VmFsaWQoc28tPmN1cnJQb3MpKTsKKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1h cmtQb3MpKTsKKworCS8qCisJICogRklYTUUgZmFrZSBmb3IgX2J0X2NoZWNra2V5cywgbmVl ZHMgdG8gYmUgc2V0IHByb3Blcmx5IGVsc2V3aGVyZSAobm90CisJICogc3VyZSB3aGVyZSkK KwkgKi8KKworCS8qCisJICogWFhYIHdlIHNob3VsZG4ndCBiZSBwYXNzaW5nIHRoaXMgaW5m byB0aHJvdWdoIGN1cnJQb3MgYnV0IGRpcmVjdGx5LCBJCisJICogZ3Vlc3MuCisJICovCisJ c28tPmN1cnJQb3MuZGlyID0gZGlyOworCisJLyoKKwkgKiBYWFggV2UgY2FuIHBhc3MgdGhl IGV4YWN0IG51bWJlciBpZiBpdGVtcyBmcm9tIHRoaXMgcGFnZSwgYnkgdXNpbmcKKwkgKiBt YXhvZmYKKwkgKi8KKwliYXRjaCA9IGluZGV4X2JhdGNoX2FsbG9jKE1heFRJRHNQZXJCVHJl ZVBhZ2UsIHNjYW4tPnhzX3dhbnRfaXR1cCk7CisKKwkvKiBGSVhNRSBidXQgd2UgZG9uJ3Qg Y29weSB0aGUgY29udGVudHMgdW50aWwgdGhlIGVuZCAqLworCWJhdGNoLT5vcGFxdWUgPSBw YWxsb2MwKHNpemVvZihCVEJhdGNoU2NhblBvc0RhdGEpKTsKKworCS8qIGJvZ3VzIHZhbHVl cyAqLworCWJhdGNoLT5maXJzdEl0ZW0gPSAtMTsKKwliYXRjaC0+bGFzdEl0ZW0gPSAtMTsK KwliYXRjaC0+aXRlbUluZGV4ID0gLTE7CisKKwkvKiBpZiAoc28tPmN1cnJUdXBsZXMpICov CisJLyogeyAqLworCS8qIGJhdGNoLT5jdXJyVHVwbGVzID0gKGNoYXIgKikgcGFsbG9jKEJM Q0tTWik7ICovCisJLyogbWVtY3B5KGJhdGNoLT5jdXJyVHVwbGVzLCBzby0+Y3VyclR1cGxl cywgQkxDS1NaKTsgKi8KKwkvKiB9ICovCisKKwkvKiBzYXZlIHRoZSBwYWdlL2J1ZmZlciBi bG9jayBudW1iZXIsIGFsb25nIHdpdGggaXRzIHNpYmxpbmcgbGlua3MgKi8KKwlwYWdlID0g QnVmZmVyR2V0UGFnZShwb3MtPmJ1Zik7CisJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBh Z2UpOworCXBvcy0+Y3VyclBhZ2UgPSBCdWZmZXJHZXRCbG9ja051bWJlcihwb3MtPmJ1Zik7 CisJcG9zLT5wcmV2UGFnZSA9IG9wYXF1ZS0+YnRwb19wcmV2OworCXBvcy0+bmV4dFBhZ2Ug PSBvcGFxdWUtPmJ0cG9fbmV4dDsKKworCUFzc2VydCghUF9JR05PUkUob3BhcXVlKSk7CisJ QXNzZXJ0KEJUQmF0Y2hTY2FuUG9zSXNQaW5uZWQoKnBvcykpOworCUFzc2VydCghc28tPm5l ZWRQcmltU2Nhbik7CisKKwlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwl7CisJCS8qIGFs bG93IG5leHQvcHJldiBwYWdlIHRvIGJlIHJlYWQgYnkgb3RoZXIgd29ya2VyIHdpdGhvdXQg ZGVsYXkgKi8KKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCV9idF9w YXJhbGxlbF9yZWxlYXNlKHNjYW4sIHBvcy0+bmV4dFBhZ2UsCisJCQkJCQkJCSBwb3MtPmN1 cnJQYWdlKTsKKwkJZWxzZQorCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgcG9zLT5w cmV2UGFnZSwKKwkJCQkJCQkJIHBvcy0+Y3VyclBhZ2UpOworCX0KKworCS8qIGluaXRpYWxp emUgcmVtYWluaW5nIGN1cnJQb3MgZmllbGRzIHJlbGF0ZWQgdG8gY3VycmVudCBwYWdlICov CisJcG9zLT5sc24gPSBCdWZmZXJHZXRMU05BdG9taWMocG9zLT5idWYpOworCXBvcy0+ZGly ID0gZGlyOworCXBvcy0+bmV4dFR1cGxlT2Zmc2V0ID0gMDsKKwkvKiBlaXRoZXIgbW9yZUxl ZnQgb3IgbW9yZVJpZ2h0IHNob3VsZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIp ICovCisJQXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHBvcy0+bW9yZVJp Z2h0IDogcG9zLT5tb3JlTGVmdCk7CisKKwlQcmVkaWNhdGVMb2NrUGFnZShyZWwsIHBvcy0+ Y3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90KTsKKworCS8qIGluaXRpYWxpemUgbG9jYWwg dmFyaWFibGVzICovCisJaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRy aWJ1dGVzKHJlbCk7CisJYXJyYXlLZXlzID0gc28tPm51bUFycmF5S2V5cyAhPSAwOworCW1p bm9mZiA9IFBfRklSU1REQVRBS0VZKG9wYXF1ZSk7CisJbWF4b2ZmID0gUGFnZUdldE1heE9m ZnNldE51bWJlcihwYWdlKTsKKworCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBzdGF0ZSB0 aGF0IHdlJ2xsIHBhc3MgdG8gX2J0X2NoZWNra2V5cyAqLworCXBzdGF0ZS5taW5vZmYgPSBt aW5vZmY7CisJcHN0YXRlLm1heG9mZiA9IG1heG9mZjsKKwlwc3RhdGUuZmluYWx0dXAgPSBO VUxMOworCXBzdGF0ZS5wYWdlID0gcGFnZTsKKwlwc3RhdGUuZmlyc3RwYWdlID0gZmlyc3Rw YWdlOworCXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJcHN0YXRlLnN0YXJ0 aWtleSA9IDA7CisJcHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7CisJcHN0 YXRlLnNraXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCXBzdGF0ZS5jb250aW51ZXNjYW4g PSB0cnVlOyAvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KKwlwc3RhdGUucmVjaGVja3MgPSAw OworCXBzdGF0ZS50YXJnZXRkaXN0YW5jZSA9IDA7CisJcHN0YXRlLm5za2lwYWR2YW5jZXMg PSAwOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwl7CisJCS8qIFNL X1NFQVJDSEFSUkFZIGZvcndhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGhpZ2gga2V5IHVwIGZy b250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmICghUF9SSUdIVE1PU1Qob3Bh cXVlKSkKKwkJCXsKKwkJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgUF9I SUtFWSk7CisKKwkJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0 ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChzby0+c2NhbkJlaGluZCAmJgorCQkJCQkhX2J0 X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZpbmFsdHVwKSkKKwkJ CQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0 ZXIgYWxsICovCisJCQkJCXBvcy0+bW9yZVJpZ2h0ID0gZmFsc2U7CisJCQkJCXNvLT5uZWVk UHJpbVNjYW4gPSB0cnVlOworCQkJCQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwkJCQkJ CV9idF9wYXJhbGxlbF9wcmltc2Nhbl9zY2hlZHVsZShzY2FuLAorCQkJCQkJCQkJCQkJCSAg IHBvcy0+Y3VyclBhZ2UpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisKKwkJ CXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGlyQ2hlY2sgPSBmYWxzZTsJLyogcmVz ZXQgKi8KKwkJfQorCisJCS8qCisJCSAqIENvbnNpZGVyIHBzdGF0ZS5zdGFydGlrZXkgb3B0 aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJCSAqIGluZGV4IHNjYW4g aGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFnZQorCQkgKi8KKwkJaWYgKCFwc3Rh dGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikKKwkJCV9idF9zZXRfc3RhcnRpa2V5 KHNjYW4sICZwc3RhdGUpOworCisJCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRpbmcgb3Jk ZXIgKi8KKwkJaXRlbUluZGV4ID0gMDsKKworCQlvZmZudW0gPSBNYXgob2ZmbnVtLCBtaW5v ZmYpOworCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2ZmKQorCQl7CisJCQlJdGVtSWQJCWlp ZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsKKwkJCUluZGV4VHVwbGUJaXR1cDsK IAkJCWJvb2wJCXBhc3Nlc19xdWFsczsKIAogCQkJLyoKQEAgLTE3NDAsNyArMjk5NCw3IEBA IF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBP ZmZzZXROdW1iZXIgb2ZmbnVtLAogCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhpdHVw KSkKIAkJCQl7CiAJCQkJCS8qIFJlbWVtYmVyIGl0ICovCi0JCQkJCV9idF9zYXZlaXRlbShz bywgaXRlbUluZGV4LCBvZmZudW0sIGl0dXApOworCQkJCQlfYnRfc2F2ZWl0ZW1fYmF0Y2go YmF0Y2gsIGl0ZW1JbmRleCwgb2ZmbnVtLCBpdHVwKTsKIAkJCQkJaXRlbUluZGV4Kys7CiAJ CQkJfQogCQkJCWVsc2UKQEAgLTE3NTIsMTYgKzMwMDYsMTYgQEAgX2J0X3JlYWRwYWdlKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZu dW0sCiAJCQkJCSAqIFRJRAogCQkJCQkgKi8KIAkJCQkJdHVwbGVPZmZzZXQgPQotCQkJCQkJ X2J0X3NldHVwcG9zdGluZ2l0ZW1zKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJ CQkJICBCVHJlZVR1cGxlR2V0UG9zdGluZ04oaXR1cCwgMCksCi0JCQkJCQkJCQkJCSAgaXR1 cCk7CisJCQkJCQlfYnRfc2V0dXBwb3N0aW5naXRlbXNfYmF0Y2goYmF0Y2gsIGl0ZW1JbmRl eCwgb2ZmbnVtLAorCQkJCQkJCQkJCQkJCUJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwLCAw KSwKKwkJCQkJCQkJCQkJCQlpdHVwKTsKIAkJCQkJaXRlbUluZGV4Kys7CiAJCQkJCS8qIFJl bWVtYmVyIGFkZGl0aW9uYWwgVElEcyAqLwogCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IEJU cmVlVHVwbGVHZXROUG9zdGluZyhpdHVwKTsgaSsrKQogCQkJCQl7Ci0JCQkJCQlfYnRfc2F2 ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJCQkJQlRyZWVU dXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAotCQkJCQkJCQkJCQl0dXBsZU9mZnNldCk7CisJ CQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtX2JhdGNoKGJhdGNoLCBpdGVtSW5kZXgsIG9mZm51 bSwKKwkJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAorCQkJ CQkJCQkJCQkJICB0dXBsZU9mZnNldCk7CiAJCQkJCQlpdGVtSW5kZXgrKzsKIAkJCQkJfQog CQkJCX0KQEAgLTE3OTIsMTcgKzMwNDYsMTcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRl c2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCiAKIAkJ CXRydW5jYXR0ID0gQlRyZWVUdXBsZUdldE5BdHRzKGl0dXAsIHJlbCk7CiAJCQlwc3RhdGUu Zm9yY2Vub25yZXF1aXJlZCA9IGZhbHNlOwotCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7CS8q IF9idF9zZXRfc3RhcnRpa2V5IGlnbm9yZXMgUF9ISUtFWSAqLworCQkJcHN0YXRlLnN0YXJ0 aWtleSA9IDA7CS8qIF9idF9zZXRfc3RhcnRpa2V5IGlnbm9yZXMgSElLRVkgKi8KIAkJCV9i dF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgYXJyYXlLZXlzLCBpdHVwLCB0cnVuY2F0dCk7 CiAJCX0KIAogCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCi0JCQlzby0+Y3VyclBvcy5t b3JlUmlnaHQgPSBmYWxzZTsKKwkJCXBvcy0+bW9yZVJpZ2h0ID0gZmFsc2U7CiAKIAkJQXNz ZXJ0KGl0ZW1JbmRleCA8PSBNYXhUSURzUGVyQlRyZWVQYWdlKTsKLQkJc28tPmN1cnJQb3Mu Zmlyc3RJdGVtID0gMDsKLQkJc28tPmN1cnJQb3MubGFzdEl0ZW0gPSBpdGVtSW5kZXggLSAx OwotCQlzby0+Y3VyclBvcy5pdGVtSW5kZXggPSAwOworCQliYXRjaC0+Zmlyc3RJdGVtID0g MDsKKwkJYmF0Y2gtPmxhc3RJdGVtID0gaXRlbUluZGV4IC0gMTsKKwkJYmF0Y2gtPml0ZW1J bmRleCA9IDA7CiAJfQogCWVsc2UKIAl7CkBAIC0xODE5LDEyICszMDczLDEyIEBAIF9idF9y ZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXRO dW1iZXIgb2ZmbnVtLAogCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRp ciwgcHN0YXRlLmZpbmFsdHVwKSkKIAkJCQl7CiAJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIg cHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0ZXIgYWxsICovCi0JCQkJCXNvLT5jdXJyUG9zLm1v cmVMZWZ0ID0gZmFsc2U7CisJCQkJCXBvcy0+bW9yZUxlZnQgPSBmYWxzZTsKIAkJCQkJc28t Pm5lZWRQcmltU2NhbiA9IHRydWU7CiAJCQkJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuKQog CQkJCQkJX2J0X3BhcmFsbGVsX3ByaW1zY2FuX3NjaGVkdWxlKHNjYW4sCi0JCQkJCQkJCQkJ CQkJICAgc28tPmN1cnJQb3MuY3VyclBhZ2UpOwotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJ CQkJCQkJCQkJICAgcG9zLT5jdXJyUGFnZSk7CisJCQkJCXJldHVybiBOVUxMOwogCQkJCX0K IAkJCX0KIApAQCAtMTkyMiw3ICszMTc2LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRl c2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCiAJCQkJ ewogCQkJCQkvKiBSZW1lbWJlciBpdCAqLwogCQkJCQlpdGVtSW5kZXgtLTsKLQkJCQkJX2J0 X3NhdmVpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwgaXR1cCk7CisJCQkJCV9idF9zYXZl aXRlbV9iYXRjaChiYXRjaCwgaXRlbUluZGV4LCBvZmZudW0sIGl0dXApOwogCQkJCX0KIAkJ CQllbHNlCiAJCQkJewpAQCAtMTk0MCwxNiArMzE5NCwxNiBAQCBfYnRfcmVhZHBhZ2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51 bSwKIAkJCQkJICovCiAJCQkJCWl0ZW1JbmRleC0tOwogCQkJCQl0dXBsZU9mZnNldCA9Ci0J CQkJCQlfYnRfc2V0dXBwb3N0aW5naXRlbXMoc28sIGl0ZW1JbmRleCwgb2ZmbnVtLAotCQkJ CQkJCQkJCQkgIEJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwLCAwKSwKLQkJCQkJCQkJCQkJ ICBpdHVwKTsKKwkJCQkJCV9idF9zZXR1cHBvc3RpbmdpdGVtc19iYXRjaChiYXRjaCwgaXRl bUluZGV4LCBvZmZudW0sCisJCQkJCQkJCQkJCQkJQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0 dXAsIDApLAorCQkJCQkJCQkJCQkJCWl0dXApOwogCQkJCQkvKiBSZW1lbWJlciBhZGRpdGlv bmFsIFRJRHMgKi8KIAkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBCVHJlZVR1cGxlR2V0TlBv c3RpbmcoaXR1cCk7IGkrKykKIAkJCQkJewogCQkJCQkJaXRlbUluZGV4LS07Ci0JCQkJCQlf YnRfc2F2ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJCQkJ QlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAotCQkJCQkJCQkJCQl0dXBsZU9mZnNl dCk7CisJCQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtX2JhdGNoKGJhdGNoLCBpdGVtSW5kZXgs IG9mZm51bSwKKwkJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkp LAorCQkJCQkJCQkJCQkJICB0dXBsZU9mZnNldCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBA IC0xOTY1LDEyICszMjE5LDEyIEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtLAogCQkgKiBiZSBmb3Vu ZCB0aGVyZQogCQkgKi8KIAkJaWYgKCFwc3RhdGUuY29udGludWVzY2FuKQotCQkJc28tPmN1 cnJQb3MubW9yZUxlZnQgPSBmYWxzZTsKKwkJCXBvcy0+bW9yZUxlZnQgPSBmYWxzZTsKIAog CQlBc3NlcnQoaXRlbUluZGV4ID49IDApOwotCQlzby0+Y3VyclBvcy5maXJzdEl0ZW0gPSBp dGVtSW5kZXg7Ci0JCXNvLT5jdXJyUG9zLmxhc3RJdGVtID0gTWF4VElEc1BlckJUcmVlUGFn ZSAtIDE7Ci0JCXNvLT5jdXJyUG9zLml0ZW1JbmRleCA9IE1heFRJRHNQZXJCVHJlZVBhZ2Ug LSAxOworCQliYXRjaC0+Zmlyc3RJdGVtID0gaXRlbUluZGV4OworCQliYXRjaC0+bGFzdEl0 ZW0gPSBNYXhUSURzUGVyQlRyZWVQYWdlIC0gMTsKKwkJYmF0Y2gtPml0ZW1JbmRleCA9IE1h eFRJRHNQZXJCVHJlZVBhZ2UgLSAxOwogCX0KIAogCS8qCkBAIC0xOTg3LDcgKzMyNDEsMTIg QEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0sCiAJICovCiAJQXNzZXJ0KCFwc3RhdGUuZm9yY2Vub25y ZXF1aXJlZCk7CiAKLQlyZXR1cm4gKHNvLT5jdXJyUG9zLmZpcnN0SXRlbSA8PSBzby0+Y3Vy clBvcy5sYXN0SXRlbSk7CisJaWYgKGJhdGNoLT5maXJzdEl0ZW0gPiBiYXRjaC0+bGFzdEl0 ZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KGJhdGNoLT5vcGFxdWUsIHBvcywgc2l6 ZW9mKEJUQmF0Y2hTY2FuUG9zRGF0YSkpOworCisJcmV0dXJuIGJhdGNoOwogfQogCiAvKiBT YXZlIGFuIGluZGV4IGl0ZW0gaW50byBzby0+Y3VyclBvcy5pdGVtc1tpdGVtSW5kZXhdICov CkBAIC0yMDA1LDkgKzMyNjQsOTcgQEAgX2J0X3NhdmVpdGVtKEJUU2Nhbk9wYXF1ZSBzbywg aW50IGl0ZW1JbmRleCwKIAl7CiAJCVNpemUJCWl0dXBzeiA9IEluZGV4VHVwbGVTaXplKGl0 dXApOwogCi0JCWN1cnJJdGVtLT50dXBsZU9mZnNldCA9IHNvLT5jdXJyUG9zLm5leHRUdXBs ZU9mZnNldDsKLQkJbWVtY3B5KHNvLT5jdXJyVHVwbGVzICsgc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0LCBpdHVwLCBpdHVwc3opOwotCQlzby0+Y3VyclBvcy5uZXh0VHVwbGVPZmZz ZXQgKz0gTUFYQUxJR04oaXR1cHN6KTsKKwkJY3Vyckl0ZW0tPnR1cGxlT2Zmc2V0ID0gc28t PmN1cnJQb3MubmV4dFR1cGxlT2Zmc2V0OworCQltZW1jcHkoc28tPmN1cnJUdXBsZXMgKyBz by0+Y3VyclBvcy5uZXh0VHVwbGVPZmZzZXQsIGl0dXAsIGl0dXBzeik7CisJCXNvLT5jdXJy UG9zLm5leHRUdXBsZU9mZnNldCArPSBNQVhBTElHTihpdHVwc3opOworCX0KK30KKworLyoK KyAqIFNldHVwIHN0YXRlIHRvIHNhdmUgVElEcy9pdGVtcyBmcm9tIGEgc2luZ2xlIHBvc3Rp bmcgbGlzdCB0dXBsZS4KKyAqCisgKiBTYXZlcyBhbiBpbmRleCBpdGVtIGludG8gc28tPmN1 cnJQb3MuaXRlbXNbaXRlbUluZGV4XSBmb3IgVElEIHRoYXQgaXMKKyAqIHJldHVybmVkIHRv IHNjYW4gZmlyc3QuICBTZWNvbmQgb3Igc3Vic2VxdWVudCBUSURzIGZvciBwb3N0aW5nIGxp c3Qgc2hvdWxkCisgKiBiZSBzYXZlZCBieSBjYWxsaW5nIF9idF9zYXZlcG9zdGluZ2l0ZW0o KS4KKyAqCisgKiBSZXR1cm5zIGFuIG9mZnNldCBpbnRvIHR1cGxlIHN0b3JhZ2Ugc3BhY2Ug dGhhdCBtYWluIHR1cGxlIGlzIHN0b3JlZCBhdCBpZgorICogbmVlZGVkLgorICovCitzdGF0 aWMgaW50CitfYnRfc2V0dXBwb3N0aW5naXRlbXMoQlRTY2FuT3BhcXVlIHNvLCBpbnQgaXRl bUluZGV4LCBPZmZzZXROdW1iZXIgb2ZmbnVtLAorCQkJCQkgIEl0ZW1Qb2ludGVyIGhlYXBU aWQsIEluZGV4VHVwbGUgaXR1cCkKK3sKKwlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZz by0+Y3VyclBvcy5pdGVtc1tpdGVtSW5kZXhdOworCisJQXNzZXJ0KEJUcmVlVHVwbGVJc1Bv c3RpbmcoaXR1cCkpOworCisJY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKKwljdXJy SXRlbS0+aW5kZXhPZmZzZXQgPSBvZmZudW07CisJaWYgKHNvLT5jdXJyVHVwbGVzKQorCXsK KwkJLyogU2F2ZSBiYXNlIEluZGV4VHVwbGUgKHRydW5jYXRlIHBvc3RpbmcgbGlzdCkgKi8K KwkJSW5kZXhUdXBsZQliYXNlOworCQlTaXplCQlpdHVwc3ogPSBCVHJlZVR1cGxlR2V0UG9z dGluZ09mZnNldChpdHVwKTsKKworCQlpdHVwc3ogPSBNQVhBTElHTihpdHVwc3opOworCQlj dXJySXRlbS0+dHVwbGVPZmZzZXQgPSBzby0+Y3VyclBvcy5uZXh0VHVwbGVPZmZzZXQ7CisJ CWJhc2UgPSAoSW5kZXhUdXBsZSkgKHNvLT5jdXJyVHVwbGVzICsgc28tPmN1cnJQb3MubmV4 dFR1cGxlT2Zmc2V0KTsKKwkJbWVtY3B5KGJhc2UsIGl0dXAsIGl0dXBzeik7CisJCS8qIERl ZmVuc2l2ZWx5IHJlZHVjZSB3b3JrIGFyZWEgaW5kZXggdHVwbGUgaGVhZGVyIHNpemUgKi8K KwkJYmFzZS0+dF9pbmZvICY9IH5JTkRFWF9TSVpFX01BU0s7CisJCWJhc2UtPnRfaW5mbyB8 PSBpdHVwc3o7CisJCXNvLT5jdXJyUG9zLm5leHRUdXBsZU9mZnNldCArPSBpdHVwc3o7CisK KwkJcmV0dXJuIGN1cnJJdGVtLT50dXBsZU9mZnNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIFNhdmUgYW4gaW5kZXggaXRlbSBpbnRvIHNvLT5jdXJyUG9zLml0ZW1zW2l0 ZW1JbmRleF0gZm9yIGN1cnJlbnQgcG9zdGluZworICogdHVwbGUuCisgKgorICogQXNzdW1l cyB0aGF0IF9idF9zZXR1cHBvc3RpbmdpdGVtcygpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVk IGZvciBjdXJyZW50CisgKiBwb3N0aW5nIGxpc3QgdHVwbGUuICBDYWxsZXIgcGFzc2VzIGl0 cyByZXR1cm4gdmFsdWUgYXMgdHVwbGVPZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9p ZAorX2J0X3NhdmVwb3N0aW5naXRlbShCVFNjYW5PcGFxdWUgc28sIGludCBpdGVtSW5kZXgs IE9mZnNldE51bWJlciBvZmZudW0sCisJCQkJCUl0ZW1Qb2ludGVyIGhlYXBUaWQsIGludCB0 dXBsZU9mZnNldCkKK3sKKwlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZzby0+Y3VyclBv cy5pdGVtc1tpdGVtSW5kZXhdOworCisJY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsK KwljdXJySXRlbS0+aW5kZXhPZmZzZXQgPSBvZmZudW07CisKKwkvKgorCSAqIEhhdmUgaW5k ZXgtb25seSBzY2FucyByZXR1cm4gdGhlIHNhbWUgYmFzZSBJbmRleFR1cGxlIGZvciBldmVy eSBUSUQKKwkgKiB0aGF0IG9yaWdpbmF0ZXMgZnJvbSB0aGUgc2FtZSBwb3N0aW5nIGxpc3QK KwkgKi8KKwlpZiAoc28tPmN1cnJUdXBsZXMpCisJCWN1cnJJdGVtLT50dXBsZU9mZnNldCA9 IHR1cGxlT2Zmc2V0OworfQorCisvKiBTYXZlIGFuIGluZGV4IGl0ZW0gaW50byBzby0+Y3Vy clBvcy5pdGVtc1tpdGVtSW5kZXhdICovCitzdGF0aWMgdm9pZAorX2J0X3NhdmVpdGVtX2Jh dGNoKEluZGV4U2NhbkJhdGNoIGJhdGNoLCBpbnQgaXRlbUluZGV4LAorCQkJCSAgIE9mZnNl dE51bWJlciBvZmZudW0sIEluZGV4VHVwbGUgaXR1cCkKK3sKKwlCVEJhdGNoU2NhblBvcyBw b3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisKKwlBc3NlcnQoIUJUcmVl VHVwbGVJc1Bpdm90KGl0dXApICYmICFCVHJlZVR1cGxlSXNQb3N0aW5nKGl0dXApKTsKKwor CS8qIGNvcHkgdGhlIHBvcHVsYXRlZCBwYXJ0IG9mIHRoZSBpdGVtcyBhcnJheSAqLworCWJh dGNoLT5pdGVtc1tpdGVtSW5kZXhdLmhlYXBUaWQgPSBpdHVwLT50X3RpZDsKKwliYXRjaC0+ aXRlbXNbaXRlbUluZGV4XS5pbmRleE9mZnNldCA9IG9mZm51bTsKKworCWlmIChiYXRjaC0+ Y3VyclR1cGxlcykKKwl7CisJCVNpemUJCWl0dXBzeiA9IEluZGV4VHVwbGVTaXplKGl0dXAp OworCisJCWJhdGNoLT5pdGVtc1tpdGVtSW5kZXhdLnR1cGxlT2Zmc2V0ID0gcG9zLT5uZXh0 VHVwbGVPZmZzZXQ7CisJCW1lbWNweShiYXRjaC0+Y3VyclR1cGxlcyArIHBvcy0+bmV4dFR1 cGxlT2Zmc2V0LCBpdHVwLCBpdHVwc3opOworCQlwb3MtPm5leHRUdXBsZU9mZnNldCArPSBN QVhBTElHTihpdHVwc3opOwogCX0KIH0KIApAQCAtMjAyMiwzMSArMzM2OSwzNCBAQCBfYnRf c2F2ZWl0ZW0oQlRTY2FuT3BhcXVlIHNvLCBpbnQgaXRlbUluZGV4LAogICogbmVlZGVkLgog ICovCiBzdGF0aWMgaW50Ci1fYnRfc2V0dXBwb3N0aW5naXRlbXMoQlRTY2FuT3BhcXVlIHNv LCBpbnQgaXRlbUluZGV4LCBPZmZzZXROdW1iZXIgb2ZmbnVtLAotCQkJCQkgIEl0ZW1Qb2lu dGVyIGhlYXBUaWQsIEluZGV4VHVwbGUgaXR1cCkKK19idF9zZXR1cHBvc3RpbmdpdGVtc19i YXRjaChJbmRleFNjYW5CYXRjaCBiYXRjaCwgaW50IGl0ZW1JbmRleCwgT2Zmc2V0TnVtYmVy IG9mZm51bSwKKwkJCQkJCQlJdGVtUG9pbnRlciBoZWFwVGlkLCBJbmRleFR1cGxlIGl0dXAp CiB7Ci0JQlRTY2FuUG9zSXRlbSAqY3Vyckl0ZW0gPSAmc28tPmN1cnJQb3MuaXRlbXNbaXRl bUluZGV4XTsKKwlCVEJhdGNoU2NhblBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNo LT5vcGFxdWU7CisJSW5kZXhTY2FuQmF0Y2hQb3NJdGVtICppdGVtID0gJmJhdGNoLT5pdGVt c1tpdGVtSW5kZXhdOwogCiAJQXNzZXJ0KEJUcmVlVHVwbGVJc1Bvc3RpbmcoaXR1cCkpOwog Ci0JY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKLQljdXJySXRlbS0+aW5kZXhPZmZz ZXQgPSBvZmZudW07Ci0JaWYgKHNvLT5jdXJyVHVwbGVzKQorCS8qIGNvcHkgdGhlIHBvcHVs YXRlZCBwYXJ0IG9mIHRoZSBpdGVtcyBhcnJheSAqLworCWl0ZW0tPmhlYXBUaWQgPSAqaGVh cFRpZDsKKwlpdGVtLT5pbmRleE9mZnNldCA9IG9mZm51bTsKKworCWlmIChiYXRjaC0+Y3Vy clR1cGxlcykKIAl7CiAJCS8qIFNhdmUgYmFzZSBJbmRleFR1cGxlICh0cnVuY2F0ZSBwb3N0 aW5nIGxpc3QpICovCiAJCUluZGV4VHVwbGUJYmFzZTsKIAkJU2l6ZQkJaXR1cHN6ID0gQlRy ZWVUdXBsZUdldFBvc3RpbmdPZmZzZXQoaXR1cCk7CiAKIAkJaXR1cHN6ID0gTUFYQUxJR04o aXR1cHN6KTsKLQkJY3Vyckl0ZW0tPnR1cGxlT2Zmc2V0ID0gc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0OwotCQliYXNlID0gKEluZGV4VHVwbGUpIChzby0+Y3VyclR1cGxlcyArIHNv LT5jdXJyUG9zLm5leHRUdXBsZU9mZnNldCk7CisJCWl0ZW0tPnR1cGxlT2Zmc2V0ID0gcG9z LT5uZXh0VHVwbGVPZmZzZXQ7CisJCWJhc2UgPSAoSW5kZXhUdXBsZSkgKGJhdGNoLT5jdXJy VHVwbGVzICsgcG9zLT5uZXh0VHVwbGVPZmZzZXQpOwogCQltZW1jcHkoYmFzZSwgaXR1cCwg aXR1cHN6KTsKIAkJLyogRGVmZW5zaXZlbHkgcmVkdWNlIHdvcmsgYXJlYSBpbmRleCB0dXBs ZSBoZWFkZXIgc2l6ZSAqLwogCQliYXNlLT50X2luZm8gJj0gfklOREVYX1NJWkVfTUFTSzsK IAkJYmFzZS0+dF9pbmZvIHw9IGl0dXBzejsKLQkJc28tPmN1cnJQb3MubmV4dFR1cGxlT2Zm c2V0ICs9IGl0dXBzejsKKwkJcG9zLT5uZXh0VHVwbGVPZmZzZXQgKz0gaXR1cHN6OwogCi0J CXJldHVybiBjdXJySXRlbS0+dHVwbGVPZmZzZXQ7CisJCXJldHVybiBpdGVtLT50dXBsZU9m ZnNldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwNjAsMjAgKzM0MTAsMjAgQEAgX2J0X3Nl dHVwcG9zdGluZ2l0ZW1zKEJUU2Nhbk9wYXF1ZSBzbywgaW50IGl0ZW1JbmRleCwgT2Zmc2V0 TnVtYmVyIG9mZm51bSwKICAqIHBvc3RpbmcgbGlzdCB0dXBsZS4gIENhbGxlciBwYXNzZXMg aXRzIHJldHVybiB2YWx1ZSBhcyB0dXBsZU9mZnNldC4KICAqLwogc3RhdGljIGlubGluZSB2 b2lkCi1fYnRfc2F2ZXBvc3RpbmdpdGVtKEJUU2Nhbk9wYXF1ZSBzbywgaW50IGl0ZW1JbmRl eCwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKLQkJCQkJSXRlbVBvaW50ZXIgaGVhcFRpZCwgaW50 IHR1cGxlT2Zmc2V0KQorX2J0X3NhdmVwb3N0aW5naXRlbV9iYXRjaChJbmRleFNjYW5CYXRj aCBiYXRjaCwgaW50IGl0ZW1JbmRleCwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkJCSAg SXRlbVBvaW50ZXIgaGVhcFRpZCwgaW50IHR1cGxlT2Zmc2V0KQogewotCUJUU2NhblBvc0l0 ZW0gKmN1cnJJdGVtID0gJnNvLT5jdXJyUG9zLml0ZW1zW2l0ZW1JbmRleF07CisJSW5kZXhT Y2FuQmF0Y2hQb3NJdGVtICppdGVtID0gJmJhdGNoLT5pdGVtc1tpdGVtSW5kZXhdOwogCi0J Y3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKLQljdXJySXRlbS0+aW5kZXhPZmZzZXQg PSBvZmZudW07CisJaXRlbS0+aGVhcFRpZCA9ICpoZWFwVGlkOworCWl0ZW0tPmluZGV4T2Zm c2V0ID0gb2ZmbnVtOwogCiAJLyoKIAkgKiBIYXZlIGluZGV4LW9ubHkgc2NhbnMgcmV0dXJu IHRoZSBzYW1lIGJhc2UgSW5kZXhUdXBsZSBmb3IgZXZlcnkgVElECiAJICogdGhhdCBvcmln aW5hdGVzIGZyb20gdGhlIHNhbWUgcG9zdGluZyBsaXN0CiAJICovCi0JaWYgKHNvLT5jdXJy VHVwbGVzKQotCQljdXJySXRlbS0+dHVwbGVPZmZzZXQgPSB0dXBsZU9mZnNldDsKKwlpZiAo YmF0Y2gtPmN1cnJUdXBsZXMpCisJCWl0ZW0tPnR1cGxlT2Zmc2V0ID0gdHVwbGVPZmZzZXQ7 CiB9CiAKIC8qCkBAIC0yMTg2LDYgKzM1MzYsNzEgQEAgX2J0X3N0ZXBwYWdlKEluZGV4U2Nh bkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJcmV0dXJuIF9idF9yZWFkbmV4dHBh Z2Uoc2NhbiwgYmxrbm8sIGxhc3RjdXJyYmxrbm8sIGRpciwgZmFsc2UpOwogfQogCisvKgor ICoJYSBiYXRjaGluZyB2ZXJzaW9uIG9mIF9idF9zdGVwcGFnZSgpLCBpZ25vcmluZyBpcnJl bGV2YW50IGJpdHMKKyAqLworc3RhdGljIEluZGV4U2NhbkJhdGNoCitfYnRfc3RlcHBhZ2Vf YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBvcyBwb3MsIFNjYW5EaXJl Y3Rpb24gZGlyKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4t Pm9wYXF1ZTsKKwlCbG9ja051bWJlciBibGtubywKKwkJCQlsYXN0Y3VycmJsa25vOworCisJ LyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBwb3Np dGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsKKwlB c3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qIEJhdGNoaW5n IGhhcyBhIGRpZmZlcmVudCBjb25jZXB0IG9mIHBvc2l0aW9uLCBzdG9yZWQgaW4gdGhlIGJh dGNoLiAqLworCUFzc2VydChCVEJhdGNoU2NhblBvc0lzVmFsaWQoKnBvcykpOworCisJLyoK KwkgKiBraWxsaXRlbXMKKwkgKgorCSAqIE5vIG5lZWQgdG8gaGFuZGxlIGtpbGx0dXBsZXMg aGVyZSwgdGhhdCdzIGdvaW5nIHRvIGJlIGRlYWx0IHdpdGggYXQgdGhlCisJICogaW5kZXhh bS5jIGxldmVsIHdoZW4gZnJlZWluZyB0aGUgYmF0Y2gsIG9yIHBvc3NpYmx5IGluIHdoZW4g Y2FsbGluZworCSAqIGFtZnJlZWJhdGNoLgorCSAqLworCisJLyoKKwkgKiBtYXJrL3Jlc3Rv cmUKKwkgKgorCSAqIE1hcmsvcmVzdG9yZSBzaGFsbCBhbHNvIGJlIGhhbmRsZWQgYXQgdGhl IGluZGV4YW0uYyBsZXZlbCwgYnkga2VlcGluZworCSAqIHRoZSBjb3JyZWN0IGJhdGNoIGFy b3VuZCwgZXRjLiBXZSBkb24ndCBkaXNjYXJkIHRoZSBvbGQgYmF0Y2ggaGVyZS4KKwkgKgor CSAqIEluIF9idF9zdGVwcGFnZSB0aGlzIGFsc28gaGFuZGxlZCBwcmltaXRpdmUgc2NhbnMg Zm9yIGFycmF5IGtleXMsIGJ1dAorCSAqIHRoYXQgcHJvYmFibHkgd291bGQgYmUgaGFuZGxl ZCBhdCBpbmRleGFtLmMgbGV2ZWwgdG9vLgorCSAqLworCisJLyogRG9uJ3QgdW5waW4gdGhl IGJ1ZmZlciBoZXJlLCBrZWVwIHRoZSBiYXRjaCBwaW5uZWQgdW50aWwgYW1mcmVlYmF0Y2gu ICovCisKKwkvKiBXYWxrIHRvIHRoZSBuZXh0IHBhZ2Ugd2l0aCBkYXRhICovCisJaWYgKFNj YW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJYmxrbm8gPSBwb3MtPm5leHRQYWdlOwor CWVsc2UKKwkJYmxrbm8gPSBwb3MtPnByZXZQYWdlOworCisJbGFzdGN1cnJibGtubyA9IHBv cy0+Y3VyclBhZ2U7CisKKwkvKgorCSAqIENhbmNlbCBwcmltaXRpdmUgaW5kZXggc2NhbnMg dGhhdCB3ZXJlIHNjaGVkdWxlZCB3aGVuIHRoZSBjYWxsIHRvCisJICogX2J0X3JlYWRwYWdl IGZvciBjdXJyUG9zIGhhcHBlbmVkIHRvIHVzZSB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIHRv IHRoZQorCSAqIG9uZSB0aGF0IHdlJ3JlIHN0ZXBwaW5nIGluIG5vdy4gIChJdCdzIG9rYXkg dG8gbGVhdmUgdGhlIHNjYW4ncyBhcnJheQorCSAqIGtleXMgYXMtaXMsIHNpbmNlIHRoZSBu ZXh0IF9idF9yZWFkcGFnZSB3aWxsIGFkdmFuY2UgdGhlbS4pCisJICoKKwkgKiBYWFggTm90 IHN1cmUgdGhpcyBpcyBjb3JyZWN0LiBDYW4gd2UgY29tYmluZSB0aGUgZGlyZWN0aW9uIGZy b20gc29tZQorCSAqIG9sZGVyIGJhdGNoICh3aXRoIG1hcmsvcmVzdG9yZT8pIGFuZCB0aGUg Y3VycmVudCBuZWVkUHJpbVNjYW4gZnJvbSB0aGUKKwkgKiBsYXRlc3QgYmF0Y2ggd2UgcHJv Y2Vzc2VkPyBCdXQsIHRoZSBtYXJrL3Jlc3RvcmUgY29kZSBpbiBpbmRleGFtIHNob3VsZAor CSAqIHJlc2V0IHRoaXMgc29tZWhvdy4KKwkgKgorCSAqIFhYWCBIb3dldmVyLCBhcmVuJ3Qg cHJpbWl0aXZlIHNjYW5zIHZlcnkgYnRyZWUtc3BlY2lmaWMgY29kZT8gSG93IGNvdWxkCisJ ICogaW5kZXhhbS5jIGV2ZXIgaGFuZGxlIHRoYXQ/CisJICovCisJaWYgKHBvcy0+ZGlyICE9 IGRpcikKKwkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCisJcmV0dXJuIF9idF9yZWFk bmV4dHBhZ2VfYmF0Y2goc2NhbiwgcG9zLCBibGtubywgbGFzdGN1cnJibGtubywgZGlyLCBm YWxzZSk7Cit9CisKIC8qCiAgKglfYnRfcmVhZGZpcnN0cGFnZSgpIC0tIFJlYWQgZmlyc3Qg cGFnZSBjb250YWluaW5nIHZhbGlkIGRhdGEgZm9yIF9idF9maXJzdAogICoKQEAgLTIyNjUs NiArMzY4MCw3NyBAQCBfYnRfcmVhZGZpcnN0cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIE9m ZnNldE51bWJlciBvZmZudW0sIFNjYW5EaXJlY3Rpb24gZGlyKQogCXJldHVybiB0cnVlOwog fQogCitzdGF0aWMgSW5kZXhTY2FuQmF0Y2gKK19idF9yZWFkZmlyc3RwYWdlX2JhdGNoKElu ZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLCBPZmZzZXROdW1iZXIgb2Zm bnVtLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2Fu T3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJSW5kZXhTY2FuQmF0Y2ggYmF0Y2g7CisKKwkvKiBi YXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9u cyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2Vy dCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOworCisJc28tPm51bUtpbGxlZCA9 IDA7CQkJLyoganVzdCBwYXJhbm9pYSAqLworCXNvLT5tYXJrSXRlbUluZGV4ID0gLTE7CQkv KiBkaXR0byAqLworCisJLyogY29weSBwb3NpdGlvbiBpbmZvIGZyb20gQlRTY2FuT3BhcXVl ICovCisKKwkvKiBJbml0aWFsaXplIHNvLT5jdXJyUG9zIGZvciB0aGUgZmlyc3QgcGFnZSAo cGFnZSBpbiBzby0+Y3VyclBvcy5idWYpICovCisJaWYgKHNvLT5uZWVkUHJpbVNjYW4pCisJ eworCQlBc3NlcnQoc28tPm51bUFycmF5S2V5cyk7CisKKwkJcG9zLT5tb3JlTGVmdCA9IHRy dWU7CisJCXBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKwkJc28tPm5lZWRQcmltU2NhbiA9IGZh bHNlOworCX0KKwllbHNlIGlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJewor CQlwb3MtPm1vcmVMZWZ0ID0gZmFsc2U7CisJCXBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKwl9 CisJZWxzZQorCXsKKwkJcG9zLT5tb3JlTGVmdCA9IHRydWU7CisJCXBvcy0+bW9yZVJpZ2h0 ID0gZmFsc2U7CisJfQorCisJLyoKKwkgKiBBdHRlbXB0IHRvIGxvYWQgbWF0Y2hpbmcgdHVw bGVzIGZyb20gdGhlIGZpcnN0IHBhZ2UuCisJICoKKwkgKiBOb3RlIHRoYXQgX2J0X3JlYWRw YWdlIHdpbGwgZmluaXNoIGluaXRpYWxpemluZyB0aGUgc28tPmN1cnJQb3MgZmllbGRzLgor CSAqIF9idF9yZWFkcGFnZSBhbHNvIHJlbGVhc2VzIHBhcmFsbGVsIHNjYW4gKGV2ZW4gd2hl biBpdCByZXR1cm5zIGZhbHNlKS4KKwkgKi8KKwlpZiAoKGJhdGNoID0gX2J0X3JlYWRwYWdl X2JhdGNoKHNjYW4sIHBvcywgZGlyLCBvZmZudW0sIHRydWUpKSAhPSBOVUxMKQorCXsKKwkJ cG9zID0gKEJUQmF0Y2hTY2FuUG9zKSBiYXRjaC0+b3BhcXVlOworCisJCS8qCisJCSAqIF9i dF9yZWFkcGFnZSBzdWNjZWVkZWQuICBEcm9wIHRoZSBsb2NrIChhbmQgbWF5YmUgdGhlIHBp bikgb24KKwkJICogc28tPmN1cnJQb3MuYnVmIGluIHByZXBhcmF0aW9uIGZvciBidGdldHR1 cGxlIHJldHVybmluZyB0dXBsZXMuCisJCSAqLworCQlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJ c1Bpbm5lZCgqcG9zKSk7CisKKwkJLyogX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluX2Jh dGNoKHNjYW4sIHBvcyk7ICovCisJCS8qIFhYWCBkcm9wIGp1c3QgdGhlIGxvY2ssIG5vdCB0 aGUgcGluLCB0aGF0J3MgdXAgdG8gYnRmcmVlYmF0Y2ggKi8KKwkJLyogd2l0aG91dCB0aGlz IGJ0ZnJlZWJhdGNoIHRyaWdnZXJzIGFuIGFzc2VydCB3aGVuIHVucGlubmluZyB0aGUgKi8K KwkJLyogYnVmZmVyLCBiZWNhdXNlIHRoYXQgY2hlY2tzIHdlJ3JlIG5vdCBob2xkaW5nIGEg bG9jayBvbiBpdCAqLworCQlfYnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIHBv cy0+YnVmKTsKKwkJcmV0dXJuIGJhdGNoOworCX0KKworCS8qIFRoZXJlJ3Mgbm8gYWN0dWFs bHktbWF0Y2hpbmcgZGF0YSBvbiB0aGUgcGFnZSBpbiBzby0+Y3VyclBvcy5idWYgKi8KKwlf YnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIHBvcy0+YnVmKTsKKworCS8qIFhY WCBOb3Qgc3VyZSB3ZSBjYW4gZHJvcCB0aGUgcGluIGJlZm9yZSBjYWxsaW5nIHN0ZXBwYWdl X2JhdGNoPyBCdXQgKi8KKwkvKiB3aXRob3V0IHRoaXMsIFxkKyByZXBvcnRzIHVucmVsZWFz ZWQgYnVmZmVyIC4uLiAqLworCS8qIEFuZCB0aGUgbm9uLWJhdGNoIGNvZGUgZG9lc24ndCBu ZWVkIHRvIGRvIHRoaXMuICovCisJUmVsZWFzZUJ1ZmZlcihwb3MtPmJ1Zik7CisKKwkvKiBD YWxsIF9idF9yZWFkbmV4dHBhZ2UgdXNpbmcgaXRzIF9idF9zdGVwcGFnZSB3cmFwcGVyIGZ1 bmN0aW9uICovCisJcmV0dXJuIF9idF9zdGVwcGFnZV9iYXRjaChzY2FuLCBwb3MsIGRpcik7 Cit9CisKIC8qCiAgKglfYnRfcmVhZG5leHRwYWdlKCkgLS0gUmVhZCBuZXh0IHBhZ2UgY29u dGFpbmluZyB2YWxpZCBkYXRhIGZvciBfYnRfbmV4dAogICoKQEAgLTI0MTIsNiArMzg5OCwx MzggQEAgX2J0X3JlYWRuZXh0cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVy IGJsa25vLAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgSW5kZXhTY2FuQmF0Y2gKK19i dF9yZWFkbmV4dHBhZ2VfYmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBv cyBwb3MsIEJsb2NrTnVtYmVyIGJsa25vLAorCQkJCQkgICBCbG9ja051bWJlciBsYXN0Y3Vy cmJsa25vLCBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCBzZWl6ZWQpCit7CisJUmVsYXRpb24J cmVsID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlCVFNjYW5PcGFxdWUgc28gUEdfVVNFRF9G T1JfQVNTRVJUU19PTkxZID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCisJLyog QlRCYXRjaFNjYW5Qb3NEYXRhCW5ld3BvczsgKi8KKwlJbmRleFNjYW5CYXRjaCBuZXdiYXRj aCA9IE5VTEw7CisKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBz Y2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOwor CisJQXNzZXJ0KHBvcy0+Y3VyclBhZ2UgPT0gbGFzdGN1cnJibGtubyB8fCBzZWl6ZWQpOwor CUFzc2VydChCVEJhdGNoU2NhblBvc0lzUGlubmVkKCpwb3MpIHx8IHNlaXplZCk7CisKKwkv KiBpbml0aWFsaXplIHRoZSBuZXcgcG9zaXRpb24gdG8gdGhlIG9sZCBvbmUsIHdlJ2xsIG1v ZGlmeSBpdCAqLworCS8qIG5ld3BvcyA9ICpwb3M7ICovCisKKwkvKiBwb3MtPm1vcmVMZWZ0 ID0gcG9zLT5tb3JlUmlnaHQgPSBmYWxzZTsgKi8KKworCS8qCisJICogUmVtZW1iZXIgdGhh dCB0aGUgc2NhbiBhbHJlYWR5IHJlYWQgbGFzdGN1cnJibGtubywgYSBwYWdlIHRvIHRoZSBs ZWZ0CisJICogb2YgYmxrbm8gKG9yIHJlbWVtYmVyIHJlYWRpbmcgYSBwYWdlIHRvIHRoZSBy aWdodCwgZm9yIGJhY2t3YXJkcyBzY2FucykKKwkgKi8KKwlpZiAoU2NhbkRpcmVjdGlvbklz Rm9yd2FyZChkaXIpKQorCQlwb3MtPm1vcmVMZWZ0ID0gdHJ1ZTsKKwllbHNlCisJCXBvcy0+ bW9yZVJpZ2h0ID0gdHJ1ZTsKKworCWZvciAoOzspCisJeworCQlQYWdlCQlwYWdlOworCQlC VFBhZ2VPcGFxdWUgb3BhcXVlOworCisJCWlmIChibGtubyA9PSBQX05PTkUgfHwKKwkJCShT Y2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgPworCQkJICFwb3MtPm1vcmVSaWdodCA6ICFw b3MtPm1vcmVMZWZ0KSkKKwkJeworCQkJLyogbW9zdCByZWNlbnQgX2J0X3JlYWRwYWdlIGNh bGwgKGZvciBsYXN0Y3VycmJsa25vKSBlbmRlZCBzY2FuICovCisJCQlBc3NlcnQocG9zLT5j dXJyUGFnZSA9PSBsYXN0Y3VycmJsa25vICYmICFzZWl6ZWQpOworCQkJQlRCYXRjaFNjYW5Q b3NJbnZhbGlkYXRlKCpwb3MpOworCQkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7CS8qIGlm ZiAhc28tPm5lZWRQcmltU2NhbiAqLworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlBc3Nl cnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJCS8qIHBhcmFsbGVsIHNjYW4gbXVzdCBuZXZl ciBhY3R1YWxseSB2aXNpdCBzby0+Y3VyclBvcyBibGtubyAqLworCQlpZiAoIXNlaXplZCAm JiBzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwgJiYKKwkJCSFfYnRfcGFyYWxsZWxfc2Vp emVfYmF0Y2goc2NhbiwgcG9zLCAmYmxrbm8sICZsYXN0Y3VycmJsa25vLCBmYWxzZSkpCisJ CXsKKwkJCS8qIHdob2xlIHNjYW4gaXMgbm93IGRvbmUgKG9yIGFub3RoZXIgcHJpbWl0aXZl IHNjYW4gcmVxdWlyZWQpICovCisJCQlCVEJhdGNoU2NhblBvc0ludmFsaWRhdGUoKnBvcyk7 CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJk KGRpcikpCisJCXsKKwkJCS8qIHJlYWQgYmxrbm8sIGJ1dCBjaGVjayBmb3IgaW50ZXJydXB0 cyBmaXJzdCAqLworCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwkJCXBvcy0+YnVmID0g X2J0X2dldGJ1ZihyZWwsIGJsa25vLCBCVF9SRUFEKTsKKwkJfQorCQllbHNlCisJCXsKKwkJ CS8qIHJlYWQgYmxrbm8sIGF2b2lkaW5nIHJhY2UgKGFsc28gY2hlY2tzIGZvciBpbnRlcnJ1 cHRzKSAqLworCQkJcG9zLT5idWYgPSBfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVmdChyZWws ICZibGtubywKKwkJCQkJCQkJCQkJCSAgbGFzdGN1cnJibGtubyk7CisJCQlpZiAocG9zLT5i dWYgPT0gSW52YWxpZEJ1ZmZlcikKKwkJCXsKKwkJCQkvKiBtdXN0IGhhdmUgYmVlbiBhIGNv bmN1cnJlbnQgZGVsZXRpb24gb2YgbGVmdG1vc3QgcGFnZSAqLworCQkJCUJUQmF0Y2hTY2Fu UG9zSW52YWxpZGF0ZSgqcG9zKTsKKwkJCQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKKwkJ CQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKHBv cy0+YnVmKTsKKwkJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBhZ2UpOworCQlsYXN0Y3Vy cmJsa25vID0gYmxrbm87CisJCWlmIChsaWtlbHkoIVBfSUdOT1JFKG9wYXF1ZSkpKQorCQl7 CisJCQkvKiBzZWUgaWYgdGhlcmUgYXJlIGFueSBtYXRjaGVzIG9uIHRoaXMgcGFnZSAqLwor CQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCXsKKwkJCQkvKiBub3Rl IHRoYXQgdGhpcyB3aWxsIGNsZWFyIG1vcmVSaWdodCBpZiB3ZSBjYW4gc3RvcCAqLworCQkJ CWlmICgobmV3YmF0Y2ggPSBfYnRfcmVhZHBhZ2VfYmF0Y2goc2NhbiwgcG9zLCBkaXIsIFBf RklSU1REQVRBS0VZKG9wYXF1ZSksIGZhbHNlKSkgIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJ CQkJYmxrbm8gPSBwb3MtPm5leHRQYWdlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8q IG5vdGUgdGhhdCB0aGlzIHdpbGwgY2xlYXIgbW9yZUxlZnQgaWYgd2UgY2FuIHN0b3AgKi8K KwkJCQlpZiAoKG5ld2JhdGNoID0gX2J0X3JlYWRwYWdlX2JhdGNoKHNjYW4sIHBvcywgZGly LCBQYWdlR2V0TWF4T2Zmc2V0TnVtYmVyKHBhZ2UpLCBmYWxzZSkpICE9IE5VTEwpCisJCQkJ CWJyZWFrOworCQkJCWJsa25vID0gcG9zLT5wcmV2UGFnZTsKKwkJCX0KKwkJfQorCQllbHNl CisJCXsKKwkJCS8qIF9idF9yZWFkcGFnZSBub3QgY2FsbGVkLCBzbyBkbyBhbGwgdGhpcyBm b3Igb3Vyc2VsdmVzICovCisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQor CQkJCWJsa25vID0gb3BhcXVlLT5idHBvX25leHQ7CisJCQllbHNlCisJCQkJYmxrbm8gPSBv cGFxdWUtPmJ0cG9fcHJldjsKKwkJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwp CisJCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgYmxrbm8sIGxhc3RjdXJyYmxrbm8p OworCQl9CisKKwkJLyogbm8gbWF0Y2hpbmcgdHVwbGVzIG9uIHRoaXMgcGFnZSAqLworCQlf YnRfcmVsYnVmKHJlbCwgcG9zLT5idWYpOworCQlzZWl6ZWQgPSBmYWxzZTsJCQkvKiByZWxl YXNlZCBieSBfYnRfcmVhZHBhZ2UgKG9yIGJ5IHVzKSAqLworCX0KKworCS8qICovCisJQXNz ZXJ0KG5ld2JhdGNoICE9IE5VTEwpOworCisJcG9zID0gKEJUQmF0Y2hTY2FuUG9zKSBuZXdi YXRjaC0+b3BhcXVlOworCisJLyoKKwkgKiBfYnRfcmVhZHBhZ2Ugc3VjY2VlZGVkLiAgRHJv cCB0aGUgbG9jayAoYW5kIG1heWJlIHRoZSBwaW4pIG9uCisJICogc28tPmN1cnJQb3MuYnVm IGluIHByZXBhcmF0aW9uIGZvciBidGdldHR1cGxlIHJldHVybmluZyB0dXBsZXMuCisJICov CisJQXNzZXJ0KHBvcy0+Y3VyclBhZ2UgPT0gYmxrbm8pOworCUFzc2VydChCVEJhdGNoU2Nh blBvc0lzUGlubmVkKCpwb3MpKTsKKwkvKiBfYnRfZHJvcF9sb2NrX2FuZF9tYXliZV9waW5f YmF0Y2goc2NhbiwgcG9zKTsgKi8KKwlfYnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRp b24sIHBvcy0+YnVmKTsKKworCXJldHVybiBuZXdiYXRjaDsKK30KKwogLyoKICAqIF9idF9s b2NrX2FuZF92YWxpZGF0ZV9sZWZ0KCkgLS0gbG9jayBjYWxsZXIncyBsZWZ0IHNpYmxpbmcg Ymxrbm8sCiAgKiByZWNvdmVyaW5nIGZyb20gY29uY3VycmVudCBwYWdlIHNwbGl0cy9wYWdl IGRlbGV0aW9ucyB3aGVuIG5lY2Vzc2FyeQpAQCAtMjY5MywzICs0MzExLDc5IEBAIF9idF9l bmRwb2ludChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCV9idF9y ZXR1cm5pdGVtKHNjYW4sIHNvKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KKworLyoKKyAqCV9idF9l bmRwb2ludCgpIC0tIEZpbmQgdGhlIGZpcnN0IG9yIGxhc3QgcGFnZSBpbiB0aGUgaW5kZXgs IGFuZCBzY2FuCisgKiBmcm9tIHRoZXJlIHRvIHRoZSBmaXJzdCBrZXkgc2F0aXNmeWluZyBh bGwgdGhlIHF1YWxzLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBfYnRfZmlyc3QoKSB0byBz ZXQgdXAgYSBzY2FuIHdoZW4gd2UndmUgZGV0ZXJtaW5lZAorICogdGhhdCB0aGUgc2NhbiBt dXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBpbmRleCAoZm9yCisg KiBhIGZvcndhcmQgb3IgYmFja3dhcmQgc2NhbiByZXNwZWN0aXZlbHkpLgorICoKKyAqIFBh cmFsbGVsIHNjYW4gY2FsbGVycyBtdXN0IGhhdmUgc2VpemVkIHRoZSBzY2FuIGJlZm9yZSBj YWxsaW5nIGhlcmUuCisgKiBFeGl0IGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBf YnRfZmlyc3QoKS4KKyAqLworc3RhdGljIEluZGV4U2NhbkJhdGNoCitfYnRfZW5kcG9pbnRf YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlSZWxh dGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOworCUJUU2Nhbk9wYXF1ZSBzbyBQR19V U0VEX0ZPUl9BU1NFUlRTX09OTFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJ UGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVlOworCU9mZnNldE51bWJlciBzdGFy dDsKKwlCVEJhdGNoU2NhblBvc0RhdGEgcG9zOworCisJQlRCYXRjaFNjYW5Qb3NJbnZhbGlk YXRlKHBvcyk7CisKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBz Y2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOwor CisJQXNzZXJ0KCFCVFNjYW5Qb3NJc1ZhbGlkKHNvLT5jdXJyUG9zKSk7CisJQXNzZXJ0KCFz by0+bmVlZFByaW1TY2FuKTsKKworCS8qCisJICogU2NhbiBkb3duIHRvIHRoZSBsZWZ0bW9z dCBvciByaWdodG1vc3QgbGVhZiBwYWdlLiAgVGhpcyBpcyBhIHNpbXBsaWZpZWQKKwkgKiB2 ZXJzaW9uIG9mIF9idF9zZWFyY2goKS4KKwkgKi8KKwlwb3MuYnVmID0gX2J0X2dldF9lbmRw b2ludChyZWwsIDAsIFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpOworCisJaWYgKCFC dWZmZXJJc1ZhbGlkKHBvcy5idWYpKQorCXsKKwkJLyoKKwkJICogRW1wdHkgaW5kZXguIExv Y2sgdGhlIHdob2xlIHJlbGF0aW9uLCBhcyBub3RoaW5nIGZpbmVyIHRvIGxvY2sKKwkJICog ZXhpc3RzLgorCQkgKi8KKwkJUHJlZGljYXRlTG9ja1JlbGF0aW9uKHJlbCwgc2Nhbi0+eHNf c25hcHNob3QpOworCQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKKwkJcmV0dXJuIGZhbHNl OworCX0KKworCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKHBvcy5idWYpOworCW9wYXF1ZSA9IEJU UGFnZUdldE9wYXF1ZShwYWdlKTsKKwlBc3NlcnQoUF9JU0xFQUYob3BhcXVlKSk7CisKKwlp ZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCXsKKwkJLyogVGhlcmUgY291bGQg YmUgZGVhZCBwYWdlcyB0byB0aGUgbGVmdCwgc28gbm90IHRoaXM6ICovCisJCS8qIEFzc2Vy dChQX0xFRlRNT1NUKG9wYXF1ZSkpOyAqLworCisJCXN0YXJ0ID0gUF9GSVJTVERBVEFLRVko b3BhcXVlKTsKKwl9CisJZWxzZSBpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkK Kwl7CisJCUFzc2VydChQX1JJR0hUTU9TVChvcGFxdWUpKTsKKworCQlzdGFydCA9IFBhZ2VH ZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7CisJfQorCWVsc2UKKwl7CisJCWVsb2coRVJST1Is ICJpbnZhbGlkIHNjYW4gZGlyZWN0aW9uOiAlZCIsIChpbnQpIGRpcik7CisJCXN0YXJ0ID0g MDsJCQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLworCX0KKworCS8qCisJICogTm93IGxv YWQgZGF0YSBmcm9tIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBzY2FuLgorCSAqLworCXJldHVy biBfYnRfcmVhZGZpcnN0cGFnZV9iYXRjaChzY2FuLCAmcG9zLCBzdGFydCwgZGlyKTsKK30K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwppbmRleCAxMTgwMmE0YzIxNS4u MTg3ZjZmYTU5MzQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0 dXRpbHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMKQEAg LTM0OTIsNiArMzQ5MiwxODUgQEAgX2J0X2tpbGxpdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4p CiAJX2J0X3VubG9ja2J1ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBzby0+Y3VyclBvcy5idWYp OwogfQogCisvKgorICogX2J0X2tpbGxpdGVtc19iYXRjaAorICoJCWEgdmFyaWFudCBvZiBf YnRfa2lsbGl0ZW1zLCB1c2luZyB0aGUgYmF0Y2gtbGV2ZWwga2lsbGVkSXRlbXMKKyAqLwor dm9pZAorX2J0X2tpbGxpdGVtc19iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoIGJhdGNoKQoreworCS8qIEJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUp IHNjYW4tPm9wYXF1ZTsgKi8KKwlCVEJhdGNoU2NhblBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Q b3MpIGJhdGNoLT5vcGFxdWU7CisJUGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVl OworCU9mZnNldE51bWJlciBtaW5vZmY7CisJT2Zmc2V0TnVtYmVyIG1heG9mZjsKKwlpbnQJ CQlpOworCWludAkJCW51bUtpbGxlZCA9IGJhdGNoLT5udW1LaWxsZWQ7CisJYm9vbAkJa2ls bGVkc29tZXRoaW5nID0gZmFsc2U7CisJYm9vbAkJZHJvcHBlZHBpbiBQR19VU0VEX0ZPUl9B U1NFUlRTX09OTFk7CisKKwlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJc1ZhbGlkKCpwb3MpKTsK KworCS8qCisJICogQWx3YXlzIHJlc2V0IHRoZSBzY2FuIHN0YXRlLCBzbyB3ZSBkb24ndCBs b29rIGZvciBzYW1lIGl0ZW1zIG9uIG90aGVyCisJICogcGFnZXMuCisJICovCisJYmF0Y2gt Pm51bUtpbGxlZCA9IDA7CisKKwlpZiAoQlRCYXRjaFNjYW5Qb3NJc1Bpbm5lZCgqcG9zKSkK Kwl7CisJCS8qCisJCSAqIFdlIGhhdmUgaGVsZCB0aGUgcGluIG9uIHRoaXMgcGFnZSBzaW5j ZSB3ZSByZWFkIHRoZSBpbmRleCB0dXBsZXMsCisJCSAqIHNvIGFsbCB3ZSBuZWVkIHRvIGRv IGlzIGxvY2sgaXQuICBUaGUgcGluIHdpbGwgaGF2ZSBwcmV2ZW50ZWQKKwkJICogcmUtdXNl IG9mIGFueSBUSUQgb24gdGhlIHBhZ2UsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sg dGhlCisJCSAqIExTTi4KKwkJICovCisJCWRyb3BwZWRwaW4gPSBmYWxzZTsKKwkJX2J0X2xv Y2tidWYoc2Nhbi0+aW5kZXhSZWxhdGlvbiwgcG9zLT5idWYsIEJUX1JFQUQpOworCisJCXBh Z2UgPSBCdWZmZXJHZXRQYWdlKHBvcy0+YnVmKTsKKwl9CisJZWxzZQorCXsKKwkJQnVmZmVy CQlidWY7CisKKwkJZHJvcHBlZHBpbiA9IHRydWU7CisJCS8qIEF0dGVtcHQgdG8gcmUtcmVh ZCB0aGUgYnVmZmVyLCBnZXR0aW5nIHBpbiBhbmQgbG9jay4gKi8KKwkJYnVmID0gX2J0X2dl dGJ1ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBwb3MtPmN1cnJQYWdlLCBCVF9SRUFEKTsKKwor CQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOworCQlpZiAoQnVmZmVyR2V0TFNOQXRvbWlj KGJ1ZikgPT0gcG9zLT5sc24pCisJCQlwb3MtPmJ1ZiA9IGJ1ZjsKKwkJZWxzZQorCQl7CisJ CQkvKiBNb2RpZmllZCB3aGlsZSBub3QgcGlubmVkIG1lYW5zIGhpbnRpbmcgaXMgbm90IHNh ZmUuICovCisJCQlfYnRfcmVsYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIGJ1Zik7CisJCQly ZXR1cm47CisJCX0KKwl9CisKKwlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUocGFnZSk7CisJ bWlub2ZmID0gUF9GSVJTVERBVEFLRVkob3BhcXVlKTsKKwltYXhvZmYgPSBQYWdlR2V0TWF4 T2Zmc2V0TnVtYmVyKHBhZ2UpOworCisJZm9yIChpID0gMDsgaSA8IG51bUtpbGxlZDsgaSsr KQorCXsKKwkJaW50CQkJaXRlbUluZGV4ID0gYmF0Y2gtPmtpbGxlZEl0ZW1zW2ldOworCQlJ bmRleFNjYW5CYXRjaFBvc0l0ZW0gKmtpdGVtID0gJmJhdGNoLT5pdGVtc1tpdGVtSW5kZXhd OworCQlPZmZzZXROdW1iZXIgb2ZmbnVtID0ga2l0ZW0tPmluZGV4T2Zmc2V0OworCisJCUFz c2VydChpdGVtSW5kZXggPj0gYmF0Y2gtPmZpcnN0SXRlbSAmJgorCQkJICAgaXRlbUluZGV4 IDw9IGJhdGNoLT5sYXN0SXRlbSk7CisJCWlmIChvZmZudW0gPCBtaW5vZmYpCisJCQljb250 aW51ZTsJCQkvKiBwdXJlIHBhcmFub2lhICovCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2Zm KQorCQl7CisJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsK KwkJCUluZGV4VHVwbGUJaXR1cGxlID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2Us IGlpZCk7CisJCQlib29sCQlraWxsdHVwbGUgPSBmYWxzZTsKKworCQkJaWYgKEJUcmVlVHVw bGVJc1Bvc3RpbmcoaXR1cGxlKSkKKwkJCXsKKwkJCQlpbnQJCQlwaSA9IGkgKyAxOworCQkJ CWludAkJCW5wb3N0aW5nID0gQlRyZWVUdXBsZUdldE5Qb3N0aW5nKGl0dXBsZSk7CisJCQkJ aW50CQkJajsKKworCQkJCS8qCisJCQkJICogV2UgcmVseSBvbiB0aGUgY29udmVudGlvbiB0 aGF0IGhlYXAgVElEcyBpbiB0aGUgc2NhbnBvcworCQkJCSAqIGl0ZW1zIGFycmF5IGFyZSBz dG9yZWQgaW4gYXNjZW5kaW5nIGhlYXAgVElEIG9yZGVyIGZvciBhCisJCQkJICogZ3JvdXAg b2YgVElEcyB0aGF0IG9yaWdpbmFsbHkgY2FtZSBmcm9tIGEgcG9zdGluZyBsaXN0CisJCQkJ ICogdHVwbGUuICBUaGlzIGNvbnZlbnRpb24gZXZlbiBhcHBsaWVzIGR1cmluZyBiYWNrd2Fy ZHMKKwkJCQkgKiBzY2Fucywgd2hlcmUgcmV0dXJuaW5nIHRoZSBUSURzIGluIGRlc2NlbmRp bmcgb3JkZXIgbWlnaHQKKwkJCQkgKiBzZWVtIG1vcmUgbmF0dXJhbC4gIFRoaXMgaXMgYWJv dXQgZWZmZWN0aXZlbmVzcywgbm90CisJCQkJICogY29ycmVjdG5lc3MuCisJCQkJICoKKwkJ CQkgKiBOb3RlIHRoYXQgdGhlIHBhZ2UgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBpbiBhbG1v c3QgYW55IHdheQorCQkJCSAqIHNpbmNlIHdlIGZpcnN0IHJlYWQgaXQgKGluIHRoZSAhZHJv cHBlZHBpbiBjYXNlKSwgc28gaXQncworCQkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBwb3N0 aW5nIGxpc3QgdHVwbGUgd2Fzbid0IGEgcG9zdGluZyBsaXN0CisJCQkJICogdHVwbGUgd2hl biB3ZSBmaXJzdCBlbmNvdW50ZXJlZCBpdHMgaGVhcCBUSURzLgorCQkJCSAqLworCQkJCWZv ciAoaiA9IDA7IGogPCBucG9zdGluZzsgaisrKQorCQkJCXsKKwkJCQkJSXRlbVBvaW50ZXIg aXRlbSA9IEJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwbGUsIGopOworCisJCQkJCWlmICgh SXRlbVBvaW50ZXJFcXVhbHMoaXRlbSwgJmtpdGVtLT5oZWFwVGlkKSkKKwkJCQkJCWJyZWFr OwkvKiBvdXQgb2YgcG9zdGluZyBsaXN0IGxvb3AgKi8KKworCQkJCQkvKgorCQkJCQkgKiBr aXRlbSBtdXN0IGhhdmUgbWF0Y2hpbmcgb2ZmbnVtIHdoZW4gaGVhcCBUSURzIG1hdGNoLAor CQkJCQkgKiB0aG91Z2ggb25seSBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhlIHBhZ2Ug Y2FuJ3QKKwkJCQkJICogaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBtb2RpZmllZAorCQkJCQkg Ki8KKwkJCQkJQXNzZXJ0KGtpdGVtLT5pbmRleE9mZnNldCA9PSBvZmZudW0gfHwgIWRyb3Bw ZWRwaW4pOworCisJCQkJCS8qCisJCQkJCSAqIFJlYWQtYWhlYWQgdG8gbGF0ZXIga2l0ZW1z IGhlcmUuCisJCQkJCSAqCisJCQkJCSAqIFdlIHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhh dCBub3QgYWR2YW5jaW5nIGtpdGVtIGhlcmUKKwkJCQkJICogd2lsbCBwcmV2ZW50IHVzIGZy b20gY29uc2lkZXJpbmcgdGhlIHBvc3RpbmcgbGlzdCB0dXBsZQorCQkJCQkgKiBmdWxseSBk ZWFkIGJ5IG5vdCBtYXRjaGluZyBpdHMgbmV4dCBoZWFwIFRJRCBpbiBuZXh0CisJCQkJCSAq IGxvb3AgaXRlcmF0aW9uLgorCQkJCQkgKgorCQkJCQkgKiBJZiwgb24gdGhlIG90aGVyIGhh bmQsIHRoaXMgaXMgdGhlIGZpbmFsIGhlYXAgVElEIGluCisJCQkJCSAqIHRoZSBwb3N0aW5n IGxpc3QgdHVwbGUsIHRoZW4gdHVwbGUgZ2V0cyBraWxsZWQKKwkJCQkJICogcmVnYXJkbGVz cyAoaS5lLiB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGxhc3QKKwkJCQkJICoga2l0 ZW0gaXMgYWxzbyB0aGUgbGFzdCBoZWFwIFRJRCBpbiB0aGUgbGFzdCBpbmRleCB0dXBsZQor CQkJCQkgKiBjb3JyZWN0bHkgLS0gcG9zdGluZyB0dXBsZSBzdGlsbCBnZXRzIGtpbGxlZCku CisJCQkJCSAqLworCQkJCQlpZiAocGkgPCBudW1LaWxsZWQpCisJCQkJCQlraXRlbSA9ICZi YXRjaC0+aXRlbXNbYmF0Y2gtPmtpbGxlZEl0ZW1zW3BpKytdXTsKKwkJCQl9CisKKwkJCQkv KgorCQkJCSAqIERvbid0IGJvdGhlciBhZHZhbmNpbmcgdGhlIG91dGVybW9zdCBsb29wJ3Mg aW50IGl0ZXJhdG9yIHRvCisJCQkJICogYXZvaWQgcHJvY2Vzc2luZyBraWxsZWQgaXRlbXMg dGhhdCByZWxhdGUgdG8gdGhlIHNhbWUKKwkJCQkgKiBvZmZudW0vcG9zdGluZyBsaXN0IHR1 cGxlLiAgVGhpcyBtaWNyby1vcHRpbWl6YXRpb24gaGFyZGx5CisJCQkJICogc2VlbXMgd29y dGggaXQuICAoRnVydGhlciBpdGVyYXRpb25zIG9mIHRoZSBvdXRlcm1vc3QgbG9vcAorCQkJ CSAqIHdpbGwgZmFpbCB0byBtYXRjaCBvbiB0aGlzIHNhbWUgcG9zdGluZyBsaXN0J3MgZmly c3QgaGVhcAorCQkJCSAqIFRJRCBpbnN0ZWFkLCBzbyB3ZSdsbCBhZHZhbmNlIHRvIHRoZSBu ZXh0IG9mZm51bS9pbmRleAorCQkJCSAqIHR1cGxlIHByZXR0eSBxdWlja2x5LikKKwkJCQkg Ki8KKwkJCQlpZiAoaiA9PSBucG9zdGluZykKKwkJCQkJa2lsbHR1cGxlID0gdHJ1ZTsKKwkJ CX0KKwkJCWVsc2UgaWYgKEl0ZW1Qb2ludGVyRXF1YWxzKCZpdHVwbGUtPnRfdGlkLCAma2l0 ZW0tPmhlYXBUaWQpKQorCQkJCWtpbGx0dXBsZSA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBN YXJrIGluZGV4IGl0ZW0gYXMgZGVhZCwgaWYgaXQgaXNuJ3QgYWxyZWFkeS4gIFNpbmNlIHRo aXMKKwkJCSAqIGhhcHBlbnMgd2hpbGUgaG9sZGluZyBhIGJ1ZmZlciBsb2NrIHBvc3NpYmx5 IGluIHNoYXJlZCBtb2RlLAorCQkJICogaXQncyBwb3NzaWJsZSB0aGF0IG11bHRpcGxlIHBy b2Nlc3NlcyBhdHRlbXB0IHRvIGRvIHRoaXMKKwkJCSAqIHNpbXVsdGFuZW91c2x5LCBsZWFk aW5nIHRvIG11bHRpcGxlIGZ1bGwtcGFnZSBpbWFnZXMgYmVpbmcgc2VudAorCQkJICogdG8g V0FMIChpZiB3YWxfbG9nX2hpbnRzIG9yIGRhdGEgY2hlY2tzdW1zIGFyZSBlbmFibGVkKSwg d2hpY2gKKwkJCSAqIGlzIHVuZGVzaXJhYmxlLgorCQkJICovCisJCQlpZiAoa2lsbHR1cGxl ICYmICFJdGVtSWRJc0RlYWQoaWlkKSkKKwkJCXsKKwkJCQkvKiBmb3VuZCB0aGUgaXRlbS9h bGwgcG9zdGluZyBsaXN0IGl0ZW1zICovCisJCQkJSXRlbUlkTWFya0RlYWQoaWlkKTsKKwkJ CQlraWxsZWRzb21ldGhpbmcgPSB0cnVlOworCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5l ciBzZWFyY2ggbG9vcCAqLworCQkJfQorCQkJb2ZmbnVtID0gT2Zmc2V0TnVtYmVyTmV4dChv ZmZudW0pOworCQl9CisJfQorCisJLyoKKwkgKiBTaW5jZSB0aGlzIGNhbiBiZSByZWRvbmUg bGF0ZXIgaWYgbmVlZGVkLCBtYXJrIGFzIGRpcnR5IGhpbnQuCisJICoKKwkgKiBXaGVuZXZl ciB3ZSBtYXJrIGFueXRoaW5nIExQX0RFQUQsIHdlIGFsc28gc2V0IHRoZSBwYWdlJ3MKKwkg KiBCVFBfSEFTX0dBUkJBR0UgZmxhZywgd2hpY2ggaXMgbGlrZXdpc2UganVzdCBhIGhpbnQu ICAoTm90ZSB0aGF0IHdlCisJICogb25seSByZWx5IG9uIHRoZSBwYWdlLWxldmVsIGZsYWcg aW4gIWhlYXBrZXlzcGFjZSBpbmRleGVzLikKKwkgKi8KKwlpZiAoa2lsbGVkc29tZXRoaW5n KQorCXsKKwkJb3BhcXVlLT5idHBvX2ZsYWdzIHw9IEJUUF9IQVNfR0FSQkFHRTsKKwkJTWFy a0J1ZmZlckRpcnR5SGludChwb3MtPmJ1ZiwgdHJ1ZSk7CisJfQorCisJX2J0X3VubG9ja2J1 ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBwb3MtPmJ1Zik7Cit9CiAKIC8qCiAgKiBUaGUgZm9s bG93aW5nIHJvdXRpbmVzIG1hbmFnZSBhIHNoYXJlZC1tZW1vcnkgYXJlYSBpbiB3aGljaCB3 ZSB0cmFjawpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oIGIvc3Jj L2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCmluZGV4IGViY2EwMjU4OGQzLi5hMDBhMTEwOGJh NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCisrKyBiL3NyYy9p bmNsdWRlL2FjY2Vzcy9uYnRyZWUuaApAQCAtMTAwMSw2ICsxMDAxLDM4IEBAIHR5cGVkZWYg c3RydWN0IEJUU2NhblBvc0RhdGEKIAogdHlwZWRlZiBCVFNjYW5Qb3NEYXRhICpCVFNjYW5Q b3M7CiAKKy8qCisgKiBNaW5pbWFsIEFNLXNwZWNpZmljIGNvbmNlcHQgb2YgInBvc2l0aW9u IiBmb3IgYmF0Y2hpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IEJUQmF0Y2hTY2FuUG9zRGF0 YQoreworCUJ1ZmZlcgkJYnVmOwkJCS8qIGN1cnJQYWdlIGJ1ZiAoaW52YWxpZCBtZWFucyB1 bnBpbm5lZCkgKi8KKworCS8qIHBhZ2UgZGV0YWlscyBhcyBvZiB0aGUgc2F2ZWQgcG9zaXRp b24ncyBjYWxsIHRvIF9idF9yZWFkcGFnZSAqLworCUJsb2NrTnVtYmVyIGN1cnJQYWdlOwkJ LyogcGFnZSByZWZlcmVuY2VkIGJ5IGl0ZW1zIGFycmF5ICovCisJQmxvY2tOdW1iZXIgcHJl dlBhZ2U7CQkvKiBjdXJyUGFnZSdzIGxlZnQgbGluayAqLworCUJsb2NrTnVtYmVyIG5leHRQ YWdlOwkJLyogY3VyclBhZ2UncyByaWdodCBsaW5rICovCisJWExvZ1JlY1B0cglsc247CQkJ LyogY3VyclBhZ2UncyBMU04gKi8KKworCS8qIHNjYW4gZGlyZWN0aW9uIGZvciB0aGUgc2F2 ZWQgcG9zaXRpb24ncyBjYWxsIHRvIF9idF9yZWFkcGFnZSAqLworCVNjYW5EaXJlY3Rpb24g ZGlyOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgYW4gaW5kZXgtb25seSBzY2FuLCBu ZXh0VHVwbGVPZmZzZXQgaXMgdGhlIGZpcnN0IGZyZWUKKwkgKiBsb2NhdGlvbiBpbiB0aGUg YXNzb2NpYXRlZCB0dXBsZSBzdG9yYWdlIHdvcmtzcGFjZS4KKwkgKi8KKwlpbnQJCQluZXh0 VHVwbGVPZmZzZXQ7CisKKwkvKgorCSAqIG1vcmVMZWZ0IGFuZCBtb3JlUmlnaHQgdHJhY2sg d2hldGhlciB3ZSB0aGluayB0aGVyZSBtYXkgYmUgbWF0Y2hpbmcKKwkgKiBpbmRleCBlbnRy aWVzIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBvZiB0aGUgY3VycmVudCBwYWdlLCByZXNwZWN0 aXZlbHkuCisJICovCisJYm9vbAkJbW9yZUxlZnQ7CisJYm9vbAkJbW9yZVJpZ2h0OworfSBC VEJhdGNoU2NhblBvc0RhdGE7CisKK3R5cGVkZWYgQlRCYXRjaFNjYW5Qb3NEYXRhICpCVEJh dGNoU2NhblBvczsKKwogI2RlZmluZSBCVFNjYW5Qb3NJc1Bpbm5lZChzY2FucG9zKSBcCiAo IFwKIAlBc3NlcnRNYWNybyhCbG9ja051bWJlcklzVmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdl KSB8fCBcCkBAIC0xMDE3LDcgKzEwNDksNiBAQCB0eXBlZGVmIEJUU2NhblBvc0RhdGEgKkJU U2NhblBvczsKIAkJaWYgKEJUU2NhblBvc0lzUGlubmVkKHNjYW5wb3MpKSBcCiAJCQlCVFNj YW5Qb3NVbnBpbihzY2FucG9zKTsgXAogCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgQlRTY2Fu UG9zSXNWYWxpZChzY2FucG9zKSBcCiAoIFwKIAlBc3NlcnRNYWNybyhCbG9ja051bWJlcklz VmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdlKSB8fCBcCkBAIC0xMDMwLDYgKzEwNjEsMzUgQEAg dHlwZWRlZiBCVFNjYW5Qb3NEYXRhICpCVFNjYW5Qb3M7CiAJCShzY2FucG9zKS5jdXJyUGFn ZSA9IEludmFsaWRCbG9ja051bWJlcjsgXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgQlRC YXRjaFNjYW5Qb3NJc1Bpbm5lZChzY2FucG9zKSBcCisoIFwKKwlBc3NlcnRNYWNybyhCbG9j a051bWJlcklzVmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdlKSB8fCBcCisJCQkJIUJ1ZmZlcklz VmFsaWQoKHNjYW5wb3MpLmJ1ZikpLCBcCisJQnVmZmVySXNWYWxpZCgoc2NhbnBvcykuYnVm KSBcCispCisjZGVmaW5lIEJUQmF0Y2hTY2FuUG9zVW5waW4oc2NhbnBvcykgXAorCWRvIHsg XAorCQlSZWxlYXNlQnVmZmVyKChzY2FucG9zKS5idWYpOyBcCisJCShzY2FucG9zKS5idWYg PSBJbnZhbGlkQnVmZmVyOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgQlRCYXRjaFNjYW5Q b3NVbnBpbklmUGlubmVkKHNjYW5wb3MpIFwKKwlkbyB7IFwKKwkJaWYgKEJUQmF0Y2hTY2Fu UG9zSXNQaW5uZWQoc2NhbnBvcykpIFwKKwkJCUJUQmF0Y2hTY2FuUG9zVW5waW4oc2NhbnBv cyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBCVEJhdGNoU2NhblBvc0lzVmFsaWQoc2Nh bnBvcykgXAorKCBcCisJQXNzZXJ0TWFjcm8oQmxvY2tOdW1iZXJJc1ZhbGlkKChzY2FucG9z KS5jdXJyUGFnZSkgfHwgXAorCQkJCSFCdWZmZXJJc1ZhbGlkKChzY2FucG9zKS5idWYpKSwg XAorCUJsb2NrTnVtYmVySXNWYWxpZCgoc2NhbnBvcykuY3VyclBhZ2UpIFwKKykKKyNkZWZp bmUgQlRCYXRjaFNjYW5Qb3NJbnZhbGlkYXRlKHNjYW5wb3MpIFwKKwlkbyB7IFwKKwkJKHNj YW5wb3MpLmJ1ZiA9IEludmFsaWRCdWZmZXI7IFwKKwkJKHNjYW5wb3MpLmN1cnJQYWdlID0g SW52YWxpZEJsb2NrTnVtYmVyOyBcCisJfSB3aGlsZSAoMCkKKworCiAvKiBXZSBuZWVkIG9u ZSBvZiB0aGVzZSBmb3IgZWFjaCBlcXVhbGl0eS10eXBlIFNLX1NFQVJDSEFSUkFZIHNjYW4g a2V5ICovCiB0eXBlZGVmIHN0cnVjdCBCVEFycmF5S2V5SW5mbwogewpAQCAtMTE5MSw2ICsx MjUxLDggQEAgZXh0ZXJuIEluZGV4U2NhbkRlc2MgYnRiZWdpbnNjYW4oUmVsYXRpb24gcmVs LCBpbnQgbmtleXMsIGludCBub3JkZXJieXMpOwogZXh0ZXJuIFNpemUgYnRlc3RpbWF0ZXBh cmFsbGVsc2NhbihSZWxhdGlvbiByZWwsIGludCBua2V5cywgaW50IG5vcmRlcmJ5cyk7CiBl eHRlcm4gdm9pZCBidGluaXRwYXJhbGxlbHNjYW4odm9pZCAqdGFyZ2V0KTsKIGV4dGVybiBi b29sIGJ0Z2V0dHVwbGUoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7 CitleHRlcm4gSW5kZXhTY2FuQmF0Y2ggYnRnZXRiYXRjaChJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiB2b2lkIGJ0ZnJlZWJhdGNoKEluZGV4U2Nh bkRlc2Mgc2NhbiwgSW5kZXhTY2FuQmF0Y2ggYmF0Y2gpOwogZXh0ZXJuIGludDY0IGJ0Z2V0 Yml0bWFwKEluZGV4U2NhbkRlc2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pOwogZXh0ZXJuIHZv aWQgYnRyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBu c2NhbmtleXMsCiAJCQkJCSBTY2FuS2V5IG9yZGVyYnlzLCBpbnQgbm9yZGVyYnlzKTsKQEAg LTEyMTUsNiArMTI3Nyw5IEBAIGV4dGVybiBTdHJhdGVneU51bWJlciBidHRyYW5zbGF0ZWNt cHR5cGUoQ29tcGFyZVR5cGUgY21wdHlwZSwgT2lkIG9wZmFtaWx5KTsKICAqLwogZXh0ZXJu IGJvb2wgX2J0X3BhcmFsbGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1i ZXIgKm5leHRfc2Nhbl9wYWdlLAogCQkJCQkJCSAgIEJsb2NrTnVtYmVyICpsYXN0X2N1cnJf cGFnZSwgYm9vbCBmaXJzdCk7CitleHRlcm4gYm9vbCBfYnRfcGFyYWxsZWxfc2VpemVfYmF0 Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBvcyBwb3MsCisJCQkJCQkJCQkg QmxvY2tOdW1iZXIgKm5leHRfc2Nhbl9wYWdlLAorCQkJCQkJCQkJIEJsb2NrTnVtYmVyICps YXN0X2N1cnJfcGFnZSwgYm9vbCBmaXJzdCk7CiBleHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxf cmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sCiAJCQkJCQkJCSBCbG9ja051bWJlciBuZXh0 X3NjYW5fcGFnZSwKIAkJCQkJCQkJIEJsb2NrTnVtYmVyIGN1cnJfcGFnZSk7CkBAIC0xMzA4 LDYgKzEzNzMsMTAgQEAgZXh0ZXJuIGJvb2wgX2J0X2ZpcnN0KEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIpOwogZXh0ZXJuIGJvb2wgX2J0X25leHQoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CiBleHRlcm4gQnVmZmVyIF9idF9nZXRf ZW5kcG9pbnQoUmVsYXRpb24gcmVsLCB1aW50MzIgbGV2ZWwsIGJvb2wgcmlnaHRtb3N0KTsK IAorZXh0ZXJuIEluZGV4U2NhbkJhdGNoIF9idF9maXJzdF9iYXRjaChJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiBJbmRleFNjYW5CYXRjaCBfYnRf bmV4dF9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywgU2Nh bkRpcmVjdGlvbiBkaXIpOworZXh0ZXJuIHZvaWQgX2J0X2tpbGxfYmF0Y2goSW5kZXhTY2Fu RGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCk7CisKIC8qCiAgKiBwcm90b3R5cGVz IGZvciBmdW5jdGlvbnMgaW4gbmJ0dXRpbHMuYwogICovCkBAIC0xMzI2LDYgKzEzOTUsNyBA QCBleHRlcm4gYm9vbCBfYnRfc2NhbmJlaGluZF9jaGVja2tleXMoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpciwKIAkJCQkJCQkJCSBJbmRleFR1cGxlIGZpbmFsdHVw KTsKIGV4dGVybiB2b2lkIF9idF9zZXRfc3RhcnRpa2V5KEluZGV4U2NhbkRlc2Mgc2Nhbiwg QlRSZWFkUGFnZVN0YXRlICpwc3RhdGUpOwogZXh0ZXJuIHZvaWQgX2J0X2tpbGxpdGVtcyhJ bmRleFNjYW5EZXNjIHNjYW4pOworZXh0ZXJuIHZvaWQgX2J0X2tpbGxpdGVtc19iYXRjaChJ bmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoIGJhdGNoKTsKIGV4dGVybiBCVEN5 Y2xlSWQgX2J0X3ZhY3V1bV9jeWNsZWlkKFJlbGF0aW9uIHJlbCk7CiBleHRlcm4gQlRDeWNs ZUlkIF9idF9zdGFydF92YWN1dW0oUmVsYXRpb24gcmVsKTsKIGV4dGVybiB2b2lkIF9idF9l bmRfdmFjdXVtKFJlbGF0aW9uIHJlbCk7CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0Cmlu ZGV4IDA2MGQ5NjRlMzk5Li4xZTU1NDhhYWNiOSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKQEAgLTE5NSw2ICsxOTUsOCBAQCBCT09MCiBCT09MRUFOCiBCT1gKIEJUQXJyYXlL ZXlJbmZvCitCVEJhdGNoSW5mbworQlRCYXRjaFNjYW5Qb3NEYXRhCiBCVEJ1aWxkU3RhdGUK IEJUQ2FsbGJhY2tTdGF0ZQogQlRDeWNsZUlkCi0tIAoyLjQ5LjAKCg== --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/x-patch; charset=UTF-8; name="v20250501-0003-WIP-Don-t-read-the-same-block-repeatedly.patch" Content-Disposition: attachment; filename*0="v20250501-0003-WIP-Don-t-read-the-same-block-repeatedly.patc"; filename*1="h" Content-Transfer-Encoding: base64 RnJvbSBlMmE5NGYxZjM4ZmI3MzI4OWE5ZDc3MDFhYjNhMmU1YmI1MzcwMzc0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogV2VkLCAxIEphbiAyMDI1IDIyOjEwOjM3ICswMTAwClN1YmplY3Q6IFtQQVRDSCB2 MjAyNTA1MDEgMy83XSBXSVA6IERvbid0IHJlYWQgdGhlIHNhbWUgYmxvY2sgcmVwZWF0ZWRs eQoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIHwgNTcg KysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5k ZXhhbS5jICAgICAgIHwgMTMgKysrKysrCiBzcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9i dWZtZ3IuYyAgICAgIHwgNDAgKysrKysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL2FjY2Vz cy9yZWxzY2FuLmggICAgICAgICAgICAgfCAgMiArCiBzcmMvaW5jbHVkZS9zdG9yYWdlL2J1 Zm1nci5oICAgICAgICAgICAgIHwgIDIgKwogNSBmaWxlcyBjaGFuZ2VkLCAxMTEgaW5zZXJ0 aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nl c3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVh cGFtX2hhbmRsZXIuYwppbmRleCBmNzlkOTdhOGM2NC4uMzI2ZDVmZWQ2ODEgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMKKysrIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYwpAQCAtMTM2LDYgKzEzNiw3 IEBAIGhlYXBhbV9pbmRleF9mZXRjaF90dXBsZShzdHJ1Y3QgSW5kZXhGZXRjaFRhYmxlRGF0 YSAqc2NhbiwKIAl7CiAJCS8qIFN3aXRjaCB0byBjb3JyZWN0IGJ1ZmZlciBpZiB3ZSBkb24n dCBoYXZlIGl0IGFscmVhZHkgKi8KIAkJQnVmZmVyCQlwcmV2X2J1ZiA9IGhzY2FuLT54c19j YnVmOworCQlib29sCQlyZWxlYXNlX3ByZXYgPSB0cnVlOwogCiAJCS8qCiAJCSAqIFJlYWQg dGhlIGJsb2NrIGZvciB0aGUgcmVxdWVzdGVkIFRJRC4gV2l0aCBhIHJlYWQgc3RyZWFtLCBz aW1wbHkKQEAgLTE1Nyw3ICsxNTgsNTYgQEAgaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxlKHN0 cnVjdCBJbmRleEZldGNoVGFibGVEYXRhICpzY2FuLAogCQkgKiBBUEkuCiAJCSAqLwogCQlp ZiAoc2Nhbi0+cnMpCi0JCQloc2Nhbi0+eHNfY2J1ZiA9IHJlYWRfc3RyZWFtX25leHRfYnVm ZmVyKHNjYW4tPnJzLCBOVUxMKTsKKwkJeworCQkJLyoKKwkJCSAqIElmIHdlJ3JlIHRyeWlu ZyB0byByZWFkIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSBsYXN0IHRpbWUsIGRvbid0CisJCQkg KiB0cnkgcmVhZGluZyBpdCBmcm9tIHRoZSBzdHJlYW0gYWdhaW4sIGJ1dCBqdXN0IHJldHVy biB0aGUgbGFzdAorCQkJICogYnVmZmVyLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBwcmV2 aW91cyBidWZmZXIgaXMgc3RpbGwgcGlubmVkCisJCQkgKiBhbmQgY29udGFpbnMgdGhlIGNv cnJlY3QgYmxvY2sgKGl0IG1pZ2h0IGhhdmUgYmVlbiB1bnBpbm5lZCwKKwkJCSAqIHVzZWQg Zm9yIGEgZGlmZmVyZW50IGJsb2NrLCBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwpLgorCQkJ ICoKKwkJCSAqIFRoZSBwbGFjZSBzY2hlZHVsaW5nIHRoZSBibG9ja3MgKGluZGV4X3NjYW5f c3RyZWFtX3JlYWRfbmV4dCkKKwkJCSAqIG5lZWRzIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGFu ZCBub3Qgc2NoZWR1bGUgdGhlIGJsb2NrcyBpZiBpdAorCQkJICogbWF0Y2hlcyB0aGUgcHJl dmlvdXMgb25lLiBPdGhlcndpc2UgdGhlIHN0cmVhbSB3aWxsIGdldCBvdXQgb2YKKwkJCSAq IHN5bmMsIGNhdXNpbmcgY29uZnVzaW9uLgorCQkJICoKKwkJCSAqIFRoaXMgaXMgd2hhdCBS ZWxlYXNlQW5kUmVhZEJ1ZmZlciBkb2VzIHRvbywgYnV0IGl0IGRvZXMgbm90CisJCQkgKiBo YXZlIGEgcXVldWUgb2YgcmVxdWVzdHMgc2NoZWR1bGVkIGZyb20gc29tZXdoZXJlIGVsc2Us IHNvIGl0CisJCQkgKiBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoYXQuCisJCQkg KgorCQkJICogWFhYIE1heWJlIHdlIHNob3VsZCByZW1lbWJlciB0aGUgYmxvY2sgaW4gSW5k ZXhGZXRjaFRhYmxlRGF0YSwKKwkJCSAqIHNvIHRoYXQgd2UgY2FuIG1ha2UgdGhlIGNoZWNr IGV2ZW4gY2hlYXBlciwgd2l0aG91dCBsb29raW5nIGF0CisJCQkgKiB0aGUgYnVmZmVyIGRl c2NyaXB0b3I/IEJ1dCB0aGF0IGFzc3VtZXMgdGhlIGJ1ZmZlciB3YXMgbm90CisJCQkgKiB1 bnBpbm5lZCAob3IgcmVwaW5uZWQpIGVsc2V3aGVyZSwgYmVmb3JlIHdlIGdvdCBiYWNrIGhl cmUuIEJ1dAorCQkJICogY2FuIHRoYXQgZXZlbiBoYXBwZW4/IElmIHllcywgSSBndWVzcyB3 ZSBzaG91bGRuJ3QgYmUgcmVsZWFzaW5nCisJCQkgKiB0aGUgcHJldiBidWZmZXIgYW55d2F5 LgorCQkJICoKKwkJCSAqIFhYWCBUaGlzIGhhcyB1bmRlc2lyZWQgaW1wYWN0IG9uIHByZWZl dGNoIGRpc3RhbmNlLiBUaGUgcmVhZAorCQkJICogc3RyZWFtIHNjaGVkdWxlcyByZWFkcyBm b3IgYSBjZXJ0YWluIG51bWJlciBvZiBmdXR1cmUgYmxvY2tzLAorCQkJICogYnV0IGlmIHdl IHNraXAgZHVwbGljYXRlIGJsb2NrcywgdGhlIHByZWZldGNoIGRpc3RhbmNlIG1heSBnZXQK KwkJCSAqIHVuZXhwZWN0ZWRseSBsYXJnZSAoZS5nLiBmb3IgY29ycmVsYXRlZCBpbmRleGVz LCB3aXRoIGxvbmcgcnVucworCQkJICogb2YgVElEcyBmcm9tIHRoZSBzYW1lIGhlYXAgcGFn ZSkuIFRoaXMgbWF5IHNwZW5kIGEgbG90IG9mIENQVQorCQkJICogdGltZSBpbiB0aGUgaW5k ZXhfc2Nhbl9zdHJlYW1fcmVhZF9uZXh0IGNhbGxiYWNrLCBidXQgbW9yZQorCQkJICogaW1w b3J0YW50bHkgaXQgbWF5IHJlcXVpcmUgcmVhZGluZyAoYW5kIGtlZXBpbmcpIGEgbG90IG9m IGxlYWYKKwkJCSAqIHBhZ2VzIGZyb20gdGhlIGluZGV4LgorCQkJICoKKwkJCSAqIFhYWCBX aGF0IGlmIHdlIHBpbm5lZCB0aGUgYnVmZmVyIHR3aWNlIChpbmNyZWFzZSB0aGUgcmVmY291 bnQpLAorCQkJICogc28gdGhhdCBpZiB0aGUgY2FsbGVyIHVucGlucyB0aGUgYnVmZmVyLCB3 ZSBzdGlsbCBrZWVwIHRoZQorCQkJICogc2Vjb25kIHBpbi4gV291bGRuJ3QgdGhhdCBtZWFu IHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlCisJCQkgKiBwb3NzaWJpbGl0eSBz b21lb25lIGxvYWRlZCBhbm90aGVyIHBhZ2UgaW50byB0aGUgYnVmZmVyPworCQkJICoKKwkJ CSAqIFhYWCBXZSBtaWdodCBhbHNvIGtlZXAgYSBsb25nZXIgaGlzdG9yeSBvZiByZWNlbnQg YmxvY2tzLCBub3QKKwkJCSAqIGp1c3QgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBvbmUu IEJ1dCB0aGF0IG1ha2VzIGl0IGhhcmRlciwKKwkJCSAqIGJlY2F1c2UgdGhlIHR3byBwbGFj ZXMgKHJlYWRfbmV4dCBjYWxsYmFjayBhbmQgaGVyZSkgbmVlZCB0bworCQkJICogaGF2ZSBh IHNsaWdodGx5IGRpZmZlcmVudCB2aWV3LgorCQkJICovCisJCQlpZiAoQnVmZmVyTWF0Y2hl cyhoc2Nhbi0+eHNfY2J1ZiwKKwkJCQkJCQkgIGhzY2FuLT54c19iYXNlLnJlbCwKKwkJCQkJ CQkgIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSkpCisJCQkJcmVsZWFzZV9wcmV2 ID0gZmFsc2U7CisJCQllbHNlCisJCQkJaHNjYW4tPnhzX2NidWYgPSByZWFkX3N0cmVhbV9u ZXh0X2J1ZmZlcihzY2FuLT5ycywgTlVMTCk7CisJCX0KIAkJZWxzZQogCQkJaHNjYW4tPnhz X2NidWYgPSBSZWxlYXNlQW5kUmVhZEJ1ZmZlcihoc2Nhbi0+eHNfY2J1ZiwKIAkJCQkJCQkJ CQkJCSAgaHNjYW4tPnhzX2Jhc2UucmVsLApAQCAtMTgxLDcgKzIzMSw4IEBAIGhlYXBhbV9p bmRleF9mZXRjaF90dXBsZShzdHJ1Y3QgSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbiwKIAkJ CWhlYXBfcGFnZV9wcnVuZV9vcHQoaHNjYW4tPnhzX2Jhc2UucmVsLCBoc2Nhbi0+eHNfY2J1 Zik7CiAKIAkJLyoKLQkJICogV2hlbiB1c2luZyB0aGUgcmVhZCBzdHJlYW0sIHJlbGVhc2Ug dGhlIG9sZCBidWZmZXIuCisJCSAqIFdoZW4gdXNpbmcgdGhlIHJlYWQgc3RyZWFtLCByZWxl YXNlIHRoZSBvbGQgYnVmZmVyIC0gYnV0IG9ubHkgaWYKKwkJICogd2UncmUgcmVhZGluZyBh IGRpZmZlcmVudCBibG9jay4KIAkJICoKIAkJICogWFhYIE5vdCBzdXJlIHRoaXMgaXMgcmVh bGx5IG5lZWRlZCwgb3IgbWF5YmUgdGhpcyBpcyBub3QgdGhlIHJpZ2h0CiAJCSAqIHBsYWNl IHRvIGRvIHRoaXMsIGFuZCBidWZmZXJzIHNob3VsZCBiZSByZWxlYXNlZCBlbHNld2hlcmUu IFRoZQpAQCAtMTk5LDcgKzI1MCw3IEBAIGhlYXBhbV9pbmRleF9mZXRjaF90dXBsZShzdHJ1 Y3QgSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbiwKIAkJICogWFhYIERvZXMgdGhpcyBkbyB0 aGUgcmlnaHQgdGhpbmcgd2hlbiByZWFkaW5nIHRoZSBzYW1lIHBhZ2U/IFRoYXQKIAkJICog c2hvdWxkIHJldHVybiB0aGUgc2FtZSBidWZmZXIsIHNvIHdvbid0IHdlIHJlbGVhc2UgaXQg cHJlbWF0dXJlbHk/CiAJCSAqLwotCQlpZiAoc2Nhbi0+cnMgJiYgKHByZXZfYnVmICE9IElu dmFsaWRCdWZmZXIpKQorCQlpZiAoc2Nhbi0+cnMgJiYgKHByZXZfYnVmICE9IEludmFsaWRC dWZmZXIpICYmIHJlbGVhc2VfcHJldikKIAkJewogCQkJUmVsZWFzZUJ1ZmZlcihwcmV2X2J1 Zik7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFt LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCmluZGV4IGM1YmE4OTQ5 OWYxLi5mMGZkYTZkNzYxYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4 L2luZGV4YW0uYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCkBA IC0xOTE1LDYgKzE5MTUsMTUgQEAgaW5kZXhfc2Nhbl9zdHJlYW1fcmVhZF9uZXh0KFJlYWRT dHJlYW0gKnN0cmVhbSwKIAkJCQljb250aW51ZTsKIAkJCX0KIAorCQkJLyogc2FtZSBibG9j ayBhcyBiZWZvcmUsIGRvbid0IG5lZWQgdG8gcmVhZCBpdCAqLworCQkJaWYgKHNjYW4tPnhz X2JhdGNoZXMtPmxhc3RCbG9jayA9PSBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCkp CisJCQl7CisJCQkJREVCVUdfTE9HKCJpbmRleF9zY2FuX3N0cmVhbV9yZWFkX25leHQ6IHNr aXAgYmxvY2sgKGxhc3RCbG9jaykiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc2Nh bi0+eHNfYmF0Y2hlcy0+bGFzdEJsb2NrID0gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0 aWQpOworCiAJCQlyZXR1cm4gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpOwogCQl9 CiAKQEAgLTIxMTgsNiArMjEyNyw3IEBAIGluZGV4X2JhdGNoX2dldG5leHRfdGlkKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pCiAJCSAqLwogCQlzY2Fu LT54c19iYXRjaGVzLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CiAJCXNjYW4tPnhzX2JhdGNo ZXMtPmZpbmlzaGVkID0gZmFsc2U7CisJCXNjYW4tPnhzX2JhdGNoZXMtPmxhc3RCbG9jayA9 IEludmFsaWRCbG9ja051bWJlcjsKIAogCQlpbmRleF9iYXRjaF9wb3NfcmVzZXQoc2Nhbiwg JnNjYW4tPnhzX2JhdGNoZXMtPnN0cmVhbVBvcyk7CiAJCXJlYWRfc3RyZWFtX3Jlc2V0KHNj YW4tPnhzX2hlYXBmZXRjaC0+cnMpOwpAQCAtMjIzMiw2ICsyMjQyLDcgQEAgaW5kZXhfYmF0 Y2hfZ2V0bmV4dF90aWQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcmVj dGlvbikKIAkJCQkJICBzY2FuLT54c19iYXRjaGVzLT5yZWFkUG9zLmJhdGNoLCBzY2FuLT54 c19iYXRjaGVzLT5yZWFkUG9zLmluZGV4KTsKIAogCQkJc2Nhbi0+eHNfYmF0Y2hlcy0+cmVz ZXQgPSBmYWxzZTsKKwkJCXNjYW4tPnhzX2JhdGNoZXMtPmxhc3RCbG9jayA9IEludmFsaWRC bG9ja051bWJlcjsKIAogCQkJLyoKIAkJCSAqIE5lZWQgdG8gcmVzZXQgdGhlIHN0cmVhbSBw b3NpdGlvbiwgaXQgbWlnaHQgYmUgdG9vIGZhciBiZWhpbmQuCkBAIC0yMzExLDYgKzIzMjIs NyBAQCBpbmRleF9iYXRjaF9pbml0KEluZGV4U2NhbkRlc2Mgc2NhbikKIAlpbmRleF9iYXRj aF9wb3NfcmVzZXQoc2NhbiwgJnNjYW4tPnhzX2JhdGNoZXMtPm1hcmtQb3MpOwogCiAJLy8g c2Nhbi0+eHNfYmF0Y2hlcy0+Y3VycmVudEJhdGNoID0gTlVMTDsKKwlzY2FuLT54c19iYXRj aGVzLT5sYXN0QmxvY2sgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiB9CiAKIC8qCkBAIC0yMzkz LDYgKzI0MDUsNyBAQCBpbmRleF9iYXRjaF9yZXNldChJbmRleFNjYW5EZXNjIHNjYW4sIGJv b2wgY29tcGxldGUpCiAJYmF0Y2hlcy0+ZmluaXNoZWQgPSBmYWxzZTsKIAliYXRjaGVzLT5y ZXNldCA9IGZhbHNlOwogCS8vIGJhdGNoZXMtPmN1cnJlbnRCYXRjaCA9IE5VTEw7CisJYmF0 Y2hlcy0+bGFzdEJsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCiAJQXNzZXJ0Q2hlY2tC YXRjaGVzKHNjYW4pOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZm ZXIvYnVmbWdyLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwppbmRl eCAwYjMxN2QyZDgwOS4uMzVjMzUyNmUyNTAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVy L2J1Zm1nci5jCkBAIC0zMDQ1LDYgKzMwNDUsNDYgQEAgUmVsZWFzZUFuZFJlYWRCdWZmZXIo QnVmZmVyIGJ1ZmZlciwKIAlyZXR1cm4gUmVhZEJ1ZmZlcihyZWxhdGlvbiwgYmxvY2tOdW0p OwogfQogCisvKgorICogQnVmZmVyTWF0Y2hlcworICoJCUNoZWNrIGlmIHRoZSBidWZmZXIg KHN0aWxsKSBjb250YWlucyB0aGUgZXhwZWN0ZWQgcGFnZS4KKyAqCisgKiBDaGVjayBpZiB0 aGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBleHBlY3RlZCBwYWdlLiBUaGUgYnVmZmVyIG1heSBi ZSBpbnZhbGlkLAorICogb3IgdmFsaWQgYW5kIHBpbm5lZC4KKyAqLworYm9vbAorQnVmZmVy TWF0Y2hlcyhCdWZmZXIgYnVmZmVyLAorCQkJICBSZWxhdGlvbiByZWxhdGlvbiwKKwkJCSAg QmxvY2tOdW1iZXIgYmxvY2tOdW0pCit7CisJRm9ya051bWJlcglmb3JrTnVtID0gTUFJTl9G T1JLTlVNOworCUJ1ZmZlckRlc2MgKmJ1ZkhkcjsKKworCWlmIChCdWZmZXJJc1ZhbGlkKGJ1 ZmZlcikpCisJeworCQlBc3NlcnQoQnVmZmVySXNQaW5uZWQoYnVmZmVyKSk7CisJCWlmIChC dWZmZXJJc0xvY2FsKGJ1ZmZlcikpCisJCXsKKwkJCWJ1ZkhkciA9IEdldExvY2FsQnVmZmVy RGVzY3JpcHRvcigtYnVmZmVyIC0gMSk7CisJCQlpZiAoYnVmSGRyLT50YWcuYmxvY2tOdW0g PT0gYmxvY2tOdW0gJiYKKwkJCQlCdWZUYWdNYXRjaGVzUmVsRmlsZUxvY2F0b3IoJmJ1Zkhk ci0+dGFnLCAmcmVsYXRpb24tPnJkX2xvY2F0b3IpICYmCisJCQkJQnVmVGFnR2V0Rm9ya051 bSgmYnVmSGRyLT50YWcpID09IGZvcmtOdW0pCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJ ZWxzZQorCQl7CisJCQlidWZIZHIgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEp OworCQkJLyogd2UgaGF2ZSBwaW4sIHNvIGl0J3Mgb2sgdG8gZXhhbWluZSB0YWcgd2l0aG91 dCBzcGlubG9jayAqLworCQkJaWYgKGJ1Zkhkci0+dGFnLmJsb2NrTnVtID09IGJsb2NrTnVt ICYmCisJCQkJQnVmVGFnTWF0Y2hlc1JlbEZpbGVMb2NhdG9yKCZidWZIZHItPnRhZywgJnJl bGF0aW9uLT5yZF9sb2NhdG9yKSAmJgorCQkJCUJ1ZlRhZ0dldEZvcmtOdW0oJmJ1Zkhkci0+ dGFnKSA9PSBmb3JrTnVtKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcmV0dXJu IGZhbHNlOworfQorCiAvKgogICogUGluQnVmZmVyIC0tIG1ha2UgYnVmZmVyIHVuYXZhaWxh YmxlIGZvciByZXBsYWNlbWVudC4KICAqCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nl c3MvcmVsc2Nhbi5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaAppbmRleCBiNjNh Zjg0NWNhNi4uMmJiZDBkYjAyMjMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9y ZWxzY2FuLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaApAQCAtMjQyLDYg KzI0Miw4IEBAIHR5cGVkZWYgc3RydWN0IEluZGV4U2NhbkJhdGNoZXMKIAlib29sCQlmaW5p c2hlZDsKIAlib29sCQlyZXNldDsKIAorCUJsb2NrTnVtYmVyIGxhc3RCbG9jazsKKwogCS8q CiAJICogQ3VycmVudCBzY2FuIGRpcmVjdGlvbiwgZm9yIHRoZSBjdXJyZW50bHkgbG9hZGVk IGJhdGNoZXMuIFRoaXMgaXMgdXNlZAogCSAqIHRvIGxvYWQgZGF0YSBpbiB0aGUgcmVhZCBz dHJlYW0gQVBJIGNhbGxiYWNrLCBldGMuCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9y YWdlL2J1Zm1nci5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaAppbmRleCA0MWZk YzFlNzY5My4uM2I3ZDRlNmE2YTIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv YnVmbWdyLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaApAQCAtMjM3LDYg KzIzNyw4IEBAIGV4dGVybiB2b2lkIEluY3JCdWZmZXJSZWZDb3VudChCdWZmZXIgYnVmZmVy KTsKIGV4dGVybiB2b2lkIENoZWNrQnVmZmVySXNQaW5uZWRPbmNlKEJ1ZmZlciBidWZmZXIp OwogZXh0ZXJuIEJ1ZmZlciBSZWxlYXNlQW5kUmVhZEJ1ZmZlcihCdWZmZXIgYnVmZmVyLCBS ZWxhdGlvbiByZWxhdGlvbiwKIAkJCQkJCQkJICAgQmxvY2tOdW1iZXIgYmxvY2tOdW0pOwor ZXh0ZXJuIGJvb2wgQnVmZmVyTWF0Y2hlcyhCdWZmZXIgYnVmZmVyLCBSZWxhdGlvbiByZWxh dGlvbiwKKwkJCQkJCSAgQmxvY2tOdW1iZXIgYmxvY2tOdW0pOwogCiBleHRlcm4gQnVmZmVy IEV4dGVuZEJ1ZmZlcmVkUmVsKEJ1ZmZlck1hbmFnZXJSZWxhdGlvbiBibXIsCiAJCQkJCQkJ CUZvcmtOdW1iZXIgZm9ya051bSwKLS0gCjIuNDkuMAoK --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/x-patch; charset=UTF-8; name="v20250501-0004-fix-update-moreRight-moreLeft-in-btgetbatc.patch" Content-Disposition: attachment; filename*0="v20250501-0004-fix-update-moreRight-moreLeft-in-btgetbatc.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBjNWY1MjMyNTQxNGQ1NzAyMmY2NjUwMGMyOWZlMDkxZTRhMzljNzdiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogV2VkLCAyMyBBcHIgMjAyNSAyMjoyMTo1MSArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjUwNTAxIDQvN10gZml4OiB1cGRhdGUgbW9yZVJpZ2h0L21vcmVMZWZ0IGluIGJ0Z2V0 YmF0Y2gKCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyB8IDExICsr KysrKysrKysrCiAxIGZpbGUgY2hhbmdlZCwgMTEgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvbmJ0cmVlL25idHJlZS5jCmluZGV4IDQwNWM2MDFkM2ZmLi42ZWExZGZjYzUyYyAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYworKysgYi9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jCkBAIC0zMDgsNiArMzA4LDExIEBA IGJ0Z2V0YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAl7 CiAJCUluZGV4U2NhbkJhdGNoIGJhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2FuLCBzY2Fu LT54c19iYXRjaGVzLT5uZXh0QmF0Y2gtMSk7CiAJCXBvcyA9IChCVEJhdGNoU2NhblBvcykg YmF0Y2gtPm9wYXF1ZTsKKworCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChzY2FuLT54 c19iYXRjaGVzLT5kaXJlY3Rpb24pKQorCQkJcG9zLT5tb3JlUmlnaHQgPSB0cnVlOworCQll bHNlCisJCQlwb3MtPm1vcmVMZWZ0ID0gdHJ1ZTsKIAl9CiAKIAkvKiBFYWNoIGxvb3AgaXRl cmF0aW9uIHBlcmZvcm1zIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KQEAgLTMy Miw2ICszMjcsMTIgQEAgYnRnZXRiYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKQogCQkJcmVzID0gX2J0X2ZpcnN0X2JhdGNoKHNjYW4sIGRpcik7CiAJCWVs c2UKIAkJeworCQkJaWYgKHNvLT5udW1BcnJheUtleXMpCisJCQl7CisJCQkJX2J0X3N0YXJ0 X2FycmF5X2tleXMoc2Nhbiwgc28tPmN1cnJQb3MuZGlyKTsKKwkJCQlzby0+bmVlZFByaW1T Y2FuID0gZmFsc2U7CisJCQl9CisKIAkJCS8qCiAJCQkgKiBOb3cgY29udGludWUgdGhlIHNj YW4uCiAJCQkgKi8KLS0gCjIuNDkuMAoK --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: text/x-patch; charset=UTF-8; name="v20250501-0005-fix-mark-restore.patch" Content-Disposition: attachment; filename="v20250501-0005-fix-mark-restore.patch" Content-Transfer-Encoding: base64 RnJvbSAwMTFlNTQzOGFiYTQwMDg2MDg2NDczYTFiNDNlODE0NmMwMjlmNDJmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogVGh1LCAxIE1heSAyMDI1IDIzOjE3OjIwICswMjAwClN1YmplY3Q6IFtQQVRDSCB2 MjAyNTA1MDEgNS83XSBmaXg6IG1hcmsvcmVzdG9yZQoKY2FsbCBBTSBtYXJrL3Jlc3RvcmUg ZXZlbiB3aXRoIGJhdGNoaW5nLCBzbyB0aGF0IHRoZSBBTSBjYW4gc2V0IHNvbWUKZmllbGRz IChlLmcuIG1vcmVSaWdodC9tb3JlTGVmdCBpbiBuYnRyZWUpCi0tLQogc3JjL2JhY2tlbmQv YWNjZXNzL2luZGV4L2luZGV4YW0uYyB8IDE0ICsrKystLS0tLQogc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRyZWUuYyB8IDQ3ICsrKysrKysrKysrKysrKysrKysrKysrLS0tLS0t LQogMiBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCAxOSBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYwppbmRleCBmMGZkYTZkNzYxYy4uMjBk NGQ2NTQ4N2YgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFt LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYwpAQCAtNTE2LDEx ICs1MTYsOSBAQCBpbmRleF9tYXJrcG9zKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkgKiBXaXRo b3V0IGJhdGNoaW5nLCBqdXN0IHVzZSB0aGUgYW1tYXJrcG9zKCkgY2FsbGJhY2suIFdpdGgg YmF0Y2hpbmcKIAkgKiBldmVyeXRoaW5nIGlzIGhhbmRsZWQgYXQgdGhpcyBsYXllciwgd2l0 aG91dCBjYWxsaW5nIHRoZSBBTS4KIAkgKi8KLQlpZiAoc2Nhbi0+eHNfYmF0Y2hlcyA9PSBO VUxMKQotCXsKLQkJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtbWFya3Bvcyhz Y2FuKTsKLQl9Ci0JZWxzZQorCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbW1h cmtwb3Moc2Nhbik7CisKKwlpZiAoc2Nhbi0+eHNfYmF0Y2hlcyAhPSBOVUxMKQogCXsKIAkJ SW5kZXhTY2FuQmF0Y2hlcyAqYmF0Y2hlcyA9IHNjYW4tPnhzX2JhdGNoZXM7CiAJCUluZGV4 U2NhbkJhdGNoUG9zICpwb3MgPSAmYmF0Y2hlcy0+bWFya1BvczsKQEAgLTU4OCw5ICs1ODYs OSBAQCBpbmRleF9yZXN0cnBvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJICogV2l0aG91dCBi YXRjaGluZywganVzdCB1c2UgdGhlIGFtcmVzdHJwb3MoKSBjYWxsYmFjay4gV2l0aCBiYXRj aGluZwogCSAqIGV2ZXJ5dGhpbmcgaXMgaGFuZGxlZCBhdCB0aGlzIGxheWVyLCB3aXRob3V0 IGNhbGxpbmcgdGhlIEFNLgogCSAqLwotCWlmIChzY2FuLT54c19iYXRjaGVzID09IE5VTEwp Ci0JCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXJlc3RycG9zKHNjYW4pOwot CWVsc2UKKwlzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1yZXN0cnBvcyhzY2Fu KTsKKworCWlmIChzY2FuLT54c19iYXRjaGVzICE9IE5VTEwpCiAJewogCQlJbmRleFNjYW5C YXRjaGVzICpiYXRjaGVzID0gc2Nhbi0+eHNfYmF0Y2hlczsKIAkJSW5kZXhTY2FuQmF0Y2hQ b3MgKnBvcyA9ICZiYXRjaGVzLT5tYXJrUG9zOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv YWNjZXNzL25idHJlZS9uYnRyZWUuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0 cmVlLmMKaW5kZXggNmVhMWRmY2M1MmMuLjAxNDNkZjk5M2FhIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy9uYnRyZWUvbmJ0cmVlLmMKQEAgLTMwOSwxMCArMzA5LDEzIEBAIGJ0Z2V0YmF0Y2goSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkJSW5kZXhTY2FuQmF0Y2gg YmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIHNjYW4tPnhzX2JhdGNoZXMtPm5leHRC YXRjaC0xKTsKIAkJcG9zID0gKEJUQmF0Y2hTY2FuUG9zKSBiYXRjaC0+b3BhcXVlOwogCi0J CWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKHNjYW4tPnhzX2JhdGNoZXMtPmRpcmVjdGlv bikpCi0JCQlwb3MtPm1vcmVSaWdodCA9IHRydWU7Ci0JCWVsc2UKLQkJCXBvcy0+bW9yZUxl ZnQgPSB0cnVlOworCQlpZiAoc28tPm5lZWRQcmltU2NhbikKKwkJeworCQkJaWYgKFNjYW5E aXJlY3Rpb25Jc0ZvcndhcmQoc2Nhbi0+eHNfYmF0Y2hlcy0+ZGlyZWN0aW9uKSkKKwkJCQlw b3MtPm1vcmVSaWdodCA9IHRydWU7CisJCQllbHNlCisJCQkJcG9zLT5tb3JlTGVmdCA9IHRy dWU7CisJCX0KIAl9CiAKIAkvKiBFYWNoIGxvb3AgaXRlcmF0aW9uIHBlcmZvcm1zIGFub3Ro ZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KQEAgLTMyNywxMSArMzMwLDcgQEAgYnRnZXRi YXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCQkJcmVzID0g X2J0X2ZpcnN0X2JhdGNoKHNjYW4sIGRpcik7CiAJCWVsc2UKIAkJewotCQkJaWYgKHNvLT5u dW1BcnJheUtleXMpCi0JCQl7Ci0JCQkJX2J0X3N0YXJ0X2FycmF5X2tleXMoc2Nhbiwgc28t PmN1cnJQb3MuZGlyKTsKLQkJCQlzby0+bmVlZFByaW1TY2FuID0gZmFsc2U7Ci0JCQl9CisJ CQlzby0+bmVlZFByaW1TY2FuID0gZmFsc2U7CiAKIAkJCS8qCiAJCQkgKiBOb3cgY29udGlu dWUgdGhlIHNjYW4uCkBAIC02NTYsNyArNjU1LDIwIEBAIGJ0bWFya3BvcyhJbmRleFNjYW5E ZXNjIHNjYW4pCiAJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3Bh cXVlOwogCiAJLyogd2l0aCBiYXRjaGluZywgbWFyay9yZXN0b3JlIGlzIGhhbmRsZWQgaW4g aW5kZXhhbSAqLwotCUFzc2VydChzY2FuLT54c19iYXRjaGVzID09IE5VTEwpOworCWlmIChz Y2FuLT54c19iYXRjaGVzICE9IE5VTEwpCisJeworCQlJbmRleFNjYW5CYXRjaAliYXRjaCA9 IElOREVYX1NDQU5fQkFUQ0goc2Nhbiwgc2Nhbi0+eHNfYmF0Y2hlcy0+Zmlyc3RCYXRjaCk7 CisJCUJUQmF0Y2hTY2FuUG9zIHBvcyA9IE5VTEw7CisJCXBvcyA9IChCVEJhdGNoU2NhblBv cykgYmF0Y2gtPm9wYXF1ZTsKKwkJaWYgKHNvLT5uZWVkUHJpbVNjYW4pCisJCXsKKwkJCWlm IChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKHNjYW4tPnhzX2JhdGNoZXMtPmRpcmVjdGlvbikp CisJCQkJcG9zLT5tb3JlUmlnaHQgPSB0cnVlOworCQkJZWxzZQorCQkJCXBvcy0+bW9yZUxl ZnQgPSB0cnVlOworCQl9CisJCXJldHVybjsKKwl9CiAKIAkvKiBUaGVyZSBtYXkgYmUgYW4g b2xkIG1hcmsgd2l0aCBhIHBpbiAoYnV0IG5vIGxvY2spLiAqLwogCUJUU2NhblBvc1VucGlu SWZQaW5uZWQoc28tPm1hcmtQb3MpOwpAQCAtNjg4LDcgKzcwMCwyMCBAQCBidHJlc3RycG9z KEluZGV4U2NhbkRlc2Mgc2NhbikKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVl KSBzY2FuLT5vcGFxdWU7CiAKIAkvKiB3aXRoIGJhdGNoaW5nLCBtYXJrL3Jlc3RvcmUgaXMg aGFuZGxlZCBpbiBpbmRleGFtICovCi0JQXNzZXJ0KHNjYW4tPnhzX2JhdGNoZXMgPT0gTlVM TCk7CisJaWYgKHNjYW4tPnhzX2JhdGNoZXMgIT0gTlVMTCkKKwl7CisJCWlmIChzY2FuLT54 c19iYXRjaGVzLT5tYXJrUG9zLmJhdGNoICE9IHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0 Y2gpCisJCXsKKwkJCS8qIFJlc2V0IHRoZSBzY2FuJ3MgYXJyYXkga2V5cyAoc2VlIF9idF9z dGVwcGFnZSBmb3Igd2h5KSAqLworCQkJaWYgKHNvLT5udW1BcnJheUtleXMpCisJCQl7CisJ CQkJX2J0X3N0YXJ0X2FycmF5X2tleXMoc2Nhbiwgc28tPmN1cnJQb3MuZGlyKTsKKwkJCQlz by0+bmVlZFByaW1TY2FuID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm47CisJfQog CiAJaWYgKHNvLT5tYXJrSXRlbUluZGV4ID49IDApCiAJewotLSAKMi40OS4wCgo= --------------M6LdRa0Fp1G9COZVqFEBU3jU Content-Type: application/x-compressed-tar; name="simple-prefetch.tgz" Content-Disposition: attachment; filename="simple-prefetch.tgz" Content-Transfer-Encoding: base64 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 95/7z/3n3+nz/5VIguIAQAEA --------------M6LdRa0Fp1G9COZVqFEBU3jU--