Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eJl9U-0002B4-Lc for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Nov 2017 19:02:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eJl9T-00012y-Qr for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Nov 2017 19:02:39 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1eJl67-0004or-1y for pgsql-hackers@lists.postgresql.org; Tue, 28 Nov 2017 18:59:11 +0000 Received: from forward101j.mail.yandex.net ([2a02:6b8:0:801:2::101]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1eJl61-0000T8-DH for pgsql-hackers@postgresql.org; Tue, 28 Nov 2017 18:59:10 +0000 Received: from mxback6j.mail.yandex.net (mxback6j.mail.yandex.net [IPv6:2a02:6b8:0:1619::10f]) by forward101j.mail.yandex.net (Yandex) with ESMTP id AA2C6124690E for ; Tue, 28 Nov 2017 21:59:01 +0300 (MSK) Received: from web58j.yandex.ru (web58j.yandex.ru [2a02:6b8:0:1619::352]) by mxback6j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id AhFcLopPca-x0GahhBC; Tue, 28 Nov 2017 21:59:01 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zsrv.org; s=mail; t=1511895541; bh=cVS9SupY4vHJWseoeYLGtE2VTrfCymfzNRZ24U3wlX4=; h=From:To:Subject:Message-Id:Date; b=recYiAh8i/zSUOojp0LLt3ParvuVQXsSeVSF4YrUMkq+9/NdS8JSVW5Fo2GmWW4yR oX+Q3bP1JQth/Zw4+ZOfGoc+dfekLGYxeb3Q0++czNrM/AOzwWis0lbeDOenyz/mH9 5yAY8NiB4+U24qSrQxyKJ1V+m3hb3T25lrfqr1+Q= Authentication-Results: mxback6j.mail.yandex.net; dkim=pass header.i=@zsrv.org Received: by web58j.yandex.ru with HTTP; Tue, 28 Nov 2017 21:59:00 +0300 From: Sergei Kornilov To: pgsql-hackers@postgresql.org Subject: using index or check in ALTER TABLE SET NOT NULL MIME-Version: 1.0 Message-Id: <81911511895540@web58j.yandex.ru> X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Tue, 28 Nov 2017 21:59:00 +0300 Content-Type: multipart/mixed; boundary="----==--bound.8192.web58j.yandex.ru" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk ------==--bound.8192.web58j.yandex.ru Content-Transfer-Encoding: 7bit Content-Type: text/plain Hello I write patch to speed up ALTER TABLE SET NOT NULL by check existed check constraints or indexes. Huge phase 3 with verify table data will be skipped if table has valid check constraint cover "alteredfield IS NOT NULL" condition or by SPI query if found index with compatible condition or regular amsearchnulls index on processed field. Patch based on current master branch, i believe it has no platform-dependent code, of course code compiled and pass tests locally. Tell me please, what i forgot or make incorrectly. Implementation notes: I use existed PartConstraintImpliedByRelConstraint method to check relation constraints. But i rename original method to static ConstraintImpliedByRelConstraint (because method now used not only in partitions) and leave PartConstraintImpliedByRelConstraint as proxy to not change public API. I found it difficult to do index scan and choose index with lower costs if found many suitable indexes. Is it acceptable to use SPI here? Related archive discussions: https://www.postgresql.org/message-id/flat/530C10CF.4020101%40strangersgate.com https://www.postgresql.org/message-id/flat/CAASwCXdAK55BzuOy_FtYj2zQWg26PriDKL5pRoWiyFJe0eg-Hg%40mail.gmail.com Thanks! ------==--bound.8192.web58j.yandex.ru Content-Disposition: attachment; filename="alter_table_set_not_null_by_index_or_check_v1.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name="alter_table_set_not_null_by_index_or_check_v1.patch" ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jIGIvc3JjL2JhY2tl bmQvY29tbWFuZHMvdGFibGVjbWRzLmMKaW5kZXggZDk3OWNlMi4uNDI0ZjYwOCAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvdGFibGVjbWRzLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlICJjb21tYW5kcy90 eXBlY21kcy5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3VzZXIuaCIKICNpbmNsdWRlICJleGVjdXRv ci9leGVjdXRvci5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL3NwaS5oIgogI2luY2x1ZGUgImZvcmVp Z24vZm9yZWlnbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgIm5vZGVzL21h a2VmdW5jcy5oIgpAQCAtMzcwLDYgKzM3MSw4IEBAIHN0YXRpYyBPYmplY3RBZGRyZXNzIEFURXhl Y0Ryb3BOb3ROdWxsKFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwgTE9DS01PCiBz dGF0aWMgdm9pZCBBVFByZXBTZXROb3ROdWxsKFJlbGF0aW9uIHJlbCwgYm9vbCByZWN1cnNlLCBi b29sIHJlY3Vyc2luZyk7CiBzdGF0aWMgT2JqZWN0QWRkcmVzcyBBVEV4ZWNTZXROb3ROdWxsKEFs dGVyZWRUYWJsZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogCQkJCSBjb25zdCBjaGFyICpjb2xO YW1lLCBMT0NLTU9ERSBsb2NrbW9kZSk7CitzdGF0aWMgYm9vbCBpc1NldE5vdE51bGxOZWVkVGFi bGVTY2FuKFJlbGF0aW9uIHJlbCwgRm9ybV9wZ19hdHRyaWJ1dGUgYXR0cik7CitzdGF0aWMgYm9v bCBDb25zdHJhaW50SW1wbGllZEJ5UmVsQ29uc3RyYWludChSZWxhdGlvbiBzY2FucmVsLCBMaXN0 ICpwYXJ0Q29uc3RyYWludCk7CiBzdGF0aWMgT2JqZWN0QWRkcmVzcyBBVEV4ZWNDb2x1bW5EZWZh dWx0KFJlbGF0aW9uIHJlbCwgY29uc3QgY2hhciAqY29sTmFtZSwKIAkJCQkJTm9kZSAqbmV3RGVm YXVsdCwgTE9DS01PREUgbG9ja21vZGUpOwogc3RhdGljIE9iamVjdEFkZHJlc3MgQVRFeGVjQWRk SWRlbnRpdHkoUmVsYXRpb24gcmVsLCBjb25zdCBjaGFyICpjb2xOYW1lLApAQCAtNTg2Myw4ICs1 ODY2LDEwIEBAIEFURXhlY1NldE5vdE51bGwoQWx0ZXJlZFRhYmxlSW5mbyAqdGFiLCBSZWxhdGlv biByZWwsCiAKIAkJQ2F0YWxvZ1R1cGxlVXBkYXRlKGF0dHJfcmVsLCAmdHVwbGUtPnRfc2VsZiwg dHVwbGUpOwogCi0JCS8qIFRlbGwgUGhhc2UgMyBpdCBuZWVkcyB0byB0ZXN0IHRoZSBjb25zdHJh aW50ICovCi0JCXRhYi0+bmV3X25vdG51bGwgPSB0cnVlOworCQlpZiAoaXNTZXROb3ROdWxsTmVl ZFRhYmxlU2NhbihyZWwsIChGb3JtX3BnX2F0dHJpYnV0ZSkgR0VUU1RSVUNUKHR1cGxlKSkpIHsK KwkJCS8qIFRlbGwgUGhhc2UgMyBpdCBuZWVkcyB0byB0ZXN0IHRoZSBjb25zdHJhaW50ICovCisJ CQl0YWItPm5ld19ub3RudWxsID0gdHJ1ZTsKKwkJfQogCiAJCU9iamVjdEFkZHJlc3NTdWJTZXQo YWRkcmVzcywgUmVsYXRpb25SZWxhdGlvbklkLAogCQkJCQkJCVJlbGF0aW9uR2V0UmVsaWQocmVs KSwgYXR0bnVtKTsKQEAgLTU4ODAsNiArNTg4NSwxNDggQEAgQVRFeGVjU2V0Tm90TnVsbChBbHRl cmVkVGFibGVJbmZvICp0YWIsIFJlbGF0aW9uIHJlbCwKIAlyZXR1cm4gYWRkcmVzczsKIH0KIAor c3RhdGljIGJvb2wKK2lzU2V0Tm90TnVsbE5lZWRUYWJsZVNjYW4oUmVsYXRpb24gcmVsLCBGb3Jt X3BnX2F0dHJpYnV0ZSBhdHRyKQoreworCUxpc3QgICAgICAgKmluZGV4b2lkbGlzdDsKKwlMaXN0 Q2VsbCAgICppbmRleG9pZHNjYW47CisJYm9vbCAgICAgICBpc01hdGNoZWRJbmRleEZvdW5kID0g ZmFsc2U7CisJU3RyaW5nSW5mb0RhdGEgcXVlcnlidWY7CisJaW50ICAgICAgICBpbmRleEF0dHI7 CisJaW50ICAgICAgICBjaGVja0luZGV4QXR0ck51bTsKKworCS8vIHNhbWUgcGFydCBpbiBQYXJ0 Q29uc3RyYWludEltcGxpZWRCeVJlbENvbnN0cmFpbnQKKwlMaXN0ICAgICAgICpub3ROdWxsQ29u c3RyYWludCA9IE5JTDsKKwlOdWxsVGVzdCAgICpubnVsbHRlc3QgPSBtYWtlTm9kZShOdWxsVGVz dCk7CisJTGlzdCAgICAgICAqbnVsbENvbnN0cmFpbnQgPSBOSUw7CisJTnVsbFRlc3QgICAqbnRl c3QgPSBtYWtlTm9kZShOdWxsVGVzdCk7CisKKwlubnVsbHRlc3QtPmFyZyA9IChFeHByICopIG1h a2VWYXIoMSwKKwkJCQkgIGF0dHItPmF0dG51bSwKKwkJCQkgIGF0dHItPmF0dHR5cGlkLAorCQkJ CSAgYXR0ci0+YXR0dHlwbW9kLAorCQkJCSAgYXR0ci0+YXR0Y29sbGF0aW9uLAorCQkJCSAgMCk7 CisJbm51bGx0ZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OT1RfTlVMTDsKKworCS8qCisJICogYXJn aXNyb3c9ZmFsc2UgaXMgY29ycmVjdCBldmVuIGZvciBhIGNvbXBvc2l0ZSBjb2x1bW4sCisJICog YmVjYXVzZSBhdHRub3RudWxsIGRvZXMgbm90IHJlcHJlc2VudCBhIFNRTC1zcGVjIElTIE5PVAor CSAqIE5VTEwgdGVzdCBpbiBzdWNoIGEgY2FzZSwganVzdCBJUyBESVNUSU5DVCBGUk9NIE5VTEwu CisJICovCisJbm51bGx0ZXN0LT5hcmdpc3JvdyA9IGZhbHNlOworCW5udWxsdGVzdC0+bG9jYXRp b24gPSAtMTsKKwlub3ROdWxsQ29uc3RyYWludCA9IGxhcHBlbmQobm90TnVsbENvbnN0cmFpbnQs IG5udWxsdGVzdCk7CisKKwkvLyBmaXJzdCBjaGVjayBleGlzdGVkIGNvbnN0cmFpbnRzCisJaWYg KENvbnN0cmFpbnRJbXBsaWVkQnlSZWxDb25zdHJhaW50KHJlbCwgbm90TnVsbENvbnN0cmFpbnQp KSB7CisJCWVyZXBvcnQoREVCVUcxLAorCQkJKGVycm1zZygidmVyaWZ5aW5nIHRhYmxlIFwiJXNc IiBOT1QgTlVMTCBjb25zdHJhaW50ICIKKwkJCQkib24gJXMgYXR0cmlidXRlIGJ5IGV4aXN0ZWQg Y29uc3RyYWludHMiLAorCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSwgTmFtZVN0cihh dHRyLT5hdHRuYW1lKSkpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW50ZXN0LT5hcmcgPSAo RXhwciAqKSBtYWtlVmFyKDEsCisJCQkJICBhdHRyLT5hdHRudW0sCisJCQkJICBhdHRyLT5hdHR0 eXBpZCwKKwkJCQkgIGF0dHItPmF0dHR5cG1vZCwKKwkJCQkgIGF0dHItPmF0dGNvbGxhdGlvbiwK KwkJCQkgIDApOworCW50ZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OVUxMOworCisJLyoKKwkgKiBh cmdpc3Jvdz1mYWxzZSBpcyBjb3JyZWN0IGV2ZW4gZm9yIGEgY29tcG9zaXRlIGNvbHVtbiwKKwkg KiBiZWNhdXNlIGF0dG5vdG51bGwgZG9lcyBub3QgcmVwcmVzZW50IGEgU1FMLXNwZWMgSVMgTk9U CisJICogTlVMTCB0ZXN0IGluIHN1Y2ggYSBjYXNlLCBqdXN0IElTIERJU1RJTkNUIEZST00gTlVM TC4KKwkgKi8KKwludGVzdC0+YXJnaXNyb3cgPSBmYWxzZTsKKwludGVzdC0+bG9jYXRpb24gPSAt MTsKKwludWxsQ29uc3RyYWludCA9IGxhcHBlbmQobnVsbENvbnN0cmFpbnQsIG50ZXN0KTsKKwor CWluZGV4b2lkbGlzdCA9IFJlbGF0aW9uR2V0SW5kZXhMaXN0KHJlbCk7CisJZm9yZWFjaChpbmRl eG9pZHNjYW4sIGluZGV4b2lkbGlzdCkKKwl7CisJCU9pZAkJICAgICBpbmRleG9pZCA9IGxmaXJz dF9vaWQoaW5kZXhvaWRzY2FuKTsKKwkJUmVsYXRpb24JaW5kZXhSZWw7CisJCUZvcm1fcGdfaW5k ZXggaW5kZXhTdHJ1Y3Q7CisKKwkJaW5kZXhSZWwgPSBpbmRleF9vcGVuKGluZGV4b2lkLCBBY2Nl c3NTaGFyZUxvY2spOworCQlpbmRleFN0cnVjdCA9IGluZGV4UmVsLT5yZF9pbmRleDsKKworCQlp ZiAoSW5kZXhJc1ZhbGlkKGluZGV4U3RydWN0KSkKKwkJeworCQkJaWYgKFJlbGF0aW9uR2V0SW5k ZXhQcmVkaWNhdGUoaW5kZXhSZWwpICE9IE5JTCkgeworCQkJCWlmIChwcmVkaWNhdGVfaW1wbGll ZF9ieSgKKwkJCQkJUmVsYXRpb25HZXRJbmRleFByZWRpY2F0ZShpbmRleFJlbCksCisJCQkJCW51 bGxDb25zdHJhaW50LAorCQkJCQlmYWxzZQorCQkJCSkpIHsKKwkJCQkJLy8gcmVnYXJkbGVzcyBp bmRleGVkIGF0dHJpYnV0ZXMgd2UgY2FuIHVzZSB0aGlzIGluZGV4IGJ5IHByZWRpY2F0ZQorCQkJ CQlpc01hdGNoZWRJbmRleEZvdW5kID0gdHJ1ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGluZGV4 UmVsLT5yZF9hbXJvdXRpbmUtPmFtc2VhcmNobnVsbHMgJiYgaW5kZXhTdHJ1Y3QtPmluZG5hdHRz ID4gMCkgeworCQkJCWNoZWNrSW5kZXhBdHRyTnVtID0gKGluZGV4UmVsLT5yZF9hbXJvdXRpbmUt PmFtb3B0aW9uYWxrZXkgPyBpbmRleFN0cnVjdC0+aW5kbmF0dHMgOiAxKTsKKworCQkJCWZvciAo aW5kZXhBdHRyID0gMDsgaW5kZXhBdHRyIDwgY2hlY2tJbmRleEF0dHJOdW07ICsraW5kZXhBdHRy KSB7CisJCQkJCWlmIChhdHRyLT5hdHRudW0gPT0gaW5kZXhTdHJ1Y3QtPmluZGtleS52YWx1ZXNb IGluZGV4QXR0ciBdKSB7CisJCQkJCQkvLyBpbmRleCBoYXMgbm8gcHJlZGljYXRlIGFuZCBjb3Zl ciB0YXJnZXQgYXR0cmlidXRlCisJCQkJCQlpc01hdGNoZWRJbmRleEZvdW5kID0gdHJ1ZTsKKwkJ CQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGlzTWF0Y2hlZElu ZGV4Rm91bmQpIHsKKwkJCWVyZXBvcnQoREVCVUcxLAorCQkJCShlcnJtc2coInZlcmlmeWluZyB0 YWJsZSBcIiVzXCIgTk9UIE5VTEwgY29uc3RyYWludCAiCisJCQkJCSJvbiAlcyBhdHRyaWJ1dGUg YnkgaW5kZXgiLAorCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpLAorCQkJCQlOYW1l U3RyKGF0dHItPmF0dG5hbWUpKSkpOworCisJCQlpbml0U3RyaW5nSW5mbygmcXVlcnlidWYpOwor CQkJYXBwZW5kU3RyaW5nSW5mbygKKwkJCQkmcXVlcnlidWYsCisJCQkJIlNFTEVDVCAxIEZST00g JXMgV0hFUkUgJXMgSVMgTlVMTCBMSU1JVCAxIiwKKwkJCQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRp ZmllcigKKwkJCQkJZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkp LAorCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpCisJCQkJKSwKKwkJCQlxdW90ZV9p ZGVudGlmaWVyKE5hbWVTdHIoYXR0ci0+YXR0bmFtZSkpCisJCQkpOworCisJCQkvKiBPcGVuIFNQ SSBjb250ZXh0LiAqLworCQkJaWYgKFNQSV9jb25uZWN0KCkgIT0gU1BJX09LX0NPTk5FQ1QpCisJ CQkJZWxvZyhFUlJPUiwgIlNQSV9jb25uZWN0IGZhaWxlZCIpOworCQkJaWYgKFNQSV9leGVjdXRl KHF1ZXJ5YnVmLmRhdGEsIGZhbHNlLCAxKSAhPSBTUElfT0tfU0VMRUNUKQorCQkJCWVsb2coRVJS T1IsICJTUElfZXhlYyBmYWlsZWQ6ICVzIiwgcXVlcnlidWYuZGF0YSk7CisJCQlpZiAoU1BJX3By b2Nlc3NlZCA+IDApCisJCQl7CisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJS Q09ERV9OT1RfTlVMTF9WSU9MQVRJT04pLAorCQkJCQkgZXJybXNnKCJjb2x1bW4gXCIlc1wiIGNv bnRhaW5zIG51bGwgdmFsdWVzIiwKKwkJCQkJCQlOYW1lU3RyKGF0dHItPmF0dG5hbWUpKSwKKwkJ CQkJIGVycnRhYmxlY29sKHJlbCwgYXR0ci0+YXR0bnVtKSkpOworCQkJfQorCisJCQkvKiBDbG9z ZSBTUEkgY29udGV4dC4gKi8KKwkJCWlmIChTUElfZmluaXNoKCkgIT0gU1BJX09LX0ZJTklTSCkK KwkJCQllbG9nKEVSUk9SLCAiU1BJX2ZpbmlzaCBmYWlsZWQiKTsKKwkJfQorCisJCWluZGV4X2Ns b3NlKGluZGV4UmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCisJCWlmIChpc01hdGNoZWRJbmRleEZv dW5kKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWxpc3RfZnJlZShpbmRleG9pZGxpc3QpOwor CisJcmV0dXJuICEgaXNNYXRjaGVkSW5kZXhGb3VuZDsKK30KKwogLyoKICAqIEFMVEVSIFRBQkxF IEFMVEVSIENPTFVNTiBTRVQvRFJPUCBERUZBVUxUCiAgKgpAQCAtMTM2MjgsNiArMTM3NzUsMTMg QEAgYm9vbAogUGFydENvbnN0cmFpbnRJbXBsaWVkQnlSZWxDb25zdHJhaW50KFJlbGF0aW9uIHNj YW5yZWwsCiAJCQkJCQkJCQkgTGlzdCAqcGFydENvbnN0cmFpbnQpCiB7CisJcmV0dXJuIENvbnN0 cmFpbnRJbXBsaWVkQnlSZWxDb25zdHJhaW50KHNjYW5yZWwsIHBhcnRDb25zdHJhaW50KTsKK30K Kworc3RhdGljIGJvb2wKK0NvbnN0cmFpbnRJbXBsaWVkQnlSZWxDb25zdHJhaW50KFJlbGF0aW9u IHNjYW5yZWwsCisJCQkJCQkJCQkgTGlzdCAqcGFydENvbnN0cmFpbnQpCit7CiAJTGlzdAkgICAq ZXhpc3RDb25zdHJhaW50ID0gTklMOwogCVR1cGxlQ29uc3RyICpjb25zdHIgPSBSZWxhdGlvbkdl dERlc2NyKHNjYW5yZWwpLT5jb25zdHI7CiAJaW50CQkJbnVtX2NoZWNrLApkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hbHRlcl90YWJsZS5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2FsdGVyX3RhYmxlLm91dAppbmRleCAxMWYwYmFhLi4zOGMwMDdlIDEwMDY0 NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2FsdGVyX3RhYmxlLm91dAorKysgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2FsdGVyX3RhYmxlLm91dApAQCAtMTAwNSw2ICsxMDA1 LDE0IEBAIGFsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciB0ZXN0IHNldCBub3QgbnVsbDsKIEVSUk9S OiAgY29sdW1uICJ0ZXN0IiBjb250YWlucyBudWxsIHZhbHVlcwogZGVsZXRlIGZyb20gYXRhY2Mx OwogYWx0ZXIgdGFibGUgYXRhY2MxIGFsdGVyIHRlc3Qgc2V0IG5vdCBudWxsOworLS0gc2V0IG5v dCBudWxsIGNhbiB1c2UgaW5kZXgKK2NyZWF0ZSBpbmRleCBvbiBhdGFjYzEgKHRlc3QpOworYWx0 ZXIgdGFibGUgYXRhY2MxIGFsdGVyIGNvbHVtbiB0ZXN0IGRyb3Agbm90IG51bGw7CitpbnNlcnQg aW50byBhdGFjYzEgdmFsdWVzIChudWxsKTsKK2FsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciB0ZXN0 IHNldCBub3QgbnVsbDsKK0VSUk9SOiAgY29sdW1uICJ0ZXN0IiBjb250YWlucyBudWxsIHZhbHVl cworZGVsZXRlIGZyb20gYXRhY2MxOworYWx0ZXIgdGFibGUgYXRhY2MxIGFsdGVyIHRlc3Qgc2V0 IG5vdCBudWxsOwogLS0gdHJ5IGFsdGVyaW5nIGEgbm9uLWV4aXN0ZW50IGNvbHVtbiwgc2hvdWxk IGZhaWwKIGFsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciBiYXIgc2V0IG5vdCBudWxsOwogRVJST1I6 ICBjb2x1bW4gImJhciIgb2YgcmVsYXRpb24gImF0YWNjMSIgZG9lcyBub3QgZXhpc3QKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2FsdGVyX3RhYmxlLnNxbCBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2FsdGVyX3RhYmxlLnNxbAppbmRleCAwMmEzM2NhLi44YTFlMDA3IDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9hbHRlcl90YWJsZS5zcWwKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvYWx0ZXJfdGFibGUuc3FsCkBAIC03NjMsNiArNzYzLDE0IEBAIGFsdGVyIHRh YmxlIGF0YWNjMSBhbHRlciB0ZXN0IHNldCBub3QgbnVsbDsKIGRlbGV0ZSBmcm9tIGF0YWNjMTsK IGFsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciB0ZXN0IHNldCBub3QgbnVsbDsKIAorLS0gc2V0IG5v dCBudWxsIGNhbiB1c2UgaW5kZXgKK2NyZWF0ZSBpbmRleCBvbiBhdGFjYzEgKHRlc3QpOworYWx0 ZXIgdGFibGUgYXRhY2MxIGFsdGVyIGNvbHVtbiB0ZXN0IGRyb3Agbm90IG51bGw7CitpbnNlcnQg aW50byBhdGFjYzEgdmFsdWVzIChudWxsKTsKK2FsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciB0ZXN0 IHNldCBub3QgbnVsbDsKK2RlbGV0ZSBmcm9tIGF0YWNjMTsKK2FsdGVyIHRhYmxlIGF0YWNjMSBh bHRlciB0ZXN0IHNldCBub3QgbnVsbDsKKwogLS0gdHJ5IGFsdGVyaW5nIGEgbm9uLWV4aXN0ZW50 IGNvbHVtbiwgc2hvdWxkIGZhaWwKIGFsdGVyIHRhYmxlIGF0YWNjMSBhbHRlciBiYXIgc2V0IG5v dCBudWxsOwogYWx0ZXIgdGFibGUgYXRhY2MxIGFsdGVyIGJhciBkcm9wIG5vdCBudWxsOwo= ------==--bound.8192.web58j.yandex.ru--