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 1uoBDa-00HRtk-WE for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Aug 2025 01:32:56 +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 1uoBDa-004XLo-DL for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Aug 2025 01:32:55 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uoBDZ-004XLg-SU for pgsql-hackers@lists.postgresql.org; Tue, 19 Aug 2025 01:32:54 +0000 Received: from mail-ed1-x536.google.com ([2a00:1450:4864:20::536]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uoBDX-000ZAH-2d for pgsql-hackers@postgresql.org; Tue, 19 Aug 2025 01:32:53 +0000 Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-6188b70abdfso6708550a12.2 for ; Mon, 18 Aug 2025 18:32:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755567171; x=1756171971; 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=0ha3cm25dF02UmxSI2CIha02sKi6UKAN3YcAUh/Q+DE=; b=hQCpUhvTSlVe1+OBdoGjlMuTgn1v6xSMOwd3/erxZLOxK/GTSssSyLhaTHrAve4Bn2 O1X9fXpvS2qkBcCjgrLvAGX7fdb2D71vfgpxgHrDW1MFJL/9+XZq/gspwzoAywT8L53X G0xJlHt2hkYnyG71z++qxPEnzM6zUo/HAv1fQcP9rTL06P/YaCL9k7nZ6+KKO97/GJnz TDm1BkT1wrWTXwXp6WYusdcXE3Y+GWoInBzJbK9wpL2rstdyduAWdlx4Yc3dpoU48Fpi EZGqFRZaYPyIzrFdvlT6K/yxCwUJar+PFsgdKeH9RSvwoS5eA8gLZ425wHG7oTas/K5L rU6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755567171; x=1756171971; 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=0ha3cm25dF02UmxSI2CIha02sKi6UKAN3YcAUh/Q+DE=; b=Ubpf2YbJXWJhb8eYwGqMniY2ribt2kB/rGMFot4tADvTd+Qm0VKPfPqtZ9feib7aCv X544etea/9iAvBqhcOgOEvHLvMi71O8eCrYWkjQ4zFdjQrWefuFvvoZIfAlvY+gDWh1u KKZgNxgml/6YeDW3G+5znKJjlk87ndsDdt3p0cs7+clg5UO+21TbAdMQu9bgz+UXK6uy DI99c0wWXR81cjYHwq+CCdtQBWASv6EIDX0Momixj04GxHRHGr3WoZDgcl6dYp+SQswN yLbB3t8gLutc7lSBa5WiWRST0aWGCQyl/jZeI/BSIKTzj61vgwiCqZDB66aDYv9gmLfz FNxw== X-Forwarded-Encrypted: i=1; AJvYcCVCZk1fsodklPzGQBbXodzC6HSIQD34mXKT9eN+bX97lC2+FpjWaDbmmoNPUf87D6PybE6+CcamTYLWvgpH@postgresql.org X-Gm-Message-State: AOJu0YxGov3qzGzFNvyZEa29Kmk203UzOC+bPLQY8scMKvU5nxCGbbWn oRBCiOaLUUXDjl0IyZUfk3zReo1/WIvAkLnFwB+zSy64QTYo2haUO1U2DQpm7BuXEPR9WAIbdAX tEmfxqfdn9PlV4yZe9pazkF2ArPiqF3oyx2HXKRc= X-Gm-Gg: ASbGnctWcGpR5XlAemvPipCE6czcrrHtMPhhN91bhQdFXKy//kQftmwfnCnbR2XdEbK BHVAUMxmuewN+gy5pCYzlycaaOT5d9Kyp94vCi3tFb9d6wEhirIvu7V5WpJmTPzVdeFUcZhT6xq oZapuHEPyHJBAh2td/d/YDFO5/QcL5v610uEBkN5QgZ/ahq/mmaXAWqqpy4BX/9YHOyNOU84lRS kCFu44= X-Google-Smtp-Source: AGHT+IFfwZHNfUiUcGACXQ7I6mJuRwrYUUHF7D5XjIsCYpjM+30N27lUinfJ0vf4r1KmEuSVrl5Rbc7hEPAIKKyPXZk= X-Received: by 2002:a17:907:da17:b0:afd:d9e3:9540 with SMTP id a640c23a62f3a-afddd21bfebmr63250766b.64.1755567170739; Mon, 18 Aug 2025 18:32:50 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Naga Appani Date: Mon, 18 Aug 2025 20:32:39 -0500 X-Gm-Features: Ac12FXyftOfvDlMWqyw-E0QUZlwFXPdB0l4JGtKHdwr2u_-lEJIETye1BAHC2kM Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Ashutosh Bapat Cc: Michael Paquier , Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000979db7063cadd579" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000979db7063cadd579 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Michael, Ashutosh, Thanks a lot for taking the time to review this patch and share your though= ts. Here=E2=80=99s a short summary of what has changed in v5: - Added the new pg_get_multixact_stats() function in multixactfuncs.c. - Fixed the misleading =E2=80=9Catomic read=E2=80=9D comment in the accesso= r. - Clarified documentation: thresholds are described in terms of counts, since that=E2=80=99s what the code uses. - Added a members_bytes column in pg_get_multixact_stats() to give users a rough size estimate (num_members * 5), while making it clear this is layout-dependent. Please see my in-line replies below. --- On Mon, Aug 18, 2025 at 1:49=E2=80=AFAM Michael Paquier wrote: > My point was a bit different: multixactfuncs.c should be created first > because we already have one SQL function in multixact.c that can be > moved inside it, with the declarations it requires added to > multixact.h. I've extracted what you did, moved the existing > pg_get_multixact_members() inside the new file, and applied the > result. > Really appreciate your clarification and for making that change. I misunderstood your earlier point. > + * Returns information about current MultiXact state in a single atomic = read: > > This comment is incorrect. This is not an atomic read, grabbing a > consistent state of the data across one single lock acquisition. > Fixed and adjusted wording. --- On Mon, Aug 18, 2025 at 6:56=E2=80=AFAM Ashutosh Bapat wrote: > The current document says > "Also, if the storage occupied by multixacts members exceeds about > 10GB, aggressive vacuum scans will occur more often for all tables, > starting with those that have the oldest multixact-age." - do you mean > that it's wrong. Instead of checking 10GB threashold, is the code > checking the equivalent member count? If so, I think we need a > separate patch to correct the documentation first. Can you please > point me to the code? Documentation should reflect the code. > The decision is made in MultiXactMemberFreezeThreshold() [0], and it is entirely count-based: if (members <=3D MULTIXACT_MEMBER_SAFE_THRESHOLD) return autovacuum_multixact_freeze_max_age; fraction =3D (double) (members - MULTIXACT_MEMBER_SAFE_THRESHOLD) / (MULTIXACT_MEMBER_DANGER_THRESHOLD - MULTIXACT_MEMBER_SAFE_THRESHOLD); MaxMultiXactOffset is defined in multixact.h [1]: #define MaxMultiXactOffset ((MultiXactOffset) 0xFFFFFFFF) Thresholds are defined in multixact.c [2] #define MULTIXACT_MEMBER_SAFE_THRESHOLD (MaxMultiXactOffset / 2) #define MULTIXACT_MEMBER_DANGER_THRESHOLD \ (MaxMultiXactOffset - MaxMultiXactOffset / 4) These translate to: - MaxMultiXactOffset: ~4.29 billion (2^32 - 1) - MULTIXACT_MEMBER_SAFE_THRESHOLD: ~2.14 billion (2^31 - 1) - MULTIXACT_MEMBER_DANGER_THRESHOLD: ~3.22 billion (3/4 * 2^32) So the code path is count-driven. Regarding docs: For earlier versions (18 and before), the storage-size approximation remains relevant because users don=E2=80=99t have direct access to member count information. Since we don=E2=80=99t plan to backpatch (I assume so) t= his new function, the documentation for older branches should continue to rely on the storage-based approximation. Now that pg_get_multixact_stats() exposes num_members, the HEAD branch docs can describe the thresholds in terms of counts directly. For older branches, the storage approximation still provides users with a practical way to reason about wraparound risk. > The constant multiplier which converts a count into the disk size is > in the server code. Duplicating it outside the server code, even in > documentation, would require maintenance. GetMultiXactInfo() may not > do the arithmetic but pg_get_multixact_stats() is lean enough to add a > couple computations. > Thanks for suggesting this =E2=80=94 it makes sense, especially for users upgrading from earlier versions to 19 and higher. I=E2=80=99ve added a members_bytes column to pg_get_multixact_stats(), computed as num_members * 5. This respects the existing server-side logic while also giving those users a familiar reference point, helping them connect the older size-based guidance with the new count-based view. --- References: [0] https://github.com/postgres/postgres/blob/master/src/backend/access/tra= nsam/multixact.c#L2916 [1] https://github.com/postgres/postgres/blob/master/src/include/access/mul= tixact.h#L31 [2] https://github.com/postgres/postgres/blob/master/src/backend/access/tra= nsam/multixact.c#L216-L218 Patch v5 is attached. Thanks again for the thoughtful reviews =E2=80=94 I r= eally appreciate the guidance and look forward to further feedback. Best regards, Naga --000000000000979db7063cadd579 Content-Type: application/octet-stream; name="v5-0001-Add-pg_get_multixact_stats-function-for-monitorin.patch" Content-Disposition: attachment; filename="v5-0001-Add-pg_get_multixact_stats-function-for-monitorin.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mehuvrkj0 RnJvbSA4ODM3ODFkNGRhOWMxMzNhYTFjMjQwODM3OTI3NmJiNGY1MmJmM2E4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IE1vbiwgMTggQXVnIDIwMjUgMjA6NTE6MjUgKzAwMDAKU3ViamVjdDogW1BBVENIIHY1XSBBZGQg cGdfZ2V0X211bHRpeGFjdF9zdGF0cygpIGZ1bmN0aW9uIGZvciBtb25pdG9yaW5nCiBNdWx0aVhh Y3QgdXNhZ2UKCkV4cG9zZSBtdWx0aXhhY3Qgc3RhdGUgdmlhIGEgbmV3IFNRTC1jYWxsYWJsZSBm dW5jdGlvbiBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCksCnJldHVybmluZzoKLSBudW1fbXhpZHMg ICAgICAgICAgOiBudW1iZXIgb2YgTXVsdGlYYWN0IElEcyBpbiB1c2UKLSBudW1fbWVtYmVycyAg ICAgICAgOiBudW1iZXIgb2YgbWVtYmVyIGVudHJpZXMgaW4gdXNlCi0gbWVtYmVyc19ieXRlcyAg ICAgIDogYnl0ZXMgdXNlZCBieSBudW1fbWVtYmVycyBpbiBwZ19tdWx0aXhhY3QvbWVtYmVycyBk aXJlY3RvcnkKLSBvbGRlc3RfbXVsdGl4YWN0ICAgOiBvbGRlc3QgTXVsdGlYYWN0IElEIHN0aWxs IG5lZWRlZAotIG9sZGVzdF9vZmZzZXQgICAgICA6IG9sZGVzdCBtZW1iZXIgb2Zmc2V0IHN0aWxs IGluIHVzZQoKVGhpcyBwYXRjaDoKMS4gUmVuYW1lcyBSZWFkTXVsdGlYYWN0Q291bnRzKCkgdG8g R2V0TXVsdGlYYWN0SW5mbygpIGFuZCBtYWtlcyBpdCBwdWJsaWMKICAgLSBQcm92aWRlcyBhIHNp bmdsZSBhY2Nlc3NvciBmb3IgTXVsdGlYYWN0IHN0YXRlCiAgIC0gUmV0dXJucyBjb3VudHMgYW5k IGhvcml6b25zIGluIG9uZSBjYWxsCgoyLiBBZGRzIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKSBm dW5jdGlvbgogICAtIFNRTC1jYWxsYWJsZSBpbnRlcmZhY2UgdG8gR2V0TXVsdGlYYWN0SW5mbygp CiAgIC0gUmV0dXJucyBOVUxMcyBpZiBNdWx0aVhhY3Qgc3lzdGVtIG5vdCBpbml0aWFsaXplZAog ICAtIEluY2x1ZGVzIGlzb2xhdGlvbiB0ZXN0cyBmb3IgbW9uaXRvcmluZyBpbnZhcmlhbnRzCgpE b2N1bWVudGF0aW9uIHVwZGF0ZXM6Ci0gZnVuYy1pbmZvLnNnbWw6IGFkZCBmdW5jdGlvbiBlbnRy eQotIG1haW50ZW5hbmNlLnNnbWw6IG1lbnRpb24gbW9uaXRvcmluZyBtdWx0aXhhY3QgdXNhZ2UK CkJ1aWxkIGFuZCBjYXRhbG9nOgotIEFkZCBmdW5jdGlvbiB0byBleGlzdGluZyBtdWx0aXhhY3Rm dW5jcy5jCi0gcGdfcHJvYy5kYXQgZW50cnkKCkF1dGhvcjogTmFnYSBBcHBhbmkgPG5hZ25yaWtA Z21haWwuY29tPgpSZXZpZXdlZC1ieTogQXNodXRvc2ggQmFwYXQgPGFzaHV0b3NoLmJhcGF0Lm9z c0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBNaWNoYWVsIFBhcXVpZXIgPG1pY2hhZWxAcGFxdWll ci54eXo+CkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQv ZmxhdC9DQSUyQlFlWSUyQkFBc1lLNld2Qlc0cVl6SHo0YmFoSHljREFZX3E1RUNtSGtFVl9lQjlj a3pnJTQwbWFpbC5nbWFpbC5jb20KLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dt bCAgICAgICAgICAgICAgfCAgMzEgKysrKysKIGRvYy9zcmMvc2dtbC9tYWludGVuYW5jZS5zZ21s ICAgICAgICAgICAgICAgICB8ICA1NCArKysrKysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0vbXVsdGl4YWN0LmMgICAgICAgIHwgIDQzICsrKystLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L211bHRpeGFjdGZ1bmNzLmMgICAgICAgIHwgIDUyICsrKysrKysKIHNyYy9pbmNsdWRlL2FjY2Vz cy9tdWx0aXhhY3QuaCAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9jYXRhbG9n L3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAgfCAgMTUgKysrCiAuLi4vaXNvbGF0aW9uL2V4cGVj dGVkL211bHRpeGFjdF9zdGF0cy5vdXQgICAgfCAgOTQgKysrKysrKysrKysrKwogc3JjL3Rlc3Qv aXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZSAgICAgICAgIHwgICAxICsKIHNyYy90ZXN0L2lz b2xhdGlvbi9zcGVjcy9tdWx0aXhhY3Rfc3RhdHMuc3BlYyB8IDEyNyArKysrKysrKysrKysrKysr KysKIDkgZmlsZXMgY2hhbmdlZCwgMzk5IGluc2VydGlvbnMoKyksIDE5IGRlbGV0aW9ucygtKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9tdWx0aXhhY3Rf c3RhdHMub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211 bHRpeGFjdF9zdGF0cy5zcGVjCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1p bmZvLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCBjMzkzODMy ZDk0Yy4uOWRlZGMzNzE1ZDcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5m by5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0yOTc1LDYg KzI5NzUsMzcgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIv cG9zdGdyZXN9CiAgICAgICAgIG1vZGlmeSBrZXkgY29sdW1ucy4KICAgICAgICA8L3BhcmE+PC9l bnRyeT4KICAgICAgIDwvcm93PgorCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJm dW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxp bmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzPC9wcmlt YXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9tdWx0 aXhhY3Rfc3RhdHM8L2Z1bmN0aW9uPiAoKQorICAgICAgICA8cmV0dXJudmFsdWU+cmVjb3JkPC9y ZXR1cm52YWx1ZT4KKyAgICAgICAgKCA8cGFyYW1ldGVyPm51bV9teGlkczwvcGFyYW1ldGVyPiA8 dHlwZT5pbnRlZ2VyPC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm51bV9tZW1iZXJzPC9w YXJhbWV0ZXI+IDx0eXBlPmJpZ2ludDwvdHlwZT4sCisgICAgICAgICAgPHBhcmFtZXRlcj5tZW1i ZXJzX2J5dGVzPC9wYXJhbWV0ZXI+IDx0eXBlPmJpZ2ludDwvdHlwZT4sCisgICAgICAgICAgPHBh cmFtZXRlcj5vbGRlc3RfbXVsdGl4YWN0PC9wYXJhbWV0ZXI+IDx0eXBlPnhpZDwvdHlwZT4sCisg ICAgICAgICAgPHBhcmFtZXRlcj5vbGRlc3Rfb2Zmc2V0PC9wYXJhbWV0ZXI+IDx0eXBlPmJpZ2lu dDwvdHlwZT4gKQorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgUmV0dXJu cyBzdGF0aXN0aWNzIGFib3V0IGN1cnJlbnQgbXVsdGl4YWN0IHVzYWdlOgorICAgICAgICA8bGl0 ZXJhbD5udW1fbXhpZHM8L2xpdGVyYWw+IGlzIHRoZSBudW1iZXIgb2YgbXVsdGl4YWN0IElEcyBh c3NpZ25lZCwKKyAgICAgICAgPGxpdGVyYWw+bnVtX21lbWJlcnM8L2xpdGVyYWw+IGlzIHRoZSBu dW1iZXIgb2YgbXVsdGl4YWN0IG1lbWJlciBlbnRyaWVzIGNyZWF0ZWQsCisgICAgICAgIDxsaXRl cmFsPm1lbWJlcnNfYnl0ZXM8L2xpdGVyYWw+IGlzIHRoZSBzdG9yYWdlIG9jY3VwaWVkIGJ5IDxs aXRlcmFsPm51bV9tZW1iZXJzPC9saXRlcmFsPgorICAgICAgICBpbiA8bGl0ZXJhbD5wZ19tdWx0 aXhhY3QvbWVtYmVyczwvbGl0ZXJhbD4gZGlyZWN0b3J5LAorICAgICAgICA8bGl0ZXJhbD5vbGRl c3RfbXVsdGl4YWN0PC9saXRlcmFsPiBpcyB0aGUgb2xkZXN0IG11bHRpeGFjdCBJRCBzdGlsbCBp biB1c2UsIGFuZAorICAgICAgICA8bGl0ZXJhbD5vbGRlc3Rfb2Zmc2V0PC9saXRlcmFsPiBpcyB0 aGUgb2xkZXN0IG1lbWJlciBvZmZzZXQgc3RpbGwgaW4gdXNlLgorICAgICAgICBUaGVzZSB2YWx1 ZXMgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBtdWx0aXhhY3QgY29uc3VtcHRpb24gYW5kIGFudGlj aXBhdGUKKyAgICAgICAgYXV0b3ZhY3V1bSBiZWhhdmlvci4gU2VlIDx4cmVmIGxpbmtlbmQ9InZh Y3V1bS1mb3ItbXVsdGl4YWN0LXdyYXBhcm91bmQiLz4KKyAgICAgICAgZm9yIGZ1cnRoZXIgZGV0 YWlscyBvbiBtdWx0aXhhY3Qgd3JhcGFyb3VuZC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBh cmE+CisgICAgICAgIFRoaXMgaXMgYSBsaXZlIHNuYXBzaG90IG9mIHNoYXJlZCBjb3VudGVyczsg dGhlIG51bWJlcnMgY2FuIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLAorICAgICAgICBldmVuIHdpdGhp biB0aGUgc2FtZSB0cmFuc2FjdGlvbi4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwv cm93PgogICAgICA8L3Rib2R5PgogICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdp dCBhL2RvYy9zcmMvc2dtbC9tYWludGVuYW5jZS5zZ21sIGIvZG9jL3NyYy9zZ21sL21haW50ZW5h bmNlLnNnbWwKaW5kZXggZTdhOWY1OGMwMTUuLmJhZGQzMzkyYzRmIDEwMDY0NAotLS0gYS9kb2Mv c3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uu c2dtbApAQCAtODEzLDEyICs4MTMsNTYgQEAgSElOVDogIEV4ZWN1dGUgYSBkYXRhYmFzZS13aWRl IFZBQ1VVTSBpbiB0aGF0IGRhdGFiYXNlLgogICAgIDxwYXJhPgogICAgICBBcyBhIHNhZmV0eSBk ZXZpY2UsIGFuIGFnZ3Jlc3NpdmUgdmFjdXVtIHNjYW4gd2lsbAogICAgICBvY2N1ciBmb3IgYW55 IHRhYmxlIHdob3NlIG11bHRpeGFjdC1hZ2UgaXMgZ3JlYXRlciB0aGFuIDx4cmVmCi0gICAgIGxp bmtlbmQ9Imd1Yy1hdXRvdmFjdXVtLW11bHRpeGFjdC1mcmVlemUtbWF4LWFnZSIvPi4gIEFsc28s IGlmIHRoZQotICAgICBzdG9yYWdlIG9jY3VwaWVkIGJ5IG11bHRpeGFjdHMgbWVtYmVycyBleGNl ZWRzIGFib3V0IDEwR0IsIGFnZ3Jlc3NpdmUgdmFjdXVtCisgICAgIGxpbmtlbmQ9Imd1Yy1hdXRv dmFjdXVtLW11bHRpeGFjdC1mcmVlemUtbWF4LWFnZSIvPi4gQWxzbywgaWYgdGhlIG51bWJlcgor ICAgICBvZiBtZW1iZXJzIGNyZWF0ZWQgZXhjZWVkcyBhcHByb3hpbWF0ZWx5IDIgYmlsbGlvbiBl bnRyaWVzLCBhZ2dyZXNzaXZlIHZhY3V1bQogICAgICBzY2FucyB3aWxsIG9jY3VyIG1vcmUgb2Z0 ZW4gZm9yIGFsbCB0YWJsZXMsIHN0YXJ0aW5nIHdpdGggdGhvc2UgdGhhdAotICAgICBoYXZlIHRo ZSBvbGRlc3QgbXVsdGl4YWN0LWFnZS4gIEJvdGggb2YgdGhlc2Uga2luZHMgb2YgYWdncmVzc2l2 ZQotICAgICBzY2FucyB3aWxsIG9jY3VyIGV2ZW4gaWYgYXV0b3ZhY3V1bSBpcyBub21pbmFsbHkg ZGlzYWJsZWQuIFRoZSBtZW1iZXJzIHN0b3JhZ2UKLSAgICAgYXJlYSBjYW4gZ3JvdyB1cCB0byBh Ym91dCAyMEdCIGJlZm9yZSByZWFjaGluZyB3cmFwYXJvdW5kLgorICAgICBoYXZlIHRoZSBvbGRl c3QgbXVsdGl4YWN0LWFnZS4gQm90aCBvZiB0aGVzZSBraW5kcyBvZiBhZ2dyZXNzaXZlCisgICAg IHNjYW5zIHdpbGwgb2NjdXIgZXZlbiBpZiBhdXRvdmFjdXVtIGlzIG5vbWluYWxseSBkaXNhYmxl ZC4gVGhlIG1lbWJlcnMgY2FuIGdyb3cKKyAgICAgdXAgdG8gYXBwcm94aW1hdGVseSA0IGJpbGxp b24gZW50cmllcyBiZWZvcmUgcmVhY2hpbmcgd3JhcGFyb3VuZC4KKyAgICA8L3BhcmE+CisKKyAg ICA8cGFyYT4KKyAgICAgVGhlIDxmdW5jdGlvbj5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk8L2Z1 bmN0aW9uPiBmdW5jdGlvbiwgZGVzY3JpYmVkIGluCisgICAgIDx4cmVmIGxpbmtlbmQ9ImZ1bmN0 aW9ucy1wZy1zbmFwc2hvdCIvPiwgcHJvdmlkZXMgYSB3YXkgdG8gbW9uaXRvcgorICAgICBtdWx0 aXhhY3QgYWxsb2NhdGlvbiBhbmQgdXNhZ2UgcGF0dGVybnMgaW4gcmVhbCB0aW1lLiBGb3IgZXhh bXBsZToKKyAgICAgPHByb2dyYW1saXN0aW5nPgorcG9zdGdyZXM9IyBTRUxFQ1QgIG51bV9teGlk cyxudW1fbWVtYmVycyxvbGRlc3RfbXVsdGl4YWN0LG9sZGVzdF9vZmZzZXQgRlJPTSBwZ19jYXRh bG9nLnBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKKyBudW1fbXhpZHMgfCBudW1fbWVtYmVycyB8 IG9sZGVzdF9tdWx0aXhhY3QgfCBvbGRlc3Rfb2Zmc2V0CistLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0KKyAgOTk4ODM4NDkgfCAgIDc3 MzQ2ODc0NyB8ICAgICAgICAgMzk5NzQzNjggfCAgICAgMzUxOTUyOTc4CisoMSByb3cpCisgICAg IDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgIFRoaXMgb3V0cHV0IHNob3dzIGEgc3lzdGVtIHdpdGgg c2lnbmlmaWNhbnQgbXVsdGl4YWN0IGFjdGl2aXR5OiBhYm91dCB+MTAwIG1pbGxpb24KKyAgICAg bXVsdGl4YWN0IElEcyBhbmQgfjc3MyBtaWxsaW9uIG1lbWJlciBlbnRyaWVzIGhhdmUgYmVlbiBj cmVhdGVkIHNpbmNlIHRoZSBvbGRlc3QKKyAgICAgc3Vydml2aW5nIG11bHRpeGFjdCAoSUQgMzk5 NzQzNjgpLiBCeSBsZXZlcmFnaW5nIHRoaXMgaW5mb3JtYXRpb24sIHRoZSBmdW5jdGlvbiBoZWxw czoKKyAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxzaW1wYXJh PgorICAgICAgICBJZGVudGlmeSB1bnVzdWFsIG11bHRpeGFjdCBhY3Rpdml0eSBmcm9tIGNvbmN1 cnJlbnQgcm93LWxldmVsIGxvY2tzCisgICAgICAgIG9yIGZvcmVpZ24ga2V5IG9wZXJhdGlvbnMu IEZvciBleGFtcGxlLCBhIHNwaWtlIGluIG51bV9teGlkcyBtaWdodCBpbmRpY2F0ZQorICAgICAg ICBtdWx0aXBsZSBzZXNzaW9ucyBydW5uaW5nIFVQREFURSBzdGF0ZW1lbnRzIHdpdGggZm9yZWln biBrZXkgY2hlY2tzLAorICAgICAgICBjb25jdXJyZW50IFNFTEVDVCBGT1IgU0hBUkUgb3BlcmF0 aW9ucywgb3IgZnJlcXVlbnQgdXNlIG9mIHNhdmVwb2ludHMKKyAgICAgICAgY2F1c2luZyBsb2Nr IGNvbnRlbnRpb24uCisgICAgICAgPC9zaW1wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAg IDxsaXN0aXRlbT4KKyAgICAgICA8c2ltcGFyYT4KKyAgICAgICAgVHJhY2sgbXVsdGl4YWN0IGNs ZWFudXAgZWZmaWNpZW5jeSBieSBtb25pdG9yaW5nIG9sZGVzdF9tdWx0aXhhY3QuCisgICAgICAg IElmIHRoaXMgdmFsdWUgcmVtYWlucyB1bmNoYW5nZWQgd2hpbGUgbnVtX21lbWJlcnMgZ3Jvd3Ms IGl0IGNvdWxkIGluZGljYXRlCisgICAgICAgIHRoYXQgbG9uZy1ydW5uaW5nIHRyYW5zYWN0aW9u cyBhcmUgcHJldmVudGluZyBjbGVhbnVwLCBvciBhdXRvdmFjdXVtIGlzCisgICAgICAgIG5vdCBr ZWVwaW5nIHVwIHdpdGggdGhlIHdvcmtsb2FkLgorICAgICAgIDwvc2ltcGFyYT4KKyAgICAgIDwv bGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHNpbXBhcmE+CisgICAgICAgIERl dGVjdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wYWN0cyBiZWZvcmUgdGhleSBiZWNvbWUgY3Jp dGljYWwuCisgICAgICAgIEZvciBpbnN0YW5jZSwgaGlnaCBtdWx0aXhhY3QgdXNhZ2UgZnJvbSBm cmVxdWVudCByb3ctbGV2ZWwgbG9ja2luZyBvcgorICAgICAgICBmb3JlaWduIGtleSBvcGVyYXRp b25zIGNhbiBsZWFkIHRvIGluY3JlYXNlZCBJL08gYW5kIENQVSBvdmVyaGVhZCBkdXJpbmcKKyAg ICAgICAgdmFjdXVtIG9wZXJhdGlvbnMuIE1vbml0b3JpbmcgdGhlc2Ugc3RhdHMgaGVscHMgdHVu ZSBhdXRvdmFjdXVtIGZyZXF1ZW5jeQorICAgICAgICBhbmQgdHJhbnNhY3Rpb24gcGF0dGVybnMu CisgICAgICAgPC9zaW1wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC9vcmRlcmVkbGlz dD4KICAgICA8L3BhcmE+CiAKICAgICA8cGFyYT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90cmFuc2FtL211bHRpeGFjdC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbXVs dGl4YWN0LmMKaW5kZXggODg2NzQwZDJkNTUuLjVmYjdjMTJmZGNlIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS9tdWx0aXhhY3QuYwpAQCAtMjg1NywzMSArMjg1Nyw0NCBAQCBmaW5kX211bHRp eGFjdF9zdGFydChNdWx0aVhhY3RJZCBtdWx0aSwgTXVsdGlYYWN0T2Zmc2V0ICpyZXN1bHQpCiB9 CiAKIC8qCi0gKiBEZXRlcm1pbmUgaG93IG1hbnkgbXVsdGl4YWN0cywgYW5kIGhvdyBtYW55IG11 bHRpeGFjdCBtZW1iZXJzLCBjdXJyZW50bHkKLSAqIGV4aXN0LiAgUmV0dXJuIGZhbHNlIGlmIHVu YWJsZSB0byBkZXRlcm1pbmUuCisgKiBHZXRNdWx0aVhhY3RJbmZvCisgKgorICogUmV0dXJucyBp bmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IE11bHRpWGFjdCBzdGF0ZToKKyAqCQktIG11bHRpeGFj dHM6IE51bWJlciBvZiBNdWx0aVhhY3RzIChuZXh0TXVsdGlYYWN0SWQgLSBvbGRlc3RNdWx0aVhh Y3RJZCkKKyAqCQktIG1lbWJlcnM6IE51bWJlciBvZiBtZW1iZXIgZW50cmllcyAobmV4dE9mZnNl dCAtIG9sZGVzdE9mZnNldCkKKyAqCQktIG9sZGVzdE11bHRpWGFjdElkOiBPbGRlc3QgTXVsdGlY YWN0IElEIHN0aWxsIGluIHVzZQorICoJCS0gb2xkZXN0T2Zmc2V0OiBPbGRlc3Qgb2Zmc2V0IHN0 aWxsIGluIHVzZQorICoKKyAqIFJldHVybnMgZmFsc2UgaWYgdGhlIG9sZGVzdCBvZmZzZXQgaXMg bm90IGtub3duLCBpbiB3aGljaCBjYXNlIGFsbCBvdXRwdXQKKyAqIHBhcmFtZXRlcnMgYXJlIHNl dCB0byAwL2ludmFsaWQgdmFsdWVzIGZvciBjb25zaXN0ZW5jeS4KICAqLwotc3RhdGljIGJvb2wK LVJlYWRNdWx0aVhhY3RDb3VudHModWludDMyICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQg Km1lbWJlcnMpCitib29sCitHZXRNdWx0aVhhY3RJbmZvKHVpbnQzMiAqbXVsdGl4YWN0cywgTXVs dGlYYWN0T2Zmc2V0ICptZW1iZXJzLAorCQkJCSBNdWx0aVhhY3RJZCAqb2xkZXN0TXVsdGlYYWN0 SWQsIE11bHRpWGFjdE9mZnNldCAqb2xkZXN0T2Zmc2V0KQogewotCU11bHRpWGFjdE9mZnNldCBu ZXh0T2Zmc2V0OwotCU11bHRpWGFjdE9mZnNldCBvbGRlc3RPZmZzZXQ7Ci0JTXVsdGlYYWN0SWQg b2xkZXN0TXVsdGlYYWN0SWQ7Ci0JTXVsdGlYYWN0SWQgbmV4dE11bHRpWGFjdElkOwotCWJvb2wJ CW9sZGVzdE9mZnNldEtub3duOworCU11bHRpWGFjdE9mZnNldAluZXh0T2Zmc2V0OworCU11bHRp WGFjdElkIAluZXh0TXVsdGlYYWN0SWQ7CisJYm9vbCAJCW9sZGVzdE9mZnNldEtub3duOwogCiAJ TFdMb2NrQWNxdWlyZShNdWx0aVhhY3RHZW5Mb2NrLCBMV19TSEFSRUQpOwogCW5leHRPZmZzZXQg PSBNdWx0aVhhY3RTdGF0ZS0+bmV4dE9mZnNldDsKLQlvbGRlc3RNdWx0aVhhY3RJZCA9IE11bHRp WGFjdFN0YXRlLT5vbGRlc3RNdWx0aVhhY3RJZDsKKwkqb2xkZXN0TXVsdGlYYWN0SWQgPSBNdWx0 aVhhY3RTdGF0ZS0+b2xkZXN0TXVsdGlYYWN0SWQ7CiAJbmV4dE11bHRpWGFjdElkID0gTXVsdGlY YWN0U3RhdGUtPm5leHRNWGFjdDsKLQlvbGRlc3RPZmZzZXQgPSBNdWx0aVhhY3RTdGF0ZS0+b2xk ZXN0T2Zmc2V0OworCSpvbGRlc3RPZmZzZXQgPSBNdWx0aVhhY3RTdGF0ZS0+b2xkZXN0T2Zmc2V0 OwogCW9sZGVzdE9mZnNldEtub3duID0gTXVsdGlYYWN0U3RhdGUtPm9sZGVzdE9mZnNldEtub3du OwogCUxXTG9ja1JlbGVhc2UoTXVsdGlYYWN0R2VuTG9jayk7CiAKIAlpZiAoIW9sZGVzdE9mZnNl dEtub3duKQorCXsKKwkJKm1lbWJlcnMgPSAwOworCQkqbXVsdGl4YWN0cyA9IDA7CisJCSpvbGRl c3RNdWx0aVhhY3RJZCA9IEludmFsaWRNdWx0aVhhY3RJZDsKKwkJKm9sZGVzdE9mZnNldCA9IDA7 CiAJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkqbWVtYmVycyA9IG5leHRPZmZzZXQgLSBvbGRlc3RP ZmZzZXQ7Ci0JKm11bHRpeGFjdHMgPSBuZXh0TXVsdGlYYWN0SWQgLSBvbGRlc3RNdWx0aVhhY3RJ ZDsKKwkqbWVtYmVycyA9IG5leHRPZmZzZXQgLSAqb2xkZXN0T2Zmc2V0OworCSptdWx0aXhhY3Rz ID0gbmV4dE11bHRpWGFjdElkIC0gKm9sZGVzdE11bHRpWGFjdElkOwogCXJldHVybiB0cnVlOwog fQogCkBAIC0yOTIwLDkgKzI5MzMsMTEgQEAgTXVsdGlYYWN0TWVtYmVyRnJlZXplVGhyZXNob2xk KHZvaWQpCiAJdWludDMyCQl2aWN0aW1fbXVsdGl4YWN0czsKIAlkb3VibGUJCWZyYWN0aW9uOwog CWludAkJCXJlc3VsdDsKKwlNdWx0aVhhY3RJZAlvbGRlc3RNdWx0aVhhY3RJZDsKKwlNdWx0aVhh Y3RPZmZzZXQgb2xkZXN0T2Zmc2V0OwogCiAJLyogSWYgd2UgY2FuJ3QgZGV0ZXJtaW5lIG1lbWJl ciBzcGFjZSB1dGlsaXphdGlvbiwgYXNzdW1lIHRoZSB3b3JzdC4gKi8KLQlpZiAoIVJlYWRNdWx0 aVhhY3RDb3VudHMoJm11bHRpeGFjdHMsICZtZW1iZXJzKSkKKwlpZiAoIUdldE11bHRpWGFjdElu Zm8oJm11bHRpeGFjdHMsICZtZW1iZXJzLCAmb2xkZXN0TXVsdGlYYWN0SWQsICZvbGRlc3RPZmZz ZXQpKQogCQlyZXR1cm4gMDsKIAogCS8qIElmIG1lbWJlciBzcGFjZSB1dGlsaXphdGlvbiBpcyBs b3csIG5vIHNwZWNpYWwgYWN0aW9uIGlzIHJlcXVpcmVkLiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L211bHRpeGFjdGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQv bXVsdGl4YWN0ZnVuY3MuYwppbmRleCBlNzRlYTkzODM0OC4uYmE5ZTgzMTNhYjQgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXhhY3RmdW5jcy5jCisrKyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9tdWx0aXhhY3RmdW5jcy5jCkBAIC04NSwzICs4NSw1NSBAQCBwZ19nZXRf bXVsdGl4YWN0X21lbWJlcnMoUEdfRlVOQ1RJT05fQVJHUykKIAogCVNSRl9SRVRVUk5fRE9ORShm dW5jY3h0KTsKIH0KKworLyoKKyAqIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMKKyAqCisgKiBSZXR1 cm5zIHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBNdWx0aVhhY3QgdXNhZ2U6CisgKgkJLSBudW1f bXhpZHM6IE51bWJlciBvZiBNdWx0aVhhY3QgSURzIGluIHVzZQorICoJCS0gbnVtX21lbWJlcnM6 IFRvdGFsIG51bWJlciBvZiBtZW1iZXIgZW50cmllcworICoJCS0gb2xkZXN0X211bHRpeGFjdDog T2xkZXN0IE11bHRpWGFjdCBJRCBzdGlsbCBuZWVkZWQKKyAqCQktIG9sZGVzdF9vZmZzZXQ6IE9s ZGVzdCBvZmZzZXQgc3RpbGwgaW4gdXNlCisgKgorICogUmV0dXJucyBhIHJvdyBvZiBOVUxMcyBp ZiB0aGUgTXVsdGlYYWN0IHN5c3RlbSBpcyBub3QgeWV0IGluaXRpYWxpemVkLgorICovCitEYXR1 bQorcGdfZ2V0X211bHRpeGFjdF9zdGF0cyhQR19GVU5DVElPTl9BUkdTKQoreworCVR1cGxlRGVz Ywl0dXBkZXNjOworCURhdHVtCQl2YWx1ZXNbNV07CisJYm9vbAkJbnVsbHNbNV0gPSB7dHJ1ZSwg dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisJTXVsdGlYYWN0T2Zmc2V0IG1lbWJlcnM7CisJTXVs dGlYYWN0SWQJb2xkZXN0TXVsdGlYYWN0SWQ7CisJdWludDMyCQltdWx0aXhhY3RzOworCU11bHRp WGFjdE9mZnNldCBvbGRlc3RPZmZzZXQ7CisJaW50NjQJCW1lbWJlcnNCeXRlczsKKwlIZWFwVHVw bGUJdHVwbGU7CisKKwlpZiAoZ2V0X2NhbGxfcmVzdWx0X3R5cGUoZmNpbmZvLCBOVUxMLCAmdHVw ZGVzYykgIT0gVFlQRUZVTkNfQ09NUE9TSVRFKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJyZXR1cm4g dHlwZSBtdXN0IGJlIGEgcm93IHR5cGUiKSkpOworCisJaWYgKEdldE11bHRpWGFjdEluZm8oJm11 bHRpeGFjdHMsICZtZW1iZXJzLCAmb2xkZXN0TXVsdGlYYWN0SWQsICZvbGRlc3RPZmZzZXQpKQor CXsKKwkJLyoKKwkJKiBDYWxjdWxhdGUgYXBwcm94aW1hdGUgc3RvcmFnZSBzcGFjZToKKwkJKiAt IE1lbWJlcnMgYXJlIHN0b3JlZCBpbiBncm91cHMgb2YgNAorCQkqIC0gRWFjaCBncm91cCB0YWtl cyAyMCBieXRlcyAoNSBieXRlcyBwZXIgbWVtYmVyKQorCQkqIE5vdGU6IFRoaXMgaWdub3JlcyBz bWFsbCBwYWdlIG92ZXJoZWFkICgxMiBieXRlcyBwZXIgOEtCKQorCQkqLworCQltZW1iZXJzQnl0 ZXMgPSAoaW50NjQpIG1lbWJlcnMgKiA1OworCisJCXZhbHVlc1swXSA9IEludDMyR2V0RGF0dW0o bXVsdGl4YWN0cyk7CisJCXZhbHVlc1sxXSA9IEludDY0R2V0RGF0dW0obWVtYmVycyk7CisJCXZh bHVlc1syXSA9IEludDY0R2V0RGF0dW0obWVtYmVyc0J5dGVzKTsKKwkJdmFsdWVzWzNdID0gVUlu dDMyR2V0RGF0dW0ob2xkZXN0TXVsdGlYYWN0SWQpOworCQl2YWx1ZXNbNF0gPSBJbnQ2NEdldERh dHVtKG9sZGVzdE9mZnNldCk7CisJCW51bGxzWzBdID0gbnVsbHNbMV0gPSBudWxsc1syXSA9IG51 bGxzWzNdID0gbnVsbHNbNF0gPSBmYWxzZTsKKwl9CisKKwl0dXBsZSA9IGhlYXBfZm9ybV90dXBs ZSh0dXBkZXNjLCB2YWx1ZXMsIG51bGxzKTsKKworCVBHX1JFVFVSTl9EQVRVTShIZWFwVHVwbGVH ZXREYXR1bSh0dXBsZSkpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL211bHRp eGFjdC5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL211bHRpeGFjdC5oCmluZGV4IDY2MDdiNjQ1YTE4 Li4xOWRlNzQ5NTBjYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL211bHRpeGFjdC5o CisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9tdWx0aXhhY3QuaApAQCAtMTU5LDUgKzE1OSw2IEBA IGV4dGVybiBjb25zdCBjaGFyICptdWx0aXhhY3RfaWRlbnRpZnkodWludDggaW5mbyk7CiBleHRl cm4gY2hhciAqbXhpZF90b19zdHJpbmcoTXVsdGlYYWN0SWQgbXVsdGksIGludCBubWVtYmVycywK IAkJCQkJCQlNdWx0aVhhY3RNZW1iZXIgKm1lbWJlcnMpOwogZXh0ZXJuIGNoYXIgKm14c3RhdHVz X3RvX3N0cmluZyhNdWx0aVhhY3RTdGF0dXMgc3RhdHVzKTsKK2V4dGVybiBib29sIEdldE11bHRp WGFjdEluZm8odWludDMyICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQgKm1lbWJlcnMsIE11 bHRpWGFjdElkICpvbGRlc3RNdWx0aVhhY3RJZCwgTXVsdGlYYWN0T2Zmc2V0ICpvbGRlc3RPZmZz ZXQpOwogCiAjZW5kaWYJCQkJCQkJLyogTVVMVElYQUNUX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CmluZGV4IDExOGQ2ZGExYWNlLi45ODUzNjRlMGNkNiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CkBAIC0xMjU3Niw0ICsxMjU3NiwxOSBAQAogICBwcm9hcmduYW1lcyA9PiAne3BpZCxpb19p ZCxpb19nZW5lcmF0aW9uLHN0YXRlLG9wZXJhdGlvbixvZmYsbGVuZ3RoLHRhcmdldCxoYW5kbGVf ZGF0YV9sZW4scmF3X3Jlc3VsdCxyZXN1bHQsdGFyZ2V0X2Rlc2MsZl9zeW5jLGZfbG9jYWxtZW0s Zl9idWZmZXJlZH0nLAogICBwcm9zcmMgPT4gJ3BnX2dldF9haW9zJyB9LAogCisjIEdldCBNdWx0 aVhhY3Qgc3RhdGUKK3sKKyAgb2lkID0+ICc5MDAxJywKKyAgZGVzY3IgPT4gJ2dldCBjdXJyZW50 IG11bHRpeGFjdCBtZW1iZXIgYW5kIG11bHRpeGFjdCBJRCBjb3VudHMgYW5kIG9sZGVzdCB2YWx1 ZXMnLAorICBwcm9uYW1lID0+ICdwZ19nZXRfbXVsdGl4YWN0X3N0YXRzJywKKyAgcHJvcmV0dHlw ZSA9PiAncmVjb3JkJywKKyAgcHJvYXJndHlwZXMgPT4gJycsCisgIHByb2FsbGFyZ3R5cGVzID0+ ICd7aW50NCxpbnQ4LGludDgseGlkLGludDh9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tvLG8sbyxv LG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3tudW1fbXhpZHMsbnVtX21lbWJlcnMsbWVtYmVyc19i eXRlcyxvbGRlc3RfbXVsdGl4YWN0LG9sZGVzdF9vZmZzZXR9JywKKyAgcHJvdm9sYXRpbGUgPT4g J3YnLAorICBwcm9wYXJhbGxlbCA9PiAncycsCisgIHByb3NyYyA9PiAncGdfZ2V0X211bHRpeGFj dF9zdGF0cycKK30sCisKIF0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3Rl ZC9tdWx0aXhhY3Rfc3RhdHMub3V0IGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL211bHRp eGFjdF9zdGF0cy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjI4 OTNjNGQ5ZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVk L211bHRpeGFjdF9zdGF0cy5vdXQKQEAgLTAsMCArMSw5NCBAQAorUGFyc2VkIHRlc3Qgc3BlYyB3 aXRoIDMgc2Vzc2lvbnMKKworc3RhcnRpbmcgcGVybXV0YXRpb246IGRfYmVnaW4gc25hcDAgczFf YmVnaW4gczFfbG9jayBzbmFwMSBzMl9iZWdpbiBzMl9sb2NrIHNuYXAyIGNoZWNrX3doaWxlX3Bp bm5lZCBkX2NvbW1pdCBzMV9jb21taXQgczJfY29tbWl0CitzdGVwIGRfYmVnaW46IEJFR0lOOyBT RVQgY2xpZW50X21pbl9tZXNzYWdlcyA9IHdhcm5pbmc7CitzdGVwIHNuYXAwOiAKKyAgQ1JFQVRF IFRFTVAgVEFCTEUgc25hcDAgQVMKKyAgU0VMRUNUIG51bV9teGlkcywgbnVtX21lbWJlcnMsIG9s ZGVzdF9tdWx0aXhhY3QsIG9sZGVzdF9vZmZzZXQKKyAgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0 YXRzKCk7CisKK3N0ZXAgczFfYmVnaW46IEJFR0lOOworc3RlcCBzMV9sb2NrOiBTRUxFQ1QgMSBG Uk9NIG14cSBXSEVSRSBpZD0xIEZPUiBLRVkgU0hBUkU7Cis/Y29sdW1uPworLS0tLS0tLS0KKyAg ICAgICAxCisoMSByb3cpCisKK3N0ZXAgc25hcDE6IAorICBDUkVBVEUgVEVNUCBUQUJMRSBzbmFw MSBBUworICBTRUxFQ1QgbnVtX214aWRzLCBudW1fbWVtYmVycywgb2xkZXN0X211bHRpeGFjdCwg b2xkZXN0X29mZnNldAorICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKKworc3RlcCBz Ml9iZWdpbjogQkVHSU47CitzdGVwIHMyX2xvY2s6IFNFTEVDVCAxIEZST00gbXhxIFdIRVJFIGlk PTEgRk9SIEtFWSBTSEFSRTsKKz9jb2x1bW4/CistLS0tLS0tLQorICAgICAgIDEKKygxIHJvdykK Kworc3RlcCBzbmFwMjogCisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAyIEFTCisgIFNFTEVDVCBu dW1fbXhpZHMsIG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0LCBvbGRlc3Rfb2Zmc2V0Cisg IEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpOworCitzdGVwIGNoZWNrX3doaWxlX3Bpbm5l ZDogCisgIFNFTEVDVCByLmFzc2VydGlvbiwgci5vaworICBGUk9NIHNuYXAwIHMwCisgIEpPSU4g c25hcDEgczEgT04gVFJVRQorICBKT0lOIHNuYXAyIHMyIE9OIFRSVUUsCisgIExBVEVSQUwgdW5u ZXN0KAorICAgIEFSUkFZWworICAgICAgJ2lzX2luaXRfbXhpZHMnLAorICAgICAgJ2lzX2luaXRf bWVtYmVycycsCisgICAgICAnaXNfaW5pdF9vbGRlc3RfbXhpZCcsCisgICAgICAnaXNfaW5pdF9v bGRlc3Rfb2ZmJywKKyAgICAgICdpc19vbGRlc3RfbXhpZF9ub25kZWNfMDEnLAorICAgICAgJ2lz X29sZGVzdF9teGlkX25vbmRlY18xMicsCisgICAgICAnaXNfb2xkZXN0X29mZl9ub25kZWNfMDEn LAorICAgICAgJ2lzX29sZGVzdF9vZmZfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX2lu Y3JlYXNlZF9nZTEnLAorICAgICAgJ2lzX214aWRzX25vbmRlY18wMScsCisgICAgICAnaXNfbXhp ZHNfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX25vbmRlY18wMScsCisgICAgICAnaXNf bWVtYmVyc19ub25kZWNfMTInCisgICAgXSwKKyAgICBBUlJBWVsKKyAgICAgIChzMi5udW1fbXhp ZHMgICAgICAgIElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5udW1fbWVtYmVycyAgICAgIElTIE5P VCBOVUxMKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4YWN0IElTIE5PVCBOVUxMKSwKKyAgICAg IChzMi5vbGRlc3Rfb2Zmc2V0ICAgIElTIE5PVCBOVUxMKSwKKworICAgICAgKHMxLm9sZGVzdF9t dWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShzMC5vbGRlc3RfbXVsdGl4YWN0Ojp0 ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4YWN0Ojp0ZXh0OjpiaWdp bnQgPj0gQ09BTEVTQ0UoczEub2xkZXN0X211bHRpeGFjdDo6dGV4dDo6YmlnaW50LCAwKSksCisg ICAgICAoczEub2xkZXN0X29mZnNldCAgICA+PSBDT0FMRVNDRShzMC5vbGRlc3Rfb2Zmc2V0LCAg ICAwKSksCisgICAgICAoczIub2xkZXN0X29mZnNldCAgICA+PSBDT0FMRVNDRShzMS5vbGRlc3Rf b2Zmc2V0LCAgICAwKSksCisKKyAgICAgIChzMi5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShzMS5u dW1fbWVtYmVycywgMCkgKyAxKSwKKworICAgICAgKHMxLm51bV9teGlkcyAgID49IENPQUxFU0NF KHMwLm51bV9teGlkcywgICAwKSksCisgICAgICAoczIubnVtX214aWRzICAgPj0gQ09BTEVTQ0Uo czEubnVtX214aWRzLCAgIDApKSwKKyAgICAgIChzMS5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShz MC5udW1fbWVtYmVycywgMCkpLAorICAgICAgKHMyLm51bV9tZW1iZXJzID49IENPQUxFU0NFKHMx Lm51bV9tZW1iZXJzLCAwKSkKKyAgICBdCisgICkgQVMgcihhc3NlcnRpb24sIG9rKTsKKworYXNz ZXJ0aW9uICAgICAgICAgICAgICAgfG9rCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0KK2lz X2luaXRfbXhpZHMgICAgICAgICAgIHx0IAoraXNfaW5pdF9tZW1iZXJzICAgICAgICAgfHQgCitp c19pbml0X29sZGVzdF9teGlkICAgICB8dCAKK2lzX2luaXRfb2xkZXN0X29mZiAgICAgIHx0IAor aXNfb2xkZXN0X214aWRfbm9uZGVjXzAxfHQgCitpc19vbGRlc3RfbXhpZF9ub25kZWNfMTJ8dCAK K2lzX29sZGVzdF9vZmZfbm9uZGVjXzAxIHx0IAoraXNfb2xkZXN0X29mZl9ub25kZWNfMTIgfHQg Citpc19tZW1iZXJzX2luY3JlYXNlZF9nZTF8dCAKK2lzX214aWRzX25vbmRlY18wMSAgICAgIHx0 IAoraXNfbXhpZHNfbm9uZGVjXzEyICAgICAgfHQgCitpc19tZW1iZXJzX25vbmRlY18wMSAgICB8 dCAKK2lzX21lbWJlcnNfbm9uZGVjXzEyICAgIHx0IAorKDEzIHJvd3MpCisKK3N0ZXAgZF9jb21t aXQ6IENPTU1JVDsKK3N0ZXAgczFfY29tbWl0OiBDT01NSVQ7CitzdGVwIHMyX2NvbW1pdDogQ09N TUlUOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZSBi L3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUKaW5kZXggOWYxZTk5N2Q4MWIu LjRkOTRmYzk0ZTc3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3Nj aGVkdWxlCisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUKQEAgLTEx OCwzICsxMTgsNCBAQCB0ZXN0OiBzZXJpYWxpemFibGUtcGFyYWxsZWwtMgogdGVzdDogc2VyaWFs aXphYmxlLXBhcmFsbGVsLTMKIHRlc3Q6IG1hdHZpZXctd3JpdGUtc2tldwogdGVzdDogbG9jay1u b3dhaXQKK3Rlc3Q6IG11bHRpeGFjdF9zdGF0cwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0 aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5zcGVjIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNz L211bHRpeGFjdF9zdGF0cy5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi45MDk4YjZmNWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9z cGVjcy9tdWx0aXhhY3Rfc3RhdHMuc3BlYwpAQCAtMCwwICsxLDEyNyBAQAorIyBIaWdoLXNpZ25h bCBpbnZhcmlhbnRzIGZvciBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCkKKyMgV2UgY3JlYXRlIGV4 YWN0bHkgb25lIGZyZXNoIE11bHRpWGFjdCBvbiBhIGJyYW5kLW5ldyB0YWJsZS4gV2hpbGUgaXQg aXMgcGlubmVkCisjIGJ5IHR3byBvcGVuIHRyYW5zYWN0aW9ucywgd2UgYXNzZXJ0IG9ubHkgaW52 YXJpYW50cyB0aGF0IGJhY2tncm91bmQgVkFDVVVNL0ZSRUVaRQorIyBjYW5ub3QgdmlvbGF0ZToK KyMgICDigKIgbWVtYmVycyBpbmNyZWFzZWQgYnkg4omlIDEgd2hlbiB0aGUgc2Vjb25kIGxvY2tl ciBhcnJpdmVkLAorIyAgIOKAoiBudW1fbXhpZHMgLyBudW1fbWVtYmVycyBkaWQgbm90IGRlY3Jl YXNlIHZzIGVhcmxpZXIgc25hcHNob3RzLAorIyAgIOKAoiBvbGRlc3RfKiBuZXZlciBkZWNyZWFz ZXMuCisjIFdlIG1ha2UgTk8gYXNzZXJ0aW9ucyBhZnRlciByZWxlYXNpbmcgbG9ja3MgKGZyZWV6 aW5nL3RydW5jYXRpb24gbWF5IHNocmluayBkZWx0YXMpLgorIyBOT1RFOiBTbmFwc2hvdHMgc25h cDAgYW5kIHN1YnNlcXVlbnQgY2hlY2tzIGFyZSB0YWtlbiBpbnNpZGUgYW4gb3BlbiBkcml2ZXIK KyMgdHJhbnNhY3Rpb24gdG8gbmFycm93IHRoZSB3aW5kb3cgZm9yIHVucmVsYXRlZCB0cnVuY2F0 aW9uIGJldHdlZW4gc25hcHNob3RzLgorIworIyBUZXJtaW5vbG9neSAoZ2xvYmFsIGNvdW50ZXJz KToKKyMgICBudW1fbXhpZHMsIG51bV9tZW1iZXJzICAgIDog4oCcaW4tdXNl4oCdIGRlbHRhcyBk ZXJpdmVkIGZyb20gZ2xvYmFsIGhvcml6b25zCisjICAgb2xkZXN0X211bHRpeGFjdCwgb2Zmc2V0 ICA6IG9sZGVzdCBob3Jpem9uczsgdGhleSBtb3ZlIGZvcndhcmQsIG5ldmVyIGJhY2t3YXJkCisj CisjIEFsbCBhc3NlcnRpb25zIGV4ZWN1dGUgd2hpbGUgb3VyIG11bHRpeGFjdCBpcyBwaW5uZWQg Ynkgb3BlbiB0eG5zLCB3aGljaCBwcm90ZWN0cworIyB0aGUgdHJ1bmNhdGlvbiBob3Jpem9uIChW QUNVVU0gY2Fu4oCZdCBhZHZhbmNlIHBhc3Qgb3VyIHBpbm5lZCBtdWx0aSkuCisKK3NldHVwCit7 CisgICAgQ1JFQVRFIFRBQkxFIG14cShpZCBpbnQgUFJJTUFSWSBLRVksIHYgaW50KTsKKyAgICBJ TlNFUlQgSU5UTyBteHEgVkFMVUVTICgxLCA0Mik7Cit9CisKK3RlYXJkb3duCit7CisgICAgRFJP UCBUQUJMRSBteHE7Cit9CisKKyMgVHdvIGxvY2tlcnMgb24gdGhlIFNBTUUgdHVwbGUgLT4gb25l IE11bHRpWGFjdCB3aXRoID49IDIgbWVtYmVycy4KK3Nlc3Npb24gInMxIgorc2V0dXAgeyBTRVQg Y2xpZW50X21pbl9tZXNzYWdlcyA9IHdhcm5pbmc7IFNFVCBsb2NrX3RpbWVvdXQgPSAnNXMnOyB9 CitzdGVwIHMxX2JlZ2luICB7IEJFR0lOOyB9CitzdGVwIHMxX2xvY2sgICB7IFNFTEVDVCAxIEZS T00gbXhxIFdIRVJFIGlkPTEgRk9SIEtFWSBTSEFSRTsgfQorc3RlcCBzMV9jb21taXQgeyBDT01N SVQ7IH0KKworc2Vzc2lvbiAiczIiCitzZXR1cCB7IFNFVCBjbGllbnRfbWluX21lc3NhZ2VzID0g d2FybmluZzsgU0VUIGxvY2tfdGltZW91dCA9ICc1cyc7IH0KK3N0ZXAgczJfYmVnaW4gIHsgQkVH SU47IH0KK3N0ZXAgczJfbG9jayAgIHsgU0VMRUNUIDEgRlJPTSBteHEgV0hFUkUgaWQ9MSBGT1Ig S0VZIFNIQVJFOyB9CitzdGVwIHMyX2NvbW1pdCB7IENPTU1JVDsgfQorCisjIERyaXZlciBzZXNz aW9uOiBrZWVwIGEgdHJhbnNhY3Rpb24gb3BlbiB3aGlsZSB3ZSB0YWtlIHNuYXBzaG90cyBhbmQg Y2hlY2suCitzZXNzaW9uICJkcml2ZXIiCitzdGVwIGRfYmVnaW4geyBCRUdJTjsgU0VUIGNsaWVu dF9taW5fbWVzc2FnZXMgPSB3YXJuaW5nOyB9CisKKyMgQmFzZWxpbmUgQkVGT1JFIGFueSBsb2Nr aW5nOyBtYXkgYmUgTlVMTHMgaWYgbXVsdGl4YWN0IGlzbid0IGluaXRpYWxpemVkIHlldC4KK3N0 ZXAgc25hcDAgeworICBDUkVBVEUgVEVNUCBUQUJMRSBzbmFwMCBBUworICBTRUxFQ1QgbnVtX214 aWRzLCBudW1fbWVtYmVycywgb2xkZXN0X211bHRpeGFjdCwgb2xkZXN0X29mZnNldAorICBGUk9N IHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKK30KKworIyBBZnRlciBzMSBoYXMgbG9ja2VkIHRo ZSByb3cgKHN0aWxsIGluIGRyaXZlciB4YWN0KS4KK3N0ZXAgc25hcDEgeworICBDUkVBVEUgVEVN UCBUQUJMRSBzbmFwMSBBUworICBTRUxFQ1QgbnVtX214aWRzLCBudW1fbWVtYmVycywgb2xkZXN0 X211bHRpeGFjdCwgb2xkZXN0X29mZnNldAorICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMo KTsKK30KKworIyBBZnRlciBzMiBqb2lucyBvbiB0aGUgU0FNRSB0dXBsZSAtPiBtdWx0aXhhY3Qg d2l0aCA+PSAyIG1lbWJlcnMgKHN0aWxsIGluIGRyaXZlciB4YWN0KS4KK3N0ZXAgc25hcDIgewor ICBDUkVBVEUgVEVNUCBUQUJMRSBzbmFwMiBBUworICBTRUxFQ1QgbnVtX214aWRzLCBudW1fbWVt YmVycywgb2xkZXN0X211bHRpeGFjdCwgb2xkZXN0X29mZnNldAorICBGUk9NIHBnX2dldF9tdWx0 aXhhY3Rfc3RhdHMoKTsKK30KKworIyBQcmV0dHksIGRldGVybWluaXN0aWMga2V5L3ZhbHVlIG91 dHB1dCBvZiBib29sZWFuIGNoZWNrcy4KKyMgS2V5czoKKyMgICBpc19pbml0X214aWRzICAgICAg ICAgICAgOiBudW1fbXhpZHMgaXMgbm9uLU5VTEwKKyMgICBpc19pbml0X21lbWJlcnMgICAgICAg ICAgOiBudW1fbWVtYmVycyBpcyBub24tTlVMTAorIyAgIGlzX2luaXRfb2xkZXN0X214aWQgICAg ICA6IG9sZGVzdF9tdWx0aXhhY3QgaXMgbm9uLU5VTEwKKyMgICBpc19pbml0X29sZGVzdF9vZmYg ICAgICAgOiBvbGRlc3Rfb2Zmc2V0IGlzIG5vbi1OVUxMCisjICAgaXNfb2xkZXN0X214aWRfbm9u ZGVjXzAxIDogb2xkZXN0X211bHRpeGFjdCBkaWQgbm90IGRlY3JlYXNlIChzbmFwMOKGknNuYXAx KQorIyAgIGlzX29sZGVzdF9teGlkX25vbmRlY18xMiA6IG9sZGVzdF9tdWx0aXhhY3QgZGlkIG5v dCBkZWNyZWFzZSAoc25hcDHihpJzbmFwMikKKyMgICBpc19vbGRlc3Rfb2ZmX25vbmRlY18wMSAg OiBvbGRlc3Rfb2Zmc2V0IGRpZCBub3QgZGVjcmVhc2UgKHNuYXAw4oaSc25hcDEpCisjICAgaXNf b2xkZXN0X29mZl9ub25kZWNfMTIgIDogb2xkZXN0X29mZnNldCBkaWQgbm90IGRlY3JlYXNlIChz bmFwMeKGknNuYXAyKQorIyAgIGlzX21lbWJlcnNfaW5jcmVhc2VkX2dlMSA6IG1lbWJlcnMgaW5j cmVhc2VkIGJ5IGF0IGxlYXN0IDEgd2hlbiBzMiBqb2luZWQKKyMgICBpc19teGlkc19ub25kZWNf MDEgICAgICAgOiBudW1fbXhpZHMgZGlkIG5vdCBkZWNyZWFzZSAoc25hcDDihpJzbmFwMSkKKyMg ICBpc19teGlkc19ub25kZWNfMTIgICAgICAgOiBudW1fbXhpZHMgZGlkIG5vdCBkZWNyZWFzZSAo c25hcDHihpJzbmFwMikKKyMgICBpc19tZW1iZXJzX25vbmRlY18wMSAgICAgOiBudW1fbWVtYmVy cyBkaWQgbm90IGRlY3JlYXNlIChzbmFwMOKGknNuYXAxKQorIyAgIGlzX21lbWJlcnNfbm9uZGVj XzEyICAgICA6IG51bV9tZW1iZXJzIGRpZCBub3QgZGVjcmVhc2UgKHNuYXAx4oaSc25hcDIpCitz dGVwIGNoZWNrX3doaWxlX3Bpbm5lZCB7CisgIFNFTEVDVCByLmFzc2VydGlvbiwgci5vaworICBG Uk9NIHNuYXAwIHMwCisgIEpPSU4gc25hcDEgczEgT04gVFJVRQorICBKT0lOIHNuYXAyIHMyIE9O IFRSVUUsCisgIExBVEVSQUwgdW5uZXN0KAorICAgIEFSUkFZWworICAgICAgJ2lzX2luaXRfbXhp ZHMnLAorICAgICAgJ2lzX2luaXRfbWVtYmVycycsCisgICAgICAnaXNfaW5pdF9vbGRlc3RfbXhp ZCcsCisgICAgICAnaXNfaW5pdF9vbGRlc3Rfb2ZmJywKKyAgICAgICdpc19vbGRlc3RfbXhpZF9u b25kZWNfMDEnLAorICAgICAgJ2lzX29sZGVzdF9teGlkX25vbmRlY18xMicsCisgICAgICAnaXNf b2xkZXN0X29mZl9ub25kZWNfMDEnLAorICAgICAgJ2lzX29sZGVzdF9vZmZfbm9uZGVjXzEyJywK KyAgICAgICdpc19tZW1iZXJzX2luY3JlYXNlZF9nZTEnLAorICAgICAgJ2lzX214aWRzX25vbmRl Y18wMScsCisgICAgICAnaXNfbXhpZHNfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX25v bmRlY18wMScsCisgICAgICAnaXNfbWVtYmVyc19ub25kZWNfMTInCisgICAgXSwKKyAgICBBUlJB WVsKKyAgICAgIChzMi5udW1fbXhpZHMgICAgICAgIElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5u dW1fbWVtYmVycyAgICAgIElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4YWN0 IElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5vbGRlc3Rfb2Zmc2V0ICAgIElTIE5PVCBOVUxMKSwK KworICAgICAgKHMxLm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShz MC5vbGRlc3RfbXVsdGl4YWN0Ojp0ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMi5vbGRlc3Rf bXVsdGl4YWN0Ojp0ZXh0OjpiaWdpbnQgPj0gQ09BTEVTQ0UoczEub2xkZXN0X211bHRpeGFjdDo6 dGV4dDo6YmlnaW50LCAwKSksCisgICAgICAoczEub2xkZXN0X29mZnNldCAgICA+PSBDT0FMRVND RShzMC5vbGRlc3Rfb2Zmc2V0LCAgICAwKSksCisgICAgICAoczIub2xkZXN0X29mZnNldCAgICA+ PSBDT0FMRVNDRShzMS5vbGRlc3Rfb2Zmc2V0LCAgICAwKSksCisKKyAgICAgIChzMi5udW1fbWVt YmVycyA+PSBDT0FMRVNDRShzMS5udW1fbWVtYmVycywgMCkgKyAxKSwKKworICAgICAgKHMxLm51 bV9teGlkcyAgID49IENPQUxFU0NFKHMwLm51bV9teGlkcywgICAwKSksCisgICAgICAoczIubnVt X214aWRzICAgPj0gQ09BTEVTQ0UoczEubnVtX214aWRzLCAgIDApKSwKKyAgICAgIChzMS5udW1f bWVtYmVycyA+PSBDT0FMRVNDRShzMC5udW1fbWVtYmVycywgMCkpLAorICAgICAgKHMyLm51bV9t ZW1iZXJzID49IENPQUxFU0NFKHMxLm51bV9tZW1iZXJzLCAwKSkKKyAgICBdCisgICkgQVMgcihh c3NlcnRpb24sIG9rKTsKK30KKworc3RlcCBkX2NvbW1pdCB7IENPTU1JVDsgfQorCitwZXJtdXRh dGlvbiBkX2JlZ2luIHNuYXAwIHMxX2JlZ2luIHMxX2xvY2sgc25hcDEgczJfYmVnaW4gczJfbG9j ayBzbmFwMiBjaGVja193aGlsZV9waW5uZWQgZF9jb21taXQgczFfY29tbWl0IHMyX2NvbW1pdAot LSAKMi40Ny4zCgo= --000000000000979db7063cadd579--