Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qoKTu-000tbL-H5 for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Oct 2023 09:17:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qoKTs-00B0bC-4x for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Oct 2023 09:17:17 +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.94.2) (envelope-from ) id 1qoKTr-00B0aa-KA for pgsql-hackers@lists.postgresql.org; Thu, 05 Oct 2023 09:17:16 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qoKTp-00097S-IT for pgsql-hackers@lists.postgresql.org; Thu, 05 Oct 2023 09:17:15 +0000 Received: from [172.30.8.38] (unknown [172.30.8.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 13ABBE21010; Thu, 5 Oct 2023 12:17:10 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1696497432; bh=kPmE7joZ/wfs5Rxcj5sCTPoI5T2KihXWb2fo8BF2sTY=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=eD2DhIN54P1l4+KLvoPu1yzQ7MxsyknhV3mFW/1fsvjIhilkvtlYKtQwpt3oepnfh gL8whtIMgW9GRxtMGPCeHqLHEql/ptl5u0EQIQF3dfxLQbk+MSfbuyDHXX8Mvbbvns ZbINIagpkaCKWEgVpobanxbzxI+EoaVhRHr0kRy+69SB+eSO2lGZFbV7Q8zuN12Hk6 ChtgctW6ICJbqgrnuuVaEu8QZVCzO4AtDB+TkqCm/+QsDUjPH8mttlmud7BXfnRwRY RA7oruJgZRSF0Uzuss515de2Jzj2qclI1/qmC0r/6P/vZHHBLtY/JNeqWceKMWeHBk HtdtA2yLtW7Qw== Content-Type: multipart/mixed; boundary="------------kog10Zwq2pXWMSuANHei0WwY" Message-ID: <48c11b23-9c23-440e-9a3c-020e05196449@postgrespro.ru> Date: Thu, 5 Oct 2023 16:17:08 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Removing unneeded self joins Content-Language: en-US To: Alexander Korotkov Cc: "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=C5=82_K=C5=82eczek?= , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <2375492.jE0xQCEvom@aivenronan> <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> <20221206184643.zya44h5auv6f45zp@awork3.anarazel.de> <36579124-f9d9-a51e-38b3-af3511921c7e@postgrespro.ru> <88079CBD-B5BB-4C61-A68B-A8C67599E1C7@kleczek.org> <05469e80-454b-41d7-d04f-421f42bbd4a9@postgrespro.ru> From: Andrei Lepikhov Organization: Postgres Professional In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------kog10Zwq2pXWMSuANHei0WwY Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 4/10/2023 14:34, Alexander Korotkov wrote: > > Relid replacement machinery is the most contradictory code here. We used > > a utilitarian approach and implemented a simplistic variant. > > > > 2) It would be nice to skip the insertion of IS NOT NULL checks when > > > they are not necessary.  [1] points that infrastructure from [2] might > > > be useful.  The patchset from [2] seems committed mow.  However, I > > > can't see it is directly helpful in this matter.  Could we just skip > > > adding IS NOT NULL clause for the columns, that have > > > pg_attribute.attnotnull set? > > Thanks for the links, I will look into that case. To be more precise, in the attachment, you can find a diff to the main patch, which shows the volume of changes to achieve the desired behaviour. Some explains in regression tests shifted. So, I've made additional tests: DROP TABLE test CASCADE; CREATE TABLE test (a int, b int not null); CREATE UNIQUE INDEX abc ON test(b); explain SELECT * FROM test t1 JOIN test t2 ON (t1.a=t2.a) WHERE t1.b=t2.b; CREATE UNIQUE INDEX abc1 ON test(a,b); explain SELECT * FROM test t1 JOIN test t2 ON (t1.a=t2.a) WHERE t1.b=t2.b; explain SELECT * FROM test t1 JOIN test t2 ON (t1.a=t2.a) WHERE t1.b=t2.b AND (t1.a=t2.a OR t2.a=t1.a); DROP INDEX abc1; explain SELECT * FROM test t1 JOIN test t2 ON (t1.a=t2.a) WHERE t1.b=t2.b AND (t1.b=t2.b OR t2.b=t1.b); We have almost the results we wanted to have. But in the last explain you can see that nothing happened with the OR clause. We should use the expression mutator instead of walker to handle such clauses. But It doesn't process the RestrictInfo node ... I'm inclined to put a solution of this issue off for a while. -- regards, Andrey Lepikhov Postgres Professional --------------kog10Zwq2pXWMSuANHei0WwY Content-Type: text/plain; charset=UTF-8; name="check_attnotnull.diff" Content-Disposition: attachment; filename="check_attnotnull.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5j IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMKaW5kZXggYTEy NzIzOWQzMC4uYzEyYWExNWZjOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BsYW4vYW5hbHl6ZWpvaW5zLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4v YW5hbHl6ZWpvaW5zLmMKQEAgLTczLDcgKzczLDcgQEAgc3RhdGljIGJvb2wgaXNfaW5uZXJy ZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJICAgTGlzdCAqcmVz dHJpY3RsaXN0LAogCQkJCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CiBzdGF0aWMg Qml0bWFwc2V0ICpyZXBsYWNlX3JlbGlkKFJlbGlkcyByZWxpZHMsIGludCBvbGRJZCwgaW50 IG5ld0lkKTsKLXN0YXRpYyB2b2lkIHJlcGxhY2VfdmFybm8oTm9kZSAqbm9kZSwgaW50IGZy b20sIGludCB0byk7CitzdGF0aWMgdm9pZCByZXBsYWNlX3Zhcm5vKFBsYW5uZXJJbmZvICpy b290LCBOb2RlICpub2RlLCBpbnQgZnJvbSwgaW50IHRvKTsKIAogCiAvKgpAQCAtMzg4LDcg KzM4OCw3IEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeV9jb21tb24oUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJfQogCiAJCS8qIFVwZGF0ZSBsYXRlcmFsIHJlZmVy ZW5jZXMuICovCi0JCXJlcGxhY2VfdmFybm8oKE5vZGUgKikgb3RoZXJyZWwtPmxhdGVyYWxf dmFycywgcmVsaWQsIHN1YnN0KTsKKwkJcmVwbGFjZV92YXJubyhyb290LCAoTm9kZSAqKSBv dGhlcnJlbC0+bGF0ZXJhbF92YXJzLCByZWxpZCwgc3Vic3QpOwogCX0KIAogCS8qCkBAIC00 MjUsNyArNDI1LDcgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5X2NvbW1vbihQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQlzamluZi0+Y29tbXV0ZV9iZWxvd19sID0g cmVwbGFjZV9yZWxpZChzamluZi0+Y29tbXV0ZV9iZWxvd19sLCBvanJlbGlkLCBzdWJzdCk7 CiAJCXNqaW5mLT5jb21tdXRlX2JlbG93X3IgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5jb21t dXRlX2JlbG93X3IsIG9qcmVsaWQsIHN1YnN0KTsKIAotCQlyZXBsYWNlX3Zhcm5vKChOb2Rl ICopIHNqaW5mLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0KTsKKwkJcmVwbGFjZV92 YXJubyhyb290LCAoTm9kZSAqKSBzamluZi0+c2VtaV9yaHNfZXhwcnMsIHJlbGlkLCBzdWJz dCk7CiAJfQogCiAJLyoKQEAgLTEzOTksNiArMTM5OSw3IEBAIGlzX2lubmVycmVsX3VuaXF1 ZV9mb3IoUGxhbm5lckluZm8gKnJvb3QsCiAKIHR5cGVkZWYgc3RydWN0IFJlcGxhY2VWYXJu b0NvbnRleHQKIHsKKwlQbGFubmVySW5mbyAqcm9vdDsKIAlpbnQJZnJvbTsKIAlpbnQJdG87 CiB9IFJlcGxhY2VWYXJub0NvbnRleHQ7CkBAIC0xNDIwLDYgKzE0MjEsMTEgQEAgcmVwbGFj ZV92YXJub193YWxrZXIoTm9kZSAqbm9kZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQog CQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CisKKwkvKgorCSAqIEV4cHJlc3Npb24gd2Fsa2Vy IGRvZXNuJ3Qga25vdyBhYm91dCBSZXN0cmljdEluZm8gbm9kZS4gRG8gcmVjdXJzaXZlIHBh c3MKKwkgKiBpbnRvIHRoZSBjbGF1c2VzIG1hbnVhbGx5LgorCSAqLwogCWlmIChJc0Eobm9k ZSwgUmVzdHJpY3RJbmZvKSkKIAl7CiAJCVJlc3RyaWN0SW5mbyAgICpyaW5mbyA9IChSZXN0 cmljdEluZm8gKikgbm9kZTsKQEAgLTE0MjksMjAgKzE0MzUsMjYgQEAgcmVwbGFjZV92YXJu b193YWxrZXIoTm9kZSAqbm9kZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQogCiAJCWlm IChibXNfaXNfbWVtYmVyKGN0eC0+ZnJvbSwgcmluZm8tPmNsYXVzZV9yZWxpZHMpKQogCQl7 Ci0JCQlyZXBsYWNlX3Zhcm5vKChOb2RlICopIHJpbmZvLT5jbGF1c2UsIGN0eC0+ZnJvbSwg Y3R4LT50byk7Ci0JCQlyZXBsYWNlX3Zhcm5vKChOb2RlICopIHJpbmZvLT5vcmNsYXVzZSwg Y3R4LT5mcm9tLCBjdHgtPnRvKTsKLQkJCXJpbmZvLT5jbGF1c2VfcmVsaWRzID0gcmVwbGFj ZV9yZWxpZChyaW5mby0+Y2xhdXNlX3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKLQkJ CXJpbmZvLT5sZWZ0X3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQocmluZm8tPmxlZnRfcmVsaWRz LCBjdHgtPmZyb20sIGN0eC0+dG8pOwotCQkJcmluZm8tPnJpZ2h0X3JlbGlkcyA9IHJlcGxh Y2VfcmVsaWQocmluZm8tPnJpZ2h0X3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKwkJ CXJlcGxhY2VfdmFybm8oY3R4LT5yb290LCAoTm9kZSAqKSByaW5mby0+Y2xhdXNlLCBjdHgt PmZyb20sIGN0eC0+dG8pOworCQkJcmVwbGFjZV92YXJubyhjdHgtPnJvb3QsIChOb2RlICop IHJpbmZvLT5vcmNsYXVzZSwgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKwkJCXJpbmZvLT5jbGF1 c2VfcmVsaWRzID0KKwkJCQkJCXJlcGxhY2VfcmVsaWQocmluZm8tPmNsYXVzZV9yZWxpZHMs IGN0eC0+ZnJvbSwgY3R4LT50byk7CisJCQlyaW5mby0+bGVmdF9yZWxpZHMgPQorCQkJCQkJ cmVwbGFjZV9yZWxpZChyaW5mby0+bGVmdF9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50byk7 CisJCQlyaW5mby0+cmlnaHRfcmVsaWRzID0KKwkJCQkJCXJlcGxhY2VfcmVsaWQocmluZm8t PnJpZ2h0X3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKIAkJfQogCiAJCWlmIChpc19y ZXFfZXF1YWwpCiAJCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gcmluZm8tPmNsYXVzZV9y ZWxpZHM7CiAJCWVsc2UKLQkJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSByZXBsYWNlX3Jl bGlkKHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50byk7CisJCQly aW5mby0+cmVxdWlyZWRfcmVsaWRzID0KKwkJCQkJcmVwbGFjZV9yZWxpZChyaW5mby0+cmVx dWlyZWRfcmVsaWRzLCBjdHgtPmZyb20sIGN0eC0+dG8pOwogCi0JCXJpbmZvLT5vdXRlcl9y ZWxpZHMgPSByZXBsYWNlX3JlbGlkKHJpbmZvLT5vdXRlcl9yZWxpZHMsIGN0eC0+ZnJvbSwg Y3R4LT50byk7Ci0JCXJpbmZvLT5pbmNvbXBhdGlibGVfcmVsaWRzID0gcmVwbGFjZV9yZWxp ZChyaW5mby0+aW5jb21wYXRpYmxlX3JlbGlkcywgY3R4LT5mcm9tLCBjdHgtPnRvKTsKKwkJ cmluZm8tPm91dGVyX3JlbGlkcyA9CisJCQkJCQlyZXBsYWNlX3JlbGlkKHJpbmZvLT5vdXRl cl9yZWxpZHMsIGN0eC0+ZnJvbSwgY3R4LT50byk7CisJCXJpbmZvLT5pbmNvbXBhdGlibGVf cmVsaWRzID0KKwkJCQlyZXBsYWNlX3JlbGlkKHJpbmZvLT5pbmNvbXBhdGlibGVfcmVsaWRz LCBjdHgtPmZyb20sIGN0eC0+dG8pOwogCiAJCWlmIChyaW5mby0+bWVyZ2VvcGZhbWlsaWVz ICYmCiAJCQlibXNfZ2V0X3NpbmdsZXRvbl9tZW1iZXIocmluZm8tPmNsYXVzZV9yZWxpZHMs ICZyZWxpZCkgJiYKQEAgLTE0NTYsMTMgKzE0NjgsMzEgQEAgcmVwbGFjZV92YXJub193YWxr ZXIoTm9kZSAqbm9kZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQogCiAJCQlpZiAobGVm dE9wICE9IE5VTEwgJiYgZXF1YWwobGVmdE9wLCByaWdodE9wKSkKIAkJCXsKLQkJCQlOdWxs VGVzdCAgICpudGVzdCA9IG1ha2VOb2RlKE51bGxUZXN0KTsKKwkJCQlPaWQJCQlyZWxvaWQg PSAwOworCQkJCUF0dHJOdW1iZXIJYXR0bnVtOworCisJCQkJaWYgKElzQShsZWZ0T3AsIFZh cikpCisJCQkJeworCQkJCQlWYXIgKnZhciA9IChWYXIgKikgbGVmdE9wOworCQkJCQlyZWxv aWQgPSBjdHgtPnJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbdmFyLT52YXJub10tPnJlbGlkOwor CQkJCQlhdHRudW0gPSB2YXItPnZhcmF0dG5vOworCQkJCX0KKworCQkJCWlmIChPaWRJc1Zh bGlkKHJlbG9pZCkgJiYgZ2V0X2F0dG5vdG51bGwocmVsb2lkLCBhdHRudW0pKQorCQkJCXsK KwkJCQkJcmluZm8tPmNsYXVzZSA9IChFeHByICopIG1ha2VCb29sQ29uc3QodHJ1ZSwgZmFs c2UpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlOdWxsVGVzdCAgICpudGVzdCA9 IG1ha2VOb2RlKE51bGxUZXN0KTsKKworCQkJCQludGVzdC0+YXJnID0gbGVmdE9wOworCQkJ CQludGVzdC0+bnVsbHRlc3R0eXBlID0gSVNfTk9UX05VTEw7CisJCQkJCW50ZXN0LT5hcmdp c3JvdyA9IGZhbHNlOworCQkJCQludGVzdC0+bG9jYXRpb24gPSAtMTsKKwkJCQkJcmluZm8t PmNsYXVzZSA9IChFeHByICopIG50ZXN0OworCQkJCX0KIAotCQkJCW50ZXN0LT5hcmcgPSBs ZWZ0T3A7Ci0JCQkJbnRlc3QtPm51bGx0ZXN0dHlwZSA9IElTX05PVF9OVUxMOwotCQkJCW50 ZXN0LT5hcmdpc3JvdyA9IGZhbHNlOwotCQkJCW50ZXN0LT5sb2NhdGlvbiA9IC0xOwotCQkJ CXJpbmZvLT5jbGF1c2UgPSAoRXhwciAqKSBudGVzdDsKIAkJCQlyaW5mby0+bWVyZ2VvcGZh bWlsaWVzID0gTklMOwogCQkJfQogCQkJQXNzZXJ0KHJpbmZvLT5vcmNsYXVzZSA9PSBOVUxM KTsKQEAgLTE0NzcsMTMgKzE1MDcsMTQgQEAgcmVwbGFjZV92YXJub193YWxrZXIoTm9kZSAq bm9kZSwgUmVwbGFjZVZhcm5vQ29udGV4dCAqY3R4KQogICogUmVwbGFjZSBlYWNoIG9jY3Vy ZW5jZSBvZiByZW1vdmluZyByZWxpZCB3aXRoIHRoZSBrZWVwaW5nIG9uZQogICovCiBzdGF0 aWMgdm9pZAotcmVwbGFjZV92YXJubyhOb2RlICpub2RlLCBpbnQgZnJvbSAsIGludCB0bykK K3JlcGxhY2VfdmFybm8oUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKm5vZGUsIGludCBmcm9t ICwgaW50IHRvKQogewogCVJlcGxhY2VWYXJub0NvbnRleHQgY3R4OwogCiAJaWYgKHRvIDw9 IDApCiAJCXJldHVybjsKIAorCWN0eC5yb290ID0gcm9vdDsKIAljdHguZnJvbSA9IGZyb207 CiAJY3R4LnRvID0gdG87CiAJcmVwbGFjZV92YXJub193YWxrZXIobm9kZSwgJmN0eCk7CkBA IC0xNTMxLDcgKzE1NjIsNyBAQCByZXBsYWNlX3JlbGlkKFJlbGlkcyByZWxpZHMsIGludCBv bGRJZCwgaW50IG5ld0lkKQogICogZGVsZXRlIHRoZW0uCiAgKi8KIHN0YXRpYyB2b2lkCi11 cGRhdGVfZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBpbnQgZnJvbSwgaW50IHRvKQor dXBkYXRlX2VjbGFzcyhQbGFubmVySW5mbyAqcm9vdCwgRXF1aXZhbGVuY2VDbGFzcyAqZWMs IGludCBmcm9tLCBpbnQgdG8pCiB7CiAJTGlzdAkgICAqbmV3X21lbWJlcnMgPSBOSUw7CiAJ TGlzdAkgICAqbmV3X3NvdXJjZXMgPSBOSUw7CkBAIC0xNTUzLDcgKzE1ODQsNyBAQCB1cGRh dGVfZWNsYXNzKEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBpbnQgZnJvbSwgaW50IHRvKQogCQll bS0+ZW1famRvbWFpbi0+amRfcmVsaWRzID0gcmVwbGFjZV9yZWxpZChlbS0+ZW1famRvbWFp bi0+amRfcmVsaWRzLCBmcm9tLCB0byk7CiAKIAkJLyogV2Ugb25seSBwcm9jZXNzIGlubmVy IGpvaW5zICovCi0JCXJlcGxhY2VfdmFybm8oKE5vZGUgKikgZW0tPmVtX2V4cHIsIGZyb20s IHRvKTsKKwkJcmVwbGFjZV92YXJubyhyb290LCAoTm9kZSAqKSBlbS0+ZW1fZXhwciwgZnJv bSwgdG8pOwogCiAJCWZvcmVhY2gobGMxLCBuZXdfbWVtYmVycykKIAkJewpAQCAtMTU5MSw3 ICsxNjIyLDcgQEAgdXBkYXRlX2VjbGFzcyhFcXVpdmFsZW5jZUNsYXNzICplYywgaW50IGZy b20sIGludCB0bykKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJcmVwbGFjZV92YXJubygoTm9k ZSAqKSByaW5mbywgZnJvbSwgdG8pOworCQlyZXBsYWNlX3Zhcm5vKHJvb3QsIChOb2RlICop IHJpbmZvLCBmcm9tLCB0byk7CiAKIAkJLyoKIAkJICogQWZ0ZXIgc3dpdGNoaW5nIHRoZSBj bGF1c2UgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiwgY2hlY2sgaXQgZm9yCkBAIC0xNjg1 LDcgKzE3MTYsNyBAQCByZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwg UGxhblJvd01hcmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCiAJCVJlc3RyaWN0SW5m byAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKIAogCQlyZW1vdmVf am9pbl9jbGF1c2VfZnJvbV9yZWxzKHJvb3QsIHJpbmZvLCByaW5mby0+cmVxdWlyZWRfcmVs aWRzKTsKLQkJcmVwbGFjZV92YXJubygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUtPnJlbGlk LCB0b0tlZXAtPnJlbGlkKTsKKwkJcmVwbGFjZV92YXJubyhyb290LCAoTm9kZSAqKSByaW5m bywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKIAogCQlpZiAoYm1zX21lbWJl cnNoaXAocmluZm8tPnJlcXVpcmVkX3JlbGlkcykgPT0gQk1TX01VTFRJUExFKQogCQkJamlu Zm9fY2FuZGlkYXRlcyA9IGxhcHBlbmQoamluZm9fY2FuZGlkYXRlcywgcmluZm8pOwpAQCAt MTcwNCw3ICsxNzM1LDcgQEAgcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJv b3QsIFBsYW5Sb3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAogCXsKIAkJUmVz dHJpY3RJbmZvICAgKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBsYyk7CiAK LQkJcmVwbGFjZV92YXJubygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUtPnJlbGlkLCB0b0tl ZXAtPnJlbGlkKTsKKwkJcmVwbGFjZV92YXJubyhyb290LCAoTm9kZSAqKSByaW5mbywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKIAogCQlpZiAoYm1zX21lbWJlcnNoaXAo cmluZm8tPnJlcXVpcmVkX3JlbGlkcykgPT0gQk1TX01VTFRJUExFKQogCQkJamluZm9fY2Fu ZGlkYXRlcyA9IGxhcHBlbmQoamluZm9fY2FuZGlkYXRlcywgcmluZm8pOwpAQCAtMTc5Miw3 ICsxODIzLDcgQEAgcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3QsIFBs YW5Sb3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAogCXsKIAkJRXF1aXZhbGVu Y2VDbGFzcyAqZWMgPSAoRXF1aXZhbGVuY2VDbGFzcyAqKSBsaXN0X250aChyb290LT5lcV9j bGFzc2VzLCBpKTsKIAotCQl1cGRhdGVfZWNsYXNzKGVjLCB0b1JlbW92ZS0+cmVsaWQsIHRv S2VlcC0+cmVsaWQpOworCQl1cGRhdGVfZWNsYXNzKHJvb3QsIGVjLCB0b1JlbW92ZS0+cmVs aWQsIHRvS2VlcC0+cmVsaWQpOwogCQl0b0tlZXAtPmVjbGFzc19pbmRleGVzID0gYm1zX2Fk ZF9tZW1iZXIodG9LZWVwLT5lY2xhc3NfaW5kZXhlcywgaSk7CiAJfQogCkBAIC0xODA0LDcg KzE4MzUsNyBAQCByZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwgUGxh blJvd01hcmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCiAJewogCQlOb2RlICAgKm5v ZGUgPSBsZmlyc3QobGMpOwogCi0JCXJlcGxhY2VfdmFybm8obm9kZSwgdG9SZW1vdmUtPnJl bGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJcmVwbGFjZV92YXJubyhyb290LCBub2RlLCB0b1Jl bW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOwogCQlpZiAoIWxpc3RfbWVtYmVyKHRvS2Vl cC0+cmVsdGFyZ2V0LT5leHBycywgbm9kZSkpCiAJCQl0b0tlZXAtPnJlbHRhcmdldC0+ZXhw cnMgPSBsYXBwZW5kKHRvS2VlcC0+cmVsdGFyZ2V0LT5leHBycywgbm9kZSk7CiAJfQpAQCAt MTg1MSwxMCArMTg4MiwxMCBAQCByZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAq cm9vdCwgUGxhblJvd01hcmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCiAJLyogQXQg bGFzdCwgcmVwbGFjZSBsaW5rcyBpbiB0aGUgcGxhbm5lciBpbmZvICovCiAJcmVtb3ZlX3Jl bF9mcm9tX3F1ZXJ5X2NvbW1vbihyb290LCB0b1JlbW92ZSwgdG9LZWVwLT5yZWxpZCwgTlVM TCwgTlVMTCk7CiAJLyogcmVwbGFjZSB2YXJubyBpbiByb290IHRhcmdldGxpc3QgYW5kIEhB VklORyBjbGF1c2UgKi8KLQlyZXBsYWNlX3Zhcm5vKChOb2RlICopIHJvb3QtPnByb2Nlc3Nl ZF90bGlzdCwKLQkJCQkgICB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOwotCXJl cGxhY2VfdmFybm8oKE5vZGUgKikgcm9vdC0+cHJvY2Vzc2VkX2dyb3VwQ2xhdXNlLAotCQkJ CSAgIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJcmVwbGFjZV92YXJubyhy b290LCAoTm9kZSAqKSByb290LT5wcm9jZXNzZWRfdGxpc3QsCisJCQkJICB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCXJlcGxhY2VfdmFybm8ocm9vdCwgKE5vZGUgKikg cm9vdC0+cHJvY2Vzc2VkX2dyb3VwQ2xhdXNlLAorCQkJCSAgdG9SZW1vdmUtPnJlbGlkLCB0 b0tlZXAtPnJlbGlkKTsKIAkvKiAuLi4gYW5kIHJlbW92ZSB0aGUgcmVsIGZyb20gdGhlIGJh c2VyZWwgYXJyYXkgKi8KIAlyb290LT5zaW1wbGVfcmVsX2FycmF5W3RvUmVtb3ZlLT5yZWxp ZF0gPSBOVUxMOwogCXBmcmVlKHRvUmVtb3ZlKTsKQEAgLTE5MTQsNyArMTk0NSw4IEBAIHNw bGl0X3NlbGZqb2luX3F1YWxzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2lucXVhbHMs IExpc3QgKipzZWxmam9pbnF1YWxzLAogCQkgKiBRdWl0ZSBleHBlbnNpdmUgb3BlcmF0aW9u LCBuYXJyb3dpbmcgdGhlIHVzZSBjYXNlLiBGb3IgZXhhbXBsZSwgd2hlbgogCQkgKiB3ZSBo YXZlIGNhc3Qgb2YgdGhlIHNhbWUgdmFyIHRvIGRpZmZlcmVudCAoYnV0IGNvbXBhdGlibGUp IHR5cGVzLgogCQkgKi8KLQkJcmVwbGFjZV92YXJubyhyaWdodGV4cHIsIGJtc19zaW5nbGV0 b25fbWVtYmVyKHJpbmZvLT5yaWdodF9yZWxpZHMpLAorCQlyZXBsYWNlX3Zhcm5vKHJvb3Qs IHJpZ2h0ZXhwciwKKwkJCQkJICBibXNfc2luZ2xldG9uX21lbWJlcihyaW5mby0+cmlnaHRf cmVsaWRzKSwKIAkJCQkJICBibXNfc2luZ2xldG9uX21lbWJlcihyaW5mby0+bGVmdF9yZWxp ZHMpKTsKIAogCQlpZiAoZXF1YWwobGVmdGV4cHIsIHJpZ2h0ZXhwcikpCkBAIC0xOTU0LDcg KzE5ODYsNyBAQCBtYXRjaF91bmlxdWVfY2xhdXNlcyhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqb3V0ZXIsIExpc3QgKnVjbGF1c2VzLAogCQkJICAgYm1zX2lzX2VtcHR5KHJp bmZvLT5yaWdodF9yZWxpZHMpKTsKIAogCQljbGF1c2UgPSAoRXhwciAqKSBjb3B5T2JqZWN0 KHJpbmZvLT5jbGF1c2UpOwotCQlyZXBsYWNlX3Zhcm5vKChOb2RlICopIGNsYXVzZSwgcmVs aWQsIG91dGVyLT5yZWxpZCk7CisJCXJlcGxhY2VfdmFybm8ocm9vdCwgKE5vZGUgKikgY2xh dXNlLCByZWxpZCwgb3V0ZXItPnJlbGlkKTsKIAogCQlpY2xhdXNlID0gYm1zX2lzX2VtcHR5 KHJpbmZvLT5sZWZ0X3JlbGlkcykgPyBnZXRfcmlnaHRvcChjbGF1c2UpIDoKIAkJCQkJCQkJ CQkJCQkgZ2V0X2xlZnRvcChjbGF1c2UpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvY2FjaGUvbHN5c2NhY2hlLmMgYi9zcmMvYmFja2VuZC91dGlscy9jYWNoZS9sc3lzY2Fj aGUuYwppbmRleCBmYzZkMjY3ZTQ0Li43Nzc4ZWQ0ODNmIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC91dGlscy9jYWNoZS9sc3lzY2FjaGUuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9j YWNoZS9sc3lzY2FjaGUuYwpAQCAtOTI5LDYgKzkyOSwyNSBAQCBnZXRfYXR0Z2VuZXJhdGVk KE9pZCByZWxpZCwgQXR0ck51bWJlciBhdHRudW0pCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAor Y2hhcgorZ2V0X2F0dG5vdG51bGwoT2lkIHJlbGlkLCBBdHRyTnVtYmVyIGF0dG51bSkKK3sK KwlIZWFwVHVwbGUJdHA7CisJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0X3R1cDsKKwljaGFyCQly ZXN1bHQ7CisKKwl0cCA9IFNlYXJjaFN5c0NhY2hlMihBVFROVU0sCisJCQkJCQkgT2JqZWN0 SWRHZXREYXR1bShyZWxpZCksCisJCQkJCQkgSW50MTZHZXREYXR1bShhdHRudW0pKTsKKwlp ZiAoIUhlYXBUdXBsZUlzVmFsaWQodHApKQorCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3Vw IGZhaWxlZCBmb3IgYXR0cmlidXRlICVkIG9mIHJlbGF0aW9uICV1IiwKKwkJCSBhdHRudW0s IHJlbGlkKTsKKwlhdHRfdHVwID0gKEZvcm1fcGdfYXR0cmlidXRlKSBHRVRTVFJVQ1QodHAp OworCXJlc3VsdCA9IGF0dF90dXAtPmF0dG5vdG51bGw7CisJUmVsZWFzZVN5c0NhY2hlKHRw KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKgogICogZ2V0X2F0dHR5cGUKICAqCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9sc3lzY2FjaGUuaCBiL3NyYy9pbmNsdWRlL3V0 aWxzL2xzeXNjYWNoZS5oCmluZGV4IGY1ZmRiZmUxMTYuLjAyNTIxMjk5YTEgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL3V0aWxzL2xzeXNjYWNoZS5oCisrKyBiL3NyYy9pbmNsdWRlL3V0 aWxzL2xzeXNjYWNoZS5oCkBAIC05Miw2ICs5Miw3IEBAIGV4dGVybiBjaGFyICpnZXRfYXR0 bmFtZShPaWQgcmVsaWQsIEF0dHJOdW1iZXIgYXR0bnVtLCBib29sIG1pc3Npbmdfb2spOwog ZXh0ZXJuIEF0dHJOdW1iZXIgZ2V0X2F0dG51bShPaWQgcmVsaWQsIGNvbnN0IGNoYXIgKmF0 dG5hbWUpOwogZXh0ZXJuIGludAlnZXRfYXR0c3RhdHRhcmdldChPaWQgcmVsaWQsIEF0dHJO dW1iZXIgYXR0bnVtKTsKIGV4dGVybiBjaGFyIGdldF9hdHRnZW5lcmF0ZWQoT2lkIHJlbGlk LCBBdHRyTnVtYmVyIGF0dG51bSk7CitleHRlcm4gY2hhciBnZXRfYXR0bm90bnVsbChPaWQg cmVsaWQsIEF0dHJOdW1iZXIgYXR0bnVtKTsKIGV4dGVybiBPaWQJZ2V0X2F0dHR5cGUoT2lk IHJlbGlkLCBBdHRyTnVtYmVyIGF0dG51bSk7CiBleHRlcm4gdm9pZCBnZXRfYXR0dHlwZXR5 cG1vZGNvbGwoT2lkIHJlbGlkLCBBdHRyTnVtYmVyIGF0dG51bSwKIAkJCQkJCQkJICBPaWQg KnR5cGlkLCBpbnQzMiAqdHlwbW9kLCBPaWQgKmNvbGxpZCk7CmRpZmYgLS1naXQgYS9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAppbmRleCBkZTcxNDQxMDUyLi4zZDVkZTI4MzU0 IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0 CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKQEAgLTQz OCwxNSArNDM4LDE0IEBAIHNldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKIGV4cGxhaW4g KGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYg PSBuLmZmCiAgIGpvaW4gZWMxIHAgb24gbS5mZiArIG4uZmYgPSBwLmYxOwotICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBOZXN0 ZWQgTG9vcAogICAgSm9pbiBGaWx0ZXI6ICgobi5mZiArIG4uZmYpID0gcC5mMSkKLSAgIC0+ ICBTZXEgU2NhbiBvbiBlYzEgcAorICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCiAgICAtPiAg TWF0ZXJpYWxpemUKLSAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzAgbgotICAgICAgICAg ICAgICAgRmlsdGVyOiAoZmYgSVMgTk9UIE5VTEwpCi0oNiByb3dzKQorICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIGVjMSBwCisoNSByb3dzKQogCiBleHBsYWluIChjb3N0cyBvZmYpCiAg IHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgpAQCAtNDU1 LDExICs0NTQsMTAgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKQogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgTmVzdGVk IExvb3AKICAgIEpvaW4gRmlsdGVyOiAoKHAuZjEpOjpiaWdpbnQgPSAoKG4uZmYgKyBuLmZm KSk6OmludDhhbGlhczEpCi0gICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBTZXEg U2NhbiBvbiBlYzAgbgogICAgLT4gIE1hdGVyaWFsaXplCi0gICAgICAgICAtPiAgU2VxIFNj YW4gb24gZWMwIG4KLSAgICAgICAgICAgICAgIEZpbHRlcjogKGZmIElTIE5PVCBOVUxMKQot KDYgcm93cykKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzEgcAorKDUgcm93cykKIAog cmVzZXQgZW5hYmxlX21lcmdlam9pbjsKIC0tIHRoaXMgY291bGQgYmUgY29udmVydGVkLCBi dXQgaXNuJ3QgYXQgcHJlc2VudApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9qb2luLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5k ZXggMDI3YzM1NmJjYy4uMTBiMjM5NDRmZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pv aW4ub3V0CkBAIC02MzM3LDE0ICs2MzM3LDE0IEBAIFNFTEVDVCAqIEZST00gcGdfYW0gYW0g V0hFUkUgYW0uYW1uYW1lIElOICgKICAgICBKT0lOIHBnX2NsYXNzIGMyCiAgICAgT04gYzEu b2lkPWMyLm9pZCBBTkQgYzEub2lkIDwgMTAKICk7Ci0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIE5lc3RlZCBMb29wIFNlbWkg Sm9pbgogICAgSm9pbiBGaWx0ZXI6IChhbS5hbW5hbWUgPSBjMi5yZWxuYW1lKQogICAgLT4g IFNlcSBTY2FuIG9uIHBnX2FtIGFtCiAgICAtPiAgTWF0ZXJpYWxpemUKICAgICAgICAgIC0+ ICBJbmRleCBTY2FuIHVzaW5nIHBnX2NsYXNzX29pZF9pbmRleCBvbiBwZ19jbGFzcyBjMgot ICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKChvaWQgPCAnMTAnOjpvaWQpIEFORCAob2lk IElTIE5PVCBOVUxMKSkKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChvaWQgPCAnMTAn OjpvaWQpCiAoNiByb3dzKQogCiAtLQpAQCAtNjU5OSwxNCArNjU5OSwxNCBAQCBTRUxFQ1Qg Q09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCiBXSEVSRQogCShpc19mbGFnIElTIE5VTEwg T1IgaXNfZmxhZyA9IDApCiAJQU5EIGlkIElOIChTRUxFQ1QgaWQgRlJPTSB0YWJfd2l0aF9m bGFnIFdIRVJFIGlkIElOICgyLCAzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBBZ2dyZWdh dGUKICAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRoX2ZsYWcKLSAgICAgICAg IFJlY2hlY2sgQ29uZDogKChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkgQU5EIChp ZCBJUyBOT1QgTlVMTCkpCisgICAgICAgICBSZWNoZWNrIENvbmQ6IChpZCA9IEFOWSAoJ3sy LDN9Jzo6aW50ZWdlcltdKSkKICAgICAgICAgIEZpbHRlcjogKChpc19mbGFnIElTIE5VTEwp IE9SIChpc19mbGFnID0gMCkpCiAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g dGFiX3dpdGhfZmxhZ19wa2V5Ci0gICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKGlkID0g QU5ZICgnezIsM30nOjppbnRlZ2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkKKyAgICAg ICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkK ICg2IHJvd3MpCiAKIERST1AgVEFCTEUgdGFiX3dpdGhfZmxhZzsKQEAgLTY3NjQsMTEgKzY3 NjQsMTEgQEAgcmVzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdDsKIENSRUFURSBUQUJMRSBl bXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CiBleHBs YWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCiBTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEg ZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOwotICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBTZXEgU2NhbiBvbiBw dWJsaWMuZW1wMSBlMgogICAgT3V0cHV0OiBlMi5pZCwgZTIuY29kZSwgZTIuaWQsIGUyLmNv ZGUKLSAgIEZpbHRlcjogKChlMi5pZCBJUyBOT1QgTlVMTCkgQU5EIChlMi5jb2RlIDw+IGUy LmNvZGUpKQorICAgRmlsdGVyOiAoZTIuY29kZSA8PiBlMi5jb2RlKQogKDMgcm93cykKIAog LS0gV2UgY2FuIHJlbW92ZSB0aGUgam9pbiBldmVuIGlmIHdlIGZpbmQgdGhlIGpvaW4gY2Fu J3QgZHVwbGljYXRlIHJvd3MgYW5kCg== --------------kog10Zwq2pXWMSuANHei0WwY--