From nobody Wed Aug 2 09:23:48 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RG6T56xRpz4qT5B; Wed, 2 Aug 2023 09:42:14 +0000 (UTC) (envelope-from tuexen@fh-muenster.de) Received: from mx-out-01.fh-muenster.de (mx-out-01.fh-muenster.de [185.149.214.63]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mx.fh-muenster.de", Issuer "GEANT OV RSA CA 4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RG64R0gYBz3wyW; Wed, 2 Aug 2023 09:24:23 +0000 (UTC) (envelope-from tuexen@fh-muenster.de) Authentication-Results: mx1.freebsd.org; none Received: from mail-director-01.fh-muenster.de (mail-director-01.fh-muenster.de [185.149.215.227]) by mx-out-01.fh-muenster.de (Postfix) with ESMTPS id 5DE1720746; Wed, 2 Aug 2023 11:23:50 +0200 (CEST) Received: from smtpclient.apple (ip4d15f6ca.dynamic.kabel-deutschland.de [77.21.246.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tuexen) by mail-director-01.fh-muenster.de (Postfix) with ESMTPSA id B4AB51A004B; Wed, 2 Aug 2023 11:23:49 +0200 (CEST) Content-Type: multipart/signed; boundary="Apple-Mail=_EE90BED6-27D5-418F-BB28-2CEC87741BBE"; protocol="application/pkcs7-signature"; micalg=sha-256 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.700.6\)) Subject: Re: git: 1a7fcf6d51eb - main - vm_phys_enqueue_contig: handle npages==0 From: tuexen@fh-muenster.de In-Reply-To: Date: Wed, 2 Aug 2023 11:23:48 +0200 Cc: Doug Moore , dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org, src-committers@freebsd.org Content-Transfer-Encoding: quoted-printable Message-Id: References: <202308020314.3723ETgj027830@gitrepo.freebsd.org> To: Dmitry Chagin X-Mailer: Apple Mail (2.3731.700.6) X-Rspamd-Queue-Id: 4RG64R0gYBz3wyW X-Spamd-Bar: ---- X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:680, ipnet:185.149.212.0/22, country:DE] --Apple-Mail=_EE90BED6-27D5-418F-BB28-2CEC87741BBE Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On 2. Aug 2023, at 10:15, Dmitry Chagin wrote: >=20 >=20 > Hi, >=20 > With this change, I got a panic: > vm_phys_enq_range: page 0xfffffe0000000000 and pages 0 are misaligned My arm64 system also panics: panic: vm_phys_enq_range: page 0xffffa000796a7000 and npages 4294443008 = are misaligned Best regards Michael >=20 > =D0=A1=D1=80, 2 =D0=B0=D0=B2=D0=B3. 2023 =D0=B3. =D0=B2 06:22, Doug = Moore : > The branch main has been updated by dougm: >=20 > URL: = https://cgit.FreeBSD.org/src/commit/?id=3D1a7fcf6d51eb67ee3e05fdbb806f7e68= f9f53c9c >=20 > commit 1a7fcf6d51eb67ee3e05fdbb806f7e68f9f53c9c > Author: Doug Moore > AuthorDate: 2023-08-02 03:12:00 +0000 > Commit: Doug Moore > CommitDate: 2023-08-02 03:12:00 +0000 >=20 > vm_phys_enqueue_contig: handle npages=3D=3D0 >=20 > 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_contig > call vm_phys_enqueue_contig for part of its work also saves a few > bytes. >=20 > The amd64 object code shrinks by 80 bytes. >=20 > Reviewed by: kib > Differential Revision: https://reviews.freebsd.org/D41154 > --- > sys/vm/vm_phys.c | 74 = +++++++++++++++++++++++++++----------------------------- > 1 file changed, 35 insertions(+), 39 deletions(-) >=20 > 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$"); >=20 > _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."); >=20 > #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; >=20 > - 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); > } >=20 > /* > @@ -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; >=20 > 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 = NULL) { > 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. = Its > - * order [0, oind) queues are = empty. > + * Return excess pages to fl. = Its 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, = avail - > - need, fl, 1); > - return (npages); > - } else if (i =3D=3D npages) > + vm_phys_enq_range(m, = avail - 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)); > } >=20 > @@ -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; >=20 > /* > @@ -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); > } >=20 --Apple-Mail=_EE90BED6-27D5-418F-BB28-2CEC87741BBE Content-Disposition: attachment; filename=smime.p7s Content-Type: application/pkcs7-signature; name=smime.p7s Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCEfMw ggUSMIID+qADAgECAgkA4wvV+K8l2YEwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAkRFMSsw KQYDVQQKDCJULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIMR8wHQYDVQQLDBZULVN5 c3RlbXMgVHJ1c3QgQ2VudGVyMSUwIwYDVQQDDBxULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAy MB4XDTE2MDIyMjEzMzgyMloXDTMxMDIyMjIzNTk1OVowgZUxCzAJBgNVBAYTAkRFMUUwQwYDVQQK EzxWZXJlaW4genVyIEZvZXJkZXJ1bmcgZWluZXMgRGV1dHNjaGVuIEZvcnNjaHVuZ3NuZXR6ZXMg ZS4gVi4xEDAOBgNVBAsTB0RGTi1QS0kxLTArBgNVBAMTJERGTi1WZXJlaW4gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMtg1/9moUHN0vqH l4pzq5lN6mc5WqFggEcVToyVsuXPztNXS43O+FZsFVV2B+pG/cgDRWM+cNSrVICxI5y+NyipCf8F XRgPxJiZN7Mg9mZ4F4fCnQ7MSjLnFp2uDo0peQcAIFTcFV9Kltd4tjTTwXS1nem/wHdN6r1ZB+Ba L2w8pQDcNb1lDY9/Mm3yWmpLYgHurDg0WUU2SQXaeMpqbVvAgWsRzNI8qIv4cRrKO+KA3Ra0Z3qL NupOkSk9s1FcragMvp0049ENF4N1xDkesJQLEvHVaY4l9Lg9K7/AjsMeO6W/VRCrKq4Xl14zzsjz 9AkH4wKGMUZrAcUQDBHHWekCAwEAAaOCAXQwggFwMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU k+PYMiba1fFKpZFK4OpL4qIMz+EwHwYDVR0jBBgwFoAUv1kgNgB5oKAia4zV8mHSuCzLgkowEgYD VR0TAQH/BAgwBgEB/wIBAjAzBgNVHSAELDAqMA8GDSsGAQQBga0hgiwBAQQwDQYLKwYBBAGBrSGC LB4wCAYGZ4EMAQICMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9wa2kwMzM2LnRlbGVzZWMuZGUv cmwvVGVsZVNlY19HbG9iYWxSb290X0NsYXNzXzIuY3JsMIGGBggrBgEFBQcBAQR6MHgwLAYIKwYB BQUHMAGGIGh0dHA6Ly9vY3NwMDMzNi50ZWxlc2VjLmRlL29jc3ByMEgGCCsGAQUFBzAChjxodHRw Oi8vcGtpMDMzNi50ZWxlc2VjLmRlL2NydC9UZWxlU2VjX0dsb2JhbFJvb3RfQ2xhc3NfMi5jZXIw DQYJKoZIhvcNAQELBQADggEBAIcL/z4Cm2XIVi3WO5qYi3FP2ropqiH5Ri71sqQPrhE4eTizDnS6 dl2e6BiClmLbTDPo3flq3zK9LExHYFV/53RrtCyD2HlrtrdNUAtmB7Xts5et6u5/MOaZ/SLick0+ hFvu+c+Z6n/XUjkurJgARH5pO7917tALOxrN5fcPImxHhPalR6D90Bo0fa3SPXez7vTXTf/D6OWS T1k+kEcQSrCFWMBvf/iu7QhCnh7U3xQuTY+8npTD5+32GPg8SecmqKc22CzeIs2LgtjZeOJVEqM7 h0S2EQvVDFKvaYwPBt/QolOLV5h7z/0HJPT8vcP9SpIClxvyt7bPZYoaorVyGTkwggWsMIIElKAD AgECAgcbY7rQHiw9MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYDVQQGEwJERTFFMEMGA1UEChM8VmVy ZWluIHp1ciBGb2VyZGVydW5nIGVpbmVzIERldXRzY2hlbiBGb3JzY2h1bmdzbmV0emVzIGUuIFYu MRAwDgYDVQQLEwdERk4tUEtJMS0wKwYDVQQDEyRERk4tVmVyZWluIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IDIwHhcNMTYwNTI0MTEzODQwWhcNMzEwMjIyMjM1OTU5WjCBjTELMAkGA1UEBhMCREUx RTBDBgNVBAoMPFZlcmVpbiB6dXIgRm9lcmRlcnVuZyBlaW5lcyBEZXV0c2NoZW4gRm9yc2NodW5n c25ldHplcyBlLiBWLjEQMA4GA1UECwwHREZOLVBLSTElMCMGA1UEAwwcREZOLVZlcmVpbiBHbG9i YWwgSXNzdWluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ07eRxH3h+Gy8Zp 1xCeOdfZojDbchwFfylfS2jxrRnWTOFrG7ELf6Gr4HuLi9gtzm6IOhDuV+UefwRRNuu6cG1joL6W LkDh0YNMZj0cZGnlm6Stcq5oOVGHecwX064vXWNxSzl660Knl5BpBb+Q/6RAcL0D57+eGIgfn5mI TQ5HjUhfZZkQ0tkqSe3BuS0dnxLLFdM/fx5ULzquk1enfnjK1UriGuXtQX1TX8izKvWKMKztFwUk P7agCwf9TRqaA1KgNpzeJIdl5Of6x5ZzJBTN0OgbaJ4YWa52fvfRCng8h0uwN89Tyjo4EPPLR22M ZD08WkVKusqAfLjz56dMTM0CAwEAAaOCAgUwggIBMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0P AQH/BAQDAgEGMCkGA1UdIAQiMCAwDQYLKwYBBAGBrSGCLB4wDwYNKwYBBAGBrSGCLAEBBDAdBgNV HQ4EFgQUazqYi/nyU4na4K2yMh4JH+iqO3QwHwYDVR0jBBgwFoAUk+PYMiba1fFKpZFK4OpL4qIM z+EwgY8GA1UdHwSBhzCBhDBAoD6gPIY6aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9v dC1nMi1jYS9wdWIvY3JsL2NhY3JsLmNybDBAoD6gPIY6aHR0cDovL2NkcDIucGNhLmRmbi5kZS9n bG9iYWwtcm9vdC1nMi1jYS9wdWIvY3JsL2NhY3JsLmNybDCB3QYIKwYBBQUHAQEEgdAwgc0wMwYI KwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NTUDBKBggrBgEF BQcwAoY+aHR0cDovL2NkcDEucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1nMi1jYS9wdWIvY2FjZXJ0 L2NhY2VydC5jcnQwSgYIKwYBBQUHMAKGPmh0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvZ2xvYmFsLXJv b3QtZzItY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQCBeEWkTqR/ DlXwCbFqPnjMaDWpHPOVnj/z+N9rOHeJLI21rT7H8pTNoAauusyosa0zCLYkhmI2THhuUPDVbmCN T1IxQ5dGdfBi5G5mUcFCMWdQ5UnnOR7Ln8qGSN4IFP8VSytmm6A4nwDO/afr0X9XLchMX9wQEZc+ lgQCXISoKTlslPwQkgZ7nu7YRrQbtQMMONncsKk/cQYLsgMHM8KNSGMlJTx6e1du94oFOO+4oK4v 9NsH1VuEGMGpuEvObJAaguS5Pfp38dIfMwK/U+d2+dwmJUFvL6Yb+qQTkPp8ftkLYF3sv8pBoGH7 EUkp2KgtdRXYShjqFu9VNCIaE40GMIIHKTCCBhGgAwIBAgIMJrRClNKRzetB0jc/MA0GCSqGSIb3 DQEBCwUAMIGNMQswCQYDVQQGEwJERTFFMEMGA1UECgw8VmVyZWluIHp1ciBGb2VyZGVydW5nIGVp bmVzIERldXRzY2hlbiBGb3JzY2h1bmdzbmV0emVzIGUuIFYuMRAwDgYDVQQLDAdERk4tUEtJMSUw IwYDVQQDDBxERk4tVmVyZWluIEdsb2JhbCBJc3N1aW5nIENBMB4XDTIyMDUzMDEzMjIxNVoXDTI1 MDUyOTEzMjIxNVowgcQxCzAJBgNVBAYTAkRFMRwwGgYDVQQIDBNOb3JkcmhlaW4tV2VzdGZhbGVu MREwDwYDVQQHDAhNdWVuc3RlcjEUMBIGA1UECgwLRkggTXVlbnN0ZXIxMjAwBgNVBAsMKUZhY2hi ZXJlaWNoIEVsZWt0cm90ZWNobmlrIHVuZCBJbmZvcm1hdGlrMQ8wDQYDVQQEDAZUdWV4ZW4xEDAO BgNVBCoMB01pY2hhZWwxFzAVBgNVBAMMDk1pY2hhZWwgVHVleGVuMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA2QZ7Uheto325SEnX2BTxBvYnz7u/BVmzxKlogaR4K0MA8ZcfNIdQkiJU efjL6imq21BSFsr/tXcODFZmPrvx9aIxjntCxmEFr7qFaw3e3mUIxJyj5n6BxjzZ/hyJte8LBDbj zj+e8WPUzXmYbSxtrh9kgw8NMx3+bo3Hslic+PkKEGx9JJp2I2TEs88xD0rHC2Ljwcfk6bS9jC+/ BAuY/TsbJoq+8d64DYSLGiIYbvMMuxM2C8BlpHLIOLx2FaH+uMqdH2dLVvCacZJ9YzHvvZY8O2nQ OBFCG1UMpX5YLHN8g/t02a+IBt+oe97JMdJ/kZsPjolI98dcRdzz0hTXZql2xvp6zlocm9iGTRcv dCSxy+0x4CIZD1EkVX9zCPGpzdTXnrU+zvnz14Uq3Wbfl3GiVgK0Avr1enfZepruAxAy7KGIm2zi /qY3XSkN8fvWJmYnomOjCRjaPtqS/azmnyeodsxlVhqQKbES65u/PbOXjOlhiYAvemS0IbK4iR76 3iSmkpwSNpJt6BCtFJN+w3Y8tztCP66KPPC1Fri1oj27KPaf04J66MkSjlQdpI7POS6lDyN7X2Hw tgZKRVA94h/JvZp4ld7mTzXTEW2tdO5azPILsL9xOYjSS5VIyUFF4MoxSbfZtXWaZFsMC1fXDNNL uRDrISotdwADuU75Fe0CAwEAAaOCAk4wggJKMD4GA1UdIAQ3MDUwDwYNKwYBBAGBrSGCLAEBBDAQ Bg4rBgEEAYGtIYIsAQEECjAQBg4rBgEEAYGtIYIsAgEECjAJBgNVHRMEAjAAMA4GA1UdDwEB/wQE AwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFFDbROYIxDr3fvlX tkXqx7T8lihxMB8GA1UdIwQYMBaAFGs6mIv58lOJ2uCtsjIeCR/oqjt0MCAGA1UdEQQZMBeBFXR1 ZXhlbkBmaC1tdWVuc3Rlci5kZTCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vY2RwMS5wY2Eu ZGZuLmRlL2Rmbi1jYS1nbG9iYWwtZzIvcHViL2NybC9jYWNybC5jcmwwP6A9oDuGOWh0dHA6Ly9j ZHAyLnBjYS5kZm4uZGUvZGZuLWNhLWdsb2JhbC1nMi9wdWIvY3JsL2NhY3JsLmNybDCB2wYIKwYB BQUHAQEEgc4wgcswMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2 ZXIvT0NTUDBJBggrBgEFBQcwAoY9aHR0cDovL2NkcDEucGNhLmRmbi5kZS9kZm4tY2EtZ2xvYmFs LWcyL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBJBggrBgEFBQcwAoY9aHR0cDovL2NkcDIucGNhLmRm bi5kZS9kZm4tY2EtZ2xvYmFsLWcyL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDANBgkqhkiG9w0BAQsF AAOCAQEALubmL854icQMxKxOxQK+deXTjC6CLYnUDwB8MvnDC+BSeh3tUHT37fSgsK1ShNUSNJX0 YF0VYLfZ6+lPyaFYLArVrAIHqvDiVURaulB9NA+3gck/VSuRz4ILYBy61XbcGQQ8Wx+g6TcqsjsF oOhqEBycj5QuITj+EFmX8nvfo0dJtVa2OPDk1N9beLfQBcLhspJ/nv0pKhpNWv5YETG26YqYfsC7 FA/ZNGvRcoOPkjkDhBTtG+qq9DDD75XtGEBZhYXbnG15tn4/UV07B+UyK4/cqQSA+My5FML3YsQw EYrV9klVD/mLMOdZV5+95xt7O8IdYeHrBapVlhANH5bFazGCBJ0wggSZAgEBMIGeMIGNMQswCQYD VQQGEwJERTFFMEMGA1UECgw8VmVyZWluIHp1ciBGb2VyZGVydW5nIGVpbmVzIERldXRzY2hlbiBG b3JzY2h1bmdzbmV0emVzIGUuIFYuMRAwDgYDVQQLDAdERk4tUEtJMSUwIwYDVQQDDBxERk4tVmVy ZWluIEdsb2JhbCBJc3N1aW5nIENBAgwmtEKU0pHN60HSNz8wDQYJYIZIAWUDBAIBBQCgggHPMBgG CSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIzMDgwMjA5MjM0OFowLwYJ KoZIhvcNAQkEMSIEIFlkHAkZLMsB2d+dzsLrCYsUa+QYF/Y5gs3fnbkYZN4UMIGvBgkrBgEEAYI3 EAQxgaEwgZ4wgY0xCzAJBgNVBAYTAkRFMUUwQwYDVQQKDDxWZXJlaW4genVyIEZvZXJkZXJ1bmcg ZWluZXMgRGV1dHNjaGVuIEZvcnNjaHVuZ3NuZXR6ZXMgZS4gVi4xEDAOBgNVBAsMB0RGTi1QS0kx JTAjBgNVBAMMHERGTi1WZXJlaW4gR2xvYmFsIElzc3VpbmcgQ0ECDCa0QpTSkc3rQdI3PzCBsQYL KoZIhvcNAQkQAgsxgaGggZ4wgY0xCzAJBgNVBAYTAkRFMUUwQwYDVQQKDDxWZXJlaW4genVyIEZv ZXJkZXJ1bmcgZWluZXMgRGV1dHNjaGVuIEZvcnNjaHVuZ3NuZXR6ZXMgZS4gVi4xEDAOBgNVBAsM B0RGTi1QS0kxJTAjBgNVBAMMHERGTi1WZXJlaW4gR2xvYmFsIElzc3VpbmcgQ0ECDCa0QpTSkc3r QdI3PzANBgkqhkiG9w0BAQsFAASCAgCRgRprCsXMKlRBhGE+lU4gEnNUBfWGXERJQn15DC/gRg+8 9cJNZ5MGMKtRzX8P8Abc9coA/tnhn8jjDk4Q9lyqkQqKz9ZeilkGTLyEYcQxqi+3todHgyB9CSbD 2zoipGT4DurqStepOkuRkKqCk3uXDiTWWDLnf2AfU65hQugKHoZdeN+xFYcgazX8Ytdun8el6T9F OWcN1z52WAY0HjPYO+pkJ9JJtLNz8SKViwdk5OSTYKNO4k75BPySRrLr/hnT439e/eLNOpDIzPYX NDWmcfqWrcmHpijfrkwdurslEhsHZiu8tW4l4nzdT0GqAnDFruxq2RmOdxWZAY4SMfjmjhK6WDpx qcwKg7O0pBpHgwAApdV36lmbsIq5PEGgnO/7oNbbPclHdor/G/eJFAVgHoY/Cjsgi+E7t1lKb7tn EmofQtbxWuRVHRcCZ0umztbYGZ4/MNS56Sfujp0L7uP8E1wpevLEUBVThxXyFufgVMo8pvnWtXW+ oWthg8foyDxdp5G+VbpLPKQE10PJ61jycoFo5u+15WHrfpbO8YJmf0xtnah125AMyx6zW9+ojfXf HR6+ryAbpLXkJUQCCWVIig4pJO791B8nERZcZzF9UcdvrWvfQMojVoiut0Xvt/YXc+RGjuvWhD11 Ysa//EZCS7mq6NPl/eTfMoBuhoV0ggAAAAAAAA== --Apple-Mail=_EE90BED6-27D5-418F-BB28-2CEC87741BBE--