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 1wHu0v-007bqk-1V for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Apr 2026 01:46:58 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wHu0u-001WZl-1b for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Apr 2026 01:46:56 +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 1wHu0u-001WZd-0Q for pgsql-hackers@lists.postgresql.org; Wed, 29 Apr 2026 01:46:56 +0000 Received: from mail-oo1-xc2f.google.com ([2607:f8b0:4864:20::c2f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wHu0r-00000003e4D-2miV for pgsql-hackers@lists.postgresql.org; Wed, 29 Apr 2026 01:46:55 +0000 Received: by mail-oo1-xc2f.google.com with SMTP id 006d021491bc7-688a8e5fe5eso6070746eaf.1 for ; Tue, 28 Apr 2026 18:46:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777427211; cv=none; d=google.com; s=arc-20240605; b=aiWCd/KK232Xd/hqCINQDqgLN9SRAwpufENyyT2K+SKAKvsLNPNc0ZX/KVnqNzEcA3 zNNCfcFWjMPPy6WSITA1GImKlcPC7/OKRf6MaLTFGlRFa1T5w8/E2AOX3ARBBQBWdHTH KK9jyWZkfkLPMIIS6hualSrqhEnPYoBa3Vo+RUVSHmQV50VJkckIP7vli+aWWQfcJd7H m5lhaZp3qaxPQxP9tOLLAEiE9kzDUnDlNJxk58SKh+U0vYu7wY1S0V5DD7xseCoZUd6e PNCM5a4SaZThj8v8p/+0C309RM5iPmZ0tQuSZZDHScn7W3SXLRWU4EZRjxdWAWp0XRAM 5rbA== 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=35d1zhRsD7lWfZo51fdQPw8hSW7lpnXQNcEcj+AK2B8=; fh=9P4rXaV3g+06HU4BoJTMFGULiRL+mEWA82O/iutAZnI=; b=Wnw5yV6S0BbrefuVH+KqI/5v9On+BNY5MJ6K1t//BurJIOd++5b6QMRMNZetvf/IV5 hcYyrDBNhyDGNj5tTFyX745RSQk0Vx3y3j8t6wVIQ7cjvmv75lahRovyrIU05aspLBX5 HNvnTJm8TYCXcJXrX2OJuEyIP9jHMBcDlriIdn4qaWUlkNKeqeJb92jSung6mzKS/TCK N+lawqFF+1OT9IABvBHF/uVohZpUw99ToqZoG2z5c7+Yzr2D1K+RFokWqVjA1DuETlT1 v9pCfMnPIb7VOUrxrzCVgHdvVeFlg0vtlQKV/d3pLIxt+OCU5rbe19rFzSUdno6+oYtv zWPQ==; 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=1777427211; x=1778032011; 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=35d1zhRsD7lWfZo51fdQPw8hSW7lpnXQNcEcj+AK2B8=; b=mFNg1cBUYfCMqcoJGJJwfYR6MH8/GL+wUQDxof5JwHo8OfmVb7Xco9d4vhzW/aYNwm wj45fY9OxHXi7TgMcaRABCXQEQ/I8YWNMcQVXI1ykrudQ7/PEyLlF4sdJeTnMGULwi00 7ZOkCtxa1Q8UopEOMLiNp08e4FQEs4UCthQyNUhtECBXKHIJVah0bk+KfaoqMNP7I39f rU9MKgTkcxtzeGptitxWPDGJNtU5fSay8Nuu1gqgZRgMJ4ajDaHoANwDjdLLPUMuCIeP ryToj5cX/ZAhl8KhlkOavIB1t5ktcqn8pXOa2/hD6KdMN0p0jaOL3ZKBnWvJx9d3RO0M lpNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777427211; x=1778032011; 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=35d1zhRsD7lWfZo51fdQPw8hSW7lpnXQNcEcj+AK2B8=; b=Mm2WgubchlUGt/JBfL0ScG4Kph5ZGrkmJxQRbBpG907BV214fVQq11OGOTDAi2jFaP egX2PY7U9ku9MOBwyQReJ9qJ3GRV2nYudJ2Bia4u/Mj5llzN/2UvsB3KWBmMq/7YaVlJ QRG8fT7h/xwF/+WswqjJ81TQYEQWz9XVFI0EhGkuIELf3gh305t10JR8NstHGliWfVZW cewvMnDI0gDs1C+ZE1LhQwgQiysnHihDcGX9xxS0W9SYtqdH4+uZPHjxmx3s5e57W3yY +ueNU924fLQYbERfu0VklxgWfd3VXWrhPNrVeaK1q5q6B2J5a9TTDPnUJSVbqpzHsPNz GUIg== X-Gm-Message-State: AOJu0Yykz56GQnWszBJOaxUJ0NGvx/Fceb1q40yBVXi3Y2FLtIS/oFYb faj3dD4wFbwOnusIzorsyAL9EUebb5wTgnzKxYMNchK4z+sB4ZsyFTBqGyvXmEJ2AVZXVx3/Mfv 6+8/8gAAfoPDnYdAsg8t0+/mdbOY4fxUsQg== X-Gm-Gg: AeBDiesEqS6Nrc9+kxTLTOPlTQWKMNt84HK4zYxM97aS483knS6Yst4hT4KV+pLfXyc ZxrhF278IeF+FZPcUd87VdlRkQaZA8IPLI109BMLiAgEgwB+Psje3Hhtyu6ytCA4/6jQLvesP70 Wr2GwdM6fHtT2IzrZlJ+WPBXIt6fR/N8JotWw4nVyal2f7i6lP0zlazWtUSNH6C/+/KN7ypCxFB gGA9tOAotdoXfyf6pkwZmiJ3sv5B1s+shv0ui35z70CQcrwsf9EsdG2FKOd3tl/Y1SgLLO1kRpo KrhOWxPQfe8rp8mB X-Received: by 2002:a05:6820:1688:b0:694:9a8a:2ce with SMTP id 006d021491bc7-6966837c609mr959237eaf.8.1777427211054; Tue, 28 Apr 2026 18:46:51 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Bharath Rupireddy Date: Tue, 28 Apr 2026 18:45:00 -0700 X-Gm-Features: AVHnY4KtH-z-yvsoHAv99QLt-r13tr-R2iQ9p3kUIhf_hCyfkR8EgwbsBvCAcfs Message-ID: Subject: Re: Add tests for concurrent DML retry paths in logical replication apply To: "Hayato Kuroda (Fujitsu)" Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000087be4806508f85e3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000087be4806508f85e3 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Tue, Apr 28, 2026 at 12:47=E2=80=AFAM Hayato Kuroda (Fujitsu) wrote: > > > While reading the logical replication apply code in execReplication.c, = I noticed > > that the retry paths in RelationFindReplTupleByIndex and RelationFindRe= plTupleSeq > > for concurrent updates and deletes have no test coverage [1]. Specifica= lly, > > when the same tuple is being updated/deleted on the publisher and subsc= riber at > > the same time, the dirty snapshot finds the tuple being modified by ano= ther > > transaction, the apply worker waits and retries the index/sequential sc= an. > > Good catch. > > > The attached patch adds an injection point before table_tuple_lock and = a TAP test > > exercising these retry paths, hitting both TM_Updated and TM_Deleted. > > I read the code briefly. Here are questions: Thank you for reviewing! > 1. > The test looks like to add the test for retry acquiring the lock. But the= re is > another retry path, which waits till xwait finishes. Do you have a reason= to > skip testing? There are two retry paths, and I added TAP tests covering both. The XactLockTableWait path is tested by holding an in-progress transaction on the subscriber, which naturally blocks the apply worker until the transaction finishes, then it retries the scan. The table_tuple_lock retry path (TM_Updated / TM_Deleted) is tested using an injection point that pauses the worker between finding and locking the tuple, allowing concurrent DML to intervene. > 2. > Is it OK to use the same injection point name twice? I cannot find the ex= isting > case. Good catch. I used separate injection points for each path. Please find the attached v2 patch for further review. Thank you! -- Bharath Rupireddy Amazon Web Services: https://aws.amazon.com --00000000000087be4806508f85e3 Content-Type: application/x-patch; name="v2-0001-Add-tests-for-concurrent-DML-retry-paths-in-logic.patch" Content-Disposition: attachment; filename="v2-0001-Add-tests-for-concurrent-DML-retry-paths-in-logic.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_moizhog00 RnJvbSA4ODZkYTc0NTA5ZjVmODg1ZTc2NzY3Yjk5NGVkMTA3NGQ0NjRkMDcxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCaGFyYXRoIFJ1cGlyZWRkeSA8YmhhcmF0aC5ydXBpcmVkZHlm b3Jwb3N0Z3Jlc0BnbWFpbC5jb20+CkRhdGU6IFR1ZSwgMjggQXByIDIwMjYgMTg6MjA6MzQgKzAw MDAKU3ViamVjdDogW1BBVENIIHYyXSBBZGQgdGVzdHMgZm9yIGNvbmN1cnJlbnQgRE1MIHJldHJ5 IHBhdGhzIGluIGxvZ2ljYWwKIHJlcGxpY2F0aW9uIGFwcGx5LgoKVGhlIHJldHJ5IHBhdGhzIGlu IFJlbGF0aW9uRmluZFJlcGxUdXBsZUJ5SW5kZXggYW5kClJlbGF0aW9uRmluZFJlcGxUdXBsZVNl cSBmb3IgY29uY3VycmVudCB1cGRhdGVzIGFuZCBkZWxldGVzIGhhZApubyB0ZXN0IGNvdmVyYWdl LiBUaGUgYXBwbHkgd29ya2VyIHVzZXMgYSBkaXJ0eSBzbmFwc2hvdCB0byBmaW5kCnRoZSB0YXJn ZXQgdHVwbGUgb24gdGhlIHN1YnNjcmliZXIgKGluZGV4IHNjYW4gd2hlbiBhdmFpbGFibGUsCnNl cXVlbnRpYWwgc2NhbiBmb3IgUkVQTElDQSBJREVOVElUWSBGVUxMKS4gV2hlbiBpdCBkZXRlY3Rz IGFuCmluLXByb2dyZXNzIHRyYW5zYWN0aW9uIG9uIHRoZSB0YXJnZXQgdHVwbGUsIGl0IHdhaXRz IHZpYQpYYWN0TG9ja1RhYmxlV2FpdCwgdGhlbiByZXRyaWVzIHRoZSBzY2FuLiBPbmNlIGZvdW5k LCBpdCBsb2Nrcwp0aGUgdHVwbGUgd2l0aCB0YWJsZV90dXBsZV9sb2NrIGFuZCBhcHBsaWVzIHRo ZSB1cGRhdGUgb3IgZGVsZXRlCmZyb20gdGhlIHB1Ymxpc2hlci4KClRoaXMgY29tbWl0IGFkZHMg VEFQIHRlc3RzIGNvdmVyaW5nIGJvdGggcmV0cnkgcGF0aHMuIFRoZQpYYWN0TG9ja1RhYmxlV2Fp dCBwYXRoIGlzIHRlc3RlZCBieSBob2xkaW5nIGFuIGluLXByb2dyZXNzIHRyYW5zYWN0aW9uCm9u IHRoZSBzdWJzY3JpYmVyLCB3aGljaCBuYXR1cmFsbHkgYmxvY2tzIHRoZSBhcHBseSB3b3JrZXIu IFRoZQp0YWJsZV90dXBsZV9sb2NrIHJldHJ5IHBhdGggKFRNX1VwZGF0ZWQgLyBUTV9EZWxldGVk KSBpcyB0ZXN0ZWQKdXNpbmcgYW4gaW5qZWN0aW9uIHBvaW50IHRoYXQgcGF1c2VzIHRoZSB3b3Jr ZXIgYmV0d2VlbiBmaW5kaW5nCmFuZCBsb2NraW5nIHRoZSB0dXBsZSwgYWxsb3dpbmcgY29uY3Vy cmVudCBETUwgdG8gaW50ZXJ2ZW5lLgoKV2hpbGUgaGVyZSwgZml4IG1pbm9yIGluZWZmaWNpZW5j aWVzIGluIHRoZSByZXRyeSBoYW5kbGluZy4gSW4KUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJbmRl eCwgYXZvaWQgY2FsbGluZyBFeGVjTWF0ZXJpYWxpemVTbG90CmJlZm9yZSB0aGUgcmV0cnkgY2hl Y2suIEluIFJlbGF0aW9uRmluZFJlcGxUdXBsZVNlcSwgcmVtb3ZlIHRoZQp1bm5lY2Vzc2FyeSBz ZXBhcmF0ZSBUdXBsZVRhYmxlU2xvdCBhbGxvY2F0aW9uIGFuZCBFeGVjQ29weVNsb3QKY2FsbCBi eSB1c2luZyBvdXRzbG90IGRpcmVjdGx5IGZvciBzY2FubmluZywga2VlcGluZyBpdApjb25zaXN0 ZW50IHdpdGggUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJbmRleC4KCkF1dGhvcjogQmhhcmF0aCBS dXBpcmVkZHkgPGJoYXJhdGgucnVwaXJlZGR5Zm9ycG9zdGdyZXNAZ21haWwuY29tPgpSZXZpZXdl ZC1ieTogSGF5YXRvIEt1cm9kYSA8a3Vyb2RhLmhheWF0b0BmdWppdHN1LmNvbT4KRGlzY3Vzc2lv bjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9DQUxqMkFDVjZFU3BnZ24y QXolM0RPZFpCelZ4N2ppQkc5T19FZEtkZ2JrMmNoQUp1c0MydyU0MG1haWwuZ21haWwuY29tCi0t LQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1JlcGxpY2F0aW9uLmMgICAgICAgIHwgIDI1ICst CiBzcmMvdGVzdC9zdWJzY3JpcHRpb24vbWVzb24uYnVpbGQgICAgICAgICAgICAgfCAgIDEgKwog Li4uL3QvMDM5X2NvbmN1cnJlbnRfZG1sX3JldHJ5LnBsICAgICAgICAgICAgIHwgMjI1ICsrKysr KysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyNDEgaW5zZXJ0aW9ucygrKSwgMTAgZGVs ZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL3QvMDM5 X2NvbmN1cnJlbnRfZG1sX3JldHJ5LnBsCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0 b3IvZXhlY1JlcGxpY2F0aW9uLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUmVwbGljYXRp b24uYwppbmRleCBiMmNhNWNiZjExNy4uNWE4ZmVkNTUzNmEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL2V4ZWNSZXBsaWNhdGlvbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L2V4ZWNSZXBsaWNhdGlvbi5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSAidXRpbHMvc3lz Y2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy90eXBjYWNoZS5oIgogCisjaW5jbHVkZSAidXRpbHMv aW5qZWN0aW9uX3BvaW50LmgiCisKIAogc3RhdGljIGJvb2wgdHVwbGVzX2VxdWFsKFR1cGxlVGFi bGVTbG90ICpzbG90MSwgVHVwbGVUYWJsZVNsb3QgKnNsb3QyLAogCQkJCQkJIFR5cGVDYWNoZUVu dHJ5ICoqZXEsIEJpdG1hcHNldCAqY29sdW1ucyk7CkBAIC0yMjksOCArMjMxLDYgQEAgcmV0cnk6 CiAJCQkJY29udGludWU7CiAJCX0KIAotCQlFeGVjTWF0ZXJpYWxpemVTbG90KG91dHNsb3QpOwot CiAJCXh3YWl0ID0gVHJhbnNhY3Rpb25JZElzVmFsaWQoc25hcC54bWluKSA/CiAJCQlzbmFwLnht aW4gOiBzbmFwLnhtYXg7CiAKQEAgLTI1NSw2ICsyNTUsOCBAQCByZXRyeToKIAkJVE1fRmFpbHVy ZURhdGEgdG1mZDsKIAkJVE1fUmVzdWx0CXJlczsKIAorCQlJTkpFQ1RJT05fUE9JTlQoImZpbmQt cmVwbC10dXBsZS1ieS1pbmRleC1iZWZvcmUtbG9jayIsIE5VTEwpOworCiAJCVB1c2hBY3RpdmVT bmFwc2hvdChHZXRMYXRlc3RTbmFwc2hvdCgpKTsKIAogCQlyZXMgPSB0YWJsZV90dXBsZV9sb2Nr KHJlbCwgJihvdXRzbG90LT50dHNfdGlkKSwgR2V0QWN0aXZlU25hcHNob3QoKSwKQEAgLTI2OSw2 ICsyNzEsOSBAQCByZXRyeToKIAogCQlpZiAoc2hvdWxkX3JlZmV0Y2hfdHVwbGUocmVzLCAmdG1m ZCkpCiAJCQlnb3RvIHJldHJ5OworCisJCS8qIE1hdGVyaWFsaXplIHRoZSBzbG90IHNvIGl0IHBy ZXNlcnZlcyBwYXNzLWJ5LXJlZiB2YWx1ZXMuICovCisJCUV4ZWNNYXRlcmlhbGl6ZVNsb3Qob3V0 c2xvdCk7CiAJfQogCiAJaW5kZXhfZW5kc2NhbihzY2FuKTsKQEAgLTM3MCw3ICszNzUsNiBAQCBi b29sCiBSZWxhdGlvbkZpbmRSZXBsVHVwbGVTZXEoUmVsYXRpb24gcmVsLCBMb2NrVHVwbGVNb2Rl IGxvY2ttb2RlLAogCQkJCQkJIFR1cGxlVGFibGVTbG90ICpzZWFyY2hzbG90LCBUdXBsZVRhYmxl U2xvdCAqb3V0c2xvdCkKIHsKLQlUdXBsZVRhYmxlU2xvdCAqc2NhbnNsb3Q7CiAJVGFibGVTY2Fu RGVzYyBzY2FuOwogCVNuYXBzaG90RGF0YSBzbmFwOwogCVR5cGVDYWNoZUVudHJ5ICoqZXE7CkBA IC0zODYsNyArMzkwLDYgQEAgUmVsYXRpb25GaW5kUmVwbFR1cGxlU2VxKFJlbGF0aW9uIHJlbCwg TG9ja1R1cGxlTW9kZSBsb2NrbW9kZSwKIAlJbml0RGlydHlTbmFwc2hvdChzbmFwKTsKIAlzY2Fu ID0gdGFibGVfYmVnaW5zY2FuKHJlbCwgJnNuYXAsIDAsIE5VTEwsCiAJCQkJCQkgICBTT19OT05F KTsKLQlzY2Fuc2xvdCA9IHRhYmxlX3Nsb3RfY3JlYXRlKHJlbCwgTlVMTCk7CiAKIHJldHJ5Ogog CWZvdW5kID0gZmFsc2U7CkBAIC0zOTQsMTQgKzM5NywxMSBAQCByZXRyeToKIAl0YWJsZV9yZXNj YW4oc2NhbiwgTlVMTCk7CiAKIAkvKiBUcnkgdG8gZmluZCB0aGUgdHVwbGUgKi8KLQl3aGlsZSAo dGFibGVfc2Nhbl9nZXRuZXh0c2xvdChzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbiwgc2NhbnNs b3QpKQorCXdoaWxlICh0YWJsZV9zY2FuX2dldG5leHRzbG90KHNjYW4sIEZvcndhcmRTY2FuRGly ZWN0aW9uLCBvdXRzbG90KSkKIAl7Ci0JCWlmICghdHVwbGVzX2VxdWFsKHNjYW5zbG90LCBzZWFy Y2hzbG90LCBlcSwgTlVMTCkpCisJCWlmICghdHVwbGVzX2VxdWFsKG91dHNsb3QsIHNlYXJjaHNs b3QsIGVxLCBOVUxMKSkKIAkJCWNvbnRpbnVlOwogCi0JCWZvdW5kID0gdHJ1ZTsKLQkJRXhlY0Nv cHlTbG90KG91dHNsb3QsIHNjYW5zbG90KTsKLQogCQl4d2FpdCA9IFRyYW5zYWN0aW9uSWRJc1Zh bGlkKHNuYXAueG1pbikgPwogCQkJc25hcC54bWluIDogc25hcC54bWF4OwogCkBAIC00MTYsNiAr NDE2LDcgQEAgcmV0cnk6CiAJCX0KIAogCQkvKiBGb3VuZCBvdXIgdHVwbGUgYW5kIGl0J3Mgbm90 IGxvY2tlZCAqLworCQlmb3VuZCA9IHRydWU7CiAJCWJyZWFrOwogCX0KIApAQCAtNDI1LDYgKzQy Niw4IEBAIHJldHJ5OgogCQlUTV9GYWlsdXJlRGF0YSB0bWZkOwogCQlUTV9SZXN1bHQJcmVzOwog CisJCUlOSkVDVElPTl9QT0lOVCgiZmluZC1yZXBsLXR1cGxlLXNlcS1iZWZvcmUtbG9jayIsIE5V TEwpOworCiAJCVB1c2hBY3RpdmVTbmFwc2hvdChHZXRMYXRlc3RTbmFwc2hvdCgpKTsKIAogCQly ZXMgPSB0YWJsZV90dXBsZV9sb2NrKHJlbCwgJihvdXRzbG90LT50dHNfdGlkKSwgR2V0QWN0aXZl U25hcHNob3QoKSwKQEAgLTQzOSwxMCArNDQyLDEyIEBAIHJldHJ5OgogCiAJCWlmIChzaG91bGRf cmVmZXRjaF90dXBsZShyZXMsICZ0bWZkKSkKIAkJCWdvdG8gcmV0cnk7CisKKwkJLyogTWF0ZXJp YWxpemUgdGhlIHNsb3Qgc28gaXQgcHJlc2VydmVzIHBhc3MtYnktcmVmIHZhbHVlcy4gKi8KKwkJ RXhlY01hdGVyaWFsaXplU2xvdChvdXRzbG90KTsKIAl9CiAKIAl0YWJsZV9lbmRzY2FuKHNjYW4p OwotCUV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3Qoc2NhbnNsb3QpOwogCiAJcmV0dXJuIGZv dW5kOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL21lc29uLmJ1aWxkIGIv c3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL21lc29uLmJ1aWxkCmluZGV4IGU3MWU5NWM2Mjk3Li41ZGY3 ZjE0MzcyMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qvc3Vic2NyaXB0aW9uL21lc29uLmJ1aWxkCisr KyBiL3NyYy90ZXN0L3N1YnNjcmlwdGlvbi9tZXNvbi5idWlsZApAQCAtNDgsNiArNDgsNyBAQCB0 ZXN0cyArPSB7CiAgICAgICAndC8wMzZfc2VxdWVuY2VzLnBsJywKICAgICAgICd0LzAzN19leGNl cHQucGwnLAogICAgICAgJ3QvMDM4X3dhbHNuZF9zaHV0ZG93bl90aW1lb3V0LnBsJywKKyAgICAg ICd0LzAzOV9jb25jdXJyZW50X2RtbF9yZXRyeS5wbCcsCiAgICAgICAndC8xMDBfYnVncy5wbCcs CiAgICAgXSwKICAgfSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3N1YnNjcmlwdGlvbi90LzAzOV9j b25jdXJyZW50X2RtbF9yZXRyeS5wbCBiL3NyYy90ZXN0L3N1YnNjcmlwdGlvbi90LzAzOV9jb25j dXJyZW50X2RtbF9yZXRyeS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uNTcwZDZjMmY4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9zdWJzY3JpcHRpb24v dC8wMzlfY29uY3VycmVudF9kbWxfcmV0cnkucGwKQEAgLTAsMCArMSwyMjUgQEAKKyMgQ29weXJp Z2h0IChjKSAyMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjIFRl c3QgY29uY3VycmVudCBETUwgcmV0cnkgcGF0aHMgaW4gbG9naWNhbCByZXBsaWNhdGlvbiBhcHBs eS4KK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgUG9zdGdy ZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBU ZXN0OjpNb3JlOworCisjIENyZWF0ZSBwdWJsaXNoZXIuCitteSAkbm9kZV9wdWJsaXNoZXIgPSBQ b3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3B1Ymxpc2hlcicpOworJG5vZGVfcHVibGlz aGVyLT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gJ2xvZ2ljYWwnKTsKKyRub2RlX3B1Ymxpc2hl ci0+c3RhcnQ7CisKKyMgQ3JlYXRlIHN1YnNjcmliZXIuCitteSAkbm9kZV9zdWJzY3JpYmVyID0g UG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdzdWJzY3JpYmVyJyk7Ciskbm9kZV9zdWJz Y3JpYmVyLT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gJ2xvZ2ljYWwnKTsKKyRub2RlX3N1YnNj cmliZXItPnN0YXJ0OworCisjIENyZWF0ZSB0YWJsZXMgb24gYm90aCBzaWRlcyBhbmQgc2V0IHVw IHJlcGxpY2F0aW9uLgorJG5vZGVfcHVibGlzaGVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXEo CisJQ1JFQVRFIFRBQkxFIHRlc3RfdGFiIChhIGludCBQUklNQVJZIEtFWSwgYiBpbnQsIGMgdGV4 dCk7CisJQ1JFQVRFIFRBQkxFIHRlc3RfdGFiX2Z1bGwgKGEgaW50LCBiIGludCwgYyB0ZXh0KTsK KwlBTFRFUiBUQUJMRSB0ZXN0X3RhYl9mdWxsIFJFUExJQ0EgSURFTlRJVFkgRlVMTDsKKykpOwor Ciskbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXEoCisJQ1JFQVRFIFRB QkxFIHRlc3RfdGFiIChhIGludCBQUklNQVJZIEtFWSwgYiBpbnQsIGMgdGV4dCk7CisJQ1JFQVRF IFRBQkxFIHRlc3RfdGFiX2Z1bGwgKGEgaW50LCBiIGludCwgYyB0ZXh0KTsKKwlBTFRFUiBUQUJM RSB0ZXN0X3RhYl9mdWxsIFJFUExJQ0EgSURFTlRJVFkgRlVMTDsKKykpOworCitteSAkcHVibGlz aGVyX2Nvbm5zdHIgPSAkbm9kZV9wdWJsaXNoZXItPmNvbm5zdHIgLiAnIGRibmFtZT1wb3N0Z3Jl cyc7Ciskbm9kZV9wdWJsaXNoZXItPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJDUkVBVEUgUFVC TElDQVRJT04gdGVzdF9wdWIgRk9SIFRBQkxFIHRlc3RfdGFiLCB0ZXN0X3RhYl9mdWxsOyIpOwor CitteSAkYXBwbmFtZSA9ICd0ZXN0X3N1Yic7Ciskbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKKwkiQ1JFQVRFIFNVQlNDUklQVElPTiB0ZXN0X3N1YgorCSBDT05ORUNUSU9O ICckcHVibGlzaGVyX2Nvbm5zdHIgYXBwbGljYXRpb25fbmFtZT0kYXBwbmFtZScKKwkgUFVCTElD QVRJT04gdGVzdF9wdWI7Iik7CisKKyRub2RlX3N1YnNjcmliZXItPndhaXRfZm9yX3N1YnNjcmlw dGlvbl9zeW5jKCRub2RlX3B1Ymxpc2hlciwgJGFwcG5hbWUpOworCisjIEluc2VydCB0ZXN0IGRh dGEuICBSb3dzIDEtMiBhcmUgdXNlZCBieSBYYWN0TG9ja1RhYmxlV2FpdCB0ZXN0cywKKyMgcm93 cyAzLTQgYnkgaW5qZWN0aW9uLXBvaW50IHRlc3RzLgorJG5vZGVfcHVibGlzaGVyLT5zYWZlX3Bz cWwoJ3Bvc3RncmVzJywgcXEoCisJSU5TRVJUIElOVE8gdGVzdF90YWIgVkFMVUVTICgxLCAxMCwg J2ZvbycpLCAoMiwgMjAsICdiYXInKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMs IDMwLCAnYmF6JyksICg0LCA0MCwgJ3F1eCcpOworCUlOU0VSVCBJTlRPIHRlc3RfdGFiX2Z1bGwg VkFMVUVTICgxLCAxMCwgJ2ZvbycpLCAoMiwgMjAsICdiYXInKSwKKwkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoMywgMzAsICdiYXonKSwgKDQsIDQwLCAncXV4Jyk7CispKTsKKyRu b2RlX3B1Ymxpc2hlci0+d2FpdF9mb3JfY2F0Y2h1cCgkYXBwbmFtZSk7CisKKyMgVGVzdCB0aGUg YXBwbHkgd29ya2VyIHJldHJ5IHdoZW4gdGhlIGRpcnR5IHNuYXBzaG90IGZpbmRzIGFuIGluLXBy b2dyZXNzCisjIHRyYW5zYWN0aW9uIG9uIHRoZSB0YXJnZXQgdHVwbGUsIGNhdXNpbmcgWGFjdExv Y2tUYWJsZVdhaXQuCisKK215ICRzdWJfc2Vzc2lvbiA9ICRub2RlX3N1YnNjcmliZXItPmJhY2tn cm91bmRfcHNxbCgncG9zdGdyZXMnKTsKKworc3ViIHRlc3RfcmV0cnlfd2l0aF9pbl9wcm9ncmVz c194YWN0Cit7CisJbXkgKCVhcmdzKSA9IEBfOworCW15ICR0ZXN0X25hbWUgICAgID0gJGFyZ3N7 bmFtZX07CisJbXkgJGRtbCAgICAgICAgICAgPSAkYXJnc3tkbWx9OworCW15ICR2ZXJpZnlfcXVl cnkgID0gJGFyZ3N7dmVyaWZ5X3F1ZXJ5fTsKKwlteSAkdmVyaWZ5X3Jlc3VsdCA9ICRhcmdze3Zl cmlmeV9yZXN1bHR9OworCisJIyBNb2RpZnkgdGhlIHRhcmdldCB0dXBsZSBpbiBhbiBpbi1wcm9n cmVzcyB0cmFuc2FjdGlvbiBvbiB0aGUgc3Vic2NyaWJlci4KKwkkc3ViX3Nlc3Npb24tPnF1ZXJ5 X3NhZmUoIkJFR0lOOyIpOworCSRzdWJfc2Vzc2lvbi0+cXVlcnlfc2FmZSgkZG1sKTsKKworCSMg UnVuIERNTCBvbiB0aGUgcHVibGlzaGVyLgorCSRub2RlX3B1Ymxpc2hlci0+c2FmZV9wc3FsKCdw b3N0Z3JlcycsICRkbWwpOworCisJIyBXYWl0IGZvciB0aGUgYXBwbHkgd29ya2VyIHRvIGJsb2Nr IG9uIFhhY3RMb2NrVGFibGVXYWl0LgorCSRub2RlX3N1YnNjcmliZXItPnBvbGxfcXVlcnlfdW50 aWwoJ3Bvc3RncmVzJywgcXEoCisJCVNFTEVDVCBjb3VudCgqKSA+IDAgRlJPTSBwZ19zdGF0X2Fj dGl2aXR5CisJCVdIRVJFIGJhY2tlbmRfdHlwZSA9ICdsb2dpY2FsIHJlcGxpY2F0aW9uIGFwcGx5 IHdvcmtlcicKKwkJICBBTkQgd2FpdF9ldmVudF90eXBlID0gJ0xvY2snCisJCSAgQU5EIHdhaXRf ZXZlbnQgPSAndHJhbnNhY3Rpb25pZCc7CisJKSkgb3IgZGllICJUaW1lZCBvdXQgd2FpdGluZyBm b3IgYXBwbHkgd29ya2VyIHRvIGJsb2NrIG9uIFhhY3RMb2NrVGFibGVXYWl0IjsKKworCSMgQWJv cnQgc28gdGhlIGFwcGx5IHdvcmtlciB3YWtlcyB1cCwgcmV0cmllcywgYW5kIGFwcGxpZXMgc3Vj Y2Vzc2Z1bGx5LgorCSRzdWJfc2Vzc2lvbi0+cXVlcnlfc2FmZSgiUk9MTEJBQ0s7Iik7CisJJG5v ZGVfcHVibGlzaGVyLT53YWl0X2Zvcl9jYXRjaHVwKCRhcHBuYW1lKTsKKworCSMgVmVyaWZ5IHRo ZSByZXN1bHRzLgorCW15ICRyZXN1bHQgPSAkbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgJHZlcmlmeV9xdWVyeSk7CisJaXMoJHJlc3VsdCwgJHZlcmlmeV9yZXN1bHQsICR0 ZXN0X25hbWUpOworfQorCisjIEluZGV4IHNjYW4gKFBLKTogcHVibGlzaGVyIFVQREFURSB3aXRo IGluLXByb2dyZXNzIHN1YnNjcmliZXIgdHJhbnNhY3Rpb24uCit0ZXN0X3JldHJ5X3dpdGhfaW5f cHJvZ3Jlc3NfeGFjdCgKKwluYW1lICAgICAgICAgID0+ICdYYWN0TG9ja1RhYmxlV2FpdCBpbmRl eCBzY2FuIFVQREFURScsCisJZG1sICAgICAgICAgICA9PiAiVVBEQVRFIHRlc3RfdGFiIFNFVCBj ID0gJ2Zvb191JyBXSEVSRSBhID0gMTsiLAorCXZlcmlmeV9xdWVyeSAgPT4gIlNFTEVDVCBjIEZS T00gdGVzdF90YWIgV0hFUkUgYSA9IDE7IiwKKwl2ZXJpZnlfcmVzdWx0ID0+ICdmb29fdScsCisp OworCisjIEluZGV4IHNjYW4gKFBLKTogcHVibGlzaGVyIERFTEVURSB3aXRoIGluLXByb2dyZXNz IHN1YnNjcmliZXIgdHJhbnNhY3Rpb24uCit0ZXN0X3JldHJ5X3dpdGhfaW5fcHJvZ3Jlc3NfeGFj dCgKKwluYW1lICAgICAgICAgID0+ICdYYWN0TG9ja1RhYmxlV2FpdCBpbmRleCBzY2FuIERFTEVU RScsCisJZG1sICAgICAgICAgICA9PiAiREVMRVRFIEZST00gdGVzdF90YWIgV0hFUkUgYSA9IDI7 IiwKKwl2ZXJpZnlfcXVlcnkgID0+ICJTRUxFQ1QgY291bnQoKikgRlJPTSB0ZXN0X3RhYiBXSEVS RSBhID0gMjsiLAorCXZlcmlmeV9yZXN1bHQgPT4gJzAnLAorKTsKKworIyBTZXEgc2NhbiAoUkVQ TElDQSBJREVOVElUWSBGVUxMKTogcHVibGlzaGVyIFVQREFURSB3aXRoIGluLXByb2dyZXNzCisj IHN1YnNjcmliZXIgdHJhbnNhY3Rpb24uCit0ZXN0X3JldHJ5X3dpdGhfaW5fcHJvZ3Jlc3NfeGFj dCgKKwluYW1lICAgICAgICAgID0+ICdYYWN0TG9ja1RhYmxlV2FpdCBzZXEgc2NhbiBVUERBVEUn LAorCWRtbCAgICAgICAgICAgPT4gIlVQREFURSB0ZXN0X3RhYl9mdWxsIFNFVCBjID0gJ2Zvb191 JyBXSEVSRSBhID0gMTsiLAorCXZlcmlmeV9xdWVyeSAgPT4gIlNFTEVDVCBjIEZST00gdGVzdF90 YWJfZnVsbCBXSEVSRSBhID0gMTsiLAorCXZlcmlmeV9yZXN1bHQgPT4gJ2Zvb191JywKKyk7CisK KyMgU2VxIHNjYW4gKFJFUExJQ0EgSURFTlRJVFkgRlVMTCk6IHB1Ymxpc2hlciBERUxFVEUgd2l0 aCBpbi1wcm9ncmVzcworIyBzdWJzY3JpYmVyIHRyYW5zYWN0aW9uLgordGVzdF9yZXRyeV93aXRo X2luX3Byb2dyZXNzX3hhY3QoCisJbmFtZSAgICAgICAgICA9PiAnWGFjdExvY2tUYWJsZVdhaXQg c2VxIHNjYW4gREVMRVRFJywKKwlkbWwgICAgICAgICAgID0+ICJERUxFVEUgRlJPTSB0ZXN0X3Rh Yl9mdWxsIFdIRVJFIGEgPSAyOyIsCisJdmVyaWZ5X3F1ZXJ5ICA9PiAiU0VMRUNUIGNvdW50KCop IEZST00gdGVzdF90YWJfZnVsbCBXSEVSRSBhID0gMjsiLAorCXZlcmlmeV9yZXN1bHQgPT4gJzAn LAorKTsKKworJHN1Yl9zZXNzaW9uLT5xdWl0OworCisjIFRlc3QgdGhlIGFwcGx5IHdvcmtlciBy ZXRyeSB3aGVuIHRhYmxlX3R1cGxlX2xvY2sgZGV0ZWN0cyBhIGNvbmN1cnJlbnRseQorIyB1cGRh dGVkIG9yIGRlbGV0ZWQgdHVwbGUgKFRNX1VwZGF0ZWQgLyBUTV9EZWxldGVkKS4gQW4gaW5qZWN0 aW9uIHBvaW50IHBhdXNlcworIyB0aGUgd29ya2VyIGJldHdlZW4gZmluZGluZyB0aGUgdHVwbGUg YW5kIGxvY2tpbmcgaXQsIGFsbG93aW5nIGNvbmN1cnJlbnQgRE1MCisjIHRvIGludGVydmVuZS4K Kworc3ViIHRlc3RfcmV0cnlfd2l0aF9jb25jdXJyZW50X2RtbF9iZWZvcmVfdHVwbGVfbG9jawor eworCW15ICglYXJncykgPSBAXzsKKwlteSAkdGVzdF9uYW1lICAgICA9ICRhcmdze25hbWV9Owor CW15ICRpbmpfcG9pbnQgICAgID0gJGFyZ3N7aW5qX3BvaW50fTsKKwlteSAkZG1sICAgICAgICAg ICA9ICRhcmdze2RtbH07CisJbXkgJGV4cGVjdGVkX2xvZyAgPSAkYXJnc3tleHBlY3RlZF9sb2d9 OworCW15ICR2ZXJpZnlfcXVlcnkgID0gJGFyZ3N7dmVyaWZ5X3F1ZXJ5fTsKKwlteSAkdmVyaWZ5 X3Jlc3VsdCA9ICRhcmdze3ZlcmlmeV9yZXN1bHR9OworCisJJG5vZGVfc3Vic2NyaWJlci0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsCisJCSJTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c19hdHRhY2goJyRp bmpfcG9pbnQnLCAnd2FpdCcpOyIpOworCisJIyBSdW4gRE1MIG9uIHRoZSBwdWJsaXNoZXIuCisJ JG5vZGVfcHVibGlzaGVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJGRtbCk7CisKKwkkbm9kZV9z dWJzY3JpYmVyLT53YWl0X2Zvcl9ldmVudCgnbG9naWNhbCByZXBsaWNhdGlvbiBhcHBseSB3b3Jr ZXInLAorCQkkaW5qX3BvaW50KTsKKworCSMgUnVuIERNTCBvbiB0aGUgc3Vic2NyaWJlci4KKwkk bm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJGRtbCk7CisKKwlteSAkbG9n X29mZnNldCA9IC1zICRub2RlX3N1YnNjcmliZXItPmxvZ2ZpbGU7CisKKwkjIERldGFjaCBiZWZv cmUgd2FrZXVwIHNvIHRoZSByZXRyeSBkb2Vzbid0IGhpdCB0aGUgc2FtZSBpbmplY3Rpb24gcG9p bnQuCisJJG5vZGVfc3Vic2NyaWJlci0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJCSJTRUxFQ1Qg aW5qZWN0aW9uX3BvaW50c19kZXRhY2goJyRpbmpfcG9pbnQnKTsKKwkJIFNFTEVDVCBpbmplY3Rp b25fcG9pbnRzX3dha2V1cCgnJGlual9wb2ludCcpOyIpOworCisJJG5vZGVfc3Vic2NyaWJlci0+ d2FpdF9mb3JfbG9nKCRleHBlY3RlZF9sb2csICRsb2dfb2Zmc2V0KTsKKwlwYXNzKCIkdGVzdF9u YW1lOiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkZXRlY3RlZCBhbmQgcmV0cmllZCIpOworCisJ JG5vZGVfcHVibGlzaGVyLT53YWl0X2Zvcl9jYXRjaHVwKCRhcHBuYW1lKTsKKworCW15ICRyZXN1 bHQgPSAkbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJHZlcmlmeV9xdWVy eSk7CisJaXMoJHJlc3VsdCwgJHZlcmlmeV9yZXN1bHQsICIkdGVzdF9uYW1lOiBkYXRhIGNvcnJl Y3QgYWZ0ZXIgcmV0cnkiKTsKK30KKworIyBDaGVjayB3aGV0aGVyIGluamVjdGlvbl9wb2ludHMg ZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgc3Vic2NyaWJlci4KK215ICRpbmplY3Rpb25f cG9pbnRzX3N1cHBvcnRlZCA9CisJJG5vZGVfc3Vic2NyaWJlci0+Y2hlY2tfZXh0ZW5zaW9uKCdp bmplY3Rpb25fcG9pbnRzJyk7CisKK2lmICgkaW5qZWN0aW9uX3BvaW50c19zdXBwb3J0ZWQgIT0g MCkKK3sKKwkkbm9kZV9zdWJzY3JpYmVyLT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywK KwkJInNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyA9ICdpbmplY3Rpb25fcG9pbnRzJyIpOworCSRu b2RlX3N1YnNjcmliZXItPnJlc3RhcnQ7CisKKwkkbm9kZV9zdWJzY3JpYmVyLT5zYWZlX3BzcWwo J3Bvc3RncmVzJywKKwkJIkNSRUFURSBFWFRFTlNJT04gaW5qZWN0aW9uX3BvaW50czsiKTsKKwor CSMgVE1fVXBkYXRlZCB2aWEgaW5kZXggc2NhbiAoUEspLgorCXRlc3RfcmV0cnlfd2l0aF9jb25j dXJyZW50X2RtbF9iZWZvcmVfdHVwbGVfbG9jaygKKwkJbmFtZSAgICAgICAgICA9PiAnaW5kZXgg c2NhbiBUTV9VcGRhdGVkJywKKwkJaW5qX3BvaW50ICAgICA9PiAnZmluZC1yZXBsLXR1cGxlLWJ5 LWluZGV4LWJlZm9yZS1sb2NrJywKKwkJZG1sICAgICAgICAgICA9PiAiVVBEQVRFIHRlc3RfdGFi IFNFVCBjID0gJ2Jhel91JyBXSEVSRSBhID0gMzsiLAorCQlleHBlY3RlZF9sb2cgID0+IHFyL2Nv bmN1cnJlbnQgdXBkYXRlLCByZXRyeWluZy8sCisJCXZlcmlmeV9xdWVyeSAgPT4gIlNFTEVDVCBj IEZST00gdGVzdF90YWIgV0hFUkUgYSA9IDM7IiwKKwkJdmVyaWZ5X3Jlc3VsdCA9PiAnYmF6X3Un LAorCSk7CisKKwkjIFRNX0RlbGV0ZWQgdmlhIGluZGV4IHNjYW4gKFBLKS4KKwl0ZXN0X3JldHJ5 X3dpdGhfY29uY3VycmVudF9kbWxfYmVmb3JlX3R1cGxlX2xvY2soCisJCW5hbWUgICAgICAgICAg PT4gJ2luZGV4IHNjYW4gVE1fRGVsZXRlZCcsCisJCWlual9wb2ludCAgICAgPT4gJ2ZpbmQtcmVw bC10dXBsZS1ieS1pbmRleC1iZWZvcmUtbG9jaycsCisJCWRtbCAgICAgICAgICAgPT4gIkRFTEVU RSBGUk9NIHRlc3RfdGFiIFdIRVJFIGEgPSA0OyIsCisJCWV4cGVjdGVkX2xvZyAgPT4gcXIvY29u Y3VycmVudCBkZWxldGUsIHJldHJ5aW5nLywKKwkJdmVyaWZ5X3F1ZXJ5ICA9PiAiU0VMRUNUIGNv dW50KCopIEZST00gdGVzdF90YWIgV0hFUkUgYSA9IDQ7IiwKKwkJdmVyaWZ5X3Jlc3VsdCA9PiAn MCcsCisJKTsKKworCSMgVE1fVXBkYXRlZCB2aWEgc2VxIHNjYW4gKFJFUExJQ0EgSURFTlRJVFkg RlVMTCkuCisJdGVzdF9yZXRyeV93aXRoX2NvbmN1cnJlbnRfZG1sX2JlZm9yZV90dXBsZV9sb2Nr KAorCQluYW1lICAgICAgICAgID0+ICdzZXEgc2NhbiBUTV9VcGRhdGVkJywKKwkJaW5qX3BvaW50 ICAgICA9PiAnZmluZC1yZXBsLXR1cGxlLXNlcS1iZWZvcmUtbG9jaycsCisJCWRtbCAgICAgICAg ICAgPT4gIlVQREFURSB0ZXN0X3RhYl9mdWxsIFNFVCBjID0gJ2Jhel91JyBXSEVSRSBhID0gMzsi LAorCQlleHBlY3RlZF9sb2cgID0+IHFyL2NvbmN1cnJlbnQgdXBkYXRlLCByZXRyeWluZy8sCisJ CXZlcmlmeV9xdWVyeSAgPT4gIlNFTEVDVCBjIEZST00gdGVzdF90YWJfZnVsbCBXSEVSRSBhID0g MzsiLAorCQl2ZXJpZnlfcmVzdWx0ID0+ICdiYXpfdScsCisJKTsKKworCSMgVE1fRGVsZXRlZCB2 aWEgc2VxIHNjYW4gKFJFUExJQ0EgSURFTlRJVFkgRlVMTCkuCisJdGVzdF9yZXRyeV93aXRoX2Nv bmN1cnJlbnRfZG1sX2JlZm9yZV90dXBsZV9sb2NrKAorCQluYW1lICAgICAgICAgID0+ICdzZXEg c2NhbiBUTV9EZWxldGVkJywKKwkJaW5qX3BvaW50ICAgICA9PiAnZmluZC1yZXBsLXR1cGxlLXNl cS1iZWZvcmUtbG9jaycsCisJCWRtbCAgICAgICAgICAgPT4gIkRFTEVURSBGUk9NIHRlc3RfdGFi X2Z1bGwgV0hFUkUgYSA9IDQ7IiwKKwkJZXhwZWN0ZWRfbG9nICA9PiBxci9jb25jdXJyZW50IGRl bGV0ZSwgcmV0cnlpbmcvLAorCQl2ZXJpZnlfcXVlcnkgID0+ICJTRUxFQ1QgY291bnQoKikgRlJP TSB0ZXN0X3RhYl9mdWxsIFdIRVJFIGEgPSA0OyIsCisJCXZlcmlmeV9yZXN1bHQgPT4gJzAnLAor CSk7Cit9CisKK2RvbmVfdGVzdGluZygpOwotLSAKMi40Ny4zCgo= --00000000000087be4806508f85e3--