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 1w7ZTn-005SE5-2g for pgsql-hackers@arkaria.postgresql.org; Tue, 31 Mar 2026 13:50:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7ZTl-00ATba-0l for pgsql-hackers@arkaria.postgresql.org; Tue, 31 Mar 2026 13:50:01 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w7ZTk-00ATbS-2f for pgsql-hackers@lists.postgresql.org; Tue, 31 Mar 2026 13:50:01 +0000 Received: from mail-lf1-x12b.google.com ([2a00:1450:4864:20::12b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7ZTi-00000002BLA-1WHw for pgsql-hackers@lists.postgresql.org; Tue, 31 Mar 2026 13:50:00 +0000 Received: by mail-lf1-x12b.google.com with SMTP id 2adb3069b0e04-5a27daa652fso4603923e87.0 for ; Tue, 31 Mar 2026 06:49:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774964997; cv=none; d=google.com; s=arc-20240605; b=D7AuiakBjuFCDYf/goArmDgGSUmFew/JLD4oAbtdRwkCFIjApV235nF9TBctevt8TV 6hwNZnt7xcQOVLB85cf1RJPg9RAm7uSk1vIacng+3knL3u4mi2mOoa9EL9Oo8OuXl4OU 7z0VmZOhPJ02aVBXyt0KYdHBpFaFsSfWvLT4zQkyXqCvW02NvkKxrdWXhcs4lAmWcCDh UuUC+NtkLItbO+RKiNqrGv7OnvPVRn1esWnchAufNaPeFcK4uLYTvBVHt+PlisaOb99i 8oa5FXF+QbH1ETLNvhkxjsL1ibOOIO5tyiAqWedMv/ODHdFM1B1+qau6hAEpNI43joUT l5Mg== 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=T8TcJ612ACthQ0ofJwnJ2I3TwCIvMhLulxqHYpEYoZs=; fh=hHYJMl/9S4rb9yLD3TqW2aop881XXWUr3D4f73rnhSU=; b=iGWJ552Kf6Xnn2mOItQmmRFKMoIwUWK5UnPrL6VHZnm2aT++9v2yRpQI/eEWi4d5uC C1EW6aTmVyf9rbsWwt0devsmEh9KDyJeq1A6ZIEjO0lZQl7W6mJOG7CS9uLkTrAIK/Vb 08pMJlng7TDzomYIgKFbQ7LEfO7OoNlazgFAA46GzCf04BfFdZLc9k2uAA8M5QmDz7/N uWfON9JdpD9M6VS12dYgcSRZ96Wc3EC300yIk112syn045YrI7mgxFQSqgKzmTn0Kh3R zNShXwdnFsK7t6JdmMJ+trXc6RidMnmufOZgz+hB+3fKz11IIc0O85yWqP+bDCmfkOx7 PZ5g==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774964997; x=1775569797; 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=T8TcJ612ACthQ0ofJwnJ2I3TwCIvMhLulxqHYpEYoZs=; b=kcILdJY7TzloiOpffQal0LDKJ7lOkFBnpUGIcZK+Ycmb3/y6KjNq87HBbw4hiJwf4M Oc0QNczPFWYZTrgSr4sWjdAJFuZY3MV5wUNvZnPPGge6DKl8pGwmLJ45ODnuTG3rOuiX C4ZqzjjbMW77mNMTf2yvjJeSev/VawQODUOdh8sdjcZa+h+5Pj2vnP+i1ouNthGXbrjx ZdYUsaVFS4xbNtyuI2jIVBGFUMTX0kaSjIswslK2bwAlMmEKmJhZJkBDLn3vGARUk9y3 FfQZt26noIDOjvZU48nj8JVy1mZz7cb+9FbutuBP2MQkeUkaStIPLdKXuzHD13D5cfG7 bCrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774964997; x=1775569797; 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=T8TcJ612ACthQ0ofJwnJ2I3TwCIvMhLulxqHYpEYoZs=; b=HF1dTs9ccaDezFfLdPzfz9Nkwy6OR5HEevkqDlM/xSw2JPZAPfja4uGCJb839ASXnV rcRNOwDMT35nfHNpLpxc3zl8SAo9VJxX+UldvVfvD9iuPRAUPy4o0imMdINl32h2P1kL 4M2c0n/FFw/7a7h9WyNVAiN8v36rFkm/84LQRPiuRTvsCK6Na9pegnz99h2NIE0wjTDR d0wRd5QNOOYSjFCUgHDEWZtxWjXUO20JZPq5XnU10an3zw+xFaFOX+GdkYa8zpscbBJA ucffSZuN5pwBr35QyTIUUtfqXS4XL03+04u02ksHUk88vDibvAnrcySGE4DbA7qXnGqA ZzHg== X-Forwarded-Encrypted: i=1; AJvYcCVIV5Wxpj5lPPpNGA/bNsXoLBcNklDN9BzKphoAOeF4CoUP2ZhAppPKY1ETyvt5++3I4CaIVeBA+oitK86m@lists.postgresql.org X-Gm-Message-State: AOJu0YwaDWhuxu+zwNV9vkzU16ZL57KQXkftkckkWzBo/tK6QDfpDF79 sIRvPsNe/vHFgBR4ZEa+BCVA+RhIvWGHNouCgUD83So6yqd6S0FqQcLwwYR1eYH9DRMh5wz5X6Z D1LGSujbkjGmX+6+8RcF7ygExURBWwGY= X-Gm-Gg: ATEYQzwT6jPwT9JAMaji5VL9nkrvvKWKjHxNHa04gf/kKaNk1bhN05Ea3u9rZMxs+Gs wZUS23h/QAg8nhan3PRyvzAP09a7ud//VE2idV1YxwS7+ASce/yOqtsXFcnypYZVZToksQ9iPPE OwLu3QyR1Q8FEf6vRX5A8DvyDYu/PbkcNxwnco4iLy0k8BPMsSIKoVAzTD/VMHijOGEud597Uxm HICvq6AlG6W5YVuJUNVxWK2Q3X28GW3BV2R74aggB78vnndZJ9gyuXAlRgrizHlTyP+WFcNSPSk nsC+V4CzxT6peDEbaYKjt6EASf6uCM0bEjP4bZpT X-Received: by 2002:a05:6512:3088:b0:5a2:be40:312 with SMTP id 2adb3069b0e04-5a2be4004f2mr964053e87.2.1774964997123; Tue, 31 Mar 2026 06:49:57 -0700 (PDT) MIME-Version: 1.0 References: <7F3C1A8B-F0FF-49BF-A53C-DC043BBB1FE7@yesql.se> In-Reply-To: From: Ajit Awekar Date: Tue, 31 Mar 2026 19:19:45 +0530 X-Gm-Features: AQROBzAGvZJ2Sj6SK1ngeYNSK1yGmmWq_2WID8XOmr8G3Tqm4F8mWlJNjHfb3i4 Message-ID: Subject: Re: [OAuth2] Infrastructure for tracking token expiry time To: Zsolt Parragi Cc: Daniel Gustafsson , VASUKI M , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000249895064e523ecf" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000249895064e523ecf Content-Type: multipart/alternative; boundary="000000000000249894064e523ecd" --000000000000249894064e523ecd Content-Type: text/plain; charset="UTF-8" Hi All, I've added additional test cases to src/test/authentication/t/ 008_continuous_validation.pl to improve coverage of the continuous credential validation feature. Updated the README with: - Fixed interval parameter - Added a Testing section documenting all 6 test cases - Added instructions for running the tests Thanks & Best Regards, Ajit On Fri, 27 Mar 2026 at 16:29, Ajit Awekar wrote: > Hi All, > > I'd like to propose a patch that adds a credential validation framework to > PostgreSQL, enabling periodic re-validation of authentication > credentials during active sessions. > > Currently, PostgreSQL validates credentials only at connection time. Once > authenticated, a session remains valid even if the underlying > credentials expire (e.g., a user's rolvaliduntil passes, or an OAuth token > expires). This can be problematic in environments with strict > security requirements where sessions should be terminated when credentials > become invalid. > > This patch introduces a timer-based credential validation mechanism that > periodically checks whether a session's authentication credentials are > still valid. When credentials are found to be expired, the session is > terminated with an appropriate error message > > *Key Components * > > 1. Core Framework (auth-validate.c, auth-validate.h) > - Manages validation callbacks for different authentication methods > - Provides a timeout-based scheduler using > CREDENTIAL_VALIDATION_TIMEOUT > > - Handles validation status (CVS_VALID, CVS_EXPIRED, CVS_ERROR) > 2. Validation Methods (auth-validate-methods.c) > > - Password validation: checks rolvaliduntil in pg_authid > > - OAuth validation: delegates to the validator module's new expire_cb > callback > 3. GUC Parameters > > - credential_validation.enabled (boolean, default: false) > - credential_validation.interval (integer, 1-60 minutes, default: 1) > > *OAuth Validator Changes * > > > The patch extends the OAuth validator API with an optional expire_cb > callback. To maintain backward compatibility, the magic version has been > bumped to PG_OAUTH_VALIDATOR_MAGIC_V2. Existing V1 validators continue > to work; the server simply skips expiration checking for them. > > > *Example Configuration* > credential_validation.enabled = on > credential_validation.interval = 5 # minutes > > Thanks & Best Regards, > Ajit > > > On Mon, 16 Mar 2026 at 19:27, Ajit Awekar wrote: > >> Hi, >> >> Please find the attached first version of the patch providing credential >> validation framework. >> >> The credential validation framework provides a mechanism to continuously >> validate authentication credentials during an active session. This enables >> the server to periodically check credential validity and take appropriate >> action when credentials expire or become invalid. >> >> Currently, Postgres validates credentials only at connection time. Once >> authenticated, a session remains active even if: >> >> - A user's rolvaliduntil expiration time passes >> - An OAuth bearer token expires >> >> >> >> * Proposed Solution* >> The patch introduces a credential validation framework that: >> >> 1. Periodically checks credential validity during active sessions >> 2. Terminates sessions when credentials expire or become invalid >> >> *Implementation* >> >> The framework consists of: >> >> - Core infrastructure (auth-validate.c/h): Manages validation >> callbacks, dispatches validation checks based on authentication method >> - Method implementations (auth-validate-methods.c/h): Contains >> validators for password-based auth (checks rolvaliduntil in pg_authid) and >> OAuth >> (delegates to validator's expire_cb) >> >> Validation is triggered during query execution in both simple and >> extended query protocol paths, using a time-based approach to limit >> overhead. >> >> >> * Configuration* >> Two new GUC parameters: >> >> credential_validation.enabled = false # enable/disable validation >> credential_validation.interval = 1 # check interval in minutes >> (1-60) >> >> >> * Extensibility* >> New authentication methods can be supported by: >> 1. Adding an enum value to CredentialValidationType >> 2. Implementing a validation callback >> 3. Registering it via RegisterCredentialValidator() >> >> >> Should there be per-authentication-method enable/disable settings? >> >> Thanks & Best Regards, >> Ajit >> >> >> On Fri, 20 Feb 2026 at 15:12, Ajit Awekar wrote: >> >>> >>> Thanks a lot Daniel, Zslot, Vasuki for your review comments. >>> >>> >The mechanism used is however a secondary discussion, >>> >first thing to get in place is a design for how to handle mid-connection >>> >credential expiration. >>> >>> This patch introduces a generic credential validation framework that >>> allows >>> us to periodically validate authentication credentials during active >>> database sessions. When enabled, this feature detects expired >>> credentials and terminates sessions that are no longer valid. >>> >>> Added GUCs >>> Credential_validation.enabled = on // Enable or Disable Credential >>> validation >>> Credential_validation.interval = 120 //Frequency in seconds of running >>> credential validation >>> >>> The callback mechanism works by: >>> - Defining a CredentialValidationCallback function pointer type >>> - Maintaining an array of validators indexed by authentication method >>> - Allowing other auth mechanisms to register validators via >>> RegisterCredentialValidator() >>> - Selecting the appropriate validator at runtime based on the session's >>> authentication method >>> >>> The current implementation primarily supports password-based >>> authentication methods, verifying that passwords haven't expired. It can be >>> extended to any authentication method. >>> This patch is WIP. I am submitting it now to get early feedback on the >>> overall design and approach. >>> >>> Thanks & Best Regards, >>> Ajit >>> >>> On Wed, 18 Feb 2026 at 22:29, Zsolt Parragi >>> wrote: >>> >>>> > but I still think that neither should overload >>>> > what FATAL error means >>>> >>>> I see, I misunderstood what you meant by graceful there. In this case, >>>> this is also a good comment for the password expiration thread, >>>> currently that also uses FATAL errors for terminating a connection >>>> when the password expires. >>>> >>>> What other option do you see? Something new for this use case like >>>> GoAway, and clients not understanding it simply get disconnected after >>>> some grace period? Or using the recently merged connectionWarning to >>>> send a warning to the client, and disconnect it shortly if it doesn't >>>> do anything to fix the situation? >>>> >>>> When I tested the password expiration patch I noticed that deleted >>>> users who still have remaining active connections currently get ERRORs >>>> for every statement that requires permission checks, so in this regard >>>> using ERROR/FATAL for the situation seemed fine to me - it's similar >>>> to what already happens in some edge cases with authentication. >>>> >>> --000000000000249894064e523ecd Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi All,

=C2=A0I've added additional= test cases to src/test/authentication/t/008_continuous_validation.pl to improve coverage of the c= ontinuous credential =C2=A0 =C2=A0
=C2=A0 validation feature.

Updated the README with:
=C2=A0 - Fixed interval paramet= er
=C2=A0 - Added a Testing section documenting all 6 test cases =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0
=C2=A0 - Added instructions for running the tests


Thanks & Best Regards,
Aj= it

On Fri, 27 Mar 2026 at 16:29, Ajit Awekar <= ;ajitpostgres@gmail.com> w= rote:
Hi All,

I'd like to propose a patch t= hat adds a credential validation framework to PostgreSQL, enabling periodic= re-validation of authentication
=C2=A0credentials during active sessio= ns.

Currently, PostgreSQL validates credentials only at = connection time. Once authenticated, a session remains valid even if the un= derlying =C2=A0 =C2=A0 =C2=A0 =C2=A0
credentials expire (e.g., a user&#= 39;s rolvaliduntil passes, or an OAuth token expires). This can be problema= tic in environments with strict
security requirements where sessions sho= uld be terminated when credentials become invalid.

This patch introduces a timer-based credential validation mechanism that p= eriodically checks whether a session's authentication credentials are
=C2=A0still valid. When credentials are found to be expired, the s= ession is terminated with an appropriate error message

=
Key Components =C2=A0

=C2=A0 1. Core Framework (auth-val= idate.c, auth-validate.h)
=C2=A0 =C2=A0 - Manages validation callbacks f= or different authentication methods
=C2=A0 =C2=A0 - Provides a timeout-b= ased scheduler using CREDENTIAL_VALIDATION_TIMEOUT =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0 - Handles validation status (CVS_VALID, CVS_EXPIRED, CVS_ER= ROR)
=C2=A0 2. Validation Methods (auth-validate-methods.c) =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - Password validation: ch= ecks rolvaliduntil in pg_authid =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - OAuth validation:= delegates to the validator module's new expire_cb callback
=C2=A0 3= . GUC Parameters =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0
=C2=A0 =C2=A0 - credential_validation.enabled (boolea= n, default: false)
=C2=A0 =C2=A0 - credential_validation.interval (integ= er, 1-60 minutes, default: 1)=C2=A0=C2=A0

OAuth= Validator Changes =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2= =A0 The patch extends the OAuth validator API with an optional expire_cb ca= llback. To maintain backward compatibility, the magic version has been
= =C2=A0 bumped to PG_OAUTH_VALIDATOR_MAGIC_V2. Existing V1 validators contin= ue to work; the server simply skips expiration checking for them.
=

Example Configuration

=C2=A0 credential_v= alidation.enabled =3D on
=C2=A0 credential_validation.interval =3D 5 =C2= =A0 # minutes=C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0

Tha= nks & Best Regards,
Ajit


=
On Mon, 16= Mar 2026 at 19:27, Ajit Awekar <ajitpostgres@gmail.com> wrote:
Hi,

Please find the attached first version of the patch providing crede= ntial validation framework.=C2=A0

The credential v= alidation framework provides a mechanism to continuously validate authentic= ation credentials during an active=C2=A0session. This enables the server to= periodically check credential validity and take appropriate action when cr= edentials expire or become invalid.

=C2=A0 Current= ly, Postgres validates credentials only at connection time. Once authentica= ted, a session remains active even if:

=C2=A0 - A user's rolvali= duntil expiration time passes
=C2=A0 - An OAuth bearer token expires
=

=C2=A0Proposed Solution

=C2=A0 = The patch introduces a credential validation framework that:

=C2=A0 = 1. Periodically checks credential validity during active sessions
=C2=A0= 2. Terminates sessions when credentials expire or become invalid

Implementation

=C2=A0 The framework consists of:

=C2=A0 = - Core infrastructure (auth-validate.c/h): Manages validation callbacks, di= spatches validation checks based on authentication method
=C2=A0 - Metho= d implementations (auth-validate-methods.c/h): Contains validators for pass= word-based auth (checks rolvaliduntil in pg_authid) and OAuth
=C2=A0 (de= legates to validator's expire_cb)

=C2=A0 Validation is triggered= during query execution in both simple and extended query protocol paths, u= sing a time-based approach to limit overhead.

=C2=A0 Configuratio= n

=C2=A0 Two new GUC parameters:

=C2=A0 credential_valida= tion.enabled =3D false =C2=A0 # enable/disable validation
=C2=A0 credent= ial_validation.interval =3D 1 =C2=A0 =C2=A0 =C2=A0# check interval in minut= es (1-60)

=C2=A0Extensibility

= =C2=A0 New authentication methods can be supported by:
=C2=A0 1. Adding = an enum value to CredentialValidationType
=C2=A0 2. Implementing a valid= ation callback
=C2=A0 3. Registering it via RegisterCredentialValidator(= )


=C2=A0Should there be per-authent= ication-method enable/disable settings?

Thanks &am= p; Best Regards,
Ajit


On Fri, 20 F= eb 2026 at 15:12, Ajit Awekar <ajitpostgres@gmail.com> wrote:

Thanks a= lot Daniel, Zslot, Vasuki for your review=C2=A0comments.

>The mechanism used is however a secondary discussion,
>fi= rst thing to get in place is a design for how to handle mid-connection
<= div>>credential expiration.

This patch introduces a generi= c credential validation framework that allows =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
=C2=A0us= to periodically validate authentication credentials during active
=C2= =A0database sessions. When enabled, this feature detects expired=C2=A0
= =C2=A0credentials and terminates sessions that are no longer valid.
=C2= =A0
=C2=A0Added GUCs
Credential_validation.enabled =3D on =C2=A0 // = Enable or Disable Credential validation
Credential_validation.interval = =3D 120 =C2=A0//Frequency in seconds of running credential validation
=C2=A0The callback mechanism works by:
=C2=A0 - Defining a CredentialV= alidationCallback function pointer type
=C2=A0 - Maintaining an array of= validators indexed by authentication method
=C2=A0 - Allowing other aut= h mechanisms to register validators via
=C2=A0 =C2=A0 RegisterCredential= Validator()
=C2=A0 - Selecting the appropriate validator at runtime base= d on the session's
=C2=A0 =C2=A0 authentication method

The cu= rrent implementation primarily supports password-based authentication metho= ds, verifying that passwords haven't expired. It can be extended to any= authentication method.
This patch is WIP. I am submitting it now to get= early feedback on the overall design and approach.
=C2=A0=C2=A0
Thanks & Best Regards,
Ajit
On Wed, = 18 Feb 2026 at 22:29, Zsolt Parragi <zsolt.parragi@percona.com> wrote:
> but I still think= that neither should overload
> what FATAL error means

I see, I misunderstood what you meant by graceful there. In this case,
this is also a good comment for the password expiration thread,
currently that also uses FATAL errors for terminating a connection
when the password expires.

What other option do you see? Something new for this use case like
GoAway, and clients not understanding it simply get disconnected after
some grace period? Or using the recently merged connectionWarning to
send a warning to the client, and disconnect it shortly if it doesn't do anything to fix the situation?

When I tested the password expiration patch I noticed that deleted
users who still have remaining active connections currently get ERRORs
for every statement that requires permission checks, so in this regard
using ERROR/FATAL for the situation seemed fine to me - it's similar to what already happens in some edge cases with authentication.
--000000000000249894064e523ecd-- --000000000000249895064e523ecf Content-Type: application/octet-stream; name="Credential_validation_V1.patch" Content-Disposition: attachment; filename="Credential_validation_V1.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mneobiax0 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9vYXV0aC12YWxpZGF0b3JzLnNnbWwgYi9kb2Mvc3Jj L3NnbWwvb2F1dGgtdmFsaWRhdG9ycy5zZ21sCmluZGV4IDcwNDA4OWRkN2IzLi4wNWM2MjZiYWI5 MyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL29hdXRoLXZhbGlkYXRvcnMuc2dtbAorKysgYi9k b2Mvc3JjL3NnbWwvb2F1dGgtdmFsaWRhdG9ycy5zZ21sCkBAIC0zMTIsNiArMzEyLDcgQEAgdHlw ZWRlZiBzdHJ1Y3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MKICAgICBWYWxpZGF0b3JTdGFydHVw Q0Igc3RhcnR1cF9jYjsKICAgICBWYWxpZGF0b3JTaHV0ZG93bkNCIHNodXRkb3duX2NiOwogICAg IFZhbGlkYXRvclZhbGlkYXRlQ0IgdmFsaWRhdGVfY2I7CisgICAgVmFsaWRhdG9yRXhwaXJlQ0Ig ZXhwaXJlX2NiOyAgICAvKiBPcHRpb25hbDogY2hlY2sgdG9rZW4gZXhwaXJhdGlvbiAqLwogfSBP QXV0aFZhbGlkYXRvckNhbGxiYWNrczsKIAogdHlwZWRlZiBjb25zdCBPQXV0aFZhbGlkYXRvckNh bGxiYWNrcyAqKCpPQXV0aFZhbGlkYXRvck1vZHVsZUluaXQpICh2b2lkKTsKQEAgLTMyMCw2ICsz MjEsMTUgQEAgdHlwZWRlZiBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqKCpPQXV0aFZh bGlkYXRvck1vZHVsZUluaXQpICh2b2lkKTsKICAgIE9ubHkgdGhlIDxmdW5jdGlvbj52YWxpZGF0 ZV9jYjwvZnVuY3Rpb24+IGNhbGxiYWNrIGlzIHJlcXVpcmVkLCB0aGUgb3RoZXJzCiAgICBhcmUg b3B0aW9uYWwuCiAgIDwvcGFyYT4KKyAgPHBhcmE+CisgICBUaGUgPGxpdGVyYWw+bWFnaWM8L2xp dGVyYWw+IGZpZWxkIGlkZW50aWZpZXMgdGhlIEFCSSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuCisg ICBUaGUgc2VydmVyIHN1cHBvcnRzIGJvdGggPGxpdGVyYWw+UEdfT0FVVEhfVkFMSURBVE9SX01B R0lDX1YxPC9saXRlcmFsPiAodGhlCisgICBvcmlnaW5hbCB2ZXJzaW9uIHdpdGhvdXQgPGZ1bmN0 aW9uPmV4cGlyZV9jYjwvZnVuY3Rpb24+KSBhbmQKKyAgIDxsaXRlcmFsPlBHX09BVVRIX1ZBTElE QVRPUl9NQUdJQ19WMjwvbGl0ZXJhbD4gKHdoaWNoIGFkZHMKKyAgIDxmdW5jdGlvbj5leHBpcmVf Y2I8L2Z1bmN0aW9uPikuICBOZXcgbW9kdWxlcyBzaG91bGQgdXNlCisgICA8bGl0ZXJhbD5QR19P QVVUSF9WQUxJREFUT1JfTUFHSUM8L2xpdGVyYWw+LCB3aGljaCBhbHdheXMgcmVmZXJzIHRvIHRo ZQorICAgbGF0ZXN0IHZlcnNpb24uCisgIDwvcGFyYT4KICA8L3NlY3QxPgogCiAgPHNlY3QxIGlk PSJvYXV0aC12YWxpZGF0b3ItY2FsbGJhY2tzIj4KQEAgLTQxMiw1ICs0MjIsMjcgQEAgdHlwZWRl ZiB2b2lkICgqVmFsaWRhdG9yU2h1dGRvd25DQikgKFZhbGlkYXRvck1vZHVsZVN0YXRlICpzdGF0 ZSk7CiAgICA8L3BhcmE+CiAgIDwvc2VjdDI+CiAKKyAgPHNlY3QyIGlkPSJvYXV0aC12YWxpZGF0 b3ItY2FsbGJhY2stZXhwaXJlIj4KKyAgIDx0aXRsZT5FeHBpcmUgQ2FsbGJhY2s8L3RpdGxlPgor ICAgPHBhcmE+CisgICAgVGhlIDxmdW5jdGlvbj5leHBpcmVfY2I8L2Z1bmN0aW9uPiBjYWxsYmFj ayBpcyBhbiBvcHRpb25hbCBjYWxsYmFjayB0aGF0CisgICAgY2FuIGJlIHVzZWQgdG8gY2hlY2sg d2hldGhlciB0aGUgT0F1dGggdG9rZW4gaGFzIGV4cGlyZWQuIFRoaXMgaXMgY2FsbGVkCisgICAg ZHVyaW5nIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0byB2ZXJpZnkgdGhhdCB0aGUgdG9rZW4gaXMg c3RpbGwgdmFsaWQuCis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGJvb2wgKCpWYWxpZGF0b3JF eHBpcmVDQikgKGNvbnN0IFZhbGlkYXRvck1vZHVsZVN0YXRlICpzdGF0ZSk7Cis8L3Byb2dyYW1s aXN0aW5nPgorICAgIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDxsaXRlcmFsPnRydWU8L2xp dGVyYWw+IGlmIHRoZSB0b2tlbiBpcyBzdGlsbAorICAgIHZhbGlkLCBvciA8bGl0ZXJhbD5mYWxz ZTwvbGl0ZXJhbD4gaWYgdGhlIHRva2VuIGhhcyBleHBpcmVkLiBJZiB0aGlzCisgICAgY2FsbGJh Y2sgaXMgbm90IHByb3ZpZGVkIChzZXQgdG8gTlVMTCksIHRoZSBzZXJ2ZXIgYXNzdW1lcyB0aGUg dG9rZW4KKyAgICByZW1haW5zIHZhbGlkLgorICAgPC9wYXJhPgorICAgPHBhcmE+CisgICAgVGhp cyBjYWxsYmFjayB3YXMgYWRkZWQgaW4gPGxpdGVyYWw+UEdfT0FVVEhfVkFMSURBVE9SX01BR0lD X1YyPC9saXRlcmFsPi4KKyAgICBNb2R1bGVzIGNvbXBpbGVkIGFnYWluc3QgdGhlIG9sZGVyIDxs aXRlcmFsPlBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMTwvbGl0ZXJhbD4KKyAgICBkbyBub3Qg aGF2ZSB0aGlzIGZpZWxkLCBhbmQgdGhlIHNlcnZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIGNhbGwg aXQgZm9yCisgICAgc3VjaCBtb2R1bGVzLgorICAgPC9wYXJhPgorICA8L3NlY3QyPgorCiAgPC9z ZWN0MT4KIDwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2xpYnBxL01ha2VmaWxl IGIvc3JjL2JhY2tlbmQvbGlicHEvTWFrZWZpbGUKaW5kZXggOThlYjJhODI0MmQuLjMyZTRjNzI4 MGU1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9NYWtlZmlsZQorKysgYi9zcmMvYmFj a2VuZC9saWJwcS9NYWtlZmlsZQpAQCAtMTgsNiArMTgsOCBAQCBPQkpTID0gXAogCWF1dGgtb2F1 dGgubyBcCiAJYXV0aC1zYXNsLm8gXAogCWF1dGgtc2NyYW0ubyBcCisJYXV0aC12YWxpZGF0ZS1t ZXRob2RzLm8gXAorCWF1dGgtdmFsaWRhdGUubyBcCiAJYXV0aC5vIFwKIAliZS1mc3N0dWJzLm8g XAogCWJlLXNlY3VyZS1jb21tb24ubyBcCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9saWJwcS9h dXRoLW9hdXRoLmMgYi9zcmMvYmFja2VuZC9saWJwcS9hdXRoLW9hdXRoLmMKaW5kZXggMTEzNjUw NDg5NTEuLjQ5NTIzNDM0M2MyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9hdXRoLW9h dXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvbGlicHEvYXV0aC1vYXV0aC5jCkBAIC00Myw2ICs0Myw3 IEBAIHN0YXRpYyB2b2lkIHNodXRkb3duX3ZhbGlkYXRvcl9saWJyYXJ5KHZvaWQgKmFyZyk7CiAK IHN0YXRpYyBWYWxpZGF0b3JNb2R1bGVTdGF0ZSAqdmFsaWRhdG9yX21vZHVsZV9zdGF0ZTsKIHN0 YXRpYyBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqVmFsaWRhdG9yQ2FsbGJhY2tzOwor c3RhdGljIGludCBWYWxpZGF0b3JBQklWZXJzaW9uOwkJLyogdHJhY2tzIFYxIHZzIFYyIG1vZHVs ZSBBQkkgKi8KIAogLyogTWVjaGFuaXNtIGRlY2xhcmF0aW9uICovCiBjb25zdCBwZ19iZV9zYXNs X21lY2ggcGdfYmVfb2F1dGhfbWVjaCA9IHsKQEAgLTc2NywxMyArNzY4LDIyIEBAIGxvYWRfdmFs aWRhdG9yX2xpYnJhcnkoY29uc3QgY2hhciAqbGlibmFtZSkKIAkgKiBDaGVjayB0aGUgbWFnaWMg bnVtYmVyLCB0byBwcm90ZWN0IGFnYWluc3QgYnJlYWstZ2xhc3Mgc2NlbmFyaW9zIHdoZXJlCiAJ ICogdGhlIEFCSSBtdXN0IGNoYW5nZSB3aXRoaW4gYSBtYWpvciB2ZXJzaW9uLiBsb2FkX2V4dGVy bmFsX2Z1bmN0aW9uKCkKIAkgKiBhbHJlYWR5IGNoZWNrcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jv c3MgbWFqb3IgdmVyc2lvbnMuCisJICoKKwkgKiBXZSBhY2NlcHQgYm90aCBWMSBhbmQgVjIgbWFn aWMgbnVtYmVycyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwkgKiBWMSBtb2R1bGVzIGRv bid0IGhhdmUgdGhlIGV4cGlyZV9jYiBmaWVsZCwgc28gd2UgdHJhY2sgdGhlIHZlcnNpb24KKwkg KiB0byBhdm9pZCBhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IHN0cnVjdCBtZW1iZXJzLgogCSAqLwot CWlmIChWYWxpZGF0b3JDYWxsYmFja3MtPm1hZ2ljICE9IFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJ QykKKwlpZiAoVmFsaWRhdG9yQ2FsbGJhY2tzLT5tYWdpYyA9PSBQR19PQVVUSF9WQUxJREFUT1Jf TUFHSUNfVjIpCisJCVZhbGlkYXRvckFCSVZlcnNpb24gPSAyOworCWVsc2UgaWYgKFZhbGlkYXRv ckNhbGxiYWNrcy0+bWFnaWMgPT0gUEdfT0FVVEhfVkFMSURBVE9SX01BR0lDX1YxKQorCQlWYWxp ZGF0b3JBQklWZXJzaW9uID0gMTsKKwllbHNlCiAJCWVyZXBvcnQoRVJST1IsCiAJCQkJZXJybXNn KCIlcyBtb2R1bGUgXCIlc1wiOiBtYWdpYyBudW1iZXIgbWlzbWF0Y2giLAogCQkJCQkgICAiT0F1 dGggdmFsaWRhdG9yIiwgbGlibmFtZSksCi0JCQkJZXJyZGV0YWlsKCJTZXJ2ZXIgaGFzIG1hZ2lj IG51bWJlciAweCUwOFgsIG1vZHVsZSBoYXMgMHglMDhYLiIsCi0JCQkJCQkgIFBHX09BVVRIX1ZB TElEQVRPUl9NQUdJQywgVmFsaWRhdG9yQ2FsbGJhY2tzLT5tYWdpYykpOworCQkJCWVycmRldGFp bCgiU2VydmVyIGV4cGVjdHMgbWFnaWMgbnVtYmVyIDB4JTA4WCBvciAweCUwOFgsIG1vZHVsZSBo YXMgMHglMDhYLiIsCisJCQkJCQkgIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMiwgUEdfT0FV VEhfVkFMSURBVE9SX01BR0lDX1YxLAorCQkJCQkJICBWYWxpZGF0b3JDYWxsYmFja3MtPm1hZ2lj KSk7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgY2FsbGJhY2tzIGFyZSBwcmVz ZW50IGluIHRoZSBWYWxpZGF0b3JDYWxsYmFja3MKQEAgLTg5MiwzICs5MDIsMjQgQEAgZG9uZToK IAogCXJldHVybiAoKmVycl9tc2cgPT0gTlVMTCk7CiB9CisKKy8qCisgKiBDaGVjayBpZiBhbiBP QXV0aCB0b2tlbiBoYXMgZXhwaXJlZC4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gY3JlZGVudGlh bCB2YWxpZGF0aW9uIHRvIGNoZWNrIHRva2VuIHZhbGlkaXR5LgorICovCitib29sCitDaGVja09B dXRoVmFsaWRhdG9yRXhwaXJhdGlvbih2b2lkKQoreworCS8qCisJICogRGVsZWdhdGUgdG8gdmFs aWRhdG9yJ3MgZXhwaXJlX2NiIGlmIGF2YWlsYWJsZS4gIE9ubHkgVjIrIG1vZHVsZXMgaGF2ZQor CSAqIHRoZSBleHBpcmVfY2IgZmllbGQsIHNvIHdlIG11c3QgY2hlY2sgdGhlIEFCSSB2ZXJzaW9u IGJlZm9yZSBhY2Nlc3NpbmcKKwkgKiBpdCB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmls aXR5IHdpdGggVjEgbW9kdWxlcy4KKwkgKi8KKwlpZiAoVmFsaWRhdG9yQ2FsbGJhY2tzICE9IE5V TEwgJiYKKwkJVmFsaWRhdG9yQUJJVmVyc2lvbiA+PSAyICYmCisJCVZhbGlkYXRvckNhbGxiYWNr cy0+ZXhwaXJlX2NiICE9IE5VTEwpCisJCXJldHVybiBWYWxpZGF0b3JDYWxsYmFja3MtPmV4cGly ZV9jYih2YWxpZGF0b3JfbW9kdWxlX3N0YXRlKTsKKworCS8qIFYxIG1vZHVsZSBvciBubyBleHBp cmVfY2IsIGFzc3VtZSB0b2tlbiBpcyB2YWxpZCAqLworCXJldHVybiB0cnVlOworfQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvbGlicHEvYXV0aC12YWxpZGF0ZS1tZXRob2RzLmMgYi9zcmMvYmFj a2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLW1ldGhvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uZjY1MTY0NTk2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFj a2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLW1ldGhvZHMuYwpAQCAtMCwwICsxLDEzNiBAQAorLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKgorICogYXV0aC12YWxpZGF0ZS1tZXRob2RzLmMKKyAqICAgICAg SW1wbGVtZW50YXRpb24gb2YgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCB2YWxpZGF0aW9uIG1l dGhvZHMKKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjcmVkZW50aWFsIHZhbGlkYXRpb24g bWV0aG9kcyBmb3IgdmFyaW91cyBhdXRoZW50aWNhdGlvbgorICogdHlwZXMgZHVyaW5nIGFjdGl2 ZSBQb3N0Z3JlU1FMIHNlc3Npb25zLiBJdCBpbmNsdWRlcyB2YWxpZGF0aW9uIGZvciBwYXNzd29y ZAorICogZXhwaXJ5LCBPQXV0aCB0b2tlbiBleHBpcnksIGFuZCBjYW4gYmUgZXh0ZW5kZWQgdG8g b3RoZXIgYXV0aGVudGljYXRpb24KKyAqIG1lY2hhbmlzbXMuCisgKgorICogUG9ydGlvbnMgQ29w eXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3Vw CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNp dHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKiAgICAgIHNyYy9iYWNr ZW5kL2xpYnBxL2F1dGgtdmFsaWRhdGUtbWV0aG9kcy5jCisgKgorICotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0 YWlscy5oIgorI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19h dXRoaWQuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2NhdGFsb2cuaCIKKyNpbmNsdWRlICJsaWJwcS9h dXRoLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAibGlicHEvbGlicHEtYmUuaCIKKyNpbmNsdWRlICJs aWJwcS9vYXV0aC5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv bG1nci5oIgorI2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbHMvdGlt ZXN0YW1wLmgiCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICov CitzdGF0aWMgYm9vbCB2YWxpZGF0ZV9wYXNzd29yZF9jcmVkZW50aWFscyh2b2lkKTsKK3N0YXRp YyBib29sIHZhbGlkYXRlX29hdXRoX2NyZWRlbnRpYWxzKHZvaWQpOworCisvKiBGdW5jdGlvbiBw cm90b3R5cGVzICovCit2b2lkIEluaXRpYWxpemVWYWxpZGF0aW9uTWV0aG9kcyh2b2lkKTsKKwor LyoKKyAqIEluaXRpYWxpemUgdmFsaWRhdGlvbiBtZXRob2RzCisgKi8KK3ZvaWQKK0luaXRpYWxp emVWYWxpZGF0aW9uTWV0aG9kcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIGFsbCB0aGUgdmFsaWRh dGlvbiBtZXRob2RzICovCisJUmVnaXN0ZXJDcmVkZW50aWFsVmFsaWRhdG9yKENWVF9QQVNTV09S RCwgdmFsaWRhdGVfcGFzc3dvcmRfY3JlZGVudGlhbHMpOworCVJlZ2lzdGVyQ3JlZGVudGlhbFZh bGlkYXRvcihDVlRfT0FVVEgsIHZhbGlkYXRlX29hdXRoX2NyZWRlbnRpYWxzKTsKK30KKworLyoK KyAqIFZhbGlkYXRlIHBhc3N3b3JkIGNyZWRlbnRpYWxzIGJ5IGNoZWNraW5nIHJvbHZhbGlkdW50 aWwKKyAqIFJldHVybnMgdHJ1ZSBpZiBjcmVkZW50aWFscyBhcmUgc3RpbGwgdmFsaWQsIGZhbHNl IGlmIHRoZXkgaGF2ZSBleHBpcmVkLgorICovCitzdGF0aWMgYm9vbAordmFsaWRhdGVfcGFzc3dv cmRfY3JlZGVudGlhbHModm9pZCkKK3sKKwlIZWFwVHVwbGUgICB0dXBsZSA9IE5VTEw7CisJRGF0 dW0gICAgICAgcm9sdmFsaWR1bnRpbF9kYXR1bTsKKwlib29sICAgICAgICB2YWxpZHVudGlsX251 bGw7CisJVGltZXN0YW1wVHogdmFsaWRfdW50aWwgPSAwOworCVRpbWVzdGFtcFR6IGN1cnJlbnRf dGltZTsKKwlPaWQgICAgICAgICB1c2VyaWQ7CisJYm9vbCAgICAgICAgcmVzdWx0ID0gZmFsc2U7 CisKKwl1c2VyaWQgPSBHZXRTZXNzaW9uVXNlcklkKCk7CisKKwkvKgorCSAqIFRyeSB0byB0YWtl IEFjY2Vzc1NoYXJlTG9jayBvbiBwZ19hdXRoaWQgdG8gcHJldmVudCBjb25jdXJyZW50IG1vZGlm aWNhdGlvbnMKKwkgKiBmcm9tIGludGVyZmVyaW5nIHdpdGggb3VyIHZhbGlkYXRpb24uIFVzZSBj b25kaXRpb25hbCBhY3F1aXNpdGlvbiB0byBhdm9pZAorCSAqIGluZGVmaW5pdGUgd2FpdGluZyBk dXJpbmcgY3JlZGVudGlhbCB2YWxpZGF0aW9uLgorCSAqLworCWlmICghQ29uZGl0aW9uYWxMb2Nr UmVsYXRpb25PaWQoQXV0aElkUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKSkKKwl7CisJCS8q CisJCSAqIENvdWxkIG5vdCBhY3F1aXJlIGxvY2sgaW1tZWRpYXRlbHksIHdoaWNoIGxpa2VseSBt ZWFucyBhbm90aGVyIHNlc3Npb24KKwkJICogaXMgbW9kaWZ5aW5nIHVzZXIgZGF0YS4gRm9yIGNy ZWRlbnRpYWwgdmFsaWRhdGlvbiwgaXQncyBiZXR0ZXIgdG8KKwkJICogY29uc2lkZXIgY3JlZGVu dGlhbHMgdmFsaWQgYW5kIHJldHJ5IGxhdGVyIHRoYW4gdG8gYmxvY2sgaW5kZWZpbml0ZWx5Lgor CQkgKi8KKwkJZWxvZyhMT0csICJjcmVkZW50aWFsIHZhbGlkYXRpb246IGNvdWxkIG5vdCBhY3F1 aXJlIGxvY2sgb24gcGdfYXV0aGlkIGltbWVkaWF0ZWx5LCB3aWxsIHJldHJ5IGxhdGVyIik7CisJ CXJldHVybiB0cnVlOyAvKiBDb25zaWRlciB2YWxpZCAqLworCX0KKworCVBHX1RSWSgpOworCXsK KwkJdHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoQVVUSE9JRCwgT2JqZWN0SWRHZXREYXR1bSh1c2Vy aWQpKTsKKworCQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh0dXBsZSkpCisJCXsKKwkJCS8qIEdldCB0 aGUgZXhwaXJhdGlvbiB0aW1lIGNvbHVtbiAqLworCQkJcm9sdmFsaWR1bnRpbF9kYXR1bSA9IFN5 c0NhY2hlR2V0QXR0cihBVVRIT0lELCB0dXBsZSwKKwkJCQkJCQkJCQkJCSAgQW51bV9wZ19hdXRo aWRfcm9sdmFsaWR1bnRpbCwKKwkJCQkJCQkJCQkJCSAgJnZhbGlkdW50aWxfbnVsbCk7CisJCQlp ZiAoIXZhbGlkdW50aWxfbnVsbCkKKwkJCXsKKwkJCQl2YWxpZF91bnRpbCA9IERhdHVtR2V0VGlt ZXN0YW1wVHoocm9sdmFsaWR1bnRpbF9kYXR1bSk7CisJCQkJY3VycmVudF90aW1lID0gR2V0Q3Vy cmVudFRpbWVzdGFtcCgpOworCisJCQkJcmVzdWx0ID0gISh2YWxpZF91bnRpbCA8IGN1cnJlbnRf dGltZSk7CisJCQl9CisJCQllbHNlCisJCQkJcmVzdWx0ID0gdHJ1ZTsKKworCQkJUmVsZWFzZVN5 c0NhY2hlKHR1cGxlKTsKKwkJCXR1cGxlID0gTlVMTDsKKwkJfQorCX0KKwlQR19GSU5BTExZKCk7 CisJeworCQlpZiAodHVwbGUgIT0gTlVMTCkKKwkJCVJlbGVhc2VTeXNDYWNoZSh0dXBsZSk7CisK KwkJVW5sb2NrUmVsYXRpb25PaWQoQXV0aElkUmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsK Kwl9CisJUEdfRU5EX1RSWSgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENoZWNr IGlmIGFuIE9BdXRoIHRva2VuIGhhcyBleHBpcmVkLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0 aGUgdG9rZW4gaXMgc3RpbGwgdmFsaWQsIGZhbHNlIGlmIGl0IGhhcyBleHBpcmVkLgorICoKKyAq IENhbGxzIHdyYXBwZXIgQ2hlY2tPQXV0aFZhbGlkYXRvckV4cGlyYXRpb24oKSBmdW5jdGlvbgor ICogdG8gdmVyaWZ5IHRoYXQgdGhlIHRva2VuIGhhc24ndCBleHBpcmVkLgorICovCitzdGF0aWMg Ym9vbAordmFsaWRhdGVfb2F1dGhfY3JlZGVudGlhbHModm9pZCkKK3sKKwkvKiBDYWxsIHRoZSB2 YWxpZGF0b3IncyBleHBpcmVfY2IgdG8gY2hlY2sgdG9rZW4gZXhwaXJhdGlvbiAqLworCWlmICgh Q2hlY2tPQXV0aFZhbGlkYXRvckV4cGlyYXRpb24oKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0 dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9saWJwcS9hdXRoLXZhbGlkYXRl LmMgYi9zcmMvYmFja2VuZC9saWJwcS9hdXRoLXZhbGlkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLmNjNGM3ZDMxNzUzCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj L2JhY2tlbmQvbGlicHEvYXV0aC12YWxpZGF0ZS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyoKKyogYXV0aC12YWxpZGF0ZS5jCisqICAgICAgSW1wbGVtZW50YXRpb24g b2YgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCB2YWxpZGF0aW9uCisqCisqIFRoaXMgbW9kdWxl IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB2YWxpZGF0aW5nIGNyZWRlbnRpYWxzIGR1cmluZwor KiBhbiBhY3RpdmUgUG9zdGdyZVNRTCBzZXNzaW9uLgorKgorKiBQb3J0aW9ucyBDb3B5cmlnaHQg KGMpIDE5OTYtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyogUG9y dGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENh bGlmb3JuaWEKKyoKKyogSURFTlRJRklDQVRJT04KKyogICAgICBzcmMvYmFja2VuZC9saWJwcS9h dXRoLXZhbGlkYXRlLmMKKyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgInBvc3Rn cmVzLmgiCisKKyNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9n LmgiCisjaW5jbHVkZSAibGlicHEvYXV0aC5oIgorI2luY2x1ZGUgImxpYnBxL2xpYnBxLWJlLmgi CisjaW5jbHVkZSAibGlicHEvYXV0aC12YWxpZGF0ZS5oIgorI2luY2x1ZGUgImxpYnBxL2F1dGgt dmFsaWRhdGUtbWV0aG9kcy5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInBv c3RtYXN0ZXIvcG9zdG1hc3Rlci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvaXBjLmgiCisjaW5jbHVk ZSAidGNvcC90Y29wcHJvdC5oIgorI2luY2x1ZGUgInV0aWxzL2Vsb2cuaCIKKyNpbmNsdWRlICJ1 dGlscy9ndWMuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJ1dGls cy90aW1lb3V0LmgiCisKKy8qIEdVQyB2YXJpYWJsZXMgKi8KK2Jvb2wJCWNyZWRlbnRpYWxfdmFs aWRhdGlvbl9lbmFibGVkOworaW50CQkJY3JlZGVudGlhbF92YWxpZGF0aW9uX2ludGVydmFsOwor CisKKy8qIFJlZ2lzdGVyZWQgY3JlZGVudGlhbCB2YWxpZGF0b3JzICovCitzdGF0aWMgQ3JlZGVu dGlhbFZhbGlkYXRpb25DYWxsYmFjayB2YWxpZGF0b3JzW0NWVF9DT1VOVF07CisKKworLyoKKyAq IENvbnZlcnQgVXNlckF1dGggZW51bSB0byBDcmVkZW50aWFsVmFsaWRhdGlvblR5cGUgZm9yIHZh bGlkYXRvciBzZWxlY3Rpb24KKyAqLworc3RhdGljIENyZWRlbnRpYWxWYWxpZGF0aW9uVHlwZQor VXNlckF1dGhUb1ZhbGlkYXRpb25UeXBlKFVzZXJBdXRoIGF1dGhfbWV0aG9kKQoreworCXN3aXRj aCAoYXV0aF9tZXRob2QpCisJeworCQljYXNlIHVhUGFzc3dvcmQ6CisJCWNhc2UgdWFNRDU6CisJ CWNhc2UgdWFTQ1JBTToKKwkJLyogQWxsIHBhc3N3b3JkLWJhc2VkIG1ldGhvZHMgdXNlIHRoZSBw YXNzd29yZCB2YWxpZGF0b3IgKi8KKwkJCXJldHVybiBDVlRfUEFTU1dPUkQ7CisJCWNhc2UgdWFP QXV0aDoKKwkJCXJldHVybiBDVlRfT0FVVEg7CisJCWRlZmF1bHQ6CisJCQkvKiBObyBzcGVjaWZp YyB2YWxpZGF0b3IgZm9yIG90aGVyIGF1dGggbWV0aG9kcyAqLworCQkJcmV0dXJuIENWVF9DT1VO VDsgIC8qIEludmFsaWQgdmFsdWUgKi8KKwl9Cit9CisKKy8qCisgKiBQcm9jZXNzIGNyZWRlbnRp YWwgdmFsaWRhdGlvbgorICovCit2b2lkCitQcm9jZXNzQ3JlZGVudGlhbFZhbGlkYXRpb24odm9p ZCkKK3sKKwkvKiBTa2lwIHZhbGlkYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uLCBib290c3Ry YXAsIGF1dGhlbnRpY2F0aW9uIG9yIGNvbm5lY3Rpb24gc2V0dXAgKi8KKwlpZiAoQ2xpZW50QXV0 aEluUHJvZ3Jlc3MgfHwgSXNJbml0UHJvY2Vzc2luZ01vZGUoKSB8fCBJc0Jvb3RzdHJhcFByb2Nl c3NpbmdNb2RlKCkpCisJCXJldHVybjsKKworCS8qIENoZWNrIGNyZWRlbnRpYWxzIGlmIHZhbGlk YXRpb24gaXMgZW5hYmxlZCAqLworCWlmIChjcmVkZW50aWFsX3ZhbGlkYXRpb25fZW5hYmxlZCAm JiBNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhuX2lkICE9IE5VTEwpCisJeworCQlDcmVkZW50 aWFsVmFsaWRhdGlvblN0YXR1cyBzdGF0dXM7CisJCVVzZXJBdXRoCWF1dGhfbWV0aG9kID0gTXlD bGllbnRDb25uZWN0aW9uSW5mby5hdXRoX21ldGhvZDsKKworCQlzdGF0dXMgPSBDaGVja0NyZWRl bnRpYWxWYWxpZGl0eSgpOworCisJCXN3aXRjaCAoc3RhdHVzKQorCQl7CisJCQljYXNlIENWU19W QUxJRDoKKwkJCQkvKiBDcmVkZW50aWFscyBhcmUgdmFsaWQsIGNvbnRpbnVlICovCisJCQkJYnJl YWs7CisKKwkJCWNhc2UgQ1ZTX0VYUElSRUQ6CisJCQkJZWxvZyhMT0csICJjcmVkZW50aWFsIHZh bGlkYXRpb246IGNyZWRlbnRpYWxzIGV4cGlyZWQgZm9yIGF1dGhfbWV0aG9kPSVkIiwKKwkJCQkJ IChpbnQpIGF1dGhfbWV0aG9kKTsKKwkJCQllcmVwb3J0KEZBVEFMLAorCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9JTlZBTElEX0FVVEhPUklaQVRJT05fU1BFQ0lGSUNBVElPTiksCisJCQkJCQkgZXJy bXNnKCJzZXNzaW9uIGNyZWRlbnRpYWxzIGhhdmUgZXhwaXJlZCIpLAorCQkJCQkJIGVycmhpbnQo IlBsZWFzZSByZWNvbm5lY3QgdG8gZXN0YWJsaXNoIGEgbmV3IGF1dGhlbnRpY2F0ZWQgc2Vzc2lv biIpKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ1ZTX0VSUk9SOgorCQkJCWVsb2coTE9HLCAi Y3JlZGVudGlhbCB2YWxpZGF0aW9uOiBlcnJvciBjaGVja2luZyBjcmVkZW50aWFscyBmb3IgYXV0 aF9tZXRob2Q9JWQiLAorCQkJCQkgKGludCkgYXV0aF9tZXRob2QpOworCQkJCWVyZXBvcnQoV0FS TklORywKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9BVVRIT1JJWkFUSU9OX1NQRUNJ RklDQVRJT04pLAorCQkJCQkJIGVycm1zZygiZXJyb3IgY2hlY2tpbmcgY3JlZGVudGlhbCB2YWxp ZGl0eSIpLAorCQkJCQkJIGVycmhpbnQoIkNyZWRlbnRpYWwgdmFsaWRhdGlvbiB3aWxsIGJlIHJl dHJpZWQgYXQgdGhlIG5leHQgaW50ZXJ2YWwiKSkpOworCQkJCWJyZWFrOworCQkJfQorCX0KK30K KworLyoKKyAqIEluaXRpYWxpemUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHN5c3RlbSBDYWxsZWQg ZnJvbSBJbml0UG9zdGdyZXMgYWZ0ZXIKKyAqIGF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlcworICov Cit2b2lkCitJbml0aWFsaXplQ3JlZGVudGlhbFZhbGlkYXRpb24odm9pZCkKK3sKKwlpbnQJCQlp OworCisJLyogRGVmaW5lIEdVQyB2YXJpYWJsZXMgKi8KKwlEZWZpbmVDdXN0b21Cb29sVmFyaWFi bGUoImNyZWRlbnRpYWxfdmFsaWRhdGlvbi5lbmFibGVkIiwKKwkJCQkJCQkgIkVuYWJsZSBwZXJp b2RpYyBjcmVkZW50aWFsIHZhbGlkYXRpb24uIiwKKwkJCQkJCQkgTlVMTCwKKwkJCQkJCQkgJmNy ZWRlbnRpYWxfdmFsaWRhdGlvbl9lbmFibGVkLAorCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkgUEdD X1NVU0VULAorCQkJCQkJCSAwLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJ CSBOVUxMKTsKKworCURlZmluZUN1c3RvbUludFZhcmlhYmxlKCJjcmVkZW50aWFsX3ZhbGlkYXRp b24uaW50ZXJ2YWwiLAorCQkJCQkJCSJDcmVkZW50aWFsIHZhbGlkYXRpb24gaW50ZXJ2YWwgaW4g c2Vjb25kcy4iLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJJmNyZWRlbnRpYWxfdmFsaWRhdGlvbl9p bnRlcnZhbCwKKwkJCQkJCQk2MCwJLyogZGVmYXVsdDogNjAgc2Vjb25kcyAqLworCQkJCQkJCTUs CS8qIG1pbjogNSBzZWNvbmRzICovCisJCQkJCQkJMzYwMCwJLyogbWF4OiAzNjAwIHNlY29uZHMg KDEgaG91cikgKi8KKwkJCQkJCQlQR0NfU1VTRVQsCisJCQkJCQkJR1VDX1VOSVRfUywKKwkJCQkJ CQlOVUxMLAorCQkJCQkJCU5VTEwsCisJCQkJCQkJTlVMTCk7CisKKwkvKiBJbml0aWFsaXplIHZh bGlkYXRvciBjYWxsYmFja3MgdG8gTlVMTCAqLworCWZvciAoaSA9IDA7IGkgPCBDVlRfQ09VTlQ7 IGkrKykKKwkJdmFsaWRhdG9yc1tpXSA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIGFuZCByZWdp c3RlciBhbGwgdmFsaWRhdGlvbiBtZXRob2RzICovCisJSW5pdGlhbGl6ZVZhbGlkYXRpb25NZXRo b2RzKCk7Cit9CisKKy8qCisgKiBFbmFibGUgb3IgcmUtZW5hYmxlIHRoZSBjcmVkZW50aWFsIHZh bGlkYXRpb24gdGltZW91dCB0aW1lci4KKyAqIENhbGxlZCBhdCBzZXNzaW9uIHN0YXJ0dXAgYW5k IGFmdGVyIGVhY2ggdmFsaWRhdGlvbiBvciBlcnJvciByZWNvdmVyeS4KKyAqLwordm9pZAorRW5h YmxlQ3JlZGVudGlhbFZhbGlkYXRpb25UaW1lb3V0KHZvaWQpCit7CisJaW50CQkJaW50ZXJ2YWxf bXM7CisKKwkvKiBPbmx5IGVuYWJsZSBpZiBjcmVkZW50aWFsIHZhbGlkYXRpb24gaXMgY29uZmln dXJlZCAqLworCWlmICghY3JlZGVudGlhbF92YWxpZGF0aW9uX2VuYWJsZWQpCisJCXJldHVybjsK KworCS8qIFNraXAgZm9yIG5vbi1jbGllbnQgYmFja2VuZHMgKi8KKwlpZiAoIUlzRXh0ZXJuYWxD b25uZWN0aW9uQmFja2VuZChNeUJhY2tlbmRUeXBlKSkKKwkJcmV0dXJuOworCisJLyogQ29udmVy dCBpbnRlcnZhbCBmcm9tIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzICovCisJaW50ZXJ2YWxfbXMg PSBjcmVkZW50aWFsX3ZhbGlkYXRpb25faW50ZXJ2YWwgKiAxMDAwOworCisJZW5hYmxlX3RpbWVv dXRfYWZ0ZXIoQ1JFREVOVElBTF9WQUxJREFUSU9OX1RJTUVPVVQsIGludGVydmFsX21zKTsKKwor CWVsb2coREVCVUcxLCAiY3JlZGVudGlhbCB2YWxpZGF0aW9uIHRpbWVvdXQgZW5hYmxlZCwgaW50 ZXJ2YWw9JWQgcyIsIGNyZWRlbnRpYWxfdmFsaWRhdGlvbl9pbnRlcnZhbCk7Cit9CisKKy8qCisg KiBSZWdpc3RlciBhIHZhbGlkYXRvciBjYWxsYmFjayBmb3IgYSBzcGVjaWZpYyBhdXRoZW50aWNh dGlvbiBtZXRob2QKKyAqLwordm9pZAorUmVnaXN0ZXJDcmVkZW50aWFsVmFsaWRhdG9yKENyZWRl bnRpYWxWYWxpZGF0aW9uVHlwZSBtZXRob2RfdHlwZSwgQ3JlZGVudGlhbFZhbGlkYXRpb25DYWxs YmFjayB2YWxpZGF0b3IpCit7CisJaWYgKG1ldGhvZF90eXBlIDwgMCB8fCBtZXRob2RfdHlwZSA+ PSBDVlRfQ09VTlQpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZB TElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJIGVycm1zZygiaW52YWxpZCB2YWxpZGF0aW9uIG1l dGhvZCB0eXBlOiAlZCIsIG1ldGhvZF90eXBlKSkpOworCisJdmFsaWRhdG9yc1ttZXRob2RfdHlw ZV0gPSB2YWxpZGF0b3I7Cit9CisKKy8qCisgKiBDaGVjayBjcmVkZW50aWFsIHZhbGlkaXR5IHVz aW5nIHRoZSBhcHByb3ByaWF0ZSB2YWxpZGF0b3IKKyAqLworQ3JlZGVudGlhbFZhbGlkYXRpb25T dGF0dXMKK0NoZWNrQ3JlZGVudGlhbFZhbGlkaXR5KHZvaWQpCit7CisJQ3JlZGVudGlhbFZhbGlk YXRpb25DYWxsYmFjayB2YWxpZGF0b3IgPSBOVUxMOworCUNyZWRlbnRpYWxWYWxpZGF0aW9uU3Rh dHVzIHN0YXR1czsKKworCS8qCisJICogU2tpcCB2YWxpZGF0aW9uIGZvcjoKKwkgKiAtIER1cmlu ZyBzaHV0ZG93biBvciByZWNvdmVyeQorCSAqIC0gTm9uLWNsaWVudCBiYWNrZW5kcyAoYW55IHBy b2Nlc3Mgbm90IHNlcnZpbmcgYSBjbGllbnQgY29ubmVjdGlvbikKKwkgKiAtIEF1dG9WYWN1dW0g cHJvY2Vzc2VzIChsYXVuY2hlciBhbmQgd29ya2VycykKKwkgKiAtIEJhY2tncm91bmQgd29ya2Vy IHByb2Nlc3NlcworCSAqIC0gQXV0aGVudGljYXRpb24gaXMgaW4gcHJvZ3Jlc3MKKwkgKi8KKwlp ZiAocHJvY19leGl0X2lucHJvZ3Jlc3MgfHwKKwkJUmVjb3ZlcnlJblByb2dyZXNzKCkgfHwKKwkJ IUlzRXh0ZXJuYWxDb25uZWN0aW9uQmFja2VuZChNeUJhY2tlbmRUeXBlKSB8fAorCQlBbUF1dG9W YWN1dW1MYXVuY2hlclByb2Nlc3MoKSB8fAorCQlBbUF1dG9WYWN1dW1Xb3JrZXJQcm9jZXNzKCkg fHwKKwkJQW1CYWNrZ3JvdW5kV29ya2VyUHJvY2VzcygpIHx8CisJCUNsaWVudEF1dGhJblByb2dy ZXNzKQorCQlyZXR1cm4gQ1ZTX1ZBTElEOworCS8qCisJICogVXNlIHRoZSBzZXNzaW9uJ3MgYXV0 aGVudGljYXRpb24gbWV0aG9kIGZyb20gTXlDbGllbnRDb25uZWN0aW9uSW5mbworCSAqIHRvIHNl bGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdG9yLgorCSAqLworCWlmIChNeUNsaWVudENvbm5l Y3Rpb25JbmZvLmF1dGhuX2lkICE9IE5VTEwpCisJeworCQlDcmVkZW50aWFsVmFsaWRhdGlvblR5 cGUgdmFsaWRhdGlvbl90eXBlOworCisJCXZhbGlkYXRpb25fdHlwZSA9IFVzZXJBdXRoVG9WYWxp ZGF0aW9uVHlwZShNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhfbWV0aG9kKTsKKworCQkvKgor CQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgdmFsaWRhdGlvbiB0eXBlLCBnZXQgdGhlIGNvcnJlc3Bv bmRpbmcKKwkJICogdmFsaWRhdG9yCisJCSAqLworCQlpZiAodmFsaWRhdGlvbl90eXBlIDwgQ1ZU X0NPVU5UKQorCQkJdmFsaWRhdG9yID0gdmFsaWRhdG9yc1t2YWxpZGF0aW9uX3R5cGVdOworCisJ fQorCisJLyoKKwkgKiBJZiBubyB2YWxpZGF0b3IgZm91bmQgZm9yIHRoZSBjdXJyZW50IGF1dGgg bWV0aG9kIG9yIG5vCisJICogYXV0aGVudGljYXRlZCBzZXNzaW9uLCBza2lwIHZhbGlkYXRpb24g YW5kIGNvbnNpZGVyIGNyZWRlbnRpYWxzCisJICogdmFsaWQKKwkgKi8KKwlpZiAodmFsaWRhdG9y ID09IE5VTEwgfHwgIU15Q2xpZW50Q29ubmVjdGlvbkluZm8uYXV0aG5faWQpCisJCQlyZXR1cm4g Q1ZTX1ZBTElEOworCisJLyogQ2FsbCB0aGUgdmFsaWRhdG9yIGFuZCBpbnRlcnByZXQgcmVzdWx0 ICovCisJZWxvZyhERUJVRzEsICJjcmVkZW50aWFsIHZhbGlkYXRpb246IHZhbGlkYXRpbmcgYXV0 aF9tZXRob2Q9JWQiLCAoaW50KSBNeUNsaWVudENvbm5lY3Rpb25JbmZvLmF1dGhfbWV0aG9kKTsK KworCVBHX1RSWSgpOworCXsKKwkJYm9vbAkJcmVzdWx0ID0gdmFsaWRhdG9yKCk7CisKKwkJc3Rh dHVzID0gcmVzdWx0ID8gQ1ZTX1ZBTElEIDogQ1ZTX0VYUElSRUQ7CisJfQorCVBHX0NBVENIKCk7 CisJeworCQkvKiBFcnJvciBkdXJpbmcgdmFsaWRhdGlvbiAqLworCQlGbHVzaEVycm9yU3RhdGUo KTsKKwkJc3RhdHVzID0gQ1ZTX0VSUk9SOworCX0KKwlQR19FTkRfVFJZKCk7CisKKwlyZXR1cm4g c3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvbGlicHEvbWVzb24uYnVpbGQgYi9z cmMvYmFja2VuZC9saWJwcS9tZXNvbi5idWlsZAppbmRleCA4NTcxZjY1Mjg0NC4uMmU2OTY4NTY3 MmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2xpYnBxL21lc29uLmJ1aWxkCisrKyBiL3NyYy9i YWNrZW5kL2xpYnBxL21lc29uLmJ1aWxkCkBAIC00LDYgKzQsOCBAQCBiYWNrZW5kX3NvdXJjZXMg Kz0gZmlsZXMoCiAgICdhdXRoLW9hdXRoLmMnLAogICAnYXV0aC1zYXNsLmMnLAogICAnYXV0aC1z Y3JhbS5jJywKKyAgJ2F1dGgtdmFsaWRhdGUtbWV0aG9kcy5jJywKKyAgJ2F1dGgtdmFsaWRhdGUu YycsCiAgICdhdXRoLmMnLAogICAnYmUtZnNzdHVicy5jJywKICAgJ2JlLXNlY3VyZS1jb21tb24u YycsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC90Y29wL3Bvc3RncmVzLmMgYi9zcmMvYmFja2Vu ZC90Y29wL3Bvc3RncmVzLmMKaW5kZXggYjM1NjMxMTMyMTkuLmNlOWY5Y2VmNWM1IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC90Y29wL3Bvc3RncmVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdGNvcC9w b3N0Z3Jlcy5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAibGlicHEvbGlicHEuaCIKICNp bmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgogI2luY2x1ZGUgImxpYnBxL3Bxc2lnbmFsLmgiCisj aW5jbHVkZSAibGlicHEvYXV0aC12YWxpZGF0ZS5oIgogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgi CiAjaW5jbHVkZSAibWIvc3RyaW5naW5mb19tYi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgpA QCAtOTgsNiArOTksMjUgQEAgYm9vbAkJTG9nX2Rpc2Nvbm5lY3Rpb25zID0gZmFsc2U7CiAKIGlu dAkJCWxvZ19zdGF0ZW1lbnQgPSBMT0dTVE1UX05PTkU7CiAKKworCisvKgorICogRnVuY3Rpb24g dGhhdCBwZXJmb3JtcyBjcmVkZW50aWFsIHZhbGlkYXRpb24gd2hlbiBuZWVkZWQKKyAqIFVzZXMg YSB0aW1lci1iYXNlZCBhcHByb2FjaCB0byBwZXJpb2RpY2FsbHkgdmFsaWRhdGUgY3JlZGVudGlh bHMKKyAqIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLCBza2lwcGluZyB2YWxpZGF0aW9uIGluIGJv b3RzdHJhcHBpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitDaGVja0FuZEV4ZWN1dGVDcmVkZW50aWFs VmFsaWRhdGlvbih2b2lkKQoreworCUNyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dFBlbmRpbmcg PSBmYWxzZTsKKworCS8qIFByb2Nlc3MgY3JlZGVudGlhbCB2YWxpZGF0aW9uICovCisJUHJvY2Vz c0NyZWRlbnRpYWxWYWxpZGF0aW9uKCk7CisKKwkvKiBSZS1lbmFibGUgdGhlIHRpbWVvdXQgZm9y IHRoZSBuZXh0IHZhbGlkYXRpb24gY3ljbGUgKi8KKwlFbmFibGVDcmVkZW50aWFsVmFsaWRhdGlv blRpbWVvdXQoKTsKK30KKwogLyogd2FpdCBOIHNlY29uZHMgdG8gYWxsb3cgYXR0YWNoIGZyb20g YSBkZWJ1Z2dlciAqLwogaW50CQkJUG9zdEF1dGhEZWxheSA9IDA7CiAKQEAgLTEwNTAsNiArMTA3 MCwxMCBAQCBleGVjX3NpbXBsZV9xdWVyeShjb25zdCBjaGFyICpxdWVyeV9zdHJpbmcpCiAJICov CiAJc3RhcnRfeGFjdF9jb21tYW5kKCk7CiAKKwkvKiBDaGVjayBhbmQgcG90ZW50aWFsbHkgZXhl Y3V0ZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gKi8KKwlpZiAoQ3JlZGVudGlhbFZhbGlkYXRpb25U aW1lb3V0UGVuZGluZyAmJiBJc05vcm1hbFByb2Nlc3NpbmdNb2RlKCkpCisJCUNoZWNrQW5kRXhl Y3V0ZUNyZWRlbnRpYWxWYWxpZGF0aW9uKCk7CisKIAkvKgogCSAqIFphcCBhbnkgcHJlLWV4aXN0 aW5nIHVubmFtZWQgc3RhdGVtZW50LiAgKFdoaWxlIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksCiAJ ICogaXQgc2VlbXMgYmVzdCB0byBkZWZpbmUgc2ltcGxlLVF1ZXJ5IG1vZGUgYXMgaWYgaXQgdXNl ZCB0aGUgdW5uYW1lZApAQCAtMTQzMSw2ICsxNDU1LDExIEBAIGV4ZWNfcGFyc2VfbWVzc2FnZShj b25zdCBjaGFyICpxdWVyeV9zdHJpbmcsCS8qIHN0cmluZyB0byBleGVjdXRlICovCiAJICovCiAJ c3RhcnRfeGFjdF9jb21tYW5kKCk7CiAKKworCS8qIENoZWNrIGFuZCBwb3RlbnRpYWxseSBleGVj dXRlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiAqLworCWlmIChDcmVkZW50aWFsVmFsaWRhdGlvblRp bWVvdXRQZW5kaW5nICYmIElzTm9ybWFsUHJvY2Vzc2luZ01vZGUoKSkKKwkJQ2hlY2tBbmRFeGVj dXRlQ3JlZGVudGlhbFZhbGlkYXRpb24oKTsKKwogCS8qCiAJICogU3dpdGNoIHRvIGFwcHJvcHJp YXRlIGNvbnRleHQgZm9yIGNvbnN0cnVjdGluZyBwYXJzZXRyZWVzLgogCSAqCkBAIC0xNzA2LDYg KzE3MzUsMTAgQEAgZXhlY19iaW5kX21lc3NhZ2UoU3RyaW5nSW5mbyBpbnB1dF9tZXNzYWdlKQog CSAqLwogCXN0YXJ0X3hhY3RfY29tbWFuZCgpOwogCisJLyogQ2hlY2sgYW5kIHBvdGVudGlhbGx5 IGV4ZWN1dGUgY3JlZGVudGlhbCB2YWxpZGF0aW9uICovCisJaWYgKENyZWRlbnRpYWxWYWxpZGF0 aW9uVGltZW91dFBlbmRpbmcgJiYgSXNOb3JtYWxQcm9jZXNzaW5nTW9kZSgpKQorCQlDaGVja0Fu ZEV4ZWN1dGVDcmVkZW50aWFsVmFsaWRhdGlvbigpOworCiAJLyogU3dpdGNoIGJhY2sgdG8gbWVz c2FnZSBjb250ZXh0ICovCiAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKE1lc3NhZ2VDb250ZXh0KTsK IApAQCAtMjIxOCw2ICsyMjUxLDEwIEBAIGV4ZWNfZXhlY3V0ZV9tZXNzYWdlKGNvbnN0IGNoYXIg KnBvcnRhbF9uYW1lLCBsb25nIG1heF9yb3dzKQogCSAqLwogCXN0YXJ0X3hhY3RfY29tbWFuZCgp OwogCisJLyogQ2hlY2sgYW5kIHBvdGVudGlhbGx5IGV4ZWN1dGUgY3JlZGVudGlhbCB2YWxpZGF0 aW9uICovCisJaWYgKENyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dFBlbmRpbmcgJiYgSXNOb3Jt YWxQcm9jZXNzaW5nTW9kZSgpKQorCQlDaGVja0FuZEV4ZWN1dGVDcmVkZW50aWFsVmFsaWRhdGlv bigpOworCiAJLyoKIAkgKiBJZiB3ZSByZS1pc3N1ZSBhbiBFeGVjdXRlIHByb3RvY29sIHJlcXVl c3QgYWdhaW5zdCBhbiBleGlzdGluZyBwb3J0YWwsCiAJICogdGhlbiB3ZSBhcmUgb25seSBmZXRj aGluZyBtb3JlIHJvd3MgcmF0aGVyIHRoYW4gY29tcGxldGVseSByZS1leGVjdXRpbmcKQEAgLTI2 MzYsNiArMjY3MywxMCBAQCBleGVjX2Rlc2NyaWJlX3N0YXRlbWVudF9tZXNzYWdlKGNvbnN0IGNo YXIgKnN0bXRfbmFtZSkKIAkgKi8KIAlzdGFydF94YWN0X2NvbW1hbmQoKTsKIAorCS8qIENoZWNr IGFuZCBwb3RlbnRpYWxseSBleGVjdXRlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiAqLworCWlmIChD cmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRQZW5kaW5nICYmIElzTm9ybWFsUHJvY2Vzc2luZ01v ZGUoKSkKKwkJQ2hlY2tBbmRFeGVjdXRlQ3JlZGVudGlhbFZhbGlkYXRpb24oKTsKKwogCS8qIFN3 aXRjaCBiYWNrIHRvIG1lc3NhZ2UgY29udGV4dCAqLwogCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhN ZXNzYWdlQ29udGV4dCk7CiAKQEAgLTI3MjgsNiArMjc2OSwxMCBAQCBleGVjX2Rlc2NyaWJlX3Bv cnRhbF9tZXNzYWdlKGNvbnN0IGNoYXIgKnBvcnRhbF9uYW1lKQogCSAqLwogCXN0YXJ0X3hhY3Rf Y29tbWFuZCgpOwogCisJLyogQ2hlY2sgYW5kIHBvdGVudGlhbGx5IGV4ZWN1dGUgY3JlZGVudGlh bCB2YWxpZGF0aW9uICovCisJaWYgKENyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dFBlbmRpbmcg JiYgSXNOb3JtYWxQcm9jZXNzaW5nTW9kZSgpKQorCQlDaGVja0FuZEV4ZWN1dGVDcmVkZW50aWFs VmFsaWRhdGlvbigpOworCiAJLyogU3dpdGNoIGJhY2sgdG8gbWVzc2FnZSBjb250ZXh0ICovCiAJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKE1lc3NhZ2VDb250ZXh0KTsKIApAQCAtNDYzNSw2ICs0Njgw LDExIEBAIFBvc3RncmVzTWFpbihjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnVzZXJu YW1lKQogCQkJCQllbmFibGVfdGltZW91dF9hZnRlcihJRExFX0lOX1RSQU5TQUNUSU9OX1NFU1NJ T05fVElNRU9VVCwKIAkJCQkJCQkJCQkgSWRsZUluVHJhbnNhY3Rpb25TZXNzaW9uVGltZW91dCk7 CiAJCQkJfQorCisJCQkJLyogUmUtZW5hYmxlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0aW1lciBp ZiBuZWVkZWQgKi8KKwkJCQlpZiAoY3JlZGVudGlhbF92YWxpZGF0aW9uX2VuYWJsZWQgJiYKKwkJ CQkJIWdldF90aW1lb3V0X2FjdGl2ZShDUkVERU5USUFMX1ZBTElEQVRJT05fVElNRU9VVCkpCisJ CQkJCUVuYWJsZUNyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dCgpOwogCQkJfQogCQkJZWxzZQog CQkJewpAQCAtNDY4Nyw2ICs0NzM3LDExIEBAIFBvc3RncmVzTWFpbihjb25zdCBjaGFyICpkYm5h bWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lKQogCQkJCQllbmFibGVfdGltZW91dF9hZnRlcihJRExF X1NFU1NJT05fVElNRU9VVCwKIAkJCQkJCQkJCQkgSWRsZVNlc3Npb25UaW1lb3V0KTsKIAkJCQl9 CisKKwkJCQkvKiBSZS1lbmFibGUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHRpbWVyIGlmIG5lZWRl ZCAqLworCQkJCWlmIChjcmVkZW50aWFsX3ZhbGlkYXRpb25fZW5hYmxlZCAmJgorCQkJCQkhZ2V0 X3RpbWVvdXRfYWN0aXZlKENSRURFTlRJQUxfVkFMSURBVElPTl9USU1FT1VUKSkKKwkJCQkJRW5h YmxlQ3JlZGVudGlhbFZhbGlkYXRpb25UaW1lb3V0KCk7CiAJCQl9CiAKIAkJCS8qIFJlcG9ydCBh bnkgcmVjZW50bHktY2hhbmdlZCBHVUMgb3B0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMu YwppbmRleCAzNmFkNzA4YjM2MC4uYWFiNTI2YTQ1ZGQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3V0aWxzL2luaXQvZ2xvYmFscy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFs cy5jCkBAIC0zNCw2ICszNCw3IEBAIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBRdWVyeUNhbmNlbFBl bmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBQcm9jRGllUGVuZGluZyA9IGZh bHNlOwogdm9sYXRpbGUgc2lnX2F0b21pY190IENoZWNrQ2xpZW50Q29ubmVjdGlvblBlbmRpbmcg PSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBDbGllbnRDb25uZWN0aW9uTG9zdCA9IGZh bHNlOwordm9sYXRpbGUgc2lnX2F0b21pY190IENyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dFBl bmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBJZGxlSW5UcmFuc2FjdGlvblNl c3Npb25UaW1lb3V0UGVuZGluZyA9IGZhbHNlOwogdm9sYXRpbGUgc2lnX2F0b21pY190IFRyYW5z YWN0aW9uVGltZW91dFBlbmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBJZGxl U2Vzc2lvblRpbWVvdXRQZW5kaW5nID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9pbml0L3Bvc3Rpbml0LmMgYi9zcmMvYmFja2VuZC91dGlscy9pbml0L3Bvc3Rpbml0LmMK aW5kZXggMjYxMTg2NjFmMDcuLmRjZWI3NDUzMDEzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91 dGlscy9pbml0L3Bvc3Rpbml0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5p dC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19kYl9yb2xlX3NldHRp bmcuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX3RhYmxlc3BhY2UuaCIKICNpbmNsdWRlICJsaWJw cS9hdXRoLmgiCisjaW5jbHVkZSAibGlicHEvYXV0aC12YWxpZGF0ZS5oIgogI2luY2x1ZGUgImxp YnBxL2xpYnBxLWJlLmgiCiAjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKICNpbmNsdWRlICJtaXNj YWRtaW4uaCIKQEAgLTkwLDYgKzkxLDcgQEAgc3RhdGljIHZvaWQgVHJhbnNhY3Rpb25UaW1lb3V0 SGFuZGxlcih2b2lkKTsKIHN0YXRpYyB2b2lkIElkbGVTZXNzaW9uVGltZW91dEhhbmRsZXIodm9p ZCk7CiBzdGF0aWMgdm9pZCBJZGxlU3RhdHNVcGRhdGVUaW1lb3V0SGFuZGxlcih2b2lkKTsKIHN0 YXRpYyB2b2lkIENsaWVudENoZWNrVGltZW91dEhhbmRsZXIodm9pZCk7CitzdGF0aWMgdm9pZCBD cmVkZW50aWFsVmFsaWRhdGlvblRpbWVvdXRIYW5kbGVyKHZvaWQpOwogc3RhdGljIGJvb2wgVGhl cmVJc0F0TGVhc3RPbmVSb2xlKHZvaWQpOwogc3RhdGljIHZvaWQgcHJvY2Vzc19zdGFydHVwX29w dGlvbnMoUG9ydCAqcG9ydCwgYm9vbCBhbV9zdXBlcnVzZXIpOwogc3RhdGljIHZvaWQgcHJvY2Vz c19zZXR0aW5ncyhPaWQgZGF0YWJhc2VpZCwgT2lkIHJvbGVpZCk7CkBAIC03NzQsNiArNzc2LDgg QEAgSW5pdFBvc3RncmVzKGNvbnN0IGNoYXIgKmluX2RibmFtZSwgT2lkIGRib2lkLAogCQlSZWdp c3RlclRpbWVvdXQoQ0xJRU5UX0NPTk5FQ1RJT05fQ0hFQ0tfVElNRU9VVCwgQ2xpZW50Q2hlY2tU aW1lb3V0SGFuZGxlcik7CiAJCVJlZ2lzdGVyVGltZW91dChJRExFX1NUQVRTX1VQREFURV9USU1F T1VULAogCQkJCQkJSWRsZVN0YXRzVXBkYXRlVGltZW91dEhhbmRsZXIpOworCQlSZWdpc3RlclRp bWVvdXQoQ1JFREVOVElBTF9WQUxJREFUSU9OX1RJTUVPVVQsCisJCQkJCQlDcmVkZW50aWFsVmFs aWRhdGlvblRpbWVvdXRIYW5kbGVyKTsKIAl9CiAKIAkvKgpAQCAtMTIyNyw2ICsxMjMxLDEyIEBA IEluaXRQb3N0Z3Jlcyhjb25zdCBjaGFyICppbl9kYm5hbWUsIE9pZCBkYm9pZCwKIAkvKiBJbml0 aWFsaXplIHRoaXMgYmFja2VuZCdzIHNlc3Npb24gc3RhdGUuICovCiAJSW5pdGlhbGl6ZVNlc3Np b24oKTsKIAorCS8qIEluaXRpYWxpemUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHN5c3RlbSAqLwor CUluaXRpYWxpemVDcmVkZW50aWFsVmFsaWRhdGlvbigpOworCisJLyogRW5hYmxlIGNyZWRlbnRp YWwgdmFsaWRhdGlvbiB0aW1lb3V0IGlmIGNvbmZpZ3VyZWQgKi8KKwlFbmFibGVDcmVkZW50aWFs VmFsaWRhdGlvblRpbWVvdXQoKTsKKwogCS8qCiAJICogSWYgdGhpcyBpcyBhbiBpbnRlcmFjdGl2 ZSBzZXNzaW9uLCBsb2FkIGFueSBsaWJyYXJpZXMgdGhhdCBzaG91bGQgYmUKIAkgKiBwcmVsb2Fk ZWQgYXQgYmFja2VuZCBzdGFydC4gIFNpbmNlIHRob3NlIGFyZSBkZXRlcm1pbmVkIGJ5IEdVQ3Ms IHRoaXMKQEAgLTE0MzMsNiArMTQ0MywxNCBAQCBJZGxlU3RhdHNVcGRhdGVUaW1lb3V0SGFuZGxl cih2b2lkKQogCVNldExhdGNoKE15TGF0Y2gpOwogfQogCitzdGF0aWMgdm9pZAorQ3JlZGVudGlh bFZhbGlkYXRpb25UaW1lb3V0SGFuZGxlcih2b2lkKQoreworCUNyZWRlbnRpYWxWYWxpZGF0aW9u VGltZW91dFBlbmRpbmcgPSB0cnVlOworCUludGVycnVwdFBlbmRpbmcgPSB0cnVlOworCVNldExh dGNoKE15TGF0Y2gpOworfQorCiBzdGF0aWMgdm9pZAogQ2xpZW50Q2hlY2tUaW1lb3V0SGFuZGxl cih2b2lkKQogewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3Fs LmNvbmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2Ft cGxlCmluZGV4IGU0YWJlNmMwMDc3Li4yYWVmNmY2NzMwOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCisrKyBiL3NyYy9iYWNrZW5kL3V0 aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQpAQCAtOTA0LDYgKzkwNCwxMiBAQAogI2lu Y2x1ZGVfaWZfZXhpc3RzID0gJy4uLicgICAgICAgICAgICAgICMgaW5jbHVkZSBmaWxlIG9ubHkg aWYgaXQgZXhpc3RzCiAjaW5jbHVkZSA9ICcuLi4nICAgICAgICAgICAgICAgICAgICAgICAgIyBp bmNsdWRlIGZpbGUKIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDUkVERU5USUFMIFZBTElE QVRJT04KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY3JlZGVudGlhbF92YWxpZGF0aW9uLmVu YWJsZWQgPSB0cnVlICAjIGVuYWJsZSBwZXJpb2RpYyBjcmVkZW50aWFsIHZhbGlkYXRpb24KK2Ny ZWRlbnRpYWxfdmFsaWRhdGlvbi5pbnRlcnZhbCA9IDYwICAgICMgdmFsaWRhdGlvbiBpbnRlcnZh bCBpbiBzZWNvbmRzICg1LTM2MDApCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQ1VTVE9N SVpFRCBPUFRJT05TCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9saWJwcS9hdXRoLXZhbGlkYXRl LW1ldGhvZHMuaCBiL3NyYy9pbmNsdWRlL2xpYnBxL2F1dGgtdmFsaWRhdGUtbWV0aG9kcy5oCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40MjAxODNhMWM3ZAotLS0gL2Rl di9udWxsCisrKyBiL3NyYy9pbmNsdWRlL2xpYnBxL2F1dGgtdmFsaWRhdGUtbWV0aG9kcy5oCkBA IC0wLDAgKzEsMjUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGF1dGgtdmFsaWRhdGUt bWV0aG9kcy5oCisgKiAgICAgIEludGVyZmFjZSBmb3IgYXV0aGVudGljYXRpb24gY3JlZGVudGlh bCB2YWxpZGF0aW9uIG1ldGhvZHMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgZGVjbGFyYXRp b25zIGZvciB2YXJpb3VzIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiBtZXRob2RzCisgKiB1c2VkIHdp dGggdGhlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiBzeXN0ZW0uCisgKgorICogUG9ydGlvbnMgQ29w eXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3Vw CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNp dHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL2xpYnBxL2F1dGgtdmFsaWRhdGUt bWV0aG9kcy5oCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgQVVUSF9WQUxJ REFURV9NRVRIT0RTX0gKKyNkZWZpbmUgQVVUSF9WQUxJREFURV9NRVRIT0RTX0gKKworI2luY2x1 ZGUgImxpYnBxL2xpYnBxLWJlLmgiCisjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCisKKy8q IEluaXRpYWxpemUgYWxsIHZhbGlkYXRpb24gbWV0aG9kcyAqLworZXh0ZXJuIHZvaWQgSW5pdGlh bGl6ZVZhbGlkYXRpb25NZXRob2RzKHZvaWQpOworCisjZW5kaWYgICAgICAgICAgICAgICAgICAg ICAgICAgIC8qIEFVVEhfVkFMSURBVEVfTUVUSE9EU19IICovCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9saWJwcS9hdXRoLXZhbGlkYXRlLmggYi9zcmMvaW5jbHVkZS9saWJwcS9hdXRoLXZhbGlk YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmVhMDhjNTJmZGI5 Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvbGlicHEvYXV0aC12YWxpZGF0ZS5oCkBA IC0wLDAgKzEsNjQgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGF1dGgtdmFsaWRhdGUu aAorICoJICBJbnRlcmZhY2UgZm9yIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWwgdmFsaWRhdGlv bgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHZhbGlk YXRpbmcgY3JlZGVudGlhbHMKKyAqIGR1cmluZyBhbiBhY3RpdmUgUG9zdGdyZVNRTCBzZXNzaW9u LgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FMIEds b2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBS ZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAqCisgKiBzcmMvaW5jbHVk ZS9saWJwcS9hdXRoLXZhbGlkYXRlLmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lm bmRlZiBBVVRIX1ZBTElEQVRFX0gKKyNkZWZpbmUgQVVUSF9WQUxJREFURV9ICisKKyNpbmNsdWRl ICJsaWJwcS9saWJwcS1iZS5oIgorI2luY2x1ZGUgImxpYnBxL3Byb3RvY29sLmgiCisjaW5jbHVk ZSAicG9zdG1hc3Rlci9wb3N0bWFzdGVyLmgiCisjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCisjaW5j bHVkZSAidXRpbHMvdGltZW91dC5oIgorCisvKiBEZWZpbmUgY3JlZGVudGlhbCB2YWxpZGF0aW9u IG1ldGhvZCB0eXBlcyBhcyBhbiBlbnVtICovCit0eXBlZGVmIGVudW0gQ3JlZGVudGlhbFZhbGlk YXRpb25UeXBlCit7CisJQ1ZUX1BBU1NXT1JEID0gMCwgICAgICAgICAgLyogQWxsIHBhc3N3b3Jk LWJhc2VkIG1ldGhvZHMgKG1kNSwgc2NyYW0sIGV0YykgKi8KKwlDVlRfT0FVVEgsICAgICAgICAg ICAgICAgICAvKiBPQXV0aCBiZWFyZXIgdG9rZW4gYXV0aGVudGljYXRpb24gKi8KKwlDVlRfQ09V TlQgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY3JlZGVudGlhbCB2YWxpZGF0 aW9uIHR5cGVzICovCit9IENyZWRlbnRpYWxWYWxpZGF0aW9uVHlwZTsKKworLyogUHJvY2VzcyBj cmVkZW50aWFsIHZhbGlkYXRpb24gKi8KK2V4dGVybiB2b2lkIFByb2Nlc3NDcmVkZW50aWFsVmFs aWRhdGlvbih2b2lkKTsKKworLyogR1VDIHZhcmlhYmxlcyAqLworZXh0ZXJuIFBHRExMSU1QT1JU IGJvb2wgY3JlZGVudGlhbF92YWxpZGF0aW9uX2VuYWJsZWQ7CitleHRlcm4gUEdETExJTVBPUlQg aW50IGNyZWRlbnRpYWxfdmFsaWRhdGlvbl9pbnRlcnZhbDsKKworLyogQ29tbW9uIGNyZWRlbnRp YWwgdmFsaWRhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgYm9vbCAoKkNyZWRl bnRpYWxWYWxpZGF0aW9uQ2FsbGJhY2spICh2b2lkKTsKKworLyogQ3JlZGVudGlhbCB2YWxpZGF0 aW9uIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtIENyZWRlbnRpYWxWYWxpZGF0aW9uU3RhdHVzCit7 CisJQ1ZTX1ZBTElELAkJCQkJLyogQ3JlZGVudGlhbHMgYXJlIHZhbGlkICovCisJQ1ZTX0VYUElS RUQsCQkJCS8qIENyZWRlbnRpYWxzIGhhdmUgZXhwaXJlZCAqLworCUNWU19FUlJPUgkJCQkJLyog RXJyb3IgZHVyaW5nIHZhbGlkYXRpb24gKi8KK30gQ3JlZGVudGlhbFZhbGlkYXRpb25TdGF0dXM7 CisKKy8qIEluaXRpYWxpemUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHN5c3RlbSAqLworZXh0ZXJu IHZvaWQgSW5pdGlhbGl6ZUNyZWRlbnRpYWxWYWxpZGF0aW9uKHZvaWQpOworCisvKiBSZWdpc3Rl ciBhIHZhbGlkYXRpb24gY2FsbGJhY2sgZm9yIGEgc3BlY2lmaWMgYXV0aGVudGljYXRpb24gbWV0 aG9kICovCitleHRlcm4gdm9pZCBSZWdpc3RlckNyZWRlbnRpYWxWYWxpZGF0b3IoQ3JlZGVudGlh bFZhbGlkYXRpb25UeXBlIG1ldGhvZF90eXBlLAorCQkJCQkJCQkJCUNyZWRlbnRpYWxWYWxpZGF0 aW9uQ2FsbGJhY2sgdmFsaWRhdG9yKTsKKworLyogQ2hlY2sgY3JlZGVudGlhbCB2YWxpZGl0eSAq LworZXh0ZXJuIENyZWRlbnRpYWxWYWxpZGF0aW9uU3RhdHVzIENoZWNrQ3JlZGVudGlhbFZhbGlk aXR5KHZvaWQpOworCisvKiBFbmFibGUgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHRpbWVvdXQgdGlt ZXIgKi8KK2V4dGVybiB2b2lkIEVuYWJsZUNyZWRlbnRpYWxWYWxpZGF0aW9uVGltZW91dCh2b2lk KTsKKworI2VuZGlmCQkJCQkJCS8qIEFVVEhfVkFMSURBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvbGlicHEvb2F1dGguaCBiL3NyYy9pbmNsdWRlL2xpYnBxL29hdXRoLmgKaW5kZXgg NGE4MjJlOWExZjIuLjJmZDMwYzU1ODE0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9saWJwcS9v YXV0aC5oCisrKyBiL3NyYy9pbmNsdWRlL2xpYnBxL29hdXRoLmgKQEAgLTY0LDYgKzY0LDcgQEAg dHlwZWRlZiB2b2lkICgqVmFsaWRhdG9yU2h1dGRvd25DQikgKFZhbGlkYXRvck1vZHVsZVN0YXRl ICpzdGF0ZSk7CiB0eXBlZGVmIGJvb2wgKCpWYWxpZGF0b3JWYWxpZGF0ZUNCKSAoY29uc3QgVmFs aWRhdG9yTW9kdWxlU3RhdGUgKnN0YXRlLAogCQkJCQkJCQkJIGNvbnN0IGNoYXIgKnRva2VuLCBj b25zdCBjaGFyICpyb2xlLAogCQkJCQkJCQkJIFZhbGlkYXRvck1vZHVsZVJlc3VsdCAqcmVzdWx0 KTsKK3R5cGVkZWYgYm9vbCAoKlZhbGlkYXRvckV4cGlyZUNCKSAoY29uc3QgVmFsaWRhdG9yTW9k dWxlU3RhdGUgKnN0YXRlKTsKIAogLyoKICAqIElkZW50aWZpZXMgdGhlIGNvbXBpbGVkIEFCSSB2 ZXJzaW9uIG9mIHRoZSB2YWxpZGF0b3IgbW9kdWxlLiBTaW5jZSB0aGUgc2VydmVyCkBAIC03MSw3 ICs3Miw5IEBAIHR5cGVkZWYgYm9vbCAoKlZhbGlkYXRvclZhbGlkYXRlQ0IpIChjb25zdCBWYWxp ZGF0b3JNb2R1bGVTdGF0ZSAqc3RhdGUsCiAgKiB2ZXJzaW9ucywgdGhpcyBpcyByZXNlcnZlZCBm b3IgZW1lcmdlbmN5IHVzZSB3aXRoaW4gYSBzdGFibGUgcmVsZWFzZSBsaW5lLgogICogTWF5IGl0 IG5ldmVyIG5lZWQgdG8gY2hhbmdlLgogICovCi0jZGVmaW5lIFBHX09BVVRIX1ZBTElEQVRPUl9N QUdJQyAweDIwMjUwMjIwCisjZGVmaW5lIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMSAweDIw MjUwMjIwCisjZGVmaW5lIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQ19WMiAweDIwMjYwMzI2Cisj ZGVmaW5lIFBHX09BVVRIX1ZBTElEQVRPUl9NQUdJQyBQR19PQVVUSF9WQUxJREFUT1JfTUFHSUNf VjIKIAogdHlwZWRlZiBzdHJ1Y3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MKIHsKQEAgLTgwLDYg KzgzLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MKIAlWYWxpZGF0 b3JTdGFydHVwQ0Igc3RhcnR1cF9jYjsKIAlWYWxpZGF0b3JTaHV0ZG93bkNCIHNodXRkb3duX2Ni OwogCVZhbGlkYXRvclZhbGlkYXRlQ0IgdmFsaWRhdGVfY2I7CisJVmFsaWRhdG9yRXhwaXJlQ0Ig ZXhwaXJlX2NiOyAgLyogT3B0aW9uYWw6IENoZWNrIHRva2VuIGV4cGlyYXRpb24gKi8KIH0gT0F1 dGhWYWxpZGF0b3JDYWxsYmFja3M7CiAKIC8qCkBAIC05OCw0ICsxMDIsOCBAQCBleHRlcm4gUEdE TExJTVBPUlQgY29uc3QgcGdfYmVfc2FzbF9tZWNoIHBnX2JlX29hdXRoX21lY2g7CiAgKi8KIGV4 dGVybiBib29sIGNoZWNrX29hdXRoX3ZhbGlkYXRvcihIYmFMaW5lICpoYmFsaW5lLCBpbnQgZWxl dmVsLCBjaGFyICoqZXJyX21zZyk7CiAKKy8qCisgKiBDaGVjayBPQXV0aCB0b2tlbiBleHBpcmF0 aW9uIHVzaW5nIHZhbGlkYXRvcidzIGV4cGlyZV9jYiBpZiBhdmFpbGFibGUuCisgKi8KK2Jvb2wg Q2hlY2tPQXV0aFZhbGlkYXRvckV4cGlyYXRpb24odm9pZCk7CiAjZW5kaWYJCQkJCQkJLyogUEdf T0FVVEhfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbWlzY2FkbWluLmggYi9zcmMvaW5j bHVkZS9taXNjYWRtaW4uaAppbmRleCBmMTZmMzU2NTliOS4uNDJhMDllMmYyOTkgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL21pc2NhZG1pbi5oCisrKyBiL3NyYy9pbmNsdWRlL21pc2NhZG1pbi5o CkBAIC05OSw2ICs5OSw3IEBAIGV4dGVybiBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWlj X3QgSWRsZVN0YXRzVXBkYXRlVGltZW91dFBlbmRpbmc7CiAKIGV4dGVybiBQR0RMTElNUE9SVCB2 b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2hlY2tDbGllbnRDb25uZWN0aW9uUGVuZGluZzsKIGV4dGVy biBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2xpZW50Q29ubmVjdGlvbkxvc3Q7 CitleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IENyZWRlbnRpYWxWYWxp ZGF0aW9uVGltZW91dFBlbmRpbmc7CiAKIC8qIHRoZXNlIGFyZSBtYXJrZWQgdm9sYXRpbGUgYmVj YXVzZSB0aGV5IGFyZSBleGFtaW5lZCBieSBzaWduYWwgaGFuZGxlcnM6ICovCiBleHRlcm4gUEdE TExJTVBPUlQgdm9sYXRpbGUgdWludDMyIEludGVycnVwdEhvbGRvZmZDb3VudDsKZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL3V0aWxzL3RpbWVvdXQuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3RpbWVv dXQuaAppbmRleCAwOTY1YjU5MGIzNC4uZDQ2NzNhOGE0MDggMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL3V0aWxzL3RpbWVvdXQuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy90aW1lb3V0LmgKQEAg LTM2LDYgKzM2LDcgQEAgdHlwZWRlZiBlbnVtIFRpbWVvdXRJZAogCUlETEVfU1RBVFNfVVBEQVRF X1RJTUVPVVQsCiAJQ0xJRU5UX0NPTk5FQ1RJT05fQ0hFQ0tfVElNRU9VVCwKIAlTVEFSVFVQX1BS T0dSRVNTX1RJTUVPVVQsCisJQ1JFREVOVElBTF9WQUxJREFUSU9OX1RJTUVPVVQsCiAJLyogRmly c3QgdXNlci1kZWZpbmFibGUgdGltZW91dCByZWFzb24gKi8KIAlVU0VSX1RJTUVPVVQsCiAJLyog TWF4aW11bSBudW1iZXIgb2YgdGltZW91dCByZWFzb25zICovCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9hdXRoZW50aWNhdGlvbi9tZXNvbi5idWlsZCBiL3NyYy90ZXN0L2F1dGhlbnRpY2F0aW9uL21l c29uLmJ1aWxkCmluZGV4IDI4MmE1MDU0ZTJjLi5iZmI4MzUwYTNmOCAxMDA2NDQKLS0tIGEvc3Jj L3Rlc3QvYXV0aGVudGljYXRpb24vbWVzb24uYnVpbGQKKysrIGIvc3JjL3Rlc3QvYXV0aGVudGlj YXRpb24vbWVzb24uYnVpbGQKQEAgLTE2LDYgKzE2LDcgQEAgdGVzdHMgKz0gewogICAgICAgJ3Qv MDA1X3NzcGkucGwnLAogICAgICAgJ3QvMDA2X2xvZ2luX3RyaWdnZXIucGwnLAogICAgICAgJ3Qv MDA3X3ByZV9hdXRoLnBsJywKKyAgICAgICd0LzAwOF9jb250aW51b3VzX3ZhbGlkYXRpb24ucGwn LAogICAgIF0sCiAgIH0sCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9hdXRoZW50aWNhdGlvbi90 LzAwOF9jb250aW51b3VzX3ZhbGlkYXRpb24ucGwgYi9zcmMvdGVzdC9hdXRoZW50aWNhdGlvbi90 LzAwOF9jb250aW51b3VzX3ZhbGlkYXRpb24ucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXgg MDAwMDAwMDAwMDAuLjZkYTYzOWE0MTZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvYXV0 aGVudGljYXRpb24vdC8wMDhfY29udGludW91c192YWxpZGF0aW9uLnBsCkBAIC0wLDAgKzEsMjYz IEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKwor aWYgKCEkdXNlX3VuaXhfc29ja2V0cykKK3sKKyAgICBwbGFuIHNraXBfYWxsID0+ICJhdXRoZW50 aWNhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIHdpdGhvdXQgVW5peC1kb21haW4gc29ja2V0cyI7Cit9 CisKKyMgSGVscGVyIHRvIHJlc2V0IHBnX2hiYS5jb25mIHdpdGggc3BlY2lmaWMgYXV0aCBtZXRo b2QgZm9yIHRlc3QgdXNlcnMKK3N1YiByZXNldF9wZ19oYmEKK3sKKyAgICBteSAoJG5vZGUsICRo YmFfbWV0aG9kLCBAdXNlcnMpID0gQF87CisKKyAgICB1bmxpbmsoJG5vZGUtPmRhdGFfZGlyIC4g Jy9wZ19oYmEuY29uZicpOworICAgICMgRWFjaCBzcGVjaWZpZWQgdXNlciB1c2VzIHRoZSBnaXZl biBtZXRob2QKKyAgICBmb3JlYWNoIG15ICR1c2VyIChAdXNlcnMpCisgICAgeworICAgICAgICAk bm9kZS0+YXBwZW5kX2NvbmYoJ3BnX2hiYS5jb25mJywgImxvY2FsIGFsbCAkdXNlciAkaGJhX21l dGhvZFxuIik7CisgICAgfQorICAgICMgT3RoZXJzIHVzZSB0cnVzdAorICAgICRub2RlLT5hcHBl bmRfY29uZigncGdfaGJhLmNvbmYnLCAibG9jYWwgYWxsIGFsbCB0cnVzdFxuIik7CisgICAgJG5v ZGUtPnJlbG9hZDsKK30KKworIyAxLiBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgUG9zdGdyZVNR TCBjbHVzdGVyCitteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbWFp bicpOworJG5vZGUtPmluaXQ7CisKKyMgRW5hYmxlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB3aXRo IHNob3J0IGludGVydmFsICg1IHNlY29uZHMgbWluaW11bSkKKyRub2RlLT5hcHBlbmRfY29uZign cG9zdGdyZXNxbC5jb25mJywgImNyZWRlbnRpYWxfdmFsaWRhdGlvbi5lbmFibGVkID0gb25cbiIp OworJG5vZGUtPmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYnLCAiY3JlZGVudGlhbF92YWxp ZGF0aW9uLmludGVydmFsID0gNVxuIik7CisKKyRub2RlLT5zdGFydDsKKworIyBDb25maWd1cmUg cGFzc3dvcmQgYXV0aCBmb3IgdXNlcjEgYW5kIHVzZXIyIChtdXN0IGJlIEJFRk9SRSAiYWxsIGFs bCB0cnVzdCIpCityZXNldF9wZ19oYmEoJG5vZGUsICdtZDUnLCAndXNlcjEnLCAndXNlcjInKTsK KworIyBDcmVhdGUgdGVzdCB1c2VycyB3aXRoIHBhc3N3b3JkcworJG5vZGUtPnNhZmVfcHNxbCgn cG9zdGdyZXMnLCAiQ1JFQVRFIFVTRVIgdXNlcjEgTE9HSU4gUEFTU1dPUkQgJ3NlY3JldCc7Iik7 Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgVVNFUiB1c2VyMiBMT0dJTiBQ QVNTV09SRCAnc2VjcmV0Mic7Iik7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3QgMTog VkFMSUQgVU5USUwgZXhwaXJhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK25vdGUgIj09PSBU ZXN0IDE6IFZBTElEIFVOVElMIGV4cGlyYXRpb24gPT09IjsKKworJEVOVntQR1BBU1NXT1JEfSA9 ICdzZWNyZXQnOworbXkgJHNlc3Npb24xID0gJG5vZGUtPmJhY2tncm91bmRfcHNxbCgKKyAgICAn cG9zdGdyZXMnLAorICAgIG9uX2Vycm9yX3N0b3AgPT4gMCwKKyAgICBleHRyYV9wYXJhbXMgID0+ IFsnLVUnLCAndXNlcjEnXQorKTsKKworIyBWZXJpZnkgdXNlcjEgY2FuIGV4ZWN1dGUgYSBxdWVy eSBub3JtYWxseQorbXkgKCRzdGRvdXQsICRyZXQpID0gJHNlc3Npb24xLT5xdWVyeSgnU0VMRUNU IDEgQVMgc3VjY2VzczsnKTsKK2xpa2UoJHN0ZG91dCwgcXIvMS8sICd1c2VyMSBjYW4gZXhlY3V0 ZSBxdWVyaWVzIGluaXRpYWxseScpOworaXMoJHJldCwgMCwgJ25vIGVycm9ycyBkdXJpbmcgaW5p dGlhbCBxdWVyeSBmb3IgdXNlcjEnKTsKKworIyBBZG1pbiBhbHRlcnMgdGhlIFZBTElEIFVOVElM IGRhdGUgdG8gdGhlIHBhc3QKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkFMVEVSIFVT RVIgdXNlcjEgVkFMSUQgVU5USUwgJzIwMjUtMTEtMDIgMTY6NTk6MzcrMDU6MzAnOyIpOworCisj IFdhaXQgZm9yIHRoZSBjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZW91dCB0byBmaXJlCitub3Rl ICJXYWl0aW5nIDcgc2Vjb25kcyBmb3IgY3JlZGVudGlhbCB2YWxpZGF0aW9uIHRpbWVvdXQgdG8g ZmlyZS4uLiI7CitzbGVlcCg3KTsKKworIyBVc2VyMSBhdHRlbXB0cyB0byBleGVjdXRlIGFub3Ro ZXIgcXVlcnkgLSBzaG91bGQgYmUgdGVybWluYXRlZAorZXZhbCB7CisgICAgKCRzdGRvdXQsICRy ZXQpID0gJHNlc3Npb24xLT5xdWVyeSgnU0VMRUNUIDIgQVMgZmFpbHVyZV9leHBlY3RlZDsnKTsK K307CisKKyMgQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIHRoZSBleHBlY3RlZCBGQVRBTCBlcnJv cgorbXkgJGxvZ19jb250ZW50cyA9IHNsdXJwX2ZpbGUoJG5vZGUtPmxvZ2ZpbGUpOworbGlrZSgK KyAgICAkbG9nX2NvbnRlbnRzLAorICAgIHFyL0ZBVEFMOi4qc2Vzc2lvbiBjcmVkZW50aWFscyBo YXZlIGV4cGlyZWQvLAorICAgICdUZXN0IDE6IHNlcnZlciBsb2cgc2hvd3Mgc2Vzc2lvbiB0ZXJt aW5hdGVkIGR1ZSB0byBleHBpcmVkIGNyZWRlbnRpYWxzJworKTsKKworZXZhbCB7ICRzZXNzaW9u MS0+cXVpdDsgfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdCAyOiBVc2VyIGRyb3Bw ZWQgd2hpbGUgc2Vzc2lvbiBpcyBhY3RpdmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitub3RlICI9 PT0gVGVzdCAyOiBVc2VyIGRyb3BwZWQgd2hpbGUgc2Vzc2lvbiBpcyBhY3RpdmUgPT09IjsKKwor JEVOVntQR1BBU1NXT1JEfSA9ICdzZWNyZXQyJzsKK215ICRzZXNzaW9uMiA9ICRub2RlLT5iYWNr Z3JvdW5kX3BzcWwoCisgICAgJ3Bvc3RncmVzJywKKyAgICBvbl9lcnJvcl9zdG9wID0+IDAsCisg ICAgZXh0cmFfcGFyYW1zICA9PiBbJy1VJywgJ3VzZXIyJ10KKyk7CisKKyMgVmVyaWZ5IHVzZXIy IGNhbiBleGVjdXRlIGEgcXVlcnkgbm9ybWFsbHkKKygkc3Rkb3V0LCAkcmV0KSA9ICRzZXNzaW9u Mi0+cXVlcnkoJ1NFTEVDVCAxIEFTIHN1Y2Nlc3M7Jyk7CitsaWtlKCRzdGRvdXQsIHFyLzEvLCAn dXNlcjIgY2FuIGV4ZWN1dGUgcXVlcmllcyBpbml0aWFsbHknKTsKK2lzKCRyZXQsIDAsICdubyBl cnJvcnMgZHVyaW5nIGluaXRpYWwgcXVlcnkgZm9yIHVzZXIyJyk7CisKKyMgQWRtaW4gZHJvcHMg dXNlcjIgd2hpbGUgdGhlIHNlc3Npb24gaXMgc3RpbGwgYWN0aXZlCiskbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJEUk9QIFVTRVIgdXNlcjI7Iik7CisKKyMgV2FpdCBmb3IgdGhlIGNyZWRl bnRpYWwgdmFsaWRhdGlvbiB0aW1lb3V0IHRvIGZpcmUKK25vdGUgIldhaXRpbmcgNyBzZWNvbmRz IGZvciBjcmVkZW50aWFsIHZhbGlkYXRpb24gdGltZW91dCB0byBmaXJlLi4uIjsKK3NsZWVwKDcp OworCisjIFVzZXIyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW5vdGhlciBxdWVyeSAtIHNob3VsZCBi ZSB0ZXJtaW5hdGVkCitldmFsIHsKKyAgICAoJHN0ZG91dCwgJHJldCkgPSAkc2Vzc2lvbjItPnF1 ZXJ5KCdTRUxFQ1QgMiBBUyBmYWlsdXJlX2V4cGVjdGVkOycpOworfTsKKworIyBDaGVjayB0aGUg c2VydmVyIGxvZyBmb3IgdGhlIGV4cGVjdGVkIEZBVEFMIGVycm9yICh1c2VyIG5vIGxvbmdlciBl eGlzdHMpCiskbG9nX2NvbnRlbnRzID0gc2x1cnBfZmlsZSgkbm9kZS0+bG9nZmlsZSk7CitsaWtl KAorICAgICRsb2dfY29udGVudHMsCisgICAgcXIvRkFUQUw6LipzZXNzaW9uIGNyZWRlbnRpYWxz IGhhdmUgZXhwaXJlZC8sCisgICAgJ1Rlc3QgMjogc2VydmVyIGxvZyBzaG93cyBzZXNzaW9uIHRl cm1pbmF0ZWQgYWZ0ZXIgdXNlciB3YXMgZHJvcHBlZCcKKyk7CisKK2V2YWwgeyAkc2Vzc2lvbjIt PnF1aXQ7IH07CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3QgMzogVkFMSUQgVU5USUwg ZXh0ZW5kZWQga2VlcHMgc2Vzc2lvbiBhbGl2ZSAocG9zaXRpdmUgdGVzdCkKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjCitub3RlICI9PT0gVGVzdCAzOiBWQUxJRCBVTlRJTCBleHRlbmRlZCBrZWVwcyBz ZXNzaW9uIGFsaXZlID09PSI7CisKKyMgUmVzZXQgdXNlcjEgZm9yIHRoaXMgdGVzdCAodXNlcjEg c3RpbGwgZXhpc3RzIGZyb20gVGVzdCAxLCBqdXN0IGV4cGlyZWQpCiskbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJBTFRFUiBVU0VSIHVzZXIxIFZBTElEIFVOVElMICdpbmZpbml0eSc7Iik7 CityZXNldF9wZ19oYmEoJG5vZGUsICdtZDUnLCAndXNlcjEnKTsKKworJEVOVntQR1BBU1NXT1JE fSA9ICdzZWNyZXQnOworbXkgJHNlc3Npb24zID0gJG5vZGUtPmJhY2tncm91bmRfcHNxbCgKKyAg ICAncG9zdGdyZXMnLAorICAgIG9uX2Vycm9yX3N0b3AgPT4gMCwKKyAgICBleHRyYV9wYXJhbXMg ID0+IFsnLVUnLCAndXNlcjEnXQorKTsKKworIyBTZXQgVkFMSUQgVU5USUwgdG8gZmFyIGZ1dHVy ZQorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQUxURVIgVVNFUiB1c2VyMSBWQUxJRCBV TlRJTCAnMjA5OS0xMi0zMSAyMzo1OTo1OSc7Iik7CisKKyMgV2FpdCBmb3IgdmFsaWRhdGlvbiBj eWNsZQorbm90ZSAiV2FpdGluZyA3IHNlY29uZHMgZm9yIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0 aW1lb3V0IHRvIGZpcmUuLi4iOworc2xlZXAoNyk7CisKKyMgU2Vzc2lvbiBzaG91bGQgc3RpbGwg YmUgYWxpdmUKKygkc3Rkb3V0LCAkcmV0KSA9ICRzZXNzaW9uMy0+cXVlcnkoJ1NFTEVDVCAxIEFT IHN0aWxsX2FsaXZlOycpOworbGlrZSgkc3Rkb3V0LCBxci8xLywgJ1Rlc3QgMzogc2Vzc2lvbiBy ZW1haW5zIGFsaXZlIHdpdGggdmFsaWQgVkFMSUQgVU5USUwnKTsKK2lzKCRyZXQsIDAsICdUZXN0 IDM6IG5vIGVycm9ycyB3aGVuIFZBTElEIFVOVElMIGlzIGluIHRoZSBmdXR1cmUnKTsKKworZXZh bCB7ICRzZXNzaW9uMy0+cXVpdDsgfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdCA0 OiBNdWx0aXBsZSBzZXNzaW9ucyB0ZXJtaW5hdGVkIHdoZW4gdXNlciBleHBpcmVzCisjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIworbm90ZSAiPT09IFRlc3QgNDogTXVsdGlwbGUgc2Vzc2lvbnMgdGVybWlu YXRlZCB3aGVuIHVzZXIgZXhwaXJlcyA9PT0iOworCisjIFJlc2V0IHVzZXIxCiskbm9kZS0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsICJBTFRFUiBVU0VSIHVzZXIxIFZBTElEIFVOVElMICdpbmZpbml0 eSc7Iik7CisKKyRFTlZ7UEdQQVNTV09SRH0gPSAnc2VjcmV0JzsKK215ICRzZXNzaW9uNGEgPSAk bm9kZS0+YmFja2dyb3VuZF9wc3FsKAorICAgICdwb3N0Z3JlcycsCisgICAgb25fZXJyb3Jfc3Rv cCA9PiAwLAorICAgIGV4dHJhX3BhcmFtcyAgPT4gWyctVScsICd1c2VyMSddCispOworbXkgJHNl c3Npb240YiA9ICRub2RlLT5iYWNrZ3JvdW5kX3BzcWwoCisgICAgJ3Bvc3RncmVzJywKKyAgICBv bl9lcnJvcl9zdG9wID0+IDAsCisgICAgZXh0cmFfcGFyYW1zICA9PiBbJy1VJywgJ3VzZXIxJ10K Kyk7CisKKyMgVmVyaWZ5IGJvdGggc2Vzc2lvbnMgd29yaworKCRzdGRvdXQsICRyZXQpID0gJHNl c3Npb240YS0+cXVlcnkoJ1NFTEVDVCAxOycpOworbGlrZSgkc3Rkb3V0LCBxci8xLywgJ3Nlc3Np b240YSB3b3JrcyBpbml0aWFsbHknKTsKKygkc3Rkb3V0LCAkcmV0KSA9ICRzZXNzaW9uNGItPnF1 ZXJ5KCdTRUxFQ1QgMTsnKTsKK2xpa2UoJHN0ZG91dCwgcXIvMS8sICdzZXNzaW9uNGIgd29ya3Mg aW5pdGlhbGx5Jyk7CisKKyMgRXhwaXJlIHVzZXIxCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsICJBTFRFUiBVU0VSIHVzZXIxIFZBTElEIFVOVElMICcyMDIwLTAxLTAxJzsiKTsKKworbm90 ZSAiV2FpdGluZyA3IHNlY29uZHMgZm9yIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0aW1lb3V0IHRv IGZpcmUuLi4iOworc2xlZXAoNyk7CisKKyMgQm90aCBzZXNzaW9ucyBzaG91bGQgZmFpbAorZXZh bCB7ICRzZXNzaW9uNGEtPnF1ZXJ5KCdTRUxFQ1QgMjsnKTsgfTsKK2V2YWwgeyAkc2Vzc2lvbjRi LT5xdWVyeSgnU0VMRUNUIDI7Jyk7IH07CisKKyRsb2dfY29udGVudHMgPSBzbHVycF9maWxlKCRu b2RlLT5sb2dmaWxlKTsKKyMgQ291bnQgb2NjdXJyZW5jZXMgb2YgdGhlIHRlcm1pbmF0aW9uIG1l c3NhZ2UKK215IEBtYXRjaGVzID0gKCRsb2dfY29udGVudHMgPX4gL0ZBVEFMOi4qc2Vzc2lvbiBj cmVkZW50aWFscyBoYXZlIGV4cGlyZWQvZyk7CitjbXBfb2soc2NhbGFyKEBtYXRjaGVzKSwgJz49 JywgMywgJ1Rlc3QgNDogbXVsdGlwbGUgc2Vzc2lvbnMgdGVybWluYXRlZCBmb3Igc2FtZSB1c2Vy Jyk7CisKK2V2YWwgeyAkc2Vzc2lvbjRhLT5xdWl0OyB9OworZXZhbCB7ICRzZXNzaW9uNGItPnF1 aXQ7IH07CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3QgNTogVHJ1c3QgYXV0aCBzZXNz aW9ucyBhcmUgbm90IGFmZmVjdGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbm90ZSAiPT09IFRl c3QgNTogVHJ1c3QgYXV0aCBzZXNzaW9ucyBhcmUgbm90IGFmZmVjdGVkID09PSI7CisKKyMgQ3Jl YXRlIHVzZXIzIHdpdGggdHJ1c3QgYXV0aCAobm8gcGFzc3dvcmQgdmFsaWRhdGlvbiByZWdpc3Rl cmVkKQorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQ1JFQVRFIFVTRVIgdXNlcjMgTE9H SU47Iik7CityZXNldF9wZ19oYmEoJG5vZGUsICd0cnVzdCcsICd1c2VyMycpOworCitkZWxldGUg JEVOVntQR1BBU1NXT1JEfTsKK215ICRzZXNzaW9uNSA9ICRub2RlLT5iYWNrZ3JvdW5kX3BzcWwo CisgICAgJ3Bvc3RncmVzJywKKyAgICBvbl9lcnJvcl9zdG9wID0+IDAsCisgICAgZXh0cmFfcGFy YW1zICA9PiBbJy1VJywgJ3VzZXIzJ10KKyk7CisKKyMgU2V0IGV4cGlyZWQgVkFMSUQgVU5USUwg KGJ1dCB0cnVzdCBhdXRoIGhhcyBubyB2YWxpZGF0b3IpCiskbm9kZS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsICJBTFRFUiBVU0VSIHVzZXIzIFZBTElEIFVOVElMICcyMDIwLTAxLTAxJzsiKTsKKwor bm90ZSAiV2FpdGluZyA3IHNlY29uZHMgZm9yIGNyZWRlbnRpYWwgdmFsaWRhdGlvbiB0aW1lb3V0 IHRvIGZpcmUuLi4iOworc2xlZXAoNyk7CisKKyMgU2Vzc2lvbiBzaG91bGQgc3RpbGwgd29yayAt IHRydXN0IGhhcyBubyByZWdpc3RlcmVkIHZhbGlkYXRvcgorKCRzdGRvdXQsICRyZXQpID0gJHNl c3Npb241LT5xdWVyeSgnU0VMRUNUIDEgQVMgdHJ1c3Rfc3RpbGxfd29ya3M7Jyk7CitsaWtlKCRz dGRvdXQsIHFyLzEvLCAnVGVzdCA1OiB0cnVzdCBhdXRoIHNlc3Npb24gbm90IHRlcm1pbmF0ZWQg KG5vIHZhbGlkYXRvciknKTsKKworZXZhbCB7ICRzZXNzaW9uNS0+cXVpdDsgfTsKKworIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMKKyMgVGVzdCA2OiBDcmVkZW50aWFsIHZhbGlkYXRpb24gZGlzYWJsZWQK KyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCitub3RlICI9PT0gVGVzdCA2OiBDcmVkZW50aWFsIHZhbGlk YXRpb24gZGlzYWJsZWQgPT09IjsKKworIyBEaXNhYmxlIGNyZWRlbnRpYWwgdmFsaWRhdGlvbgor JG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQUxURVIgU1lTVEVNIFNFVCBjcmVkZW50aWFs X3ZhbGlkYXRpb24uZW5hYmxlZCA9IG9mZjsiKTsKKyRub2RlLT5yZWxvYWQ7CisKKyMgUmVzZXQg dXNlcjEKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkFMVEVSIFVTRVIgdXNlcjEgVkFM SUQgVU5USUwgJ2luZmluaXR5JzsiKTsKK3Jlc2V0X3BnX2hiYSgkbm9kZSwgJ21kNScsICd1c2Vy MScpOworCiskRU5We1BHUEFTU1dPUkR9ID0gJ3NlY3JldCc7CitteSAkc2Vzc2lvbjYgPSAkbm9k ZS0+YmFja2dyb3VuZF9wc3FsKAorICAgICdwb3N0Z3JlcycsCisgICAgb25fZXJyb3Jfc3RvcCA9 PiAwLAorICAgIGV4dHJhX3BhcmFtcyAgPT4gWyctVScsICd1c2VyMSddCispOworCisjIEV4cGly ZSB1c2VyMQorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQUxURVIgVVNFUiB1c2VyMSBW QUxJRCBVTlRJTCAnMjAyMC0wMS0wMSc7Iik7CisKK25vdGUgIldhaXRpbmcgNyBzZWNvbmRzLi4u IjsKK3NsZWVwKDcpOworCisjIFNlc3Npb24gc2hvdWxkIHN0aWxsIHdvcmsgc2luY2UgdmFsaWRh dGlvbiBpcyBkaXNhYmxlZAorKCRzdGRvdXQsICRyZXQpID0gJHNlc3Npb242LT5xdWVyeSgnU0VM RUNUIDEgQVMgdmFsaWRhdGlvbl9kaXNhYmxlZDsnKTsKK2xpa2UoJHN0ZG91dCwgcXIvMS8sICdU ZXN0IDY6IHNlc3Npb24gc3Vydml2ZXMgd2hlbiB2YWxpZGF0aW9uIGlzIGRpc2FibGVkJyk7CisK K2V2YWwgeyAkc2Vzc2lvbjYtPnF1aXQ7IH07CisKKyMgUmUtZW5hYmxlIGZvciBhbnkgc3Vic2Vx dWVudCB0ZXN0cworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQUxURVIgU1lTVEVNIFNF VCBjcmVkZW50aWFsX3ZhbGlkYXRpb24uZW5hYmxlZCA9IG9uOyIpOworJG5vZGUtPnJlbG9hZDsK KworIyBDbGVhbiB1cAorJG5vZGUtPnN0b3A7Citkb25lX3Rlc3RpbmcoKTsKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9yL2ZhaWxfdmFsaWRhdG9yLmMgYi9zcmMv dGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9mYWlsX3ZhbGlkYXRvci5jCmluZGV4IDNkZTA0 NzBhNTQxLi44NzU0ZTFlOGY4NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy9vYXV0aF92 YWxpZGF0b3IvZmFpbF92YWxpZGF0b3IuYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL29hdXRoX3Zh bGlkYXRvci9mYWlsX3ZhbGlkYXRvci5jCkBAIC0yOSw2ICsyOSw3IEBAIHN0YXRpYyBjb25zdCBP QXV0aFZhbGlkYXRvckNhbGxiYWNrcyB2YWxpZGF0b3JfY2FsbGJhY2tzID0gewogCVBHX09BVVRI X1ZBTElEQVRPUl9NQUdJQywKIAogCS52YWxpZGF0ZV9jYiA9IGZhaWxfdG9rZW4sCisJLmV4cGly ZV9jYiA9IE5VTEwsCiB9OwogCiBjb25zdCBPQXV0aFZhbGlkYXRvckNhbGxiYWNrcyAqCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9tYWdpY192YWxpZGF0b3Iu YyBiL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9yL21hZ2ljX3ZhbGlkYXRvci5jCmlu ZGV4IDU1MGRhNDFkMTFiLi42ZTRkNzJmZGUzMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxl cy9vYXV0aF92YWxpZGF0b3IvbWFnaWNfdmFsaWRhdG9yLmMKKysrIGIvc3JjL3Rlc3QvbW9kdWxl cy9vYXV0aF92YWxpZGF0b3IvbWFnaWNfdmFsaWRhdG9yLmMKQEAgLTMwLDYgKzMwLDcgQEAgc3Rh dGljIGNvbnN0IE9BdXRoVmFsaWRhdG9yQ2FsbGJhY2tzIHZhbGlkYXRvcl9jYWxsYmFja3MgPSB7 CiAJMHhkZWFkYmVlZiwKIAogCS52YWxpZGF0ZV9jYiA9IHZhbGlkYXRlX3Rva2VuLAorCS5leHBp cmVfY2IgPSBOVUxMLAogfTsKIAogY29uc3QgT0F1dGhWYWxpZGF0b3JDYWxsYmFja3MgKgpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0b3IvdmFsaWRhdG9yLmMgYi9z cmMvdGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci92YWxpZGF0b3IuYwppbmRleCAwYjk4M2E5 ZGM4Zi4uMjc4NDcwOGE3ODQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFs aWRhdG9yL3ZhbGlkYXRvci5jCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9y L3ZhbGlkYXRvci5jCkBAIC0zNCw3ICszNCw4IEBAIHN0YXRpYyBjb25zdCBPQXV0aFZhbGlkYXRv ckNhbGxiYWNrcyB2YWxpZGF0b3JfY2FsbGJhY2tzID0gewogCiAJLnN0YXJ0dXBfY2IgPSB2YWxp ZGF0b3Jfc3RhcnR1cCwKIAkuc2h1dGRvd25fY2IgPSB2YWxpZGF0b3Jfc2h1dGRvd24sCi0JLnZh bGlkYXRlX2NiID0gdmFsaWRhdGVfdG9rZW4KKwkudmFsaWRhdGVfY2IgPSB2YWxpZGF0ZV90b2tl biwKKwkuZXhwaXJlX2NiID0gTlVMTCwJCQkvKiBPcHRpb25hbDogbm90IGltcGxlbWVudGVkICov CiB9OwogCiAvKiBHVUNzICovCg== --000000000000249895064e523ecf--