Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ssoeE-00B7pP-DP for pgsql-hackers@arkaria.postgresql.org; Mon, 23 Sep 2024 19:23:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ssoeC-00Dqsl-Q1 for pgsql-hackers@arkaria.postgresql.org; Mon, 23 Sep 2024 19:23:00 +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.94.2) (envelope-from ) id 1ssoeC-00Dqsd-5s for pgsql-hackers@lists.postgresql.org; Mon, 23 Sep 2024 19:23:00 +0000 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1ssoe9-000gva-Gp for pgsql-hackers@postgresql.org; Mon, 23 Sep 2024 19:22:58 +0000 Received: by mail-pf1-x444.google.com with SMTP id d2e1a72fcca58-718e6299191so2435338b3a.2 for ; Mon, 23 Sep 2024 12:22:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727119376; x=1727724176; darn=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=jykZu5IUNghQGzl77LB6QnQo82o1G8/0vmWPSwzqkMI=; b=dH0agT02M/Cm6lpBpxsF0toFkApxKnlNQnPGMw0IDzynrZh6S8jKIoq1/MkO5nAnMs LHqSs24ctUas7A7B5z1DplAJCWJNNh06kWpfOE2U12K3OhTI1j7w4aiOduAtD2BpLKDa 7eZrE8L3Mz9HjPfPY+UbkUSOIojKb/TKql4XU0DgEKFlIUR1pvqfIl2GxC42DG+Ot8nQ Syqxh1G/fsDrYAb0FLsJtN7L/JX09Tw8HL90bP3AKiBbJesHcAuzgDMc8sAPt1ieMNWu VR/iS/waN1ODSb1GbIoQo5YId3Y2NLhzQ5XJ12DDLFDakCWriD1C7ipSX49kwLISPEZ/ Uxog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727119376; x=1727724176; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jykZu5IUNghQGzl77LB6QnQo82o1G8/0vmWPSwzqkMI=; b=Vco/eC9JUn+5tPrtX7JV0hg6rL6d1ohLXBDPcVLjiFbYxBpbqyYbROeEBDfB8JiQGt nIzEaLt49BoMv6E+SOpI3PnJx5u6JozTOU1oIaCXCyi1E4RoDB8sTmQwYSnSV5IJ5ujN X+GBCIBELHQLiKYanKQRnbUdjkStzl1cC2WeS+YzQx72AC5jKJOJ5nGnk6wYxSd61jks zGtLqeNI9syU+UT7OLOcLOF4kp0tOQk+mkgb6F63416HuavDCsj8qnSwL+Zc1YTNmm97 DcPmsmmylqeA4JK6ZYOZFva8BZ29SoB6KYDAFbII6wc+dpFF6pl12tJgybzuyw8YlNdp GqxQ== X-Gm-Message-State: AOJu0YwVoNGNnyJjcq8GJCV1KOQLBmuLwhEkvWytUH1V0ROMiauur1Vd UmUUR5ozTjBv7BzO8Bw8puNVTSSEPaq/wQvtx2ZNRtPEakj3TmAwC/QmtcS1j7mpsW87u7mcpJ8 2b5czgtJSTbKwdH9frHCuoxmzd/g= X-Google-Smtp-Source: AGHT+IFbFOf9nBNtPK7unnQg/S9um2g5JpCWeaulETM0t1dtsBuhxBthsAX/ofPNRXfALD6FlU8pktNu62sHsj5QMpQ= X-Received: by 2002:a05:6a00:198f:b0:70d:2a4d:2edc with SMTP id d2e1a72fcca58-7199ce207b2mr3725773b3a.20.1727119376270; Mon, 23 Sep 2024 12:22:56 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Alexandra Wang Date: Mon, 23 Sep 2024 12:22:20 -0700 Message-ID: Subject: Re: SQL:2023 JSON simplified accessor support To: Peter Eisentraut Cc: PostgreSQL Hackers , Andrew Dunstan Content-Type: multipart/mixed; boundary="000000000000e871300622ce500f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e871300622ce500f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Peter, Thank you so much for helping! On Mon, Sep 16, 2024 at 12:44=E2=80=AFPM Peter Eisentraut wrote: > > On 29.08.24 18:33, Alexandra Wang wrote: > > I=E2=80=99ve implemented the member and array accessors and attached tw= o > > alternative patches: > > > > 1. v1-0001-Add-JSON-JSONB-simplified-accessor.patch: This patch > > enables dot access to JSON object fields and subscript access to > > indexed JSON array elements by converting "." and "[]" indirection > > into a JSON_QUERY JsonFuncExpr node. > > > > 2. v2-0001-Transform-JSON-dot-access-to-arrow-operator.txt: This > > alternative patch implements dot access to JSON object fields by > > transforming the "." indirection into a "->" operator. > > > > The upside of the v1 patch is that it strictly aligns with the SQL > > standard, which specifies that the simplified access is equivalent to: > > > > JSON_QUERY (VEP, 'lax $.JC' WITH CONDITIONAL ARRAY WRAPPER NULL ON > > EMPTY NULL ON ERROR) > > > > However, the performance of JSON_QUERY might be suboptimal due to > > function call overhead. Therefore, I implemented the v2 alternative > > using the "->" operator. > Using the operator approach would also allow taking advantage of > optimizations such as > . OK, that makes sense. > > There is some uncertainty about the semantics of conditional array > > wrappers. Currently, there is at least one subtle difference between > > the "->" operator and JSON_QUERY, as shown: > > That JSON_QUERY bug has been fixed. > > I suggest you rebase both of your patches over this, just to double > check everything. But then I think you can drop the v1 patch and just > submit a new version of v2. Done. I rebased both patches and confirmed they have the same test outputs. I attached v3, which also adds JSON subscript support on top of v2. > The patch should eventually contain some documentation. It might be > good starting to look for a good spot where to put that documentation. > It might be either near the json types documentation or near the general > qualified identifier syntax, not sure. Right, I=E2=80=99m not sure either. A third option, I think, would be to include it in the JSON Functions and Operators section [1]. [1] https://www.postgresql.org/docs/devel/functions-json.html Best, Alex --000000000000e871300622ce500f Content-Type: application/octet-stream; name="v3-0001-Add-JSON-JSONB-simplified-accessor.patch" Content-Disposition: attachment; filename="v3-0001-Add-JSON-JSONB-simplified-accessor.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m1fe7thq0 RnJvbSA2NGE4NjU5ZDgxOWZlZjVhYmMyZTViMmM1NjJkNzMyYWU2Y2ZkZDIwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmEgV2FuZyA8YWxleGFuZHJhLndhbmcub3NzQGdt YWlsLmNvbT4KRGF0ZTogVGh1LCAxNSBBdWcgMjAyNCAwMjoxMTozMyAtMDcwMApTdWJqZWN0OiBb UEFUQ0ggdjNdIEFkZCBKU09OL0pTT05CIHNpbXBsaWZpZWQgYWNjZXNzb3IKClRoaXMgcGF0Y2gg aW1wbGVtZW50cyBKU09OL0pTT05CIG1lbWJlciBhY2Nlc3NvciBhbmQgSlNPTi9KU09OQiBhcnJh eQphY2Nlc3NvciBhcyBzcGVjaWZpZWQgaW4gU1FMIDIwMjMuIFNwZWNpZmljYWxseSwgdGhlIGZv bGxvd2luZyBzeXRheGVzCmFyZSBhZGRlZDoKCjEuIFNpbXBsZSBkb3Qtbm90YXRpb24gYWNjZXNz IHRvIEpTT04gYW5kIEpTT05CIG9iamVjdCBmaWVsZHMKMi4gU3Vic2NyaXB0aW5nIGZvciBpbmRl eGVkIGFjY2VzcyB0byBKU09OIGFycmF5IGVsZW1lbnRzCgpFeGFtcGxlczoKCi0tIFNldHVwCmNy ZWF0ZSB0YWJsZSB0KHggaW50LCB5IGpzb24pOwppbnNlcnQgaW50byB0IHNlbGVjdCAxLCAneyJh IjogMSwgImIiOiA0Mn0nOjpqc29uOwppbnNlcnQgaW50byB0IHNlbGVjdCAxLCAneyJhIjogMiwg ImIiOiB7ImMiOiA0Mn19Jzo6anNvbjsKaW5zZXJ0IGludG8gdCBzZWxlY3QgMSwgJ3siYSI6IDMs ICJiIjogeyJjIjogIjQyIn0sICJkIjpbMTEsIDEyXX0nOjpqc29uOwoKLS0gRXhpc3Rpbmcgc3lu dGF4IHByZWRhdGVzIHRoZSBTUUwgc3RhbmRhcmQ6CnNlbGVjdCAodC55KS0+J2InIGZyb20gdDsK c2VsZWN0ICh0LnkpLT4nYictPidjJyBmcm9tIHQ7CnNlbGVjdCAodC55KS0+J2QnLT4wIGZyb20g dDsKCi0tIEpTT04gc2ltcGxpZmllZCBhY2Nlc3NvciBzcGVjaWZpZWQgYnkgdGhlIFNRTCBzdGFu ZGFyZDoKc2VsZWN0ICh0LnkpLmIgZnJvbSB0OwpzZWxlY3QgKHQueSkuYi5jIGZyb20gdDsKc2Vs ZWN0ICh0LnkpLmRbMF0gZnJvbSB0OwoKVGhlIFNRTCBzdGFuZGFyZCBzdGF0ZXMgdGhhdCBzaW1w bGlmaWVkIGFjY2VzcyBpcyBlcXVpdmFsZW50IHRvOgpKU09OX1FVRVJZIChWRVAsICdsYXggJC5K QycgV0lUSCBDT05ESVRJT05BTCBBUlJBWSBXUkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBF UlJPUikKCndoZXJlIFZFUCBpcyB0aGUgPHZhbHVlIGV4cHJlc3Npb24gcHJpbWFyeT4gYW5kIEpD IGlzIHRoZSA8SlNPTgpzaW1wbGlmaWVkIGFjY2Vzc29yIG9wIGNoYWluPi4gRm9yIGV4YW1wbGUs IHRoZSBKU09OX1FVRVJZIGVxdWFsYWxlbmNlCm9mIHRoZSBhYm92ZSBxdWVyaWVzIGlzOgoKc2Vs ZWN0IGpzb25fcXVlcnkoeSwgJ2xheCAkLmInIFdJVEggQ09ORElUSU9OQUwgQVJSQVkgV1JBUFBF UiBOVUxMIE9OIEVNUFRZIE5VTEwgT04gRVJST1IpIGZyb20gdDsKc2VsZWN0IGpzb25fcXVlcnko eSwgJ2xheCAkLmIuYycgV0lUSCBDT05ESVRJT05BTCBBUlJBWSBXUkFQUEVSIE5VTEwgT04gRU1Q VFkgTlVMTCBPTiBFUlJPUikgZnJvbSB0OwpzZWxlY3QganNvbl9xdWVyeSh5LCAnbGF4ICQuZFsw XScgV0lUSCBDT05ESVRJT05BTCBBUlJBWSBXUkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBF UlJPUikgZnJvbSB0OwoKVGhpcyBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIGRvdC1ub3RhdGlvbiBh Y2Nlc3MgdG8gSlNPTi9KU09OQiBvYmplY3QKYnkgbWFraW5nIGEgc3ludGF0aWMgc3VnYXIgZm9y IHRoZSBqc29uX29iamVjdF9maWVsZCAiLT4iIG9wZXJhdG9yIGluClBhcnNlRnVuY09yQ29sdW1u KCkgZm9yIGFyZyBvZiBKU09OL0pTT05CIHR5cGUuCgpTaW1pbGFybHksIEpTT04gYXJyYXkgYWNj ZXNzIHZpYSBzdWJzY3JpcHRpbmcgaXMgZW5hYmxlZCBieSBjcmVhdGluZwphbiBPcEV4cHIgZm9y IHRoZSBleGlzdGluZyAiLT4iIG9wZXJhdG9yLiBOb3RlIHRoYXQgdGhlIEpTT04gc3Vic2NyaXB0 aW5nCmltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBKU09OQiBzdWJzY3JpcHRp bmcgY291bnRlcnBhcnQsCmFzIHRoZSBmb3JtZXIgbGV2ZXJhZ2VzIHRoZSAiLT4iIG9wZXJhdG9y IGRpcmVjdGx5LCB3aGlsZSB0aGUgbGF0dGVyCnVzZXMgdGhlIG1vcmUgZ2VuZXJpYyBTdWJzY3Jp cHRpbmdSZWYgaW50ZXJmYWNlLgotLS0KIHNyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9leHByLmMg ICAgIHwgICA4ICsrLQogc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2Z1bmMuYyAgICAgfCAgOTMg KysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9y LmRhdCB8ICAgNiArLQogc3JjL2luY2x1ZGUvcGFyc2VyL3BhcnNlX2Z1bmMuaCAgICAgfCAgIDMg Kwogc3JjL2luY2x1ZGUvcGFyc2VyL3BhcnNlX3R5cGUuaCAgICAgfCAgIDEgKwogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qc29uLm91dCAgfCAxMDcgKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYi5vdXQgfCAgODYgKysrKysrKysr KysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbi5zcWwgICAgICAgfCAgMjUg KysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmIuc3FsICAgICAgfCAgMjIgKysrKysr CiA5IGZpbGVzIGNoYW5nZWQsIDM0MiBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9leHByLmMgYi9zcmMvYmFja2VuZC9w YXJzZXIvcGFyc2VfZXhwci5jCmluZGV4IDM2YzFiN2E4OGYuLmM1NTU4MmNkZTUgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9leHByLmMKKysrIGIvc3JjL2JhY2tlbmQvcGFy c2VyL3BhcnNlX2V4cHIuYwpAQCAtNDUzLDcgKzQ1MywxMyBAQCB0cmFuc2Zvcm1JbmRpcmVjdGlv bihQYXJzZVN0YXRlICpwc3RhdGUsIEFfSW5kaXJlY3Rpb24gKmluZCkKIAkJTm9kZQkgICAqbiA9 IGxmaXJzdChpKTsKIAogCQlpZiAoSXNBKG4sIEFfSW5kaWNlcykpCi0JCQlzdWJzY3JpcHRzID0g bGFwcGVuZChzdWJzY3JpcHRzLCBuKTsKKwkJCWlmIChleHByVHlwZShyZXN1bHQpID09IEpTT05P SUQpCisJCQkJcmVzdWx0ID0gUGFyc2VKc29uU2ltcGxpZmllZEFjY2Vzc29yQXJyYXlFbGVtZW50 KHBzdGF0ZSwKKwkJCQkJCQkJCQkJCQkJCQkgY2FzdE5vZGUoQV9JbmRpY2VzLCBuKSwKKwkJCQkJ CQkJCQkJCQkJCQkgcmVzdWx0LAorCQkJCQkJCQkJCQkJCQkJCSBsb2NhdGlvbik7CisJCQllbHNl CisJCQkJc3Vic2NyaXB0cyA9IGxhcHBlbmQoc3Vic2NyaXB0cywgbik7CiAJCWVsc2UgaWYgKElz QShuLCBBX1N0YXIpKQogCQl7CiAJCQllcmVwb3J0KEVSUk9SLApkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvcGFyc2VyL3BhcnNlX2Z1bmMuYyBiL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9mdW5j LmMKaW5kZXggOWIyMzM0NGEzYi4uNGMwNTQzNDNmMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv cGFyc2VyL3BhcnNlX2Z1bmMuYworKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfZnVuYy5j CkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRl ICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgorI2luY2x1 ZGUgInBhcnNlci9wYXJzZV9vcGVyLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19vcGVyYXRvcl9k LmgiCiAKIAogLyogUG9zc2libGUgZXJyb3IgY29kZXMgZnJvbSBMb29rdXBGdW5jTmFtZUludGVy bmFsICovCkBAIC00OCw2ICs1MCw4IEBAIHN0YXRpYyB2b2lkIHVuaWZ5X2h5cG90aGV0aWNhbF9h cmdzKFBhcnNlU3RhdGUgKnBzdGF0ZSwKIHN0YXRpYyBPaWQJRnVuY05hbWVBc1R5cGUoTGlzdCAq ZnVuY25hbWUpOwogc3RhdGljIE5vZGUgKlBhcnNlQ29tcGxleFByb2plY3Rpb24oUGFyc2VTdGF0 ZSAqcHN0YXRlLCBjb25zdCBjaGFyICpmdW5jbmFtZSwKIAkJCQkJCQkJCU5vZGUgKmZpcnN0X2Fy ZywgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBOb2RlICpQYXJzZUpzb25TaW1wbGlmaWVkQWNjZXNz b3JPYmplY3RGaWVsZChQYXJzZVN0YXRlICpwc3RhdGUsIGNvbnN0IGNoYXIgKmZ1bmNuYW1lLAor CQkJCQkJCQkJCQkJCU5vZGUgKmZpcnN0X2FyZywgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyBPaWQJ TG9va3VwRnVuY05hbWVJbnRlcm5hbChPYmplY3RUeXBlIG9ianR5cGUsIExpc3QgKmZ1bmNuYW1l LAogCQkJCQkJCQkgICBpbnQgbmFyZ3MsIGNvbnN0IE9pZCAqYXJndHlwZXMsCiAJCQkJCQkJCSAg IGJvb2wgaW5jbHVkZV9vdXRfYXJndW1lbnRzLCBib29sIG1pc3Npbmdfb2ssCkBAIC0yMjYsMTcg KzIzMCwyNCBAQCBQYXJzZUZ1bmNPckNvbHVtbihQYXJzZVN0YXRlICpwc3RhdGUsIExpc3QgKmZ1 bmNuYW1lLCBMaXN0ICpmYXJncywKIAkJCQkJCSAgICFmdW5jX3ZhcmlhZGljICYmIGFyZ25hbWVz ID09IE5JTCAmJgogCQkJCQkJICAgbGlzdF9sZW5ndGgoZnVuY25hbWUpID09IDEgJiYKIAkJCQkJ CSAgIChhY3R1YWxfYXJnX3R5cGVzWzBdID09IFJFQ09SRE9JRCB8fAotCQkJCQkJCUlTQ09NUExF WChhY3R1YWxfYXJnX3R5cGVzWzBdKSkpOworCQkJCQkJCUlTQ09NUExFWChhY3R1YWxfYXJnX3R5 cGVzWzBdKSB8fAorCQkJCQkJCUlTSlNPTihhY3R1YWxfYXJnX3R5cGVzWzBdKSkpOwogCiAJLyoK IAkgKiBJZiBpdCdzIGNvbHVtbiBzeW50YXgsIGNoZWNrIGZvciBjb2x1bW4gcHJvamVjdGlvbiBj YXNlIGZpcnN0LgogCSAqLwogCWlmIChjb3VsZF9iZV9wcm9qZWN0aW9uICYmIGlzX2NvbHVtbikK IAl7Ci0JCXJldHZhbCA9IFBhcnNlQ29tcGxleFByb2plY3Rpb24ocHN0YXRlLAotCQkJCQkJCQkJ CXN0clZhbChsaW5pdGlhbChmdW5jbmFtZSkpLAotCQkJCQkJCQkJCWZpcnN0X2FyZywKLQkJCQkJ CQkJCQlsb2NhdGlvbik7CisJCWlmIChJU0pTT04oYWN0dWFsX2FyZ190eXBlc1swXSkpCisJCQly ZXR2YWwgPSBQYXJzZUpzb25TaW1wbGlmaWVkQWNjZXNzb3JPYmplY3RGaWVsZChwc3RhdGUsCisJ CQkJCQkJCQkJCQkJCQlzdHJWYWwobGluaXRpYWwoZnVuY25hbWUpKSwKKwkJCQkJCQkJCQkJCQkJ CWZpcnN0X2FyZywKKwkJCQkJCQkJCQkJCQkJCWxvY2F0aW9uKTsKKwkJZWxzZQorCQkJcmV0dmFs ID0gUGFyc2VDb21wbGV4UHJvamVjdGlvbihwc3RhdGUsCisJCQkJCQkJCQkJCXN0clZhbChsaW5p dGlhbChmdW5jbmFtZSkpLAorCQkJCQkJCQkJCQlmaXJzdF9hcmcsCisJCQkJCQkJCQkJCWxvY2F0 aW9uKTsKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAKQEAgLTE5MDIsNiArMTkx Myw3OCBAQCBGdW5jTmFtZUFzVHlwZShMaXN0ICpmdW5jbmFtZSkKIAlyZXR1cm4gcmVzdWx0Owog fQogCisvKgorICogUGFyc2VKc29uU2ltcGxpZmllZEFjY2Vzc29yQXJyYXlFbGVtZW50IC0KKyAq CSAgdHJhbnNmb3JtIGpzb24gc3Vic2NyaXB0IGludG8ganNvbl9hcnJheV9lbGVtZW50IG9wZXJh dG9yLgorICovCitOb2RlICoKK1BhcnNlSnNvblNpbXBsaWZpZWRBY2Nlc3NvckFycmF5RWxlbWVu dChQYXJzZVN0YXRlICpwc3RhdGUsIEFfSW5kaWNlcyAqc3Vic2NyaXB0LAorCQkJCQkJCQkJCU5v ZGUgKmZpcnN0X2FyZywgaW50IGxvY2F0aW9uKQoreworCU9wRXhwciAqcmVzdWx0OworCU5vZGUg KmluZGV4OworCisJQXNzZXJ0KGV4cHJUeXBlKGZpcnN0X2FyZykgPT0gSlNPTk9JRCk7CisKKwlp ZiAoc3Vic2NyaXB0LT5pc19zbGljZSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQllcnJtc2coImpzb24gc3Vic2Ny aXB0IGRvZXMgbm90IHN1cHBvcnQgc2xpY2VzIikpLAorCQkJCXBhcnNlcl9lcnJwb3NpdGlvbihw c3RhdGUsIGxvY2F0aW9uKSk7CisKKwlpbmRleCA9IHRyYW5zZm9ybUV4cHIocHN0YXRlLCBzdWJz Y3JpcHQtPnVpZHgsIHBzdGF0ZS0+cF9leHByX2tpbmQpOworCWlmICghSXNBKGluZGV4LCBDb25z dCkgfHwKKwkJY2FzdE5vZGUoQ29uc3QsIGluZGV4KS0+Y29uc3R0eXBlICE9IElOVDRPSUQpCisJ CWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAorCQkJCQkJZXJybXNnKCJqc29uIHN1YnNjcmlwdCBtdXN0IGJlIGNvZXJjaWJsZSB0byBp bnRlZ2VyIikpLAorCQkJCXBhcnNlcl9lcnJwb3NpdGlvbihwc3RhdGUsIGV4cHJMb2NhdGlvbihp bmRleCkpKTsKKworCXJlc3VsdCA9IG1ha2VOb2RlKE9wRXhwcik7CisJcmVzdWx0LT5vcG5vID0g T0lEX0pTT05fQVJSQVlfRUxFTUVOVF9PUDsKKwlyZXN1bHQtPm9wcmVzdWx0dHlwZSA9IEpTT05P SUQ7CisJcmVzdWx0LT5vcGZ1bmNpZCA9IGdldF9vcGNvZGUocmVzdWx0LT5vcG5vKTsKKwlyZXN1 bHQtPmFyZ3MgPSBsaXN0X21ha2UyKGZpcnN0X2FyZywgaW5kZXgpOworCXJlc3VsdC0+bG9jYXRp b24gPSBleHByTG9jYXRpb24oaW5kZXgpOworCisJcmV0dXJuIChOb2RlICopcmVzdWx0OworfQor LyoKKyAqIFBhcnNlSnNvblNpbXBsaWZpZWRBY2Nlc3Nvck9iamVjdEZpZWxkIC0KKyAqCSAgaGFu ZGxlcyBmdW5jdGlvbiBjYWxscyB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMgb2YganNv biB0eXBlLgorICoJICBJZiB0aGUgZnVuY3Rpb24gY2FsbCBpcyBhY3R1YWxseSBhIGNvbHVtbiBw cm9qZWN0aW9uLCByZXR1cm4gYSBzdWl0YWJseQorICoJICB0cmFuc2Zvcm1lZCBleHByZXNzaW9u IHRyZWUuICBJZiBub3QsIHJldHVybiBOVUxMLgorICovCitOb2RlICoKK1BhcnNlSnNvblNpbXBs aWZpZWRBY2Nlc3Nvck9iamVjdEZpZWxkKFBhcnNlU3RhdGUgKnBzdGF0ZSwgY29uc3QgY2hhciAq ZnVuY25hbWUsCisJCQkJCQkJCQkgICBOb2RlICpmaXJzdF9hcmcsIGludCBsb2NhdGlvbikKK3sK KwlPcEV4cHIJKnJlc3VsdDsKKwlOb2RlCSpyZXhwcjsKKwlyZXhwciA9IChOb2RlICopIG1ha2VD b25zdCgKKwkJCVRFWFRPSUQsCisJCQktMSwKKwkJCUludmFsaWRPaWQsCisJCQktMSwKKwkJCUNT dHJpbmdHZXRUZXh0RGF0dW0oZnVuY25hbWUpLAorCQkJZmFsc2UsCisJCQlmYWxzZSk7CisKKwly ZXN1bHQgPSBtYWtlTm9kZShPcEV4cHIpOworCWlmIChleHByVHlwZShmaXJzdF9hcmcpID09IEpT T05PSUQpIHsKKwkJcmVzdWx0LT5vcG5vID0gT0lEX0pTT05fT0JKRUNUX0ZJRUxEX09QOworCQly ZXN1bHQtPm9wcmVzdWx0dHlwZSA9IEpTT05PSUQ7CisJfSBlbHNlIHsKKwkJQXNzZXJ0KGV4cHJU eXBlKGZpcnN0X2FyZykgPT0gSlNPTkJPSUQpOworCQlyZXN1bHQtPm9wbm8gPSBPSURfSlNPTkJf T0JKRUNUX0ZJRUxEX09QOworCQlyZXN1bHQtPm9wcmVzdWx0dHlwZSA9IEpTT05CT0lEOworCX0K KwlyZXN1bHQtPm9wZnVuY2lkID0gZ2V0X29wY29kZShyZXN1bHQtPm9wbm8pOworCXJlc3VsdC0+ YXJncyA9IGxpc3RfbWFrZTIoZmlyc3RfYXJnLCByZXhwcik7CisJcmVzdWx0LT5sb2NhdGlvbiA9 IGxvY2F0aW9uOworCXJldHVybiAoTm9kZSAqKSByZXN1bHQ7Cit9CisKIC8qCiAgKiBQYXJzZUNv bXBsZXhQcm9qZWN0aW9uIC0KICAqCSAgaGFuZGxlcyBmdW5jdGlvbiBjYWxscyB3aXRoIGEgc2lu Z2xlIGFyZ3VtZW50IHRoYXQgaXMgb2YgY29tcGxleCB0eXBlLgpkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29w ZXJhdG9yLmRhdAppbmRleCAwZTc1MTFkZGUxLi5lMzc1YzQ5MjUyIDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9n L3BnX29wZXJhdG9yLmRhdApAQCAtMzE1NCwxMyArMzE1NCwxMyBAQAogICBvcHJuYW1lID0+ICcq Jywgb3BybGVmdCA9PiAnYW55cmFuZ2UnLCBvcHJyaWdodCA9PiAnYW55cmFuZ2UnLAogICBvcHJy ZXN1bHQgPT4gJ2FueXJhbmdlJywgb3ByY29tID0+ICcqKGFueXJhbmdlLGFueXJhbmdlKScsCiAg IG9wcmNvZGUgPT4gJ3JhbmdlX2ludGVyc2VjdCcgfSwKLXsgb2lkID0+ICczOTYyJywgZGVzY3Ig PT4gJ2dldCBqc29uIG9iamVjdCBmaWVsZCcsCit7IG9pZCA9PiAnMzk2MicsIG9pZF9zeW1ib2wg PT4gJ09JRF9KU09OX09CSkVDVF9GSUVMRF9PUCcsIGRlc2NyID0+ICdnZXQganNvbiBvYmplY3Qg ZmllbGQnLAogICBvcHJuYW1lID0+ICctPicsIG9wcmxlZnQgPT4gJ2pzb24nLCBvcHJyaWdodCA9 PiAndGV4dCcsIG9wcnJlc3VsdCA9PiAnanNvbicsCiAgIG9wcmNvZGUgPT4gJ2pzb25fb2JqZWN0 X2ZpZWxkJyB9LAogeyBvaWQgPT4gJzM5NjMnLCBkZXNjciA9PiAnZ2V0IGpzb24gb2JqZWN0IGZp ZWxkIGFzIHRleHQnLAogICBvcHJuYW1lID0+ICctPj4nLCBvcHJsZWZ0ID0+ICdqc29uJywgb3By cmlnaHQgPT4gJ3RleHQnLCBvcHJyZXN1bHQgPT4gJ3RleHQnLAogICBvcHJjb2RlID0+ICdqc29u X29iamVjdF9maWVsZF90ZXh0JyB9LAoteyBvaWQgPT4gJzM5NjQnLCBkZXNjciA9PiAnZ2V0IGpz b24gYXJyYXkgZWxlbWVudCcsCit7IG9pZCA9PiAnMzk2NCcsIG9pZF9zeW1ib2wgPT4gJ09JRF9K U09OX0FSUkFZX0VMRU1FTlRfT1AnLCBkZXNjciA9PiAnZ2V0IGpzb24gYXJyYXkgZWxlbWVudCcs CiAgIG9wcm5hbWUgPT4gJy0+Jywgb3BybGVmdCA9PiAnanNvbicsIG9wcnJpZ2h0ID0+ICdpbnQ0 Jywgb3BycmVzdWx0ID0+ICdqc29uJywKICAgb3ByY29kZSA9PiAnanNvbl9hcnJheV9lbGVtZW50 JyB9LAogeyBvaWQgPT4gJzM5NjUnLCBkZXNjciA9PiAnZ2V0IGpzb24gYXJyYXkgZWxlbWVudCBh cyB0ZXh0JywKQEAgLTMxNzIsNyArMzE3Miw3IEBACiB7IG9pZCA9PiAnMzk2NycsIGRlc2NyID0+ ICdnZXQgdmFsdWUgZnJvbSBqc29uIGFzIHRleHQgd2l0aCBwYXRoIGVsZW1lbnRzJywKICAgb3By bmFtZSA9PiAnIz4+Jywgb3BybGVmdCA9PiAnanNvbicsIG9wcnJpZ2h0ID0+ICdfdGV4dCcsIG9w cnJlc3VsdCA9PiAndGV4dCcsCiAgIG9wcmNvZGUgPT4gJ2pzb25fZXh0cmFjdF9wYXRoX3RleHQn IH0sCi17IG9pZCA9PiAnMzIxMScsIGRlc2NyID0+ICdnZXQganNvbmIgb2JqZWN0IGZpZWxkJywK K3sgb2lkID0+ICczMjExJywgb2lkX3N5bWJvbCA9PiAnT0lEX0pTT05CX09CSkVDVF9GSUVMRF9P UCcsIGRlc2NyID0+ICdnZXQganNvbmIgb2JqZWN0IGZpZWxkJywKICAgb3BybmFtZSA9PiAnLT4n LCBvcHJsZWZ0ID0+ICdqc29uYicsIG9wcnJpZ2h0ID0+ICd0ZXh0Jywgb3BycmVzdWx0ID0+ICdq c29uYicsCiAgIG9wcmNvZGUgPT4gJ2pzb25iX29iamVjdF9maWVsZCcgfSwKIHsgb2lkID0+ICcz NDc3JywgZGVzY3IgPT4gJ2dldCBqc29uYiBvYmplY3QgZmllbGQgYXMgdGV4dCcsCmRpZmYgLS1n aXQgYS9zcmMvaW5jbHVkZS9wYXJzZXIvcGFyc2VfZnVuYy5oIGIvc3JjL2luY2x1ZGUvcGFyc2Vy L3BhcnNlX2Z1bmMuaAppbmRleCBjN2JhOTlkZWU3Li42Yjc3NTljYmM3IDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9wYXJzZXIvcGFyc2VfZnVuYy5oCisrKyBiL3NyYy9pbmNsdWRlL3BhcnNlci9w YXJzZV9mdW5jLmgKQEAgLTM1LDYgKzM1LDkgQEAgZXh0ZXJuIE5vZGUgKlBhcnNlRnVuY09yQ29s dW1uKFBhcnNlU3RhdGUgKnBzdGF0ZSwgTGlzdCAqZnVuY25hbWUsIExpc3QgKmZhcmdzLAogCQkJ CQkJCSAgIE5vZGUgKmxhc3Rfc3JmLCBGdW5jQ2FsbCAqZm4sIGJvb2wgcHJvY19jYWxsLAogCQkJ CQkJCSAgIGludCBsb2NhdGlvbik7CiAKK2V4dGVybiBOb2RlICpQYXJzZUpzb25TaW1wbGlmaWVk QWNjZXNzb3JBcnJheUVsZW1lbnQoUGFyc2VTdGF0ZSAqcHN0YXRlLCBBX0luZGljZXMgKnN1YnNj cmlwdCwKKwkJCQkJCQkJCQkJCQkgTm9kZSAqZmlyc3RfYXJnLCBpbnQgbG9jYXRpb24pOworCiBl eHRlcm4gRnVuY0RldGFpbENvZGUgZnVuY19nZXRfZGV0YWlsKExpc3QgKmZ1bmNuYW1lLAogCQkJ CQkJCQkJICBMaXN0ICpmYXJncywgTGlzdCAqZmFyZ25hbWVzLAogCQkJCQkJCQkJICBpbnQgbmFy Z3MsIE9pZCAqYXJndHlwZXMsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9wYXJzZXIvcGFyc2Vf dHlwZS5oIGIvc3JjL2luY2x1ZGUvcGFyc2VyL3BhcnNlX3R5cGUuaAppbmRleCBiNjJlN2E2Y2U5 Li45YzhiM2JmYjJmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9wYXJzZXIvcGFyc2VfdHlwZS5o CisrKyBiL3NyYy9pbmNsdWRlL3BhcnNlci9wYXJzZV90eXBlLmgKQEAgLTU3LDUgKzU3LDYgQEAg ZXh0ZXJuIGJvb2wgcGFyc2VUeXBlU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgT2lkICp0eXBlaWRf cCwgaW50MzIgKnR5cG1vZF9wLAogCiAvKiB0cnVlIGlmIHR5cGVpZCBpcyBjb21wb3NpdGUsIG9y IGRvbWFpbiBvdmVyIGNvbXBvc2l0ZSwgYnV0IG5vdCBSRUNPUkQgKi8KICNkZWZpbmUgSVNDT01Q TEVYKHR5cGVpZCkgKHR5cGVPckRvbWFpblR5cGVSZWxpZCh0eXBlaWQpICE9IEludmFsaWRPaWQp CisjZGVmaW5lIElTSlNPTih0eXBlaWQpICh0eXBlaWQgPT0gSlNPTk9JRCB8fCB0eXBlaWQgPT0g SlNPTkJPSUQpCiAKICNlbmRpZgkJCQkJCQkvKiBQQVJTRV9UWVBFX0ggKi8KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pzb24ub3V0CmluZGV4IDk2YzQwOTExY2IuLmY2YjdhZjNlY2QgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbi5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qc29uLm91dApAQCAtMjcxNiwzICsyNzE2LDExMCBAQCBzZWxlY3QgdHNfaGVh ZGxpbmUoJ1tdJzo6anNvbiwgdHNxdWVyeSgnYWFhICYgYmJiJykpOwogIFtdCiAoMSByb3cpCiAK Ky0tIHNpbXBsZSBkb3Qgbm90YXRpb24KK2Ryb3AgdGFibGUgaWYgZXhpc3RzIHRlc3RfanNvbl9k b3Q7CitOT1RJQ0U6ICB0YWJsZSAidGVzdF9qc29uX2RvdCIgZG9lcyBub3QgZXhpc3QsIHNraXBw aW5nCitjcmVhdGUgdGFibGUgdGVzdF9qc29uX2RvdChpZCBpbnQsIHRlc3RfanNvbiBqc29uKTsK K2luc2VydCBpbnRvIHRlc3RfanNvbl9kb3Qgc2VsZWN0IDEsICd7ImEiOiAxLCAiYiI6IDQyfSc6 Ompzb247CitpbnNlcnQgaW50byB0ZXN0X2pzb25fZG90IHNlbGVjdCAxLCAneyJhIjogMiwgImIi OiB7ImMiOiA0Mn19Jzo6anNvbjsKK2luc2VydCBpbnRvIHRlc3RfanNvbl9kb3Qgc2VsZWN0IDEs ICd7ImEiOiAzLCAiYiI6IHsiYyI6ICI0MiJ9LCAiZCI6WzExLCAxMl19Jzo6anNvbjsKK2luc2Vy dCBpbnRvIHRlc3RfanNvbl9kb3Qgc2VsZWN0IDEsICd7ImEiOiAzLCAiYiI6IHsiYyI6ICI0MiJ9 LCAiZCI6W3sieCI6IFsxMSwgMTJdfSwgeyJ5IjogWzIxLCAyMl19XX0nOjpqc29uOworLS0gbWVt YmVyIG9iamVjdCBhY2Nlc3MKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pzb24pLmIsIGpz b25fcXVlcnkodGVzdF9qc29uLCAnbGF4ICQuYicgV0lUSCBDT05ESVRJT05BTCBXUkFQUEVSIE5V TEwgT04gRU1QVFkgTlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0ZWQgZnJvbSB0ZXN0X2pzb25fZG90 OworICAgICAgYiAgICAgIHwgIGV4cGVjdGVkICAgCistLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0KKyA0MiAgICAgICAgICB8IDQyCisgeyJjIjogNDJ9ICAgfCB7ImMiOiA0Mn0KKyB7ImMiOiAi NDIifSB8IHsiYyI6ICI0MiJ9CisgeyJjIjogIjQyIn0gfCB7ImMiOiAiNDIifQorKDQgcm93cykK Kworc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbikuYi5jLCBqc29uX3F1ZXJ5KHRlc3Rf anNvbiwgJ2xheCAkLmIuYycgV0lUSCBDT05ESVRJT05BTCBXUkFQUEVSIE5VTEwgT04gRU1QVFkg TlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0ZWQgZnJvbSB0ZXN0X2pzb25fZG90OworICBjICAgfCBl eHBlY3RlZCAKKy0tLS0tLSstLS0tLS0tLS0tCisgICAgICB8IAorIDQyICAgfCA0MgorICI0MiIg fCAiNDIiCisgIjQyIiB8ICI0MiIKKyg0IHJvd3MpCisKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50 ZXN0X2pzb24pLmQsIGpzb25fcXVlcnkodGVzdF9qc29uLCAnbGF4ICQuZCcgV0lUSCBDT05ESVRJ T05BTCBXUkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0ZWQgZnJv bSB0ZXN0X2pzb25fZG90OworICAgICAgICAgICAgICAgICBkICAgICAgICAgICAgICAgICAgfCAg ICAgICAgICAgICAgZXhwZWN0ZWQgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgCisgWzExLCAxMl0gICAgICAgICAgICAgICAgICAgICAgICAgICB8 IFsxMSwgMTJdCisgW3sieCI6IFsxMSwgMTJdfSwgeyJ5IjogWzIxLCAyMl19XSB8IFt7IngiOiBb MTEsIDEyXX0sIHsieSI6IFsyMSwgMjJdfV0KKyg0IHJvd3MpCisKK3NlbGVjdCAodGVzdF9qc29u X2RvdC50ZXN0X2pzb24pLiJkIiwganNvbl9xdWVyeSh0ZXN0X2pzb24sICdsYXggJC5kJyBXSVRI IENPTkRJVElPTkFMIFdSQVBQRVIgTlVMTCBPTiBFTVBUWSBOVUxMIE9OIEVSUk9SKSBhcyBleHBl Y3RlZCBmcm9tIHRlc3RfanNvbl9kb3Q7CisgICAgICAgICAgICAgICAgIGQgICAgICAgICAgICAg ICAgICB8ICAgICAgICAgICAgICBleHBlY3RlZCAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAKKyBbMTEsIDEyXSAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgWzExLCAxMl0KKyBbeyJ4IjogWzExLCAxMl19LCB7InkiOiBbMjEsIDIyXX1dIHwg W3sieCI6IFsxMSwgMTJdfSwgeyJ5IjogWzIxLCAyMl19XQorKDQgcm93cykKKworc2VsZWN0ICh0 ZXN0X2pzb25fZG90LnRlc3RfanNvbikuJ2QnIGZyb20gdGVzdF9qc29uX2RvdDsKK0VSUk9SOiAg c3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIidkJyIKK0xJTkUgMTogc2VsZWN0ICh0ZXN0X2pzb25f ZG90LnRlc3RfanNvbikuJ2QnIGZyb20gdGVzdF9qc29uX2RvdDsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXgorc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNv bilbJ2QnXSBmcm9tIHRlc3RfanNvbl9kb3Q7CitFUlJPUjogIGpzb24gc3Vic2NyaXB0IG11c3Qg YmUgY29lcmNpYmxlIHRvIGludGVnZXIKK0xJTkUgMTogc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRl c3RfanNvbilbJ2QnXSBmcm9tIHRlc3RfanNvbl9kb3Q7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF4KKy0tIGFycmF5IGVsZW1lbnQgYWNjZXNzCitzZWxlY3QgKHRl c3RfanNvbl9kb3QudGVzdF9qc29uKS5kLT4wIGZyb20gdGVzdF9qc29uX2RvdDsKKyAgICA/Y29s dW1uPyAgICAgCistLS0tLS0tLS0tLS0tLS0tLQorIAorIAorIDExCisgeyJ4IjogWzExLCAxMl19 CisoNCByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbl9kb3QudGVzdF9qc29uKS5kWzBdLCBqc29u X3F1ZXJ5KHRlc3RfanNvbiwgJ2xheCAkLmRbMF0nIFdJVEggQ09ORElUSU9OQUwgV1JBUFBFUiBO VUxMIE9OIEVNUFRZIE5VTEwgT04gRVJST1IpIGFzIGV4cGVjdGVkIGZyb20gdGVzdF9qc29uX2Rv dDsKKyAgICAgICAgZCAgICAgICAgfCAgICBleHBlY3RlZCAgICAgCistLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICB8IAorICAgICAgICAgICAgICAg ICB8IAorIDExICAgICAgICAgICAgICB8IDExCisgeyJ4IjogWzExLCAxMl19IHwgeyJ4IjogWzEx LCAxMl19CisoNCByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbl9kb3QudGVzdF9qc29uKS5kWzFd LCBqc29uX3F1ZXJ5KHRlc3RfanNvbiwgJ2xheCAkLmRbMV0nIFdJVEggQ09ORElUSU9OQUwgV1JB UFBFUiBOVUxMIE9OIEVNUFRZIE5VTEwgT04gRVJST1IpIGFzIGV4cGVjdGVkIGZyb20gdGVzdF9q c29uX2RvdDsKKyAgICAgICAgZCAgICAgICAgfCAgICBleHBlY3RlZCAgICAgCistLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICB8IAorICAgICAgICAg ICAgICAgICB8IAorIDEyICAgICAgICAgICAgICB8IDEyCisgeyJ5IjogWzIxLCAyMl19IHwgeyJ5 IjogWzIxLCAyMl19CisoNCByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbl9kb3QudGVzdF9qc29u KS5kWzA6XSBmcm9tIHRlc3RfanNvbl9kb3Q7CitFUlJPUjogIGpzb24gc3Vic2NyaXB0IGRvZXMg bm90IHN1cHBvcnQgc2xpY2VzCitMSU5FIDE6IHNlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pz b24pLmRbMDpdIGZyb20gdGVzdF9qc29uX2RvdDsKKyAgICAgICAgICAgICAgICBeCitzZWxlY3Qg KHRlc3RfanNvbl9kb3QudGVzdF9qc29uKS5kWzA6OmludF0gZnJvbSB0ZXN0X2pzb25fZG90Owor ICAgICAgICBkICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tCisgCisgCisgMTEKKyB7IngiOiBb MTEsIDEyXX0KKyg0IHJvd3MpCisKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pzb24pLmRb MDo6ZmxvYXRdIGZyb20gdGVzdF9qc29uX2RvdDsKK0VSUk9SOiAganNvbiBzdWJzY3JpcHQgbXVz dCBiZSBjb2VyY2libGUgdG8gaW50ZWdlcgorTElORSAxOiBzZWxlY3QgKHRlc3RfanNvbl9kb3Qu dGVzdF9qc29uKS5kWzA6OmZsb2F0XSBmcm9tIHRlc3RfanNvbl8uLi4KKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCitzZWxlY3QgKHRlc3RfanNvbl9kb3QudGVz dF9qc29uKS5kWzBdLnhbMV0sIGpzb25fcXVlcnkodGVzdF9qc29uLCAnbGF4ICQuZFswXS54WzFd JyBXSVRIIENPTkRJVElPTkFMIFdSQVBQRVIgTlVMTCBPTiBFTVBUWSBOVUxMIE9OIEVSUk9SKSBh cyBleHBlY3RlZCBmcm9tIHRlc3RfanNvbl9kb3Q7CisgeCAgfCBleHBlY3RlZCAKKy0tLS0rLS0t LS0tLS0tLQorICAgIHwgCisgICAgfCAKKyAgICB8IAorIDEyIHwgMTIKKyg0IHJvd3MpCisKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmIub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qc29uYi5vdXQKaW5kZXggN2QxNjNhMTU2ZS4uOTU0ZWZlNjdiNiAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYi5vdXQKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYi5vdXQKQEAgLTU3MTUsMyArNTcxNSw4OSBAQCBz ZWxlY3QgJzEyMzQ1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDUnOjpqc29uYjo6aW50ODsKICAxMjM0NQogKDEgcm93KQogCistLSBzaW1wbGUgZG90IG5vdGF0 aW9uCitkcm9wIHRhYmxlIGlmIGV4aXN0cyB0ZXN0X2pzb25iX2RvdDsKK05PVElDRTogIHRhYmxl ICJ0ZXN0X2pzb25iX2RvdCIgZG9lcyBub3QgZXhpc3QsIHNraXBwaW5nCitjcmVhdGUgdGFibGUg dGVzdF9qc29uYl9kb3QoaWQgaW50LCB0ZXN0X2pzb25iIGpzb25iKTsKK2luc2VydCBpbnRvIHRl c3RfanNvbmJfZG90IHNlbGVjdCAxLCAneyJhIjogMSwgImIiOiA0Mn0nOjpqc29uOworaW5zZXJ0 IGludG8gdGVzdF9qc29uYl9kb3Qgc2VsZWN0IDEsICd7ImEiOiAyLCAiYiI6IHsiYyI6IDQyfX0n Ojpqc29uOworaW5zZXJ0IGludG8gdGVzdF9qc29uYl9kb3Qgc2VsZWN0IDEsICd7ImEiOiAzLCAi YiI6IHsiYyI6ICI0MiJ9LCAiZCI6WzExLCAxMl19Jzo6anNvbjsKKy0tIG1lbWJlciBvYmplY3Qg YWNjZXNzCitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLmIgZnJvbSB0ZXN0X2pz b25iX2RvdDsKKyAgICAgIGIgICAgICAKKy0tLS0tLS0tLS0tLS0KKyA0MgorIHsiYyI6IDQyfQor IHsiYyI6ICI0MiJ9CisoMyByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNv bmIpLmIuYyBmcm9tIHRlc3RfanNvbmJfZG90OworICBjICAgCistLS0tLS0KKyAKKyA0MgorICI0 MiIKKygzIHJvd3MpCisKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZCBmcm9t IHRlc3RfanNvbmJfZG90OworICAgIGQgICAgIAorLS0tLS0tLS0tLQorIAorIAorIFsxMSwgMTJd CisoMyByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLiJkIiBmcm9t IHRlc3RfanNvbmJfZG90OworICAgIGQgICAgIAorLS0tLS0tLS0tLQorIAorIAorIFsxMSwgMTJd CisoMyByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLidkJyBmcm9t IHRlc3RfanNvbmJfZG90OworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3IgbmVhciAiJ2QnIgor TElORSAxOiBzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLidkJyBmcm9tIHRlc3Rf anNvbmJfZG90OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4K K3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYilbJ2QnXSBmcm9tIHRlc3RfanNvbmJf ZG90OworIHRlc3RfanNvbmIgCistLS0tLS0tLS0tLS0KKyAKKyAKKyBbMTEsIDEyXQorKDMgcm93 cykKKworLS0gYXJyYXkgZWxlbWVudCBhY2Nlc3MKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVz dF9qc29uYikuZFswXSBmcm9tIHRlc3RfanNvbmJfZG90OworIGQgIAorLS0tLQorIAorIAorIDEx CisoMyByb3dzKQorCitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLmRbMDpdIGZy b20gdGVzdF9qc29uYl9kb3Q7CitFUlJPUjogIGpzb25iIHN1YnNjcmlwdCBkb2VzIG5vdCBzdXBw b3J0IHNsaWNlcworTElORSAxOiBzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpLmRb MDpdIGZyb20gdGVzdF9qc29uYl9kb3QuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF4KK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZFsw OjppbnRdIGZyb20gdGVzdF9qc29uYl9kb3Q7CisgZCAgCistLS0tCisgCisgCisgMTEKKygzIHJv d3MpCisKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZFswOjpmbG9hdF0gZnJv bSB0ZXN0X2pzb25iX2RvdDsKK0VSUk9SOiAgc3Vic2NyaXB0IHR5cGUgZG91YmxlIHByZWNpc2lv biBpcyBub3Qgc3VwcG9ydGVkCitMSU5FIDE6IHNlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9q c29uYikuZFswOjpmbG9hdF0gZnJvbSB0ZXN0X2pzby4uLgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXgorSElOVDogIGpzb25iIHN1YnNjcmlwdCBtdXN0IGJl IGNvZXJjaWJsZSB0byBlaXRoZXIgaW50ZWdlciBvciB0ZXh0Lgorc2VsZWN0ICh0ZXN0X2pzb25i X2RvdC50ZXN0X2pzb25iKS5kWzBdLnhbMV0gZnJvbSB0ZXN0X2pzb25iX2RvdDsKKyB4IAorLS0t CisgCisgCisgCisoMyByb3dzKQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9q c29uLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb24uc3FsCmluZGV4IDgyNTFmNGY0MDAu LjIxNDUwYzQ5OTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb24uc3FsCisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb24uc3FsCkBAIC04NjksMyArODY5LDI4IEBAIHNl bGVjdCB0c19oZWFkbGluZSgnZW5nbGlzaCcsICd7ImEiOiAiYWFhIGJiYiIsICJiIjogeyJjIjog ImNjYyBkZGQgZmZmIiwgImMxIjoKIHNlbGVjdCB0c19oZWFkbGluZSgnbnVsbCc6Ompzb24sIHRz cXVlcnkoJ2FhYSAmIGJiYicpKTsKIHNlbGVjdCB0c19oZWFkbGluZSgne30nOjpqc29uLCB0c3F1 ZXJ5KCdhYWEgJiBiYmInKSk7CiBzZWxlY3QgdHNfaGVhZGxpbmUoJ1tdJzo6anNvbiwgdHNxdWVy eSgnYWFhICYgYmJiJykpOworCistLSBzaW1wbGUgZG90IG5vdGF0aW9uCitkcm9wIHRhYmxlIGlm IGV4aXN0cyB0ZXN0X2pzb25fZG90OworY3JlYXRlIHRhYmxlIHRlc3RfanNvbl9kb3QoaWQgaW50 LCB0ZXN0X2pzb24ganNvbik7CitpbnNlcnQgaW50byB0ZXN0X2pzb25fZG90IHNlbGVjdCAxLCAn eyJhIjogMSwgImIiOiA0Mn0nOjpqc29uOworaW5zZXJ0IGludG8gdGVzdF9qc29uX2RvdCBzZWxl Y3QgMSwgJ3siYSI6IDIsICJiIjogeyJjIjogNDJ9fSc6Ompzb247CitpbnNlcnQgaW50byB0ZXN0 X2pzb25fZG90IHNlbGVjdCAxLCAneyJhIjogMywgImIiOiB7ImMiOiAiNDIifSwgImQiOlsxMSwg MTJdfSc6Ompzb247CitpbnNlcnQgaW50byB0ZXN0X2pzb25fZG90IHNlbGVjdCAxLCAneyJhIjog MywgImIiOiB7ImMiOiAiNDIifSwgImQiOlt7IngiOiBbMTEsIDEyXX0sIHsieSI6IFsyMSwgMjJd fV19Jzo6anNvbjsKKworLS0gbWVtYmVyIG9iamVjdCBhY2Nlc3MKK3NlbGVjdCAodGVzdF9qc29u X2RvdC50ZXN0X2pzb24pLmIsIGpzb25fcXVlcnkodGVzdF9qc29uLCAnbGF4ICQuYicgV0lUSCBD T05ESVRJT05BTCBXUkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0 ZWQgZnJvbSB0ZXN0X2pzb25fZG90Oworc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbiku Yi5jLCBqc29uX3F1ZXJ5KHRlc3RfanNvbiwgJ2xheCAkLmIuYycgV0lUSCBDT05ESVRJT05BTCBX UkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0ZWQgZnJvbSB0ZXN0 X2pzb25fZG90Oworc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbikuZCwganNvbl9xdWVy eSh0ZXN0X2pzb24sICdsYXggJC5kJyBXSVRIIENPTkRJVElPTkFMIFdSQVBQRVIgTlVMTCBPTiBF TVBUWSBOVUxMIE9OIEVSUk9SKSBhcyBleHBlY3RlZCBmcm9tIHRlc3RfanNvbl9kb3Q7CitzZWxl Y3QgKHRlc3RfanNvbl9kb3QudGVzdF9qc29uKS4iZCIsIGpzb25fcXVlcnkodGVzdF9qc29uLCAn bGF4ICQuZCcgV0lUSCBDT05ESVRJT05BTCBXUkFQUEVSIE5VTEwgT04gRU1QVFkgTlVMTCBPTiBF UlJPUikgYXMgZXhwZWN0ZWQgZnJvbSB0ZXN0X2pzb25fZG90Oworc2VsZWN0ICh0ZXN0X2pzb25f ZG90LnRlc3RfanNvbikuJ2QnIGZyb20gdGVzdF9qc29uX2RvdDsKK3NlbGVjdCAodGVzdF9qc29u X2RvdC50ZXN0X2pzb24pWydkJ10gZnJvbSB0ZXN0X2pzb25fZG90OworCistLSBhcnJheSBlbGVt ZW50IGFjY2Vzcworc2VsZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbikuZC0+MCBmcm9tIHRl c3RfanNvbl9kb3Q7CitzZWxlY3QgKHRlc3RfanNvbl9kb3QudGVzdF9qc29uKS5kWzBdLCBqc29u X3F1ZXJ5KHRlc3RfanNvbiwgJ2xheCAkLmRbMF0nIFdJVEggQ09ORElUSU9OQUwgV1JBUFBFUiBO VUxMIE9OIEVNUFRZIE5VTEwgT04gRVJST1IpIGFzIGV4cGVjdGVkIGZyb20gdGVzdF9qc29uX2Rv dDsKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pzb24pLmRbMV0sIGpzb25fcXVlcnkodGVz dF9qc29uLCAnbGF4ICQuZFsxXScgV0lUSCBDT05ESVRJT05BTCBXUkFQUEVSIE5VTEwgT04gRU1Q VFkgTlVMTCBPTiBFUlJPUikgYXMgZXhwZWN0ZWQgZnJvbSB0ZXN0X2pzb25fZG90Oworc2VsZWN0 ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbikuZFswOl0gZnJvbSB0ZXN0X2pzb25fZG90Oworc2Vs ZWN0ICh0ZXN0X2pzb25fZG90LnRlc3RfanNvbikuZFswOjppbnRdIGZyb20gdGVzdF9qc29uX2Rv dDsKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pzb24pLmRbMDo6ZmxvYXRdIGZyb20gdGVz dF9qc29uX2RvdDsKK3NlbGVjdCAodGVzdF9qc29uX2RvdC50ZXN0X2pzb24pLmRbMF0ueFsxXSwg anNvbl9xdWVyeSh0ZXN0X2pzb24sICdsYXggJC5kWzBdLnhbMV0nIFdJVEggQ09ORElUSU9OQUwg V1JBUFBFUiBOVUxMIE9OIEVNUFRZIE5VTEwgT04gRVJST1IpIGFzIGV4cGVjdGVkIGZyb20gdGVz dF9qc29uX2RvdDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iLnNxbCBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iLnNxbAppbmRleCA1ZjAxOTBkNWEyLi5mMDk1ZGMy YmJlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYi5zcWwKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvanNvbmIuc3FsCkBAIC0xNTU5LDMgKzE1NTksMjUgQEAgc2VsZWN0 ICcxMjM0NS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1Jzo6 anNvbmI6OmZsb2F0ODsKIHNlbGVjdCAnMTIzNDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwNSc6Ompzb25iOjppbnQyOwogc2VsZWN0ICcxMjM0NS4wMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1Jzo6anNvbmI6OmludDQ7CiBz ZWxlY3QgJzEyMzQ1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDUnOjpqc29uYjo6aW50ODsKKworLS0gc2ltcGxlIGRvdCBub3RhdGlvbgorZHJvcCB0YWJsZSBp ZiBleGlzdHMgdGVzdF9qc29uYl9kb3Q7CitjcmVhdGUgdGFibGUgdGVzdF9qc29uYl9kb3QoaWQg aW50LCB0ZXN0X2pzb25iIGpzb25iKTsKK2luc2VydCBpbnRvIHRlc3RfanNvbmJfZG90IHNlbGVj dCAxLCAneyJhIjogMSwgImIiOiA0Mn0nOjpqc29uOworaW5zZXJ0IGludG8gdGVzdF9qc29uYl9k b3Qgc2VsZWN0IDEsICd7ImEiOiAyLCAiYiI6IHsiYyI6IDQyfX0nOjpqc29uOworaW5zZXJ0IGlu dG8gdGVzdF9qc29uYl9kb3Qgc2VsZWN0IDEsICd7ImEiOiAzLCAiYiI6IHsiYyI6ICI0MiJ9LCAi ZCI6WzExLCAxMl19Jzo6anNvbjsKKworLS0gbWVtYmVyIG9iamVjdCBhY2Nlc3MKK3NlbGVjdCAo dGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuYiBmcm9tIHRlc3RfanNvbmJfZG90Oworc2VsZWN0 ICh0ZXN0X2pzb25iX2RvdC50ZXN0X2pzb25iKS5iLmMgZnJvbSB0ZXN0X2pzb25iX2RvdDsKK3Nl bGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZCBmcm9tIHRlc3RfanNvbmJfZG90Owor c2VsZWN0ICh0ZXN0X2pzb25iX2RvdC50ZXN0X2pzb25iKS4iZCIgZnJvbSB0ZXN0X2pzb25iX2Rv dDsKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuJ2QnIGZyb20gdGVzdF9qc29u Yl9kb3Q7CitzZWxlY3QgKHRlc3RfanNvbmJfZG90LnRlc3RfanNvbmIpWydkJ10gZnJvbSB0ZXN0 X2pzb25iX2RvdDsKKworLS0gYXJyYXkgZWxlbWVudCBhY2Nlc3MKK3NlbGVjdCAodGVzdF9qc29u Yl9kb3QudGVzdF9qc29uYikuZFswXSBmcm9tIHRlc3RfanNvbmJfZG90Oworc2VsZWN0ICh0ZXN0 X2pzb25iX2RvdC50ZXN0X2pzb25iKS5kWzA6XSBmcm9tIHRlc3RfanNvbmJfZG90Oworc2VsZWN0 ICh0ZXN0X2pzb25iX2RvdC50ZXN0X2pzb25iKS5kWzA6OmludF0gZnJvbSB0ZXN0X2pzb25iX2Rv dDsKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZFswOjpmbG9hdF0gZnJvbSB0 ZXN0X2pzb25iX2RvdDsKK3NlbGVjdCAodGVzdF9qc29uYl9kb3QudGVzdF9qc29uYikuZFswXS54 WzFdIGZyb20gdGVzdF9qc29uYl9kb3Q7Ci0tIAoyLjM5LjUgKEFwcGxlIEdpdC0xNTQpCgo= --000000000000e871300622ce500f--