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 1vvdl2-00BU5L-1e for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 15:58:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvdl1-00DpKN-0w for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 15:58:31 +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 1vvdl0-00DpKD-2b for pgsql-hackers@lists.postgresql.org; Thu, 26 Feb 2026 15:58:31 +0000 Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvdkx-00000001PtK-0Ezn for pgsql-hackers@postgresql.org; Thu, 26 Feb 2026 15:58:30 +0000 Received: by mail-vk1-xa2c.google.com with SMTP id 71dfb90a1353d-56a91535e5bso380924e0c.1 for ; Thu, 26 Feb 2026 07:58:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772121505; x=1772726305; darn=postgresql.org; h=in-reply-to:references:from:subject:cc:to:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Zw+BvfwnXJbIBniWn9S/8tce8tZkynBVVjsCFH0Mijg=; b=SGxEi1zwHkXFmCFWUvGtfBYtSun5/OJkzO088ZbKGR9Jqvh33VIABEcvFzZKY9YCdH 5h7dCgXjDRRL0aeZoEeztWCEz6VWFtA2hpFlUksAlvnk81x2ZxNPtW/2HvCWecfzVdGM 0EzX7pC/wt9YGsoKJEqb0uw/0DULiVIUvZQclTc9QOnYKVjq4U+kLWGLdrVCNZJH6sND w1ulGTc5I20yo+xgCTbx/SU5LCbQmbW1N1IrNljsdCF8DfuSmlrj7osR0O9jJY5q70ub EO2RL4QwfhcjeTQGj0oUi7c0aiasH+hsyi/zCz+fr0sCs6Sb9cKpxpYad72AywjTPxs7 +czQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772121505; x=1772726305; h=in-reply-to:references:from:subject:cc:to:message-id:date :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Zw+BvfwnXJbIBniWn9S/8tce8tZkynBVVjsCFH0Mijg=; b=l76RLoDLYuR+96A/dyseM3docsj5GIQ9ZU+alf6KCOaG9JT9QnWd7lRusb5YpgsNSK QuyPVQT6uqYHB7EXDxEpDhd3mJ+eyoi48qaWyj9CyA+aYGKFUODHKdEozbb7tyFeARWr H4hSxDUPcqt7K+fbkymWGxYMgvPiGWO9wUQOX39y/4tHfqgdL8S1ytptePPVSGNa94PW h1w6OSeLDRGX3eT5nP2EN2XaYoR0NETNWG5KdIqXks/BwOhQS7AoRhh0bd6lyZ02/H+o JI6ow2V05Erw2xQswc9cYq93Hwbc3Nf/IXg8PitKBHhLXozrRgaRl1SwRp21qBvyjAcT iEdA== X-Forwarded-Encrypted: i=1; AJvYcCWtXzejJXVxdF/jhRwsYEWHz+sVoUPVbv7UY8JGl1cRCtnLelnNOrxgKrscSiwdDsyPKuilxygGz1AIjAyQ@postgresql.org X-Gm-Message-State: AOJu0Yw3dhkAwQ6hvWUFCMLCmGmgMcDCsBAju8z81L0m3p3rU7T3gePv HOxLkSV95Bw67VpvixmJdel0IBurbeztTlzM8r7tZr98Vy6XWN+L8YZj X-Gm-Gg: ATEYQzwma9KY5patTVlb/gTVnriDKHn0EwxSwmVZCV55GsJnlXoVBP6YAVq04APBU4N N3oHN+tO6v2/zrbNDufZhiWE7t5FFRTqOZt0x9iwdCCoKrk6z7GTqJRRMZgFDhD/23MzJCfiZIx djOjtyiedcXMLUbH2MmpC4mkS547ar28zbX3S+ai1FG5Yd65rQpT3oznDokbITtXAd1Q3ESc/AF 6rNn6x4+idSLJx6lelj6W8B1eYHhLGFoIGIMe67n40ma6Mh8jGY4FowUORn3Z//ZP22I5zu2Fhe TmM8DlJtgrLn9rofVgojyZvsasISLvcXc5NUdIaqHAOSTHSjN6N1z9Nqa8cLUtHXzSNd6tH03Jg dgnZ3pNoimfKFcTpDoEEWIIvmZiUzZ0GWoq0ArmLFdd7l/VHwyL+/9AA16nVs3kfrmK0oxTBoZT rJrLuaQnqLBSYsdi1VOQ4XrMOu5HMsMhyTzSRBt/SQAZ4YvQ== X-Received: by 2002:a05:6122:29ce:b0:563:746c:a32b with SMTP id 71dfb90a1353d-56a8bc8fb77mr2598088e0c.15.1772121505183; Thu, 26 Feb 2026 07:58:25 -0800 (PST) Received: from localhost ([2804:14d:328a:a59c:a4b8:2a46:26e5:b6cc]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-56a9215ac92sm3166008e0c.14.2026.02.26.07.58.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 Feb 2026 07:58:24 -0800 (PST) Content-Type: multipart/mixed; boundary=b89e34de6cd2100d184774b126fe42ffec6e85da4a9d59ad42d56e4d8763 Mime-Version: 1.0 Date: Thu, 26 Feb 2026 12:58:21 -0300 Message-Id: To: "Masahiko Sawada" Cc: "Andrew Dunstan" , "jian he" , "Tomas Vondra" , Subject: Re: postgres_fdw: Use COPY to speed up batch inserts From: "Matheus Alcantara" X-Mailer: aerc 0.21.0 References: <5c52f4c7-74fa-4594-8378-53fd49f39329@dunslane.net> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --b89e34de6cd2100d184774b126fe42ffec6e85da4a9d59ad42d56e4d8763 Content-Type: multipart/alternative; boundary=e65c77a5a334aef8335f31b14795c9a699a9b03c9bd1b5925e1db43975a4 --e65c77a5a334aef8335f31b14795c9a699a9b03c9bd1b5925e1db43975a4 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Wed Feb 25, 2026 at 10:39 PM -03, Masahiko Sawada wrote: >> Note that using COPY as the remote SQL is not always feasible. If the >> remote table has a trigger that modifies the row, and the local foreign >> table also has an insert trigger, we cannot capture those changes. While >> postgres_fdw typically relies on INSERT ... RETURNING * to synchronize >> the TupleTableSlot with remote side effects, the COPY command does not >> support a RETURNING clause. Without this synchronization, local triggers >> would see the original data rather than the actual values inserted. This >> limitation is why the ri_TrigDesc =3D=3D NULL check is necessary; removi= ng >> it causes the "Test a combination of local and remote triggers" >> regression test on postgres_fdw.sql to fail. > > Agreed. If this problem happens only when the local table has an AFTER > INSERT trigger, can we check ri_TrigDesc->trig_insert_after_row too? > Yes, it's better to only fallback to insert mode when the table have a AFTER trigger. Fixed. > Regarding the third condition, resultRelInfo->ri_returningList =3D=3D NIL= , > can we make it an Assert() because checking > resultRelInfo->RootResultRelInfo =3D=3D NULL already checks if it's calle= d > via COPY? > Yes, souns better. Fixed. > One thing it might be worth considering is to add some regression > tests verifying that COPY commands are actually being used on the > remote server in success cases. That way, we can be aware of changes > even if we change the assumption in the future that RootResultRelInfo > =3D=3D NULL only when postgresBeginForeignInsert() is called via COPY. On= e > idea is to define a trigger on the remote server that checks if the > executed query is INSERT or COPY. For example, > > create function insert_or_copy() returns trigger as $$ > declare query text; > begin > query :=3D current_query(); > if query ~* '^COPY' then > raise notice 'COPY command'; > elsif query ~* '^INSERT' then > raise notice 'INSERT command'; > end if; > return new; > end; > $$ language plpgsql; > > Note that we need to set client_min_message to 'log' so that we can > write the notice message raised via postgres_fdw. > Good, thanks for this! I've added on this new version. Please see the new attached version. Thank you for reviewing this! -- Matheus Alcantara EDB: https://www.enterprisedb.com --e65c77a5a334aef8335f31b14795c9a699a9b03c9bd1b5925e1db43975a4-- --b89e34de6cd2100d184774b126fe42ffec6e85da4a9d59ad42d56e4d8763 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v11-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch Content-Type: text/plain; charset=utf-8; name=v11-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch RnJvbSBmNTY5YjBkYTgyMmU5YWQwYmVmNTIxYjdmNGY4NTMyYTQ1OTQ4NTc3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjggSmFuIDIwMjYgMTk6NTU6NDggLTAzMDAKU3ViamVjdDogW1BBVENIIHYxMV0g cG9zdGdyZXNfZmR3OiBVc2UgQ09QWSBhcyByZW1vdGUgU1FMIHdoZW4gcG9zc2libGUKClByZXZp b3VzbHkgd2hlbiBhbiB1c2VyIGV4ZWN1dGUgYSBDT1BZIG9uIGEgZm9yZWlnbiB0YWJsZSwgcG9z dGdyZXNfZmR3CnNlbmQgYSBJTlNFUlQgYXMgYSByZW1vdGUgU1FMIHRvIHRoZSBmb3JlaWduIHNl cnZlci4gVGhpcyBjb21taXQKaW50cm9kdWNlIHRoZSBhYmlsaXR5IHRvIHVzZSB0aGUgQ09QWSBj b21tYW5kIGluc3RlYWQuCgpUaGUgQ09QWSBjb21tYW5kIHdpbGwgb25seSBiZSB1c2VkIHdoZW4g YW4gdXNlciBleGVjdXRlIGEgQ09QWSBvbiBhCmZvcmVpZ24gdGFibGUgYW5kIGFsc28gdGhlIGZv cmVpZ24gdGFibGUgc2hvdWxkIG5vdCBoYXZlIHRyaWdnZXJzCmJlY2F1c2UgcmVtb3RlIHRyaWdn ZXJzIG1pZ2h0IG1vZGlmeSB0aGUgaW5zZXJ0ZWQgcm93IGFuZCBzaW5jZSBDT1BZCmRvZXMgbm90 IHN1cHBvcnQgYSBSRVRVUk5JTkcgY2xhdXNlLCB3ZSBjYW5ub3Qgc3luY2hyb25pemUgdGhlIGxv Y2FsClR1cGxlVGFibGVTbG90IHdpdGggdGhvc2UgY2hhbmdlcyBmb3IgdXNlIGluIGxvY2FsIEFG VEVSIHRyaWdnZXJzLCBzbyBpZgp0aGUgZm9yZWlnbiB0YWJsZSBoYXMgYW55IHRyaWdnZXIgSU5T RVJUIHdpbGwgYmUgdXNlZC4KCkF1dGhvcjogTWF0aGV1cyBBbGNhbnRhcmEgPG10aHMuZGV2QHBt Lm1lPgpSZXZpZXdlZC1CeTogVG9tYXMgVm9uZHJhIDx0b21hc0B2b25kcmEubWU+ClJldmlld2Vk LUJ5OiBKYWt1YiBXYXJ0YWsgPGpha3ViLndhcnRha0BlbnRlcnByaXNlZGIuY29tPgpSZXZpZXdl ZC1CeTogamlhbiBoZSA8amlhbi51bml2ZXJzYWxpdHlAZ21haWwuY29tPgpSZXZpZXdlZC1CeTog RGV3ZWkgRGFpIDxkYWlkZXdlaTE5NzBAMTYzLmNvbT4KUmV2aWV3ZWQtQnk6IE1hc2FoaWtvIFNh d2FkYSA8c2F3YWRhLm1zaGtAZ21haWwuY29tPgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9z dGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0RESVpKMjE3T1VESy4yUjVXRTRPR0w1UFRZJTQw Z21haWwuY29tCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jICAgICAgICAgICAg ICAgIHwgIDM2ICsrKysKIC4uLi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91 dCAgICB8ICAzMyArKystCiBjb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyAgICAg ICAgICAgfCAxNzkgKysrKysrKysrKysrKysrKystCiBjb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0 Z3Jlc19mZHcuaCAgICAgICAgICAgfCAgIDEgKwogY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bv c3RncmVzX2Zkdy5zcWwgICAgIHwgIDI3ICsrKwogNSBmaWxlcyBjaGFuZ2VkLCAyNjggaW5zZXJ0 aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zk dy9kZXBhcnNlLmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKaW5kZXggZWJlMmMz YTU5NmEuLjA0ODI5YjZlZTQ1IDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBh cnNlLmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCkBAIC0yMTc3LDYgKzIx NzcsNDIgQEAgZGVwYXJzZUluc2VydFNxbChTdHJpbmdJbmZvIGJ1ZiwgUmFuZ2VUYmxFbnRyeSAq cnRlLAogCQkJCQkJIHdpdGhDaGVja09wdGlvbkxpc3QsIHJldHVybmluZ0xpc3QsIHJldHJpZXZl ZF9hdHRycyk7CiB9CiAKKy8qCisgKiAgQnVpbGQgYSBDT1BZIEZST00gU1RESU4gc3RhdGVtZW50 IHVzaW5nIHRoZSBURVhUIGZvcm1hdAorICovCit2b2lkCitkZXBhcnNlQ29weVNxbChTdHJpbmdJ bmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBMaXN0ICp0YXJnZXRfYXR0cnMpCit7CisJVHVwbGVEZXNj CXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJZmlyc3QgPSB0cnVlOwor CWludAkJCW5hdHRycyA9IGxpc3RfbGVuZ3RoKHRhcmdldF9hdHRycyk7CisKKwlhcHBlbmRTdHJp bmdJbmZvKGJ1ZiwgIkNPUFkgIik7CisJZGVwYXJzZVJlbGF0aW9uKGJ1ZiwgcmVsKTsKKwlpZiAo bmF0dHJzID4gMCkKKwkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIoIik7CisKKwlmb3JlYWNoX2lu dChhdHRudW0sIHRhcmdldF9hdHRycykKKwl7CisJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBU dXBsZURlc2NBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCisJCWlmIChhdHRyLT5hdHRnZW5l cmF0ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIsICIpOworCisJCWZpcnN0ID0gZmFsc2U7CisKKwkJYXBwZW5kU3RyaW5n SW5mb1N0cmluZyhidWYsIHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHRyLT5hdHRuYW1lKSkp OworCX0KKwlpZiAobmF0dHJzID4gMCkKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIp IEZST00gU1RESU4iKTsKKwllbHNlCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIEZS T00gU1RESU4iKTsKK30KKworCiAvKgogICogcmVidWlsZCByZW1vdGUgSU5TRVJUIHN0YXRlbWVu dAogICoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVz X2Zkdy5vdXQgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0 CmluZGV4IDJjY2I3MmM1MzlhLi4yMmMyZGNkYjZiMSAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAorKysgYi9jb250cmliL3Bvc3RncmVz X2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC03NjAzLDYgKzc2MDMsMjcgQEAgc2Vs ZWN0ICogZnJvbSBncmVtMTsKICgyIHJvd3MpCiAKIGRlbGV0ZSBmcm9tIGdyZW0xOworLS0gdGVz dCB0aGF0IGZkdyBhbHNvIHVzZSBDT1BZIEZST00gYXMgYSByZW1vdGUgc3FsCitzZXQgY2xpZW50 X21pbl9tZXNzYWdlcyB0byAnbG9nJzsKK2NyZWF0ZSBmdW5jdGlvbiBpbnNlcnRfb3JfY29weSgp IHJldHVybnMgdHJpZ2dlciBhcyAkJAorZGVjbGFyZSBxdWVyeSB0ZXh0OworYmVnaW4KKyAgICBx dWVyeSA6PSBjdXJyZW50X3F1ZXJ5KCk7CisgICAgaWYgcXVlcnkgfiogJ15DT1BZJyB0aGVuCisg ICAgICAgIHJhaXNlIG5vdGljZSAnQ09QWSBjb21tYW5kJzsKKyAgICBlbHNpZiBxdWVyeSB+KiAn XklOU0VSVCcgdGhlbgorICAgICAgICByYWlzZSBub3RpY2UgJ0lOU0VSVCBjb21tYW5kJzsKKyAg ICBlbmQgaWY7CityZXR1cm4gbmV3OworZW5kOworJCQgbGFuZ3VhZ2UgcGxwZ3NxbDsKK0NSRUFU RSBUUklHR0VSIHRyaWdfcm93X2JlZm9yZQorQkVGT1JFIElOU0VSVCBPUiBVUERBVEUgT1IgREVM RVRFIE9OIGdsb2MxCitGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgaW5zZXJ0X29yX2Nv cHkoKTsKK2NvcHkgZ3JlbTEgZnJvbSBzdGRpbjsKK0xPRzogIHJlY2VpdmVkIG1lc3NhZ2Ugdmlh IHJlbW90ZSBjb25uZWN0aW9uOiBOT1RJQ0U6ICBDT1BZIGNvbW1hbmQKK2Ryb3AgdHJpZ2dlciB0 cmlnX3Jvd19iZWZvcmUgb24gZ2xvYzE7CityZXNldCBjbGllbnRfbWluX21lc3NhZ2VzOwogLS0g dGVzdCBiYXRjaCBpbnNlcnQKIGFsdGVyIHNlcnZlciBsb29wYmFjayBvcHRpb25zIChhZGQgYmF0 Y2hfc2l6ZSAnMTAnKTsKIGV4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKQEAgLTc2MjAsMTYg Kzc2NDEsMTggQEAgaW5zZXJ0IGludG8gZ3JlbTEgKGEpIHZhbHVlcyAoMSksICgyKTsKIHNlbGVj dCAqIGZyb20gZ2xvYzE7CiAgYSB8IGIgfCBjIAogLS0tKy0tLSstLS0KKyAzIHwgNiB8ICAKICAx IHwgMiB8ICAKICAyIHwgNCB8ICAKLSgyIHJvd3MpCisoMyByb3dzKQogCiBzZWxlY3QgKiBmcm9t IGdyZW0xOwogIGEgfCBiIHwgYyAKIC0tLSstLS0rLS0tCisgMyB8IDYgfCA5CiAgMSB8IDIgfCAz CiAgMiB8IDQgfCA2Ci0oMiByb3dzKQorKDMgcm93cykKIAogZGVsZXRlIGZyb20gZ3JlbTE7CiAt LSBiYXRjaCBpbnNlcnQgd2l0aCBmb3JlaWduIHBhcnRpdGlvbnMuCkBAIC05NTQ0LDcgKzk1Njcs OCBAQCBjb3B5IHJlbTIgZnJvbSBzdGRpbjsKIGNvcHkgcmVtMiBmcm9tIHN0ZGluOyAtLSBFUlJP UgogRVJST1I6ICBuZXcgcm93IGZvciByZWxhdGlvbiAibG9jMiIgdmlvbGF0ZXMgY2hlY2sgY29u c3RyYWludCAibG9jMl9mMXBvc2l0aXZlIgogREVUQUlMOiAgRmFpbGluZyByb3cgY29udGFpbnMg KC0xLCB4eXp6eSkuCi1DT05URVhUOiAgcmVtb3RlIFNRTCBjb21tYW5kOiBJTlNFUlQgSU5UTyBw dWJsaWMubG9jMihmMSwgZjIpIFZBTFVFUyAoJDEsICQyKQorQ09OVEVYVDogIENPUFkgbG9jMiwg bGluZSAxOiAiLTEJeHl6enkiCityZW1vdGUgU1FMIGNvbW1hbmQ6IENPUFkgcHVibGljLmxvYzIo ZjEsIGYyKSBGUk9NIFNURElOCiBDT1BZIHJlbTIsIGxpbmUgMTogIi0xCXh5enp5Igogc2VsZWN0 ICogZnJvbSByZW0yOwogIGYxIHwgZjIgIApAQCAtOTcwMSw3ICs5NzI1LDggQEAgY29weSByZW0y IGZyb20gc3RkaW47CiBjb3B5IHJlbTIgZnJvbSBzdGRpbjsgLS0gRVJST1IKIEVSUk9SOiAgbmV3 IHJvdyBmb3IgcmVsYXRpb24gImxvYzIiIHZpb2xhdGVzIGNoZWNrIGNvbnN0cmFpbnQgImxvYzJf ZjFwb3NpdGl2ZSIKIERFVEFJTDogIEZhaWxpbmcgcm93IGNvbnRhaW5zICgtMSwgeHl6enkpLgot Q09OVEVYVDogIHJlbW90ZSBTUUwgY29tbWFuZDogSU5TRVJUIElOVE8gcHVibGljLmxvYzIoZjEs IGYyKSBWQUxVRVMgKCQxLCAkMikKK0NPTlRFWFQ6ICBDT1BZIGxvYzIsIGxpbmUgMTogIi0xCXh5 enp5IgorcmVtb3RlIFNRTCBjb21tYW5kOiBDT1BZIHB1YmxpYy5sb2MyKGYxLCBmMikgRlJPTSBT VERJTgogQ09QWSByZW0yCiBzZWxlY3QgKiBmcm9tIHJlbTI7CiAgZjEgfCBmMiAgCmRpZmYgLS1n aXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDYwZDkwMzI5YTY1Li42ZGQyMmU0MDQzZCAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKKysrIGIvY29udHJp Yi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTYzLDYgKzYzLDkgQEAgUEdfTU9EVUxF X01BR0lDX0VYVCgKIC8qIElmIG5vIHJlbW90ZSBlc3RpbWF0ZXMsIGFzc3VtZSBhIHNvcnQgY29z dHMgMjAlIGV4dHJhICovCiAjZGVmaW5lIERFRkFVTFRfRkRXX1NPUlRfTVVMVElQTElFUiAxLjIK IAorLyogQnVmZmVyIHNpemUgdG8gc2VuZCBDT1BZIElOIGRhdGEqLworI2RlZmluZSBDT1BZQlVG U0laIDgxOTIKKwogLyoKICAqIEluZGV4ZXMgb2YgRkRXLXByaXZhdGUgaW5mb3JtYXRpb24gc3Rv cmVkIGluIGZkd19wcml2YXRlIGxpc3RzLgogICoKQEAgLTE5OCw2ICsyMDEsOCBAQCB0eXBlZGVm IHN0cnVjdCBQZ0Zkd01vZGlmeVN0YXRlCiAJYm9vbAkJaGFzX3JldHVybmluZzsJLyogaXMgdGhl cmUgYSBSRVRVUk5JTkcgY2xhdXNlPyAqLwogCUxpc3QJICAgKnJldHJpZXZlZF9hdHRyczsJLyog YXR0ciBudW1iZXJzIHJldHJpZXZlZCBieSBSRVRVUk5JTkcgKi8KIAorCWJvb2wJCXVzZV9jb3B5 OworCiAJLyogaW5mbyBhYm91dCBwYXJhbWV0ZXJzIGZvciBwcmVwYXJlZCBzdGF0ZW1lbnQgKi8K IAlBdHRyTnVtYmVyCWN0aWRBdHRubzsJCS8qIGF0dG51bSBvZiBpbnB1dCByZXNqdW5rIGN0aWQg Y29sdW1uICovCiAJaW50CQkJcF9udW1zOwkJCS8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHRy YW5zbWl0ICovCkBAIC01NDUsNiArNTUwLDEyIEBAIHN0YXRpYyB2b2lkIG1lcmdlX2Zkd19vcHRp b25zKFBnRmR3UmVsYXRpb25JbmZvICpmcGluZm8sCiAJCQkJCQkJICBjb25zdCBQZ0Zkd1JlbGF0 aW9uSW5mbyAqZnBpbmZvX28sCiAJCQkJCQkJICBjb25zdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBp bmZvX2kpOwogc3RhdGljIGludAlnZXRfYmF0Y2hfc2l6ZV9vcHRpb24oUmVsYXRpb24gcmVsKTsK K3N0YXRpYyBUdXBsZVRhYmxlU2xvdCAqKmV4ZWN1dGVfZm9yZWlnbl9tb2RpZnlfdXNpbmdfY29w eShQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkJCQkJCQkgIFR1cGxlVGFibGVT bG90ICoqc2xvdHMsCisJCQkJCQkJCQkJCQkJCSAgaW50ICpudW1TbG90cyk7CitzdGF0aWMgdm9p ZCBjb252ZXJ0X3Nsb3RfdG9fY29weV90ZXh0KFN0cmluZ0luZm8gYnVmLAorCQkJCQkJCQkJICBQ Z0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkJICBUdXBsZVRhYmxlU2xvdCAqc2xv dCk7CiAKIAogLyoKQEAgLTIxNzAsNiArMjE4MSw3IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5z ZXJ0KE1vZGlmeVRhYmxlU3RhdGUgKm10c3RhdGUsCiAJTGlzdAkgICAqdGFyZ2V0QXR0cnMgPSBO SUw7CiAJTGlzdAkgICAqcmV0cmlldmVkX2F0dHJzID0gTklMOwogCWJvb2wJCWRvTm90aGluZyA9 IGZhbHNlOworCWJvb2wJCXVzZUNvcHkgPSBmYWxzZTsKIAogCS8qCiAJICogSWYgdGhlIGZvcmVp Z24gdGFibGUgd2UgYXJlIGFib3V0IHRvIGluc2VydCByb3V0ZWQgcm93cyBpbnRvIGlzIGFsc28g YW4KQEAgLTIyNDcsMTEgKzIyNTksNDEgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25JbnNlcnQoTW9k aWZ5VGFibGVTdGF0ZSAqbXRzdGF0ZSwKIAkJcnRlID0gZXhlY19ydF9mZXRjaChyZXN1bHRSZWxh dGlvbiwgZXN0YXRlKTsKIAl9CiAKKwkvKgorCSAqIFdlIGNhbiB1c2UgQ09QWSBmb3IgcmVtb3Rl IGluc2VydHMgb25seSBpZiBhbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisJICogYXJlIG1l dDoKKwkgKgorCSAqIERpcmVjdCBFeGVjdXRpb246IFRoZSBjb21tYW5kIGlzIGEgQ09QWSBGUk9N IG9uIHRoZSBmb3JlaWduIHRhYmxlCisJICogaXRzZWxmLCBub3QgcGFydCBvZiBhIHBhcnRpdGlv bmVkIHRhYmxlJ3MgdHVwbGUgcm91dGluZy4gKAorCSAqIHJlc3VsdFJlbEluZm8tPnJpX1Jvb3RS ZXN1bHRSZWxJbmZvID09IE5VTEwpCisJICoKKwkgKiBObyBMb2NhbCBBRlRFUiBUcmlnZ2Vyczog VGhlcmUgYXJlIG5vIEFGVEVSIFJPVyB0cmlnZ2VycyBkZWZpbmVkIGxvY2FsbHkKKwkgKiBvbiB0 aGUgZm9yZWlnbiB0YWJsZS4KKwkgKgorCSAqIFJlbW90ZSB0cmlnZ2VycyBtaWdodCBtb2RpZnkg dGhlIGluc2VydGVkIHJvdy4gQmVjYXVzZSB0aGUgQ09QWSBwcm90b2NvbAorCSAqIGRvZXMgbm90 IHN1cHBvcnQgYSBSRVRVUk5JTkcgY2xhdXNlLCB3ZSBjYW5ub3QgcmV0cmlldmUgdGhvc2UgY2hh bmdlcyB0bworCSAqIHN5bmNocm9uaXplIHRoZSBsb2NhbCBUdXBsZVRhYmxlU2xvdCByZXF1aXJl ZCBieSBsb2NhbCBBRlRFUiB0cmlnZ2Vycy4KKwkgKi8KKwlpZiAocmVzdWx0UmVsSW5mby0+cmlf Um9vdFJlc3VsdFJlbEluZm8gPT0gTlVMTCkKKwl7CisJCS8qIFRoZXJlIGlzIG5vIFJFVFVSTklO RyBjbGF1c2Ugb24gQ09QWSAqLworCQlBc3NlcnQocmVzdWx0UmVsSW5mby0+cmlfcmV0dXJuaW5n TGlzdCA9PSBOSUwpOworCisJCXVzZUNvcHkgPSAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2Mg PT0gTlVMTCB8fAorCQkJCSAgICFyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+dHJpZ19pbnNl cnRfYWZ0ZXJfcm93KTsKKwl9CisKIAkvKiBDb25zdHJ1Y3QgdGhlIFNRTCBjb21tYW5kIHN0cmlu Zy4gKi8KLQlkZXBhcnNlSW5zZXJ0U3FsKCZzcWwsIHJ0ZSwgcmVzdWx0UmVsYXRpb24sIHJlbCwg dGFyZ2V0QXR0cnMsIGRvTm90aGluZywKLQkJCQkJIHJlc3VsdFJlbEluZm8tPnJpX1dpdGhDaGVj a09wdGlvbnMsCi0JCQkJCSByZXN1bHRSZWxJbmZvLT5yaV9yZXR1cm5pbmdMaXN0LAotCQkJCQkg JnJldHJpZXZlZF9hdHRycywgJnZhbHVlc19lbmRfbGVuKTsKKwlpZiAodXNlQ29weSkKKwl7CisJ CWRlcGFyc2VDb3B5U3FsKCZzcWwsIHJlbCwgdGFyZ2V0QXR0cnMpOworCQl2YWx1ZXNfZW5kX2xl biA9IDA7CQkvKiBLZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJfQorCWVsc2UKKwkJZGVwYXJzZUlu c2VydFNxbCgmc3FsLCBydGUsIHJlc3VsdFJlbGF0aW9uLCByZWwsIHRhcmdldEF0dHJzLCBkb05v dGhpbmcsCisJCQkJCQkgcmVzdWx0UmVsSW5mby0+cmlfV2l0aENoZWNrT3B0aW9ucywKKwkJCQkJ CSByZXN1bHRSZWxJbmZvLT5yaV9yZXR1cm5pbmdMaXN0LAorCQkJCQkJICZyZXRyaWV2ZWRfYXR0 cnMsICZ2YWx1ZXNfZW5kX2xlbik7CiAKIAkvKiBDb25zdHJ1Y3QgYW4gZXhlY3V0aW9uIHN0YXRl LiAqLwogCWZtc3RhdGUgPSBjcmVhdGVfZm9yZWlnbl9tb2RpZnkobXRzdGF0ZS0+cHMuc3RhdGUs CkBAIC0yMjY0LDYgKzIzMDYsNyBAQCBwb3N0Z3Jlc0JlZ2luRm9yZWlnbkluc2VydChNb2RpZnlU YWJsZVN0YXRlICptdHN0YXRlLAogCQkJCQkJCQkJdmFsdWVzX2VuZF9sZW4sCiAJCQkJCQkJCQly ZXRyaWV2ZWRfYXR0cnMgIT0gTklMLAogCQkJCQkJCQkJcmV0cmlldmVkX2F0dHJzKTsKKwlmbXN0 YXRlLT51c2VfY29weSA9IHVzZUNvcHk7CiAKIAkvKgogCSAqIElmIHRoZSBnaXZlbiByZXN1bHRS ZWxJbmZvIGFscmVhZHkgaGFzIFBnRmR3TW9kaWZ5U3RhdGUgc2V0LCBpdCBtZWFucwpAQCAtNDA5 Myw2ICs0MTM2LDkgQEAgZXhlY3V0ZV9mb3JlaWduX21vZGlmeShFU3RhdGUgKmVzdGF0ZSwKIAkJ ICAgb3BlcmF0aW9uID09IENNRF9VUERBVEUgfHwKIAkJICAgb3BlcmF0aW9uID09IENNRF9ERUxF VEUpOwogCisJaWYgKGZtc3RhdGUtPnVzZV9jb3B5KQorCQlyZXR1cm4gZXhlY3V0ZV9mb3JlaWdu X21vZGlmeV91c2luZ19jb3B5KGZtc3RhdGUsIHNsb3RzLCBudW1TbG90cyk7CisKIAkvKiBGaXJz dCwgcHJvY2VzcyBhIHBlbmRpbmcgYXN5bmNocm9ub3VzIHJlcXVlc3QsIGlmIGFueS4gKi8KIAlp ZiAoZm1zdGF0ZS0+Y29ubl9zdGF0ZS0+cGVuZGluZ0FyZXEpCiAJCXByb2Nlc3NfcGVuZGluZ19y ZXF1ZXN0KGZtc3RhdGUtPmNvbm5fc3RhdGUtPnBlbmRpbmdBcmVxKTsKQEAgLTc4ODYsMyArNzkz MiwxMjggQEAgZ2V0X2JhdGNoX3NpemVfb3B0aW9uKFJlbGF0aW9uIHJlbCkKIAogCXJldHVybiBi YXRjaF9zaXplOwogfQorCisvKgorICogZXhlY3V0ZV9mb3JlaWduX21vZGlmeV91c2luZ19jb3B5 CisgKgkJUGVyZm9ybSBmb3JlaWduLXRhYmxlIG1vZGlmaWNhdGlvbiB1c2luZyB0aGUgQ09QWSBj b21tYW5kLgorICovCitzdGF0aWMgVHVwbGVUYWJsZVNsb3QgKioKK2V4ZWN1dGVfZm9yZWlnbl9t b2RpZnlfdXNpbmdfY29weShQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkgIFR1 cGxlVGFibGVTbG90ICoqc2xvdHMsCisJCQkJCQkJCSAgaW50ICpudW1TbG90cykKK3sKKwlQR3Jl c3VsdCAgICpyZXM7CisJU3RyaW5nSW5mb0RhdGEgY29weV9kYXRhOworCWludAkJCW5fcm93czsK KwlpbnQJCQlpOworCisJQXNzZXJ0KGZtc3RhdGUtPnVzZV9jb3B5ID09IHRydWUpOworCisJLyog U2VuZCBDT1BZIGNvbW1hbmQgKi8KKwlpZiAoIVBRc2VuZFF1ZXJ5KGZtc3RhdGUtPmNvbm4sIGZt c3RhdGUtPnF1ZXJ5KSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4s IGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qIGdldCB0aGUgQ09QWSByZXN1bHQgKi8KKwlyZXMgPSBw Z2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUtPmNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMp ICE9IFBHUkVTX0NPUFlfSU4pCisJCXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNv bm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qIENsZWFuIHVwIHRoZSBDT1BZIGNvbW1hbmQgcmVz dWx0ICovCisJUFFjbGVhcihyZXMpOworCisJLyogQ29udmVydCB0aGUgVHVwbGVUYWJsZVNsb3Qg ZGF0YSBpbnRvIGEgVEVYVC1mb3JtYXR0ZWQgbGluZSAqLworCWluaXRTdHJpbmdJbmZvKCZjb3B5 X2RhdGEpOworCWZvciAoaSA9IDA7IGkgPCAqbnVtU2xvdHM7IGkrKykKKwl7CisJCWNvbnZlcnRf c2xvdF90b19jb3B5X3RleHQoJmNvcHlfZGF0YSwgZm1zdGF0ZSwgc2xvdHNbaV0pOworCisJCS8q CisJCSAqIFNlbmQgaW5pdGlhbCBDT1BZIGRhdGEgaWYgdGhlIGJ1ZmZlciByZWFjaGVzIHRoZSBs aW1pdCB0byBhdm9pZAorCQkgKiBsYXJnZSBtZW1vcnkgdXNhZ2UuCisJCSAqLworCQlpZiAoY29w eV9kYXRhLmxlbiA+PSBDT1BZQlVGU0laKQorCQl7CisJCQlpZiAoUFFwdXRDb3B5RGF0YShmbXN0 YXRlLT5jb25uLCBjb3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCQlwZ2Zk d19yZXBvcnRfZXJyb3IoTlVMTCwgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpOworCQkJ cmVzZXRTdHJpbmdJbmZvKCZjb3B5X2RhdGEpOworCQl9CisJfQorCisJLyogU2VuZCB0aGUgcmVt YWluaW5nIENPUFkgZGF0YSAqLworCWlmIChjb3B5X2RhdGEubGVuID4gMCkKKwl7CisJCWlmIChQ UXB1dENvcHlEYXRhKGZtc3RhdGUtPmNvbm4sIGNvcHlfZGF0YS5kYXRhLCBjb3B5X2RhdGEubGVu KSA8PSAwKQorCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZtc3Rh dGUtPnF1ZXJ5KTsKKwl9CisKKwlwZnJlZShjb3B5X2RhdGEuZGF0YSk7CisKKwkvKiBFbmQgdGhl IENPUFkgb3BlcmF0aW9uICovCisJaWYgKFBRcHV0Q29weUVuZChmbXN0YXRlLT5jb25uLCBOVUxM KSA8IDAgfHwgUFFmbHVzaChmbXN0YXRlLT5jb25uKSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9yKE5V TEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qCisJICogR2V0IHRoZSBy ZXN1bHQsIGFuZCBjaGVjayBmb3Igc3VjY2Vzcy4KKwkgKi8KKwlyZXMgPSBwZ2Zkd19nZXRfcmVz dWx0KGZtc3RhdGUtPmNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NP TU1BTkRfT0spCisJCXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNvbm4sIGZtc3Rh dGUtPnF1ZXJ5KTsKKworCW5fcm93cyA9IGF0b2koUFFjbWRUdXBsZXMocmVzKSk7CisKKwkvKiBB bmQgY2xlYW4gdXAgKi8KKwlQUWNsZWFyKHJlcyk7CisKKwlNZW1vcnlDb250ZXh0UmVzZXQoZm1z dGF0ZS0+dGVtcF9jeHQpOworCisJKm51bVNsb3RzID0gbl9yb3dzOworCisJLyoKKwkgKiBSZXR1 cm4gTlVMTCBpZiBub3RoaW5nIHdhcyBpbnNlcnRlZCBvbiB0aGUgcmVtb3RlIGVuZAorCSAqLwor CXJldHVybiAobl9yb3dzID4gMCkgPyBzbG90cyA6IE5VTEw7Cit9CisKKy8qCisgKiAgV3JpdGUg dGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmbXN0YXRlIGludG8gYnVmIGJ1ZmZlciB0byBi ZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElOIGRhdGEKKyAqLworc3RhdGljIHZvaWQKK2Nv bnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5nSW5mbyBidWYsCisJCQkJCQkgIFBnRmR3TW9k aWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkgIFR1cGxlVGFibGVTbG90ICpzbG90KQoreworCVR1 cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihmbXN0YXRlLT5yZWwpOworCWJvb2wJ CWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlpID0gMDsKKworCWZvcmVhY2hfaW50KGF0dG51bSwgZm1z dGF0ZS0+dGFyZ2V0X2F0dHJzKQorCXsKKwkJQ29tcGFjdEF0dHJpYnV0ZSAqYXR0ciA9IFR1cGxl RGVzY0NvbXBhY3RBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQlEYXR1bQkJZGF0dW07CisJ CWJvb2wJCWlzbnVsbDsKKworCQkvKiBJZ25vcmUgZ2VuZXJhdGVkIGNvbHVtbnM7IHRoZXkgYXJl IHNldCB0byBERUZBVUxUICovCisJCWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQpCisJCQljb250aW51 ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhidWYsICdc dCcpOworCQlmaXJzdCA9IGZhbHNlOworCisJCWRhdHVtID0gc2xvdF9nZXRhdHRyKHNsb3QsIGF0 dG51bSwgJmlzbnVsbCk7CisKKwkJaWYgKGlzbnVsbCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoYnVmLCAiXFxOIik7CisJCWVsc2UKKwkJeworCQkJY29uc3QgY2hhciAqdmFsdWUgPSBPdXRw dXRGdW5jdGlvbkNhbGwoJmZtc3RhdGUtPnBfZmxpbmZvW2ldLAorCQkJCQkJCQkJCQkJICAgZGF0 dW0pOworCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgdmFsdWUpOworCQl9CisJCWkr KzsKKwl9CisKKwlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJ1xuJyk7Cit9CmRpZmYg LS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGEyYmIxZmYzNTJjLi5mYzY5MjJkZGQ0ZiAx MDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKKysrIGIvY29u dHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTIwNCw2ICsyMDQsNyBAQCBleHRl cm4gdm9pZCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsCiAJ CQkJCQkJIGNoYXIgKm9yaWdfcXVlcnksIExpc3QgKnRhcmdldF9hdHRycywKIAkJCQkJCQkgaW50 IHZhbHVlc19lbmRfbGVuLCBpbnQgbnVtX3BhcmFtcywKIAkJCQkJCQkgaW50IG51bV9yb3dzKTsK K2V4dGVybiB2b2lkIGRlcGFyc2VDb3B5U3FsKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWws IExpc3QgKnRhcmdldF9hdHRycyk7CiBleHRlcm4gdm9pZCBkZXBhcnNlVXBkYXRlU3FsKFN0cmlu Z0luZm8gYnVmLCBSYW5nZVRibEVudHJ5ICpydGUsCiAJCQkJCQkJIEluZGV4IHJ0aW5kZXgsIFJl bGF0aW9uIHJlbCwKIAkJCQkJCQkgTGlzdCAqdGFyZ2V0QXR0cnMsCmRpZmYgLS1naXQgYS9jb250 cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IDcyZDJkOWMzMTFiLi45MDI0NmRkYmQwMiAx MDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysr IGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTE5MjksNiAr MTkyOSwzMyBAQCBzZWxlY3QgKiBmcm9tIGdsb2MxOwogc2VsZWN0ICogZnJvbSBncmVtMTsKIGRl bGV0ZSBmcm9tIGdyZW0xOwogCistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBh cyBhIHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworCitjcmVh dGUgZnVuY3Rpb24gaW5zZXJ0X29yX2NvcHkoKSByZXR1cm5zIHRyaWdnZXIgYXMgJCQKK2RlY2xh cmUgcXVlcnkgdGV4dDsKK2JlZ2luCisgICAgcXVlcnkgOj0gY3VycmVudF9xdWVyeSgpOworICAg IGlmIHF1ZXJ5IH4qICdeQ09QWScgdGhlbgorICAgICAgICByYWlzZSBub3RpY2UgJ0NPUFkgY29t bWFuZCc7CisgICAgZWxzaWYgcXVlcnkgfiogJ15JTlNFUlQnIHRoZW4KKyAgICAgICAgcmFpc2Ug bm90aWNlICdJTlNFUlQgY29tbWFuZCc7CisgICAgZW5kIGlmOworcmV0dXJuIG5ldzsKK2VuZDsK KyQkIGxhbmd1YWdlIHBscGdzcWw7CisKK0NSRUFURSBUUklHR0VSIHRyaWdfcm93X2JlZm9yZQor QkVGT1JFIElOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIE9OIGdsb2MxCitGT1IgRUFDSCBST1cg RVhFQ1VURSBQUk9DRURVUkUgaW5zZXJ0X29yX2NvcHkoKTsKKworY29weSBncmVtMSBmcm9tIHN0 ZGluOworMworXC4KKworZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBvbiBnbG9jMTsKK3Jl c2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CisKIC0tIHRlc3QgYmF0Y2ggaW5zZXJ0CiBhbHRlciBz ZXJ2ZXIgbG9vcGJhY2sgb3B0aW9ucyAoYWRkIGJhdGNoX3NpemUgJzEwJyk7CiBleHBsYWluICh2 ZXJib3NlLCBjb3N0cyBvZmYpCi0tIAoyLjUyLjAKCg== --b89e34de6cd2100d184774b126fe42ffec6e85da4a9d59ad42d56e4d8763--