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 1sP0MS-002QCN-Oc for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Jul 2024 13:49: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 1sP0MP-0098Vb-JA for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Jul 2024 13:49:26 +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 1sP0MO-0098VQ-GV for pgsql-hackers@lists.postgresql.org; Wed, 03 Jul 2024 13:49:25 +0000 Received: from fout8-smtp.messagingengine.com ([103.168.172.151]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sP0MJ-000D1S-DU for pgsql-hackers@postgresql.org; Wed, 03 Jul 2024 13:49:23 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfout.nyi.internal (Postfix) with ESMTP id 9706113800F0; Wed, 3 Jul 2024 09:49:18 -0400 (EDT) Received: from imap48 ([10.202.2.98]) by compute6.internal (MEProxy); Wed, 03 Jul 2024 09:49:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1720014558; x=1720100958; bh=WYtkF9rdxv WxHCno98LEJIDn23MDDf6K+jO5X7cta9w=; b=Hm2nt4cAQ+t+FmvtdT/PeqllrT CZPtiHAwmlg+3kiWVYwgxcUt7kAq7Yr+BI1x9W8fYfaDMhjNOknRMQx2nSDgumDM eH4rdOZfOrZl88EBoH9hBc4JwXooYhVAndOplg9n9jI/AJvibG3O8uxps4CPbpCL IkiyZODc2g6gN4+5semklk+aQOd5QvpyIMMKxsvsjvH6VJdqoBkCRj+WPt/ngN1o F+Selp8DmanTVpE1wL5h5XoUZ9LEUEkuyxtHA2WAn90oHt635mYcnBcYR8mjG8br lJniQWM3koOCNczm9aYwqxD30u5v/hhtFq8TQ9lbTURNMPwB92rCWQFYTo7g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1720014558; x=1720100958; bh=WYtkF9rdxvWxHCno98LEJIDn23MD Df6K+jO5X7cta9w=; b=MxqAuex5q0z492TgWWGCd7u7+H3DVk6ab2NjAkkJos0e 99f5iVlN9jOpFEDkey/6GNPUxvATEMNh/YjYdZl//4FxdW04Dn8UsUw/P1oTU6Y9 a2XpvaqGcxGoRs3/P42GojLOyhKQrpLSAfCd585kBsVab2QeOHXzuLYwaK3cIseA RMjyEMkGn6UZH+WN5OlTOmEp6HQlB8ISi/1eW8AiTA0LYQuxuigu7k/Gk41EcsrE 4QhEVvhXKMXFkEjD1QVfePzhX4RpkDHO7sRwCQtLUHAXSIobiMk1gL6nEaEtAxOk vgoHGwXcwf+jNIyd9EroDYBnBQud0G5lRMB+WktAkQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrudejgdeikecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvvefutgesmhdtreerreertdenucfhrhhomhepfdflohgv lhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhpihhlvghrrdhorhhgqeenucggtf frrghtthgvrhhnpeetgfejvdffuedujeektdfgjeehfeffgeeuhfegteeujedvtdeifeef vddvveeuueenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhroh hmpehjohgvlhestghomhhpihhlvghrrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 5BFF631A0066; Wed, 3 Jul 2024 09:49:18 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-566-g3812ddbbc-fm-20240627.001-g3812ddbb MIME-Version: 1.0 Message-Id: <018dd6e8-8f21-4b3b-8d80-2d128f6d00b4@app.fastmail.com> In-Reply-To: References: <44d2ffca-d560-4919-b85a-4d07060946aa@app.fastmail.com> <87zfr1e1uj.fsf@wibble.ilmari.org> <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> <8e909218-1965-4515-99e3-4bb5b625e004@app.fastmail.com> <0459ded5-6daf-4bf0-9ab0-e1f11ab15ec6@app.fastmail.com> <4e54bf4f-59fe-4c9a-b446-a2b64cbfd584@app.fastmail.com> <27d42b25-f328-4231-9db0-3811dc77c8cf@app.fastmail.com> <33c51978-8ee8-438c-9804-e46c0ca8f3f9@app.fastmail.com> Date: Wed, 03 Jul 2024 15:48:58 +0200 From: "Joel Jacobson" To: "Dean Rasheed" Cc: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= , pgsql-hackers Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. Content-Type: multipart/mixed; boundary=c0a37e9252ee48b6a6b822713224abbb List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --c0a37e9252ee48b6a6b822713224abbb Content-Type: text/plain On Wed, Jul 3, 2024, at 13:17, Dean Rasheed wrote: > On Tue, 2 Jul 2024 at 21:10, Joel Jacobson wrote: >> >> I found the bug in the case 3 code, >> and it turns out the same type of bug also exists in the case 2 code: >> >> case 2: >> newdig = (int) var1digits[1] * var2digits[res_ndigits - 4]; >> >> The problem here is that res_ndigits could become less than 4, > > Yes. It can't be less than 3 though (per an earlier test), so the case > 2 code was correct. Hmm, I don't see how the case 2 code can be correct? If, like you say, res_ndigits can't be less than 3, that means it can be 3, right? And if res_ndigits=3 then `var2digits[res_ndigits - 4]` would try to access `var2digits[-1]`. > I've been hacking on this a bit and trying to tidy it up. Firstly, I > moved it to a separate function, because it was starting to look messy > having so much extra code in mul_var(). Then I added a bunch more > comments to explain what's going on, and the limits of the various > variables. Note that most of the boundary checks are actually > unnecessary -- in particular all the ones in or after the main loop, > provided you pull out the first 2 result digits from the main loop in > the 3-digit case. That does seem to work very well, but... Nice, I was starting to feel a bit uncomfortable with the level of increased complexity. > I wasn't entirely happy with how messy that code is getting, so I > tried a different approach. Similar to div_var_int(), I tried writing > a mul_var_int() function instead. This can be used for 1 and 2 digit > factors, and we could add a similar mul_var_int64() function on > platforms with 128-bit integers. The code looks quite a lot neater, so > it's probably less likely to contain bugs (though I have just written > it in a hurry,so it might still have bugs). In testing, it seemed to > give a decent speedup, but perhaps a little less than before. But > that's to be balanced against having more maintainable code, and also > a function that might be useful elsewhere in numeric.c. > > Anyway, here are both patches for comparison. I'll stop hacking for a > while and let you see what you make of these. I've tested both patches, and they produces the same output given the same input as HEAD, when rscale is unmodified (full precision). However, for a reduced rscale, there are some differences: mul_var_small() seems more resilient to rscale reductions than mul_var_int(). The previous version we worked on, I've called "mul_var inlined" in the output below. ``` CREATE TABLE test_numeric_mul_patched ( var1 numeric, var2 numeric, rscale_adjustment int, result numeric ); DO $$ DECLARE var1 numeric; var2 numeric; BEGIN FOR i IN 1..1000 LOOP RAISE NOTICE '%', i; FOR var1ndigits IN 1..4 LOOP FOR var2ndigits IN 1..4 LOOP FOR var1dscale IN 0..(var1ndigits*4) LOOP FOR var2dscale IN 0..(var2ndigits*4) LOOP FOR rscale_adjustment IN 0..(var1dscale+var2dscale) LOOP var1 := round(random( format('1%s',repeat('0',(var1ndigits-1)*4-1))::numeric, format('%s',repeat('9',var1ndigits*4))::numeric ) / 10::numeric^var1dscale, var1dscale); var2 := round(random( format('1%s',repeat('0',(var2ndigits-1)*4-1))::numeric, format('%s',repeat('9',var2ndigits*4))::numeric ) / 10::numeric^var2dscale, var2dscale); INSERT INTO test_numeric_mul_patched (var1, var2, rscale_adjustment) VALUES (var1, var2, -rscale_adjustment); END LOOP; END LOOP; END LOOP; END LOOP; END LOOP; END LOOP; END $$; UPDATE test_numeric_mul_patched SET result = numeric_mul_head(var1, var2, rscale_adjustment); SELECT rscale_adjustment, COUNT(*), COUNT(*) FILTER (WHERE result IS DISTINCT FROM numeric_mul_patch_int(var1,var2,rscale_adjustment)) AS "mul_var_int", COUNT(*) FILTER (WHERE result IS DISTINCT FROM numeric_mul_patch_small(var1,var2,rscale_adjustment)) AS "mul_var_small", COUNT(*) FILTER (WHERE result IS DISTINCT FROM numeric_mul_patch_inline(var1,var2,rscale_adjustment)) AS "mul_var inlined" FROM test_numeric_mul_patched GROUP BY 1 ORDER BY 1; rscale_adjustment | count | mul_var_int | mul_var_small | mul_var inlined -------------------+---------+-------------+---------------+----------------- -32 | 1000 | 0 | 0 | 0 -31 | 3000 | 0 | 0 | 0 -30 | 6000 | 0 | 0 | 0 -29 | 10000 | 0 | 0 | 0 -28 | 17000 | 0 | 0 | 0 -27 | 27000 | 0 | 0 | 0 -26 | 40000 | 0 | 1 | 0 -25 | 56000 | 1 | 11 | 0 -24 | 78000 | 316 | 119 | 1 -23 | 106000 | 498 | 1696 | 0 -22 | 140000 | 531 | 2480 | 1 -21 | 180000 | 591 | 3145 | 0 -20 | 230000 | 1956 | 5309 | 1 -19 | 290000 | 2189 | 5032 | 0 -18 | 360000 | 2314 | 4868 | 0 -17 | 440000 | 2503 | 4544 | 1 -16 | 533000 | 5201 | 3633 | 0 -15 | 631000 | 5621 | 3006 | 0 -14 | 734000 | 5907 | 2631 | 0 -13 | 842000 | 6268 | 2204 | 0 -12 | 957000 | 9558 | 778 | 0 -11 | 1071000 | 10597 | 489 | 0 -10 | 1184000 | 10765 | 193 | 0 -9 | 1296000 | 9452 | 0 | 0 -8 | 1408000 | 1142 | 0 | 0 -7 | 1512000 | 391 | 0 | 0 -6 | 1608000 | 235 | 0 | 0 -5 | 1696000 | 0 | 0 | 0 -4 | 1776000 | 0 | 0 | 0 -3 | 1840000 | 0 | 0 | 0 -2 | 1888000 | 0 | 0 | 0 -1 | 1920000 | 0 | 0 | 0 0 | 1936000 | 0 | 0 | 0 (33 rows) SELECT result - numeric_mul_patch_int(var1,var2,rscale_adjustment), COUNT(*) FROM test_numeric_mul_patched GROUP BY 1 ORDER BY 1; ?column? | count ----------------+---------- 0 | 24739964 0.000000000001 | 2170 0.00000000001 | 234 0.0000000001 | 18 0.000000001 | 4 0.00000001 | 8927 0.0000001 | 882 0.000001 | 90 0.00001 | 6 0.0001 | 21963 0.001 | 2174 0.01 | 214 0.1 | 18 1 | 39336 (14 rows) SELECT result - numeric_mul_patch_small(var1,var2,rscale_adjustment), COUNT(*) FROM test_numeric_mul_patched GROUP BY 1 ORDER BY 1; ?column? | count -------------------+---------- -1 | 1233 -0.01 | 9 -0.001 | 73 -0.0001 | 647 -0.000001 | 2 -0.0000001 | 9 -0.00000001 | 116 0.000000000000000 | 24775861 0.00000001 | 1035 0.00000002 | 2 0.0000001 | 96 0.000001 | 9 0.0001 | 8771 0.0002 | 3 0.001 | 952 0.01 | 69 0.1 | 10 1 | 27098 2 | 5 (19 rows) SELECT result - numeric_mul_patch_inline(var1,var2,rscale_adjustment), COUNT(*) FROM test_numeric_mul_patched GROUP BY 1 ORDER BY 1; ?column? | count ----------+---------- -1 | 4 0 | 24815996 (2 rows) ``` I found these two interesting to look closer at: ``` 0.00000002 | 2 0.0002 | 3 SELECT *, numeric_mul_patch_small(var1,var2,rscale_adjustment) FROM test_numeric_mul_patched WHERE result - numeric_mul_patch_small(var1,var2,rscale_adjustment) IN (0.00000002, 0.0002); var1 | var2 | rscale_adjustment | result | numeric_mul_patch_small -------------------+----------------+-------------------+------------+------------------------- 8952.12658563 | 0.902315486665 | -16 | 8077.6425 | 8077.6423 0.881715409579 | 0.843165739371 | -16 | 0.74343223 | 0.74343221 0.905322758954 | 0.756905996850 | -16 | 0.68524423 | 0.68524421 8464.043170546608 | 0.518100129611 | -20 | 4385.2219 | 4385.2217 5253.006296984449 | 0.989308019355 | -20 | 5196.8413 | 5196.8411 (5 rows) ``` What can be said about mul_var()'s contract with regards to rscale? It's the number of decimal digits requested by the caller, and if not requesting full precision, then the decimal digits might not be accurate, but can something be said about how far off they can be? The mul_var_int() patch only produces a difference that is exactly 1 less than the exact result, at the last non-zero decimal digit. Could the difference be more than 1 at the last non-zero digit, like in the five cases found above? It would be nice if we could define mul_var()'s contract with regards to rscale, in terms of what precision can be expected in the result. Attaching the hacked together version with all the patches, used to do the testing above. Regards, Joel --c0a37e9252ee48b6a6b822713224abbb Content-Disposition: attachment; filename="test-mul-var-versions.patch.txt" Content-Type: text/plain; name="test-mul-var-versions.patch.txt" Content-Transfer-Encoding: BASE64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvbnVtZXJpYy5jCmluZGV4IDU1MTBhMjAzYjAuLjYzZGU1Y2Q5OTQg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMKKysrIGIvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYwpAQCAtNTUxLDYgKzU1MSwyMyBAQCBzdGF0 aWMgdm9pZCBzdWJfdmFyKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNW YXIgKnZhcjIsCiBzdGF0aWMgdm9pZCBtdWxfdmFyKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEs IGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsCiAJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKIAkJ CQkJaW50IHJzY2FsZSk7CitzdGF0aWMgdm9pZCBtdWxfdmFyX2hlYWQoY29uc3QgTnVtZXJp Y1ZhciAqdmFyMSwgY29uc3QgTnVtZXJpY1ZhciAqdmFyMiwKKwkJCQkJTnVtZXJpY1ZhciAq cmVzdWx0LAorCQkJCQlpbnQgcnNjYWxlKTsKK3N0YXRpYyB2b2lkIG11bF92YXJfcGF0Y2hf aW5saW5lKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIs CisJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKKwkJCQkJaW50IHJzY2FsZSk7CitzdGF0aWMg dm9pZCBtdWxfdmFyX3BhdGNoX3NtYWxsKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0 IE51bWVyaWNWYXIgKnZhcjIsCisJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKKwkJCQkJaW50 IHJzY2FsZSk7CitzdGF0aWMgdm9pZCBtdWxfdmFyX3BhdGNoX2ludChjb25zdCBOdW1lcmlj VmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQkJCQlOdW1lcmljVmFyICpy ZXN1bHQsCisJCQkJCWludCByc2NhbGUpOworc3RhdGljIHZvaWQgbXVsX3Zhcl9zbWFsbChj b25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQkJCQkJ ICBOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUpOworCitzdGF0aWMgdm9pZCBtdWxf dmFyX2ludChjb25zdCBOdW1lcmljVmFyICp2YXIsIGludCBpdmFsLCBpbnQgaXZhbF93ZWln aHQsCisJCQkJCQlOdW1lcmljVmFyICpyZXN1bHQsIGludCByc2NhbGUpOwogc3RhdGljIHZv aWQgZGl2X3Zhcihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2 YXIyLAogCQkJCQlOdW1lcmljVmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUsIGJvb2wg cm91bmQpOwpAQCAtMzExNSw2ICszMTMyLDQ0OCBAQCBudW1lcmljX211bF9vcHRfZXJyb3Io TnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIsIGJvb2wgKmhhdmVfZXJyb3IpCiB9CiAKIAor RGF0dW0KK251bWVyaWNfbXVsX2hlYWQoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlOdW1lcmlj CQludW0xID0gUEdfR0VUQVJHX05VTUVSSUMoMCk7CisJTnVtZXJpYwkJbnVtMiA9IFBHX0dF VEFSR19OVU1FUklDKDEpOworCWludDMyCQlyc2NhbGVfYWRqdXN0bWVudCA9IFBHX0dFVEFS R19JTlQzMigyKTsKKwlOdW1lcmljCQlyZXM7CisKKwlyZXMgPSBudW1lcmljX211bF9oZWFk X29wdF9lcnJvcihudW0xLCBudW0yLCByc2NhbGVfYWRqdXN0bWVudCwgTlVMTCk7CisKKwlQ R19SRVRVUk5fTlVNRVJJQyhyZXMpOworfQorCisKK0RhdHVtCitudW1lcmljX211bF9wYXRj aF9pbmxpbmUoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlOdW1lcmljCQludW0xID0gUEdfR0VU QVJHX05VTUVSSUMoMCk7CisJTnVtZXJpYwkJbnVtMiA9IFBHX0dFVEFSR19OVU1FUklDKDEp OworCWludDMyCQlyc2NhbGVfYWRqdXN0bWVudCA9IFBHX0dFVEFSR19JTlQzMigyKTsKKwlO dW1lcmljCQlyZXM7CisKKwlyZXMgPSBudW1lcmljX211bF9wYXRjaF9pbmxpbmVfb3B0X2Vy cm9yKG51bTEsIG51bTIsIHJzY2FsZV9hZGp1c3RtZW50LCBOVUxMKTsKKworCVBHX1JFVFVS Tl9OVU1FUklDKHJlcyk7Cit9CisKK0RhdHVtCitudW1lcmljX211bF9wYXRjaF9zbWFsbChQ R19GVU5DVElPTl9BUkdTKQoreworCU51bWVyaWMJCW51bTEgPSBQR19HRVRBUkdfTlVNRVJJ QygwKTsKKwlOdW1lcmljCQludW0yID0gUEdfR0VUQVJHX05VTUVSSUMoMSk7CisJaW50MzIJ CXJzY2FsZV9hZGp1c3RtZW50ID0gUEdfR0VUQVJHX0lOVDMyKDIpOworCU51bWVyaWMJCXJl czsKKworCXJlcyA9IG51bWVyaWNfbXVsX3BhdGNoX3NtYWxsX29wdF9lcnJvcihudW0xLCBu dW0yLCByc2NhbGVfYWRqdXN0bWVudCwgTlVMTCk7CisKKwlQR19SRVRVUk5fTlVNRVJJQyhy ZXMpOworfQorCitEYXR1bQorbnVtZXJpY19tdWxfcGF0Y2hfaW50KFBHX0ZVTkNUSU9OX0FS R1MpCit7CisJTnVtZXJpYwkJbnVtMSA9IFBHX0dFVEFSR19OVU1FUklDKDApOworCU51bWVy aWMJCW51bTIgPSBQR19HRVRBUkdfTlVNRVJJQygxKTsKKwlpbnQzMgkJcnNjYWxlX2FkanVz dG1lbnQgPSBQR19HRVRBUkdfSU5UMzIoMik7CisJTnVtZXJpYwkJcmVzOworCisJcmVzID0g bnVtZXJpY19tdWxfcGF0Y2hfaW50X29wdF9lcnJvcihudW0xLCBudW0yLCByc2NhbGVfYWRq dXN0bWVudCwgTlVMTCk7CisKKwlQR19SRVRVUk5fTlVNRVJJQyhyZXMpOworfQorCisKK051 bWVyaWMKK251bWVyaWNfbXVsX3BhdGNoX2lubGluZV9vcHRfZXJyb3IoTnVtZXJpYyBudW0x LCBOdW1lcmljIG51bTIsIGludDMyIHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vy cm9yKQoreworCU51bWVyaWNWYXIJYXJnMTsKKwlOdW1lcmljVmFyCWFyZzI7CisJTnVtZXJp Y1ZhcglyZXN1bHQ7CisJTnVtZXJpYwkJcmVzOworCisJLyoKKwkgKiBIYW5kbGUgTmFOIGFu ZCBpbmZpbml0aWVzCisJICovCisJaWYgKE5VTUVSSUNfSVNfU1BFQ0lBTChudW0xKSB8fCBO VU1FUklDX0lTX1NQRUNJQUwobnVtMikpCisJeworCQlpZiAoTlVNRVJJQ19JU19OQU4obnVt MSkgfHwgTlVNRVJJQ19JU19OQU4obnVtMikpCisJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNv bnN0X25hbik7CisJCWlmIChOVU1FUklDX0lTX1BJTkYobnVtMSkpCisJCXsKKwkJCXN3aXRj aCAobnVtZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJ CQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiBJbmYgKiAwICovCisJCQkJ Y2FzZSAxOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNh c2UgLTE6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJ CQlBc3NlcnQoZmFsc2UpOworCQl9CisJCWlmIChOVU1FUklDX0lTX05JTkYobnVtMSkpCisJ CXsKKwkJCXN3aXRjaCAobnVtZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJ CWNhc2UgMDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiAtSW5m ICogMCAqLworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9u aW5mKTsKKwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3Bp bmYpOworCQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQkvKiBieSBoZXJlLCBudW0x IG11c3QgYmUgZmluaXRlLCBzbyBudW0yIGlzIG5vdCAqLworCQlpZiAoTlVNRVJJQ19JU19Q SU5GKG51bTIpKQorCQl7CisJCQlzd2l0Y2ggKG51bWVyaWNfc2lnbl9pbnRlcm5hbChudW0x KSkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3Rf bmFuKTsgLyogMCAqIEluZiAqLworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVz dWx0KCZjb25zdF9waW5mKTsKKwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1 bHQoJmNvbnN0X25pbmYpOworCQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQlBc3Nl cnQoTlVNRVJJQ19JU19OSU5GKG51bTIpKTsKKwkJc3dpdGNoIChudW1lcmljX3NpZ25faW50 ZXJuYWwobnVtMSkpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gbWFrZV9yZXN1bHQo JmNvbnN0X25hbik7IC8qIDAgKiAtSW5mICovCisJCQljYXNlIDE6CisJCQkJcmV0dXJuIG1h a2VfcmVzdWx0KCZjb25zdF9uaW5mKTsKKwkJCWNhc2UgLTE6CisJCQkJcmV0dXJuIG1ha2Vf cmVzdWx0KCZjb25zdF9waW5mKTsKKwkJfQorCQlBc3NlcnQoZmFsc2UpOworCX0KKworCS8q CisJICogVW5wYWNrIHRoZSB2YWx1ZXMsIGxldCBtdWxfdmFyKCkgY29tcHV0ZSB0aGUgcmVz dWx0IGFuZCByZXR1cm4gaXQuCisJICogVW5saWtlIGFkZF92YXIoKSBhbmQgc3ViX3Zhcigp LCBtdWxfdmFyKCkgd2lsbCByb3VuZCBpdHMgcmVzdWx0LiBJbiB0aGUKKwkgKiBjYXNlIG9m IG51bWVyaWNfbXVsKCksIHdoaWNoIGlzIGludm9rZWQgZm9yIHRoZSAqIG9wZXJhdG9yIG9u IG51bWVyaWNzLAorCSAqIHdlIHJlcXVlc3QgZXhhY3QgcmVwcmVzZW50YXRpb24gZm9yIHRo ZSBwcm9kdWN0IChyc2NhbGUgPSBzdW0oZHNjYWxlIG9mCisJICogYXJnMSwgZHNjYWxlIG9m IGFyZzIpKS4gIElmIHRoZSBleGFjdCByZXN1bHQgaGFzIG1vcmUgZGlnaXRzIGFmdGVyIHRo ZQorCSAqIGRlY2ltYWwgcG9pbnQgdGhhbiBjYW4gYmUgc3RvcmVkIGluIGEgbnVtZXJpYywg d2Ugcm91bmQgaXQuICBSb3VuZGluZworCSAqIGFmdGVyIGNvbXB1dGluZyB0aGUgZXhhY3Qg cmVzdWx0IGVuc3VyZXMgdGhhdCB0aGUgZmluYWwgcmVzdWx0IGlzCisJICogY29ycmVjdGx5 IHJvdW5kZWQgKHJvdW5kaW5nIGluIG11bF92YXIoKSB1c2luZyBhIHRydW5jYXRlZCBwcm9k dWN0CisJICogd291bGQgbm90IGd1YXJhbnRlZSB0aGlzKS4KKwkgKi8KKwlpbml0X3Zhcl9m cm9tX251bShudW0xLCAmYXJnMSk7CisJaW5pdF92YXJfZnJvbV9udW0obnVtMiwgJmFyZzIp OworCisJaW5pdF92YXIoJnJlc3VsdCk7CisKKwltdWxfdmFyX3BhdGNoX2lubGluZSgmYXJn MSwgJmFyZzIsICZyZXN1bHQsIGFyZzEuZHNjYWxlICsgYXJnMi5kc2NhbGUgKyByc2NhbGVf YWRqdXN0bWVudCk7CisKKwlpZiAocmVzdWx0LmRzY2FsZSA+IE5VTUVSSUNfRFNDQUxFX01B WCkKKwkJcm91bmRfdmFyKCZyZXN1bHQsIE5VTUVSSUNfRFNDQUxFX01BWCk7CisKKwlyZXMg PSBtYWtlX3Jlc3VsdF9vcHRfZXJyb3IoJnJlc3VsdCwgaGF2ZV9lcnJvcik7CisKKwlmcmVl X3ZhcigmcmVzdWx0KTsKKworCXJldHVybiByZXM7Cit9CisKKworTnVtZXJpYworbnVtZXJp Y19tdWxfaGVhZF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIsIGludDMy IHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vycm9yKQoreworCU51bWVyaWNWYXIJ YXJnMTsKKwlOdW1lcmljVmFyCWFyZzI7CisJTnVtZXJpY1ZhcglyZXN1bHQ7CisJTnVtZXJp YwkJcmVzOworCisJLyoKKwkgKiBIYW5kbGUgTmFOIGFuZCBpbmZpbml0aWVzCisJICovCisJ aWYgKE5VTUVSSUNfSVNfU1BFQ0lBTChudW0xKSB8fCBOVU1FUklDX0lTX1NQRUNJQUwobnVt MikpCisJeworCQlpZiAoTlVNRVJJQ19JU19OQU4obnVtMSkgfHwgTlVNRVJJQ19JU19OQU4o bnVtMikpCisJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7CisJCWlmIChOVU1F UklDX0lTX1BJTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVtZXJpY19zaWduX2ludGVy bmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0 KCZjb25zdF9uYW4pOyAvKiBJbmYgKiAwICovCisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4g bWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNhc2UgLTE6CisJCQkJCXJldHVybiBt YWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJCQlBc3NlcnQoZmFsc2UpOworCQl9 CisJCWlmIChOVU1FUklDX0lTX05JTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVtZXJp Y19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJu IG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiAtSW5mICogMCAqLworCQkJCWNhc2UgMToK KwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5mKTsKKwkJCQljYXNlIC0xOgor CQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJfQorCQkJQXNzZXJ0 KGZhbHNlKTsKKwkJfQorCQkvKiBieSBoZXJlLCBudW0xIG11c3QgYmUgZmluaXRlLCBzbyBu dW0yIGlzIG5vdCAqLworCQlpZiAoTlVNRVJJQ19JU19QSU5GKG51bTIpKQorCQl7CisJCQlz d2l0Y2ggKG51bWVyaWNfc2lnbl9pbnRlcm5hbChudW0xKSkKKwkJCXsKKwkJCQljYXNlIDA6 CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmFuKTsgLyogMCAqIEluZiAqLwor CQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5mKTsKKwkJ CQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25pbmYpOworCQkJ fQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQlBc3NlcnQoTlVNRVJJQ19JU19OSU5GKG51 bTIpKTsKKwkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwobnVtMSkpCisJCXsKKwkJ CWNhc2UgMDoKKwkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7IC8qIDAgKiAt SW5mICovCisJCQljYXNlIDE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5m KTsKKwkJCWNhc2UgLTE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5mKTsK KwkJfQorCQlBc3NlcnQoZmFsc2UpOworCX0KKworCS8qCisJICogVW5wYWNrIHRoZSB2YWx1 ZXMsIGxldCBtdWxfdmFyKCkgY29tcHV0ZSB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXQuCisJ ICogVW5saWtlIGFkZF92YXIoKSBhbmQgc3ViX3ZhcigpLCBtdWxfdmFyKCkgd2lsbCByb3Vu ZCBpdHMgcmVzdWx0LiBJbiB0aGUKKwkgKiBjYXNlIG9mIG51bWVyaWNfbXVsKCksIHdoaWNo IGlzIGludm9rZWQgZm9yIHRoZSAqIG9wZXJhdG9yIG9uIG51bWVyaWNzLAorCSAqIHdlIHJl cXVlc3QgZXhhY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm9kdWN0IChyc2NhbGUgPSBz dW0oZHNjYWxlIG9mCisJICogYXJnMSwgZHNjYWxlIG9mIGFyZzIpKS4gIElmIHRoZSBleGFj dCByZXN1bHQgaGFzIG1vcmUgZGlnaXRzIGFmdGVyIHRoZQorCSAqIGRlY2ltYWwgcG9pbnQg dGhhbiBjYW4gYmUgc3RvcmVkIGluIGEgbnVtZXJpYywgd2Ugcm91bmQgaXQuICBSb3VuZGlu ZworCSAqIGFmdGVyIGNvbXB1dGluZyB0aGUgZXhhY3QgcmVzdWx0IGVuc3VyZXMgdGhhdCB0 aGUgZmluYWwgcmVzdWx0IGlzCisJICogY29ycmVjdGx5IHJvdW5kZWQgKHJvdW5kaW5nIGlu IG11bF92YXIoKSB1c2luZyBhIHRydW5jYXRlZCBwcm9kdWN0CisJICogd291bGQgbm90IGd1 YXJhbnRlZSB0aGlzKS4KKwkgKi8KKwlpbml0X3Zhcl9mcm9tX251bShudW0xLCAmYXJnMSk7 CisJaW5pdF92YXJfZnJvbV9udW0obnVtMiwgJmFyZzIpOworCisJaW5pdF92YXIoJnJlc3Vs dCk7CisKKwltdWxfdmFyX2hlYWQoJmFyZzEsICZhcmcyLCAmcmVzdWx0LCBhcmcxLmRzY2Fs ZSArIGFyZzIuZHNjYWxlICsgcnNjYWxlX2FkanVzdG1lbnQpOworCisJaWYgKHJlc3VsdC5k c2NhbGUgPiBOVU1FUklDX0RTQ0FMRV9NQVgpCisJCXJvdW5kX3ZhcigmcmVzdWx0LCBOVU1F UklDX0RTQ0FMRV9NQVgpOworCisJcmVzID0gbWFrZV9yZXN1bHRfb3B0X2Vycm9yKCZyZXN1 bHQsIGhhdmVfZXJyb3IpOworCisJZnJlZV92YXIoJnJlc3VsdCk7CisKKwlyZXR1cm4gcmVz OworfQorCisKK051bWVyaWMKK251bWVyaWNfbXVsX3BhdGNoX3NtYWxsX29wdF9lcnJvcihO dW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwgaW50MzIgcnNjYWxlX2FkanVzdG1lbnQsIGJv b2wgKmhhdmVfZXJyb3IpCit7CisJTnVtZXJpY1ZhcglhcmcxOworCU51bWVyaWNWYXIJYXJn MjsKKwlOdW1lcmljVmFyCXJlc3VsdDsKKwlOdW1lcmljCQlyZXM7CisKKwkvKgorCSAqIEhh bmRsZSBOYU4gYW5kIGluZmluaXRpZXMKKwkgKi8KKwlpZiAoTlVNRVJJQ19JU19TUEVDSUFM KG51bTEpIHx8IE5VTUVSSUNfSVNfU1BFQ0lBTChudW0yKSkKKwl7CisJCWlmIChOVU1FUklD X0lTX05BTihudW0xKSB8fCBOVU1FUklDX0lTX05BTihudW0yKSkKKwkJCXJldHVybiBtYWtl X3Jlc3VsdCgmY29uc3RfbmFuKTsKKwkJaWYgKE5VTUVSSUNfSVNfUElORihudW0xKSkKKwkJ eworCQkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwobnVtMikpCisJCQl7CisJCQkJ Y2FzZSAwOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7IC8qIEluZiAq IDAgKi8KKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfcGlu Zik7CisJCQkJY2FzZSAtMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5m KTsKKwkJCX0KKwkJCUFzc2VydChmYWxzZSk7CisJCX0KKwkJaWYgKE5VTUVSSUNfSVNfTklO RihudW0xKSkKKwkJeworCQkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwobnVtMikp CisJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25h bik7IC8qIC1JbmYgKiAwICovCisJCQkJY2FzZSAxOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1 bHQoJmNvbnN0X25pbmYpOworCQkJCWNhc2UgLTE6CisJCQkJCXJldHVybiBtYWtlX3Jlc3Vs dCgmY29uc3RfcGluZik7CisJCQl9CisJCQlBc3NlcnQoZmFsc2UpOworCQl9CisJCS8qIGJ5 IGhlcmUsIG51bTEgbXVzdCBiZSBmaW5pdGUsIHNvIG51bTIgaXMgbm90ICovCisJCWlmIChO VU1FUklDX0lTX1BJTkYobnVtMikpCisJCXsKKwkJCXN3aXRjaCAobnVtZXJpY19zaWduX2lu dGVybmFsKG51bTEpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVz dWx0KCZjb25zdF9uYW4pOyAvKiAwICogSW5mICovCisJCQkJY2FzZSAxOgorCQkJCQlyZXR1 cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNhc2UgLTE6CisJCQkJCXJldHVy biBtYWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJCQlBc3NlcnQoZmFsc2UpOwor CQl9CisJCUFzc2VydChOVU1FUklDX0lTX05JTkYobnVtMikpOworCQlzd2l0Y2ggKG51bWVy aWNfc2lnbl9pbnRlcm5hbChudW0xKSkKKwkJeworCQkJY2FzZSAwOgorCQkJCXJldHVybiBt YWtlX3Jlc3VsdCgmY29uc3RfbmFuKTsgLyogMCAqIC1JbmYgKi8KKwkJCWNhc2UgMToKKwkJ CQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25pbmYpOworCQkJY2FzZSAtMToKKwkJCQly ZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQl9CisJCUFzc2VydChmYWxzZSk7 CisJfQorCisJLyoKKwkgKiBVbnBhY2sgdGhlIHZhbHVlcywgbGV0IG11bF92YXIoKSBjb21w dXRlIHRoZSByZXN1bHQgYW5kIHJldHVybiBpdC4KKwkgKiBVbmxpa2UgYWRkX3ZhcigpIGFu ZCBzdWJfdmFyKCksIG11bF92YXIoKSB3aWxsIHJvdW5kIGl0cyByZXN1bHQuIEluIHRoZQor CSAqIGNhc2Ugb2YgbnVtZXJpY19tdWwoKSwgd2hpY2ggaXMgaW52b2tlZCBmb3IgdGhlICog b3BlcmF0b3Igb24gbnVtZXJpY3MsCisJICogd2UgcmVxdWVzdCBleGFjdCByZXByZXNlbnRh dGlvbiBmb3IgdGhlIHByb2R1Y3QgKHJzY2FsZSA9IHN1bShkc2NhbGUgb2YKKwkgKiBhcmcx LCBkc2NhbGUgb2YgYXJnMikpLiAgSWYgdGhlIGV4YWN0IHJlc3VsdCBoYXMgbW9yZSBkaWdp dHMgYWZ0ZXIgdGhlCisJICogZGVjaW1hbCBwb2ludCB0aGFuIGNhbiBiZSBzdG9yZWQgaW4g YSBudW1lcmljLCB3ZSByb3VuZCBpdC4gIFJvdW5kaW5nCisJICogYWZ0ZXIgY29tcHV0aW5n IHRoZSBleGFjdCByZXN1bHQgZW5zdXJlcyB0aGF0IHRoZSBmaW5hbCByZXN1bHQgaXMKKwkg KiBjb3JyZWN0bHkgcm91bmRlZCAocm91bmRpbmcgaW4gbXVsX3ZhcigpIHVzaW5nIGEgdHJ1 bmNhdGVkIHByb2R1Y3QKKwkgKiB3b3VsZCBub3QgZ3VhcmFudGVlIHRoaXMpLgorCSAqLwor CWluaXRfdmFyX2Zyb21fbnVtKG51bTEsICZhcmcxKTsKKwlpbml0X3Zhcl9mcm9tX251bShu dW0yLCAmYXJnMik7CisKKwlpbml0X3ZhcigmcmVzdWx0KTsKKworCW11bF92YXJfcGF0Y2hf c21hbGwoJmFyZzEsICZhcmcyLCAmcmVzdWx0LCBhcmcxLmRzY2FsZSArIGFyZzIuZHNjYWxl ICsgcnNjYWxlX2FkanVzdG1lbnQpOworCisJaWYgKHJlc3VsdC5kc2NhbGUgPiBOVU1FUklD X0RTQ0FMRV9NQVgpCisJCXJvdW5kX3ZhcigmcmVzdWx0LCBOVU1FUklDX0RTQ0FMRV9NQVgp OworCisJcmVzID0gbWFrZV9yZXN1bHRfb3B0X2Vycm9yKCZyZXN1bHQsIGhhdmVfZXJyb3Ip OworCisJZnJlZV92YXIoJnJlc3VsdCk7CisKKwlyZXR1cm4gcmVzOworfQorCisKK051bWVy aWMKK251bWVyaWNfbXVsX3BhdGNoX2ludF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1l cmljIG51bTIsIGludDMyIHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vycm9yKQor eworCU51bWVyaWNWYXIJYXJnMTsKKwlOdW1lcmljVmFyCWFyZzI7CisJTnVtZXJpY1Zhcgly ZXN1bHQ7CisJTnVtZXJpYwkJcmVzOworCisJLyoKKwkgKiBIYW5kbGUgTmFOIGFuZCBpbmZp bml0aWVzCisJICovCisJaWYgKE5VTUVSSUNfSVNfU1BFQ0lBTChudW0xKSB8fCBOVU1FUklD X0lTX1NQRUNJQUwobnVtMikpCisJeworCQlpZiAoTlVNRVJJQ19JU19OQU4obnVtMSkgfHwg TlVNRVJJQ19JU19OQU4obnVtMikpCisJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25h bik7CisJCWlmIChOVU1FUklDX0lTX1BJTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVt ZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0 dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiBJbmYgKiAwICovCisJCQkJY2FzZSAx OgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNhc2UgLTE6 CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJCQlBc3Nl cnQoZmFsc2UpOworCQl9CisJCWlmIChOVU1FUklDX0lTX05JTkYobnVtMSkpCisJCXsKKwkJ CXN3aXRjaCAobnVtZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2Ug MDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiAtSW5mICogMCAq LworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5mKTsK KwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOwor CQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQkvKiBieSBoZXJlLCBudW0xIG11c3Qg YmUgZmluaXRlLCBzbyBudW0yIGlzIG5vdCAqLworCQlpZiAoTlVNRVJJQ19JU19QSU5GKG51 bTIpKQorCQl7CisJCQlzd2l0Y2ggKG51bWVyaWNfc2lnbl9pbnRlcm5hbChudW0xKSkKKwkJ CXsKKwkJCQljYXNlIDA6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmFuKTsg LyogMCAqIEluZiAqLworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZj b25zdF9waW5mKTsKKwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNv bnN0X25pbmYpOworCQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQlBc3NlcnQoTlVN RVJJQ19JU19OSU5GKG51bTIpKTsKKwkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwo bnVtMSkpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0 X25hbik7IC8qIDAgKiAtSW5mICovCisJCQljYXNlIDE6CisJCQkJcmV0dXJuIG1ha2VfcmVz dWx0KCZjb25zdF9uaW5mKTsKKwkJCWNhc2UgLTE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0 KCZjb25zdF9waW5mKTsKKwkJfQorCQlBc3NlcnQoZmFsc2UpOworCX0KKworCS8qCisJICog VW5wYWNrIHRoZSB2YWx1ZXMsIGxldCBtdWxfdmFyKCkgY29tcHV0ZSB0aGUgcmVzdWx0IGFu ZCByZXR1cm4gaXQuCisJICogVW5saWtlIGFkZF92YXIoKSBhbmQgc3ViX3ZhcigpLCBtdWxf dmFyKCkgd2lsbCByb3VuZCBpdHMgcmVzdWx0LiBJbiB0aGUKKwkgKiBjYXNlIG9mIG51bWVy aWNfbXVsKCksIHdoaWNoIGlzIGludm9rZWQgZm9yIHRoZSAqIG9wZXJhdG9yIG9uIG51bWVy aWNzLAorCSAqIHdlIHJlcXVlc3QgZXhhY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm9k dWN0IChyc2NhbGUgPSBzdW0oZHNjYWxlIG9mCisJICogYXJnMSwgZHNjYWxlIG9mIGFyZzIp KS4gIElmIHRoZSBleGFjdCByZXN1bHQgaGFzIG1vcmUgZGlnaXRzIGFmdGVyIHRoZQorCSAq IGRlY2ltYWwgcG9pbnQgdGhhbiBjYW4gYmUgc3RvcmVkIGluIGEgbnVtZXJpYywgd2Ugcm91 bmQgaXQuICBSb3VuZGluZworCSAqIGFmdGVyIGNvbXB1dGluZyB0aGUgZXhhY3QgcmVzdWx0 IGVuc3VyZXMgdGhhdCB0aGUgZmluYWwgcmVzdWx0IGlzCisJICogY29ycmVjdGx5IHJvdW5k ZWQgKHJvdW5kaW5nIGluIG11bF92YXIoKSB1c2luZyBhIHRydW5jYXRlZCBwcm9kdWN0CisJ ICogd291bGQgbm90IGd1YXJhbnRlZSB0aGlzKS4KKwkgKi8KKwlpbml0X3Zhcl9mcm9tX251 bShudW0xLCAmYXJnMSk7CisJaW5pdF92YXJfZnJvbV9udW0obnVtMiwgJmFyZzIpOworCisJ aW5pdF92YXIoJnJlc3VsdCk7CisKKwltdWxfdmFyX3BhdGNoX2ludCgmYXJnMSwgJmFyZzIs ICZyZXN1bHQsIGFyZzEuZHNjYWxlICsgYXJnMi5kc2NhbGUgKyByc2NhbGVfYWRqdXN0bWVu dCk7CisKKwlpZiAocmVzdWx0LmRzY2FsZSA+IE5VTUVSSUNfRFNDQUxFX01BWCkKKwkJcm91 bmRfdmFyKCZyZXN1bHQsIE5VTUVSSUNfRFNDQUxFX01BWCk7CisKKwlyZXMgPSBtYWtlX3Jl c3VsdF9vcHRfZXJyb3IoJnJlc3VsdCwgaGF2ZV9lcnJvcik7CisKKwlmcmVlX3ZhcigmcmVz dWx0KTsKKworCXJldHVybiByZXM7Cit9CisKKwogLyoKICAqIG51bWVyaWNfZGl2KCkgLQog ICoKQEAgLTg4NjQsNiArOTMyMywxMjQ1IEBAIG11bF92YXIoY29uc3QgTnVtZXJpY1ZhciAq dmFyMSwgY29uc3QgTnVtZXJpY1ZhciAqdmFyMiwgTnVtZXJpY1ZhciAqcmVzdWx0LAogCXN0 cmlwX3ZhcihyZXN1bHQpOwogfQogCitzdGF0aWMgdm9pZAorbXVsX3Zhcl9oZWFkKGNvbnN0 IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsIE51bWVyaWNWYXIg KnJlc3VsdCwKKwkJaW50IHJzY2FsZSkKK3sKKwlpbnQJCQlyZXNfbmRpZ2l0czsKKwlpbnQJ CQlyZXNfc2lnbjsKKwlpbnQJCQlyZXNfd2VpZ2h0OworCWludAkJCW1heGRpZ2l0czsKKwlp bnQJCSAgICpkaWc7CisJaW50CQkJY2Fycnk7CisJaW50CQkJbWF4ZGlnOworCWludAkJCW5l d2RpZzsKKwlpbnQJCQl2YXIxbmRpZ2l0czsKKwlpbnQJCQl2YXIybmRpZ2l0czsKKwlOdW1l cmljRGlnaXQgKnZhcjFkaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICp2YXIyZGlnaXRzOworCU51 bWVyaWNEaWdpdCAqcmVzX2RpZ2l0czsKKwlpbnQJCQlpLAorCQkJCWkxLAorCQkJCWkyOwor CisJLyoKKwkgKiBBcnJhbmdlIGZvciB2YXIxIHRvIGJlIHRoZSBzaG9ydGVyIG9mIHRoZSB0 d28gbnVtYmVycy4gIFRoaXMgaW1wcm92ZXMKKwkgKiBwZXJmb3JtYW5jZSBiZWNhdXNlIHRo ZSBpbm5lciBtdWx0aXBsaWNhdGlvbiBsb29wIGlzIG11Y2ggc2ltcGxlciB0aGFuCisJICog dGhlIG91dGVyIGxvb3AsIHNvIGl0J3MgYmV0dGVyIHRvIGhhdmUgYSBzbWFsbGVyIG51bWJl ciBvZiBpdGVyYXRpb25zCisJICogb2YgdGhlIG91dGVyIGxvb3AuICBUaGlzIGFsc28gcmVk dWNlcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlCisJICogYWNjdW11bGF0b3IgYXJy YXkgbmVlZHMgdG8gYmUgbm9ybWFsaXplZC4KKwkgKi8KKwlpZiAodmFyMS0+bmRpZ2l0cyA+ IHZhcjItPm5kaWdpdHMpCisJeworCQljb25zdCBOdW1lcmljVmFyICp0bXAgPSB2YXIxOwor CisJCXZhcjEgPSB2YXIyOworCQl2YXIyID0gdG1wOworCX0KKworCS8qIGNvcHkgdGhlc2Ug dmFsdWVzIGludG8gbG9jYWwgdmFycyBmb3Igc3BlZWQgaW4gaW5uZXIgbG9vcCAqLworCXZh cjFuZGlnaXRzID0gdmFyMS0+bmRpZ2l0czsKKwl2YXIybmRpZ2l0cyA9IHZhcjItPm5kaWdp dHM7CisJdmFyMWRpZ2l0cyA9IHZhcjEtPmRpZ2l0czsKKwl2YXIyZGlnaXRzID0gdmFyMi0+ ZGlnaXRzOworCisJaWYgKHZhcjFuZGlnaXRzID09IDAgfHwgdmFyMm5kaWdpdHMgPT0gMCkK Kwl7CisJCS8qIG9uZSBvciBib3RoIGlucHV0cyBpcyB6ZXJvOyBzbyBpcyByZXN1bHQgKi8K KwkJemVyb192YXIocmVzdWx0KTsKKwkJcmVzdWx0LT5kc2NhbGUgPSByc2NhbGU7CisJCXJl dHVybjsKKwl9CisKKwkvKiBEZXRlcm1pbmUgcmVzdWx0IHNpZ24gYW5kIChtYXhpbXVtIHBv c3NpYmxlKSB3ZWlnaHQgKi8KKwlpZiAodmFyMS0+c2lnbiA9PSB2YXIyLT5zaWduKQorCQly ZXNfc2lnbiA9IE5VTUVSSUNfUE9TOworCWVsc2UKKwkJcmVzX3NpZ24gPSBOVU1FUklDX05F RzsKKwlyZXNfd2VpZ2h0ID0gdmFyMS0+d2VpZ2h0ICsgdmFyMi0+d2VpZ2h0ICsgMjsKKwor CS8qCisJICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmVzdWx0IGRpZ2l0cyB0byBjb21w dXRlLiAgSWYgdGhlIGV4YWN0IHJlc3VsdAorCSAqIHdvdWxkIGhhdmUgbW9yZSB0aGFuIHJz Y2FsZSBmcmFjdGlvbmFsIGRpZ2l0cywgdHJ1bmNhdGUgdGhlIGNvbXB1dGF0aW9uCisJICog d2l0aCBNVUxfR1VBUkRfRElHSVRTIGd1YXJkIGRpZ2l0cywgaS5lLiwgaWdub3JlIGlucHV0 IGRpZ2l0cyB0aGF0CisJICogd291bGQgb25seSBjb250cmlidXRlIHRvIHRoZSByaWdodCBv ZiB0aGF0LiAgKFRoaXMgd2lsbCBnaXZlIHRoZSBleGFjdAorCSAqIHJvdW5kZWQtdG8tcnNj YWxlIGFuc3dlciB1bmxlc3MgY2FycmllcyBvdXQgb2YgdGhlIGlnbm9yZWQgcG9zaXRpb25z CisJICogd291bGQgaGF2ZSBwcm9wYWdhdGVkIHRocm91Z2ggbW9yZSB0aGFuIE1VTF9HVUFS RF9ESUdJVFMgZGlnaXRzLikKKwkgKgorCSAqIE5vdGU6IGFuIGV4YWN0IGNvbXB1dGF0aW9u IGNvdWxkIG5vdCBwcm9kdWNlIG1vcmUgdGhhbiB2YXIxbmRpZ2l0cyArCisJICogdmFyMm5k aWdpdHMgZGlnaXRzLCBidXQgd2UgYWxsb2NhdGUgb25lIGV4dHJhIG91dHB1dCBkaWdpdCBp biBjYXNlCisJICogcnNjYWxlLWRyaXZlbiByb3VuZGluZyBwcm9kdWNlcyBhIGNhcnJ5IG91 dCBvZiB0aGUgaGlnaGVzdCBleGFjdCBkaWdpdC4KKwkgKi8KKwlyZXNfbmRpZ2l0cyA9IHZh cjFuZGlnaXRzICsgdmFyMm5kaWdpdHMgKyAxOworCW1heGRpZ2l0cyA9IHJlc193ZWlnaHQg KyAxICsgKHJzY2FsZSArIERFQ19ESUdJVFMgLSAxKSAvIERFQ19ESUdJVFMgKworCQlNVUxf R1VBUkRfRElHSVRTOworCXJlc19uZGlnaXRzID0gTWluKHJlc19uZGlnaXRzLCBtYXhkaWdp dHMpOworCisJaWYgKHJlc19uZGlnaXRzIDwgMykKKwl7CisJCS8qIEFsbCBpbnB1dCBkaWdp dHMgd2lsbCBiZSBpZ25vcmVkOyBzbyByZXN1bHQgaXMgemVybyAqLworCQl6ZXJvX3Zhcihy ZXN1bHQpOworCQlyZXN1bHQtPmRzY2FsZSA9IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKwor CS8qCisJICogV2UgZG8gdGhlIGFyaXRobWV0aWMgaW4gYW4gYXJyYXkgImRpZ1tdIiBvZiBz aWduZWQgaW50J3MuICBTaW5jZQorCSAqIElOVF9NQVggaXMgbm90aWNlYWJseSBsYXJnZXIg dGhhbiBOQkFTRSpOQkFTRSwgdGhpcyBnaXZlcyB1cyBoZWFkcm9vbQorCSAqIHRvIGF2b2lk IG5vcm1hbGl6aW5nIGNhcnJpZXMgaW1tZWRpYXRlbHkuCisJICoKKwkgKiBtYXhkaWcgdHJh Y2tzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIG9mIGFueSBkaWdbXSBlbnRyeTsgd2hl biB0aGlzCisJICogdGhyZWF0ZW5zIHRvIGV4Y2VlZCBJTlRfTUFYLCB3ZSB0YWtlIHRoZSB0 aW1lIHRvIHByb3BhZ2F0ZSBjYXJyaWVzLgorCSAqIEZ1cnRoZXJtb3JlLCB3ZSBuZWVkIHRv IGVuc3VyZSB0aGF0IG92ZXJmbG93IGRvZXNuJ3Qgb2NjdXIgZHVyaW5nIHRoZQorCSAqIGNh cnJ5IHByb3BhZ2F0aW9uIHBhc3NlcyBlaXRoZXIuICBUaGUgY2FycnkgdmFsdWVzIGNvdWxk IGJlIGFzIG11Y2ggYXMKKwkgKiBJTlRfTUFYL05CQVNFLCBzbyByZWFsbHkgd2UgbXVzdCBu b3JtYWxpemUgd2hlbiBkaWdpdHMgdGhyZWF0ZW4gdG8KKwkgKiBleGNlZWQgSU5UX01BWCAt IElOVF9NQVgvTkJBU0UuCisJICoKKwkgKiBUbyBhdm9pZCBvdmVyZmxvdyBpbiBtYXhkaWcg aXRzZWxmLCBpdCBhY3R1YWxseSByZXByZXNlbnRzIHRoZSBtYXgKKwkgKiBwb3NzaWJsZSB2 YWx1ZSBkaXZpZGVkIGJ5IE5CQVNFLTEsIGllLCBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGl0 IGlzCisJICoga25vd24gdGhhdCBubyBkaWdbXSBlbnRyeSBleGNlZWRzIG1heGRpZyAqIChO QkFTRS0xKS4KKwkgKi8KKwlkaWcgPSAoaW50ICopIHBhbGxvYzAocmVzX25kaWdpdHMgKiBz aXplb2YoaW50KSk7CisJbWF4ZGlnID0gMDsKKworCS8qCisJICogVGhlIGxlYXN0IHNpZ25p ZmljYW50IGRpZ2l0cyBvZiB2YXIxIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QK KwkgKiBjb250cmlidXRlIGRpcmVjdGx5IHRvIHRoZSBmaXJzdCByZXNfbmRpZ2l0cyBkaWdp dHMgb2YgdGhlIHJlc3VsdCB0aGF0CisJICogd2UgYXJlIGNvbXB1dGluZy4KKwkgKgorCSAq IERpZ2l0IGkxIG9mIHZhcjEgYW5kIGRpZ2l0IGkyIG9mIHZhcjIgYXJlIG11bHRpcGxpZWQg YW5kIGFkZGVkIHRvIGRpZ2l0CisJICogaTEraTIrMiBvZiB0aGUgYWNjdW11bGF0b3IgYXJy YXksIHNvIHdlIG5lZWQgb25seSBjb25zaWRlciBkaWdpdHMgb2YKKwkgKiB2YXIxIGZvciB3 aGljaCBpMSA8PSByZXNfbmRpZ2l0cyAtIDMuCisJICovCisJZm9yIChpMSA9IE1pbih2YXIx bmRpZ2l0cyAtIDEsIHJlc19uZGlnaXRzIC0gMyk7IGkxID49IDA7IGkxLS0pCisJeworCQlO dW1lcmljRGlnaXQgdmFyMWRpZ2l0ID0gdmFyMWRpZ2l0c1tpMV07CisKKwkJaWYgKHZhcjFk aWdpdCA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogVGltZSB0byBub3JtYWxpemU/ICov CisJCW1heGRpZyArPSB2YXIxZGlnaXQ7CisJCWlmIChtYXhkaWcgPiAoSU5UX01BWCAtIElO VF9NQVggLyBOQkFTRSkgLyAoTkJBU0UgLSAxKSkKKwkJeworCQkJLyogWWVzLCBkbyBpdCAq LworCQkJY2FycnkgPSAwOworCQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7 IGktLSkKKwkJCXsKKwkJCQluZXdkaWcgPSBkaWdbaV0gKyBjYXJyeTsKKwkJCQlpZiAobmV3 ZGlnID49IE5CQVNFKQorCQkJCXsKKwkJCQkJY2FycnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJ CQkJbmV3ZGlnIC09IGNhcnJ5ICogTkJBU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJY2Fy cnkgPSAwOworCQkJCWRpZ1tpXSA9IG5ld2RpZzsKKwkJCX0KKwkJCUFzc2VydChjYXJyeSA9 PSAwKTsKKwkJCS8qIFJlc2V0IG1heGRpZyB0byBpbmRpY2F0ZSBuZXcgd29yc3QtY2FzZSAq LworCQkJbWF4ZGlnID0gMSArIHZhcjFkaWdpdDsKKwkJfQorCisJCS8qCisJCSAqIEFkZCB0 aGUgYXBwcm9wcmlhdGUgbXVsdGlwbGUgb2YgdmFyMiBpbnRvIHRoZSBhY2N1bXVsYXRvci4K KwkJICoKKwkJICogQXMgYWJvdmUsIGRpZ2l0cyBvZiB2YXIyIGNhbiBiZSBpZ25vcmVkIGlm IHRoZXkgZG9uJ3QgY29udHJpYnV0ZSwKKwkJICogc28gd2Ugb25seSBpbmNsdWRlIGRpZ2l0 cyBmb3Igd2hpY2ggaTEraTIrMiA8IHJlc19uZGlnaXRzLgorCQkgKgorCQkgKiBUaGlzIGlu bmVyIGxvb3AgaXMgdGhlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2sgZm9yIG11bHRpcGxpY2F0 aW9uLAorCQkgKiBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgc2ltcGxlIGVub3VnaCBzbyB0aGF0 IGl0IGNhbiBiZQorCQkgKiBhdXRvLXZlY3Rvcml6ZWQuICBBY2NvcmRpbmdseSwgcHJvY2Vz cyB0aGUgZGlnaXRzIGxlZnQtdG8tcmlnaHQKKwkJICogZXZlbiB0aG91Z2ggc2Nob29sYm9v ayBtdWx0aXBsaWNhdGlvbiB3b3VsZCBzdWdnZXN0IHJpZ2h0LXRvLWxlZnQuCisJCSAqIFNp bmNlIHdlIGFyZW4ndCBwcm9wYWdhdGluZyBjYXJyaWVzIGluIHRoaXMgbG9vcCwgdGhlIG9y ZGVyIGRvZXMKKwkJICogbm90IG1hdHRlci4KKwkJICovCisJCXsKKwkJCWludAkJCWkybGlt aXQgPSBNaW4odmFyMm5kaWdpdHMsIHJlc19uZGlnaXRzIC0gaTEgLSAyKTsKKwkJCWludAkJ ICAgKmRpZ19pMV8yID0gJmRpZ1tpMSArIDJdOworCisJCQlmb3IgKGkyID0gMDsgaTIgPCBp MmxpbWl0OyBpMisrKQorCQkJCWRpZ19pMV8yW2kyXSArPSB2YXIxZGlnaXQgKiB2YXIyZGln aXRzW2kyXTsKKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGRvIGEgZmluYWwgY2Fycnkg cHJvcGFnYXRpb24gcGFzcyB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgd2hpY2gKKwkgKiB3 ZSBjb21iaW5lIHdpdGggc3RvcmluZyB0aGUgcmVzdWx0IGRpZ2l0cyBpbnRvIHRoZSBvdXRw dXQuIE5vdGUgdGhhdAorCSAqIHRoaXMgaXMgc3RpbGwgZG9uZSBhdCBmdWxsIHByZWNpc2lv biB3L2d1YXJkIGRpZ2l0cy4KKwkgKi8KKwlhbGxvY192YXIocmVzdWx0LCByZXNfbmRpZ2l0 cyk7CisJcmVzX2RpZ2l0cyA9IHJlc3VsdC0+ZGlnaXRzOworCWNhcnJ5ID0gMDsKKwlmb3Ig KGkgPSByZXNfbmRpZ2l0cyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkJbmV3ZGlnID0gZGln W2ldICsgY2Fycnk7CisJCWlmIChuZXdkaWcgPj0gTkJBU0UpCisJCXsKKwkJCWNhcnJ5ID0g bmV3ZGlnIC8gTkJBU0U7CisJCQluZXdkaWcgLT0gY2FycnkgKiBOQkFTRTsKKwkJfQorCQll bHNlCisJCQljYXJyeSA9IDA7CisJCXJlc19kaWdpdHNbaV0gPSBuZXdkaWc7CisJfQorCUFz c2VydChjYXJyeSA9PSAwKTsKKworCXBmcmVlKGRpZyk7CisKKwkvKgorCSAqIEZpbmFsbHks IHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24uCisJICovCisJ cmVzdWx0LT53ZWlnaHQgPSByZXNfd2VpZ2h0OworCXJlc3VsdC0+c2lnbiA9IHJlc19zaWdu OworCisJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2Fs ZSkgKi8KKwlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOworCisJLyogU3RyaXAgbGVhZGlu ZyBhbmQgdHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7Cit9CisKK3N0 YXRpYyB2b2lkCittdWxfdmFyX3BhdGNoX2lubGluZShjb25zdCBOdW1lcmljVmFyICp2YXIx LCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQlOdW1lcmljVmFyICpyZXN1bHQsIGludCBy c2NhbGUpCit7CisJaW50CQkJcmVzX25kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJaW50 CQkJcmVzX3dlaWdodDsKKwlpbnQJCQltYXhkaWdpdHM7CisJaW50CQkgICAqZGlnOworCWlu dAkJCWNhcnJ5OworCWludAkJCW1heGRpZzsKKwlpbnQJCQluZXdkaWc7CisJaW50CQkJdmFy MW5kaWdpdHM7CisJaW50CQkJdmFyMm5kaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICp2YXIxZGln aXRzOworCU51bWVyaWNEaWdpdCAqdmFyMmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJlc19k aWdpdHM7CisJaW50CQkJaSwKKwkJCQlpMSwKKwkJCQlpMjsKKworCS8qCisJICogQXJyYW5n ZSBmb3IgdmFyMSB0byBiZSB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIG51bWJlcnMuICBUaGlz IGltcHJvdmVzCisJICogcGVyZm9ybWFuY2UgYmVjYXVzZSB0aGUgaW5uZXIgbXVsdGlwbGlj YXRpb24gbG9vcCBpcyBtdWNoIHNpbXBsZXIgdGhhbgorCSAqIHRoZSBvdXRlciBsb29wLCBz byBpdCdzIGJldHRlciB0byBoYXZlIGEgc21hbGxlciBudW1iZXIgb2YgaXRlcmF0aW9ucwor CSAqIG9mIHRoZSBvdXRlciBsb29wLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIG51bWJlciBv ZiB0aW1lcyB0aGF0IHRoZQorCSAqIGFjY3VtdWxhdG9yIGFycmF5IG5lZWRzIHRvIGJlIG5v cm1hbGl6ZWQuCisJICovCisJaWYgKHZhcjEtPm5kaWdpdHMgPiB2YXIyLT5uZGlnaXRzKQor CXsKKwkJY29uc3QgTnVtZXJpY1ZhciAqdG1wID0gdmFyMTsKKworCQl2YXIxID0gdmFyMjsK KwkJdmFyMiA9IHRtcDsKKwl9CisKKwkvKiBjb3B5IHRoZXNlIHZhbHVlcyBpbnRvIGxvY2Fs IHZhcnMgZm9yIHNwZWVkIGluIGlubmVyIGxvb3AgKi8KKwl2YXIxbmRpZ2l0cyA9IHZhcjEt Pm5kaWdpdHM7CisJdmFyMm5kaWdpdHMgPSB2YXIyLT5uZGlnaXRzOworCXZhcjFkaWdpdHMg PSB2YXIxLT5kaWdpdHM7CisJdmFyMmRpZ2l0cyA9IHZhcjItPmRpZ2l0czsKKworCWlmICh2 YXIxbmRpZ2l0cyA9PSAwIHx8IHZhcjJuZGlnaXRzID09IDApCisJeworCQkvKiBvbmUgb3Ig Ym90aCBpbnB1dHMgaXMgemVybzsgc28gaXMgcmVzdWx0ICovCisJCXplcm9fdmFyKHJlc3Vs dCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxlOworCQlyZXR1cm47CisJfQorCisJLyog RGV0ZXJtaW5lIHJlc3VsdCBzaWduIGFuZCAobWF4aW11bSBwb3NzaWJsZSkgd2VpZ2h0ICov CisJaWYgKHZhcjEtPnNpZ24gPT0gdmFyMi0+c2lnbikKKwkJcmVzX3NpZ24gPSBOVU1FUklD X1BPUzsKKwllbHNlCisJCXJlc19zaWduID0gTlVNRVJJQ19ORUc7CisJcmVzX3dlaWdodCA9 IHZhcjEtPndlaWdodCArIHZhcjItPndlaWdodCArIDI7CisKKwkvKgorCSAqIERldGVybWlu ZSB0aGUgbnVtYmVyIG9mIHJlc3VsdCBkaWdpdHMgdG8gY29tcHV0ZS4gIElmIHRoZSBleGFj dCByZXN1bHQKKwkgKiB3b3VsZCBoYXZlIG1vcmUgdGhhbiByc2NhbGUgZnJhY3Rpb25hbCBk aWdpdHMsIHRydW5jYXRlIHRoZSBjb21wdXRhdGlvbgorCSAqIHdpdGggTVVMX0dVQVJEX0RJ R0lUUyBndWFyZCBkaWdpdHMsIGkuZS4sIGlnbm9yZSBpbnB1dCBkaWdpdHMgdGhhdAorCSAq IHdvdWxkIG9ubHkgY29udHJpYnV0ZSB0byB0aGUgcmlnaHQgb2YgdGhhdC4gIChUaGlzIHdp bGwgZ2l2ZSB0aGUgZXhhY3QKKwkgKiByb3VuZGVkLXRvLXJzY2FsZSBhbnN3ZXIgdW5sZXNz IGNhcnJpZXMgb3V0IG9mIHRoZSBpZ25vcmVkIHBvc2l0aW9ucworCSAqIHdvdWxkIGhhdmUg cHJvcGFnYXRlZCB0aHJvdWdoIG1vcmUgdGhhbiBNVUxfR1VBUkRfRElHSVRTIGRpZ2l0cy4p CisJICoKKwkgKiBOb3RlOiBhbiBleGFjdCBjb21wdXRhdGlvbiBjb3VsZCBub3QgcHJvZHVj ZSBtb3JlIHRoYW4gdmFyMW5kaWdpdHMgKworCSAqIHZhcjJuZGlnaXRzIGRpZ2l0cywgYnV0 IHdlIGFsbG9jYXRlIG9uZSBleHRyYSBvdXRwdXQgZGlnaXQgaW4gY2FzZQorCSAqIHJzY2Fs ZS1kcml2ZW4gcm91bmRpbmcgcHJvZHVjZXMgYSBjYXJyeSBvdXQgb2YgdGhlIGhpZ2hlc3Qg ZXhhY3QgZGlnaXQuCisJICovCisJcmVzX25kaWdpdHMgPSB2YXIxbmRpZ2l0cyArIHZhcjJu ZGlnaXRzICsgMTsKKwltYXhkaWdpdHMgPSByZXNfd2VpZ2h0ICsgMSArIChyc2NhbGUgKyBE RUNfRElHSVRTIC0gMSkgLyBERUNfRElHSVRTICsKKwkJTVVMX0dVQVJEX0RJR0lUUzsKKwly ZXNfbmRpZ2l0cyA9IE1pbihyZXNfbmRpZ2l0cywgbWF4ZGlnaXRzKTsKKworCWlmIChyZXNf bmRpZ2l0cyA8IDMpCisJeworCQkvKiBBbGwgaW5wdXQgZGlnaXRzIHdpbGwgYmUgaWdub3Jl ZDsgc28gcmVzdWx0IGlzIHplcm8gKi8KKwkJemVyb192YXIocmVzdWx0KTsKKwkJcmVzdWx0 LT5kc2NhbGUgPSByc2NhbGU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNpbXBsaWZp ZWQgZmFzdC1wYXRoIGNvbXB1dGF0aW9uLCBpZiB2YXIxIGhhcyBqdXN0IG9uZSBvciB0d28g ZGlnaXRzLgorCSAqIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHNpbmNlIGl0IGF2 b2lkcyBhbGxvY2F0aW5nIGEgc2VwYXJhdGUKKwkgKiBkaWdpdCBhcnJheSwgbWFraW5nIG11 bHRpcGxlIHBhc3NlcyBvdmVyIHZhcjIsIGFuZCBoYXZpbmcgc2VwYXJhdGUKKwkgKiBjYXJy eS1wcm9wYWdhdGlvbiBwYXNzZXMuCisJICovCisJaWYgKHZhcjFuZGlnaXRzIDw9IDMpCisJ eworCQlOdW1lcmljRGlnaXQgKnJlc19idWY7CisKKwkJLyogQWxsb2NhdGUgcmVzdWx0IGRp Z2l0IGFycmF5ICovCisJCXJlc19idWYgPSBkaWdpdGJ1Zl9hbGxvYyhyZXNfbmRpZ2l0cyk7 CisJCXJlc19idWZbMF0gPSAwOwkJCQkvKiBzcGFyZSBkaWdpdCBmb3IgbGF0ZXIgcm91bmRp bmcgKi8KKwkJcmVzX2RpZ2l0cyA9IHJlc19idWYgKyAxOworCisJCS8qCisJCSAqIENvbXB1 dGUgdGhlIHJlc3VsdCBkaWdpdHMgZGlyZWN0bHksIGluIG9uZSBwYXNzLCBwcm9wYWdhdGlu ZyB0aGUKKwkJICogY2FycnkgdXAgYXMgd2UgZ28uCisJCSAqLworCQlzd2l0Y2ggKHZhcjFu ZGlnaXRzKQorCQl7CisJCQljYXNlIDE6CisJCQkJY2FycnkgPSAwOworCQkJCWZvciAoaSA9 IHJlc19uZGlnaXRzIC0gMzsgaSA+PSAwOyBpLS0pCisJCQkJeworCQkJCQluZXdkaWcgPSAo aW50KSB2YXIxZGlnaXRzWzBdICogdmFyMmRpZ2l0c1tpXSArIGNhcnJ5OworCQkJCQlyZXNf ZGlnaXRzW2kgKyAxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJCQkJ CWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJfQorCQkJCXJlc19kaWdpdHNbMF0gPSAo TnVtZXJpY0RpZ2l0KSBjYXJyeTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJCWlm IChyZXNfbmRpZ2l0cyAtIDQgPj0gMCAmJiByZXNfbmRpZ2l0cyAtIDQgPCB2YXIybmRpZ2l0 cykKKwkJCQkJbmV3ZGlnID0gKGludCkgdmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdpdHNbcmVz X25kaWdpdHMgLSA0XTsKKwkJCQllbHNlCisJCQkJCW5ld2RpZyA9IDA7CisJCQkJaWYgKHJl c19uZGlnaXRzIC0gMyA+PSAwICYmIHJlc19uZGlnaXRzIC0gMyA8IHZhcjJuZGlnaXRzKQor CQkJCQluZXdkaWcgKz0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdpdHNbcmVzX25k aWdpdHMgLSAzXTsKKwkJCQlyZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gMl0gPSAoTnVtZXJp Y0RpZ2l0KSAobmV3ZGlnICUgTkJBU0UpOworCQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7 CisJCQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSA0OyBpID49IDE7IGktLSkKKwkJCQl7CisJ CQkJCW5ld2RpZyA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldICsKKwkJ CQkJCShpbnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzW2kgLSAxXSArIGNhcnJ5Owor CQkJCQlyZXNfZGlnaXRzW2kgKyAxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFT RSk7CisJCQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJfQorCQkJCW5ld2RpZyA9 IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzWzBdICsgY2Fycnk7CisJCQkJcmVz X2RpZ2l0c1sxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJCQkJcmVz X2RpZ2l0c1swXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgLyBOQkFTRSk7CisJCQkJYnJl YWs7CisKKwkJCWNhc2UgMzoKKwkJCQlpZiAocmVzX25kaWdpdHMgLSA1ID49IDAgJiYgcmVz X25kaWdpdHMgLSA1IDwgdmFyMm5kaWdpdHMpCisJCQkJCW5ld2RpZyA9IChpbnQpIHZhcjFk aWdpdHNbMl0gKiB2YXIyZGlnaXRzW3Jlc19uZGlnaXRzIC0gNV07CisJCQkJZWxzZQorCQkJ CQluZXdkaWcgPSAwOworCQkJCWlmIChyZXNfbmRpZ2l0cyAtIDQgPj0gMCAmJiByZXNfbmRp Z2l0cyAtIDQgPCB2YXIybmRpZ2l0cykKKwkJCQkJbmV3ZGlnICs9IChpbnQpIHZhcjFkaWdp dHNbMV0gKiB2YXIyZGlnaXRzW3Jlc19uZGlnaXRzIC0gNF07CisJCQkJaWYgKHJlc19uZGln aXRzIC0gMyA+PSAwICYmIHJlc19uZGlnaXRzIC0gMyA8IHZhcjJuZGlnaXRzKQorCQkJCQlu ZXdkaWcgKz0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdpdHNbcmVzX25kaWdpdHMg LSAzXTsKKwkJCQlyZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gMl0gPSAoTnVtZXJpY0RpZ2l0 KSAobmV3ZGlnICUgTkJBU0UpOworCQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJ Zm9yIChpID0gcmVzX25kaWdpdHMgLSA0OyBpID49IDI7IGktLSkKKwkJCQl7CisJCQkJCW5l d2RpZyA9IGNhcnJ5OworCQkJCQlpZiAoaSA8IHZhcjJuZGlnaXRzKQorCQkJCQkJbmV3ZGln ICs9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldOworCQkJCQlpZiAoaSAt IDEgPj0gMCAmJiBpIC0gMSA8IHZhcjJuZGlnaXRzKQorCQkJCQkJbmV3ZGlnICs9IChpbnQp IHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzW2kgLSAxXTsKKwkJCQkJaWYgKGkgLSAyID49 IDAgJiYgaSAtIDIgPCB2YXIybmRpZ2l0cykKKwkJCQkJCW5ld2RpZyArPSAoaW50KSB2YXIx ZGlnaXRzWzJdICogdmFyMmRpZ2l0c1tpIC0gMl07CisJCQkJCXJlc19kaWdpdHNbaSArIDFd ID0gKE51bWVyaWNEaWdpdCkgKG5ld2RpZyAlIE5CQVNFKTsKKwkJCQkJY2FycnkgPSBuZXdk aWcgLyBOQkFTRTsKKwkJCQl9CisJCQkJbmV3ZGlnID0gY2Fycnk7CisJCQkJaWYgKHZhcjJu ZGlnaXRzID4gMSkKKwkJCQkJbmV3ZGlnICs9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIy ZGlnaXRzWzFdOworCQkJCWlmICh2YXIybmRpZ2l0cyA+IDApCisJCQkJCW5ld2RpZyArPSAo aW50KSB2YXIxZGlnaXRzWzFdICogdmFyMmRpZ2l0c1swXTsKKwkJCQlyZXNfZGlnaXRzWzJd ID0gKE51bWVyaWNEaWdpdCkgKG5ld2RpZyAlIE5CQVNFKTsKKwkJCQljYXJyeSA9IG5ld2Rp ZyAvIE5CQVNFOworCQkJCW5ld2RpZyA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGln aXRzWzBdICsgY2Fycnk7CisJCQkJcmVzX2RpZ2l0c1sxXSA9IChOdW1lcmljRGlnaXQpIChu ZXdkaWcgJSBOQkFTRSk7CisJCQkJcmVzX2RpZ2l0c1swXSA9IChOdW1lcmljRGlnaXQpIChu ZXdkaWcgLyBOQkFTRSk7CisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBTdG9yZSB0aGUgcHJv ZHVjdCBpbiByZXN1bHQgKG1pbnVzIGV4dHJhIHJvdW5kaW5nIGRpZ2l0KSAqLworCQlkaWdp dGJ1Zl9mcmVlKHJlc3VsdC0+YnVmKTsKKwkJcmVzdWx0LT5uZGlnaXRzID0gcmVzX25kaWdp dHMgLSAxOworCQlyZXN1bHQtPmJ1ZiA9IHJlc19idWY7CisJCXJlc3VsdC0+ZGlnaXRzID0g cmVzX2RpZ2l0czsKKwkJcmVzdWx0LT53ZWlnaHQgPSByZXNfd2VpZ2h0IC0gMTsKKwkJcmVz dWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAo YW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwkJcm91bmRfdmFyKHJlc3VsdCwgcnNjYWxl KTsKKworCQkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB6ZXJvZXMgKi8KKwkJc3Ry aXBfdmFyKHJlc3VsdCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2UgZG8gdGhl IGFyaXRobWV0aWMgaW4gYW4gYXJyYXkgImRpZ1tdIiBvZiBzaWduZWQgaW50J3MuICBTaW5j ZQorCSAqIElOVF9NQVggaXMgbm90aWNlYWJseSBsYXJnZXIgdGhhbiBOQkFTRSpOQkFTRSwg dGhpcyBnaXZlcyB1cyBoZWFkcm9vbQorCSAqIHRvIGF2b2lkIG5vcm1hbGl6aW5nIGNhcnJp ZXMgaW1tZWRpYXRlbHkuCisJICoKKwkgKiBtYXhkaWcgdHJhY2tzIHRoZSBtYXhpbXVtIHBv c3NpYmxlIHZhbHVlIG9mIGFueSBkaWdbXSBlbnRyeTsgd2hlbiB0aGlzCisJICogdGhyZWF0 ZW5zIHRvIGV4Y2VlZCBJTlRfTUFYLCB3ZSB0YWtlIHRoZSB0aW1lIHRvIHByb3BhZ2F0ZSBj YXJyaWVzLgorCSAqIEZ1cnRoZXJtb3JlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IG92ZXJm bG93IGRvZXNuJ3Qgb2NjdXIgZHVyaW5nIHRoZQorCSAqIGNhcnJ5IHByb3BhZ2F0aW9uIHBh c3NlcyBlaXRoZXIuICBUaGUgY2FycnkgdmFsdWVzIGNvdWxkIGJlIGFzIG11Y2ggYXMKKwkg KiBJTlRfTUFYL05CQVNFLCBzbyByZWFsbHkgd2UgbXVzdCBub3JtYWxpemUgd2hlbiBkaWdp dHMgdGhyZWF0ZW4gdG8KKwkgKiBleGNlZWQgSU5UX01BWCAtIElOVF9NQVgvTkJBU0UuCisJ ICoKKwkgKiBUbyBhdm9pZCBvdmVyZmxvdyBpbiBtYXhkaWcgaXRzZWxmLCBpdCBhY3R1YWxs eSByZXByZXNlbnRzIHRoZSBtYXgKKwkgKiBwb3NzaWJsZSB2YWx1ZSBkaXZpZGVkIGJ5IE5C QVNFLTEsIGllLCBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGl0IGlzCisJICoga25vd24gdGhh dCBubyBkaWdbXSBlbnRyeSBleGNlZWRzIG1heGRpZyAqIChOQkFTRS0xKS4KKwkgKi8KKwlk aWcgPSAoaW50ICopIHBhbGxvYzAocmVzX25kaWdpdHMgKiBzaXplb2YoaW50KSk7CisJbWF4 ZGlnID0gMDsKKworCS8qCisJICogVGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyBvZiB2 YXIxIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QKKwkgKiBjb250cmlidXRlIGRp cmVjdGx5IHRvIHRoZSBmaXJzdCByZXNfbmRpZ2l0cyBkaWdpdHMgb2YgdGhlIHJlc3VsdCB0 aGF0CisJICogd2UgYXJlIGNvbXB1dGluZy4KKwkgKgorCSAqIERpZ2l0IGkxIG9mIHZhcjEg YW5kIGRpZ2l0IGkyIG9mIHZhcjIgYXJlIG11bHRpcGxpZWQgYW5kIGFkZGVkIHRvIGRpZ2l0 CisJICogaTEraTIrMiBvZiB0aGUgYWNjdW11bGF0b3IgYXJyYXksIHNvIHdlIG5lZWQgb25s eSBjb25zaWRlciBkaWdpdHMgb2YKKwkgKiB2YXIxIGZvciB3aGljaCBpMSA8PSByZXNfbmRp Z2l0cyAtIDMuCisJICovCisJZm9yIChpMSA9IE1pbih2YXIxbmRpZ2l0cyAtIDEsIHJlc19u ZGlnaXRzIC0gMyk7IGkxID49IDA7IGkxLS0pCisJeworCQlOdW1lcmljRGlnaXQgdmFyMWRp Z2l0ID0gdmFyMWRpZ2l0c1tpMV07CisKKwkJaWYgKHZhcjFkaWdpdCA9PSAwKQorCQkJY29u dGludWU7CisKKwkJLyogVGltZSB0byBub3JtYWxpemU/ICovCisJCW1heGRpZyArPSB2YXIx ZGlnaXQ7CisJCWlmIChtYXhkaWcgPiAoSU5UX01BWCAtIElOVF9NQVggLyBOQkFTRSkgLyAo TkJBU0UgLSAxKSkKKwkJeworCQkJLyogWWVzLCBkbyBpdCAqLworCQkJY2FycnkgPSAwOwor CQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwkJCXsKKwkJCQlu ZXdkaWcgPSBkaWdbaV0gKyBjYXJyeTsKKwkJCQlpZiAobmV3ZGlnID49IE5CQVNFKQorCQkJ CXsKKwkJCQkJY2FycnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJCQkJbmV3ZGlnIC09IGNhcnJ5 ICogTkJBU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJY2FycnkgPSAwOworCQkJCWRpZ1tp XSA9IG5ld2RpZzsKKwkJCX0KKwkJCUFzc2VydChjYXJyeSA9PSAwKTsKKwkJCS8qIFJlc2V0 IG1heGRpZyB0byBpbmRpY2F0ZSBuZXcgd29yc3QtY2FzZSAqLworCQkJbWF4ZGlnID0gMSAr IHZhcjFkaWdpdDsKKwkJfQorCisJCS8qCisJCSAqIEFkZCB0aGUgYXBwcm9wcmlhdGUgbXVs dGlwbGUgb2YgdmFyMiBpbnRvIHRoZSBhY2N1bXVsYXRvci4KKwkJICoKKwkJICogQXMgYWJv dmUsIGRpZ2l0cyBvZiB2YXIyIGNhbiBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QgY29udHJp YnV0ZSwKKwkJICogc28gd2Ugb25seSBpbmNsdWRlIGRpZ2l0cyBmb3Igd2hpY2ggaTEraTIr MiA8IHJlc19uZGlnaXRzLgorCQkgKgorCQkgKiBUaGlzIGlubmVyIGxvb3AgaXMgdGhlIHBl cmZvcm1hbmNlIGJvdHRsZW5lY2sgZm9yIG11bHRpcGxpY2F0aW9uLAorCQkgKiBzbyB3ZSB3 YW50IHRvIGtlZXAgaXQgc2ltcGxlIGVub3VnaCBzbyB0aGF0IGl0IGNhbiBiZQorCQkgKiBh dXRvLXZlY3Rvcml6ZWQuICBBY2NvcmRpbmdseSwgcHJvY2VzcyB0aGUgZGlnaXRzIGxlZnQt dG8tcmlnaHQKKwkJICogZXZlbiB0aG91Z2ggc2Nob29sYm9vayBtdWx0aXBsaWNhdGlvbiB3 b3VsZCBzdWdnZXN0IHJpZ2h0LXRvLWxlZnQuCisJCSAqIFNpbmNlIHdlIGFyZW4ndCBwcm9w YWdhdGluZyBjYXJyaWVzIGluIHRoaXMgbG9vcCwgdGhlIG9yZGVyIGRvZXMKKwkJICogbm90 IG1hdHRlci4KKwkJICovCisJCXsKKwkJCWludAkJCWkybGltaXQgPSBNaW4odmFyMm5kaWdp dHMsIHJlc19uZGlnaXRzIC0gaTEgLSAyKTsKKwkJCWludAkJICAgKmRpZ19pMV8yID0gJmRp Z1tpMSArIDJdOworCisJCQlmb3IgKGkyID0gMDsgaTIgPCBpMmxpbWl0OyBpMisrKQorCQkJ eworCQkJCWRpZ19pMV8yW2kyXSArPSB2YXIxZGlnaXQgKiB2YXIyZGlnaXRzW2kyXTsKKwkJ CX0KKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGRvIGEgZmluYWwgY2FycnkgcHJvcGFn YXRpb24gcGFzcyB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgd2hpY2gKKwkgKiB3ZSBjb21i aW5lIHdpdGggc3RvcmluZyB0aGUgcmVzdWx0IGRpZ2l0cyBpbnRvIHRoZSBvdXRwdXQuIE5v dGUgdGhhdAorCSAqIHRoaXMgaXMgc3RpbGwgZG9uZSBhdCBmdWxsIHByZWNpc2lvbiB3L2d1 YXJkIGRpZ2l0cy4KKwkgKi8KKwlhbGxvY192YXIocmVzdWx0LCByZXNfbmRpZ2l0cyk7CisJ cmVzX2RpZ2l0cyA9IHJlc3VsdC0+ZGlnaXRzOworCWNhcnJ5ID0gMDsKKwlmb3IgKGkgPSBy ZXNfbmRpZ2l0cyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkJbmV3ZGlnID0gZGlnW2ldICsg Y2Fycnk7CisJCWlmIChuZXdkaWcgPj0gTkJBU0UpCisJCXsKKwkJCWNhcnJ5ID0gbmV3ZGln IC8gTkJBU0U7CisJCQluZXdkaWcgLT0gY2FycnkgKiBOQkFTRTsKKwkJfQorCQllbHNlCisJ CQljYXJyeSA9IDA7CisJCXJlc19kaWdpdHNbaV0gPSBuZXdkaWc7CisJfQorCUFzc2VydChj YXJyeSA9PSAwKTsKKworCXBmcmVlKGRpZyk7CisKKwkvKgorCSAqIEZpbmFsbHksIHJvdW5k IHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24uCisJICovCisJcmVzdWx0 LT53ZWlnaHQgPSByZXNfd2VpZ2h0OworCXJlc3VsdC0+c2lnbiA9IHJlc19zaWduOworCisJ LyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8K Kwlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOworCisJLyogU3RyaXAgbGVhZGluZyBhbmQg dHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7CisKK30KKworCitzdGF0 aWMgdm9pZAorbXVsX3Zhcl9wYXRjaF9pbnQoY29uc3QgTnVtZXJpY1ZhciAqdmFyMSwgY29u c3QgTnVtZXJpY1ZhciAqdmFyMiwgTnVtZXJpY1ZhciAqcmVzdWx0LAorCQlpbnQgcnNjYWxl KQoreworCWludAkJCXJlc19uZGlnaXRzOworCWludAkJCXJlc19zaWduOworCWludAkJCXJl c193ZWlnaHQ7CisJaW50CQkJbWF4ZGlnaXRzOworCWludAkJICAgKmRpZzsKKwlpbnQJCQlj YXJyeTsKKwlpbnQJCQltYXhkaWc7CisJaW50CQkJbmV3ZGlnOworCWludAkJCXZhcjFuZGln aXRzOworCWludAkJCXZhcjJuZGlnaXRzOworCU51bWVyaWNEaWdpdCAqdmFyMWRpZ2l0czsK KwlOdW1lcmljRGlnaXQgKnZhcjJkaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICpyZXNfZGlnaXRz OworCWludAkJCWksCisJCQkJaTEsCisJCQkJaTI7CisKKwkvKgorCSAqIEFycmFuZ2UgZm9y IHZhcjEgdG8gYmUgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byBudW1iZXJzLiAgVGhpcyBpbXBy b3ZlcworCSAqIHBlcmZvcm1hbmNlIGJlY2F1c2UgdGhlIGlubmVyIG11bHRpcGxpY2F0aW9u IGxvb3AgaXMgbXVjaCBzaW1wbGVyIHRoYW4KKwkgKiB0aGUgb3V0ZXIgbG9vcCwgc28gaXQn cyBiZXR0ZXIgdG8gaGF2ZSBhIHNtYWxsZXIgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKwkgKiBv ZiB0aGUgb3V0ZXIgbG9vcC4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdGlt ZXMgdGhhdCB0aGUKKwkgKiBhY2N1bXVsYXRvciBhcnJheSBuZWVkcyB0byBiZSBub3JtYWxp emVkLgorCSAqLworCWlmICh2YXIxLT5uZGlnaXRzID4gdmFyMi0+bmRpZ2l0cykKKwl7CisJ CWNvbnN0IE51bWVyaWNWYXIgKnRtcCA9IHZhcjE7CisKKwkJdmFyMSA9IHZhcjI7CisJCXZh cjIgPSB0bXA7CisJfQorCisJLyogY29weSB0aGVzZSB2YWx1ZXMgaW50byBsb2NhbCB2YXJz IGZvciBzcGVlZCBpbiBpbm5lciBsb29wICovCisJdmFyMW5kaWdpdHMgPSB2YXIxLT5uZGln aXRzOworCXZhcjJuZGlnaXRzID0gdmFyMi0+bmRpZ2l0czsKKwl2YXIxZGlnaXRzID0gdmFy MS0+ZGlnaXRzOworCXZhcjJkaWdpdHMgPSB2YXIyLT5kaWdpdHM7CisKKwlpZiAodmFyMW5k aWdpdHMgPT0gMCkKKwl7CisJCS8qIG9uZSBvciBib3RoIGlucHV0cyBpcyB6ZXJvOyBzbyBp cyByZXN1bHQgKi8KKwkJemVyb192YXIocmVzdWx0KTsKKwkJcmVzdWx0LT5kc2NhbGUgPSBy c2NhbGU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHZhcjEgaGFzIGp1c3Qgb25l IG9yIHR3byBkaWdpdHMsIGRlbGVnYXRlIHRvIG11bF92YXJfaW50KCksIHdoaWNoCisJICog dXNlcyBhIGZhc3RlciBkaXJlY3QgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtLgorCSAqCisJ ICogVE9ETzogU2ltaWxhcmx5LCBvbiBwbGF0Zm9ybXMgd2l0aCAxMjgtYml0IGludGVnZXJz IC4uLgorCSAqLworCWlmICh2YXIxbmRpZ2l0cyA8PSAyKQorCXsKKwkJaW50CQkJaWZhY3Rv cjsKKwkJaW50CQkJaWZhY3Rvcl93ZWlnaHQ7CisKKwkJaWZhY3RvciA9IHZhcjEtPmRpZ2l0 c1swXTsKKwkJaWZhY3Rvcl93ZWlnaHQgPSB2YXIxLT53ZWlnaHQ7CisJCWlmICh2YXIxbmRp Z2l0cyA9PSAyKQorCQl7CisJCQlpZmFjdG9yID0gaWZhY3RvciAqIE5CQVNFICsgdmFyMS0+ ZGlnaXRzWzFdOworCQkJaWZhY3Rvcl93ZWlnaHQtLTsKKwkJfQorCQlpZiAodmFyMS0+c2ln biA9PSBOVU1FUklDX05FRykKKwkJCWlmYWN0b3IgPSAtaWZhY3RvcjsKKworCQltdWxfdmFy X2ludCh2YXIyLCBpZmFjdG9yLCBpZmFjdG9yX3dlaWdodCwgcmVzdWx0LCByc2NhbGUpOwor CQlyZXR1cm47CisJfQorCisJLyogRGV0ZXJtaW5lIHJlc3VsdCBzaWduIGFuZCAobWF4aW11 bSBwb3NzaWJsZSkgd2VpZ2h0ICovCisJaWYgKHZhcjEtPnNpZ24gPT0gdmFyMi0+c2lnbikK KwkJcmVzX3NpZ24gPSBOVU1FUklDX1BPUzsKKwllbHNlCisJCXJlc19zaWduID0gTlVNRVJJ Q19ORUc7CisJcmVzX3dlaWdodCA9IHZhcjEtPndlaWdodCArIHZhcjItPndlaWdodCArIDI7 CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHJlc3VsdCBkaWdpdHMgdG8g Y29tcHV0ZS4gIElmIHRoZSBleGFjdCByZXN1bHQKKwkgKiB3b3VsZCBoYXZlIG1vcmUgdGhh biByc2NhbGUgZnJhY3Rpb25hbCBkaWdpdHMsIHRydW5jYXRlIHRoZSBjb21wdXRhdGlvbgor CSAqIHdpdGggTVVMX0dVQVJEX0RJR0lUUyBndWFyZCBkaWdpdHMsIGkuZS4sIGlnbm9yZSBp bnB1dCBkaWdpdHMgdGhhdAorCSAqIHdvdWxkIG9ubHkgY29udHJpYnV0ZSB0byB0aGUgcmln aHQgb2YgdGhhdC4gIChUaGlzIHdpbGwgZ2l2ZSB0aGUgZXhhY3QKKwkgKiByb3VuZGVkLXRv LXJzY2FsZSBhbnN3ZXIgdW5sZXNzIGNhcnJpZXMgb3V0IG9mIHRoZSBpZ25vcmVkIHBvc2l0 aW9ucworCSAqIHdvdWxkIGhhdmUgcHJvcGFnYXRlZCB0aHJvdWdoIG1vcmUgdGhhbiBNVUxf R1VBUkRfRElHSVRTIGRpZ2l0cy4pCisJICoKKwkgKiBOb3RlOiBhbiBleGFjdCBjb21wdXRh dGlvbiBjb3VsZCBub3QgcHJvZHVjZSBtb3JlIHRoYW4gdmFyMW5kaWdpdHMgKworCSAqIHZh cjJuZGlnaXRzIGRpZ2l0cywgYnV0IHdlIGFsbG9jYXRlIG9uZSBleHRyYSBvdXRwdXQgZGln aXQgaW4gY2FzZQorCSAqIHJzY2FsZS1kcml2ZW4gcm91bmRpbmcgcHJvZHVjZXMgYSBjYXJy eSBvdXQgb2YgdGhlIGhpZ2hlc3QgZXhhY3QgZGlnaXQuCisJICovCisJcmVzX25kaWdpdHMg PSB2YXIxbmRpZ2l0cyArIHZhcjJuZGlnaXRzICsgMTsKKwltYXhkaWdpdHMgPSByZXNfd2Vp Z2h0ICsgMSArIChyc2NhbGUgKyBERUNfRElHSVRTIC0gMSkgLyBERUNfRElHSVRTICsKKwkJ TVVMX0dVQVJEX0RJR0lUUzsKKwlyZXNfbmRpZ2l0cyA9IE1pbihyZXNfbmRpZ2l0cywgbWF4 ZGlnaXRzKTsKKworCWlmIChyZXNfbmRpZ2l0cyA8IDMpCisJeworCQkvKiBBbGwgaW5wdXQg ZGlnaXRzIHdpbGwgYmUgaWdub3JlZDsgc28gcmVzdWx0IGlzIHplcm8gKi8KKwkJemVyb192 YXIocmVzdWx0KTsKKwkJcmVzdWx0LT5kc2NhbGUgPSByc2NhbGU7CisJCXJldHVybjsKKwl9 CisKKwkvKgorCSAqIFdlIGRvIHRoZSBhcml0aG1ldGljIGluIGFuIGFycmF5ICJkaWdbXSIg b2Ygc2lnbmVkIGludCdzLiAgU2luY2UKKwkgKiBJTlRfTUFYIGlzIG5vdGljZWFibHkgbGFy Z2VyIHRoYW4gTkJBU0UqTkJBU0UsIHRoaXMgZ2l2ZXMgdXMgaGVhZHJvb20KKwkgKiB0byBh dm9pZCBub3JtYWxpemluZyBjYXJyaWVzIGltbWVkaWF0ZWx5LgorCSAqCisJICogbWF4ZGln IHRyYWNrcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBvZiBhbnkgZGlnW10gZW50cnk7 IHdoZW4gdGhpcworCSAqIHRocmVhdGVucyB0byBleGNlZWQgSU5UX01BWCwgd2UgdGFrZSB0 aGUgdGltZSB0byBwcm9wYWdhdGUgY2Fycmllcy4KKwkgKiBGdXJ0aGVybW9yZSwgd2UgbmVl ZCB0byBlbnN1cmUgdGhhdCBvdmVyZmxvdyBkb2Vzbid0IG9jY3VyIGR1cmluZyB0aGUKKwkg KiBjYXJyeSBwcm9wYWdhdGlvbiBwYXNzZXMgZWl0aGVyLiAgVGhlIGNhcnJ5IHZhbHVlcyBj b3VsZCBiZSBhcyBtdWNoIGFzCisJICogSU5UX01BWC9OQkFTRSwgc28gcmVhbGx5IHdlIG11 c3Qgbm9ybWFsaXplIHdoZW4gZGlnaXRzIHRocmVhdGVuIHRvCisJICogZXhjZWVkIElOVF9N QVggLSBJTlRfTUFYL05CQVNFLgorCSAqCisJICogVG8gYXZvaWQgb3ZlcmZsb3cgaW4gbWF4 ZGlnIGl0c2VsZiwgaXQgYWN0dWFsbHkgcmVwcmVzZW50cyB0aGUgbWF4CisJICogcG9zc2li bGUgdmFsdWUgZGl2aWRlZCBieSBOQkFTRS0xLCBpZSwgYXQgdGhlIHRvcCBvZiB0aGUgbG9v cCBpdCBpcworCSAqIGtub3duIHRoYXQgbm8gZGlnW10gZW50cnkgZXhjZWVkcyBtYXhkaWcg KiAoTkJBU0UtMSkuCisJICovCisJZGlnID0gKGludCAqKSBwYWxsb2MwKHJlc19uZGlnaXRz ICogc2l6ZW9mKGludCkpOworCW1heGRpZyA9IDA7CisKKwkvKgorCSAqIFRoZSBsZWFzdCBz aWduaWZpY2FudCBkaWdpdHMgb2YgdmFyMSBzaG91bGQgYmUgaWdub3JlZCBpZiB0aGV5IGRv bid0CisJICogY29udHJpYnV0ZSBkaXJlY3RseSB0byB0aGUgZmlyc3QgcmVzX25kaWdpdHMg ZGlnaXRzIG9mIHRoZSByZXN1bHQgdGhhdAorCSAqIHdlIGFyZSBjb21wdXRpbmcuCisJICoK KwkgKiBEaWdpdCBpMSBvZiB2YXIxIGFuZCBkaWdpdCBpMiBvZiB2YXIyIGFyZSBtdWx0aXBs aWVkIGFuZCBhZGRlZCB0byBkaWdpdAorCSAqIGkxK2kyKzIgb2YgdGhlIGFjY3VtdWxhdG9y IGFycmF5LCBzbyB3ZSBuZWVkIG9ubHkgY29uc2lkZXIgZGlnaXRzIG9mCisJICogdmFyMSBm b3Igd2hpY2ggaTEgPD0gcmVzX25kaWdpdHMgLSAzLgorCSAqLworCWZvciAoaTEgPSBNaW4o dmFyMW5kaWdpdHMgLSAxLCByZXNfbmRpZ2l0cyAtIDMpOyBpMSA+PSAwOyBpMS0tKQorCXsK KwkJTnVtZXJpY0RpZ2l0IHZhcjFkaWdpdCA9IHZhcjFkaWdpdHNbaTFdOworCisJCWlmICh2 YXIxZGlnaXQgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFRpbWUgdG8gbm9ybWFsaXpl PyAqLworCQltYXhkaWcgKz0gdmFyMWRpZ2l0OworCQlpZiAobWF4ZGlnID4gKElOVF9NQVgg LSBJTlRfTUFYIC8gTkJBU0UpIC8gKE5CQVNFIC0gMSkpCisJCXsKKwkJCS8qIFllcywgZG8g aXQgKi8KKwkJCWNhcnJ5ID0gMDsKKwkJCWZvciAoaSA9IHJlc19uZGlnaXRzIC0gMTsgaSA+ PSAwOyBpLS0pCisJCQl7CisJCQkJbmV3ZGlnID0gZGlnW2ldICsgY2Fycnk7CisJCQkJaWYg KG5ld2RpZyA+PSBOQkFTRSkKKwkJCQl7CisJCQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7 CisJCQkJCW5ld2RpZyAtPSBjYXJyeSAqIE5CQVNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJ CWNhcnJ5ID0gMDsKKwkJCQlkaWdbaV0gPSBuZXdkaWc7CisJCQl9CisJCQlBc3NlcnQoY2Fy cnkgPT0gMCk7CisJCQkvKiBSZXNldCBtYXhkaWcgdG8gaW5kaWNhdGUgbmV3IHdvcnN0LWNh c2UgKi8KKwkJCW1heGRpZyA9IDEgKyB2YXIxZGlnaXQ7CisJCX0KKworCQkvKgorCQkgKiBB ZGQgdGhlIGFwcHJvcHJpYXRlIG11bHRpcGxlIG9mIHZhcjIgaW50byB0aGUgYWNjdW11bGF0 b3IuCisJCSAqCisJCSAqIEFzIGFib3ZlLCBkaWdpdHMgb2YgdmFyMiBjYW4gYmUgaWdub3Jl ZCBpZiB0aGV5IGRvbid0IGNvbnRyaWJ1dGUsCisJCSAqIHNvIHdlIG9ubHkgaW5jbHVkZSBk aWdpdHMgZm9yIHdoaWNoIGkxK2kyKzIgPCByZXNfbmRpZ2l0cy4KKwkJICoKKwkJICogVGhp cyBpbm5lciBsb29wIGlzIHRoZSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIGZvciBtdWx0aXBs aWNhdGlvbiwKKwkJICogc28gd2Ugd2FudCB0byBrZWVwIGl0IHNpbXBsZSBlbm91Z2ggc28g dGhhdCBpdCBjYW4gYmUKKwkJICogYXV0by12ZWN0b3JpemVkLiAgQWNjb3JkaW5nbHksIHBy b2Nlc3MgdGhlIGRpZ2l0cyBsZWZ0LXRvLXJpZ2h0CisJCSAqIGV2ZW4gdGhvdWdoIHNjaG9v bGJvb2sgbXVsdGlwbGljYXRpb24gd291bGQgc3VnZ2VzdCByaWdodC10by1sZWZ0LgorCQkg KiBTaW5jZSB3ZSBhcmVuJ3QgcHJvcGFnYXRpbmcgY2FycmllcyBpbiB0aGlzIGxvb3AsIHRo ZSBvcmRlciBkb2VzCisJCSAqIG5vdCBtYXR0ZXIuCisJCSAqLworCQl7CisJCQlpbnQJCQlp MmxpbWl0ID0gTWluKHZhcjJuZGlnaXRzLCByZXNfbmRpZ2l0cyAtIGkxIC0gMik7CisJCQlp bnQJCSAgICpkaWdfaTFfMiA9ICZkaWdbaTEgKyAyXTsKKworCQkJZm9yIChpMiA9IDA7IGky IDwgaTJsaW1pdDsgaTIrKykKKwkJCQlkaWdfaTFfMltpMl0gKz0gdmFyMWRpZ2l0ICogdmFy MmRpZ2l0c1tpMl07CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBkbyBhIGZpbmFsIGNh cnJ5IHByb3BhZ2F0aW9uIHBhc3MgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHdoaWNoCisJ ICogd2UgY29tYmluZSB3aXRoIHN0b3JpbmcgdGhlIHJlc3VsdCBkaWdpdHMgaW50byB0aGUg b3V0cHV0LiBOb3RlIHRoYXQKKwkgKiB0aGlzIGlzIHN0aWxsIGRvbmUgYXQgZnVsbCBwcmVj aXNpb24gdy9ndWFyZCBkaWdpdHMuCisJICovCisJYWxsb2NfdmFyKHJlc3VsdCwgcmVzX25k aWdpdHMpOworCXJlc19kaWdpdHMgPSByZXN1bHQtPmRpZ2l0czsKKwljYXJyeSA9IDA7CisJ Zm9yIChpID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwl7CisJCW5ld2RpZyA9 IGRpZ1tpXSArIGNhcnJ5OworCQlpZiAobmV3ZGlnID49IE5CQVNFKQorCQl7CisJCQljYXJy eSA9IG5ld2RpZyAvIE5CQVNFOworCQkJbmV3ZGlnIC09IGNhcnJ5ICogTkJBU0U7CisJCX0K KwkJZWxzZQorCQkJY2FycnkgPSAwOworCQlyZXNfZGlnaXRzW2ldID0gbmV3ZGlnOworCX0K KwlBc3NlcnQoY2FycnkgPT0gMCk7CisKKwlwZnJlZShkaWcpOworCisJLyoKKwkgKiBGaW5h bGx5LCByb3VuZCB0aGUgcmVzdWx0IHRvIHRoZSByZXF1ZXN0ZWQgcHJlY2lzaW9uLgorCSAq LworCXJlc3VsdC0+d2VpZ2h0ID0gcmVzX3dlaWdodDsKKwlyZXN1bHQtPnNpZ24gPSByZXNf c2lnbjsKKworCS8qIFJvdW5kIHRvIHRhcmdldCByc2NhbGUgKGFuZCBzZXQgcmVzdWx0LT5k c2NhbGUpICovCisJcm91bmRfdmFyKHJlc3VsdCwgcnNjYWxlKTsKKworCS8qIFN0cmlwIGxl YWRpbmcgYW5kIHRyYWlsaW5nIHplcm9lcyAqLworCXN0cmlwX3ZhcihyZXN1bHQpOworfQor CisvKgorICogbXVsX3Zhcl9pbnQoKSAtCisgKgorICoJTXVsdGlwbHkgYSBudW1lcmljIHZh cmlhYmxlIGJ5IGEgMzItYml0IGludGVnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHdlaWdodC4K KyAqCVRoZSBwcm9kdWN0IHZhciAqIGl2YWwgKiBOQkFTRV5pdmFsX3dlaWdodCBpcyBzdG9y ZWQgaW4gcmVzdWx0LgorICovCitzdGF0aWMgdm9pZAorbXVsX3Zhcl9pbnQoY29uc3QgTnVt ZXJpY1ZhciAqdmFyLCBpbnQgaXZhbCwgaW50IGl2YWxfd2VpZ2h0LAorCQkJTnVtZXJpY1Zh ciAqcmVzdWx0LCBpbnQgcnNjYWxlKQoreworCU51bWVyaWNEaWdpdCAqdmFyX2RpZ2l0cyA9 IHZhci0+ZGlnaXRzOworCWludAkJCXZhcl9uZGlnaXRzID0gdmFyLT5uZGlnaXRzOworCWlu dAkJCXJlc19zaWduOworCWludAkJCXJlc193ZWlnaHQ7CisJaW50CQkJcmVzX25kaWdpdHM7 CisJaW50CQkJbWF4ZGlnaXRzOworCU51bWVyaWNEaWdpdCAqcmVzX2J1ZjsKKwlOdW1lcmlj RGlnaXQgKnJlc19kaWdpdHM7CisJdWludDMyCQlmYWN0b3I7CisJdWludDMyCQljYXJyeTsK KworCWlmIChpdmFsID09IDAgfHwgdmFyX25kaWdpdHMgPT0gMCkKKwl7CisJCXplcm9fdmFy KHJlc3VsdCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxlOworCQlyZXR1cm47CisJfQor CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHJlc3VsdCBzaWduLCAobWF4aW11bSBwb3NzaWJs ZSkgd2VpZ2h0IGFuZCBudW1iZXIgb2YKKwkgKiBkaWdpdHMgdG8gY2FsY3VsYXRlLiAgVGhl IHdlaWdodCBmaWd1cmVkIGhlcmUgaXMgY29ycmVjdCBpZiB0aGUgZW1pdHRlZAorCSAqIHBy b2R1Y3QgaGFzIG5vIGxlYWRpbmcgemVybyBkaWdpdHM7IG90aGVyd2lzZSBzdHJpcF92YXIo KSB3aWxsIGZpeAorCSAqIHRoaW5ncyB1cC4KKwkgKi8KKwlpZiAodmFyLT5zaWduID09IE5V TUVSSUNfUE9TKQorCQlyZXNfc2lnbiA9IGl2YWwgPiAwID8gTlVNRVJJQ19QT1MgOiBOVU1F UklDX05FRzsKKwllbHNlCisJCXJlc19zaWduID0gaXZhbCA+IDAgPyBOVU1FUklDX05FRyA6 IE5VTUVSSUNfUE9TOworCXJlc193ZWlnaHQgPSB2YXItPndlaWdodCArIGl2YWxfd2VpZ2h0 ICsgMzsKKwkvKiBUaGUgbnVtYmVyIG9mIGFjY3VyYXRlIHJlc3VsdCBkaWdpdHMgd2UgbmVl ZCB0byBwcm9kdWNlOiAqLworCXJlc19uZGlnaXRzID0gdmFyX25kaWdpdHMgKyAzOworCW1h eGRpZ2l0cyA9IHJlc193ZWlnaHQgKyAxICsgKHJzY2FsZSArIERFQ19ESUdJVFMgLSAxKSAv IERFQ19ESUdJVFMgKworCQlNVUxfR1VBUkRfRElHSVRTOworCXJlc19uZGlnaXRzID0gTWlu KHJlc19uZGlnaXRzLCBtYXhkaWdpdHMpOworCisJaWYgKHJlc19uZGlnaXRzIDwgMykKKwl7 CisJCS8qIEFsbCBpbnB1dCBkaWdpdHMgd2lsbCBiZSBpZ25vcmVkOyBzbyByZXN1bHQgaXMg emVybyAqLworCQl6ZXJvX3ZhcihyZXN1bHQpOworCQlyZXN1bHQtPmRzY2FsZSA9IHJzY2Fs ZTsKKwkJcmV0dXJuOworCX0KKworCXJlc19idWYgPSBkaWdpdGJ1Zl9hbGxvYyhyZXNfbmRp Z2l0cyArIDEpOworCXJlc19idWZbMF0gPSAwOwkJCQkvKiBzcGFyZSBkaWdpdCBmb3IgbGF0 ZXIgcm91bmRpbmcgKi8KKwlyZXNfZGlnaXRzID0gcmVzX2J1ZiArIDE7CisKKwkvKgorCSAq IE5vdyBjb21wdXRlIHRoZSBwcm9kdWN0IGRpZ2l0cyBieSBwcm9jc3NpbmcgdGhlIGlucHV0 IGRpZ2l0cyBpbiByZXZlcnNlCisJICogYW5kIHByb3BhZ2F0aW5nIHRoZSBjYXJyeSB1cCBh cyB3ZSBnby4KKwkgKgorCSAqIEluIHRoaXMgYWxnb3JpdGhtLCB0aGUgY2FycnkgZnJvbSBv bmUgZGlnaXQgdG8gdGhlIG5leHQgaXMgYXQgbW9zdAorCSAqIGZhY3RvciAtIDEsIGFuZCBw cm9kdWN0IGlzIGF0IG1vc3QgZmFjdG9yICogTkJBU0UgLSAxLCBhbmQgc28gaXQgbmVlZHMK KwkgKiB0byBiZSBhIDY0LWJpdCBpbnRlZ2VyIGlmIHRoaXMgZXhjZWVkcyBVSU5UX01BWC4K KwkgKi8KKwlmYWN0b3IgPSBhYnMoaXZhbCk7CisJY2FycnkgPSAwOworCisJaWYgKGZhY3Rv ciA8PSBVSU5UX01BWCAvIE5CQVNFKQorCXsKKwkJLyogcHJvZHVjdCBjYW5ub3Qgb3ZlcmZs b3cgMzIgYml0cyAqLworCQl1aW50MzIJCXByb2R1Y3Q7CisKKwkJZm9yIChpbnQgaSA9IHJl c19uZGlnaXRzIC0gNDsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCXByb2R1Y3QgPSBmYWN0b3Ig KiB2YXJfZGlnaXRzW2ldICsgY2Fycnk7CisJCQlyZXNfZGlnaXRzW2kgKyAzXSA9IChOdW1l cmljRGlnaXQpIChwcm9kdWN0ICUgTkJBU0UpOworCQkJY2FycnkgPSBwcm9kdWN0IC8gTkJB U0U7CisJCX0KKwkJcmVzX2RpZ2l0c1syXSA9IChOdW1lcmljRGlnaXQpIChjYXJyeSAlIE5C QVNFKTsKKwkJY2FycnkgPSBjYXJyeSAvIE5CQVNFOworCQlyZXNfZGlnaXRzWzFdID0gKE51 bWVyaWNEaWdpdCkgKGNhcnJ5ICUgTkJBU0UpOworCQlyZXNfZGlnaXRzWzBdID0gKE51bWVy aWNEaWdpdCkgKGNhcnJ5IC8gTkJBU0UpOworCX0KKwllbHNlCisJeworCQkvKiBwcm9kdWN0 IG1heSBleGNlZWQgMzIgYml0cyAqLworCQl1aW50NjQJCXByb2R1Y3Q7CisKKwkJZm9yIChp bnQgaSA9IHJlc19uZGlnaXRzIC0gNDsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCXByb2R1Y3Qg PSAodWludDY0KSBmYWN0b3IgKiB2YXJfZGlnaXRzW2ldICsgY2Fycnk7CisJCQlyZXNfZGln aXRzW2kgKyAzXSA9IChOdW1lcmljRGlnaXQpIChwcm9kdWN0ICUgTkJBU0UpOworCQkJY2Fy cnkgPSAodWludDMyKSAocHJvZHVjdCAvIE5CQVNFKTsKKwkJfQorCQlyZXNfZGlnaXRzWzJd ID0gKE51bWVyaWNEaWdpdCkgKGNhcnJ5ICUgTkJBU0UpOworCQljYXJyeSA9IGNhcnJ5IC8g TkJBU0U7CisJCXJlc19kaWdpdHNbMV0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgJSBOQkFT RSk7CisJCXJlc19kaWdpdHNbMF0gPSAoTnVtZXJpY0RpZ2l0KSAoY2FycnkgLyBOQkFTRSk7 CisJfQorCisJLyogU3RvcmUgdGhlIHByb2R1Y3QgaW4gcmVzdWx0ICovCisJZGlnaXRidWZf ZnJlZShyZXN1bHQtPmJ1Zik7CisJcmVzdWx0LT5uZGlnaXRzID0gcmVzX25kaWdpdHM7CisJ cmVzdWx0LT5idWYgPSByZXNfYnVmOworCXJlc3VsdC0+ZGlnaXRzID0gcmVzX2RpZ2l0czsK KwlyZXN1bHQtPndlaWdodCA9IHJlc193ZWlnaHQ7CisJcmVzdWx0LT5zaWduID0gcmVzX3Np Z247CisKKwkvKiBSb3VuZCB0byB0YXJnZXQgcnNjYWxlIChhbmQgc2V0IHJlc3VsdC0+ZHNj YWxlKSAqLworCXJvdW5kX3ZhcihyZXN1bHQsIHJzY2FsZSk7CisKKwkvKiBTdHJpcCBsZWFk aW5nIGFuZCB0cmFpbGluZyB6ZXJvZXMgKi8KKwlzdHJpcF92YXIocmVzdWx0KTsKK30KKwor CitzdGF0aWMgdm9pZAorbXVsX3Zhcl9wYXRjaF9zbWFsbChjb25zdCBOdW1lcmljVmFyICp2 YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLCBOdW1lcmljVmFyICpyZXN1bHQsCisJCWlu dCByc2NhbGUpCit7CisJaW50CQkJcmVzX25kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJ aW50CQkJcmVzX3dlaWdodDsKKwlpbnQJCQltYXhkaWdpdHM7CisJaW50CQkgICAqZGlnOwor CWludAkJCWNhcnJ5OworCWludAkJCW1heGRpZzsKKwlpbnQJCQluZXdkaWc7CisJaW50CQkJ dmFyMW5kaWdpdHM7CisJaW50CQkJdmFyMm5kaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICp2YXIx ZGlnaXRzOworCU51bWVyaWNEaWdpdCAqdmFyMmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJl c19kaWdpdHM7CisJaW50CQkJaSwKKwkJCQlpMSwKKwkJCQlpMjsKKworCS8qCisJICogQXJy YW5nZSBmb3IgdmFyMSB0byBiZSB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIG51bWJlcnMuICBU aGlzIGltcHJvdmVzCisJICogcGVyZm9ybWFuY2UgYmVjYXVzZSB0aGUgaW5uZXIgbXVsdGlw bGljYXRpb24gbG9vcCBpcyBtdWNoIHNpbXBsZXIgdGhhbgorCSAqIHRoZSBvdXRlciBsb29w LCBzbyBpdCdzIGJldHRlciB0byBoYXZlIGEgc21hbGxlciBudW1iZXIgb2YgaXRlcmF0aW9u cworCSAqIG9mIHRoZSBvdXRlciBsb29wLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIG51bWJl ciBvZiB0aW1lcyB0aGF0IHRoZQorCSAqIGFjY3VtdWxhdG9yIGFycmF5IG5lZWRzIHRvIGJl IG5vcm1hbGl6ZWQuCisJICovCisJaWYgKHZhcjEtPm5kaWdpdHMgPiB2YXIyLT5uZGlnaXRz KQorCXsKKwkJY29uc3QgTnVtZXJpY1ZhciAqdG1wID0gdmFyMTsKKworCQl2YXIxID0gdmFy MjsKKwkJdmFyMiA9IHRtcDsKKwl9CisKKwkvKiBjb3B5IHRoZXNlIHZhbHVlcyBpbnRvIGxv Y2FsIHZhcnMgZm9yIHNwZWVkIGluIGlubmVyIGxvb3AgKi8KKwl2YXIxbmRpZ2l0cyA9IHZh cjEtPm5kaWdpdHM7CisJdmFyMm5kaWdpdHMgPSB2YXIyLT5uZGlnaXRzOworCXZhcjFkaWdp dHMgPSB2YXIxLT5kaWdpdHM7CisJdmFyMmRpZ2l0cyA9IHZhcjItPmRpZ2l0czsKKworCWlm ICh2YXIxbmRpZ2l0cyA9PSAwKQorCXsKKwkJLyogb25lIG9yIGJvdGggaW5wdXRzIGlzIHpl cm87IHNvIGlzIHJlc3VsdCAqLworCQl6ZXJvX3ZhcihyZXN1bHQpOworCQlyZXN1bHQtPmRz Y2FsZSA9IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdmFyMSBoYXMg MyBkaWdpdHMgb3IgZmV3ZXIsIGRlbGVnYXRlIHRvIG11bF92YXJfc21hbGwoKSB3aGljaCB1 c2VzIGEKKwkgKiBmYXN0ZXIgc2hvcnQgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtLgorCSAq LworCWlmICh2YXIxbmRpZ2l0cyA8PSAzKQorCXsKKwkJbXVsX3Zhcl9zbWFsbCh2YXIxLCB2 YXIyLCByZXN1bHQsIHJzY2FsZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZXRlcm1pbmUg cmVzdWx0IHNpZ24gYW5kIChtYXhpbXVtIHBvc3NpYmxlKSB3ZWlnaHQgKi8KKwlpZiAodmFy MS0+c2lnbiA9PSB2YXIyLT5zaWduKQorCQlyZXNfc2lnbiA9IE5VTUVSSUNfUE9TOworCWVs c2UKKwkJcmVzX3NpZ24gPSBOVU1FUklDX05FRzsKKwlyZXNfd2VpZ2h0ID0gdmFyMS0+d2Vp Z2h0ICsgdmFyMi0+d2VpZ2h0ICsgMjsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBudW1i ZXIgb2YgcmVzdWx0IGRpZ2l0cyB0byBjb21wdXRlLiAgSWYgdGhlIGV4YWN0IHJlc3VsdAor CSAqIHdvdWxkIGhhdmUgbW9yZSB0aGFuIHJzY2FsZSBmcmFjdGlvbmFsIGRpZ2l0cywgdHJ1 bmNhdGUgdGhlIGNvbXB1dGF0aW9uCisJICogd2l0aCBNVUxfR1VBUkRfRElHSVRTIGd1YXJk IGRpZ2l0cywgaS5lLiwgaWdub3JlIGlucHV0IGRpZ2l0cyB0aGF0CisJICogd291bGQgb25s eSBjb250cmlidXRlIHRvIHRoZSByaWdodCBvZiB0aGF0LiAgKFRoaXMgd2lsbCBnaXZlIHRo ZSBleGFjdAorCSAqIHJvdW5kZWQtdG8tcnNjYWxlIGFuc3dlciB1bmxlc3MgY2FycmllcyBv dXQgb2YgdGhlIGlnbm9yZWQgcG9zaXRpb25zCisJICogd291bGQgaGF2ZSBwcm9wYWdhdGVk IHRocm91Z2ggbW9yZSB0aGFuIE1VTF9HVUFSRF9ESUdJVFMgZGlnaXRzLikKKwkgKgorCSAq IE5vdGU6IGFuIGV4YWN0IGNvbXB1dGF0aW9uIGNvdWxkIG5vdCBwcm9kdWNlIG1vcmUgdGhh biB2YXIxbmRpZ2l0cyArCisJICogdmFyMm5kaWdpdHMgZGlnaXRzLCBidXQgd2UgYWxsb2Nh dGUgb25lIGV4dHJhIG91dHB1dCBkaWdpdCBpbiBjYXNlCisJICogcnNjYWxlLWRyaXZlbiBy b3VuZGluZyBwcm9kdWNlcyBhIGNhcnJ5IG91dCBvZiB0aGUgaGlnaGVzdCBleGFjdCBkaWdp dC4KKwkgKi8KKwlyZXNfbmRpZ2l0cyA9IHZhcjFuZGlnaXRzICsgdmFyMm5kaWdpdHMgKyAx OworCW1heGRpZ2l0cyA9IHJlc193ZWlnaHQgKyAxICsgKHJzY2FsZSArIERFQ19ESUdJVFMg LSAxKSAvIERFQ19ESUdJVFMgKworCQlNVUxfR1VBUkRfRElHSVRTOworCXJlc19uZGlnaXRz ID0gTWluKHJlc19uZGlnaXRzLCBtYXhkaWdpdHMpOworCisJaWYgKHJlc19uZGlnaXRzIDwg MykKKwl7CisJCS8qIEFsbCBpbnB1dCBkaWdpdHMgd2lsbCBiZSBpZ25vcmVkOyBzbyByZXN1 bHQgaXMgemVybyAqLworCQl6ZXJvX3ZhcihyZXN1bHQpOworCQlyZXN1bHQtPmRzY2FsZSA9 IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2UgZG8gdGhlIGFyaXRobWV0 aWMgaW4gYW4gYXJyYXkgImRpZ1tdIiBvZiBzaWduZWQgaW50J3MuICBTaW5jZQorCSAqIElO VF9NQVggaXMgbm90aWNlYWJseSBsYXJnZXIgdGhhbiBOQkFTRSpOQkFTRSwgdGhpcyBnaXZl cyB1cyBoZWFkcm9vbQorCSAqIHRvIGF2b2lkIG5vcm1hbGl6aW5nIGNhcnJpZXMgaW1tZWRp YXRlbHkuCisJICoKKwkgKiBtYXhkaWcgdHJhY2tzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZh bHVlIG9mIGFueSBkaWdbXSBlbnRyeTsgd2hlbiB0aGlzCisJICogdGhyZWF0ZW5zIHRvIGV4 Y2VlZCBJTlRfTUFYLCB3ZSB0YWtlIHRoZSB0aW1lIHRvIHByb3BhZ2F0ZSBjYXJyaWVzLgor CSAqIEZ1cnRoZXJtb3JlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IG92ZXJmbG93IGRvZXNu J3Qgb2NjdXIgZHVyaW5nIHRoZQorCSAqIGNhcnJ5IHByb3BhZ2F0aW9uIHBhc3NlcyBlaXRo ZXIuICBUaGUgY2FycnkgdmFsdWVzIGNvdWxkIGJlIGFzIG11Y2ggYXMKKwkgKiBJTlRfTUFY L05CQVNFLCBzbyByZWFsbHkgd2UgbXVzdCBub3JtYWxpemUgd2hlbiBkaWdpdHMgdGhyZWF0 ZW4gdG8KKwkgKiBleGNlZWQgSU5UX01BWCAtIElOVF9NQVgvTkJBU0UuCisJICoKKwkgKiBU byBhdm9pZCBvdmVyZmxvdyBpbiBtYXhkaWcgaXRzZWxmLCBpdCBhY3R1YWxseSByZXByZXNl bnRzIHRoZSBtYXgKKwkgKiBwb3NzaWJsZSB2YWx1ZSBkaXZpZGVkIGJ5IE5CQVNFLTEsIGll LCBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGl0IGlzCisJICoga25vd24gdGhhdCBubyBkaWdb XSBlbnRyeSBleGNlZWRzIG1heGRpZyAqIChOQkFTRS0xKS4KKwkgKi8KKwlkaWcgPSAoaW50 ICopIHBhbGxvYzAocmVzX25kaWdpdHMgKiBzaXplb2YoaW50KSk7CisJbWF4ZGlnID0gMDsK KworCS8qCisJICogVGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyBvZiB2YXIxIHNob3Vs ZCBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QKKwkgKiBjb250cmlidXRlIGRpcmVjdGx5IHRv IHRoZSBmaXJzdCByZXNfbmRpZ2l0cyBkaWdpdHMgb2YgdGhlIHJlc3VsdCB0aGF0CisJICog d2UgYXJlIGNvbXB1dGluZy4KKwkgKgorCSAqIERpZ2l0IGkxIG9mIHZhcjEgYW5kIGRpZ2l0 IGkyIG9mIHZhcjIgYXJlIG11bHRpcGxpZWQgYW5kIGFkZGVkIHRvIGRpZ2l0CisJICogaTEr aTIrMiBvZiB0aGUgYWNjdW11bGF0b3IgYXJyYXksIHNvIHdlIG5lZWQgb25seSBjb25zaWRl ciBkaWdpdHMgb2YKKwkgKiB2YXIxIGZvciB3aGljaCBpMSA8PSByZXNfbmRpZ2l0cyAtIDMu CisJICovCisJZm9yIChpMSA9IE1pbih2YXIxbmRpZ2l0cyAtIDEsIHJlc19uZGlnaXRzIC0g Myk7IGkxID49IDA7IGkxLS0pCisJeworCQlOdW1lcmljRGlnaXQgdmFyMWRpZ2l0ID0gdmFy MWRpZ2l0c1tpMV07CisKKwkJaWYgKHZhcjFkaWdpdCA9PSAwKQorCQkJY29udGludWU7CisK KwkJLyogVGltZSB0byBub3JtYWxpemU/ICovCisJCW1heGRpZyArPSB2YXIxZGlnaXQ7CisJ CWlmIChtYXhkaWcgPiAoSU5UX01BWCAtIElOVF9NQVggLyBOQkFTRSkgLyAoTkJBU0UgLSAx KSkKKwkJeworCQkJLyogWWVzLCBkbyBpdCAqLworCQkJY2FycnkgPSAwOworCQkJZm9yIChp ID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwkJCXsKKwkJCQluZXdkaWcgPSBk aWdbaV0gKyBjYXJyeTsKKwkJCQlpZiAobmV3ZGlnID49IE5CQVNFKQorCQkJCXsKKwkJCQkJ Y2FycnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJCQkJbmV3ZGlnIC09IGNhcnJ5ICogTkJBU0U7 CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJY2FycnkgPSAwOworCQkJCWRpZ1tpXSA9IG5ld2Rp ZzsKKwkJCX0KKwkJCUFzc2VydChjYXJyeSA9PSAwKTsKKwkJCS8qIFJlc2V0IG1heGRpZyB0 byBpbmRpY2F0ZSBuZXcgd29yc3QtY2FzZSAqLworCQkJbWF4ZGlnID0gMSArIHZhcjFkaWdp dDsKKwkJfQorCisJCS8qCisJCSAqIEFkZCB0aGUgYXBwcm9wcmlhdGUgbXVsdGlwbGUgb2Yg dmFyMiBpbnRvIHRoZSBhY2N1bXVsYXRvci4KKwkJICoKKwkJICogQXMgYWJvdmUsIGRpZ2l0 cyBvZiB2YXIyIGNhbiBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QgY29udHJpYnV0ZSwKKwkJ ICogc28gd2Ugb25seSBpbmNsdWRlIGRpZ2l0cyBmb3Igd2hpY2ggaTEraTIrMiA8IHJlc19u ZGlnaXRzLgorCQkgKgorCQkgKiBUaGlzIGlubmVyIGxvb3AgaXMgdGhlIHBlcmZvcm1hbmNl IGJvdHRsZW5lY2sgZm9yIG11bHRpcGxpY2F0aW9uLAorCQkgKiBzbyB3ZSB3YW50IHRvIGtl ZXAgaXQgc2ltcGxlIGVub3VnaCBzbyB0aGF0IGl0IGNhbiBiZQorCQkgKiBhdXRvLXZlY3Rv cml6ZWQuICBBY2NvcmRpbmdseSwgcHJvY2VzcyB0aGUgZGlnaXRzIGxlZnQtdG8tcmlnaHQK KwkJICogZXZlbiB0aG91Z2ggc2Nob29sYm9vayBtdWx0aXBsaWNhdGlvbiB3b3VsZCBzdWdn ZXN0IHJpZ2h0LXRvLWxlZnQuCisJCSAqIFNpbmNlIHdlIGFyZW4ndCBwcm9wYWdhdGluZyBj YXJyaWVzIGluIHRoaXMgbG9vcCwgdGhlIG9yZGVyIGRvZXMKKwkJICogbm90IG1hdHRlci4K KwkJICovCisJCXsKKwkJCWludAkJCWkybGltaXQgPSBNaW4odmFyMm5kaWdpdHMsIHJlc19u ZGlnaXRzIC0gaTEgLSAyKTsKKwkJCWludAkJICAgKmRpZ19pMV8yID0gJmRpZ1tpMSArIDJd OworCisJCQlmb3IgKGkyID0gMDsgaTIgPCBpMmxpbWl0OyBpMisrKQorCQkJCWRpZ19pMV8y W2kyXSArPSB2YXIxZGlnaXQgKiB2YXIyZGlnaXRzW2kyXTsKKwkJfQorCX0KKworCS8qCisJ ICogTm93IHdlIGRvIGEgZmluYWwgY2FycnkgcHJvcGFnYXRpb24gcGFzcyB0byBub3JtYWxp emUgdGhlIHJlc3VsdCwgd2hpY2gKKwkgKiB3ZSBjb21iaW5lIHdpdGggc3RvcmluZyB0aGUg cmVzdWx0IGRpZ2l0cyBpbnRvIHRoZSBvdXRwdXQuIE5vdGUgdGhhdAorCSAqIHRoaXMgaXMg c3RpbGwgZG9uZSBhdCBmdWxsIHByZWNpc2lvbiB3L2d1YXJkIGRpZ2l0cy4KKwkgKi8KKwlh bGxvY192YXIocmVzdWx0LCByZXNfbmRpZ2l0cyk7CisJcmVzX2RpZ2l0cyA9IHJlc3VsdC0+ ZGlnaXRzOworCWNhcnJ5ID0gMDsKKwlmb3IgKGkgPSByZXNfbmRpZ2l0cyAtIDE7IGkgPj0g MDsgaS0tKQorCXsKKwkJbmV3ZGlnID0gZGlnW2ldICsgY2Fycnk7CisJCWlmIChuZXdkaWcg Pj0gTkJBU0UpCisJCXsKKwkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQluZXdkaWcg LT0gY2FycnkgKiBOQkFTRTsKKwkJfQorCQllbHNlCisJCQljYXJyeSA9IDA7CisJCXJlc19k aWdpdHNbaV0gPSBuZXdkaWc7CisJfQorCUFzc2VydChjYXJyeSA9PSAwKTsKKworCXBmcmVl KGRpZyk7CisKKwkvKgorCSAqIEZpbmFsbHksIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIHJl cXVlc3RlZCBwcmVjaXNpb24uCisJICovCisJcmVzdWx0LT53ZWlnaHQgPSByZXNfd2VpZ2h0 OworCXJlc3VsdC0+c2lnbiA9IHJlc19zaWduOworCisJLyogUm91bmQgdG8gdGFyZ2V0IHJz Y2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwlyb3VuZF92YXIocmVzdWx0LCBy c2NhbGUpOworCisJLyogU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgemVyb2VzICovCisJ c3RyaXBfdmFyKHJlc3VsdCk7Cit9CisKKworLyoKKyAqIG11bF92YXJfc21hbGwoKSAtCisg KgorICoJVGhpcyBoYXMgdGhlIHNhbWUgQVBJIGFzIG11bF92YXIsIGJ1dCBpdCBhc3N1bWVz IHRoYXQgdmFyMSBoYXMgbm8gbW9yZQorICoJdGhhbiAzIGRpZ2l0cyBhbmQgdmFyMiBoYXMg YXQgbGVhc3QgYXMgbWFueSBkaWdpdHMgYXMgdmFyMS4gIEZvciB2YXJpYWJsZXMKKyAqCXNh dGlzZnlpbmcgdGhlc2UgY29uZGl0aW9ucywgdGhlIHByb2R1Y3QgY2FuIGJlIGNvbXB1dGVk IG1vcmUgcXVpY2tseSB0aGFuCisgKgl0aGUgZ2VuZXJhbCBhbGdvcml0aG0gdXNlZCBpbiBt dWxfdmFyLgorICovCitzdGF0aWMgdm9pZAorbXVsX3Zhcl9zbWFsbChjb25zdCBOdW1lcmlj VmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQkJICBOdW1lcmljVmFyICpy ZXN1bHQsIGludCByc2NhbGUpCit7CisJaW50CQkJdmFyMW5kaWdpdHMgPSB2YXIxLT5uZGln aXRzOworCWludAkJCXZhcjJuZGlnaXRzID0gdmFyMi0+bmRpZ2l0czsKKwlOdW1lcmljRGln aXQgKnZhcjFkaWdpdHMgPSB2YXIxLT5kaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICp2YXIyZGln aXRzID0gdmFyMi0+ZGlnaXRzOworCWludAkJCXJlc19zaWduOworCWludAkJCXJlc193ZWln aHQ7CisJaW50CQkJcmVzX25kaWdpdHM7CisJaW50CQkJbWF4ZGlnaXRzOworCU51bWVyaWNE aWdpdCAqcmVzX2J1ZjsKKwlOdW1lcmljRGlnaXQgKnJlc19kaWdpdHM7CisJaW50CQkJY2Fy cnk7CisJaW50CQkJdGVybTsKKworCS8qIENoZWNrIHByZWNvbmRpdGlvbnMgKi8KKwlBc3Nl cnQodmFyMW5kaWdpdHMgPD0gMyk7CisJQXNzZXJ0KHZhcjJuZGlnaXRzID49IHZhcjFuZGln aXRzKTsKKworCS8qIERldGVybWluZSByZXN1bHQgc2lnbiBhbmQgKG1heGltdW0gcG9zc2li bGUpIHdlaWdodCAqLworCWlmICh2YXIxLT5zaWduID09IHZhcjItPnNpZ24pCisJCXJlc19z aWduID0gTlVNRVJJQ19QT1M7CisJZWxzZQorCQlyZXNfc2lnbiA9IE5VTUVSSUNfTkVHOwor CXJlc193ZWlnaHQgPSB2YXIxLT53ZWlnaHQgKyB2YXIyLT53ZWlnaHQgKyAyOworCisJLyog RGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmVzdWx0IGRpZ2l0cyB0byBjb21wdXRlIC0gc2Vl IG11bF92YXIoKSAqLworCXJlc19uZGlnaXRzID0gdmFyMW5kaWdpdHMgKyB2YXIybmRpZ2l0 cyArIDE7CisJbWF4ZGlnaXRzID0gcmVzX3dlaWdodCArIDEgKyAocnNjYWxlICsgREVDX0RJ R0lUUyAtIDEpIC8gREVDX0RJR0lUUyArCisJCU1VTF9HVUFSRF9ESUdJVFM7CisJcmVzX25k aWdpdHMgPSBNaW4ocmVzX25kaWdpdHMsIG1heGRpZ2l0cyk7CisKKwlpZiAocmVzX25kaWdp dHMgPCAzKQorCXsKKwkJLyogQWxsIGlucHV0IGRpZ2l0cyB3aWxsIGJlIGlnbm9yZWQ7IHNv IHJlc3VsdCBpcyB6ZXJvICovCisJCXplcm9fdmFyKHJlc3VsdCk7CisJCXJlc3VsdC0+ZHNj YWxlID0gcnNjYWxlOworCQlyZXR1cm47CisJfQorCisJLyogQWxsb2NhdGUgcmVzdWx0IGRp Z2l0IGFycmF5ICovCisJcmVzX2J1ZiA9IGRpZ2l0YnVmX2FsbG9jKHJlc19uZGlnaXRzKTsK KwlyZXNfYnVmWzBdID0gMDsJCQkJLyogc3BhcmUgZGlnaXQgZm9yIGxhdGVyIHJvdW5kaW5n ICovCisJcmVzX2RpZ2l0cyA9IHJlc19idWYgKyAxOworCisJLyoKKwkgKiBDb21wdXRlIHRo ZSByZXN1bHQgZGlnaXRzIGluIHJldmVyc2UsIGluIG9uZSBwYXNzLCBwcm9wYWdhdGluZyB0 aGUKKwkgKiBjYXJyeSB1cCBhcyB3ZSBnby4KKwkgKgorCSAqIFRoaXMgY29tcHV0ZXMgcmVz X2RpZ2l0c1tyZXNfbmRpZ2l0cyAtIDJdLCAuLi4gcmVzX2RpZ2l0c1swXSBieSBzdW1taW5n CisJICogdGhlIHByb2R1Y3RzIHZhcjFkaWdpdHNbaTFdICogdmFyMmRpZ2l0c1tpMl0gZm9y IHdoaWNoIGkxICsgaTIgKyAxIGlzCisJICogdGhlIHJlc3VsdCBpbmRleC4KKwkgKi8KKwlz d2l0Y2ggKHZhcjFuZGlnaXRzKQorCXsKKwkJY2FzZSAxOgorCQkJLyogLS0tLS0tLS0tCisJ CQkgKiAxLWRpZ2l0IGNhc2U6CisJCQkgKgkJdmFyMW5kaWdpdHMgPSAxCisJCQkgKgkJdmFy Mm5kaWdpdHMgPj0gMQorCQkJICoJCTMgPD0gcmVzX25kaWdpdHMgPD0gdmFyMm5kaWdpdHMg KyAyCisJCQkgKiAtLS0tLS0tLS0tCisJCQkgKi8KKwkJCWNhcnJ5ID0gMDsKKwkJCWZvciAo aW50IGkgPSByZXNfbmRpZ2l0cyAtIDM7IGkgPj0gMDsgaS0tKQorCQkJeworCQkJCXRlcm0g PSAoaW50KSB2YXIxZGlnaXRzWzBdICogdmFyMmRpZ2l0c1tpXSArIGNhcnJ5OworCQkJCXJl c19kaWdpdHNbaSArIDFdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gJSBOQkFTRSk7CisJCQkJ Y2FycnkgPSB0ZXJtIC8gTkJBU0U7CisJCQl9CisJCQlyZXNfZGlnaXRzWzBdID0gKE51bWVy aWNEaWdpdCkgY2Fycnk7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQkvKiAtLS0tLS0t LS0KKwkJCSAqIDItZGlnaXQgY2FzZToKKwkJCSAqCQl2YXIxbmRpZ2l0cyA9IDIKKwkJCSAq CQl2YXIybmRpZ2l0cyA+PSAyCisJCQkgKgkJMyA8PSByZXNfbmRpZ2l0cyA8PSB2YXIybmRp Z2l0cyArIDMKKwkJCSAqIC0tLS0tLS0tLS0KKwkJCSAqLworCQkJLyogbGFzdCByZXN1bHQg ZGlnaXQgYW5kIGNhcnJ5ICovCisJCQl0ZXJtID0gMDsKKwkJCWlmIChyZXNfbmRpZ2l0cyAt IDMgPCB2YXIybmRpZ2l0cykKKwkJCQl0ZXJtICs9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2 YXIyZGlnaXRzW3Jlc19uZGlnaXRzIC0gM107CisJCQlpZiAocmVzX25kaWdpdHMgPiAzKQor CQkJCXRlcm0gKz0gKGludCkgdmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdpdHNbcmVzX25kaWdp dHMgLSA0XTsKKwkJCXJlc19kaWdpdHNbcmVzX25kaWdpdHMgLSAyXSA9IChOdW1lcmljRGln aXQpICh0ZXJtICUgTkJBU0UpOworCQkJY2FycnkgPSB0ZXJtIC8gTkJBU0U7CisKKwkJCS8q IHJlbWFpbmluZyBkaWdpdHMsIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IHR3byAqLworCQkJZm9y IChpbnQgaSA9IHJlc19uZGlnaXRzIC0gNDsgaSA+PSAxOyBpLS0pCisJCQl7CisJCQkJdGVy bSA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldICsKKwkJCQkJKGludCkg dmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdpdHNbaSAtIDFdICsgY2Fycnk7CisJCQkJcmVzX2Rp Z2l0c1tpICsgMV0gPSAoTnVtZXJpY0RpZ2l0KSAodGVybSAlIE5CQVNFKTsKKwkJCQljYXJy eSA9IHRlcm0gLyBOQkFTRTsKKwkJCX0KKworCQkJLyogZmlyc3QgdHdvIGRpZ2l0cyAqLwor CQkJdGVybSA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzWzBdICsgY2Fycnk7 CisJCQlyZXNfZGlnaXRzWzFdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gJSBOQkFTRSk7CisJ CQlyZXNfZGlnaXRzWzBdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gLyBOQkFTRSk7CisJCQli cmVhazsKKworCQljYXNlIDM6CisJCQkvKiAtLS0tLS0tLS0KKwkJCSAqIDMtZGlnaXQgY2Fz ZToKKwkJCSAqCQl2YXIxbmRpZ2l0cyA9IDMKKwkJCSAqCQl2YXIybmRpZ2l0cyA+PSAzCisJ CQkgKgkJMyA8PSByZXNfbmRpZ2l0cyA8PSB2YXIybmRpZ2l0cyArIDQKKwkJCSAqIC0tLS0t LS0tLS0KKwkJCSAqLworCQkJLyogbGFzdCByZXN1bHQgZGlnaXQgYW5kIGNhcnJ5ICovCisJ CQl0ZXJtID0gMDsKKwkJCWlmIChyZXNfbmRpZ2l0cyAtIDMgPCB2YXIybmRpZ2l0cykKKwkJ CQl0ZXJtICs9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW3Jlc19uZGlnaXRz IC0gM107CisJCQlpZiAocmVzX25kaWdpdHMgPiAzICYmIHJlc19uZGlnaXRzIC0gNCA8IHZh cjJuZGlnaXRzKQorCQkJCXRlcm0gKz0gKGludCkgdmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdp dHNbcmVzX25kaWdpdHMgLSA0XTsKKwkJCWlmIChyZXNfbmRpZ2l0cyA+IDQpCisJCQkJdGVy bSArPSAoaW50KSB2YXIxZGlnaXRzWzJdICogdmFyMmRpZ2l0c1tyZXNfbmRpZ2l0cyAtIDVd OworCQkJcmVzX2RpZ2l0c1tyZXNfbmRpZ2l0cyAtIDJdID0gKE51bWVyaWNEaWdpdCkgKHRl cm0gJSBOQkFTRSk7CisJCQljYXJyeSA9IHRlcm0gLyBOQkFTRTsKKworCQkJLyogcGVudWx0 aW1hdGUgcmVzdWx0IGRpZ2l0ICovCisJCQl0ZXJtID0gY2Fycnk7CisJCQlpZiAocmVzX25k aWdpdHMgPiAzICYmIHJlc19uZGlnaXRzIC0gNCA8IHZhcjJuZGlnaXRzKQorCQkJCXRlcm0g Kz0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdpdHNbcmVzX25kaWdpdHMgLSA0XTsK KwkJCWlmIChyZXNfbmRpZ2l0cyA+IDQpCisJCQkJdGVybSArPSAoaW50KSB2YXIxZGlnaXRz WzFdICogdmFyMmRpZ2l0c1tyZXNfbmRpZ2l0cyAtIDVdOworCQkJaWYgKHJlc19uZGlnaXRz ID4gNSkKKwkJCQl0ZXJtICs9IChpbnQpIHZhcjFkaWdpdHNbMl0gKiB2YXIyZGlnaXRzW3Jl c19uZGlnaXRzIC0gNl07CisJCQlyZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gM10gPSAoTnVt ZXJpY0RpZ2l0KSAodGVybSAlIE5CQVNFKTsKKwkJCWNhcnJ5ID0gdGVybSAvIE5CQVNFOwor CisJCQkvKiByZW1haW5pbmcgZGlnaXRzLCBleGNlcHQgZm9yIHRoZSBmaXJzdCB0aHJlZSAq LworCQkJZm9yIChpbnQgaSA9IHJlc19uZGlnaXRzIC0gNTsgaSA+PSAyOyBpLS0pCisJCQl7 CisJCQkJdGVybSA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldICsKKwkJ CQkJKGludCkgdmFyMWRpZ2l0c1sxXSAqIHZhcjJkaWdpdHNbaSAtIDFdICsKKwkJCQkJKGlu dCkgdmFyMWRpZ2l0c1syXSAqIHZhcjJkaWdpdHNbaSAtIDJdICsgY2Fycnk7CisJCQkJcmVz X2RpZ2l0c1tpICsgMV0gPSAoTnVtZXJpY0RpZ2l0KSAodGVybSAlIE5CQVNFKTsKKwkJCQlj YXJyeSA9IHRlcm0gLyBOQkFTRTsKKwkJCX0KKworCQkJLyogZmlyc3QgdGhyZWUgZGlnaXRz ICovCisJCQl0ZXJtID0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdpdHNbMV0gKwor CQkJCShpbnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzWzBdICsgY2Fycnk7CisJCQly ZXNfZGlnaXRzWzJdID0gKE51bWVyaWNEaWdpdCkgKHRlcm0gJSBOQkFTRSk7CisJCQljYXJy eSA9IHRlcm0gLyBOQkFTRTsKKwkJCXRlcm0gPSAoaW50KSB2YXIxZGlnaXRzWzBdICogdmFy MmRpZ2l0c1swXSArIGNhcnJ5OworCQkJcmVzX2RpZ2l0c1sxXSA9IChOdW1lcmljRGlnaXQp ICh0ZXJtICUgTkJBU0UpOworCQkJcmVzX2RpZ2l0c1swXSA9IChOdW1lcmljRGlnaXQpICh0 ZXJtIC8gTkJBU0UpOworCQkJYnJlYWs7CisJfQorCisJLyogU3RvcmUgdGhlIHByb2R1Y3Qg aW4gcmVzdWx0IChtaW51cyBleHRyYSByb3VuZGluZyBkaWdpdCkgKi8KKwlkaWdpdGJ1Zl9m cmVlKHJlc3VsdC0+YnVmKTsKKwlyZXN1bHQtPm5kaWdpdHMgPSByZXNfbmRpZ2l0cyAtIDE7 CisJcmVzdWx0LT5idWYgPSByZXNfYnVmOworCXJlc3VsdC0+ZGlnaXRzID0gcmVzX2RpZ2l0 czsKKwlyZXN1bHQtPndlaWdodCA9IHJlc193ZWlnaHQgLSAxOworCXJlc3VsdC0+c2lnbiA9 IHJlc19zaWduOworCisJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1 bHQtPmRzY2FsZSkgKi8KKwlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOworCisJLyogU3Ry aXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7 Cit9CiAKIC8qCiAgKiBkaXZfdmFyKCkgLQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5k ZXggZDRhYzU3OGFlNi4uYzg1ZWQyMGE5OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0 CkBAIC00NDY1LDYgKzQ0NjUsMTggQEAKIHsgb2lkID0+ICcxNzI2JywKICAgcHJvbmFtZSA9 PiAnbnVtZXJpY19tdWwnLCBwcm9yZXR0eXBlID0+ICdudW1lcmljJywKICAgcHJvYXJndHlw ZXMgPT4gJ251bWVyaWMgbnVtZXJpYycsIHByb3NyYyA9PiAnbnVtZXJpY19tdWwnIH0sCit7 IG9pZCA9PiAnNjM0NycsCisgIHByb25hbWUgPT4gJ251bWVyaWNfbXVsX2hlYWQnLCBwcm9y ZXR0eXBlID0+ICdudW1lcmljJywKKyAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJp YyBpbnQ0JywgcHJvc3JjID0+ICdudW1lcmljX211bF9oZWFkJyB9LAoreyBvaWQgPT4gJzYz NDgnLAorICBwcm9uYW1lID0+ICdudW1lcmljX211bF9wYXRjaF9pbmxpbmUnLCBwcm9yZXR0 eXBlID0+ICdudW1lcmljJywKKyAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJpYyBp bnQ0JywgcHJvc3JjID0+ICdudW1lcmljX211bF9wYXRjaF9pbmxpbmUnIH0sCit7IG9pZCA9 PiAnNjM0OScsCisgIHByb25hbWUgPT4gJ251bWVyaWNfbXVsX3BhdGNoX2ludCcsIHByb3Jl dHR5cGUgPT4gJ251bWVyaWMnLAorICBwcm9hcmd0eXBlcyA9PiAnbnVtZXJpYyBudW1lcmlj IGludDQnLCBwcm9zcmMgPT4gJ251bWVyaWNfbXVsX3BhdGNoX2ludCcgfSwKK3sgb2lkID0+ ICc2MzUwJywKKyAgcHJvbmFtZSA9PiAnbnVtZXJpY19tdWxfcGF0Y2hfc21hbGwnLCBwcm9y ZXR0eXBlID0+ICdudW1lcmljJywKKyAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJp YyBpbnQ0JywgcHJvc3JjID0+ICdudW1lcmljX211bF9wYXRjaF9zbWFsbCcgfSwKIHsgb2lk ID0+ICcxNzI3JywKICAgcHJvbmFtZSA9PiAnbnVtZXJpY19kaXYnLCBwcm9yZXR0eXBlID0+ ICdudW1lcmljJywKICAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJpYycsIHByb3Ny YyA9PiAnbnVtZXJpY19kaXYnIH0sCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9u dW1lcmljLmggYi9zcmMvaW5jbHVkZS91dGlscy9udW1lcmljLmgKaW5kZXggNDNjNzVjNDM2 Zi4uMmJjNDAwYzc0MSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5o CisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL251bWVyaWMuaApAQCAtOTcsNiArOTcsMTQgQEAg ZXh0ZXJuIE51bWVyaWMgbnVtZXJpY19zdWJfb3B0X2Vycm9yKE51bWVyaWMgbnVtMSwgTnVt ZXJpYyBudW0yLAogCQkJCQkJCQkJIGJvb2wgKmhhdmVfZXJyb3IpOwogZXh0ZXJuIE51bWVy aWMgbnVtZXJpY19tdWxfb3B0X2Vycm9yKE51bWVyaWMgbnVtMSwgTnVtZXJpYyBudW0yLAog CQkJCQkJCQkJIGJvb2wgKmhhdmVfZXJyb3IpOworZXh0ZXJuIE51bWVyaWMgbnVtZXJpY19t dWxfaGVhZF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIsCisJCQkJCQkJ CQkgaW50MzIgcnNjYWxlX2FkanVzdG1lbnQsIGJvb2wgKmhhdmVfZXJyb3IpOworZXh0ZXJu IE51bWVyaWMgbnVtZXJpY19tdWxfcGF0Y2hfaW5saW5lX29wdF9lcnJvcihOdW1lcmljIG51 bTEsIE51bWVyaWMgbnVtMiwKKwkJCQkJCQkJCSBpbnQzMiByc2NhbGVfYWRqdXN0bWVudCwg Ym9vbCAqaGF2ZV9lcnJvcik7CitleHRlcm4gTnVtZXJpYyBudW1lcmljX211bF9wYXRjaF9p bnRfb3B0X2Vycm9yKE51bWVyaWMgbnVtMSwgTnVtZXJpYyBudW0yLAorCQkJCQkJCQkJIGlu dDMyIHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vycm9yKTsKK2V4dGVybiBOdW1l cmljIG51bWVyaWNfbXVsX3BhdGNoX3NtYWxsX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51 bWVyaWMgbnVtMiwKKwkJCQkJCQkJCSBpbnQzMiByc2NhbGVfYWRqdXN0bWVudCwgYm9vbCAq aGF2ZV9lcnJvcik7CiBleHRlcm4gTnVtZXJpYyBudW1lcmljX2Rpdl9vcHRfZXJyb3IoTnVt ZXJpYyBudW0xLCBOdW1lcmljIG51bTIsCiAJCQkJCQkJCQkgYm9vbCAqaGF2ZV9lcnJvcik7 CiBleHRlcm4gTnVtZXJpYyBudW1lcmljX21vZF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBO dW1lcmljIG51bTIsCmRpZmYgLS1naXQgYS90ZXN0LW11bC12YXIuc3FsIGIvdGVzdC1tdWwt dmFyLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5jZjdjNTVh MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1tdWwtdmFyLnNxbApAQCAtMCwwICsxLDUw IEBACitDUkVBVEUgVEFCTEUgdGVzdF9udW1lcmljX211bF9wYXRjaGVkICgKKyAgdmFyMSBu dW1lcmljLAorICB2YXIyIG51bWVyaWMsCisgIHJzY2FsZV9hZGp1c3RtZW50IGludCwKKyAg cmVzdWx0IG51bWVyaWMKKyk7CisKK0RPICQkCitERUNMQVJFCit2YXIxIG51bWVyaWM7Cit2 YXIyIG51bWVyaWM7CitCRUdJTgorICBGT1IgaSBJTiAxLi4xMDAwIExPT1AKKyAgICBSQUlT RSBOT1RJQ0UgJyUnLCBpOworICAgIEZPUiB2YXIxbmRpZ2l0cyBJTiAxLi40IExPT1AKKyAg ICAgIEZPUiB2YXIybmRpZ2l0cyBJTiAxLi40IExPT1AKKyAgICAgICAgRk9SIHZhcjFkc2Nh bGUgSU4gMC4uKHZhcjFuZGlnaXRzKjQpIExPT1AKKyAgICAgICAgICBGT1IgdmFyMmRzY2Fs ZSBJTiAwLi4odmFyMm5kaWdpdHMqNCkgTE9PUAorICAgICAgICAgICAgRk9SIHJzY2FsZV9h ZGp1c3RtZW50IElOIDAuLih2YXIxZHNjYWxlK3ZhcjJkc2NhbGUpIExPT1AKKyAgICAgICAg ICAgICAgdmFyMSA6PSByb3VuZChyYW5kb20oCisgICAgICAgICAgICAgICAgZm9ybWF0KCcx JXMnLHJlcGVhdCgnMCcsKHZhcjFuZGlnaXRzLTEpKjQtMSkpOjpudW1lcmljLAorICAgICAg ICAgICAgICAgIGZvcm1hdCgnJXMnLHJlcGVhdCgnOScsdmFyMW5kaWdpdHMqNCkpOjpudW1l cmljCisgICAgICAgICAgICAgICkgLyAxMDo6bnVtZXJpY152YXIxZHNjYWxlLCB2YXIxZHNj YWxlKTsKKyAgICAgICAgICAgICAgdmFyMiA6PSByb3VuZChyYW5kb20oCisgICAgICAgICAg ICAgICAgZm9ybWF0KCcxJXMnLHJlcGVhdCgnMCcsKHZhcjJuZGlnaXRzLTEpKjQtMSkpOjpu dW1lcmljLAorICAgICAgICAgICAgICAgIGZvcm1hdCgnJXMnLHJlcGVhdCgnOScsdmFyMm5k aWdpdHMqNCkpOjpudW1lcmljCisgICAgICAgICAgICAgICkgLyAxMDo6bnVtZXJpY152YXIy ZHNjYWxlLCB2YXIyZHNjYWxlKTsKKyAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdGVzdF9u dW1lcmljX211bF9wYXRjaGVkCisgICAgICAgICAgICAgICAgKHZhcjEsIHZhcjIsIHJzY2Fs ZV9hZGp1c3RtZW50KQorICAgICAgICAgICAgICBWQUxVRVMKKyAgICAgICAgICAgICAgICAo dmFyMSwgdmFyMiwgLXJzY2FsZV9hZGp1c3RtZW50KTsKKyAgICAgICAgICAgIEVORCBMT09Q OworICAgICAgICAgIEVORCBMT09QOworICAgICAgICBFTkQgTE9PUDsKKyAgICAgIEVORCBM T09QOworICAgIEVORCBMT09QOworICBFTkQgTE9PUDsKK0VORCAkJDsKKworVVBEQVRFIHRl c3RfbnVtZXJpY19tdWxfcGF0Y2hlZCBTRVQgcmVzdWx0ID0gbnVtZXJpY19tdWxfaGVhZCh2 YXIxLCB2YXIyLCByc2NhbGVfYWRqdXN0bWVudCk7CisKK1NFTEVDVAorICAgIHJzY2FsZV9h ZGp1c3RtZW50LAorICAgIENPVU5UKCopLAorICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUg cmVzdWx0IElTIERJU1RJTkNUIEZST00gbnVtZXJpY19tdWxfcGF0Y2hfaW50KHZhcjEsdmFy Mixyc2NhbGVfYWRqdXN0bWVudCkpIEFTICJtdWxfdmFyX2ludCIsCisgICAgQ09VTlQoKikg RklMVEVSIChXSEVSRSByZXN1bHQgSVMgRElTVElOQ1QgRlJPTSBudW1lcmljX211bF9wYXRj aF9zbWFsbCh2YXIxLHZhcjIscnNjYWxlX2FkanVzdG1lbnQpKSBBUyAibXVsX3Zhcl9zbWFs bCIsCisgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSByZXN1bHQgSVMgRElTVElOQ1QgRlJP TSBudW1lcmljX211bF9wYXRjaF9pbmxpbmUodmFyMSx2YXIyLHJzY2FsZV9hZGp1c3RtZW50 KSkgQVMgIm11bF92YXIgaW5saW5lZCIKK0ZST00gdGVzdF9udW1lcmljX211bF9wYXRjaGVk CitHUk9VUCBCWSAxCitPUkRFUiBCWSAxOwo= --c0a37e9252ee48b6a6b822713224abbb--