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 1vSxxG-00AFVJ-1w for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Dec 2025 13:40:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vSxxF-004nAd-0h for pgsql-hackers@arkaria.postgresql.org; Tue, 09 Dec 2025 13:40:37 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vSxxE-004nAV-2B for pgsql-hackers@lists.postgresql.org; Tue, 09 Dec 2025 13:40:37 +0000 Received: from mail-pg1-x529.google.com ([2607:f8b0:4864:20::529]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vSxxC-003w7d-0j for pgsql-hackers@postgresql.org; Tue, 09 Dec 2025 13:40:36 +0000 Received: by mail-pg1-x529.google.com with SMTP id 41be03b00d2f7-bfe88eeaa65so2007722a12.1 for ; Tue, 09 Dec 2025 05:40:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765287633; x=1765892433; 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=pPedVtz4N28DS1g53TdQVv0fx1iuCQTb/6bOwZg9F80=; b=AUl3kZORNQk5zUsc4iBgS03pjJTgEx5cyEsYU7fYgNe/ageV5NTlCDdo9GezCEkEST FGfgtBmqxgE6AV8TO5+68xlZ7A4lkjddUuLeJhQZSd+zH01V8caGbxVb9sNdD0nZ7kY0 RANcRTvou0wbeNpab1soQSR6rbO/6O2I5t+Dc5Ad8HOXk1VdNX+EMwvgjbxEkR9f4qZQ SD66jL19jHkI5tXThQ5D8rE/wHpvfV9YTB/ranIxXGndDvZfA/aS3czkyYvFNEUiMqV1 XZfitKrArFu3eB7aYy3JM97I6w1IlEnLdjGuDDsc0RpfCVrID/OHNt4LmAwBRJFthwvz rqow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765287633; x=1765892433; 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=pPedVtz4N28DS1g53TdQVv0fx1iuCQTb/6bOwZg9F80=; b=UgHrj/4Dy8qxP1LYedz+8cNhWqPdou8Dx0GswE9LSYYWpZAgv1uF24UM1CHGz1GVUL Pv38EPGYYdEa5w8UgMOXv5lyolWPQL8tPyTYvS/Dcgx8xeyJKwPzAR5YcfonCocDMP58 PSy/PoHjc4I79RrMd330HXjEliAgC6u08/m+Yo8vPbMJ+0cLHTaxeUB85ZeBQ+K8wDGu FqEPRwCaDqsh0K3UFqpNhA5Alu4zsk7o7YRlTk16Gx4BIG803+8pn8PtElk9Dea+vg33 /UrnLX//eBQogJDqgf7YKq4+OeSlVV1ZcIlhBdjmB3cgUHpqWkSxATBS3DDs3W3uoBW0 JHcA== X-Forwarded-Encrypted: i=1; AJvYcCW4nYjmDfG4fND52YIs0FkSvNAqgrSYoXXnG0KCNICTpZIYDFZRBTEhaZ2ERpMJPUgmz/7iLjA9UxD2a8i/@postgresql.org X-Gm-Message-State: AOJu0Yx5c1/ppIVUWbS76SD19+YEgrNG87ca7e4qtdhOzk77vUgMrTzf FxM5fsfQGKbaMTQEEfldHeBx1Og64kNkP7H24EBR48hB6ASpP1R+KT/TfI/ueGLXQfISse6EB/F 9a9wYCpavICNW65T17sf1l1hNWyJB858= X-Gm-Gg: AY/fxX7BL61GWBk0BOWHLSDpadBe2KsnfpYu3CS63uAhZXft3nUq7Fv/Uz+oDe4plGU 6u2c4NBtF2jeHOuB/ax8/Br48KAUfVlOIckJ53I7V4TrBagoKMAfBl9pGBO0iRPFOYP4si3oy7J hhhB4wPBTAsAyVKPHilFutJdjQUZN4+LaSfNCrJquKGAExYOPcAUdQeyChHueB4P6Tx56G8sifj cSDDBzDxJN5/iZgtWmM5bQmAb3NA13Ol0JYXZnsw2prdubVPcuGKLToqSWWDReh0NDWR2zss87K j40v X-Google-Smtp-Source: AGHT+IEGZR6WPHKU2DroB5d6nitkQW1YCx/MZbouwXxD6jl7HIcUgjfbpMFRHiiWmWMX/X6vsZUgxiHEgKrp+PtY6oQ= X-Received: by 2002:a05:7300:182a:b0:2a4:3594:72e8 with SMTP id 5a478bee46e88-2abc71db512mr6316159eec.23.1765287633153; Tue, 09 Dec 2025 05:40:33 -0800 (PST) MIME-Version: 1.0 References: <5d81fbbb-7609-4445-9bc4-8af211fb7674@dunslane.net> <8e226753-57af-489a-bfbe-caa23dd71286@dunslane.net> In-Reply-To: From: Bilal Yavuz Date: Tue, 9 Dec 2025 16:40:19 +0300 X-Gm-Features: AQt7F2o7n0I_26cpAnGYN8UfOo4cs_0I6BdIuKb_s9GpVigj8XZFAuE2kCKRNI0 Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Manni Wood Cc: KAZAR Ayoub , Nathan Bossart , Andrew Dunstan , Shinya Kato , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000004d87930645850ede" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000004d87930645850ede Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Sat, 6 Dec 2025 at 10:55, Bilal Yavuz wrote: > > Hi, > > On Sat, 6 Dec 2025 at 04:40, Manni Wood wro= te: > > Hello, all. > > > > Andrew, I tried your suggestion of just reading the first chunk of the = copy file to determine if SIMD is worth using. Attached are v4 versions of = the patches showing a first attempt at doing that. > > Thank you for doing this! > > > I attached test.sh.txt to show how I've been testing, with 5 million li= nes of the various copy file variations introduced by Ayub Kazar. > > > > The text copy with no special chars is 30% faster. The CSV copy with no= special chars is 48% faster. The text with 1/3rd escapes is 3% slower. The= CSV with 1/3rd quotes is 0.27% slower. > > > > This set of patches follows the simplest suggestion of just testing the= first N lines (actually first N bytes) of the file and then deciding wheth= er or not to enable SIMD. This set of patches does not follow Andrew's late= r suggestion of maybe checking again every million lines or so. > > My input-generation script is not ready to share yet, but the inputs > follow this format: text_${n}.input, where n represents the number of > normal characters before the delimiter. For example: > > n =3D 0 -> "\n\n\n\n\n..." (no normal characters) > n =3D 1 -> "a\n..." (1 normal character before the delimiter) > ... > n =3D 5 -> "aaaaa\n..." > =E2=80=A6 continuing up to n =3D 32. > > Each line has 4096 chars and there are a total of 100000 lines in each > input file. > > I only benchmarked the text format. I compared the latest heuristic I > shared [1] with the current method. The benchmarks show roughly a ~16% > regression at the worst case (n =3D 2), with regressions up to n =3D 5. > For the remaining values, performance was similar. I tried to improve the v4 patchset. My changes are: 1 - I changed CopyReadLineText() to an inline function and sent the use_simd variable as an argument to get help from inlining. 2 - A main for loop in the CopyReadLineText() function is called many times, so I moved the use_simd check to the CopyReadLine() function. 3 - Instead of 'bytes_processed', I used 'chars_processed' because cstate->bytes_processed is increased before we process them and this can cause wrong results. 4 - Because of #2 and #3, instead of having 'SPECIAL_CHAR_SIMD_THRESHOLD', I used the ratio of 'chars_processed / special_chars_encountered' to determine whether we want to use SIMD. 5 - cstate->special_chars_encountered is incremented wrongly for the CSV case. It is not incremented for the quote and escape delimiters. I moved all increments of cstate->special_chars_encountered to the central place and tried to optimize it but it still causes a regression as it creates one more branching. With these changes, I am able to decrease the regression to %10 from %16. Regression decreases to %7 if I modify #5 for the only text input but I did not do that. My changes are in the 0003. --=20 Regards, Nazir Bilal Yavuz Microsoft --0000000000004d87930645850ede Content-Type: text/x-patch; charset="US-ASCII"; name="v4.1-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Disposition: attachment; filename="v4.1-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_miymkxq70 RnJvbSBhMWI0ZDI4MDY5Nzg2YzNmYjUwNmM3OWUwOTYzMTJmY2ZkNTg1ZmRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTaGlueWEgS2F0byA8c2hpbnlhMTEua2F0b0BnbWFpbC5jb20+ CkRhdGU6IE1vbiwgMjggSnVsIDIwMjUgMjI6MDg6MjAgKzA5MDAKU3ViamVjdDogW1BBVENIIHY0 LjEgMS8zXSBTcGVlZCB1cCBDT1BZIEZST00gdGV4dC9DU1YgcGFyc2luZyB1c2luZyBTSU1ECgot LS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYyB8IDc2ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA3NiBpbnNlcnRpb25zKCspCgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jIGIvc3JjL2JhY2tl bmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jCmluZGV4IDYyYWZjZDhmYWQxLi5jZjExMDc2NzU0 MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jCisrKyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYwpAQCAtNzEsNyArNzEsOSBAQAog I2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVk ZSAicGdzdGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgogI2luY2x1ZGUgInBv cnQvcGdfYnN3YXAuaCIKKyNpbmNsdWRlICJwb3J0L3NpbWQuaCIKICNpbmNsdWRlICJ1dGlscy9i dWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogCkBAIC0xMjU1LDYgKzEyNTcsMTQg QEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJ Y2hhcgkJcXVvdGVjID0gJ1wwJzsKIAljaGFyCQllc2NhcGVjID0gJ1wwJzsKIAorI2lmbmRlZiBV U0VfTk9fU0lNRAorCVZlY3RvcjgJCW5sID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJVmVj dG9yOAkJY3IgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKwlWZWN0b3I4CQlicyA9IHZlY3Rv cjhfYnJvYWRjYXN0KCdcXCcpOworCVZlY3RvcjgJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNhc3Qo MCk7CisJVmVjdG9yOAkJZXNjYXBlID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisjZW5kaWYKKwog CWlmIChpc19jc3YpCiAJewogCQlxdW90ZWMgPSBjc3RhdGUtPm9wdHMucXVvdGVbMF07CkBAIC0x MjYyLDYgKzEyNzIsMTIgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwg Ym9vbCBpc19jc3YpCiAJCS8qIGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNzaW5nIGlmIGl0 J3MgdGhlIHNhbWUgYXMgcXVvdGVjICovCiAJCWlmIChxdW90ZWMgPT0gZXNjYXBlYykKIAkJCWVz Y2FwZWMgPSAnXDAnOworCisjaWZuZGVmIFVTRV9OT19TSU1ECisJCXF1b3RlID0gdmVjdG9yOF9i cm9hZGNhc3QocXVvdGVjKTsKKwkJaWYgKHF1b3RlYyAhPSBlc2NhcGVjKQorCQkJZXNjYXBlID0g dmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisjZW5kaWYKIAl9CiAKIAkvKgpAQCAtMTMyOCw2 ICsxMzQ0LDY2IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wg aXNfY3N2KQogCQkJbmVlZF9kYXRhID0gZmFsc2U7CiAJCX0KIAorI2lmbmRlZiBVU0VfTk9fU0lN RAorCisJCS8qCisJCSAqIFVzZSBTSU1EIGluc3RydWN0aW9ucyB0byBlZmZpY2llbnRseSBzY2Fu IHRoZSBpbnB1dCBidWZmZXIgZm9yCisJCSAqIHNwZWNpYWwgY2hhcmFjdGVycyAoZS5nLiwgbmV3 bGluZSwgY2FycmlhZ2UgcmV0dXJuLCBxdW90ZSwgYW5kCisJCSAqIGVzY2FwZSkuIFRoaXMgaXMg ZmFzdGVyIHRoYW4gYnl0ZS1ieS1ieXRlIGl0ZXJhdGlvbiwgZXNwZWNpYWxseSBvbgorCQkgKiBs YXJnZSBidWZmZXJzLgorCQkgKgorCQkgKiBXZSBkbyBub3QgYXBwbHkgdGhlIFNJTUQgZmFzdCBw YXRoIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCisJCSAqIGNhc2VzOiAtIFdoZW4gdGhlIHBy ZXZpb3VzbHkgcHJvY2Vzc2VkIGNoYXJhY3RlciB3YXMgYW4gZXNjYXBlCisJCSAqIGNoYXJhY3Rl ciAobGFzdF93YXNfZXNjKSwgc2luY2UgdGhlIG5leHQgYnl0ZSBtdXN0IGJlIGV4YW1pbmVkCisJ CSAqIHNlcXVlbnRpYWxseS4gLSBUaGUgcmVtYWluaW5nIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4g b25lIHZlY3RvcgorCQkgKiB3aWR0aCAoc2l6ZW9mKFZlY3RvcjgpKTsgU0lNRCBvcGVyYXRlcyBv biBmaXhlZC1zaXplIGNodW5rcy4KKwkJICovCisJCWlmICghbGFzdF93YXNfZXNjICYmIGNvcHlf YnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPj0gc2l6ZW9mKFZlY3RvcjgpKQorCQl7CisJCQlWZWN0 b3I4CQljaHVuazsKKwkJCVZlY3RvcjgJCW1hdGNoID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisJ CQl1aW50MzIJCW1hc2s7CisKKwkJCS8qIExvYWQgYSBjaHVuayBvZiBkYXRhIGludG8gYSB2ZWN0 b3IgcmVnaXN0ZXIgKi8KKwkJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1aW50OCAqKSAm Y29weV9pbnB1dF9idWZbaW5wdXRfYnVmX3B0cl0pOworCisJCQlpZiAoaXNfY3N2KQorCQkJewor CQkJCS8qIFxuIGFuZCBcciBhcmUgbm90IHNwZWNpYWwgaW5zaWRlIHF1b3RlcyAqLworCQkJCWlm ICghaW5fcXVvdGUpCisJCQkJCW1hdGNoID0gdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBu bCksIHZlY3RvcjhfZXEoY2h1bmssIGNyKSk7CisKKwkJCQltYXRjaCA9IHZlY3Rvcjhfb3IobWF0 Y2gsIHZlY3RvcjhfZXEoY2h1bmssIHF1b3RlKSk7CisJCQkJaWYgKGVzY2FwZWMgIT0gJ1wwJykK KwkJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0b3I4X2VxKGNodW5rLCBlc2NhcGUp KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltYXRjaCA9IHZlY3Rvcjhfb3IodmVjdG9yOF9l cShjaHVuaywgbmwpLCB2ZWN0b3I4X2VxKGNodW5rLCBjcikpOworCQkJCW1hdGNoID0gdmVjdG9y OF9vcihtYXRjaCwgdmVjdG9yOF9lcShjaHVuaywgYnMpKTsKKwkJCX0KKworCQkJLyogQ2hlY2sg aWYgd2UgZm91bmQgYW55IHNwZWNpYWwgY2hhcmFjdGVycyAqLworCQkJbWFzayA9IHZlY3Rvcjhf aGlnaGJpdF9tYXNrKG1hdGNoKTsKKwkJCWlmIChtYXNrICE9IDApCisJCQl7CisJCQkJLyoKKwkJ CQkgKiBGb3VuZCBhIHNwZWNpYWwgY2hhcmFjdGVyLiBBZHZhbmNlIHVwIHRvIHRoYXQgcG9pbnQg YW5kIGxldAorCQkJCSAqIHRoZSBzY2FsYXIgY29kZSBoYW5kbGUgaXQuCisJCQkJICovCisJCQkJ aW50CQkJYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFzayk7CisKKwkJCQlpbnB1 dF9idWZfcHRyICs9IGFkdmFuY2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogTm8gc3Bl Y2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBlbnRpcmUgY2h1bmsgKi8KKwkJCQlp bnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJ fQorI2VuZGlmCisKIAkJLyogT0sgdG8gZmV0Y2ggYSBjaGFyYWN0ZXIgKi8KIAkJcHJldl9yYXdf cHRyID0gaW5wdXRfYnVmX3B0cjsKIAkJYyA9IGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIr K107Ci0tIAoyLjUxLjAKCg== --0000000000004d87930645850ede Content-Type: text/x-patch; charset="US-ASCII"; name="v4.1-0002-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Disposition: attachment; filename="v4.1-0002-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_miymkz8t1 RnJvbSAzYTJmOWZmMjY3NTVhNTI0OGI3YTMzNzcwZjQ2MDNmZWM0ODNkM2JjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYW5uaSBXb29kIDxtYW5uaS53b29kQGVudGVycHJpc2VkYi5j b20+CkRhdGU6IEZyaSwgNSBEZWMgMjAyNSAxODozMzo0NiAtMDYwMApTdWJqZWN0OiBbUEFUQ0gg djQuMSAyLzNdIFNwZWVkIHVwIENPUFkgRlJPTSB0ZXh0L0NTViBwYXJzaW5nIHVzaW5nIFNJTUQK CkF1dGhvcnM6IFNoaW55YSBLYXRvIDxzaGlueWExMS5rYXRvQGdtYWlsLmNvbT4sCk5hemlyIEJp bGFsIFlhdnV6IDxieWF2dXo4MUBnbWFpbC5jb20+LApBeW91YiBLYXphciA8bWFfa2F6YXJAZXNp LmR6PgpSZXZpZXdlcnM6IEFuZHJldyBEdW5zdGFuIDxhbmRyZXdAZHVuc2xhbmUubmV0PgpEZXNj dXNzaW9uOgpodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL2ZsYXQvQ0FPekV1 clNXOGNOcjZUUEtzanJzdG5QZmhmNFF5UXFCNHRuUFhHR2U4TjRlX3Y3SmlnQG1haWwuZ21haWwu Y29tCi0tLQogc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weWZyb21faW50ZXJuYWwuaCB8IDExICsr KysrKysrKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYyAgICAgICAgICB8ICAzICsr Kwogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jICAgICB8IDI5ICsrKysrKysr KysrKysrKysrKysrKysrLQogMyBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCAxIGRl bGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weWZyb21faW50 ZXJuYWwuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9tX2ludGVybmFsLmgKaW5kZXgg YzhiMjJhZjIyZDguLjIxNTIxNWY5MDlmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5k cy9jb3B5ZnJvbV9pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9t X2ludGVybmFsLmgKQEAgLTE4MSw2ICsxODEsMTcgQEAgdHlwZWRlZiBzdHJ1Y3QgQ29weUZyb21T dGF0ZURhdGEKICNkZWZpbmUgUkFXX0JVRl9CWVRFUyhjc3RhdGUpICgoY3N0YXRlKS0+cmF3X2J1 Zl9sZW4gLSAoY3N0YXRlKS0+cmF3X2J1Zl9pbmRleCkKIAogCXVpbnQ2NAkJYnl0ZXNfcHJvY2Vz c2VkOwkvKiBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkIHNvIGZhciAqLworCisJLyogdGhlIGFt b3VudCBvZiBieXRlcyB0byByZWFkIHVudGlsIGNoZWNraW5nIGlmIHdlIHNob3VsZCB0cnkgc2lt ZCAqLworI2RlZmluZSBCWVRFU19QUk9DRVNTRURfVU5USUxfU0lNRF9DSEVDSyAxMDAwMDAKKwkv KiB0aGUgbnVtYmVyIG9mIHNwZWNpYWwgY2hhcnMgcmVhZCBiZWxvdyB3aGljaCB3ZSB1c2Ugc2lt ZCAqLworI2RlZmluZSBTUEVDSUFMX0NIQVJfU0lNRF9USFJFU0hPTEQgMjAwMDAKKwl1aW50NjQJ CXNwZWNpYWxfY2hhcnNfZW5jb3VudGVyZWQ7CS8qIG51bWJlciBvZiBzcGVjaWFsIGNoYXJzCisJ CQkJCQkJCQkJCSAqIGVuY291bnRlcmVkIHNvIGZhciAqLworCWJvb2wJCWNoZWNrZWRfc2ltZDsJ Lyogd2UgcmVhZCBCWVRFU19QUk9DRVNTRURfVU5USUxfU0lNRF9DSEVDSworCQkJCQkJCQkgKiBh bmQgY2hlY2tlZCBpZiB3ZSBzaG91bGQgdXNlIFNJTUQgb24gdGhlCisJCQkJCQkJCSAqIHJlc3Qg b2YgdGhlIGZpbGUgKi8KKwlib29sCQl1c2Vfc2ltZDsJCS8qIHVzZSBzaW1kIHRvIHNwZWVkIHVw IGNvcHlpbmcgKi8KIH0gQ29weUZyb21TdGF0ZURhdGE7CiAKIGV4dGVybiB2b2lkIFJlY2VpdmVD b3B5QmVnaW4oQ29weUZyb21TdGF0ZSBjc3RhdGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv Y29tbWFuZHMvY29weWZyb20uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKaW5k ZXggMTI3ODE5NjNiNGYuLmU2Mzg2MjNlNWI1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21t YW5kcy9jb3B5ZnJvbS5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKQEAg LTE3MjAsNiArMTcyMCw5IEBAIEJlZ2luQ29weUZyb20oUGFyc2VTdGF0ZSAqcHN0YXRlLAogCWNz dGF0ZS0+Y3VyX2F0dG5hbWUgPSBOVUxMOwogCWNzdGF0ZS0+Y3VyX2F0dHZhbCA9IE5VTEw7CiAJ Y3N0YXRlLT5yZWxuYW1lX29ubHkgPSBmYWxzZTsKKwljc3RhdGUtPnNwZWNpYWxfY2hhcnNfZW5j b3VudGVyZWQgPSAwOworCWNzdGF0ZS0+Y2hlY2tlZF9zaW1kID0gZmFsc2U7CisJY3N0YXRlLT51 c2Vfc2ltZCA9IGZhbHNlOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSBidWZmZXJzIGZvciB0aGUgaW5w dXQgcGlwZWxpbmUuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBh cnNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKaW5kZXggY2YxMTA3 Njc1NDIuLjU0OWI1NmMyMWZiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 ZnJvbXBhcnNlLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb21wYXJzZS5jCkBA IC0xMzQ2LDYgKzEzNDYsMjggQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0 ZSwgYm9vbCBpc19jc3YpCiAKICNpZm5kZWYgVVNFX05PX1NJTUQKIAorCQkvKgorCQkgKiBXYWl0 IHVudGlsIHdlIGhhdmUgcmVhZCBtb3JlIHRoYW4gQllURVNfUFJPQ0VTU0VEX1VOVElMX1NJTURf Q0hFQ0suCisJCSAqIGNzdGF0ZS0+Ynl0ZXNfcHJvY2Vzc2VkIHdpbGwgZ3JvdyBhbiB1bnByZWRp Y3RhYmxlIGFtb3VudCB3aXRoIGVhY2gKKwkJICogY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBzbyBq dXN0IHdhaXQgdW50aWwgd2UgaGF2ZSBjcm9zc2VkIHRoZQorCQkgKiB0aHJlc2hvbGQuCisJCSAq LworCQlpZiAoIWNzdGF0ZS0+Y2hlY2tlZF9zaW1kICYmIGNzdGF0ZS0+Ynl0ZXNfcHJvY2Vzc2Vk ID4gQllURVNfUFJPQ0VTU0VEX1VOVElMX1NJTURfQ0hFQ0spCisJCXsKKwkJCWNzdGF0ZS0+Y2hl Y2tlZF9zaW1kID0gdHJ1ZTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgbm90IHJlYWQgdG9v IG1hbnkgc3BlY2lhbCBjaGFyYWN0ZXJzCisJCQkgKiAoU1BFQ0lBTF9DSEFSX1NJTURfVEhSRVNI T0xEKSB0aGVuIHN0YXJ0IHVzaW5nIFNJTUQgdG8gc3BlZWQgdXAKKwkJCSAqIHByb2Nlc3Npbmcu IFRoaXMgaGV1cmlzdGljIGFzc3VtZXMgdGhhdCBpbnB1dCBkb2VzIG5vdCB2YXJ5IHRvbworCQkJ ICogbXVjaCBmcm9tIGxpbmUgdG8gbGluZSBhbmQgdGhhdCBudW1iZXIgb2Ygc3BlY2lhbCBjaGFy YWN0ZXJzCisJCQkgKiBlbmNvdW50ZXJlZCBpbiB0aGUgZmlyc3QgQllURVNfUFJPQ0VTU0VEX1VO VElMX1NJTURfQ0hFQ0sgYXJlCisJCQkgKiBpbmRpY2l0aXZlIG9mIHRoZSB3aG9sZSBmaWxlLgor CQkJICovCisJCQlpZiAoY3N0YXRlLT5zcGVjaWFsX2NoYXJzX2VuY291bnRlcmVkIDwgU1BFQ0lB TF9DSEFSX1NJTURfVEhSRVNIT0xEKQorCQkJCWNzdGF0ZS0+dXNlX3NpbWQgPSB0cnVlOworCQl9 CisKIAkJLyoKIAkJICogVXNlIFNJTUQgaW5zdHJ1Y3Rpb25zIHRvIGVmZmljaWVudGx5IHNjYW4g dGhlIGlucHV0IGJ1ZmZlciBmb3IKIAkJICogc3BlY2lhbCBjaGFyYWN0ZXJzIChlLmcuLCBuZXds aW5lLCBjYXJyaWFnZSByZXR1cm4sIHF1b3RlLCBhbmQKQEAgLTEzNTgsNyArMTM4MCw3IEBAIENv cHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCQkgKiBz ZXF1ZW50aWFsbHkuIC0gVGhlIHJlbWFpbmluZyBidWZmZXIgaXMgc21hbGxlciB0aGFuIG9uZSB2 ZWN0b3IKIAkJICogd2lkdGggKHNpemVvZihWZWN0b3I4KSk7IFNJTUQgb3BlcmF0ZXMgb24gZml4 ZWQtc2l6ZSBjaHVua3MuCiAJCSAqLwotCQlpZiAoIWxhc3Rfd2FzX2VzYyAmJiBjb3B5X2J1Zl9s ZW4gLSBpbnB1dF9idWZfcHRyID49IHNpemVvZihWZWN0b3I4KSkKKwkJaWYgKGNzdGF0ZS0+dXNl X3NpbWQgJiYgIWxhc3Rfd2FzX2VzYyAmJiBjb3B5X2J1Zl9sZW4gLSBpbnB1dF9idWZfcHRyID49 IHNpemVvZihWZWN0b3I4KSkKIAkJewogCQkJVmVjdG9yOAkJY2h1bms7CiAJCQlWZWN0b3I4CQlt YXRjaCA9IHZlY3RvcjhfYnJvYWRjYXN0KDApOwpAQCAtMTQxOCw2ICsxNDQwLDcgQEAgQ29weVJl YWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCQkgKi8KIAkJ CWlmIChjID09ICdccicpCiAJCQl7CisJCQkJY3N0YXRlLT5zcGVjaWFsX2NoYXJzX2VuY291bnRl cmVkKys7CiAJCQkJSUZfTkVFRF9SRUZJTExfQU5EX05PVF9FT0ZfQ09OVElOVUUoMCk7CiAJCQl9 CiAKQEAgLTE0NDksNiArMTQ3Miw3IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBj c3RhdGUsIGJvb2wgaXNfY3N2KQogCQkvKiBQcm9jZXNzIFxyICovCiAJCWlmIChjID09ICdccicg JiYgKCFpc19jc3YgfHwgIWluX3F1b3RlKSkKIAkJeworCQkJY3N0YXRlLT5zcGVjaWFsX2NoYXJz X2VuY291bnRlcmVkKys7CiAJCQkvKiBDaGVjayBmb3IgXHJcbiBvbiBmaXJzdCBsaW5lLCBfYW5k XyBoYW5kbGUgXHJcbi4gKi8KIAkJCWlmIChjc3RhdGUtPmVvbF90eXBlID09IEVPTF9VTktOT1dO IHx8CiAJCQkJY3N0YXRlLT5lb2xfdHlwZSA9PSBFT0xfQ1JOTCkKQEAgLTE1MDUsNiArMTUyOSw3 IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQog CQkvKiBQcm9jZXNzIFxuICovCiAJCWlmIChjID09ICdcbicgJiYgKCFpc19jc3YgfHwgIWluX3F1 b3RlKSkKIAkJeworCQkJY3N0YXRlLT5zcGVjaWFsX2NoYXJzX2VuY291bnRlcmVkKys7CiAJCQlp ZiAoY3N0YXRlLT5lb2xfdHlwZSA9PSBFT0xfQ1IgfHwgY3N0YXRlLT5lb2xfdHlwZSA9PSBFT0xf Q1JOTCkKIAkJCQllcmVwb3J0KEVSUk9SLAogCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09Q WV9GSUxFX0ZPUk1BVCksCkBAIC0xNTI3LDYgKzE1NTIsOCBAQCBDb3B5UmVhZExpbmVUZXh0KENv cHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikKIAkJewogCQkJY2hhcgkJYzI7CiAKKwkJ CWNzdGF0ZS0+c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCsrOworCiAJCQlJRl9ORUVEX1JFRklM TF9BTkRfTk9UX0VPRl9DT05USU5VRSgwKTsKIAkJCUlGX05FRURfUkVGSUxMX0FORF9FT0ZfQlJF QUsoMCk7CiAKLS0gCjIuNTEuMAoK --0000000000004d87930645850ede Content-Type: text/x-patch; charset="US-ASCII"; name="v4.1-0003-Feedback-Changes.patch" Content-Disposition: attachment; filename="v4.1-0003-Feedback-Changes.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_miyml13b2 RnJvbSA4ZDBlNjc2NjE3NWFiYWMxNWIzOTg4NDEyNmMyOWRhMDM2NTdiZTQwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBUdWUsIDkgRGVjIDIwMjUgMTU6MzI6MTAgKzAzMDAKU3ViamVjdDogW1BBVENIIHY0 LjEgMy8zXSBGZWVkYmFjayAvIENoYW5nZXMKCi0tLQogc3JjL2luY2x1ZGUvY29tbWFuZHMvY29w eWZyb21faW50ZXJuYWwuaCB8ICA5ICstLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20u YyAgICAgICAgICB8ICAxICsKIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYyAg ICAgfCA4OCArKysrKysrKysrKysrKystLS0tLS0tLS0KIDMgZmlsZXMgY2hhbmdlZCwgNjAgaW5z ZXJ0aW9ucygrKSwgMzggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29t bWFuZHMvY29weWZyb21faW50ZXJuYWwuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9t X2ludGVybmFsLmgKaW5kZXggMjE1MjE1ZjkwOWYuLjM5NzcyMGJmODc1IDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNsdWRl L2NvbW1hbmRzL2NvcHlmcm9tX2ludGVybmFsLmgKQEAgLTE4MywxMiArMTgzLDEzIEBAIHR5cGVk ZWYgc3RydWN0IENvcHlGcm9tU3RhdGVEYXRhCiAJdWludDY0CQlieXRlc19wcm9jZXNzZWQ7CS8q IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQgc28gZmFyICovCiAKIAkvKiB0aGUgYW1vdW50IG9m IGJ5dGVzIHRvIHJlYWQgdW50aWwgY2hlY2tpbmcgaWYgd2Ugc2hvdWxkIHRyeSBzaW1kICovCi0j ZGVmaW5lIEJZVEVTX1BST0NFU1NFRF9VTlRJTF9TSU1EX0NIRUNLIDEwMDAwMAotCS8qIHRoZSBu dW1iZXIgb2Ygc3BlY2lhbCBjaGFycyByZWFkIGJlbG93IHdoaWNoIHdlIHVzZSBzaW1kICovCi0j ZGVmaW5lIFNQRUNJQUxfQ0hBUl9TSU1EX1RIUkVTSE9MRCAyMDAwMAorI2RlZmluZSBDSEFSU19Q Uk9DRVNTRURfVU5USUxfU0lNRF9DSEVDSyAxMDAwMDAKKwkvKiB0aGUgcmF0aW8gb2Ygc3BlY2lh bCBjaGFycyByZWFkIGJlbG93IHdoaWNoIHdlIHVzZSBzaW1kICovCisjZGVmaW5lIFNQRUNJQUxf Q0hBUl9TSU1EX1JBVElPIDQKKwl1aW50NjQJCWNoYXJzX3Byb2Nlc3NlZDsKIAl1aW50NjQJCXNw ZWNpYWxfY2hhcnNfZW5jb3VudGVyZWQ7CS8qIG51bWJlciBvZiBzcGVjaWFsIGNoYXJzCiAJCQkJ CQkJCQkJCSAqIGVuY291bnRlcmVkIHNvIGZhciAqLwotCWJvb2wJCWNoZWNrZWRfc2ltZDsJLyog d2UgcmVhZCBCWVRFU19QUk9DRVNTRURfVU5USUxfU0lNRF9DSEVDSworCWJvb2wJCWNoZWNrZWRf c2ltZDsJLyogd2UgcmVhZCBDSEFSU19QUk9DRVNTRURfVU5USUxfU0lNRF9DSEVDSwogCQkJCQkJ CQkgKiBhbmQgY2hlY2tlZCBpZiB3ZSBzaG91bGQgdXNlIFNJTUQgb24gdGhlCiAJCQkJCQkJCSAq IHJlc3Qgb2YgdGhlIGZpbGUgKi8KIAlib29sCQl1c2Vfc2ltZDsJCS8qIHVzZSBzaW1kIHRvIHNw ZWVkIHVwIGNvcHlpbmcgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlm cm9tLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jCmluZGV4IGU2Mzg2MjNlNWI1 Li5kNDRkZDE2ZWNlZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20u YworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jCkBAIC0xNzIwLDYgKzE3MjAs NyBAQCBCZWdpbkNvcHlGcm9tKFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAljc3RhdGUtPmN1cl9hdHRu YW1lID0gTlVMTDsKIAljc3RhdGUtPmN1cl9hdHR2YWwgPSBOVUxMOwogCWNzdGF0ZS0+cmVsbmFt ZV9vbmx5ID0gZmFsc2U7CisJY3N0YXRlLT5jaGFyc19wcm9jZXNzZWQgPSAwOwogCWNzdGF0ZS0+ c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCA9IDA7CiAJY3N0YXRlLT5jaGVja2VkX3NpbWQgPSBm YWxzZTsKIAljc3RhdGUtPnVzZV9zaW1kID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJv bXBhcnNlLmMKaW5kZXggNTQ5YjU2YzIxZmIuLjg2YTI2OGQwZGY5IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFu ZHMvY29weWZyb21wYXJzZS5jCkBAIC0xNDMsNyArMTQzLDcgQEAgc3RhdGljIGNvbnN0IGNoYXIg QmluYXJ5U2lnbmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAiOwogCiAvKiBub24tZXhw b3J0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBib29sIENvcHlSZWFkTGluZShDb3B5 RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpOwotc3RhdGljIGJvb2wgQ29weVJlYWRMaW5l VGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpOworc3RhdGljIHBnX2F0dHJp YnV0ZV9hbHdheXNfaW5saW5lIGJvb2wgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNz dGF0ZSwgYm9vbCBpc19jc3YsIGJvb2wgdXNlX3NpbWQpOwogc3RhdGljIGludAlDb3B5UmVhZEF0 dHJpYnV0ZXNUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyBpbnQJQ29weVJlYWRB dHRyaWJ1dGVzQ1NWKENvcHlGcm9tU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyBEYXR1bSBDb3B5UmVh ZEJpbmFyeUF0dHJpYnV0ZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgRm1nckluZm8gKmZsaW5mbywK QEAgLTExNzMsOCArMTE3Myw0MCBAQCBDb3B5UmVhZExpbmUoQ29weUZyb21TdGF0ZSBjc3RhdGUs IGJvb2wgaXNfY3N2KQogCXJlc2V0U3RyaW5nSW5mbygmY3N0YXRlLT5saW5lX2J1Zik7CiAJY3N0 YXRlLT5saW5lX2J1Zl92YWxpZCA9IGZhbHNlOwogCi0JLyogUGFyc2UgZGF0YSBhbmQgdHJhbnNm ZXIgaW50byBsaW5lX2J1ZiAqLwotCXJlc3VsdCA9IENvcHlSZWFkTGluZVRleHQoY3N0YXRlLCBp c19jc3YpOworI2lmbmRlZiBVU0VfTk9fU0lNRAorCisJLyoKKwkgKiBXYWl0IHVudGlsIHdlIGhh dmUgcmVhZCBtb3JlIHRoYW4gQ0hBUlNfUFJPQ0VTU0VEX1VOVElMX1NJTURfQ0hFQ0suCisJICog Y3N0YXRlLT5ieXRlc19wcm9jZXNzZWQgd2lsbCBncm93IGFuIHVucHJlZGljdGFibGUgYW1vdW50 IHdpdGggZWFjaAorCSAqIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgc28ganVzdCB3YWl0IHVudGls IHdlIGhhdmUgY3Jvc3NlZCB0aGUKKwkgKiB0aHJlc2hvbGQuCisJICovCisJaWYgKCFjc3RhdGUt PmNoZWNrZWRfc2ltZCAmJiBjc3RhdGUtPmNoYXJzX3Byb2Nlc3NlZCA+IENIQVJTX1BST0NFU1NF RF9VTlRJTF9TSU1EX0NIRUNLKQorCXsKKwkJY3N0YXRlLT5jaGVja2VkX3NpbWQgPSB0cnVlOwor CisJCS8qCisJCSAqIElmIHdlIGhhdmUgbm90IHJlYWQgdG9vIG1hbnkgc3BlY2lhbCBjaGFyYWN0 ZXJzIHRoZW4gc3RhcnQgdXNpbmcKKwkJICogU0lNRCB0byBzcGVlZCB1cCBwcm9jZXNzaW5nLiBU aGlzIGhldXJpc3RpYyBhc3N1bWVzIHRoYXQgaW5wdXQgZG9lcworCQkgKiBub3QgdmFyeSB0b28g bXVjaCBmcm9tIGxpbmUgdG8gbGluZSBhbmQgdGhhdCBudW1iZXIgb2Ygc3BlY2lhbAorCQkgKiBj aGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRoZSBmaXJzdAorCQkgKiBDSEFSU19QUk9DRVNTRURf VU5USUxfU0lNRF9DSEVDSyBhcmUgaW5kaWNpdGl2ZSBvZiB0aGUgd2hvbGUgZmlsZS4KKwkJICov CisJCWlmIChjc3RhdGUtPmNoYXJzX3Byb2Nlc3NlZCAvIFNQRUNJQUxfQ0hBUl9TSU1EX1JBVElP ID49IGNzdGF0ZS0+c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCkKKwkJeworCQkJY3N0YXRlLT51 c2Vfc2ltZCA9IHRydWU7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogUGFyc2UgZGF0YSBh bmQgdHJhbnNmZXIgaW50byBsaW5lX2J1Zi4gVG8gZ2V0IGJlbmVmaXQgZnJvbSBpbmxpbmluZywK KwkgKiBjYWxsIENvcHlSZWFkTGluZVRleHQoKSB3aXRoIHRoZSBjb25zdGFudCBib29sZWFuIHZh cmlhYmxlcy4KKwkgKi8KKwlpZiAoY3N0YXRlLT51c2Vfc2ltZCkKKwkJcmVzdWx0ID0gQ29weVJl YWRMaW5lVGV4dChjc3RhdGUsIGlzX2NzdiwgdHJ1ZSk7CisJZWxzZQorCQlyZXN1bHQgPSBDb3B5 UmVhZExpbmVUZXh0KGNzdGF0ZSwgaXNfY3N2LCBmYWxzZSk7CiAKIAlpZiAocmVzdWx0KQogCXsK QEAgLTEyNDEsOCArMTI3Myw4IEBAIENvcHlSZWFkTGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwg Ym9vbCBpc19jc3YpCiAvKgogICogQ29weVJlYWRMaW5lVGV4dCAtIGlubmVyIGxvb3Agb2YgQ29w eVJlYWRMaW5lIGZvciB0ZXh0IG1vZGUKICAqLwotc3RhdGljIGJvb2wKLUNvcHlSZWFkTGluZVRl eHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQorc3RhdGljIHBnX2F0dHJpYnV0 ZV9hbHdheXNfaW5saW5lIGJvb2wKK0NvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3Rh dGUsIGJvb2wgaXNfY3N2LCBib29sIHVzZV9zaW1kKQogewogCWNoYXIJICAgKmNvcHlfaW5wdXRf YnVmOwogCWludAkJCWlucHV0X2J1Zl9wdHI7CkBAIC0xMzA5LDcgKzEzNDEsNyBAQCBDb3B5UmVh ZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikKIAlpbnB1dF9idWZf cHRyID0gY3N0YXRlLT5pbnB1dF9idWZfaW5kZXg7CiAJY29weV9idWZfbGVuID0gY3N0YXRlLT5p bnB1dF9idWZfbGVuOwogCi0JZm9yICg7OykKKwlmb3IgKDs7IGNzdGF0ZS0+Y2hhcnNfcHJvY2Vz c2VkKyspCiAJewogCQlpbnQJCQlwcmV2X3Jhd19wdHI7CiAJCWNoYXIJCWM7CkBAIC0xMzQ2LDI4 ICsxMzc4LDYgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBp c19jc3YpCiAKICNpZm5kZWYgVVNFX05PX1NJTUQKIAotCQkvKgotCQkgKiBXYWl0IHVudGlsIHdl IGhhdmUgcmVhZCBtb3JlIHRoYW4gQllURVNfUFJPQ0VTU0VEX1VOVElMX1NJTURfQ0hFQ0suCi0J CSAqIGNzdGF0ZS0+Ynl0ZXNfcHJvY2Vzc2VkIHdpbGwgZ3JvdyBhbiB1bnByZWRpY3RhYmxlIGFt b3VudCB3aXRoIGVhY2gKLQkJICogY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBzbyBqdXN0IHdhaXQg dW50aWwgd2UgaGF2ZSBjcm9zc2VkIHRoZQotCQkgKiB0aHJlc2hvbGQuCi0JCSAqLwotCQlpZiAo IWNzdGF0ZS0+Y2hlY2tlZF9zaW1kICYmIGNzdGF0ZS0+Ynl0ZXNfcHJvY2Vzc2VkID4gQllURVNf UFJPQ0VTU0VEX1VOVElMX1NJTURfQ0hFQ0spCi0JCXsKLQkJCWNzdGF0ZS0+Y2hlY2tlZF9zaW1k ID0gdHJ1ZTsKLQotCQkJLyoKLQkJCSAqIElmIHdlIGhhdmUgbm90IHJlYWQgdG9vIG1hbnkgc3Bl Y2lhbCBjaGFyYWN0ZXJzCi0JCQkgKiAoU1BFQ0lBTF9DSEFSX1NJTURfVEhSRVNIT0xEKSB0aGVu IHN0YXJ0IHVzaW5nIFNJTUQgdG8gc3BlZWQgdXAKLQkJCSAqIHByb2Nlc3NpbmcuIFRoaXMgaGV1 cmlzdGljIGFzc3VtZXMgdGhhdCBpbnB1dCBkb2VzIG5vdCB2YXJ5IHRvbwotCQkJICogbXVjaCBm cm9tIGxpbmUgdG8gbGluZSBhbmQgdGhhdCBudW1iZXIgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzCi0J CQkgKiBlbmNvdW50ZXJlZCBpbiB0aGUgZmlyc3QgQllURVNfUFJPQ0VTU0VEX1VOVElMX1NJTURf Q0hFQ0sgYXJlCi0JCQkgKiBpbmRpY2l0aXZlIG9mIHRoZSB3aG9sZSBmaWxlLgotCQkJICovCi0J CQlpZiAoY3N0YXRlLT5zcGVjaWFsX2NoYXJzX2VuY291bnRlcmVkIDwgU1BFQ0lBTF9DSEFSX1NJ TURfVEhSRVNIT0xEKQotCQkJCWNzdGF0ZS0+dXNlX3NpbWQgPSB0cnVlOwotCQl9Ci0KIAkJLyoK IAkJICogVXNlIFNJTUQgaW5zdHJ1Y3Rpb25zIHRvIGVmZmljaWVudGx5IHNjYW4gdGhlIGlucHV0 IGJ1ZmZlciBmb3IKIAkJICogc3BlY2lhbCBjaGFyYWN0ZXJzIChlLmcuLCBuZXdsaW5lLCBjYXJy aWFnZSByZXR1cm4sIHF1b3RlLCBhbmQKQEAgLTEzODAsNyArMTM5MCw3IEBAIENvcHlSZWFkTGlu ZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCQkgKiBzZXF1ZW50aWFs bHkuIC0gVGhlIHJlbWFpbmluZyBidWZmZXIgaXMgc21hbGxlciB0aGFuIG9uZSB2ZWN0b3IKIAkJ ICogd2lkdGggKHNpemVvZihWZWN0b3I4KSk7IFNJTUQgb3BlcmF0ZXMgb24gZml4ZWQtc2l6ZSBj aHVua3MuCiAJCSAqLwotCQlpZiAoY3N0YXRlLT51c2Vfc2ltZCAmJiAhbGFzdF93YXNfZXNjICYm IGNvcHlfYnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPj0gc2l6ZW9mKFZlY3RvcjgpKQorCQlpZiAo dXNlX3NpbWQgJiYgIWxhc3Rfd2FzX2VzYyAmJiBjb3B5X2J1Zl9sZW4gLSBpbnB1dF9idWZfcHRy ID49IHNpemVvZihWZWN0b3I4KSkKIAkJewogCQkJVmVjdG9yOAkJY2h1bms7CiAJCQlWZWN0b3I4 CQltYXRjaCA9IHZlY3RvcjhfYnJvYWRjYXN0KDApOwpAQCAtMTQzMCw2ICsxNDQwLDIxIEBAIENv cHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCQlwcmV2 X3Jhd19wdHIgPSBpbnB1dF9idWZfcHRyOwogCQljID0gY29weV9pbnB1dF9idWZbaW5wdXRfYnVm X3B0cisrXTsKIAorCQkvKiBVc2UgdGhpcyBjYWxjdWxhdGlvbiBkZWNpZGUgd2hldGhlciB0byB1 c2UgU0lNRCBsYXRlciAqLworCQlpZiAoIXVzZV9zaW1kICYmIHVubGlrZWx5KCFjc3RhdGUtPmNo ZWNrZWRfc2ltZCkpCisJCXsKKwkJCWlmIChpc19jc3YpCisJCQl7CisJCQkJaWYgKGMgPT0gJ1xy JyB8fCBjID09ICdcbicgfHwgYyA9PSBxdW90ZWMgfHwgYyA9PSBlc2NhcGVjKQorCQkJCQljc3Rh dGUtPnNwZWNpYWxfY2hhcnNfZW5jb3VudGVyZWQrKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJ CQlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcXCcpCisJCQkJCWNzdGF0ZS0+ c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCsrOworCQkJfQorCQl9CisKIAkJaWYgKGlzX2NzdikK IAkJewogCQkJLyoKQEAgLTE0NDAsNyArMTQ2NSw2IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZy b21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCQkJICovCiAJCQlpZiAoYyA9PSAnXHInKQog CQkJewotCQkJCWNzdGF0ZS0+c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCsrOwogCQkJCUlGX05F RURfUkVGSUxMX0FORF9OT1RfRU9GX0NPTlRJTlVFKDApOwogCQkJfQogCkBAIC0xNDcyLDcgKzE0 OTYsNiBAQCBDb3B5UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2Nz dikKIAkJLyogUHJvY2VzcyBcciAqLwogCQlpZiAoYyA9PSAnXHInICYmICghaXNfY3N2IHx8ICFp bl9xdW90ZSkpCiAJCXsKLQkJCWNzdGF0ZS0+c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCsrOwog CQkJLyogQ2hlY2sgZm9yIFxyXG4gb24gZmlyc3QgbGluZSwgX2FuZF8gaGFuZGxlIFxyXG4uICov CiAJCQlpZiAoY3N0YXRlLT5lb2xfdHlwZSA9PSBFT0xfVU5LTk9XTiB8fAogCQkJCWNzdGF0ZS0+ ZW9sX3R5cGUgPT0gRU9MX0NSTkwpCkBAIC0xNTI5LDcgKzE1NTIsNiBAQCBDb3B5UmVhZExpbmVU ZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikKIAkJLyogUHJvY2VzcyBcbiAq LwogCQlpZiAoYyA9PSAnXG4nICYmICghaXNfY3N2IHx8ICFpbl9xdW90ZSkpCiAJCXsKLQkJCWNz dGF0ZS0+c3BlY2lhbF9jaGFyc19lbmNvdW50ZXJlZCsrOwogCQkJaWYgKGNzdGF0ZS0+ZW9sX3R5 cGUgPT0gRU9MX0NSIHx8IGNzdGF0ZS0+ZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiAJCQkJZXJlcG9y dChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLApA QCAtMTU1Miw4ICsxNTc0LDYgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0 ZSwgYm9vbCBpc19jc3YpCiAJCXsKIAkJCWNoYXIJCWMyOwogCi0JCQljc3RhdGUtPnNwZWNpYWxf Y2hhcnNfZW5jb3VudGVyZWQrKzsKLQogCQkJSUZfTkVFRF9SRUZJTExfQU5EX05PVF9FT0ZfQ09O VElOVUUoMCk7CiAJCQlJRl9ORUVEX1JFRklMTF9BTkRfRU9GX0JSRUFLKDApOwogCi0tIAoyLjUx LjAKCg== --0000000000004d87930645850ede--