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 1utul9-00G7vi-Cb for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Sep 2025 21:11:16 +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 1utul8-00BiEA-Gd for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Sep 2025 21:11:14 +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.94.2) (envelope-from ) id 1utul8-00BiE1-3y for pgsql-hackers@lists.postgresql.org; Wed, 03 Sep 2025 21:11:14 +0000 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1utul4-000PqI-2C for pgsql-hackers@postgresql.org; Wed, 03 Sep 2025 21:11:14 +0000 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-afebb6d4093so63574066b.1 for ; Wed, 03 Sep 2025 14:11:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756933869; x=1757538669; darn=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=JAwS3BB1sW41c/LmgdkyCovHsyTPM4Zyu4Z6rLohJUA=; b=H/rvrZwD82xW6jhCQqOkALBduLkOTTm05Ke1WyCXAH+P/emzxZhuUt0X6cYMeHQk0W 3bNRTa46o3MUZX7gTFYiBh//cdG6u4nSqyRfjUOI4pVpE391wCnfE5tM6uT6Yj5f4Iav /WZBPLUWZgx1DQ7o8iu+RRAAE4tz2wdzwW8qJQi21bg73Lqih9oayUbh8RdXPjaupSwi 7zWNzKsU1HAkWeVre/Dkek0hxDatnNqNInNoH9zCwneSNXIwcIiV/XEcPp5dpyTpRDsf fBcR/JfrzDlEcdrxDOp6O3qFicW5WMpaZu4x9563C71sum1bDjKnUM24PY218xGeVT5c ldoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756933869; x=1757538669; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JAwS3BB1sW41c/LmgdkyCovHsyTPM4Zyu4Z6rLohJUA=; b=JrSD7/4mR2SDyxoGVHOijsT81hm2bYi/87JYHlfEfuzx2eJZQdoYFjg+ntUl7P/NJr 9u/TPN0WqI6baXIY/L+pDmOsPS6xEAuicJTEdmWsgD0jVtRvNTWslFYgNoLeNN3zXyxe 3jaYDsR9pm8cK1cVnXn4Dgb0Z9miUelLYGvNUWiAdgkJj4wgKISVcz85Z72FTFu4Oh8U QfrNDD4qZZ5H425vX58o+efMFk0lN45HUZ44aa4IP5toBWpQkTE+zGK45Ku2ixzrvzqm YiOmh1/93FulwiUhkfi6EMnzoxVYxhlIXYN07xWfDCTxdE9vbwkG+iQZmWy88quAm91U ZYlw== X-Forwarded-Encrypted: i=1; AJvYcCXgng+f9U64P+UnkgT4EdUWDySzxW2nFcGy7iQQss4zwr0HDfB6Fdenr2J7/KyG+H9HGkw3d/2lGhVOR27k@postgresql.org X-Gm-Message-State: AOJu0Yy0X+MP4QlHem6ApZGxK0ES46+0gwgQDJ5hNjP540flIMdK2k0V PLWZQL3EBm1MLioRH8oWsliZ7XwIkVp/e2GEHksbDVmtAepJhnu7p/MFZpYQcITnSgRp2CyAxbK OsKNINzisVDxPa86y1dKD5S0OrEJWFZM= X-Gm-Gg: ASbGncv9OpjSxqKLGSqYxKDnQ5sMgYXtemblwtB1d5aPRhceKrqUyHmB/8lr2cp83ts UWiw/LDQh9wsxg0Lt8gQnLN2tahXX/MDumoC6JSA9WGvLVJkLiSA1CrRaAdT5PIZwr075uWV5VU B/tiNtin8QMj42fJbArWWnbJTRpG9jdpFRDkq6Gnf9VvQRlU4GisE+GDe7Rikn2jx9zbgLOMKKg oS7DaXydRUV2//0JFjWfF5kRbqm5KDmSmZ93bg= X-Google-Smtp-Source: AGHT+IGRxGV67/YJCXsJXnoUK7GgT/Tu/gcxW6JZq8ZbIlWZe2ugu8DO1JrguT4eCyt1eug+VssaUYsY1i59VKRkGSo= X-Received: by 2002:a17:907:2da8:b0:b04:23e0:5c0a with SMTP id a640c23a62f3a-b0423e07281mr1395428566b.20.1756933868315; Wed, 03 Sep 2025 14:11:08 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Naga Appani Date: Wed, 3 Sep 2025 16:10:56 -0500 X-Gm-Features: Ac12FXx-tXbKVgO4KjfpG9xnghtcUmAgrAj5yuS-ZTI79q5n70s33EL-KyYPgGg Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Ashutosh Bapat Cc: torikoshia , Michael Paquier , Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000001da037063dec0baa" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001da037063dec0baa Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Atsushi and Ashutosh, Thank you for reviewing the patch. Attached is v7, incorporating the feedback. Please see my responses in-line below. On Fri, Aug 22, 2025 at 6:45=E2=80=AFAM Ashutosh Bapat wrote: > > On Fri, Aug 22, 2025 at 7:37=E2=80=AFAM torikoshia wrote: > > > > | Now that pg_get_multixact_stats() exposes num_members, the HEAD branc= h > > | docs can describe the thresholds in terms of counts directly. > > > > Personally, I think it might be fine to keep the gigabyte-based > > description, and perhaps we could show both the number of members and > > gigabytes, since it'd be also helpful to have a sense of the scale. > > > > Those who have grown their own utilities to monitor the on-disk usage > will not be able to use the count based thresholds and might take some > time for them to starting using pg_get_multixact_stats(). It makes > sense to mention both the count and the corresponding disk usage > threshold. Something like "Also, if the number of multixact members > exceeds approximately 2^31 entries (occupying roughly more than 10GB > in storage) ... ". Users can choose which threshold they want to use. > Adding disk storage threshold in parenthesis indicates that the count > is more accurate and more useful. Updated docs to include both counts and approximate storage. > I thought mentioning bytes, a unit, in column name members_bytes would > not be appropriate in case we start reporting it in a different unit > like kB in future. But we already have > pg_stat_replication_slots::spill_bytes with similar naming. So may be > it's okay. But I would prefer members_size or members_storage or some > such units-free name. Good point! Adjusted to a units-free name: members_size. > + in pg_multixact/members directory, > + oldest_multixact is the oldest multixact ID still > in use, and > + oldest_offset is the oldest member offset still in u= se. > > I am not sure whether oldest_offset is worth exposing. It is an > implementation detail. Upthread, Michael suggested to expose oldest > offset from GetMultiXactInfo(), but I don't see him explicitly saying > that we should expose it through this function as well. Michael what > do you think? IMHO, exposing oldest_offset gives a full picture of multixact state. It complements oldest_multixact, and including it won=E2=80=99t hurt. That said, if consensus is against it, I=E2=80=99m happy to drop it. > + These values can be used to monitor multixact consumption and anticipat= e > + autovacuum behavior. See > + for further details on multixact wraparound. > > I still think that this is not needed. There is no reason to restrict > how users want to use this function. We usually don't do that unless > there is a hazard associated with it. Removed. > + > + This is a live snapshot of shared counters; the numbers can change > between calls, > + even within the same transaction. > + > > I have not seen the phrase "live snapshot" being used in the > documentation before. How about "The function reports the statistics > at the time of invoking the function. They may vary between calls even > within the same transaction."? Updated wording. > + linkend=3D"guc-autovacuum-multixact-freeze-max-age"/>. Also, if the num= ber > + of members created exceeds approximately 2^31 entries, aggressive vacuu= m > > a member means the transaction participating in a multixact. What you > intend to say is "if the number of multixacts member entries created > ...", right? Correct, updated. > + > + The pg_get_multixact_stats() function, described i= n > > unnecessary pair of commas. Fixed. > + This output shows a system with significant multixact activity: > about ~100 million > + multixact IDs and ~773 million member entries have been created > since the oldest > + surviving multixact (ID 39974368). By leveraging this information, > the function helps: > + > + > ... snip ... > + Detect potential performance impacts before they become critical. > + For instance, high multixact usage from frequent row-level locking or > + foreign key operations can lead to increased I/O and CPU overhead durin= g > + vacuum operations. Monitoring these stats helps tune autovacuum frequen= cy > + and transaction patterns. > + > + > + > > I am unsure whether we should be mentioning use cases in such detail. > Users may find other ways to use those counts. I think the following > paragraph should be placed here. > > + These values can be used to monitor multixact consumption and anticipat= e > + autovacuum behavior. See > + for further details on multixact wraparound. > > But others may have different opinions. > > Maybe you could further write in your example that an aggressive > autovacuum will be triggered in another 10 seconds (or so) if the > number of member entries continues to double every 5 seconds. Or some > practical "usage example" like that. Ack. I believe keeping the example with a short list is helpful for users to navigate and interpret the stats. If preferred, I can trim it to a brief paragraph with just the query in the next rev. > + * Returns statistics about current MultiXact usage: > + * - num_mxids: Number of MultiXact IDs in use > + * - num_members: Total number of member entries > + * - oldest_multixact: Oldest MultiXact ID still needed > + * - oldest_offset: Oldest offset still in use > > We don't need to mention each column here, it's evident from the > function body and also from the user facing documentation. Just the > first line is ok. Updated - kept only the high-level description. > + * > + * Returns a row of NULLs if the MultiXact system is not yet initialized= . > > tuple or record instead of row. > > In the earlier patch you were calling PG_RETURN_NULL(), which I > thought was better. It would get converted into a record of NULLs if > someone is to do SELECT * FROM pg_get_multixact_stats(). > > I don't think "the MultiXact system is not yet initialized" is the > right description of that condition. GetMultiXactInfo() prologue says > " > Returns false if unable to determine, the oldest offset being > unknown." MultiXactStatData has following comment for oldest offset. > /* > * Oldest multixact offset that is potentially referenced by a multixact > * referenced by a relation. We don't always know this value, so there's > * a flag here to indicate whether or not we currently do. > */ Switched to PG_RETURN_NULL() and rephrased both code comment and docs. > + * Calculate approximate storage space: > + * - Members are stored in groups of 4 > + * - Each group takes 20 bytes (5 bytes per member) > + * Note: This ignores small page overhead (12 bytes per 8KB) > + */ > + membersBytes =3D (int64) members * 5; > > Do we have some constant macros or sizeof(some structure) defined for > 5 and 4? That way this computation will be self maintaining and self > documenting. Those macros are already defined in multixact.c - for example, MULTIXACT_MEMBERS_PER_MEMBERGROUP and MULTIXACT_MEMBERGROUP_SIZE encode the 4-per-group and 20-byte layout. They are local today, and I=E2=80=99m not sure why they were never exposed. Rather than moving th= em into a header and creating wider changes, v7 retains the explicit 5-bytes/member estimate with an explanatory comment to stay consistent with existing guidance. If we feel these macros should be promoted to a header, I think that would be best handled as a small, separate patch, and I=E2=80=99d be happy to help with that. > + nulls[0] =3D nulls[1] =3D nulls[2] =3D nulls[3] =3D nulls[4] =3D false; > > memset(nulls, false, sizeof(nulls)); is better and used everywhere. > > In fact, instead of initializing it all to true first and then setting > all to false here, we should memset here and set it to true in else > block. Updated. v7 uses memset(false) and only sets true where needed. > +++ b/src/test/isolation/specs/multixact_stats.spec > > I have not an seen an isolation test being used for testing a stats > function. But I find it useful. Let's see what others think. > > @@ -0,0 +1,127 @@ > +# High-signal invariants for pg_get_multixact_stats() > +# We create exactly one fresh MultiXact on a brand-new table. While > it is pinned > +# by two open transactions, we assert only invariants that background > VACUUM/FREEZE > +# cannot violate: > +# =E2=80=A2 members increased by =E2=89=A5 1 when the second locker arri= ved, > +# =E2=80=A2 num_mxids / num_members did not decrease vs earlier snapshot= s, > +# =E2=80=A2 oldest_* never decreases. > +# We make NO assertions after releasing locks (freezing/truncation > may shrink deltas). > +# NOTE: Snapshots snap0 and subsequent checks are taken inside an open d= river > +# transaction to narrow the window for unrelated truncation between snap= shots. > > What's a driver transaction? A driver transaction is simply the controlling session that stays open while snapshots are taken. > +# > +# Terminology (global counters): > +# num_mxids, num_members : =E2=80=9Cin-use=E2=80=9D deltas derived from = global horizons > +# oldest_multixact, offset : oldest horizons; they move forward, never b= ackward > +# > +# All assertions execute while our multixact is pinned by open txns, > which protects > +# the truncation horizon (VACUUM can=E2=80=99t advance past our pinned m= ulti). > > Probably this comment is not needed. But from the sequence of steps > executed, the data is collected when multixact is pinned (what does > that mean?) but the assertions are executed at the end when all the > transactions are committed. Am I correct? You are correct =E2=80=94 the assertions are executed at the end, after the= commits. The key point is that all snapshots are taken while the multixact is pinned by open transactions, so the invariants hold despite the final check happening later. > +step snap0 { > + CREATE TEMP TABLE snap0 AS > + SELECT num_mxids, num_members, oldest_multixact, oldest_offset > + FROM pg_get_multixact_stats(); > +} > > You could use a single table with a primary key column to distinguish > snaps which can be used for joining the rows. Why use a temporary > table? Just setup and tear down the snap table as well? I kept separate temp tables to keep each snapshot isolated and easy to read in the spec. A single table with a PK would work too, but I felt temp tables made the sequence clearer. > + > +# Pretty, deterministic key/value output of boolean checks. > +# Keys: > ... snip ... > + (s1.num_mxids >=3D COALESCE(s0.num_mxids, 0)), > + (s2.num_mxids >=3D COALESCE(s1.num_mxids, 0)), > + (s1.num_members >=3D COALESCE(s0.num_members, 0)), > + (s2.num_members >=3D COALESCE(s1.num_members, 0)) > + ] > > This is getting too complex to follow. It produces pretty output but > the query is complex. Instead just let keys as the columns in the > query. Maybe you could print expanded output if that's possible in an > isolation test. > I used the labeled key/value array to mimic \x-style readability while keeping the output deterministic for isolation=E2=80=99s text diffs. It clearly names each invariant and avoids formatter-dependent width/spacing. Thanks again for the thoughtful reviews. I really appreciate the guidance and will be glad to adjust further if needed. Best regards, Naga --0000000000001da037063dec0baa Content-Type: application/octet-stream; name="v7-0001-Add-pg_get_multixact_stats-function-for-monitorin.patch" Content-Disposition: attachment; filename="v7-0001-Add-pg_get_multixact_stats-function-for-monitorin.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mf4h18kl0 RnJvbSA3OWRjNmZmZDUwYWQwYTJkYzg0ZWViMmRhMzM1M2Q4MjNiMGNlZDkxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IFdlZCwgMyBTZXAgMjAyNSAwNDowOTo1NiArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjddIEFkZCBw Z19nZXRfbXVsdGl4YWN0X3N0YXRzKCkgZnVuY3Rpb24gZm9yIG1vbml0b3JpbmcKIE11bHRpWGFj dCB1c2FnZQoKRXhwb3NlIG11bHRpeGFjdCBzdGF0ZSB2aWEgYSBuZXcgU1FMLWNhbGxhYmxlIGZ1 bmN0aW9uIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKSwKcmV0dXJuaW5nOgotIG51bV9teGlkcyAg ICAgICAgICA6IG51bWJlciBvZiBNdWx0aVhhY3QgSURzIGluIHVzZQotIG51bV9tZW1iZXJzICAg ICAgICA6IG51bWJlciBvZiBtZW1iZXIgZW50cmllcyBpbiB1c2UKLSBtZW1iZXJzX3NpemUgICAg ICAgOiBieXRlcyB1c2VkIGJ5IG51bV9tZW1iZXJzIGluIHBnX211bHRpeGFjdC9tZW1iZXJzIGRp cmVjdG9yeQotIG9sZGVzdF9tdWx0aXhhY3QgICA6IG9sZGVzdCBNdWx0aVhhY3QgSUQgc3RpbGwg bmVlZGVkCi0gb2xkZXN0X29mZnNldCAgICAgIDogb2xkZXN0IG1lbWJlciBvZmZzZXQgc3RpbGwg aW4gdXNlCgpUaGlzIHBhdGNoIGFkZHMgcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpIGZ1bmN0aW9u CiAgIC0gU1FMLWNhbGxhYmxlIGludGVyZmFjZSB0byBHZXRNdWx0aVhhY3RJbmZvKCkKICAgLSBS ZXR1cm5zIE5VTExzIGlmIE11bHRpWGFjdCBzeXN0ZW0gbm90IGluaXRpYWxpemVkCiAgIC0gSW5j bHVkZXMgaXNvbGF0aW9uIHRlc3RzIGZvciBtb25pdG9yaW5nIGludmFyaWFudHMKCkRvY3VtZW50 YXRpb24gdXBkYXRlczoKLSBmdW5jLWluZm8uc2dtbDogYWRkIGZ1bmN0aW9uIGVudHJ5Ci0gbWFp bnRlbmFuY2Uuc2dtbDogbWVudGlvbiBtb25pdG9yaW5nIG11bHRpeGFjdCB1c2FnZQoKQnVpbGQg YW5kIGNhdGFsb2c6Ci0gQWRkIGZ1bmN0aW9uIHRvIGV4aXN0aW5nIG11bHRpeGFjdGZ1bmNzLmMK LSBwZ19wcm9jLmRhdCBlbnRyeQoKQXV0aG9yOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5j b20+ClJldmlld2VkLWJ5OiBBc2h1dG9zaCBCYXBhdCA8YXNodXRvc2guYmFwYXQub3NzQGdtYWls LmNvbT4KUmV2aWV3ZWQtYnk6IE1pY2hhZWwgUGFxdWllciA8bWljaGFlbEBwYXF1aWVyLnh5ej4K RGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0NB JTJCUWVZJTJCQUFzWUs2V3ZCVzRxWXpIejRiYWhIeWNEQVlfcTVFQ21Ia0VWX2VCOWNremclNDBt YWlsLmdtYWlsLmNvbQotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAg ICAgICAgICB8ICAzNCArKysrKwogZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwgICAgICAg ICAgICAgICAgIHwgIDU3ICsrKysrKystCiBzcmMvYmFja2VuZC91dGlscy9hZHQvbXVsdGl4YWN0 ZnVuY3MuYyAgICAgICAgfCAgNDcgKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9j LmRhdCAgICAgICAgICAgICAgIHwgIDE1ICsrKwogLi4uL2lzb2xhdGlvbi9leHBlY3RlZC9tdWx0 aXhhY3Rfc3RhdHMub3V0ICAgIHwgIDk0ICsrKysrKysrKysrKysKIHNyYy90ZXN0L2lzb2xhdGlv bi9pc29sYXRpb25fc2NoZWR1bGUgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9pc29sYXRpb24v c3BlY3MvbXVsdGl4YWN0X3N0YXRzLnNwZWMgfCAxMjcgKysrKysrKysrKysrKysrKysrCiA3IGZp bGVzIGNoYW5nZWQsIDM2OSBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9tdWx0aXhhY3Rfc3RhdHMub3V0 CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFjdF9z dGF0cy5zcGVjCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwg Yi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCBjMzkzODMyZDk0Yy4uZmNj NWU0YmRlMzggMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCisr KyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0yOTc1LDYgKzI5NzUsNDAg QEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIvcG9zdGdyZXN9 CiAgICAgICAgIG1vZGlmeSBrZXkgY29sdW1ucy4KICAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAg ICAgIDwvcm93PgorCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxl X2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRlcm0+ CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzPC9wcmltYXJ5PgorICAg ICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9tdWx0aXhhY3Rfc3Rh dHM8L2Z1bmN0aW9uPiAoKQorICAgICAgICA8cmV0dXJudmFsdWU+cmVjb3JkPC9yZXR1cm52YWx1 ZT4KKyAgICAgICAgKCA8cGFyYW1ldGVyPm51bV9teGlkczwvcGFyYW1ldGVyPiA8dHlwZT5pbnRl Z2VyPC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm51bV9tZW1iZXJzPC9wYXJhbWV0ZXI+ IDx0eXBlPmJpZ2ludDwvdHlwZT4sCisgICAgICAgICAgPHBhcmFtZXRlcj5tZW1iZXJzX3NpemU8 L3BhcmFtZXRlcj4gPHR5cGU+YmlnaW50PC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm9s ZGVzdF9tdWx0aXhhY3Q8L3BhcmFtZXRlcj4gPHR5cGU+eGlkPC90eXBlPiwKKyAgICAgICAgICA8 cGFyYW1ldGVyPm9sZGVzdF9vZmZzZXQ8L3BhcmFtZXRlcj4gPHR5cGU+YmlnaW50PC90eXBlPiAp CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBSZXR1cm5zIHN0YXRpc3Rp Y3MgYWJvdXQgY3VycmVudCBtdWx0aXhhY3QgdXNhZ2U6CisgICAgICAgIDxsaXRlcmFsPm51bV9t eGlkczwvbGl0ZXJhbD4gaXMgdGhlIG51bWJlciBvZiBtdWx0aXhhY3QgSURzIGFzc2lnbmVkLAor ICAgICAgICA8bGl0ZXJhbD5udW1fbWVtYmVyczwvbGl0ZXJhbD4gaXMgdGhlIG51bWJlciBvZiBt dWx0aXhhY3QgbWVtYmVyIGVudHJpZXMgY3JlYXRlZCwKKyAgICAgICAgPGxpdGVyYWw+bWVtYmVy c19zaXplPC9saXRlcmFsPiBpcyB0aGUgc3RvcmFnZSBvY2N1cGllZCBieSA8bGl0ZXJhbD5udW1f bWVtYmVyczwvbGl0ZXJhbD4KKyAgICAgICAgaW4gPGxpdGVyYWw+cGdfbXVsdGl4YWN0L21lbWJl cnM8L2xpdGVyYWw+IGRpcmVjdG9yeSwKKyAgICAgICAgPGxpdGVyYWw+b2xkZXN0X211bHRpeGFj dDwvbGl0ZXJhbD4gaXMgdGhlIG9sZGVzdCBtdWx0aXhhY3QgSUQgc3RpbGwgaW4gdXNlLCBhbmQK KyAgICAgICAgPGxpdGVyYWw+b2xkZXN0X29mZnNldDwvbGl0ZXJhbD4gaXMgdGhlIG9sZGVzdCBt ZW1iZXIgb2Zmc2V0IHN0aWxsIGluIHVzZS4KKyAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9InZh Y3V1bS1mb3ItbXVsdGl4YWN0LXdyYXBhcm91bmQiLz4gZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBt dWx0aXhhY3Qgd3JhcGFyb3VuZC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAg ICAgIFRoZSBmdW5jdGlvbiByZXBvcnRzIHN0YXRpc3RpY3MgYXQgdGhlIHRpbWUgaXQgaXMgaW52 b2tlZC4gVmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gY2FsbHMsCisgICAgICAgIGV2ZW4gd2l0aGlu IGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAg ICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgPGxpdGVyYWw+TlVMTDwvbGl0ZXJhbD4gd2hlbiBt dWx0aXhhY3Qgc3RhdGlzdGljcyBhcmUgdW5hdmFpbGFibGUuCisgICAgICAgIEZvciBleGFtcGxl LCBkdXJpbmcgc3RhcnR1cCBiZWZvcmUgbXVsdGl4YWN0IGluaXRpYWxpemF0aW9uIGNvbXBsZXRl cyBvciB3aGVuCisgICAgICAgIHRoZSBvbGRlc3QgbWVtYmVyIG9mZnNldCBjYW5ub3QgYmUgZGV0 ZXJtaW5lZC4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Ri b2R5PgogICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9tYWludGVuYW5jZS5zZ21sIGIvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwKaW5kZXgg ZTdhOWY1OGMwMTUuLjhiMjY1ZTIzNDhmIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbWFpbnRl bmFuY2Uuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbApAQCAtODEzLDE0 ICs4MTMsNTkgQEAgSElOVDogIEV4ZWN1dGUgYSBkYXRhYmFzZS13aWRlIFZBQ1VVTSBpbiB0aGF0 IGRhdGFiYXNlLgogICAgIDxwYXJhPgogICAgICBBcyBhIHNhZmV0eSBkZXZpY2UsIGFuIGFnZ3Jl c3NpdmUgdmFjdXVtIHNjYW4gd2lsbAogICAgICBvY2N1ciBmb3IgYW55IHRhYmxlIHdob3NlIG11 bHRpeGFjdC1hZ2UgaXMgZ3JlYXRlciB0aGFuIDx4cmVmCi0gICAgIGxpbmtlbmQ9Imd1Yy1hdXRv dmFjdXVtLW11bHRpeGFjdC1mcmVlemUtbWF4LWFnZSIvPi4gIEFsc28sIGlmIHRoZQotICAgICBz dG9yYWdlIG9jY3VwaWVkIGJ5IG11bHRpeGFjdHMgbWVtYmVycyBleGNlZWRzIGFib3V0IDEwR0Is IGFnZ3Jlc3NpdmUgdmFjdXVtCi0gICAgIHNjYW5zIHdpbGwgb2NjdXIgbW9yZSBvZnRlbiBmb3Ig YWxsIHRhYmxlcywgc3RhcnRpbmcgd2l0aCB0aG9zZSB0aGF0Ci0gICAgIGhhdmUgdGhlIG9sZGVz dCBtdWx0aXhhY3QtYWdlLiAgQm90aCBvZiB0aGVzZSBraW5kcyBvZiBhZ2dyZXNzaXZlCi0gICAg IHNjYW5zIHdpbGwgb2NjdXIgZXZlbiBpZiBhdXRvdmFjdXVtIGlzIG5vbWluYWxseSBkaXNhYmxl ZC4gVGhlIG1lbWJlcnMgc3RvcmFnZQotICAgICBhcmVhIGNhbiBncm93IHVwIHRvIGFib3V0IDIw R0IgYmVmb3JlIHJlYWNoaW5nIHdyYXBhcm91bmQuCisgICAgIGxpbmtlbmQ9Imd1Yy1hdXRvdmFj dXVtLW11bHRpeGFjdC1mcmVlemUtbWF4LWFnZSIvPi4gQWxzbywgaWYgdGhlIG51bWJlcgorICAg ICBvZiBtdWx0aXhhY3QgbWVtYmVyIGVudHJpZXMgY3JlYXRlZCBleGNlZWRzIGFwcHJveGltYXRl bHkgMl4zMSBlbnRyaWVzCisgICAgIChvY2N1cHlpbmcgcm91Z2hseSAxMEdCIGluIHRoZSA8bGl0 ZXJhbD5wZ19tdWx0aXhhY3QvbWVtYmVyczwvbGl0ZXJhbD4gZGlyZWN0b3J5KSwKKyAgICAgYWdn cmVzc2l2ZSB2YWN1dW0gc2NhbnMgd2lsbCBvY2N1ciBtb3JlIG9mdGVuIGZvciBhbGwgdGFibGVz LCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQKKyAgICAgaGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFj dC1hZ2UuIEJvdGggb2YgdGhlc2Uga2luZHMgb2YgYWdncmVzc2l2ZQorICAgICBzY2FucyB3aWxs IG9jY3VyIGV2ZW4gaWYgYXV0b3ZhY3V1bSBpcyBub21pbmFsbHkgZGlzYWJsZWQuIFRoZSBtZW1i ZXJzIGNhbiBncm93CisgICAgIHVwIHRvIGFwcHJveGltYXRlbHkgMl4zMiBlbnRyaWVzIGJlZm9y ZSByZWFjaGluZyB3cmFwYXJvdW5kLgogICAgIDwvcGFyYT4KIAorICAgIDxwYXJhPgorICAgICBU aGUgPGZ1bmN0aW9uPnBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTwvZnVuY3Rpb24+IGZ1bmN0aW9u IGRlc2NyaWJlZCBpbgorICAgICA8eHJlZiBsaW5rZW5kPSJmdW5jdGlvbnMtcGctc25hcHNob3Qi Lz4gcHJvdmlkZXMgYSB3YXkgdG8gbW9uaXRvcgorICAgICBtdWx0aXhhY3QgYWxsb2NhdGlvbiBh bmQgdXNhZ2UgcGF0dGVybnMgaW4gcmVhbCB0aW1lLiBGb3IgZXhhbXBsZToKKyAgICAgPHByb2dy YW1saXN0aW5nPgorcG9zdGdyZXM9IyBTRUxFQ1QgKixwZ19zaXplX3ByZXR0eShtZW1iZXJzX3Np emUpIG1lbWJlcnNfc2l6ZV9wcmV0dHkgRlJPTSBwZ19jYXRhbG9nLnBnX2dldF9tdWx0aXhhY3Rf c3RhdHMoKTsKKyBudW1fbXhpZHMgfCBudW1fbWVtYmVycyB8IG1lbWJlcnNfc2l6ZSB8IG9sZGVz dF9tdWx0aXhhY3QgfCBvbGRlc3Rfb2Zmc2V0IHwgbWVtYmVyc19zaXplX3ByZXR0eQorLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDMxMTc0MDI5OSB8ICAyNzg1MjQx MTc2IHwgIDEzOTI2MjA1ODgwIHwgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDMgfCAx MyBHQgorKDEgcm93KQorICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICBUaGlzIG91dHB1dCBz aG93cyBhIHN5c3RlbSB3aXRoIHNpZ25pZmljYW50IG11bHRpeGFjdCBhY3Rpdml0eTogYWJvdXQg fjMxMiBtaWxsaW9uCisgICAgIG11bHRpeGFjdCBJRHMgYW5kIH4yLjggYmlsbGlvbiBtZW1iZXIg ZW50cmllcyBjb25zdW1pbmcgMTMgR0Igb2Ygc3RvcmFnZSBzcGFjZS4KKyAgICAgQnkgbGV2ZXJh Z2luZyB0aGlzIGluZm9ybWF0aW9uLCB0aGUgZnVuY3Rpb24gaGVscHM6CisgICAgIDxvcmRlcmVk bGlzdD4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8c2ltcGFyYT4KKyAgICAgICAgSWRlbnRp ZnkgdW51c3VhbCBtdWx0aXhhY3QgYWN0aXZpdHkgZnJvbSBjb25jdXJyZW50IHJvdy1sZXZlbCBs b2NrcworICAgICAgICBvciBmb3JlaWduIGtleSBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgYSBz cGlrZSBpbiA8bGl0ZXJhbD5udW1fbXhpZHM8L2xpdGVyYWw+IG1pZ2h0IGluZGljYXRlCisgICAg ICAgIG11bHRpcGxlIHNlc3Npb25zIHJ1bm5pbmcgPGxpdGVyYWw+VVBEQVRFPC9saXRlcmFsPiBz dGF0ZW1lbnRzIHdpdGggZm9yZWlnbiBrZXkgY2hlY2tzLAorICAgICAgICBjb25jdXJyZW50IDxs aXRlcmFsPlNFTEVDVCBGT1IgU0hBUkU8L2xpdGVyYWw+IG9wZXJhdGlvbnMsIG9yIGZyZXF1ZW50 IHVzZSBvZiBzYXZlcG9pbnRzCisgICAgICAgIGNhdXNpbmcgbG9jayBjb250ZW50aW9uLgorICAg ICAgIDwvc2ltcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+CisgICAg ICAgPHNpbXBhcmE+CisgICAgICAgIFRyYWNrIG11bHRpeGFjdCBjbGVhbnVwIGVmZmljaWVuY3kg YnkgbW9uaXRvcmluZyBvbGRlc3RfbXVsdGl4YWN0LgorICAgICAgICBJZiB0aGlzIHZhbHVlIHJl bWFpbnMgdW5jaGFuZ2VkIHdoaWxlIDxsaXRlcmFsPm51bV9tZW1iZXJzPC9saXRlcmFsPiBncm93 cywgaXQgY291bGQgaW5kaWNhdGUKKyAgICAgICAgdGhhdCBsb25nLXJ1bm5pbmcgdHJhbnNhY3Rp b25zIGFyZSBwcmV2ZW50aW5nIGNsZWFudXAsIG9yIGF1dG92YWN1dW0gaXMKKyAgICAgICAgbm90 IGtlZXBpbmcgdXAgd2l0aCB0aGUgd29ya2xvYWQuCisgICAgICAgPC9zaW1wYXJhPgorICAgICAg PC9saXN0aXRlbT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8c2ltcGFyYT4KKyAgICAgICAg RGV0ZWN0IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpbXBhY3RzIGJlZm9yZSB0aGV5IGJlY29tZSBj cml0aWNhbC4KKyAgICAgICAgRm9yIGluc3RhbmNlLCBoaWdoIG11bHRpeGFjdCB1c2FnZSBmcm9t IGZyZXF1ZW50IHJvdy1sZXZlbCBsb2NraW5nIG9yCisgICAgICAgIGZvcmVpZ24ga2V5IG9wZXJh dGlvbnMgY2FuIGxlYWQgdG8gaW5jcmVhc2VkIEkvTyBhbmQgQ1BVIG92ZXJoZWFkIGR1cmluZwor ICAgICAgICB2YWN1dW0gb3BlcmF0aW9ucy4gTW9uaXRvcmluZyB0aGVzZSBzdGF0cyBoZWxwcyB0 dW5lIGF1dG92YWN1dW0gZnJlcXVlbmN5CisgICAgICAgIGFuZCB0cmFuc2FjdGlvbiBwYXR0ZXJu cy4KKyAgICAgICA8L3NpbXBhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L29yZGVyZWRs aXN0PgorICAgICA8L3BhcmE+CisKICAgICA8cGFyYT4KICAgICAgU2ltaWxhciB0byB0aGUgWElE IGNhc2UsIGlmIGF1dG92YWN1dW0gZmFpbHMgdG8gY2xlYXIgb2xkIE1YSURzIGZyb20gYSB0YWJs ZSwgdGhlCiAgICAgIHN5c3RlbSB3aWxsIGJlZ2luIHRvIGVtaXQgd2FybmluZyBtZXNzYWdlcyB3 aGVuIHRoZSBkYXRhYmFzZSdzIG9sZGVzdCBNWElEcyByZWFjaCBmb3J0eQpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L211bHRpeGFjdGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGls cy9hZHQvbXVsdGl4YWN0ZnVuY3MuYwppbmRleCBlNzRlYTkzODM0OC4uYzM5M2YxMWEzOGMgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXhhY3RmdW5jcy5jCisrKyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXhhY3RmdW5jcy5jCkBAIC04NSwzICs4NSw1MCBAQCBw Z19nZXRfbXVsdGl4YWN0X21lbWJlcnMoUEdfRlVOQ1RJT05fQVJHUykKIAogCVNSRl9SRVRVUk5f RE9ORShmdW5jY3h0KTsKIH0KKworLyoKKyAqIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMKKyAqCisg KiBSZXR1cm5zIHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBNdWx0aVhhY3QgdXNhZ2UuCisgKgor ICogUmV0dXJucyBOVUxMIGlmIHRoZSBvbGRlc3QgcmVmZXJlbmNlZCBvZmZzZXQgaXMgdW5rbm93 biwgd2hpY2ggaGFwcGVucyBkdXJpbmcKKyAqIHN5c3RlbSBzdGFydHVwIG9yIHdoZW4gbm8gTXVs dGlYYWN0IHJlZmVyZW5jZXMgZXhpc3QgaW4gYW55IHJlbGF0aW9uLgorICovCitEYXR1bQorcGdf Z2V0X211bHRpeGFjdF9zdGF0cyhQR19GVU5DVElPTl9BUkdTKQoreworCVR1cGxlRGVzYwl0dXBk ZXNjOworCURhdHVtCQl2YWx1ZXNbNV07CisJYm9vbAkJbnVsbHNbNV07CisJTXVsdGlYYWN0T2Zm c2V0CW1lbWJlcnM7CisJTXVsdGlYYWN0SWQJb2xkZXN0TXVsdGlYYWN0SWQ7CisJdWludDMyCQlt dWx0aXhhY3RzOworCU11bHRpWGFjdE9mZnNldAlvbGRlc3RPZmZzZXQ7CisJaW50NjQJCW1lbWJl cnNCeXRlczsKKworCWlmIChnZXRfY2FsbF9yZXN1bHRfdHlwZShmY2luZm8sIE5VTEwsICZ0dXBk ZXNjKSAhPSBUWVBFRlVOQ19DT01QT1NJVEUpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNv ZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorCQkJCSBlcnJtc2coInJldHVybiB0 eXBlIG11c3QgYmUgYSByb3cgdHlwZSIpKSk7CisKKwlpZiAoR2V0TXVsdGlYYWN0SW5mbygmbXVs dGl4YWN0cywgJm1lbWJlcnMsICZvbGRlc3RNdWx0aVhhY3RJZCwgJm9sZGVzdE9mZnNldCkpCisJ eworCQkvKgorCQkgKiBDYWxjdWxhdGUgc3RvcmFnZSBzcGFjZSBmb3IgbWVtYmVycy4gTWVtYmVy cyBhcmUgc3RvcmVkIGluIGdyb3VwcyBvZiA0LAorCQkgKiB3aXRoIGVhY2ggZ3JvdXAgdGFraW5n IDIwIGJ5dGVzLCByZXN1bHRpbmcgaW4gNSBieXRlcyBwZXIgbWVtYmVyLgorCQkgKiBOb3RlOiBU aGlzIGlnbm9yZXMgc21hbGwgcGFnZSBvdmVyaGVhZCAoMTIgYnl0ZXMgcGVyIDhLQikKKwkJICov CisJCW1lbWJlcnNCeXRlcyA9IChpbnQ2NCkgbWVtYmVycyAqIDU7CisKKwkJdmFsdWVzWzBdID0g SW50MzJHZXREYXR1bShtdWx0aXhhY3RzKTsKKwkJdmFsdWVzWzFdID0gSW50NjRHZXREYXR1bSht ZW1iZXJzKTsKKwkJdmFsdWVzWzJdID0gSW50NjRHZXREYXR1bShtZW1iZXJzQnl0ZXMpOworCQl2 YWx1ZXNbM10gPSBVSW50MzJHZXREYXR1bShvbGRlc3RNdWx0aVhhY3RJZCk7CisJCXZhbHVlc1s0 XSA9IEludDY0R2V0RGF0dW0ob2xkZXN0T2Zmc2V0KTsKKwkJbWVtc2V0KG51bGxzLCBmYWxzZSwg c2l6ZW9mKG51bGxzKSk7CisKKwkJcmV0dXJuIEhlYXBUdXBsZUdldERhdHVtKGhlYXBfZm9ybV90 dXBsZSh0dXBkZXNjLCB2YWx1ZXMsIG51bGxzKSk7CisJfQorCisJUEdfUkVUVVJOX05VTEwoKTsK K30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IDExOGQ2ZGExYWNlLi5mNWYyMjRiOGExNCAx MDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC0xMjU3Niw0ICsxMjU3NiwxOSBAQAogICBwcm9h cmduYW1lcyA9PiAne3BpZCxpb19pZCxpb19nZW5lcmF0aW9uLHN0YXRlLG9wZXJhdGlvbixvZmYs bGVuZ3RoLHRhcmdldCxoYW5kbGVfZGF0YV9sZW4scmF3X3Jlc3VsdCxyZXN1bHQsdGFyZ2V0X2Rl c2MsZl9zeW5jLGZfbG9jYWxtZW0sZl9idWZmZXJlZH0nLAogICBwcm9zcmMgPT4gJ3BnX2dldF9h aW9zJyB9LAogCisjIEdldCBNdWx0aVhhY3Qgc3RhdGUKK3sKKyAgb2lkID0+ICc5MDAxJywKKyAg ZGVzY3IgPT4gJ2dldCBjdXJyZW50IG11bHRpeGFjdCBtZW1iZXIgYW5kIG11bHRpeGFjdCBJRCBj b3VudHMgYW5kIG9sZGVzdCB2YWx1ZXMnLAorICBwcm9uYW1lID0+ICdwZ19nZXRfbXVsdGl4YWN0 X3N0YXRzJywKKyAgcHJvcmV0dHlwZSA9PiAncmVjb3JkJywKKyAgcHJvYXJndHlwZXMgPT4gJycs CisgIHByb2FsbGFyZ3R5cGVzID0+ICd7aW50NCxpbnQ4LGludDgseGlkLGludDh9JywKKyAgcHJv YXJnbW9kZXMgPT4gJ3tvLG8sbyxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3tudW1fbXhpZHMs bnVtX21lbWJlcnMsbWVtYmVyc19zaXplLG9sZGVzdF9tdWx0aXhhY3Qsb2xkZXN0X29mZnNldH0n LAorICBwcm92b2xhdGlsZSA9PiAndicsCisgIHByb3BhcmFsbGVsID0+ICdzJywKKyAgcHJvc3Jj ID0+ICdwZ19nZXRfbXVsdGl4YWN0X3N0YXRzJworfSwKKwogXQpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvaXNvbGF0aW9uL2V4cGVjdGVkL211bHRpeGFjdF9zdGF0cy5vdXQgYi9zcmMvdGVzdC9pc29s YXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uMjg5M2M0ZDlmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVz dC9pc29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApAQCAtMCwwICsxLDk0IEBA CitQYXJzZWQgdGVzdCBzcGVjIHdpdGggMyBzZXNzaW9ucworCitzdGFydGluZyBwZXJtdXRhdGlv bjogZF9iZWdpbiBzbmFwMCBzMV9iZWdpbiBzMV9sb2NrIHNuYXAxIHMyX2JlZ2luIHMyX2xvY2sg c25hcDIgY2hlY2tfd2hpbGVfcGlubmVkIGRfY29tbWl0IHMxX2NvbW1pdCBzMl9jb21taXQKK3N0 ZXAgZF9iZWdpbjogQkVHSU47IFNFVCBjbGllbnRfbWluX21lc3NhZ2VzID0gd2FybmluZzsKK3N0 ZXAgc25hcDA6IAorICBDUkVBVEUgVEVNUCBUQUJMRSBzbmFwMCBBUworICBTRUxFQ1QgbnVtX214 aWRzLCBudW1fbWVtYmVycywgb2xkZXN0X211bHRpeGFjdCwgb2xkZXN0X29mZnNldAorICBGUk9N IHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKKworc3RlcCBzMV9iZWdpbjogQkVHSU47CitzdGVw IHMxX2xvY2s6IFNFTEVDVCAxIEZST00gbXhxIFdIRVJFIGlkPTEgRk9SIEtFWSBTSEFSRTsKKz9j b2x1bW4/CistLS0tLS0tLQorICAgICAgIDEKKygxIHJvdykKKworc3RlcCBzbmFwMTogCisgIENS RUFURSBURU1QIFRBQkxFIHNuYXAxIEFTCisgIFNFTEVDVCBudW1fbXhpZHMsIG51bV9tZW1iZXJz LCBvbGRlc3RfbXVsdGl4YWN0LCBvbGRlc3Rfb2Zmc2V0CisgIEZST00gcGdfZ2V0X211bHRpeGFj dF9zdGF0cygpOworCitzdGVwIHMyX2JlZ2luOiBCRUdJTjsKK3N0ZXAgczJfbG9jazogU0VMRUNU IDEgRlJPTSBteHEgV0hFUkUgaWQ9MSBGT1IgS0VZIFNIQVJFOworP2NvbHVtbj8KKy0tLS0tLS0t CisgICAgICAgMQorKDEgcm93KQorCitzdGVwIHNuYXAyOiAKKyAgQ1JFQVRFIFRFTVAgVEFCTEUg c25hcDIgQVMKKyAgU0VMRUNUIG51bV9teGlkcywgbnVtX21lbWJlcnMsIG9sZGVzdF9tdWx0aXhh Y3QsIG9sZGVzdF9vZmZzZXQKKyAgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7CisKK3N0 ZXAgY2hlY2tfd2hpbGVfcGlubmVkOiAKKyAgU0VMRUNUIHIuYXNzZXJ0aW9uLCByLm9rCisgIEZS T00gc25hcDAgczAKKyAgSk9JTiBzbmFwMSBzMSBPTiBUUlVFCisgIEpPSU4gc25hcDIgczIgT04g VFJVRSwKKyAgTEFURVJBTCB1bm5lc3QoCisgICAgQVJSQVlbCisgICAgICAnaXNfaW5pdF9teGlk cycsCisgICAgICAnaXNfaW5pdF9tZW1iZXJzJywKKyAgICAgICdpc19pbml0X29sZGVzdF9teGlk JywKKyAgICAgICdpc19pbml0X29sZGVzdF9vZmYnLAorICAgICAgJ2lzX29sZGVzdF9teGlkX25v bmRlY18wMScsCisgICAgICAnaXNfb2xkZXN0X214aWRfbm9uZGVjXzEyJywKKyAgICAgICdpc19v bGRlc3Rfb2ZmX25vbmRlY18wMScsCisgICAgICAnaXNfb2xkZXN0X29mZl9ub25kZWNfMTInLAor ICAgICAgJ2lzX21lbWJlcnNfaW5jcmVhc2VkX2dlMScsCisgICAgICAnaXNfbXhpZHNfbm9uZGVj XzAxJywKKyAgICAgICdpc19teGlkc19ub25kZWNfMTInLAorICAgICAgJ2lzX21lbWJlcnNfbm9u ZGVjXzAxJywKKyAgICAgICdpc19tZW1iZXJzX25vbmRlY18xMicKKyAgICBdLAorICAgIEFSUkFZ WworICAgICAgKHMyLm51bV9teGlkcyAgICAgICAgSVMgTk9UIE5VTEwpLAorICAgICAgKHMyLm51 bV9tZW1iZXJzICAgICAgSVMgTk9UIE5VTEwpLAorICAgICAgKHMyLm9sZGVzdF9tdWx0aXhhY3Qg SVMgTk9UIE5VTEwpLAorICAgICAgKHMyLm9sZGVzdF9vZmZzZXQgICAgSVMgTk9UIE5VTEwpLAor CisgICAgICAoczEub2xkZXN0X211bHRpeGFjdDo6dGV4dDo6YmlnaW50ID49IENPQUxFU0NFKHMw Lm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCwgMCkpLAorICAgICAgKHMyLm9sZGVzdF9t dWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShzMS5vbGRlc3RfbXVsdGl4YWN0Ojp0 ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMS5vbGRlc3Rfb2Zmc2V0ICAgID49IENPQUxFU0NF KHMwLm9sZGVzdF9vZmZzZXQsICAgIDApKSwKKyAgICAgIChzMi5vbGRlc3Rfb2Zmc2V0ICAgID49 IENPQUxFU0NFKHMxLm9sZGVzdF9vZmZzZXQsICAgIDApKSwKKworICAgICAgKHMyLm51bV9tZW1i ZXJzID49IENPQUxFU0NFKHMxLm51bV9tZW1iZXJzLCAwKSArIDEpLAorCisgICAgICAoczEubnVt X214aWRzICAgPj0gQ09BTEVTQ0UoczAubnVtX214aWRzLCAgIDApKSwKKyAgICAgIChzMi5udW1f bXhpZHMgICA+PSBDT0FMRVNDRShzMS5udW1fbXhpZHMsICAgMCkpLAorICAgICAgKHMxLm51bV9t ZW1iZXJzID49IENPQUxFU0NFKHMwLm51bV9tZW1iZXJzLCAwKSksCisgICAgICAoczIubnVtX21l bWJlcnMgPj0gQ09BTEVTQ0UoczEubnVtX21lbWJlcnMsIDApKQorICAgIF0KKyAgKSBBUyByKGFz c2VydGlvbiwgb2spOworCithc3NlcnRpb24gICAgICAgICAgICAgICB8b2sKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSstLQoraXNfaW5pdF9teGlkcyAgICAgICAgICAgfHQgCitpc19pbml0X21l bWJlcnMgICAgICAgICB8dCAKK2lzX2luaXRfb2xkZXN0X214aWQgICAgIHx0IAoraXNfaW5pdF9v bGRlc3Rfb2ZmICAgICAgfHQgCitpc19vbGRlc3RfbXhpZF9ub25kZWNfMDF8dCAKK2lzX29sZGVz dF9teGlkX25vbmRlY18xMnx0IAoraXNfb2xkZXN0X29mZl9ub25kZWNfMDEgfHQgCitpc19vbGRl c3Rfb2ZmX25vbmRlY18xMiB8dCAKK2lzX21lbWJlcnNfaW5jcmVhc2VkX2dlMXx0IAoraXNfbXhp ZHNfbm9uZGVjXzAxICAgICAgfHQgCitpc19teGlkc19ub25kZWNfMTIgICAgICB8dCAKK2lzX21l bWJlcnNfbm9uZGVjXzAxICAgIHx0IAoraXNfbWVtYmVyc19ub25kZWNfMTIgICAgfHQgCisoMTMg cm93cykKKworc3RlcCBkX2NvbW1pdDogQ09NTUlUOworc3RlcCBzMV9jb21taXQ6IENPTU1JVDsK K3N0ZXAgczJfY29tbWl0OiBDT01NSVQ7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24v aXNvbGF0aW9uX3NjaGVkdWxlIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVs ZQppbmRleCA5ZjFlOTk3ZDgxYi4uNGQ5NGZjOTRlNzcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2lz b2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xh dGlvbl9zY2hlZHVsZQpAQCAtMTE4LDMgKzExOCw0IEBAIHRlc3Q6IHNlcmlhbGl6YWJsZS1wYXJh bGxlbC0yCiB0ZXN0OiBzZXJpYWxpemFibGUtcGFyYWxsZWwtMwogdGVzdDogbWF0dmlldy13cml0 ZS1za2V3CiB0ZXN0OiBsb2NrLW5vd2FpdAordGVzdDogbXVsdGl4YWN0X3N0YXRzCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvbXVsdGl4YWN0X3N0YXRzLnNwZWMgYi9zcmMv dGVzdC9pc29sYXRpb24vc3BlY3MvbXVsdGl4YWN0X3N0YXRzLnNwZWMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkwOThiNmY1YzVkCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5zcGVjCkBAIC0wLDAgKzEs MTI3IEBACisjIEhpZ2gtc2lnbmFsIGludmFyaWFudHMgZm9yIHBnX2dldF9tdWx0aXhhY3Rfc3Rh dHMoKQorIyBXZSBjcmVhdGUgZXhhY3RseSBvbmUgZnJlc2ggTXVsdGlYYWN0IG9uIGEgYnJhbmQt bmV3IHRhYmxlLiBXaGlsZSBpdCBpcyBwaW5uZWQKKyMgYnkgdHdvIG9wZW4gdHJhbnNhY3Rpb25z LCB3ZSBhc3NlcnQgb25seSBpbnZhcmlhbnRzIHRoYXQgYmFja2dyb3VuZCBWQUNVVU0vRlJFRVpF CisjIGNhbm5vdCB2aW9sYXRlOgorIyAgIOKAoiBtZW1iZXJzIGluY3JlYXNlZCBieSDiiaUgMSB3 aGVuIHRoZSBzZWNvbmQgbG9ja2VyIGFycml2ZWQsCisjICAg4oCiIG51bV9teGlkcyAvIG51bV9t ZW1iZXJzIGRpZCBub3QgZGVjcmVhc2UgdnMgZWFybGllciBzbmFwc2hvdHMsCisjICAg4oCiIG9s ZGVzdF8qIG5ldmVyIGRlY3JlYXNlcy4KKyMgV2UgbWFrZSBOTyBhc3NlcnRpb25zIGFmdGVyIHJl bGVhc2luZyBsb2NrcyAoZnJlZXppbmcvdHJ1bmNhdGlvbiBtYXkgc2hyaW5rIGRlbHRhcykuCisj IE5PVEU6IFNuYXBzaG90cyBzbmFwMCBhbmQgc3Vic2VxdWVudCBjaGVja3MgYXJlIHRha2VuIGlu c2lkZSBhbiBvcGVuIGRyaXZlcgorIyB0cmFuc2FjdGlvbiB0byBuYXJyb3cgdGhlIHdpbmRvdyBm b3IgdW5yZWxhdGVkIHRydW5jYXRpb24gYmV0d2VlbiBzbmFwc2hvdHMuCisjCisjIFRlcm1pbm9s b2d5IChnbG9iYWwgY291bnRlcnMpOgorIyAgIG51bV9teGlkcywgbnVtX21lbWJlcnMgICAgOiDi gJxpbi11c2XigJ0gZGVsdGFzIGRlcml2ZWQgZnJvbSBnbG9iYWwgaG9yaXpvbnMKKyMgICBvbGRl c3RfbXVsdGl4YWN0LCBvZmZzZXQgIDogb2xkZXN0IGhvcml6b25zOyB0aGV5IG1vdmUgZm9yd2Fy ZCwgbmV2ZXIgYmFja3dhcmQKKyMKKyMgQWxsIGFzc2VydGlvbnMgZXhlY3V0ZSB3aGlsZSBvdXIg bXVsdGl4YWN0IGlzIHBpbm5lZCBieSBvcGVuIHR4bnMsIHdoaWNoIHByb3RlY3RzCisjIHRoZSB0 cnVuY2F0aW9uIGhvcml6b24gKFZBQ1VVTSBjYW7igJl0IGFkdmFuY2UgcGFzdCBvdXIgcGlubmVk IG11bHRpKS4KKworc2V0dXAKK3sKKyAgICBDUkVBVEUgVEFCTEUgbXhxKGlkIGludCBQUklNQVJZ IEtFWSwgdiBpbnQpOworICAgIElOU0VSVCBJTlRPIG14cSBWQUxVRVMgKDEsIDQyKTsKK30KKwor dGVhcmRvd24KK3sKKyAgICBEUk9QIFRBQkxFIG14cTsKK30KKworIyBUd28gbG9ja2VycyBvbiB0 aGUgU0FNRSB0dXBsZSAtPiBvbmUgTXVsdGlYYWN0IHdpdGggPj0gMiBtZW1iZXJzLgorc2Vzc2lv biAiczEiCitzZXR1cCB7IFNFVCBjbGllbnRfbWluX21lc3NhZ2VzID0gd2FybmluZzsgU0VUIGxv Y2tfdGltZW91dCA9ICc1cyc7IH0KK3N0ZXAgczFfYmVnaW4gIHsgQkVHSU47IH0KK3N0ZXAgczFf bG9jayAgIHsgU0VMRUNUIDEgRlJPTSBteHEgV0hFUkUgaWQ9MSBGT1IgS0VZIFNIQVJFOyB9Citz dGVwIHMxX2NvbW1pdCB7IENPTU1JVDsgfQorCitzZXNzaW9uICJzMiIKK3NldHVwIHsgU0VUIGNs aWVudF9taW5fbWVzc2FnZXMgPSB3YXJuaW5nOyBTRVQgbG9ja190aW1lb3V0ID0gJzVzJzsgfQor c3RlcCBzMl9iZWdpbiAgeyBCRUdJTjsgfQorc3RlcCBzMl9sb2NrICAgeyBTRUxFQ1QgMSBGUk9N IG14cSBXSEVSRSBpZD0xIEZPUiBLRVkgU0hBUkU7IH0KK3N0ZXAgczJfY29tbWl0IHsgQ09NTUlU OyB9CisKKyMgRHJpdmVyIHNlc3Npb246IGtlZXAgYSB0cmFuc2FjdGlvbiBvcGVuIHdoaWxlIHdl IHRha2Ugc25hcHNob3RzIGFuZCBjaGVjay4KK3Nlc3Npb24gImRyaXZlciIKK3N0ZXAgZF9iZWdp biB7IEJFR0lOOyBTRVQgY2xpZW50X21pbl9tZXNzYWdlcyA9IHdhcm5pbmc7IH0KKworIyBCYXNl bGluZSBCRUZPUkUgYW55IGxvY2tpbmc7IG1heSBiZSBOVUxMcyBpZiBtdWx0aXhhY3QgaXNuJ3Qg aW5pdGlhbGl6ZWQgeWV0Lgorc3RlcCBzbmFwMCB7CisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAw IEFTCisgIFNFTEVDVCBudW1fbXhpZHMsIG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0LCBv bGRlc3Rfb2Zmc2V0CisgIEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpOworfQorCisjIEFm dGVyIHMxIGhhcyBsb2NrZWQgdGhlIHJvdyAoc3RpbGwgaW4gZHJpdmVyIHhhY3QpLgorc3RlcCBz bmFwMSB7CisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAxIEFTCisgIFNFTEVDVCBudW1fbXhpZHMs IG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0LCBvbGRlc3Rfb2Zmc2V0CisgIEZST00gcGdf Z2V0X211bHRpeGFjdF9zdGF0cygpOworfQorCisjIEFmdGVyIHMyIGpvaW5zIG9uIHRoZSBTQU1F IHR1cGxlIC0+IG11bHRpeGFjdCB3aXRoID49IDIgbWVtYmVycyAoc3RpbGwgaW4gZHJpdmVyIHhh Y3QpLgorc3RlcCBzbmFwMiB7CisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAyIEFTCisgIFNFTEVD VCBudW1fbXhpZHMsIG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0LCBvbGRlc3Rfb2Zmc2V0 CisgIEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpOworfQorCisjIFByZXR0eSwgZGV0ZXJt aW5pc3RpYyBrZXkvdmFsdWUgb3V0cHV0IG9mIGJvb2xlYW4gY2hlY2tzLgorIyBLZXlzOgorIyAg IGlzX2luaXRfbXhpZHMgICAgICAgICAgICA6IG51bV9teGlkcyBpcyBub24tTlVMTAorIyAgIGlz X2luaXRfbWVtYmVycyAgICAgICAgICA6IG51bV9tZW1iZXJzIGlzIG5vbi1OVUxMCisjICAgaXNf aW5pdF9vbGRlc3RfbXhpZCAgICAgIDogb2xkZXN0X211bHRpeGFjdCBpcyBub24tTlVMTAorIyAg IGlzX2luaXRfb2xkZXN0X29mZiAgICAgICA6IG9sZGVzdF9vZmZzZXQgaXMgbm9uLU5VTEwKKyMg ICBpc19vbGRlc3RfbXhpZF9ub25kZWNfMDEgOiBvbGRlc3RfbXVsdGl4YWN0IGRpZCBub3QgZGVj cmVhc2UgKHNuYXAw4oaSc25hcDEpCisjICAgaXNfb2xkZXN0X214aWRfbm9uZGVjXzEyIDogb2xk ZXN0X211bHRpeGFjdCBkaWQgbm90IGRlY3JlYXNlIChzbmFwMeKGknNuYXAyKQorIyAgIGlzX29s ZGVzdF9vZmZfbm9uZGVjXzAxICA6IG9sZGVzdF9vZmZzZXQgZGlkIG5vdCBkZWNyZWFzZSAoc25h cDDihpJzbmFwMSkKKyMgICBpc19vbGRlc3Rfb2ZmX25vbmRlY18xMiAgOiBvbGRlc3Rfb2Zmc2V0 IGRpZCBub3QgZGVjcmVhc2UgKHNuYXAx4oaSc25hcDIpCisjICAgaXNfbWVtYmVyc19pbmNyZWFz ZWRfZ2UxIDogbWVtYmVycyBpbmNyZWFzZWQgYnkgYXQgbGVhc3QgMSB3aGVuIHMyIGpvaW5lZAor IyAgIGlzX214aWRzX25vbmRlY18wMSAgICAgICA6IG51bV9teGlkcyBkaWQgbm90IGRlY3JlYXNl IChzbmFwMOKGknNuYXAxKQorIyAgIGlzX214aWRzX25vbmRlY18xMiAgICAgICA6IG51bV9teGlk cyBkaWQgbm90IGRlY3JlYXNlIChzbmFwMeKGknNuYXAyKQorIyAgIGlzX21lbWJlcnNfbm9uZGVj XzAxICAgICA6IG51bV9tZW1iZXJzIGRpZCBub3QgZGVjcmVhc2UgKHNuYXAw4oaSc25hcDEpCisj ICAgaXNfbWVtYmVyc19ub25kZWNfMTIgICAgIDogbnVtX21lbWJlcnMgZGlkIG5vdCBkZWNyZWFz ZSAoc25hcDHihpJzbmFwMikKK3N0ZXAgY2hlY2tfd2hpbGVfcGlubmVkIHsKKyAgU0VMRUNUIHIu YXNzZXJ0aW9uLCByLm9rCisgIEZST00gc25hcDAgczAKKyAgSk9JTiBzbmFwMSBzMSBPTiBUUlVF CisgIEpPSU4gc25hcDIgczIgT04gVFJVRSwKKyAgTEFURVJBTCB1bm5lc3QoCisgICAgQVJSQVlb CisgICAgICAnaXNfaW5pdF9teGlkcycsCisgICAgICAnaXNfaW5pdF9tZW1iZXJzJywKKyAgICAg ICdpc19pbml0X29sZGVzdF9teGlkJywKKyAgICAgICdpc19pbml0X29sZGVzdF9vZmYnLAorICAg ICAgJ2lzX29sZGVzdF9teGlkX25vbmRlY18wMScsCisgICAgICAnaXNfb2xkZXN0X214aWRfbm9u ZGVjXzEyJywKKyAgICAgICdpc19vbGRlc3Rfb2ZmX25vbmRlY18wMScsCisgICAgICAnaXNfb2xk ZXN0X29mZl9ub25kZWNfMTInLAorICAgICAgJ2lzX21lbWJlcnNfaW5jcmVhc2VkX2dlMScsCisg ICAgICAnaXNfbXhpZHNfbm9uZGVjXzAxJywKKyAgICAgICdpc19teGlkc19ub25kZWNfMTInLAor ICAgICAgJ2lzX21lbWJlcnNfbm9uZGVjXzAxJywKKyAgICAgICdpc19tZW1iZXJzX25vbmRlY18x MicKKyAgICBdLAorICAgIEFSUkFZWworICAgICAgKHMyLm51bV9teGlkcyAgICAgICAgSVMgTk9U IE5VTEwpLAorICAgICAgKHMyLm51bV9tZW1iZXJzICAgICAgSVMgTk9UIE5VTEwpLAorICAgICAg KHMyLm9sZGVzdF9tdWx0aXhhY3QgSVMgTk9UIE5VTEwpLAorICAgICAgKHMyLm9sZGVzdF9vZmZz ZXQgICAgSVMgTk9UIE5VTEwpLAorCisgICAgICAoczEub2xkZXN0X211bHRpeGFjdDo6dGV4dDo6 YmlnaW50ID49IENPQUxFU0NFKHMwLm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCwgMCkp LAorICAgICAgKHMyLm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShz MS5vbGRlc3RfbXVsdGl4YWN0Ojp0ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMS5vbGRlc3Rf b2Zmc2V0ICAgID49IENPQUxFU0NFKHMwLm9sZGVzdF9vZmZzZXQsICAgIDApKSwKKyAgICAgIChz Mi5vbGRlc3Rfb2Zmc2V0ICAgID49IENPQUxFU0NFKHMxLm9sZGVzdF9vZmZzZXQsICAgIDApKSwK KworICAgICAgKHMyLm51bV9tZW1iZXJzID49IENPQUxFU0NFKHMxLm51bV9tZW1iZXJzLCAwKSAr IDEpLAorCisgICAgICAoczEubnVtX214aWRzICAgPj0gQ09BTEVTQ0UoczAubnVtX214aWRzLCAg IDApKSwKKyAgICAgIChzMi5udW1fbXhpZHMgICA+PSBDT0FMRVNDRShzMS5udW1fbXhpZHMsICAg MCkpLAorICAgICAgKHMxLm51bV9tZW1iZXJzID49IENPQUxFU0NFKHMwLm51bV9tZW1iZXJzLCAw KSksCisgICAgICAoczIubnVtX21lbWJlcnMgPj0gQ09BTEVTQ0UoczEubnVtX21lbWJlcnMsIDAp KQorICAgIF0KKyAgKSBBUyByKGFzc2VydGlvbiwgb2spOworfQorCitzdGVwIGRfY29tbWl0IHsg Q09NTUlUOyB9CisKK3Blcm11dGF0aW9uIGRfYmVnaW4gc25hcDAgczFfYmVnaW4gczFfbG9jayBz bmFwMSBzMl9iZWdpbiBzMl9sb2NrIHNuYXAyIGNoZWNrX3doaWxlX3Bpbm5lZCBkX2NvbW1pdCBz MV9jb21taXQgczJfY29tbWl0Ci0tIAoyLjQ3LjMKCg== --0000000000001da037063dec0baa--