From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 882B543BFA; Tue, 27 Feb 2024 00:15:03 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 112CD4028C; Tue, 27 Feb 2024 00:15:03 +0100 (CET) Received: from mail-oo1-f41.google.com (mail-oo1-f41.google.com [209.85.161.41]) by mails.dpdk.org (Postfix) with ESMTP id 70B7D4027D for ; Tue, 27 Feb 2024 00:15:01 +0100 (CET) Received: by mail-oo1-f41.google.com with SMTP id 006d021491bc7-5a0a0036583so454999eaf.1 for ; Mon, 26 Feb 2024 15:15:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1708989300; x=1709594100; darn=dpdk.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=lsDzdavj7J/jG6C4eiWq60p+NEnKP1da9zRdWYSBd0Y=; b=aB9gq69YOoKgsUBIV7CDYCefS5WjLnkfvkg2jrikCkkN2Etwu3VGrDKn3kFOfDqcT0 m3OsNgydmP/Byboyreipwea8lrcK/GA6Cuyu1L3PUQr1R8r1GTCXeBEMCL3gUmlN3nFE lcXuFXpWG6eZXaqriPQJq7T+DyzXsqOQeefY0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708989300; x=1709594100; 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=lsDzdavj7J/jG6C4eiWq60p+NEnKP1da9zRdWYSBd0Y=; b=hDv63fP8PhFua6aU3K8BefJAvUzuVzK4MJu73fGMWtWDW5vU+ZGqt5kU+JRkLsp9FL vbbk0jdxBHBWQyGoH/ZbvAyx5qLKVw7b9SOC6GMCiW/cIgokju8elY1AUQZHA7X/k+gR tH0frP19/g+tw8JNMnB7ueUdPkT+NyblIXqX6NBxZkx1ZLEfguyOG6ZuH+CTvDAuSxh9 HKlOgont0XIr0JCc8vhtxddAo4fKNQCxlRuM+ZYC612hPZZ6tlpfVYfyCjvXzwvi9vWv Y9S9Z2DS4nR/gGq/L/wN73lmPaYBbJJ2INdGu3ZAmmgv6vQWnkqn8CiGxY9G9wJAzRDp F3Cw== X-Gm-Message-State: AOJu0YyeggtGBAKXmx0z7eMCkbrzDVld39QMHFWyIoZaLJwI5syrYvy0 D2GvfZw0HqIs1frdsjYzoRGwAWYj1OfTnujkL1rnHXPFWQZLU6Y2NQGlFu5F/Q+7KSwAA1G+aMj nAkkXrLlgXBJ+uButYysJ425DaJtKCG1BRCueyYFWQgDgKl+oPPX9WA== X-Google-Smtp-Source: AGHT+IH4LWxd4p4bcE2IeIBLNtSwMfxKEA5f/fkhgrNYs54LLo6zK5AypClK4GGIHyQ0dZJdGly6IgTWlgKj1L7uze4= X-Received: by 2002:a4a:2558:0:b0:5a0:6b03:a65f with SMTP id v24-20020a4a2558000000b005a06b03a65fmr5889050ooe.8.1708989300448; Mon, 26 Feb 2024 15:15:00 -0800 (PST) MIME-Version: 1.0 References: <20240223122115.3589097-1-venkatx.sivaramakrishnan@intel.com> In-Reply-To: <20240223122115.3589097-1-venkatx.sivaramakrishnan@intel.com> From: Patrick Robb Date: Mon, 26 Feb 2024 18:14:49 -0500 Message-ID: Subject: Re: [PATCH v4 1/2] crypto/ipsec_mb: bump minimum IPsec Multi-buffer version To: dev@dpdk.org, Sivaramakrishnan Venkat Cc: Kai Ji , Pablo de Lara , gakhil@marvell.com, ciara.power@intel.com, wathsala.vithanage@arm.com, Honnappa.Nagarahalli@arm.com Content-Type: multipart/alternative; boundary="0000000000002db3e1061251140c" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --0000000000002db3e1061251140c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Recheck-request: iol-unit-arm64-testing This ran before we had swapped out the old arm v1.2 ipsec container for our new arm v1.4 ipsec container. We have now made that change, so this retest should report a pass. Sorry for the inconvenience. On Fri, Feb 23, 2024 at 7:21=E2=80=AFAM Sivaramakrishnan Venkat < venkatx.sivaramakrishnan@intel.com> wrote: > SW PMDs increment IPsec Multi-buffer version to 1.4. > A minimum IPsec Multi-buffer version of 1.4 or greater is now required. > > Signed-off-by: Sivaramakrishnan Venkat > > Acked-by: Ciara Power > Acked-by: Pablo de Lara > --- > v4: > - 24.03 release notes updated to bump minimum IPSec Multi-buffer > version to 1.4 for SW PMDs. > v2: > - Removed unused macro in ipsec_mb_ops.c > - set_gcm_job() modified correctly to keep multi_sgl_job line > - Updated SW PMDs documentation for minimum IPSec Multi-buffer versi= on > - Updated commit message, and patch title. > --- > doc/guides/cryptodevs/aesni_gcm.rst | 3 +- > doc/guides/cryptodevs/aesni_mb.rst | 3 +- > doc/guides/cryptodevs/chacha20_poly1305.rst | 3 +- > doc/guides/cryptodevs/kasumi.rst | 3 +- > doc/guides/cryptodevs/snow3g.rst | 3 +- > doc/guides/cryptodevs/zuc.rst | 3 +- > doc/guides/rel_notes/release_24_03.rst | 4 + > drivers/crypto/ipsec_mb/ipsec_mb_ops.c | 23 --- > drivers/crypto/ipsec_mb/meson.build | 2 +- > drivers/crypto/ipsec_mb/pmd_aesni_mb.c | 165 -------------------- > drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h | 9 -- > 11 files changed, 17 insertions(+), 204 deletions(-) > > diff --git a/doc/guides/cryptodevs/aesni_gcm.rst > b/doc/guides/cryptodevs/aesni_gcm.rst > index f5773426ee..dc665e536c 100644 > --- a/doc/guides/cryptodevs/aesni_gcm.rst > +++ b/doc/guides/cryptodevs/aesni_gcm.rst > @@ -85,7 +85,8 @@ and the external crypto libraries supported by them: > 18.05 - 19.02 Multi-buffer library 0.49 - 0.52 > 19.05 - 20.08 Multi-buffer library 0.52 - 0.55 > 20.11 - 21.08 Multi-buffer library 0.53 - 1.3* > - 21.11+ Multi-buffer library 1.0 - 1.5* > + 21.11 - 23.11 Multi-buffer library 1.0 - 1.5* > + 24.03+ Multi-buffer library 1.4 - 1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/cryptodevs/aesni_mb.rst > b/doc/guides/cryptodevs/aesni_mb.rst > index b2e74ba417..5d670ee237 100644 > --- a/doc/guides/cryptodevs/aesni_mb.rst > +++ b/doc/guides/cryptodevs/aesni_mb.rst > @@ -146,7 +146,8 @@ and the Multi-Buffer library version supported by the= m: > 19.05 - 19.08 0.52 > 19.11 - 20.08 0.52 - 0.55 > 20.11 - 21.08 0.53 - 1.3* > - 21.11+ 1.0 - 1.5* > + 21.11 - 23.11 1.0 - 1.5* > + 24.03+ 1.4 - 1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/cryptodevs/chacha20_poly1305.rst > b/doc/guides/cryptodevs/chacha20_poly1305.rst > index 9d4bf86cf1..c32866b301 100644 > --- a/doc/guides/cryptodevs/chacha20_poly1305.rst > +++ b/doc/guides/cryptodevs/chacha20_poly1305.rst > @@ -72,7 +72,8 @@ and the external crypto libraries supported by them: > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > DPDK version Crypto library version > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > - 21.11+ Multi-buffer library 1.0-1.5* > + 21.11 - 23.11 Multi-buffer library 1.0-1.5* > + 24.03+ Multi-buffer library 1.4-1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/cryptodevs/kasumi.rst > b/doc/guides/cryptodevs/kasumi.rst > index 0989054875..a8f4e6b204 100644 > --- a/doc/guides/cryptodevs/kasumi.rst > +++ b/doc/guides/cryptodevs/kasumi.rst > @@ -87,7 +87,8 @@ and the external crypto libraries supported by them: > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > 16.11 - 19.11 LibSSO KASUMI > 20.02 - 21.08 Multi-buffer library 0.53 - 1.3* > - 21.11+ Multi-buffer library 1.0 - 1.5* > + 21.11 - 23.11 Multi-buffer library 1.0 - 1.5* > + 24.03+ Multi-buffer library 1.4 - 1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/cryptodevs/snow3g.rst > b/doc/guides/cryptodevs/snow3g.rst > index 3392932653..46863462e5 100644 > --- a/doc/guides/cryptodevs/snow3g.rst > +++ b/doc/guides/cryptodevs/snow3g.rst > @@ -96,7 +96,8 @@ and the external crypto libraries supported by them: > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > 16.04 - 19.11 LibSSO SNOW3G > 20.02 - 21.08 Multi-buffer library 0.53 - 1.3* > - 21.11+ Multi-buffer library 1.0 - 1.5* > + 21.11 - 23.11 Multi-buffer library 1.0 - 1.5* > + 24.03+ Multi-buffer library 1.4 - 1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/cryptodevs/zuc.rst b/doc/guides/cryptodevs/zuc.rs= t > index a414b5ad2c..51867e1a16 100644 > --- a/doc/guides/cryptodevs/zuc.rst > +++ b/doc/guides/cryptodevs/zuc.rst > @@ -95,7 +95,8 @@ and the external crypto libraries supported by them: > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > 16.11 - 19.11 LibSSO ZUC > 20.02 - 21.08 Multi-buffer library 0.53 - 1.3* > - 21.11+ Multi-buffer library 1.0 - 1.5* > + 21.11 - 23.11 Multi-buffer library 1.0 - 1.5* > + 24.03+ Multi-buffer library 1.4 - 1.5* > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > \* Multi-buffer library 1.0 or newer only works for Meson but not Make > build system. > diff --git a/doc/guides/rel_notes/release_24_03.rst > b/doc/guides/rel_notes/release_24_03.rst > index 879bb4944c..9f4affb706 100644 > --- a/doc/guides/rel_notes/release_24_03.rst > +++ b/doc/guides/rel_notes/release_24_03.rst > @@ -138,6 +138,10 @@ New Features > to support TLS v1.2, TLS v1.3 and DTLS v1.2. > * Added PMD API to allow raw submission of instructions to CPT. > > +* **Updated ipsec_mb crypto driver.** > + > + * Bump minimum IPSec Multi-buffer version to 1.4 for SW PMDs. > + > > Removed Items > ------------- > diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_ops.c > b/drivers/crypto/ipsec_mb/ipsec_mb_ops.c > index f21f9cc5a0..d25c671d7d 100644 > --- a/drivers/crypto/ipsec_mb/ipsec_mb_ops.c > +++ b/drivers/crypto/ipsec_mb/ipsec_mb_ops.c > @@ -11,7 +11,6 @@ > > #include "ipsec_mb_private.h" > > -#define IMB_MP_REQ_VER_STR "1.1.0" > > /** Configure device */ > int > @@ -147,15 +146,10 @@ ipsec_mb_qp_release(struct rte_cryptodev *dev, > uint16_t qp_id) > if (rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > rte_ring_free(rte_ring_lookup(qp->name)); > > -#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM > - if (qp->mb_mgr) > - free_mb_mgr(qp->mb_mgr); > -#else > if (qp->mb_mgr_mz) { > rte_memzone_free(qp->mb_mgr_mz); > qp->mb_mgr =3D NULL; > } > -#endif > rte_free(qp); > dev->data->queue_pairs[qp_id] =3D NULL; > } else { /* secondary process */ > @@ -211,7 +205,6 @@ static struct rte_ring > RING_F_SP_ENQ | RING_F_SC_DEQ); > } > > -#if IMB_VERSION(1, 1, 0) <=3D IMB_VERSION_NUM > static IMB_MGR * > ipsec_mb_alloc_mgr_from_memzone(const struct rte_memzone **mb_mgr_mz, > const char *mb_mgr_mz_name) > @@ -244,7 +237,6 @@ ipsec_mb_alloc_mgr_from_memzone(const struct > rte_memzone **mb_mgr_mz, > } > return mb_mgr; > } > -#endif > > /** Setup a queue pair */ > int > @@ -260,12 +252,6 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_= t > qp_id, > int ret; > > if (rte_eal_process_type() =3D=3D RTE_PROC_SECONDARY) { > -#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM > - IPSEC_MB_LOG(ERR, "The intel-ipsec-mb version (%s) does > not support multiprocess," > - "the minimum version required for this > feature is %s.", > - IMB_VERSION_STR, IMB_MP_REQ_VER_STR); > - return -EINVAL; > -#endif > qp =3D dev->data->queue_pairs[qp_id]; > if (qp =3D=3D NULL) { > IPSEC_MB_LOG(DEBUG, "Secondary process setting up > device qp."); > @@ -285,15 +271,11 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, > uint16_t qp_id, > return -ENOMEM; > } > > -#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM > - qp->mb_mgr =3D alloc_init_mb_mgr(); > -#else > char mz_name[IPSEC_MB_MAX_MZ_NAME]; > snprintf(mz_name, sizeof(mz_name), "IMB_MGR_DEV_%d_QP_%d", > dev->data->dev_id, qp_id); > qp->mb_mgr =3D ipsec_mb_alloc_mgr_from_memzone(&(qp->mb_mgr_mz), > mz_name); > -#endif > if (qp->mb_mgr =3D=3D NULL) { > ret =3D -ENOMEM; > goto qp_setup_cleanup; > @@ -330,15 +312,10 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, > uint16_t qp_id, > return 0; > > qp_setup_cleanup: > -#if IMB_VERSION(1, 1, 0) > IMB_VERSION_NUM > - if (qp->mb_mgr) > - free_mb_mgr(qp->mb_mgr); > -#else > if (rte_eal_process_type() =3D=3D RTE_PROC_SECONDARY) > return ret; > if (qp->mb_mgr_mz) > rte_memzone_free(qp->mb_mgr_mz); > -#endif > rte_free(qp); > return ret; > } > diff --git a/drivers/crypto/ipsec_mb/meson.build > b/drivers/crypto/ipsec_mb/meson.build > index 87bf965554..0c988d7411 100644 > --- a/drivers/crypto/ipsec_mb/meson.build > +++ b/drivers/crypto/ipsec_mb/meson.build > @@ -7,7 +7,7 @@ if is_windows > subdir_done() > endif > > -IMB_required_ver =3D '1.0.0' > +IMB_required_ver =3D '1.4.0' > IMB_header =3D '#include' > if arch_subdir =3D=3D 'arm' > IMB_header =3D '#include' > diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c > b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c > index 4de4866cf3..b93267f1c3 100644 > --- a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c > +++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c > @@ -210,13 +210,9 @@ aesni_mb_set_session_auth_parameters(const IMB_MGR > *mb_mgr, > } > } else if (xform->auth.key.length =3D=3D 32) { > sess->template_job.hash_alg =3D > IMB_AUTH_ZUC256_EIA3_BITLEN; > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > if (sess->auth.req_digest_len !=3D 4 && > sess->auth.req_digest_len !=3D 8 = && > sess->auth.req_digest_len !=3D 16= ) { > -#else > - if (sess->auth.req_digest_len !=3D 4) { > -#endif > IPSEC_MB_LOG(ERR, "Invalid digest size\n"= ); > return -EINVAL; > } > @@ -845,11 +841,9 @@ aesni_mb_session_configure(IMB_MGR *mb_mgr, > } > } > > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > sess->session_id =3D imb_set_session(mb_mgr, &sess->template_job)= ; > sess->pid =3D getpid(); > RTE_PER_LCORE(pid) =3D sess->pid; > -#endif > > return 0; > } > @@ -982,9 +976,7 @@ aesni_mb_set_docsis_sec_session_parameters( > goto error_exit; > } > > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > ipsec_sess->session_id =3D imb_set_session(mb_mgr, > &ipsec_sess->template_job); > -#endif > > error_exit: > free_mb_mgr(mb_mgr); > @@ -1239,7 +1231,6 @@ imb_lib_support_sgl_algo(IMB_CIPHER_MODE alg) > return 0; > } > > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > static inline int > single_sgl_job(IMB_JOB *job, struct rte_crypto_op *op, > int oop, uint32_t offset, struct rte_mbuf *m_src, > @@ -1324,7 +1315,6 @@ single_sgl_job(IMB_JOB *job, struct rte_crypto_op > *op, > job->sgl_io_segs =3D sgl_segs; > return 0; > } > -#endif > > static inline int > multi_sgl_job(IMB_JOB *job, struct rte_crypto_op *op, > @@ -1394,9 +1384,7 @@ set_gcm_job(IMB_MGR *mb_mgr, IMB_JOB *job, const > uint8_t sgl, > job->msg_len_to_hash_in_bytes =3D 0; > job->msg_len_to_cipher_in_bytes =3D 0; > job->cipher_start_src_offset_in_bytes =3D 0; > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > imb_set_session(mb_mgr, job); > -#endif > } else { > job->hash_start_src_offset_in_bytes =3D > op->sym->aead.data.offset; > @@ -1424,13 +1412,11 @@ set_gcm_job(IMB_MGR *mb_mgr, IMB_JOB *job, const > uint8_t sgl, > job->src =3D NULL; > job->dst =3D NULL; > > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > if (m_src->nb_segs <=3D MAX_NUM_SEGS) > return single_sgl_job(job, op, oop, > m_offset, m_src, m_dst, > qp_data->sgl_segs); > else > -#endif > return multi_sgl_job(job, op, oop, > m_offset, m_src, m_dst, mb_mgr); > } else { > @@ -1520,10 +1506,6 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp > *qp, > uint8_t sgl =3D 0; > uint8_t lb_sgl =3D 0; > > -#if IMB_VERSION(1, 3, 0) >=3D IMB_VERSION_NUM > - (void) pid; > -#endif > - > session =3D ipsec_mb_get_session_private(qp, op); > if (session =3D=3D NULL) { > op->status =3D RTE_CRYPTO_OP_STATUS_INVALID_SESSION; > @@ -1533,12 +1515,10 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_q= p > *qp, > const IMB_CIPHER_MODE cipher_mode =3D > session->template_job.cipher_mode; > > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > if (session->pid !=3D pid) { > memcpy(job, &session->template_job, sizeof(IMB_JOB)); > imb_set_session(mb_mgr, job); > } else if (job->session_id !=3D session->session_id) > -#endif > memcpy(job, &session->template_job, sizeof(IMB_JOB)); > > if (!op->sym->m_dst) { > @@ -1579,9 +1559,7 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp > *qp, > job->u.GCM.ctx =3D &qp_data->gcm_sgl_ctx; > job->cipher_mode =3D IMB_CIPHER_GCM_SGL; > job->hash_alg =3D IMB_AUTH_GCM_SGL; > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > imb_set_session(mb_mgr, job); > -#endif > } > break; > case IMB_AUTH_AES_GMAC_128: > @@ -1606,9 +1584,7 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp > *qp, > job->u.CHACHA20_POLY1305.ctx =3D > &qp_data->chacha_sgl_ctx; > job->cipher_mode =3D > IMB_CIPHER_CHACHA20_POLY1305_SGL; > job->hash_alg =3D IMB_AUTH_CHACHA20_POLY1305_SGL; > -#if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM > imb_set_session(mb_mgr, job); > -#endif > } > break; > default: > @@ -1804,13 +1780,11 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_q= p > *qp, > if (lb_sgl) > return handle_sgl_linear(job, op, m_offset, > session); > > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > if (m_src->nb_segs <=3D MAX_NUM_SEGS) > return single_sgl_job(job, op, oop, > m_offset, m_src, m_dst, > qp_data->sgl_segs); > else > -#endif > return multi_sgl_job(job, op, oop, > m_offset, m_src, m_dst, mb_mgr); > } > @@ -2130,7 +2104,6 @@ set_job_null_op(IMB_JOB *job, struct rte_crypto_op > *op) > return job; > } > > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > static uint16_t > aesni_mb_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, > uint16_t nb_ops) > @@ -2263,144 +2236,6 @@ aesni_mb_dequeue_burst(void *queue_pair, struct > rte_crypto_op **ops, > > return processed_jobs; > } > -#else > - > -/** > - * Process a completed IMB_JOB job and keep processing jobs until > - * get_completed_job return NULL > - * > - * @param qp Queue Pair to process > - * @param mb_mgr IMB_MGR to use > - * @param job IMB_JOB job > - * @param ops crypto ops to fill > - * @param nb_ops number of crypto ops > - * > - * @return > - * - Number of processed jobs > - */ > -static unsigned > -handle_completed_jobs(struct ipsec_mb_qp *qp, IMB_MGR *mb_mgr, > - IMB_JOB *job, struct rte_crypto_op **ops, > - uint16_t nb_ops) > -{ > - struct rte_crypto_op *op =3D NULL; > - uint16_t processed_jobs =3D 0; > - > - while (job !=3D NULL) { > - op =3D post_process_mb_job(qp, job); > - > - if (op) { > - ops[processed_jobs++] =3D op; > - qp->stats.dequeued_count++; > - } else { > - qp->stats.dequeue_err_count++; > - break; > - } > - if (processed_jobs =3D=3D nb_ops) > - break; > - > - job =3D IMB_GET_COMPLETED_JOB(mb_mgr); > - } > - > - return processed_jobs; > -} > - > -static inline uint16_t > -flush_mb_mgr(struct ipsec_mb_qp *qp, IMB_MGR *mb_mgr, > - struct rte_crypto_op **ops, uint16_t nb_ops) > -{ > - int processed_ops =3D 0; > - > - /* Flush the remaining jobs */ > - IMB_JOB *job =3D IMB_FLUSH_JOB(mb_mgr); > - > - if (job) > - processed_ops +=3D handle_completed_jobs(qp, mb_mgr, job, > - &ops[processed_ops], nb_ops - > processed_ops); > - > - return processed_ops; > -} > - > -static uint16_t > -aesni_mb_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops, > - uint16_t nb_ops) > -{ > - struct ipsec_mb_qp *qp =3D queue_pair; > - IMB_MGR *mb_mgr =3D qp->mb_mgr; > - struct rte_crypto_op *op; > - IMB_JOB *job; > - int retval, processed_jobs =3D 0; > - pid_t pid =3D 0; > - > - if (unlikely(nb_ops =3D=3D 0 || mb_mgr =3D=3D NULL)) > - return 0; > - > - uint8_t digest_idx =3D qp->digest_idx; > - > - do { > - /* Get next free mb job struct from mb manager */ > - job =3D IMB_GET_NEXT_JOB(mb_mgr); > - if (unlikely(job =3D=3D NULL)) { > - /* if no free mb job structs we need to flush > mb_mgr */ > - processed_jobs +=3D flush_mb_mgr(qp, mb_mgr, > - &ops[processed_jobs], > - nb_ops - processed_jobs); > - > - if (nb_ops =3D=3D processed_jobs) > - break; > - > - job =3D IMB_GET_NEXT_JOB(mb_mgr); > - } > - > - /* > - * Get next operation to process from ingress queue. > - * There is no need to return the job to the IMB_MGR > - * if there are no more operations to process, since the > IMB_MGR > - * can use that pointer again in next get_next calls. > - */ > - retval =3D rte_ring_dequeue(qp->ingress_queue, (void **)&= op); > - if (retval < 0) > - break; > - > - if (op->sess_type =3D=3D RTE_CRYPTO_OP_SECURITY_SESSION) > - retval =3D set_sec_mb_job_params(job, qp, op, > - &digest_idx); > - else > - retval =3D set_mb_job_params(job, qp, op, > - &digest_idx, mb_mgr, pid); > - > - if (unlikely(retval !=3D 0)) { > - qp->stats.dequeue_err_count++; > - set_job_null_op(job, op); > - } > - > - /* Submit job to multi-buffer for processing */ > -#ifdef RTE_LIBRTE_PMD_AESNI_MB_DEBUG > - job =3D IMB_SUBMIT_JOB(mb_mgr); > -#else > - job =3D IMB_SUBMIT_JOB_NOCHECK(mb_mgr); > -#endif > - /* > - * If submit returns a processed job then handle it, > - * before submitting subsequent jobs > - */ > - if (job) > - processed_jobs +=3D handle_completed_jobs(qp, mb_= mgr, > - job, &ops[processed_jobs], > - nb_ops - processed_jobs); > - > - } while (processed_jobs < nb_ops); > - > - qp->digest_idx =3D digest_idx; > - > - if (processed_jobs < 1) > - processed_jobs +=3D flush_mb_mgr(qp, mb_mgr, > - &ops[processed_jobs], > - nb_ops - processed_jobs); > - > - return processed_jobs; > -} > -#endif > static inline int > check_crypto_sgl(union rte_crypto_sym_ofs so, const struct rte_crypto_sg= l > *sgl) > { > diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h > b/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h > index 85994fe5a1..51cfd7e2aa 100644 > --- a/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h > +++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h > @@ -17,9 +17,7 @@ > #define HMAC_IPAD_VALUE (0x36) > #define HMAC_OPAD_VALUE (0x5C) > > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > #define MAX_NUM_SEGS 16 > -#endif > > static const struct rte_cryptodev_capabilities aesni_mb_capabilities[] = =3D { > { /* MD5 HMAC */ > @@ -567,13 +565,8 @@ static const struct rte_cryptodev_capabilities > aesni_mb_capabilities[] =3D { > }, > .digest_size =3D { > .min =3D 4, > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > .max =3D 16, > .increment =3D 4 > -#else > - .max =3D 4, > - .increment =3D 0 > -#endif > }, > .iv_size =3D { > .min =3D 16, > @@ -730,9 +723,7 @@ struct aesni_mb_qp_data { > * by the driver when verifying a digest provided > * by the user (using authentication verify operation) > */ > -#if IMB_VERSION(1, 2, 0) < IMB_VERSION_NUM > struct IMB_SGL_IOV sgl_segs[MAX_NUM_SEGS]; > -#endif > union { > struct gcm_context_data gcm_sgl_ctx; > struct chacha20_poly1305_context_data chacha_sgl_ctx; > -- > 2.25.1 > > --0000000000002db3e1061251140c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+UmVjaGVjay1yZXF1ZXN0OiBpb2wtdW5pdC1h cm02NC10ZXN0aW5nPGRpdj48YnI+PC9kaXY+PGRpdj5UaGlzIHJhbiBiZWZvcmUgd2UgaGFkIHN3 YXBwZWQgb3V0IHRoZSBvbGQgYXJtIHYxLjIgaXBzZWMgY29udGFpbmVyIGZvciBvdXIgbmV3IGFy bSB2MS40wqDCoGlwc2VjIGNvbnRhaW5lci4gV2UgaGF2ZSBub3cgbWFkZSB0aGF0IGNoYW5nZSwg c28gdGhpcyByZXRlc3Qgc2hvdWxkIHJlcG9ydCBhIHBhc3MuIFNvcnJ5IGZvciB0aGUgaW5jb252 ZW5pZW5jZS48L2Rpdj48L2Rpdj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGly PSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBGcmksIEZlYiAyMywgMjAyNCBhdCA3OjIx4oCv QU0gU2l2YXJhbWFrcmlzaG5hbiBWZW5rYXQgJmx0OzxhIGhyZWY9Im1haWx0bzp2ZW5rYXR4LnNp dmFyYW1ha3Jpc2huYW5AaW50ZWwuY29tIj52ZW5rYXR4LnNpdmFyYW1ha3Jpc2huYW5AaW50ZWwu Y29tPC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90 ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQg cmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij5TVyBQTURzIGluY3JlbWVudCBJUHNl YyBNdWx0aS1idWZmZXIgdmVyc2lvbiB0byAxLjQuPGJyPg0KQSBtaW5pbXVtIElQc2VjIE11bHRp LWJ1ZmZlciB2ZXJzaW9uIG9mIDEuNCBvciBncmVhdGVyIGlzIG5vdyByZXF1aXJlZC48YnI+DQo8 YnI+DQpTaWduZWQtb2ZmLWJ5OiBTaXZhcmFtYWtyaXNobmFuIFZlbmthdCAmbHQ7PGEgaHJlZj0i bWFpbHRvOnZlbmthdHguc2l2YXJhbWFrcmlzaG5hbkBpbnRlbC5jb20iIHRhcmdldD0iX2JsYW5r Ij52ZW5rYXR4LnNpdmFyYW1ha3Jpc2huYW5AaW50ZWwuY29tPC9hPiZndDs8YnI+DQpBY2tlZC1i eTogQ2lhcmEgUG93ZXIgJmx0OzxhIGhyZWY9Im1haWx0bzpjaWFyYS5wb3dlckBpbnRlbC5jb20i IHRhcmdldD0iX2JsYW5rIj5jaWFyYS5wb3dlckBpbnRlbC5jb208L2E+Jmd0Ozxicj4NCkFja2Vk LWJ5OiBQYWJsbyBkZSBMYXJhICZsdDs8YSBocmVmPSJtYWlsdG86cGFibG8uZGUubGFyYS5ndWFy Y2hAaW50ZWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+cGFibG8uZGUubGFyYS5ndWFyY2hAaW50ZWwu Y29tPC9hPiZndDs8YnI+DQotLS08YnI+DQrCoCB2NDo8YnI+DQrCoCDCoCDCoC0gMjQuMDMgcmVs ZWFzZSBub3RlcyB1cGRhdGVkIHRvIGJ1bXAgbWluaW11bSBJUFNlYyBNdWx0aS1idWZmZXI8YnI+ DQrCoCDCoCDCoCDCoHZlcnNpb24gdG8gMS40IGZvciBTVyBQTURzLjxicj4NCsKgIHYyOjxicj4N CsKgIMKgIMKgLSBSZW1vdmVkIHVudXNlZCBtYWNybyBpbiBpcHNlY19tYl9vcHMuYzxicj4NCsKg IMKgIMKgLSBzZXRfZ2NtX2pvYigpIG1vZGlmaWVkIGNvcnJlY3RseSB0byBrZWVwIG11bHRpX3Nn bF9qb2IgbGluZTxicj4NCsKgIMKgIMKgLSBVcGRhdGVkIFNXIFBNRHMgZG9jdW1lbnRhdGlvbiBm b3IgbWluaW11bSBJUFNlYyBNdWx0aS1idWZmZXIgdmVyc2lvbjxicj4NCsKgIMKgIMKgLSBVcGRh dGVkIGNvbW1pdCBtZXNzYWdlLCBhbmQgcGF0Y2ggdGl0bGUuPGJyPg0KLS0tPGJyPg0KwqBkb2Mv Z3VpZGVzL2NyeXB0b2RldnMvYWVzbmlfZ2NtLnJzdMKgIMKgIMKgIMKgIMKgfMKgIMKgMyArLTxi cj4NCsKgZG9jL2d1aWRlcy9jcnlwdG9kZXZzL2Flc25pX21iLnJzdMKgIMKgIMKgIMKgIMKgIHzC oCDCoDMgKy08YnI+DQrCoGRvYy9ndWlkZXMvY3J5cHRvZGV2cy9jaGFjaGEyMF9wb2x5MTMwNS5y c3QgfMKgIMKgMyArLTxicj4NCsKgZG9jL2d1aWRlcy9jcnlwdG9kZXZzL2thc3VtaS5yc3TCoCDC oCDCoCDCoCDCoCDCoCB8wqAgwqAzICstPGJyPg0KwqBkb2MvZ3VpZGVzL2NyeXB0b2RldnMvc25v dzNnLnJzdMKgIMKgIMKgIMKgIMKgIMKgIHzCoCDCoDMgKy08YnI+DQrCoGRvYy9ndWlkZXMvY3J5 cHRvZGV2cy96dWMucnN0wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8wqAgwqAzICstPGJyPg0KwqBk b2MvZ3VpZGVzL3JlbF9ub3Rlcy9yZWxlYXNlXzI0XzAzLnJzdMKgIMKgIMKgIHzCoCDCoDQgKzxi cj4NCsKgZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIvaXBzZWNfbWJfb3BzLmPCoCDCoCDCoCB8wqAg MjMgLS0tPGJyPg0KwqBkcml2ZXJzL2NyeXB0by9pcHNlY19tYi9tZXNvbi5idWlsZMKgIMKgIMKg IMKgIMKgfMKgIMKgMiArLTxicj4NCsKgZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIvcG1kX2Flc25p X21iLmPCoCDCoCDCoCB8IDE2NSAtLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCsKgZHJpdmVycy9j cnlwdG8vaXBzZWNfbWIvcG1kX2Flc25pX21iX3ByaXYuaCB8wqAgwqA5IC0tPGJyPg0KwqAxMSBm aWxlcyBjaGFuZ2VkLCAxNyBpbnNlcnRpb25zKCspLCAyMDQgZGVsZXRpb25zKC0pPGJyPg0KPGJy Pg0KZGlmZiAtLWdpdCBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9hZXNuaV9nY20ucnN0IGIvZG9j L2d1aWRlcy9jcnlwdG9kZXZzL2Flc25pX2djbS5yc3Q8YnI+DQppbmRleCBmNTc3MzQyNmVlLi5k YzY2NWU1MzZjIDEwMDY0NDxicj4NCi0tLSBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9hZXNuaV9n Y20ucnN0PGJyPg0KKysrIGIvZG9jL2d1aWRlcy9jcnlwdG9kZXZzL2Flc25pX2djbS5yc3Q8YnI+ DQpAQCAtODUsNyArODUsOCBAQCBhbmQgdGhlIGV4dGVybmFsIGNyeXB0byBsaWJyYXJpZXMgc3Vw cG9ydGVkIGJ5IHRoZW06PGJyPg0KwqAgwqAgMTguMDUgLSAxOS4wMsKgIE11bHRpLWJ1ZmZlciBs aWJyYXJ5IDAuNDkgLSAwLjUyPGJyPg0KwqAgwqAgMTkuMDUgLSAyMC4wOMKgIE11bHRpLWJ1ZmZl ciBsaWJyYXJ5IDAuNTIgLSAwLjU1PGJyPg0KwqAgwqAgMjAuMTEgLSAyMS4wOMKgIE11bHRpLWJ1 ZmZlciBsaWJyYXJ5IDAuNTMgLSAxLjMqPGJyPg0KLcKgIMKgMjEuMTErwqAgwqAgwqAgwqAgwqBN dWx0aS1idWZmZXIgbGlicmFyeSAxLjDCoCAtIDEuNSo8YnI+DQorwqAgwqAyMS4xMSAtIDIzLjEx wqAgTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wwqAgLSAxLjUqPGJyPg0KK8KgIMKgMjQuMDMrwqAg wqAgwqAgwqAgwqBNdWx0aS1idWZmZXIgbGlicmFyeSAxLjTCoCAtIDEuNSo8YnI+DQrCoCDCoCA9 PT09PT09PT09PT09wqAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+DQo8YnI+ DQrCoFwqIE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMCBvciBuZXdlciBvbmx5IHdvcmtzIGZvciBN ZXNvbiBidXQgbm90IE1ha2UgYnVpbGQgc3lzdGVtLjxicj4NCmRpZmYgLS1naXQgYS9kb2MvZ3Vp ZGVzL2NyeXB0b2RldnMvYWVzbmlfbWIucnN0IGIvZG9jL2d1aWRlcy9jcnlwdG9kZXZzL2Flc25p X21iLnJzdDxicj4NCmluZGV4IGIyZTc0YmE0MTcuLjVkNjcwZWUyMzcgMTAwNjQ0PGJyPg0KLS0t IGEvZG9jL2d1aWRlcy9jcnlwdG9kZXZzL2Flc25pX21iLnJzdDxicj4NCisrKyBiL2RvYy9ndWlk ZXMvY3J5cHRvZGV2cy9hZXNuaV9tYi5yc3Q8YnI+DQpAQCAtMTQ2LDcgKzE0Niw4IEBAIGFuZCB0 aGUgTXVsdGktQnVmZmVyIGxpYnJhcnkgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlbTo8YnI+DQrC oCDCoCAxOS4wNSAtIDE5LjA4wqAgwqAwLjUyPGJyPg0KwqAgwqAgMTkuMTEgLSAyMC4wOMKgIMKg MC41MiAtIDAuNTU8YnI+DQrCoCDCoCAyMC4xMSAtIDIxLjA4wqAgwqAwLjUzIC0gMS4zKjxicj4N Ci3CoCDCoDIxLjExK8KgIMKgIMKgIMKgIMKgIDEuMMKgIC0gMS41Kjxicj4NCivCoCDCoDIxLjEx IC0gMjMuMTHCoCDCoDEuMMKgIC0gMS41Kjxicj4NCivCoCDCoDI0LjAzK8KgIMKgIMKgIMKgIMKg IDEuNMKgIC0gMS41Kjxicj4NCsKgIMKgID09PT09PT09PT09PT09wqAgPT09PT09PT09PT09PT09 PT09PT09PT09PT09PTxicj4NCjxicj4NCsKgXCogTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wIG9y IG5ld2VyIG9ubHkgd29ya3MgZm9yIE1lc29uIGJ1dCBub3QgTWFrZSBidWlsZCBzeXN0ZW0uPGJy Pg0KZGlmZiAtLWdpdCBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9jaGFjaGEyMF9wb2x5MTMwNS5y c3QgYi9kb2MvZ3VpZGVzL2NyeXB0b2RldnMvY2hhY2hhMjBfcG9seTEzMDUucnN0PGJyPg0KaW5k ZXggOWQ0YmY4NmNmMS4uYzMyODY2YjMwMSAxMDA2NDQ8YnI+DQotLS0gYS9kb2MvZ3VpZGVzL2Ny eXB0b2RldnMvY2hhY2hhMjBfcG9seTEzMDUucnN0PGJyPg0KKysrIGIvZG9jL2d1aWRlcy9jcnlw dG9kZXZzL2NoYWNoYTIwX3BvbHkxMzA1LnJzdDxicj4NCkBAIC03Miw3ICs3Miw4IEBAIGFuZCB0 aGUgZXh0ZXJuYWwgY3J5cHRvIGxpYnJhcmllcyBzdXBwb3J0ZWQgYnkgdGhlbTo8YnI+DQrCoCDC oCA9PT09PT09PT09PT09wqAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+DQrC oCDCoCBEUERLIHZlcnNpb27CoCDCoENyeXB0byBsaWJyYXJ5IHZlcnNpb248YnI+DQrCoCDCoCA9 PT09PT09PT09PT09wqAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+DQotwqAg wqAyMS4xMSvCoCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMC0xLjUqPGJyPg0K K8KgIMKgMjEuMTEgLSAyMy4xMcKgIE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMC0xLjUqPGJyPg0K K8KgIMKgMjQuMDMrwqAgwqAgwqAgwqAgwqBNdWx0aS1idWZmZXIgbGlicmFyeSAxLjQtMS41Kjxi cj4NCsKgIMKgID09PT09PT09PT09PT3CoCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PTxicj4NCjxicj4NCsKgXCogTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wIG9yIG5ld2VyIG9ubHkg d29ya3MgZm9yIE1lc29uIGJ1dCBub3QgTWFrZSBidWlsZCBzeXN0ZW0uPGJyPg0KZGlmZiAtLWdp dCBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9rYXN1bWkucnN0IGIvZG9jL2d1aWRlcy9jcnlwdG9k ZXZzL2thc3VtaS5yc3Q8YnI+DQppbmRleCAwOTg5MDU0ODc1Li5hOGY0ZTZiMjA0IDEwMDY0NDxi cj4NCi0tLSBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9rYXN1bWkucnN0PGJyPg0KKysrIGIvZG9j L2d1aWRlcy9jcnlwdG9kZXZzL2thc3VtaS5yc3Q8YnI+DQpAQCAtODcsNyArODcsOCBAQCBhbmQg dGhlIGV4dGVybmFsIGNyeXB0byBsaWJyYXJpZXMgc3VwcG9ydGVkIGJ5IHRoZW06PGJyPg0KwqAg wqAgPT09PT09PT09PT09PcKgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPg0K wqAgwqAgMTYuMTEgLSAxOS4xMcKgIExpYlNTTyBLQVNVTUk8YnI+DQrCoCDCoCAyMC4wMiAtIDIx LjA4wqAgTXVsdGktYnVmZmVyIGxpYnJhcnkgMC41MyAtIDEuMyo8YnI+DQotwqAgwqAyMS4xMSvC oCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMMKgIC0gMS41Kjxicj4NCivCoCDC oDIxLjExIC0gMjMuMTHCoCBNdWx0aS1idWZmZXIgbGlicmFyeSAxLjDCoCAtIDEuNSo8YnI+DQor wqAgwqAyNC4wMyvCoCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuNMKgIC0gMS41 Kjxicj4NCsKgIMKgID09PT09PT09PT09PT3CoCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PTxicj4NCjxicj4NCsKgXCogTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wIG9yIG5ld2VyIG9u bHkgd29ya3MgZm9yIE1lc29uIGJ1dCBub3QgTWFrZSBidWlsZCBzeXN0ZW0uPGJyPg0KZGlmZiAt LWdpdCBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9zbm93M2cucnN0IGIvZG9jL2d1aWRlcy9jcnlw dG9kZXZzL3Nub3czZy5yc3Q8YnI+DQppbmRleCAzMzkyOTMyNjUzLi40Njg2MzQ2MmU1IDEwMDY0 NDxicj4NCi0tLSBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy9zbm93M2cucnN0PGJyPg0KKysrIGIv ZG9jL2d1aWRlcy9jcnlwdG9kZXZzL3Nub3czZy5yc3Q8YnI+DQpAQCAtOTYsNyArOTYsOCBAQCBh bmQgdGhlIGV4dGVybmFsIGNyeXB0byBsaWJyYXJpZXMgc3VwcG9ydGVkIGJ5IHRoZW06PGJyPg0K wqAgwqAgPT09PT09PT09PT09PcKgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJy Pg0KwqAgwqAgMTYuMDQgLSAxOS4xMcKgIExpYlNTTyBTTk9XM0c8YnI+DQrCoCDCoCAyMC4wMiAt IDIxLjA4wqAgTXVsdGktYnVmZmVyIGxpYnJhcnkgMC41MyAtIDEuMyo8YnI+DQotwqAgwqAyMS4x MSvCoCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMMKgIC0gMS41Kjxicj4NCivC oCDCoDIxLjExIC0gMjMuMTHCoCBNdWx0aS1idWZmZXIgbGlicmFyeSAxLjDCoCAtIDEuNSo8YnI+ DQorwqAgwqAyNC4wMyvCoCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuNMKgIC0g MS41Kjxicj4NCsKgIMKgID09PT09PT09PT09PT3CoCA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PTxicj4NCjxicj4NCsKgXCogTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wIG9yIG5ld2Vy IG9ubHkgd29ya3MgZm9yIE1lc29uIGJ1dCBub3QgTWFrZSBidWlsZCBzeXN0ZW0uPGJyPg0KZGlm ZiAtLWdpdCBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy96dWMucnN0IGIvZG9jL2d1aWRlcy9jcnlw dG9kZXZzL3p1Yy5yc3Q8YnI+DQppbmRleCBhNDE0YjVhZDJjLi41MTg2N2UxYTE2IDEwMDY0NDxi cj4NCi0tLSBhL2RvYy9ndWlkZXMvY3J5cHRvZGV2cy96dWMucnN0PGJyPg0KKysrIGIvZG9jL2d1 aWRlcy9jcnlwdG9kZXZzL3p1Yy5yc3Q8YnI+DQpAQCAtOTUsNyArOTUsOCBAQCBhbmQgdGhlIGV4 dGVybmFsIGNyeXB0byBsaWJyYXJpZXMgc3VwcG9ydGVkIGJ5IHRoZW06PGJyPg0KwqAgwqAgPT09 PT09PT09PT09PcKgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPg0KwqAgwqAg MTYuMTEgLSAxOS4xMcKgIExpYlNTTyBaVUM8YnI+DQrCoCDCoCAyMC4wMiAtIDIxLjA4wqAgTXVs dGktYnVmZmVyIGxpYnJhcnkgMC41MyAtIDEuMyo8YnI+DQotwqAgwqAyMS4xMSvCoCDCoCDCoCDC oCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuMMKgIC0gMS41Kjxicj4NCivCoCDCoDIxLjExIC0g MjMuMTHCoCBNdWx0aS1idWZmZXIgbGlicmFyeSAxLjDCoCAtIDEuNSo8YnI+DQorwqAgwqAyNC4w MyvCoCDCoCDCoCDCoCDCoE11bHRpLWJ1ZmZlciBsaWJyYXJ5IDEuNMKgIC0gMS41Kjxicj4NCsKg IMKgID09PT09PT09PT09PT3CoCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4N Cjxicj4NCsKgXCogTXVsdGktYnVmZmVyIGxpYnJhcnkgMS4wIG9yIG5ld2VyIG9ubHkgd29ya3Mg Zm9yIE1lc29uIGJ1dCBub3QgTWFrZSBidWlsZCBzeXN0ZW0uPGJyPg0KZGlmZiAtLWdpdCBhL2Rv Yy9ndWlkZXMvcmVsX25vdGVzL3JlbGVhc2VfMjRfMDMucnN0IGIvZG9jL2d1aWRlcy9yZWxfbm90 ZXMvcmVsZWFzZV8yNF8wMy5yc3Q8YnI+DQppbmRleCA4NzliYjQ5NDRjLi45ZjRhZmZiNzA2IDEw MDY0NDxicj4NCi0tLSBhL2RvYy9ndWlkZXMvcmVsX25vdGVzL3JlbGVhc2VfMjRfMDMucnN0PGJy Pg0KKysrIGIvZG9jL2d1aWRlcy9yZWxfbm90ZXMvcmVsZWFzZV8yNF8wMy5yc3Q8YnI+DQpAQCAt MTM4LDYgKzEzOCwxMCBAQCBOZXcgRmVhdHVyZXM8YnI+DQrCoCDCoCDCoHRvIHN1cHBvcnQgVExT IHYxLjIsIFRMUyB2MS4zIGFuZCBEVExTIHYxLjIuPGJyPg0KwqAgwqAqIEFkZGVkIFBNRCBBUEkg dG8gYWxsb3cgcmF3IHN1Ym1pc3Npb24gb2YgaW5zdHJ1Y3Rpb25zIHRvIENQVC48YnI+DQo8YnI+ DQorKiAqKlVwZGF0ZWQgaXBzZWNfbWIgY3J5cHRvIGRyaXZlci4qKjxicj4NCis8YnI+DQorwqAg KiBCdW1wIG1pbmltdW0gSVBTZWMgTXVsdGktYnVmZmVyIHZlcnNpb24gdG8gMS40IGZvciBTVyBQ TURzLjxicj4NCis8YnI+DQo8YnI+DQrCoFJlbW92ZWQgSXRlbXM8YnI+DQrCoC0tLS0tLS0tLS0t LS08YnI+DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIvaXBzZWNfbWJfb3Bz LmMgYi9kcml2ZXJzL2NyeXB0by9pcHNlY19tYi9pcHNlY19tYl9vcHMuYzxicj4NCmluZGV4IGYy MWY5Y2M1YTAuLmQyNWM2NzFkN2QgMTAwNjQ0PGJyPg0KLS0tIGEvZHJpdmVycy9jcnlwdG8vaXBz ZWNfbWIvaXBzZWNfbWJfb3BzLmM8YnI+DQorKysgYi9kcml2ZXJzL2NyeXB0by9pcHNlY19tYi9p cHNlY19tYl9vcHMuYzxicj4NCkBAIC0xMSw3ICsxMSw2IEBAPGJyPg0KPGJyPg0KwqAjaW5jbHVk ZSAmcXVvdDtpcHNlY19tYl9wcml2YXRlLmgmcXVvdDs8YnI+DQo8YnI+DQotI2RlZmluZSBJTUJf TVBfUkVRX1ZFUl9TVFIgJnF1b3Q7MS4xLjAmcXVvdDs8YnI+DQo8YnI+DQrCoC8qKiBDb25maWd1 cmUgZGV2aWNlICovPGJyPg0KwqBpbnQ8YnI+DQpAQCAtMTQ3LDE1ICsxNDYsMTAgQEAgaXBzZWNf bWJfcXBfcmVsZWFzZShzdHJ1Y3QgcnRlX2NyeXB0b2RldiAqZGV2LCB1aW50MTZfdCBxcF9pZCk8 YnI+DQrCoCDCoCDCoCDCoCBpZiAocnRlX2VhbF9wcm9jZXNzX3R5cGUoKSA9PSBSVEVfUFJPQ19Q UklNQVJZKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcnRlX3JpbmdfZnJlZShydGVf cmluZ19sb29rdXAocXAtJmd0O25hbWUpKTs8YnI+DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEs IDEsIDApICZndDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKHFwLSZndDttYl9tZ3IpPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZnJlZV9tYl9tZ3IocXAtJmd0O21iX21ncik7PGJyPg0KLSNlbHNlPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgaWYgKHFwLSZndDttYl9tZ3JfbXopIHs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBydGVfbWVtem9uZV9mcmVlKHFwLSZndDttYl9tZ3JfbXop Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHFwLSZndDttYl9tZ3Ig PSBOVUxMOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQotI2VuZGlmPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcnRlX2ZyZWUocXApOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGRldi0mZ3Q7ZGF0YS0mZ3Q7cXVldWVfcGFpcnNbcXBfaWRdID0gTlVMTDs8YnI+ DQrCoCDCoCDCoCDCoCB9IGVsc2UgeyAvKiBzZWNvbmRhcnkgcHJvY2VzcyAqLzxicj4NCkBAIC0y MTEsNyArMjA1LDYgQEAgc3RhdGljIHN0cnVjdCBydGVfcmluZzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUklOR19GX1NQX0VOUSB8IFJJTkdfRl9T Q19ERVEpOzxicj4NCsKgfTxicj4NCjxicj4NCi0jaWYgSU1CX1ZFUlNJT04oMSwgMSwgMCkgJmx0 Oz0gSU1CX1ZFUlNJT05fTlVNPGJyPg0KwqBzdGF0aWMgSU1CX01HUiAqPGJyPg0KwqBpcHNlY19t Yl9hbGxvY19tZ3JfZnJvbV9tZW16b25lKGNvbnN0IHN0cnVjdCBydGVfbWVtem9uZSAqKm1iX21n cl9teiw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjb25zdCBjaGFyICptYl9tZ3JfbXpf bmFtZSk8YnI+DQpAQCAtMjQ0LDcgKzIzNyw2IEBAIGlwc2VjX21iX2FsbG9jX21ncl9mcm9tX21l bXpvbmUoY29uc3Qgc3RydWN0IHJ0ZV9tZW16b25lICoqbWJfbWdyX216LDxicj4NCsKgIMKgIMKg IMKgIH08YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gbWJfbWdyOzxicj4NCsKgfTxicj4NCi0jZW5k aWY8YnI+DQo8YnI+DQrCoC8qKiBTZXR1cCBhIHF1ZXVlIHBhaXIgKi88YnI+DQrCoGludDxicj4N CkBAIC0yNjAsMTIgKzI1Miw2IEBAIGlwc2VjX21iX3FwX3NldHVwKHN0cnVjdCBydGVfY3J5cHRv ZGV2ICpkZXYsIHVpbnQxNl90IHFwX2lkLDxicj4NCsKgIMKgIMKgIMKgIGludCByZXQ7PGJyPg0K PGJyPg0KwqAgwqAgwqAgwqAgaWYgKHJ0ZV9lYWxfcHJvY2Vzc190eXBlKCkgPT0gUlRFX1BST0Nf U0VDT05EQVJZKSB7PGJyPg0KLSNpZiBJTUJfVkVSU0lPTigxLCAxLCAwKSAmZ3Q7IElNQl9WRVJT SU9OX05VTTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoElQU0VDX01CX0xPRyhFUlIsICZx dW90O1RoZSBpbnRlbC1pcHNlYy1tYiB2ZXJzaW9uICglcykgZG9lcyBub3Qgc3VwcG9ydCBtdWx0 aXByb2Nlc3MsJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7dGhlIG1pbmltdW0gdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyBm ZWF0dXJlIGlzICVzLiZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBJTUJfVkVSU0lPTl9TVFIsIElNQl9NUF9SRVFfVkVSX1NUUik7PGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIC1FSU5WQUw7PGJyPg0KLSNlbmRpZjxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHFwID0gZGV2LSZndDtkYXRhLSZndDtxdWV1ZV9w YWlyc1txcF9pZF07PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKHFwID09IE5VTEwp IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBJUFNFQ19NQl9MT0co REVCVUcsICZxdW90O1NlY29uZGFyeSBwcm9jZXNzIHNldHRpbmcgdXAgZGV2aWNlIHFwLiZxdW90 Oyk7PGJyPg0KQEAgLTI4NSwxNSArMjcxLDExIEBAIGlwc2VjX21iX3FwX3NldHVwKHN0cnVjdCBy dGVfY3J5cHRvZGV2ICpkZXYsIHVpbnQxNl90IHFwX2lkLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAtRU5PTUVNOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+ DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDEsIDApICZndDsgSU1CX1ZFUlNJT05fTlVNPGJy Pg0KLcKgIMKgIMKgIMKgcXAtJmd0O21iX21nciA9IGFsbG9jX2luaXRfbWJfbWdyKCk7PGJyPg0K LSNlbHNlPGJyPg0KwqAgwqAgwqAgwqAgY2hhciBtel9uYW1lW0lQU0VDX01CX01BWF9NWl9OQU1F XTs8YnI+DQrCoCDCoCDCoCDCoCBzbnByaW50Zihtel9uYW1lLCBzaXplb2YobXpfbmFtZSksICZx dW90O0lNQl9NR1JfREVWXyVkX1FQXyVkJnF1b3Q7LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGRldi0mZ3Q7ZGF0YS0mZ3Q7ZGV2X2lkLCBxcF9pZCk7PGJyPg0KwqAg wqAgwqAgwqAgcXAtJmd0O21iX21nciA9IGlwc2VjX21iX2FsbG9jX21ncl9mcm9tX21lbXpvbmUo JmFtcDsocXAtJmd0O21iX21ncl9teiksPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbXpfbmFtZSk7PGJyPg0KLSNlbmRpZjxicj4NCsKgIMKgIMKgIMKgIGlmIChxcC0m Z3Q7bWJfbWdyID09IE5VTEwpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXQgPSAt RU5PTUVNOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gcXBfc2V0dXBfY2xlYW51 cDs8YnI+DQpAQCAtMzMwLDE1ICszMTIsMTAgQEAgaXBzZWNfbWJfcXBfc2V0dXAoc3RydWN0IHJ0 ZV9jcnlwdG9kZXYgKmRldiwgdWludDE2X3QgcXBfaWQsPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJu IDA7PGJyPg0KPGJyPg0KwqBxcF9zZXR1cF9jbGVhbnVwOjxicj4NCi0jaWYgSU1CX1ZFUlNJT04o MSwgMSwgMCkgJmd0OyBJTUJfVkVSU0lPTl9OVU08YnI+DQotwqAgwqAgwqAgwqBpZiAocXAtJmd0 O21iX21ncik8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmcmVlX21iX21ncihxcC0mZ3Q7 bWJfbWdyKTs8YnI+DQotI2Vsc2U8YnI+DQrCoCDCoCDCoCDCoCBpZiAocnRlX2VhbF9wcm9jZXNz X3R5cGUoKSA9PSBSVEVfUFJPQ19TRUNPTkRBUlkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcmV0dXJuIHJldDs8YnI+DQrCoCDCoCDCoCDCoCBpZiAocXAtJmd0O21iX21ncl9teik8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBydGVfbWVtem9uZV9mcmVlKHFwLSZndDttYl9tZ3Jf bXopOzxicj4NCi0jZW5kaWY8YnI+DQrCoCDCoCDCoCDCoCBydGVfZnJlZShxcCk7PGJyPg0KwqAg wqAgwqAgwqAgcmV0dXJuIHJldDs8YnI+DQrCoH08YnI+DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9j cnlwdG8vaXBzZWNfbWIvbWVzb24uYnVpbGQgYi9kcml2ZXJzL2NyeXB0by9pcHNlY19tYi9tZXNv bi5idWlsZDxicj4NCmluZGV4IDg3YmY5NjU1NTQuLjBjOTg4ZDc0MTEgMTAwNjQ0PGJyPg0KLS0t IGEvZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIvbWVzb24uYnVpbGQ8YnI+DQorKysgYi9kcml2ZXJz L2NyeXB0by9pcHNlY19tYi9tZXNvbi5idWlsZDxicj4NCkBAIC03LDcgKzcsNyBAQCBpZiBpc193 aW5kb3dzPGJyPg0KwqAgwqAgwqBzdWJkaXJfZG9uZSgpPGJyPg0KwqBlbmRpZjxicj4NCjxicj4N Ci1JTUJfcmVxdWlyZWRfdmVyID0gJiMzOTsxLjAuMCYjMzk7PGJyPg0KK0lNQl9yZXF1aXJlZF92 ZXIgPSAmIzM5OzEuNC4wJiMzOTs8YnI+DQrCoElNQl9oZWFkZXIgPSAmIzM5OyNpbmNsdWRlJmx0 O2ludGVsLWlwc2VjLW1iLmgmZ3Q7JiMzOTs8YnI+DQrCoGlmIGFyY2hfc3ViZGlyID09ICYjMzk7 YXJtJiMzOTs8YnI+DQrCoCDCoCDCoElNQl9oZWFkZXIgPSAmIzM5OyNpbmNsdWRlJmx0O2lwc2Vj LW1iLmgmZ3Q7JiMzOTs8YnI+DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIv cG1kX2Flc25pX21iLmMgYi9kcml2ZXJzL2NyeXB0by9pcHNlY19tYi9wbWRfYWVzbmlfbWIuYzxi cj4NCmluZGV4IDRkZTQ4NjZjZjMuLmI5MzI2N2YxYzMgMTAwNjQ0PGJyPg0KLS0tIGEvZHJpdmVy cy9jcnlwdG8vaXBzZWNfbWIvcG1kX2Flc25pX21iLmM8YnI+DQorKysgYi9kcml2ZXJzL2NyeXB0 by9pcHNlY19tYi9wbWRfYWVzbmlfbWIuYzxicj4NCkBAIC0yMTAsMTMgKzIxMCw5IEBAIGFlc25p X21iX3NldF9zZXNzaW9uX2F1dGhfcGFyYW1ldGVycyhjb25zdCBJTUJfTUdSICptYl9tZ3IsPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIH0gZWxzZSBpZiAoeGZvcm0tJmd0O2F1dGgua2V5Lmxlbmd0aCA9PSAzMikg ezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNlc3MtJmd0O3RlbXBs YXRlX2pvYi5oYXNoX2FsZyA9IElNQl9BVVRIX1pVQzI1Nl9FSUEzX0JJVExFTjs8YnI+DQotI2lm IElNQl9WRVJTSU9OKDEsIDIsIDApICZsdDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKHNlc3MtJmd0O2F1dGgucmVxX2RpZ2VzdF9s ZW4gIT0gNCAmYW1wOyZhbXA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2Vzcy0mZ3Q7YXV0aC5yZXFfZGlnZXN0X2xlbiAh PSA4ICZhbXA7JmFtcDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZXNzLSZndDthdXRoLnJlcV9kaWdlc3RfbGVuICE9IDE2 KSB7PGJyPg0KLSNlbHNlPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKHNlc3MtJmd0O2F1dGgucmVxX2RpZ2VzdF9sZW4gIT0gNCkgezxicj4NCi0jZW5kaWY8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBJUFNFQ19N Ql9MT0coRVJSLCAmcXVvdDtJbnZhbGlkIGRpZ2VzdCBzaXplXG4mcXVvdDspOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAtRUlOVkFM Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQpAQCAtODQ1 LDExICs4NDEsOSBAQCBhZXNuaV9tYl9zZXNzaW9uX2NvbmZpZ3VyZShJTUJfTUdSICptYl9tZ3Is PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8 YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDMsIDApICZsdDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0K wqAgwqAgwqAgwqAgc2Vzcy0mZ3Q7c2Vzc2lvbl9pZCA9IGltYl9zZXRfc2Vzc2lvbihtYl9tZ3Is ICZhbXA7c2Vzcy0mZ3Q7dGVtcGxhdGVfam9iKTs8YnI+DQrCoCDCoCDCoCDCoCBzZXNzLSZndDtw aWQgPSBnZXRwaWQoKTs8YnI+DQrCoCDCoCDCoCDCoCBSVEVfUEVSX0xDT1JFKHBpZCkgPSBzZXNz LSZndDtwaWQ7PGJyPg0KLSNlbmRpZjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxi cj4NCsKgfTxicj4NCkBAIC05ODIsOSArOTc2LDcgQEAgYWVzbmlfbWJfc2V0X2RvY3Npc19zZWNf c2Vzc2lvbl9wYXJhbWV0ZXJzKDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gZXJy b3JfZXhpdDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLSNpZiBJTUJfVkVSU0lPTigx LCAzLCAwKSAmbHQ7IElNQl9WRVJTSU9OX05VTTxicj4NCsKgIMKgIMKgIMKgIGlwc2VjX3Nlc3Mt Jmd0O3Nlc3Npb25faWQgPSBpbWJfc2V0X3Nlc3Npb24obWJfbWdyLCAmYW1wO2lwc2VjX3Nlc3Mt Jmd0O3RlbXBsYXRlX2pvYik7PGJyPg0KLSNlbmRpZjxicj4NCjxicj4NCsKgZXJyb3JfZXhpdDo8 YnI+DQrCoCDCoCDCoCDCoCBmcmVlX21iX21ncihtYl9tZ3IpOzxicj4NCkBAIC0xMjM5LDcgKzEy MzEsNiBAQCBpbWJfbGliX3N1cHBvcnRfc2dsX2FsZ28oSU1CX0NJUEhFUl9NT0RFIGFsZyk8YnI+ DQrCoCDCoCDCoCDCoCByZXR1cm4gMDs8YnI+DQrCoH08YnI+DQo8YnI+DQotI2lmIElNQl9WRVJT SU9OKDEsIDIsIDApICZsdDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0KwqBzdGF0aWMgaW5saW5lIGlu dDxicj4NCsKgc2luZ2xlX3NnbF9qb2IoSU1CX0pPQiAqam9iLCBzdHJ1Y3QgcnRlX2NyeXB0b19v cCAqb3AsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaW50IG9vcCwgdWludDMyX3Qgb2Zm c2V0LCBzdHJ1Y3QgcnRlX21idWYgKm1fc3JjLDxicj4NCkBAIC0xMzI0LDcgKzEzMTUsNiBAQCBz aW5nbGVfc2dsX2pvYihJTUJfSk9CICpqb2IsIHN0cnVjdCBydGVfY3J5cHRvX29wICpvcCw8YnI+ DQrCoCDCoCDCoCDCoCBqb2ItJmd0O3NnbF9pb19zZWdzID0gc2dsX3NlZ3M7PGJyPg0KwqAgwqAg wqAgwqAgcmV0dXJuIDA7PGJyPg0KwqB9PGJyPg0KLSNlbmRpZjxicj4NCjxicj4NCsKgc3RhdGlj IGlubGluZSBpbnQ8YnI+DQrCoG11bHRpX3NnbF9qb2IoSU1CX0pPQiAqam9iLCBzdHJ1Y3QgcnRl X2NyeXB0b19vcCAqb3AsPGJyPg0KQEAgLTEzOTQsOSArMTM4NCw3IEBAIHNldF9nY21fam9iKElN Ql9NR1IgKm1iX21nciwgSU1CX0pPQiAqam9iLCBjb25zdCB1aW50OF90IHNnbCw8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBqb2ItJmd0O21zZ19sZW5fdG9faGFzaF9pbl9ieXRlcyA9IDA7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgam9iLSZndDttc2dfbGVuX3RvX2NpcGhlcl9p bl9ieXRlcyA9IDA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgam9iLSZndDtjaXBoZXJf c3RhcnRfc3JjX29mZnNldF9pbl9ieXRlcyA9IDA7PGJyPg0KLSNpZiBJTUJfVkVSU0lPTigxLCAz LCAwKSAmbHQ7IElNQl9WRVJTSU9OX05VTTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlt Yl9zZXRfc2Vzc2lvbihtYl9tZ3IsIGpvYik7PGJyPg0KLSNlbmRpZjxicj4NCsKgIMKgIMKgIMKg IH0gZWxzZSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgam9iLSZndDtoYXNoX3N0YXJ0 X3NyY19vZmZzZXRfaW5fYnl0ZXMgPTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIG9wLSZndDtzeW0tJmd0O2FlYWQuZGF0YS5vZmZzZXQ7PGJyPg0K QEAgLTE0MjQsMTMgKzE0MTIsMTEgQEAgc2V0X2djbV9qb2IoSU1CX01HUiAqbWJfbWdyLCBJTUJf Sk9CICpqb2IsIGNvbnN0IHVpbnQ4X3Qgc2dsLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGpvYi0mZ3Q7c3JjID0gTlVMTDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBqb2ItJmd0 O2RzdCA9IE5VTEw7PGJyPg0KPGJyPg0KLSNpZiBJTUJfVkVSU0lPTigxLCAyLCAwKSAmbHQ7IElN Ql9WRVJTSU9OX05VTTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChtX3NyYy0mZ3Q7 bmJfc2VncyAmbHQ7PSBNQVhfTlVNX1NFR1MpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcmV0dXJuIHNpbmdsZV9zZ2xfam9iKGpvYiwgb3AsIG9vcCw8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBt X29mZnNldCwgbV9zcmMsIG1fZHN0LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHFwX2RhdGEtJmd0O3NnbF9zZWdzKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlPGJyPg0KLSNlbmRpZjxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBtdWx0aV9zZ2xfam9iKGpvYiwgb3As IG9vcCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBtX29mZnNldCwgbV9zcmMsIG1fZHN0LCBtYl9tZ3IpOzxicj4NCsKgIMKg IMKgIMKgIH0gZWxzZSB7PGJyPg0KQEAgLTE1MjAsMTAgKzE1MDYsNiBAQCBzZXRfbWJfam9iX3Bh cmFtcyhJTUJfSk9CICpqb2IsIHN0cnVjdCBpcHNlY19tYl9xcCAqcXAsPGJyPg0KwqAgwqAgwqAg wqAgdWludDhfdCBzZ2wgPSAwOzxicj4NCsKgIMKgIMKgIMKgIHVpbnQ4X3QgbGJfc2dsID0gMDs8 YnI+DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDMsIDApICZndDs9IElNQl9WRVJTSU9OX05V TTxicj4NCi3CoCDCoCDCoCDCoCh2b2lkKSBwaWQ7PGJyPg0KLSNlbmRpZjxicj4NCi08YnI+DQrC oCDCoCDCoCDCoCBzZXNzaW9uID0gaXBzZWNfbWJfZ2V0X3Nlc3Npb25fcHJpdmF0ZShxcCwgb3Ap Ozxicj4NCsKgIMKgIMKgIMKgIGlmIChzZXNzaW9uID09IE5VTEwpIHs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBvcC0mZ3Q7c3RhdHVzID0gUlRFX0NSWVBUT19PUF9TVEFUVVNfSU5WQUxJ RF9TRVNTSU9OOzxicj4NCkBAIC0xNTMzLDEyICsxNTE1LDEwIEBAIHNldF9tYl9qb2JfcGFyYW1z KElNQl9KT0IgKmpvYiwgc3RydWN0IGlwc2VjX21iX3FwICpxcCw8YnI+DQrCoCDCoCDCoCDCoCBj b25zdCBJTUJfQ0lQSEVSX01PREUgY2lwaGVyX21vZGUgPTxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHNlc3Npb24tJmd0O3RlbXBsYXRlX2pvYi5jaXBoZXJfbW9kZTs8 YnI+DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDMsIDApICZsdDsgSU1CX1ZFUlNJT05fTlVN PGJyPg0KwqAgwqAgwqAgwqAgaWYgKHNlc3Npb24tJmd0O3BpZCAhPSBwaWQpIHs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBtZW1jcHkoam9iLCAmYW1wO3Nlc3Npb24tJmd0O3RlbXBsYXRl X2pvYiwgc2l6ZW9mKElNQl9KT0IpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpbWJf c2V0X3Nlc3Npb24obWJfbWdyLCBqb2IpOzxicj4NCsKgIMKgIMKgIMKgIH0gZWxzZSBpZiAoam9i LSZndDtzZXNzaW9uX2lkICE9IHNlc3Npb24tJmd0O3Nlc3Npb25faWQpPGJyPg0KLSNlbmRpZjxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1lbWNweShqb2IsICZhbXA7c2Vzc2lvbi0mZ3Q7 dGVtcGxhdGVfam9iLCBzaXplb2YoSU1CX0pPQikpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlm ICghb3AtJmd0O3N5bS0mZ3Q7bV9kc3QpIHs8YnI+DQpAQCAtMTU3OSw5ICsxNTU5LDcgQEAgc2V0 X21iX2pvYl9wYXJhbXMoSU1CX0pPQiAqam9iLCBzdHJ1Y3QgaXBzZWNfbWJfcXAgKnFwLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGpvYi0mZ3Q7dS5HQ00uY3R4ID0g JmFtcDtxcF9kYXRhLSZndDtnY21fc2dsX2N0eDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBqb2ItJmd0O2NpcGhlcl9tb2RlID0gSU1CX0NJUEhFUl9HQ01fU0dMOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGpvYi0mZ3Q7aGFzaF9hbGcg PSBJTUJfQVVUSF9HQ01fU0dMOzxicj4NCi0jaWYgSU1CX1ZFUlNJT04oMSwgMywgMCkgJmx0OyBJ TUJfVkVSU0lPTl9OVU08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBp bWJfc2V0X3Nlc3Npb24obWJfbWdyLCBqb2IpOzxicj4NCi0jZW5kaWY8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYnJlYWs7PGJyPg0K wqAgwqAgwqAgwqAgY2FzZSBJTUJfQVVUSF9BRVNfR01BQ18xMjg6PGJyPg0KQEAgLTE2MDYsOSAr MTU4NCw3IEBAIHNldF9tYl9qb2JfcGFyYW1zKElNQl9KT0IgKmpvYiwgc3RydWN0IGlwc2VjX21i X3FwICpxcCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBqb2ItJmd0 O3UuQ0hBQ0hBMjBfUE9MWTEzMDUuY3R4ID0gJmFtcDtxcF9kYXRhLSZndDtjaGFjaGFfc2dsX2N0 eDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBqb2ItJmd0O2NpcGhl cl9tb2RlID0gSU1CX0NJUEhFUl9DSEFDSEEyMF9QT0xZMTMwNV9TR0w7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgam9iLSZndDtoYXNoX2FsZyA9IElNQl9BVVRIX0NI QUNIQTIwX1BPTFkxMzA1X1NHTDs8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDMsIDApICZsdDsg SU1CX1ZFUlNJT05fTlVNPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg aW1iX3NldF9zZXNzaW9uKG1iX21nciwgam9iKTs8YnI+DQotI2VuZGlmPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJyZWFrOzxicj4N CsKgIMKgIMKgIMKgIGRlZmF1bHQ6PGJyPg0KQEAgLTE4MDQsMTMgKzE3ODAsMTEgQEAgc2V0X21i X2pvYl9wYXJhbXMoSU1CX0pPQiAqam9iLCBzdHJ1Y3QgaXBzZWNfbWJfcXAgKnFwLDxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChsYl9zZ2wpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIGhhbmRsZV9zZ2xfbGluZWFyKGpvYiwgb3AsIG1fb2Zm c2V0LCBzZXNzaW9uKTs8YnI+DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDIsIDApICZsdDsg SU1CX1ZFUlNJT05fTlVNPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKG1fc3JjLSZn dDtuYl9zZWdzICZsdDs9IE1BWF9OVU1fU0VHUyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCByZXR1cm4gc2luZ2xlX3NnbF9qb2Ioam9iLCBvcCwgb29wLDxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IG1fb2Zmc2V0LCBtX3NyYywgbV9kc3QsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcXBfZGF0YS0mZ3Q7c2dsX3NlZ3MpOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8YnI+DQotI2VuZGlmPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIG11bHRpX3NnbF9qb2Ioam9iLCBv cCwgb29wLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIG1fb2Zmc2V0LCBtX3NyYywgbV9kc3QsIG1iX21ncik7PGJyPg0KwqAg wqAgwqAgwqAgfTxicj4NCkBAIC0yMTMwLDcgKzIxMDQsNiBAQCBzZXRfam9iX251bGxfb3AoSU1C X0pPQiAqam9iLCBzdHJ1Y3QgcnRlX2NyeXB0b19vcCAqb3ApPGJyPg0KwqAgwqAgwqAgwqAgcmV0 dXJuIGpvYjs8YnI+DQrCoH08YnI+DQo8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEsIDIsIDApICZs dDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0KwqBzdGF0aWMgdWludDE2X3Q8YnI+DQrCoGFlc25pX21i X2RlcXVldWVfYnVyc3Qodm9pZCAqcXVldWVfcGFpciwgc3RydWN0IHJ0ZV9jcnlwdG9fb3AgKipv cHMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdWludDE2X3QgbmJfb3BzKTxicj4NCkBA IC0yMjYzLDE0NCArMjIzNiw2IEBAIGFlc25pX21iX2RlcXVldWVfYnVyc3Qodm9pZCAqcXVldWVf cGFpciwgc3RydWN0IHJ0ZV9jcnlwdG9fb3AgKipvcHMsPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAg cmV0dXJuIHByb2Nlc3NlZF9qb2JzOzxicj4NCsKgfTxicj4NCi0jZWxzZTxicj4NCi08YnI+DQot LyoqPGJyPg0KLSAqIFByb2Nlc3MgYSBjb21wbGV0ZWQgSU1CX0pPQiBqb2IgYW5kIGtlZXAgcHJv Y2Vzc2luZyBqb2JzIHVudGlsPGJyPg0KLSAqIGdldF9jb21wbGV0ZWRfam9iIHJldHVybiBOVUxM PGJyPg0KLSAqPGJyPg0KLSAqIEBwYXJhbSBxcMKgIMKgIMKgIMKgIMKgIMKgUXVldWUgUGFpciB0 byBwcm9jZXNzPGJyPg0KLSAqIEBwYXJhbSBtYl9tZ3LCoCDCoCDCoCDCoElNQl9NR1IgdG8gdXNl PGJyPg0KLSAqIEBwYXJhbSBqb2LCoCDCoCDCoCDCoCDCoCBJTUJfSk9CIGpvYjxicj4NCi0gKiBA cGFyYW0gb3BzwqAgwqAgwqAgwqAgwqAgY3J5cHRvIG9wcyB0byBmaWxsPGJyPg0KLSAqIEBwYXJh bSBuYl9vcHPCoCDCoCDCoCDCoG51bWJlciBvZiBjcnlwdG8gb3BzPGJyPg0KLSAqPGJyPg0KLSAq IEByZXR1cm48YnI+DQotICogLSBOdW1iZXIgb2YgcHJvY2Vzc2VkIGpvYnM8YnI+DQotICovPGJy Pg0KLXN0YXRpYyB1bnNpZ25lZDxicj4NCi1oYW5kbGVfY29tcGxldGVkX2pvYnMoc3RydWN0IGlw c2VjX21iX3FwICpxcCwgSU1CX01HUiAqbWJfbWdyLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoElNQl9KT0IgKmpvYiwgc3RydWN0IHJ0ZV9jcnlwdG9fb3AgKipvcHMsPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgdWludDE2X3QgbmJfb3BzKTxicj4NCi17PGJyPg0KLcKgIMKgIMKg IMKgc3RydWN0IHJ0ZV9jcnlwdG9fb3AgKm9wID0gTlVMTDs8YnI+DQotwqAgwqAgwqAgwqB1aW50 MTZfdCBwcm9jZXNzZWRfam9icyA9IDA7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoHdoaWxlIChq b2IgIT0gTlVMTCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG9wID0gcG9zdF9wcm9j ZXNzX21iX2pvYihxcCwgam9iKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg aWYgKG9wKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgb3BzW3By b2Nlc3NlZF9qb2JzKytdID0gb3A7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgcXAtJmd0O3N0YXRzLmRlcXVldWVkX2NvdW50Kys7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgfSBlbHNlIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBxcC0mZ3Q7c3RhdHMuZGVxdWV1ZV9lcnJfY291bnQrKzs8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHByb2Nlc3NlZF9qb2JzID09IG5iX29w cyk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmVhazs8YnI+DQot PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgam9iID0gSU1CX0dFVF9DT01QTEVURURfSk9C KG1iX21ncik7PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqByZXR1 cm4gcHJvY2Vzc2VkX2pvYnM7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbmxpbmUgdWlu dDE2X3Q8YnI+DQotZmx1c2hfbWJfbWdyKHN0cnVjdCBpcHNlY19tYl9xcCAqcXAsIElNQl9NR1Ig Km1iX21nciw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b19v cCAqKm9wcywgdWludDE2X3QgbmJfb3BzKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgaW50IHBy b2Nlc3NlZF9vcHMgPSAwOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAvKiBGbHVzaCB0aGUgcmVt YWluaW5nIGpvYnMgKi88YnI+DQotwqAgwqAgwqAgwqBJTUJfSk9CICpqb2IgPSBJTUJfRkxVU0hf Sk9CKG1iX21ncik7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGlmIChqb2IpPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgcHJvY2Vzc2VkX29wcyArPSBoYW5kbGVfY29tcGxldGVkX2pvYnMo cXAsIG1iX21nciwgam9iLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCZhbXA7b3BzW3Byb2Nlc3NlZF9vcHNdLCBuYl9vcHMgLSBwcm9jZXNzZWRf b3BzKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIHByb2Nlc3NlZF9vcHM7PGJyPg0K LX08YnI+DQotPGJyPg0KLXN0YXRpYyB1aW50MTZfdDxicj4NCi1hZXNuaV9tYl9kZXF1ZXVlX2J1 cnN0KHZvaWQgKnF1ZXVlX3BhaXIsIHN0cnVjdCBydGVfY3J5cHRvX29wICoqb3BzLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHVpbnQxNl90IG5iX29wcyk8YnI+DQotezxicj4NCi3CoCDC oCDCoCDCoHN0cnVjdCBpcHNlY19tYl9xcCAqcXAgPSBxdWV1ZV9wYWlyOzxicj4NCi3CoCDCoCDC oCDCoElNQl9NR1IgKm1iX21nciA9IHFwLSZndDttYl9tZ3I7PGJyPg0KLcKgIMKgIMKgIMKgc3Ry dWN0IHJ0ZV9jcnlwdG9fb3AgKm9wOzxicj4NCi3CoCDCoCDCoCDCoElNQl9KT0IgKmpvYjs8YnI+ DQotwqAgwqAgwqAgwqBpbnQgcmV0dmFsLCBwcm9jZXNzZWRfam9icyA9IDA7PGJyPg0KLcKgIMKg IMKgIMKgcGlkX3QgcGlkID0gMDs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKHVubGlrZWx5 KG5iX29wcyA9PSAwIHx8IG1iX21nciA9PSBOVUxMKSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqByZXR1cm4gMDs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgdWludDhfdCBkaWdlc3RfaWR4 ID0gcXAtJmd0O2RpZ2VzdF9pZHg7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGRvIHs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAvKiBHZXQgbmV4dCBmcmVlIG1iIGpvYiBzdHJ1Y3QgZnJv bSBtYiBtYW5hZ2VyICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgam9iID0gSU1CX0dF VF9ORVhUX0pPQihtYl9tZ3IpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1bmxp a2VseShqb2IgPT0gTlVMTCkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAvKiBpZiBubyBmcmVlIG1iIGpvYiBzdHJ1Y3RzIHdlIG5lZWQgdG8gZmx1c2ggbWJfbWdy ICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJvY2Vzc2VkX2pv YnMgKz0gZmx1c2hfbWJfbWdyKHFwLCBtYl9tZ3IsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtvcHNbcHJvY2Vzc2Vk X2pvYnNdLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoG5iX29wcyAtIHByb2Nlc3NlZF9qb2JzKTs8YnI+DQotPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKG5iX29wcyA9PSBwcm9jZXNzZWRf am9icyk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBicmVhazs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg am9iID0gSU1CX0dFVF9ORVhUX0pPQihtYl9tZ3IpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoH08YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLyo8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgKiBHZXQgbmV4dCBvcGVyYXRpb24gdG8gcHJvY2VzcyBmcm9tIGlu Z3Jlc3MgcXVldWUuPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICogVGhlcmUgaXMgbm8g bmVlZCB0byByZXR1cm4gdGhlIGpvYiB0byB0aGUgSU1CX01HUjxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCAqIGlmIHRoZXJlIGFyZSBubyBtb3JlIG9wZXJhdGlvbnMgdG8gcHJvY2Vzcywg c2luY2UgdGhlIElNQl9NR1I8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKiBjYW4gdXNl IHRoYXQgcG9pbnRlciBhZ2FpbiBpbiBuZXh0IGdldF9uZXh0IGNhbGxzLjxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAqLzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHZhbCA9 IHJ0ZV9yaW5nX2RlcXVldWUocXAtJmd0O2luZ3Jlc3NfcXVldWUsICh2b2lkICoqKSZhbXA7b3Ap Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChyZXR2YWwgJmx0OyAwKTxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGJyZWFrOzxicj4NCi08YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAob3AtJmd0O3Nlc3NfdHlwZSA9PSBSVEVfQ1JZUFRPX09Q X1NFQ1VSSVRZX1NFU1NJT04pPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcmV0dmFsID0gc2V0X3NlY19tYl9qb2JfcGFyYW1zKGpvYiwgcXAsIG9wLDxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCZhbXA7ZGlnZXN0X2lkeCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ZWxzZTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHZhbCA9IHNl dF9tYl9qb2JfcGFyYW1zKGpvYiwgcXAsIG9wLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7ZGlnZXN0X2lkeCwgbWJfbWdyLCBwaWQpOzxi cj4NCi08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodW5saWtlbHkocmV0dmFsICE9 IDApKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcXAtJmd0O3N0 YXRzLmRlcXVldWVfZXJyX2NvdW50Kys7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc2V0X2pvYl9udWxsX29wKGpvYiwgb3ApOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH08YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLyogU3VibWl0IGpv YiB0byBtdWx0aS1idWZmZXIgZm9yIHByb2Nlc3NpbmcgKi88YnI+DQotI2lmZGVmIFJURV9MSUJS VEVfUE1EX0FFU05JX01CX0RFQlVHPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgam9iID0g SU1CX1NVQk1JVF9KT0IobWJfbWdyKTs8YnI+DQotI2Vsc2U8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBqb2IgPSBJTUJfU1VCTUlUX0pPQl9OT0NIRUNLKG1iX21ncik7PGJyPg0KLSNlbmRp Zjxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgICogSWYgc3VibWl0IHJldHVybnMgYSBwcm9jZXNzZWQgam9iIHRoZW4gaGFuZGxlIGl0 LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIGJlZm9yZSBzdWJtaXR0aW5nIHN1YnNl cXVlbnQgam9iczxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqLzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGlmIChqb2IpPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgcHJvY2Vzc2VkX2pvYnMgKz0gaGFuZGxlX2NvbXBsZXRlZF9qb2JzKHFwLCBtYl9t Z3IsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgam9iLCAmYW1wO29wc1twcm9jZXNzZWRfam9ic10sPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbmJfb3Bz IC0gcHJvY2Vzc2VkX2pvYnMpOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqB9IHdoaWxlIChwcm9j ZXNzZWRfam9icyAmbHQ7IG5iX29wcyk7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoHFwLSZndDtk aWdlc3RfaWR4ID0gZGlnZXN0X2lkeDs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKHByb2Nl c3NlZF9qb2JzICZsdDsgMSk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwcm9jZXNzZWRf am9icyArPSBmbHVzaF9tYl9tZ3IocXAsIG1iX21nciw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO29wc1twcm9jZXNzZWRfam9ic10sPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbmJfb3Bz IC0gcHJvY2Vzc2VkX2pvYnMpOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gcHJvY2Vz c2VkX2pvYnM7PGJyPg0KLX08YnI+DQotI2VuZGlmPGJyPg0KwqBzdGF0aWMgaW5saW5lIGludDxi cj4NCsKgY2hlY2tfY3J5cHRvX3NnbCh1bmlvbiBydGVfY3J5cHRvX3N5bV9vZnMgc28sIGNvbnN0 IHN0cnVjdCBydGVfY3J5cHRvX3NnbCAqc2dsKTxicj4NCsKgezxicj4NCmRpZmYgLS1naXQgYS9k cml2ZXJzL2NyeXB0by9pcHNlY19tYi9wbWRfYWVzbmlfbWJfcHJpdi5oIGIvZHJpdmVycy9jcnlw dG8vaXBzZWNfbWIvcG1kX2Flc25pX21iX3ByaXYuaDxicj4NCmluZGV4IDg1OTk0ZmU1YTEuLjUx Y2ZkN2UyYWEgMTAwNjQ0PGJyPg0KLS0tIGEvZHJpdmVycy9jcnlwdG8vaXBzZWNfbWIvcG1kX2Fl c25pX21iX3ByaXYuaDxicj4NCisrKyBiL2RyaXZlcnMvY3J5cHRvL2lwc2VjX21iL3BtZF9hZXNu aV9tYl9wcml2Lmg8YnI+DQpAQCAtMTcsOSArMTcsNyBAQDxicj4NCsKgI2RlZmluZSBITUFDX0lQ QURfVkFMVUXCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoMHgzNik8YnI+DQrC oCNkZWZpbmUgSE1BQ19PUEFEX1ZBTFVFwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgKDB4NUMpPGJyPg0KPGJyPg0KLSNpZiBJTUJfVkVSU0lPTigxLCAyLCAwKSAmbHQ7IElNQl9W RVJTSU9OX05VTTxicj4NCsKgI2RlZmluZSBNQVhfTlVNX1NFR1MgMTY8YnI+DQotI2VuZGlmPGJy Pg0KPGJyPg0KwqBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfY2FwYWJpbGl0aWVz IGFlc25pX21iX2NhcGFiaWxpdGllc1tdID0gezxicj4NCsKgIMKgIMKgIMKgIHvCoCDCoCDCoCDC oC8qIE1ENSBITUFDICovPGJyPg0KQEAgLTU2NywxMyArNTY1LDggQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBydGVfY3J5cHRvZGV2X2NhcGFiaWxpdGllcyBhZXNuaV9tYl9jYXBhYmlsaXRpZXNbXSA9 IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9 LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC5k aWdlc3Rfc2l6ZSA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAubWluID0gNCw8YnI+DQotI2lmIElNQl9WRVJTSU9OKDEs IDIsIDApICZsdDsgSU1CX1ZFUlNJT05fTlVNPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLm1heCA9IDE2LDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC5p bmNyZW1lbnQgPSA0PGJyPg0KLSNlbHNlPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLm1heCA9IDQsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLmluY3Jl bWVudCA9IDA8YnI+DQotI2VuZGlmPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgfSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAuaXZfc2l6ZSA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAubWluID0gMTYsPGJyPg0KQEAg LTczMCw5ICs3MjMsNyBAQCBzdHJ1Y3QgYWVzbmlfbWJfcXBfZGF0YSB7PGJyPg0KwqAgwqAgwqAg wqAgwqAqIGJ5IHRoZSBkcml2ZXIgd2hlbiB2ZXJpZnlpbmcgYSBkaWdlc3QgcHJvdmlkZWQ8YnI+ DQrCoCDCoCDCoCDCoCDCoCogYnkgdGhlIHVzZXIgKHVzaW5nIGF1dGhlbnRpY2F0aW9uIHZlcmlm eSBvcGVyYXRpb24pPGJyPg0KwqAgwqAgwqAgwqAgwqAqLzxicj4NCi0jaWYgSU1CX1ZFUlNJT04o MSwgMiwgMCkgJmx0OyBJTUJfVkVSU0lPTl9OVU08YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgSU1C X1NHTF9JT1Ygc2dsX3NlZ3NbTUFYX05VTV9TRUdTXTs8YnI+DQotI2VuZGlmPGJyPg0KwqAgwqAg wqAgwqAgdW5pb24gezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0cnVjdCBnY21fY29u dGV4dF9kYXRhIGdjbV9zZ2xfY3R4Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN0cnVj dCBjaGFjaGEyMF9wb2x5MTMwNV9jb250ZXh0X2RhdGEgY2hhY2hhX3NnbF9jdHg7PGJyPg0KLS0g PGJyPg0KMi4yNS4xPGJyPg0KPGJyPg0KPC9ibG9ja3F1b3RlPjwvZGl2PjxiciBjbGVhcj0iYWxs Ij48ZGl2Pjxicj48L2Rpdj48L2Rpdj4NCg== --0000000000002db3e1061251140c--