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 1vqrcK-0022ve-1H for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Feb 2026 11:45:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqrcJ-00E3Or-1t for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Feb 2026 11:45:48 +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 1vqrcJ-00E3Oi-0h for pgsql-hackers@lists.postgresql.org; Fri, 13 Feb 2026 11:45:48 +0000 Received: from mail-dl1-x1234.google.com ([2607:f8b0:4864:20::1234]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vqrcH-00000000U0Y-1LIF for pgsql-hackers@postgresql.org; Fri, 13 Feb 2026 11:45:47 +0000 Received: by mail-dl1-x1234.google.com with SMTP id a92af1059eb24-1270adc5121so1295681c88.0 for ; Fri, 13 Feb 2026 03:45:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770983143; cv=none; d=google.com; s=arc-20240605; b=E+gBBMvjBo/DIJ1/8ezmq4cDlPtSFCTS0IjP/2/y9lc3Ts9bRhzSZWU+boXurXtqcv /rSwWr/efYxxGDl+0vdWlG6YF1gKgd5/43QynSx+1/SqCpux/shhO96UL7nBa2D0xEXp 7HryQDAa0PCQOZ4OBcdURBzRpYl8GgAgeD7fm2pkhrT+uf0g3KDfJS10xIqIEe95MC1J yRjFfwvlwe1985nis9H6GpjOs4ijfJeGPZLE5OygJFwU8ey7aBfZ5lSTMn6qXlhaycMM siIFkv7aS98t/X7cF7R0a8hTRVUCrxpVchpgXyc3erppVdUIyBEwOoe5BQ9+V0Q452D1 FIFg== 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=zg7zSSl/X7Z3Aovfxj+CBg4F6KWYN7hAz9xn9fB1XuQ=; fh=jpXZNif+Jw0xaeb8FkWsiY/RP7BDWNhI3sdy9TTzYMk=; b=HRbFM8QFs6TA6qGuKkq+zWgGCe4GClQiNWudegjVhZdXX6a83AKPV/+T4CsF/Ziee6 VFrkOhg+t2So78pgzF2rN/gk6Z2aFW9ghtOex7+dfFPpBAwe5/UAZZnHmoeF8CSTlksU CjRi7q2MreGbVfnM5K4aQt7F9oyHobk7D8Gr9mgFday/iUcoWZlAaSWlUDlDInA/jV7j Foyw5Ru1y72KFJ85Bzr0HOWr3UckUMUFnH5hxAQZpjUpcjVeijSxaJSbGBVJBSD68KYV ne88Xm6E0eob2S8PWykzLSlTpPspmonu8q0m6c8cspsHcs2di1+d8fUKqHweDkhFm6y7 TwJg==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770983143; x=1771587943; 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=zg7zSSl/X7Z3Aovfxj+CBg4F6KWYN7hAz9xn9fB1XuQ=; b=SWRdzNutFKzEL5JBGDU4zdzjYI7kj8VRUDlA8B24HYfg54dSpa1Vp5Shlu83c0qkAD LDuS/PKmhOaLO2HktHCfXjd21R2FEp54HyuENiAFbnBYeveo4RX80JIzp5JvwQCPC1k1 90tYv0B01YAwo+ImcG6DPu/E/Q/pwDJLq6rs/pqspibqS/eD4Mj5LjDiURUwQFiN5neX 0uYVKC3Kg1Q2UC9EO0wH8Ewt9BuWEKw/RPnCiX0AFmCVNJdwmjCmTfxCWXrAqohpg8gJ 0gi08mHKpxlhUHg35VwIXNqld8ykXfduvkuirTHO7J+7mI6+FixrMfCLPLw3it0ZUo63 XAvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770983143; x=1771587943; 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=zg7zSSl/X7Z3Aovfxj+CBg4F6KWYN7hAz9xn9fB1XuQ=; b=a7Xo9S6aEQYhQT+w+XjSl0pyH26ZQe0TMMv0hgmqp8l6NVh2aS3tg/TzcutMUVvRhK lCQHYSF93i4Gbil2cEOwo8EnSzP41xNEzgSBNrf22ag/EfXM54n/ZOJvupbAd+hPJmjA AeYll/9H6eQgjies0ulanhl+B5C5IrULXvKdpIkDsrCqhVHe0Sbfgrfc1LF1QC5gjwnh Mt7Akuuqn6sq6tZFhDMSPe01x75WKXrZwkBdyVDGf7Xjd2QijXjr+Aj4nIl86WlTf6mR pNRZjZ88B6lAGlHAnSufsLP+/XDYHjcewXg6dGjhrA7oNYfl2D7JheGuPgmg5TTgEOMb c8CQ== X-Forwarded-Encrypted: i=1; AJvYcCXUiBUkwfDANzWd8UEMqvtFxuAp/i7CS8PRuX9msgnh0jt1qjXkzvk4Vh6d+nc5au5S9gvT9RCH4LrC6klm@postgresql.org X-Gm-Message-State: AOJu0YzAS51EOwAyXqgg6iW+YkRfyT31n/zfCTgxkR9VIhpB74+QR7zt HtZvmJj0yViqJpNXqJObBh7WSLCDNgfGnkFbgi02s/Uz8qswjT25kmthmZ3x/IFEcXxcy4Z2Y6D N8hIRIW6sTKTvL5N3kVPhuT1NOX3d4jk= X-Gm-Gg: AZuq6aLYZVQdi7AoVHh32P0ikvEAYfHBDK+8rWbjKszyBAQFLBx0RYYCZKQ7EuhosZ2 x8KnGlXeqTfeoWhnqmakXl0d4DgBqNQ+Ndl+4rQ7eupuo/BXupy9J/HMStKtRMLvKR4bFaZ/EU8 UAGY2RpYtAfJ/ddab1tnmtGqokdfXFRBvOQcdA/8zsdSfpyFd51gv976PX6cH5LxC+oFeCYeaau XuO01KsasjdplYH9vI8TgdvCb3kijZRhtB8/TU5q5l4SBWJSuqiBIevIq5xc3w9p3/llDap6GTO y0gN2A== X-Received: by 2002:a05:7301:1f10:b0:2ba:74fc:edca with SMTP id 5a478bee46e88-2babc400eb6mr376888eec.17.1770983142933; Fri, 13 Feb 2026 03:45:42 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Nazir Bilal Yavuz Date: Fri, 13 Feb 2026 14:45:30 +0300 X-Gm-Features: AZwV_QhYF0AzHmAbYvLXjayplfze8pK8_7LJPsnj5sGnx1xpDncDaB9rAUs81wA Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Nathan Bossart Cc: KAZAR Ayoub , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , PostgreSQL-development Content-Type: multipart/mixed; boundary="00000000000023c897064ab325f5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000023c897064ab325f5 Content-Type: text/plain; charset="UTF-8" Hi, Thanks for the review! On Thu, 12 Feb 2026 at 01:39, Nathan Bossart wrote: > > On Wed, Feb 11, 2026 at 04:27:50PM +0300, Nazir Bilal Yavuz wrote: > > I am sharing a v6 which implements (1). My benchmark results show > > almost no difference for the special-character cases and a nice > > improvement for the no-special-character cases. > > Thanks! > > > + /* Initialize SIMD variables */ > > + cstate->simd_enabled = false; > > + cstate->simd_initialized = false; > > > + /* Initialize SIMD on the first read */ > > + if (unlikely(!cstate->simd_initialized)) > > + { > > + cstate->simd_initialized = true; > > + cstate->simd_enabled = true; > > + } > > Why do we do this initialization in CopyReadLine() as opposed to setting > simd_enabled to true when initializing cstate in BeginCopyFrom()? If we > can initialize it in BeginCopyFrom, we could probably remove > simd_initialized. Correct, I guess this is left over from the earlier versions. > > + if (cstate->simd_enabled) > > + result = CopyReadLineText(cstate, is_csv, true); > > + else > > + result = CopyReadLineText(cstate, is_csv, false); > > I know we discussed this upthread, but I'd like to take a closer look at > this to see whether/why it makes such a big difference. It's a bit awkward > that CopyReadLineText() needs to manage both its local simd_enabled and > cstate->simd_enabled. I extensively benchmarked this with the new v6 version. If I change this to either of: CopyReadLineText(cstate, is_csv); or CopyReadLineText(cstate, is_csv, cstate->simd_enabled); then there is %5-%10 regression for the scalar path. I ran my benchmarks with both "meson --buildtype=debugoptimized" and "meson --buildtype=release" but the result is the same. Also, if I change this code to: if (cstate->simd_enabled) { if (is_csv) result = CopyReadLineText(cstate, true, true); else result = CopyReadLineText(cstate, false, true); } else { if (is_csv) result = CopyReadLineText(cstate, true, false); else result = CopyReadLineText(cstate, false, false); } then I see ~%5 performance improvement in scalar path compared to master. > + /* Load a chunk of data into a vector register */ > + vector8_load(&chunk, (const uint8 *) ©_input_buf[input_buf_ptr]); > > As mentioned upthread [0], I think it's worth testing whether processing > multiple vectors worth of data in each loop iteration is worthwhile. > > [0] https://postgr.es/m/aSTVOe6BIe5f1l3i%40nathan There are multiple keys in CopyReadLineText() compared to pg_lfind32(). I am not sure if I correctly used multiple vectors but I attached what I did as 0002, could you please look at it? I didn't see any performance benefit in my benchmarks, though. -- Regards, Nazir Bilal Yavuz Microsoft --00000000000023c897064ab325f5 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Disposition: attachment; filename="v7-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlktlqdj0 RnJvbSBjNGIyOTg0OWFkOWY4N2Y1MTAyMmI5NDdhOWEwYWI2OTVkZDFjZGUyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBGcmksIDEzIEZlYiAyMDI2IDEzOjI4OjU1ICswMzAwClN1YmplY3Q6IFtQQVRDSCB2 NyAxLzJdIFNwZWVkIHVwIENPUFkgRlJPTSB0ZXh0L0NTViBwYXJzaW5nIHVzaW5nIFNJTUQKClRo aXMgcGF0Y2ggZGlzYWJsZXMgU0lNRCB3aGVuIFNJTUQgZW5jb3VudGVycyBhIHNwZWNpYWwgY2hh cmFjdGVyIHdoaWNoCmlzIG5laXRoZXIgRU9GIG5vciBFT0wuCgpBdXRob3I6IFNoaW55YSBLYXRv IDxzaGlueWExMS5rYXRvQGdtYWlsLmNvbT4KQXV0aG9yOiBOYXppciBCaWxhbCBZYXZ1eiA8Ynlh dnV6ODFAZ21haWwuY29tPgpSZXZpZXdlZC1ieTogS2F6YXIgQXlvdWIgPG1hX2themFyQGVzaS5k ej4KUmV2aWV3ZWQtYnk6IE5hdGhhbiBCb3NzYXJ0IDxuYXRoYW5kYm9zc2FydEBnbWFpbC5jb20+ ClJldmlld2VkLWJ5OiBOZWlsIENvbndheSA8bmVpbC5jb253YXlAZ21haWwuY29tPgpSZXZpZXdl ZC1ieTogQW5kcmV3IER1bnN0YW4gPGFuZHJld0BkdW5zbGFuZS5uZXQ+ClJldmlld2VkLWJ5OiBN YW5uaSBXb29kIDxtYW5uaS53b29kQGVudGVycHJpc2VkYi5jb20+ClJldmlld2VkLWJ5OiBNYXJr IFdvbmcgPG1hcmt3a21AZ21haWwuY29tPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9t L0NBT3pFdXJTVzhjTnI2VFBLc2pyc3RuUGZoZjRReVFxQjR0blBYR0dlOE40ZV92N0ppZyU0MG1h aWwuZ21haWwuY29tCi0tLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYyAgICAgICAg ICB8ICAgMyArCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgICAgIHwgMTI1 ICsrKysrKysrKysrKysrKysrKysrKystCiBzcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9p bnRlcm5hbC5oIHwgICAzICsKIDMgZmlsZXMgY2hhbmdlZCwgMTI2IGluc2VydGlvbnMoKyksIDUg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20u YyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKaW5kZXggMjVlZTIwYjIzZGIuLjQw ZGFlMGJkYWNjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jCisr KyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKQEAgLTE3MjEsNiArMTcyMSw5IEBA IEJlZ2luQ29weUZyb20oUGFyc2VTdGF0ZSAqcHN0YXRlLAogCWNzdGF0ZS0+Y3VyX2F0dHZhbCA9 IE5VTEw7CiAJY3N0YXRlLT5yZWxuYW1lX29ubHkgPSBmYWxzZTsKIAorCS8qIEluaXRpYWxpemUg U0lNRCAqLworCWNzdGF0ZS0+c2ltZF9lbmFibGVkID0gdHJ1ZTsKKwogCS8qCiAJICogQWxsb2Nh dGUgYnVmZmVycyBmb3IgdGhlIGlucHV0IHBpcGVsaW5lLgogCSAqCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9j b3B5ZnJvbXBhcnNlLmMKaW5kZXggOTRkNmY0MTVhMDYuLjRhMTI3ZDFhZjkwIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKKysrIGIvc3JjL2JhY2tlbmQv Y29tbWFuZHMvY29weWZyb21wYXJzZS5jCkBAIC03Miw2ICs3Miw3IEBACiAjaW5jbHVkZSAibWlz Y2FkbWluLmgiCiAjaW5jbHVkZSAicGdzdGF0LmgiCiAjaW5jbHVkZSAicG9ydC9wZ19ic3dhcC5o IgorI2luY2x1ZGUgInBvcnQvc2ltZC5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAj aW5jbHVkZSAidXRpbHMvcmVsLmgiCiAKQEAgLTE0MSwxMiArMTQyLDE0IEBAIHN0YXRpYyBjb25z dCBjaGFyIEJpbmFyeVNpZ25hdHVyZVsxMV0gPSAiUEdDT1BZXG5cMzc3XHJcblwwIjsKIAogLyog bm9uLWV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzICovCiBzdGF0aWMgYm9vbCBDb3B5UmVhZExp bmUoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KTsKLXN0YXRpYyBib29sIENvcHlS ZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KTsKIHN0YXRpYyBp bnQJQ29weVJlYWRBdHRyaWJ1dGVzVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSk7CiBzdGF0aWMg aW50CUNvcHlSZWFkQXR0cmlidXRlc0NTVihDb3B5RnJvbVN0YXRlIGNzdGF0ZSk7CiBzdGF0aWMg RGF0dW0gQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoQ29weUZyb21TdGF0ZSBjc3RhdGUsIEZtZ3JJ bmZvICpmbGluZm8sCiAJCQkJCQkJCQkgT2lkIHR5cGlvcGFyYW0sIGludDMyIHR5cG1vZCwKIAkJ CQkJCQkJCSBib29sICppc251bGwpOworc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5l IGJvb2wgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwKKwkJCQkJCQkJCQkJ CQkJYm9vbCBpc19jc3YsCisJCQkJCQkJCQkJCQkJCWJvb2wgc2ltZF9lbmFibGVkKTsKIHN0YXRp YyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSBib29sIENvcHlGcm9tVGV4dExpa2VPbmVSb3co Q29weUZyb21TdGF0ZSBjc3RhdGUsCiAJCQkJCQkJCQkJCQkJCQkgIEV4cHJDb250ZXh0ICplY29u dGV4dCwKIAkJCQkJCQkJCQkJCQkJCSAgRGF0dW0gKnZhbHVlcywKQEAgLTExNzMsOCArMTE3Niwx NCBAQCBDb3B5UmVhZExpbmUoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCXJl c2V0U3RyaW5nSW5mbygmY3N0YXRlLT5saW5lX2J1Zik7CiAJY3N0YXRlLT5saW5lX2J1Zl92YWxp ZCA9IGZhbHNlOwogCi0JLyogUGFyc2UgZGF0YSBhbmQgdHJhbnNmZXIgaW50byBsaW5lX2J1ZiAq LwotCXJlc3VsdCA9IENvcHlSZWFkTGluZVRleHQoY3N0YXRlLCBpc19jc3YpOworCS8qCisJICog UGFyc2UgZGF0YSBhbmQgdHJhbnNmZXIgaW50byBsaW5lX2J1Zi4gVG8gYmVuZWZpdCBmcm9tIGlu bGluaW5nLCBjYWxsCisJICogQ29weVJlYWRMaW5lVGV4dCgpIHdpdGggY29uc3RhbnQgYm9vbGVh biBhcmd1bWVudHMuCisJICovCisJaWYgKGNzdGF0ZS0+c2ltZF9lbmFibGVkKQorCQlyZXN1bHQg PSBDb3B5UmVhZExpbmVUZXh0KGNzdGF0ZSwgaXNfY3N2LCB0cnVlKTsKKwllbHNlCisJCXJlc3Vs dCA9IENvcHlSZWFkTGluZVRleHQoY3N0YXRlLCBpc19jc3YsIGZhbHNlKTsKIAogCWlmIChyZXN1 bHQpCiAJewpAQCAtMTI0MSw4ICsxMjUwLDggQEAgQ29weVJlYWRMaW5lKENvcHlGcm9tU3RhdGUg Y3N0YXRlLCBib29sIGlzX2NzdikKIC8qCiAgKiBDb3B5UmVhZExpbmVUZXh0IC0gaW5uZXIgbG9v cCBvZiBDb3B5UmVhZExpbmUgZm9yIHRleHQgbW9kZQogICovCi1zdGF0aWMgYm9vbAotQ29weVJl YWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCitzdGF0aWMgcGdf YXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgYm9vbAorQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0 YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YsIGJvb2wgc2ltZF9lbmFibGVkKQogewogCWNoYXIJICAg KmNvcHlfaW5wdXRfYnVmOwogCWludAkJCWlucHV0X2J1Zl9wdHI7CkBAIC0xMjU3LDYgKzEyNjYs MTQgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3Yp CiAJY2hhcgkJcXVvdGVjID0gJ1wwJzsKIAljaGFyCQllc2NhcGVjID0gJ1wwJzsKIAorI2lmbmRl ZiBVU0VfTk9fU0lNRAorCVZlY3RvcjgJCW5sID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJ VmVjdG9yOAkJY3IgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKwlWZWN0b3I4CQlicyA9IHZl Y3RvcjhfYnJvYWRjYXN0KCdcXCcpOworCVZlY3RvcjgJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNh c3QoMCk7CisJVmVjdG9yOAkJZXNjYXBlID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisjZW5kaWYK KwogCWlmIChpc19jc3YpCiAJewogCQlxdW90ZWMgPSBjc3RhdGUtPm9wdHMucXVvdGVbMF07CkBA IC0xMjY0LDYgKzEyODEsMTIgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0 ZSwgYm9vbCBpc19jc3YpCiAJCS8qIGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNzaW5nIGlm IGl0J3MgdGhlIHNhbWUgYXMgcXVvdGVjICovCiAJCWlmIChxdW90ZWMgPT0gZXNjYXBlYykKIAkJ CWVzY2FwZWMgPSAnXDAnOworCisjaWZuZGVmIFVTRV9OT19TSU1ECisJCXF1b3RlID0gdmVjdG9y OF9icm9hZGNhc3QocXVvdGVjKTsKKwkJaWYgKHF1b3RlYyAhPSBlc2NhcGVjKQorCQkJZXNjYXBl ID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisjZW5kaWYKIAl9CiAKIAkvKgpAQCAtMTMz MCw2ICsxMzUzLDk4IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJv b2wgaXNfY3N2KQogCQkJbmVlZF9kYXRhID0gZmFsc2U7CiAJCX0KIAorI2lmbmRlZiBVU0VfTk9f U0lNRAorCisJCS8qCisJCSAqIFVzZSBTSU1EIGluc3RydWN0aW9ucyB0byBlZmZpY2llbnRseSBz Y2FuIHRoZSBpbnB1dCBidWZmZXIgZm9yCisJCSAqIHNwZWNpYWwgY2hhcmFjdGVycyAoZS5nLiwg bmV3bGluZSwgY2FycmlhZ2UgcmV0dXJuLCBxdW90ZSwgYW5kCisJCSAqIGVzY2FwZSkuIFRoaXMg aXMgZmFzdGVyIHRoYW4gYnl0ZS1ieS1ieXRlIGl0ZXJhdGlvbiwgZXNwZWNpYWxseSBvbgorCQkg KiBsYXJnZSBidWZmZXJzLgorCQkgKgorCQkgKiBXZSBkbyBub3QgYXBwbHkgdGhlIFNJTUQgZmFz dCBwYXRoIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCisJCSAqIGNhc2VzOiAtIFdoZW4gdGhl IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGNoYXJhY3RlciB3YXMgYW4gZXNjYXBlCisJCSAqIGNoYXJh Y3RlciAobGFzdF93YXNfZXNjKSwgc2luY2UgdGhlIG5leHQgYnl0ZSBtdXN0IGJlIGV4YW1pbmVk CisJCSAqIHNlcXVlbnRpYWxseS4gLSBXaGVuIHRoZSByZW1haW5pbmcgYnVmZmVyIGlzIHNtYWxs ZXIgdGhhbiBvbmUKKwkJICogdmVjdG9yIHdpZHRoIChzaXplb2YoVmVjdG9yOCkpLCBzaW5jZSBT SU1EIG9wZXJhdGVzIG9uIGZpeGVkLXNpemUKKwkJICogY2h1bmtzLgorCQkgKgorCQkgKiBOb3Rl IHRoYXQsIFNJTUQgbWF5IGJlY29tZSBzbG93ZXIgd2hlbiB0aGUgaW5wdXQgY29udGFpbnMgbWFu eQorCQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMuIFRvIGF2b2lkIHRoaXMgcmVncmVzc2lvbiwgd2Ug ZGlzYWJsZSBTSU1EIGZvcgorCQkgKiB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgb25jZSB3ZSBlbmNv dW50ZXIgYSBzcGVjaWFsIGNoYXJhY3RlciB3aGljaAorCQkgKiBpcyBuZWl0aGVyIEVPRiBub3Ig RU9MLgorCQkgKi8KKwkJaWYgKHNpbWRfZW5hYmxlZCAmJiAhbGFzdF93YXNfZXNjICYmIGNvcHlf YnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPiBzaXplb2YoVmVjdG9yOCkpCisJCXsKKwkJCVZlY3Rv cjgJCWNodW5rOworCQkJVmVjdG9yOAkJbWF0Y2ggPSB2ZWN0b3I4X2Jyb2FkY2FzdCgwKTsKKwkJ CXVpbnQzMgkJbWFzazsKKworCQkJLyogTG9hZCBhIGNodW5rIG9mIGRhdGEgaW50byBhIHZlY3Rv ciByZWdpc3RlciAqLworCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopICZj b3B5X2lucHV0X2J1ZltpbnB1dF9idWZfcHRyXSk7CisKKwkJCWlmIChpc19jc3YpCisJCQl7CisJ CQkJLyogXG4gYW5kIFxyIGFyZSBub3Qgc3BlY2lhbCBpbnNpZGUgcXVvdGVzICovCisJCQkJaWYg KCFpbl9xdW90ZSkKKwkJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIG5s KSwgdmVjdG9yOF9lcShjaHVuaywgY3IpKTsKKworCQkJCW1hdGNoID0gdmVjdG9yOF9vcihtYXRj aCwgdmVjdG9yOF9lcShjaHVuaywgcXVvdGUpKTsKKwkJCQlpZiAoZXNjYXBlYyAhPSAnXDAnKQor CQkJCQltYXRjaCA9IHZlY3Rvcjhfb3IobWF0Y2gsIHZlY3RvcjhfZXEoY2h1bmssIGVzY2FwZSkp OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1hdGNoID0gdmVjdG9yOF9vcih2ZWN0b3I4X2Vx KGNodW5rLCBubCksIHZlY3RvcjhfZXEoY2h1bmssIGNyKSk7CisJCQkJbWF0Y2ggPSB2ZWN0b3I4 X29yKG1hdGNoLCB2ZWN0b3I4X2VxKGNodW5rLCBicykpOworCQkJfQorCisJCQkvKiBDaGVjayBp ZiB3ZSBmb3VuZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJCQltYXNrID0gdmVjdG9yOF9o aWdoYml0X21hc2sobWF0Y2gpOworCQkJaWYgKG1hc2sgIT0gMCkKKwkJCXsKKwkJCQkvKgorCQkJ CSAqIEZvdW5kIGEgc3BlY2lhbCBjaGFyYWN0ZXIuIEFkdmFuY2UgdXAgdG8gdGhhdCBwb2ludCBh bmQgbGV0CisJCQkJICogdGhlIHNjYWxhciBjb2RlIGhhbmRsZSBpdC4KKwkJCQkgKi8KKwkJCQlp bnQJCQlhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29uZV9wb3MzMihtYXNrKTsKKwkJCQljaGFyCQlj MSwKKwkJCQkJCQljMjsKKwkJCQlib29sCQlzaW1kX2hpdF9lb2wsCisJCQkJCQkJc2ltZF9oaXRf ZW9mOworCisJCQkJaW5wdXRfYnVmX3B0ciArPSBhZHZhbmNlOworCQkJCWMxID0gY29weV9pbnB1 dF9idWZbaW5wdXRfYnVmX3B0cl07CisKKwkJCQkvKgorCQkJCSAqIFNpbmNlIHdlIHN0b3BwZWQg d2l0aGluIHRoZSBjaHVuayBhbmQgKChjb3B5X2J1Zl9sZW4gLQorCQkJCSAqIGlucHV0X2J1Zl9w dHIpID4gc2l6ZW9mKFZlY3RvcjgpKSBpcyB0cnVlLAorCQkJCSAqIGNvcHlfaW5wdXRfYnVmW2lu cHV0X2J1Zl9wdHIgKyAxXSBpcyBndWFyYW50ZWVkIHRvIGJlCisJCQkJICogcmVhZGFibGUuCisJ CQkJICovCisJCQkJYzIgPSBjb3B5X2lucHV0X2J1ZltpbnB1dF9idWZfcHRyICsgMV07CisJCQkJ c2ltZF9oaXRfZW9sID0gKGMxID09ICdccicgfHwgYzEgPT0gJ1xuJykgJiYgKCFpc19jc3YgfHwg IWluX3F1b3RlKTsKKwkJCQlzaW1kX2hpdF9lb2YgPSBjMSA9PSAnXFwnICYmIGMyID09ICcuJyAm JiAhaXNfY3N2OworCisJCQkJLyoKKwkJCQkgKiBEbyBub3QgZGlzYWJsZSBTSU1EIHdoZW4gd2Ug aGl0IEVPTCBvciBFT0YgY2hhcmFjdGVycy4gSW4KKwkJCQkgKiBwcmFjdGljZSwgaXQgZG9lcyBu b3QgbWF0dGVyIGZvciBFT0YgYmVjYXVzZSBwYXJzaW5nIGVuZHMKKwkJCQkgKiB0aGVyZSwgYnV0 IHdlIGtlZXAgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnQuCisJCQkJICovCisJCQkJaWYgKCEoc2lt ZF9oaXRfZW9mIHx8IHNpbWRfaGl0X2VvbCkpCisJCQkJeworCQkJCQlzaW1kX2VuYWJsZWQgPSBm YWxzZTsKKwkJCQkJY3N0YXRlLT5zaW1kX2VuYWJsZWQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJ CQllbHNlCisJCQl7CisJCQkJLyogTm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lw IHRoZSBlbnRpcmUgY2h1bmsgKi8KKwkJCQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4 KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmCisKIAkJLyogT0sgdG8gZmV0Y2gg YSBjaGFyYWN0ZXIgKi8KIAkJcHJldl9yYXdfcHRyID0gaW5wdXRfYnVmX3B0cjsKIAkJYyA9IGNv cHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIrK107CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9j b21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weWZy b21faW50ZXJuYWwuaAppbmRleCA4MjJlZjMzY2Y2OS4uNzNjZTc3N2M1MmIgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9tX2ludGVybmFsLmgKKysrIGIvc3JjL2luY2x1 ZGUvY29tbWFuZHMvY29weWZyb21faW50ZXJuYWwuaApAQCAtODksNiArODksOSBAQCB0eXBlZGVm IHN0cnVjdCBDb3B5RnJvbVN0YXRlRGF0YQogCWNvbnN0IGNoYXIgKmN1cl9hdHR2YWw7CQkvKiBj dXJyZW50IGF0dCB2YWx1ZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KIAlib29sCQlyZWxuYW1lX29u bHk7CS8qIGRvbid0IG91dHB1dCBsaW5lIG51bWJlciwgYXR0LCBldGMuICovCiAKKwkvKiBTSU1E IHZhcmlhYmxlcyAqLworCWJvb2wJCXNpbWRfZW5hYmxlZDsKKwogCS8qCiAJICogV29ya2luZyBz dGF0ZQogCSAqLwotLSAKMi40Ny4zCgo= --00000000000023c897064ab325f5 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0002-Use-4-vectors-in-CopyReadLineText-SIMD.patch" Content-Disposition: attachment; filename="v7-0002-Use-4-vectors-in-CopyReadLineText-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlktlrs41 RnJvbSAyZGU5YjViYzE4YmZhMTY5YjNiYTM1MDdiNmJkZjc5ZDI3N2MwYWQ0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBGcmksIDEzIEZlYiAyMDI2IDEzOjM2OjM0ICswMzAwClN1YmplY3Q6IFtQQVRDSCB2 NyAyLzJdIFVzZSA0IHZlY3RvcnMgaW4gQ29weVJlYWRMaW5lVGV4dCgpIFNJTUQKCi0tLQogc3Jj L2JhY2tlbmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jIHwgMTE2ICsrKysrKysrKysrKysrKysr KysrKy0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDkyIGluc2VydGlvbnMoKyksIDI0IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYwppbmRleCA0YTEyN2QxYWY5MC4u Y2FhZGM0MGNjOGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFy c2UuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKQEAgLTEzNjEs NiArMTM2MSw5IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wg aXNfY3N2LCBib29sIHNpbWRfZW5hYmxlZCkKIAkJICogZXNjYXBlKS4gVGhpcyBpcyBmYXN0ZXIg dGhhbiBieXRlLWJ5LWJ5dGUgaXRlcmF0aW9uLCBlc3BlY2lhbGx5IG9uCiAJCSAqIGxhcmdlIGJ1 ZmZlcnMuCiAJCSAqCisJCSAqIEZvciBiZXR0ZXIgaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxp c20sIHdlIHRyeSB0byBwcm9jZXNzIGZvdXIKKwkJICogdmVjdG9ycyBhdCBhIHRpbWUuCisJCSAq CiAJCSAqIFdlIGRvIG5vdCBhcHBseSB0aGUgU0lNRCBmYXN0IHBhdGggaW4gZWl0aGVyIG9mIHRo ZSBmb2xsb3dpbmcKIAkJICogY2FzZXM6IC0gV2hlbiB0aGUgcHJldmlvdXNseSBwcm9jZXNzZWQg Y2hhcmFjdGVyIHdhcyBhbiBlc2NhcGUKIAkJICogY2hhcmFjdGVyIChsYXN0X3dhc19lc2MpLCBz aW5jZSB0aGUgbmV4dCBieXRlIG11c3QgYmUgZXhhbWluZWQKQEAgLTEzNzMsNTMgKzEzNzYsMTE4 IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2LCBi b29sIHNpbWRfZW5hYmxlZCkKIAkJICogdGhlIHJlc3Qgb2YgdGhlIGlucHV0IG9uY2Ugd2UgZW5j b3VudGVyIGEgc3BlY2lhbCBjaGFyYWN0ZXIgd2hpY2gKIAkJICogaXMgbmVpdGhlciBFT0Ygbm9y IEVPTC4KIAkJICovCi0JCWlmIChzaW1kX2VuYWJsZWQgJiYgIWxhc3Rfd2FzX2VzYyAmJiBjb3B5 X2J1Zl9sZW4gLSBpbnB1dF9idWZfcHRyID4gc2l6ZW9mKFZlY3RvcjgpKQorCQlpZiAoc2ltZF9l bmFibGVkICYmICFsYXN0X3dhc19lc2MgJiYgY29weV9idWZfbGVuIC0gaW5wdXRfYnVmX3B0ciA+ PSA0ICogc2l6ZW9mKFZlY3RvcjgpKQogCQl7Ci0JCQlWZWN0b3I4CQljaHVuazsKLQkJCVZlY3Rv cjgJCW1hdGNoID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7Ci0JCQl1aW50MzIJCW1hc2s7Ci0KLQkJ CS8qIExvYWQgYSBjaHVuayBvZiBkYXRhIGludG8gYSB2ZWN0b3IgcmVnaXN0ZXIgKi8KLQkJCXZl Y3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1aW50OCAqKSAmY29weV9pbnB1dF9idWZbaW5wdXRf YnVmX3B0cl0pOworCQkJVmVjdG9yOAkJY2h1bmsxLAorCQkJCQkJY2h1bmsyLAorCQkJCQkJY2h1 bmszLAorCQkJCQkJY2h1bms0OworCQkJVmVjdG9yOAkJbWF0Y2gxLAorCQkJCQkJbWF0Y2gyLAor CQkJCQkJbWF0Y2gzLAorCQkJCQkJbWF0Y2g0OworCQkJVmVjdG9yOAkJdG1wMSwKKwkJCQkJCXRt cDIsCisJCQkJCQlyZXN1bHQ7CisKKwkJCS8qIExvYWQgZm91ciBjaHVua3Mgb2YgZGF0YSBpbnRv IHZlY3RvciByZWdpc3RlcnMgKi8KKwkJCXZlY3RvcjhfbG9hZCgmY2h1bmsxLCAoY29uc3QgdWlu dDggKikgJmNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHJdKTsKKwkJCXZlY3RvcjhfbG9hZCgm Y2h1bmsyLCAoY29uc3QgdWludDggKikgJmNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIgKyBz aXplb2YoVmVjdG9yOCldKTsKKwkJCXZlY3RvcjhfbG9hZCgmY2h1bmszLCAoY29uc3QgdWludDgg KikgJmNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIgKyAyICogc2l6ZW9mKFZlY3RvcjgpXSk7 CisJCQl2ZWN0b3I4X2xvYWQoJmNodW5rNCwgKGNvbnN0IHVpbnQ4ICopICZjb3B5X2lucHV0X2J1 ZltpbnB1dF9idWZfcHRyICsgMyAqIHNpemVvZihWZWN0b3I4KV0pOwogCiAJCQlpZiAoaXNfY3N2 KQogCQkJewogCQkJCS8qIFxuIGFuZCBcciBhcmUgbm90IHNwZWNpYWwgaW5zaWRlIHF1b3RlcyAq LwogCQkJCWlmICghaW5fcXVvdGUpCi0JCQkJCW1hdGNoID0gdmVjdG9yOF9vcih2ZWN0b3I4X2Vx KGNodW5rLCBubCksIHZlY3RvcjhfZXEoY2h1bmssIGNyKSk7CisJCQkJeworCQkJCQltYXRjaDEg PSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmsxLCBubCksIHZlY3RvcjhfZXEoY2h1bmsxLCBj cikpOworCQkJCQltYXRjaDIgPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmsyLCBubCksIHZl Y3RvcjhfZXEoY2h1bmsyLCBjcikpOworCQkJCQltYXRjaDMgPSB2ZWN0b3I4X29yKHZlY3Rvcjhf ZXEoY2h1bmszLCBubCksIHZlY3RvcjhfZXEoY2h1bmszLCBjcikpOworCQkJCQltYXRjaDQgPSB2 ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bms0LCBubCksIHZlY3RvcjhfZXEoY2h1bms0LCBjcikp OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltYXRjaDEgPSB2ZWN0b3I4X2Jyb2FkY2Fz dCgwKTsKKwkJCQkJbWF0Y2gyID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisJCQkJCW1hdGNoMyA9 IHZlY3RvcjhfYnJvYWRjYXN0KDApOworCQkJCQltYXRjaDQgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgw KTsKKwkJCQl9CiAKLQkJCQltYXRjaCA9IHZlY3Rvcjhfb3IobWF0Y2gsIHZlY3RvcjhfZXEoY2h1 bmssIHF1b3RlKSk7CisJCQkJbWF0Y2gxID0gdmVjdG9yOF9vcihtYXRjaDEsIHZlY3RvcjhfZXEo Y2h1bmsxLCBxdW90ZSkpOworCQkJCW1hdGNoMiA9IHZlY3Rvcjhfb3IobWF0Y2gyLCB2ZWN0b3I4 X2VxKGNodW5rMiwgcXVvdGUpKTsKKwkJCQltYXRjaDMgPSB2ZWN0b3I4X29yKG1hdGNoMywgdmVj dG9yOF9lcShjaHVuazMsIHF1b3RlKSk7CisJCQkJbWF0Y2g0ID0gdmVjdG9yOF9vcihtYXRjaDQs IHZlY3RvcjhfZXEoY2h1bms0LCBxdW90ZSkpOwogCQkJCWlmIChlc2NhcGVjICE9ICdcMCcpCi0J CQkJCW1hdGNoID0gdmVjdG9yOF9vcihtYXRjaCwgdmVjdG9yOF9lcShjaHVuaywgZXNjYXBlKSk7 CisJCQkJeworCQkJCQltYXRjaDEgPSB2ZWN0b3I4X29yKG1hdGNoMSwgdmVjdG9yOF9lcShjaHVu azEsIGVzY2FwZSkpOworCQkJCQltYXRjaDIgPSB2ZWN0b3I4X29yKG1hdGNoMiwgdmVjdG9yOF9l cShjaHVuazIsIGVzY2FwZSkpOworCQkJCQltYXRjaDMgPSB2ZWN0b3I4X29yKG1hdGNoMywgdmVj dG9yOF9lcShjaHVuazMsIGVzY2FwZSkpOworCQkJCQltYXRjaDQgPSB2ZWN0b3I4X29yKG1hdGNo NCwgdmVjdG9yOF9lcShjaHVuazQsIGVzY2FwZSkpOworCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJ CXsKLQkJCQltYXRjaCA9IHZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgbmwpLCB2ZWN0b3I4 X2VxKGNodW5rLCBjcikpOwotCQkJCW1hdGNoID0gdmVjdG9yOF9vcihtYXRjaCwgdmVjdG9yOF9l cShjaHVuaywgYnMpKTsKKwkJCQltYXRjaDEgPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmsx LCBubCksIHZlY3RvcjhfZXEoY2h1bmsxLCBjcikpOworCQkJCW1hdGNoMiA9IHZlY3Rvcjhfb3Io dmVjdG9yOF9lcShjaHVuazIsIG5sKSwgdmVjdG9yOF9lcShjaHVuazIsIGNyKSk7CisJCQkJbWF0 Y2gzID0gdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rMywgbmwpLCB2ZWN0b3I4X2VxKGNodW5r MywgY3IpKTsKKwkJCQltYXRjaDQgPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bms0LCBubCks IHZlY3RvcjhfZXEoY2h1bms0LCBjcikpOworCisJCQkJbWF0Y2gxID0gdmVjdG9yOF9vcihtYXRj aDEsIHZlY3RvcjhfZXEoY2h1bmsxLCBicykpOworCQkJCW1hdGNoMiA9IHZlY3Rvcjhfb3IobWF0 Y2gyLCB2ZWN0b3I4X2VxKGNodW5rMiwgYnMpKTsKKwkJCQltYXRjaDMgPSB2ZWN0b3I4X29yKG1h dGNoMywgdmVjdG9yOF9lcShjaHVuazMsIGJzKSk7CisJCQkJbWF0Y2g0ID0gdmVjdG9yOF9vciht YXRjaDQsIHZlY3RvcjhfZXEoY2h1bms0LCBicykpOwogCQkJfQogCi0JCQkvKiBDaGVjayBpZiB3 ZSBmb3VuZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzICovCi0JCQltYXNrID0gdmVjdG9yOF9oaWdo Yml0X21hc2sobWF0Y2gpOwotCQkJaWYgKG1hc2sgIT0gMCkKKwkJCS8qIENvbWJpbmUgcmVzdWx0 cyB0byBjaGVjayBpZiBhbnkgY2h1bmsgaGFzIHNwZWNpYWwgY2hhcmFjdGVycyAqLworCQkJdG1w MSA9IHZlY3Rvcjhfb3IobWF0Y2gxLCBtYXRjaDIpOworCQkJdG1wMiA9IHZlY3Rvcjhfb3IobWF0 Y2gzLCBtYXRjaDQpOworCQkJcmVzdWx0ID0gdmVjdG9yOF9vcih0bXAxLCB0bXAyKTsKKworCQkJ aWYgKHZlY3RvcjhfaXNfaGlnaGJpdF9zZXQocmVzdWx0KSkKIAkJCXsKIAkJCQkvKgotCQkJCSAq IEZvdW5kIGEgc3BlY2lhbCBjaGFyYWN0ZXIuIEFkdmFuY2UgdXAgdG8gdGhhdCBwb2ludCBhbmQg bGV0Ci0JCQkJICogdGhlIHNjYWxhciBjb2RlIGhhbmRsZSBpdC4KKwkJCQkgKiBGb3VuZCBhIHNw ZWNpYWwgY2hhcmFjdGVyIHNvbWV3aGVyZSBpbiB0aGUgZm91ciBjaHVua3MuCisJCQkJICogSWRl bnRpZnkgdGhlIGZpcnN0IGNodW5rIGNvbnRhaW5pbmcgaXQuCiAJCQkJICovCi0JCQkJaW50CQkJ YWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFzayk7CisJCQkJdWludDMyCQltYXNr OworCQkJCWludAkJCWFkdmFuY2U7CiAJCQkJY2hhcgkJYzEsCiAJCQkJCQkJYzI7CiAJCQkJYm9v bAkJc2ltZF9oaXRfZW9sLAogCQkJCQkJCXNpbWRfaGl0X2VvZjsKIAorCQkJCW1hc2sgPSB2ZWN0 b3I4X2hpZ2hiaXRfbWFzayhtYXRjaDEpOworCQkJCWlmIChtYXNrID09IDApCisJCQkJeworCQkJ CQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJbWFzayA9IHZlY3Rvcjhf aGlnaGJpdF9tYXNrKG1hdGNoMik7CisJCQkJfQorCQkJCWlmIChtYXNrID09IDApCisJCQkJewor CQkJCQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJbWFzayA9IHZlY3Rv cjhfaGlnaGJpdF9tYXNrKG1hdGNoMyk7CisJCQkJfQorCQkJCWlmIChtYXNrID09IDApCisJCQkJ eworCQkJCQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJbWFzayA9IHZl Y3RvcjhfaGlnaGJpdF9tYXNrKG1hdGNoNCk7CisJCQkJfQorCQkJCUFzc2VydChtYXNrICE9IDAp OworCisJCQkJLyoKKwkJCQkgKiBGb3VuZCBhIHNwZWNpYWwgY2hhcmFjdGVyLiBBZHZhbmNlIHVw IHRvIHRoYXQgcG9pbnQgYW5kIGxldAorCQkJCSAqIHRoZSBzY2FsYXIgY29kZSBoYW5kbGUgaXQu CisJCQkJICovCisJCQkJYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFzayk7CiAJ CQkJaW5wdXRfYnVmX3B0ciArPSBhZHZhbmNlOwogCQkJCWMxID0gY29weV9pbnB1dF9idWZbaW5w dXRfYnVmX3B0cl07CiAKIAkJCQkvKgotCQkJCSAqIFNpbmNlIHdlIHN0b3BwZWQgd2l0aGluIHRo ZSBjaHVuayBhbmQgKChjb3B5X2J1Zl9sZW4gLQotCQkJCSAqIGlucHV0X2J1Zl9wdHIpID4gc2l6 ZW9mKFZlY3RvcjgpKSBpcyB0cnVlLAotCQkJCSAqIGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9w dHIgKyAxXSBpcyBndWFyYW50ZWVkIHRvIGJlCi0JCQkJICogcmVhZGFibGUuCisJCQkJICogU2lu Y2Ugd2Ugc3RvcHBlZCB3aXRoaW4gdGhlIGJsb2NrIGFuZCAoKGNvcHlfYnVmX2xlbiAtCisJCQkJ ICogaW5wdXRfYnVmX3B0cikgPj0gNCAqIHNpemVvZihWZWN0b3I4KSkgd2FzIHRydWUgYXQgdGhl CisJCQkJICogc3RhcnQsIGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIgKyAxXSBpcyBndWFy YW50ZWVkIHRvCisJCQkJICogYmUgcmVhZGFibGUuCiAJCQkJICovCiAJCQkJYzIgPSBjb3B5X2lu cHV0X2J1ZltpbnB1dF9idWZfcHRyICsgMV07CiAJCQkJc2ltZF9oaXRfZW9sID0gKGMxID09ICdc cicgfHwgYzEgPT0gJ1xuJykgJiYgKCFpc19jc3YgfHwgIWluX3F1b3RlKTsKQEAgLTE0MzgsOCAr MTUwNiw4IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNf Y3N2LCBib29sIHNpbWRfZW5hYmxlZCkKIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQkvKiBObyBz cGVjaWFsIGNoYXJhY3RlcnMgZm91bmQsIHNvIHNraXAgdGhlIGVudGlyZSBjaHVuayAqLwotCQkJ CWlucHV0X2J1Zl9wdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCS8qIE5vIHNwZWNpYWwgY2hh cmFjdGVycyBmb3VuZCwgc28gc2tpcCB0aGUgZW50aXJlIGJsb2NrICovCisJCQkJaW5wdXRfYnVm X3B0ciArPSA0ICogc2l6ZW9mKFZlY3RvcjgpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9Ci0t IAoyLjQ3LjMKCg== --00000000000023c897064ab325f5--