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 1wHXHi-007GtT-1J for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Apr 2026 01:30:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wHXHg-00FQtN-1t for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Apr 2026 01:30:44 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wHXHf-00FQtF-2j for pgsql-hackers@lists.postgresql.org; Tue, 28 Apr 2026 01:30:44 +0000 Received: from mail-oo1-xc34.google.com ([2607:f8b0:4864:20::c34]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wHXHd-0000000375r-3F3c for pgsql-hackers@lists.postgresql.org; Tue, 28 Apr 2026 01:30:42 +0000 Received: by mail-oo1-xc34.google.com with SMTP id 006d021491bc7-67e09232daeso6636500eaf.2 for ; Mon, 27 Apr 2026 18:30:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777339841; cv=none; d=google.com; s=arc-20240605; b=CKHeABDtaHHiBoUK2hPiIUq+4NdtmlPaZkzzmq4nzWHMINaqKGAv/Ym7qiQbGmZwEG xYcwqcIeZC4Zv9acWo05tDRe7XpAbOYPYs1N0fOpXFvomVPLZqK68AhDWNP+9KwvTh+H SxWVBsV3dcV5VOLBPT79TFfh5KWOD1c9Yvx4PJr3gqZXcYDcLQiTsZfouwulSmhbkuMh LzaJvcq/cJqWiX+oU4wQGTJB0h677yWESDIMOdVdLU+lP88E/fao7icP7fyj5Xi1sFAW PPF8P8XXXU8aZm8M1ezdHWUoF9HsESQcSeiGpObEjFSpdLbEbKPLnGLuEqZrRwqeKFh/ 9dmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=j8EpuaVvxGSkHbs/JMDvvlM0bHvOxrXoONtlHeItWbc=; fh=+HDEHtL8cNue4C9Fpx8WQ+bWkzGV4LUih60feBD3EzA=; b=T2kl+kT2nLhNfW9nc9n8QibTga87rqSATzt1tr7K4P+jJsegAhwJY5s/PipFTC7iKR wiOEe3a8aj1JjTu+bDJFzP0X0fya6jPfKIr3FVR+F3jBXhT8c2mB+aieAOaU6T+PrC3y Bk7oOe+0jIjeZFpZbS4q/kyCvPJtKLttOdYwPTRoZX8HSqsdjukNi2avsW6TzqwJhy+G +PUy0y6CUqpcXxoRZDyNk7rjAXhSZqwngkpwwttaDmx0hQLMV0RVdPmGv9lftLy3ByjE XFx7CTL445mzb1YOukZBCgL6AR6lONTuLpdAw5VrlwZGckIQA0VUcnFlJyBCW7nbZxeH SwbQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777339841; x=1777944641; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=j8EpuaVvxGSkHbs/JMDvvlM0bHvOxrXoONtlHeItWbc=; b=dJylH66uTIoEyTVZXIy0XUz/WXmLvAr8Zube1MIUcZRBbItIWJJu2SN4NbsKYEu0Xg wJzeFE+M51yQQjAfGFz4nFMf9sGb7Prhze1SQVeTl5jo0fL0PIPQC5/xLcp5Sj/CsRrR bOxOn04gaR7u5wieTiQphcIcISLazmhtCCHhBPXW05jL8YVZ/7dhrpGRWdbMeD1hyIVn FrWVdFtpbaDdQSfivHQk4/GqfZdYl7EVzQbExZQLUH0oakcCbSxkP6S/QegmFYe7UPpz u9TKS6U37M0J4r2aViLhqQCafbn0b9D51L9ZUF+H1Ovm4xjLd1W/HkUSag4SrsT/vY4H cabQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777339841; x=1777944641; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=j8EpuaVvxGSkHbs/JMDvvlM0bHvOxrXoONtlHeItWbc=; b=DPaWC7qgQ0ApN6ifQBLMA6jQLw97KbSsWcrLtCr5skh+p/WTb/AX9MTWamVsBWwovM fnz64I2ihN/pI2/5b9iC7uHDBsRm9i1mwRy3EGUmNCUIpQ1RFS5agyy4F2ALJoahetxL cobw518w2skf0HRQm8HvcmoN7+MvrL1vUoAywVm86Y2Q0UfeUSmFxTIHazZxaiaYR2hd QGznExfHm2npo9tqVxGwIubRF2J4CXXJcRkpKCg/VGEvIhSJLdDzRgF8aeMcUVS6Aj7A JiRiE6HRD4edMIlOUpJNMYOvPTQOLzWwxN+nL+InMjNa+uQm5DJt2GPUhwzZghIgvcAq 7XoA== X-Forwarded-Encrypted: i=1; AFNElJ+SO65E6zss/aOl6tHkp+xPaQHB2H4a2aNoDFFOclVDuQbWBiv8MwdgQQqjT10r06SAcgxLO0nPDy5UmFGD@lists.postgresql.org X-Gm-Message-State: AOJu0YwfBmZLgwXh6KcnRFAVRkvSqwEdEkQHnsyQWNMSKES4UzLMmXNb UU+wAvbSGajVu/0hKXi94tUhajlDnvf0OaL65H5NPe/rIZMvn1lH8yepjgGwx/ajVr/m+c0UkUq RCiTDKwcR60Jx9eTqfz5ld8fq3pQiwgrZe+vxWvU= X-Gm-Gg: AeBDieux8XQJTt+aLHDjZjzlakafkM0J8WjQ4M/KEPhVChvRCEwFAl0dep0PbnPR3dK D/wDGZ+JRDx87R0sZtbtSVGZuUGO2k1v6Texz1C/m35Q6GsrvVATzyYMgxbD7lqU9WABdo12odY 7sMPBgUPN8Qf7KQyd/FiBx6rYyAwNWdL4G3zHkDfDr2CDIEikhRYZaYBFZh3aH7EX444AB6Frb2 /I5NiCCbDMAIQ0LHIMlC1SWbBS20/r5/B5SRg6FKxAzEfpTK8rffYxsdsybMqF9c99KivwgyJv1 vbeQsb6wzZKyOXX1WEdsGADsEFj/9x9HvZLBRBT4dAKMQ4+3+6U= X-Received: by 2002:a4a:e917:0:b0:694:9a0a:6fa9 with SMTP id 006d021491bc7-6965cab16fbmr517912eaf.26.1777339841362; Mon, 27 Apr 2026 18:30:41 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Bharath Rupireddy Date: Mon, 27 Apr 2026 18:30:00 -0700 X-Gm-Features: AVHnY4L3JZbGKwI_HfH9U-DnHoCEIRXnIb0XM94RKdYS2BMaps6-Q1YIFpSWbyA Message-ID: Subject: =?UTF-8?Q?Re=3A_=5BProposal=5D_pg=5Fstat=5Fwal=5Frecords_=E2=80=93_per=2Drecord=2Dty?= =?UTF-8?Q?pe_WAL_generation_statistics?= To: SATYANARAYANA NARLAPURAM Cc: Michael Paquier , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000e3e39506507b2d41" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e3e39506507b2d41 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Fri, Mar 27, 2026 at 11:27=E2=80=AFAM SATYANARAYANA NARLAPURAM wrote: > >> As a whole, I am doubtful that this information is worth counting in >> live, eating a stats kind ID. One could also implement a background >> worker that provides more advanced aggregate stats outside the WAL >> insert path, with a custom stats kind. No need to have that into >> core, especially if the code that increments the stats eats more and >> more cycles. > > Your argument makes sense to me, I was a bit hesitant on > writing a background worker because of the potential side effects of tail= ing > the WAL. Let me try a different approach by implementing an ondemand > sniffing of the WAL, which can be implemented as an extension without > changes to core. Do you have thoughts on making it a contrib module or > modify existing pg_walinspect to accommodate these requirements? Hi, Please find an attached patch that implements a page_read callback which reads WAL directly from WAL buffers using WALReadFromBuffers. I've included a test module as a demo to show how one can collect WAL record statistics without hitting WAL files. The only core change needed is a fix in ReadPageInternal. ReadPageInternal validates the first page of a WAL segment whenever it switches to a new segment. When reading from WAL buffers, that first page may already be overwritten by newer WAL, so we need to skip this validation when no segment has been previously loaded (ws_segno =3D=3D 0). I understand that this will not give exact stats like the other approaches discussed; however, it requires fewer changes to core, and WALReadFromBuffers was designed to work without any locks, so it should have minimal impact. Appreciate any feedback. Thank you! -- Bharath Rupireddy Amazon Web Services: https://aws.amazon.com --000000000000e3e39506507b2d41 Content-Type: application/x-patch; name="v1-0001-Add-test-extension-for-WAL-stats-using-WALReadFro.patch" Content-Disposition: attachment; filename="v1-0001-Add-test-extension-for-WAL-stats-using-WALReadFro.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo9jxmc80 RnJvbSAyZmRhMDk4N2IyYTM4ZmRhMjJkNzBlYmQwMTlkYzEwMmRkZDBiMTFkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMjIgQXByIDIwMjYgMDM6NTA6MjUgKzAw MDAKU3ViamVjdDogW1BBVENIIHYxXSBBZGQgdGVzdCBleHRlbnNpb24gZm9yIFdBTCBzdGF0cyB1 c2luZyBXQUxSZWFkRnJvbUJ1ZmZlcnMKCkFkZCBhIHRlc3QgbW9kdWxlIHRoYXQgY29sbGVjdHMg cGVyLXJlc291cmNlLW1hbmFnZXIgV0FMIHJlY29yZApzdGF0aXN0aWNzIGJ5IHJlYWRpbmcgZGly ZWN0bHkgZnJvbSBpbi1tZW1vcnkgV0FMIGJ1ZmZlcnMgdmlhCldBTFJlYWRGcm9tQnVmZmVycywg YXZvaWRpbmcgV0FMIGZpbGUgSS9PLgoKVGhpcyByZXF1aXJlcyBhIHNtYWxsIGZpeCBpbiBSZWFk UGFnZUludGVybmFsIHRvIGhhbmRsZQpidWZmZXItYmFzZWQgcGFnZV9yZWFkIGNhbGxiYWNrcyB3 aGVyZSB0aGUgZmlyc3QgcGFnZSBvZiBhIHNlZ21lbnQKbWF5IG5vIGxvbmdlciBiZSBhdmFpbGFi bGUgaW4gdGhlIFdBTCBidWZmZXJzLgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2cuYyAgICAgICAgICAgICB8ICAgNCArLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxv Z3JlYWRlci5jICAgICAgIHwgIDExICstCiBzcmMvaW5jbHVkZS9hY2Nlc3MveGxvZy5oICAgICAg ICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZSAgICAgICAg ICAgICAgICAgICAgIHwgICAxICsKIHNyYy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQgICAgICAg ICAgICAgICAgICB8ICAgMSArCiAuLi4vbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvLmdp dGlnbm9yZSAgfCAgIDQgKwogLi4uL21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL01ha2Vm aWxlICAgIHwgIDIzICsrCiAuLi4vbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvbWVzb24u YnVpbGQgfCAgMjMgKysKIC4uLi90ZXN0X3dhbF9yZWNvcmRfc3RhdHMtLTEuMC5zcWwgICAgICAg ICAgICB8ICAxOCArKwogLi4uL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy5jICAgICAgICAgICAgICAg ICAgIHwgMjM2ICsrKysrKysrKysrKysrKysrKwogLi4uL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy5j b250cm9sICAgICAgICAgICAgIHwgICA0ICsKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5s aXN0ICAgICAgICAgICAgICB8ICAgMSArCiAxMiBmaWxlcyBjaGFuZ2VkLCAzMjQgaW5zZXJ0aW9u cygrKSwgMyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVz L3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvTWFrZWZpbGUKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy9tZXNvbi5idWls ZAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0 YXRzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy0tMS4wLnNxbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNy Yy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0 cy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRf c3RhdHMvdGVzdF93YWxfcmVjb3JkX3N0YXRzLmNvbnRyb2wKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9nLmMKaW5kZXggZTM5YWY3OWMwM2IuLjI3MzFjMWZlMGYyIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGxvZy5jCkBAIC03MzgsNyArNzM4LDcgQEAgc3RhdGljIHZvaWQgUmVzZXJ2ZVhMb2dJbnNl cnRMb2NhdGlvbihpbnQgc2l6ZSwgWExvZ1JlY1B0ciAqU3RhcnRQb3MsCiAJCQkJCQkJCQkgIFhM b2dSZWNQdHIgKkVuZFBvcywgWExvZ1JlY1B0ciAqUHJldlB0cik7CiBzdGF0aWMgYm9vbCBSZXNl cnZlWExvZ1N3aXRjaChYTG9nUmVjUHRyICpTdGFydFBvcywgWExvZ1JlY1B0ciAqRW5kUG9zLAog CQkJCQkJCSAgWExvZ1JlY1B0ciAqUHJldlB0cik7Ci1zdGF0aWMgWExvZ1JlY1B0ciBXYWl0WExv Z0luc2VydGlvbnNUb0ZpbmlzaChYTG9nUmVjUHRyIHVwdG8pOworWExvZ1JlY1B0cglXYWl0WExv Z0luc2VydGlvbnNUb0ZpbmlzaChYTG9nUmVjUHRyIHVwdG8pOwogc3RhdGljIGNoYXIgKkdldFhM b2dCdWZmZXIoWExvZ1JlY1B0ciBwdHIsIFRpbWVMaW5lSUQgdGxpKTsKIHN0YXRpYyBYTG9nUmVj UHRyIFhMb2dCeXRlUG9zVG9SZWNQdHIodWludDY0IGJ5dGVwb3MpOwogc3RhdGljIFhMb2dSZWNQ dHIgWExvZ0J5dGVQb3NUb0VuZFJlY1B0cih1aW50NjQgYnl0ZXBvcyk7CkBAIC0xNTQxLDcgKzE1 NDEsNyBAQCBXQUxJbnNlcnRMb2NrVXBkYXRlSW5zZXJ0aW5nQXQoWExvZ1JlY1B0ciBpbnNlcnRp bmdBdCkKICAqIHVuaW5pdGlhbGl6ZWQgcGFnZSksIGFuZCB0aGUgaW5zZXJ0ZXIgbWlnaHQgbmVl ZCB0byBldmljdCBhbiBvbGQgV0FMIGJ1ZmZlcgogICogdG8gbWFrZSByb29tIGZvciBhIG5ldyBv bmUsIHdoaWNoIGluIHR1cm4gcmVxdWlyZXMgV0FMV3JpdGVMb2NrLgogICovCi1zdGF0aWMgWExv Z1JlY1B0cgorWExvZ1JlY1B0cgogV2FpdFhMb2dJbnNlcnRpb25zVG9GaW5pc2goWExvZ1JlY1B0 ciB1cHRvKQogewogCXVpbnQ2NAkJYnl0ZXBvczsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL3hsb2dyZWFkZXIuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2dyZWFkZXIuYwppbmRleCA4ODQ5NjEwZGIwMC4uYTU1OWZjYzJmYTkgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWFkZXIuYworKysgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS94bG9ncmVhZGVyLmMKQEAgLTEwNDQsOCArMTA0NCwxNyBAQCBSZWFkUGFn ZUludGVybmFsKFhMb2dSZWFkZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIgcGFnZXB0ciwgaW50 IHJlcUxlbikKIAkgKiBmaWxlIGFuZCB2YWxpZGF0ZSBpdHMgaGVhZGVyLCBldmVuIGlmIHRoYXQn cyBub3Qgd2hlcmUgdGhlIHRhcmdldAogCSAqIHJlY29yZCBpcy4gIFRoaXMgaXMgc28gdGhhdCB3 ZSBjYW4gY2hlY2sgdGhlIGFkZGl0aW9uYWwgaWRlbnRpZmljYXRpb24KIAkgKiBpbmZvIHRoYXQg aXMgcHJlc2VudCBpbiB0aGUgZmlyc3QgcGFnZSdzICJsb25nIiBoZWFkZXIuCisJICoKKwkgKiBX aGVuIHJlYWRpbmcgV0FMIGZyb20gdGhlIGluLW1lbW9yeSBXQUwgYnVmZmVycyB2aWEgV0FMUmVh ZEZyb21CdWZmZXJzLAorCSAqIHRoZSBmaXJzdCBwYWdlIG9mIGEgc2VnbWVudCBtYXkgaGF2ZSBh bHJlYWR5IGJlZW4gb3ZlcndyaXR0ZW4gYnkgbmV3ZXIKKwkgKiBXQUwgaW4gdGhlIFdBTCBidWZm ZXJzIGJ5IHRoZSB0aW1lIHdlIG5lZWQgdG8gcmVhZCBhIGxhdGVyIHBhZ2UgZnJvbQorCSAqIHRo YXQgc2FtZSBzZWdtZW50LiBJbiB0aGlzIGNhc2UsIHdlIHNraXAgdGhpcyBmaXJzdCBwYWdlIHZh bGlkYXRpb24uCisJICoKKwkgKiBYWFg6IENvbnNpZGVyIGFkZGluZyBhIGZsYWcgaW4gWExvZ1Jl YWRlclN0YXRlIHRoYXQgY2FsbGVycyByZWFkaW5nCisJICogZnJvbSBXQUwgYnVmZmVycyBjYW4g c2V0LCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHdzX3NlZ25vID09IDAuCiAJICovCi0JaWYgKHRh cmdldFNlZ05vICE9IHN0YXRlLT5zZWcud3Nfc2Vnbm8gJiYgdGFyZ2V0UGFnZU9mZiAhPSAwKQor CWlmIChzdGF0ZS0+c2VnLndzX3NlZ25vICE9IDAgJiYKKwkJdGFyZ2V0U2VnTm8gIT0gc3RhdGUt PnNlZy53c19zZWdubyAmJiB0YXJnZXRQYWdlT2ZmICE9IDApCiAJewogCQlYTG9nUmVjUHRyCXRh cmdldFNlZ21lbnRQdHIgPSBwYWdlcHRyIC0gdGFyZ2V0UGFnZU9mZjsKIApkaWZmIC0tZ2l0IGEv c3JjL2luY2x1ZGUvYWNjZXNzL3hsb2cuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmgKaW5k ZXggNDM3YjRmMzIzNDkuLmFkMzFhOWNiNjE4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nl c3MveGxvZy5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmgKQEAgLTI4NCw2ICsyODQs NyBAQCBleHRlcm4gdm9pZCBTZXRXYWxXcml0ZXJTbGVlcGluZyhib29sIHNsZWVwaW5nKTsKIAog ZXh0ZXJuIHZvaWQgV2FrZXVwQ2hlY2twb2ludGVyKHZvaWQpOwogCitleHRlcm4gWExvZ1JlY1B0 ciBXYWl0WExvZ0luc2VydGlvbnNUb0ZpbmlzaChYTG9nUmVjUHRyIHVwdG8pOwogZXh0ZXJuIFNp emUgV0FMUmVhZEZyb21CdWZmZXJzKGNoYXIgKmRzdGJ1ZiwgWExvZ1JlY1B0ciBzdGFydHB0ciwg U2l6ZSBjb3VudCwKIAkJCQkJCQkgICBUaW1lTGluZUlEIHRsaSk7CiAKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L21vZHVsZXMvTWFrZWZpbGUgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCmluZGV4 IDBhNzRhYjVjODZmLi5jM2JiMzY2YjA5MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy9N YWtlZmlsZQorKysgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBA IFNVQkRJUlMgPSBcCiAJCSAgb2F1dGhfdmFsaWRhdG9yIFwKIAkJICBwbHNhbXBsZSBcCiAJCSAg c3BnaXN0X25hbWVfb3BzIFwKKwkJICB0ZXN0X3dhbF9yZWNvcmRfc3RhdHMgXAogCQkgIHRlc3Rf YWlvIFwKIAkJICB0ZXN0X2F1dG92YWN1dW0gXAogCQkgIHRlc3RfYmluYXJ5aGVhcCBcCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1aWxkIGIvc3JjL3Rlc3QvbW9kdWxlcy9t ZXNvbi5idWlsZAppbmRleCA0YmNhNDJiYjM3MC4uZjMxMzMxOTM3MDUgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5i dWlsZApAQCAtMTQsNiArMTQsNyBAQCBzdWJkaXIoJ25idHJlZScpCiBzdWJkaXIoJ29hdXRoX3Zh bGlkYXRvcicpCiBzdWJkaXIoJ3Bsc2FtcGxlJykKIHN1YmRpcignc3BnaXN0X25hbWVfb3BzJykK K3N1YmRpcigndGVzdF93YWxfcmVjb3JkX3N0YXRzJykKIHN1YmRpcignc3NsX3Bhc3NwaHJhc2Vf Y2FsbGJhY2snKQogc3ViZGlyKCd0ZXN0X2FpbycpCiBzdWJkaXIoJ3Rlc3RfYXV0b3ZhY3V1bScp CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy8uZ2l0 aWdub3JlIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvLmdpdGlnbm9y ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNWRjYjNmZjk3MjMKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy8u Z2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorIyBHZW5lcmF0ZWQgc3ViZGlyZWN0b3JpZXMKKy9s b2cvCisvcmVzdWx0cy8KKy90bXBfY2hlY2svCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVz L3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF93 YWxfcmVjb3JkX3N0YXRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi5iZGRlNGViNTk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMv dGVzdF93YWxfcmVjb3JkX3N0YXRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMgc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvTWFrZWZpbGUKKworTU9EVUxFX2JpZyA9 IHRlc3Rfd2FsX3JlY29yZF9zdGF0cworT0JKUyA9IFwKKwkkKFdJTjMyUkVTKSBcCisJdGVzdF93 YWxfcmVjb3JkX3N0YXRzLm8KK1BHRklMRURFU0MgPSAidGVzdF93YWxfcmVjb3JkX3N0YXRzIC0g dGVzdCBXQUwgcmVjb3JkIHN0YXRzIGZyb20gV0FMIGJ1ZmZlcnMiCisKK0VYVEVOU0lPTiA9IHRl c3Rfd2FsX3JlY29yZF9zdGF0cworREFUQSA9IHRlc3Rfd2FsX3JlY29yZF9zdGF0cy0tMS4wLnNx bAorCitUQVBfVEVTVFMgPSAwCisKK2lmZGVmIFVTRV9QR1hTCitQR19DT05GSUcgPSBwZ19jb25m aWcKK1BHWFMgOj0gJChzaGVsbCAkKFBHX0NPTkZJRykgLS1wZ3hzKQoraW5jbHVkZSAkKFBHWFMp CitlbHNlCitzdWJkaXIgPSBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cwor dG9wX2J1aWxkZGlyID0gLi4vLi4vLi4vLi4KK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL3NyYy9N YWtlZmlsZS5nbG9iYWwKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb250cmliL2NvbnRyaWItZ2xv YmFsLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNv cmRfc3RhdHMvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29yZF9z dGF0cy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZDEzNWY0YjI3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2Fs X3JlY29yZF9zdGF0cy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIzIEBACisjIENvcHlyaWdodCAo YykgMjAyNC0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCit0ZXN0 X3dhbF9yZWNvcmRfc3RhdHNfc291cmNlcyA9IGZpbGVzKAorICAndGVzdF93YWxfcmVjb3JkX3N0 YXRzLmMnLAorKQorCitpZiBob3N0X3N5c3RlbSA9PSAnd2luZG93cycKKyAgdGVzdF93YWxfcmVj b3JkX3N0YXRzX3NvdXJjZXMgKz0gcmNfbGliX2dlbi5wcm9jZXNzKHdpbjMydmVyX3JjLCBleHRy YV9hcmdzOiBbCisgICAgJy0tTkFNRScsICd0ZXN0X3dhbF9yZWNvcmRfc3RhdHMnLAorICAgICct LUZJTEVERVNDJywgJ3Rlc3Rfd2FsX3JlY29yZF9zdGF0cyAtIHRlc3QgV0FMIHJlY29yZCBzdGF0 cyBmcm9tIFdBTCBidWZmZXJzJyxdKQorZW5kaWYKKwordGVzdF93YWxfcmVjb3JkX3N0YXRzID0g c2hhcmVkX21vZHVsZSgndGVzdF93YWxfcmVjb3JkX3N0YXRzJywKKyAgdGVzdF93YWxfcmVjb3Jk X3N0YXRzX3NvdXJjZXMsCisgIGt3YXJnczogcGdfdGVzdF9tb2RfYXJncywKKykKK3Rlc3RfaW5z dGFsbF9saWJzICs9IHRlc3Rfd2FsX3JlY29yZF9zdGF0cworCit0ZXN0X2luc3RhbGxfZGF0YSAr PSBmaWxlcygKKyAgJ3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy5jb250cm9sJywKKyAgJ3Rlc3Rfd2Fs X3JlY29yZF9zdGF0cy0tMS4wLnNxbCcsCispCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy0tMS4wLnNxbCBi L3NyYy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rlc3Rfd2FsX3JlY29yZF9z dGF0cy0tMS4wLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uY2I4 ZTNkMDdkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3Jl Y29yZF9zdGF0cy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMtLTEuMC5zcWwKQEAgLTAsMCArMSwxOCBA QAorLyogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvdGVzdF93YWxfcmVj b3JkX3N0YXRzLS0xLjAuc3FsICovCisKKy0tIGNvbXBsYWluIGlmIHNjcmlwdCBpcyBzb3VyY2Vk IGluIHBzcWwsIHJhdGhlciB0aGFuIHZpYSBDUkVBVEUgRVhURU5TSU9OCitcZWNobyBVc2UgIkNS RUFURSBFWFRFTlNJT04gdGVzdF93YWxfcmVjb3JkX3N0YXRzIiB0byBsb2FkIHRoaXMgZmlsZS4g XHF1aXQKKworQ1JFQVRFIEZVTkNUSU9OIGdldF93YWxfcmVjb3JkX3N0YXRzX2Zyb21fYnVmZmVy cygKKyAgICBJTiBzdGFydF9sc24gcGdfbHNuLAorICAgIElOIGVuZF9sc24gcGdfbHNuLAorICAg IE9VVCByZXNvdXJjZV9tYW5hZ2VyIHRleHQsCisgICAgT1VUIHJlY29yZF90eXBlIHRleHQsCisg ICAgT1VUIGNvdW50IGludDgsCisgICAgT1VUIHRvdGFsX3JlY29yZF9sZW5ndGggaW50OCwKKyAg ICBPVVQgdG90YWxfbWFpbl9kYXRhX2xlbmd0aCBpbnQ4LAorICAgIE9VVCB0b3RhbF9mcGlfbGVu Z3RoIGludDgKKykKK1JFVFVSTlMgU0VUT0YgcmVjb3JkCitBUyAnTU9EVUxFX1BBVEhOQU1FJywg J2dldF93YWxfcmVjb3JkX3N0YXRzX2Zyb21fYnVmZmVycycKK0xBTkdVQUdFIEMgU1RSSUNUIFBB UkFMTEVMIFNBRkU7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfd2FsX3JlY29y ZF9zdGF0cy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMuYyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF93 YWxfcmVjb3JkX3N0YXRzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5hZGVlNWRjMmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3Ny Yy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rlc3Rfd2FsX3JlY29yZF9zdGF0 cy5jCkBAIC0wLDAgKzEsMjM2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB0ZXN0X3dh bF9yZWNvcmRfc3RhdHMuYworICoJCVRlc3QgbW9kdWxlIGV4ZXJjaXNpbmcgV0FMUmVhZEZyb21C dWZmZXJzKCkgdG8gcmVhZCBXQUwgcmVjb3JkcworICoJCWRpcmVjdGx5IGZyb20gV0FMIGJ1ZmZl cnMgKHNoYXJlZCBtZW1vcnksIG5vIGRpc2sgSS9PKS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5 OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVO VElGSUNBVElPTgorICoJCXNyYy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rl c3Rfd2FsX3JlY29yZF9zdGF0cy5jCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVk ZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImFjY2Vzcy94bG9nLmgiCisjaW5jbHVkZSAiYWNj ZXNzL3hsb2dfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhY2Nlc3MveGxvZ3JlYWRlci5oIgorI2lu Y2x1ZGUgImFjY2Vzcy94bG9ncmVjb3ZlcnkuaCIKKyNpbmNsdWRlICJmdW5jYXBpLmgiCisjaW5j bHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRl ICJ1dGlscy9wZ19sc24uaCIKKyNpbmNsdWRlICJ1dGlscy90dXBsZXN0b3JlLmgiCisKK1BHX01P RFVMRV9NQUdJQzsKKworLyoKKyAqIHBhZ2VfcmVhZCBjYWxsYmFjayB0aGF0IHJlYWRzIFdBTCBk aXJlY3RseSBmcm9tIFdBTCBidWZmZXJzLgorICovCitzdGF0aWMgaW50Cit3YWxfYnVmZmVyX3Bh Z2VfcmVhZChYTG9nUmVhZGVyU3RhdGUgKnN0YXRlLCBYTG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIs CisJCQkJCSBpbnQgcmVxTGVuLCBYTG9nUmVjUHRyIHRhcmdldFJlY1B0ciwKKwkJCQkJIGNoYXIg KmN1cl9wYWdlKQoreworCVhMb2dSZWNQdHIJcmVhZF91cHRvOworCVhMb2dSZWNQdHIJbG9jOwor CVRpbWVMaW5lSUQJdGxpID0gR2V0V0FMSW5zZXJ0aW9uVGltZUxpbmUoKTsKKwlTaXplCQljb3Vu dDsKKwlTaXplCQluYnl0ZXM7CisKKwlsb2MgPSB0YXJnZXRQYWdlUHRyICsgcmVxTGVuOworCisJ cmVhZF91cHRvID0gR2V0WExvZ0luc2VydFJlY1B0cigpOworCisJLyoKKwkgKiBJZiB0aGUgcmVx dWVzdGVkIFdBTCBoYXNuJ3QgYmVlbiBpbnNlcnRlZCB5ZXQsIHJldHVybiAtMSByYXRoZXIgdGhh bgorCSAqIHdhaXRpbmcuICBUaGUgV0FMIGJldHdlZW4gc3RhcnRfbHNuIGFuZCBlbmRfbHNuIHNo b3VsZCBhbHJlYWR5IGJlCisJICogaW5zZXJ0ZWQgYnkgdGhlIHRpbWUgd2UncmUgY2FsbGVkLgor CSAqLworCWlmIChsb2MgPiByZWFkX3VwdG8pCisJCXJldHVybiAtMTsKKworCS8qIEVuc3VyZSBh bnkgaW4tcHJvZ3Jlc3MgaW5zZXJ0aW9ucyB1cCB0byB0aGlzIHBvaW50IGFyZSB2aXNpYmxlICov CisJV2FpdFhMb2dJbnNlcnRpb25zVG9GaW5pc2gobG9jKTsKKworCWlmICh0YXJnZXRQYWdlUHRy ICsgWExPR19CTENLU1ogPD0gcmVhZF91cHRvKQorCQljb3VudCA9IFhMT0dfQkxDS1NaOworCWVs c2UgaWYgKHRhcmdldFBhZ2VQdHIgKyByZXFMZW4gPiByZWFkX3VwdG8pCisJCXJldHVybiAtMTsK KwllbHNlCisJCWNvdW50ID0gcmVhZF91cHRvIC0gdGFyZ2V0UGFnZVB0cjsKKworCW5ieXRlcyA9 IFdBTFJlYWRGcm9tQnVmZmVycyhjdXJfcGFnZSwgdGFyZ2V0UGFnZVB0ciwgY291bnQsIHRsaSk7 CisKKwlpZiAobmJ5dGVzIDw9IDApCisJCXJldHVybiAtMTsJCS8qIGRhdGEgZXZpY3RlZCBmcm9t IGNpcmN1bGFyIFdBTCBidWZmZXIgKi8KKworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIFBlci1y bWdyL3JlY29yZF90eXBlIGFjY3VtdWxhdGlvbiBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IFdh bFJlY29yZFN0YXQKK3sKKwljaGFyCQlyZXNvdXJjZV9tYW5hZ2VyWzY0XTsKKwljaGFyCQlyZWNv cmRfdHlwZVs2NF07CisJaW50NjQJCWNvdW50OworCWludDY0CQl0b3RhbF9yZWNvcmRfbGVuZ3Ro OworCWludDY0CQl0b3RhbF9tYWluX2RhdGFfbGVuZ3RoOworCWludDY0CQl0b3RhbF9mcGlfbGVu Z3RoOworfSBXYWxSZWNvcmRTdGF0OworCisjZGVmaW5lIE1BWF9XQUxfU1RBVF9FTlRSSUVTIDI1 NgorCisvKgorICogZ2V0X3dhbF9yZWNvcmRfc3RhdHNfZnJvbV9idWZmZXJzKHN0YXJ0X2xzbiwg ZW5kX2xzbikKKyAqCisgKiBSZXR1cm5zIHBlci1yZXNvdXJjZV9tYW5hZ2VyL3JlY29yZF90eXBl IFdBTCByZWNvcmQgc3RhdGlzdGljcyBieSByZWFkaW5nCisgKiBkaXJlY3RseSBmcm9tIFdBTCBi dWZmZXJzIHZpYSBXQUxSZWFkRnJvbUJ1ZmZlcnMoKS4KKyAqLworUEdfRlVOQ1RJT05fSU5GT19W MShnZXRfd2FsX3JlY29yZF9zdGF0c19mcm9tX2J1ZmZlcnMpOworRGF0dW0KK2dldF93YWxfcmVj b3JkX3N0YXRzX2Zyb21fYnVmZmVycyhQR19GVU5DVElPTl9BUkdTKQoreworI2RlZmluZSBXQUxf UkVDT1JEX1NUQVRTX0NPTFMgNgorCVhMb2dSZWNQdHIJc3RhcnRfbHNuID0gUEdfR0VUQVJHX0xT TigwKTsKKwlYTG9nUmVjUHRyCWVuZF9sc24gPSBQR19HRVRBUkdfTFNOKDEpOworCVhMb2dSZWFk ZXJTdGF0ZSAqeGxvZ3JlYWRlcjsKKwlYTG9nUmVjUHRyCWZpcnN0X3ZhbGlkX3JlY29yZDsKKwlj aGFyCSAgICplcnJvcm1zZzsKKwlSZXR1cm5TZXRJbmZvICpyc2luZm8gPSAoUmV0dXJuU2V0SW5m byAqKSBmY2luZm8tPnJlc3VsdGluZm87CisJV2FsUmVjb3JkU3RhdCBzdGF0c1tNQVhfV0FMX1NU QVRfRU5UUklFU107CisJaW50CQkJbnN0YXRzID0gMDsKKwlpbnQJCQlpOworCisJaWYgKFJlY292 ZXJ5SW5Qcm9ncmVzcygpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVf T0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coIldBTCBidWZm ZXJzIGNhbiBvbmx5IGJlIHJlYWQgb24gYSBwcmltYXJ5IHNlcnZlciIpKSk7CisKKwlpZiAoc3Rh cnRfbHNuIDwgWExPR19CTENLU1opCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJS Q09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJIGVycm1zZygiY291bGQgbm90IHJl YWQgV0FMIGF0IExTTiAlWC8lMDhYIiwKKwkJCQkJCUxTTl9GT1JNQVRfQVJHUyhzdGFydF9sc24p KSkpOworCisJaWYgKHN0YXJ0X2xzbiA+IGVuZF9sc24pCisJCWVyZXBvcnQoRVJST1IsCisJCQkJ KGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJIGVycm1zZygi V0FMIHN0YXJ0IExTTiBtdXN0IGJlIGxlc3MgdGhhbiBlbmQgTFNOIikpKTsKKworCW1lbXNldChz dGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CisKKwlJbml0TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywg MCk7CisKKwl4bG9ncmVhZGVyID0gWExvZ1JlYWRlckFsbG9jYXRlKHdhbF9zZWdtZW50X3NpemUs IE5VTEwsCisJCQkJCQkJCQlYTF9ST1VUSU5FKC5wYWdlX3JlYWQgPSAmd2FsX2J1ZmZlcl9wYWdl X3JlYWQsCisJCQkJCQkJCQkJCSAgIC5zZWdtZW50X29wZW4gPSBOVUxMLAorCQkJCQkJCQkJCQkg ICAuc2VnbWVudF9jbG9zZSA9IE5VTEwpLAorCQkJCQkJCQkJTlVMTCk7CisKKwlpZiAoeGxvZ3Jl YWRlciA9PSBOVUxMKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfT1VU X09GX01FTU9SWSksCisJCQkJIGVycm1zZygib3V0IG9mIG1lbW9yeSIpLAorCQkJCSBlcnJkZXRh aWwoIkZhaWxlZCB3aGlsZSBhbGxvY2F0aW5nIGEgV0FMIHJlYWRpbmcgcHJvY2Vzc29yLiIpKSk7 CisKKwlmaXJzdF92YWxpZF9yZWNvcmQgPSBYTG9nRmluZE5leHRSZWNvcmQoeGxvZ3JlYWRlciwg c3RhcnRfbHNuLCAmZXJyb3Jtc2cpOworCisJaWYgKFhMb2dSZWNQdHJJc0ludmFsaWQoZmlyc3Rf dmFsaWRfcmVjb3JkKSkKKwl7CisJCVhMb2dSZWFkZXJGcmVlKHhsb2dyZWFkZXIpOworCQlQR19S RVRVUk5fVk9JRCgpOworCX0KKworCS8qIFNjYW4gV0FMIHJlY29yZHMgYW5kIGFjY3VtdWxhdGUg c3RhdHMgKi8KKwl3aGlsZSAodHJ1ZSkKKwl7CisJCVhMb2dSZWNvcmQgKnJlY29yZDsKKwkJUm1n ckRhdGEJZGVzYzsKKwkJY29uc3QgY2hhciAqcm1ncl9uYW1lOworCQljb25zdCBjaGFyICpyZWNf dHlwZTsKKwkJaW50CQkJZm91bmQgPSAtMTsKKworCQlyZWNvcmQgPSBYTG9nUmVhZFJlY29yZCh4 bG9ncmVhZGVyLCAmZXJyb3Jtc2cpOworCQlpZiAocmVjb3JkID09IE5VTEwpCisJCQlicmVhazsK KworCQlpZiAoeGxvZ3JlYWRlci0+RW5kUmVjUHRyID4gZW5kX2xzbikKKwkJCWJyZWFrOworCisJ CWRlc2MgPSBHZXRSbWdyKFhMb2dSZWNHZXRSbWlkKHhsb2dyZWFkZXIpKTsKKwkJcm1ncl9uYW1l ID0gZGVzYy5ybV9uYW1lOworCQlyZWNfdHlwZSA9IGRlc2Mucm1faWRlbnRpZnkoWExvZ1JlY0dl dEluZm8oeGxvZ3JlYWRlcikpOworCQlpZiAocmVjX3R5cGUgPT0gTlVMTCkKKwkJCXJlY190eXBl ID0gIlVOS05PV04iOworCisJCS8qIEZpbmQgZXhpc3RpbmcgZW50cnkgb3IgY3JlYXRlIG5ldyBv bmUgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5zdGF0czsgaSsrKQorCQl7CisJCQlpZiAoc3RyY21w KHN0YXRzW2ldLnJlc291cmNlX21hbmFnZXIsIHJtZ3JfbmFtZSkgPT0gMCAmJgorCQkJCXN0cmNt cChzdGF0c1tpXS5yZWNvcmRfdHlwZSwgcmVjX3R5cGUpID09IDApCisJCQl7CisJCQkJZm91bmQg PSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kIDwgMCkKKwkJeworCQkJ aWYgKG5zdGF0cyA+PSBNQVhfV0FMX1NUQVRfRU5UUklFUykKKwkJCXsKKwkJCQllcmVwb3J0KFdB Uk5JTkcsCisJCQkJCQkoZXJybXNnKCJXQUwgcmVjb3JkIHN0YXQgZW50cmllcyBsaW1pdCByZWFj aGVkICglZCkiLAorCQkJCQkJCQlNQVhfV0FMX1NUQVRfRU5UUklFUykpKTsKKwkJCQlicmVhazsK KwkJCX0KKwkJCWZvdW5kID0gbnN0YXRzKys7CisJCQlzdHJsY3B5KHN0YXRzW2ZvdW5kXS5yZXNv dXJjZV9tYW5hZ2VyLCBybWdyX25hbWUsCisJCQkJCXNpemVvZihzdGF0c1tmb3VuZF0ucmVzb3Vy Y2VfbWFuYWdlcikpOworCQkJc3RybGNweShzdGF0c1tmb3VuZF0ucmVjb3JkX3R5cGUsIHJlY190 eXBlLAorCQkJCQlzaXplb2Yoc3RhdHNbZm91bmRdLnJlY29yZF90eXBlKSk7CisJCX0KKworCQlz dGF0c1tmb3VuZF0uY291bnQrKzsKKwkJc3RhdHNbZm91bmRdLnRvdGFsX3JlY29yZF9sZW5ndGgg Kz0gWExvZ1JlY0dldFRvdGFsTGVuKHhsb2dyZWFkZXIpOworCQlzdGF0c1tmb3VuZF0udG90YWxf bWFpbl9kYXRhX2xlbmd0aCArPSBYTG9nUmVjR2V0RGF0YUxlbih4bG9ncmVhZGVyKTsKKworCQlp ZiAoWExvZ1JlY0hhc0FueUJsb2NrUmVmcyh4bG9ncmVhZGVyKSkKKwkJeworCQkJdWludDMyCQlm cGlfbGVuID0gMDsKKwkJCVN0cmluZ0luZm9EYXRhIGR1bW15OworCisJCQlpbml0U3RyaW5nSW5m bygmZHVtbXkpOworCQkJWExvZ1JlY0dldEJsb2NrUmVmSW5mbyh4bG9ncmVhZGVyLCBmYWxzZSwg ZmFsc2UsICZkdW1teSwgJmZwaV9sZW4pOworCQkJcGZyZWUoZHVtbXkuZGF0YSk7CisJCQlzdGF0 c1tmb3VuZF0udG90YWxfZnBpX2xlbmd0aCArPSBmcGlfbGVuOworCQl9CisKKwkJQ0hFQ0tfRk9S X0lOVEVSUlVQVFMoKTsKKwl9CisKKwlYTG9nUmVhZGVyRnJlZSh4bG9ncmVhZGVyKTsKKworCS8q IEVtaXQgcmVzdWx0IHJvd3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnN0YXRzOyBpKyspCisJewor CQlEYXR1bQkJdmFsdWVzW1dBTF9SRUNPUkRfU1RBVFNfQ09MU10gPSB7MH07CisJCWJvb2wJCW51 bGxzW1dBTF9SRUNPUkRfU1RBVFNfQ09MU10gPSB7MH07CisJCWludAkJCWNvbCA9IDA7CisKKwkJ dmFsdWVzW2NvbCsrXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0oc3RhdHNbaV0ucmVzb3VyY2VfbWFu YWdlcik7CisJCXZhbHVlc1tjb2wrK10gPSBDU3RyaW5nR2V0VGV4dERhdHVtKHN0YXRzW2ldLnJl Y29yZF90eXBlKTsKKwkJdmFsdWVzW2NvbCsrXSA9IEludDY0R2V0RGF0dW0oc3RhdHNbaV0uY291 bnQpOworCQl2YWx1ZXNbY29sKytdID0gSW50NjRHZXREYXR1bShzdGF0c1tpXS50b3RhbF9yZWNv cmRfbGVuZ3RoKTsKKwkJdmFsdWVzW2NvbCsrXSA9IEludDY0R2V0RGF0dW0oc3RhdHNbaV0udG90 YWxfbWFpbl9kYXRhX2xlbmd0aCk7CisJCXZhbHVlc1tjb2wrK10gPSBJbnQ2NEdldERhdHVtKHN0 YXRzW2ldLnRvdGFsX2ZwaV9sZW5ndGgpOworCisJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHJzaW5m by0+c2V0UmVzdWx0LCByc2luZm8tPnNldERlc2MsCisJCQkJCQkJIHZhbHVlcywgbnVsbHMpOwor CX0KKworCVBHX1JFVFVSTl9WT0lEKCk7CisKKyN1bmRlZiBXQUxfUkVDT1JEX1NUQVRTX0NPTFMK K30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF93YWxfcmVjb3JkX3N0YXRzL3Rl c3Rfd2FsX3JlY29yZF9zdGF0cy5jb250cm9sIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9y ZWNvcmRfc3RhdHMvdGVzdF93YWxfcmVjb3JkX3N0YXRzLmNvbnRyb2wKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjg1YTMzNzY2YzcxCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3dhbF9yZWNvcmRfc3RhdHMvdGVzdF93YWxfcmVjb3JkX3N0 YXRzLmNvbnRyb2wKQEAgLTAsMCArMSw0IEBACitjb21tZW50ID0gJ1Rlc3QgV0FMIHJlY29yZCBz dGF0cyByZWFkaW5nIGZyb20gV0FMIGJ1ZmZlcnMgdmlhIFdBTFJlYWRGcm9tQnVmZmVycycKK2Rl ZmF1bHRfdmVyc2lvbiA9ICcxLjAnCittb2R1bGVfcGF0aG5hbWUgPSAnJGxpYmRpci90ZXN0X3dh bF9yZWNvcmRfc3RhdHMnCityZWxvY2F0YWJsZSA9IHRydWUKZGlmZiAtLWdpdCBhL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QKaW5kZXggNDlkZmI2NjJhYmMuLmZkMjgzYjdlODhiIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMv cGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdApAQCAtMzQxOSw2ICszNDE5LDcgQEAgV2FsUmN2U3RyZWFtT3B0aW9ucwogV2FsUmN2V2Fr ZXVwUmVhc29uCiBXYWxSZWNlaXZlckNvbm4KIFdhbFJlY2VpdmVyRnVuY3Rpb25zVHlwZQorV2Fs UmVjb3JkU3RhdAogV2FsU25kCiBXYWxTbmRDdGxEYXRhCiBXYWxTbmRTZW5kRGF0YUNhbGxiYWNr Ci0tIAoyLjQ3LjMKCg== --000000000000e3e39506507b2d41--