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 1whJih-0009LZ-1D for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2026 04:17:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whJie-004huN-2q for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2026 04:17:09 +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 1whJie-004huF-1k for pgsql-hackers@lists.postgresql.org; Wed, 08 Jul 2026 04:17:09 +0000 Received: from mail-lj1-x230.google.com ([2a00:1450:4864:20::230]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1whJic-00000000AUp-2Yoi for pgsql-hackers@lists.postgresql.org; Wed, 08 Jul 2026 04:17:09 +0000 Received: by mail-lj1-x230.google.com with SMTP id 38308e7fff4ca-39c610a7ab9so1164351fa.1 for ; Tue, 07 Jul 2026 21:17:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783484226; cv=none; d=google.com; s=arc-20260327; b=BhsHpxdPdE5hDVwuWYoYwvtiOqWQhCaDBwdJE2GDuol4rgPvnOXJok4sQPW2Qtp135 KTgZ/2tbMutRbMX7ygXhH8L7jNx77+0v2qEiuIJ3BwvUnd5nx4OM91DpvE8SFob3N0U4 dO7szxAmYncfZlr2h/gfkSCM56Wj626tyxnY+qh9l2aeMdR6ANblYOFsF2+3pfgWuzLU d85sUb05ugiQdLYL1Mm4rz2gWMxTfLtH5WaHxJNjqN1kj4UBh5RJ3ZCMyJ6kilbEMpYv cEHRUCRYyIkv1yBXqqWvzqvIGQ8oPLmG/0aM8Ngj38QQA/y8ODCWjH7jPtvwk3AhYH1H 8rBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=id5j5UjqwZj0tXBtUcD9M3c1Yemu5tMfFZC6QT5fuFU=; fh=FXTnt9QNV6HlV2AYffuWDXCVf3Sr5ZIK9kSVwrz1wag=; b=n7qnTxJPpE3DDRf/LL3tQiueNevTjRpfg/HjfHvKmgWEoQCIWIOcbtj/g5TL1ldOnl +fXQ8ZGqROvu3Gf8H77wnuWyoZ8RcODs9Co2jOxdpNrBNXJS+JS/9mJRlIs7IP9SAuoE qjdP2HIpta1Mzdw2jreFUx2jfO2AV46sn7eRS2yFg5Vrhrzo1/axoiD43cDUMdXxcAXi 4n9R1nzAZ9GK8tERCEBkquHRkW+243KxRPs9Z1w+FBhd57JWBtlrVPNXL4D9N6sedYhr WqOe0WB5lpzP/n7td7Cn9wk5p8ZQmPb5xOawx6sxxA2yddcoJrXDOwntusUg6rGRrb0R 4gmQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783484226; x=1784089026; darn=lists.postgresql.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=id5j5UjqwZj0tXBtUcD9M3c1Yemu5tMfFZC6QT5fuFU=; b=BHmEoTaxuI/uZ97dbn1FDN7G07RSBpPbIVDmANbXeuIQ/BfnAGfRaT2sUGmH6bjIio ajg6xwenLmLVIegYkR2diyjuvfQm/ofeyBBdyNVgV8oTNk1ycX/4/x7TKZYg6d1yVqKr K2q16U1E8zv6fmJ68jfSRfvBNsbtVhLnIgCE2ZALrL2gFL86a7VNRy0sR57zyU9rARY+ +LH/XMOrgn6LJWe8n7AC8NGTIxfYKNcR1KCN6SsvDJAXIDsVUfd7F1fs6myZ5fU+tBnw z8VgBo1Bwd4LFlAEj17V45hMxxjSxeloglUmIg68drdEiV/UIernGKA9VTPRV1TSNIEB ns3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783484226; x=1784089026; h=content-type: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:content-type; bh=id5j5UjqwZj0tXBtUcD9M3c1Yemu5tMfFZC6QT5fuFU=; b=DLvTg4rXFNoDHYn4YVy91oNNvti8FnEdMemBdZtfauJvYZm4/E5pYkx5iX9Q47mkQS 04zuiukSfoJG9DJiyRCOwC98NpdmNFTkk7uCt/IxBVrESGvUJnj3/Hg1MurPqiJrZp/k tvRdos0eSkju/lp7iUatSw0Egf2zNPL0Gj+PBHmc24Z8+dyM/Scs5S5FNoMJONtTKQlo InKeFCELGZSOM+ZZ2dlDb++/i1wdgt+EROQklxUY4nvbAYU0kG05EeW8ep+GYi3ehx42 Mm3QPrM/HZH3XXbSPvZJzBOKqWVQX/4E3U04YfdqOBuTD+8OgGfWPgg1a8qibhtfQlhA 3ogA== X-Gm-Message-State: AOJu0YwRw9xEEabWxjXWAPrp/vwFk/Q9wlFZTt20ynxbSJ55+nObCKf7 B8ObQOUhYBQLDipHMpSmaNNnSH15pJEKgrhEP2GlpMRe6gtQReECOCe6baXEbIy6EqHSO1419yc vuDOA3TaHJYmEeovPrMi/MkgM6cW3hYY= X-Gm-Gg: AfdE7cmNzP6d2eNEfcxgRVwnilJMYJJHbM9yc3MDmSG+7IhKB+xZsPoLCb3gWvIHbbC DQ0hF7K6NNFSZsmv2LiNztTVe3ZHkxNVthiZMvpWYLUOrlAme8Ud+eN2+brqJ0OpfmMfvpVCHTq LEIGaRhEhE6nw3gK1UVnv/AOfOzSxTRj8Dx0G7F9d1s7v0rL4JqPwkHBD4fHkGa3yFWlVIWMGhO Zv0RNyFGaPa6V+W0bgPwpdXPWS8UKVGMFr/rtwF71UiiIe9rHZxV6phoHMkoime7n+fxsZ+Z808 NDnsuCt6dZSuF/RGBFBceGg1HCYWBlF6Z0EXmP4dWecidPBrPFycfv3fwp8dw7a0o7f7TH6KeLD /u2LDAV5TgpkQ X-Received: by 2002:a05:6512:1194:b0:5ae:aeea:c60a with SMTP id 2adb3069b0e04-5b01144eee6mr178706e87.11.1783484225611; Tue, 07 Jul 2026 21:17:05 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ewan Young Date: Wed, 8 Jul 2026 12:16:27 +0800 X-Gm-Features: AVVi8Cdfgpd0ZKp9Peu2ZFppiNRNi4k6oLYm7PStOkuiYZiCE6hcvnOzkpXEPbE Message-ID: Subject: Re: Reject ill-formed range bounds histograms in pg_restore_attribute_stats() To: Michael Paquier Cc: PostgreSQL Hackers , Corey Huinker Content-Type: multipart/mixed; boundary="000000000000bb0d98065611c729" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000bb0d98065611c729 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for looking! On Wed, Jul 8, 2026 at 10:17=E2=80=AFAM Michael Paquier wrote: > > On Tue, Jul 07, 2026 at 04:13:30PM +0800, Ewan Young wrote: > > The attached patch validates the bounds histogram at import time and > > rejects an ill-formed one with a WARNING, matching the treatment of the > > other inconsistent inputs. Because the histogram element type is a ran= ge > > for both range- and multirange-typed columns, the single check covers > > both. > > I have been looking at that, and while the consequences of buggy > inputs are minor when loaded back, I don't really mind putting more > defenses to inform about that at the front of the restore functions. > > Now, your patch is entirely blind about extended statistics; these can > also load histogram bounds. The function you are introducing to > filter the inputs provided could be reused in this secondary case, > just by moving to stat_utils.c. Done in v2. I moved the check to stat_utils.c as stats_check_bounds_histog= ram() and now call it from both pg_restore_attribute_stats() and pg_restore_extended_stats(). In the extended path I reject an ill-formed histogram the same way the sibling stakinds there already do =E2=80=94 WARN= ING plus goto pg_statistic_error. > > I am not really convinced that any of this stuff would be worth a > backpatch, even if it's non-invasive. We don't have guards for > buggy infinite values, even if using empty or unordered bounds feels > kind of a stupid thing to do if one is a table owner. Agreed =E2=80=94 v2 targets master only, no back-branch patches. > -- > Michael -- Regards, Ewan Young --000000000000bb0d98065611c729 Content-Type: application/x-patch; name="v2-0001-Reject-ill-formed-range-bounds-histograms-in-stat.patch" Content-Disposition: attachment; filename="v2-0001-Reject-ill-formed-range-bounds-histograms-in-stat.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrbj31g90 RnJvbSAxYjA2NjE0YmZkZjVkOTE3MDNjZmEzZWYxNjY2OTFmZWIwYjVkZGE0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFd2FuIFlvdW5nIDxrZGJhc2UuaGFja0BnbWFpbC5jb20+CkRh dGU6IFR1ZSwgNyBKdWwgMjAyNiAyMzo0MDozMCArMDgwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIFJl amVjdCBpbGwtZm9ybWVkIHJhbmdlIGJvdW5kcyBoaXN0b2dyYW1zIGluIHN0YXRzIGltcG9ydAog ZnVuY3Rpb25zCgpwZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cygpIGFuZCBwZ19yZXN0b3JlX2V4 dGVuZGVkX3N0YXRzKCkgKGFuZCB0aGVpcgpwZ19zZXRfKl9zdGF0cygpIGNvdW50ZXJwYXJ0cykg c3RvcmVkIGEgU1RBVElTVElDX0tJTkRfQk9VTkRTX0hJU1RPR1JBTQp2ZXJiYXRpbSwgd2l0aG91 dCBjaGVja2luZyB0aGUgaW52YXJpYW50IHRoYXQgQU5BTFlaRSdzCmNvbXB1dGVfcmFuZ2Vfc3Rh dHMoKSBndWFyYW50ZWVzOiB0aGUgaGlzdG9ncmFtIG11c3Qgbm90IGNvbnRhaW4gYW55CmVtcHR5 IHJhbmdlLCBhbmQgaXRzIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgbXVzdCBlYWNoIGFwcGVhciBp biBhc2NlbmRpbmcKb3JkZXIuICBUaGUgcmFuZ2UgYW5kIG11bHRpcmFuZ2Ugc2VsZWN0aXZpdHkg ZXN0aW1hdG9ycyByZWx5IG9uIHRoaXMuICBBbgp1bnNvcnRlZCBoaXN0b2dyYW0gbWFrZXMgY2Fs Y19sZW5ndGhfaGlzdF9mcmFjKCkgZmFpbCBhbiBhc3NlcnRpb24gKG9yCmNvbXB1dGUgYSBub25z ZW5zaWNhbCwgcG9zc2libHkgbmVnYXRpdmUsIHNlbGVjdGl2aXR5IG9uIGEgbm9uLWFzc2VydApi dWlsZCksIGFuZCBhbiBlbXB0eSByYW5nZSB0cmlwcyBhICJzaG91bGRuJ3QgaGFwcGVuIiBlbG9n KEVSUk9SKSwgd2hlbgp0aGUgcGxhbm5lciBsYXRlciByZWFkcyB0aGUgaW1wb3J0ZWQgc3RhdGlz dGljcy4gIEZvciBpbnN0YW5jZSwgYWZ0ZXIKaW1wb3J0aW5nIGFuIHVuc29ydGVkIGJvdW5kcyBo aXN0b2dyYW0sIGEgcXVlcnkgc3VjaCBhcyAiV0hFUkUgciA8QCAuLi4iCmNyYXNoZXMgdGhlIGJh Y2tlbmQgZHVyaW5nIHBsYW5uaW5nLgoKVmFsaWRhdGUgdGhlIGJvdW5kcyBoaXN0b2dyYW0gYXQg aW1wb3J0IHRpbWUgYW5kIHJlamVjdCBhbiBpbGwtZm9ybWVkIG9uZQp3aXRoIGEgV0FSTklORywg bGlrZSBvdGhlciBpbmNvbnNpc3RlbnQgaW5wdXRzLiAgVGhlIGNoZWNrIGxpdmVzIGluCnN0YXRf dXRpbHMuYyBzbyB0aGF0IGJvdGggdGhlIHBlci1hdHRyaWJ1dGUgYW5kIHRoZSBleHRlbmRlZC1z dGF0aXN0aWNzCmltcG9ydCBwYXRocywgd2hpY2ggY2FuIGJvdGggbG9hZCBhIGJvdW5kcyBoaXN0 b2dyYW0sIGNhbiBzaGFyZSBpdC4gIEl0CmNvdmVycyBib3RoIHJhbmdlLSBhbmQgbXVsdGlyYW5n ZS10eXBlZCBjb2x1bW5zLCB3aG9zZSBib3VuZHMgaGlzdG9ncmFtcwphcmUgYm90aCBhcnJheXMg b2YgcmFuZ2VzLgoKVGhpcyBpcyB0aGUgc2FtZSBjbGFzcyBvZiBwcm9ibGVtIGFzIGNvbW1pdCBm NmU0ZWMwYTcwNSwgd2hpY2ggcmVqZWN0ZWQKb3ZlcnNpemVkIE1DViBsaXN0cyBpbiBwZ19yZXN0 b3JlX2V4dGVuZGVkX3N0YXRzKCkuCi0tLQogc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1 dGVfc3RhdHMuYyAgICAgIHwgIDMgKy0KIHNyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRf c3RhdHNfZnVuY3MuYyB8ICAyICstCiBzcmMvYmFja2VuZC9zdGF0aXN0aWNzL3N0YXRfdXRpbHMu YyAgICAgICAgICAgfCA4OCArKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9zdGF0aXN0 aWNzL3N0YXRfdXRpbHMuaCAgICAgICAgICAgfCAgMiArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3N0YXRzX2ltcG9ydC5vdXQgICAgfCA1NiArKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jl c3Mvc3FsL3N0YXRzX2ltcG9ydC5zcWwgICAgICAgICB8IDM0ICsrKysrKysKIDYgZmlsZXMgY2hh bmdlZCwgMTgzIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVfc3RhdHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRp c3RpY3MvYXR0cmlidXRlX3N0YXRzLmMKaW5kZXggMWNjNGQ2NTcyMzEuLmNiMDM3NTM3NGIyIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2F0dHJpYnV0ZV9zdGF0cy5jCisrKyBi L3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvYXR0cmlidXRlX3N0YXRzLmMKQEAgLTQ4OCw3ICs0ODgs OCBAQCBhdHRyaWJ1dGVfc3RhdGlzdGljc191cGRhdGUoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8p CiAJCQkJCQkJCQkJCWF0dHR5cGlkLCBhdHR0eXBtb2QsCiAJCQkJCQkJCQkJCSZjb252ZXJ0ZWQp OwogCi0JCWlmIChjb252ZXJ0ZWQpCisJCWlmIChjb252ZXJ0ZWQgJiYKKwkJCXN0YXRzX2NoZWNr X2JvdW5kc19oaXN0b2dyYW0oc3RhdmFsdWVzKSkKIAkJewogCQkJc3RhdGF0dF9zZXRfc2xvdCh2 YWx1ZXMsIG51bGxzLCByZXBsYWNlcywKIAkJCQkJCQkgU1RBVElTVElDX0tJTkRfQk9VTkRTX0hJ U1RPR1JBTSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3Rh dHNfZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHNfZnVuY3Mu YwppbmRleCBhNWRjZThhMjIwNi4uZjY2ZTIzNjBkZjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHNfZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC9zdGF0 aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2Z1bmNzLmMKQEAgLTE0OTEsNyArMTQ5MSw3IEBAIGltcG9y dF9wZ19zdGF0aXN0aWMoUmVsYXRpb24gcGdzZCwgSnNvbmJDb250YWluZXIgKmNvbnQsCiAJCQkJ CQkJCSAgZXh0ZXhwcmFyZ25hbWVbUkFOR0VfQk9VTkRTX0hJU1RPR1JBTV9FTEVNXSwKIAkJCQkJ CQkJICAmdmFsX29rKTsKIAotCQlpZiAodmFsX29rKQorCQlpZiAodmFsX29rICYmIHN0YXRzX2No ZWNrX2JvdW5kc19oaXN0b2dyYW0oc3RhdmFsdWVzKSkKIAkJCXN0YXRhdHRfc2V0X3Nsb3QodmFs dWVzLCBudWxscywgcmVwbGFjZXMsCiAJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX0JPVU5EU19ISVNU T0dSQU0sCiAJCQkJCQkJIEludmFsaWRPaWQsIEludmFsaWRPaWQsCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9zdGF0aXN0aWNzL3N0YXRfdXRpbHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3Mv c3RhdF91dGlscy5jCmluZGV4IDBiMTkwZTg4MjM3Li4zMzY5YWMyZjE3MCAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvc3RhdGlzdGljcy9zdGF0X3V0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3Rh dGlzdGljcy9zdGF0X3V0aWxzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJ1dGlscy9h cnJheS5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5 c2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbHMvcmFuZ2V0eXBlcy5oIgogI2luY2x1ZGUgInV0aWxz L3JlbC5oIgogI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvdHlw Y2FjaGUuaCIKQEAgLTc0MiwzICs3NDMsOTAgQEAgc3RhdGF0dF9pbml0X2VtcHR5X3R1cGxlKE9p ZCByZWxvaWQsIGludDE2IGF0dG51bSwgYm9vbCBpbmhlcml0ZWQsCiAJCW51bGxzW0FudW1fcGdf c3RhdGlzdGljX3N0YWNvbGwxICsgc2xvdG51bSAtIDFdID0gZmFsc2U7CiAJfQogfQorCisvKgor ICogQ2hlY2sgdGhhdCBhbiBpbXBvcnRlZCBib3VuZHMgaGlzdG9ncmFtIChTVEFUSVNUSUNfS0lO RF9CT1VORFNfSElTVE9HUkFNKSBpcworICogd2VsbC1mb3JtZWQgdGhlIHdheSBBTkFMWVpFIGJ1 aWxkcyBpdCBpbiBjb21wdXRlX3JhbmdlX3N0YXRzKCk6IGl0IG11c3Qgbm90CisgKiBjb250YWlu IGFueSBlbXB0eSByYW5nZSwgYW5kIGJvdGggaXRzIGxvd2VyIGFuZCBpdHMgdXBwZXIgYm91bmRz IG11c3QgYXBwZWFyCisgKiBpbiBub24tZGVjcmVhc2luZyBvcmRlci4gIFRoZSByYW5nZSBhbmQg bXVsdGlyYW5nZSBzZWxlY3Rpdml0eSBlc3RpbWF0b3JzCisgKiByZWx5IG9uIHRoaXM6IHRoZXkg c3BsaXQgdGhlIGhpc3RvZ3JhbSBpbnRvIHNlcGFyYXRlIGxvd2VyLSBhbmQgdXBwZXItYm91bmQK KyAqIGhpc3RvZ3JhbXMgYW5kIGFzc3VtZSBlYWNoIGlzIHNvcnRlZCAoZS5nLiBjYWxjX2xlbmd0 aF9oaXN0X2ZyYWMoKSBBc3NlcnRzCisgKiB0aGF0IHN1Y2Nlc3NpdmUgYm91bmQgZGlzdGFuY2Vz IGRvIG5vdCBkZWNyZWFzZSwgYW5kIHRoZSBlc3RpbWF0b3IgdGhyb3dzIGFuCisgKiBpbnRlcm5h bCBlcnJvciBpZiBpdCBmaW5kcyBhbiBlbXB0eSByYW5nZSkuICBJbXBvcnRpbmcgYW4gdW5zb3J0 ZWQgb3IKKyAqIGVtcHR5LWNvbnRhaW5pbmcgaGlzdG9ncmFtIHdvdWxkIHRoZXJlZm9yZSBjcmFz aCB0aGUgYmFja2VuZCwgb3IgcHJvZHVjZQorICogbm9uc2Vuc2ljYWwgZXN0aW1hdGVzIG9uIG5v bi1hc3NlcnQgYnVpbGRzLCB3aGVuIHRoZSBoaXN0b2dyYW0gaXMgbGF0ZXIgcmVhZAorICogYnkg dGhlIHBsYW5uZXIuICBSZWplY3Qgc3VjaCBpbnB1dCB3aXRoIGEgV0FSTklORywgbGlrZSBvdGhl ciBpbmNvbnNpc3RlbnQKKyAqIGlucHV0cy4KKyAqCisgKiBUaGlzIGlzIHNoYXJlZCBiZXR3ZWVu IHRoZSBwZXItYXR0cmlidXRlIChwZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cygpKSBhbmQKKyAq IHRoZSBleHRlbmRlZC1zdGF0aXN0aWNzIChwZ19yZXN0b3JlX2V4dGVuZGVkX3N0YXRzKCkpIGlt cG9ydCBwYXRocywgYm90aCBvZgorICogd2hpY2ggY2FuIGxvYWQgYSBib3VuZHMgaGlzdG9ncmFt LgorICoKKyAqIEZvciBib3RoIHJhbmdlLSBhbmQgbXVsdGlyYW5nZS10eXBlZCBjb2x1bW5zIHRo ZSBoaXN0b2dyYW0gaXMgYW4gYXJyYXkgb2YKKyAqIHJhbmdlcywgc28gd2UgdGFrZSB0aGUgcmFu Z2UgdHlwZSBmcm9tIHRoZSBhcnJheSdzIGVsZW1lbnQgdHlwZS4KKyAqLworYm9vbAorc3RhdHNf Y2hlY2tfYm91bmRzX2hpc3RvZ3JhbShEYXR1bSBhcnJheXZhbCkKK3sKKwlBcnJheVR5cGUgICph cnIgPSBEYXR1bUdldEFycmF5VHlwZVAoYXJyYXl2YWwpOworCU9pZAkJCXJuZ3R5cGlkID0gQVJS X0VMRU1UWVBFKGFycik7CisJVHlwZUNhY2hlRW50cnkgKnR5cGNhY2hlOworCWludDE2CQllbG1s ZW47CisJYm9vbAkJZWxtYnl2YWw7CisJY2hhcgkJZWxtYWxpZ247CisJRGF0dW0JICAgKmVsZW1z OworCWJvb2wJICAgKm51bGxzOworCWludAkJCW5lbGVtczsKKwlSYW5nZUJvdW5kCXByZXZfbG93 ZXIgPSB7MH07CisJUmFuZ2VCb3VuZAlwcmV2X3VwcGVyID0gezB9OworCisJdHlwY2FjaGUgPSBs b29rdXBfdHlwZV9jYWNoZShybmd0eXBpZCwgVFlQRUNBQ0hFX1JBTkdFX0lORk8pOworCisJLyoK KwkgKiBUaGUgZWxlbWVudCB0eXBlIHNob3VsZCBhbHdheXMgYmUgYSByYW5nZSB0eXBlIGhlcmUs IGJ1dCBiZSBkZWZlbnNpdmU6CisJICogaWYgaXQgaXNuJ3QsIHRoZSBib3VuZHMgaGlzdG9ncmFt IGlzIG5ldmVyIGNvbnN1bHRlZCBieSB0aGUgcmFuZ2UKKwkgKiBlc3RpbWF0b3IsIHNvIHRoZXJl IGlzIG5vdGhpbmcgdG8gdmVyaWZ5LgorCSAqLworCWlmICh0eXBjYWNoZS0+cm5nZWxlbXR5cGUg PT0gTlVMTCkKKwkJcmV0dXJuIHRydWU7CisKKwlnZXRfdHlwbGVuYnl2YWxhbGlnbihybmd0eXBp ZCwgJmVsbWxlbiwgJmVsbWJ5dmFsLCAmZWxtYWxpZ24pOworCWRlY29uc3RydWN0X2FycmF5KGFy ciwgcm5ndHlwaWQsIGVsbWxlbiwgZWxtYnl2YWwsIGVsbWFsaWduLAorCQkJCQkgICZlbGVtcywg Jm51bGxzLCAmbmVsZW1zKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspCisJ eworCQlSYW5nZUJvdW5kCWxvd2VyLAorCQkJCQl1cHBlcjsKKwkJYm9vbAkJZW1wdHk7CisKKwkJ LyogTlVMTCBlbGVtZW50cyBhcmUgYWxyZWFkeSByZWplY3RlZCBieSBzdGF0YXR0X2J1aWxkX3N0 YXZhbHVlcygpICovCisJCXJhbmdlX2Rlc2VyaWFsaXplKHR5cGNhY2hlLCBEYXR1bUdldFJhbmdl VHlwZVAoZWxlbXNbaV0pLAorCQkJCQkJICAmbG93ZXIsICZ1cHBlciwgJmVtcHR5KTsKKworCQlp ZiAoZW1wdHkpCisJCXsKKwkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJKGVycmNvZGUoRVJSQ09E RV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJCSBlcnJtc2coIlwiJXNcIiBtdXN0IG5v dCBjb250YWluIGVtcHR5IHJhbmdlcyIsCisJCQkJCQkJInJhbmdlX2JvdW5kc19oaXN0b2dyYW0i KSkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGkgPiAwICYmCisJCQkocmFuZ2Vf Y21wX2JvdW5kcyh0eXBjYWNoZSwgJmxvd2VyLCAmcHJldl9sb3dlcikgPCAwIHx8CisJCQkgcmFu Z2VfY21wX2JvdW5kcyh0eXBjYWNoZSwgJnVwcGVyLCAmcHJldl91cHBlcikgPCAwKSkKKwkJewor CQkJZXJlcG9ydChXQVJOSU5HLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1F VEVSX1ZBTFVFKSwKKwkJCQkJIGVycm1zZygiXCIlc1wiIG11c3QgaGF2ZSBpdHMgbG93ZXIgYW5k IHVwcGVyIGJvdW5kcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIiwKKwkJCQkJCQkicmFuZ2Vf Ym91bmRzX2hpc3RvZ3JhbSIpKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlwcmV2X2xv d2VyID0gbG93ZXI7CisJCXByZXZfdXBwZXIgPSB1cHBlcjsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsK K30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdF91dGlscy5oIGIvc3Jj L2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0X3V0aWxzLmgKaW5kZXggNzRkYTc3OTA1NzkuLjlmNjE3 YTBmNDJiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRfdXRpbHMuaAor KysgYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRfdXRpbHMuaApAQCAtNTgsNCArNTgsNiBA QCBleHRlcm4gRGF0dW0gc3RhdGF0dF9idWlsZF9zdGF2YWx1ZXMoY29uc3QgY2hhciAqc3RhbmFt ZSwgRm1nckluZm8gKmFycmF5X2luLCBEYQogZXh0ZXJuIGJvb2wgc3RhdGF0dF9nZXRfZWxlbV90 eXBlKE9pZCBhdHR0eXBpZCwgY2hhciBhdHR0eXB0eXBlLAogCQkJCQkJCQkgIE9pZCAqZWxlbXR5 cGlkLCBPaWQgKmVsZW1fZXFfb3ByKTsKIAorZXh0ZXJuIGJvb2wgc3RhdHNfY2hlY2tfYm91bmRz X2hpc3RvZ3JhbShEYXR1bSBhcnJheXZhbCk7CisKICNlbmRpZgkJCQkJCQkvKiBTVEFUU19VVElM U19IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0YXRzX2ltcG9y dC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0YXRzX2ltcG9ydC5vdXQKaW5kZXgg YmZkZmY3N2FmYTcuLmQ0ZTUyNDdiMjJhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3N0YXRzX2ltcG9ydC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9z dGF0c19pbXBvcnQub3V0CkBAIC0xMTg3LDYgKzExODcsMzQgQEAgQU5EIGF0dG5hbWUgPSAnYXJh bmdlJzsKICBzdGF0c19pbXBvcnQgfCB0ZXN0ICAgICAgfCBhcmFuZ2UgIHwgZiAgICAgICAgIHwg ICAgICAwLjI5IHwgICAgICAgICAwIHwgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAg ICAgIHwgezM5OSw0OTksSW5maW5pdHl9ICAgICB8ICAgICAgICAgICAgICAwLjUgfCB7IlstMSwx KSIsIlswLDQpIiwiWzEsNCkiLCJbMSwxMDApIn0KICgxIHJvdykKIAorLS0gd2FybjogcmFuZ2Ug Ym91bmRzIGhpc3RvZ3JhbSB3aG9zZSBib3VuZHMgYXJlIG5vdCBzb3J0ZWQgYXNjZW5kaW5nCitT RUxFQ1QgcGdfY2F0YWxvZy5wZ19yZXN0b3JlX2F0dHJpYnV0ZV9zdGF0cygKKyAgICAnc2NoZW1h bmFtZScsICdzdGF0c19pbXBvcnQnLAorICAgICdyZWxuYW1lJywgJ3Rlc3QnLAorICAgICdhdHRu YW1lJywgJ2FyYW5nZScsCisgICAgJ2luaGVyaXRlZCcsIGZhbHNlOjpib29sZWFuLAorICAgICdy YW5nZV9ib3VuZHNfaGlzdG9ncmFtJywgJ3siWzUwLDYwKSIsIlsxLDIpIiwiWzkwLDEwMCkiLCJb NSw2KSJ9Jzo6dGV4dAorICAgICk7CitXQVJOSU5HOiAgInJhbmdlX2JvdW5kc19oaXN0b2dyYW0i IG11c3QgaGF2ZSBpdHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBzb3J0ZWQgaW4gYXNjZW5kaW5n IG9yZGVyCisgcGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3RhdHMgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgZgorKDEgcm93KQorCistLSB3YXJuOiByYW5nZSBib3VuZHMgaGlzdG9ncmFt IGNvbnRhaW5pbmcgYW4gZW1wdHkgcmFuZ2UKK1NFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVf YXR0cmlidXRlX3N0YXRzKAorICAgICdzY2hlbWFuYW1lJywgJ3N0YXRzX2ltcG9ydCcsCisgICAg J3JlbG5hbWUnLCAndGVzdCcsCisgICAgJ2F0dG5hbWUnLCAnYXJhbmdlJywKKyAgICAnaW5oZXJp dGVkJywgZmFsc2U6OmJvb2xlYW4sCisgICAgJ3JhbmdlX2JvdW5kc19oaXN0b2dyYW0nLCAne2Vt cHR5LCJbMSwyKSIsIlszLDQpIn0nOjp0ZXh0CisgICAgKTsKK1dBUk5JTkc6ICAicmFuZ2VfYm91 bmRzX2hpc3RvZ3JhbSIgbXVzdCBub3QgY29udGFpbiBlbXB0eSByYW5nZXMKKyBwZ19yZXN0b3Jl X2F0dHJpYnV0ZV9zdGF0cyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBmCisoMSBy b3cpCisKIC0tIHdhcm46IGNhbm5vdCBzZXQgbW9zdF9jb21tb25fZWxlbXMgZm9yIHJhbmdlIHR5 cGUsIHJlc3Qgb2sKIFNFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVfYXR0cmlidXRlX3N0YXRz KAogICAgICdzY2hlbWFuYW1lJywgJ3N0YXRzX2ltcG9ydCcsCkBAIC0yMzU4LDYgKzIzODYsMzQg QEAgSElOVDogICJyYW5nZV9sZW5ndGhfaGlzdG9ncmFtIiwgInJhbmdlX2VtcHR5X2ZyYWMiLCBh bmQgInJhbmdlX2JvdW5kc19oaXN0b2dyYW0KICBmCiAoMSByb3cpCiAKKy0tIHdhcm46IHJhbmdl IGJvdW5kcyBoaXN0b2dyYW0gd2hvc2UgYm91bmRzIGFyZSBub3Qgc29ydGVkIGFzY2VuZGluZwor U0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9leHRlbmRlZF9zdGF0cygKKyAgJ3NjaGVtYW5h bWUnLCAnc3RhdHNfaW1wb3J0JywKKyAgJ3JlbG5hbWUnLCAndGVzdF9tcicsCisgICdzdGF0aXN0 aWNzX3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywKKyAgJ3N0YXRpc3RpY3NfbmFtZScsICd0 ZXN0X21yX3N0YXQnLAorICAnaW5oZXJpdGVkJywgZmFsc2UsCisgICdleHBycycsICdbeyJyYW5n ZV9sZW5ndGhfaGlzdG9ncmFtIjogInsxMDE3OSwxMDE4OSwxMDE5OX0iLCAicmFuZ2VfZW1wdHlf ZnJhYyI6ICIwIiwgInJhbmdlX2JvdW5kc19oaXN0b2dyYW0iOiAie1wiWzUwLDYwKVwiLFwiWzEs MilcIixcIls5MCwxMDApXCJ9In1dJzo6anNvbmIpOworV0FSTklORzogICJyYW5nZV9ib3VuZHNf aGlzdG9ncmFtIiBtdXN0IGhhdmUgaXRzIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgc29ydGVkIGlu IGFzY2VuZGluZyBvcmRlcgorIHBnX3Jlc3RvcmVfZXh0ZW5kZWRfc3RhdHMgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBmCisoMSByb3cpCisKKy0tIHdhcm46IHJhbmdlIGJvdW5kcyBo aXN0b2dyYW0gY29udGFpbmluZyBhbiBlbXB0eSByYW5nZQorU0VMRUNUIHBnX2NhdGFsb2cucGdf cmVzdG9yZV9leHRlbmRlZF9zdGF0cygKKyAgJ3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywK KyAgJ3JlbG5hbWUnLCAndGVzdF9tcicsCisgICdzdGF0aXN0aWNzX3NjaGVtYW5hbWUnLCAnc3Rh dHNfaW1wb3J0JywKKyAgJ3N0YXRpc3RpY3NfbmFtZScsICd0ZXN0X21yX3N0YXQnLAorICAnaW5o ZXJpdGVkJywgZmFsc2UsCisgICdleHBycycsICdbeyJyYW5nZV9sZW5ndGhfaGlzdG9ncmFtIjog InsxMDE3OSwxMDE4OSwxMDE5OX0iLCAicmFuZ2VfZW1wdHlfZnJhYyI6ICIwIiwgInJhbmdlX2Jv dW5kc19oaXN0b2dyYW0iOiAie2VtcHR5LFwiWzEsMilcIixcIlszLDQpXCJ9In1dJzo6anNvbmIp OworV0FSTklORzogICJyYW5nZV9ib3VuZHNfaGlzdG9ncmFtIiBtdXN0IG5vdCBjb250YWluIGVt cHR5IHJhbmdlcworIHBnX3Jlc3RvcmVfZXh0ZW5kZWRfc3RhdHMgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBmCisoMSByb3cpCisKIC0tIG9rOiBtdWx0aXJhbmdlIHN0YXRzCiBTRUxF Q1QgcGdfY2F0YWxvZy5wZ19yZXN0b3JlX2V4dGVuZGVkX3N0YXRzKAogICAnc2NoZW1hbmFtZScs ICdzdGF0c19pbXBvcnQnLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNf aW1wb3J0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2ltcG9ydC5zcWwKaW5kZXgg NTgxNDAzMTVlZmIuLmU1NGYwNGFkNjM4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9zdGF0c19pbXBvcnQuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2ltcG9y dC5zcWwKQEAgLTg4NSw2ICs4ODUsMjQgQEAgQU5EIHRhYmxlbmFtZSA9ICd0ZXN0JwogQU5EIGlu aGVyaXRlZCA9IGZhbHNlCiBBTkQgYXR0bmFtZSA9ICdhcmFuZ2UnOwogCistLSB3YXJuOiByYW5n ZSBib3VuZHMgaGlzdG9ncmFtIHdob3NlIGJvdW5kcyBhcmUgbm90IHNvcnRlZCBhc2NlbmRpbmcK K1NFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVfYXR0cmlidXRlX3N0YXRzKAorICAgICdzY2hl bWFuYW1lJywgJ3N0YXRzX2ltcG9ydCcsCisgICAgJ3JlbG5hbWUnLCAndGVzdCcsCisgICAgJ2F0 dG5hbWUnLCAnYXJhbmdlJywKKyAgICAnaW5oZXJpdGVkJywgZmFsc2U6OmJvb2xlYW4sCisgICAg J3JhbmdlX2JvdW5kc19oaXN0b2dyYW0nLCAneyJbNTAsNjApIiwiWzEsMikiLCJbOTAsMTAwKSIs Ils1LDYpIn0nOjp0ZXh0CisgICAgKTsKKworLS0gd2FybjogcmFuZ2UgYm91bmRzIGhpc3RvZ3Jh bSBjb250YWluaW5nIGFuIGVtcHR5IHJhbmdlCitTRUxFQ1QgcGdfY2F0YWxvZy5wZ19yZXN0b3Jl X2F0dHJpYnV0ZV9zdGF0cygKKyAgICAnc2NoZW1hbmFtZScsICdzdGF0c19pbXBvcnQnLAorICAg ICdyZWxuYW1lJywgJ3Rlc3QnLAorICAgICdhdHRuYW1lJywgJ2FyYW5nZScsCisgICAgJ2luaGVy aXRlZCcsIGZhbHNlOjpib29sZWFuLAorICAgICdyYW5nZV9ib3VuZHNfaGlzdG9ncmFtJywgJ3tl bXB0eSwiWzEsMikiLCJbMyw0KSJ9Jzo6dGV4dAorICAgICk7CisKIC0tIHdhcm46IGNhbm5vdCBz ZXQgbW9zdF9jb21tb25fZWxlbXMgZm9yIHJhbmdlIHR5cGUsIHJlc3Qgb2sKIFNFTEVDVCBwZ19j YXRhbG9nLnBnX3Jlc3RvcmVfYXR0cmlidXRlX3N0YXRzKAogICAgICdzY2hlbWFuYW1lJywgJ3N0 YXRzX2ltcG9ydCcsCkBAIC0xNjk2LDYgKzE3MTQsMjIgQEAgU0VMRUNUIHBnX2NhdGFsb2cucGdf cmVzdG9yZV9leHRlbmRlZF9zdGF0cygKICAgJ3N0YXRpc3RpY3NfbmFtZScsICd0ZXN0X21yX3N0 YXQnLAogICAnaW5oZXJpdGVkJywgZmFsc2UsCiAgICdleHBycycsICdbeyJyYW5nZV9ib3VuZHNf aGlzdG9ncmFtIjogIntcIlsxLDEwMjAwKVwifSIsICJyYW5nZV9sZW5ndGhfaGlzdG9ncmFtIjog InsxMDE3OX0ifV0nOjpqc29uYik7CistLSB3YXJuOiByYW5nZSBib3VuZHMgaGlzdG9ncmFtIHdo b3NlIGJvdW5kcyBhcmUgbm90IHNvcnRlZCBhc2NlbmRpbmcKK1NFTEVDVCBwZ19jYXRhbG9nLnBn X3Jlc3RvcmVfZXh0ZW5kZWRfc3RhdHMoCisgICdzY2hlbWFuYW1lJywgJ3N0YXRzX2ltcG9ydCcs CisgICdyZWxuYW1lJywgJ3Rlc3RfbXInLAorICAnc3RhdGlzdGljc19zY2hlbWFuYW1lJywgJ3N0 YXRzX2ltcG9ydCcsCisgICdzdGF0aXN0aWNzX25hbWUnLCAndGVzdF9tcl9zdGF0JywKKyAgJ2lu aGVyaXRlZCcsIGZhbHNlLAorICAnZXhwcnMnLCAnW3sicmFuZ2VfbGVuZ3RoX2hpc3RvZ3JhbSI6 ICJ7MTAxNzksMTAxODksMTAxOTl9IiwgInJhbmdlX2VtcHR5X2ZyYWMiOiAiMCIsICJyYW5nZV9i b3VuZHNfaGlzdG9ncmFtIjogIntcIls1MCw2MClcIixcIlsxLDIpXCIsXCJbOTAsMTAwKVwifSJ9 XSc6Ompzb25iKTsKKy0tIHdhcm46IHJhbmdlIGJvdW5kcyBoaXN0b2dyYW0gY29udGFpbmluZyBh biBlbXB0eSByYW5nZQorU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9leHRlbmRlZF9zdGF0 cygKKyAgJ3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywKKyAgJ3JlbG5hbWUnLCAndGVzdF9t cicsCisgICdzdGF0aXN0aWNzX3NjaGVtYW5hbWUnLCAnc3RhdHNfaW1wb3J0JywKKyAgJ3N0YXRp c3RpY3NfbmFtZScsICd0ZXN0X21yX3N0YXQnLAorICAnaW5oZXJpdGVkJywgZmFsc2UsCisgICdl eHBycycsICdbeyJyYW5nZV9sZW5ndGhfaGlzdG9ncmFtIjogInsxMDE3OSwxMDE4OSwxMDE5OX0i LCAicmFuZ2VfZW1wdHlfZnJhYyI6ICIwIiwgInJhbmdlX2JvdW5kc19oaXN0b2dyYW0iOiAie2Vt cHR5LFwiWzEsMilcIixcIlszLDQpXCJ9In1dJzo6anNvbmIpOwogCiAtLSBvazogbXVsdGlyYW5n ZSBzdGF0cwogU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9leHRlbmRlZF9zdGF0cygKLS0g CjIuNDcuMwoK --000000000000bb0d98065611c729--