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 1w1bZd-000RaY-0r for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Mar 2026 02:51:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w1bZc-003Lz0-0b for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Mar 2026 02:51:24 +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 1w1bZb-003Lys-1f for pgsql-hackers@lists.postgresql.org; Sun, 15 Mar 2026 02:51:24 +0000 Received: from mail-ej1-x633.google.com ([2a00:1450:4864:20::633]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w1bZY-00000000Bga-1POA for pgsql-hackers@lists.postgresql.org; Sun, 15 Mar 2026 02:51:23 +0000 Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-b8d7f22d405so437485266b.0 for ; Sat, 14 Mar 2026 19:51:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773543078; cv=none; d=google.com; s=arc-20240605; b=evwrGGyl4JmaLLbTe9GjI1518fKA/OC4/uRpvNMVCNVdvtOV51oZcdGTjgbl0eOtRh 6fGErYiqWcTdxvbg/L3HJPeDgAMPH7b9c9nZsjVom1BSKQVZ89YhMK2bvRYAR+hfuOML 4SGNHRevgldjTT1/bv8tLaXAAibvur3FCF/4FDW0rlw5cyRXdIB9HqjXhQnho83d9p5q s8F/tWFifWwPlyMY9Q4+eQDcaGFWYhtQQFntZdCw4gQPgeJjHb3vu3+/jit/S8b7+id2 19zMss6V2t7tLCUsm9ysFXFkUaHASpdaGjckneP+y+AwaN1O4YeBs2307eS10yvCHrvI 8Xkw== 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=QZ5V+QrLEm9GZPFD8mdoGIA2igx/opb4X7HVt7Q0/+A=; fh=12Pk/O6rPSHEAzj4q9bF/fswQzVrpFCUjkeXsKuoLtc=; b=ImfJrlevsVQ0Q3U8/BWjMGQrPJi70cEMO+dSzMzuOebYn/HW40DPyASb6QotugrY+E wMjQr+ptpeRR1wbQp0t9W/ob170TvefouhyFtuRGSE+Ch7jsFolbTmZlpFeQAAwZemUV ZUsYSetf9DIdxi9/h9ekXfDzluT1beP7gUEVJp5xod70bVtUOQTqzcTWGFJzvQEWMyO1 L02xMjvZqdHHTOS13ozcYvu6NuJJKiWpIzKxNHvlX5fQouPstKZHvWqdmCCpzfVEprUF Am2U5PHzw4ME3RUWC6D3314NzOqVjhEtPi+lK0Rm5Qd2A9lXskvvIzNrccUEmsk0pwES Jhlg==; 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=20230601; t=1773543078; x=1774147878; 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=QZ5V+QrLEm9GZPFD8mdoGIA2igx/opb4X7HVt7Q0/+A=; b=TtQaBxLSd5W/Lh+NM3X1R58OVeOLPJMg0pKuWgpn1y4DpnOTFYJkh3P+0ynjMkvobS ukTLy5uc3+Dq1GeHD3nVaKcMfwXHUKgw+LrAbw4sL6jXoU/ZWDnPj95zHgqiao7qrTaW Tah9uuxP5xfb1EUGP3rXJpmGIOl11ZBzr+bsDE7rHTpCdzew9oAAfrFF2PQkcLd4Rgy7 VQyX99tKv9yLljrL039xpKmGAZMcW7VOXEqFQcYQgBrUGyDUG5pnJdRDlrnQGzyJufFC mhtlEzwqt3wOvFykUL+LY9cLT9RvRVnIWNX0n6Q9SQV9n5oORNUmPKBzCTGQDar8IaWx kDvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773543078; x=1774147878; 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=QZ5V+QrLEm9GZPFD8mdoGIA2igx/opb4X7HVt7Q0/+A=; b=dd06av1PqQsx12vP8HNT99Ya76cjiqilqyxdjhQL2ssq8/BLIBA0Q0s5NNW8Ybs2aw BvIOEXuiXD+MOTp7fDgtN8Cs6wqLyCmoXaUqrEhaLJwx1u6TFx1lcK7Ep15/DLIlzcZ+ /6G4uiFHLhwEQA3On0eIOaf5FdMyYnMvDeQmkYFqxnmd3kkntYbXsrffuawM7lZc4DSN d0O9lDTNOO6I1r839+a/rvNroLuYm55jjkNGsWizVkhJ5db+jKAunh9HY2LQXs0Reiid QLHGY/loxdr34214bKNxyweLusifPT+1O1K10UbsSZ0pbFtBnb0X62IpACyyA7e+3uqR 9EtQ== X-Forwarded-Encrypted: i=1; AJvYcCUuKH/Yt+0fHroNZGbqtvim9unkd0GKRA+tz0eZ4w3QKwx+GnoodTjWyQaAB7tD5JbxXOvpWRefMxRlic34@lists.postgresql.org X-Gm-Message-State: AOJu0YxFtXXqohxm9KAKQ3NwrUHlBcJD7Bhy2zdYWQqZG95089jclyyd Ec1gjT4G8ADEU7h61BqXV75db48F/LqcecHAtba+rdPRAIwBiNcMVC7Zp2Bdl/tn5P5gqFuYzDN l+42kc8NQbbtudcUSvi1SnWsobNGRQlQ= X-Gm-Gg: ATEYQzwZz0BoS2B0AZOX33RNWB4N9UpPfMwOszKu0+mGPtu1QgJxLRrm2zH/zbHCZF7 trUBceWpXDqunEPBpbPWXdVB5rFs5SbYSpsG9o0xnOgUWozwSHQJw5uLY1sdpy5pOCqCuGn3xTW gWmtCkIjHCNbuclFjIl/zuKrJM/DHylsiz8AABEYLGLQlX56gcbMVBevOLEYJKzCngL0Arg3z1n NbjrvSdcNgbjmHkRxNcPXM4al5K4BMrf/JGW1nGnkyc30pnECifHkLVF1OnOyO74H6sYpr3XTih Mc78jzNRxePwHc7OWwsMAZ3RQ4dItFAiHOqHQiNMgHSlb/GVjugcdoEaGrEXb2VWuRE7lR9tsbq BZP1DT/M= X-Received: by 2002:a17:906:ef03:b0:b95:2b77:75b6 with SMTP id a640c23a62f3a-b97650e5d91mr488333966b.19.1773543077678; Sat, 14 Mar 2026 19:51:17 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Xuneng Zhou Date: Sun, 15 Mar 2026 10:51:05 +0800 X-Gm-Features: AaiRm5234IJQy_4vpgRurq_Oce3-9Yd0hJTqk18xQi60gCpc9EpkTZOBwe83mWM Message-ID: Subject: Re: Streamify more code paths To: Michael Paquier Cc: Andres Freund , pgsql-hackers , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="00000000000023e940064d072dcc" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000023e940064d072dcc Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Mar 14, 2026 at 5:56=E2=80=AFPM Michael Paquier wrote: > > On Fri, Mar 13, 2026 at 10:39:52AM +0800, Xuneng Zhou wrote: > > Thanks for fixing this and for taking the time to review and test > > the patches. > > Looking at the rest, I have produced some numbers: > pgstattuple_small (20k tuples, io_uring) base=3D 60839.9ms > patch=3D10949.9ms 5.56x ( 82.0%) (reads=3D4139->260, > io_time=3D49616.97->55.25ms) > pgstattuple_small (20k tuples, worker=3D3) base=3D 60577.5ms > patch=3D11470.0ms 5.28x ( 81.1%) (reads=3D4139->260, > io_time=3D49359.79->69.60ms) > hash_vacuum (1M tuples, io_uring) base=3D199929.0ms patch=3D161747.0ms > 1.24x ( 19.1%) (reads=3D4665->1615, io_time=3D47084.8->9925.77ms) > hash_vacuum (1M tuples, worker=3D12) base=3D203417.0ms patch=3D161687.0ms > 1.26x ( 20.5%) (reads=3D4665->1615, io_time=3D48356.3->9917.24ms) > > The hash vacuum numbers are less amazing here than yours. Trying out > various configurations does not change the results much (I was puzzled > for a couple of hours that I did not see any performance impact but > forgot the eviction of the index pages from the shared buffers, that > influences the numbers to what I have here), but I'll take it anyway. My guess is that the results are influenced by the write delay. Vacuum operations can be write-intensive, so when both read and write delays are set to 2 ~ 5 ms, a large portion of the runtime may be spent on writes. According to Amdahl=E2=80=99s Law, the overall performance improvem= ent from optimizing a single component is limited by the fraction of time that component actually contributes to the total execution time. In this case, the potential rate of speedup from streaming the read path could be masked by the time spent performing writes. To investigate this, I added a new option, write-delay. When it is set to zero, the benchmark simulates a system with a fast write device and a slow read device, reducing the proportion of time spent on writes. Admittedly, this setup is somewhat artificial=E2=80=94we would not normally expect such a large discrepancy between read and write performance in real systems. -- worker 12, write-delay 2 ms hash_vacuum_medium base=3D 33743.2ms patch=3D 27371.3ms 1.23x ( 18.9%) (reads=3D4662=E2=86=921612, read_time=3D8242.51=E2=86=921725.03ms= , writes=3D12689=E2=86=9212651, write_time=3D25144.87=E2=86=9225041.75ms) -- worker 12, write-delay 0 ms hash_vacuum_medium base=3D 8601.1ms patch=3D 2234.0ms 3.85x ( 74.0%) (reads=3D4662=E2=86=921612, read_time=3D8021.65=E2=86=921637.87ms= , writes=3D12689=E2=86=9212651, write_time=3D337.38=E2=86=92288.15ms) To better understand the behavior, the latest version of the script separates the I/O time into read time and write time. This allows us to directly observe their respective contributions and how they change across runs. A further improvement would be to report the speedup for the read and write components separately, making it easier to understand where and how much the performance gains actually occur. > One thing that I was wondering for the pgstattuple patch is if we > should have "scanned" put outside the private data of the callback as > we get back to the main loop once we know that the page is not > all-visible, so we could increment the counter in the main loop > instead of the callback. Now I get that you have done that as it > feels cleaner for the "default" return path of the callback, while the > logic remains the same, so I have kept it as-is at the end, tweaked a > few things, and applied this one. Thanks for the review and for applying it. My reasoning for putting scanned inside the callback was to keep all per-block accounting in one place =E2=80=94 the callback is already the point where the skip-vs-rea= d decision is made, so it seemed natural to count reads there as well. But I agree the main loop would also be a clean spot for it. > I have not been able to review yet the patch for the hash VACUUM > proposal, which would be the last one. > -- > Michael --=20 Best, Xuneng --00000000000023e940064d072dcc Content-Type: text/x-sh; charset="UTF-8"; name="run_streaming_benchmark.sh" Content-Disposition: attachment; filename="run_streaming_benchmark.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmr5fmnl0 IyEvdXNyL2Jpbi9lbnYgYmFzaApzZXQgLWV1byBwaXBlZmFpbAoKIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwojIFN0cmVhbWluZyBSZWFkIFBhdGNoZXMgQmVuY2htYXJrCiMKIyBVc2FnZTogLi9ydW5f c3RyZWFtaW5nX2JlbmNoLnNoIFtPUFRJT05TXSA8cGF0Y2g+CiMKIyBPcHRpb25zOgojICAgLS1j bGVhbiAgICAgICAgICAgUmVtb3ZlIGV4aXN0aW5nIGJ1aWxkcyBhbmQgc3RhcnQgZnJlc2gKIyAg IC0tYmFzZWxpbmUgICAgICAgIEFsc28gYnVpbGQgYW5kIHRlc3QgdmFuaWxsYSBQb3N0Z3JlU1FM IGZvciBjb21wYXJpc29uCiMgICAtLXRlc3QgVEVTVCAgICAgICBSdW4gc3BlY2lmaWMgdGVzdCAo Ymxvb21fc2NhbiwgYmxvb21fdmFjdXVtLCBwZ3N0YXR0dXBsZSwKIyAgICAgICAgICAgICAgICAg ICAgIHBnc3RhdGluZGV4LCBnaW5fdmFjdXVtLCB3YWxfbG9nZ2luZywgaGFzaF92YWN1dW0sIG9y ICJhbGwiKQojICAgLS1pby1tZXRob2QgTU9ERSAgSS9PIG1ldGhvZDogaW9fdXJpbmcsIHdvcmtl ciwgb3Igc3luYyAoZGVmYXVsdDogaW9fdXJpbmcpCiMgICAtLWlvLXdvcmtlcnMgTiAgICBOdW1i ZXIgb2YgSS9PIHdvcmtlcnMgZm9yIHdvcmtlciBtb2RlIChkZWZhdWx0OiAzKQojICAgLS1pby1j b25jdXJyZW5jeSBOICBNYXggY29uY3VycmVudCBJL09zIHBlciBwcm9jZXNzIChkZWZhdWx0OiA2 NCkKIyAgIC0tZGlyZWN0LWlvICAgICAgICAgRW5hYmxlIGRpcmVjdCBJTyAoZGVidWdfaW9fZGly ZWN0PWRhdGEpLCBieXBhc3NlcyBPUyBwYWdlIGNhY2hlCiMgICAtLXJlYWQtZGVsYXkgTVMgICAg IFNpbXVsYXRlIHJlYWQgbGF0ZW5jeSB2aWEgZG1fZGVsYXkgKHJlcXVpcmVzIHByZS1jcmVhdGVk IGRldmljZSkKIyAgIC0td3JpdGUtZGVsYXkgTVMgICAgU2ltdWxhdGUgd3JpdGUgbGF0ZW5jeSB2 aWEgZG1fZGVsYXkgKGRlZmF1bHQ6IDAsIHJlcXVpcmVzIC0tcmVhZC1kZWxheSkKIyAgIC0tcHJv ZmlsZSAgICAgICAgICAgRW5hYmxlIHBlcmYgcHJvZmlsaW5nIGFuZCBmbGFtZWdyYXBoIGdlbmVy YXRpb24KIwojIEVudmlyb25tZW50OgojICAgV09SS1JPT1QgICAgICAgQmFzZSBkaXJlY3Rvcnkg KGRlZmF1bHQ6ICRIT01FL3BnX2JlbmNoKQojICAgUkVQUyAgICAgICAgICAgUmVwZXRpdGlvbnMg cGVyIHRlc3QgKGRlZmF1bHQ6IDUpCiMgICBTSVpFUyAgICAgICAgICBUYWJsZSBzaXplcyB0byB0 ZXN0IChkZWZhdWx0OiAibGFyZ2UiKQojICAgRkxBTUVHUkFQSF9ESVIgUGF0aCB0byBGbGFtZUdy YXBoIHRvb2xzIChkZWZhdWx0OiAkSE9NRS9GbGFtZUdyYXBoKQojICAgRE1fREVMQVlfREVWICAg ZG1fZGVsYXkgZGV2aWNlIG5hbWUgZm9yIC0tcmVhZC1kZWxheSAoZGVmYXVsdDogImRlbGF5ZWQi KQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpsb2coKSB7IHByaW50ZiAnXDAzM1sxOzM0bT09Plww MzNbMG0gJXNcbicgIiQqIjsgfQpkaWUoKSB7IHByaW50ZiAnXDAzM1sxOzMxbUVSUk9SOlwwMzNb MG0gJXNcbicgIiQqIiA+JjI7IGV4aXQgMTsgfQoKIyAtLS0gQ0xJIHBhcnNpbmcgLS0tCkNMRUFO PTAKQkFTRUxJTkU9MApET19QUk9GSUxFPTAKRElSRUNUX0lPPTAKSU9fREVMQVlfTVM9IiIKV1JJ VEVfREVMQVlfTVM9IjAiClRFU1Q9ImFsbCIKSU9fTUVUSE9EPSIke0lPX01FVEhPRDotaW9fdXJp bmd9IgpJT19XT1JLRVJTPSIke0lPX1dPUktFUlM6LTN9IgpJT19NQVhfQ09OQ1VSUkVOQ1k9IiR7 SU9fTUFYX0NPTkNVUlJFTkNZOi02NH0iCkRNX0RFTEFZX0RFVj0iJHtETV9ERUxBWV9ERVY6LWRl bGF5ZWR9IgpQQVRDSD0iIgoKd2hpbGUgW1sgJCMgLWd0IDAgXV07IGRvCiAgY2FzZSAiJDEiIGlu CiAgICAtLWNsZWFuKSAgICAgICAgICBDTEVBTj0xIDs7CiAgICAtLWJhc2VsaW5lKSAgICAgICBC QVNFTElORT0xIDs7CiAgICAtLXByb2ZpbGUpICAgICAgICBET19QUk9GSUxFPTEgOzsKICAgIC0t ZGlyZWN0LWlvKSAgICAgIERJUkVDVF9JTz0xIDs7CiAgICAtLXJlYWQtZGVsYXkpICAgICBJT19E RUxBWV9NUz0iJDIiOyBzaGlmdCA7OwogICAgLS13cml0ZS1kZWxheSkgICAgV1JJVEVfREVMQVlf TVM9IiQyIjsgc2hpZnQgOzsKICAgIC0tdGVzdCkgICAgICAgICAgIFRFU1Q9IiQyIjsgc2hpZnQg OzsKICAgIC0taW8tbWV0aG9kKSAgICAgIElPX01FVEhPRD0iJDIiOyBzaGlmdCA7OwogICAgLS1p by13b3JrZXJzKSAgICAgSU9fV09SS0VSUz0iJDIiOyBzaGlmdCA7OwogICAgLS1pby1jb25jdXJy ZW5jeSkgSU9fTUFYX0NPTkNVUlJFTkNZPSIkMiI7IHNoaWZ0IDs7CiAgICAtaHwtLWhlbHApICAg ICAgICBzZWQgLW4gJzMsMjdwJyAiJDAiIHwgc2VkICdzL14jIFw/Ly8nOyBleGl0IDAgOzsKICAg IC0qKSAgICAgICAgICAgICAgIGRpZSAiVW5rbm93biBvcHRpb246ICQxIiA7OwogICAgKikgICAg ICAgICAgICAgICAgUEFUQ0g9IiQxIiA7OwogIGVzYWMKICBzaGlmdApkb25lCgojIFZhbGlkYXRl IGlvX21ldGhvZApjYXNlICIkSU9fTUVUSE9EIiBpbgogIGlvX3VyaW5nfHdvcmtlcnxzeW5jKSA7 OwogICopIGRpZSAiSW52YWxpZCAtLWlvLW1ldGhvZDogJElPX01FVEhPRCAobXVzdCBiZSBpb191 cmluZywgd29ya2VyLCBvciBzeW5jKSIgOzsKZXNhYwoKIyBWYWxpZGF0ZSBkbV9kZWxheSBkZXZp Y2UgaWYgLS1yZWFkLWRlbGF5IGlzIHVzZWQKaWYgW1sgLW4gIiRJT19ERUxBWV9NUyIgXV07IHRo ZW4KICBjb21tYW5kIC12IGRtc2V0dXAgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiLS1yZWFkLWRl bGF5IHJlcXVpcmVzIGRtc2V0dXAgKHN1ZG8gYXB0IGluc3RhbGwgZG1zZXR1cCkiCiAgc3VkbyBk bXNldHVwIHN0YXR1cyAiJERNX0RFTEFZX0RFViIgPi9kZXYvbnVsbCAyPiYxIFwKICAgIHx8IGRp ZSAiZG1fZGVsYXkgZGV2aWNlICckRE1fREVMQVlfREVWJyBub3QgZm91bmQuIENyZWF0ZSBpdCBm aXJzdCwgZS5nLjpcbiAgdW1vdW50IC9zcnYgJiYgZG1zZXR1cCBjcmVhdGUgJERNX0RFTEFZX0RF ViAtLXRhYmxlIFwiMCBcJChibG9ja2RldiAtLWdldHN6IC9kZXYvREVWSUNFKSBkZWxheSAvZGV2 L0RFVklDRSAwICRJT19ERUxBWV9NU1wiICYmIG1vdW50IC9kZXYvbWFwcGVyLyRETV9ERUxBWV9E RVYgL3Nydi8iCmZpCgpbWyAteiAiJFBBVENIIiBdXSAmJiBkaWUgIlVzYWdlOiAkMCBbLS1jbGVh bl0gWy0tYmFzZWxpbmVdIFstLXRlc3QgVEVTVF0gPHBhdGNoPiIKW1sgISAtZiAiJFBBVENIIiBd XSAmJiBkaWUgIlBhdGNoIG5vdCBmb3VuZDogJFBBVENIIgpbWyAiJFBBVENIIiAhPSAvKiBdXSAm JiBQQVRDSD0iJFBXRC8kUEFUQ0giCgojIC0tLSBQcm9maWxpbmcgdmFsaWRhdGlvbiAtLS0KRkxB TUVHUkFQSF9ESVI9IiR7RkxBTUVHUkFQSF9ESVI6LSRIT01FL0ZsYW1lR3JhcGh9IgpQRVJGX1NV RE89IiR7UEVSRl9TVURPOi1zdWRvfSIKUEVSRl9FVkVOVD0iJHtQRVJGX0VWRU5UOi1jeWNsZXN9 IiAgIyBjeWNsZXMgPSB1c2VyK2tlcm5lbDsgY3ljbGVzOnUgPSB1c2VyLW9ubHkKaWYgW1sgJERP X1BST0ZJTEUgLWVxIDEgXV07IHRoZW4KICBjb21tYW5kIC12IHBlcmYgPi9kZXYvbnVsbCAyPiYx IHx8IGRpZSAiTmVlZCBwZXJmIChzdWRvIGFwdCBpbnN0YWxsIGxpbnV4LXRvb2xzLSQodW5hbWUg LXIpKSIKICBbWyAteCAiJEZMQU1FR1JBUEhfRElSL3N0YWNrY29sbGFwc2UtcGVyZi5wbCIgXV0g fHwgZGllICJNaXNzaW5nICRGTEFNRUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBlcmYucGwgKGdp dCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYnJlbmRhbmdyZWdnL0ZsYW1lR3JhcGgpIgogIFtb IC14ICIkRkxBTUVHUkFQSF9ESVIvZmxhbWVncmFwaC5wbCIgXV0gfHwgZGllICJNaXNzaW5nICRG TEFNRUdSQVBIX0RJUi9mbGFtZWdyYXBoLnBsIgpmaQoKIyAtLS0gQ29uZmlndXJhdGlvbiAtLS0K V09SS1JPT1Q9IiR7V09SS1JPT1Q6LSRIT01FL3BnX2JlbmNofSIKUkVQUz0iJHtSRVBTOi01fSIK U0laRVM9IiR7U0laRVM6LWxhcmdlfSIKClJPT1RfQkFTRT0iJFdPUktST09UL3ZhbmlsbGEiClBB VENIX1RBRz0kKGJhc2VuYW1lICIkUEFUQ0giIC5wYXRjaCB8IHRyIC1kYyAnWzphbG51bTpdXy0n IHwgY3V0IC1jMS00MCkKUk9PVF9QQVRDSD0iJFdPUktST09ULyRQQVRDSF9UQUciCgojIC0tLSBI ZWxwZXJzIC0tLQpwZygpIHsgZWNobyAiJDEvcGcvYmluLyQyIjsgfQoKcGlja19wb3J0KCkgewog IGZvciBwIGluICQoc2VxICIkezE6LTU0MzJ9IiA2MDAwMCk7IGRvCiAgICBsc29mIC1pVENQOiIk cCIgLXNUQ1A6TElTVEVOID4vZGV2L251bGwgMj4mMSB8fCB7IGVjaG8gIiRwIjsgcmV0dXJuOyB9 CiAgZG9uZQogIGRpZSAiTm8gZnJlZSBwb3J0IGZvdW5kIgp9CgpzZXRfaW9fZGVsYXkoKSB7CiAg bG9jYWwgbXM9IiQxIgogIFtbIC16ICIkSU9fREVMQVlfTVMiIF1dICYmIHJldHVybgogIGxvY2Fs IHRhYmxlIHNpemUgZGV2CiAgdGFibGU9JChzdWRvIGRtc2V0dXAgdGFibGUgIiRETV9ERUxBWV9E RVYiKQogIHNpemU9JChlY2hvICIkdGFibGUiIHwgYXdrICd7cHJpbnQgJDJ9JykKICBkZXY9JChl Y2hvICIkdGFibGUiIHwgYXdrICd7cHJpbnQgJDR9JykKICBsb2cgIlNldHRpbmcgZG1fZGVsYXkg b24gJERNX0RFTEFZX0RFViB0byAke21zfW1zIHJlYWQgLyAke1dSSVRFX0RFTEFZX01TfW1zIHdy aXRlIgogIHN1ZG8gZG1zZXR1cCBzdXNwZW5kICIkRE1fREVMQVlfREVWIgogIHN1ZG8gZG1zZXR1 cCByZWxvYWQgIiRETV9ERUxBWV9ERVYiIC0tdGFibGUgIjAgJHNpemUgZGVsYXkgJGRldiAwICRt cyAkZGV2IDAgJFdSSVRFX0RFTEFZX01TIgogIHN1ZG8gZG1zZXR1cCByZXN1bWUgIiRETV9ERUxB WV9ERVYiCn0KCiMgLS0tIEJ1aWxkIFBvc3RncmVTUUwgLS0tCmJ1aWxkX3BnKCkgewogIGxvY2Fs IFJPT1Q9IiQxIiBQQVRDSF9GSUxFPSIkezI6LX0iCiAgCiAgW1sgJENMRUFOIC1lcSAxIF1dICYm IHJtIC1yZiAiJFJPT1QiCiAgCiAgaWYgW1sgISAteCAiJChwZyAiJFJPT1QiIGluaXRkYikiIF1d OyB0aGVuCiAgICBsb2cgIkJ1aWxkaW5nIFBvc3RncmVTUUw6ICRST09UIgogICAgbWtkaXIgLXAg IiRST09UIgogICAgCiAgICBnaXQgY2xvbmUgLS1kZXB0aCAxIGh0dHBzOi8vZ2l0aHViLmNvbS9w b3N0Z3Jlcy9wb3N0Z3JlcyAiJFJPT1Qvc3JjIiAyPi9kZXYvbnVsbAogICAgY2QgIiRST09UL3Ny YyIKICAgIAogICAgW1sgLW4gIiRQQVRDSF9GSUxFIiBdXSAmJiB7IGxvZyAiQXBwbHlpbmcgcGF0 Y2giOyBnaXQgYXBwbHkgIiRQQVRDSF9GSUxFIjsgfQogICAgCiAgICAuL2NvbmZpZ3VyZSAtLXBy ZWZpeD0iJFJPT1QvcGciIC0td2l0aC1saWJ1cmluZyBcCiAgICAgIENGTEFHUz0nLU8yIC1nZ2Ri MyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcicgPi9kZXYvbnVsbCAyPiYxCiAgICAKICAgIG1ha2Ug LWoiJChucHJvYykiIGluc3RhbGwgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgbG9nICJSZXVz aW5nIGJ1aWxkOiAkUk9PVCIKICAgIGNkICIkUk9PVC9zcmMiCiAgZmkKICAKICAjIEFsd2F5cyBp bnN0YWxsIGNvbnRyaWJzIChpZGVtcG90ZW50LCBjYXRjaGVzIHJldXNlZCBidWlsZHMgbWlzc2lu ZyBuZXcgZXh0ZW5zaW9ucykKICBtYWtlIC1DIGNvbnRyaWIvYmxvb20gaW5zdGFsbCA+L2Rldi9u dWxsIDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdzdGF0dHVwbGUgaW5zdGFsbCA+L2Rldi9udWxs IDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdfYnVmZmVyY2FjaGUgaW5zdGFsbCA+L2Rldi9udWxs IDI+JjEKICBtYWtlIC1DIGNvbnRyaWIvcGdfcHJld2FybSBpbnN0YWxsID4vZGV2L251bGwgMj4m MQp9CgojIC0tLSBDbHVzdGVyIG1hbmFnZW1lbnQgLS0tCmluaXRfY2x1c3RlcigpIHsKICBsb2Nh bCBST09UPSIkMSIgUE9SVD0iJDIiCiAgCiAgcm0gLXJmICIkUk9PVC9kYXRhIgogICIkKHBnICIk Uk9PVCIgaW5pdGRiKSIgLUQgIiRST09UL2RhdGEiIC0tbm8tbG9jYWxlID4vZGV2L251bGwgMj4m MQogIAogIGNhdCA+PiAiJFJPT1QvZGF0YS9wb3N0Z3Jlc3FsLmNvbmYiIDw8RU9GCnBvcnQgPSAk UE9SVApsaXN0ZW5fYWRkcmVzc2VzID0gJzEyNy4wLjAuMScKc2hhcmVkX2J1ZmZlcnMgPSAnMzJH QicKZWZmZWN0aXZlX2lvX2NvbmN1cnJlbmN5ID0gMjAwCmlvX21ldGhvZCA9ICRJT19NRVRIT0QK aW9fd29ya2VycyA9ICRJT19XT1JLRVJTCmlvX21heF9jb25jdXJyZW5jeSA9ICRJT19NQVhfQ09O Q1VSUkVOQ1kKdHJhY2tfaW9fdGltaW5nID0gb24KdHJhY2tfd2FsX2lvX3RpbWluZyA9IG9uCnN5 bmNocm9ub3VzX2NvbW1pdCA9IG9uCmF1dG92YWN1dW0gPSBvZmYKY2hlY2twb2ludF90aW1lb3V0 ID0gMWgKbWF4X3dhbF9zaXplID0gMTBHQgptYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVy ID0gMApFT0YKICAKICBbWyAkRElSRUNUX0lPIC1lcSAxIF1dICYmIGVjaG8gImRlYnVnX2lvX2Rp cmVjdCA9IGRhdGEiID4+ICIkUk9PVC9kYXRhL3Bvc3RncmVzcWwuY29uZiIKICAKICAiJChwZyAi JFJPT1QiIHBnX2N0bCkiIC1EICIkUk9PVC9kYXRhIiAtbCAiJFJPT1Qvc2VydmVyLmxvZyIgc3Rh cnQgLXcgPi9kZXYvbnVsbAogIAogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiQ1JFQVRF IEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBnX2J1ZmZlcmNhY2hlOyIKICBwc3FsX3J1biAiJFJP T1QiICIkUE9SVCIgLWMgIkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ19wcmV3YXJt OyIKfQoKc3RvcF9jbHVzdGVyKCkgewogIGxvY2FsIFJPT1Q9IiQxIgogICIkKHBnICIkUk9PVCIg cGdfY3RsKSIgLUQgIiRST09UL2RhdGEiIHN0b3AgLW0gZmFzdCAyPi9kZXYvbnVsbCB8fCB0cnVl Cn0KCmRyb3BfY2FjaGVzKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIKICBzaGlmdCAy CiAgbG9jYWwgcmVscz0oIiRAIikKICAKICAjIEV2aWN0IHRhcmdldCByZWxhdGlvbnMgZnJvbSBz aGFyZWQgYnVmZmVycyAobm8gUEcgcmVzdGFydCBuZWVkZWQpCiAgZm9yIHJlbCBpbiAiJHtyZWxz W0BdfSI7IGRvCiAgICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlNFTEVDVCBwZ19idWZm ZXJjYWNoZV9ldmljdF9yZWxhdGlvbignJHtyZWx9Jzo6cmVnY2xhc3MpOyIgPi9kZXYvbnVsbAog IGRvbmUKICAKICAjIERyb3AgT1MgcGFnZSBjYWNoZSAoc2tpcCB3aXRoIGRpcmVjdCBJTyDigJQg bm8gcGFnZSBjYWNoZSBpbnZvbHZlZCkKICBpZiBbWyAkRElSRUNUX0lPIC1lcSAwIF1dOyB0aGVu CiAgICBzeW5jCiAgICBlY2hvIDMgfCBzdWRvIHRlZSAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMg Pi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDIKICBmaQp9Cgpwc3FsX3J1bigpIHsK ICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiCiAgc2hpZnQgMgogICIkKHBnICIkUk9PVCIgcHNx bCkiIC1oIDEyNy4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIC12IE9OX0VSUk9SX1NUT1A9 MSAtQXRxICIkQCIKfQoKIyAtLS0gVGltaW5nIC0tLQpydW5fdGltZWQoKSB7CiAgbG9jYWwgUk9P VD0iJDEiIFBPUlQ9IiQyIiBTUUw9IiQzIgogIGxvY2FsIG1zCiAgIyAtWDogaWdub3JlIC5wc3Fs cmMsIC12IE9OX0VSUk9SX1NUT1A9MTogZmFpbCBvbiBTUUwgZXJyb3JzCiAgIyBQYXJzZSBsYXN0 IFRpbWU6IGxpbmUsIGhhbmRsZSBib3RoICJtcyIgYW5kICJzIiB1bml0cwogIG1zPSQoIiQocGcg IiRST09UIiBwc3FsKSIgLWggMTI3LjAuMC4xIC1wICIkUE9SVCIgLWQgcG9zdGdyZXMgLVggLXYg T05fRVJST1JfU1RPUD0xIC1BdCBcCiAgICAtYyAnXHRpbWluZyBvbicgLWMgIiRTUUwiIDI+JjEg fCBcCiAgICBhd2sgJwogICAgICAvVGltZTovIHsKICAgICAgICB2YWw9JDI7IHVuaXQ9JDM7CiAg ICAgICAgaWYgKHVuaXQ9PSJtcyIpIG1zPXZhbDsKICAgICAgICBlbHNlIGlmICh1bml0PT0icyIp IG1zPXZhbCoxMDAwOwogICAgICB9CiAgICAgIEVORCB7IGlmIChtcz09IiIpIGV4aXQgMTsgcHJp bnRmICIlLjNmXG4iLCBtczsgfQogICAgJykKICAjIFZhbGlkYXRlIG51bWVyaWMgb3V0cHV0CiAg W1sgIiRtcyIgPX4gXlswLTldKyhcLlswLTldKyk/JCBdXSB8fCB7IGVjaG8gIkVSUk9SOiBOb24t bnVtZXJpYyB0aW1pbmc6ICRtcyIgPiYyOyByZXR1cm4gMTsgfQogIGVjaG8gIiRtcyIKfQoKIyAt LS0gSS9PIFN0YXRzIC0tLQojIFJ1biBTUUwgYW5kIGNhcHR1cmUgdGltaW5nICsgSS9PIHN0YXRz IGZyb20gcGdfc3RhdF9pbwojIFJlc2V0cyBzdGF0cyBiZWZvcmUgcXVlcnksIHdhaXRzIGZvciBm bHVzaCwgdGhlbiByZWFkcyBhYnNvbHV0ZSB2YWx1ZXMKIyBOb3RlOiBwZ19zdGF0X2lvIGhhcyBQ R1NUQVRfTUlOX0lOVEVSVkFMPTEwMDBtcyBmbHVzaCBkZWxheSwgc28gd2Ugd2FpdCAxLjVzCiMg ICAgICAgYWZ0ZXIgdGhlIHF1ZXJ5IHRvIGVuc3VyZSBzdGF0cyBhcmUgZmx1c2hlZCB0byBzaGFy ZWQgbWVtb3J5LgojIE5vdGU6IHBnX3N0YXRfaW8gY291bnRzIEkvTyBvcGVyYXRpb25zLCBub3Qg cGFnZXMgKHdpdGggaW9fY29tYmluZV9saW1pdD0xMjhrQiwKIyAgICAgICB1cCB0byAxNiBwYWdl cyBwZXIgb3BlcmF0aW9uKS4gVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvci4KIyBSZXR1cm5zOiBt cyxyZWFkcyxyZWFkX3RpbWUsd3JpdGVzLHdyaXRlX3RpbWUKcnVuX3RpbWVkX3dpdGhfaW8oKSB7 CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTUUw9IiQzIgogIGxvY2FsIHJlc3VsdAogIAog ICMgUmVzZXQgc3RhdHMsIHJ1biBxdWVyeSwgd2FpdCBmb3IgZmx1c2gsIHJlYWQgYWJzb2x1dGUg dmFsdWVzCiAgIyAtIEZpbHRlciBieSBjbGllbnQgYmFja2VuZCBhbmQgaW8gd29ya2VyIChleGNs dWRlcyBiZ3dyaXRlci9jaGVja3BvaW50ZXIpCiAgIyAtIDEuNXMgZGVsYXkgYWxsb3dzIHN0YXRz IHRvIGZsdXNoIChQR1NUQVRfTUlOX0lOVEVSVkFMPTEwMDBtcykKICByZXN1bHQ9JCgiJChwZyAi JFJPT1QiIHBzcWwpIiAtaCAxMjcuMC4wLjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtWCAtdiBP Tl9FUlJPUl9TVE9QPTEgPDxFT1NRTApTRUxFQ1QgcGdfc3RhdF9yZXNldF9zaGFyZWQoJ2lvJyk7 ClxcdGltaW5nIG9uCiRTUUwKXFx0aW1pbmcgb2ZmClNFTEVDVCBwZ19zbGVlcCgxLjUpOwpcXHQg b24KU0VMRUNUIAogIENPQUxFU0NFKFNVTShyZWFkcyksMCk6OmJpZ2ludCwKICBDT0FMRVNDRShT VU0ocmVhZF90aW1lKSwwKTo6bnVtZXJpYygxMiwyKSwKICBDT0FMRVNDRShTVU0od3JpdGVzKSww KTo6YmlnaW50LAogIENPQUxFU0NFKFNVTSh3cml0ZV90aW1lKSwwKTo6bnVtZXJpYygxMiwyKQpG Uk9NIHBnX3N0YXRfaW8gCldIRVJFIG9iamVjdCA9ICdyZWxhdGlvbicgQU5EIGJhY2tlbmRfdHlw ZSBJTiAoJ2NsaWVudCBiYWNrZW5kJywgJ2lvIHdvcmtlcicpOwpFT1NRTAogIDI+JjEpCiAgCiAg IyBQYXJzZSB0aW1pbmcgKGxhc3QgVGltZTogbGluZSkKICBsb2NhbCBtcwogIG1zPSQoZWNobyAi JHJlc3VsdCIgfCBhd2sgJwogICAgL1RpbWU6LyB7CiAgICAgIHZhbD0kMjsgdW5pdD0kMzsKICAg ICAgaWYgKHVuaXQ9PSJtcyIpIG1zPXZhbDsKICAgICAgZWxzZSBpZiAodW5pdD09InMiKSBtcz12 YWwqMTAwMDsKICAgIH0KICAgIEVORCB7IGlmIChtcz09IiIpIGV4aXQgMTsgcHJpbnRmICIlLjNm XG4iLCBtczsgfQogICcpCiAgCiAgIyBQYXJzZSBJL08gc3RhdHMgKGxhc3Qgbm9uLWVtcHR5IGxp bmUgd2l0aCBwaXBlIHNlcGFyYXRvcjogcmVhZHN8cmVhZF90aW1lfHdyaXRlc3x3cml0ZV90aW1l KQogIGxvY2FsIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogIGxvY2FsIGlvX2xp bmUKICBpb19saW5lPSQoZWNobyAiJHJlc3VsdCIgfCBncmVwICd8JyB8IHRhaWwgLTEpCiAgcmVh ZHM9JChlY2hvICIkaW9fbGluZSIgICAgIHwgY3V0IC1kJ3wnIC1mMSB8IHRyIC1kICcgJykKICBy ZWFkX3RpbWU9JChlY2hvICIkaW9fbGluZSIgIHwgY3V0IC1kJ3wnIC1mMiB8IHRyIC1kICcgJykK ICB3cml0ZXM9JChlY2hvICIkaW9fbGluZSIgICAgfCBjdXQgLWQnfCcgLWYzIHwgdHIgLWQgJyAn KQogIHdyaXRlX3RpbWU9JChlY2hvICIkaW9fbGluZSIgfCBjdXQgLWQnfCcgLWY0IHwgdHIgLWQg JyAnKQogIAogICMgRGVmYXVsdCB0byAwIGlmIG5vdCBmb3VuZAogIFtbICIkcmVhZHMiICAgICAg PX4gXi0/WzAtOV0rJCAgICAgICAgICAgICBdXSB8fCByZWFkcz0wCiAgW1sgIiRyZWFkX3RpbWUi ICA9fiBeLT9bMC05XSsoXC5bMC05XSspPyQgXV0gfHwgcmVhZF90aW1lPTAKICBbWyAiJHdyaXRl cyIgICAgID1+IF4tP1swLTldKyQgICAgICAgICAgICAgXV0gfHwgd3JpdGVzPTAKICBbWyAiJHdy aXRlX3RpbWUiID1+IF4tP1swLTldKyhcLlswLTldKyk/JCBdXSB8fCB3cml0ZV90aW1lPTAKICAK ICBlY2hvICIkbXMsJHJlYWRzLCRyZWFkX3RpbWUsJHdyaXRlcywkd3JpdGVfdGltZSIKfQoKIyAt LS0gU3RhdGlzdGljcyAtLS0KY2FsY19tZWRpYW4oKSB7CiAgYXdrIC1GLCAnTlI+MXthWysrbl09 JDJ9RU5EewogICAgaWYobj09MCl7cHJpbnQgMDsgZXhpdH0KICAgIGZvcihpPTE7aTw9bjtpKysp Zm9yKGo9aSsxO2o8PW47aisrKWlmKGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9 CiAgICBwcmludCAobiUyKT9hW2ludChuLzIpKzFdOihhW24vMl0rYVtuLzIrMV0pLzIKICB9JyAi JDEiCn0KCmNhbGNfbWVkaWFuX2NvbCgpIHsKICBsb2NhbCBmaWxlPSIkMSIgY29sPSIkMiIKICBh d2sgLUYsIC12IGNvbD0iJGNvbCIgJ05SPjF7YVsrK25dPSRjb2x9RU5EewogICAgaWYobj09MCl7 cHJpbnQgMDsgZXhpdH0KICAgIGZvcihpPTE7aTw9bjtpKyspZm9yKGo9aSsxO2o8PW47aisrKWlm KGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9CiAgICBwcmludCAobiUyKT9hW2lu dChuLzIpKzFdOihhW24vMl0rYVtuLzIrMV0pLzIKICB9JyAiJGZpbGUiCn0KCmNhbGNfc3RhdHMo KSB7CiAgbG9jYWwgY3N2PSIkMSIKICBhd2sgLUYsICdOUj4xe2FbKytuXT0kMjtzKz0kMn1FTkR7 CiAgICBpZihuPT0wKWV4aXQKICAgIGZvcihpPTE7aTw9bjtpKyspZm9yKGo9aSsxO2o8PW47aisr KWlmKGFbaV0+YVtqXSl7dD1hW2ldO2FbaV09YVtqXTthW2pdPXR9CiAgICBtZWQ9KG4lMik/YVtp bnQobi8yKSsxXTooYVtuLzJdK2Fbbi8yKzFdKS8yCiAgICBhdmc9cy9uOyBmb3IoaT0xO2k8PW47 aSsrKXNzKz0oYVtpXS1hdmcpXjI7IHNkPXNxcnQoc3MvbikKICAgIHByaW50ZiAibWVkaWFuPSUu MWZtcyBtZWFuPSUuMWbCsSUuMWZtcyBuPSVkIiwgbWVkLCBhdmcsIHNkLCBuCiAgfScgIiRjc3Yi Cn0KCiMgLS0tIFByb2ZpbGluZyAtLS0KIyBSdW4gYSBTUUwgY29tbWFuZCB1bmRlciBwZXJmLCBh dHRhY2hpbmcgdG8gdGhlIGJhY2tlbmQgUElELgojIEdlbmVyYXRlcyBwZXJmLmRhdGEgYW5kIGZs YW1lZ3JhcGggU1ZHLgojICAgcHJvZmlsZV9zcWwgUk9PVCBQT1JUIExBQkVMIFNRTApwcm9maWxl X3NxbCgpIHsKICBbWyAkRE9fUFJPRklMRSAtbmUgMSBdXSAmJiByZXR1cm4KICAKICBsb2NhbCBS T09UPSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU1FMPSIkNCIKICBsb2NhbCBQUk9GX0RJUj0i JFJPT1QvcHJvZmlsZSIKICBta2RpciAtcCAiJFBST0ZfRElSIgogIAogIGxvY2FsIFBFUkZfREFU QT0iJFBST0ZfRElSLyR7TEFCRUx9LnBlcmYuZGF0YSIKICBsb2NhbCBTVkc9IiRQUk9GX0RJUi8k e0xBQkVMfS5zdmciCiAgbG9jYWwgcHNxbF9iaW4KICBwc3FsX2Jpbj0iJChwZyAiJFJPT1QiIHBz cWwpIgogIAogICMgVXNlIGEgdW5pcXVlIGFwcGxpY2F0aW9uX25hbWUgdG8gZmluZCB0aGUgYmFj a2VuZCBQSUQKICBsb2NhbCBBUFA9InByb2ZfJHtMQUJFTH1fJCQiCiAgCiAgIyBMYXVuY2ggYSBw c3FsIHNlc3Npb24gdGhhdCB3aWxsIGZpcnN0IGlkZW50aWZ5IGl0c2VsZiwgdGhlbiBydW4gdGhl IFNRTAogICMgVGhlIHBnX3NsZWVwKCkgZ2l2ZXMgdXMgdGltZSB0byBmaW5kIHRoZSBiYWNrZW5k IFBJRCBhbmQgYXR0YWNoIHBlcmYKICBQR0FQUE5BTUU9IiRBUFAiICIkcHNxbF9iaW4iIC1oIDEy Ny4wLjAuMSAtcCAiJFBPUlQiIC1kIHBvc3RncmVzIFwKICAgIC1YIC12IE9OX0VSUk9SX1NUT1A9 MSA8PEVPU1FMID4vZGV2L251bGwgMj4mMSAmClNFTEVDVCBwZ19zbGVlcCgyKTsKJFNRTApFT1NR TAogIGxvY2FsIFFVRVJZX1NIRUxMX1BJRD0kIQogIAogICMgRmluZCB0aGUgYmFja2VuZCBQSUQg dmlhIHBnX3N0YXRfYWN0aXZpdHkKICBsb2NhbCBCQUNLRU5EX1BJRD0iIgogIGZvciAoKG49MDsg bjwxMDA7IG4rKykpOyBkbwogICAgQkFDS0VORF9QSUQ9JCgiJHBzcWxfYmluIiAtaCAxMjcuMC4w LjEgLXAgIiRQT1JUIiAtZCBwb3N0Z3JlcyAtQXRxIFwKICAgICAgLWMgIlNFTEVDVCBwaWQgRlJP TSBwZ19zdGF0X2FjdGl2aXR5IFdIRVJFIGFwcGxpY2F0aW9uX25hbWU9JyR7QVBQfScgT1JERVIg QlkgYmFja2VuZF9zdGFydCBERVNDIExJTUlUIDE7IiAyPi9kZXYvbnVsbCkKICAgIFtbIC1uICIk QkFDS0VORF9QSUQiICYmIC1kICIvcHJvYy8kQkFDS0VORF9QSUQiIF1dICYmIGJyZWFrCiAgICBz bGVlcCAwLjA1CiAgZG9uZQogIAogIGlmIFtbIC16ICIkQkFDS0VORF9QSUQiIHx8ICEgLWQgIi9w cm9jLyRCQUNLRU5EX1BJRCIgXV07IHRoZW4KICAgIGxvZyAiV0FSTklORzogQ291bGQgbm90IGZp bmQgYmFja2VuZCBQSUQgZm9yIHByb2ZpbGluZywgc2tpcHBpbmciCiAgICB3YWl0ICIkUVVFUllf U0hFTExfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICByZXR1cm4KICBmaQogIAogIGxvZyAi UHJvZmlsaW5nIGJhY2tlbmQgUElEICRCQUNLRU5EX1BJRCDihpIgJFBFUkZfREFUQSIKICAKICAj IEF0dGFjaCBwZXJmIHRvIHRoZSBiYWNrZW5kOyB3ZSBleHBsaWNpdGx5IGtpbGwgLUlOVCBpdCBh ZnRlciB0aGUgcXVlcnkgZmluaXNoZXMKICAkUEVSRl9TVURPIHBlcmYgcmVjb3JkIC1nIC0tY2Fs bC1ncmFwaCBkd2FyZiBcCiAgICAtcCAiJEJBQ0tFTkRfUElEIiAtbyAiJFBFUkZfREFUQSIgXAog ICAgLS1ldmVudD0iJFBFUkZfRVZFTlQiIDI+L2Rldi9udWxsICYKICBsb2NhbCBQRVJGX1BJRD0k IQogIHNsZWVwIDAuMQogIAogICMgVmVyaWZ5IHBlcmYgYWN0dWFsbHkgc3RhcnRlZCAocGVybWlz c2lvbnMsIHZhbGlkIFBJRCwgZXRjLikKICBpZiAhIGtpbGwgLTAgIiRQRVJGX1BJRCIgMj4vZGV2 L251bGw7IHRoZW4KICAgIGxvZyAiV0FSTklORzogcGVyZiByZWNvcmQgZmFpbGVkIHRvIHN0YXJ0 IChwZXJtaXNzaW9ucy9jb25maWc/KSwgc2tpcHBpbmcgZmxhbWVncmFwaCIKICAgIHdhaXQgIiRR VUVSWV9TSEVMTF9QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIHJldHVybgogIGZpCiAgCiAg IyBXYWl0IGZvciB0aGUgcXVlcnkgdG8gZmluaXNoCiAgd2FpdCAiJFFVRVJZX1NIRUxMX1BJRCIg Mj4vZGV2L251bGwgfHwgdHJ1ZQogIAogICMgR2l2ZSBwZXJmIGEgbW9tZW50IHRvIGZsdXNoLCB0 aGVuIHN0b3AgaXQKICBzbGVlcCAwLjUKICAkUEVSRl9TVURPIGtpbGwgLUlOVCAiJFBFUkZfUElE IiAyPi9kZXYvbnVsbCB8fCB0cnVlOyB3YWl0ICIkUEVSRl9QSUQiIDI+L2Rldi9udWxsIHx8IHRy dWUKICAKICAjIEdlbmVyYXRlIGZsYW1lZ3JhcGgKICBnZW5lcmF0ZV9mbGFtZWdyYXBoICIkUEVS Rl9EQVRBIiAiJFNWRyIgIiRMQUJFTCIKfQoKIyBDb252ZXJ0IHBlcmYuZGF0YSDihpIgZmxhbWVn cmFwaCBTVkcKIyAgIGdlbmVyYXRlX2ZsYW1lZ3JhcGggUEVSRl9EQVRBIFNWR19QQVRIIFRJVExF CmdlbmVyYXRlX2ZsYW1lZ3JhcGgoKSB7CiAgbG9jYWwgUEVSRl9EQVRBPSIkMSIgU1ZHPSIkMiIg VElUTEU9IiQzIgogIAogIFtbIC1mICIkUEVSRl9EQVRBIiBdXSB8fCByZXR1cm4KICAKICBsb2Nh bCBGT0xERUQ9IiR7UEVSRl9EQVRBJS5wZXJmLmRhdGF9LmZvbGRlZCIKICBpZiAkUEVSRl9TVURP IHBlcmYgc2NyaXB0IC1pICIkUEVSRl9EQVRBIiAyPi9kZXYvbnVsbCBcCiAgICAgIHwgIiRGTEFN RUdSQVBIX0RJUi9zdGFja2NvbGxhcHNlLXBlcmYucGwiID4gIiRGT0xERUQiIDI+L2Rldi9udWxs IFwKICAgICAgJiYgW1sgLXMgIiRGT0xERUQiIF1dOyB0aGVuCiAgICAiJEZMQU1FR1JBUEhfRElS L2ZsYW1lZ3JhcGgucGwiIC0tdGl0bGUgIiRUSVRMRSIgLS1jb3VudG5hbWUgc2FtcGxlcyBcCiAg ICAgICIkRk9MREVEIiA+ICIkU1ZHIiAyPi9kZXYvbnVsbAogICAgbG9nICJGbGFtZWdyYXBoOiAk U1ZHIgogICAgcm0gLWYgIiRGT0xERUQiCiAgZWxzZQogICAgbG9nICJXQVJOSU5HOiBGYWlsZWQg dG8gZ2VuZXJhdGUgZmxhbWVncmFwaCBmb3IgJFRJVExFIgogICAgcm0gLWYgIiRGT0xERUQiCiAg ZmkKfQoKIyAtLS0gQmVuY2htYXJrIHJ1bm5lciAtLS0KIyBiZW5jaG1hcmsgUk9PVCBQT1JUIE5B TUUgU1FMIFJFTEFUSU9OIFtSRUxBVElPTi4uLl0KYmVuY2htYXJrKCkgewogIGxvY2FsIFJPT1Q9 IiQxIiBQT1JUPSIkMiIgTkFNRT0iJDMiIFNRTD0iJDQiCiAgc2hpZnQgNAogIGxvY2FsIHJlbHM9 KCIkQCIpCiAgbG9jYWwgT1VUPSIkUk9PVC9yZXN1bHRzLyR7TkFNRX0uY3N2IgogIAogIG1rZGly IC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3Jp dGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKysp KTsgZG8KICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiAiJHtyZWxzW0BdfSIKICAgIGxv Y2FsIHJlc3VsdCBtcyByZWFkcyByZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUKICAgIHJlc3Vs dD0kKHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAiJFNRTCIpCiAgICBJRlM9Jywn IHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIkcmVzdWx0 IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRlX3RpbWUi ID4+ICIkT1VUIgogICAgbG9nICIkTkFNRSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0kcmVh ZHMsIHJlYWRfdGltZT0ke3JlYWRfdGltZX1tcywgd3JpdGVzPSR3cml0ZXMsIHdyaXRlX3RpbWU9 JHt3cml0ZV90aW1lfW1zKSIKICBkb25lCn0KCiMgLS0tIERhdGEgc2V0dXAgZnVuY3Rpb25zIC0t LQpzZXR1cF9ibG9vbSgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgog IGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMCA7 OwogICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTEwMDAwMDAw IDs7CiAgICAqKSBkaWUgIkludmFsaWQgc2l6ZSAnJFNJWkUnIChtdXN0IGJlIHNtYWxsLCBtZWRp dW0sIG9yIGxhcmdlKSIgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBCbG9vbSB0ZXN0IGRh dGEgKCRTSVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FM CkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBibG9vbTsKRFJPUCBUQUJMRSBJRiBFWElT VFMgYmxvb21fdGVzdDsKQ1JFQVRFIFRBQkxFIGJsb29tX3Rlc3QgKGlkIElOVCwgZGF0YSBURVhU LCB2YWwxIElOVCwgdmFsMiBJTlQpOwpJTlNFUlQgSU5UTyBibG9vbV90ZXN0IFNFTEVDVCBpLCAn ZGF0YV8nfHxpLCBpJTEwMDAsIGklMTAwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBp OwpDUkVBVEUgSU5ERVggYmxvb21faWR4IE9OIGJsb29tX3Rlc3QgVVNJTkcgYmxvb20gKHZhbDEs IHZhbDIpOwpWQUNVVU0gQU5BTFlaRSBibG9vbV90ZXN0OwpDSEVDS1BPSU5UOwpTUUwKfQoKc2V0 dXBfcGdzdGF0dHVwbGUoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBTSVpFPSIkMyIK ICBsb2NhbCBOUk9XUwogIGNhc2UgIiRTSVpFIiBpbgogICAgc21hbGwpICBOUk9XUz0xMDAwMDAg OzsKICAgIG1lZGl1bSkgTlJPV1M9MTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0xMDAwMDAw MCA7OwogICAgKikgZGllICJJbnZhbGlkIHNpemUgJyRTSVpFJyAobXVzdCBiZSBzbWFsbCwgbWVk aXVtLCBvciBsYXJnZSkiIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgcGdzdGF0dHVwbGUg dGVzdCBkYXRhICgkU0laRTogJE5ST1dTIHJvd3MpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JU IiA8PFNRTApDUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdzdGF0dHVwbGU7CkRST1Ag VEFCTEUgSUYgRVhJU1RTIGhlYXBfdGVzdDsKQ1JFQVRFIFRBQkxFIGhlYXBfdGVzdCAoaWQgU0VS SUFMIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOwpJTlNFUlQgSU5UTyBoZWFwX3Rlc3QgKGRhdGEp IFNFTEVDVCByZXBlYXQoJ3gnLDEwMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwkTlJPV1MpOwpW QUNVVU0gQU5BTFlaRSBoZWFwX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF9wZ3N0YXRp bmRleCgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgogIGxvY2FsIE5S T1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMCA7OwogICAgbWVk aXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTEwMDAwMDAwIDs7CiAgICAq KSBkaWUgIkludmFsaWQgc2l6ZSAnJFNJWkUnIChtdXN0IGJlIHNtYWxsLCBtZWRpdW0sIG9yIGxh cmdlKSIgOzsKICBlc2FjCiAgCiAgbG9nICJDcmVhdGluZyBwZ3N0YXRpbmRleCB0ZXN0IGRhdGEg KCRTSVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkNS RUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ3N0YXR0dXBsZTsKRFJPUCBUQUJMRSBJRiBF WElTVFMgaWR4X3Rlc3Q7CkNSRUFURSBUQUJMRSBpZHhfdGVzdCAoaWQgU0VSSUFMIFBSSU1BUlkg S0VZLCBkYXRhIFRFWFQpOwpJTlNFUlQgSU5UTyBpZHhfdGVzdCAoZGF0YSkgU0VMRUNUICdkYXRh X3Jvd18nIHx8IGkgfHwgJ18nIHx8IHJlcGVhdCgneCcsNTApIEZST00gZ2VuZXJhdGVfc2VyaWVz KDEsJE5ST1dTKSBpOwpWQUNVVU0gQU5BTFlaRSBpZHhfdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0K CnNldHVwX2dpbigpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgogIGxv Y2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMCA7Owog ICAgbWVkaXVtKSBOUk9XUz0xMDAwMDAwIDs7CiAgICBsYXJnZSkgIE5ST1dTPTUwMDAwMDAgOzsK ICAgICopIGRpZSAiSW52YWxpZCBzaXplICckU0laRScgKG11c3QgYmUgc21hbGwsIG1lZGl1bSwg b3IgbGFyZ2UpIiA7OwogIGVzYWMKICAKICBsb2cgIkNyZWF0aW5nIEdJTiB0ZXN0IGRhdGEgKCRT SVpFOiAkTlJPV1Mgcm93cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkRST1Ag VEFCTEUgSUYgRVhJU1RTIGdpbl90ZXN0OwotLSBObyBQUklNQVJZIEtFWTogaXNvbGF0ZSBHSU4g aW5kZXggdmFjdXVtIGZyb20gYnRyZWUgb3ZlcmhlYWQKQ1JFQVRFIFRBQkxFIGdpbl90ZXN0IChp ZCBJTlQsIHRhZ3MgVEVYVFtdKTsKSU5TRVJUIElOVE8gZ2luX3Rlc3QgKGlkLCB0YWdzKQpTRUxF Q1QgaSwgQVJSQVkoU0VMRUNUICd0YWdfJ3x8KHJhbmRvbSgpKjEwMCk6OmludCBGUk9NIGdlbmVy YXRlX3NlcmllcygxLDUpKQpGUk9NIGdlbmVyYXRlX3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRF IElOREVYIGdpbl9pZHggT04gZ2luX3Rlc3QgVVNJTkcgZ2luICh0YWdzKTsKVkFDVVVNIEFOQUxZ WkUgZ2luX3Rlc3Q7CkNIRUNLUE9JTlQ7ClNRTAp9CgpzZXR1cF9oYXNoKCkgewogIGxvY2FsIFJP T1Q9IiQxIiBQT1JUPSIkMiIgU0laRT0iJDMiCiAgbG9jYWwgTlJPV1MKICBjYXNlICIkU0laRSIg aW4KICAgIHNtYWxsKSAgTlJPV1M9NTAwMDAwIDs7CiAgICBtZWRpdW0pIE5ST1dTPTEwMDAwMDAg OzsKICAgIGxhcmdlKSAgTlJPV1M9MjAwMDAwMDAgOzsKICAgICopIGRpZSAiSW52YWxpZCBzaXpl ICckU0laRScgKG11c3QgYmUgc21hbGwsIG1lZGl1bSwgb3IgbGFyZ2UpIiA7OwogIGVzYWMKICAK ICBsb2cgIkNyZWF0aW5nIEhhc2ggdGVzdCBkYXRhICgkU0laRTogJE5ST1dTIHVuaXF1ZSB2YWx1 ZXMpIgogIHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiA8PFNRTApEUk9QIFRBQkxFIElGIEVYSVNU UyBoYXNoX3Rlc3Q7Ci0tIE5vIFBSSU1BUlkgS0VZOiBpc29sYXRlIGhhc2ggaW5kZXggdmFjdXVt IGZyb20gYnRyZWUgb3ZlcmhlYWQKQ1JFQVRFIFRBQkxFIGhhc2hfdGVzdCAoaWQgSU5ULCBkYXRh IFRFWFQpOwpJTlNFUlQgSU5UTyBoYXNoX3Rlc3QgU0VMRUNUIGksICd4JyBGUk9NIGdlbmVyYXRl X3NlcmllcygxLCROUk9XUykgaTsKQ1JFQVRFIElOREVYIGhhc2hfaWR4IE9OIGhhc2hfdGVzdCBV U0lORyBoYXNoIChpZCk7ClZBQ1VVTSBBTkFMWVpFIGhhc2hfdGVzdDsKQ0hFQ0tQT0lOVDsKU1FM Cn0KCnNldHVwX3dhbCgpIHsKICBsb2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIFNJWkU9IiQzIgog IGxvY2FsIE5ST1dTCiAgY2FzZSAiJFNJWkUiIGluCiAgICBzbWFsbCkgIE5ST1dTPTEwMDAwMDAg OzsKICAgIG1lZGl1bSkgTlJPV1M9NTAwMDAwMCA7OwogICAgbGFyZ2UpICBOUk9XUz0yMDAwMDAw MCA7OwogICAgKikgZGllICJJbnZhbGlkIHNpemUgJyRTSVpFJyAobXVzdCBiZSBzbWFsbCwgbWVk aXVtLCBvciBsYXJnZSkiIDs7CiAgZXNhYwogIAogIGxvZyAiQ3JlYXRpbmcgdGFibGUgZm9yIEdJ TiBpbmRleCBidWlsZCAvIGxvZ19uZXdwYWdlX3JhbmdlIHRlc3QgKCRTSVpFOiAkTlJPV1Mgcm93 cykiCiAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIDw8U1FMCkRST1AgVEFCTEUgSUYgRVhJU1RT IHdhbF90ZXN0OwotLSBUYWJsZSB3aXRoIHRzdmVjdG9yIGNvbHVtbiBmb3IgR0lOIGluZGV4aW5n IChmdWxsLXRleHQgc2VhcmNoKQotLSBHSU4gaW5kZXggYnVpbGRzIGFsd2F5cyBjYWxsIGxvZ19u ZXdwYWdlX3JhbmdlKCkgYXQgdGhlIGVuZCBvZgotLSBnaW5idWlsZCgpIChnaW5pbnNlcnQuYykg dG8gV0FMLWxvZyBhbGwgaW5kZXggcGFnZXMuIApDUkVBVEUgVEFCTEUgd2FsX3Rlc3QgKGlkIElO VCwgZG9jIFRFWFQsIGRvY190c3YgVFNWRUNUT1IpOwpJTlNFUlQgSU5UTyB3YWxfdGVzdAogIFNF TEVDVCBpLAogICAgICAgICAnd29yZCcgfHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50IHx8ICcgdGVy bScgfHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50CiAgICAgICAgICAgfHwgJyB0b2tlbicgfHwgKHJh bmRvbSgpKjUwMDApOjppbnQgfHwgJyBwaHJhc2UnIHx8IChyYW5kb20oKSo4MDAwKTo6aW50LAog ICAgICAgICB0b190c3ZlY3Rvcignc2ltcGxlJywKICAgICAgICAgICAnd29yZCcgfHwgKHJhbmRv bSgpKjEwMDAwKTo6aW50IHx8ICcgdGVybScgfHwgKHJhbmRvbSgpKjEwMDAwKTo6aW50CiAgICAg ICAgICAgfHwgJyB0b2tlbicgfHwgKHJhbmRvbSgpKjUwMDApOjppbnQgfHwgJyBwaHJhc2UnIHx8 IChyYW5kb20oKSo4MDAwKTo6aW50KQogIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsJE5ST1dTKSBp OwpWQUNVVU0gQU5BTFlaRSB3YWxfdGVzdDsKQ0hFQ0tQT0lOVDsKU1FMCn0KCiMgLS0tIFRlc3Qg ZnVuY3Rpb25zIC0tLQp0ZXN0X2Jsb29tX3NjYW4oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9 IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIHNldHVwX2Jsb29tICIkUk9PVCIgIiRQT1JUIiAi JFNJWkUiCiAgYmVuY2htYXJrICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fYmxvb21fc2Nhbl8k e1NJWkV9IiBcCiAgICAiU0VUIGVuYWJsZV9zZXFzY2FuPW9mZjsgU0VMRUNUIENPVU5UKCopIEZS T00gYmxvb21fdGVzdCBXSEVSRSB2YWwxPTQyIEFORCB2YWwyPTc7IiBcCiAgICBibG9vbV90ZXN0 IGJsb29tX2lkeAogICMgUHJvZmlsZSBhZnRlciBiZW5jaG1hcmsgcmVwczogc2hhcmVkX2J1ZmZl cnMgbWVtb3J5IGFscmVhZHkgZmF1bHRlZCBpbiwKICAjIHNvIHBhZ2UtZmF1bHQgbm9pc2UgaXMg Z29uZTsgZHJvcF9jYWNoZXMgZW5zdXJlcyBjb2xkIElPIGZvciB0aGUgcHJvZmlsZS4KICBpZiBb WyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBP UlQiIGJsb29tX3Rlc3QgYmxvb21faWR4CiAgICBwcm9maWxlX3NxbCAiJFJPT1QiICIkUE9SVCIg IiR7TEFCRUx9X2Jsb29tX3NjYW5fJHtTSVpFfSIgXAogICAgICAiU0VUIGVuYWJsZV9zZXFzY2Fu PW9mZjsgU0VMRUNUIENPVU5UKCopIEZST00gYmxvb21fdGVzdCBXSEVSRSB2YWwxPTQyIEFORCB2 YWwyPTc7IgogIGZpCn0KCnRlc3RfYmxvb21fdmFjdXVtKCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQ T1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBsb2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMv JHtMQUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1 bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3JpdGVzLHdyaXRlX3RpbWVf bXMiID4gIiRPVVQiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBpKyspKTsgZG8KICAgICMgRnJl c2ggdGFibGUgZWFjaCBydW4gZm9yIGNvbnNpc3RlbnQgc3RhdGUKICAgIHNldHVwX2Jsb29tICIk Uk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAjIENyZWF0ZSAxMCUgZGVhZCB0dXBsZXMKICAgIHBz cWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiREVMRVRFIEZST00gYmxvb21fdGVzdCBXSEVSRSBp ZCAlIDEwID0gMDsiCiAgICAKICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBibG9vbV90 ZXN0IGJsb29tX2lkeAogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMg d3JpdGVfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQi ICJWQUNVVU0gYmxvb21fdGVzdDsiKQogICAgSUZTPScsJyByZWFkIC1yIG1zIHJlYWRzIHJlYWRf dGltZSB3cml0ZXMgd3JpdGVfdGltZSA8PDwiJHJlc3VsdCIKICAgIGVjaG8gIiRpLCRtcywkcmVh ZHMsJHJlYWRfdGltZSwkd3JpdGVzLCR3cml0ZV90aW1lIiA+PiAiJE9VVCIKICAgIGxvZyAiJHtM QUJFTH1fYmxvb21fdmFjdXVtXyR7U0laRX0gWyRpLyRSRVBTXTogJHttc31tcyAocmVhZHM9JHJl YWRzLCByZWFkX3RpbWU9JHtyZWFkX3RpbWV9bXMsIHdyaXRlcz0kd3JpdGVzLCB3cml0ZV90aW1l PSR7d3JpdGVfdGltZX1tcykiCiAgZG9uZQogIAogIGlmIFtbICRET19QUk9GSUxFIC1lcSAxIF1d OyB0aGVuCiAgICBzZXR1cF9ibG9vbSAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgcHNxbF9y dW4gIiRST09UIiAiJFBPUlQiIC1jICJERUxFVEUgRlJPTSBibG9vbV90ZXN0IFdIRVJFIGlkICUg MTAgPSAwOyIKICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQT1JUIiBibG9vbV90ZXN0IGJsb29t X2lkeAogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9ibG9vbV92YWN1 dW1fJHtTSVpFfSIgIlZBQ1VVTSBibG9vbV90ZXN0OyIKICBmaQp9Cgp0ZXN0X3Bnc3RhdHR1cGxl KCkgewogIGxvY2FsIFJPT1Q9IiQxIiBQT1JUPSIkMiIgTEFCRUw9IiQzIiBTSVpFPSIkNCIKICBs b2NhbCBPVVQ9IiRST09UL3Jlc3VsdHMvJHtMQUJFTH1fcGdzdGF0dHVwbGVfJHtTSVpFfS5jc3Yi CiAgbWtkaXIgLXAgIiRST09UL3Jlc3VsdHMiCiAgZWNobyAicnVuLG1zLHJlYWRzLHJlYWRfdGlt ZV9tcyx3cml0ZXMsd3JpdGVfdGltZV9tcyIgPiAiJE9VVCIKICAKICAjIFNldHVwIG9uY2Ug4oCU IHJvbGxlZC1iYWNrIERFTEVURSBrZWVwcyBsYXlvdXQgaWRlbnRpY2FsIGFjcm9zcyBhbGwgcmVw cwogIHNldHVwX3Bnc3RhdHR1cGxlICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgIyBSb2xsZWQt YmFjayBERUxFVEUgY2xlYXJzIHRoZSBhbGwtdmlzaWJsZSBiaXQgaW4gdGhlIFZpc2liaWxpdHkg TWFwIHNvCiAgIyBwZ3N0YXR0dXBsZV9hcHByb3ggbXVzdCBhY3R1YWxseSByZWFkIHRob3NlIHBh Z2VzIChpdCBza2lwcyBhbGwtdmlzaWJsZSBwYWdlcykuCiAgIyBVc2luZyBST0xMQkFDSyBrZWVw cyB0aGUgcGh5c2ljYWwgbGF5b3V0IGlkZW50aWNhbCBhY3Jvc3MgYWxsIHJlcHMgKG5vIFRPQVNU CiAgIyBvdXQtb2YtcGFnZSB1cGRhdGVzLCBubyBkaXJ0eSBwYWdlcyB0byBmbHVzaCBmcm9tIHNo YXJlZF9idWZmZXJzKS4KICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIkJFR0lOOyBERUxF VEUgRlJPTSBoZWFwX3Rlc3QgV0hFUkUgaWQgJSA1MDAgPSAwOyBST0xMQkFDSzsiCiAgIyBXYXJt dXAgcGFzczogVGhlIHJvbGxlZC1iYWNrIERFTEVURSBsZWZ0IGV2ZXJ5IHRvdWNoZWQgdHVwbGUg d2l0aCBhbiB4bWF4CiAgIyBwb2ludGluZyB0byB0aGUgYWJvcnRlZCB0cmFuc2FjdGlvbiBidXQg bm8gaGludCBiaXRzIHNldC4gT24gdGhlIGZpcnN0CiAgIyBwZ3N0YXR0dXBsZV9hcHByb3ggY2Fs bCwgSGVhcFR1cGxlU2F0aXNmaWVzVmFjdXVtIOKGkiBIZWFwVHVwbGVTYXRpc2ZpZXNWYWN1dW1I b3Jpem9uCiAgIyBtdXN0IHJlc29sdmUgZWFjaCBzdWNoIHhtYXg6IFRyYW5zYWN0aW9uSWRJc0lu UHJvZ3Jlc3MgKFByb2NBcnJheSBzY2FuKSB0aGVuCiAgIyBUcmFuc2FjdGlvbklkRGlkQ29tbWl0 IChDTE9HIGxvb2t1cCkg4oCUIG9ubHkgdGhlbiBjYW4gaXQgY2FsbCBTZXRIaW50Qml0cyB0bwog ICMgc3RhbXAgSEVBUF9YTUFYX0lOVkFMSUQgYW5kIE1hcmtCdWZmZXJEaXJ0eUhpbnQuIFdpdGhv dXQgdGhpcyB3YXJtdXAsIHJlcCAxCiAgIyBwYXlzIH4xMTAwbXMgZXh0cmEgQ1BVIGZvciB0aG9z ZSBDTE9HL1Byb2NBcnJheSBsb29rdXBzLiBTdWJzZXF1ZW50IHJlcHMgaGl0CiAgIyB0aGUgZWFy bHktZXhpdCBhdCAiaWYgKHRfaW5mb21hc2sgJiBIRUFQX1hNQVhfSU5WQUxJRCkgcmV0dXJuIEhF QVBUVVBMRV9MSVZFIgogICMgYW5kIHNraXAgdGhlIGV4cGVuc2l2ZSBwYXRoIGVudGlyZWx5Lgog ICMgQWZ0ZXIgdGhpcyBwYXNzLCB0aGUgZGlydGllZCBoaW50LWJpdCBwYWdlcyBhcmUgZmx1c2hl ZCB0byBkaXNrIHZpYQogICMgZHJvcF9jYWNoZXMsIHNvIGFsbCByZXBzIHN0YXJ0IGZyb20gdGhl IHNhbWUgb24tZGlzayBzdGF0ZS4KICBwc3FsX3J1biAiJFJPT1QiICIkUE9SVCIgLWMgIlNFTEVD VCAqIEZST00gcGdzdGF0dHVwbGVfYXBwcm94KCdoZWFwX3Rlc3QnKTsiID4vZGV2L251bGwKCiAg Zm9yICgoaT0xOyBpPD1SRVBTOyBpKyspKTsgZG8KICAgIGRyb3BfY2FjaGVzICIkUk9PVCIgIiRQ T1JUIiBoZWFwX3Rlc3QgaGVhcF90ZXN0X3BrZXkKICAgIGxvY2FsIHJlc3VsdCBtcyByZWFkcyBy ZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUKICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRoX2lv ICIkUk9PVCIgIiRQT1JUIiAiU0VMRUNUICogRlJPTSBwZ3N0YXR0dXBsZV9hcHByb3goJ2hlYXBf dGVzdCcpOyIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3 cml0ZV90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1l LCR3cml0ZXMsJHdyaXRlX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xBQkVMfV9wZ3N0YXR0 dXBsZV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFkcywgcmVhZF90aW1l PSR7cmVhZF90aW1lfW1zLCB3cml0ZXM9JHdyaXRlcywgd3JpdGVfdGltZT0ke3dyaXRlX3RpbWV9 bXMpIgogIGRvbmUKICAKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgcHNx bF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJCRUdJTjsgREVMRVRFIEZST00gaGVhcF90ZXN0IFdI RVJFIGlkICUgNTAwID0gMDsgUk9MTEJBQ0s7IgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBP UlQiIGhlYXBfdGVzdCBoZWFwX3Rlc3RfcGtleQogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBP UlQiICIke0xBQkVMfV9wZ3N0YXR0dXBsZV8ke1NJWkV9IiBcCiAgICAgICJTRUxFQ1QgKiBGUk9N IHBnc3RhdHR1cGxlX2FwcHJveCgnaGVhcF90ZXN0Jyk7IgogIGZpCn0KCnRlc3RfcGdzdGF0aW5k ZXgoKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0Igog IHNldHVwX3Bnc3RhdGluZGV4ICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgYmVuY2htYXJrICIk Uk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fcGdzdGF0aW5kZXhfJHtTSVpFfSIgXAogICAgIlNFTEVD VCAqIEZST00gcGdzdGF0aW5kZXgoJ2lkeF90ZXN0X3BrZXknKTsiIFwKICAgIGlkeF90ZXN0IGlk eF90ZXN0X3BrZXkKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsgdGhlbgogICAgZHJvcF9j YWNoZXMgIiRST09UIiAiJFBPUlQiIGlkeF90ZXN0IGlkeF90ZXN0X3BrZXkKICAgIHByb2ZpbGVf c3FsICIkUk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fcGdzdGF0aW5kZXhfJHtTSVpFfSIgXAogICAg ICAiU0VMRUNUICogRlJPTSBwZ3N0YXRpbmRleCgnaWR4X3Rlc3RfcGtleScpOyIKICBmaQp9Cgp0 ZXN0X2dpbl92YWN1dW0oKSB7CiAgbG9jYWwgUk9PVD0iJDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMi IFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVzdWx0cy8ke0xBQkVMfV9naW5fdmFjdXVt XyR7U0laRX0uY3N2IgogIG1rZGlyIC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxy ZWFkcyxyZWFkX3RpbWVfbXMsd3JpdGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgZm9y ICgoaT0xOyBpPD1SRVBTOyBpKyspKTsgZG8KICAgICMgRnJlc2ggdGFibGUgZWFjaCBydW4gZm9y IGNvbnNpc3RlbnQgc3RhdGUKICAgIHNldHVwX2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgog ICAgCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9SVCIgZ2luX3Rlc3QgZ2luX2lkeAogICAg bG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogICAgIyBW QUNVVU0gQU5BTFlaRSBmb3JjZXMgZ2ludmFjdXVtY2xlYW51cCgpIHRvIHJ1biBhbmQgc2NhbiBh bGwgcGFnZXMKICAgIHJlc3VsdD0kKHJ1bl90aW1lZF93aXRoX2lvICIkUk9PVCIgIiRQT1JUIiAi VkFDVVVNIEFOQUxZWkUgZ2luX3Rlc3Q7IikKICAgIElGUz0nLCcgcmVhZCAtciBtcyByZWFkcyBy ZWFkX3RpbWUgd3JpdGVzIHdyaXRlX3RpbWUgPDw8IiRyZXN1bHQiCiAgICBlY2hvICIkaSwkbXMs JHJlYWRzLCRyZWFkX3RpbWUsJHdyaXRlcywkd3JpdGVfdGltZSIgPj4gIiRPVVQiCiAgICBsb2cg IiR7TEFCRUx9X2dpbl92YWN1dW1fJHtTSVpFfSBbJGkvJFJFUFNdOiAke21zfW1zIChyZWFkcz0k cmVhZHMsIHJlYWRfdGltZT0ke3JlYWRfdGltZX1tcywgd3JpdGVzPSR3cml0ZXMsIHdyaXRlX3Rp bWU9JHt3cml0ZV90aW1lfW1zKSIKICBkb25lCiAgCiAgaWYgW1sgJERPX1BST0ZJTEUgLWVxIDEg XV07IHRoZW4KICAgIHNldHVwX2dpbiAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgZHJvcF9j YWNoZXMgIiRST09UIiAiJFBPUlQiIGdpbl90ZXN0IGdpbl9pZHgKICAgIHByb2ZpbGVfc3FsICIk Uk9PVCIgIiRQT1JUIiAiJHtMQUJFTH1fZ2luX3ZhY3V1bV8ke1NJWkV9IiAiVkFDVVVNIEFOQUxZ WkUgZ2luX3Rlc3Q7IgogIGZpCn0KCnRlc3RfaGFzaF92YWN1dW0oKSB7CiAgbG9jYWwgUk9PVD0i JDEiIFBPUlQ9IiQyIiBMQUJFTD0iJDMiIFNJWkU9IiQ0IgogIGxvY2FsIE9VVD0iJFJPT1QvcmVz dWx0cy8ke0xBQkVMfV9oYXNoX3ZhY3V1bV8ke1NJWkV9LmNzdiIKICBta2RpciAtcCAiJFJPT1Qv cmVzdWx0cyIKICBlY2hvICJydW4sbXMscmVhZHMscmVhZF90aW1lX21zLHdyaXRlcyx3cml0ZV90 aW1lX21zIiA+ICIkT1VUIgogIAogIGZvciAoKGk9MTsgaTw9UkVQUzsgaSsrKSk7IGRvCiAgICAj IEZyZXNoIHRhYmxlIGVhY2ggcnVuIGZvciBjb25zaXN0ZW50IHN0YXRlCiAgICBzZXR1cF9oYXNo ICIkUk9PVCIgIiRQT1JUIiAiJFNJWkUiCiAgICAjIENyZWF0ZSAxMCUgZGVhZCB0dXBsZXMKICAg IHBzcWxfcnVuICIkUk9PVCIgIiRQT1JUIiAtYyAiREVMRVRFIEZST00gaGFzaF90ZXN0IFdIRVJF IGlkICUgMTAgPSAwOyIKICAgIAogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGhhc2hf dGVzdCBoYXNoX2lkeAogICAgbG9jYWwgcmVzdWx0IG1zIHJlYWRzIHJlYWRfdGltZSB3cml0ZXMg d3JpdGVfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVkX3dpdGhfaW8gIiRST09UIiAiJFBPUlQi ICJWQUNVVU0gaGFzaF90ZXN0OyIpCiAgICBJRlM9JywnIHJlYWQgLXIgbXMgcmVhZHMgcmVhZF90 aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNobyAiJGksJG1zLCRyZWFk cywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRlX3RpbWUiID4+ICIkT1VUIgogICAgbG9nICIke0xB QkVMfV9oYXNoX3ZhY3V1bV8ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9bXMgKHJlYWRzPSRyZWFk cywgcmVhZF90aW1lPSR7cmVhZF90aW1lfW1zLCB3cml0ZXM9JHdyaXRlcywgd3JpdGVfdGltZT0k e3dyaXRlX3RpbWV9bXMpIgogIGRvbmUKICAKICBpZiBbWyAkRE9fUFJPRklMRSAtZXEgMSBdXTsg dGhlbgogICAgc2V0dXBfaGFzaCAiJFJPT1QiICIkUE9SVCIgIiRTSVpFIgogICAgcHNxbF9ydW4g IiRST09UIiAiJFBPUlQiIC1jICJERUxFVEUgRlJPTSBoYXNoX3Rlc3QgV0hFUkUgaWQgJSAxMCA9 IDA7IgogICAgZHJvcF9jYWNoZXMgIiRST09UIiAiJFBPUlQiIGhhc2hfdGVzdCBoYXNoX2lkeAog ICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xBQkVMfV9oYXNoX3ZhY3V1bV8ke1NJ WkV9IiAiVkFDVVVNIGhhc2hfdGVzdDsiCiAgZmkKfQoKdGVzdF93YWxfbG9nZ2luZygpIHsKICBs b2NhbCBST09UPSIkMSIgUE9SVD0iJDIiIExBQkVMPSIkMyIgU0laRT0iJDQiCiAgbG9jYWwgT1VU PSIkUk9PVC9yZXN1bHRzLyR7TEFCRUx9X3dhbF9sb2dnaW5nXyR7U0laRX0uY3N2IgogIG1rZGly IC1wICIkUk9PVC9yZXN1bHRzIgogIGVjaG8gInJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3Jp dGVzLHdyaXRlX3RpbWVfbXMiID4gIiRPVVQiCiAgCiAgIyBCdWlsZCB0YWJsZSBvbmNlIC0gb25s eSByZWJ1aWxkIGluZGV4IGVhY2ggcmVwCiAgc2V0dXBfd2FsICIkUk9PVCIgIiRQT1JUIiAiJFNJ WkUiCiAgCiAgbG9jYWwgV0FMX1NRTD0iQ1JFQVRFIElOREVYIHdhbF90ZXN0X2dpbl9pZHggT04g d2FsX3Rlc3QgVVNJTkcgZ2luIChkb2NfdHN2KTsiCiAgCiAgZm9yICgoaT0xOyBpPD1SRVBTOyBp KyspKTsgZG8KICAgICMgRHJvcCBpbmRleCBmcm9tIHByZXZpb3VzIGl0ZXJhdGlvbgogICAgcHNx bF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJEUk9QIElOREVYIElGIEVYSVNUUyB3YWxfdGVzdF9n aW5faWR4OyIKICAgIAogICAgIyBEcm9wIE9TIGNhY2hlcyAtIHNvdXJjZSB0YWJsZSBwYWdlcyBh cmUgQ09MRCBvbiBkaXNrCiAgICBkcm9wX2NhY2hlcyAiJFJPT1QiICIkUE9SVCIgd2FsX3Rlc3QK ICAgIAogICAgIyBDUkVBVEUgSU5ERVggb24gR0lOICh0c3ZlY3Rvcl9vcHMpOgogICAgIyAtIEdJ TiBhbHdheXMgdXNlcyB0aGUgc2FtZSBidWlsZCBwYXRoOiBnaW5idWlsZCgpIHBvcHVsYXRlcyB0 aGUKICAgICMgICBpbmRleCBpbiBtZW1vcnksIGZsdXNoZXMgdG8gZGlzaywgdGhlbiBjYWxscyBs b2dfbmV3cGFnZV9yYW5nZSgpCiAgICAjICAgdG8gcmVhZCBBTEwgaW5kZXggcGFnZXMgYW5kIHdy aXRlIHRoZW0gdG8gV0FMIChnaW5pbnNlcnQuYzo3ODUtNzkwKQogICAgbG9jYWwgcmVzdWx0IG1z IHJlYWRzIHJlYWRfdGltZSB3cml0ZXMgd3JpdGVfdGltZQogICAgcmVzdWx0PSQocnVuX3RpbWVk X3dpdGhfaW8gIiRST09UIiAiJFBPUlQiICIkV0FMX1NRTCIpCiAgICBJRlM9JywnIHJlYWQgLXIg bXMgcmVhZHMgcmVhZF90aW1lIHdyaXRlcyB3cml0ZV90aW1lIDw8PCIkcmVzdWx0IgogICAgZWNo byAiJGksJG1zLCRyZWFkcywkcmVhZF90aW1lLCR3cml0ZXMsJHdyaXRlX3RpbWUiID4+ICIkT1VU IgogICAgbG9nICIke0xBQkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9IFskaS8kUkVQU106ICR7bXN9 bXMgKHJlYWRzPSRyZWFkcywgcmVhZF90aW1lPSR7cmVhZF90aW1lfW1zLCB3cml0ZXM9JHdyaXRl cywgd3JpdGVfdGltZT0ke3dyaXRlX3RpbWV9bXMpIgogIGRvbmUKICAKICBpZiBbWyAkRE9fUFJP RklMRSAtZXEgMSBdXTsgdGhlbgogICAgcHNxbF9ydW4gIiRST09UIiAiJFBPUlQiIC1jICJEUk9Q IElOREVYIElGIEVYSVNUUyB3YWxfdGVzdF9naW5faWR4OyIKICAgIGRyb3BfY2FjaGVzICIkUk9P VCIgIiRQT1JUIiB3YWxfdGVzdAogICAgcHJvZmlsZV9zcWwgIiRST09UIiAiJFBPUlQiICIke0xB QkVMfV93YWxfbG9nZ2luZ18ke1NJWkV9IiAiJFdBTF9TUUwiCiAgZmkKfQoKIyAtLS0gUnVuIHRl c3RzIGZvciBhIGJ1aWxkIC0tLQp3YXJtdXBfY2F0YWxvZygpIHsKICBsb2NhbCBST09UPSIkMSIg UE9SVD0iJDIiCiAgIyBFeHBsaWNpdGx5IHByZXdhcm0gY2F0YWxvZyB0YWJsZXMgYW5kIHRoZWly IGluZGV4ZXMgaW50byBzaGFyZWRfYnVmZmVycwogICMgc28gcmVwIDEgZG9lc24ndCBwYXkgZGlz ay1yZWFkIGNvc3QgZm9yIGNhdGFsb2cgcGFnZXMuCiAgIyBwZ19idWZmZXJjYWNoZV9ldmljdF9y ZWxhdGlvbiBvbmx5IGV2aWN0cyB0aGUgdGVzdCByZWxhdGlvbiwgbm90IGNhdGFsb2dzLAogICMg c28gdGhlc2Ugc3RheSB3YXJtIGFjcm9zcyBhbGwgcmVwcy4KICBwc3FsX3J1biAiJFJPT1QiICIk UE9SVCIgPDxTUUwgPi9kZXYvbnVsbApTRUxFQ1QgcGdfcHJld2FybSgncGdfY2xhc3MnLCAgICAg J2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJld2FybSgncGdfYXR0cmlidXRlJywgJ2J1ZmZlcicpOwpT RUxFQ1QgcGdfcHJld2FybSgncGdfbmFtZXNwYWNlJywgJ2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJl d2FybSgncGdfcHJvYycsICAgICAgJ2J1ZmZlcicpOwpTRUxFQ1QgcGdfcHJld2FybSgncGdfdHlw ZScsICAgICAgJ2J1ZmZlcicpOwpTUUwKfQoKcnVuX3Rlc3RzKCkgewogIGxvY2FsIFJPT1Q9IiQx IiBMQUJFTD0iJDIiCiAgbG9jYWwgUE9SVAogIFBPUlQ9JChwaWNrX3BvcnQpCiAgCiAgbG9nICJb JExBQkVMXSBTdGFydGluZyBjbHVzdGVyIG9uIHBvcnQgJFBPUlQiCiAgaW5pdF9jbHVzdGVyICIk Uk9PVCIgIiRQT1JUIgogIHdhcm11cF9jYXRhbG9nICIkUk9PVCIgIiRQT1JUIgogIHNldF9pb19k ZWxheSAiJElPX0RFTEFZX01TIgogIAogIHRyYXAgInN0b3BfY2x1c3RlciAnJFJPT1QnIiBFWElU CiAgCiAgZm9yIFNJWkUgaW4gJFNJWkVTOyBkbwogICAgY2FzZSAiJFRFU1QiIGluCiAgICAgIGJs b29tX3NjYW4pICAgdGVzdF9ibG9vbV9zY2FuICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJ WkUiIDs7CiAgICAgIGJsb29tX3ZhY3V1bSkgdGVzdF9ibG9vbV92YWN1dW0gIiRST09UIiAiJFBP UlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgcGdzdGF0dHVwbGUpICB0ZXN0X3Bnc3RhdHR1 cGxlICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIHBnc3RhdGluZGV4 KSAgdGVzdF9wZ3N0YXRpbmRleCAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpFIiA7Owog ICAgICBnaW5fdmFjdXVtKSAgIHRlc3RfZ2luX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJF TCIgIiRTSVpFIiA7OwogICAgICBoYXNoX3ZhY3V1bSkgIHRlc3RfaGFzaF92YWN1dW0gIiRST09U IiAiJFBPUlQiICIkTEFCRUwiICIkU0laRSIgOzsKICAgICAgd2FsX2xvZ2dpbmcpICB0ZXN0X3dh bF9sb2dnaW5nICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJWkUiIDs7CiAgICAgIGFsbCkK ICAgICAgICB0ZXN0X2Jsb29tX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRTSVpF IgogICAgICAgIHRlc3RfcGdzdGF0dHVwbGUgIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIkU0la RSIKICAgICAgICB0ZXN0X3Bnc3RhdGluZGV4ICIkUk9PVCIgIiRQT1JUIiAiJExBQkVMIiAiJFNJ WkUiCiAgICAgICAgdGVzdF9oYXNoX3ZhY3V1bSAiJFJPT1QiICIkUE9SVCIgIiRMQUJFTCIgIiRT SVpFIgogICAgICAgIHRlc3Rfd2FsX2xvZ2dpbmcgIiRST09UIiAiJFBPUlQiICIkTEFCRUwiICIk U0laRSIKICAgICAgICA7OwogICAgICAqKSBkaWUgIlVua25vd24gdGVzdDogJFRFU1QiIDs7CiAg ICBlc2FjCiAgZG9uZQogIAogIHN0b3BfY2x1c3RlciAiJFJPT1QiCiAgdHJhcCAtIEVYSVQKfQoK IyAtLS0gQ29tcGFyZSByZXN1bHRzIC0tLQpjb21wYXJlX3Jlc3VsdHMoKSB7CiAgbG9jYWwgYmFz ZV9jc3Y9IiQxIiBwYXRjaF9jc3Y9IiQyIiBsYWJlbD0iJDMiCiAgCiAgW1sgISAtZiAiJGJhc2Vf Y3N2IiB8fCAhIC1mICIkcGF0Y2hfY3N2IiBdXSAmJiByZXR1cm4KICAKICBsb2NhbCBiYXNlX21l ZCBwYXRjaF9tZWQKICBiYXNlX21lZD0kKGNhbGNfbWVkaWFuICIkYmFzZV9jc3YiKQogIHBhdGNo X21lZD0kKGNhbGNfbWVkaWFuICIkcGF0Y2hfY3N2IikKICAKICAjIEd1YXJkIGFnYWluc3QgZW1w dHkgb3IgemVybyB2YWx1ZXMgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvCiAgW1sgLXogIiRi YXNlX21lZCIgfHwgIiRiYXNlX21lZCIgPT0gIjAiIF1dICYmIGJhc2VfbWVkPSIwLjAwMSIKICBb WyAteiAiJHBhdGNoX21lZCIgfHwgIiRwYXRjaF9tZWQiID09ICIwIiBdXSAmJiBwYXRjaF9tZWQ9 IjAuMDAxIgogIAogIGxvY2FsIHNwZWVkdXAgcGN0CiAgc3BlZWR1cD0kKGF3ayAiQkVHSU4geyBw cmludGYgXCIlLjJmXCIsICRiYXNlX21lZCAvICRwYXRjaF9tZWQgfSIpCiAgcGN0PSQoYXdrICJC RUdJTiB7IHByaW50ZiBcIiUuMWZcIiwgKCRiYXNlX21lZCAtICRwYXRjaF9tZWQpIC8gJGJhc2Vf bWVkICogMTAwIH0iKQogIAogIGxvY2FsIGlvX2luZm89IiIKICBpZiBoZWFkIC0xICIkYmFzZV9j c3YiIHwgZ3JlcCAtcSAicmVhZHMiOyB0aGVuCiAgICAjIFN0YW5kYXJkIHRlc3Q6IGNvbHVtbnMg YXJlIHJ1bixtcyxyZWFkcyxyZWFkX3RpbWVfbXMsd3JpdGVzLHdyaXRlX3RpbWVfbXMKICAgIGxv Y2FsIGJhc2VfcmVhZHMgcGF0Y2hfcmVhZHMgYmFzZV9ydGltZSBwYXRjaF9ydGltZSBiYXNlX3dy aXRlcyBwYXRjaF93cml0ZXMgYmFzZV93dGltZSBwYXRjaF93dGltZQogICAgYmFzZV9yZWFkcz0k KGNhbGNfbWVkaWFuX2NvbCAiJGJhc2VfY3N2IiAzKQogICAgcGF0Y2hfcmVhZHM9JChjYWxjX21l ZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDMpCiAgICBiYXNlX3J0aW1lPSQoY2FsY19tZWRpYW5fY29s ICIkYmFzZV9jc3YiIDQpCiAgICBwYXRjaF9ydGltZT0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNo X2NzdiIgNCkKICAgIGJhc2Vfd3JpdGVzPSQoY2FsY19tZWRpYW5fY29sICIkYmFzZV9jc3YiIDUp CiAgICBwYXRjaF93cml0ZXM9JChjYWxjX21lZGlhbl9jb2wgIiRwYXRjaF9jc3YiIDUpCiAgICBi YXNlX3d0aW1lPSQoY2FsY19tZWRpYW5fY29sICIkYmFzZV9jc3YiIDYpCiAgICBwYXRjaF93dGlt ZT0kKGNhbGNfbWVkaWFuX2NvbCAiJHBhdGNoX2NzdiIgNikKICAgICMgRGVmYXVsdCB0byAwIGlm IGVtcHR5CiAgICBbWyAteiAiJGJhc2VfcmVhZHMiIF1dICAgJiYgYmFzZV9yZWFkcz0wCiAgICBb WyAteiAiJHBhdGNoX3JlYWRzIiBdXSAgJiYgcGF0Y2hfcmVhZHM9MAogICAgW1sgLXogIiRiYXNl X3J0aW1lIiBdXSAgICYmIGJhc2VfcnRpbWU9MAogICAgW1sgLXogIiRwYXRjaF9ydGltZSIgXV0g ICYmIHBhdGNoX3J0aW1lPTAKICAgIFtbIC16ICIkYmFzZV93cml0ZXMiIF1dICAmJiBiYXNlX3dy aXRlcz0wCiAgICBbWyAteiAiJHBhdGNoX3dyaXRlcyIgXV0gJiYgcGF0Y2hfd3JpdGVzPTAKICAg IFtbIC16ICIkYmFzZV93dGltZSIgXV0gICAmJiBiYXNlX3d0aW1lPTAKICAgIFtbIC16ICIkcGF0 Y2hfd3RpbWUiIF1dICAmJiBwYXRjaF93dGltZT0wCiAgICBpb19pbmZvPSIgIChyZWFkcz0ke2Jh c2VfcmVhZHN94oaSJHtwYXRjaF9yZWFkc30sIHJlYWRfdGltZT0ke2Jhc2VfcnRpbWV94oaSJHtw YXRjaF9ydGltZX1tcywgd3JpdGVzPSR7YmFzZV93cml0ZXN94oaSJHtwYXRjaF93cml0ZXN9LCB3 cml0ZV90aW1lPSR7YmFzZV93dGltZX3ihpIke3BhdGNoX3d0aW1lfW1zKSIKICBmaQogIAogIHBy aW50ZiAiJS0yNnMgYmFzZT0lOC4xZm1zICBwYXRjaD0lOC4xZm1zICAlNS4yZnggICglNS4xZiUl KSVzXG4iIFwKICAgICIkbGFiZWwiICIkYmFzZV9tZWQiICIkcGF0Y2hfbWVkIiAiJHNwZWVkdXAi ICIkcGN0IiAiJGlvX2luZm8iCn0KCnByaW50X3N1bW1hcnkoKSB7CiAgZWNobyAiIgogIGVjaG8g IuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIgICAg ICAgICAgICAgICAgICAgICBTVFJFQU1JTkcgUkVBRCBCRU5DSE1BUksgUkVTVUxUUyAgICAgICAg ICAgICAgICAgICAiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQIgogIGVjaG8gIiIKICAKICBpZiBbWyAkQkFTRUxJTkUgLWVxIDEgXV07IHRoZW4KICAg IHByaW50ZiAiJS0yNnMgJS0xN3MgJS0xN3MgJS03cyAlLTdzICVzXG4iICJURVNUIiAiQkFTRUxJ TkUiICJQQVRDSEVEIiAiU1BFRURVUCIgIkNIQU5HRSIgIkkvTyBUSU1FIgogICAgZWNobyAi4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSAIgogICAgCiAgICBmb3IgU0laRSBpbiAkU0laRVM7IGRvCiAgICAgIGZvciB0ZXN0X25hbWUg aW4gYmxvb21fc2NhbiBibG9vbV92YWN1dW0gcGdzdGF0dHVwbGUgcGdzdGF0aW5kZXggZ2luX3Zh Y3V1bSBoYXNoX3ZhY3V1bSB3YWxfbG9nZ2luZzsgZG8KICAgICAgICBbWyAiJFRFU1QiICE9ICJh bGwiICYmICIkVEVTVCIgIT0gIiR0ZXN0X25hbWUiIF1dICYmIGNvbnRpbnVlCiAgICAgICAgY29t cGFyZV9yZXN1bHRzIFwKICAgICAgICAgICIkUk9PVF9CQVNFL3Jlc3VsdHMvYmFzZV8ke3Rlc3Rf bmFtZX1fJHtTSVpFfS5jc3YiIFwKICAgICAgICAgICIkUk9PVF9QQVRDSC9yZXN1bHRzL3BhdGNo ZWRfJHt0ZXN0X25hbWV9XyR7U0laRX0uY3N2IiBcCiAgICAgICAgICAiJHt0ZXN0X25hbWV9XyR7 U0laRX0iCiAgICAgIGRvbmUKICAgIGRvbmUKICBlbHNlCiAgICBlY2hvICJSZXN1bHRzIChwYXRj aGVkIG9ubHkpOiIKICAgIGVjaG8gIiIKICAgIGZvciBmIGluICIkUk9PVF9QQVRDSC9yZXN1bHRz LyIqLmNzdjsgZG8KICAgICAgW1sgLWYgIiRmIiBdXSB8fCBjb250aW51ZQogICAgICBwcmludGYg IiUtNDBzICVzXG4iICIkKGJhc2VuYW1lICIkZiIgLmNzdik6IiAiJChjYWxjX3N0YXRzICIkZiIp IgogICAgZG9uZQogIGZpCiAgCiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICJDU1YgZmlsZXM6ICRST09UX1BBVENIL3Jl c3VsdHMvIgogIFtbICRCQVNFTElORSAtZXEgMSBdXSAmJiBlY2hvICJCYXNlbGluZTogICRST09U X0JBU0UvcmVzdWx0cy8iCiAgCiAgIyBMaXN0IGdlbmVyYXRlZCBmbGFtZWdyYXBocwogIGlmIFtb ICRET19QUk9GSUxFIC1lcSAxIF1dOyB0aGVuCiAgICBsb2NhbCBzdmdzPSgpCiAgICBmb3IgZGly IGluICIkUk9PVF9CQVNFL3Byb2ZpbGUiICIkUk9PVF9QQVRDSC9wcm9maWxlIjsgZG8KICAgICAg W1sgLWQgIiRkaXIiIF1dIHx8IGNvbnRpbnVlCiAgICAgIGZvciBzdmcgaW4gIiRkaXIiLyouc3Zn OyBkbwogICAgICAgIFtbIC1mICIkc3ZnIiBdXSAmJiBzdmdzKz0oIiRzdmciKQogICAgICBkb25l CiAgICBkb25lCiAgICBpZiBbWyAkeyNzdmdzW0BdfSAtZ3QgMCBdXTsgdGhlbgogICAgICBlY2hv ICIiCiAgICAgIGVjaG8gIkZsYW1lZ3JhcGhzOiIKICAgICAgZm9yIHN2ZyBpbiAiJHtzdmdzW0Bd fSI7IGRvIGVjaG8gIiAgJHN2ZyI7IGRvbmUKICAgIGZpCiAgZmkKICAKICBlY2hvICLilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCn0KCiMgLS0tIE1haW4gLS0tCm1h aW4oKSB7CiAgbG9nICJTdHJlYW1pbmcgUmVhZCBCZW5jaG1hcmsiCiAgbG9nICJQYXRjaDogJFBB VENIICgkUEFUQ0hfVEFHKSIKICBsb2cgIlRlc3RzOiAkVEVTVCIKICBsb2cgIlNpemVzOiAkU0la RVMiCiAgbG9nICJSZXBzOiAgJFJFUFMiCiAgbG9nICJJL086ICAgJElPX01FVEhPRCAod29ya2Vy cz0kSU9fV09SS0VSUywgY29uY3VycmVuY3k9JElPX01BWF9DT05DVVJSRU5DWSkiCiAgW1sgJERJ UkVDVF9JTyAtZXEgMSBdXSAmJiBsb2cgIkRpcmVjdCBJTzogZW5hYmxlZCAoZGVidWdfaW9fZGly ZWN0PWRhdGEpIgogIFtbIC1uICIkSU9fREVMQVlfTVMiIF1dICYmIGxvZyAiSS9PIGRlbGF5OiAk e0lPX0RFTEFZX01TfW1zIHJlYWQgLyAke1dSSVRFX0RFTEFZX01TfW1zIHdyaXRlIHZpYSBkbV9k ZWxheSAoJERNX0RFTEFZX0RFVikiCiAgW1sgJERPX1BST0ZJTEUgLWVxIDEgXV0gJiYgbG9nICJQ cm9maWxlOiBlbmFibGVkIChmbGFtZWdyYXBocyDihpIgPHJvb3Q+L3Byb2ZpbGUvKSIKICAKICAj IEJ1aWxkCiAgaWYgW1sgJEJBU0VMSU5FIC1lcSAxIF1dOyB0aGVuCiAgICBidWlsZF9wZyAiJFJP T1RfQkFTRSIgIiIKICBmaQogIGJ1aWxkX3BnICIkUk9PVF9QQVRDSCIgIiRQQVRDSCIKICAKICAj IFJ1biB0ZXN0cwogIGlmIFtbICRCQVNFTElORSAtZXEgMSBdXTsgdGhlbgogICAgbG9nICJSdW5u aW5nIGJhc2VsaW5lIHRlc3RzIgogICAgcnVuX3Rlc3RzICIkUk9PVF9CQVNFIiAiYmFzZSIKICBm aQogIAogIGxvZyAiUnVubmluZyBwYXRjaGVkIHRlc3RzIgogIHJ1bl90ZXN0cyAiJFJPT1RfUEFU Q0giICJwYXRjaGVkIgogIAogICMgU3VtbWFyeQogIHByaW50X3N1bW1hcnkKfQoKbWFpbgo= --00000000000023e940064d072dcc--