Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p630q-0008HV-GI for pgsql-hackers@arkaria.postgresql.org; Fri, 16 Dec 2022 05:12:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1p630p-0002Sm-8t for pgsql-hackers@arkaria.postgresql.org; Fri, 16 Dec 2022 05:11:59 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p630o-0002S9-Jo for pgsql-hackers@lists.postgresql.org; Fri, 16 Dec 2022 05:11:58 +0000 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1p630i-0000KQ-AX for pgsql-hackers@postgresql.org; Fri, 16 Dec 2022 05:11:57 +0000 Received: by mail-pj1-x102e.google.com with SMTP id js9so1387685pjb.2 for ; Thu, 15 Dec 2022 21:11:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20210112.gappssmtp.com; s=20210112; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=pW83m0/tw/ssEQZfWFUDAgInmk/e4gpT7Jf8coBOL7Y=; b=qKYk6c5dh8FFJcg0Zo4Q9ff+E95USkkEEyEzwis1aYojskFUuKbWlGY4j4TH6T/oA6 9TXlSr9BkUSajKSsZJLzSXcs2ZvETLXuh5bqrEgPucfE1rpP1w6DgDySguwoc24wmc+k y35mRKrKz03/sGNEsflt5AQCNAnq63oQyNbS3zvMY1wC4zaTDhAxkLYmzNFP0AOywAyu Z5z2HL/CYgIZp6kYCYQVbZa0CtDtN+JNYHrLQl8e9utJzZWLT30Z9hGsBAjxNSMRlzFI VbnLvaIIBlKl/uzhVaR2MUU3C3f/5vmY6xQz3dH+wOT/E7FzmTkdUuqCpN8K1RNVnH21 EQiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=pW83m0/tw/ssEQZfWFUDAgInmk/e4gpT7Jf8coBOL7Y=; b=m8D8GMZ4If3k6mhmLyi6+0ZrplNmH/6r7+SB0aUW+IV7v7FAzLMcKuXrUGTfYmvqNI X8w+CgsE+SbjMkVO84BQ7fE0lvc3/391+4ilih9dm5ud6Sb2Uw2VlPVKs9ELC3gnI1DH C2H6tB26PbaxJEYNwVkg+vij7+anxze789B7ns3Zk1uxWJpM5MhcuJtrDDdc8vw98KwK 3AF9DtWPTFXjPEQq+yovePblIClCKWBvIGSysaZ7mqq0xi58UZtZjeKknOXEUnx3G5xj TrAFgy/xN3h/JQCA3ImghbrI9NMv6mpPWBX72RlT3XDtT6nu5w6v/ZMk7gSiATM+G6eh bzqQ== X-Gm-Message-State: AFqh2koTwXpx9VO/vQXvRf68gxcHc+R3vm8eI3BEOpRIhAB5oG9sd/DY 7gFqPLAjiYImNJsPG+hH1lXY5oB6PVjJNcn0 X-Google-Smtp-Source: AMrXdXtjcVK+4TOyITjGxjWDPHxqVTEM/lSfZTqaqtE4MwJSBLawrdhz2O8B1bmwhUzRoMsCiDoInw== X-Received: by 2002:a17:90a:5584:b0:223:2aa8:7ae4 with SMTP id c4-20020a17090a558400b002232aa87ae4mr15220063pji.47.1671167510556; Thu, 15 Dec 2022 21:11:50 -0800 (PST) Received: from [192.168.2.139] ([50.53.98.191]) by smtp.googlemail.com with ESMTPSA id np2-20020a17090b4c4200b001df264610c4sm8879409pjb.0.2022.12.15.21.11.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 15 Dec 2022 21:11:49 -0800 (PST) Content-Type: multipart/mixed; boundary="------------GZGY1uYg0W9RCXawFucqpmrR" Message-ID: <9ad3257d-db5b-e54e-f5e0-a54727b19327@illuminatedcomputing.com> Date: Thu, 15 Dec 2022 21:11:49 -0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: Exclusion constraints on partitioned tables Content-Language: en-US To: Tom Lane Cc: Pgsql Hackers References: <3585070.1671149527@sss.pgh.pa.us> From: Paul Jungwirth In-Reply-To: <3585070.1671149527@sss.pgh.pa.us> 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. --------------GZGY1uYg0W9RCXawFucqpmrR Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 12/15/22 16:12, Tom Lane wrote: >> This patch also requires the matching constraint columns to use equality >> comparisons (`(foo WITH =)`), so it is really equivalent to the existing >> b-tree rule. > > That's not quite good enough: you'd better enforce that it's the same > equality operator (and same collation, if relevant) as is being used > in the partition key. > [snip] > It might work better to consider the operator itself and ask if > it's equality in the same btree opfamily that's used by the > partition key. Thank you for taking a look! Here is a comparison on just the operator itself. I included a collation check too, but I'm not sure it's necessary. Exclusion constraints don't have a collation per se; it comes from the index, and we choose it just a little above in this function. (I'm not even sure how to elicit that new error message in a test case.) I'm not sure what to do about matching the opfamily. In practice an exclusion constraint will typically use gist, but the partition key will always use btree/hash. You're saying that the equals operator can be inconsistent between those access methods? That is surprising to me, but I admit op classes/families are still sinking in. (Even prior to this patch, isn't the code for hash-based partitions looking up ptkey_eqop via the hash opfamily, and then comparing it to idx_eqop looked up via the btree opfamily?) If partitions can only support btree-based exclusion constraints, you still wouldn't be able to partition a temporal table, because those constraints would always be gist. So I guess what I really want is to support gist index constraints on partitioned tables. Regards, -- Paul ~{:-) pj@illuminatedcomputing.com --------------GZGY1uYg0W9RCXawFucqpmrR Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Allow-some-exclusion-constraints-on-partitions.patch" Content-Disposition: attachment; filename*0="v2-0001-Allow-some-exclusion-constraints-on-partitions.patch" Content-Transfer-Encoding: base64 RnJvbSBkZjI1Y2I2M2NhY2Q5OTJmYzc0NTNmYzQzMjQ4OGM2MDQ2ZTU5NDc5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiUGF1bCBBLiBKdW5nd2lydGgiIDxwakBpbGx1bWlu YXRlZGNvbXB1dGluZy5jb20+CkRhdGU6IFdlZCwgMjMgTm92IDIwMjIgMTQ6NTU6NDMgLTA4 MDAKU3ViamVjdDogW1BBVENIIHYyXSBBbGxvdyBzb21lIGV4Y2x1c2lvbiBjb25zdHJhaW50 cyBvbiBwYXJ0aXRpb25zCgpQcmV2aW91c2x5IHdlIG9ubHkgYWxsb3dlZCBVTklRVUUgQi10 cmVlIGNvbnN0cmFpbnRzIG9uIHBhcnRpdGlvbnMKKGFuZCBvbmx5IGlmIHRoZSBjb25zdHJh aW50IGluY2x1ZGVkIGFsbCB0aGUgcGFydGl0aW9uIGtleXMpLiBCdXQgd2UKY291bGQgYWxs b3cgZXhjbHVzaW9uIGNvbnN0cmFpbnRzIHdpdGggdGhlIHNhbWUgcmVzdHJpY3Rpb24uIFdl IGFsc28KcmVxdWlyZSB0aGF0IHRob3NlIGNvbHVtbnMgYmUgY29tcGFyZWQgZm9yIGVxdWFs aXR5LCBub3Qgc29tZXRoaW5nIGxpa2UKJiYuCi0tLQogZG9jL3NyYy9zZ21sL2RkbC5zZ21s ICAgICAgICAgICAgICAgICAgICAgIHwgMTIgKystLQogc3JjL2JhY2tlbmQvY29tbWFuZHMv aW5kZXhjbWRzLmMgICAgICAgICAgIHwgNDIgKysrKysrKysrKystLQogc3JjL2JhY2tlbmQv cGFyc2VyL3BhcnNlX3V0aWxjbWQuYyAgICAgICAgIHwgIDYgLS0KIHNyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvYWx0ZXJfdGFibGUub3V0ICB8IDMxICsrKysrKystLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9jcmVhdGVfdGFibGUub3V0IHwgMTYgKysrLS0KIHNyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5kZXhpbmcub3V0ICAgICB8IDczICsrKysrKysrKysrKysr KysrKy0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2FsdGVyX3RhYmxlLnNxbCAgICAgICB8 IDI5ICsrKysrKystLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX3RhYmxlLnNxbCAg ICAgIHwgMTMgKysrLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvaW5kZXhpbmcuc3FsICAgICAg ICAgIHwgNTcgKysrKysrKysrKysrKysrLS0KIDkgZmlsZXMgY2hhbmdlZCwgMjI3IGluc2Vy dGlvbnMoKyksIDUyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9k ZGwuc2dtbCBiL2RvYy9zcmMvc2dtbC9kZGwuc2dtbAppbmRleCA2ZTkyYmJkZGQyLi41OWJl OTExNDcxIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZGRsLnNnbWwKKysrIGIvZG9jL3Ny Yy9zZ21sL2RkbC5zZ21sCkBAIC00MjA2LDExICs0MjA2LDEzIEBAIEFMVEVSIElOREVYIG1l YXN1cmVtZW50X2NpdHlfaWRfbG9nZGF0ZV9rZXkKIAogICAgICA8bGlzdGl0ZW0+CiAgICAg ICA8cGFyYT4KLSAgICAgICBUaGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIGFuIGV4Y2x1c2lv biBjb25zdHJhaW50IHNwYW5uaW5nIHRoZQotICAgICAgIHdob2xlIHBhcnRpdGlvbmVkIHRh YmxlLiAgSXQgaXMgb25seSBwb3NzaWJsZSB0byBwdXQgc3VjaCBhCi0gICAgICAgY29uc3Ry YWludCBvbiBlYWNoIGxlYWYgcGFydGl0aW9uIGluZGl2aWR1YWxseS4gIEFnYWluLCB0aGlz Ci0gICAgICAgbGltaXRhdGlvbiBzdGVtcyBmcm9tIG5vdCBiZWluZyBhYmxlIHRvIGVuZm9y Y2UgY3Jvc3MtcGFydGl0aW9uCi0gICAgICAgcmVzdHJpY3Rpb25zLgorICAgICAgIFNpbWls YXJseSBhbiBleGNsdXNpb24gY29uc3RyYWludCBtdXN0IGluY2x1ZGUgYWxsIHRoZSAKKyAg ICAgICBwYXJ0aXRpb24ga2V5IGNvbHVtbnMuIEZ1cnRoZXJtb3JlIHRoZSBjb25zdHJhaW50 IG11c3QgY29tcGFyZSB0aG9zZQorICAgICAgIGNvbHVtbnMgZm9yIGVxdWFsaXR5IChub3Qg ZS5nLiA8bGl0ZXJhbD4mYW1wOyZhbXA7PC9saXRlcmFsPikuCisgICAgICAgQWdhaW4sIHRo aXMgbGltaXRhdGlvbiBzdGVtcyBmcm9tIG5vdCBiZWluZyBhYmxlIHRvIGVuZm9yY2UKKyAg ICAgICBjcm9zcy1wYXJ0aXRpb24gcmVzdHJpY3Rpb25zLiBUaGUgY29uc3RyYWludCBtYXkg aW5jbHVkZSBhZGRpdGlvbmFsCisgICAgICAgY29sdW1ucyB0aGF0IGFyZW4ndCBwYXJ0IG9m IHRoZSBwYXJ0aXRpb24ga2V5LCBhbmQgaXQgbWF5IGNvbXBhcmUKKyAgICAgICB0aG9zZSB3 aXRoIGFueSBvcGVyYXRvcnMgeW91IGxpa2UuCiAgICAgICA8L3BhcmE+CiAgICAgIDwvbGlz dGl0ZW0+CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggN2RjMWFjYThmZS4u YTllY2I3ZGYxOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRz LmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKQEAgLTcwOSwxMSAr NzA5LDYgQEAgRGVmaW5lSW5kZXgoT2lkIHJlbGF0aW9uSWQsCiAJCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKIAkJCQkJIGVycm1zZygiY2Fubm90IGNy ZWF0ZSBpbmRleCBvbiBwYXJ0aXRpb25lZCB0YWJsZSBcIiVzXCIgY29uY3VycmVudGx5IiwK IAkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwotCQlpZiAoc3RtdC0+ ZXhjbHVkZU9wTmFtZXMpCi0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQkoZXJyY29kZShFUlJD T0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJCSBlcnJtc2coImNhbm5vdCBjcmVh dGUgZXhjbHVzaW9uIGNvbnN0cmFpbnRzIG9uIHBhcnRpdGlvbmVkIHRhYmxlIFwiJXNcIiIs Ci0JCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKIAl9CiAKIAkvKgpA QCAtOTI2LDcgKzkyMSw3IEBAIERlZmluZUluZGV4KE9pZCByZWxhdGlvbklkLAogCSAqIFdl IGNvdWxkIGxpZnQgdGhpcyBsaW1pdGF0aW9uIGlmIHdlIGhhZCBnbG9iYWwgaW5kZXhlcywg YnV0IHRob3NlIGhhdmUKIAkgKiB0aGVpciBvd24gcHJvYmxlbXMsIHNvIHRoaXMgaXMgYSB1 c2VmdWwgZmVhdHVyZSBjb21iaW5hdGlvbi4KIAkgKi8KLQlpZiAocGFydGl0aW9uZWQgJiYg KHN0bXQtPnVuaXF1ZSB8fCBzdG10LT5wcmltYXJ5KSkKKwlpZiAocGFydGl0aW9uZWQgJiYg KHN0bXQtPnVuaXF1ZSB8fCBzdG10LT5wcmltYXJ5IHx8IHN0bXQtPmV4Y2x1ZGVPcE5hbWVz ICE9IE5JTCkpCiAJewogCQlQYXJ0aXRpb25LZXkga2V5ID0gUmVsYXRpb25HZXRQYXJ0aXRp b25LZXkocmVsKTsKIAkJY29uc3QgY2hhciAqY29uc3RyYWludF90eXBlOwpAQCAtOTgzLDYg Kzk3OCw4IEBAIERlZmluZUluZGV4KE9pZCByZWxhdGlvbklkLAogCQkJICovCiAJCQlpZiAo YWNjZXNzTWV0aG9kSWQgPT0gQlRSRUVfQU1fT0lEKQogCQkJCWVxX3N0cmF0ZWd5ID0gQlRF cXVhbFN0cmF0ZWd5TnVtYmVyOworCQkJZWxzZSBpZiAoYWNjZXNzTWV0aG9kSWQgPT0gR0lT VF9BTV9PSUQpCisJCQkJZXFfc3RyYXRlZ3kgPSBSVEVxdWFsU3RyYXRlZ3lOdW1iZXI7CiAJ CQllbHNlCiAJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVB VFVSRV9OT1RfU1VQUE9SVEVEKSwKQEAgLTEwMjAsOCArMTAxNyw0MSBAQCBEZWZpbmVJbmRl eChPaWQgcmVsYXRpb25JZCwKIAkJCQkJCQkJCQkJCQkgICBpZHhfb3BjaW50eXBlLAogCQkJ CQkJCQkJCQkJCSAgIGlkeF9vcGNpbnR5cGUsCiAJCQkJCQkJCQkJCQkJICAgZXFfc3RyYXRl Z3kpOworCiAJCQkJCQlpZiAocHRrZXlfZXFvcCA9PSBpZHhfZXFvcCkKIAkJCQkJCXsKKwkJ CQkJCQkvKiBGb3IgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLCBmYWlsIG9uIGNvbHVtbnMgdGhh dCBkb24ndCBjb21wYXJlIGZvciBlcXVhbGl0eS4gKi8KKwkJCQkJCQlpZiAoc3RtdC0+ZXhj bHVkZU9wTmFtZXMgIT0gTklMKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKGlkeF9lcW9wICE9 IGluZGV4SW5mby0+aWlfRXhjbHVzaW9uT3BzW2pdKQorCQkJCQkJCQl7CisJCQkJCQkJCQlG b3JtX3BnX2F0dHJpYnV0ZSBhdHQ7CisKKwkJCQkJCQkJCWF0dCA9IFR1cGxlRGVzY0F0dHIo UmVsYXRpb25HZXREZXNjcihyZWwpLAorCQkJCQkJCQkJCQkJCQlrZXktPnBhcnRhdHRyc1tp XSAtIDEpOworCQkJCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorCQkJCQkJCQkJCQkgZXJybXNnKCJj YW5ub3QgbWF0Y2ggcGFydGl0aW9uIGtleSB0byBpbmRleCBvbiBjb2x1bW4gXCIlc1wiIHVz aW5nIG5vbi1lcXVhbCBvcGVyYXRvciBcIiVzXCIuIiwKKwkJCQkJCQkJCQkJCQlOYW1lU3Ry KGF0dC0+YXR0bmFtZSksIGdldF9vcG5hbWUoaW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHNb al0pKSkpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJLyoKKwkJCQkJCQkJICogUmVxdWlyZSBh IG1hdGNoaW5nIGNvbGxhdGlvbiB0b28uCisJCQkJCQkJCSAqIFRoaXMgc2hvdWxkIGhhdmUg YmVlbiBzZXQgY29ycmVjdGx5IGFib3ZlLCBidXQgaXQgZG9lc24ndCBodXJ0IHRvIGNoZWNr LgorCQkJCQkJCQkgKi8KKwkJCQkJCQkJaWYgKGtleS0+cGFydGNvbGxhdGlvbltpXSAhPSBj b2xsYXRpb25PYmplY3RJZFtqXSkKKwkJCQkJCQkJeworCQkJCQkJCQkJRm9ybV9wZ19hdHRy aWJ1dGUgYXR0OworCisJCQkJCQkJCQlhdHQgPSBUdXBsZURlc2NBdHRyKFJlbGF0aW9uR2V0 RGVzY3IocmVsKSwKKwkJCQkJCQkJCQkJCQkJa2V5LT5wYXJ0YXR0cnNbaV0gLSAxKTsKKwkJ CQkJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVB VFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJCQkJCQkJIGVycm1zZygiY2Fubm90IG1hdGNo IHBhcnRpdGlvbiBrZXkgdG8gaW5kZXggb24gY29sdW1uIFwiJXNcIiB1c2luZyBjb2xsYXRp b24gXCIlc1wiLiIsCisJCQkJCQkJCQkJCQkJTmFtZVN0cihhdHQtPmF0dG5hbWUpLCBnZXRf Y29sbGF0aW9uX25hbWUoY29sbGF0aW9uT2JqZWN0SWRbal0pKSkpOworCQkJCQkJCQl9CisJ CQkJCQkJfQorCiAJCQkJCQkJZm91bmQgPSB0cnVlOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJ fQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQuYyBiL3Ny Yy9iYWNrZW5kL3BhcnNlci9wYXJzZV91dGlsY21kLmMKaW5kZXggZjc0M2NkNTQ4Yy4uMjcx MjQ3MjBmYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQu YworKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfdXRpbGNtZC5jCkBAIC05MDQsMTIg KzkwNCw2IEBAIHRyYW5zZm9ybVRhYmxlQ29uc3RyYWludChDcmVhdGVTdG10Q29udGV4dCAq Y3h0LCBDb25zdHJhaW50ICpjb25zdHJhaW50KQogCQkJCQkJIGVycm1zZygiZXhjbHVzaW9u IGNvbnN0cmFpbnRzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGZvcmVpZ24gdGFibGVzIiksCiAJ CQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKGN4dC0+cHN0YXRlLAogCQkJCQkJCQkJCQljb25z dHJhaW50LT5sb2NhdGlvbikpKTsKLQkJCWlmIChjeHQtPmlzcGFydGl0aW9uZWQpCi0JCQkJ ZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQ UE9SVEVEKSwKLQkJCQkJCSBlcnJtc2coImV4Y2x1c2lvbiBjb25zdHJhaW50cyBhcmUgbm90 IHN1cHBvcnRlZCBvbiBwYXJ0aXRpb25lZCB0YWJsZXMiKSwKLQkJCQkJCSBwYXJzZXJfZXJy cG9zaXRpb24oY3h0LT5wc3RhdGUsCi0JCQkJCQkJCQkJCWNvbnN0cmFpbnQtPmxvY2F0aW9u KSkpOwogCQkJY3h0LT5peGNvbnN0cmFpbnRzID0gbGFwcGVuZChjeHQtPml4Y29uc3RyYWlu dHMsIGNvbnN0cmFpbnQpOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvYWx0ZXJfdGFibGUub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9hbHRlcl90YWJsZS5vdXQKaW5kZXggNjAwZTYwM2JkZi4uNTdjM2E2NzRjOCAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hbHRlcl90YWJsZS5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hbHRlcl90YWJsZS5vdXQKQEAgLTM3OTcs MTYgKzM3OTcsMzUgQEAgUmVmZXJlbmNlZCBieToKICAgICBUQUJMRSAiYXRhZGRpbmRleCIg Q09OU1RSQUlOVCAiYXRhZGRpbmRleF9yZWZfaWRfZmtleSIgRk9SRUlHTiBLRVkgKHJlZl9p ZCkgUkVGRVJFTkNFUyBhdGFkZGluZGV4KGlkKQogCiBEUk9QIFRBQkxFIGF0YWRkaW5kZXg7 Ci0tLSB1bnN1cHBvcnRlZCBjb25zdHJhaW50IHR5cGVzIGZvciBwYXJ0aXRpb25lZCB0YWJs ZXMKKy0tIHN1cHBvcnRlZCBleGNsdXNpb24gY29uc3RyYWludCBwYXJ0cyBmb3IgcGFydGl0 aW9uZWQgdGFibGVzCitDUkVBVEUgVEFCTEUgcGFydGl0aW9uZWQgKAorCWEgaW50NHJhbmdl LAorCWIgaW50NHJhbmdlCispIFBBUlRJVElPTiBCWSBSQU5HRSAoYSk7CitBTFRFUiBUQUJM RSBwYXJ0aXRpb25lZCBBREQgRVhDTFVERSBVU0lORyBnaXN0IChhIFdJVEggPSk7CitEUk9Q IFRBQkxFIHBhcnRpdGlvbmVkOworLS0gdW5zdXBwb3J0ZWQgZXhjbHVzaW9uIGNvbnN0cmFp bnQgcGFydHMgZm9yIHBhcnRpdGlvbmVkIHRhYmxlcworQ1JFQVRFIFRBQkxFIHBhcnRpdGlv bmVkICgKKwlhIGludDRyYW5nZSwKKwliIGludDRyYW5nZQorKSBQQVJUSVRJT04gQlkgUkFO R0UgKGEsIGIpOworQUxURVIgVEFCTEUgcGFydGl0aW9uZWQgQUREIEVYQ0xVREUgVVNJTkcg Z2lzdCAoYSBXSVRIID0pOworRVJST1I6ICB1bmlxdWUgY29uc3RyYWludCBvbiBwYXJ0aXRp b25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgYWxsIHBhcnRpdGlvbmluZyBjb2x1bW5zCitERVRB SUw6ICBFWENMVURFIGNvbnN0cmFpbnQgb24gdGFibGUgInBhcnRpdGlvbmVkIiBsYWNrcyBj b2x1bW4gImIiIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkuCitEUk9QIFRB QkxFIHBhcnRpdGlvbmVkOworLS0gdW5zdXBwb3J0ZWQgZXhjbHVzaW9uIGNvbnN0cmFpbnQg b3BlcmF0b3IgZm9yIHBhcnRpdGlvbmVkIHRhYmxlcworQ1JFQVRFIFRBQkxFIHBhcnRpdGlv bmVkICgKKwlhIGludDRyYW5nZSwKKwliIGludDRyYW5nZQorKSBQQVJUSVRJT04gQlkgUkFO R0UgKGEsIGIpOworQUxURVIgVEFCTEUgcGFydGl0aW9uZWQgQUREIEVYQ0xVREUgVVNJTkcg Z2lzdCAoYSBXSVRIIC18LSk7CitFUlJPUjogIGNhbm5vdCBtYXRjaCBwYXJ0aXRpb24ga2V5 IHRvIGluZGV4IG9uIGNvbHVtbiAiYSIgdXNpbmcgbm9uLWVxdWFsIG9wZXJhdG9yICItfC0i LgorRFJPUCBUQUJMRSBwYXJ0aXRpb25lZDsKKy0tIGNhbm5vdCBkcm9wIGNvbHVtbiB0aGF0 IGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkKIENSRUFURSBUQUJMRSBwYXJ0aXRpb25l ZCAoCiAJYSBpbnQsCiAJYiBpbnQKICkgUEFSVElUSU9OIEJZIFJBTkdFIChhLCAoYStiKzEp KTsKLUFMVEVSIFRBQkxFIHBhcnRpdGlvbmVkIEFERCBFWENMVURFIFVTSU5HIGdpc3QgKGEg V0lUSCAmJik7Ci1FUlJPUjogIGV4Y2x1c2lvbiBjb25zdHJhaW50cyBhcmUgbm90IHN1cHBv cnRlZCBvbiBwYXJ0aXRpb25lZCB0YWJsZXMKLUxJTkUgMTogQUxURVIgVEFCTEUgcGFydGl0 aW9uZWQgQUREIEVYQ0xVREUgVVNJTkcgZ2lzdCAoYSBXSVRIICYmKTsKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS0tIGNhbm5vdCBkcm9wIGNvbHVtbiB0aGF0 IGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkKIEFMVEVSIFRBQkxFIHBhcnRpdGlvbmVk IERST1AgQ09MVU1OIGE7CiBFUlJPUjogIGNhbm5vdCBkcm9wIGNvbHVtbiAiYSIgYmVjYXVz ZSBpdCBpcyBwYXJ0IG9mIHRoZSBwYXJ0aXRpb24ga2V5IG9mIHJlbGF0aW9uICJwYXJ0aXRp b25lZCIKIEFMVEVSIFRBQkxFIHBhcnRpdGlvbmVkIEFMVEVSIENPTFVNTiBhIFRZUEUgY2hh cig1KTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX3Rh YmxlLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX3RhYmxlLm91dApp bmRleCA1ZWFjZTkxNWE3Li4wMmZiZDhiNDMzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2NyZWF0ZV90YWJsZS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9jcmVhdGVfdGFibGUub3V0CkBAIC0xNTMsMTQgKzE1MywxOCBAQCBDUkVBVEUg VEFCTEUgcGFydGl0aW9uZWQgKAogCWEyIGludAogKSBQQVJUSVRJT04gQlkgTElTVCAoYTEs IGEyKTsJLS0gZmFpbAogRVJST1I6ICBjYW5ub3QgdXNlICJsaXN0IiBwYXJ0aXRpb24gc3Ry YXRlZ3kgd2l0aCBtb3JlIHRoYW4gb25lIGNvbHVtbgotLS0gdW5zdXBwb3J0ZWQgY29uc3Ry YWludCB0eXBlIGZvciBwYXJ0aXRpb25lZCB0YWJsZXMKKy0tIGV4Y2x1c2lvbiBjb25zdHJh aW50IHR5cGUgZm9yIHBhcnRpdGlvbmVkIHRhYmxlcwogQ1JFQVRFIFRBQkxFIHBhcnRpdGlv bmVkICgKLQlhIGludCwKLQlFWENMVURFIFVTSU5HIGdpc3QgKGEgV0lUSCAmJikKKwlhIGlu dDRyYW5nZSwKKwlFWENMVURFIFVTSU5HIGdpc3QgKGEgV0lUSCA9KQorKSBQQVJUSVRJT04g QlkgUkFOR0UgKGEpOworRFJPUCBUQUJMRSBwYXJ0aXRpb25lZDsKKy0tIHVuc3VwcG9ydGVk IGV4Y2x1c2lvbiBjb25zdHJhaW50IG9wZXJhdG9yIGZvciBwYXJ0aXRpb25lZCB0YWJsZXMK K0NSRUFURSBUQUJMRSBwYXJ0aXRpb25lZCAoCisJYSBpbnQ0cmFuZ2UsCisJRVhDTFVERSBV U0lORyBnaXN0IChhIFdJVEggLXwtKQogKSBQQVJUSVRJT04gQlkgUkFOR0UgKGEpOwotRVJS T1I6ICBleGNsdXNpb24gY29uc3RyYWludHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gcGFydGl0 aW9uZWQgdGFibGVzCi1MSU5FIDM6ICBFWENMVURFIFVTSU5HIGdpc3QgKGEgV0lUSCAmJikK LSAgICAgICAgIF4KK0VSUk9SOiAgY2Fubm90IG1hdGNoIHBhcnRpdGlvbiBrZXkgdG8gaW5k ZXggb24gY29sdW1uICJhIiB1c2luZyBub24tZXF1YWwgb3BlcmF0b3IgIi18LSIuCiAtLSBw cmV2ZW50IHVzaW5nIHByb2hpYml0ZWQgZXhwcmVzc2lvbnMgaW4gdGhlIGtleQogQ1JFQVRF IEZVTkNUSU9OIHJldHNldCAoYSBpbnQpIFJFVFVSTlMgU0VUT0YgaW50IEFTICQkIFNFTEVD VCAxOyAkJCBMQU5HVUFHRSBTUUwgSU1NVVRBQkxFOwogQ1JFQVRFIFRBQkxFIHBhcnRpdGlv bmVkICgKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5kZXhpbmcu b3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9pbmRleGluZy5vdXQKaW5kZXggMWJk ZDQzMGYwNi4uNmY4YjE1YzMxNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9pbmRleGluZy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9pbmRl eGluZy5vdXQKQEAgLTk4NiwxMSArOTg2LDMyIEBAIERFVEFJTDogIFBSSU1BUlkgS0VZIGNv bnN0cmFpbnQgb24gdGFibGUgImlkeHBhcnQiIGxhY2tzIGNvbHVtbiAiYSIgd2hpY2ggaXMg cGFyCiAtLSBPSyBpZiB5b3UgdXNlIHRoZW0gaW4gc29tZSBvdGhlciBvcmRlcgogY3JlYXRl IHRhYmxlIGlkeHBhcnQgKGEgaW50LCBiIGludCwgYyB0ZXh0LCBwcmltYXJ5IGtleSAgKGEs IGIsIGMpKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGIsIGMsIGEpOwogZHJvcCB0YWJsZSBpZHhw YXJ0OwotLS0gbm90IG90aGVyIHR5cGVzIG9mIGluZGV4LWJhc2VkIGNvbnN0cmFpbnRzCi1j cmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQsIGV4Y2x1ZGUgKGEgd2l0aCA9ICkpIHBhcnRp dGlvbiBieSByYW5nZSAoYSk7Ci1FUlJPUjogIGV4Y2x1c2lvbiBjb25zdHJhaW50cyBhcmUg bm90IHN1cHBvcnRlZCBvbiBwYXJ0aXRpb25lZCB0YWJsZXMKLUxJTkUgMTogY3JlYXRlIHRh YmxlIGlkeHBhcnQgKGEgaW50LCBleGNsdWRlIChhIHdpdGggPSApKSBwYXJ0aXRpb24gLi4u Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLS0gT0sgdG8gYWRk IGFuIGV4Y2x1c2lvbiBjb25zdHJhaW50IGlmIHBhcnRpdGlvbmluZyBieSBpdHMgZXF1YWwg Y29sdW1uCitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJ TkcgR0lTVCAoYSB3aXRoID0gKSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhKTsKK2Ryb3AgdGFi bGUgaWR4cGFydDsKKy0tIE9LIG1vcmUgdGhhbiBvbmUgZXF1YWwgY29sdW1uCitjcmVhdGUg dGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlLCBleGNsdWRlIFVTSU5H IEdJU1QgKGEgd2l0aCA9LCBiIHdpdGggPSkpIHBhcnRpdGlvbiBieSByYW5nZSAoYSwgYik7 Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBPSyB3aXRoIG1vcmUgdGhhbiBvbmUgZXF1YWwg Y29sdW1uOiBjb25zdHJhaW50IGlzIGEgcHJvcGVyIHN1cGVyc2V0IG9mIHBhcnRpdGlvbiBr ZXkKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UsIGV4 Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0sIGIgd2l0aCA9KSkgcGFydGl0aW9uIGJ5IHJh bmdlIChhKTsKK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE5vdCBPSyBtb3JlIHRoYW4gb25l IGVxdWFsIGNvbHVtbjogcGFydGl0aW9uIGtleXMgYXJlIGEgcHJvcGVyIHN1cGVyc2V0IG9m IGNvbnN0cmFpbnQKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0 cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0gKSkgcGFydGl0aW9uIGJ5IHJh bmdlIChhLCBiKTsKK0VSUk9SOiAgdW5pcXVlIGNvbnN0cmFpbnQgb24gcGFydGl0aW9uZWQg dGFibGUgbXVzdCBpbmNsdWRlIGFsbCBwYXJ0aXRpb25pbmcgY29sdW1ucworREVUQUlMOiAg RVhDTFVERSBjb25zdHJhaW50IG9uIHRhYmxlICJpZHhwYXJ0IiBsYWNrcyBjb2x1bW4gImIi IHdoaWNoIGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkuCistLSBOb3QgT0sgd2l0aCBq dXN0IC18LQorY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50NHJhbmdlLCBleGNsdWRlIFVT SU5HIEdJU1QgKGEgd2l0aCAtfC0gKSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhKTsKK0VSUk9S OiAgY2Fubm90IG1hdGNoIHBhcnRpdGlvbiBrZXkgdG8gaW5kZXggb24gY29sdW1uICJhIiB1 c2luZyBub24tZXF1YWwgb3BlcmF0b3IgIi18LSIuCistLSBPSyB3aXRoIGVxdWFscyBhbmQg JiYsIGFuZCBlcXVhbHMgaXMgdGhlIHBhcnRpdGlvbiBrZXkKK2NyZWF0ZSB0YWJsZSBpZHhw YXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3 aXRoID0sIGIgd2l0aCAmJikpIHBhcnRpdGlvbiBieSByYW5nZSAoYSk7Citkcm9wIHRhYmxl IGlkeHBhcnQ7CistLSBOb3QgT0sgd2l0aCBlcXVhbHMgYW5kICYmLCBhbmQgZXF1YWxzIGlz IG5vdCB0aGUgcGFydGl0aW9uIGtleQorY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50NHJh bmdlLCBiIGludDRyYW5nZSwgYyBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYiB3 aXRoID0sIGMgd2l0aCAmJikpIHBhcnRpdGlvbiBieSByYW5nZSAoYSk7CitFUlJPUjogIHVu aXF1ZSBjb25zdHJhaW50IG9uIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBhbGwg cGFydGl0aW9uaW5nIGNvbHVtbnMKK0RFVEFJTDogIEVYQ0xVREUgY29uc3RyYWludCBvbiB0 YWJsZSAiaWR4cGFydCIgbGFja3MgY29sdW1uICJhIiB3aGljaCBpcyBwYXJ0IG9mIHRoZSBw YXJ0aXRpb24ga2V5LgorLS0gT0sgbW9yZSB0aGFuIG9uZSBlcXVhbCBjb2x1bW4gYW5kIGEg JiYgY29sdW1uCitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJh bmdlLCBjIGludDRyYW5nZSwgZXhjbHVkZSBVU0lORyBHSVNUIChhIHdpdGggPSwgYiB3aXRo ID0sIGMgd2l0aCAmJikpIHBhcnRpdGlvbiBieSByYW5nZSAoYSwgYik7Citkcm9wIHRhYmxl IGlkeHBhcnQ7CiAtLSBubyBleHByZXNzaW9ucyBpbiBwYXJ0aXRpb24ga2V5IGZvciBQSy9V TklRVUUKIGNyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludCBwcmltYXJ5IGtleSwgYiBpbnQp IHBhcnRpdGlvbiBieSByYW5nZSAoKGIgKyBhKSk7CiBFUlJPUjogIHVuc3VwcG9ydGVkIFBS SU1BUlkgS0VZIGNvbnN0cmFpbnQgd2l0aCBwYXJ0aXRpb24ga2V5IGRlZmluaXRpb24KQEAg LTEwNDcsMTIgKzEwNjgsNDIgQEAgSW5kZXhlczoKIE51bWJlciBvZiBwYXJ0aXRpb25zOiAw CiAKIGRyb3AgdGFibGUgaWR4cGFydDsKLS0tIEV4Y2x1c2lvbiBjb25zdHJhaW50cyBjYW5u b3QgYmUgYWRkZWQKLWNyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludCwgYiBpbnQpIHBhcnRp dGlvbiBieSByYW5nZSAoYSk7Ci1hbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNsdWRlIChh IHdpdGggPSk7Ci1FUlJPUjogIGV4Y2x1c2lvbiBjb25zdHJhaW50cyBhcmUgbm90IHN1cHBv cnRlZCBvbiBwYXJ0aXRpb25lZCB0YWJsZXMKLUxJTkUgMTogYWx0ZXIgdGFibGUgaWR4cGFy dCBhZGQgZXhjbHVkZSAoYSB3aXRoID0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBeCistLSBFeGNsdXNpb24gY29uc3RyYWludHMgY2FuIGJlIGFkZGVkIGlmIGEgcGFy dGl0aW9uaW5nIGJ5IHRoZWlyIGVxdWFsIGNvbHVtbgorY3JlYXRlIHRhYmxlIGlkeHBhcnQg KGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhKTsKK2Fs dGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0pOwor ZHJvcCB0YWJsZSBpZHhwYXJ0OworLS0gT0sgbW9yZSB0aGFuIG9uZSBlcXVhbCBjb2x1bW4K K2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UpIHBhcnRp dGlvbiBieSByYW5nZSAoYSwgYik7CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNsdWRl IFVTSU5HIEdJU1QgKGEgd2l0aCA9LCBiIHdpdGggPSk7Citkcm9wIHRhYmxlIGlkeHBhcnQ7 CistLSBPSyB3aXRoIG1vcmUgdGhhbiBvbmUgZXF1YWwgY29sdW1uOiBjb25zdHJhaW50IGlz IGEgcHJvcGVyIHN1cGVyc2V0IG9mIHBhcnRpdGlvbiBrZXkKK2NyZWF0ZSB0YWJsZSBpZHhw YXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UpIHBhcnRpdGlvbiBieSByYW5nZSAoYSk7 CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNsdWRlIFVTSU5HIEdJU1QgKGEgd2l0aCA9 LCBiIHdpdGggPSk7Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBOb3QgT0sgbW9yZSB0aGFu IG9uZSBlcXVhbCBjb2x1bW46IHBhcnRpdGlvbiBrZXlzIGFyZSBhIHByb3BlciBzdXBlcnNl dCBvZiBjb25zdHJhaW50CitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIg aW50NHJhbmdlKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGEsIGIpOworYWx0ZXIgdGFibGUgaWR4 cGFydCBhZGQgZXhjbHVkZSBVU0lORyBHSVNUIChhIHdpdGggPSk7CitFUlJPUjogIHVuaXF1 ZSBjb25zdHJhaW50IG9uIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBhbGwgcGFy dGl0aW9uaW5nIGNvbHVtbnMKK0RFVEFJTDogIEVYQ0xVREUgY29uc3RyYWludCBvbiB0YWJs ZSAiaWR4cGFydCIgbGFja3MgY29sdW1uICJiIiB3aGljaCBpcyBwYXJ0IG9mIHRoZSBwYXJ0 aXRpb24ga2V5LgorZHJvcCB0YWJsZSBpZHhwYXJ0OworLS0gTm90IE9LIHdpdGgganVzdCAt fC0KK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UpIHBh cnRpdGlvbiBieSByYW5nZSAoYSwgYik7CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNs dWRlIFVTSU5HIEdJU1QgKGEgd2l0aCAtfC0pOworRVJST1I6ICBjYW5ub3QgbWF0Y2ggcGFy dGl0aW9uIGtleSB0byBpbmRleCBvbiBjb2x1bW4gImEiIHVzaW5nIG5vbi1lcXVhbCBvcGVy YXRvciAiLXwtIi4KK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE9LIHdpdGggZXF1YWxzIGFu ZCAmJiwgYW5kIGVxdWFscyBpcyB0aGUgcGFydGl0aW9uIGtleQorY3JlYXRlIHRhYmxlIGlk eHBhcnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSkgcGFydGl0aW9uIGJ5IHJhbmdlIChh KTsKK2FsdGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRo ID0sIGIgd2l0aCAmJik7Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBOb3QgT0sgd2l0aCBl cXVhbHMgYW5kICYmLCBhbmQgZXF1YWxzIGlzIG5vdCB0aGUgcGFydGl0aW9uIGtleQorY3Jl YXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSwgYyBpbnQ0cmFu Z2UpIHBhcnRpdGlvbiBieSByYW5nZSAoYSk7CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBl eGNsdWRlIFVTSU5HIEdJU1QgKGIgd2l0aCA9LCBjIHdpdGggJiYpOworRVJST1I6ICB1bmlx dWUgY29uc3RyYWludCBvbiBwYXJ0aXRpb25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgYWxsIHBh cnRpdGlvbmluZyBjb2x1bW5zCitERVRBSUw6ICBFWENMVURFIGNvbnN0cmFpbnQgb24gdGFi bGUgImlkeHBhcnQiIGxhY2tzIGNvbHVtbiAiYSIgd2hpY2ggaXMgcGFydCBvZiB0aGUgcGFy dGl0aW9uIGtleS4KK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE9LIG1vcmUgdGhhbiBvbmUg ZXF1YWwgY29sdW1uIGFuZCBhICYmIGNvbHVtbgorY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEg aW50NHJhbmdlLCBiIGludDRyYW5nZSwgYyBpbnQ0cmFuZ2UpIHBhcnRpdGlvbiBieSByYW5n ZSAoYSwgYik7CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNsdWRlIFVTSU5HIEdJU1Qg KGEgd2l0aCA9LCBiIHdpdGggPSwgYyB3aXRoICYmKTsKIGRyb3AgdGFibGUgaWR4cGFydDsK IC0tIFdoZW4gKHN1YilwYXJ0aXRpb25zIGFyZSBjcmVhdGVkLCB0aGV5IGFsc28gY29udGFp biB0aGUgY29uc3RyYWludAogY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50LCBiIGludCwg cHJpbWFyeSBrZXkgKGEsIGIpKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGEsIGIpOwpkaWZmIC0t Z2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvYWx0ZXJfdGFibGUuc3FsIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvYWx0ZXJfdGFibGUuc3FsCmluZGV4IGY1OGIyZjc1ZDUuLjZlYTkyM2Qx MDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2FsdGVyX3RhYmxlLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9hbHRlcl90YWJsZS5zcWwKQEAgLTIzMTUsMTQg KzIzMTUsMzUgQEAgQUxURVIgVEFCTEUgYXRhZGRpbmRleAogXGQgYXRhZGRpbmRleAogRFJP UCBUQUJMRSBhdGFkZGluZGV4OwogCi0tLSB1bnN1cHBvcnRlZCBjb25zdHJhaW50IHR5cGVz IGZvciBwYXJ0aXRpb25lZCB0YWJsZXMKKy0tIHN1cHBvcnRlZCBleGNsdXNpb24gY29uc3Ry YWludCBwYXJ0cyBmb3IgcGFydGl0aW9uZWQgdGFibGVzCitDUkVBVEUgVEFCTEUgcGFydGl0 aW9uZWQgKAorCWEgaW50NHJhbmdlLAorCWIgaW50NHJhbmdlCispIFBBUlRJVElPTiBCWSBS QU5HRSAoYSk7CitBTFRFUiBUQUJMRSBwYXJ0aXRpb25lZCBBREQgRVhDTFVERSBVU0lORyBn aXN0IChhIFdJVEggPSk7CitEUk9QIFRBQkxFIHBhcnRpdGlvbmVkOworCistLSB1bnN1cHBv cnRlZCBleGNsdXNpb24gY29uc3RyYWludCBwYXJ0cyBmb3IgcGFydGl0aW9uZWQgdGFibGVz CitDUkVBVEUgVEFCTEUgcGFydGl0aW9uZWQgKAorCWEgaW50NHJhbmdlLAorCWIgaW50NHJh bmdlCispIFBBUlRJVElPTiBCWSBSQU5HRSAoYSwgYik7CitBTFRFUiBUQUJMRSBwYXJ0aXRp b25lZCBBREQgRVhDTFVERSBVU0lORyBnaXN0IChhIFdJVEggPSk7CitEUk9QIFRBQkxFIHBh cnRpdGlvbmVkOworCistLSB1bnN1cHBvcnRlZCBleGNsdXNpb24gY29uc3RyYWludCBvcGVy YXRvciBmb3IgcGFydGl0aW9uZWQgdGFibGVzCitDUkVBVEUgVEFCTEUgcGFydGl0aW9uZWQg KAorCWEgaW50NHJhbmdlLAorCWIgaW50NHJhbmdlCispIFBBUlRJVElPTiBCWSBSQU5HRSAo YSwgYik7CitBTFRFUiBUQUJMRSBwYXJ0aXRpb25lZCBBREQgRVhDTFVERSBVU0lORyBnaXN0 IChhIFdJVEggLXwtKTsKK0RST1AgVEFCTEUgcGFydGl0aW9uZWQ7CisKKy0tIGNhbm5vdCBk cm9wIGNvbHVtbiB0aGF0IGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkKIENSRUFURSBU QUJMRSBwYXJ0aXRpb25lZCAoCiAJYSBpbnQsCiAJYiBpbnQKICkgUEFSVElUSU9OIEJZIFJB TkdFIChhLCAoYStiKzEpKTsKLUFMVEVSIFRBQkxFIHBhcnRpdGlvbmVkIEFERCBFWENMVURF IFVTSU5HIGdpc3QgKGEgV0lUSCAmJik7Ci0KLS0tIGNhbm5vdCBkcm9wIGNvbHVtbiB0aGF0 IGlzIHBhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkKIEFMVEVSIFRBQkxFIHBhcnRpdGlvbmVk IERST1AgQ09MVU1OIGE7CiBBTFRFUiBUQUJMRSBwYXJ0aXRpb25lZCBBTFRFUiBDT0xVTU4g YSBUWVBFIGNoYXIoNSk7CiBBTFRFUiBUQUJMRSBwYXJ0aXRpb25lZCBEUk9QIENPTFVNTiBi OwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX3RhYmxlLnNxbCBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV90YWJsZS5zcWwKaW5kZXggOTNjY2Y3N2Q0 YS4uMzViYTRmNGYyYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRl X3RhYmxlLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfdGFibGUuc3Fs CkBAIC0xMDYsMTAgKzEwNiwxNyBAQCBDUkVBVEUgVEFCTEUgcGFydGl0aW9uZWQgKAogCWEy IGludAogKSBQQVJUSVRJT04gQlkgTElTVCAoYTEsIGEyKTsJLS0gZmFpbAogCi0tLSB1bnN1 cHBvcnRlZCBjb25zdHJhaW50IHR5cGUgZm9yIHBhcnRpdGlvbmVkIHRhYmxlcworLS0gZXhj bHVzaW9uIGNvbnN0cmFpbnQgdHlwZSBmb3IgcGFydGl0aW9uZWQgdGFibGVzCiBDUkVBVEUg VEFCTEUgcGFydGl0aW9uZWQgKAotCWEgaW50LAotCUVYQ0xVREUgVVNJTkcgZ2lzdCAoYSBX SVRIICYmKQorCWEgaW50NHJhbmdlLAorCUVYQ0xVREUgVVNJTkcgZ2lzdCAoYSBXSVRIID0p CispIFBBUlRJVElPTiBCWSBSQU5HRSAoYSk7CitEUk9QIFRBQkxFIHBhcnRpdGlvbmVkOwor CistLSB1bnN1cHBvcnRlZCBleGNsdXNpb24gY29uc3RyYWludCBvcGVyYXRvciBmb3IgcGFy dGl0aW9uZWQgdGFibGVzCitDUkVBVEUgVEFCTEUgcGFydGl0aW9uZWQgKAorCWEgaW50NHJh bmdlLAorCUVYQ0xVREUgVVNJTkcgZ2lzdCAoYSBXSVRIIC18LSkKICkgUEFSVElUSU9OIEJZ IFJBTkdFIChhKTsKIAogLS0gcHJldmVudCB1c2luZyBwcm9oaWJpdGVkIGV4cHJlc3Npb25z IGluIHRoZSBrZXkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2luZGV4aW5n LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2luZGV4aW5nLnNxbAppbmRleCA0MjkxMjBl NzEwLi4xOThhMzY4YTY0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9pbmRl eGluZy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvaW5kZXhpbmcuc3FsCkBAIC00 ODMsOCArNDgzLDI3IEBAIGNyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludCwgYiBpbnQgcHJp bWFyeSBrZXkpIHBhcnRpdGlvbiBieSByYW5nZSAoYiwgYSk7CiBjcmVhdGUgdGFibGUgaWR4 cGFydCAoYSBpbnQsIGIgaW50LCBjIHRleHQsIHByaW1hcnkga2V5ICAoYSwgYiwgYykpIHBh cnRpdGlvbiBieSByYW5nZSAoYiwgYywgYSk7CiBkcm9wIHRhYmxlIGlkeHBhcnQ7CiAKLS0t IG5vdCBvdGhlciB0eXBlcyBvZiBpbmRleC1iYXNlZCBjb25zdHJhaW50cwotY3JlYXRlIHRh YmxlIGlkeHBhcnQgKGEgaW50LCBleGNsdWRlIChhIHdpdGggPSApKSBwYXJ0aXRpb24gYnkg cmFuZ2UgKGEpOworLS0gT0sgdG8gYWRkIGFuIGV4Y2x1c2lvbiBjb25zdHJhaW50IGlmIHBh cnRpdGlvbmluZyBieSBpdHMgZXF1YWwgY29sdW1uCitjcmVhdGUgdGFibGUgaWR4cGFydCAo YSBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0gKSkgcGFydGl0aW9u IGJ5IHJhbmdlIChhKTsKK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE9LIG1vcmUgdGhhbiBv bmUgZXF1YWwgY29sdW1uCitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIg aW50NHJhbmdlLCBleGNsdWRlIFVTSU5HIEdJU1QgKGEgd2l0aCA9LCBiIHdpdGggPSkpIHBh cnRpdGlvbiBieSByYW5nZSAoYSwgYik7Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBPSyB3 aXRoIG1vcmUgdGhhbiBvbmUgZXF1YWwgY29sdW1uOiBjb25zdHJhaW50IGlzIGEgcHJvcGVy IHN1cGVyc2V0IG9mIHBhcnRpdGlvbiBrZXkKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGlu dDRyYW5nZSwgYiBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0sIGIg d2l0aCA9KSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhKTsKK2Ryb3AgdGFibGUgaWR4cGFydDsK Ky0tIE5vdCBPSyBtb3JlIHRoYW4gb25lIGVxdWFsIGNvbHVtbjogcGFydGl0aW9uIGtleXMg YXJlIGEgcHJvcGVyIHN1cGVyc2V0IG9mIGNvbnN0cmFpbnQKK2NyZWF0ZSB0YWJsZSBpZHhw YXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3 aXRoID0gKSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhLCBiKTsKKy0tIE5vdCBPSyB3aXRoIGp1 c3QgLXwtCitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGV4Y2x1ZGUgVVNJ TkcgR0lTVCAoYSB3aXRoIC18LSApKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGEpOworLS0gT0sg d2l0aCBlcXVhbHMgYW5kICYmLCBhbmQgZXF1YWxzIGlzIHRoZSBwYXJ0aXRpb24ga2V5Citj cmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlLCBleGNsdWRl IFVTSU5HIEdJU1QgKGEgd2l0aCA9LCBiIHdpdGggJiYpKSBwYXJ0aXRpb24gYnkgcmFuZ2Ug KGEpOworZHJvcCB0YWJsZSBpZHhwYXJ0OworLS0gTm90IE9LIHdpdGggZXF1YWxzIGFuZCAm JiwgYW5kIGVxdWFscyBpcyBub3QgdGhlIHBhcnRpdGlvbiBrZXkKK2NyZWF0ZSB0YWJsZSBp ZHhwYXJ0IChhIGludDRyYW5nZSwgYiBpbnQ0cmFuZ2UsIGMgaW50NHJhbmdlLCBleGNsdWRl IFVTSU5HIEdJU1QgKGIgd2l0aCA9LCBjIHdpdGggJiYpKSBwYXJ0aXRpb24gYnkgcmFuZ2Ug KGEpOworLS0gT0sgbW9yZSB0aGFuIG9uZSBlcXVhbCBjb2x1bW4gYW5kIGEgJiYgY29sdW1u CitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlLCBjIGlu dDRyYW5nZSwgZXhjbHVkZSBVU0lORyBHSVNUIChhIHdpdGggPSwgYiB3aXRoID0sIGMgd2l0 aCAmJikpIHBhcnRpdGlvbiBieSByYW5nZSAoYSwgYik7Citkcm9wIHRhYmxlIGlkeHBhcnQ7 CiAKIC0tIG5vIGV4cHJlc3Npb25zIGluIHBhcnRpdGlvbiBrZXkgZm9yIFBLL1VOSVFVRQog Y3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50IHByaW1hcnkga2V5LCBiIGludCkgcGFydGl0 aW9uIGJ5IHJhbmdlICgoYiArIGEpKTsKQEAgLTUwNiw5ICs1MjUsMzcgQEAgYWx0ZXIgdGFi bGUgaWR4cGFydCBhZGQgdW5pcXVlIChiLCBhKTsJCS0tIHRoaXMgd29ya3MKIFxkIGlkeHBh cnQKIGRyb3AgdGFibGUgaWR4cGFydDsKIAotLS0gRXhjbHVzaW9uIGNvbnN0cmFpbnRzIGNh bm5vdCBiZSBhZGRlZAotY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50LCBiIGludCkgcGFy dGl0aW9uIGJ5IHJhbmdlIChhKTsKLWFsdGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4Y2x1ZGUg KGEgd2l0aCA9KTsKKy0tIEV4Y2x1c2lvbiBjb25zdHJhaW50cyBjYW4gYmUgYWRkZWQgaWYg YSBwYXJ0aXRpb25pbmcgYnkgdGhlaXIgZXF1YWwgY29sdW1uCitjcmVhdGUgdGFibGUgaWR4 cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGEp OworYWx0ZXIgdGFibGUgaWR4cGFydCBhZGQgZXhjbHVkZSBVU0lORyBHSVNUIChhIHdpdGgg PSk7Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBPSyBtb3JlIHRoYW4gb25lIGVxdWFsIGNv bHVtbgorY3JlYXRlIHRhYmxlIGlkeHBhcnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSkg cGFydGl0aW9uIGJ5IHJhbmdlIChhLCBiKTsKK2FsdGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4 Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0sIGIgd2l0aCA9KTsKK2Ryb3AgdGFibGUgaWR4 cGFydDsKKy0tIE9LIHdpdGggbW9yZSB0aGFuIG9uZSBlcXVhbCBjb2x1bW46IGNvbnN0cmFp bnQgaXMgYSBwcm9wZXIgc3VwZXJzZXQgb2YgcGFydGl0aW9uIGtleQorY3JlYXRlIHRhYmxl IGlkeHBhcnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSkgcGFydGl0aW9uIGJ5IHJhbmdl IChhKTsKK2FsdGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3 aXRoID0sIGIgd2l0aCA9KTsKK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE5vdCBPSyBtb3Jl IHRoYW4gb25lIGVxdWFsIGNvbHVtbjogcGFydGl0aW9uIGtleXMgYXJlIGEgcHJvcGVyIHN1 cGVyc2V0IG9mIGNvbnN0cmFpbnQKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0IChhIGludDRyYW5n ZSwgYiBpbnQ0cmFuZ2UpIHBhcnRpdGlvbiBieSByYW5nZSAoYSwgYik7CithbHRlciB0YWJs ZSBpZHhwYXJ0IGFkZCBleGNsdWRlIFVTSU5HIEdJU1QgKGEgd2l0aCA9KTsKK2Ryb3AgdGFi bGUgaWR4cGFydDsKKy0tIE5vdCBPSyB3aXRoIGp1c3QgLXwtCitjcmVhdGUgdGFibGUgaWR4 cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlKSBwYXJ0aXRpb24gYnkgcmFuZ2UgKGEs IGIpOworYWx0ZXIgdGFibGUgaWR4cGFydCBhZGQgZXhjbHVkZSBVU0lORyBHSVNUIChhIHdp dGggLXwtKTsKK2Ryb3AgdGFibGUgaWR4cGFydDsKKy0tIE9LIHdpdGggZXF1YWxzIGFuZCAm JiwgYW5kIGVxdWFscyBpcyB0aGUgcGFydGl0aW9uIGtleQorY3JlYXRlIHRhYmxlIGlkeHBh cnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhKTsK K2FsdGVyIHRhYmxlIGlkeHBhcnQgYWRkIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0s IGIgd2l0aCAmJik7Citkcm9wIHRhYmxlIGlkeHBhcnQ7CistLSBOb3QgT0sgd2l0aCBlcXVh bHMgYW5kICYmLCBhbmQgZXF1YWxzIGlzIG5vdCB0aGUgcGFydGl0aW9uIGtleQorY3JlYXRl IHRhYmxlIGlkeHBhcnQgKGEgaW50NHJhbmdlLCBiIGludDRyYW5nZSwgYyBpbnQ0cmFuZ2Up IHBhcnRpdGlvbiBieSByYW5nZSAoYSk7CithbHRlciB0YWJsZSBpZHhwYXJ0IGFkZCBleGNs dWRlIFVTSU5HIEdJU1QgKGIgd2l0aCA9LCBjIHdpdGggJiYpOworZHJvcCB0YWJsZSBpZHhw YXJ0OworLS0gT0sgbW9yZSB0aGFuIG9uZSBlcXVhbCBjb2x1bW4gYW5kIGEgJiYgY29sdW1u CitjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQ0cmFuZ2UsIGIgaW50NHJhbmdlLCBjIGlu dDRyYW5nZSkgcGFydGl0aW9uIGJ5IHJhbmdlIChhLCBiKTsKK2FsdGVyIHRhYmxlIGlkeHBh cnQgYWRkIGV4Y2x1ZGUgVVNJTkcgR0lTVCAoYSB3aXRoID0sIGIgd2l0aCA9LCBjIHdpdGgg JiYpOwogZHJvcCB0YWJsZSBpZHhwYXJ0OwogCiAtLSBXaGVuIChzdWIpcGFydGl0aW9ucyBh cmUgY3JlYXRlZCwgdGhleSBhbHNvIGNvbnRhaW4gdGhlIGNvbnN0cmFpbnQKLS0gCjIuMjUu MQoK --------------GZGY1uYg0W9RCXawFucqpmrR--