Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w6CEq-00434i-38 for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 18:48:58 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w6CEp-00BQbI-0i for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 18:48:55 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w6CEo-00BQb9-2j for pgsql-hackers@lists.postgresql.org; Fri, 27 Mar 2026 18:48:55 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w6CEl-00000001WyK-27VL for pgsql-hackers@postgresql.org; Fri, 27 Mar 2026 18:48:53 +0000 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-66ad907833dso4262316a12.3 for ; Fri, 27 Mar 2026 11:48:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774637331; cv=none; d=google.com; s=arc-20240605; b=BxBKCU8EeRrSiFztwWZqD35dz0C5uwi7jHnnYF10MNaI251X+N2YhkTbZzvz4pMVYW PCEt5VtmFYY8RVTY32x98z7VAwGPTyt6ZhZBMUtECHLpZJanyoZiAjTXhFFwH6s4wU5D m9cV1CPxKgZO7o+a8cNPkKbHn6GR88+TqOh/iYCUtr+LqaJMfzON7jUt9FzB8Tu78hbH 8XWN8lRBlTwgY2jTCDZOsnt0DRy/0rOOJIYAOvgjnH7SWfikb885M1DTuT8+ftdQQ4o5 0ik/6+ZpOG19u90HZ8Ix333CWXCyRO3/MIFo8OWiVR2XTfIajh/FlTNFlz/yJ5Ur+SrO 7PrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=fKfCFuDskx8dac3jbJol0YRDncz7wl55LnKWdbNpesw=; fh=1UUsudlhRaI2R75MP2KjD9wd63A5a4dqcpuYFS1c1l8=; b=ZJeH8xPdb8/0Iw/fnaftFVk8O5E2uU49f5WNJc2SsuvYuvlF3r5Wdsjamy+6KkjBUr nZ1PeAiEgSo7ggzPmVBDFpIxCzluKY+kLw9+I+5zGRVqaFCeAjd4d5g9bfyqIO34MRZj ljk1GxahwwT8hC4Ivgq6s9259B7ZETIMVh83oFkc12lOkDI8J4fp1Y/yrB4d2sMoOuWM Cq0qICP/e2mz3TDpLjrm7EBnBScxBoNHuEXr1PBUdbytUh3pAGVkTWue3CQFmUbg2YCE XSLiVoOxlTMkRu7+t1r3eFMtwLoFexP+EQz8/1Yb5ZdQbWGZ1YfsGMrXwDxBqO8kNYch VwtQ==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=esi.dz; s=google; t=1774637331; x=1775242131; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=fKfCFuDskx8dac3jbJol0YRDncz7wl55LnKWdbNpesw=; b=Ae/lW1e5fSN4Ats0oLhRVNINQDJ4K40l5rhM/aW/Nz9Shl6ffJKvfBH2kFYmGixUqr ANzmkKnCpfGB5aUokHSCGmY5YZKi8OaUUJg567JkIf03sN1XODpBLGQ9DRJJoy1BxuDV MNShqS2VZ3ybJrXjQXNI2R6NASgKQBgkIFi6xQmc/2ZVMVhjgcWXihThGbE/WTQRn70g h4PhEfvqtT9iRd19D4yOOYaJ0pEbzTHj/exYsfry0b9oF7C1C8cNwtoh7NoMgM+HU8x9 k/VvbQxzcDOZo1VaKVSlcf/SykEg17n5IwtApQGaLIwcYqCPFwt0zi0ZEwS2L9vBNLtw AmYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774637331; x=1775242131; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=fKfCFuDskx8dac3jbJol0YRDncz7wl55LnKWdbNpesw=; b=ZSJJNZF64D/d/7K50lXk2MHhd3o91bYIIQ+gq7sGDlQFYW6hDfGw3Z6ItbtLu+KH4d zC5MJARGOyMb4cmJ4mKxjvZHWapv4J3EINjt7WOe63qNauzFpN+RfCmjzUwyEaLLwVX5 D5EtKAcAMCAs0M/LnbN10C5QLMo5FrFFRYL84mgXe4WzNHLDIcP6WqNUWmY7ooM4lZAN WKW7Hj7SXXqg0yat99vHfEw8B+0EQtH5PahJKq7N/oVf5mGAjB35W4JzpO4Xc64E4JXl P375048T3y0tvKWAwtO9jwg+qaeycbls5XU5uZW/00vI6ZByfzdHRR4XxXak+y2p2aLF dK3w== X-Forwarded-Encrypted: i=1; AJvYcCUt0k5R9zEC62374MhMF8Mv1Wlq/GuVM2uAqWbK/bM4pxAfvi9RlFdEV0ZFQ1p1JOnLjSzUNZuP2x1S2k4j@postgresql.org X-Gm-Message-State: AOJu0YxYXRluNWZ4zZsTvgg+tH+EpX2ucrP26WRZ1QyU4V6+1w2j+mxi 4i3HmdDCPwPC6fBBIFM0TmtgV9yhmfIkZswlBt46KfRzIw85ZNRcJ4hoft/l+uMxy3uXKwO/Noz 0WvJBvpZdOIJugV3m7j/E8BLJtTIi0+62bv0peWc6 X-Gm-Gg: ATEYQzwHGDycEJQZ/BVc2h99pyu+upeOaIOTXUCK+eBeENht+dH5bJO6zmKXuTD2H7N VNUOgYhe2NN4pRpO0Zar509dCP1xKEoupE0cqW6ST/sPSGX63NL+sXqHa5RXF+dLxy/UPq7TvoA ACukU3ns06vBNdUUeVHMEqk7hEwSY5cgTuGzV0U6reLgGbaYZmpg26I1CoNFcoDKhjYdAI1dYGJ /5L/HDW0Cm1klrlTT78Lp1aPSqOKvgJnLM8hvxOEQjN34DzoKpLbV1wDEXRKfUuL6aasdaVW/8u mPip5liXkya8DXTan+qJusaZJr72ai8vEz/oaQEHRegKzxiv5gk2iQoYbv5Z7Vgrdv4F3s1Pcdi mLftWhxoiDlc/Aqgs1EWilwGdbZs= X-Received: by 2002:a05:6402:378a:b0:66a:1983:2cde with SMTP id 4fb4d7f45d1cf-66b2846a496mr2320390a12.12.1774637330552; Fri, 27 Mar 2026 11:48:50 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: KAZAR Ayoub Date: Fri, 27 Mar 2026 19:48:38 +0100 X-Gm-Features: AQROBzB22_rMY8ztGq7MkRxVOCI0q-h_ozd4KNV0Gznz_W84nR9y4wP9mDxrVvc Message-ID: Subject: Re: Speed up COPY TO text/CSV parsing using SIMD To: Nathan Bossart Cc: Andres Freund , Pg Hackers , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , Mark Wong , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="000000000000b198ee064e05f37c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b198ee064e05f37c Content-Type: multipart/alternative; boundary="000000000000b198ed064e05f37a" --000000000000b198ed064e05f37a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello, On Thu, Mar 26, 2026 at 10:23=E2=80=AFPM Nathan Bossart wrote: > On Wed, Mar 18, 2026 at 03:29:32AM +0100, KAZAR Ayoub wrote: > > If we have some json(b) column like : {"key1":"val1","key2":"val2"}, fo= r > > CSV format this would immediately exit the SIMD path because of quote > > character, for json(b) this is going to be always the case. > > I measured the overhead of exiting the SIMD path a lot (8 million times > for > > one COPY TO command), i only found 3% regression for this case, sometim= es > > 2%. > > I'm a little worried that we might be dismissing small-yet-measurable > regressions for extremely common workloads. Unlike the COPY FROM work, > this operates on a per-attribute level, meaning we only use SIMD when an > attribute is at least 16 bytes. The extra branching for each attribute > might not be something we can just ignore. > Thanks for the review. I added a prescan loop inside the simd helpers trying to catch special chars in sizeof(Vector8) characters, i measured how good is this at reducing the overhead of starting simd and exiting at first vector: the scalar loop is better than SIMD for one vector if it finds a special character before 6th character, worst case is not a clean vector, where the scalar loop needs 20 more cycles compared to SIMD. This helps mitigate the case of JSON(B) in CSV format, this is why I only added this for CSV case only. In a benchmark with 10M early SIMD exit like the JSONB case, the previous 3% regression is gone. For the normal benchmark (clean, 1/3 specials, wide table), i ran for longer times for v4 now and i found this: Test Master V4 TEXT clean 1619ms -28.0% CSV clean 1866ms -37.1% TEXT 1/3 backslashes 3913ms +1.2% CSV 1/3 quotes 4012ms -3.0% Wide table TEXT: Cols Master V4 50 2109ms -2.9% 100 2029ms -1.6% 200 3982ms -2.9% 500 1962ms -6.1% 1000 3812ms -3.6% Wide table CSV: Cols Master V4 50 2531ms +0.3% 100 2465ms +1.1% 200 4965ms -0.2% 500 2346ms +1.4% 1000 4709ms -0.4% Do we need more benchmarks for some other kind of workloads ? If i'm missing something else that has noticeable overhead maybe ? Regards, Ayoub --000000000000b198ed064e05f37a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,
On Thu, Mar 26, 2= 026 at 10:23=E2=80=AFPM Nathan Bossart <nathandbossart@gmail.com> wrote:
On Wed, Mar 18, 2026 at 03:29:32AM +010= 0, KAZAR Ayoub wrote:
> If we have some json(b) column like : {"key1":"val1&quo= t;,"key2":"val2"}, for
> CSV format this would immediately exit the SIMD path because of quote<= br> > character, for json(b) this is going to be always the case.
> I measured the overhead of exiting the SIMD path a lot (8 million time= s for
> one COPY TO command), i only found 3% regression for this case, someti= mes
> 2%.

I'm a little worried that we might be dismissing small-yet-measurable regressions for extremely common workloads.=C2=A0 Unlike the COPY FROM work= ,
this operates on a per-attribute level, meaning we only use SIMD when an attribute is at least 16 bytes.=C2=A0 The extra branching for each attribut= e
might not be something we can just ignore.
Thanks for = the review.
=C2=A0
I added a prescan loop inside the si= md helpers trying to catch special chars in sizeof(Vector8) characters, i m= easured how good is this at reducing the overhead of starting simd and exit= ing at first vector:
the scalar loop is better than SIMD for one = vector if it finds a special character before 6th character, worst case is = not a clean vector, where the scalar loop needs 20 more cycles compared to = SIMD.
This helps mitigate the case of JSON(B) in CSV format, this= is why I only added this for CSV case only.

In a = benchmark with 10M early SIMD exit like the JSONB case, the previous 3% reg= ression is gone.

For the normal benchmark (clean, = 1/3 specials, wide table), i ran for longer times for v4 now and i found th= is:
=C2=A0 Test =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 Master =C2=A0 =C2=A0V4
=C2=A0 TEXT clean =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1619ms =C2=A0 =C2=A0-28.0%=C2=A0 CSV clean =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A01866ms =C2=A0 =C2=A0-37.1%
=C2=A0 TEXT 1/3 backslashes =C2=A0 =C2= =A0 =C2=A0 3913ms =C2=A0 =C2=A0+1.2%
=C2=A0 CSV 1/3 quotes =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 4012ms =C2=A0 =C2=A0-3.0%

Wide table TE= XT:

=C2=A0 Cols =C2=A0 =C2=A0Master =C2=A0 =C2=A0V4
=C2=A0 50 =C2= =A0 =C2=A0 =C2=A02109ms =C2=A0 =C2=A0-2.9%
=C2=A0 100 =C2=A0 =C2=A0 2029= ms =C2=A0 =C2=A0-1.6%
=C2=A0 200 =C2=A0 =C2=A0 3982ms =C2=A0 =C2=A0-2.9%=
=C2=A0 500 =C2=A0 =C2=A0 1962ms =C2=A0 =C2=A0-6.1%
=C2=A0 1000 =C2= =A0 =C2=A03812ms =C2=A0 =C2=A0-3.6%

Wide table CSV:

=C2=A0 Co= ls =C2=A0 =C2=A0Master =C2=A0 =C2=A0V4
=C2=A0 50 =C2=A0 =C2=A0 =C2=A0253= 1ms =C2=A0 =C2=A0+0.3%
=C2=A0 100 =C2=A0 =C2=A0 2465ms =C2=A0 =C2=A0+1.1= %
=C2=A0 200 =C2=A0 =C2=A0 4965ms =C2=A0 =C2=A0-0.2%
=C2=A0 500 =C2= =A0 =C2=A0 2346ms =C2=A0 =C2=A0+1.4%
=C2=A0 1000 =C2=A0 =C2=A04709ms =C2= =A0 =C2=A0-0.4%

Do we need more benchmarks for som= e other kind of workloads ? If i'm missing something else that has noti= ceable overhead maybe ?

Regards,
Ayoub
--000000000000b198ed064e05f37a-- --000000000000b198ee064e05f37c Content-Type: text/x-patch; charset="US-ASCII"; name="v4-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Disposition: attachment; filename="v4-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn992woy0 RnJvbSBmMjY4ZDM4ODFhNTBmOTQzNTJjOGVlNGFiYzMzNDE2NGQyNWYyZDllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBTYXQsIDE0IE1hciAyMDI2IDIyOjUyOjIyICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyAoRk9STUFUIHt0ZXh0LGNzdn0pIHVzaW5nIFNJTUQuIFByZXNlbnRseSwK IHN1Y2ggY29tbWFuZHMgc2NhbiBlYWNoIGF0dHJpYnV0ZSdzIHN0cmluZyByZXByZXNlbnRhdGlv biBvbmUgYnl0ZSBhdCBhIHRpbWUKIGxvb2tpbmcgZm9yIHNwZWNpYWwgY2hhcmFjdGVycy4gIFRo aXMgY29tbWl0IGFkZHMgYSBuZXcgcGF0aCB0aGF0IHVzZXMgU0lNRAogaW5zdHJ1Y3Rpb25zIHRv IHNraXAgb3ZlciBjaHVua3Mgb2YgZGF0YSB3aXRob3V0IGFueSBzcGVjaWFsIGNoYXJhY3RlcnMu IAogVGhpcyBjYW4gYmUgbXVjaCBmYXN0ZXIuCgpTSU1EIHByb2Nlc3NpbmcgaXMgb25seSB1c2Vk IGZvciB2YXJsZW5hIGF0dHJpYnV0ZXMgd2hvc2UgdGV4dApyZXByZXNlbnRhdGlvbiBpcyBsb25n ZXIgdGhhbiBhIHNpbmdsZSBTSU1EIHZlY3RvciwgYW5kIG9ubHkgd2hlbgpubyBlbmNvZGluZyBj b252ZXJzaW9uIGlzIHJlcXVpcmVkLiAgRml4ZWQtc2l6ZSB0eXBlcyBzdWNoIGFzCmludGVnZXJz IGFuZCBib29sZWFucyBhbHdheXMgcHJvZHVjZSBzaG9ydCBBU0NJSSBvdXRwdXQgZm9yIHdoaWNo ClNJTUQgcHJvdmlkZXMgbm8gYmVuZWZpdCwgYW5kIHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVlZGVk IHRoZSBzdHJpbmcKbGVuZ3RoIG1heSBjaGFuZ2UgYWZ0ZXIgY29udmVyc2lvbi4gIEZvciBlbGln aWJsZSBhdHRyaWJ1dGVzLCB0aGUKc3RvcmVkIHZhcmxlbmEgc2l6ZSBpcyB1c2VkIGFzIGEgY2hl YXAgcHJlLWZpbHRlciB0byBhdm9pZCBhbgp1bm5lY2Vzc2FyeSBzdHJsZW4oKSBjYWxsIG9uIHNo b3J0IHZhbHVlcywgdGhpcyB2ZXJzaW9uIGFsc28gYXZvaWRzCmNhbGxpbmcgc3RybGVuIHR3aWNl IHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5LgoKRm9yIFRFWFQgbW9kZSwgdGhlIFNJTUQg cGF0aCBzY2FucyBmb3IgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzLApiYWNrc2xhc2gsIGFuZCB0 aGUgZGVsaW1pdGVyLiAgRm9yIENTViBtb2RlLCB0d28gU0lNRCBoZWxwZXJzIGFyZQp1c2VkOiBv bmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWVsZCByZXF1aXJlcyBxdW90aW5nIGJ5IHNjYW5u aW5nCmZvciB0aGUgZGVsaW1pdGVyLCBxdW90ZSBjaGFyYWN0ZXIsIGFuZCBlbmQtb2YtbGluZSBj aGFyYWN0ZXJzLCBhbmQKb25lIHRvIHNjYW4gZm9yIGNoYXJhY3RlcnMgcmVxdWlyaW5nIGVzY2Fw aW5nIGR1cmluZyB0aGUgb3V0cHV0IHBhc3MuCkluIGJvdGggbW9kZXMsIHRoZSBzY2FsYXIgcGF0 aCBoYW5kbGVzIGFueSByZW1haW5pbmcgY2hhcmFjdGVycyBhZnRlcgp0aGUgU0lNRCBwcmUtcGFz cy4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYyB8IDI4MCArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjYyIGluc2VydGlvbnMoKyks IDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0 by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXggZmFmNjJkOTU5YjQuLmVl MDljZWYwMzA3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1 ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAicGdz dGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgorI2luY2x1ZGUgInBvcnQvc2lt ZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90Lmgi CiAjaW5jbHVkZSAidXRpbHMvanNvbi5oIgpAQCAtMTI4LDExICsxMzAsMTczIEBAIHN0YXRpYyBj b25zdCBjaGFyIEJpbmFyeVNpZ25hdHVyZVsxMV0gPSAiUEdDT1BZXG5cMzc3XHJcblwwIjsKIHN0 YXRpYyB2b2lkIEVuZENvcHkoQ29weVRvU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyB2b2lkIENsb3Nl UGlwZVRvUHJvZ3JhbShDb3B5VG9TdGF0ZSBjc3RhdGUpOwogc3RhdGljIHZvaWQgQ29weU9uZVJv d1RvKENvcHlUb1N0YXRlIGNzdGF0ZSwgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOwotc3RhdGljIHZv aWQgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcpOwotc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3Rh dGUsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQkJCQkJYm9vbCB1c2VfcXVvdGUpOworc3RhdGlj IHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIHZvaWQgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29w eVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJCQkJCQkJCQkJCQlib29s IHVzZV9zaW1kLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGlu ZSB2b2lkIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFy ICpzdHJpbmcsCisJCQkJCQkJCQkJCQkJCSAgIGJvb2wgdXNlX3F1b3RlLCBib29sIHVzZV9zaW1k LCBzaXplX3QgbGVuKTsKIHN0YXRpYyB2b2lkIENvcHlSZWxhdGlvblRvKENvcHlUb1N0YXRlIGNz dGF0ZSwgUmVsYXRpb24gcmVsLCBSZWxhdGlvbiByb290X3JlbCwKIAkJCQkJCSAgIHVpbnQ2NCAq cHJvY2Vzc2VkKTsKK3N0YXRpYyB2b2lkIENvcHlTa2lwVGV4dFNJTUQoY29uc3QgY2hhciAqKnB0 ciwKKwkJCQkJCQkgc2l6ZV90IGxlbiwgY2hhciBkZWxpbWMpOworc3RhdGljIHZvaWQgQ29weUNo ZWNrQ1NWUXVvdGVOZWVkU0lNRChjb25zdCBjaGFyICoqcHRyLAorCQkJCQkJCQkJICBzaXplX3Qg bGVuLCBjaGFyIGRlbGltYywgY2hhciBxdW90ZWMpOworc3RhdGljIHZvaWQgQ29weVNraXBDU1ZF c2NhcGVTSU1EKGNvbnN0IGNoYXIgKipwdHIsCisJCQkJCQkJCSAgc2l6ZV90IGxlbiwgY2hhciBl c2NhcGVjLCBjaGFyIHF1b3RlYyk7CisKKy8qCisgKiBDb3B5U2tpcFRleHRTSU1EIC0gU2NhbiBm b3J3YXJkIGluIFRFWFQgbW9kZSB1c2luZyBTSU1ELAorICogc3RvcHBpbmcgYXQgdGhlIGZpcnN0 IHNwZWNpYWwgY2hhcmFjdGVyIHRoZW4gY2FsbGVyIGNvbnRpbnVlcyBwcm9jZXNzaW5nIGFueSBy ZW1haW5pbmcKKyAqIGNoYXJhY3RlcnMgaW4gdGhlIHNjYWxhciBwYXRoLgorICoKKyAqIFNwZWNp YWwgY2hhcmFjdGVycyBmb3IgVEVYVCBtb2RlIGFyZTogQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJz ICg8IDB4MjApLAorICogYmFja3NsYXNoLCBhbmQgdGhlIGRlbGltaXRlci4KKyAqLworc3RhdGlj IHZvaWQKK0NvcHlTa2lwVGV4dFNJTUQoY29uc3QgY2hhciAqKnB0ciwgc2l6ZV90IGxlbiwgY2hh ciBkZWxpbWMpCit7CisjaWZuZGVmIFVTRV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7 CisJY29uc3QgY2hhciAqZW5kID0gcCArIGxlbjsKKworCWNvbnN0IFZlY3RvcjggYmFja3NsYXNo X21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXFwnKTsKKwljb25zdCBWZWN0b3I4IGRlbGltX21h c2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChkZWxpbWMpOworCWNvbnN0IFZlY3RvcjggY29udHJvbF9t YXNrID0gdmVjdG9yOF9icm9hZGNhc3QoMHgyMCk7CisKKwl3aGlsZSAocCArIHNpemVvZihWZWN0 b3I4KSA8PSBlbmQpCisJeworCQlWZWN0b3I4CQljaHVuazsKKwkJVmVjdG9yOAkJbWF0Y2g7CisK KwkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIHApOworCisJCW1hdGNoID0g dmVjdG9yOF9vcih2ZWN0b3I4X2d0KGNvbnRyb2xfbWFzaywgY2h1bmspLAorCQkJCQkJICAgdmVj dG9yOF9lcShjaHVuaywgYmFja3NsYXNoX21hc2spKTsKKwkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1h dGNoLCB2ZWN0b3I4X2VxKGNodW5rLCBkZWxpbV9tYXNrKSk7CisKKwkJaWYgKHZlY3RvcjhfaXNf aGlnaGJpdF9zZXQobWF0Y2gpKQorCQl7CisJCQl1aW50MzIJCW1hc2s7CisKKwkJCW1hc2sgPSB2 ZWN0b3I4X2hpZ2hiaXRfbWFzayhtYXRjaCk7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0bW9zdF9v bmVfcG9zMzIobWFzayk7CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihWZWN0b3I4 KTsKKwl9CisKKwkqcHRyID0gcDsKKyNlbmRpZgorfQorCisvKgorICogQ29weUNoZWNrQ1NWUXVv dGVOZWVkU0lNRCAtIFNjYW4gYSBDU1YgZmllbGQgdXNpbmcgU0lNRCB0byBkZXRlcm1pbmUKKyAq IHdoZXRoZXIgaXQgbmVlZHMgcXVvdGluZyBzdG9wcGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVy IHRoYXQgd291bGQgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUgcXVvdGVkOgorICogdGhlIGRlbGlt aXRlciwgdGhlIHF1b3RlIGNoYXJhY3RlciwgbmV3bGluZSwgb3IgY2FycmlhZ2UgcmV0dXJuLgor ICovCitzdGF0aWMgdm9pZAorQ29weUNoZWNrQ1NWUXVvdGVOZWVkU0lNRChjb25zdCBjaGFyICoq cHRyLCBzaXplX3QgbGVuLCBjaGFyIGRlbGltYywgY2hhciBxdW90ZWMpCit7CisjaWZuZGVmIFVT RV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7CisJY29uc3QgY2hhciAqZW5kID0gcCAr IGxlbjsKKworCS8vIERvIGEgc2NhbGFyIHByZXNjYW4gb2Ygc2l6ZW9mKFZlY3RvcjgpIGlmIHBv c3NpYmxlLCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2Ygc2V0dGluZyB1cCBTSU1EIGZvciBlYXJs eSBzdG9wcy4KKwljb25zdCBjaGFyICpwcmVzY2FuX2VuZCA9IHAgKyBzaXplb2YoVmVjdG9yOCk7 CisJd2hpbGUgKHAgPCBwcmVzY2FuX2VuZCAmJiBwIDwgZW5kKQorCXsKKwkJY2hhciBjID0gKnA7 CisJCWlmIChjID09IGRlbGltYyB8fCBjID09IHF1b3RlYyB8fCBjID09ICdcbicgfHwgYyA9PSAn XHInKQorCQl7CisJCQkqcHRyID0gcDsKKwkJCXJldHVybjsKKwkJfQorCQlwKys7CisJfQorCisJ Y29uc3QgVmVjdG9yOCBkZWxpbV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoZGVsaW1jKTsKKwlj b25zdCBWZWN0b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChxdW90ZWMpOworCWNv bnN0IFZlY3RvcjggbmxfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcbicpOworCWNvbnN0IFZl Y3RvcjggY3JfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdccicpOworCisJd2hpbGUgKHAgKyBz aXplb2YoVmVjdG9yOCkgPD0gZW5kKQorCXsKKwkJVmVjdG9yOAkJY2h1bms7CisJCVZlY3RvcjgJ CW1hdGNoOworCisJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1aW50OCAqKSBwKTsKKwor CQltYXRjaCA9IHZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgbmxfbWFzayksIHZlY3Rvcjhf ZXEoY2h1bmssIGNyX21hc2spKTsKKwkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0b3I4 X29yKHZlY3RvcjhfZXEoY2h1bmssIGRlbGltX21hc2spLAorCQkJCQkJCQkJCQkgdmVjdG9yOF9l cShjaHVuaywgcXVvdGVfbWFzaykpKTsKKworCQlpZiAodmVjdG9yOF9pc19oaWdoYml0X3NldCht YXRjaCkpCisJCXsKKwkJCXVpbnQzMgkJbWFzazsKKworCQkJbWFzayA9IHZlY3RvcjhfaGlnaGJp dF9tYXNrKG1hdGNoKTsKKwkJCSpwdHIgPSBwICsgcGdfcmlnaHRtb3N0X29uZV9wb3MzMihtYXNr KTsKKwkJCXJldHVybjsKKwkJfQorCisJCXAgKz0gc2l6ZW9mKFZlY3RvcjgpOworCX0KKworCSpw dHIgPSBwOworI2VuZGlmCit9CisKKy8qCisgKiBDb3B5U2tpcENTVkVzY2FwZVNJTUQgLSBTYW1l IGFzIENvcHlDaGVja0NTVlF1b3RlTmVlZFNJTUQsIHNjYW4gZm9yd2FyZCBpbiBDU1YgbW9kZSB1 c2luZyBTSU1ELAorICogc3RvcHBpbmcgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciB0aGF0IHJlcXVp cmVzIGVzY2FwaW5nLgorICovCitzdGF0aWMgdm9pZAorQ29weVNraXBDU1ZFc2NhcGVTSU1EKGNv bnN0IGNoYXIgKipwdHIsIHNpemVfdCBsZW4sIGNoYXIgZXNjYXBlYywgY2hhciBxdW90ZWMpCit7 CisjaWZuZGVmIFVTRV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7CisJY29uc3QgY2hh ciAqZW5kID0gcCArIGxlbjsKKworCS8vIERvIGEgc2NhbGFyIHByZXNjYW4gb2Ygc2l6ZW9mKFZl Y3RvcjgpIGlmIHBvc3NpYmxlLCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2Ygc2V0dGluZyB1cCBT SU1EIGZvciBlYXJseSBzdG9wcy4KKwljb25zdCBjaGFyICpwcmVzY2FuX2VuZCA9IHAgKyBzaXpl b2YoVmVjdG9yOCk7CisJd2hpbGUgKHAgPCBwcmVzY2FuX2VuZCAmJiBwIDwgZW5kKQorCXsKKwkJ Y2hhciBjID0gKnA7CisJCWlmIChjID09IGVzY2FwZWMgfHwgYyA9PSBxdW90ZWMpCisJCXsKKwkJ CSpwdHIgPSBwOworCQkJcmV0dXJuOworCQl9CisJCXArKzsKKwl9CisKKwljb25zdCBWZWN0b3I4 IGVzY2FwZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisJY29uc3QgVmVjdG9y OCBxdW90ZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsKKworCXdoaWxlIChwICsg c2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkKKwl7CisJCVZlY3RvcjgJCWNodW5rOworCQlWZWN0b3I4 CQltYXRjaDsKKworCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcCk7CisK KwkJbWF0Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIHF1b3RlX21hc2spLCB2ZWN0 b3I4X2VxKGNodW5rLCBlc2NhcGVfbWFzaykpOworCisJCWlmICh2ZWN0b3I4X2lzX2hpZ2hiaXRf c2V0KG1hdGNoKSkKKwkJeworCQkJdWludDMyCQltYXNrOworCisJCQltYXNrID0gdmVjdG9yOF9o aWdoYml0X21hc2sobWF0Y2gpOworCQkJKnB0ciA9IHAgKyBwZ19yaWdodG1vc3Rfb25lX3BvczMy KG1hc2spOworCQkJcmV0dXJuOworCQl9CisKKwkJcCArPSBzaXplb2YoVmVjdG9yOCk7CisJfQor CisJKnB0ciA9IHA7CisjZW5kaWYKK30KIAogLyogYnVpbHQtaW4gZm9ybWF0LXNwZWNpZmljIHJv dXRpbmVzICovCiBzdGF0aWMgdm9pZCBDb3B5VG9UZXh0TGlrZVN0YXJ0KENvcHlUb1N0YXRlIGNz dGF0ZSwgVHVwbGVEZXNjIHR1cERlc2MpOwpAQCAtMjQ0LDkgKzQwOCw5IEBAIENvcHlUb1RleHRM aWtlU3RhcnQoQ29weVRvU3RhdGUgY3N0YXRlLCBUdXBsZURlc2MgdHVwRGVzYykKIAkJCWNvbG5h bWUgPSBOYW1lU3RyKFR1cGxlRGVzY0F0dHIodHVwRGVzYywgYXR0bnVtIC0gMSktPmF0dG5hbWUp OwogCiAJCQlpZiAoY3N0YXRlLT5vcHRzLmZvcm1hdCA9PSBDT1BZX0ZPUk1BVF9DU1YpCi0JCQkJ Q29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIGNvbG5hbWUsIGZhbHNlKTsKKwkJCQlDb3B5QXR0 cmlidXRlT3V0Q1NWKGNzdGF0ZSwgY29sbmFtZSwgZmFsc2UsIGZhbHNlLCAwKTsKIAkJCWVsc2UK LQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4dChjc3RhdGUsIGNvbG5hbWUpOworCQkJCUNvcHlBdHRy aWJ1dGVPdXRUZXh0KGNzdGF0ZSwgY29sbmFtZSwgZmFsc2UsIDApOwogCQl9CiAKIAkJQ29weVNl bmRUZXh0TGlrZUVuZE9mUm93KGNzdGF0ZSk7CkBAIC0zMDQsNiArNDY4LDcgQEAgQ29weVRvVGV4 dExpa2VPbmVSb3coQ29weVRvU3RhdGUgY3N0YXRlLAogewogCWJvb2wJCW5lZWRfZGVsaW0gPSBm YWxzZTsKIAlGbWdySW5mbyAgICpvdXRfZnVuY3Rpb25zID0gY3N0YXRlLT5vdXRfZnVuY3Rpb25z OworCVR1cGxlRGVzYwl0dXBfZGVzYyA9IHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3I7CiAKIAlm b3JlYWNoX2ludChhdHRudW0sIGNzdGF0ZS0+YXR0bnVtbGlzdCkKIAl7CkBAIC0zMjEsMTUgKzQ4 Niw0OCBAQCBDb3B5VG9UZXh0TGlrZU9uZVJvdyhDb3B5VG9TdGF0ZSBjc3RhdGUsCiAJCWVsc2UK IAkJewogCQkJY2hhcgkgICAqc3RyaW5nOworCQkJYm9vbAkJdXNlX3NpbWQgPSBmYWxzZTsKKwkJ CXNpemVfdAkJbGVuID0gMDsKKworCQkJc3RyaW5nID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZvdXRf ZnVuY3Rpb25zW2F0dG51bSAtIDFdLCB2YWx1ZSk7CiAKLQkJCXN0cmluZyA9IE91dHB1dEZ1bmN0 aW9uQ2FsbCgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwKLQkJCQkJCQkJCQl2YWx1ZSk7CisJ CQkvKgorCQkJKiBPbmx5IHVzZSBTSU1EIGZvciB2YXJsZW5hIHR5cGVzIHdpdGhvdXQgdHJhbnNj b2RpbmcuICBGaXhlZC1zaXplCisJCQkqIHR5cGVzIChpbnQ0LCBib29sLCBkYXRlLCBldGMuKSBh bHdheXMgcHJvZHVjZSBzaG9ydCBBU0NJSSBvdXRwdXQKKwkJCSogZm9yIHdoaWNoIFNJTUQgcHJv dmlkZXMgbm8gYmVuZWZpdC4gIFdoZW4gdHJhbnNjb2RpbmcgaXMgbmVlZGVkLAorCQkJKiB0aGUg c3RyaW5nIGxlbmd0aCBtYXkgY2hhbmdlIGFmdGVyIGNvbnZlcnNpb24sIHNvIHdlIHNraXAgU0lN RAorCQkJKiBlbnRpcmVseSBpbiB0aGF0IGNhc2UgdG9vLgorCQkJKgorCQkJKiBXZSB1c2UgVkFS U0laRV9BTllfRVhIRFIgYXMgYSBjaGVhcCBwcmUtZmlsdGVyIHRvIGF2b2lkIGNhbGxpbmcKKwkJ CSogc3RybGVuKCkgb24gc2hvcnQgdmFybGVuYXMuICBUaGUgYWN0dWFsIGxlbmd0aCBwYXNzZWQg dG8gdGhlIFNJTUQKKwkJCSogaGVscGVycyBpcyBhbHdheXMgc3RybGVuKHN0cmluZykgc28gdGhl IHRleHQgb3V0cHV0IGxlbmd0aCBub3QKKwkJCSogdGhlIGJpbmFyeSBzdG9yYWdlIHNpemUuCisJ CQkqLworCQkJaWYgKFR1cGxlRGVzY0F0dHIodHVwX2Rlc2MsIGF0dG51bSAtIDEpLT5hdHRsZW4g PT0gLTEgJiYKKwkJCQlWQVJTSVpFX0FOWV9FWEhEUihEYXR1bUdldFBvaW50ZXIodmFsdWUpKSA+ IHNpemVvZihWZWN0b3I4KSkKKwkJCXsKKwkJCQlsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwkJCQl1 c2Vfc2ltZCA9ICFjc3RhdGUtPm5lZWRfdHJhbnNjb2RpbmcgJiYgKGxlbiA+IHNpemVvZihWZWN0 b3I4KSk7CisJCQl9CiAKIAkJCWlmIChpc19jc3YpCi0JCQkJQ29weUF0dHJpYnV0ZU91dENTVihj c3RhdGUsIHN0cmluZywKLQkJCQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1th dHRudW0gLSAxXSk7CisJCQl7CisJCQkJaWYgKHVzZV9zaW1kKQorCQkJCQlDb3B5QXR0cmlidXRl T3V0Q1NWKGNzdGF0ZSwgc3RyaW5nLAorCQkJCQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90 ZV9mbGFnc1thdHRudW0gLSAxXSwKKwkJCQkJCQkJCQl0cnVlLCBsZW4pOworCQkJCWVsc2UKKwkJ CQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIHN0cmluZywKKwkJCQkJCQkJCQljc3RhdGUt Pm9wdHMuZm9yY2VfcXVvdGVfZmxhZ3NbYXR0bnVtIC0gMV0sCisJCQkJCQkJCQkJZmFsc2UsIGxl bik7CisJCQl9CiAJCQllbHNlCi0JCQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJp bmcpOworCQkJeworCQkJCWlmICh1c2Vfc2ltZCkKKwkJCQkJQ29weUF0dHJpYnV0ZU91dFRleHQo Y3N0YXRlLCBzdHJpbmcsIHRydWUsIGxlbik7CisJCQkJZWxzZQorCQkJCQlDb3B5QXR0cmlidXRl T3V0VGV4dChjc3RhdGUsIHN0cmluZywgZmFsc2UsIGxlbik7CisJCQl9CiAJCX0KIAl9CiAKQEAg LTE0MTYsOCArMTYxNCwyNCBAQCBDb3B5T25lUm93VG8oQ29weVRvU3RhdGUgY3N0YXRlLCBUdXBs ZVRhYmxlU2xvdCAqc2xvdCkKIAkJCUNvcHlTZW5kRGF0YShjc3RhdGUsIHN0YXJ0LCBwdHIgLSBz dGFydCk7IFwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZAotQ29weUF0dHJpYnV0ZU91dFRl eHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCisvKgorICogQ29weUF0 dHJpYnV0ZU91dFRleHQgLSBTZW5kIHRleHQgcmVwcmVzZW50YXRpb24gb2Ygb25lIGF0dHJpYnV0 ZSwKKyAqIHdpdGggY29udmVyc2lvbiBhbmQgZXNjYXBpbmcuCisgKgorICogRm9yIGEgbGl0dGxl IGV4dHJhIHNwZWVkLCBpZiB1c2Vfc2ltZCBpcyB0cnVlIHdlIGZpcnN0IHVzZSBTSU1ECisgKiBp bnN0cnVjdGlvbnMgdG8gc2tpcCBvdmVyIGNodW5rcyBvZiBkYXRhIHRoYXQgY29udGFpbiBubyBz cGVjaWFsCisgKiBjaGFyYWN0ZXJzLiAgVGhpcyBwcmUtcGFzcyBhZHZhbmNlcyBwdHIgYXMgZmFy IGFzIHBvc3NpYmxlIGJlZm9yZQorICogaGFuZGluZyBvZmYgdG8gdGhlIHNjYWxhciBsb29wIGJl bG93LCB3aGljaCB0aGVuIHByb2Nlc3NlcyBhbnkKKyAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzLiAg dXNlX3NpbWQgaXMgb25seSBzZXQgYnkgdGhlIGNhbGxlciB3aGVuIHRoZQorICogYXR0cmlidXRl IGlzIGEgdmFybGVuYSB0eXBlIHdob3NlIHRleHQgcmVwcmVzZW50YXRpb24gaXMgbG9uZ2VyIHRo YW4KKyAqIGEgc2luZ2xlIFNJTUQgdmVjdG9yIGFuZCBubyBlbmNvZGluZyBjb252ZXJzaW9uIGlz IHJlcXVpcmVkLiAgSW4gYWxsCisgKiBvdGhlciBjYXNlcyB3ZSBmYWxsIHN0cmFpZ2h0IHRocm91 Z2ggdG8gdGhlIHNjYWxhciBwYXRoLgorICoKKyAqIFdoZW4gdXNlX3NpbWQgaXMgdHJ1ZSwgbGVu IG11c3QgYmUgdGhlIHN0cmxlbigpIG9mIHN0cmluZywgb3RoZXJ3aXNlIGl0IGlzIHVudXNlZAor ICovCitzdGF0aWMgcGdfYXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgdm9pZAorQ29weUF0dHJpYnV0 ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJCSBi b29sIHVzZV9zaW1kLCBzaXplX3QgbGVuKQogewogCWNvbnN0IGNoYXIgKnB0cjsKIAljb25zdCBj aGFyICpzdGFydDsKQEAgLTE0MjUsNyArMTYzOSwxNSBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChD b3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAljaGFyCQlkZWxpbWMgPSBj c3RhdGUtPm9wdHMuZGVsaW1bMF07CiAKIAlpZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29kaW5nKQot CQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVuKHN0cmluZyksIGNzdGF0ZS0+ ZmlsZV9lbmNvZGluZyk7CisJeworCQkvKgorCQkgKiBsZW4gbWF5IGFscmVhZHkgYmUgc2V0IGJ5 IHRoZSBjYWxsZXIgZm9yIGxvbmcgdmFybGVuYXMsIGF2b2lkaW5nIGFuIGV4dHJhCisJCSAqIHN0 cmxlbigpIGNhbGwuICBGb3IgYWxsIG90aGVyIGNhc2VzIGl0IGlzIDAgYW5kIHdlIGNvbXB1dGUg aXQgaGVyZS4KKwkJICovCisJCWlmIChsZW4gPT0gMCkKKwkJCWxlbiA9IHN0cmxlbihzdHJpbmcp OworCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZpbGVfZW5j b2RpbmcpOworCX0KIAllbHNlCiAJCXB0ciA9IHN0cmluZzsKIApAQCAtMTQ0Niw2ICsxNjY4LDkg QEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcpCiAJaWYgKGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQogCXsKIAkJc3RhcnQg PSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwVGV4dFNJTUQoJnB0ciwgbGVuLCBk ZWxpbWMpOworCiAJCXdoaWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5z aWduZWQgY2hhcikgYyA8ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAtMTUwNiw2ICsxNzMxLDkg QEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcpCiAJZWxzZQogCXsKIAkJc3RhcnQgPSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNv cHlTa2lwVGV4dFNJTUQoJnB0ciwgbGVuLCBkZWxpbWMpOworCiAJCXdoaWxlICgoYyA9ICpwdHIp ICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8ICh1bnNpZ25lZCBjaGFy KSAweDIwKQpAQCAtMTU2NiwxMiArMTc5NCwxNCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5 VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIH0KIAogLyoKLSAqIFNlbmQgdGV4 dCByZXByZXNlbnRhdGlvbiBvZiBvbmUgYXR0cmlidXRlLCB3aXRoIGNvbnZlcnNpb24gYW5kCi0g KiBDU1Ytc3R5bGUgZXNjYXBpbmcKKyAqIENvcHlBdHRyaWJ1dGVPdXRDU1YgLSBTZW5kIHRleHQg cmVwcmVzZW50YXRpb24gb2Ygb25lIGF0dHJpYnV0ZSwKKyAqIHdpdGggY29udmVyc2lvbiBhbmQg Q1NWLXN0eWxlIGVzY2FwaW5nLgorICoKKyAqIFdlIHVzZSB0aGUgc2FtZSBzaW1kIG9wdGltaXph dGlvbiBpZGVhLCBzZWUgQ29weUF0dHJpYnV0ZU91dFRleHQgY29tbWVudC4KICAqLwotc3RhdGlj IHZvaWQKK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSB2b2lkCiBDb3B5QXR0cmli dXRlT3V0Q1NWKENvcHlUb1N0YXRlIGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQli b29sIHVzZV9xdW90ZSkKKwkJCQkJYm9vbCB1c2VfcXVvdGUsIGJvb2wgdXNlX3NpbWQsIHNpemVf dCBsZW4pCiB7CiAJY29uc3QgY2hhciAqcHRyOwogCWNvbnN0IGNoYXIgKnN0YXJ0OwpAQCAtMTU4 Niw3ICsxODE2LDE1IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBj b25zdCBjaGFyICpzdHJpbmcsCiAJCXVzZV9xdW90ZSA9IHRydWU7CiAKIAlpZiAoY3N0YXRlLT5u ZWVkX3RyYW5zY29kaW5nKQotCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVu KHN0cmluZyksIGNzdGF0ZS0+ZmlsZV9lbmNvZGluZyk7CisJeworCQkvKgorCQkgKiBsZW4gbWF5 IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgZm9yIGxvbmcgdmFybGVuYXMsIGF2b2lkaW5n IGFuIGV4dHJhCisJCSAqIHN0cmxlbigpIGNhbGwuICBGb3IgYWxsIG90aGVyIGNhc2VzIGl0IGlz IDAgYW5kIHdlIGNvbXB1dGUgaXQgaGVyZS4KKwkJICovCisJCWlmIChsZW4gPT0gMCkKKwkJCWxl biA9IHN0cmxlbihzdHJpbmcpOworCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVu LCBjc3RhdGUtPmZpbGVfZW5jb2RpbmcpOworCX0KIAllbHNlCiAJCXB0ciA9IHN0cmluZzsKIApA QCAtMTYwOCw2ICsxODQ2LDkgQEAgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3Rh dGUsIGNvbnN0IGNoYXIgKnN0cmluZywKIAkJewogCQkJY29uc3QgY2hhciAqdHB0ciA9IHB0cjsK IAorCQkJaWYgKHVzZV9zaW1kKQorCQkJCUNvcHlDaGVja0NTVlF1b3RlTmVlZFNJTUQoJnRwdHIs IGxlbiwgZGVsaW1jLCBxdW90ZWMpOworCiAJCQl3aGlsZSAoKGMgPSAqdHB0cikgIT0gJ1wwJykK IAkJCXsKIAkJCQlpZiAoYyA9PSBkZWxpbWMgfHwgYyA9PSBxdW90ZWMgfHwgYyA9PSAnXG4nIHx8 IGMgPT0gJ1xyJykKQEAgLTE2MzEsNiArMTg3Miw5IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29w eVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCSAqIFdlIGFkb3B0IHRoZSBz YW1lIG9wdGltaXphdGlvbiBzdHJhdGVneSBhcyBpbiBDb3B5QXR0cmlidXRlT3V0VGV4dAogCQkg Ki8KIAkJc3RhcnQgPSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwQ1NWRXNjYXBl U0lNRCgmcHRyLCBsZW4sIGVzY2FwZWMsIHF1b3RlYyk7CisKIAkJd2hpbGUgKChjID0gKnB0cikg IT0gJ1wwJykKIAkJewogCQkJaWYgKGMgPT0gcXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0gCjIu MzQuMQoK --000000000000b198ee064e05f37c--