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 1rzfBQ-005iSF-9n for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Apr 2024 16:09:20 +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 1rzfBO-00G4Kr-VS for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Apr 2024 16:09:18 +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 1rzfBO-00G4Kj-6O for pgsql-hackers@lists.postgresql.org; Wed, 24 Apr 2024 16:09:18 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rzfBI-004RCp-TG for pgsql-hackers@postgresql.org; Wed, 24 Apr 2024 16:09:16 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-2db101c11feso621581fa.0 for ; Wed, 24 Apr 2024 09:09:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713974950; x=1714579750; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=LWbFtAa2DjsSfMMHHeT6JG0PZ20wvlTSm3SstK/hBDw=; b=RkFBHEbxqINSHjwtSSldZtza73sxRw5hE4pd49yUFFeSITCXgNW36sAPV/UGOKtYRT aKAv50MFDS7Fr7muh1w7CMdk4ewMB4SQ8PAXpvudmKwFhVDJl4onMjq0FZxXY8YbsqmV Mdx3H91fAOZNXpFxHDpqapmMgIf6Yg2PpwI2+t1PW5DpEwS7YbNwdbWbeWss+50+JB4U LdLEPdZvFMoEwtfbXEgM4Je6l3O+L9UXGRvJQuRxc5q+Ih7aTCinVHFqRF6lpqEaYe9E A2yIGijvsbE1KkzWKjCyCm5A2c9N89jwnQRODBV69wJRtAZqss8TLj7ZO1D6kqMQjwyF J1vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713974950; x=1714579750; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=LWbFtAa2DjsSfMMHHeT6JG0PZ20wvlTSm3SstK/hBDw=; b=sV7BVmm7PfKrd42QNLHZpQvWN5OVmG4YJQngYoUEiuGxsSRtspaPaBJaningLspXaz AR4S1rkec6YKLbWyr8F7Xs3IDkHSmTApAFEeIJbzmNEL+25wmx11fzC36SLh3A8Rl1rE OZbVzOV5ITsdam/QPa4lkLTMArfNW1w6FQZRPglz6qF/MYX8JHCfV/tJotKt864+X0YE oIakqNgA/7B4RMjtaV677vw7OUyPeodTlYk+furC1gmH0J+1yvV8A6SSACtYbJOxeBK9 SQLH/4wttCNV1uGsXJesv2C/tCB00zW7ojGVmCrofbmxx78pmFjhgyEVp2fiCHAsnY72 lDbQ== X-Gm-Message-State: AOJu0YxAVxUhgsOIOY7AzO+kdcLw9aqaG/1iLlIJnddFdJF3iaTvvDz5 3iCDGxC4r/p30dG63L5NcrwNnkWUAgYBSAmcf+CCd7nmaBep4xipQFiE7IGClVaOl9vfey9AsU0 KZCAltmq2MgEsbu8wbeAuqjIhRBgFwBxD X-Google-Smtp-Source: AGHT+IFM7FT4l4HkssXbVnxsOEai13ujWCcK1auoofqMgCIwQtJ5Q3It6j3lYdgilr56mn7PvLdc5EyEGmBYm+0lkQM= X-Received: by 2002:a05:651c:150b:b0:2db:2385:d024 with SMTP id e11-20020a05651c150b00b002db2385d024mr32366ljf.26.1713974950121; Wed, 24 Apr 2024 09:09:10 -0700 (PDT) MIME-Version: 1.0 From: Bharath Rupireddy Date: Wed, 24 Apr 2024 21:38:57 +0530 Message-ID: Subject: Use WALReadFromBuffers in more places To: PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000000e73510616d9e4cc" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000e73510616d9e4cc Content-Type: text/plain; charset="UTF-8" Hi, Commit 91f2cae7a4e that introduced WALReadFromBuffers only used it for physical walsenders. It can also be used in more places benefitting logical walsenders, backends running pg_walinspect and logical decoding functions if the WAL is available in WAL buffers. I'm attaching a 0001 patch for this. While at it, I've also added a test module in 0002 patch to demonstrate 2 things: 1) how the caller can ensure the requested WAL is fully copied to WAL buffers using WaitXLogInsertionsToFinish before reading from WAL buffers. 2) how one can implement an xlogreader page_read callback to read unflushed/not-yet-flushed WAL directly from WAL buffers. FWIW, a separate test module to explicitly test the new function is suggested here - https://www.postgresql.org/message-id/CAFiTN-sE7CJn-ZFj%2B-0Wv6TNytv_fp4n%2BeCszspxJ3mt77t5ig%40mail.gmail.com. Please have a look at the attached patches. I will register this for the next commit fest. -- Bharath Rupireddy PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --0000000000000e73510616d9e4cc Content-Type: application/octet-stream; name="v1-0001-Use-WALReadFromBuffers-in-more-places.patch" Content-Disposition: attachment; filename="v1-0001-Use-WALReadFromBuffers-in-more-places.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lve0cxht0 RnJvbSA0NTI1YzY1NjkwY2U4MDFmZDY3ZWJiNTJmZTFhNTBhZGZhN2IxZjYxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMjQgQXByIDIwMjQgMTU6MjE6NDggKzAw MDAKU3ViamVjdDogW1BBVENIIHYxIDEvMl0gVXNlIFdBTFJlYWRGcm9tQnVmZmVycyBpbiBtb3Jl IHBsYWNlcwoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyB8IDEz ICsrKysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jICAgIHwg MTYgKysrKysrKysrKysrKy0tLQogMiBmaWxlcyBjaGFuZ2VkLCAyNSBpbnNlcnRpb25zKCspLCA0 IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2d1dGlscy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxzLmMKaW5kZXgg NTI5NWI4NWZlMC4uMWUxZjViNTMwNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZ3V0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0 aWxzLmMKQEAgLTg5Miw2ICs4OTIsOCBAQCByZWFkX2xvY2FsX3hsb2dfcGFnZV9ndXRzKFhMb2dS ZWFkZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwKIAlpbnQJCQljb3Vu dDsKIAlXQUxSZWFkRXJyb3IgZXJyaW5mbzsKIAlUaW1lTGluZUlECWN1cnJUTEk7CisJU2l6ZQkJ bmJ5dGVzOworCVNpemUJCXJieXRlczsKIAogCWxvYyA9IHRhcmdldFBhZ2VQdHIgKyByZXFMZW47 CiAKQEAgLTEwMDQsNyArMTAwNiwxNiBAQCByZWFkX2xvY2FsX3hsb2dfcGFnZV9ndXRzKFhMb2dS ZWFkZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwKIAkJY291bnQgPSBy ZWFkX3VwdG8gLSB0YXJnZXRQYWdlUHRyOwogCX0KIAotCWlmICghV0FMUmVhZChzdGF0ZSwgY3Vy X3BhZ2UsIHRhcmdldFBhZ2VQdHIsIGNvdW50LCB0bGksCisJLyogYXR0ZW1wdCB0byByZWFkIFdB TCBmcm9tIFdBTCBidWZmZXJzIGZpcnN0ICovCisJbmJ5dGVzID0gY291bnQ7CisJcmJ5dGVzID0g V0FMUmVhZEZyb21CdWZmZXJzKGN1cl9wYWdlLCB0YXJnZXRQYWdlUHRyLCBuYnl0ZXMsIGN1cnJU TEkpOworCWN1cl9wYWdlICs9IHJieXRlczsKKwl0YXJnZXRQYWdlUHRyICs9IHJieXRlczsKKwlu Ynl0ZXMgLT0gcmJ5dGVzOworCisJLyogbm93IHJlYWQgdGhlIHJlbWFpbmluZyBXQUwgZnJvbSBX QUwgZmlsZSAqLworCWlmIChuYnl0ZXMgPiAwICYmCisJCSFXQUxSZWFkKHN0YXRlLCBjdXJfcGFn ZSwgdGFyZ2V0UGFnZVB0ciwgbmJ5dGVzLCB0bGksCiAJCQkJICZlcnJpbmZvKSkKIAkJV0FMUmVh ZFJhaXNlRXJyb3IoJmVycmluZm8pOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9yZXBsaWNh dGlvbi93YWxzZW5kZXIuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRlci5jCmlu ZGV4IDliZjdjNjdmMzcuLjFlZTNiOTQ4ODggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxp Y2F0aW9uL3dhbHNlbmRlci5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3dhbHNlbmRl ci5jCkBAIC0xMDU2LDYgKzEwNTYsOCBAQCBsb2dpY2FsX3JlYWRfeGxvZ19wYWdlKFhMb2dSZWFk ZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0ciwgaW50IHJlcQogCVdBTFJl YWRFcnJvciBlcnJpbmZvOwogCVhMb2dTZWdObwlzZWdubzsKIAlUaW1lTGluZUlECWN1cnJUTEk7 CisJU2l6ZQkJbmJ5dGVzOworCVNpemUJCXJieXRlczsKIAogCS8qCiAJICogTWFrZSBzdXJlIHdl IGhhdmUgZW5vdWdoIFdBTCBhdmFpbGFibGUgYmVmb3JlIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQK QEAgLTEwOTIsMTEgKzEwOTQsMTkgQEAgbG9naWNhbF9yZWFkX3hsb2dfcGFnZShYTG9nUmVhZGVy U3RhdGUgKnN0YXRlLCBYTG9nUmVjUHRyIHRhcmdldFBhZ2VQdHIsIGludCByZXEKIAllbHNlCiAJ CWNvdW50ID0gZmx1c2hwdHIgLSB0YXJnZXRQYWdlUHRyOwkvKiBwYXJ0IG9mIHRoZSBwYWdlIGF2 YWlsYWJsZSAqLwogCi0JLyogbm93IGFjdHVhbGx5IHJlYWQgdGhlIGRhdGEsIHdlIGtub3cgaXQn cyB0aGVyZSAqLwotCWlmICghV0FMUmVhZChzdGF0ZSwKKwkvKiBhdHRlbXB0IHRvIHJlYWQgV0FM IGZyb20gV0FMIGJ1ZmZlcnMgZmlyc3QgKi8KKwluYnl0ZXMgPSBjb3VudDsKKwlyYnl0ZXMgPSBX QUxSZWFkRnJvbUJ1ZmZlcnMoY3VyX3BhZ2UsIHRhcmdldFBhZ2VQdHIsIG5ieXRlcywgY3VyclRM SSk7CisJY3VyX3BhZ2UgKz0gcmJ5dGVzOworCXRhcmdldFBhZ2VQdHIgKz0gcmJ5dGVzOworCW5i eXRlcyAtPSByYnl0ZXM7CisKKwkvKiBub3cgcmVhZCB0aGUgcmVtYWluaW5nIFdBTCBmcm9tIFdB TCBmaWxlICovCisJaWYgKG5ieXRlcyA+IDAgJiYKKwkJIVdBTFJlYWQoc3RhdGUsCiAJCQkJIGN1 cl9wYWdlLAogCQkJCSB0YXJnZXRQYWdlUHRyLAotCQkJCSBjb3VudCwKKwkJCQkgbmJ5dGVzLAog CQkJCSBjdXJyVExJLAkJLyogUGFzcyB0aGUgY3VycmVudCBUTEkgYmVjYXVzZSBvbmx5CiAJCQkJ CQkJCSAqIFdhbFNuZFNlZ21lbnRPcGVuIGNvbnRyb2xzIHdoZXRoZXIgbmV3IFRMSQogCQkJCQkJ CQkgKiBpcyBuZWVkZWQuICovCi0tIAoyLjM0LjEKCg== --0000000000000e73510616d9e4cc Content-Type: application/octet-stream; name="v1-0002-Add-test-module-to-demonstrate-reading-from-WAL-b.patch" Content-Disposition: attachment; filename="v1-0002-Add-test-module-to-demonstrate-reading-from-WAL-b.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lve0d89x1 RnJvbSBjOWQ0OTAwNDMwZDljNzA5ZjEzYWJmY2RhNzRkMTRhNGZmNDViODZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMjQgQXByIDIwMjQgMTU6MjI6MTIgKzAw MDAKU3ViamVjdDogW1BBVENIIHYxIDIvMl0gQWRkIHRlc3QgbW9kdWxlIHRvIGRlbW9uc3RyYXRl IHJlYWRpbmcgZnJvbSBXQUwgCiBidWZmZXJzIHBhdHRlcm5zCgpUaGlzIGNvbW1pdCBhZGRzIGEg dGVzdCBtb2R1bGUgdG8gZGVtb25zdHJhdGUgYSBmZXcgcGF0dGVybnMgZm9yCnJlYWRpbmcgZnJv bSBXQUwgYnVmZmVycyB1c2luZyBXQUxSZWFkRnJvbUJ1ZmZlcnMgYWRkZWQgYnkgY29tbWl0Cjkx ZjJjYWU3YTRlLgoKMS4gVGhpcyBtb2R1bGUgY29udGFpbnMgYSB0ZXN0IGZ1bmN0aW9uIHRvIHJl YWQgdGhlIFdBTCB0aGF0J3MKZnVsbHkgY29waWVkIHRvIFdBTCBidWZmZXJzLiBXaGV0aGVyIG9y IG5vdCB0aGUgV0FMIGlzIGZ1bGx5CmNvcGllZCB0byBXQUwgYnVmZmVycyBpcyBlbnN1cmVkIGJ5 IFdhaXRYTG9nSW5zZXJ0aW9uc1RvRmluaXNoCmJlZm9yZSBXQUxSZWFkRnJvbUJ1ZmZlcnMuCgoy LiBUaGlzIG1vZHVsZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB4bG9ncmVhZGVyIHBh Z2VfcmVhZApjYWxsYmFjayB0byByZWFkIHVuZmx1c2hlZC9ub3QteWV0LWZsdXNoZWQgV0FMIGRp cmVjdGx5IGZyb20gV0FMCmJ1ZmZlcnMuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v eGxvZy5jICAgICAgICAgICAgIHwgICAzICstCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9ncmVhZGVyLmMgICAgICAgfCAgIDMgKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmggICAg ICAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlICAgICAg ICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCAgICAg ICAgICAgICAgICAgIHwgICAxICsKIC4uLi9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy8u Z2l0aWdub3JlICB8ICAgNCArCiAuLi4vbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvTWFr ZWZpbGUgICAgfCAgMjMgKysKIC4uLi9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9tZXNv bi5idWlsZCB8ICAzMyArKwogLi4uL3JlYWRfd2FsX2Zyb21fYnVmZmVycy0tMS4wLnNxbCAgICAg ICAgICAgIHwgIDM3ICsrCiAuLi4vcmVhZF93YWxfZnJvbV9idWZmZXJzLmMgICAgICAgICAgICAg ICAgICAgfCAzMTggKysrKysrKysrKysrKysrKysrCiAuLi4vcmVhZF93YWxfZnJvbV9idWZmZXJz LmNvbnRyb2wgICAgICAgICAgICAgfCAgIDQgKwogLi4uL3JlYWRfd2FsX2Zyb21fYnVmZmVycy90 LzAwMV9iYXNpYy5wbCAgICAgIHwgMTExICsrKysrKwogMTIgZmlsZXMgY2hhbmdlZCwgNTM2IGlu c2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3Qv bW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAw NjQ0IHNyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxfZnJvbV9idWZmZXJzL01ha2VmaWxlCiBjcmVh dGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvbWVz b24uYnVpbGQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zy b21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMtLTEuMC5zcWwKIGNyZWF0ZSBtb2RlIDEw MDY0NCBzcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9yZWFkX3dhbF9mcm9t X2J1ZmZlcnMuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxf ZnJvbV9idWZmZXJzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy5jb250cm9sCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvdC8wMDFfYmFzaWMu cGwKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgYi9zcmMv YmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKaW5kZXggMzRhMmM3MTgxMi4uZjA1M2FkNTkx OSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCisrKyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtNjk5LDcgKzY5OSw2IEBAIHN0YXRp YyB2b2lkIFJlc2VydmVYTG9nSW5zZXJ0TG9jYXRpb24oaW50IHNpemUsIFhMb2dSZWNQdHIgKlN0 YXJ0UG9zLAogCQkJCQkJCQkJICBYTG9nUmVjUHRyICpFbmRQb3MsIFhMb2dSZWNQdHIgKlByZXZQ dHIpOwogc3RhdGljIGJvb2wgUmVzZXJ2ZVhMb2dTd2l0Y2goWExvZ1JlY1B0ciAqU3RhcnRQb3Ms IFhMb2dSZWNQdHIgKkVuZFBvcywKIAkJCQkJCQkgIFhMb2dSZWNQdHIgKlByZXZQdHIpOwotc3Rh dGljIFhMb2dSZWNQdHIgV2FpdFhMb2dJbnNlcnRpb25zVG9GaW5pc2goWExvZ1JlY1B0ciB1cHRv KTsKIHN0YXRpYyBjaGFyICpHZXRYTG9nQnVmZmVyKFhMb2dSZWNQdHIgcHRyLCBUaW1lTGluZUlE IHRsaSk7CiBzdGF0aWMgWExvZ1JlY1B0ciBYTG9nQnl0ZVBvc1RvUmVjUHRyKHVpbnQ2NCBieXRl cG9zKTsKIHN0YXRpYyBYTG9nUmVjUHRyIFhMb2dCeXRlUG9zVG9FbmRSZWNQdHIodWludDY0IGJ5 dGVwb3MpOwpAQCAtMTQ5NSw3ICsxNDk0LDcgQEAgV0FMSW5zZXJ0TG9ja1VwZGF0ZUluc2VydGlu Z0F0KFhMb2dSZWNQdHIgaW5zZXJ0aW5nQXQpCiAgKiB1bmluaXRpYWxpemVkIHBhZ2UpLCBhbmQg dGhlIGluc2VydGVyIG1pZ2h0IG5lZWQgdG8gZXZpY3QgYW4gb2xkIFdBTCBidWZmZXIKICAqIHRv IG1ha2Ugcm9vbSBmb3IgYSBuZXcgb25lLCB3aGljaCBpbiB0dXJuIHJlcXVpcmVzIFdBTFdyaXRl TG9jay4KICAqLwotc3RhdGljIFhMb2dSZWNQdHIKK1hMb2dSZWNQdHIKIFdhaXRYTG9nSW5zZXJ0 aW9uc1RvRmluaXNoKFhMb2dSZWNQdHIgdXB0bykKIHsKIAl1aW50NjQJCWJ5dGVwb3M7CmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVhZGVyLmMgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVhZGVyLmMKaW5kZXggMzdkMmE1Nzk2MS4uMTJkZGRm NjRjYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlYWRlci5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWFkZXIuYwpAQCAtMTAzMyw3 ICsxMDMzLDggQEAgUmVhZFBhZ2VJbnRlcm5hbChYTG9nUmVhZGVyU3RhdGUgKnN0YXRlLCBYTG9n UmVjUHRyIHBhZ2VwdHIsIGludCByZXFMZW4pCiAJICogcmVjb3JkIGlzLiAgVGhpcyBpcyBzbyB0 aGF0IHdlIGNhbiBjaGVjayB0aGUgYWRkaXRpb25hbCBpZGVudGlmaWNhdGlvbgogCSAqIGluZm8g dGhhdCBpcyBwcmVzZW50IGluIHRoZSBmaXJzdCBwYWdlJ3MgImxvbmciIGhlYWRlci4KIAkgKi8K LQlpZiAodGFyZ2V0U2VnTm8gIT0gc3RhdGUtPnNlZy53c19zZWdubyAmJiB0YXJnZXRQYWdlT2Zm ICE9IDApCisJaWYgKHN0YXRlLT5zZWcud3Nfc2Vnbm8gIT0gMCAmJgorCQl0YXJnZXRTZWdObyAh PSBzdGF0ZS0+c2VnLndzX3NlZ25vICYmIHRhcmdldFBhZ2VPZmYgIT0gMCkKIAl7CiAJCVhMb2dS ZWNQdHIJdGFyZ2V0U2VnbWVudFB0ciA9IHBhZ2VwdHIgLSB0YXJnZXRQYWdlT2ZmOwogCmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZy5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hs b2cuaAppbmRleCA3Njc4N2E4MjY3Li43NDYwNmE2ODQ2IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9hY2Nlc3MveGxvZy5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmgKQEAgLTI1Miw2 ICsyNTIsNyBAQCBleHRlcm4gWExvZ1JlY1B0ciBHZXRMYXN0SW1wb3J0YW50UmVjUHRyKHZvaWQp OwogCiBleHRlcm4gdm9pZCBTZXRXYWxXcml0ZXJTbGVlcGluZyhib29sIHNsZWVwaW5nKTsKIAor ZXh0ZXJuIFhMb2dSZWNQdHIgV2FpdFhMb2dJbnNlcnRpb25zVG9GaW5pc2goWExvZ1JlY1B0ciB1 cHRvKTsKIGV4dGVybiBTaXplIFdBTFJlYWRGcm9tQnVmZmVycyhjaGFyICpkc3RidWYsIFhMb2dS ZWNQdHIgc3RhcnRwdHIsIFNpemUgY291bnQsCiAJCQkJCQkJICAgVGltZUxpbmVJRCB0bGkpOwog CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxl cy9NYWtlZmlsZQppbmRleCAyNTY3OTlmNTIwLi5jMzliNDA3ZTViIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9tb2R1bGVzL01ha2VmaWxlCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUKQEAg LTEyLDYgKzEyLDcgQEAgU1VCRElSUyA9IFwKIAkJICBkdW1teV9zZWNsYWJlbCBcCiAJCSAgbGli cHFfcGlwZWxpbmUgXAogCQkgIHBsc2FtcGxlIFwKKwkJICByZWFkX3dhbF9mcm9tX2J1ZmZlcnMg XAogCQkgIHNwZ2lzdF9uYW1lX29wcyBcCiAJCSAgdGVzdF9ibG9vbWZpbHRlciBcCiAJCSAgdGVz dF9jb3B5X2NhbGxiYWNrcyBcCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1 aWxkIGIvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZAppbmRleCBkOGZlMDU5ZDIzLi4yMjJm YTFjZDcyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1aWxkCisrKyBiL3Ny Yy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQKQEAgLTEwLDYgKzEwLDcgQEAgc3ViZGlyKCdpbmpl Y3Rpb25fcG9pbnRzJykKIHN1YmRpcignbGRhcF9wYXNzd29yZF9mdW5jJykKIHN1YmRpcignbGli cHFfcGlwZWxpbmUnKQogc3ViZGlyKCdwbHNhbXBsZScpCitzdWJkaXIoJ3JlYWRfd2FsX2Zyb21f YnVmZmVycycpCiBzdWJkaXIoJ3NwZ2lzdF9uYW1lX29wcycpCiBzdWJkaXIoJ3NzbF9wYXNzcGhy YXNlX2NhbGxiYWNrJykKIHN1YmRpcigndGVzdF9ibG9vbWZpbHRlcicpCmRpZmYgLS1naXQgYS9z cmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy8uZ2l0aWdub3JlIGIvc3JjL3Rl c3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi41ZGNiM2ZmOTcyCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvLmdpdGlnbm9yZQpAQCAtMCww ICsxLDQgQEAKKyMgR2VuZXJhdGVkIHN1YmRpcmVjdG9yaWVzCisvbG9nLworL3Jlc3VsdHMvCisv dG1wX2NoZWNrLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1 ZmZlcnMvTWFrZWZpbGUgYi9zcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9N YWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45ZTU3YTgzN2Y5 Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZl cnMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorIyBzcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2Fs X2Zyb21fYnVmZmVycy9NYWtlZmlsZQorCitNT0RVTEVfYmlnID0gcmVhZF93YWxfZnJvbV9idWZm ZXJzCitPQkpTID0gXAorCSQoV0lOMzJSRVMpIFwKKwlyZWFkX3dhbF9mcm9tX2J1ZmZlcnMubwor UEdGSUxFREVTQyA9ICJyZWFkX3dhbF9mcm9tX2J1ZmZlcnMgLSB0ZXN0IG1vZHVsZSB0byByZWFk IFdBTCBmcm9tIFdBTCBidWZmZXJzIgorCitFWFRFTlNJT04gPSByZWFkX3dhbF9mcm9tX2J1ZmZl cnMKK0RBVEEgPSByZWFkX3dhbF9mcm9tX2J1ZmZlcnMtLTEuMC5zcWwKKworVEFQX1RFU1RTID0g MQorCitpZmRlZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hl bGwgJChQR19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0g c3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMKK3RvcF9idWlsZGRpciA9IC4u Ly4uLy4uLy4uCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitp bmNsdWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5taworZW5kaWYKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxfZnJvbV9idWZmZXJzL21lc29uLmJ1 aWxkIGIvc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvbWVzb24uYnVpbGQK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uM2ZhYzAwZDYxNgotLS0gL2Rl di9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxfZnJvbV9idWZmZXJzL21lc29u LmJ1aWxkCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI0LCBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCityZWFkX3dhbF9mcm9tX2J1ZmZlcnNfc291cmNl cyA9IGZpbGVzKAorICAncmVhZF93YWxfZnJvbV9idWZmZXJzLmMnLAorKQorCitpZiBob3N0X3N5 c3RlbSA9PSAnd2luZG93cycKKyAgcmVhZF93YWxfZnJvbV9idWZmZXJzX3NvdXJjZXMgKz0gcmNf bGliX2dlbi5wcm9jZXNzKHdpbjMydmVyX3JjLCBleHRyYV9hcmdzOiBbCisgICAgJy0tTkFNRScs ICdyZWFkX3dhbF9mcm9tX2J1ZmZlcnMnLAorICAgICctLUZJTEVERVNDJywgJ3JlYWRfd2FsX2Zy b21fYnVmZmVycyAtIHRlc3QgbW9kdWxlIHRvIHJlYWQgV0FMIGZyb20gV0FMIGJ1ZmZlcnMnLF0p CitlbmRpZgorCityZWFkX3dhbF9mcm9tX2J1ZmZlcnMgPSBzaGFyZWRfbW9kdWxlKCdyZWFkX3dh bF9mcm9tX2J1ZmZlcnMnLAorICByZWFkX3dhbF9mcm9tX2J1ZmZlcnNfc291cmNlcywKKyAga3dh cmdzOiBwZ190ZXN0X21vZF9hcmdzLAorKQordGVzdF9pbnN0YWxsX2xpYnMgKz0gcmVhZF93YWxf ZnJvbV9idWZmZXJzCisKK3Rlc3RfaW5zdGFsbF9kYXRhICs9IGZpbGVzKAorICAncmVhZF93YWxf ZnJvbV9idWZmZXJzLmNvbnRyb2wnLAorICAncmVhZF93YWxfZnJvbV9idWZmZXJzLS0xLjAuc3Fs JywKKykKKwordGVzdHMgKz0geworICAnbmFtZSc6ICdyZWFkX3dhbF9mcm9tX2J1ZmZlcnMnLAor ICAnc2QnOiBtZXNvbi5jdXJyZW50X3NvdXJjZV9kaXIoKSwKKyAgJ2JkJzogbWVzb24uY3VycmVu dF9idWlsZF9kaXIoKSwKKyAgJ3RhcCc6IHsKKyAgICAndGVzdHMnOiBbCisgICAgICAndC8wMDFf YmFzaWMucGwnLAorICAgIF0sCisgIH0sCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVz L3JlYWRfd2FsX2Zyb21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMtLTEuMC5zcWwgYi9z cmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1ZmZl cnMtLTEuMC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNzJkMDU1 MjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxfZnJvbV9i dWZmZXJzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy0tMS4wLnNxbApAQCAtMCwwICsxLDM3IEBACisv KiBzcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1 ZmZlcnMtLTEuMC5zcWwgKi8KKworLS0gY29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4g cHNxbCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT04KK1xlY2hvIFVzZSAiQ1JFQVRF IEVYVEVOU0lPTiByZWFkX3dhbF9mcm9tX2J1ZmZlcnMiIHRvIGxvYWQgdGhpcyBmaWxlLiBccXVp dAorCistLQorLS0gcmVhZF93YWxfZnJvbV9idWZmZXJzKCkKKy0tCistLSBTUUwgZnVuY3Rpb24g dG8gcmVhZCBXQUwgZnJvbSBXQUwgYnVmZmVycy4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVh ZC4KKy0tCitDUkVBVEUgRlVOQ1RJT04gcmVhZF93YWxfZnJvbV9idWZmZXJzKElOIGxzbiBwZ19s c24sIElOIGJ5dGVzX3RvX3JlYWQgaW50LAorICAgIGJ5dGVzX3JlYWQgT1VUIGludCkKK0FTICdN T0RVTEVfUEFUSE5BTUUnLCAncmVhZF93YWxfZnJvbV9idWZmZXJzJworTEFOR1VBR0UgQyBTVFJJ Q1Q7CisKKy0tCistLSBnZXRfd2FsX3JlY29yZHNfaW5mb19mcm9tX2J1ZmZlcnMoKQorLS0KKy0t IFNRTCBmdW5jdGlvbiB0byBnZXQgaW5mbyBvZiBXQUwgcmVjb3JkcyBhdmFpbGFibGUgaW4gV0FM IGJ1ZmZlcnMuCistLQorQ1JFQVRFIEZVTkNUSU9OIGdldF93YWxfcmVjb3Jkc19pbmZvX2Zyb21f YnVmZmVycyhJTiBzdGFydF9sc24gcGdfbHNuLAorICAgIElOIGVuZF9sc24gcGdfbHNuLAorICAg IE9VVCBzdGFydF9sc24gcGdfbHNuLAorICAgIE9VVCBlbmRfbHNuIHBnX2xzbiwKKyAgICBPVVQg cHJldl9sc24gcGdfbHNuLAorICAgIE9VVCB4aWQgeGlkLAorICAgIE9VVCByZXNvdXJjZV9tYW5h Z2VyIHRleHQsCisgICAgT1VUIHJlY29yZF90eXBlIHRleHQsCisgICAgT1VUIHJlY29yZF9sZW5n dGggaW50NCwKKyAgICBPVVQgbWFpbl9kYXRhX2xlbmd0aCBpbnQ0LAorICAgIE9VVCBmcGlfbGVu Z3RoIGludDQsCisgICAgT1VUIGRlc2NyaXB0aW9uIHRleHQsCisgICAgT1VUIGJsb2NrX3JlZiB0 ZXh0CispCitSRVRVUk5TIFNFVE9GIHJlY29yZAorQVMgJ01PRFVMRV9QQVRITkFNRScsICdnZXRf d2FsX3JlY29yZHNfaW5mb19mcm9tX2J1ZmZlcnMnCitMQU5HVUFHRSBDIFNUUklDVCBQQVJBTExF TCBTQUZFOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZl cnMvcmVhZF93YWxfZnJvbV9idWZmZXJzLmMgYi9zcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zy b21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwLi5lZDMzYTE0MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3Qv bW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvcmVhZF93YWxfZnJvbV9idWZmZXJzLmMKQEAg LTAsMCArMSwzMTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiByZWFkX3dhbF9mcm9t X2J1ZmZlcnMuYworICoJCVRlc3QgbW9kdWxlIHRvIHJlYWQgV0FMIGZyb20gV0FMIGJ1ZmZlcnMu CisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjQsIFBvc3RncmVTUUwgR2xv YmFsIERldmVsb3BtZW50IEdyb3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJl Z2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIElERU5USUZJQ0FU SU9OCisgKglzcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVycy9yZWFkX3dhbF9m cm9tX2J1ZmZlcnMuYworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJwb3N0 Z3Jlcy5oIgorCisjaW5jbHVkZSAiYWNjZXNzL3hsb2cuaCIKKyNpbmNsdWRlICJhY2Nlc3MveGxv Z19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9ncmVhZGVyLmgiCisjaW5jbHVkZSAi YWNjZXNzL3hsb2dyZWNvdmVyeS5oIgorI2luY2x1ZGUgImZ1bmNhcGkuaCIKKyNpbmNsdWRlICJt aXNjYWRtaW4uaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxz L3BnX2xzbi5oIgorCitQR19NT0RVTEVfTUFHSUM7CisKK3N0YXRpYyBpbnQJcmVhZF9mcm9tX3dh bF9idWZmZXJzKFhMb2dSZWFkZXJTdGF0ZSAqc3RhdGUsIFhMb2dSZWNQdHIgdGFyZ2V0UGFnZVB0 ciwKKwkJCQkJCQkJICBpbnQgcmVxTGVuLCBYTG9nUmVjUHRyIHRhcmdldFJlY1B0ciwKKwkJCQkJ CQkJICBjaGFyICpjdXJfcGFnZSk7CisKK3N0YXRpYyBYTG9nUmVjb3JkICpSZWFkTmV4dFhMb2dS ZWNvcmQoWExvZ1JlYWRlclN0YXRlICp4bG9ncmVhZGVyKTsKK3N0YXRpYyB2b2lkIEdldFdBTFJl Y29yZEluZm8oWExvZ1JlYWRlclN0YXRlICpyZWNvcmQsIERhdHVtICp2YWx1ZXMsCisJCQkJCQkJ IGJvb2wgKm51bGxzLCB1aW50MzIgbmNvbHMpOworc3RhdGljIHZvaWQgR2V0V0FMUmVjb3Jkc0lu Zm8oRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sCisJCQkJCQkJICBYTG9nUmVjUHRyIHN0YXJ0X2xz biwKKwkJCQkJCQkgIFhMb2dSZWNQdHIgZW5kX2xzbik7CisKKy8qCisgKiBTUUwgZnVuY3Rpb24g dG8gcmVhZCBXQUwgZnJvbSBXQUwgYnVmZmVycy4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVh ZC4KKyAqLworUEdfRlVOQ1RJT05fSU5GT19WMShyZWFkX3dhbF9mcm9tX2J1ZmZlcnMpOworRGF0 dW0KK3JlYWRfd2FsX2Zyb21fYnVmZmVycyhQR19GVU5DVElPTl9BUkdTKQoreworCVhMb2dSZWNQ dHIJc3RhcnRwdHIgPSBQR19HRVRBUkdfTFNOKDApOworCWludDMyCQljb3VudCA9IFBHX0dFVEFS R19JTlQzMigxKTsKKwlTaXplCQlyZWFkOworCWNoYXIJICAgKmRhdGEgPSBwYWxsb2MwKGNvdW50 KTsKKwlYTG9nUmVjUHRyCXVwdG8gPSBzdGFydHB0ciArIGNvdW50OworCVhMb2dSZWNQdHIJaW5z ZXJ0X3BvcyA9IEdldFhMb2dJbnNlcnRSZWNQdHIoKTsKKwlUaW1lTGluZUlECXRsaSA9IEdldFdB TEluc2VydGlvblRpbWVMaW5lKCk7CisKKwkvKgorCSAqIFRoZSByZXF1ZXN0ZWQgV0FMIG1heSBi ZSB2ZXJ5IHJlY2VudCwgc28gd2FpdCBmb3IgYW55IGluLXByb2dyZXNzIFdBTAorCSAqIGluc2Vy dGlvbnMgdG8gV0FMIGJ1ZmZlcnMgdG8gZmluaXNoLgorCSAqLworCWlmICh1cHRvID4gaW5zZXJ0 X3BvcykKKwl7CisJCVhMb2dSZWNQdHIJd3JpdHRlblVwdG8gPSBXYWl0WExvZ0luc2VydGlvbnNU b0ZpbmlzaCh1cHRvKTsKKworCQl1cHRvID0gTWluKHVwdG8sIHdyaXR0ZW5VcHRvKTsKKwkJY291 bnQgPSB1cHRvIC0gc3RhcnRwdHI7CisJfQorCisJcmVhZCA9IFdBTFJlYWRGcm9tQnVmZmVycyhk YXRhLCBzdGFydHB0ciwgY291bnQsIHRsaSk7CisKKwlwZnJlZShkYXRhKTsKKworCVBHX1JFVFVS Tl9JTlQzMihyZWFkKTsKK30KKworLyoKKyAqIFhMb2dSZWFkZXJSb3V0aW5lLT5wYWdlX3JlYWQg Y2FsbGJhY2sgZm9yIHJlYWRpbmcgV0FMIGZyb20gV0FMIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBp bnQKK3JlYWRfZnJvbV93YWxfYnVmZmVycyhYTG9nUmVhZGVyU3RhdGUgKnN0YXRlLCBYTG9nUmVj UHRyIHRhcmdldFBhZ2VQdHIsCisJCQkJCSAgaW50IHJlcUxlbiwgWExvZ1JlY1B0ciB0YXJnZXRS ZWNQdHIsCisJCQkJCSAgY2hhciAqY3VyX3BhZ2UpCit7CisJWExvZ1JlY1B0cglyZWFkX3VwdG8s CisJCQkJbG9jOworCVRpbWVMaW5lSUQJdGxpID0gR2V0V0FMSW5zZXJ0aW9uVGltZUxpbmUoKTsK KwlTaXplCQljb3VudDsKKwlTaXplCQlyZWFkID0gMDsKKworCWxvYyA9IHRhcmdldFBhZ2VQdHIg KyByZXFMZW47CisKKwkvKiBMb29wIHdhaXRpbmcgZm9yIHhsb2cgdG8gYmUgYXZhaWxhYmxlIGlm IG5lY2Vzc2FyeSAqLworCXdoaWxlICgxKQorCXsKKwkJcmVhZF91cHRvID0gR2V0WExvZ0luc2Vy dFJlY1B0cigpOworCisJCWlmIChsb2MgPD0gcmVhZF91cHRvKQorCQkJYnJlYWs7CisKKwkJV2Fp dFhMb2dJbnNlcnRpb25zVG9GaW5pc2gobG9jKTsKKworCQlDSEVDS19GT1JfSU5URVJSVVBUUygp OworCQlwZ191c2xlZXAoMTAwMEwpOworCX0KKworCWlmICh0YXJnZXRQYWdlUHRyICsgWExPR19C TENLU1ogPD0gcmVhZF91cHRvKQorCXsKKwkJLyoKKwkJICogbW9yZSB0aGFuIG9uZSBibG9jayBh dmFpbGFibGU7IHJlYWQgb25seSB0aGF0IGJsb2NrLCBoYXZlIGNhbGxlcgorCQkgKiBjb21lIGJh Y2sgaWYgdGhleSBuZWVkIG1vcmUuCisJCSAqLworCQljb3VudCA9IFhMT0dfQkxDS1NaOworCX0K KwllbHNlIGlmICh0YXJnZXRQYWdlUHRyICsgcmVxTGVuID4gcmVhZF91cHRvKQorCXsKKwkJLyog bm90IGVub3VnaCBkYXRhIHRoZXJlICovCisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwkJ LyogZW5vdWdoIGJ5dGVzIGF2YWlsYWJsZSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0ICovCisJCWNv dW50ID0gcmVhZF91cHRvIC0gdGFyZ2V0UGFnZVB0cjsKKwl9CisKKwkvKiByZWFkIFdBTCBmcm9t IFdBTCBidWZmZXJzICovCisJcmVhZCA9IFdBTFJlYWRGcm9tQnVmZmVycyhjdXJfcGFnZSwgdGFy Z2V0UGFnZVB0ciwgY291bnQsIHRsaSk7CisKKwlpZiAocmVhZCAhPSBjb3VudCkKKwkJZXJlcG9y dChFUlJPUiwKKwkJCQllcnJtc2coImNvdWxkIG5vdCByZWFkIGZ1bGx5IGZyb20gV0FMIGJ1ZmZl cnM7IGV4cGVjdGVkICVsdSwgcmVhZCAlbHUiLAorCQkJCQkgICBjb3VudCwgcmVhZCkpOworCisJ cmV0dXJuIGNvdW50OworfQorCisvKgorICogR2V0IGluZm8gb2YgYWxsIFdBTCByZWNvcmRzIGJl dHdlZW4gc3RhcnQgTFNOIGFuZCBlbmQgTFNOLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYW5kIGl0 cyBoZWxwZXJzIGJlbG93IGFyZSBzaW1pbGFyIHRvIHBnX3dhbGluc3BlY3QncworICogcGdfZ2V0 X3dhbF9yZWNvcmRzX2luZm8oKSBleGNlcHQgdGhhdCBpdCB3aWxsIGdldCBpbmZvIG9mIFdBTCBy ZWNvcmRzCisgKiBhdmFpbGFibGUgaW4gV0FMIGJ1ZmZlcnMuCisgKi8KK1BHX0ZVTkNUSU9OX0lO Rk9fVjEoZ2V0X3dhbF9yZWNvcmRzX2luZm9fZnJvbV9idWZmZXJzKTsKK0RhdHVtCitnZXRfd2Fs X3JlY29yZHNfaW5mb19mcm9tX2J1ZmZlcnMoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlYTG9nUmVj UHRyCXN0YXJ0X2xzbiA9IFBHX0dFVEFSR19MU04oMCk7CisJWExvZ1JlY1B0cgllbmRfbHNuID0g UEdfR0VUQVJHX0xTTigxKTsKKworCS8qCisJICogVmFsaWRhdGUgc3RhcnQgYW5kIGVuZCBMU05z IGNvbWluZyBmcm9tIHRoZSBmdW5jdGlvbiBpbnB1dHMuCisJICoKKwkgKiBSZWFkaW5nIFdBTCBi ZWxvdyB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZmlyc3Qgc2VnbWVudHMgaXNuJ3QgYWxsb3dlZC4K KwkgKiBUaGlzIGlzIGEgYm9vdHN0cmFwIFdBTCBwYWdlIGFuZCB0aGUgcGFnZV9yZWFkIGNhbGxi YWNrIGZhaWxzIHRvIHJlYWQKKwkgKiBpdC4KKwkgKi8KKwlpZiAoc3RhcnRfbHNuIDwgWExPR19C TENLU1opCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycm1zZygiY291bGQgbm90IHJlYWQgV0FM IGF0IExTTiAlWC8lWCIsCisJCQkJCQlMU05fRk9STUFUX0FSR1Moc3RhcnRfbHNuKSkpKTsKKwor CWlmIChzdGFydF9sc24gPiBlbmRfbHNuKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2Rl KEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCSBlcnJtc2coIldBTCBzdGFy dCBMU04gbXVzdCBiZSBsZXNzIHRoYW4gZW5kIExTTiIpKSk7CisKKwlHZXRXQUxSZWNvcmRzSW5m byhmY2luZm8sIHN0YXJ0X2xzbiwgZW5kX2xzbik7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQor CisvKgorICogUmVhZCBuZXh0IFdBTCByZWNvcmQuCisgKi8KK3N0YXRpYyBYTG9nUmVjb3JkICoK K1JlYWROZXh0WExvZ1JlY29yZChYTG9nUmVhZGVyU3RhdGUgKnhsb2dyZWFkZXIpCit7CisJWExv Z1JlY29yZCAqcmVjb3JkOworCWNoYXIJICAgKmVycm9ybXNnOworCisJcmVjb3JkID0gWExvZ1Jl YWRSZWNvcmQoeGxvZ3JlYWRlciwgJmVycm9ybXNnKTsKKworCWlmIChyZWNvcmQgPT0gTlVMTCkK Kwl7CisJCWlmIChlcnJvcm1zZykKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCWVycm1zZygiY291 bGQgbm90IHJlYWQgV0FMIGF0ICVYLyVYOiAlcyIsCisJCQkJCQkgICBMU05fRk9STUFUX0FSR1Mo eGxvZ3JlYWRlci0+RW5kUmVjUHRyKSwgZXJyb3Jtc2cpKTsKKwkJZWxzZQorCQkJZXJlcG9ydChF UlJPUiwKKwkJCQkJZXJybXNnKCJjb3VsZCBub3QgcmVhZCBXQUwgYXQgJVgvJVgiLAorCQkJCQkJ ICAgTFNOX0ZPUk1BVF9BUkdTKHhsb2dyZWFkZXItPkVuZFJlY1B0cikpKTsKKwl9CisKKwlyZXR1 cm4gcmVjb3JkOworfQorCisvKgorICogT3V0cHV0IHZhbHVlcyB0aGF0IG1ha2UgdXAgYSByb3cg ZGVzY3JpYmluZyBjYWxsZXIncyBXQUwgcmVjb3JkLgorICovCitzdGF0aWMgdm9pZAorR2V0V0FM UmVjb3JkSW5mbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCwgRGF0dW0gKnZhbHVlcywKKwkJCQkg Ym9vbCAqbnVsbHMsIHVpbnQzMiBuY29scykKK3sKKwljb25zdCBjaGFyICpyZWNvcmRfdHlwZTsK KwlSbWdyRGF0YQlkZXNjOworCXVpbnQzMgkJZnBpX2xlbiA9IDA7CisJU3RyaW5nSW5mb0RhdGEg cmVjX2Rlc2M7CisJU3RyaW5nSW5mb0RhdGEgcmVjX2Jsa19yZWY7CisJaW50CQkJaSA9IDA7CisK KwlkZXNjID0gR2V0Um1ncihYTG9nUmVjR2V0Um1pZChyZWNvcmQpKTsKKwlyZWNvcmRfdHlwZSA9 IGRlc2Mucm1faWRlbnRpZnkoWExvZ1JlY0dldEluZm8ocmVjb3JkKSk7CisKKwlpZiAocmVjb3Jk X3R5cGUgPT0gTlVMTCkKKwkJcmVjb3JkX3R5cGUgPSBwc3ByaW50ZigiVU5LTk9XTiAoJXgpIiwg WExvZ1JlY0dldEluZm8ocmVjb3JkKSAmIH5YTFJfSU5GT19NQVNLKTsKKworCWluaXRTdHJpbmdJ bmZvKCZyZWNfZGVzYyk7CisJZGVzYy5ybV9kZXNjKCZyZWNfZGVzYywgcmVjb3JkKTsKKworCWlm IChYTG9nUmVjSGFzQW55QmxvY2tSZWZzKHJlY29yZCkpCisJeworCQlpbml0U3RyaW5nSW5mbygm cmVjX2Jsa19yZWYpOworCQlYTG9nUmVjR2V0QmxvY2tSZWZJbmZvKHJlY29yZCwgZmFsc2UsIHRy dWUsICZyZWNfYmxrX3JlZiwgJmZwaV9sZW4pOworCX0KKworCXZhbHVlc1tpKytdID0gTFNOR2V0 RGF0dW0ocmVjb3JkLT5SZWFkUmVjUHRyKTsKKwl2YWx1ZXNbaSsrXSA9IExTTkdldERhdHVtKHJl Y29yZC0+RW5kUmVjUHRyKTsKKwl2YWx1ZXNbaSsrXSA9IExTTkdldERhdHVtKFhMb2dSZWNHZXRQ cmV2KHJlY29yZCkpOworCXZhbHVlc1tpKytdID0gVHJhbnNhY3Rpb25JZEdldERhdHVtKFhMb2dS ZWNHZXRYaWQocmVjb3JkKSk7CisJdmFsdWVzW2krK10gPSBDU3RyaW5nR2V0VGV4dERhdHVtKGRl c2Mucm1fbmFtZSk7CisJdmFsdWVzW2krK10gPSBDU3RyaW5nR2V0VGV4dERhdHVtKHJlY29yZF90 eXBlKTsKKwl2YWx1ZXNbaSsrXSA9IFVJbnQzMkdldERhdHVtKFhMb2dSZWNHZXRUb3RhbExlbihy ZWNvcmQpKTsKKwl2YWx1ZXNbaSsrXSA9IFVJbnQzMkdldERhdHVtKFhMb2dSZWNHZXREYXRhTGVu KHJlY29yZCkpOworCXZhbHVlc1tpKytdID0gVUludDMyR2V0RGF0dW0oZnBpX2xlbik7CisKKwlp ZiAocmVjX2Rlc2MubGVuID4gMCkKKwkJdmFsdWVzW2krK10gPSBDU3RyaW5nR2V0VGV4dERhdHVt KHJlY19kZXNjLmRhdGEpOworCWVsc2UKKwkJbnVsbHNbaSsrXSA9IHRydWU7CisKKwlpZiAoWExv Z1JlY0hhc0FueUJsb2NrUmVmcyhyZWNvcmQpKQorCQl2YWx1ZXNbaSsrXSA9IENTdHJpbmdHZXRU ZXh0RGF0dW0ocmVjX2Jsa19yZWYuZGF0YSk7CisJZWxzZQorCQludWxsc1tpKytdID0gdHJ1ZTsK KworCUFzc2VydChpID09IG5jb2xzKTsKK30KKworLyoKKyAqIEdldCBpbmZvIG9mIGFsbCBXQUwg cmVjb3JkcyBiZXR3ZWVuIHN0YXJ0IExTTiBhbmQgZW5kIExTTi4KKyAqLworc3RhdGljIHZvaWQK K0dldFdBTFJlY29yZHNJbmZvKEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBYTG9nUmVjUHRyIHN0 YXJ0X2xzbiwKKwkJCQkgIFhMb2dSZWNQdHIgZW5kX2xzbikKK3sKKyNkZWZpbmUgR0VUX1dBTF9S RUNPUkRTX0lORk9fRlJPTV9CVUZGRVJTX0NPTFMgMTEKKwlYTG9nUmVhZGVyU3RhdGUgKnhsb2dy ZWFkZXI7CisJWExvZ1JlY1B0cglmaXJzdF92YWxpZF9yZWNvcmQ7CisJUmV0dXJuU2V0SW5mbyAq cnNpbmZvID0gKFJldHVyblNldEluZm8gKikgZmNpbmZvLT5yZXN1bHRpbmZvOworCU1lbW9yeUNv bnRleHQgb2xkX2N4dDsKKwlNZW1vcnlDb250ZXh0IHRtcF9jeHQ7CisKKwlBc3NlcnQoc3RhcnRf bHNuIDw9IGVuZF9sc24pOworCisJSW5pdE1hdGVyaWFsaXplZFNSRihmY2luZm8sIDApOworCisJ eGxvZ3JlYWRlciA9IFhMb2dSZWFkZXJBbGxvY2F0ZSh3YWxfc2VnbWVudF9zaXplLCBOVUxMLAor CQkJCQkJCQkJWExfUk9VVElORSgucGFnZV9yZWFkID0gJnJlYWRfZnJvbV93YWxfYnVmZmVycywK KwkJCQkJCQkJCQkJICAgLnNlZ21lbnRfb3BlbiA9IE5VTEwsCisJCQkJCQkJCQkJCSAgIC5zZWdt ZW50X2Nsb3NlID0gTlVMTCksCisJCQkJCQkJCQlOVUxMKTsKKworCWlmICh4bG9ncmVhZGVyID09 IE5VTEwpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9PVVRfT0ZfTUVN T1JZKSwKKwkJCQkgZXJybXNnKCJvdXQgb2YgbWVtb3J5IiksCisJCQkJIGVycmRldGFpbCgiRmFp bGVkIHdoaWxlIGFsbG9jYXRpbmcgYSBXQUwgcmVhZGluZyBwcm9jZXNzb3IuIikpKTsKKworCS8q IGZpcnN0IGZpbmQgYSB2YWxpZCByZWNwdHIgdG8gc3RhcnQgZnJvbSAqLworCWZpcnN0X3ZhbGlk X3JlY29yZCA9IFhMb2dGaW5kTmV4dFJlY29yZCh4bG9ncmVhZGVyLCBzdGFydF9sc24pOworCisJ aWYgKFhMb2dSZWNQdHJJc0ludmFsaWQoZmlyc3RfdmFsaWRfcmVjb3JkKSkKKwl7CisJCWVyZXBv cnQoTE9HLAorCQkJCShlcnJtc2coImNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgcmVjb3JkIGFmdGVy ICVYLyVYIiwKKwkJCQkJCUxTTl9GT1JNQVRfQVJHUyhzdGFydF9sc24pKSkpOworCisJCXJldHVy bjsKKwl9CisKKwl0bXBfY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlD b250ZXh0LAorCQkJCQkJCQkJIkdldFdBTFJlY29yZHNJbmZvIHRlbXBvcmFyeSBjeHQiLAorCQkJ CQkJCQkJQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CisKKwl3aGlsZSAoUmVhZE5leHRYTG9nUmVj b3JkKHhsb2dyZWFkZXIpICYmCisJCSAgIHhsb2dyZWFkZXItPkVuZFJlY1B0ciA8PSBlbmRfbHNu KQorCXsKKwkJRGF0dW0JCXZhbHVlc1tHRVRfV0FMX1JFQ09SRFNfSU5GT19GUk9NX0JVRkZFUlNf Q09MU10gPSB7MH07CisJCWJvb2wJCW51bGxzW0dFVF9XQUxfUkVDT1JEU19JTkZPX0ZST01fQlVG RkVSU19DT0xTXSA9IHswfTsKKworCQkvKiBVc2UgdGhlIHRtcCBjb250ZXh0IHNvIHdlIGNhbiBj bGVhbiB1cCBhZnRlciBlYWNoIHR1cGxlIGlzIGRvbmUgKi8KKwkJb2xkX2N4dCA9IE1lbW9yeUNv bnRleHRTd2l0Y2hUbyh0bXBfY3h0KTsKKworCQlHZXRXQUxSZWNvcmRJbmZvKHhsb2dyZWFkZXIs IHZhbHVlcywgbnVsbHMsCisJCQkJCQkgR0VUX1dBTF9SRUNPUkRTX0lORk9fRlJPTV9CVUZGRVJT X0NPTFMpOworCisJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHJzaW5mby0+c2V0UmVzdWx0LCByc2lu Zm8tPnNldERlc2MsCisJCQkJCQkJIHZhbHVlcywgbnVsbHMpOworCisJCS8qIGNsZWFuIHVwIGFu ZCBzd2l0Y2ggYmFjayAqLworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2N4dCk7CisJCU1l bW9yeUNvbnRleHRSZXNldCh0bXBfY3h0KTsKKworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwor CX0KKworCU1lbW9yeUNvbnRleHREZWxldGUodG1wX2N4dCk7CisJWExvZ1JlYWRlckZyZWUoeGxv Z3JlYWRlcik7CisKKyN1bmRlZiBHRVRfV0FMX1JFQ09SRFNfSU5GT19GUk9NX0JVRkZFUlNfQ09M UworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMv cmVhZF93YWxfZnJvbV9idWZmZXJzLmNvbnRyb2wgYi9zcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2Fs X2Zyb21fYnVmZmVycy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMuY29udHJvbApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5iMTRkMjQ3NTFjCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvbW9kdWxlcy9yZWFkX3dhbF9mcm9tX2J1ZmZlcnMvcmVhZF93YWxfZnJvbV9idWZm ZXJzLmNvbnRyb2wKQEAgLTAsMCArMSw0IEBACitjb21tZW50ID0gJ1Rlc3QgbW9kdWxlIHRvIHJl YWQgV0FMIGZyb20gV0FMIGJ1ZmZlcnMnCitkZWZhdWx0X3ZlcnNpb24gPSAnMS4wJworbW9kdWxl X3BhdGhuYW1lID0gJyRsaWJkaXIvcmVhZF93YWxfZnJvbV9idWZmZXJzJworcmVsb2NhdGFibGUg PSB0cnVlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zyb21fYnVmZmVy cy90LzAwMV9iYXNpYy5wbCBiL3NyYy90ZXN0L21vZHVsZXMvcmVhZF93YWxfZnJvbV9idWZmZXJz L3QvMDAxX2Jhc2ljLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjE1 ZWY1NTBjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3JlYWRfd2FsX2Zy b21fYnVmZmVycy90LzAwMV9iYXNpYy5wbApAQCAtMCwwICsxLDExMSBAQAorIyBDb3B5cmlnaHQg KGMpIDIwMjEtMjAyMywgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwordXNl IHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7 Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKK3VzZSBUaW1l OjpIaVJlcyBxdyh1c2xlZXApOworCisjIFNldHVwIGEgbmV3IG5vZGUuICBUaGUgY29uZmlndXJh dGlvbiBjaG9zZW4gaGVyZSBtaW5pbWl6ZXMgdGhlIG51bWJlcgorIyBvZiBhcmJpdHJhcnkgcmVj b3JkcyB0aGF0IGNvdWxkIGdldCBnZW5lcmF0ZWQgaW4gYSBjbHVzdGVyLiAgRW5sYXJnaW5nCisj IGNoZWNrcG9pbnRfdGltZW91dCBhdm9pZHMgbm9pc2Ugd2l0aCBjaGVja3BvaW50IGFjdGl2aXR5 LiAgd2FsX2xldmVsCisjIHNldCB0byAibWluaW1hbCIgYXZvaWRzIHJhbmRvbSBzdGFuZGJ5IHNu YXBzaG90IHJlY29yZHMuICBBdXRvdmFjdXVtCisjIGNvdWxkIGFsc28gdHJpZ2dlciByYW5kb21s eSwgZ2VuZXJhdGluZyByYW5kb20gV0FMIGFjdGl2aXR5IG9mIGl0cyBvd24uCisjIEVubGFyZ2lu ZyB3YWxfd3JpdGVyX2RlbGF5IGFuZCB3YWxfd3JpdGVyX2ZsdXNoX2FmdGVyIGF2b2lkIGJhY2tn cm91bmQKKyMgd2FsIGZsdXNoIGJ5IHdhbHdyaXRlci4KK215ICRub2RlID0gUG9zdGdyZVNRTDo6 VGVzdDo6Q2x1c3Rlci0+bmV3KCJub2RlIik7Ciskbm9kZS0+aW5pdDsKKyRub2RlLT5hcHBlbmRf Y29uZigKKwkncG9zdGdyZXNxbC5jb25mJywKKwlxW3dhbF9sZXZlbCA9IG1pbmltYWwKKwkgIGF1 dG92YWN1dW0gPSBvZmYKKwkgIGNoZWNrcG9pbnRfdGltZW91dCA9ICczMG1pbicKKwkgIHdhbF93 cml0ZXJfZGVsYXkgPSAxMDAwMG1zCisJICB3YWxfd3JpdGVyX2ZsdXNoX2FmdGVyID0gMUdCCitd KTsKKyRub2RlLT5zdGFydDsKKworIyBTZXR1cC4KKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywgJ0NSRUFURSBFWFRFTlNJT04gcmVhZF93YWxfZnJvbV9idWZmZXJzOycpOworCiskbm9kZS0+ c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdDUkVBVEUgVEFCTEUgdCAoYyBpbnQpOycpOworCitteSAk cmVzdWx0ID0gMDsKK215ICRsc247CitteSAkdG9fcmVhZDsKKworIyBXYWl0IHVudGlsIHdlIHJl YWQgZnJvbSBXQUwgYnVmZmVycworZm9yIChteSAkaSA9IDA7ICRpIDwgMTAgKiAkUG9zdGdyZVNR TDo6VGVzdDo6VXRpbHM6OnRpbWVvdXRfZGVmYXVsdDsgJGkrKykKK3sKKwkjIEdldCBjdXJyZW50 IGluc2VydCBMU04uIEFmdGVyIHRoaXMsIHdlIGdlbmVyYXRlIHNvbWUgV0FMIHdoaWNoIGlzIGd1 cmFudGVlZAorCSMgdG8gYmUgaW4gV0FMIGJ1ZmZlcnMgYXMgdGhlcmUgaXMgbm8gb3RoZXIgV0FM IGdlbmVyYXRpbmcgYWN0aXZpdHkgaXMKKwkjIGhhcHBlbmluZyBvbiB0aGUgc2VydmVyLiBXZSB0 aGVuIHZlcmlmeSBpZiB3ZSBjYW4gcmVhZCB0aGUgV0FMIGZyb20gV0FMCisJIyBidWZmZXJzIHVz aW5nIHRoaXMgTFNOLgorCSRsc24gPQorCSAgJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAn U0VMRUNUIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKTsnKTsKKworCW15ICRsb2dzdGFydCA9 IC1zICRub2RlLT5sb2dmaWxlOworCisJIyBHZW5lcmF0ZSBtaW5pbWFsIFdBTCBzbyB0aGF0IFdB TCBidWZmZXJzIGRvbid0IGdldCBvdmVyd3JpdHRlbi4KKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsICJJTlNFUlQgSU5UTyB0IFZBTFVFUyAoJGkpOyIpOworCisJJHRvX3JlYWQgPSA4MTky OworCisJbXkgJHJlcyA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkJcXF7U0VMRUNU IHJlYWRfd2FsX2Zyb21fYnVmZmVycyhsc24gOj0gJyRsc24nLCBieXRlc190b19yZWFkIDo9ICR0 b19yZWFkKSA+IDA7fQorCSk7CisKKwlteSAkbG9nID0gJG5vZGUtPmxvZ19jb250YWlucygKKwkJ InJlcXVlc3QgdG8gZmx1c2ggcGFzdCBlbmQgb2YgZ2VuZXJhdGVkIFdBTDsgcmVxdWVzdCAuKiwg Y3VycmVudCBwb3NpdGlvbiAuKiIsCisJCSRsb2dzdGFydCk7CisKKwlpZiAoJHJlcyBlcSAndCcg JiYgJGxvZyA+IDApCisJeworCQkkcmVzdWx0ID0gMTsKKwkJbGFzdDsKKwl9CisKKwl1c2xlZXAo MTAwXzAwMCk7Cit9CitvaygkcmVzdWx0LCAnd2FpdGVkIHVudGlsIFdBTCBpcyBzdWNjZXNzZnVs bHkgcmVhZCBmcm9tIFdBTCBidWZmZXJzJyk7CisKKyRyZXN1bHQgPSAwOworCisjIFdhaXQgdW50 aWwgd2UgZ2V0IGluZm8gb2YgV0FMIHJlY29yZHMgYXZhaWxhYmxlIGluIFdBTCBidWZmZXJzLgor Zm9yIChteSAkaSA9IDA7ICRpIDwgMTAgKiAkUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnRpbWVv dXRfZGVmYXVsdDsgJGkrKykKK3sKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJEUk9Q IFRBQkxFIElGIEVYSVNUUyBmb28sIGJhcjsiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsCisJCSJDUkVBVEUgVEFCTEUgZm9vIEFTIFNFTEVDVCAqIEZST00gZ2VuZXJhdGVfc2VyaWVz KDEsIDIpOyIpOworCW15ICRzdGFydF9sc24gPQorCSAgJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdy ZXMnLCAiU0VMRUNUIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKTsiKTsKKwlteSAkdGJsX29p ZCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkJIlNFTEVDVCBvaWQgRlJPTSBwZ19j bGFzcyBXSEVSRSByZWxuYW1lID0gJ2Zvbyc7Iik7CisJJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdy ZXMnLAorCQkiSU5TRVJUIElOVE8gZm9vIFNFTEVDVCAqIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEs IDEwKTsiKTsKKwlteSAkZW5kX2xzbiA9CisJICAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jlcycs ICJTRUxFQ1QgcGdfY3VycmVudF93YWxfaW5zZXJ0X2xzbigpOyIpOworCSRub2RlLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywKKwkJIkNSRUFURSBUQUJMRSBiYXIgQVMgU0VMRUNUICogRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgMik7Iik7CisKKwlteSAkcmVzID0gJG5vZGUtPnNhZmVfcHNxbCgKKwkJ J3Bvc3RncmVzJywKKwkJIlNFTEVDVCBjb3VudCgqKSBGUk9NIGdldF93YWxfcmVjb3Jkc19pbmZv X2Zyb21fYnVmZmVycygnJHN0YXJ0X2xzbicsICckZW5kX2xzbicpCisJCQkJCVdIRVJFIGJsb2Nr X3JlZiBMSUtFIGNvbmNhdCgnJScsICckdGJsX29pZCcsICclJykgQU5ECisJCQkJCQlyZXNvdXJj ZV9tYW5hZ2VyID0gJ0hlYXAnIEFORAorCQkJCQkJcmVjb3JkX3R5cGUgPSAnSU5TRVJUJzsiKTsK KworCWlmICgkcmVzIGVxIDEwKQorCXsKKwkJJHJlc3VsdCA9IDE7CisJCWxhc3Q7CisJfQorCisJ dXNsZWVwKDEwMF8wMDApOworfQorb2soJHJlc3VsdCwKKwknd2FpdGVkIHVudGlsIHdlIGdldCBp bmZvIG9mIFdBTCByZWNvcmRzIGF2YWlsYWJsZSBpbiBXQUwgYnVmZmVycy4nKTsKKworZG9uZV90 ZXN0aW5nKCk7Ci0tIAoyLjM0LjEKCg== --0000000000000e73510616d9e4cc--