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 1whngI-000QbQ-1j for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Jul 2026 12:16:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whngG-00CykJ-34 for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Jul 2026 12:16:41 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1whngG-00CykB-1p for pgsql-hackers@lists.postgresql.org; Thu, 09 Jul 2026 12:16:41 +0000 Received: from mail-yx1-xb132.google.com ([2607:f8b0:4864:20::b132]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1whngD-00000000T5Q-4Bvo for pgsql-hackers@lists.postgresql.org; Thu, 09 Jul 2026 12:16:40 +0000 Received: by mail-yx1-xb132.google.com with SMTP id 956f58d0204a3-664dd23829eso1655076d50.3 for ; Thu, 09 Jul 2026 05:16:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783599396; cv=none; d=google.com; s=arc-20260327; b=mRRVXzsgkXkYQGNaHzgeis3KD6NwTXP4+cNjICNtsQjdVf03mEuLDwaOEZJxnIF/uq Liub6G4eAKbky2IRhgtVLU95ysuWUICgnXFtPSnRkSk9IaLox/fE+QX6ONVQkvbam0hC c6Ck+8OkFuRuISnWfFjCkIBJAyMVlWh/B9l3BBKHpwpp4ODMiS4ZtBr9LscCkFWNgY4X gNkZJlN+13IVwOof5YF7Me2kMOZlYKyMv+f/echNon9/zGUqLV5VwMWO8aJoiNMGKQ42 WCIlLIpfQrg7kj+SkRwLkJEHakFcrsrfwV/jAJhGotFuspRkZDtghPaiFh/P42mplUPg ZK4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=NnGrLp6zgTIGJnIz1BBZm0++rr9vUfLIX/N37uK3QOE=; fh=YcQUnGmfuaz+SDMat3uWChDwVg2NTiAIr8a8AlWI6NQ=; b=p2SybYapgwQhwvXc4pIpItZWZJ4kUiucnhOfBC2oYxDfFlesmSJmt42Wgn8LDDxEuZ N2wmwNc9PAwVHo5HljherCp2bI2iKxnFO01Z3mMyQqvlnVrwPfMo75PUEmx3Vj89FzcF kHMA4VfoEFM3lcuNB2b/zjYPEq79YLS0HbraTTTj7u5blZgHTuiv6ncJ6J9Qnrew6ZZ3 NWaqH0AmWZlqChZO7SQNMGziVCElu/OQQoAgGPr3iWbPP+M5CYjoAEQV37P0ZP7Qjl7e is7AxG+piWDTRH4zy1U16iNAiePDUOFHKiZv4DC1HoIyI8B+CwN3IJV1c8ErhFyyMiYU U85g==; 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=dunslane-net.20251104.gappssmtp.com; s=20251104; t=1783599396; x=1784204196; darn=lists.postgresql.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=NnGrLp6zgTIGJnIz1BBZm0++rr9vUfLIX/N37uK3QOE=; b=nKOOxPw/NmlpUfVe65WZs+To52NCIKXFtm0Qa8dgYfOSbK9BbyJr4kUqJPTpvJOmKS uCKQ9jQMELhHV3s+OprckSjCwBlgScYgWn6QXOX08GHDHRkOJ+S9VK/YpubhfMCxDeLK 6FWvJvG60h1SoVn2CnnF4AhZSffw47kd7tQBaMETlj/Ogdy7jGDqwfzdrZnCbhaBRcm4 YYh5VaIA5KptJWQLOQRxlXWTDnxW4gqe1OhKtKjN/C9oT6DUu0nZJ1gj/VyZQiv2Tts3 ggQV2oh09ZFPtAb7c7Ssat/AgivrfcLT955b2IsLBU2Xi8fImxjizqOjcOWMWqbADj3+ dLyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783599396; x=1784204196; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=NnGrLp6zgTIGJnIz1BBZm0++rr9vUfLIX/N37uK3QOE=; b=QMVStSY39nmapqi4NbTCiyrwc6Hq5eRE8rq8zK25HVh7UkJYZFA2l3X6blJuFdJDpZ bmEgh7XV/glkvv8t4kD107kNtX2oJk9CktIBLpnalVW5EE3nTaW7R3ZJ3gZpHP8fgWOB h0LiqdLW74pdy7HGRRw3f5gMR/TiwgVWmqE+qUOkO7pu5BfwO9u00JRc7jJUqVynN4R8 9JwcIGT0K9RH0HHiyhTRh/85hz+nkliCdOz1WgNj0GBs5JBD6Hh4hAdMLLp66mkZdf8S iFuxbhA0OH6jlvsr2e7j3vFarHc+lSpeu8QAD6qOEsio0/dSPxtWgP4eCJkbA8BGPPzA ZhcA== X-Forwarded-Encrypted: i=1; AHgh+RrkEaEcM/yaxo7iJla1mZZ5O353c5Ea2XL1w7Xz1/CJCMjtEErSmObJtpyquR+VWdtbGbqQc/rgEGnsTRTH@lists.postgresql.org X-Gm-Message-State: AOJu0YwO/3i5HbLjDzXhfgbDXOP3zO3EK/FzgiV7Q52DGOOzySyWzuZQ dE8QL4fXU8l5ToR3RMw+2/tAkL4b+JsZDt1bHBGT7Z0r7qcNZXM10SxaGgqbi07s4vIrBXEx6rt byTcuxoE7dg2qTuCi5IH0U+Oq9Ovdu5gU1rR6Tl54xg== X-Gm-Gg: AfdE7ckbMI2D+vv7cE6x0A5mV5TnVX6Aqo+mThfdjEgDblRR6+PPtvhNPqXuAen8eGe 89JFJNouCu6UNwf2qZzd1Suot8QRieANt4oAHJc4C6vnESfxCMPFFQzxzPFftIF1Ca/0VDQ+uVx ar8uwzyMo+YoF6SmPGGoazLevuvnTcENWSha5PUxVOYhKl3bsRiH5LdhkgSFGKXvb8P+tqvpRbR y/7SeLMch0tVdezQhKGPVE8dvU7oJOs6CVLyHHYboLk2QuqhghbqNdpWXpAZS0TGFNaAqH710IC fdblCpHQkQ== X-Received: by 2002:a05:690e:dcd:b0:662:f085:b25e with SMTP id 956f58d0204a3-6679f0e3372mr5056682d50.23.1783599396116; Thu, 09 Jul 2026 05:16:36 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Andrew Dunstan Date: Thu, 9 Jul 2026 08:16:22 -0400 X-Gm-Features: AVVi8CcBhykqwYABXDGRSk45qAdIQ-k7Z-VCUITbaafv4tYnMOcAmgY7uXEtr4g Message-ID: Subject: Re: Proposal: new file format for hba/ident/hosts configuration? To: Zsolt Parragi Cc: Jacob Champion , Tristan Partin , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000006dd81006562c9844" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006dd81006562c9844 Content-Type: multipart/alternative; boundary="0000000000006dd80e06562c9842" --0000000000006dd80e06562c9842 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jul 8, 2026 at 11:33=E2=80=AFAM Zsolt Parragi wrote: > On Tue, Jul 7, 2026 at 6:17=E2=80=AFPM Tristan Partin = wrote: > > I think the best option other than TOML is JSON5. > > I agree, my first prototype before TOML was JSON5. > > On Tue, Jul 7, 2026 at 10:21=E2=80=AFPM Andrew Dunstan > wrote: > > Having implemented two (!) JSON parsers for PostgreSQL, as well as > recently a json schema validator extension [1], I have some skin in this > game. > > I am really not a fan of implementing more and more little languages > inside Postgres. Doing so will incur a non-zero maintenance burden. > > Mainly for this reason, because if we add JSON5 support to the parser > that's already in postgres, we don't have to worry about adding > another library. > > I focused on TOML in my email because I think that's still a better > configuration format than JSON5. However, we could use JSON or another > format, as long as it's a well-defined, common format, it will be a > big improvement. > > > Just for kicks I asked my new best friend () to allow for json5 on the RD parser. The actual parser changes are minimal. Most of the changes are in the lexer. I didn't implement it for the incremental parser, and I skipped the new numeric formats. cheers andrew --0000000000006dd80e06562c9842 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


On Wed, Jul 8, = 2026 at 11:33=E2=80=AFAM Zsolt Parragi <zsolt.parragi@percona.com> wrote:
On Tue, Jul 7, 2026 at 6:17=E2=80=AFP= M Tristan Partin <tristan@partin.io> wrote:
> I think the best option other than TOML is JSON5.

I agree, my first prototype before TOML was JSON5.

On Tue, Jul 7, 2026 at 10:21=E2=80=AFPM Andrew Dunstan <andrew@dunslane.net> wrote:=
> Having implemented two (!) JSON parsers for PostgreSQL, as well as rec= ently a json schema validator extension [1], I have some skin in this game.=
> I am really not a fan of implementing more and more little languages i= nside Postgres. Doing so will incur a non-zero maintenance burden.

Mainly for this reason, because if we add JSON5 support to the parser
that's already in postgres, we don't have to worry about adding
another library.

I focused on TOML in my email because I think that's still a better
configuration format than JSON5. However, we could use JSON or another
format, as long as it's a well-defined, common format, it will be a
big improvement.



Just for kicks I asked my new best= friend (<weg>) to allow for json5 on the RD parser. The actual parse= r changes are minimal.=C2=A0 Most of the changes are in the lexer. I didn&#= 39;t implement it for the incremental parser, and I skipped the new numeric= formats.

cheers

andrew
--0000000000006dd80e06562c9842-- --0000000000006dd81006562c9844 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Support-JSON5-syntax-in-the-recursive-descent-JSON-p.patch" Content-Disposition: attachment; filename="0001-Support-JSON5-syntax-in-the-recursive-descent-JSON-p.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrdgziq00 RnJvbSAwNTQzYTQxMzg3NTI2ZjZiZmE4ZTg4M2Q4ZGY4OWM4ZTgzZDkyZDMzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgRHVuc3RhbiA8YW5kcmV3QGR1bnNsYW5lLm5ldD4K RGF0ZTogVGh1LCA5IEp1bCAyMDI2IDA3OjQwOjQ3IC0wNDAwClN1YmplY3Q6IFtQQVRDSF0gU3Vw cG9ydCBKU09ONSBzeW50YXggaW4gdGhlIHJlY3Vyc2l2ZSBkZXNjZW50IEpTT04gcGFyc2VyCgpB ZGQgc2V0SnNvbkxleENvbnRleHRKU09ONSgpLCB3aGljaCBlbmFibGVzIGEgc2V0IG9mIEpTT041 IHN5bnRheApleHRlbnNpb25zIG9uIGEgSnNvbkxleENvbnRleHQ6IGNvbW1lbnRzIChib3RoICIv LyIgYW5kIHNsYXNoLXN0YXIKZm9ybXMpLCB0cmFpbGluZyBjb21tYXMgaW4gYXJyYXlzIGFuZCBv YmplY3RzLCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MsCmFuZCB1bnF1b3RlZCAoaWRlbnRpZmllcikg b2JqZWN0IGtleXMuIFRoZSBmZWF0dXJlIGlzIG9ubHkgc3VwcG9ydGVkCmJ5IHRoZSByZWN1cnNp dmUgZGVzY2VudCBwYXJzZXIgaW52b2tlZCB2aWEgcGdfcGFyc2VfanNvbigpOyBlbmFibGluZwpp dCBvbiBhbiBpbmNyZW1lbnRhbCBsZXhpbmcgY29udGV4dCByZXR1cm5zIEpTT05fSU5WQUxJRF9M RVhFUl9UWVBFLAp0aGUgc2FtZSBlcnJvciBwZ19wYXJzZV9qc29uKCkgaXRzZWxmIHJldHVybnMg d2hlbiBjYWxsZWQgd2l0aCBhbgppbmNyZW1lbnRhbCBsZXhpbmcgY29udGV4dCwgc2luY2UgdGhl IHRhYmxlLWRyaXZlbiBpbmNyZW1lbnRhbApncmFtbWFyIGRvZXMgbm90IGtub3cgYWJvdXQgdGhl IEpTT041IGV4dGVuc2lvbnMgdG8gdGhlIGdyYW1tYXIuCgpBIG5ldyBKU09OX1RPS0VOX0lERU5U SUZJRVIgdG9rZW4gdHlwZSByZXByZXNlbnRzIGEgYmFyZSBpZGVudGlmaWVyLAp3aGljaCBpcyBv bmx5IGV2ZXIgcHJvZHVjZWQgaW4gSlNPTjUgbW9kZS4gSXQgaXMgYWNjZXB0ZWQgYnkgdGhlCmdy YW1tYXIgd2hlcmV2ZXIgYSBzdHJpbmcga2V5IGlzIGV4cGVjdGVkLCBidXQgcGFyc2Vfc2NhbGFy KCkgc3RpbGwKcmVqZWN0cyBpdCBhcyBhIHZhbHVlLCBzbyB1bnF1b3RlZCBpZGVudGlmaWVycyBy ZW1haW4gaWxsZWdhbCBvdXRzaWRlCm9mIGtleSBwb3NpdGlvbiwgbWF0Y2hpbmcgdGhlIEpTT041 IGdyYW1tYXIuCgpBZGQgdGVzdF9qc29uX3BhcnNlcl9qc29uNSwgYSBzdGFuZGFsb25lIHRlc3Qg cHJvZ3JhbSBleGVyY2lzaW5nIHRoZQpyZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgaW4gSlNPTjUg bW9kZSwgYWxvbmcgd2l0aCBhIFRBUCB0ZXN0IGNvdmVyaW5nCnRoZSBuZXcgc3ludGF4IGFuZCBj b25maXJtaW5nIGl0IGlzIHN0aWxsIHJlamVjdGVkIHdoZW4gSlNPTjUgbW9kZSBpcwpvZmYuCi0t LQogc3JjL2NvbW1vbi9qc29uYXBpLmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjA5ICsr KysrKysrKystLQogc3JjL2luY2x1ZGUvY29tbW9uL2pzb25hcGkuaCAgICAgICAgICAgICAgICAg IHwgIDI3ICsrCiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvLmdpdGlnbm9yZSAg fCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL01ha2VmaWxlICAgIHwg ICA5ICstCiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvUkVBRE1FICAgICAgfCAg IDggKy0KIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNlci9tZXNvbi5idWlsZCB8ICAy MyArLQogLi4uL3Rlc3RfanNvbl9wYXJzZXIvdC8wMDVfdGVzdF9qc29uNS5wbCAgICAgIHwgMTQ3 ICsrKysrKysrKwogLi4uL3Rlc3RfanNvbl9wYXJzZXIvdGVzdF9qc29uX3BhcnNlcl9qc29uNS5j IHwgMjk4ICsrKysrKysrKysrKysrKysrKwogOCBmaWxlcyBjaGFuZ2VkLCA2OTIgaW5zZXJ0aW9u cygrKSwgMzAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxl cy90ZXN0X2pzb25fcGFyc2VyL3QvMDA1X3Rlc3RfanNvbjUucGwKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvdGVzdF9qc29uX3BhcnNlcl9qc29u NS5jCgpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi9qc29uYXBpLmMgYi9zcmMvY29tbW9uL2pzb25h cGkuYwppbmRleCBkMzg2MDE5N2RhZC4uMTYxYzRiNDU1NmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb21t b24vanNvbmFwaS5jCisrKyBiL3NyYy9jb21tb24vanNvbmFwaS5jCkBAIC0zMjIsNiArMzIyLDE4 IEBAIGxleF9leHBlY3QoSnNvblBhcnNlQ29udGV4dCBjdHgsIEpzb25MZXhDb250ZXh0ICpsZXgs IEpzb25Ub2tlblR5cGUgdG9rZW4pCiAJCXJldHVybiByZXBvcnRfcGFyc2VfZXJyb3IoY3R4LCBs ZXgpOwogfQogCisvKgorICogbGV4X2lzX2pzb241CisgKgorICogaXMgSlNPTjUgc3ludGF4IGVu YWJsZWQgZm9yIHRoaXMgbGV4aW5nIGNvbnRleHQ/IFNlZQorICogc2V0SnNvbkxleENvbnRleHRK U09ONSgpLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wKK2xleF9pc19qc29uNShKc29uTGV4Q29u dGV4dCAqbGV4KQoreworCXJldHVybiAobGV4LT5mbGFncyAmIEpTT05MRVhfSlNPTjUpICE9IDA7 Cit9CisKIC8qIGNoYXJzIHRvIGNvbnNpZGVyIGFzIHBhcnQgb2YgYW4gYWxwaGFudW1lcmljIHRv a2VuICovCiAjZGVmaW5lIEpTT05fQUxQSEFOVU1FUklDX0NIQVIoYykgIFwKIAkoKChjKSA+PSAn YScgJiYgKGMpIDw9ICd6JykgfHwgXApAQCAtNTU4LDYgKzU3MCwzMCBAQCBzZXRKc29uTGV4Q29u dGV4dE93bnNUb2tlbnMoSnNvbkxleENvbnRleHQgKmxleCwgYm9vbCBvd25lZF9ieV9jb250ZXh0 KQogCQlsZXgtPmZsYWdzICY9IH5KU09OTEVYX0NUWF9PV05TX1RPS0VOUzsKIH0KIAorLyoKKyAq IHNldEpzb25MZXhDb250ZXh0SlNPTjUKKyAqCisgKiBTZWUgdGhlIGRlY2xhcmF0aW9uIG9mIHRo aXMgZnVuY3Rpb24gaW4ganNvbmFwaS5oIGZvciB0aGUgZGV0YWlscyBvZiB3aGF0CisgKiBlbmFi bGluZyBKU09ONSBtb2RlIGRvZXMuIEl0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSByZWN1cnNp dmUgZGVzY2VudAorICogcGFyc2VyIGludm9rZWQgdmlhIHBnX3BhcnNlX2pzb24oKSwgc28gaXQg bWF5IG5vdCBiZSBlbmFibGVkIG9uIGFuCisgKiBpbmNyZW1lbnRhbCBsZXhpbmcgY29udGV4dDsg SlNPTl9JTlZBTElEX0xFWEVSX1RZUEUgaXMgcmV0dXJuZWQgaW4gdGhhdAorICogY2FzZSwgbWF0 Y2hpbmcgdGhlIGVycm9yIHBnX3BhcnNlX2pzb24oKSBpdHNlbGYgcmV0dXJucyB3aGVuIGNhbGxl ZCB3aXRoCisgKiBhbiBpbmNyZW1lbnRhbCBsZXhpbmcgY29udGV4dC4KKyAqLworSnNvblBhcnNl RXJyb3JUeXBlCitzZXRKc29uTGV4Q29udGV4dEpTT041KEpzb25MZXhDb250ZXh0ICpsZXgsIGJv b2wgZW5hYmxlKQoreworCWlmIChsZXgtPmluY3JlbWVudGFsKQorCQlyZXR1cm4gSlNPTl9JTlZB TElEX0xFWEVSX1RZUEU7CisKKwlpZiAoZW5hYmxlKQorCQlsZXgtPmZsYWdzIHw9IEpTT05MRVhf SlNPTjU7CisJZWxzZQorCQlsZXgtPmZsYWdzICY9IH5KU09OTEVYX0pTT041OworCisJcmV0dXJu IEpTT05fU1VDQ0VTUzsKK30KKwogc3RhdGljIGlubGluZSBib29sCiBpbmNfbGV4X2xldmVsKEpz b25MZXhDb250ZXh0ICpsZXgpCiB7CkBAIC04MzcsNiArODczLDEwIEBAIGpzb25fY291bnRfYXJy YXlfZWxlbWVudHMoSnNvbkxleENvbnRleHQgKmxleCwgaW50ICplbGVtZW50cykKIAkJCXJlc3Vs dCA9IGpzb25fbGV4KCZjb3B5bGV4KTsKIAkJCWlmIChyZXN1bHQgIT0gSlNPTl9TVUNDRVNTKQog CQkJCXJldHVybiByZXN1bHQ7CisKKwkJCS8qIEpTT041IHBlcm1pdHMgYSB0cmFpbGluZyBjb21t YSBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2tldCAqLworCQkJaWYgKGxleF9pc19qc29uNSgmY29w eWxleCkgJiYgbGV4X3BlZWsoJmNvcHlsZXgpID09IEpTT05fVE9LRU5fQVJSQVlfRU5EKQorCQkJ CWJyZWFrOwogCQl9CiAJfQogCXJlc3VsdCA9IGxleF9leHBlY3QoSlNPTl9QQVJTRV9BUlJBWV9O RVhULCAmY29weWxleCwKQEAgLTEzMjUsNyArMTM2NSw4IEBAIHBhcnNlX29iamVjdF9maWVsZChK c29uTGV4Q29udGV4dCAqbGV4LCBjb25zdCBKc29uU2VtQWN0aW9uICpzZW0pCiAJSnNvblRva2Vu VHlwZSB0b2s7CiAJSnNvblBhcnNlRXJyb3JUeXBlIHJlc3VsdDsKIAotCWlmIChsZXhfcGVlayhs ZXgpICE9IEpTT05fVE9LRU5fU1RSSU5HKQorCWlmIChsZXhfcGVlayhsZXgpICE9IEpTT05fVE9L RU5fU1RSSU5HICYmCisJCSEobGV4X2lzX2pzb241KGxleCkgJiYgbGV4X3BlZWsobGV4KSA9PSBK U09OX1RPS0VOX0lERU5USUZJRVIpKQogCQlyZXR1cm4gcmVwb3J0X3BhcnNlX2Vycm9yKEpTT05f UEFSU0VfU1RSSU5HLCBsZXgpOwogCWlmICgob3N0YXJ0ICE9IE5VTEwgfHwgb2VuZCAhPSBOVUxM KSAmJiBsZXgtPm5lZWRfZXNjYXBlcykKIAl7CkBAIC0xNDMwLDEyICsxNDcxLDE4IEBAIHBhcnNl X29iamVjdChKc29uTGV4Q29udGV4dCAqbGV4LCBjb25zdCBKc29uU2VtQWN0aW9uICpzZW0pCiAJ c3dpdGNoICh0b2spCiAJewogCQljYXNlIEpTT05fVE9LRU5fU1RSSU5HOgorCQljYXNlIEpTT05f VE9LRU5fSURFTlRJRklFUjogLyogb25seSByZWFjaGFibGUgaW4gSlNPTjUgbW9kZSAqLwogCQkJ cmVzdWx0ID0gcGFyc2Vfb2JqZWN0X2ZpZWxkKGxleCwgc2VtKTsKIAkJCXdoaWxlIChyZXN1bHQg PT0gSlNPTl9TVUNDRVNTICYmIGxleF9wZWVrKGxleCkgPT0gSlNPTl9UT0tFTl9DT01NQSkKIAkJ CXsKIAkJCQlyZXN1bHQgPSBqc29uX2xleChsZXgpOwogCQkJCWlmIChyZXN1bHQgIT0gSlNPTl9T VUNDRVNTKQogCQkJCQlicmVhazsKKworCQkJCS8qIEpTT041IHBlcm1pdHMgYSB0cmFpbGluZyBj b21tYSBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2UgKi8KKwkJCQlpZiAobGV4X2lzX2pzb241KGxl eCkgJiYgbGV4X3BlZWsobGV4KSA9PSBKU09OX1RPS0VOX09CSkVDVF9FTkQpCisJCQkJCWJyZWFr OworCiAJCQkJcmVzdWx0ID0gcGFyc2Vfb2JqZWN0X2ZpZWxkKGxleCwgc2VtKTsKIAkJCX0KIAkJ CWJyZWFrOwpAQCAtMTU0OCw2ICsxNTk1LDExIEBAIHBhcnNlX2FycmF5KEpzb25MZXhDb250ZXh0 ICpsZXgsIGNvbnN0IEpzb25TZW1BY3Rpb24gKnNlbSkKIAkJCXJlc3VsdCA9IGpzb25fbGV4KGxl eCk7CiAJCQlpZiAocmVzdWx0ICE9IEpTT05fU1VDQ0VTUykKIAkJCQlicmVhazsKKworCQkJLyog SlNPTjUgcGVybWl0cyBhIHRyYWlsaW5nIGNvbW1hIGJlZm9yZSB0aGUgY2xvc2luZyBicmFja2V0 ICovCisJCQlpZiAobGV4X2lzX2pzb241KGxleCkgJiYgbGV4X3BlZWsobGV4KSA9PSBKU09OX1RP S0VOX0FSUkFZX0VORCkKKwkJCQlicmVhazsKKwogCQkJcmVzdWx0ID0gcGFyc2VfYXJyYXlfZWxl bWVudChsZXgsIHNlbSk7CiAJCX0KIAl9CkBAIC0xODQ5LDEzICsxOTAxLDYyIEBAIGpzb25fbGV4 KEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCS8qIGVuZCBvZiBwYXJ0aWFsIHRva2VuIHByb2Nlc3Np bmcgKi8KIAl9CiAKLQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLQl3aGlsZSAocyA8 IGVuZCAmJiAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcgfHwgKnMgPT0gJ1xuJyB8fCAqcyA9PSAn XHInKSkKKwkvKgorCSAqIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLCBhbG9uZyB3aXRoIEpTT041 IGNvbW1lbnRzLCBpZiBlbmFibGVkLiBKU09ONQorCSAqIGFsbG93cyBjb21tZW50cyBhbnl3aGVy ZSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQsIHNvIGtlZXAgYWx0ZXJuYXRpbmcKKwkgKiBiZXR3ZWVu IHRoZSB0d28gdW50aWwgbmVpdGhlciBvbmUgYWR2YW5jZXMgYW55IGZ1cnRoZXIuCisJICovCisJ Zm9yICg7OykKIAl7Ci0JCWlmICgqcysrID09ICdcbicpCisJCXdoaWxlIChzIDwgZW5kICYmICgq cyA9PSAnICcgfHwgKnMgPT0gJ1x0JyB8fCAqcyA9PSAnXG4nIHx8ICpzID09ICdccicpKQogCQl7 Ci0JCQkrK2xleC0+bGluZV9udW1iZXI7Ci0JCQlsZXgtPmxpbmVfc3RhcnQgPSBzOworCQkJaWYg KCpzKysgPT0gJ1xuJykKKwkJCXsKKwkJCQkrK2xleC0+bGluZV9udW1iZXI7CisJCQkJbGV4LT5s aW5lX3N0YXJ0ID0gczsKKwkJCX0KKwkJfQorCisJCWlmICghbGV4X2lzX2pzb241KGxleCkgfHwg cyA+PSBlbmQgfHwgKnMgIT0gJy8nIHx8IHMgKyAxID49IGVuZCkKKwkJCWJyZWFrOworCisJCWlm IChzWzFdID09ICcvJykKKwkJeworCQkJLyogIi8vIiBjb21tZW50OiBza2lwIHRocm91Z2ggdGhl IGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJCXMgKz0gMjsKKwkJCXdoaWxlIChzIDwgZW5kICYmICpz ICE9ICdcbicpCisJCQkJcysrOworCQl9CisJCWVsc2UgaWYgKHNbMV0gPT0gJyonKQorCQl7CisJ CQkvKiBibG9jayBjb21tZW50OiBza2lwIHRocm91Z2ggdGhlIGNsb3NpbmcgZGVsaW1pdGVyICov CisJCQljb25zdCBjaGFyICpjb21tZW50X3N0YXJ0ID0gczsKKworCQkJcyArPSAyOworCQkJd2hp bGUgKHMgPCBlbmQgJiYgIShzWzBdID09ICcqJyAmJiBzICsgMSA8IGVuZCAmJiBzWzFdID09ICcv JykpCisJCQl7CisJCQkJaWYgKCpzID09ICdcbicpCisJCQkJeworCQkJCQkrK2xleC0+bGluZV9u dW1iZXI7CisJCQkJCWxleC0+bGluZV9zdGFydCA9IHMgKyAxOworCQkJCX0KKwkJCQlzKys7CisJ CQl9CisKKwkJCWlmIChzID49IGVuZCkKKwkJCXsKKwkJCQlsZXgtPnRva2VuX3N0YXJ0ID0gY29t bWVudF9zdGFydDsKKwkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5f dGVybWluYXRvcjsKKwkJCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBlbmQ7CisJCQkJcmV0dXJu IEpTT05fVU5URVJNSU5BVEVEX0NPTU1FTlQ7CisJCQl9CisKKwkJCXMgKz0gMjsJCQkJLyogc2tp cCBvdmVyIHRoZSBjbG9zaW5nIGRlbGltaXRlciAqLworCQl9CisJCWVsc2UKKwkJeworCQkJLyog bG9uZSAnLyc6IG5vdCBhIGNvbW1lbnQsIGxldCB0aGUgbm9ybWFsIGxleGVyIGRlYWwgd2l0aCBp dCAqLworCQkJYnJlYWs7CiAJCX0KIAl9CiAJbGV4LT50b2tlbl9zdGFydCA9IHM7CkBAIC0xOTEw LDYgKzIwMTEsMjAgQEAganNvbl9sZXgoSnNvbkxleENvbnRleHQgKmxleCkKIAkJCQkJcmV0dXJu IHJlc3VsdDsKIAkJCQlsZXgtPnRva2VuX3R5cGUgPSBKU09OX1RPS0VOX1NUUklORzsKIAkJCQli cmVhazsKKwkJCWNhc2UgJ1wnJzoKKwkJCQlpZiAoIWxleF9pc19qc29uNShsZXgpKQorCQkJCXsK KwkJCQkJLyogbm90IGEgbGVnYWwgdG9rZW4gY2hhcmFjdGVyIG91dHNpZGUgSlNPTjUgbW9kZSAq LworCQkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5fdGVybWluYXRv cjsKKwkJCQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0gcyArIDE7CisJCQkJCXJldHVybiBKU09O X0lOVkFMSURfVE9LRU47CisJCQkJfQorCQkJCS8qIEpTT041IGFsc28gYWxsb3dzIHNpbmdsZS1x dW90ZWQgc3RyaW5ncy4gKi8KKwkJCQlyZXN1bHQgPSBqc29uX2xleF9zdHJpbmcobGV4KTsKKwkJ CQlpZiAocmVzdWx0ICE9IEpTT05fU1VDQ0VTUykKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQls ZXgtPnRva2VuX3R5cGUgPSBKU09OX1RPS0VOX1NUUklORzsKKwkJCQlicmVhazsKIAkJCWNhc2Ug Jy0nOgogCQkJCS8qIE5lZ2F0aXZlIG51bWJlci4gKi8KIAkJCQlyZXN1bHQgPSBqc29uX2xleF9u dW1iZXIobGV4LCBzICsgMSwgTlVMTCwgTlVMTCk7CkBAIC0xOTM2LDEyICsyMDUxLDE0IEBAIGpz b25fbGV4KEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQlkZWZhdWx0OgogCQkJCXsKIAkJCQkJY29u c3QgY2hhciAqcDsKKwkJCQkJYm9vbAkJaXNfa2V5d29yZDsKIAogCQkJCQkvKgogCQkJCQkgKiBX ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgc3RyaW5nLCBudW1iZXIsIGxlZ2FsCiAJCQkJCSAqIHB1 bmN0dWF0aW9uIG1hcmssIG9yIGVuZCBvZiBzdHJpbmcuICBUaGUgb25seSBsZWdhbAotCQkJCQkg KiB0b2tlbnMgd2UgbWlnaHQgZmluZCBoZXJlIGFyZSB0cnVlLCBmYWxzZSwgYW5kIG51bGwsCi0J CQkJCSAqIGJ1dCBmb3IgZXJyb3IgcmVwb3J0aW5nIHB1cnBvc2VzIHdlIHNjYW4gdW50aWwgd2Ug c2VlIGEKKwkJCQkJICogdG9rZW5zIHdlIG1pZ2h0IGZpbmQgaGVyZSBhcmUgdHJ1ZSwgZmFsc2Us IGFuZCBudWxsCisJCQkJCSAqIChwbHVzLCBpbiBKU09ONSBtb2RlLCBhIGJhcmUgaWRlbnRpZmll ciksIGJ1dCBmb3IgZXJyb3IKKwkJCQkJICogcmVwb3J0aW5nIHB1cnBvc2VzIHdlIHNjYW4gdW50 aWwgd2Ugc2VlIGEKIAkJCQkJICogbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuICBUaGF0IHdh eSwgd2UgY2FuIHJlcG9ydAogCQkJCQkgKiB0aGUgd2hvbGUgd29yZCBhcyBhbiB1bmV4cGVjdGVk IHRva2VuLCByYXRoZXIgdGhhbiBqdXN0CiAJCQkJCSAqIHNvbWUgdW5pbnR1aXRpdmUgcHJlZml4 IHRoZXJlb2YuCkBAIC0xOTY5LDI1ICsyMDg2LDQ4IEBAIGpzb25fbGV4KEpzb25MZXhDb250ZXh0 ICpsZXgpCiAJCQkJCX0KIAogCQkJCQkvKgotCQkJCQkgKiBXZSd2ZSBnb3QgYSByZWFsIGFscGhh bnVtZXJpYyB0b2tlbiBoZXJlLiAgSWYgaXQKLQkJCQkJICogaGFwcGVucyB0byBiZSB0cnVlLCBm YWxzZSwgb3IgbnVsbCwgYWxsIGlzIHdlbGwuICBJZgotCQkJCQkgKiBub3QsIGVycm9yIG91dC4K KwkJCQkJICogV2UndmUgZ290IGEgcmVhbCBhbHBoYW51bWVyaWMgdG9rZW4gaGVyZS4gIENoZWNr CisJCQkJCSAqIHdoZXRoZXIgaXQgaGFwcGVucyB0byBiZSB0cnVlLCBmYWxzZSwgb3IgbnVsbC4K IAkJCQkJICovCiAJCQkJCWxleC0+cHJldl90b2tlbl90ZXJtaW5hdG9yID0gbGV4LT50b2tlbl90 ZXJtaW5hdG9yOwogCQkJCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBwOwotCQkJCQlpZiAocCAt IHMgPT0gNCkKLQkJCQkJewotCQkJCQkJaWYgKG1lbWNtcChzLCAidHJ1ZSIsIDQpID09IDApCi0J CQkJCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9UUlVFOwotCQkJCQkJZWxzZSBpZiAo bWVtY21wKHMsICJudWxsIiwgNCkgPT0gMCkKLQkJCQkJCQlsZXgtPnRva2VuX3R5cGUgPSBKU09O X1RPS0VOX05VTEw7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIEpTT05fSU5WQUxJRF9UT0tF TjsKLQkJCQkJfQorCQkJCQlpc19rZXl3b3JkID0gdHJ1ZTsKKwkJCQkJaWYgKHAgLSBzID09IDQg JiYgbWVtY21wKHMsICJ0cnVlIiwgNCkgPT0gMCkKKwkJCQkJCWxleC0+dG9rZW5fdHlwZSA9IEpT T05fVE9LRU5fVFJVRTsKKwkJCQkJZWxzZSBpZiAocCAtIHMgPT0gNCAmJiBtZW1jbXAocywgIm51 bGwiLCA0KSA9PSAwKQorCQkJCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9OVUxMOwog CQkJCQllbHNlIGlmIChwIC0gcyA9PSA1ICYmIG1lbWNtcChzLCAiZmFsc2UiLCA1KSA9PSAwKQog CQkJCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9GQUxTRTsKIAkJCQkJZWxzZQotCQkJ CQkJcmV0dXJuIEpTT05fSU5WQUxJRF9UT0tFTjsKKwkJCQkJCWlzX2tleXdvcmQgPSBmYWxzZTsK KworCQkJCQlpZiAoIWlzX2tleXdvcmQpCisJCQkJCXsKKwkJCQkJCS8qCisJCQkJCQkgKiBOb3Qg YSBrZXl3b3JkLiAgSW4gSlNPTjUgbW9kZSwgdHJlYXQgaXQgYXMgYSBiYXJlCisJCQkJCQkgKiBp ZGVudGlmaWVyIChlLmcuIGFuIHVucXVvdGVkIG9iamVjdCBrZXkpOyB0aGUKKwkJCQkJCSAqIGdy YW1tYXIgaXMgcmVzcG9uc2libGUgZm9yIHJlamVjdGluZyBpdCB3aGVyZXZlciBhbgorCQkJCQkJ ICogaWRlbnRpZmllciBpc24ndCBhbGxvd2VkLiAgT3RoZXJ3aXNlIGl0J3MgYW4gZXJyb3IuCisJ CQkJCQkgKi8KKwkJCQkJCWlmICghbGV4X2lzX2pzb241KGxleCkpCisJCQkJCQkJcmV0dXJuIEpT T05fSU5WQUxJRF9UT0tFTjsKKworCQkJCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9J REVOVElGSUVSOworCQkJCQkJaWYgKGxleC0+bmVlZF9lc2NhcGVzKQorCQkJCQkJeworI2lmZGVm IEpTT05BUElfVVNFX1BRRVhQQlVGRkVSCisJCQkJCQkJLyogbWFrZSBzdXJlIGluaXRpYWxpemF0 aW9uIHN1Y2NlZWRlZCAqLworCQkJCQkJCWlmIChsZXgtPnN0cnZhbCA9PSBOVUxMKQorCQkJCQkJ CQlyZXR1cm4gSlNPTl9PVVRfT0ZfTUVNT1JZOworI2VuZGlmCisJCQkJCQkJanNvbmFwaV9yZXNl dFN0cmluZ0luZm8obGV4LT5zdHJ2YWwpOworCQkJCQkJCWpzb25hcGlfYXBwZW5kQmluYXJ5U3Ry aW5nSW5mbyhsZXgtPnN0cnZhbCwgcywgcCAtIHMpOworI2lmZGVmIEpTT05BUElfVVNFX1BRRVhQ QlVGRkVSCisJCQkJCQkJaWYgKFBRRXhwQnVmZmVyQnJva2VuKGxleC0+c3RydmFsKSkKKwkJCQkJ CQkJcmV0dXJuIEpTT05fT1VUX09GX01FTU9SWTsKKyNlbmRpZgorCQkJCQkJfQorCQkJCQl9CiAJ CQkJfQogCQl9CQkJCQkJLyogZW5kIG9mIHN3aXRjaCAqLwogCX0KQEAgLTIwMTUsNiArMjE1NSw5 IEBAIGpzb25fbGV4X3N0cmluZyhKc29uTGV4Q29udGV4dCAqbGV4KQogCWNvbnN0IGNoYXIgKnM7 CiAJY29uc3QgY2hhciAqY29uc3QgZW5kID0gbGV4LT5pbnB1dCArIGxleC0+aW5wdXRfbGVuZ3Ro OwogCWludAkJCWhpX3N1cnJvZ2F0ZSA9IC0xOworCWNvbnN0IGNoYXIJcXVvdGUgPSAqbGV4LT50 b2tlbl9zdGFydDsJLyogJyInLCBvciBpbiBKU09ONSBtb2RlICdcJycgKi8KKworCUFzc2VydChx dW90ZSA9PSAnIicgfHwgKGxleF9pc19qc29uNShsZXgpICYmIHF1b3RlID09ICdcJycpKTsKIAog CS8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgZXJyb3IgZXhpdHMgKi8KICNkZWZpbmUgRkFJTF9P Ul9JTkNPTVBMRVRFX0FUX0NIQVJfU1RBUlQoY29kZSkgXApAQCAtMjA1Nyw3ICsyMjAwLDcgQEAg anNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCS8qIFByZW1hdHVyZSBlbmQg b2YgdGhlIHN0cmluZy4gKi8KIAkJaWYgKHMgPj0gZW5kKQogCQkJRkFJTF9PUl9JTkNPTVBMRVRF X0FUX0NIQVJfU1RBUlQoSlNPTl9JTlZBTElEX1RPS0VOKTsKLQkJZWxzZSBpZiAoKnMgPT0gJyIn KQorCQllbHNlIGlmICgqcyA9PSBxdW90ZSkKIAkJCWJyZWFrOwogCQllbHNlIGlmICgqcyA9PSAn XFwnKQogCQl7CkBAIC0yMTY1LDYgKzIzMDgsMTkgQEAganNvbl9sZXhfc3RyaW5nKEpzb25MZXhD b250ZXh0ICpsZXgpCiAJCQkJCWNhc2UgJy8nOgogCQkJCQkJanNvbmFwaV9hcHBlbmRTdHJpbmdJ bmZvQ2hhcihsZXgtPnN0cnZhbCwgKnMpOwogCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ1wnJzoK KwkJCQkJCWlmICghbGV4X2lzX2pzb241KGxleCkpCisJCQkJCQl7CisJCQkJCQkJLyoKKwkJCQkJ CQkgKiBOb3QgYSB2YWxpZCBzdHJpbmcgZXNjYXBlLCBzbyBzaWduYWwgZXJyb3IuIFdlCisJCQkJ CQkJICogYWRqdXN0IHRva2VuX3N0YXJ0IHNvIHRoYXQganVzdCB0aGUgZXNjYXBlCisJCQkJCQkJ ICogc2VxdWVuY2UgaXMgcmVwb3J0ZWQsIG5vdCB0aGUgd2hvbGUgc3RyaW5nLgorCQkJCQkJCSAq LworCQkJCQkJCWxleC0+dG9rZW5fc3RhcnQgPSBzOworCQkJCQkJCUZBSUxfQVRfQ0hBUl9FTkQo SlNPTl9FU0NBUElOR19JTlZBTElEKTsKKwkJCQkJCX0KKwkJCQkJCWpzb25hcGlfYXBwZW5kU3Ry aW5nSW5mb0NoYXIobGV4LT5zdHJ2YWwsICpzKTsKKwkJCQkJCWJyZWFrOwogCQkJCQljYXNlICdi JzoKIAkJCQkJCWpzb25hcGlfYXBwZW5kU3RyaW5nSW5mb0NoYXIobGV4LT5zdHJ2YWwsICdcYicp OwogCQkJCQkJYnJlYWs7CkBAIC0yMTkxLDcgKzIzNDcsOCBAQCBqc29uX2xleF9zdHJpbmcoSnNv bkxleENvbnRleHQgKmxleCkKIAkJCQkJCUZBSUxfQVRfQ0hBUl9FTkQoSlNPTl9FU0NBUElOR19J TlZBTElEKTsKIAkJCQl9CiAJCQl9Ci0JCQllbHNlIGlmIChzdHJjaHIoIlwiXFwvYmZucnQiLCAq cykgPT0gTlVMTCkKKwkJCWVsc2UgaWYgKHN0cmNocigiXCJcXC9iZm5ydCIsICpzKSA9PSBOVUxM ICYmCisJCQkJCSAhKGxleF9pc19qc29uNShsZXgpICYmICpzID09ICdcJycpKQogCQkJewogCQkJ CS8qCiAJCQkJICogU2ltcGxlciBwcm9jZXNzaW5nIGlmIHdlJ3JlIG5vdCBib3RoZXJlZCBhYm91 dCBkZS1lc2NhcGluZwpAQCAtMjIxNywxMyArMjM3NCwxMyBAQCBqc29uX2xleF9zdHJpbmcoSnNv bkxleENvbnRleHQgKmxleCkKIAkJCSAqLwogCQkJd2hpbGUgKHAgPCBlbmQgLSBzaXplb2YoVmVj dG9yOCkgJiYKIAkJCQkgICAhcGdfbGZpbmQ4KCdcXCcsIChjb25zdCB1aW50OCAqKSBwLCBzaXpl b2YoVmVjdG9yOCkpICYmCi0JCQkJICAgIXBnX2xmaW5kOCgnIicsIChjb25zdCB1aW50OCAqKSBw LCBzaXplb2YoVmVjdG9yOCkpICYmCisJCQkJICAgIXBnX2xmaW5kOCgodWludDgpIHF1b3RlLCAo Y29uc3QgdWludDggKikgcCwgc2l6ZW9mKFZlY3RvcjgpKSAmJgogCQkJCSAgICFwZ19sZmluZDhf bGUoMzEsIChjb25zdCB1aW50OCAqKSBwLCBzaXplb2YoVmVjdG9yOCkpKQogCQkJCXAgKz0gc2l6 ZW9mKFZlY3RvcjgpOwogCiAJCQlmb3IgKDsgcCA8IGVuZDsgcCsrKQogCQkJewotCQkJCWlmICgq cCA9PSAnXFwnIHx8ICpwID09ICciJykKKwkJCQlpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSBxdW90 ZSkKIAkJCQkJYnJlYWs7CiAJCQkJZWxzZSBpZiAoKHVuc2lnbmVkIGNoYXIpICpwIDw9IDMxKQog CQkJCXsKQEAgLTI1MjMsNiArMjY4MCw4IEBAIGpzb25fZXJyZGV0YWlsKEpzb25QYXJzZUVycm9y VHlwZSBlcnJvciwgSnNvbkxleENvbnRleHQgKmxleCkKIAkJY2FzZSBKU09OX0lOVkFMSURfVE9L RU46CiAJCQlqc29uX3Rva2VuX2Vycm9yKGxleCwgIlRva2VuIFwiJS4qc1wiIGlzIGludmFsaWQu Iik7CiAJCQlicmVhazsKKwkJY2FzZSBKU09OX1VOVEVSTUlOQVRFRF9DT01NRU5UOgorCQkJcmV0 dXJuIF8oIlVudGVybWluYXRlZCBcIi8qXCIgY29tbWVudC4iKTsKIAkJY2FzZSBKU09OX09VVF9P Rl9NRU1PUlk6CiAJCQkvKiBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWJvdmU7IHVzZSB0aGUg ZXJyb3IgcGF0aCAqLwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tb24v anNvbmFwaS5oIGIvc3JjL2luY2x1ZGUvY29tbW9uL2pzb25hcGkuaAppbmRleCA4NWNjOWExMWQ5 Ny4uMzk1ZWRiNGU5ZDggMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NvbW1vbi9qc29uYXBpLmgK KysrIGIvc3JjL2luY2x1ZGUvY29tbW9uL2pzb25hcGkuaApAQCAtMjksNiArMjksMTMgQEAgdHlw ZWRlZiBlbnVtIEpzb25Ub2tlblR5cGUKIAlKU09OX1RPS0VOX0ZBTFNFLAogCUpTT05fVE9LRU5f TlVMTCwKIAlKU09OX1RPS0VOX0VORCwKKworCS8qCisJICogT25seSBwcm9kdWNlZCB3aGVuIEpT T041IG1vZGUgaXMgZW5hYmxlZCAoc2VlCisJICogc2V0SnNvbkxleENvbnRleHRKU09ONSgpKSwg Zm9yIGEgYmFyZSBpZGVudGlmaWVyIHN1Y2ggYXMgYW4gdW5xdW90ZWQKKwkgKiBvYmplY3Qga2V5 LgorCSAqLworCUpTT05fVE9LRU5fSURFTlRJRklFUiwKIH0gSnNvblRva2VuVHlwZTsKIAogdHlw ZWRlZiBlbnVtIEpzb25QYXJzZUVycm9yVHlwZQpAQCAtNDksNiArNTYsNyBAQCB0eXBlZGVmIGVu dW0gSnNvblBhcnNlRXJyb3JUeXBlCiAJSlNPTl9FWFBFQ1RFRF9PQkpFQ1RfTkVYVCwKIAlKU09O X0VYUEVDVEVEX1NUUklORywKIAlKU09OX0lOVkFMSURfVE9LRU4sCisJSlNPTl9VTlRFUk1JTkFU RURfQ09NTUVOVCwKIAlKU09OX09VVF9PRl9NRU1PUlksCiAJSlNPTl9VTklDT0RFX0NPREVfUE9J TlRfWkVSTywKIAlKU09OX1VOSUNPREVfRVNDQVBFX0ZPUk1BVCwKQEAgLTkzLDEwICsxMDEsMTIg QEAgdHlwZWRlZiBzdHJ1Y3QgSnNvbkluY3JlbWVudGFsU3RhdGUgSnNvbkluY3JlbWVudGFsU3Rh dGU7CiAgKgogICogSlNPTkxFWF9GUkVFX1NUUlVDVC9TVFJWQUwgYXJlIHVzZWQgdG8gZHJpdmUg ZnJlZUpzb25MZXhDb250ZXh0LgogICogSlNPTkxFWF9DVFhfT1dOU19UT0tFTlMgaXMgdXNlZCBi eSBzZXRKc29uTGV4Q29udGV4dE93bnNUb2tlbnMuCisgKiBKU09OTEVYX0pTT041IGlzIHVzZWQg Ynkgc2V0SnNvbkxleENvbnRleHRKU09ONS4KICAqLwogI2RlZmluZSBKU09OTEVYX0ZSRUVfU1RS VUNUCQkJKDEgPDwgMCkKICNkZWZpbmUgSlNPTkxFWF9GUkVFX1NUUlZBTAkJCSgxIDw8IDEpCiAj ZGVmaW5lIEpTT05MRVhfQ1RYX09XTlNfVE9LRU5TCQkoMSA8PCAyKQorI2RlZmluZSBKU09OTEVY X0pTT041CQkJCQkoMSA8PCAzKQogdHlwZWRlZiBzdHJ1Y3QgSnNvbkxleENvbnRleHQKIHsKIAlj b25zdCBjaGFyICppbnB1dDsKQEAgLTI0OSw2ICsyNTksMjMgQEAgZXh0ZXJuIEpzb25MZXhDb250 ZXh0ICptYWtlSnNvbkxleENvbnRleHRJbmNyZW1lbnRhbChKc29uTGV4Q29udGV4dCAqbGV4LAog ZXh0ZXJuIHZvaWQgc2V0SnNvbkxleENvbnRleHRPd25zVG9rZW5zKEpzb25MZXhDb250ZXh0ICps ZXgsCiAJCQkJCQkJCQkJYm9vbCBvd25lZF9ieV9jb250ZXh0KTsKIAorLyoKKyAqIEVuYWJsZXMg b3IgZGlzYWJsZXMgSlNPTjUgc3ludGF4IGV4dGVuc2lvbnMgZm9yIHRoZSBnaXZlbiBsZXhpbmcg Y29udGV4dDoKKyAqIGNvbW1lbnRzIChib3RoICIvLyAuLi4iIGFuZCBzbGFzaC1zdGFyIC4uLiBz dGFyLXNsYXNoIGZvcm1zKSwgdHJhaWxpbmcKKyAqIGNvbW1hcyBpbiBhcnJheXMgYW5kIG9iamVj dHMsIHNpbmdsZS1xdW90ZWQgc3RyaW5ncywgYW5kIHVucXVvdGVkCisgKiAoaWRlbnRpZmllcikg b2JqZWN0IGtleXMuCisgKgorICogSlNPTjUgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGhl IHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBpbnZva2VkIHZpYQorICogcGdfcGFyc2VfanNvbigp OyBlbmFibGluZyBpdCBvbiBhIGNvbnRleHQgc2V0IHVwIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5n CisgKiAoc2VlIG1ha2VKc29uTGV4Q29udGV4dEluY3JlbWVudGFsKCkpIHJldHVybnMgSlNPTl9J TlZBTElEX0xFWEVSX1RZUEUKKyAqIHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2UsIHRoZSBzYW1l IGVycm9yIHBnX3BhcnNlX2pzb24oKSBpdHNlbGYgcmV0dXJucworICogd2hlbiBjYWxsZWQgd2l0 aCBhbiBpbmNyZW1lbnRhbCBsZXhpbmcgY29udGV4dC4KKyAqCisgKiBCeSBkZWZhdWx0LCBKU09O NSBtb2RlIGlzIGRpc2FibGVkLgorICovCitleHRlcm4gSnNvblBhcnNlRXJyb3JUeXBlIHNldEpz b25MZXhDb250ZXh0SlNPTjUoSnNvbkxleENvbnRleHQgKmxleCwKKwkJCQkJCQkJCQkJCSBib29s IGVuYWJsZSk7CisKIGV4dGVybiB2b2lkIGZyZWVKc29uTGV4Q29udGV4dChKc29uTGV4Q29udGV4 dCAqbGV4KTsKIAogLyogbGV4IG9uZSB0b2tlbiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9k dWxlcy90ZXN0X2pzb25fcGFyc2VyLy5naXRpZ25vcmUgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf anNvbl9wYXJzZXIvLmdpdGlnbm9yZQppbmRleCBmMDMyZDFlNGY5MC4uYjJkOGQ4YmMwYWUgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNlci8uZ2l0aWdub3JlCisr KyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNlci8uZ2l0aWdub3JlCkBAIC0yLDMg KzIsNCBAQCB0bXBfY2hlY2sKIHRlc3RfanNvbl9wYXJzZXJfcGVyZgogdGVzdF9qc29uX3BhcnNl cl9pbmNyZW1lbnRhbAogdGVzdF9qc29uX3BhcnNlcl9pbmNyZW1lbnRhbF9zaGxpYgordGVzdF9q c29uX3BhcnNlcl9qc29uNQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25f cGFyc2VyL01ha2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL01ha2Vm aWxlCmluZGV4IGFmM2YxOTQyNGVkLi45YWZkMmI0MDhhZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL01ha2VmaWxlCisrKyBiL3NyYy90ZXN0L21vZHVsZXMv dGVzdF9qc29uX3BhcnNlci9NYWtlZmlsZQpAQCAtNCw5ICs0LDkgQEAgUEdBUFBJQ09OID0gd2lu MzIKIAogVEFQX1RFU1RTID0gMQogCi1PQkpTID0gdGVzdF9qc29uX3BhcnNlcl9pbmNyZW1lbnRh bC5vIHRlc3RfanNvbl9wYXJzZXJfcGVyZi5vICQoV0lOMzJSRVMpCitPQkpTID0gdGVzdF9qc29u X3BhcnNlcl9pbmNyZW1lbnRhbC5vIHRlc3RfanNvbl9wYXJzZXJfcGVyZi5vIHRlc3RfanNvbl9w YXJzZXJfanNvbjUubyAkKFdJTjMyUkVTKQogCi1FWFRSQV9DTEVBTiA9IHRlc3RfanNvbl9wYXJz ZXJfaW5jcmVtZW50YWwkKFgpIHRlc3RfanNvbl9wYXJzZXJfaW5jcmVtZW50YWxfc2hsaWIkKFgp IHRlc3RfanNvbl9wYXJzZXJfcGVyZiQoWCkKK0VYVFJBX0NMRUFOID0gdGVzdF9qc29uX3BhcnNl cl9pbmNyZW1lbnRhbCQoWCkgdGVzdF9qc29uX3BhcnNlcl9pbmNyZW1lbnRhbF9zaGxpYiQoWCkg dGVzdF9qc29uX3BhcnNlcl9wZXJmJChYKSB0ZXN0X2pzb25fcGFyc2VyX2pzb241JChYKQogCiBp ZmRlZiBVU0VfUEdYUwogUEdfQ09ORklHID0gcGdfY29uZmlnCkBAIC0xOSw3ICsxOSw3IEBAIGlu Y2x1ZGUgJCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKIGluY2x1ZGUgJCh0b3Bf c3JjZGlyKS9jb250cmliL2NvbnRyaWItZ2xvYmFsLm1rCiBlbmRpZgogCi1hbGw6IHRlc3RfanNv bl9wYXJzZXJfaW5jcmVtZW50YWwkKFgpIHRlc3RfanNvbl9wYXJzZXJfaW5jcmVtZW50YWxfc2hs aWIkKFgpIHRlc3RfanNvbl9wYXJzZXJfcGVyZiQoWCkKK2FsbDogdGVzdF9qc29uX3BhcnNlcl9p bmNyZW1lbnRhbCQoWCkgdGVzdF9qc29uX3BhcnNlcl9pbmNyZW1lbnRhbF9zaGxpYiQoWCkgdGVz dF9qc29uX3BhcnNlcl9wZXJmJChYKSB0ZXN0X2pzb25fcGFyc2VyX2pzb241JChYKQogCiAlLm86 ICQodG9wX3NyY2RpcikvJChzdWJkaXIpLyUuYwogCkBAIC0zMiw2ICszMiw5IEBAIHRlc3RfanNv bl9wYXJzZXJfaW5jcmVtZW50YWxfc2hsaWIkKFgpOiB0ZXN0X2pzb25fcGFyc2VyX2luY3JlbWVu dGFsLm8gJChXSU4zMlJFCiB0ZXN0X2pzb25fcGFyc2VyX3BlcmYkKFgpOiB0ZXN0X2pzb25fcGFy c2VyX3BlcmYubyAkKFdJTjMyUkVTKQogCSQoQ0MpICQoQ0ZMQUdTKSAkXiAkKFBHX0xJQlNfSU5U RVJOQUwpICQoTERGTEFHUykgJChMREZMQUdTX0VYKSAkKFBHX0xJQlMpICQoTElCUykgLW8gJEAK IAordGVzdF9qc29uX3BhcnNlcl9qc29uNSQoWCk6IHRlc3RfanNvbl9wYXJzZXJfanNvbjUubyAk KFdJTjMyUkVTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkXiAkKFBHX0xJQlNfSU5URVJOQUwpICQoTERG TEFHUykgJChMREZMQUdTX0VYKSAkKFBHX0xJQlMpICQoTElCUykgLW8gJEAKKwogc3BlZWQtY2hl Y2s6IHRlc3RfanNvbl9wYXJzZXJfcGVyZiQoWCkKIAlAZWNobyBTdGFuZGFyZCBwYXJzZXI6CiAJ dGltZSAuL3Rlc3RfanNvbl9wYXJzZXJfcGVyZiAxMDAwMCAkKHRvcF9zcmNkaXIpLyQoc3ViZGly KS90aW55Lmpzb24KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNl ci9SRUFETUUgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvUkVBRE1FCmluZGV4 IDYxZTdjNzhkNTg4Li5iNjhmNWUyNDFiOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X2pzb25fcGFyc2VyL1JFQURNRQorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9w YXJzZXIvUkVBRE1FCkBAIC0xLDcgKzEsNyBAQAogTW9kdWxlIGB0ZXN0X2pzb25fcGFyc2VyYAog PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGlzIG1vZHVsZSBjb250YWlucyB0d28gcHJv Z3JhbXMgZm9yIHRlc3RpbmcgdGhlIGpzb24gcGFyc2Vycy4KK1RoaXMgbW9kdWxlIGNvbnRhaW5z IHRocmVlIHByb2dyYW1zIGZvciB0ZXN0aW5nIHRoZSBqc29uIHBhcnNlcnMuCiAKIC0gYHRlc3Rf anNvbl9wYXJzZXJfaW5jcmVtZW50YWxgIGlzIGZvciB0ZXN0aW5nIHRoZSBpbmNyZW1lbnRhbCBw YXJzZXIsIEl0CiAgIHJlYWRzIGluIGEgZmlsZSBhbmQgcGFzc2VzIGl0IGluIHZlcnkgc21hbGwg Y2h1bmtzIChkZWZhdWx0IGlzIDYwIGJ5dGVzIGF0IGEKQEAgLTIwLDYgKzIwLDEyIEBAIFRoaXMg bW9kdWxlIGNvbnRhaW5zIHR3byBwcm9ncmFtcyBmb3IgdGVzdGluZyB0aGUganNvbiBwYXJzZXJz LgogICB1c2luZyB0aGUgbm9uLXJlY3Vyc2l2ZSBwYXJzZXIsIHRoZSBpbnB1dCBpcyBwYXNzZWQg dG8gdGhlIHBhcnNlciBpbiBhCiAgIHNpbmdsZSBjaHVuay4gVGhlIHJlc3VsdHMgYXJlIHRodXMg Y29tcGFyYWJsZSB0byB0aG9zZSBvZiB0aGUKICAgc3RhbmRhcmQgcGFyc2VyLgorLSBgdGVzdF9q c29uX3BhcnNlcl9qc29uNWAgaXMgZm9yIHRlc3RpbmcgSlNPTjUgbW9kZSBvZiB0aGUgc3RhbmRh cmQKKyAgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIChzZWUgYHNldEpzb25MZXhDb250ZXh0SlNP TjUoKWApLiBJdCBwYXJzZXMgaXRzCisgIGlucHV0IGluIGEgc2luZ2xlIGNodW5rLCB3aXRoIEpT T041IG1vZGUgZW5hYmxlZCB1bmxlc3MgIi1wIiAocGxhaW4gSlNPTikKKyAgaXMgZ2l2ZW4uIEFz IHdpdGggYHRlc3RfanNvbl9wYXJzZXJfaW5jcmVtZW50YWxgLCAiLXMiIHNwZWNpZmllcyB1c2lu ZworICBzZW1hbnRpYyByb3V0aW5lcyB0byByZS1vdXRwdXQgdGhlIGpzb24uIFRoZSByZXF1aXJl ZCBub24tb3B0aW9uIGFyZ3VtZW50CisgIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUuCiAKIFRoZSBz YW1wbGUgaW5wdXQgZmlsZSBpcyBhIHNtYWxsLCBzYW5pdGl6ZWQgZXh0cmFjdCBmcm9tIGEgbGlz dCBvZiBgZGVsaWNpb3VzYAogYm9va21hcmtzIHRha2VuIHNvbWUgeWVhcnMgYWdvLCBhbGwgd3Jh cHBlZCBpbiBhIHNpbmdsZSBqc29uCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf anNvbl9wYXJzZXIvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJz ZXIvbWVzb24uYnVpbGQKaW5kZXggMjY4ODY4NmUzN2IuLjZiMmM2MGUxMWM3IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvbWVzb24uYnVpbGQKKysrIGIvc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL21lc29uLmJ1aWxkCkBAIC01MCw2ICs1MCwy NSBAQCB0ZXN0X2pzb25fcGFyc2VyX3BlcmYgPSBleGVjdXRhYmxlKCd0ZXN0X2pzb25fcGFyc2Vy X3BlcmYnLAogICB9LAogKQogCit0ZXN0X2pzb25fcGFyc2VyX2pzb241X3NvdXJjZXMgPSBmaWxl cygKKyAgJ3Rlc3RfanNvbl9wYXJzZXJfanNvbjUuYycsCispCisKK2lmIGhvc3Rfc3lzdGVtID09 ICd3aW5kb3dzJworICB0ZXN0X2pzb25fcGFyc2VyX2pzb241X3NvdXJjZXMgKz0gcmNfYmluX2dl bi5wcm9jZXNzKHdpbjMydmVyX3JjLCBleHRyYV9hcmdzOiBbCisgICAgJy0tTkFNRScsICd0ZXN0 X2pzb25fcGFyc2VyX2pzb241JywKKyAgICAnLS1GSUxFREVTQycsICdzdGFuZGFsb25lIGpzb24g cGFyc2VyIHRlc3RlcicsCisgIF0pCitlbmRpZgorCit0ZXN0X2pzb25fcGFyc2VyX2pzb241ID0g ZXhlY3V0YWJsZSgndGVzdF9qc29uX3BhcnNlcl9qc29uNScsCisgIHRlc3RfanNvbl9wYXJzZXJf anNvbjVfc291cmNlcywKKyAgZGVwZW5kZW5jaWVzOiBbZnJvbnRlbmRfY29kZV0sCisgIGt3YXJn czogZGVmYXVsdF9iaW5fYXJncyArIHsKKyAgICAnaW5zdGFsbCc6IGZhbHNlLAorICB9LAorKQor CiB0ZXN0cyArPSB7CiAgICduYW1lJzogJ3Rlc3RfanNvbl9wYXJzZXInLAogICAnc2QnOiBtZXNv bi5jdXJyZW50X3NvdXJjZV9kaXIoKSwKQEAgLTU5LDEyICs3OCwxNCBAQCB0ZXN0cyArPSB7CiAg ICAgICAndC8wMDFfdGVzdF9qc29uX3BhcnNlcl9pbmNyZW1lbnRhbC5wbCcsCiAgICAgICAndC8w MDJfaW5saW5lLnBsJywKICAgICAgICd0LzAwM190ZXN0X3NlbWFudGljLnBsJywKLSAgICAgICd0 LzAwNF90ZXN0X3BhcnNlcl9wZXJmLnBsJworICAgICAgJ3QvMDA0X3Rlc3RfcGFyc2VyX3BlcmYu cGwnLAorICAgICAgJ3QvMDA1X3Rlc3RfanNvbjUucGwnLAogICAgIF0sCiAgICAgJ2RlcHMnOiBb CiAgICAgICB0ZXN0X2pzb25fcGFyc2VyX2luY3JlbWVudGFsLAogICAgICAgdGVzdF9qc29uX3Bh cnNlcl9pbmNyZW1lbnRhbF9zaGxpYiwKICAgICAgIHRlc3RfanNvbl9wYXJzZXJfcGVyZiwKKyAg ICAgIHRlc3RfanNvbl9wYXJzZXJfanNvbjUsCiAgICAgXSwKICAgfSwKIH0KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNlci90LzAwNV90ZXN0X2pzb241LnBsIGIv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL3QvMDA1X3Rlc3RfanNvbjUucGwKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmRmZmQyNDQzZmVhCi0tLSAvZGV2 L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2pzb25fcGFyc2VyL3QvMDA1X3Rlc3Rf anNvbjUucGwKQEAgLTAsMCArMSwxNDcgQEAKKworIyBDb3B5cmlnaHQgKGMpIDIwMjQtMjAyNiwg UG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKworIyBUZXN0IEpTT041IHN1cHBv cnQgaW4gdGhlIHJlY3Vyc2l2ZSBkZXNjZW50IEpTT04gcGFyc2VyOiBjb21tZW50cywKKyMgdHJh aWxpbmcgY29tbWFzLCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIHVucXVvdGVkIG9iamVjdCBr ZXlzLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOworCit1c2Ug UG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKwordXNlIEZpbGU6OlRl bXAgcXcodGVtcGZpbGUpOworCitteSAkZGlyID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnRl bXBkaXI7CisKK3N1YiBydW5fanNvbjUKK3sKKwlteSAoJGpzb24sIEBleHRyYV9hcmdzKSA9IEBf OworCisJbXkgKCRmaCwgJGZuYW1lKSA9IHRlbXBmaWxlKERJUiA9PiAkZGlyKTsKKwlwcmludCAk ZmggJGpzb247CisJY2xvc2UoJGZoKTsKKworCXJldHVybiBydW5fY29tbWFuZCgKKwkJWyAidGVz dF9qc29uX3BhcnNlcl9qc29uNSIsIEBleHRyYV9hcmdzLCAkZm5hbWUgXSk7Cit9CisKKyMgVGVz dCB0aGF0ICRqc29uIHN1Y2NlZWRzIGluIEpTT041IG1vZGUsIGJ1dCBmYWlscyBvdXRzaWRlIG9m IGl0ICh1bmxlc3MKKyMgcGxhaW5fb2sgaXMgc2V0LCBmb3IgY2FzZXMgd2hpY2ggYXJlIGFsc28g dmFsaWQgcGxhaW4gSlNPTikuCitzdWIgdGVzdF9qc29uNV9vbmx5Cit7CisJbG9jYWwgJFRlc3Q6 OkJ1aWxkZXI6OkxldmVsID0gJFRlc3Q6OkJ1aWxkZXI6OkxldmVsICsgMTsKKworCW15ICgkbmFt ZSwgJGpzb24sICVwYXJhbXMpID0gQF87CisKKwlteSAoJHN0ZG91dCwgJHN0ZGVycikgPSBydW5f anNvbjUoJGpzb24pOworCWlzKCRzdGRvdXQsICJTVUNDRVNTISIsICIkbmFtZTogc3VjY2VlZHMg aW4gSlNPTjUgbW9kZSIpOworCWlzKCRzdGRlcnIsICIiLCAiJG5hbWU6IG5vIGVycm9yIG91dHB1 dCBpbiBKU09ONSBtb2RlIik7CisKKwkoJHN0ZG91dCwgJHN0ZGVycikgPSBydW5fanNvbjUoJGpz b24sICItcCIpOworCWlmICgkcGFyYW1ze3BsYWluX29rfSkKKwl7CisJCWlzKCRzdGRvdXQsICJT VUNDRVNTISIsICIkbmFtZTogYWxzbyBzdWNjZWVkcyBhcyBwbGFpbiBKU09OIik7CisJCWlzKCRz dGRlcnIsICIiLCAiJG5hbWU6IG5vIGVycm9yIG91dHB1dCBhcyBwbGFpbiBKU09OIik7CisJfQor CWVsc2UKKwl7CisJCXVubGlrZSgkc3Rkb3V0LCBxci9TVUNDRVNTLywgIiRuYW1lOiBmYWlscyBh cyBwbGFpbiBKU09OIik7CisJCWlzbnQoJHN0ZGVyciwgIiIsICIkbmFtZTogZXJyb3Igb3V0cHV0 IGFzIHBsYWluIEpTT04iKTsKKwl9Cit9CisKK3N1YiB0ZXN0X2pzb241X2Vycm9yCit7CisJbG9j YWwgJFRlc3Q6OkJ1aWxkZXI6OkxldmVsID0gJFRlc3Q6OkJ1aWxkZXI6OkxldmVsICsgMTsKKwor CW15ICgkbmFtZSwgJGpzb24sICRlcnJvcikgPSBAXzsKKworCW15ICgkc3Rkb3V0LCAkc3RkZXJy KSA9IHJ1bl9qc29uNSgkanNvbik7CisJdW5saWtlKCRzdGRvdXQsIHFyL1NVQ0NFU1MvLCAiJG5h bWU6IGZhaWxzIGluIEpTT041IG1vZGUiKTsKKwlsaWtlKCRzdGRlcnIsICRlcnJvciwgIiRuYW1l OiBjb3JyZWN0IGVycm9yIG91dHB1dCIpOworfQorCisjIFRlc3QgdGhhdCB0aGUgc2VtYW50aWMg KC1zKSBvdXRwdXQgZm9yICRqc29uLCBwYXJzZWQgaW4gSlNPTjUgbW9kZSwKKyMgbWF0Y2hlcyAk ZXhwZWN0ZWQgKHdoaWNoIHNob3VsZCBiZSB2YWxpZCwgY2Fub25pY2FsIEpTT04pLgorc3ViIHRl c3RfanNvbjVfc2VtYW50aWMKK3sKKwlsb2NhbCAkVGVzdDo6QnVpbGRlcjo6TGV2ZWwgPSAkVGVz dDo6QnVpbGRlcjo6TGV2ZWwgKyAxOworCisJbXkgKCRuYW1lLCAkanNvbiwgJGV4cGVjdGVkKSA9 IEBfOworCisJbXkgKCRzdGRvdXQsICRzdGRlcnIpID0gcnVuX2pzb241KCRqc29uLCAiLXMiKTsK Kwlpcygkc3RkZXJyLCAiIiwgIiRuYW1lOiBubyBlcnJvciBvdXRwdXQiKTsKKworCSMgbm9ybWFs aXplIHdoaXRlc3BhY2UgdGhlIHNhbWUgd2F5IGZvciBib3RoIHNpZGVzCisJKG15ICRnb3QgPSAk c3Rkb3V0KSA9fiBzL1xzKy8vZzsKKwkobXkgJHdhbnQgPSAkZXhwZWN0ZWQpID1+IHMvXHMrLy9n OworCWlzKCRnb3QsICR3YW50LCAiJG5hbWU6IGNvcnJlY3Qgc2VtYW50aWMgb3V0cHV0Iik7Cit9 CisKKyMgQ29tbWVudHMKK3Rlc3RfanNvbjVfb25seSgibGluZSBjb21tZW50IiwgIi8vIGhlbGxv XG4xMjMiKTsKK3Rlc3RfanNvbjVfb25seSgibGluZSBjb21tZW50IGF0IGVvbCIsICIxMjMgLy8g aGVsbG8iKTsKK3Rlc3RfanNvbjVfb25seSgiYmxvY2sgY29tbWVudCIsICIvKiBoZWxsbyAqLyAx MjMiKTsKK3Rlc3RfanNvbjVfb25seSgiYmxvY2sgY29tbWVudCBpbnNpZGUgYXJyYXkiLAorCSJb MSwgLyogY29tbWVudCAqLyAyXSIpOwordGVzdF9qc29uNV9vbmx5KAorCSJtdWx0aS1saW5lIGJs b2NrIGNvbW1lbnQiLAorCSJbMSxcbi8qIGFcbm11bHRpXG5saW5lXG5jb21tZW50ICovXG4yXSIp OworCit0ZXN0X2pzb241X2Vycm9yKCJ1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCIsCisJIi8q IGhlbGxvIiwgcXIvVW50ZXJtaW5hdGVkLipjb21tZW50Lyk7CisKKyMgVHJhaWxpbmcgY29tbWFz Cit0ZXN0X2pzb241X29ubHkoInRyYWlsaW5nIGNvbW1hIGluIGFycmF5IiwgIlsxLCAyLCAzLF0i KTsKK3Rlc3RfanNvbjVfb25seSgidHJhaWxpbmcgY29tbWEgaW4gb2JqZWN0IiwgJ3siYSI6IDEs ICJiIjogMix9Jyk7Cit0ZXN0X2pzb241X29ubHkoInRyYWlsaW5nIGNvbW1hIGluIG5lc3RlZCBh cnJheSIsICJbWzEsXSxbMixdLF0iKTsKKworIyBhIGxvbmUgdHJhaWxpbmcgY29tbWEgaXMgbm90 IGVub3VnaCB0byBtYWtlIGFuIG90aGVyd2lzZS1lbXB0eQorIyBhcnJheSBvciBvYmplY3QgdmFs aWQKK3Rlc3RfanNvbjVfZXJyb3IoImFycmF5IHdpdGggb25seSBhIGNvbW1hIiwgIlssXSIsCisJ cXIvRXhwZWN0ZWQgSlNPTiB2YWx1ZSwgYnV0IGZvdW5kICIsIi8pOwordGVzdF9qc29uNV9lcnJv cigib2JqZWN0IHdpdGggb25seSBhIGNvbW1hIiwgInssfSIsCisJcXIvRXhwZWN0ZWQgc3RyaW5n IG9yICJ9IiwgYnV0IGZvdW5kICIsIi8pOworCisjIFNpbmdsZS1xdW90ZWQgc3RyaW5ncwordGVz dF9qc29uNV9vbmx5KCJzaW5nbGUtcXVvdGVkIHN0cmluZyIsICInaGVsbG8nIik7Cit0ZXN0X2pz b241X29ubHkoInNpbmdsZS1xdW90ZWQgc3RyaW5nIGluIGFycmF5IiwgIlsnaGVsbG8nLCAnd29y bGQnXSIpOwordGVzdF9qc29uNV9vbmx5KAorCSJzaW5nbGUtcXVvdGVkIHN0cmluZyB3aXRoIGVz Y2FwZWQgc2luZ2xlIHF1b3RlIiwgIidpdFxcJ3MnIik7Cit0ZXN0X2pzb241X29ubHkoCisJImRv dWJsZS1xdW90ZWQgc3RyaW5nIHdpdGggZXNjYXBlZCBzaW5nbGUgcXVvdGUgaW5zaWRlIiwgJyJp dFxcXCdzIicpOworCisjIFVucXVvdGVkIG9iamVjdCBrZXlzCit0ZXN0X2pzb241X29ubHkoInVu cXVvdGVkIGtleSIsICJ7Zm9vOiAxfSIpOwordGVzdF9qc29uNV9vbmx5KCJ1bnF1b3RlZCBrZXkg d2l0aCB1bmRlcnNjb3JlIiwgIntfZm9vX2JhcjogMX0iKTsKK3Rlc3RfanNvbjVfb25seSgKKwki bWl4ZWQgcXVvdGVkIGFuZCB1bnF1b3RlZCBrZXlzIiwKKwkne2ZvbzogMSwgImJhciI6IDIsIGJh ejogM30nKTsKKworIyBpZGVudGlmaWVycyBhcmUgb25seSBsZWdhbCBpbiBrZXkgcG9zaXRpb24s IG5vdCBhcyBiYXJlIHZhbHVlcywgZXZlbiBpbgorIyBKU09ONSBtb2RlCit0ZXN0X2pzb241X2Vy cm9yKCJiYXJlIGlkZW50aWZpZXIgYXMgdmFsdWUiLCAiW2Zvb10iLAorCXFyL0V4cGVjdGVkIEpT T04gdmFsdWUsIGJ1dCBmb3VuZCAiZm9vIi8pOwordGVzdF9qc29uNV9lcnJvcigiYmFyZSBpZGVu dGlmaWVyIGFzIHRvcC1sZXZlbCB2YWx1ZSIsICJmb28iLAorCXFyL0V4cGVjdGVkIEpTT04gdmFs dWUsIGJ1dCBmb3VuZCAiZm9vIi8pOworCisjIHNlbWFudGljIChzdHJ1Y3R1cmFsKSBjaGVja3MK K3Rlc3RfanNvbjVfc2VtYW50aWMoInVucXVvdGVkIGtleSByb3VuZC10cmlwIiwgIntmb286ICdi YXInfSIsCisJJ3siZm9vIjogImJhciJ9Jyk7Cit0ZXN0X2pzb241X3NlbWFudGljKAorCSJ0cmFp bGluZyBjb21tYSByb3VuZC10cmlwIiwKKwkiWzEsIDIsIDMsXSIsCisJIlsxLFxuMixcbjNdIik7 Cit0ZXN0X2pzb241X3NlbWFudGljKAorCSJjb21tZW50cyBhbmQgdHJhaWxpbmcgY29tbWFzIGNv bWJpbmVkIiwKKwlxeworCQl7CisJCQkvLyB0aGlzIGlzIGEgY29tbWVudAorCQkJZm9vOiAnYmFy JywgLyogYW5vdGhlciBjb21tZW50ICovCisJCQliYXo6IFsxLCAyLCAzLF0sCisJCX0KKwl9LAor CSd7ImZvbyI6ICJiYXIiLCAiYmF6IjogWzEsIDIsIDNdfScpOworCitkb25lX3Rlc3RpbmcoKTsK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9qc29uX3BhcnNlci90ZXN0X2pzb25f cGFyc2VyX2pzb241LmMgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvdGVzdF9q c29uX3BhcnNlcl9qc29uNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li44NTdiMDc5NjUwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9q c29uX3BhcnNlci90ZXN0X2pzb25fcGFyc2VyX2pzb241LmMKQEAgLTAsMCArMSwyOTggQEAKKy8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHRlc3RfanNvbl9wYXJzZXJfanNvbjUuYworICogICAg VGVzdCBwcm9ncmFtIGZvciBKU09ONSBtb2RlIG9mIHRoZSByZWN1cnNpdmUgZGVzY2VudCBKU09O IHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNC0yMDI2LCBQb3N0Z3JlU1FMIEdsb2Jh bCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKiAgICBzcmMvdGVz dC9tb2R1bGVzL3Rlc3RfanNvbl9wYXJzZXIvdGVzdF9qc29uX3BhcnNlcl9qc29uNS5jCisgKgor ICogVGhpcyBwcm9ncmFtIHBhcnNlcyBpdHMgaW5wdXQgd2l0aCB0aGUgcmVjdXJzaXZlIGRlc2Nl bnQgKG5vbi1pbmNyZW1lbnRhbCkKKyAqIEpTT04gcGFyc2VyLCBwZ19wYXJzZV9qc29uKCkuIFVu bGVzcyAiLXAiIChwbGFpbikgaXMgZ2l2ZW4sIEpTT041IG1vZGUgaXMKKyAqIGVuYWJsZWQsIHNv IHRoYXQgY29tbWVudHMsIHRyYWlsaW5nIGNvbW1hcywgc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFu ZAorICogdW5xdW90ZWQgb2JqZWN0IGtleXMgYXJlIGFsbCBhY2NlcHRlZCBpbiBhZGRpdGlvbiB0 byBzdGFuZGFyZCBKU09OLgorICoKKyAqIElmIHRoZSAtcyBmbGFnIGlzIGdpdmVuLCB0aGUgcHJv Z3JhbSBkb2VzIHNlbWFudGljIHByb2Nlc3NpbmcsIG1pcnJvcmluZworICogYmFjayB0aGUgaW5w dXQgYXMgc3RhbmRhcmQgSlNPTiAoYWxiZWl0IHdpdGggd2hpdGUgc3BhY2UgY2hhbmdlcykuIFRo aXMKKyAqIGNhbiBiZSB1c2VkIHRvIGNvbmZpcm0gdGhhdCBKU09ONS1vbmx5IHN5bnRheCBpcyBp bnRlcnByZXRlZCBjb3JyZWN0bHksCisgKiBub3QganVzdCB0aGF0IGl0J3MgYWNjZXB0ZWQuCisg KgorICogVGhlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBKU09O IGlucHV0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJwb3N0Z3Jl c19mZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNvbW1vbi9qc29uYXBp LmgiCisjaW5jbHVkZSAiY29tbW9uL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJsaWIvc3RyaW5naW5m by5oIgorI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCisjaW5jbHVkZSAicGdfZ2V0b3B0LmgiCisK KyNkZWZpbmUgQlVGU0laRSA2MDAwCisKK3R5cGVkZWYgc3RydWN0IERvU3RhdGUKK3sKKwlib29s CQllbGVtX2lzX2ZpcnN0OworCVN0cmluZ0luZm8JYnVmOworfSBEb1N0YXRlOworCitzdGF0aWMg dm9pZCB1c2FnZShjb25zdCBjaGFyICpwcm9nbmFtZSk7CitzdGF0aWMgdm9pZCBlc2NhcGVfanNv bihTdHJpbmdJbmZvIGJ1ZiwgY29uc3QgY2hhciAqc3RyKTsKKworLyogc2VtYW50aWMgYWN0aW9u IGZ1bmN0aW9ucyBmb3IgcGFyc2VyICovCitzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlIGRvX29i amVjdF9zdGFydCh2b2lkICpzdGF0ZSk7CitzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlIGRvX29i amVjdF9lbmQodm9pZCAqc3RhdGUpOworc3RhdGljIEpzb25QYXJzZUVycm9yVHlwZSBkb19vYmpl Y3RfZmllbGRfc3RhcnQodm9pZCAqc3RhdGUsIGNoYXIgKmZuYW1lLCBib29sIGlzbnVsbCk7Citz dGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlIGRvX2FycmF5X3N0YXJ0KHZvaWQgKnN0YXRlKTsKK3N0 YXRpYyBKc29uUGFyc2VFcnJvclR5cGUgZG9fYXJyYXlfZW5kKHZvaWQgKnN0YXRlKTsKK3N0YXRp YyBKc29uUGFyc2VFcnJvclR5cGUgZG9fYXJyYXlfZWxlbWVudF9zdGFydCh2b2lkICpzdGF0ZSwg Ym9vbCBpc251bGwpOworc3RhdGljIEpzb25QYXJzZUVycm9yVHlwZSBkb19zY2FsYXIodm9pZCAq c3RhdGUsIGNoYXIgKnRva2VuLCBKc29uVG9rZW5UeXBlIHRva2VudHlwZSk7CisKK3N0YXRpYyBK c29uU2VtQWN0aW9uIHNlbSA9IHsKKwkub2JqZWN0X3N0YXJ0ID0gZG9fb2JqZWN0X3N0YXJ0LAor CS5vYmplY3RfZW5kID0gZG9fb2JqZWN0X2VuZCwKKwkub2JqZWN0X2ZpZWxkX3N0YXJ0ID0gZG9f b2JqZWN0X2ZpZWxkX3N0YXJ0LAorCS5hcnJheV9zdGFydCA9IGRvX2FycmF5X3N0YXJ0LAorCS5h cnJheV9lbmQgPSBkb19hcnJheV9lbmQsCisJLmFycmF5X2VsZW1lbnRfc3RhcnQgPSBkb19hcnJh eV9lbGVtZW50X3N0YXJ0LAorCS5zY2FsYXIgPSBkb19zY2FsYXIKK307CisKK2ludAorbWFpbihp bnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhcgkJYnVmZltCVUZTSVpFXTsKKwlGSUxFCSAg ICpqc29uX2ZpbGU7CisJSnNvblBhcnNlRXJyb3JUeXBlIHJlc3VsdDsKKwlKc29uTGV4Q29udGV4 dCAqbGV4OworCVN0cmluZ0luZm9EYXRhIGpzb247CisJaW50CQkJbl9yZWFkOworCWJvb2wJCWpz b241ID0gdHJ1ZTsKKwlib29sCQluZWVkX3N0cmluZ3MgPSBmYWxzZTsKKwljb25zdCBKc29uU2Vt QWN0aW9uICp0ZXN0c2VtID0gJm51bGxTZW1BY3Rpb247CisJY2hhcgkgICAqdGVzdGZpbGU7CisJ aW50CQkJYzsKKwlEb1N0YXRlCQlzdGF0ZTsKKworCXBnX2xvZ2dpbmdfaW5pdChhcmd2WzBdKTsK KworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicHMiKSkgIT0gLTEpCisJeworCQlz d2l0Y2ggKGMpCisJCXsKKwkJCWNhc2UgJ3AnOgkJCS8qIHBsYWluIEpTT04sIG5vdCBKU09ONSAq LworCQkJCWpzb241ID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoJCQkvKiBkbyBz ZW1hbnRpYyBwcm9jZXNzaW5nICovCisJCQkJdGVzdHNlbSA9ICZzZW07CisJCQkJbmVlZF9zdHJp bmdzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChvcHRpbmQgPCBhcmdjKQor CXsKKwkJdGVzdGZpbGUgPSBhcmd2W29wdGluZF07CisJCW9wdGluZCsrOworCX0KKwllbHNlCisJ eworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpbml0U3RyaW5nSW5mbygm anNvbik7CisKKwlpZiAoKGpzb25fZmlsZSA9IGZvcGVuKHRlc3RmaWxlLCBQR19CSU5BUllfUikp ID09IE5VTEwpCisJCXBnX2ZhdGFsKCJlcnJvciBvcGVuaW5nIGlucHV0OiAlbSIpOworCisJd2hp bGUgKChuX3JlYWQgPSBmcmVhZChidWZmLCAxLCBCVUZTSVpFLCBqc29uX2ZpbGUpKSA+IDApCisJ CWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmpzb24sIGJ1ZmYsIG5fcmVhZCk7CisJZmNsb3NlKGpz b25fZmlsZSk7CisKKwlsZXggPSBtYWtlSnNvbkxleENvbnRleHRDc3RyaW5nTGVuKE5VTEwsIGpz b24uZGF0YSwganNvbi5sZW4sCisJCQkJCQkJCQkgICBQR19VVEY4LCBuZWVkX3N0cmluZ3MpOwor CWlmIChqc29uNSAmJiBzZXRKc29uTGV4Q29udGV4dEpTT041KGxleCwgdHJ1ZSkgIT0gSlNPTl9T VUNDRVNTKQorCQlwZ19mYXRhbCgiY291bGQgbm90IGVuYWJsZSBKU09ONSBtb2RlIik7CisKKwlp ZiAodGVzdHNlbSA9PSAmc2VtKQorCXsKKwkJc3RhdGUuZWxlbV9pc19maXJzdCA9IHRydWU7CisJ CXN0YXRlLmJ1ZiA9IG1ha2VTdHJpbmdJbmZvKCk7CisJCXNlbS5zZW1zdGF0ZSA9ICZzdGF0ZTsK Kwl9CisKKwlyZXN1bHQgPSBwZ19wYXJzZV9qc29uKGxleCwgdGVzdHNlbSk7CisKKwlpZiAocmVz dWx0ICE9IEpTT05fU1VDQ0VTUykKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGpzb25f ZXJyZGV0YWlsKHJlc3VsdCwgbGV4KSk7CisJCWZyZWVKc29uTGV4Q29udGV4dChsZXgpOworCQlm cmVlKGpzb24uZGF0YSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghbmVlZF9zdHJpbmdzKQor CQlwcmludGYoIlNVQ0NFU1MhXG4iKTsKKworCWZyZWVKc29uTGV4Q29udGV4dChsZXgpOworCWZy ZWUoanNvbi5kYXRhKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNlbWFudGljIHJv dXRpbmVzIGhlcmUgZXNzZW50aWFsbHkganVzdCBvdXRwdXQgdGhlIHNhbWUganNvbiwgZXhjZXB0 CisgKiBmb3Igd2hpdGUgc3BhY2UgYW5kLCBpbiBKU09ONSBtb2RlLCByZXNvbHZpbmcgYW55IEpT T041LW9ubHkgc3ludGF4IGludG8KKyAqIHBsYWluIEpTT04uIFRoZSByZXN1bHQgc2hvdWxkIGJl IGFibGUgdG8gYmUgZmVkIHRvIGFueSBKU09OIHByb2Nlc3NvcgorICogc3VjaCBhcyBqcSBmb3Ig dmFsaWRhdGlvbi4KKyAqLworCitzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlCitkb19vYmplY3Rf c3RhcnQodm9pZCAqc3RhdGUpCit7CisJRG9TdGF0ZSAgICAqX3N0YXRlID0gKERvU3RhdGUgKikg c3RhdGU7CisKKwlwcmludGYoIntcbiIpOworCV9zdGF0ZS0+ZWxlbV9pc19maXJzdCA9IHRydWU7 CisKKwlyZXR1cm4gSlNPTl9TVUNDRVNTOworfQorCitzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBl Citkb19vYmplY3RfZW5kKHZvaWQgKnN0YXRlKQoreworCURvU3RhdGUgICAgKl9zdGF0ZSA9IChE b1N0YXRlICopIHN0YXRlOworCisJcHJpbnRmKCJcbn1cbiIpOworCV9zdGF0ZS0+ZWxlbV9pc19m aXJzdCA9IGZhbHNlOworCisJcmV0dXJuIEpTT05fU1VDQ0VTUzsKK30KKworc3RhdGljIEpzb25Q YXJzZUVycm9yVHlwZQorZG9fb2JqZWN0X2ZpZWxkX3N0YXJ0KHZvaWQgKnN0YXRlLCBjaGFyICpm bmFtZSwgYm9vbCBpc251bGwpCit7CisJRG9TdGF0ZSAgICAqX3N0YXRlID0gKERvU3RhdGUgKikg c3RhdGU7CisKKwlpZiAoIV9zdGF0ZS0+ZWxlbV9pc19maXJzdCkKKwkJcHJpbnRmKCIsXG4iKTsK KwlyZXNldFN0cmluZ0luZm8oX3N0YXRlLT5idWYpOworCWVzY2FwZV9qc29uKF9zdGF0ZS0+YnVm LCBmbmFtZSk7CisJcHJpbnRmKCIlczogIiwgX3N0YXRlLT5idWYtPmRhdGEpOworCV9zdGF0ZS0+ ZWxlbV9pc19maXJzdCA9IGZhbHNlOworCWZyZWUoZm5hbWUpOworCisJcmV0dXJuIEpTT05fU1VD Q0VTUzsKK30KKworc3RhdGljIEpzb25QYXJzZUVycm9yVHlwZQorZG9fYXJyYXlfc3RhcnQodm9p ZCAqc3RhdGUpCit7CisJRG9TdGF0ZSAgICAqX3N0YXRlID0gKERvU3RhdGUgKikgc3RhdGU7CisK KwlwcmludGYoIltcbiIpOworCV9zdGF0ZS0+ZWxlbV9pc19maXJzdCA9IHRydWU7CisKKwlyZXR1 cm4gSlNPTl9TVUNDRVNTOworfQorCitzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlCitkb19hcnJh eV9lbmQodm9pZCAqc3RhdGUpCit7CisJRG9TdGF0ZSAgICAqX3N0YXRlID0gKERvU3RhdGUgKikg c3RhdGU7CisKKwlwcmludGYoIlxuXVxuIik7CisJX3N0YXRlLT5lbGVtX2lzX2ZpcnN0ID0gZmFs c2U7CisKKwlyZXR1cm4gSlNPTl9TVUNDRVNTOworfQorCitzdGF0aWMgSnNvblBhcnNlRXJyb3JU eXBlCitkb19hcnJheV9lbGVtZW50X3N0YXJ0KHZvaWQgKnN0YXRlLCBib29sIGlzbnVsbCkKK3sK KwlEb1N0YXRlICAgICpfc3RhdGUgPSAoRG9TdGF0ZSAqKSBzdGF0ZTsKKworCWlmICghX3N0YXRl LT5lbGVtX2lzX2ZpcnN0KQorCQlwcmludGYoIixcbiIpOworCV9zdGF0ZS0+ZWxlbV9pc19maXJz dCA9IGZhbHNlOworCisJcmV0dXJuIEpTT05fU1VDQ0VTUzsKK30KKworc3RhdGljIEpzb25QYXJz ZUVycm9yVHlwZQorZG9fc2NhbGFyKHZvaWQgKnN0YXRlLCBjaGFyICp0b2tlbiwgSnNvblRva2Vu VHlwZSB0b2tlbnR5cGUpCit7CisJRG9TdGF0ZSAgICAqX3N0YXRlID0gKERvU3RhdGUgKikgc3Rh dGU7CisKKwlpZiAodG9rZW50eXBlID09IEpTT05fVE9LRU5fU1RSSU5HKQorCXsKKwkJcmVzZXRT dHJpbmdJbmZvKF9zdGF0ZS0+YnVmKTsKKwkJZXNjYXBlX2pzb24oX3N0YXRlLT5idWYsIHRva2Vu KTsKKwkJcHJpbnRmKCIlcyIsIF9zdGF0ZS0+YnVmLT5kYXRhKTsKKwl9CisJZWxzZQorCQlwcmlu dGYoIiVzIiwgdG9rZW4pOworCisJZnJlZSh0b2tlbik7CisKKwlyZXR1cm4gSlNPTl9TVUNDRVNT OworfQorCisvKiBjb3BpZWQgZnJvbSBiYWNrZW5kIGNvZGUgKi8KK3N0YXRpYyB2b2lkCitlc2Nh cGVfanNvbihTdHJpbmdJbmZvIGJ1ZiwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIg KnA7CisKKwlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJyInKTsKKwlmb3IgKHAgPSBz dHI7ICpwOyBwKyspCisJeworCQlzd2l0Y2ggKCpwKQorCQl7CisJCQljYXNlICdcYic6CisJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcXGIiKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ug J1xmJzoKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxcZiIpOworCQkJCWJyZWFr OworCQkJY2FzZSAnXG4nOgorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXFxuIik7 CisJCQkJYnJlYWs7CisJCQljYXNlICdccic6CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhi dWYsICJcXHIiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1x0JzoKKwkJCQlhcHBlbmRTdHJpbmdJ bmZvU3RyaW5nKGJ1ZiwgIlxcdCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnIic6CisJCQkJYXBw ZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcXFwiIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdc XCc6CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJcXFxcIik7CisJCQkJYnJlYWs7 CisJCQlkZWZhdWx0OgorCQkJCWlmICgodW5zaWduZWQgY2hhcikgKnAgPCAnICcpCisJCQkJCWFw cGVuZFN0cmluZ0luZm8oYnVmLCAiXFx1JTA0eCIsIChpbnQpICpwKTsKKwkJCQllbHNlCisJCQkJ CWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAqcCk7CisJCQkJYnJlYWs7CisJCX0KKwl9 CisJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhidWYsICciJyk7Cit9CisKK3N0YXRpYyB2b2lk Cit1c2FnZShjb25zdCBjaGFyICpwcm9nbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJCSJV c2FnZTogJXMgWy1wXSBbLXNdIGZpbGVuYW1lXG4iCisJCQkiICAtcCAgcGFyc2UgYXMgcGxhaW4g SlNPTiwgbm90IEpTT041XG4iCisJCQkiICAtcyAgZG8gc2VtYW50aWMgcHJvY2Vzc2luZ1xuIiwK KwkJCXByb2duYW1lKTsKK30KLS0gCjIuNDMuMAoK --0000000000006dd81006562c9844--