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 1thvmE-008j2u-BI for pgsql-hackers@arkaria.postgresql.org; Tue, 11 Feb 2025 19:18:34 +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 1thvmB-00Ed3v-Vd for pgsql-hackers@arkaria.postgresql.org; Tue, 11 Feb 2025 19:18: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.94.2) (envelope-from ) id 1thvmB-00Ed3l-IR for pgsql-hackers@lists.postgresql.org; Tue, 11 Feb 2025 19:18:31 +0000 Received: from forward500d.mail.yandex.net ([2a02:6b8:c41:1300:1:45:d181:d500]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1thvm7-000Itv-35 for pgsql-hackers@lists.postgresql.org; Tue, 11 Feb 2025 19:18:31 +0000 Received: from mail-nwsmtp-smtp-production-main-13.klg.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-13.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:86a3:0:640:3a48:0]) by forward500d.mail.yandex.net (Yandex) with ESMTPS id 62688614DA; Tue, 11 Feb 2025 22:18:24 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-13.klg.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id KIUaMo6OdqM0-X7ql63TB; Tue, 11 Feb 2025 22:18:23 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1739301503; bh=RvQGoRoWF3l5ch40bGyMMkRDGAFzMZcS2Fk/Jlk7P/k=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=kdCEjPcZPCZdy7OOgxogF+dL1lRcVDU1rkHFPMsHZf6qZJzQA9a3CWtYqXvS39D67 wQelYJxEpv4v9f8ElKHwGdh2E7YqRWjqQpJx3AhkOxTAPVJuzaTkAm56GqM+WrY0bv rrE88IufD7E+ozy7JOgY9lOLoqeuDDUvWFYWIF78= Authentication-Results: mail-nwsmtp-smtp-production-main-13.klg.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------45a3Vl4ugeFPoMpEcOdHqAtB" Message-ID: <9d06ca26-481a-4bab-a4f9-92e94385c11c@tantorlabs.com> Date: Tue, 11 Feb 2025 22:18:20 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: explain analyze rows=%.0f To: Robert Haas , Andrei Lepikhov Cc: Matheus Alcantara , Guillaume Lelarge , Daniel Gustafsson , Ibrar Ahmed , "Gregory Stark (as CFM)" , Tom Lane , Amit Kapila , Justin Pryzby , Peter Geoghegan , vignesh C , "David G. Johnston" , pgsql-hackers@lists.postgresql.org References: <55695d15-c738-4401-8883-58bc855c9b03@tantorlabs.com> <58bb3a5b-c92a-408c-b02a-f47aedc1c0e2@tantorlabs.com> <70bc1af0-6910-4f71-84ba-fa02095fe9ba@tantorlabs.com> Content-Language: en-US From: Ilia Evdokimov 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. --------------45a3Vl4ugeFPoMpEcOdHqAtB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11.02.2025 20:41, Robert Haas wrote: > On Tue, Feb 11, 2025 at 12:14 PM Andrei Lepikhov wrote: >> I support the idea in general, but I believe it should be expanded to >> cover all cases of parameterised plan nodes. Each rescan iteration may >> produce a different number of tuples, and rounding can obscure important >> data. >> >> For example, consider five loops of a scan node: the first loop returns >> nine tuples, and each other - zero tuples. When we calculate the >> average, 9 divided by 5 equals 1.8. This results in an explanation that >> indicates "rows = 1," masking almost 40% of the data. >> >> Now, if we apply the same two loops but have a total of 900,000 tuples, >> then 400,000 masked tuples represent a significant portion of the data. >> >> Moreover, switching to a floating-point type for row explanations in >> each parameterised node would provide a more comprehensive view and add >> valuable information about the parameterisation of the node, which may >> not be immediately apparent. > I agree strongly with all of this. I believe we should just implement > what was agreed here: > > https://www.postgresql.org/message-id/21013.1243618236%40sss.pgh.pa.us > > Let's just display 2 fractional digits when nloops>1, else 0, and call it good. > Thank you for your review! With such example, it's hard to disagree with it. This would really add valuable information. Taking all opinions into account, I have updated the patch v8. I have also included a check for the case where there are only zeros after the decimal point. We do not want to clutter the rows with unnecessary zeros. -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------45a3Vl4ugeFPoMpEcOdHqAtB Content-Type: text/x-patch; charset=UTF-8; name="v8-0001-Clarify-display-of-rows-as-decimal-fractions.patch" Content-Disposition: attachment; filename*0="v8-0001-Clarify-display-of-rows-as-decimal-fractions.patch" Content-Transfer-Encoding: base64 RnJvbSBlMWE0NmQzZmE1YTRkMjBiNmVhNDcyOGIyYTM5NTVmMzc1NTM5Mjk1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IFR1ZSwgMTEgRmViIDIwMjUgMjI6MTI6NDEgKzAzMDAK U3ViamVjdDogW1BBVENIXSBDbGFyaWZ5IGRpc3BsYXkgb2Ygcm93cyBhcyBkZWNpbWFsIGZy YWN0aW9ucwoKV2hlbiBsb29wcyA+IDEsIHRoZSBhdmVyYWdlIHJvd3MgdmFsdWUgaXMgc2hv d24gYXMgZGVjaW1hbCBmcmFjdGlvbnMKd2l0aCB0d28gZGlnaXRzIGFmdGVyIHRoZSBkZWNp bWFsIHBvaW50IGluIEVYUExBSU4gQU5BTFlaRS4KLS0tCiBkb2Mvc3JjL3NnbWwvcGVyZm9y bS5zZ21sICAgICAgICAgICAgICAgICAgICAgfCAgMiArCiBzcmMvYmFja2VuZC9jb21tYW5k cy9leHBsYWluLmMgICAgICAgICAgICAgICAgfCA1NSArKysrKysrKysrKysrLS0tLS0tCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9wcnVuZS5vdXQgfCAxOCArKyst LS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9wcnVuZS5zcWwgICAgICB8ICAy ICstCiA0IGZpbGVzIGNoYW5nZWQsIDUxIGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9wZXJmb3JtLnNnbWwgYi9kb2Mvc3JjL3Nn bWwvcGVyZm9ybS5zZ21sCmluZGV4IGE1MDJhMmFhYmEuLmEwMTgzMjA0MGMgMTAwNjQ0Ci0t LSBhL2RvYy9zcmMvc2dtbC9wZXJmb3JtLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3BlcmZv cm0uc2dtbApAQCAtNzU4LDYgKzc1OCw4IEBAIFdIRVJFIHQxLnVuaXF1ZTEgJmx0OyAxMCBB TkQgdDEudW5pcXVlMiA9IHQyLnVuaXF1ZTI7CiAgICAgdGhlIDxsaXRlcmFsPmxvb3BzPC9s aXRlcmFsPiB2YWx1ZSB0byBnZXQgdGhlIHRvdGFsIHRpbWUgYWN0dWFsbHkgc3BlbnQgaW4K ICAgICB0aGUgbm9kZS4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCB3ZSBzcGVudCBhIHRvdGFs IG9mIDAuMDMwIG1pbGxpc2Vjb25kcwogICAgIGV4ZWN1dGluZyB0aGUgaW5kZXggc2NhbnMg b24gPGxpdGVyYWw+dGVuazI8L2xpdGVyYWw+LgorICAgIElmIDxsaXRlcmFsPmxvb3BzPC9s aXRlcmFsPiBpcyBncmVhdGVyIHRoYW4gMSwKKyAgICB0aGUgPGxpdGVyYWw+cm93czwvbGl0 ZXJhbD4gaXMgc2hvd24gYXMgYSBkZWNpbWFsIHVubGVzcyBpdCdzIGFuIGludGVnZXIuCiAg ICA8L3BhcmE+CiAKICAgIDxwYXJhPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFu ZHMvZXhwbGFpbi5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCmluZGV4IGMy NGU2NmY4MmUuLmFlODFhZWVhMTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2V4cGxhaW4uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKQEAgLTEz LDYgKzEzLDggQEAKICAqLwogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNsdWRlIDxt YXRoLmg+CisKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgogI2luY2x1ZGUgImNhdGFsb2cv cGdfdHlwZS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL2NyZWF0ZWFzLmgiCkBAIC02OSw2ICs3 MSw5IEBAIHR5cGVkZWYgc3RydWN0IFNlcmlhbGl6ZU1ldHJpY3MKICAqLwogI2RlZmluZSBC WVRFU19UT19LSUxPQllURVMoYikgKCgoYikgKyAxMDIzKSAvIDEwMjQpCiAKKy8qIENoZWNr IGlmIGZsb2F0L2RvdWJsZSBoYXMgYW55IGRlY2ltYWwgbnVtYmVyICovCisjZGVmaW5lIEhB U19ERUNJTUFMKHgpIChmbG9vcih4KSAhPSB4KQorCiBzdGF0aWMgdm9pZCBFeHBsYWluT25l UXVlcnkoUXVlcnkgKnF1ZXJ5LCBpbnQgY3Vyc29yT3B0aW9ucywKIAkJCQkJCQlJbnRvQ2xh dXNlICppbnRvLCBFeHBsYWluU3RhdGUgKmVzLAogCQkJCQkJCVBhcnNlU3RhdGUgKnBzdGF0 ZSwgUGFyYW1MaXN0SW5mbyBwYXJhbXMpOwpAQCAtMTk4MSwxNCArMTk4NiwxNSBAQCBFeHBs YWluTm9kZShQbGFuU3RhdGUgKnBsYW5zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAogCiAJCWlm IChlcy0+Zm9ybWF0ID09IEVYUExBSU5fRk9STUFUX1RFWFQpCiAJCXsKKwkJCWFwcGVuZFN0 cmluZ0luZm8oZXMtPnN0ciwgIiAoYWN0dWFsICIpOworCiAJCQlpZiAoZXMtPnRpbWluZykK LQkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsCi0JCQkJCQkJCSAiIChhY3R1YWwgdGlt ZT0lLjNmLi4lLjNmIHJvd3M9JS4wZiBsb29wcz0lLjBmKSIsCi0JCQkJCQkJCSBzdGFydHVw X21zLCB0b3RhbF9tcywgcm93cywgbmxvb3BzKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGVz LT5zdHIsICJ0aW1lPSUuM2YuLiUuM2YgIiwgc3RhcnR1cF9tcywgdG90YWxfbXMpOworCisJ CQlpZiAobmxvb3BzID4gMSAmJiBIQVNfREVDSU1BTChyb3dzKSkKKwkJCQlhcHBlbmRTdHJp bmdJbmZvKGVzLT5zdHIsICJyb3dzPSUuMmYgbG9vcHM9JS4wZikiLCByb3dzLCBubG9vcHMp OwogCQkJZWxzZQotCQkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwKLQkJCQkJCQkJICIg KGFjdHVhbCByb3dzPSUuMGYgbG9vcHM9JS4wZikiLAotCQkJCQkJCQkgcm93cywgbmxvb3Bz KTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJyb3dzPSUuMGYgbG9vcHM9JS4w ZikiLCByb3dzLCBubG9vcHMpOwogCQl9CiAJCWVsc2UKIAkJewpAQCAtMTk5OSw4ICsyMDA1 LDE2IEBAIEV4cGxhaW5Ob2RlKFBsYW5TdGF0ZSAqcGxhbnN0YXRlLCBMaXN0ICphbmNlc3Rv cnMsCiAJCQkJRXhwbGFpblByb3BlcnR5RmxvYXQoIkFjdHVhbCBUb3RhbCBUaW1lIiwgIm1z IiwgdG90YWxfbXMsCiAJCQkJCQkJCQkgMywgZXMpOwogCQkJfQotCQkJRXhwbGFpblByb3Bl cnR5RmxvYXQoIkFjdHVhbCBSb3dzIiwgTlVMTCwgcm93cywgMCwgZXMpOwotCQkJRXhwbGFp blByb3BlcnR5RmxvYXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29wcywgMCwgZXMpOwor CQkJaWYgKG5sb29wcyA+IDEgJiYgSEFTX0RFQ0lNQUwocm93cykpCisJCQl7CisJCQkJRXhw bGFpblByb3BlcnR5RmxvYXQoIkFjdHVhbCBSb3dzIiwgTlVMTCwgcm93cywgMiwgZXMpOwor CQkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgTG9vcHMiLCBOVUxMLCBubG9vcHMs IDAsIGVzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFeHBsYWluUHJvcGVydHlGbG9h dCgiQWN0dWFsIFJvd3MiLCBOVUxMLCByb3dzLCAwLCBlcyk7CisJCQkJRXhwbGFpblByb3Bl cnR5RmxvYXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29wcywgMCwgZXMpOworCQkJfQog CQl9CiAJfQogCWVsc2UgaWYgKGVzLT5hbmFseXplKQpAQCAtMjA1MiwxNCArMjA2NiwxNCBA QCBFeHBsYWluTm9kZShQbGFuU3RhdGUgKnBsYW5zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAog CQkJaWYgKGVzLT5mb3JtYXQgPT0gRVhQTEFJTl9GT1JNQVRfVEVYVCkKIAkJCXsKIAkJCQlF eHBsYWluSW5kZW50VGV4dChlcyk7CisJCQkJYXBwZW5kU3RyaW5nSW5mbyhlcy0+c3RyLCAi YWN0dWFsICIpOwogCQkJCWlmIChlcy0+dGltaW5nKQotCQkJCQlhcHBlbmRTdHJpbmdJbmZv KGVzLT5zdHIsCi0JCQkJCQkJCQkgImFjdHVhbCB0aW1lPSUuM2YuLiUuM2Ygcm93cz0lLjBm IGxvb3BzPSUuMGZcbiIsCi0JCQkJCQkJCQkgc3RhcnR1cF9tcywgdG90YWxfbXMsIHJvd3Ms IG5sb29wcyk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwgInRpbWU9JS4zZi4u JS4zZiIsIHN0YXJ0dXBfbXMsIHRvdGFsX21zKTsKKworCQkJCWlmIChubG9vcHMgPiAxICYm IEhBU19ERUNJTUFMKHJvd3MpKQorCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJy b3dzPSUuMmYgbG9vcHM9JS4wZlxuIiwgcm93cywgbmxvb3BzKTsKIAkJCQllbHNlCi0JCQkJ CWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwKLQkJCQkJCQkJCSAiYWN0dWFsIHJvd3M9JS4w ZiBsb29wcz0lLjBmXG4iLAotCQkJCQkJCQkJIHJvd3MsIG5sb29wcyk7CisJCQkJCWFwcGVu ZFN0cmluZ0luZm8oZXMtPnN0ciwgInJvd3M9JS4wZiBsb29wcz0lLjBmXG4iLCByb3dzLCBu bG9vcHMpOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtMjA3MCw4ICsyMDg0LDE3IEBAIEV4 cGxhaW5Ob2RlKFBsYW5TdGF0ZSAqcGxhbnN0YXRlLCBMaXN0ICphbmNlc3RvcnMsCiAJCQkJ CUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgVG90YWwgVGltZSIsICJtcyIsCiAJCQkJ CQkJCQkJIHRvdGFsX21zLCAzLCBlcyk7CiAJCQkJfQotCQkJCUV4cGxhaW5Qcm9wZXJ0eUZs b2F0KCJBY3R1YWwgUm93cyIsIE5VTEwsIHJvd3MsIDAsIGVzKTsKLQkJCQlFeHBsYWluUHJv cGVydHlGbG9hdCgiQWN0dWFsIExvb3BzIiwgTlVMTCwgbmxvb3BzLCAwLCBlcyk7CisKKwkJ CQlpZiAobmxvb3BzID4gMSAmJiBIQVNfREVDSU1BTChyb3dzKSkKKwkJCQl7CisJCQkJCUV4 cGxhaW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgUm93cyIsIE5VTEwsIHJvd3MsIDIsIGVzKTsK KwkJCQkJRXhwbGFpblByb3BlcnR5RmxvYXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29w cywgMCwgZXMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlFeHBsYWluUHJvcGVy dHlGbG9hdCgiQWN0dWFsIFJvd3MiLCBOVUxMLCByb3dzLCAwLCBlcyk7CisJCQkJCUV4cGxh aW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgTG9vcHMiLCBOVUxMLCBubG9vcHMsIDAsIGVzKTsK KwkJCQl9CiAJCQl9CiAKIAkJCUV4cGxhaW5DbG9zZVdvcmtlcihuLCBlcyk7CmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9wcnVuZS5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9wcnVuZS5vdXQKaW5kZXggZTY2 NzUwM2M5Ni4uZmRlNDRkYjFhMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9wYXJ0aXRpb25fcHJ1bmUub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvcGFydGl0aW9uX3BydW5lLm91dApAQCAtMjM2Nyw3ICsyMzY3LDcgQEAgYmVnaW4KICAg ICAgICAgICAgICQxKQogICAgIGxvb3AKICAgICAgICAgbG4gOj0gcmVnZXhwX3JlcGxhY2Uo bG4sICdXb3JrZXJzIExhdW5jaGVkOiBcZCsnLCAnV29ya2VycyBMYXVuY2hlZDogTicpOwot ICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShsbiwgJ2FjdHVhbCByb3dzPVxkKyBsb29w cz1cZCsnLCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CisgICAgICAgIGxuIDo9IHJlZ2V4 cF9yZXBsYWNlKGxuLCAnYWN0dWFsIHJvd3M9XGQrKD86XC5cZCspPyBsb29wcz1cZCsnLCAn YWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CiAgICAgICAgIGxuIDo9IHJlZ2V4cF9yZXBsYWNl KGxuLCAnUm93cyBSZW1vdmVkIGJ5IEZpbHRlcjogXGQrJywgJ1Jvd3MgUmVtb3ZlZCBieSBG aWx0ZXI6IE4nKTsKICAgICAgICAgcmV0dXJuIG5leHQgbG47CiAgICAgZW5kIGxvb3A7CkBA IC0zMDQ5LDE0ICszMDQ5LDE0IEBAIG9yZGVyIGJ5IHRibDEuY29sMSwgdHBydC5jb2wxOwog aW5zZXJ0IGludG8gdGJsMSB2YWx1ZXMgKDEwMDEpLCAoMTAxMCksICgxMDExKTsKIGV4cGxh aW4gKGFuYWx5emUsIGNvc3RzIG9mZiwgc3VtbWFyeSBvZmYsIHRpbWluZyBvZmYsIGJ1ZmZl cnMgb2ZmKQogc2VsZWN0ICogZnJvbSB0YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0YmwxLmNv bDEgPiB0cHJ0LmNvbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogIE5lc3RlZCBMb29wIChhY3R1YWwgcm93cz0yMyBsb29wcz0xKQogICAgLT4gIFNlcSBT Y2FuIG9uIHRibDEgKGFjdHVhbCByb3dzPTUgbG9vcHM9MSkKLSAgIC0+ICBBcHBlbmQgKGFj dHVhbCByb3dzPTUgbG9vcHM9NSkKKyAgIC0+ICBBcHBlbmQgKGFjdHVhbCByb3dzPTQuNjAg bG9vcHM9NSkKICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRwcnQxX2lkeCBvbiB0 cHJ0XzEgKGFjdHVhbCByb3dzPTIgbG9vcHM9NSkKICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6IChjb2wxIDwgdGJsMS5jb2wxKQotICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg dHBydDJfaWR4IG9uIHRwcnRfMiAoYWN0dWFsIHJvd3M9MyBsb29wcz00KQorICAgICAgICAg LT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDJfaWR4IG9uIHRwcnRfMiAoYWN0dWFsIHJvd3M9 Mi43NSBsb29wcz00KQogICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGNvbDEgPCB0Ymwx LmNvbDEpCiAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0cHJ0M19pZHggb24gdHBy dF8zIChhY3R1YWwgcm93cz0xIGxvb3BzPTIpCiAgICAgICAgICAgICAgICBJbmRleCBDb25k OiAoY29sMSA8IHRibDEuY29sMSkKQEAgLTMwNzAsMTYgKzMwNzAsMTYgQEAgc2VsZWN0ICog ZnJvbSB0YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0YmwxLmNvbDEgPiB0cHJ0LmNvbDE7CiAK IGV4cGxhaW4gKGFuYWx5emUsIGNvc3RzIG9mZiwgc3VtbWFyeSBvZmYsIHRpbWluZyBvZmYs IGJ1ZmZlcnMgb2ZmKQogc2VsZWN0ICogZnJvbSB0YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0 YmwxLmNvbDEgPSB0cHJ0LmNvbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogIE5lc3RlZCBMb29wIChhY3R1YWwgcm93cz0zIGxvb3BzPTEpCiAgICAtPiAg U2VxIFNjYW4gb24gdGJsMSAoYWN0dWFsIHJvd3M9NSBsb29wcz0xKQotICAgLT4gIEFwcGVu ZCAoYWN0dWFsIHJvd3M9MSBsb29wcz01KQorICAgLT4gIEFwcGVuZCAoYWN0dWFsIHJvd3M9 MC42MCBsb29wcz01KQogICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDFfaWR4 IG9uIHRwcnRfMSAobmV2ZXIgZXhlY3V0ZWQpCiAgICAgICAgICAgICAgICBJbmRleCBDb25k OiAoY29sMSA9IHRibDEuY29sMSkKICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRw cnQyX2lkeCBvbiB0cHJ0XzIgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKICAgICAgICAgICAg ICAgIEluZGV4IENvbmQ6IChjb2wxID0gdGJsMS5jb2wxKQotICAgICAgICAgLT4gIEluZGV4 IFNjYW4gdXNpbmcgdHBydDNfaWR4IG9uIHRwcnRfMyAoYWN0dWFsIHJvd3M9MCBsb29wcz0z KQorICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDNfaWR4IG9uIHRwcnRfMyAo YWN0dWFsIHJvd3M9MC4zMyBsb29wcz0zKQogICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KGNvbDEgPSB0YmwxLmNvbDEpCiAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0cHJ0 NF9pZHggb24gdHBydF80IChuZXZlciBleGVjdXRlZCkKICAgICAgICAgICAgICAgIEluZGV4 IENvbmQ6IChjb2wxID0gdGJsMS5jb2wxKQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvcGFydGl0aW9uX3BydW5lLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRp dGlvbl9wcnVuZS5zcWwKaW5kZXggNzMwNTQ1ZTg2YS4uNTg3NTZlMGIxOCAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3BydW5lLnNxbAorKysgYi9zcmMv dGVzdC9yZWdyZXNzL3NxbC9wYXJ0aXRpb25fcHJ1bmUuc3FsCkBAIC01ODYsNyArNTg2LDcg QEAgYmVnaW4KICAgICAgICAgICAgICQxKQogICAgIGxvb3AKICAgICAgICAgbG4gOj0gcmVn ZXhwX3JlcGxhY2UobG4sICdXb3JrZXJzIExhdW5jaGVkOiBcZCsnLCAnV29ya2VycyBMYXVu Y2hlZDogTicpOwotICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShsbiwgJ2FjdHVhbCBy b3dzPVxkKyBsb29wcz1cZCsnLCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CisgICAgICAg IGxuIDo9IHJlZ2V4cF9yZXBsYWNlKGxuLCAnYWN0dWFsIHJvd3M9XGQrKD86XC5cZCspPyBs b29wcz1cZCsnLCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CiAgICAgICAgIGxuIDo9IHJl Z2V4cF9yZXBsYWNlKGxuLCAnUm93cyBSZW1vdmVkIGJ5IEZpbHRlcjogXGQrJywgJ1Jvd3Mg UmVtb3ZlZCBieSBGaWx0ZXI6IE4nKTsKICAgICAgICAgcmV0dXJuIG5leHQgbG47CiAgICAg ZW5kIGxvb3A7Ci0tIAoyLjM0LjEKCg== --------------45a3Vl4ugeFPoMpEcOdHqAtB--