Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 Aug 2023 11:15:37 +0300
From:      Dmitry Chagin <dchagin@freebsd.org>
To:        Doug Moore <dougm@freebsd.org>
Cc:        dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org,  src-committers@freebsd.org
Subject:   Re: git: 1a7fcf6d51eb - main - vm_phys_enqueue_contig: handle npages==0
Message-ID:  <CAC0jpUCEyN0STBvuqv2kcvV8NY04RXGdszEf2MS6pJKC3bf8Kw@mail.gmail.com>
In-Reply-To: <202308020314.3723ETgj027830@gitrepo.freebsd.org>
References:  <202308020314.3723ETgj027830@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
--000000000000675be50601ec45f2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi,

With this change, I got a panic:
vm_phys_enq_range: page 0xfffffe0000000000 and pages 0 are misaligned

=D0=A1=D1=80, 2 =D0=B0=D0=B2=D0=B3. 2023 =D0=B3. =D0=B2 06:22, Doug Moore <=
dougm@freebsd.org>:

> The branch main has been updated by dougm:
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=3D1a7fcf6d51eb67ee3e05fdbb806f7e6=
8f9f53c9c
>
> commit 1a7fcf6d51eb67ee3e05fdbb806f7e68f9f53c9c
> Author:     Doug Moore <dougm@FreeBSD.org>
> AuthorDate: 2023-08-02 03:12:00 +0000
> Commit:     Doug Moore <dougm@FreeBSD.org>
> CommitDate: 2023-08-02 03:12:00 +0000
>
>     vm_phys_enqueue_contig: handle npages=3D=3D0
>
>     By letting vm_phys_enqueue_contig handle the case when npages =3D=3D =
0,
>     the callers can stop checking it, and the compiler can stop
>     zero-checking with every call to ffs(). Letting vm_phys_enqueue_conti=
g
>     call vm_phys_enqueue_contig for part of its work also saves a few
>     bytes.
>
>     The amd64 object code shrinks by 80 bytes.
>
>     Reviewed by:    kib
>     Differential Revision:  https://reviews.freebsd.org/D41154
> ---
>  sys/vm/vm_phys.c | 74
> +++++++++++++++++++++++++++-----------------------------
>  1 file changed, 35 insertions(+), 39 deletions(-)
>
> diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c
> index 28f12231e01c..b2084bdef4e1 100644
> --- a/sys/vm/vm_phys.c
> +++ b/sys/vm/vm_phys.c
> @@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$");
>
>  _Static_assert(sizeof(long) * NBBY >=3D VM_PHYSSEG_MAX,
>      "Too many physsegs.");
> +_Static_assert(sizeof(long long) >=3D sizeof(vm_paddr_t),
> +    "vm_paddr_t too big for ffsll, flsll.");
>
>  #ifdef NUMA
>  struct mem_affinity __read_mostly *mem_affinity;
> @@ -690,18 +692,16 @@ vm_phys_split_pages(vm_page_t m, int oind, struct
> vm_freelist *fl, int order,
>   *
>   * The physical page m's buddy must not be free.
>   */
> -static void
> +static vm_page_t
>  vm_phys_enq_range(vm_page_t m, u_int npages, struct vm_freelist *fl, int
> tail)
>  {
> -       u_int n;
>         int order;
>
> -       KASSERT(npages > 0, ("vm_phys_enq_range: npages is 0"));
>         KASSERT(((VM_PAGE_TO_PHYS(m) + npages * PAGE_SIZE) &
>             ((PAGE_SIZE << (fls(npages) - 1)) - 1)) =3D=3D 0,
>             ("vm_phys_enq_range: page %p and npages %u are misaligned",
>             m, npages));
> -       do {
> +       while (npages > 0) {
>                 KASSERT(m->order =3D=3D VM_NFREEORDER,
>                     ("vm_phys_enq_range: page %p has unexpected order %d"=
,
>                     m, m->order));
> @@ -709,10 +709,10 @@ vm_phys_enq_range(vm_page_t m, u_int npages, struct
> vm_freelist *fl, int tail)
>                 KASSERT(order < VM_NFREEORDER,
>                     ("vm_phys_enq_range: order %d is out of range",
> order));
>                 vm_freelist_add(fl, m, order, tail);
> -               n =3D 1 << order;
> -               m +=3D n;
> -               npages -=3D n;
> -       } while (npages > 0);
> +               m +=3D 1 << order;
> +               npages -=3D 1 << order;
> +       }
> +       return (m);
>  }
>
>  /*
> @@ -744,7 +744,7 @@ vm_phys_alloc_npages(int domain, int pool, int npages=
,
> vm_page_t ma[])
>  {
>         struct vm_freelist *alt, *fl;
>         vm_page_t m;
> -       int avail, end, flind, freelist, i, need, oind, pind;
> +       int avail, end, flind, freelist, i, oind, pind;
>
>         KASSERT(domain >=3D 0 && domain < vm_ndomains,
>             ("vm_phys_alloc_npages: domain %d is out of range", domain));
> @@ -762,20 +762,18 @@ vm_phys_alloc_npages(int domain, int pool, int
> npages, vm_page_t ma[])
>                 for (oind =3D 0; oind < VM_NFREEORDER; oind++) {
>                         while ((m =3D TAILQ_FIRST(&fl[oind].pl)) !=3D NUL=
L) {
>                                 vm_freelist_rem(fl, m, oind);
> -                               avail =3D 1 << oind;
> -                               need =3D imin(npages - i, avail);
> -                               for (end =3D i + need; i < end;)
> +                               avail =3D i + (1 << oind);
> +                               end =3D imin(npages, avail);
> +                               while (i < end)
>                                         ma[i++] =3D m++;
> -                               if (need < avail) {
> +                               if (i =3D=3D npages) {
>                                         /*
> -                                        * Return excess pages to fl.  It=
s
> -                                        * order [0, oind) queues are
> empty.
> +                                        * Return excess pages to fl.  It=
s
> order
> +                                        * [0, oind) queues are empty.
>                                          */
> -                                       vm_phys_enq_range(m, avail - need=
,
> fl,
> -                                           1);
> -                                       return (npages);
> -                               } else if (i =3D=3D npages)
> +                                       vm_phys_enq_range(m, avail - i,
> fl, 1);
>                                         return (npages);
> +                               }
>                         }
>                 }
>                 for (oind =3D VM_NFREEORDER - 1; oind >=3D 0; oind--) {
> @@ -785,21 +783,20 @@ vm_phys_alloc_npages(int domain, int pool, int
> npages, vm_page_t ma[])
>                                     NULL) {
>                                         vm_freelist_rem(alt, m, oind);
>                                         vm_phys_set_pool(pool, m, oind);
> -                                       avail =3D 1 << oind;
> -                                       need =3D imin(npages - i, avail);
> -                                       for (end =3D i + need; i < end;)
> +                                       avail =3D i + (1 << oind);
> +                                       end =3D imin(npages, avail);
> +                                       while (i < end)
>                                                 ma[i++] =3D m++;
> -                                       if (need < avail) {
> +                                       if (i =3D=3D npages) {
>                                                 /*
>                                                  * Return excess pages to
> fl.
>                                                  * Its order [0, oind)
> queues
>                                                  * are empty.
>                                                  */
> -                                               vm_phys_enq_range(m, avai=
l
> -
> -                                                   need, fl, 1);
> -                                               return (npages);
> -                                       } else if (i =3D=3D npages)
> +                                               vm_phys_enq_range(m, avai=
l
> - i,
> +                                                   fl, 1);
>                                                 return (npages);
> +                                       }
>                                 }
>                         }
>                 }
> @@ -1146,7 +1143,7 @@ max_order(vm_page_t m)
>          * because the size of a physical address exceeds the size of
>          * a long.
>          */
> -       return (min(ffsl(VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT) - 1,
> +       return (min(ffsll(VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT) - 1,
>             VM_NFREEORDER - 1));
>  }
>
> @@ -1162,6 +1159,7 @@ vm_phys_enqueue_contig(vm_page_t m, u_long npages)
>         struct vm_freelist *fl;
>         struct vm_phys_seg *seg;
>         vm_page_t m_end;
> +       vm_paddr_t diff, lo;
>         int order;
>
>         /*
> @@ -1173,15 +1171,15 @@ vm_phys_enqueue_contig(vm_page_t m, u_long npages=
)
>         fl =3D (*seg->free_queues)[m->pool];
>         m_end =3D m + npages;
>         /* Free blocks of increasing size. */
> -       while ((order =3D max_order(m)) < VM_NFREEORDER - 1 &&
> -           m + (1 << order) <=3D m_end) {
> -               KASSERT(seg =3D=3D &vm_phys_segs[m->segind],
> -                   ("%s: page range [%p,%p) spans multiple segments",
> -                   __func__, m_end - npages, m));
> -               vm_freelist_add(fl, m, order, 1);
> -               m +=3D 1 << order;
> +       lo =3D VM_PAGE_TO_PHYS(m) >> PAGE_SHIFT;
> +       if (m < m_end &&
> +           (diff =3D lo ^ (lo + npages - 1)) !=3D 0) {
> +               order =3D min(flsll(diff) - 1, VM_NFREEORDER - 1);
> +               m =3D vm_phys_enq_range(m, roundup2(-lo, 1 << order), fl,=
 1);
>         }
> +
>         /* Free blocks of maximum size. */
> +       order =3D VM_NFREEORDER - 1;
>         while (m + (1 << order) <=3D m_end) {
>                 KASSERT(seg =3D=3D &vm_phys_segs[m->segind],
>                     ("%s: page range [%p,%p) spans multiple segments",
> @@ -1560,10 +1558,8 @@ vm_phys_alloc_contig(int domain, u_long npages,
> vm_paddr_t low, vm_paddr_t high,
>                         vm_phys_set_pool(VM_FREEPOOL_DEFAULT, m, oind);
>         }
>         /* Return excess pages to the free lists. */
> -       if (&m_run[npages] < m) {
> -               fl =3D (*queues)[VM_FREEPOOL_DEFAULT];
> -               vm_phys_enq_range(&m_run[npages], m - &m_run[npages], fl,
> 0);
> -       }
> +       fl =3D (*queues)[VM_FREEPOOL_DEFAULT];
> +       vm_phys_enq_range(&m_run[npages], m - &m_run[npages], fl, 0);
>         return (m_run);
>  }
>
>

--000000000000675be50601ec45f2
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

PGRpdj48YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPkhpLDwvZGl2PjxkaXYgZGlyPSJhdXRvIj48
YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPjxkaXYgZGlyPSJhdXRvIj5XaXRoIHRoaXMgY2hhbmdl
LCBJIGdvdCBhIHBhbmljOjwvZGl2PjxkaXYgZGlyPSJhdXRvIj52bV9waHlzX2VucV9yYW5nZTog
cGFnZSAweGZmZmZmZTAwMDAwMDAwMDAgYW5kIHBhZ2VzIDAgYXJlIG1pc2FsaWduZWQ8L2Rpdj48
L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIiBkaXI9ImF1
dG8iPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj7QodGALCAyINCw0LLQsy4gMjAy
M8Kg0LMuINCyIDA2OjIyLCBEb3VnIE1vb3JlICZsdDs8YSBocmVmPSJtYWlsdG86ZG91Z21AZnJl
ZWJzZC5vcmciPmRvdWdtQGZyZWVic2Qub3JnPC9hPiZndDs6PGJyPjwvZGl2PjxibG9ja3F1b3Rl
IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0
OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPlRoZSBicmFuY2ggbWFpbiBoYXMgYmVl
biB1cGRhdGVkIGJ5IGRvdWdtOjxicj4NCjxicj4NClVSTDogPGEgaHJlZj0iaHR0cHM6Ly9jZ2l0
LkZyZWVCU0Qub3JnL3NyYy9jb21taXQvP2lkPTFhN2ZjZjZkNTFlYjY3ZWUzZTA1ZmRiYjgwNmY3
ZTY4ZjlmNTNjOWMiIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vY2dp
dC5GcmVlQlNELm9yZy9zcmMvY29tbWl0Lz9pZD0xYTdmY2Y2ZDUxZWI2N2VlM2UwNWZkYmI4MDZm
N2U2OGY5ZjUzYzljPC9hPjxicj4NCjxicj4NCmNvbW1pdCAxYTdmY2Y2ZDUxZWI2N2VlM2UwNWZk
YmI4MDZmN2U2OGY5ZjUzYzljPGJyPg0KQXV0aG9yOsKgIMKgIMKgRG91ZyBNb29yZSAmbHQ7ZG91
Z21ARnJlZUJTRC5vcmcmZ3Q7PGJyPg0KQXV0aG9yRGF0ZTogMjAyMy0wOC0wMiAwMzoxMjowMCAr
MDAwMDxicj4NCkNvbW1pdDrCoCDCoCDCoERvdWcgTW9vcmUgJmx0O2RvdWdtQEZyZWVCU0Qub3Jn
Jmd0Ozxicj4NCkNvbW1pdERhdGU6IDIwMjMtMDgtMDIgMDM6MTI6MDAgKzAwMDA8YnI+DQo8YnI+
DQrCoCDCoCB2bV9waHlzX2VucXVldWVfY29udGlnOiBoYW5kbGUgbnBhZ2VzPT0wPGJyPg0KPGJy
Pg0KwqAgwqAgQnkgbGV0dGluZyB2bV9waHlzX2VucXVldWVfY29udGlnIGhhbmRsZSB0aGUgY2Fz
ZSB3aGVuIG5wYWdlcyA9PSAwLDxicj4NCsKgIMKgIHRoZSBjYWxsZXJzIGNhbiBzdG9wIGNoZWNr
aW5nIGl0LCBhbmQgdGhlIGNvbXBpbGVyIGNhbiBzdG9wPGJyPg0KwqAgwqAgemVyby1jaGVja2lu
ZyB3aXRoIGV2ZXJ5IGNhbGwgdG8gZmZzKCkuIExldHRpbmcgdm1fcGh5c19lbnF1ZXVlX2NvbnRp
Zzxicj4NCsKgIMKgIGNhbGwgdm1fcGh5c19lbnF1ZXVlX2NvbnRpZyBmb3IgcGFydCBvZiBpdHMg
d29yayBhbHNvIHNhdmVzIGEgZmV3PGJyPg0KwqAgwqAgYnl0ZXMuPGJyPg0KPGJyPg0KwqAgwqAg
VGhlIGFtZDY0IG9iamVjdCBjb2RlIHNocmlua3MgYnkgODAgYnl0ZXMuPGJyPg0KPGJyPg0KwqAg
wqAgUmV2aWV3ZWQgYnk6wqAgwqAga2liPGJyPg0KwqAgwqAgRGlmZmVyZW50aWFsIFJldmlzaW9u
OsKgIDxhIGhyZWY9Imh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9ENDExNTQiIHJlbD0ibm9y
ZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9ENDEx
NTQ8L2E+PGJyPg0KLS0tPGJyPg0KwqBzeXMvdm0vdm1fcGh5cy5jIHwgNzQgKysrKysrKysrKysr
KysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQrCoDEgZmls
ZSBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCAzOSBkZWxldGlvbnMoLSk8YnI+DQo8YnI+DQpk
aWZmIC0tZ2l0IGEvc3lzL3ZtL3ZtX3BoeXMuYyBiL3N5cy92bS92bV9waHlzLmM8YnI+DQppbmRl
eCAyOGYxMjIzMWUwMWMuLmIyMDg0YmRlZjRlMSAxMDA2NDQ8YnI+DQotLS0gYS9zeXMvdm0vdm1f
cGh5cy5jPGJyPg0KKysrIGIvc3lzL3ZtL3ZtX3BoeXMuYzxicj4NCkBAIC03Miw2ICs3Miw4IEBA
IF9fRkJTRElEKCZxdW90OyRGcmVlQlNEJCZxdW90Oyk7PGJyPg0KPGJyPg0KwqBfU3RhdGljX2Fz
c2VydChzaXplb2YobG9uZykgKiBOQkJZICZndDs9IFZNX1BIWVNTRUdfTUFYLDxicj4NCsKgIMKg
IMKgJnF1b3Q7VG9vIG1hbnkgcGh5c3NlZ3MuJnF1b3Q7KTs8YnI+DQorX1N0YXRpY19hc3NlcnQo
c2l6ZW9mKGxvbmcgbG9uZykgJmd0Oz0gc2l6ZW9mKHZtX3BhZGRyX3QpLDxicj4NCivCoCDCoCAm
cXVvdDt2bV9wYWRkcl90IHRvbyBiaWcgZm9yIGZmc2xsLCBmbHNsbC4mcXVvdDspOzxicj4NCjxi
cj4NCsKgI2lmZGVmIE5VTUE8YnI+DQrCoHN0cnVjdCBtZW1fYWZmaW5pdHkgX19yZWFkX21vc3Rs
eSAqbWVtX2FmZmluaXR5Ozxicj4NCkBAIC02OTAsMTggKzY5MiwxNiBAQCB2bV9waHlzX3NwbGl0
X3BhZ2VzKHZtX3BhZ2VfdCBtLCBpbnQgb2luZCwgc3RydWN0IHZtX2ZyZWVsaXN0ICpmbCwgaW50
IG9yZGVyLDxicj4NCsKgICo8YnI+DQrCoCAqIFRoZSBwaHlzaWNhbCBwYWdlIG0mIzM5O3MgYnVk
ZHkgbXVzdCBub3QgYmUgZnJlZS48YnI+DQrCoCAqLzxicj4NCi1zdGF0aWMgdm9pZDxicj4NCitz
dGF0aWMgdm1fcGFnZV90PGJyPg0KwqB2bV9waHlzX2VucV9yYW5nZSh2bV9wYWdlX3QgbSwgdV9p
bnQgbnBhZ2VzLCBzdHJ1Y3Qgdm1fZnJlZWxpc3QgKmZsLCBpbnQgdGFpbCk8YnI+DQrCoHs8YnI+
DQotwqAgwqAgwqAgwqB1X2ludCBuOzxicj4NCsKgIMKgIMKgIMKgIGludCBvcmRlcjs8YnI+DQo8
YnI+DQotwqAgwqAgwqAgwqBLQVNTRVJUKG5wYWdlcyAmZ3Q7IDAsICgmcXVvdDt2bV9waHlzX2Vu
cV9yYW5nZTogbnBhZ2VzIGlzIDAmcXVvdDspKTs8YnI+DQrCoCDCoCDCoCDCoCBLQVNTRVJUKCgo
Vk1fUEFHRV9UT19QSFlTKG0pICsgbnBhZ2VzICogUEFHRV9TSVpFKSAmYW1wOzxicj4NCsKgIMKg
IMKgIMKgIMKgIMKgICgoUEFHRV9TSVpFICZsdDsmbHQ7IChmbHMobnBhZ2VzKSAtIDEpKSAtIDEp
KSA9PSAwLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgICgmcXVvdDt2bV9waHlzX2VucV9yYW5nZTog
cGFnZSAlcCBhbmQgbnBhZ2VzICV1IGFyZSBtaXNhbGlnbmVkJnF1b3Q7LDxicj4NCsKgIMKgIMKg
IMKgIMKgIMKgIG0sIG5wYWdlcykpOzxicj4NCi3CoCDCoCDCoCDCoGRvIHs8YnI+DQorwqAgwqAg
wqAgwqB3aGlsZSAobnBhZ2VzICZndDsgMCkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IEtBU1NFUlQobS0mZ3Q7b3JkZXIgPT0gVk1fTkZSRUVPUkRFUiw8YnI+DQrCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCAoJnF1b3Q7dm1fcGh5c19lbnFfcmFuZ2U6IHBhZ2UgJXAgaGFzIHVu
ZXhwZWN0ZWQgb3JkZXIgJWQmcXVvdDssPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgbSwgbS0mZ3Q7b3JkZXIpKTs8YnI+DQpAQCAtNzA5LDEwICs3MDksMTAgQEAgdm1fcGh5c19l
bnFfcmFuZ2Uodm1fcGFnZV90IG0sIHVfaW50IG5wYWdlcywgc3RydWN0IHZtX2ZyZWVsaXN0ICpm
bCwgaW50IHRhaWwpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgS0FTU0VSVChvcmRlciAm
bHQ7IFZNX05GUkVFT1JERVIsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKCZx
dW90O3ZtX3BoeXNfZW5xX3JhbmdlOiBvcmRlciAlZCBpcyBvdXQgb2YgcmFuZ2UmcXVvdDssIG9y
ZGVyKSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdm1fZnJlZWxpc3RfYWRkKGZsLCBt
LCBvcmRlciwgdGFpbCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbiA9IDEgJmx0OyZs
dDsgb3JkZXI7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbSArPSBuOzxicj4NCi3CoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoG5wYWdlcyAtPSBuOzxicj4NCi3CoCDCoCDCoCDCoH0gd2hpbGUg
KG5wYWdlcyAmZ3Q7IDApOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG0gKz0gMSAmbHQ7
Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBucGFnZXMgLT0gMSAmbHQ7
Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKgIMKgIMKgcmV0dXJuICht
KTs8YnI+DQrCoH08YnI+DQo8YnI+DQrCoC8qPGJyPg0KQEAgLTc0NCw3ICs3NDQsNyBAQCB2bV9w
aHlzX2FsbG9jX25wYWdlcyhpbnQgZG9tYWluLCBpbnQgcG9vbCwgaW50IG5wYWdlcywgdm1fcGFn
ZV90IG1hW10pPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHZtX2ZyZWVsaXN0ICph
bHQsICpmbDs8YnI+DQrCoCDCoCDCoCDCoCB2bV9wYWdlX3QgbTs8YnI+DQotwqAgwqAgwqAgwqBp
bnQgYXZhaWwsIGVuZCwgZmxpbmQsIGZyZWVsaXN0LCBpLCBuZWVkLCBvaW5kLCBwaW5kOzxicj4N
CivCoCDCoCDCoCDCoGludCBhdmFpbCwgZW5kLCBmbGluZCwgZnJlZWxpc3QsIGksIG9pbmQsIHBp
bmQ7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgS0FTU0VSVChkb21haW4gJmd0Oz0gMCAmYW1wOyZh
bXA7IGRvbWFpbiAmbHQ7IHZtX25kb21haW5zLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgICgmcXVv
dDt2bV9waHlzX2FsbG9jX25wYWdlczogZG9tYWluICVkIGlzIG91dCBvZiByYW5nZSZxdW90Oywg
ZG9tYWluKSk7PGJyPg0KQEAgLTc2MiwyMCArNzYyLDE4IEBAIHZtX3BoeXNfYWxsb2NfbnBhZ2Vz
KGludCBkb21haW4sIGludCBwb29sLCBpbnQgbnBhZ2VzLCB2bV9wYWdlX3QgbWFbXSk8YnI+DQrC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKG9pbmQgPSAwOyBvaW5kICZsdDsgVk1fTkZSRUVP
UkRFUjsgb2luZCsrKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
d2hpbGUgKChtID0gVEFJTFFfRklSU1QoJmFtcDtmbFtvaW5kXS5wbCkpICE9IE5VTEwpIHs8YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2bV9mcmVl
bGlzdF9yZW0oZmwsIG0sIG9pbmQpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoGF2YWlsID0gMSAmbHQ7Jmx0OyBvaW5kOzxicj4NCi3CoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQgPSBpbWluKG5wYWdl
cyAtIGksIGF2YWlsKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqBmb3IgKGVuZCA9IGkgKyBuZWVkOyBpICZsdDsgZW5kOyk8YnI+DQorwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhdmFpbCA9IGkgKyAoMSAm
bHQ7Jmx0OyBvaW5kKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqBlbmQgPSBpbWluKG5wYWdlcywgYXZhaWwpOzxicj4NCivCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHdoaWxlIChpICZsdDsgZW5kKTxicj4N
CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIG1hW2krK10gPSBtKys7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgaWYgKG5lZWQgJmx0OyBhdmFpbCkgezxicj4NCivCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChpID09IG5wYWdlcykgezxicj4N
CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIC8qPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgICogUmV0dXJuIGV4Y2VzcyBwYWdlcyB0byBmbC7CoCBJdHM8YnI+DQot
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgKiBvcmRlciBbMCwgb2luZCkgcXVldWVzIGFyZSBlbXB0eS48YnI+DQorwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKiBSZXR1cm4g
ZXhjZXNzIHBhZ2VzIHRvIGZsLsKgIEl0cyBvcmRlcjxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIFswLCBvaW5kKSBxdWV1
ZXMgYXJlIGVtcHR5Ljxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKi88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZShtLCBh
dmFpbCAtIG5lZWQsIGZsLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDEpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiAobnBhZ2Vz
KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9
IGVsc2UgaWYgKGkgPT0gbnBhZ2VzKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHZtX3BoeXNfZW5xX3JhbmdlKG0sIGF2YWls
IC0gaSwgZmwsIDEpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiAobnBhZ2VzKTs8YnI+DQorwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgKG9pbmQgPSBWTV9ORlJFRU9SREVSIC0gMTsg
b2luZCAmZ3Q7PSAwOyBvaW5kLS0pIHs8YnI+DQpAQCAtNzg1LDIxICs3ODMsMjAgQEAgdm1fcGh5
c19hbGxvY19ucGFnZXMoaW50IGRvbWFpbiwgaW50IHBvb2wsIGludCBucGFnZXMsIHZtX3BhZ2Vf
dCBtYVtdKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIE5VTEwpIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB2bV9mcmVlbGlzdF9yZW0oYWx0LCBtLCBvaW5kKTs8
YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCB2bV9waHlzX3NldF9wb29sKHBvb2wsIG0sIG9pbmQpOzxicj4NCi3CoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGF2YWlsID0g
MSAmbHQ7Jmx0OyBvaW5kOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQgPSBpbWluKG5wYWdlcyAtIGksIGF2YWlsKTs8
YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqBmb3IgKGVuZCA9IGkgKyBuZWVkOyBpICZsdDsgZW5kOyk8YnI+DQorwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhdmFpbCA9
IGkgKyAoMSAmbHQ7Jmx0OyBvaW5kKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbmQgPSBpbWluKG5wYWdlcywgYXZhaWwp
Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoHdoaWxlIChpICZsdDsgZW5kKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1hW2krK10g
PSBtKys7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgaWYgKG5lZWQgJmx0OyBhdmFpbCkgezxicj4NCivCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmIChpID09IG5w
YWdlcykgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIFJl
dHVybiBleGNlc3MgcGFnZXMgdG8gZmwuPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIEl0cyBvcmRl
ciBbMCwgb2luZCkgcXVldWVzPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIGFyZSBlbXB0eS48YnI+
DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdm1fcGh5c19lbnFfcmFu
Z2UobSwgYXZhaWwgLTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5lZWQsIGZsLCAxKTs8YnI+
DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gKG5wYWdlcyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfSBlbHNlIGlmIChpID09
IG5wYWdlcyk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZShtLCBhdmFpbCAt
IGksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZmwsIDEpOzxicj4NCsKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IHJldHVybiAobnBhZ2VzKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KQEAgLTExNDYs
NyArMTE0Myw3IEBAIG1heF9vcmRlcih2bV9wYWdlX3QgbSk8YnI+DQrCoCDCoCDCoCDCoCDCoCog
YmVjYXVzZSB0aGUgc2l6ZSBvZiBhIHBoeXNpY2FsIGFkZHJlc3MgZXhjZWVkcyB0aGUgc2l6ZSBv
Zjxicj4NCsKgIMKgIMKgIMKgIMKgKiBhIGxvbmcuPGJyPg0KwqAgwqAgwqAgwqAgwqAqLzxicj4N
Ci3CoCDCoCDCoCDCoHJldHVybiAobWluKGZmc2woVk1fUEFHRV9UT19QSFlTKG0pICZndDsmZ3Q7
IFBBR0VfU0hJRlQpIC0gMSw8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gKG1pbihmZnNsbChWTV9Q
QUdFX1RPX1BIWVMobSkgJmd0OyZndDsgUEFHRV9TSElGVCkgLSAxLDxicj4NCsKgIMKgIMKgIMKg
IMKgIMKgIFZNX05GUkVFT1JERVIgLSAxKSk7PGJyPg0KwqB9PGJyPg0KPGJyPg0KQEAgLTExNjIs
NiArMTE1OSw3IEBAIHZtX3BoeXNfZW5xdWV1ZV9jb250aWcodm1fcGFnZV90IG0sIHVfbG9uZyBu
cGFnZXMpPGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHZtX2ZyZWVsaXN0ICpmbDs8YnI+DQrCoCDC
oCDCoCDCoCBzdHJ1Y3Qgdm1fcGh5c19zZWcgKnNlZzs8YnI+DQrCoCDCoCDCoCDCoCB2bV9wYWdl
X3QgbV9lbmQ7PGJyPg0KK8KgIMKgIMKgIMKgdm1fcGFkZHJfdCBkaWZmLCBsbzs8YnI+DQrCoCDC
oCDCoCDCoCBpbnQgb3JkZXI7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgLyo8YnI+DQpAQCAtMTE3
MywxNSArMTE3MSwxNSBAQCB2bV9waHlzX2VucXVldWVfY29udGlnKHZtX3BhZ2VfdCBtLCB1X2xv
bmcgbnBhZ2VzKTxicj4NCsKgIMKgIMKgIMKgIGZsID0gKCpzZWctJmd0O2ZyZWVfcXVldWVzKVtt
LSZndDtwb29sXTs8YnI+DQrCoCDCoCDCoCDCoCBtX2VuZCA9IG0gKyBucGFnZXM7PGJyPg0KwqAg
wqAgwqAgwqAgLyogRnJlZSBibG9ja3Mgb2YgaW5jcmVhc2luZyBzaXplLiAqLzxicj4NCi3CoCDC
oCDCoCDCoHdoaWxlICgob3JkZXIgPSBtYXhfb3JkZXIobSkpICZsdDsgVk1fTkZSRUVPUkRFUiAt
IDEgJmFtcDsmYW1wOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoG0gKyAoMSAmbHQ7Jmx0OyBvcmRl
cikgJmx0Oz0gbV9lbmQpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBLQVNTRVJUKHNl
ZyA9PSAmYW1wO3ZtX3BoeXNfc2Vnc1ttLSZndDtzZWdpbmRdLDxicj4NCi3CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCgmcXVvdDslczogcGFnZSByYW5nZSBbJXAsJXApIHNwYW5zIG11bHRp
cGxlIHNlZ21lbnRzJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoF9f
ZnVuY19fLCBtX2VuZCAtIG5wYWdlcywgbSkpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oHZtX2ZyZWVsaXN0X2FkZChmbCwgbSwgb3JkZXIsIDEpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoG0gKz0gMSAmbHQ7Jmx0OyBvcmRlcjs8YnI+DQorwqAgwqAgwqAgwqBsbyA9IFZNX1BB
R0VfVE9fUEhZUyhtKSAmZ3Q7Jmd0OyBQQUdFX1NISUZUOzxicj4NCivCoCDCoCDCoCDCoGlmICht
ICZsdDsgbV9lbmQgJmFtcDsmYW1wOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoChkaWZmID0gbG8g
XiAobG8gKyBucGFnZXMgLSAxKSkgIT0gMCkgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oG9yZGVyID0gbWluKGZsc2xsKGRpZmYpIC0gMSwgVk1fTkZSRUVPUkRFUiAtIDEpOzxicj4NCivC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoG0gPSB2bV9waHlzX2VucV9yYW5nZShtLCByb3VuZHVwMigt
bG8sIDEgJmx0OyZsdDsgb3JkZXIpLCBmbCwgMSk7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCis8
YnI+DQrCoCDCoCDCoCDCoCAvKiBGcmVlIGJsb2NrcyBvZiBtYXhpbXVtIHNpemUuICovPGJyPg0K
K8KgIMKgIMKgIMKgb3JkZXIgPSBWTV9ORlJFRU9SREVSIC0gMTs8YnI+DQrCoCDCoCDCoCDCoCB3
aGlsZSAobSArICgxICZsdDsmbHQ7IG9yZGVyKSAmbHQ7PSBtX2VuZCkgezxicj4NCsKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIEtBU1NFUlQoc2VnID09ICZhbXA7dm1fcGh5c19zZWdzW20tJmd0O3Nl
Z2luZF0sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKCZxdW90OyVzOiBwYWdl
IHJhbmdlIFslcCwlcCkgc3BhbnMgbXVsdGlwbGUgc2VnbWVudHMmcXVvdDssPGJyPg0KQEAgLTE1
NjAsMTAgKzE1NTgsOCBAQCB2bV9waHlzX2FsbG9jX2NvbnRpZyhpbnQgZG9tYWluLCB1X2xvbmcg
bnBhZ2VzLCB2bV9wYWRkcl90IGxvdywgdm1fcGFkZHJfdCBoaWdoLDxicj4NCsKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHZtX3BoeXNfc2V0X3Bvb2woVk1fRlJFRVBPT0xfREVG
QVVMVCwgbSwgb2luZCk7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIC8qIFJl
dHVybiBleGNlc3MgcGFnZXMgdG8gdGhlIGZyZWUgbGlzdHMuICovPGJyPg0KLcKgIMKgIMKgIMKg
aWYgKCZhbXA7bV9ydW5bbnBhZ2VzXSAmbHQ7IG0pIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqBmbCA9ICgqcXVldWVzKVtWTV9GUkVFUE9PTF9ERUZBVUxUXTs8YnI+DQotwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqB2bV9waHlzX2VucV9yYW5nZSgmYW1wO21fcnVuW25wYWdlc10sIG0gLSAm
YW1wO21fcnVuW25wYWdlc10sIGZsLCAwKTs8YnI+DQotwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKg
IMKgIMKgZmwgPSAoKnF1ZXVlcylbVk1fRlJFRVBPT0xfREVGQVVMVF07PGJyPg0KK8KgIMKgIMKg
IMKgdm1fcGh5c19lbnFfcmFuZ2UoJmFtcDttX3J1bltucGFnZXNdLCBtIC0gJmFtcDttX3J1bltu
cGFnZXNdLCBmbCwgMCk7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIChtX3J1bik7PGJyPg0KwqB9
PGJyPg0KPGJyPg0KPC9ibG9ja3F1b3RlPjwvZGl2PjwvZGl2Pg0K
--000000000000675be50601ec45f2--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAC0jpUCEyN0STBvuqv2kcvV8NY04RXGdszEf2MS6pJKC3bf8Kw>