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 1wE0RU-003ZK8-2Z for pgsql-hackers@arkaria.postgresql.org; Sat, 18 Apr 2026 07:50:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wE0RT-00CSav-2M for pgsql-hackers@arkaria.postgresql.org; Sat, 18 Apr 2026 07:50:15 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wE0RT-00CSan-0N for pgsql-hackers@lists.postgresql.org; Sat, 18 Apr 2026 07:50:15 +0000 Received: from mail-wr1-x431.google.com ([2a00:1450:4864:20::431]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wE0RQ-00000001avE-432d for pgsql-hackers@lists.postgresql.org; Sat, 18 Apr 2026 07:50:14 +0000 Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-43d734223e4so910756f8f.0 for ; Sat, 18 Apr 2026 00:50:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776498611; cv=none; d=google.com; s=arc-20240605; b=YqlpelMJd0cCwX0camng1MiMM9sqPtSG8fdwoJDg12GC/KPvnyKHKrA/Xi1MKL/oVf NuxSNX6LuI836zupxiWZraQJ2pyRDHo/KIo6o+EHdoWpk3o0QOyorCCpohTBCVP2d4G5 iPUPvjIvZHcc+UumGu4BSQs3H1JImzNGuYwdGOR9k5MaidnTOKzdRPfUZ7wagDuckOER Th02N+iuEropdU+zsAk8KPo0hMw3MTnStClb0x3yzt2V952EXdWfoMZvGZ5JheuvBGqV n0yKNwZMx+J5BTX5GwMmP7ZekzBfHmfxlg5CNhmQGRsm3mTMMKp1fdTdbvEXrIb1NCOG 17RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=SSaeXFrNQEqEs/pi4SB2oKibU9SY9E8++SptnE/56TM=; fh=BuGyydSF5wCS4YxNd1yh34z026qur9aQ0/RAN5OYtN0=; b=gVwnASdvwTTAbIP8BB0ftbELbStFneAxm/+H+DeaZsPiW4PPb1EpyDPD2AuVCr/krW 9Sehi2HNesgsjFST44yq/00lnRulUaZzE/+wQCAkD2DMH7BItSY9JClzuElbjjBax/kn 464vn9DC1TZn+KDxqIw558goSS64Y6fbUDEjHY39cZIRFmwB10hMFErLOEDZXwKpmokp KZF+zWeUn2VevzNJLUnfn9W5eicQlBxhxTnpouWDSY7isuCrpiYNiD1ptMyqqBOROhkm YclySLRqn0TgYTkfkNB32tnBhaZ8SOe607F4epsD8xMPnzmhGzQ+xo4bm0t4nqYWEwQ/ sR3g==; 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=1776498611; x=1777103411; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=SSaeXFrNQEqEs/pi4SB2oKibU9SY9E8++SptnE/56TM=; b=kDaDiGccj9mxoRexhXuK4gVPfCHsNEypWblg6cPjRCo61XX0W8HY5PcJyXq37mGu5K dZq8q8eShyc7c7jkLYLIZ0neAWhGA+jvC1eL/yjiMeiPHKPjJzwGQpd56Xaq7aX4+VrC zdG5rqw0G1nnQzhSjz/tOzrdslTuqZLpV9J1NmvWTyljb+6BMNgcdAX/d3+Wh2ECccqz 3K3qX3V4GrPSjAxHEYWmYLgXbEiYlrbHLCVKuuEKvIbpR3pL26r2D9QJ+uxg8grgKR45 0x7fjEU6MikgFJ9goBcLfJRhXV9wBoiPH2rIMzgDmeBnOZCyzTkEKhxMvN1PdTuNkvP7 cjxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776498611; x=1777103411; h=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; bh=SSaeXFrNQEqEs/pi4SB2oKibU9SY9E8++SptnE/56TM=; b=mXvYaSTtSnhpVYrVfTRCLK52X3GNMBwt5737BBLFyKForFPO4HYHl9LKHUzXcLb+7b UoHKQOPGBXT8gzn+V/LBXWPFADFvo9i99b1wYWv6TJxUMj7MBKdg+ef2SQL6CpEtAZWP YmMT0aq60D2HuL/fEhhxxph9aIj4VX3bEWLW+slzXGSRIk8KFJmj9XvsZ97Diq5w3kmx iF10b4FPzEBYjo/nlWO63h/1c5BE2aPHvZ2vyT35Jul3iga96hF2Tb0+O6Qi8/MyLmbQ 1pBnpAxM1Q1DYDFLD77GFUtjcLHyaTjzoZRWr6TBL8izaKI5eXAUH++fgWpXNTj88F2o ERJA== X-Forwarded-Encrypted: i=1; AFNElJ+J2raLn/bla/etR/hv9UdnL8zc/Vv/jHhaFPSxZ0hacTzum7F7A3TwXJdHBz2Wd8hj3N+VW2/EJz4j6ENb@lists.postgresql.org X-Gm-Message-State: AOJu0YzvhZNPa3N3D98QeuYCnr3+2YvAgmUkGc/rwaxh8CNXTI1tb61+ tUf4mTTiYQriI8ZyM5CH4z39hcRH1EFsk000xWfVWgNMeuF+acR3yIJuUWLIhSDRVzLpKs+22/Y PLeCn7tjaiT6kIUTiTuEj9eV4nxxfboc= X-Gm-Gg: AeBDiev7qKM4UDDYV/UnbR+inrBlSmbAfb/ud9+xj2DGKgJ9J/9QOWqfIDvi5G2ygZV bVVCRNP8JLSoxhEePryOhMoKdhCAsL3l7HUMKBFTqfTipNF07+WGLPOXZu/OrREU10Zpu3oIr0u zOSjgbeoFHE6LOgcp5/QZKBPCteNzz6DISK5yGDTwzI6IcQUow2C9+oY4KbCN7GGOB8NU0h/Y17 1Tr5LS+atZDLPTL60FkATr3ySwvKAiEspwhtL2iV1Bhfkfq4xBEDok1VU8VenIr10gxj4lT9A0V UW9JWeZumQmk4g/kSwzbMkL79VfzmI3RSXKW34AAI7RswYNuysg0IWVGrNn8ih79suEVqdZJU8R PqZkINi8w X-Received: by 2002:a05:6000:4807:b0:43d:384a:9e96 with SMTP id ffacd0b85a97d-43fe4032a03mr7205951f8f.4.1776498610487; Sat, 18 Apr 2026 00:50:10 -0700 (PDT) MIME-Version: 1.0 References: <278B9FE3-F349-4494-99C5-483105C1C999@gmail.com> <1900289.1776212948@sss.pgh.pa.us> <1913188.1776220247@sss.pgh.pa.us> In-Reply-To: From: David Rowley Date: Sat, 18 Apr 2026 19:49:57 +1200 X-Gm-Features: AQROBzDdqRTK9higzaAFEDvDvMGq7pZ9xv6tKHolQ1q04TOFdzZtOQprH_3U5xo Message-ID: Subject: Re: Add bms_offset_members() function for bitshifting Bitmapsets To: Tom Lane Cc: Chao Li , PostgreSQL Developers Content-Type: multipart/mixed; boundary="0000000000009f659e064fb75029" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009f659e064fb75029 Content-Type: text/plain; charset="UTF-8" On Wed, 15 Apr 2026 at 14:33, David Rowley wrote: > > On Wed, 15 Apr 2026 at 14:30, Tom Lane wrote: > > > > David Rowley writes: > > > I'd not considered surprise-prone as an aspect. I understand we have > > > bms_join and bms_union, which do the same thing if you only care about > > > the value of the result and not what happens to the inputs. > > > > Sure, but bms_join is an optional optimization of the far safer > > bms_union operation. It bothers me to create the optimized case > > but not the base case. > > Hmm, yeah. That seems like a good argument for making a new set. I'll > go make it so. Patch attached for the version that creates a new set rather than modifying the input set in-place. David --0000000000009f659e064fb75029 Content-Type: application/octet-stream; name="v2-0001-Introduce-bms_offset_members-function.patch" Content-Disposition: attachment; filename="v2-0001-Introduce-bms_offset_members-function.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo41bhvk0 RnJvbSBmNjU2MjlhODZkMjVmMTI0N2M5MWIxYTJmYmJiYTc4NjljNTExOTJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBSb3dsZXkgPGRncm93bGV5QGdtYWlsLmNvbT4KRGF0 ZTogRnJpLCAyMCBNYXIgMjAyNiAxMTowMToxMyArMTMwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIElu dHJvZHVjZSBibXNfb2Zmc2V0X21lbWJlcnMoKSBmdW5jdGlvbgoKRWZmZWN0aXZlbHkgYSBmdW5j dGlvbiB0byBiaXRzaGlmdCBtZW1iZXJzIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCmJpdHMu ICBXZSBoYXZlIHZhcmlvdXMgZnJhZ21lbnRzIG9mIGNvZGUgZG9pbmcgdGhpcyBtYW51YWxseSB3 aXRoIGEKYm1zX25leHRfbWVtYmVyKCkgbG9vcC4gIFdlIGNhbiBkbyB0aGlzIG1vcmUgZWZmaWNp ZW50bHkgd2l0aApiaXRzaGlmdGluZy4KLS0tCiBzcmMvYmFja2VuZC9ub2Rlcy9iaXRtYXBzZXQu YyAgICAgICAgICAgICAgICAgfCAxMzYgKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMgICAgICAgICAgfCAgMTAgKy0KIHNyYy9iYWNrZW5kL29w dGltaXplci9wcmVwL3ByZXBqb2ludHJlZS5jICAgICB8ICAzMCArKy0tCiBzcmMvYmFja2VuZC9y ZXdyaXRlL3Jld3JpdGVNYW5pcC5jICAgICAgICAgICAgfCAgMjUgKy0tLQogc3JjL2JhY2tlbmQv c3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5jICAgICAgIHwgIDEyICstCiBzcmMvaW5jbHVkZS9u b2Rlcy9iaXRtYXBzZXQuaCAgICAgICAgICAgICAgICAgfCAgIDEgKwogLi4uL2V4cGVjdGVkL3Rl c3RfYml0bWFwc2V0Lm91dCAgICAgICAgICAgICAgIHwgIDUwICsrKysrKysKIC4uLi90ZXN0X2Jp dG1hcHNldC9zcWwvdGVzdF9iaXRtYXBzZXQuc3FsICAgICB8ICAxNSArKwogLi4uL3Rlc3RfYml0 bWFwc2V0L3Rlc3RfYml0bWFwc2V0LS0xLjAuc3FsICAgIHwgICA4ICsrCiAuLi4vbW9kdWxlcy90 ZXN0X2JpdG1hcHNldC90ZXN0X2JpdG1hcHNldC5jICAgfCAxMDUgKysrKysrKysrKysrKy0KIDEw IGZpbGVzIGNoYW5nZWQsIDMzOSBpbnNlcnRpb25zKCspLCA1MyBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9ub2Rlcy9iaXRtYXBzZXQuYyBiL3NyYy9iYWNrZW5kL25vZGVz L2JpdG1hcHNldC5jCmluZGV4IGYwNTNkOGM0ZDY0Li5mM2Y4N2YxMWNmZCAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvbm9kZXMvYml0bWFwc2V0LmMKKysrIGIvc3JjL2JhY2tlbmQvbm9kZXMvYml0 bWFwc2V0LmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5j bHVkZSAiY29tbW9uL2hhc2hmbi5oIgorI2luY2x1ZGUgImNvbW1vbi9pbnQuaCIKICNpbmNsdWRl ICJub2Rlcy9iaXRtYXBzZXQuaCIKICNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCiAjaW5jbHVk ZSAicG9ydC9wZ19iaXR1dGlscy5oIgpAQCAtNDA1LDYgKzQwNiwxNDAgQEAgYm1zX2RpZmZlcmVu Y2UoY29uc3QgQml0bWFwc2V0ICphLCBjb25zdCBCaXRtYXBzZXQgKmIpCiAJcmV0dXJuIHJlc3Vs dDsKIH0KIAorLyoKKyAqIGJtc19vZmZzZXRfbWVtYmVycworICoJCUNyZWF0ZXMgYSBuZXcgQml0 bWFwc2V0IHdpdGggYWxsIG1lbWJlcnMgb2YgJ2EnIGFkanVzdGVkIHRvIGFkZCB0aGUKKyAqCQl2 YWx1ZSBvZiAnb2Zmc2V0JyB0byBlYWNoIG1lbWJlci4KKyAqCisgKiBNZW1iZXJzIHdoaWNoIHdv dWxkIGJlY29tZSBuZWdhdGl2ZSBhcyBhIHJlc3VsdCBvZiBhIG5lZ2F0aXZlIG9mZnNldCB3aWxs CisgKiBiZSByZW1vdmVkIGZyb20gdGhlIHNldCwgd2hlcmVhcyB0b28gbGFyZ2UgYW4gb2Zmc2V0 LCB3aGljaCB3b3VsZCByZXN1bHQgaW4KKyAqIGEgbWVtYmVyIGdvaW5nID4gSU5UX01BWCwgd2ls bCByZXN1bHQgaW4gYW4gRVJST1IuCisgKi8KK0JpdG1hcHNldCAqCitibXNfb2Zmc2V0X21lbWJl cnMoY29uc3QgQml0bWFwc2V0ICphLCBpbnQgb2Zmc2V0KQoreworCUJpdG1hcHNldCAgKnJlc3Vs dDsKKwlpbnQJCQlvZmZzZXRfd29yZHM7CisJaW50CQkJb2Zmc2V0X2JpdHM7CisJaW50CQkJbmV3 X253b3JkczsKKwlpbnQJCQlvbGRfbndvcmRzOworCWludDMyCQloaWdoX2JpdDsKKwlpbnQJCQlv bGRfaGlnaGVzdDsKKwlpbnQJCQluZXdfaGlnaGVzdDsKKworCUFzc2VydChibXNfaXNfdmFsaWRf c2V0KGEpKTsKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIGVtcHR5IHNldHMgKi8KKwlpZiAoYSA9 PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW9sZF9ud29yZHMgPSBhLT5ud29yZHM7CisJb2Zm c2V0X3dvcmRzID0gV09SRE5VTShvZmZzZXQpOworCW9mZnNldF9iaXRzID0gQklUTlVNKG9mZnNl dCk7CisJaGlnaF9iaXQgPSBibXdfbGVmdG1vc3Rfb25lX3BvcyhhLT53b3Jkc1thLT5ud29yZHMg LSAxXSk7CisJb2xkX2hpZ2hlc3QgPSAob2xkX253b3JkcyAtIDEpICogQklUU19QRVJfQklUTUFQ V09SRCArIGhpZ2hfYml0OworCisJLyogZG9uJ3QgY3JlYXRlIGEgc2V0IHdpdGggYSBtZW1iZXIg dGhhdCBkb2Vzbid0IGZpdCBpbnRvIGFuIGludDMyICovCisJaWYgKHBnX2FkZF9zMzJfb3ZlcmZs b3cob2xkX2hpZ2hlc3QsIG9mZnNldCwgJm5ld19oaWdoZXN0KSkKKwkJZWxvZyhFUlJPUiwgImJp dG1hcHNldCBvdmVyZmxvdyIpOworCS8qIHJldHVybiBOVUxMIGlmIHRoZSBuZXcgc2V0IHdvdWxk IGJlIGVtcHR5ICovCisJZWxzZSBpZiAobmV3X2hpZ2hlc3QgPCAwKQorCQlyZXR1cm4gTlVMTDsK KworCW5ld19ud29yZHMgPSBXT1JETlVNKG5ld19oaWdoZXN0KSArIDE7CisJcmVzdWx0ID0gKEJp dG1hcHNldCAqKSBwYWxsb2MwKEJJVE1BUFNFVF9TSVpFKG5ld19ud29yZHMpKTsKKwlyZXN1bHQt PnR5cGUgPSBUX0JpdG1hcHNldDsKKwlyZXN1bHQtPm53b3JkcyA9IG5ld19ud29yZHM7CisKKwkv KiBoYW5kbGUgemVybyBhbmQgcG9zaXRpdmUgb2Zmc2V0cyAoYml0c2hpZnQgbGVmdCkgKi8KKwlp ZiAob2Zmc2V0ID49IDApCisJeworCQkvKgorCQkgKiBXZSBzcGVjaWFsLWNhc2Ugb2Zmc2V0dGlu ZyBvbmx5IGJ5IHdob2xlIHdvcmRzIHNvIHdlIGRvbid0IGhhdmUgdG8KKwkJICogc3BlY2lhbC1j YXNlIGJpdHNoaWZ0aW5nIGJ5IEJJVFNfUEVSX0JJVE1BUFdPUkQgcGxhY2VzLCB3aGljaCBoYXMK KwkJICogYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorCQkgKi8KKwkJaWYgKG9mZnNldF9iaXRzID09 IDApCisJCXsKKwkJCWludAkJCWkgPSAwOworCisJCQkvKgorCQkJICogVGhlIG9sZCBzZXQgaXMg Z3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IDEgd29yZCwgc28gdXNlCisJCQkgKiBkby93aGls ZSB0byBzYXZlIHRoZSByZWR1bmRhbnQgaW5pdGlhbCBsb29wIGJvdW5kcyBjaGVjay4KKwkJCSAq LworCQkJZG8KKwkJCXsKKwkJCQlBc3NlcnQoaSArIG9mZnNldF93b3JkcyA8IG5ld19ud29yZHMp OworCQkJCXJlc3VsdC0+d29yZHNbaSArIG9mZnNldF93b3Jkc10gPSBhLT53b3Jkc1tpXTsKKwkJ CX0gd2hpbGUgKCsraSA8IG9sZF9ud29yZHMpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW50CQkJ Y2FycnlfYml0cyA9IEJJVFNfUEVSX0JJVE1BUFdPUkQgLSBvZmZzZXRfYml0czsKKwkJCWJpdG1h cHdvcmQJcHJldl9jYXJyeSA9IDA7CisJCQlpbnQJCQlpID0gMDsKKworCQkJZG8KKwkJCXsKKwkJ CQliaXRtYXB3b3JkCWNhcnJ5ID0gKGEtPndvcmRzW2ldID4+IGNhcnJ5X2JpdHMpOworCisJCQkJ QXNzZXJ0KGkgKyBvZmZzZXRfd29yZHMgPCBuZXdfbndvcmRzKTsKKwkJCQkvKiBzaGlmdCBiaXRz IHVwIGFuZCBjYXJyeSBiaXRzIGZyb20gdGhlIHByZXZpb3VzIHdvcmQgKi8KKwkJCQlyZXN1bHQt PndvcmRzW2kgKyBvZmZzZXRfd29yZHNdID0gKGEtPndvcmRzW2ldIDw8IG9mZnNldF9iaXRzKSB8 IHByZXZfY2Fycnk7CisJCQkJcHJldl9jYXJyeSA9IGNhcnJ5OworCQkJfSB3aGlsZSAoKytpIDwg b2xkX253b3Jkcyk7CisJCQlyZXN1bHQtPndvcmRzW25ld19ud29yZHMgLSAxXSB8PSBwcmV2X2Nh cnJ5OworCQl9CisJfQorCisJLyogaGFuZGxlIG5lZ2F0aXZlIG9mZnNldCAoYml0c2hpZnQgcmln aHQpICovCisJZWxzZQorCXsKKwkJLyogbWFrZSB0aGUgbmVnYXRpdmUgb2Zmc2V0X3dvcmRzIGFu ZCBvZmZzZXRfYml0cyBwb3NpdGl2ZSAqLworCQlvZmZzZXRfd29yZHMgPSAwIC0gb2Zmc2V0X3dv cmRzOworCQlvZmZzZXRfYml0cyA9IDAgLSBvZmZzZXRfYml0czsKKworCQkvKiBhcyBhYm92ZSwg c3BlY2lhbCBjYXNlIHNoaWZ0aW5nIG9ubHkgYnkgd2hvbGUgd29yZHMgKi8KKwkJaWYgKG9mZnNl dF9iaXRzID09IDApCisJCXsKKwkJCWludAkJCWkgPSAwOworCisJCQlkbworCQkJeworCQkJCUFz c2VydChpICsgb2Zmc2V0X3dvcmRzIDwgb2xkX253b3Jkcyk7CisJCQkJcmVzdWx0LT53b3Jkc1tp XSA9IGEtPndvcmRzW2kgKyBvZmZzZXRfd29yZHNdOworCQkJfSB3aGlsZSAoKytpIDwgbmV3X253 b3Jkcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQJCQljYXJyeV9iaXRzID0gQklUU19QRVJf QklUTUFQV09SRCAtIG9mZnNldF9iaXRzOworCQkJYml0bWFwd29yZAlwcmV2X2NhcnJ5ID0gMDsK KwkJCWludAkJCWkgPSBuZXdfbndvcmRzIC0gMTsKKworCQkJLyogY2FycnkgYml0cyBmcm9tIGFu eSB3b3JkIGp1c3QgYWJvdmUgd2hlcmUgdGhlIGxvb3Agc3RhcnRzICovCisJCQlpZiAob2xkX253 b3JkcyA+IG5ld19ud29yZHMgKyBvZmZzZXRfd29yZHMpCisJCQkJcHJldl9jYXJyeSA9IChhLT53 b3Jkc1tuZXdfbndvcmRzICsgb2Zmc2V0X3dvcmRzXSA8PCBjYXJyeV9iaXRzKTsKKworCQkJLyoK KwkJCSAqIFdlIGxvb3AgYmFja3dhcmQgb3ZlciB0aGUgYXJyYXkgc28gd2UgY29ycmVjdGx5IGNh cnJ5IGJpdHMgZnJvbQorCQkJICogaGlnaGVyIHdvcmRzLgorCQkJICovCisJCQlkbworCQkJewor CQkJCWJpdG1hcHdvcmQJY2FycnkgPSAoYS0+d29yZHNbaSArIG9mZnNldF93b3Jkc10gPDwgY2Fy cnlfYml0cyk7CisKKwkJCQlBc3NlcnQoaSArIG9mZnNldF93b3JkcyA8IG9sZF9ud29yZHMpOwor CisJCQkJLyogc2hpZnQgYml0cyBkb3duIGFuZCBjYXJyeSBiaXRzIGZyb20gdGhlIHByZXZpb3Vz IHdvcmQgKi8KKwkJCQlyZXN1bHQtPndvcmRzW2ldID0gKGEtPndvcmRzW2kgKyBvZmZzZXRfd29y ZHNdID4+IG9mZnNldF9iaXRzKSB8IHByZXZfY2Fycnk7CisJCQkJcHJldl9jYXJyeSA9IGNhcnJ5 OworCQkJfSB3aGlsZSAoLS1pID49IDApOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30K KwogLyoKICAqIGJtc19pc19zdWJzZXQgLSBpcyBBIGEgc3Vic2V0IG9mIEI/CiAgKi8KQEAgLTk5 MSw2ICsxMTI2LDcgQEAgYm1zX3JlcGxhY2VfbWVtYmVycyhCaXRtYXBzZXQgKmEsIGNvbnN0IEJp dG1hcHNldCAqYikKIAlyZXR1cm4gYTsKIH0KIAorCiAvKgogICogYm1zX2FkZF9yYW5nZQogICoJ CUFkZCBtZW1iZXJzIGluIHRoZSByYW5nZSBvZiAnbG93ZXInIHRvICd1cHBlcicgdG8gdGhlIHNl dC4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3NldHJlZnMuYyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL3NldHJlZnMuYwppbmRleCBmZjBlODc1ZjJhMi4uZWJh ZTdhOGRlYTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3NldHJlZnMu YworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMKQEAgLTIwNTcsMTYg KzIwNTcsMTAgQEAgc2V0X2hhc2hfcmVmZXJlbmNlcyhQbGFubmVySW5mbyAqcm9vdCwgUGxhbiAq cGxhbiwgaW50IHJ0b2Zmc2V0KQogc3RhdGljIFJlbGlkcwogb2Zmc2V0X3JlbGlkX3NldChSZWxp ZHMgcmVsaWRzLCBpbnQgcnRvZmZzZXQpCiB7Ci0JUmVsaWRzCQlyZXN1bHQgPSBOVUxMOwotCWlu dAkJCXJ0aW5kZXg7Ci0KLQkvKiBJZiB0aGVyZSdzIG5vIG9mZnNldCB0byBhcHBseSwgd2UgbmVl ZG4ndCByZWNvbXB1dGUgdGhlIHZhbHVlICovCisJLyogSWYgdGhlcmUncyBubyBvZmZzZXQgdG8g YXBwbHksIHdlIG5lZWRuJ3QgbWFrZSBhbm90aGVyIHNldCAqLwogCWlmIChydG9mZnNldCA9PSAw KQogCQlyZXR1cm4gcmVsaWRzOwotCXJ0aW5kZXggPSAtMTsKLQl3aGlsZSAoKHJ0aW5kZXggPSBi bXNfbmV4dF9tZW1iZXIocmVsaWRzLCBydGluZGV4KSkgPj0gMCkKLQkJcmVzdWx0ID0gYm1zX2Fk ZF9tZW1iZXIocmVzdWx0LCBydGluZGV4ICsgcnRvZmZzZXQpOwotCXJldHVybiByZXN1bHQ7CisJ cmV0dXJuIGJtc19vZmZzZXRfbWVtYmVycyhyZWxpZHMsIHJ0b2Zmc2V0KTsKIH0KIAogLyoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wcmVwL3ByZXBqb2ludHJlZS5jIGIvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMKaW5kZXggOTViZjUxNjA2Y2Mu Ljc4MjgxMjYyYmExIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVw am9pbnRyZWUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwam9pbnRyZWUu YwpAQCAtMzczMSw3ICszNzMxLDcgQEAgaGFzX25vdG51bGxfZm9yY2VkX3ZhcihQbGFubmVySW5m byAqcm9vdCwgTGlzdCAqZm9yY2VkX251bGxfdmFycywKIAkJUmFuZ2VUYmxFbnRyeSAqcnRlOwog CQlCaXRtYXBzZXQgICpub3RudWxsYXR0bnVtczsKIAkJQml0bWFwc2V0ICAqZm9yY2VkbnVsbGF0 dG51bXMgPSBOVUxMOwotCQlpbnQJCQlhdHRubzsKKwkJaW50CQkJbG93ZXN0X2F0dG5vOwogCiAJ CXZhcm5vKys7CiAKQEAgLTM3NTEsMjIgKzM3NTEsMjIgQEAgaGFzX25vdG51bGxfZm9yY2VkX3Zh cihQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqZm9yY2VkX251bGxfdmFycywKIAkJaWYgKGJtc19p c19tZW1iZXIodmFybm8sIHJpZ2h0X3N0YXRlLT5udWxsYWJsZV9yZWxzKSkKIAkJCWNvbnRpbnVl OwogCi0JCS8qCi0JCSAqIEl0ZXJhdGUgb3ZlciBhdHRyaWJ1dGVzIGFuZCBhZGp1c3QgdGhlIGJp dG1hcCBpbmRleGVzIGJ5Ci0JCSAqIEZpcnN0TG93SW52YWxpZEhlYXBBdHRyaWJ1dGVOdW1iZXIg dG8gZ2V0IHRoZSBhY3R1YWwgYXR0cmlidXRlCi0JCSAqIG51bWJlcnMuCi0JCSAqLwotCQlhdHRu byA9IC0xOwotCQl3aGlsZSAoKGF0dG5vID0gYm1zX25leHRfbWVtYmVyKGF0dHJzLCBhdHRubykp ID49IDApCi0JCXsKLQkJCUF0dHJOdW1iZXIJcmVhbF9hdHRubyA9IGF0dG5vICsgRmlyc3RMb3dJ bnZhbGlkSGVhcEF0dHJpYnV0ZU51bWJlcjsKKwkJLyogZmluZCB0aGUgbG93ZXN0IG1lbWJlciB0 byBjaGVjayBpZiBzeXN0ZW0gY29sdW1ucyBhcmUgcHJlc2VudCAqLworCQlsb3dlc3RfYXR0bm8g PSBibXNfbmV4dF9tZW1iZXIoYXR0cnMsIC0xKTsKIAotCQkJLyogc3lzdGVtIGNvbHVtbnMgY2Fu bm90IGJlIE5VTEwgKi8KLQkJCWlmIChyZWFsX2F0dG5vIDwgMCkKLQkJCQlyZXR1cm4gdHJ1ZTsK KwkJLyogd2UgY2hlY2tlZCBmb3IgYW4gZW1wdHkgc2V0IGFib3ZlICovCisJCUFzc2VydChsb3dl c3RfYXR0bm8gPj0gMCk7CiAKLQkJCWZvcmNlZG51bGxhdHRudW1zID0gYm1zX2FkZF9tZW1iZXIo Zm9yY2VkbnVsbGF0dG51bXMsIHJlYWxfYXR0bm8pOwotCQl9CisJCS8qIHN5c3RlbSBjb2x1bW5z IGNhbm5vdCBiZSBOVUxMICovCisJCWlmIChsb3dlc3RfYXR0bm8gKyBGaXJzdExvd0ludmFsaWRI ZWFwQXR0cmlidXRlTnVtYmVyIDwgMCkKKwkJCXJldHVybiB0cnVlOworCisJCS8qCisJCSAqIE9m ZnNldCB0aGUgYml0bWFwIG1lbWJlcnMgYnkgRmlyc3RMb3dJbnZhbGlkSGVhcEF0dHJpYnV0ZU51 bWJlciB0bworCQkgKiBnZXQgdGhlIGFjdHVhbCBhdHRyaWJ1dGUgbnVtYmVycy4KKwkJICovCisJ CWZvcmNlZG51bGxhdHRudW1zID0gYm1zX29mZnNldF9tZW1iZXJzKGF0dHJzLAorCQkJCQkJCQkJ CQkgICBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRlTnVtYmVyKTsKIAogCQlydGUgPSBydF9m ZXRjaCh2YXJubywgcm9vdC0+cGFyc2UtPnJ0YWJsZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVN YW5pcC5jCmluZGV4IDRiZjRhYTBkNmQxLi42MTM3ZjQzMDNmMiAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvcmV3cml0ZS9yZXdyaXRlTWFuaXAuYworKysgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jl d3JpdGVNYW5pcC5jCkBAIC02NCw3ICs2NCw2IEBAIHN0YXRpYyBib29sIGNvbnRhaW5fd2luZG93 ZnVuY3Nfd2Fsa2VyKE5vZGUgKm5vZGUsIHZvaWQgKmNvbnRleHQpOwogc3RhdGljIGJvb2wgbG9j YXRlX3dpbmRvd2Z1bmNfd2Fsa2VyKE5vZGUgKm5vZGUsCiAJCQkJCQkJCQkgbG9jYXRlX3dpbmRv d2Z1bmNfY29udGV4dCAqY29udGV4dCk7CiBzdGF0aWMgYm9vbCBjaGVja0V4cHJIYXNTdWJMaW5r X3dhbGtlcihOb2RlICpub2RlLCB2b2lkICpjb250ZXh0KTsKLXN0YXRpYyBSZWxpZHMgb2Zmc2V0 X3JlbGlkX3NldChSZWxpZHMgcmVsaWRzLCBpbnQgb2Zmc2V0KTsKIHN0YXRpYyBOb2RlICphZGRf bnVsbGluZ19yZWxpZHNfbXV0YXRvcihOb2RlICpub2RlLAogCQkJCQkJCQkJCWFkZF9udWxsaW5n X3JlbGlkc19jb250ZXh0ICpjb250ZXh0KTsKIHN0YXRpYyBOb2RlICpyZW1vdmVfbnVsbGluZ19y ZWxpZHNfbXV0YXRvcihOb2RlICpub2RlLApAQCAtMzk3LDggKzM5Niw4IEBAIE9mZnNldFZhck5v ZGVzX3dhbGtlcihOb2RlICpub2RlLCBPZmZzZXRWYXJOb2Rlc19jb250ZXh0ICpjb250ZXh0KQog CQlpZiAodmFyLT52YXJsZXZlbHN1cCA9PSBjb250ZXh0LT5zdWJsZXZlbHNfdXApCiAJCXsKIAkJ CXZhci0+dmFybm8gKz0gY29udGV4dC0+b2Zmc2V0OwotCQkJdmFyLT52YXJudWxsaW5ncmVscyA9 IG9mZnNldF9yZWxpZF9zZXQodmFyLT52YXJudWxsaW5ncmVscywKLQkJCQkJCQkJCQkJCSAgIGNv bnRleHQtPm9mZnNldCk7CisJCQl2YXItPnZhcm51bGxpbmdyZWxzID0gYm1zX29mZnNldF9tZW1i ZXJzKHZhci0+dmFybnVsbGluZ3JlbHMsCisJCQkJCQkJCQkJCQkJIGNvbnRleHQtPm9mZnNldCk7 CiAJCQlpZiAodmFyLT52YXJub3N5biA+IDApCiAJCQkJdmFyLT52YXJub3N5biArPSBjb250ZXh0 LT5vZmZzZXQ7CiAJCX0KQEAgLTQzNSwxMCArNDM0LDEwIEBAIE9mZnNldFZhck5vZGVzX3dhbGtl cihOb2RlICpub2RlLCBPZmZzZXRWYXJOb2Rlc19jb250ZXh0ICpjb250ZXh0KQogCiAJCWlmIChw aHYtPnBobGV2ZWxzdXAgPT0gY29udGV4dC0+c3VibGV2ZWxzX3VwKQogCQl7Ci0JCQlwaHYtPnBo cmVscyA9IG9mZnNldF9yZWxpZF9zZXQocGh2LT5waHJlbHMsCi0JCQkJCQkJCQkJICAgY29udGV4 dC0+b2Zmc2V0KTsKLQkJCXBodi0+cGhudWxsaW5ncmVscyA9IG9mZnNldF9yZWxpZF9zZXQocGh2 LT5waG51bGxpbmdyZWxzLAotCQkJCQkJCQkJCQkJICBjb250ZXh0LT5vZmZzZXQpOworCQkJcGh2 LT5waHJlbHMgPSBibXNfb2Zmc2V0X21lbWJlcnMocGh2LT5waHJlbHMsCisJCQkJCQkJCQkJCSBj b250ZXh0LT5vZmZzZXQpOworCQkJcGh2LT5waG51bGxpbmdyZWxzID0gYm1zX29mZnNldF9tZW1i ZXJzKHBodi0+cGhudWxsaW5ncmVscywKKwkJCQkJCQkJCQkJCQljb250ZXh0LT5vZmZzZXQpOwog CQl9CiAJCS8qIGZhbGwgdGhyb3VnaCB0byBleGFtaW5lIGNoaWxkcmVuICovCiAJfQpAQCAtNTI0 LDE4ICs1MjMsNiBAQCBPZmZzZXRWYXJOb2RlcyhOb2RlICpub2RlLCBpbnQgb2Zmc2V0LCBpbnQg c3VibGV2ZWxzX3VwKQogCQlPZmZzZXRWYXJOb2Rlc193YWxrZXIobm9kZSwgJmNvbnRleHQpOwog fQogCi1zdGF0aWMgUmVsaWRzCi1vZmZzZXRfcmVsaWRfc2V0KFJlbGlkcyByZWxpZHMsIGludCBv ZmZzZXQpCi17Ci0JUmVsaWRzCQlyZXN1bHQgPSBOVUxMOwotCWludAkJCXJ0aW5kZXg7Ci0KLQly dGluZGV4ID0gLTE7Ci0Jd2hpbGUgKChydGluZGV4ID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywg cnRpbmRleCkpID49IDApCi0JCXJlc3VsdCA9IGJtc19hZGRfbWVtYmVyKHJlc3VsdCwgcnRpbmRl eCArIG9mZnNldCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQogLyoKICAqIENoYW5nZVZhck5vZGVz IC0gYWRqdXN0IFZhciBub2RlcyBmb3IgYSBzcGVjaWZpYyBjaGFuZ2Ugb2YgUlQgaW5kZXgKICAq CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzLmMgYi9z cmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzLmMKaW5kZXggMmI4MzM1NWQyNmUu LjMzMmU3NDIzYmQ4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVk X3N0YXRzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5jCkBA IC0xNjczLDggKzE2NzMsNyBAQCBzdGF0ZXh0X2lzX2NvbXBhdGlibGVfY2xhdXNlKFBsYW5uZXJJ bmZvICpyb290LCBOb2RlICpjbGF1c2UsIEluZGV4IHJlbGlkLAogCSAqLwogCWlmICghbGVha3By b29mKQogCXsKLQkJQml0bWFwc2V0ICAqY2xhdXNlX2F0dG51bXMgPSBOVUxMOwotCQlpbnQJCQlh dHRudW0gPSAtMTsKKwkJQml0bWFwc2V0ICAqY2xhdXNlX2F0dG51bXM7CiAKIAkJLyoKIAkJICog V2UgaGF2ZSB0byBjaGVjayBwZXItY29sdW1uIHByaXZpbGVnZXMuICAqYXR0bnVtcyBoYXMgdGhl IGF0dG51bXMKQEAgLTE2ODUsMTMgKzE2ODQsOCBAQCBzdGF0ZXh0X2lzX2NvbXBhdGlibGVfY2xh dXNlKFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpjbGF1c2UsIEluZGV4IHJlbGlkLAogCQkgKiB3 aGlsZSBhdHRudW1zIHdpdGhpbiAqYXR0bnVtcyBhcmVuJ3QuICBDb252ZXJ0ICphdHRudW1zIHRv IHRoZQogCQkgKiBvZmZzZXQgc3R5bGUgc28gd2UgY2FuIGNvbWJpbmUgdGhlIHJlc3VsdHMuCiAJ CSAqLwotCQl3aGlsZSAoKGF0dG51bSA9IGJtc19uZXh0X21lbWJlcigqYXR0bnVtcywgYXR0bnVt KSkgPj0gMCkKLQkJewotCQkJY2xhdXNlX2F0dG51bXMgPQotCQkJCWJtc19hZGRfbWVtYmVyKGNs YXVzZV9hdHRudW1zLAotCQkJCQkJCSAgIGF0dG51bSAtIEZpcnN0TG93SW52YWxpZEhlYXBBdHRy aWJ1dGVOdW1iZXIpOwotCQl9Ci0KKwkJY2xhdXNlX2F0dG51bXMgPSBibXNfb2Zmc2V0X21lbWJl cnMoKmF0dG51bXMsCisJCQkJCQkJCQkJCTAgLSBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRl TnVtYmVyKTsKIAkJLyogTm93IG1lcmdlIGF0dG51bXMgZnJvbSAqZXhwcnMgaW50byBjbGF1c2Vf YXR0bnVtcyAqLwogCQlpZiAoKmV4cHJzICE9IE5JTCkKIAkJCXB1bGxfdmFyYXR0bm9zKChOb2Rl ICopICpleHBycywgcmVsaWQsICZjbGF1c2VfYXR0bnVtcyk7CmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9ub2Rlcy9iaXRtYXBzZXQuaCBiL3NyYy9pbmNsdWRlL25vZGVzL2JpdG1hcHNldC5oCmlu ZGV4IDA2N2VjNzJlOTliLi45OTdmOGExY2Q5NiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9k ZXMvYml0bWFwc2V0LmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvYml0bWFwc2V0LmgKQEAgLTEw MCw2ICsxMDAsNyBAQCBleHRlcm4gdm9pZCBibXNfZnJlZShCaXRtYXBzZXQgKmEpOwogZXh0ZXJu IEJpdG1hcHNldCAqYm1zX3VuaW9uKGNvbnN0IEJpdG1hcHNldCAqYSwgY29uc3QgQml0bWFwc2V0 ICpiKTsKIGV4dGVybiBCaXRtYXBzZXQgKmJtc19pbnRlcnNlY3QoY29uc3QgQml0bWFwc2V0ICph LCBjb25zdCBCaXRtYXBzZXQgKmIpOwogZXh0ZXJuIEJpdG1hcHNldCAqYm1zX2RpZmZlcmVuY2Uo Y29uc3QgQml0bWFwc2V0ICphLCBjb25zdCBCaXRtYXBzZXQgKmIpOworZXh0ZXJuIEJpdG1hcHNl dCAqYm1zX29mZnNldF9tZW1iZXJzKGNvbnN0IEJpdG1hcHNldCAqYSwgaW50IG9mZnNldCk7CiBl eHRlcm4gYm9vbCBibXNfaXNfc3Vic2V0KGNvbnN0IEJpdG1hcHNldCAqYSwgY29uc3QgQml0bWFw c2V0ICpiKTsKIGV4dGVybiBCTVNfQ29tcGFyaXNvbiBibXNfc3Vic2V0X2NvbXBhcmUoY29uc3Qg Qml0bWFwc2V0ICphLCBjb25zdCBCaXRtYXBzZXQgKmIpOwogZXh0ZXJuIGJvb2wgYm1zX2lzX21l bWJlcihpbnQgeCwgY29uc3QgQml0bWFwc2V0ICphKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21v ZHVsZXMvdGVzdF9iaXRtYXBzZXQvZXhwZWN0ZWQvdGVzdF9iaXRtYXBzZXQub3V0IGIvc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2JpdG1hcHNldC9leHBlY3RlZC90ZXN0X2JpdG1hcHNldC5vdXQKaW5k ZXggZjc1Y2I0NmI4NjkuLjU2OGI5N2JiNjM1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfYml0bWFwc2V0L2V4cGVjdGVkL3Rlc3RfYml0bWFwc2V0Lm91dAorKysgYi9zcmMvdGVz dC9tb2R1bGVzL3Rlc3RfYml0bWFwc2V0L2V4cGVjdGVkL3Rlc3RfYml0bWFwc2V0Lm91dApAQCAt NTI4LDYgKzUyOCw0OSBAQCBTRUxFQ1QgdGVzdF9ibXNfZGlmZmVyZW5jZShOVUxMLCBOVUxMKSBB UyByZXN1bHQ7CiAgPD4KICgxIHJvdykKIAorLS0gYm1zX29mZnNldF9tZW1iZXJzKCkKKy0tIEVu c3VyZSBvdmVyZmxvdyBkZXRlY3Rpb24gd29ya3MKK1NFTEVDVCB0ZXN0X2Jtc19vZmZzZXRfbWVt YmVycygnKGIgMSknLCAyMTQ3NDgzNjQ3KTsKK0VSUk9SOiAgYml0bWFwc2V0IG92ZXJmbG93CitT RUxFQ1QgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoJyhiIDIpJywgMjE0NzQ4MzY0Nik7CitFUlJP UjogIGJpdG1hcHNldCBvdmVyZmxvdworLS0gRW5zdXJlIG1lbWJlcnMgYXJlIGFsbCBvZmZzZXQg YXMgZXhwZWN0ZWQKK1NFTEVDVCB0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycygnKGIgMSAzIDUpJywg MSk7CisgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKGIgMiA0IDYpCisoMSByb3cpCisKK1NFTEVDVCB0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycygn KGIgMSAzIDUpJywgMCk7CisgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKGIgMSAzIDUpCisoMSByb3cpCisKK1NFTEVDVCB0ZXN0X2Jtc19vZmZz ZXRfbWVtYmVycygnKGIgMSAzIDUpJywgLTEpOworIHRlc3RfYm1zX29mZnNldF9tZW1iZXJzIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIChiIDAgMiA0KQorKDEgcm93KQorCitTRUxFQ1Qg dGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoJyhiIDMxIDMyIDYzIDY0KScsIDEpOworIHRlc3RfYm1z X29mZnNldF9tZW1iZXJzIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIChiIDMyIDMzIDY0 IDY1KQorKDEgcm93KQorCitTRUxFQ1QgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoJyhiIDMxIDMy IDYzIDY0KScsIDApOworIHRlc3RfYm1zX29mZnNldF9tZW1iZXJzIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIChiIDMxIDMyIDYzIDY0KQorKDEgcm93KQorCitTRUxFQ1QgdGVzdF9ibXNf b2Zmc2V0X21lbWJlcnMoJyhiIDMxIDMyIDYzIDY0KScsIC0xKTsKKyB0ZXN0X2Jtc19vZmZzZXRf bWVtYmVycyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAoYiAzMCAzMSA2MiA2MykKKygx IHJvdykKKwogLS0gYm1zX2lzX21lbWJlcigpCiBTRUxFQ1QgdGVzdF9ibXNfaXNfbWVtYmVyKCco YiknLCAtNSk7IC0tIGVycm9yCiBFUlJPUjogIG5lZ2F0aXZlIGJpdG1hcHNldCBtZW1iZXIgbm90 IGFsbG93ZWQKQEAgLTE1NzUsNCArMTYxOCwxMSBAQCBTRUxFQ1QgdGVzdF9yYW5kb21fb3BlcmF0 aW9ucygtMSwgMTAwMDAsIDgxOTIwLCAwKSA+IDAgQVMgcmVzdWx0OwogIHQKICgxIHJvdykKIAor LS0gcGVyZm9ybSBzb21lIHJhbmRvbSB0ZXN0IG9uIGJtc19vZmZzZXRfbWVtYmVycygpCitTRUxF Q1QgdGVzdF9yYW5kb21fb2Zmc2V0X29wZXJhdGlvbnMoTlVMTCwgMTAwMDAsIDEwMjQsIDApIEFT IHJlc3VsdDsKKyByZXN1bHQgCistLS0tLS0tLQorICAxMDAwMAorKDEgcm93KQorCiBEUk9QIEVY VEVOU0lPTiB0ZXN0X2JpdG1hcHNldDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVz dF9iaXRtYXBzZXQvc3FsL3Rlc3RfYml0bWFwc2V0LnNxbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVz dF9iaXRtYXBzZXQvc3FsL3Rlc3RfYml0bWFwc2V0LnNxbAppbmRleCBlNzVhYjhmNjIwYS4uOWI4 NTJkNmQ5OTAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9iaXRtYXBzZXQvc3Fs L3Rlc3RfYml0bWFwc2V0LnNxbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYml0bWFwc2V0 L3NxbC90ZXN0X2JpdG1hcHNldC5zcWwKQEAgLTE0NSw2ICsxNDUsMTggQEAgU0VMRUNUIHRlc3Rf Ym1zX2RpZmZlcmVuY2UoJyhiIDUpJywgTlVMTCkgQVMgcmVzdWx0OwogU0VMRUNUIHRlc3RfYm1z X2RpZmZlcmVuY2UoTlVMTCwgJyhiIDUpJykgQVMgcmVzdWx0OwogU0VMRUNUIHRlc3RfYm1zX2Rp ZmZlcmVuY2UoTlVMTCwgTlVMTCkgQVMgcmVzdWx0OwogCistLSBibXNfb2Zmc2V0X21lbWJlcnMo KQorLS0gRW5zdXJlIG92ZXJmbG93IGRldGVjdGlvbiB3b3JrcworU0VMRUNUIHRlc3RfYm1zX29m ZnNldF9tZW1iZXJzKCcoYiAxKScsIDIxNDc0ODM2NDcpOworU0VMRUNUIHRlc3RfYm1zX29mZnNl dF9tZW1iZXJzKCcoYiAyKScsIDIxNDc0ODM2NDYpOworLS0gRW5zdXJlIG1lbWJlcnMgYXJlIGFs bCBvZmZzZXQgYXMgZXhwZWN0ZWQKK1NFTEVDVCB0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycygnKGIg MSAzIDUpJywgMSk7CitTRUxFQ1QgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoJyhiIDEgMyA1KScs IDApOworU0VMRUNUIHRlc3RfYm1zX29mZnNldF9tZW1iZXJzKCcoYiAxIDMgNSknLCAtMSk7CitT RUxFQ1QgdGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoJyhiIDMxIDMyIDYzIDY0KScsIDEpOworU0VM RUNUIHRlc3RfYm1zX29mZnNldF9tZW1iZXJzKCcoYiAzMSAzMiA2MyA2NCknLCAwKTsKK1NFTEVD VCB0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycygnKGIgMzEgMzIgNjMgNjQpJywgLTEpOworCiAtLSBi bXNfaXNfbWVtYmVyKCkKIFNFTEVDVCB0ZXN0X2Jtc19pc19tZW1iZXIoJyhiKScsIC01KTsgLS0g ZXJyb3IKIFNFTEVDVCB0ZXN0X2Jtc19pc19tZW1iZXIoJyhiIDEgMyA1KScsIDEpIEFTIHJlc3Vs dDsKQEAgLTQwMyw0ICs0MTUsNyBAQCBTRUxFQ1QgdGVzdF9ibXNfbm9uZW1wdHlfZGlmZmVyZW5j ZSgnKGIgMSAyKScsICcoYiA1MCAxMDApJykgQVMgcmVzdWx0OwogLS0gcmFuZG9tIG9wZXJhdGlv bnMKIFNFTEVDVCB0ZXN0X3JhbmRvbV9vcGVyYXRpb25zKC0xLCAxMDAwMCwgODE5MjAsIDApID4g MCBBUyByZXN1bHQ7CiAKKy0tIHBlcmZvcm0gc29tZSByYW5kb20gdGVzdCBvbiBibXNfb2Zmc2V0 X21lbWJlcnMoKQorU0VMRUNUIHRlc3RfcmFuZG9tX29mZnNldF9vcGVyYXRpb25zKE5VTEwsIDEw MDAwLCAxMDI0LCAwKSBBUyByZXN1bHQ7CisKIERST1AgRVhURU5TSU9OIHRlc3RfYml0bWFwc2V0 OwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2JpdG1hcHNldC90ZXN0X2JpdG1h cHNldC0tMS4wLnNxbCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9iaXRtYXBzZXQvdGVzdF9iaXRt YXBzZXQtLTEuMC5zcWwKaW5kZXggMjI3ZWNiNWFhM2IuLmVlNTgzMTllNGQ5IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYml0bWFwc2V0L3Rlc3RfYml0bWFwc2V0LS0xLjAuc3Fs CisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9iaXRtYXBzZXQvdGVzdF9iaXRtYXBzZXQtLTEu MC5zcWwKQEAgLTU2LDYgKzU2LDEwIEBAIENSRUFURSBGVU5DVElPTiB0ZXN0X2Jtc19kaWZmZXJl bmNlKHRleHQsIHRleHQpCiBSRVRVUk5TIHRleHQKIEFTICdNT0RVTEVfUEFUSE5BTUUnIExBTkdV QUdFIEM7CiAKK0NSRUFURSBGVU5DVElPTiB0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycyh0ZXh0LCBp bnRlZ2VyKQorUkVUVVJOUyB0ZXh0CitBUyAnTU9EVUxFX1BBVEhOQU1FJyBMQU5HVUFHRSBDOwor CiBDUkVBVEUgRlVOQ1RJT04gdGVzdF9ibXNfaXNfZW1wdHkodGV4dCkKIFJFVFVSTlMgYm9vbGVh bgogQVMgJ01PRFVMRV9QQVRITkFNRScgTEFOR1VBR0UgQzsKQEAgLTEzNyw0ICsxNDEsOCBAQCBD UkVBVEUgRlVOQ1RJT04gdGVzdF9yYW5kb21fb3BlcmF0aW9ucyhpbnRlZ2VyLCBpbnRlZ2VyLCBp bnRlZ2VyLCBpbnRlZ2VyKQogUkVUVVJOUyBpbnRlZ2VyIFNUUklDVAogQVMgJ01PRFVMRV9QQVRI TkFNRScgTEFOR1VBR0UgQzsKIAorQ1JFQVRFIEZVTkNUSU9OIHRlc3RfcmFuZG9tX29mZnNldF9v cGVyYXRpb25zKGJpZ2ludCwgaW50ZWdlciwgaW50ZWdlciwgaW50ZWdlcikKK1JFVFVSTlMgaW50 ZWdlcgorQVMgJ01PRFVMRV9QQVRITkFNRScgTEFOR1VBR0UgQzsKKwogQ09NTUVOVCBPTiBFWFRF TlNJT04gdGVzdF9iaXRtYXBzZXQgSVMgJ1Rlc3QgY29kZSBmb3IgQml0bWFwc2V0JzsKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9iaXRtYXBzZXQvdGVzdF9iaXRtYXBzZXQuYyBi L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9iaXRtYXBzZXQvdGVzdF9iaXRtYXBzZXQuYwppbmRleCAy NzJiZWQzOTBhNi4uYzEzNGRmOTdjZDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvdGVz dF9iaXRtYXBzZXQvdGVzdF9iaXRtYXBzZXQuYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf Yml0bWFwc2V0L3Rlc3RfYml0bWFwc2V0LmMKQEAgLTE5LDExICsxOSwxMiBAQAogI2luY2x1ZGUg PHN0ZGRlZi5oPgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgogI2luY2x1ZGUgImNvbW1v bi9wZ19wcm5nLmgiCi0jaW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKICNpbmNsdWRlICJmbWdyLmgi CisjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMvYml0bWFwc2V0LmgiCiAj aW5jbHVkZSAibm9kZXMvbm9kZXMuaCIKICNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCisjaW5j bHVkZSAidXRpbHMvYXJyYXkuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1 ZGUgInV0aWxzL3RpbWVzdGFtcC5oIgogCkBAIC00Myw2ICs0NCw3IEBAIFBHX0ZVTkNUSU9OX0lO Rk9fVjEodGVzdF9ibXNfc3Vic2V0X2NvbXBhcmUpOwogUEdfRlVOQ1RJT05fSU5GT19WMSh0ZXN0 X2Jtc191bmlvbik7CiBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3RfYm1zX2ludGVyc2VjdCk7CiBQ R19GVU5DVElPTl9JTkZPX1YxKHRlc3RfYm1zX2RpZmZlcmVuY2UpOworUEdfRlVOQ1RJT05fSU5G T19WMSh0ZXN0X2Jtc19vZmZzZXRfbWVtYmVycyk7CiBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3Rf Ym1zX2lzX2VtcHR5KTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEodGVzdF9ibXNfbWVtYmVyc2hpcCk7 CiBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3RfYm1zX3NpbmdsZXRvbl9tZW1iZXIpOwpAQCAtNjUs NiArNjcsNyBAQCBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3RfYml0bWFwX21hdGNoKTsKIAogLyog VGVzdCB1dGlsaXR5IGZ1bmN0aW9ucyAqLwogUEdfRlVOQ1RJT05fSU5GT19WMSh0ZXN0X3JhbmRv bV9vcGVyYXRpb25zKTsKK1BHX0ZVTkNUSU9OX0lORk9fVjEodGVzdF9yYW5kb21fb2Zmc2V0X29w ZXJhdGlvbnMpOwogCiAvKiBDb252ZW5pZW50IG1hY3JvcyB0byB0ZXN0IHJlc3VsdHMgKi8KICNk ZWZpbmUgRVhQRUNUX1RSVUUoZXhwcikJXApAQCAtMjk1LDYgKzI5OCwxOCBAQCB0ZXN0X2Jtc19k aWZmZXJlbmNlKFBHX0ZVTkNUSU9OX0FSR1MpCiAJUEdfUkVUVVJOX0JJVE1BUFNFVF9BU19URVhU KHJlc3VsdF9ibXMpOwogfQogCitEYXR1bQordGVzdF9ibXNfb2Zmc2V0X21lbWJlcnMoUEdfRlVO Q1RJT05fQVJHUykKK3sKKwlCaXRtYXBzZXQgICpibXMgPSBQR19BUkdfR0VUQklUTUFQU0VUKDAp OworCWludAkJCW9mZnNldCA9IFBHX0dFVEFSR19JTlQzMigxKTsKKworCS8qIGxlZnQgaW5wdXQg Z2V0cyByZWN5Y2xlZCAqLworCWJtcyA9IGJtc19vZmZzZXRfbWVtYmVycyhibXMsIG9mZnNldCk7 CisKKwlQR19SRVRVUk5fQklUTUFQU0VUX0FTX1RFWFQoYm1zKTsKK30KKwogRGF0dW0KIHRlc3Rf Ym1zX2NvbXBhcmUoUEdfRlVOQ1RJT05fQVJHUykKIHsKQEAgLTU4MCw3ICs1OTUsNyBAQCB0ZXN0 X2JpdG1hcF9tYXRjaChQR19GVU5DVElPTl9BUkdTKQogfQogCiAvKgotICogQ29udHJhcnkgdG8g YWxsIHRoZSBvdGhlciBmdW5jdGlvbnMgd2hpY2ggYXJlIG9uZS1vbmUgbWFwcGluZ3Mgd2l0aCB0 aGUKKyAqIENvbnRyYXJ5IHRvIG1vc3Qgb2YgdGhlIG90aGVyIGZ1bmN0aW9ucyB3aGljaCBhcmUg b25lLW9uZSBtYXBwaW5ncyB3aXRoIHRoZQogICogZXF1aXZhbGVudCBDIGZ1bmN0aW9ucywgdGhp cyBzdHJlc3NlcyBCaXRtYXBzZXRzIGluIGEgcmFuZG9tIGZhc2hpb24gZm9yCiAgKiB2YXJpb3Vz IG9wZXJhdGlvbnMuCiAgKgpAQCAtNzQyLDMgKzc1Nyw4OSBAQCB0ZXN0X3JhbmRvbV9vcGVyYXRp b25zKFBHX0ZVTkNUSU9OX0FSR1MpCiAKIAlQR19SRVRVUk5fSU5UMzIodG90YWxfb3BzKTsKIH0K KworLyoKKyAqIFJhbmRvbSB0ZXN0aW5nIGZvciBibXNfb2Zmc2V0X21lbWJlcnMoKS4gIEdlbmVy YXRlcyBhIHJhbmRvbSBzZXQgYW5kIHRoZW4KKyAqIHBpY2tzIGEgbnVtYmVyIHRvIG9mZnNldCB0 aGUgbWVtYmVycyBieS4gIFdlIHRoZW4gY3JlYXRlIGFub3RoZXIgc2V0LCB3aGljaAorICogaXMg YnVpbHQgYnkgbG9vcGluZyBvdmVyIHRoZSBtZW1iZXJzIG9mIHRoZSByYW5kb20gc2V0IGFuZCBw ZXJmb3JtaW5nCisgKiBibXNfYWRkX21lbWJlciBhbmQgYWRkaW5nIG9uIHRoZSBvZmZzZXQgdG8g Y3JlYXRlIGEga25vd24gZ29vZCBzZXQgdG8KKyAqIGNvbXBhcmUgdGhlIHJlc3VsdCBvZiBibXNf b2Zmc2V0X21lbWJlcnMoKSB0by4KKyAqCisgKiBBcmd1bWVudHM6CisgKglhcmcxOiBvcHRpb25h bCByYW5kb20gc2VlZCwgb3IgPCAwIHRvIHVzZSBhIHJhbmRvbSBzZWVkLgorICogIGFyZzI6IHRo ZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0byBwZXJmb3JtLgorICogIGFyZzM6IHRoZSBtYXhpbXVt IGJpdG1hcHNldCBtZW1iZXIgbnVtYmVyIHRvIHVzZSBpbiB0aGUgcmFuZG9tIHNldC4KKyAqICBh cmc0OiB0aGUgbWluaW11bSBiaXRtYXBzZXQgbWVtYmVyIG51bWJlciB0byB1c2UgaW4gdGhlIHJh bmRvbSBzZXQuCisgKi8KK0RhdHVtCit0ZXN0X3JhbmRvbV9vZmZzZXRfb3BlcmF0aW9ucyhQR19G VU5DVElPTl9BUkdTKQoreworCXBnX3Bybmdfc3RhdGUgc3RhdGU7CisJdWludDY0CQlzZWVkOwor CWludAkJCW51bV9vcHM7CisJaW50CQkJbWF4X3JhbmdlOworCWludAkJCW1pbl92YWx1ZTsKKwlp bnQJCQltZW1iZXI7CisKKwlpZiAoUEdfQVJHSVNOVUxMKDApKQorCQlzZWVkID0gR2V0Q3VycmVu dFRpbWVzdGFtcCgpOworCWVsc2UKKwkJc2VlZCA9IFBHX0dFVEFSR19JTlQ2NCgwKTsKKworCW51 bV9vcHMgPSBQR19HRVRBUkdfSU5UMzIoMSk7CisJbWF4X3JhbmdlID0gUEdfR0VUQVJHX0lOVDMy KDIpOworCW1pbl92YWx1ZSA9IFBHX0dFVEFSR19JTlQzMigzKTsKKworCWlmIChQR19BUkdJU05V TEwoMSkgfHwgbnVtX29wcyA8PSAwKQorCQllbG9nKEVSUk9SLCAiaW52YWxpZCBudW1iZXIgb2Yg b3BlcmF0aW9ucyIpOworCWlmIChQR19BUkdJU05VTEwoMikgfHwgbWF4X3JhbmdlIDw9IDApCisJ CWVsb2coRVJST1IsICJpbnZhbGlkIG1heGltdW0gcmFuZ2UiKTsKKwlpZiAoUEdfQVJHSVNOVUxM KDMpIHx8IG1pbl92YWx1ZSA8IDApCisJCWVsb2coRVJST1IsICJpbnZhbGlkIG1pbmltdW0gdmFs dWUiKTsKKworCXBnX3Bybmdfc2VlZCgmc3RhdGUsIHNlZWQpOworCisJZm9yIChpbnQgb3AgPSAw OyBvcCA8IG51bV9vcHM7IG9wKyspCisJeworCQlCaXRtYXBzZXQgICpyYW5kb21fYm1zID0gTlVM TDsKKwkJQml0bWFwc2V0ICAqb2Zmc2V0X2JtczE7CisJCUJpdG1hcHNldCAgKm9mZnNldF9ibXMy ID0gTlVMTDsKKwkJaW50CQkJb2Zmc2V0OworCQlpbnQJCQlubWVtYmVyczsKKworCQlDSEVDS19G T1JfSU5URVJSVVBUUygpOworCisJCS8qIEZpZ3VyZSBvdXQgYSByYW5kb20gb2Zmc2V0IGFuZCBo b3cgbWFueSBtZW1iZXJzIHRvIGFkZCAqLworCQlvZmZzZXQgPSAocGdfcHJuZ191aW50MzIoJnN0 YXRlKSAlIG1heF9yYW5nZSkgLSAocGdfcHJuZ191aW50MzIoJnN0YXRlKSAlIG1heF9yYW5nZSk7 CisJCW5tZW1iZXJzID0gcGdfcHJuZ191aW50MzIoJnN0YXRlKSAlIG1heF9yYW5nZSArIG1pbl92 YWx1ZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG5tZW1iZXJzOyBpKyspCisJCXsKKwkJCW1l bWJlciA9IHBnX3BybmdfdWludDMyKCZzdGF0ZSkgJSBtYXhfcmFuZ2UgKyBtaW5fdmFsdWU7CisJ CQlyYW5kb21fYm1zID0gYm1zX2FkZF9tZW1iZXIocmFuZG9tX2JtcywgbWVtYmVyKTsKKwkJfQor CisJCS8qIGNyZWF0ZSBhIGtub3duLWdvb2Qgc2V0IHRoZSBvbGQgZmFzaGlvbmVkIHdheSAqLwor CQlvZmZzZXRfYm1zMiA9IE5VTEw7CisJCW1lbWJlciA9IC0xOworCQl3aGlsZSAoKG1lbWJlciA9 IGJtc19uZXh0X21lbWJlcihyYW5kb21fYm1zLCBtZW1iZXIpKSA+PSAwKQorCQl7CisJCQlpZiAo bWVtYmVyICsgb2Zmc2V0ID49IDApCisJCQkJb2Zmc2V0X2JtczIgPSBibXNfYWRkX21lbWJlcihv ZmZzZXRfYm1zMiwgbWVtYmVyICsgb2Zmc2V0KTsKKwkJfQorCisJCS8qIGRvIHRoZSBvZmZzZXR0 aW5nICovCisJCW9mZnNldF9ibXMxID0gYm1zX29mZnNldF9tZW1iZXJzKHJhbmRvbV9ibXMsIG9m ZnNldCk7CisKKwkJLyogY2hlY2sgYWdhaW5zdCB0aGUga25vd24tZ29vZCBzZXQgKi8KKwkJaWYg KCFibXNfZXF1YWwob2Zmc2V0X2JtczEsIG9mZnNldF9ibXMyKSkKKwkJCWVsb2coRVJST1IsICJi bXNfb2Zmc2V0X21lbWJlcnMgZmFpbGVkIHdpdGggb2Zmc2V0ICVkIHNlZWQgIiBJTlQ2NF9GT1JN QVQsIG9mZnNldCwgc2VlZCk7CisKKwkJLyogQ2xlYW51cCBiZWZvcmUgdGhlIG5leHQgbG9vcCAq LworCQlibXNfZnJlZShyYW5kb21fYm1zKTsKKwkJYm1zX2ZyZWUob2Zmc2V0X2JtczEpOworCQli bXNfZnJlZShvZmZzZXRfYm1zMik7CisJfQorCisJUEdfUkVUVVJOX0lOVDMyKG51bV9vcHMpOwor fQotLSAKMi41MS4wCgo= --0000000000009f659e064fb75029--