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 1mbN3o-0002r2-6V for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Oct 2021 13:15:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mbN3n-0001S1-19 for pgsql-hackers@arkaria.postgresql.org; Fri, 15 Oct 2021 13:15:43 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mbN3m-0001Rr-Jm for pgsql-hackers@lists.postgresql.org; Fri, 15 Oct 2021 13:15:42 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mbN3f-000791-Gu for pgsql-hackers@postgresql.org; Fri, 15 Oct 2021 13:15:42 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 0078521C3834 for ; Fri, 15 Oct 2021 16:15:33 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1634303734; bh=YRhBlbuNbl9qQSFKhD5NwUx5O0fHHo6NQRsEHnMwpu8=; h=Date:From:To:Subject; b=QdGt0Uo88MJOUqahgTqSh1wEC37x091ZuElaG9jCy5/x4t5kbNF7LvlChH5YMBuiq BKszO0mxrctuQxoZFi2iJqeyKImf2WTHKe8pZBat9L3UeKge9PBZ5J036o7jkWUF4B FbiSQ8HMdRa/7qm4RgLYuAWeOy/ZVsnc9p+vhDAo= MIME-Version: 1.0 Date: Fri, 15 Oct 2021 16:15:33 +0300 From: Alexander Pyhalov To: pgsql-hackers@postgresql.org Subject: Partial aggregates pushdown User-Agent: Roundcube Webmail/1.4.11 Message-ID: X-Sender: a.pyhalov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_4d1b94f256a1424df3dd68b88502ffa1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_4d1b94f256a1424df3dd68b88502ffa1 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Hi. One of the issues when we try to use sharding in PostgreSQL is absence of partial aggregates pushdown. I see several opportunities to alleviate this issue. If we look at Citus, it implements aggregate, calculating internal state of an arbitrary agregate function and exporting it as text. So we could calculate internal states independently on all data sources and then finalize it, which allows to compute arbitrary aggregate. But, as mentioned in [1] thread, for some functions (like count/max/min/sum) we can just push down them. It seems easy and covers a lot of cases. For now there are still issues - for example you can't handle functions as avg() as we should somehow get its internal state or sum() variants, which need aggserialfn/aggdeserialfn. Preliminary version is attached. Is someone else working on the issue? Does suggested approach make sense? [1] https://www.postgresql.org/message-id/flat/9998c3af9fdb5f7d62a6c7ad0fcd9142%40postgrespro.ru -- Best regards, Alexander Pyhalov, Postgres Professional --=_4d1b94f256a1424df3dd68b88502ffa1 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0001-Partial-aggregates-push-down.patch Content-Disposition: attachment; filename=0001-Partial-aggregates-push-down.patch; size=22478 RnJvbSBmMmNmODdhMGJhMWY0ZTRiZjNmNWY5ZTViMTBiNzgyYzUxNzE3YmFmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgUHloYWxvdiA8YS5weWhhbG92QHBvc3RncmVz cHJvLnJ1PgpEYXRlOiBUaHUsIDE0IE9jdCAyMDIxIDE3OjMwOjM0ICswMzAwClN1YmplY3Q6IFtQ QVRDSF0gUGFydGlhbCBhZ2dyZWdhdGVzIHB1c2ggZG93bgoKLS0tCiBjb250cmliL3Bvc3RncmVz X2Zkdy9kZXBhcnNlLmMgICAgICAgICAgICAgICAgfCAgNTkgKysrKy0KIC4uLi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCAgICB8IDIxNSArKysrKysrKysrKysrKysrKy0K IGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jICAgICAgICAgICB8ICAyOSArKy0K IGNvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsICAgICB8ICAzMSArKy0K IDQgZmlsZXMgY2hhbmdlZCwgMzEwIGluc2VydGlvbnMoKyksIDI0IGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYyBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L2RlcGFyc2UuYwppbmRleCBkOThiZDY2NjgxOC4uMGU0YWMwYWQyNTUgMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYworKysgYi9jb250cmliL3Bvc3RncmVz X2Zkdy9kZXBhcnNlLmMKQEAgLTE5Niw2ICsxOTYsNyBAQCBzdGF0aWMgYm9vbCBpc19zdWJxdWVy eV92YXIoVmFyICpub2RlLCBSZWxPcHRJbmZvICpmb3JlaWducmVsLAogc3RhdGljIHZvaWQgZ2V0 X3JlbGF0aW9uX2NvbHVtbl9hbGlhc19pZHMoVmFyICpub2RlLCBSZWxPcHRJbmZvICpmb3JlaWdu cmVsLAogCQkJCQkJCQkJCSAgaW50ICpyZWxubywgaW50ICpjb2xubyk7CiAKK3N0YXRpYyBib29s IHBhcnRpYWxfYWdnX29rKEFnZ3JlZiAqYWdnKTsKIAogLyoKICAqIEV4YW1pbmUgZWFjaCBxdWFs IGNsYXVzZSBpbiBpbnB1dF9jb25kcywgYW5kIGNsYXNzaWZ5IHRoZW0gaW50byB0d28gZ3JvdXBz LApAQCAtODMxLDggKzgzMiwxMCBAQCBmb3JlaWduX2V4cHJfd2Fsa2VyKE5vZGUgKm5vZGUsCiAJ CQkJaWYgKCFJU19VUFBFUl9SRUwoZ2xvYl9jeHQtPmZvcmVpZ25yZWwpKQogCQkJCQlyZXR1cm4g ZmFsc2U7CiAKLQkJCQkvKiBPbmx5IG5vbi1zcGxpdCBhZ2dyZWdhdGVzIGFyZSBwdXNoYWJsZS4g Ki8KLQkJCQlpZiAoYWdnLT5hZ2dzcGxpdCAhPSBBR0dTUExJVF9TSU1QTEUpCisJCQkJaWYgKChh Z2ctPmFnZ3NwbGl0ICE9IEFHR1NQTElUX1NJTVBMRSkgJiYgKGFnZy0+YWdnc3BsaXQgIT0gQUdH U1BMSVRfSU5JVElBTF9TRVJJQUwpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQlpZiAoYWdn LT5hZ2dzcGxpdCA9PSBBR0dTUExJVF9JTklUSUFMX1NFUklBTCAmJiAhcGFydGlhbF9hZ2dfb2so YWdnKSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCiAJCQkJLyogQXMgdXN1YWwsIGl0IG11c3QgYmUg c2hpcHBhYmxlLiAqLwpAQCAtMzI0OSw3ICszMjUyLDcgQEAgZGVwYXJzZUFnZ3JlZihBZ2dyZWYg Km5vZGUsIGRlcGFyc2VfZXhwcl9jeHQgKmNvbnRleHQpCiAJYm9vbAkJdXNlX3ZhcmlhZGljOwog CiAJLyogT25seSBiYXNpYywgbm9uLXNwbGl0IGFnZ3JlZ2F0aW9uIGFjY2VwdGVkLiAqLwotCUFz c2VydChub2RlLT5hZ2dzcGxpdCA9PSBBR0dTUExJVF9TSU1QTEUpOworCUFzc2VydChub2RlLT5h Z2dzcGxpdCA9PSBBR0dTUExJVF9TSU1QTEUgfHwgbm9kZS0+YWdnc3BsaXQgPT0gQUdHU1BMSVRf SU5JVElBTF9TRVJJQUwpOwogCiAJLyogQ2hlY2sgaWYgbmVlZCB0byBwcmludCBWQVJJQURJQyAo Y2YuIHJ1bGV1dGlscy5jKSAqLwogCXVzZV92YXJpYWRpYyA9IG5vZGUtPmFnZ3ZhcmlhZGljOwpA QCAtMzcxOSwzICszNzIyLDUzIEBAIGdldF9yZWxhdGlvbl9jb2x1bW5fYWxpYXNfaWRzKFZhciAq bm9kZSwgUmVsT3B0SW5mbyAqZm9yZWlnbnJlbCwKIAkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8K IAllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBleHByZXNzaW9uIGluIHN1YnF1ZXJ5IG91dHB1dCIp OwogfQorCisvKgorICogQ2hlY2sgdGhhdCBwYXJ0aWFsIGFnZ3JlZ2F0ZSBhZ2cgaXMgZmluZSB0 byBwdXNoIGRvd24KKyAqLworc3RhdGljIGJvb2wKK3BhcnRpYWxfYWdnX29rKEFnZ3JlZiAqYWdn KQoreworCUhlYXBUdXBsZQlwcm9jdHVwOworCUZvcm1fcGdfcHJvYyBwcm9jZm9ybTsKKwljb25z dCBjaGFyICpwcm9uYW1lOworCWJvb2wJCW9rID0gZmFsc2U7CisKKwlBc3NlcnQoYWdnLT5hZ2dz cGxpdCA9PSBBR0dTUExJVF9JTklUSUFMX1NFUklBTCk7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0 IGNvbXBsZXggcGFydGlhbCBhZ2dyZWdhdGVzICovCisJaWYgKGFnZy0+YWdnZGlzdGluY3QgfHwg YWdnLT5hZ2d2YXJpYWRpYyB8fCBhZ2ctPmFnZ2tpbmQgIT0gQUdHS0lORF9OT1JNQUwgfHwgYWdn LT5hZ2dvcmRlciAhPSBOSUwpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENhbid0IHByb2Nlc3Mg YWdncmVnYXRlcyB3aGljaCByZXF1aXJlIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uICov CisJaWYgKGFnZy0+YWdndHJhbnN0eXBlID09IElOVEVSTkFMT0lEKQorCQlyZXR1cm4gZmFsc2U7 CisKKwlwcm9jdHVwID0gU2VhcmNoU3lzQ2FjaGUxKFBST0NPSUQsIE9iamVjdElkR2V0RGF0dW0o YWdnLT5hZ2dmbm9pZCkpOworCWlmICghSGVhcFR1cGxlSXNWYWxpZChwcm9jdHVwKSkKKwkJZWxv ZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGZ1bmN0aW9uICV1IiwgYWdnLT5hZ2dm bm9pZCk7CisJcHJvY2Zvcm0gPSAoRm9ybV9wZ19wcm9jKSBHRVRTVFJVQ1QocHJvY3R1cCk7CisK KwkvKiBPbmx5IHN5c3RlbSBhZ2dyZWdhdGVzIGFyZSBhbGxvd2VkICovCisJaWYgKHByb2Nmb3Jt LT5wcm9uYW1lc3BhY2UgIT0gUEdfQ0FUQUxPR19OQU1FU1BBQ0UpCisJeworCQlSZWxlYXNlU3lz Q2FjaGUocHJvY3R1cCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEVuc3VyZSB0 aGF0IHRoaXMgcGFydGlhbCBhZ2dyZWdhdGUgY2FuIGJlIGV2YWx1YXRlZCBkaXJlY3RseS4gV2Ug Y2hlY2sKKwkgKiBmdW5jdGlvbiBuYW1lIHRvIGF2b2lkIGNoZWNraW5nIGEgZG96ZW4gZnVuY3Rp b24gdmFyaWFudHMuCisJICovCisJcHJvbmFtZSA9IE5hbWVTdHIocHJvY2Zvcm0tPnByb25hbWUp OworCisJaWYgKHN0cmNtcChwcm9uYW1lLCAibWluIikgPT0gMCB8fAorCQlzdHJjbXAocHJvbmFt ZSwgIm1heCIpID09IDAgfHwKKwkJc3RyY21wKHByb25hbWUsICJjb3VudCIpID09IDAgfHwKKwkJ c3RyY21wKHByb25hbWUsICJzdW0iKSA9PSAwKQorCQlvayA9IHRydWU7CisKKwlSZWxlYXNlU3lz Q2FjaGUocHJvY3R1cCk7CisKKwlyZXR1cm4gb2s7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3Bv c3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0IGIvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAppbmRleCA0NGM0MzY3YjhmOS4uODk0NTFlMjA4 ZTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zk dy5vdXQKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91 dApAQCAtOTI3OSwxMyArOTI3OSwxMyBAQCBSRVNFVCBlbmFibGVfcGFydGl0aW9ud2lzZV9qb2lu OwogLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQogLS0gdGVzdCBwYXJ0aXRpb253aXNlIGFnZ3JlZ2F0ZXMKIC0tID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLUNSRUFURSBUQUJMRSBwYWdnX3RhYiAoYSBpbnQsIGIgaW50LCBjIHRleHQpIFBB UlRJVElPTiBCWSBSQU5HRShhKTsKK0NSRUFURSBUQUJMRSBwYWdnX3RhYiAoYSBpbnQsIGIgaW50 LCBjIHRleHQsIGQgbnVtZXJpYykgUEFSVElUSU9OIEJZIFJBTkdFKGEpOwogQ1JFQVRFIFRBQkxF IHBhZ2dfdGFiX3AxIChMSUtFIHBhZ2dfdGFiKTsKIENSRUFURSBUQUJMRSBwYWdnX3RhYl9wMiAo TElLRSBwYWdnX3RhYik7CiBDUkVBVEUgVEFCTEUgcGFnZ190YWJfcDMgKExJS0UgcGFnZ190YWIp OwotSU5TRVJUIElOVE8gcGFnZ190YWJfcDEgU0VMRUNUIGkgJSAzMCwgaSAlIDUwLCB0b19jaGFy KGkvMzAsICdGTTAwMDAnKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMDAwKSBpIFdIRVJFIChp ICUgMzApIDwgMTA7Ci1JTlNFUlQgSU5UTyBwYWdnX3RhYl9wMiBTRUxFQ1QgaSAlIDMwLCBpICUg NTAsIHRvX2NoYXIoaS8zMCwgJ0ZNMDAwMCcpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwMDAp IGkgV0hFUkUgKGkgJSAzMCkgPCAyMCBhbmQgKGkgJSAzMCkgPj0gMTA7Ci1JTlNFUlQgSU5UTyBw YWdnX3RhYl9wMyBTRUxFQ1QgaSAlIDMwLCBpICUgNTAsIHRvX2NoYXIoaS8zMCwgJ0ZNMDAwMCcp IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwMDApIGkgV0hFUkUgKGkgJSAzMCkgPCAzMCBhbmQg KGkgJSAzMCkgPj0gMjA7CitJTlNFUlQgSU5UTyBwYWdnX3RhYl9wMSBTRUxFQ1QgaSAlIDMwLCBp ICUgNTAsIHRvX2NoYXIoaS8zMCwgJ0ZNMDAwMCcpLCBpICUgNDAgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwgMzAwMCkgaSBXSEVSRSAoaSAlIDMwKSA8IDEwOworSU5TRVJUIElOVE8gcGFnZ190YWJf cDIgU0VMRUNUIGkgJSAzMCwgaSAlIDUwLCB0b19jaGFyKGkvMzAsICdGTTAwMDAnKSwgaSAlIDQw IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwMDApIGkgV0hFUkUgKGkgJSAzMCkgPCAyMCBhbmQg KGkgJSAzMCkgPj0gMTA7CitJTlNFUlQgSU5UTyBwYWdnX3RhYl9wMyBTRUxFQ1QgaSAlIDMwLCBp ICUgNTAsIHRvX2NoYXIoaS8zMCwgJ0ZNMDAwMCcpLCBpICUgNDAgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwgMzAwMCkgaSBXSEVSRSAoaSAlIDMwKSA8IDMwIGFuZCAoaSAlIDMwKSA+PSAyMDsKIC0t IENyZWF0ZSBmb3JlaWduIHBhcnRpdGlvbnMKIENSRUFURSBGT1JFSUdOIFRBQkxFIGZwYWdnX3Rh Yl9wMSBQQVJUSVRJT04gT0YgcGFnZ190YWIgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTApIFNF UlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1lICdwYWdnX3RhYl9wMScpOwogQ1JFQVRF IEZPUkVJR04gVEFCTEUgZnBhZ2dfdGFiX3AyIFBBUlRJVElPTiBPRiBwYWdnX3RhYiBGT1IgVkFM VUVTIEZST00gKDEwKSBUTyAoMjApIFNFUlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1l ICdwYWdnX3RhYl9wMicpOwpAQCAtOTM0NCw4ICs5MzQ0LDggQEAgU0VMRUNUIGEsIHN1bShiKSwg bWluKGIpLCBjb3VudCgqKSBGUk9NIHBhZ2dfdGFiIEdST1VQIEJZIGEgSEFWSU5HIGF2ZyhiKSA8 IDIyIE8KIC0tIFNob3VsZCBoYXZlIGFsbCB0aGUgY29sdW1ucyBpbiB0aGUgdGFyZ2V0IGxpc3Qg Zm9yIHRoZSBnaXZlbiByZWxhdGlvbgogRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQogU0VM RUNUIGEsIGNvdW50KHQxKSBGUk9NIHBhZ2dfdGFiIHQxIEdST1VQIEJZIGEgSEFWSU5HIGF2Zyhi KSA8IDIyIE9SREVSIEJZIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBTb3J0CiAgICBPdXRwdXQ6IHQx LmEsIChjb3VudCgoKHQxLiopOjpwYWdnX3RhYikpKQogICAgU29ydCBLZXk6IHQxLmEKQEAgLTkz NTYsMjEgKzkzNTYsMjEgQEAgU0VMRUNUIGEsIGNvdW50KHQxKSBGUk9NIHBhZ2dfdGFiIHQxIEdS T1VQIEJZIGEgSEFWSU5HIGF2ZyhiKSA8IDIyIE9SREVSIEJZIDE7CiAgICAgICAgICAgICAgICBG aWx0ZXI6IChhdmcodDEuYikgPCAnMjInOjpudW1lcmljKQogICAgICAgICAgICAgICAgLT4gIEZv cmVpZ24gU2NhbiBvbiBwdWJsaWMuZnBhZ2dfdGFiX3AxIHQxCiAgICAgICAgICAgICAgICAgICAg ICBPdXRwdXQ6IHQxLmEsIHQxLiosIHQxLmIKLSAgICAgICAgICAgICAgICAgICAgIFJlbW90ZSBT UUw6IFNFTEVDVCBhLCBiLCBjIEZST00gcHVibGljLnBhZ2dfdGFiX3AxCisgICAgICAgICAgICAg ICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSwgYiwgYywgZCBGUk9NIHB1YmxpYy5wYWdnX3Rh Yl9wMQogICAgICAgICAgLT4gIEhhc2hBZ2dyZWdhdGUKICAgICAgICAgICAgICAgIE91dHB1dDog dDFfMS5hLCBjb3VudCgoKHQxXzEuKik6OnBhZ2dfdGFiKSkKICAgICAgICAgICAgICAgIEdyb3Vw IEtleTogdDFfMS5hCiAgICAgICAgICAgICAgICBGaWx0ZXI6IChhdmcodDFfMS5iKSA8ICcyMic6 Om51bWVyaWMpCiAgICAgICAgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mcGFn Z190YWJfcDIgdDFfMQogICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiB0MV8xLmEsIHQxXzEu KiwgdDFfMS5iCi0gICAgICAgICAgICAgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSwgYiwg YyBGUk9NIHB1YmxpYy5wYWdnX3RhYl9wMgorICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNR TDogU0VMRUNUIGEsIGIsIGMsIGQgRlJPTSBwdWJsaWMucGFnZ190YWJfcDIKICAgICAgICAgIC0+ ICBIYXNoQWdncmVnYXRlCiAgICAgICAgICAgICAgICBPdXRwdXQ6IHQxXzIuYSwgY291bnQoKCh0 MV8yLiopOjpwYWdnX3RhYikpCiAgICAgICAgICAgICAgICBHcm91cCBLZXk6IHQxXzIuYQogICAg ICAgICAgICAgICAgRmlsdGVyOiAoYXZnKHQxXzIuYikgPCAnMjInOjpudW1lcmljKQogICAgICAg ICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnBhZ2dfdGFiX3AzIHQxXzIKICAg ICAgICAgICAgICAgICAgICAgIE91dHB1dDogdDFfMi5hLCB0MV8yLiosIHQxXzIuYgotICAgICAg ICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEsIGIsIGMgRlJPTSBwdWJsaWMucGFn Z190YWJfcDMKKyAgICAgICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhLCBiLCBj LCBkIEZST00gcHVibGljLnBhZ2dfdGFiX3AzCiAoMjUgcm93cykKIAogU0VMRUNUIGEsIGNvdW50 KHQxKSBGUk9NIHBhZ2dfdGFiIHQxIEdST1VQIEJZIGEgSEFWSU5HIGF2ZyhiKSA8IDIyIE9SREVS IEJZIDE7CkBAIC05NDA2LDYgKzk0MDYsMjAzIEBAIFNFTEVDVCBiLCBhdmcoYSksIG1heChhKSwg Y291bnQoKikgRlJPTSBwYWdnX3RhYiBHUk9VUCBCWSBiIEhBVklORyBzdW0oYSkgPCA3MDAKICAg ICAgICAgICAgICAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gZnBhZ2dfdGFiX3AzIHBhZ2df dGFiXzIKICgxNSByb3dzKQogCistLSBJdCdzIHVuc2FmZSB0byBwdXNoIGRvd24gaGF2aW5nIGNs YXVzZSB3aGVuIHRoZXJlIGFyZSBwYXJ0aWFsIGFnZ3JlZ2F0ZXMKK0VYUExBSU4gKFZFUkJPU0Us IENPU1RTIE9GRikKK1NFTEVDVCBiLCBtYXgoYSksIGNvdW50KCopIEZST00gcGFnZ190YWIgR1JP VVAgQlkgYiBIQVZJTkcgc3VtKGEpIDwgNzAwIE9SREVSIEJZIDE7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNvcnQKKyAgIE91 dHB1dDogcGFnZ190YWIuYiwgKG1heChwYWdnX3RhYi5hKSksIChjb3VudCgqKSkKKyAgIFNvcnQg S2V5OiBwYWdnX3RhYi5iCisgICAtPiAgRmluYWxpemUgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAg T3V0cHV0OiBwYWdnX3RhYi5iLCBtYXgocGFnZ190YWIuYSksIGNvdW50KCopCisgICAgICAgICBH cm91cCBLZXk6IHBhZ2dfdGFiLmIKKyAgICAgICAgIEZpbHRlcjogKHN1bShwYWdnX3RhYi5hKSA8 IDcwMCkKKyAgICAgICAgIC0+ICBBcHBlbmQKKyAgICAgICAgICAgICAgIC0+ICBQYXJ0aWFsIEhh c2hBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgIE91dHB1dDogcGFnZ190YWIuYiwgUEFS VElBTCBtYXgocGFnZ190YWIuYSksIFBBUlRJQUwgY291bnQoKiksIFBBUlRJQUwgc3VtKHBhZ2df dGFiLmEpCisgICAgICAgICAgICAgICAgICAgICBHcm91cCBLZXk6IHBhZ2dfdGFiLmIKKyAgICAg ICAgICAgICAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZwYWdnX3RhYl9wMSBw YWdnX3RhYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYi5iLCBw YWdnX3RhYi5hCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1Qg YSwgYiBGUk9NIHB1YmxpYy5wYWdnX3RhYl9wMQorICAgICAgICAgICAgICAgLT4gIFBhcnRpYWwg SGFzaEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYl8xLmIs IFBBUlRJQUwgbWF4KHBhZ2dfdGFiXzEuYSksIFBBUlRJQUwgY291bnQoKiksIFBBUlRJQUwgc3Vt KHBhZ2dfdGFiXzEuYSkKKyAgICAgICAgICAgICAgICAgICAgIEdyb3VwIEtleTogcGFnZ190YWJf MS5iCisgICAgICAgICAgICAgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mcGFn Z190YWJfcDIgcGFnZ190YWJfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBw YWdnX3RhYl8xLmIsIHBhZ2dfdGFiXzEuYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVt b3RlIFNRTDogU0VMRUNUIGEsIGIgRlJPTSBwdWJsaWMucGFnZ190YWJfcDIKKyAgICAgICAgICAg ICAgIC0+ICBQYXJ0aWFsIEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgIE91dHB1 dDogcGFnZ190YWJfMi5iLCBQQVJUSUFMIG1heChwYWdnX3RhYl8yLmEpLCBQQVJUSUFMIGNvdW50 KCopLCBQQVJUSUFMIHN1bShwYWdnX3RhYl8yLmEpCisgICAgICAgICAgICAgICAgICAgICBHcm91 cCBLZXk6IHBhZ2dfdGFiXzIuYgorICAgICAgICAgICAgICAgICAgICAgLT4gIEZvcmVpZ24gU2Nh biBvbiBwdWJsaWMuZnBhZ2dfdGFiX3AzIHBhZ2dfdGFiXzIKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgIE91dHB1dDogcGFnZ190YWJfMi5iLCBwYWdnX3RhYl8yLmEKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhLCBiIEZST00gcHVibGljLnBhZ2dfdGFi X3AzCisoMjYgcm93cykKKworLS0gUGFydGlhbCBhZ2dyZWdhdGVzIGFyZSBmaW5lIHRvIHB1c2gg ZG93biB3aXRob3V0IGhhdmluZyBjbGF1c2UKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCBiLCBtYXgoYSksIGNvdW50KCopIEZST00gcGFnZ190YWIgR1JPVVAgQlkgYiBPUkRF UiBCWSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU29ydAorICAgT3V0cHV0OiBwYWdnX3Rh Yi5iLCAobWF4KHBhZ2dfdGFiLmEpKSwgKGNvdW50KCopKQorICAgU29ydCBLZXk6IHBhZ2dfdGFi LmIKKyAgIC0+ICBGaW5hbGl6ZSBIYXNoQWdncmVnYXRlCisgICAgICAgICBPdXRwdXQ6IHBhZ2df dGFiLmIsIG1heChwYWdnX3RhYi5hKSwgY291bnQoKikKKyAgICAgICAgIEdyb3VwIEtleTogcGFn Z190YWIuYgorICAgICAgICAgLT4gIEFwcGVuZAorICAgICAgICAgICAgICAgLT4gIEZvcmVpZ24g U2NhbgorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYi5iLCAoUEFSVElBTCBt YXgocGFnZ190YWIuYSkpLCAoUEFSVElBTCBjb3VudCgqKSkKKyAgICAgICAgICAgICAgICAgICAg IFJlbGF0aW9uczogQWdncmVnYXRlIG9uIChwdWJsaWMuZnBhZ2dfdGFiX3AxIHBhZ2dfdGFiKQor ICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGIsIG1heChhKSwgY291bnQo KikgRlJPTSBwdWJsaWMucGFnZ190YWJfcDEgR1JPVVAgQlkgMQorICAgICAgICAgICAgICAgLT4g IEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYl8xLmIs IChQQVJUSUFMIG1heChwYWdnX3RhYl8xLmEpKSwgKFBBUlRJQUwgY291bnQoKikpCisgICAgICAg ICAgICAgICAgICAgICBSZWxhdGlvbnM6IEFnZ3JlZ2F0ZSBvbiAocHVibGljLmZwYWdnX3RhYl9w MiBwYWdnX3RhYl8xKQorICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGIs IG1heChhKSwgY291bnQoKikgRlJPTSBwdWJsaWMucGFnZ190YWJfcDIgR1JPVVAgQlkgMQorICAg ICAgICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0 OiBwYWdnX3RhYl8yLmIsIChQQVJUSUFMIG1heChwYWdnX3RhYl8yLmEpKSwgKFBBUlRJQUwgY291 bnQoKikpCisgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnM6IEFnZ3JlZ2F0ZSBvbiAocHVi bGljLmZwYWdnX3RhYl9wMyBwYWdnX3RhYl8yKQorICAgICAgICAgICAgICAgICAgICAgUmVtb3Rl IFNRTDogU0VMRUNUIGIsIG1heChhKSwgY291bnQoKikgRlJPTSBwdWJsaWMucGFnZ190YWJfcDMg R1JPVVAgQlkgMQorKDE5IHJvd3MpCisKK1NFTEVDVCBiLCBtYXgoYSksIGNvdW50KCopIEZST00g cGFnZ190YWIgR1JPVVAgQlkgYiBPUkRFUiBCWSAxOworIGIgIHwgbWF4IHwgY291bnQgCistLS0t Ky0tLS0tKy0tLS0tLS0KKyAgMCB8ICAyMCB8ICAgIDYwCisgIDEgfCAgMjEgfCAgICA2MAorICAy IHwgIDIyIHwgICAgNjAKKyAgMyB8ICAyMyB8ICAgIDYwCisgIDQgfCAgMjQgfCAgICA2MAorICA1 IHwgIDI1IHwgICAgNjAKKyAgNiB8ICAyNiB8ICAgIDYwCisgIDcgfCAgMjcgfCAgICA2MAorICA4 IHwgIDI4IHwgICAgNjAKKyAgOSB8ICAyOSB8ICAgIDYwCisgMTAgfCAgMjAgfCAgICA2MAorIDEx IHwgIDIxIHwgICAgNjAKKyAxMiB8ICAyMiB8ICAgIDYwCisgMTMgfCAgMjMgfCAgICA2MAorIDE0 IHwgIDI0IHwgICAgNjAKKyAxNSB8ICAyNSB8ICAgIDYwCisgMTYgfCAgMjYgfCAgICA2MAorIDE3 IHwgIDI3IHwgICAgNjAKKyAxOCB8ICAyOCB8ICAgIDYwCisgMTkgfCAgMjkgfCAgICA2MAorIDIw IHwgIDIwIHwgICAgNjAKKyAyMSB8ICAyMSB8ICAgIDYwCisgMjIgfCAgMjIgfCAgICA2MAorIDIz IHwgIDIzIHwgICAgNjAKKyAyNCB8ICAyNCB8ICAgIDYwCisgMjUgfCAgMjUgfCAgICA2MAorIDI2 IHwgIDI2IHwgICAgNjAKKyAyNyB8ICAyNyB8ICAgIDYwCisgMjggfCAgMjggfCAgICA2MAorIDI5 IHwgIDI5IHwgICAgNjAKKyAzMCB8ICAyMCB8ICAgIDYwCisgMzEgfCAgMjEgfCAgICA2MAorIDMy IHwgIDIyIHwgICAgNjAKKyAzMyB8ICAyMyB8ICAgIDYwCisgMzQgfCAgMjQgfCAgICA2MAorIDM1 IHwgIDI1IHwgICAgNjAKKyAzNiB8ICAyNiB8ICAgIDYwCisgMzcgfCAgMjcgfCAgICA2MAorIDM4 IHwgIDI4IHwgICAgNjAKKyAzOSB8ICAyOSB8ICAgIDYwCisgNDAgfCAgMjAgfCAgICA2MAorIDQx IHwgIDIxIHwgICAgNjAKKyA0MiB8ICAyMiB8ICAgIDYwCisgNDMgfCAgMjMgfCAgICA2MAorIDQ0 IHwgIDI0IHwgICAgNjAKKyA0NSB8ICAyNSB8ICAgIDYwCisgNDYgfCAgMjYgfCAgICA2MAorIDQ3 IHwgIDI3IHwgICAgNjAKKyA0OCB8ICAyOCB8ICAgIDYwCisgNDkgfCAgMjkgfCAgICA2MAorKDUw IHJvd3MpCisKKy0tIFBhcnRpYWwgYWdncmVnYXRlcyBhcmUgZmluZSB0byBwdXNoIGRvd24KK0VY UExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBtYXgoYSksIGNvdW50KCopIEZST00g cGFnZ190YWI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZpbmFs aXplIEFnZ3JlZ2F0ZQorICAgT3V0cHV0OiBtYXgocGFnZ190YWIuYSksIGNvdW50KCopCisgICAt PiAgQXBwZW5kCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICAgICAgICBPdXRw dXQ6IChQQVJUSUFMIG1heChwYWdnX3RhYi5hKSksIChQQVJUSUFMIGNvdW50KCopKQorICAgICAg ICAgICAgICAgUmVsYXRpb25zOiBBZ2dyZWdhdGUgb24gKHB1YmxpYy5mcGFnZ190YWJfcDEgcGFn Z190YWIpCisgICAgICAgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgbWF4KGEpLCBjb3VudCgq KSBGUk9NIHB1YmxpYy5wYWdnX3RhYl9wMQorICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbgorICAg ICAgICAgICAgICAgT3V0cHV0OiAoUEFSVElBTCBtYXgocGFnZ190YWJfMS5hKSksIChQQVJUSUFM IGNvdW50KCopKQorICAgICAgICAgICAgICAgUmVsYXRpb25zOiBBZ2dyZWdhdGUgb24gKHB1Ymxp Yy5mcGFnZ190YWJfcDIgcGFnZ190YWJfMSkKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNF TEVDVCBtYXgoYSksIGNvdW50KCopIEZST00gcHVibGljLnBhZ2dfdGFiX3AyCisgICAgICAgICAt PiAgRm9yZWlnbiBTY2FuCisgICAgICAgICAgICAgICBPdXRwdXQ6IChQQVJUSUFMIG1heChwYWdn X3RhYl8yLmEpKSwgKFBBUlRJQUwgY291bnQoKikpCisgICAgICAgICAgICAgICBSZWxhdGlvbnM6 IEFnZ3JlZ2F0ZSBvbiAocHVibGljLmZwYWdnX3RhYl9wMyBwYWdnX3RhYl8yKQorICAgICAgICAg ICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIG1heChhKSwgY291bnQoKikgRlJPTSBwdWJsaWMucGFn Z190YWJfcDMKKygxNSByb3dzKQorCitTRUxFQ1QgbWF4KGEpLCBjb3VudCgqKSBGUk9NIHBhZ2df dGFiOworIG1heCB8IGNvdW50IAorLS0tLS0rLS0tLS0tLQorICAyOSB8ICAzMDAwCisoMSByb3cp CisKKy0tIFNob3VsZG4ndCB0cnkgdG8gcHVzaCBkb3duCitFWFBMQUlOIChWRVJCT1NFLCBDT1NU UyBPRkYpCitTRUxFQ1QgbWF4KGEpLCBjb3VudChkaXN0aW5jdCBiKSBGUk9NIHBhZ2dfdGFiOwor ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIE91dHB1dDogbWF4KHBhZ2dfdGFiLmEpLCBj b3VudChESVNUSU5DVCBwYWdnX3RhYi5iKQorICAgLT4gIEFwcGVuZAorICAgICAgICAgLT4gIEZv cmVpZ24gU2NhbiBvbiBwdWJsaWMuZnBhZ2dfdGFiX3AxIHBhZ2dfdGFiXzEKKyAgICAgICAgICAg ICAgIE91dHB1dDogcGFnZ190YWJfMS5hLCBwYWdnX3RhYl8xLmIKKyAgICAgICAgICAgICAgIFJl bW90ZSBTUUw6IFNFTEVDVCBhLCBiIEZST00gcHVibGljLnBhZ2dfdGFiX3AxCisgICAgICAgICAt PiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mcGFnZ190YWJfcDIgcGFnZ190YWJfMgorICAgICAg ICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYl8yLmEsIHBhZ2dfdGFiXzIuYgorICAgICAgICAgICAg ICAgUmVtb3RlIFNRTDogU0VMRUNUIGEsIGIgRlJPTSBwdWJsaWMucGFnZ190YWJfcDIKKyAgICAg ICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZwYWdnX3RhYl9wMyBwYWdnX3RhYl8zCisg ICAgICAgICAgICAgICBPdXRwdXQ6IHBhZ2dfdGFiXzMuYSwgcGFnZ190YWJfMy5iCisgICAgICAg ICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSwgYiBGUk9NIHB1YmxpYy5wYWdnX3RhYl9wMwor KDEyIHJvd3MpCisKK1NFTEVDVCBtYXgoYSksIGNvdW50KGRpc3RpbmN0IGIpIEZST00gcGFnZ190 YWI7CisgbWF4IHwgY291bnQgCistLS0tLSstLS0tLS0tCisgIDI5IHwgICAgNTAKKygxIHJvdykK KworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHN1bShkKSBGUk9NIHBhZ2df dGFiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGaW5hbGl6ZSBBZ2dyZWdhdGUKKyAgIE91dHB1 dDogc3VtKHBhZ2dfdGFiLmQpCisgICAtPiAgQXBwZW5kCisgICAgICAgICAtPiAgUGFydGlhbCBB Z2dyZWdhdGUKKyAgICAgICAgICAgICAgIE91dHB1dDogUEFSVElBTCBzdW0ocGFnZ190YWIuZCkK KyAgICAgICAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZwYWdnX3RhYl9wMSBw YWdnX3RhYgorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYi5kCisgICAgICAg ICAgICAgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgZCBGUk9NIHB1YmxpYy5wYWdnX3RhYl9w MQorICAgICAgICAgLT4gIFBhcnRpYWwgQWdncmVnYXRlCisgICAgICAgICAgICAgICBPdXRwdXQ6 IFBBUlRJQUwgc3VtKHBhZ2dfdGFiXzEuZCkKKyAgICAgICAgICAgICAgIC0+ICBGb3JlaWduIFNj YW4gb24gcHVibGljLmZwYWdnX3RhYl9wMiBwYWdnX3RhYl8xCisgICAgICAgICAgICAgICAgICAg ICBPdXRwdXQ6IHBhZ2dfdGFiXzEuZAorICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNRTDog U0VMRUNUIGQgRlJPTSBwdWJsaWMucGFnZ190YWJfcDIKKyAgICAgICAgIC0+ICBQYXJ0aWFsIEFn Z3JlZ2F0ZQorICAgICAgICAgICAgICAgT3V0cHV0OiBQQVJUSUFMIHN1bShwYWdnX3RhYl8yLmQp CisgICAgICAgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mcGFnZ190YWJfcDMg cGFnZ190YWJfMgorICAgICAgICAgICAgICAgICAgICAgT3V0cHV0OiBwYWdnX3RhYl8yLmQKKyAg ICAgICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBkIEZST00gcHVibGljLnBhZ2df dGFiX3AzCisoMTggcm93cykKKworU0VMRUNUIHN1bShkKSBGUk9NIHBhZ2dfdGFiOworICBzdW0g IAorLS0tLS0tLQorIDU4NTAwCisoMSByb3cpCisKIC0tID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIGFjY2VzcyBy aWdodHMgYW5kIHN1cGVydXNlcgogLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvY29udHJpYi9w b3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuYwppbmRleCA0NWEwOTMzN2QwOC4uOTBlNDg0YmM2NDAgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3 L3Bvc3RncmVzX2Zkdy5jCkBAIC01MTcsNyArNTE3LDcgQEAgc3RhdGljIGJvb2wgZm9yZWlnbl9q b2luX29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLAogCQkJCQkJCUpv aW5UeXBlIGpvaW50eXBlLCBSZWxPcHRJbmZvICpvdXRlcnJlbCwgUmVsT3B0SW5mbyAqaW5uZXJy ZWwsCiAJCQkJCQkJSm9pblBhdGhFeHRyYURhdGEgKmV4dHJhKTsKIHN0YXRpYyBib29sIGZvcmVp Z25fZ3JvdXBpbmdfb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmdyb3VwZWRfcmVs LAotCQkJCQkJCQlOb2RlICpoYXZpbmdRdWFsKTsKKwkJCQkJCQkJTm9kZSAqaGF2aW5nUXVhbCwg Ym9vbCBwYXJ0aWFsKTsKIHN0YXRpYyBMaXN0ICpnZXRfdXNlZnVsX3BhdGhrZXlzX2Zvcl9yZWxh dGlvbihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICpyZWwpOwog c3RhdGljIExpc3QgKmdldF91c2VmdWxfZWNzX2Zvcl9yZWxhdGlvbihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsKTsKQEAgLTUyNiw3ICs1MjYsOCBAQCBzdGF0aWMgdm9pZCBhZGRf cGF0aHNfd2l0aF9wYXRoa2V5c19mb3JfcmVsKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwsCiBzdGF0aWMgdm9pZCBhZGRfZm9yZWlnbl9ncm91cGluZ19wYXRocyhQbGFubmVySW5m byAqcm9vdCwKIAkJCQkJCQkJCSAgIFJlbE9wdEluZm8gKmlucHV0X3JlbCwKIAkJCQkJCQkJCSAg IFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAotCQkJCQkJCQkJICAgR3JvdXBQYXRoRXh0cmFEYXRh ICpleHRyYSk7CisJCQkJCQkJCQkgICBHcm91cFBhdGhFeHRyYURhdGEgKmV4dHJhLAorCQkJCQkJ CQkJICAgYm9vbCBwYXJ0aWFsKTsKIHN0YXRpYyB2b2lkIGFkZF9mb3JlaWduX29yZGVyZWRfcGF0 aHMoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkgIFJlbE9wdEluZm8gKmlucHV0X3JlbCwK IAkJCQkJCQkJCSAgUmVsT3B0SW5mbyAqb3JkZXJlZF9yZWwpOwpAQCAtNjA4Myw3ICs2MDg0LDcg QEAgcG9zdGdyZXNHZXRGb3JlaWduSm9pblBhdGhzKFBsYW5uZXJJbmZvICpyb290LAogICovCiBz dGF0aWMgYm9vbAogZm9yZWlnbl9ncm91cGluZ19vayhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqZ3JvdXBlZF9yZWwsCi0JCQkJCU5vZGUgKmhhdmluZ1F1YWwpCisJCQkJCU5vZGUgKmhh dmluZ1F1YWwsIGJvb2wgcGFydGlhbCkKIHsKIAlRdWVyeQkgICAqcXVlcnkgPSByb290LT5wYXJz ZTsKIAlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGdy b3VwZWRfcmVsLT5mZHdfcHJpdmF0ZTsKQEAgLTYwOTcsNiArNjA5OCwxMSBAQCBmb3JlaWduX2dy b3VwaW5nX29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpncm91cGVkX3JlbCwKIAlp ZiAocXVlcnktPmdyb3VwaW5nU2V0cykKIAkJcmV0dXJuIGZhbHNlOwogCisKKwkvKiBJdCdzIHVu c2FmZSB0byBwdXNoIGhhdmluZyBzdGF0ZW1lbnRzIHdpdGggcGFydGlhbCBhZ2dyZWdhdGVzICov CisJaWYgKHBhcnRpYWwgJiYgaGF2aW5nUXVhbCkKKwkJcmV0dXJuIGZhbHNlOworCiAJLyogR2V0 IHRoZSBmcGluZm8gb2YgdGhlIHVuZGVybHlpbmcgc2NhbiByZWxhdGlvbi4gKi8KIAlvZnBpbmZv ID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGZwaW5mby0+b3V0ZXJyZWwtPmZkd19wcml2YXRlOwog CkBAIC02MzM2LDYgKzYzNDIsNyBAQCBwb3N0Z3Jlc0dldEZvcmVpZ25VcHBlclBhdGhzKFBsYW5u ZXJJbmZvICpyb290LCBVcHBlclJlbGF0aW9uS2luZCBzdGFnZSwKIAogCS8qIElnbm9yZSBzdGFn ZXMgd2UgZG9uJ3Qgc3VwcG9ydDsgYW5kIHNraXAgYW55IGR1cGxpY2F0ZSBjYWxscy4gKi8KIAlp ZiAoKHN0YWdlICE9IFVQUEVSUkVMX0dST1VQX0FHRyAmJgorCQkgc3RhZ2UgIT0gVVBQRVJSRUxf UEFSVElBTF9HUk9VUF9BR0cgJiYKIAkJIHN0YWdlICE9IFVQUEVSUkVMX09SREVSRUQgJiYKIAkJ IHN0YWdlICE9IFVQUEVSUkVMX0ZJTkFMKSB8fAogCQlvdXRwdXRfcmVsLT5mZHdfcHJpdmF0ZSkK QEAgLTYzNTAsNyArNjM1NywxMSBAQCBwb3N0Z3Jlc0dldEZvcmVpZ25VcHBlclBhdGhzKFBsYW5u ZXJJbmZvICpyb290LCBVcHBlclJlbGF0aW9uS2luZCBzdGFnZSwKIAl7CiAJCWNhc2UgVVBQRVJS RUxfR1JPVVBfQUdHOgogCQkJYWRkX2ZvcmVpZ25fZ3JvdXBpbmdfcGF0aHMocm9vdCwgaW5wdXRf cmVsLCBvdXRwdXRfcmVsLAotCQkJCQkJCQkJICAgKEdyb3VwUGF0aEV4dHJhRGF0YSAqKSBleHRy YSk7CisJCQkJCQkJCQkgICAoR3JvdXBQYXRoRXh0cmFEYXRhICopIGV4dHJhLCBmYWxzZSk7CisJ CQlicmVhazsKKwkJY2FzZSBVUFBFUlJFTF9QQVJUSUFMX0dST1VQX0FHRzoKKwkJCWFkZF9mb3Jl aWduX2dyb3VwaW5nX3BhdGhzKHJvb3QsIGlucHV0X3JlbCwgb3V0cHV0X3JlbCwKKwkJCQkJCQkJ CSAgIChHcm91cFBhdGhFeHRyYURhdGEgKikgZXh0cmEsIHRydWUpOwogCQkJYnJlYWs7CiAJCWNh c2UgVVBQRVJSRUxfT1JERVJFRDoKIAkJCWFkZF9mb3JlaWduX29yZGVyZWRfcGF0aHMocm9vdCwg aW5wdXRfcmVsLCBvdXRwdXRfcmVsKTsKQEAgLTYzNzUsNyArNjM4Niw4IEBAIHBvc3RncmVzR2V0 Rm9yZWlnblVwcGVyUGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFVwcGVyUmVsYXRpb25LaW5kIHN0 YWdlLAogc3RhdGljIHZvaWQKIGFkZF9mb3JlaWduX2dyb3VwaW5nX3BhdGhzKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICppbnB1dF9yZWwsCiAJCQkJCQkgICBSZWxPcHRJbmZvICpncm91 cGVkX3JlbCwKLQkJCQkJCSAgIEdyb3VwUGF0aEV4dHJhRGF0YSAqZXh0cmEpCisJCQkJCQkgICBH cm91cFBhdGhFeHRyYURhdGEgKmV4dHJhLAorCQkJCQkJICAgYm9vbCBwYXJ0aWFsKQogewogCVF1 ZXJ5CSAgICpwYXJzZSA9IHJvb3QtPnBhcnNlOwogCVBnRmR3UmVsYXRpb25JbmZvICppZnBpbmZv ID0gaW5wdXRfcmVsLT5mZHdfcHJpdmF0ZTsKQEAgLTYzOTEsOCArNjQwMyw5IEBAIGFkZF9mb3Jl aWduX2dyb3VwaW5nX3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICppbnB1dF9y ZWwsCiAJCSFyb290LT5oYXNIYXZpbmdRdWFsKQogCQlyZXR1cm47CiAKLQlBc3NlcnQoZXh0cmEt PnBhdHlwZSA9PSBQQVJUSVRJT05XSVNFX0FHR1JFR0FURV9OT05FIHx8Ci0JCSAgIGV4dHJhLT5w YXR5cGUgPT0gUEFSVElUSU9OV0lTRV9BR0dSRUdBVEVfRlVMTCk7CisJQXNzZXJ0KCgoZXh0cmEt PnBhdHlwZSA9PSBQQVJUSVRJT05XSVNFX0FHR1JFR0FURV9OT05FIHx8CisJCQkgZXh0cmEtPnBh dHlwZSA9PSBQQVJUSVRJT05XSVNFX0FHR1JFR0FURV9GVUxMKSAmJiAhcGFydGlhbCkgfHwKKwkJ ICAgKGV4dHJhLT5wYXR5cGUgPT0gUEFSVElUSU9OV0lTRV9BR0dSRUdBVEVfUEFSVElBTCAmJiBw YXJ0aWFsKSk7CiAKIAkvKiBzYXZlIHRoZSBpbnB1dF9yZWwgYXMgb3V0ZXJyZWwgaW4gZnBpbmZv ICovCiAJZnBpbmZvLT5vdXRlcnJlbCA9IGlucHV0X3JlbDsKQEAgLTY0MTIsNyArNjQyNSw3IEBA IGFkZF9mb3JlaWduX2dyb3VwaW5nX3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICppbnB1dF9yZWwsCiAJICogVXNlIEhBVklORyBxdWFsIGZyb20gZXh0cmEuIEluIGNhc2Ugb2Yg Y2hpbGQgcGFydGl0aW9uLCBpdCB3aWxsIGhhdmUKIAkgKiB0cmFuc2xhdGVkIFZhcnMuCiAJICov Ci0JaWYgKCFmb3JlaWduX2dyb3VwaW5nX29rKHJvb3QsIGdyb3VwZWRfcmVsLCBleHRyYS0+aGF2 aW5nUXVhbCkpCisJaWYgKCFmb3JlaWduX2dyb3VwaW5nX29rKHJvb3QsIGdyb3VwZWRfcmVsLCBl eHRyYS0+aGF2aW5nUXVhbCwgcGFydGlhbCkpCiAJCXJldHVybjsKIAogCS8qCmRpZmYgLS1naXQg YS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IGU3Yjg2OWY4Y2VhLi42M2MwYzAz ZGEzNyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5z cWwKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTI3 MjksMTUgKzI3MjksMTUgQEAgUkVTRVQgZW5hYmxlX3BhcnRpdGlvbndpc2Vfam9pbjsKIC0tIHRl c3QgcGFydGl0aW9ud2lzZSBhZ2dyZWdhdGVzCiAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUNSRUFURSBUQUJM RSBwYWdnX3RhYiAoYSBpbnQsIGIgaW50LCBjIHRleHQpIFBBUlRJVElPTiBCWSBSQU5HRShhKTsK K0NSRUFURSBUQUJMRSBwYWdnX3RhYiAoYSBpbnQsIGIgaW50LCBjIHRleHQsIGQgbnVtZXJpYykg UEFSVElUSU9OIEJZIFJBTkdFKGEpOwogCiBDUkVBVEUgVEFCTEUgcGFnZ190YWJfcDEgKExJS0Ug cGFnZ190YWIpOwogQ1JFQVRFIFRBQkxFIHBhZ2dfdGFiX3AyIChMSUtFIHBhZ2dfdGFiKTsKIENS RUFURSBUQUJMRSBwYWdnX3RhYl9wMyAoTElLRSBwYWdnX3RhYik7CiAKLUlOU0VSVCBJTlRPIHBh Z2dfdGFiX3AxIFNFTEVDVCBpICUgMzAsIGkgJSA1MCwgdG9fY2hhcihpLzMwLCAnRk0wMDAwJykg RlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzAwMCkgaSBXSEVSRSAoaSAlIDMwKSA8IDEwOwotSU5T RVJUIElOVE8gcGFnZ190YWJfcDIgU0VMRUNUIGkgJSAzMCwgaSAlIDUwLCB0b19jaGFyKGkvMzAs ICdGTTAwMDAnKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMDAwKSBpIFdIRVJFIChpICUgMzAp IDwgMjAgYW5kIChpICUgMzApID49IDEwOwotSU5TRVJUIElOVE8gcGFnZ190YWJfcDMgU0VMRUNU IGkgJSAzMCwgaSAlIDUwLCB0b19jaGFyKGkvMzAsICdGTTAwMDAnKSBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCAzMDAwKSBpIFdIRVJFIChpICUgMzApIDwgMzAgYW5kIChpICUgMzApID49IDIwOwor SU5TRVJUIElOVE8gcGFnZ190YWJfcDEgU0VMRUNUIGkgJSAzMCwgaSAlIDUwLCB0b19jaGFyKGkv MzAsICdGTTAwMDAnKSwgaSAlIDQwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwMDApIGkgV0hF UkUgKGkgJSAzMCkgPCAxMDsKK0lOU0VSVCBJTlRPIHBhZ2dfdGFiX3AyIFNFTEVDVCBpICUgMzAs IGkgJSA1MCwgdG9fY2hhcihpLzMwLCAnRk0wMDAwJyksIGkgJSA0MCBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCAzMDAwKSBpIFdIRVJFIChpICUgMzApIDwgMjAgYW5kIChpICUgMzApID49IDEwOwor SU5TRVJUIElOVE8gcGFnZ190YWJfcDMgU0VMRUNUIGkgJSAzMCwgaSAlIDUwLCB0b19jaGFyKGkv MzAsICdGTTAwMDAnKSwgaSAlIDQwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwMDApIGkgV0hF UkUgKGkgJSAzMCkgPCAzMCBhbmQgKGkgJSAzMCkgPj0gMjA7CiAKIC0tIENyZWF0ZSBmb3JlaWdu IHBhcnRpdGlvbnMKIENSRUFURSBGT1JFSUdOIFRBQkxFIGZwYWdnX3RhYl9wMSBQQVJUSVRJT04g T0YgcGFnZ190YWIgRk9SIFZBTFVFUyBGUk9NICgwKSBUTyAoMTApIFNFUlZFUiBsb29wYmFjayBP UFRJT05TICh0YWJsZV9uYW1lICdwYWdnX3RhYl9wMScpOwpAQCAtMjc3MSw2ICsyNzcxLDI5IEBA IFNFTEVDVCBhLCBjb3VudCh0MSkgRlJPTSBwYWdnX3RhYiB0MSBHUk9VUCBCWSBhIEhBVklORyBh dmcoYikgPCAyMiBPUkRFUiBCWSAxOwogRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNUIGIsIGF2 ZyhhKSwgbWF4KGEpLCBjb3VudCgqKSBGUk9NIHBhZ2dfdGFiIEdST1VQIEJZIGIgSEFWSU5HIHN1 bShhKSA8IDcwMCBPUkRFUiBCWSAxOwogCistLSBJdCdzIHVuc2FmZSB0byBwdXNoIGRvd24gaGF2 aW5nIGNsYXVzZSB3aGVuIHRoZXJlIGFyZSBwYXJ0aWFsIGFnZ3JlZ2F0ZXMKK0VYUExBSU4gKFZF UkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBiLCBtYXgoYSksIGNvdW50KCopIEZST00gcGFnZ190 YWIgR1JPVVAgQlkgYiBIQVZJTkcgc3VtKGEpIDwgNzAwIE9SREVSIEJZIDE7CisKKy0tIFBhcnRp YWwgYWdncmVnYXRlcyBhcmUgZmluZSB0byBwdXNoIGRvd24gd2l0aG91dCBoYXZpbmcgY2xhdXNl CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgYiwgbWF4KGEpLCBjb3VudCgq KSBGUk9NIHBhZ2dfdGFiIEdST1VQIEJZIGIgT1JERVIgQlkgMTsKK1NFTEVDVCBiLCBtYXgoYSks IGNvdW50KCopIEZST00gcGFnZ190YWIgR1JPVVAgQlkgYiBPUkRFUiBCWSAxOworCistLSBQYXJ0 aWFsIGFnZ3JlZ2F0ZXMgYXJlIGZpbmUgdG8gcHVzaCBkb3duCitFWFBMQUlOIChWRVJCT1NFLCBD T1NUUyBPRkYpCitTRUxFQ1QgbWF4KGEpLCBjb3VudCgqKSBGUk9NIHBhZ2dfdGFiOworU0VMRUNU IG1heChhKSwgY291bnQoKikgRlJPTSBwYWdnX3RhYjsKKworLS0gU2hvdWxkbid0IHRyeSB0byBw dXNoIGRvd24KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBtYXgoYSksIGNv dW50KGRpc3RpbmN0IGIpIEZST00gcGFnZ190YWI7CitTRUxFQ1QgbWF4KGEpLCBjb3VudChkaXN0 aW5jdCBiKSBGUk9NIHBhZ2dfdGFiOworCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitT RUxFQ1Qgc3VtKGQpIEZST00gcGFnZ190YWI7CitTRUxFQ1Qgc3VtKGQpIEZST00gcGFnZ190YWI7 CisKIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KIC0tIGFjY2VzcyByaWdodHMgYW5kIHN1cGVydXNlcgogLS0gPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLSAKMi4yNS4xCgo= --=_4d1b94f256a1424df3dd68b88502ffa1--