Re: [OPAE] Main Memory Access from FPGA

Adler, Michael <michael.adler at intel.com> Thu, 07 Feb 2019 16:50:38 +0000
Newsgroups dev.linux.lists.opae
Message-ID <[email protected]>
--===============6613478253623594195==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

C0 read and C1 write requests go to main memory buffers pinned with fpgaPre=
pareBuffer(). The transactions will use whatever physical channels are atta=
ched to the FPGA, which might be PCIe. The result is reads/writes from/to m=
ain memory.

-Michael

From: David Nicuesa <david.nicuesa.aranda(a)gmail.com>
Date: Thursday, February 7, 2019 at 11:23 AM
To: "Adler, Michael" <michael.adler(a)intel.com>, "opae(a)lists.01.org" <op=
ae(a)lists.01.org>
Subject: Re: [OPAE] Main Memory Access from FPGA

Hello Michael,

thanks for the quick response.

So, correct me if I'm wrong, MMIO goes into the c2 on RTL, and Reads/Writes=
 are managed through c0 and c1, right?
This way I can allocate a buffer through software using  fpgaPrepareBuffer =
and access that buffer from software as a regular array, and using c0/c1 th=
e AFU is able to work with it and those will be actual main memory accesses=
, not PCIe transactions.

Thank you very much for the help.

Regards,
David

El jue., 7 feb. 2019 a las 16:41, Adler, Michael (<michael.adler(a)intel.co=
m<mailto:michael.adler(a)intel.com>>) escribi=C3=B3:
The CCI-P interface differentiates between MMIO (memory mapped I/O) and mai=
n memory read/write requests. MMIO is an FPGA-side address space, mainly us=
ed for implementing FPGA-side CSRs. Those CSRs are exposed in the software=
=E2=80=99s address space but actually result in PCIe transactions to the FP=
GA.

CCI-P=E2=80=99s main memory read/write requests are exactly what you are as=
king for: DMA to host main memory. The primary address space used for those=
 requests is a =E2=80=9Cphysical=E2=80=9D I/O address space that maps to ho=
st physical addresses. It is also possible to use virtual addresses on the =
FPGA that correspond to the software=E2=80=99s virtual address space. For t=
hat you can use the MPF VTP extension. See section 3 of the tutorial<https:=
//github.com/OPAE/intel-fpga-bbb/tree/master/samples/tutorial/03_ccip>.

-Michael

From: OPAE <opae-bounces(a)lists.01.org<mailto:opae-bounces(a)lists.01.org>=
> on behalf of David Nicuesa <david.nicuesa.aranda(a)gmail.com<mailto:david=
.nicuesa.aranda(a)gmail.com>>
Date: Thursday, February 7, 2019 at 9:53 AM
To: "opae(a)lists.01.org<mailto:opae(a)lists.01.org>" <opae(a)lists.01.org<=
mailto:opae(a)lists.01.org>>
Subject: [OPAE] Main Memory Access from FPGA

Hi all,

I'm getting started with the examples, specifically with the hello_world fr=
om the intel-fpga-bbb<https://github.com/OPAE/intel-fpga-bbb/tree/master/sa=
mples/tutorial/01_hello_world> repository. Everything works just fine but I=
 was wondering if it is possible for me to access the Main Memory (Not IO) =
from the FPGA using the CCI protocol.

I have an rtl to sum two vectors, so my idea was to provide the addresses f=
or those two vectors from the software application, allocated in General Pu=
rpose Memory. This way, ideally, the FPGA should be able to access those ve=
ctors without having a shared buffer (MMIO).

Is it possible to do this, maybe using some MPF extension? In case this is =
not feasible, I should allocate a shared buffer in MMIO space and then comu=
nicate the vectors through that buffer, right?

Thanks!

--===============6613478253623594195==
Content-Type: text/html
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="attachment.html"

PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4
bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo
dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l
dGEgbmFtZT0iR2VuZXJhdG9yIiBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQg
bWVkaXVtKSI+DQo8c3R5bGU+PCEtLQ0KLyogRm9udCBEZWZpbml0aW9ucyAqLw0KQGZvbnQtZmFj
ZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2
IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsNCglwYW5vc2UtMToy
IDE1IDUgMiAyIDIgNCAzIDIgNDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJIZWx2ZXRp
Y2EgTmV1ZSI7DQoJcGFub3NlLTE6MiAwIDUgMyAwIDAgMCAyIDAgNDt9DQpAZm9udC1mYWNlDQoJ
e2ZvbnQtZmFtaWx5OkNvbnNvbGFzOw0KCXBhbm9zZS0xOjIgMTEgNiA5IDIgMiA0IDMgMiA0O30N
CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6R2VvcmdpYTsNCglwYW5vc2UtMToyIDQgNSAyIDUg
NCA1IDIgMyAzO30NCi8qIFN0eWxlIERlZmluaXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNv
Tm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJe21hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAw
MXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2Vy
aWY7fQ0KYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaw0KCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7
DQoJY29sb3I6Ymx1ZTsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30NCmE6dmlzaXRlZCwg
c3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZA0KCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7DQoJY29s
b3I6cHVycGxlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KY29kZQ0KCXttc28tc3R5
bGUtcHJpb3JpdHk6OTk7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijt9DQpwLm1zb25vcm1h
bDAsIGxpLm1zb25vcm1hbDAsIGRpdi5tc29ub3JtYWwwDQoJe21zby1zdHlsZS1uYW1lOm1zb25v
cm1hbDsNCgltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1z
by1tYXJnaW4tYm90dG9tLWFsdDphdXRvOw0KCW1hcmdpbi1sZWZ0OjBpbjsNCglmb250LXNpemU6
MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30NCnNwYW4uRW1haWxT
dHlsZTE5DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5Ow0KCWZvbnQtZmFtaWx5OiJH
ZW9yZ2lhIixzZXJpZjsNCgljb2xvcjp3aW5kb3d0ZXh0O30NCi5Nc29DaHBEZWZhdWx0DQoJe21z
by1zdHlsZS10eXBlOmV4cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZToxMC4wcHQ7fQ0KQHBhZ2UgV29y
ZFNlY3Rpb24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBp
biAxLjBpbjt9DQpkaXYuV29yZFNlY3Rpb24xDQoJe3BhZ2U6V29yZFNlY3Rpb24xO30NCi0tPjwv
c3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1
cnBsZSI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+
PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPkMwIHJl
YWQgYW5kIEMxIHdyaXRlIHJlcXVlc3RzIGdvIHRvIG1haW4gbWVtb3J5IGJ1ZmZlcnMgcGlubmVk
IHdpdGggZnBnYVByZXBhcmVCdWZmZXIoKS4gVGhlIHRyYW5zYWN0aW9ucyB3aWxsIHVzZSB3aGF0
ZXZlciBwaHlzaWNhbCBjaGFubmVscyBhcmUgYXR0YWNoZWQgdG8gdGhlIEZQR0EsIHdoaWNoIG1p
Z2h0IGJlIFBDSWUuIFRoZSByZXN1bHQNCiBpcyByZWFkcy93cml0ZXMgZnJvbS90byBtYWluIG1l
bW9yeS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz
dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7R2VvcmdpYSZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8
L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt
ZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPi1NaWNoYWVsPG86cD48L286cD48L3Nw
YW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx
dW90O0dlb3JnaWEmcXVvdDssc2VyaWYiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxk
aXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtwYWRk
aW5nOjMuMHB0IDBpbiAwaW4gMGluIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIHN0
eWxlPSJmb250LXNpemU6MTIuMHB0O2NvbG9yOmJsYWNrIj5Gcm9tOiA8L3NwYW4+PC9iPjxzcGFu
IHN0eWxlPSJmb250LXNpemU6MTIuMHB0O2NvbG9yOmJsYWNrIj5EYXZpZCBOaWN1ZXNhICZsdDtk
YXZpZC5uaWN1ZXNhLmFyYW5kYUBnbWFpbC5jb20mZ3Q7PGJyPg0KPGI+RGF0ZTogPC9iPlRodXJz
ZGF5LCBGZWJydWFyeSA3LCAyMDE5IGF0IDExOjIzIEFNPGJyPg0KPGI+VG86IDwvYj4mcXVvdDtB
ZGxlciwgTWljaGFlbCZxdW90OyAmbHQ7bWljaGFlbC5hZGxlckBpbnRlbC5jb20mZ3Q7LCAmcXVv
dDtvcGFlQGxpc3RzLjAxLm9yZyZxdW90OyAmbHQ7b3BhZUBsaXN0cy4wMS5vcmcmZ3Q7PGJyPg0K
PGI+U3ViamVjdDogPC9iPlJlOiBbT1BBRV0gTWFpbiBNZW1vcnkgQWNjZXNzIGZyb20gRlBHQTxv
OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+SGVsbG8gTWljaGFlbCwgPG86cD48L286cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v
cm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNv
Tm9ybWFsIj50aGFua3MgZm9yIHRoZSBxdWljayByZXNwb25zZS48bzpwPjwvbzpwPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K
PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+U28sIGNvcnJlY3QgbWUgaWYgSSdt
IHdyb25nLCBNTUlPIGdvZXMgaW50byB0aGUgYzIgb24gUlRMLCBhbmQgUmVhZHMvV3JpdGVzIGFy
ZSBtYW5hZ2VkIHRocm91Z2ggYzAgYW5kIGMxLCByaWdodD8mbmJzcDs8bzpwPjwvbzpwPjwvcD4N
CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPlRoaXMgd2F5IEkgY2FuIGFsbG9j
YXRlIGEgYnVmZmVyIHRocm91Z2ggc29mdHdhcmUgdXNpbmcmbmJzcDs8Yj48c3BhbiBzdHlsZT0i
Zm9udC1mYW1pbHk6JnF1b3Q7SGVsdmV0aWNhIE5ldWUmcXVvdDs7Y29sb3I6IzI5ODBCOTtiYWNr
Z3JvdW5kOiNFN0YyRkEiPiZuYnNwOzwvc3Bhbj48L2I+PGNvZGU+PGI+PHNwYW4gc3R5bGU9ImZv
bnQtZmFtaWx5OkNvbnNvbGFzO2NvbG9yOmJsYWNrO2JvcmRlcjpub25lIHdpbmRvd3RleHQgMS4w
cHQ7cGFkZGluZzowaW4iPmZwZ2FQcmVwYXJlQnVmZmVyPC9zcGFuPjwvYj48L2NvZGU+Jm5ic3A7
YW5kDQogYWNjZXNzIHRoYXQgYnVmZmVyIGZyb20gc29mdHdhcmUgYXMgYSByZWd1bGFyIGFycmF5
LCBhbmQgdXNpbmcgYzAvYzEgdGhlIEFGVSBpcyBhYmxlIHRvIHdvcmsgd2l0aCBpdCBhbmQgdGhv
c2Ugd2lsbCBiZSBhY3R1YWwgbWFpbiBtZW1vcnkgYWNjZXNzZXMsIG5vdCBQQ0llIHRyYW5zYWN0
aW9ucy48bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h
bCI+VGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgdGhlIGhlbHAuPG86cD48L286cD48L3A+DQo8L2Rp
dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjwv
ZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPlJlZ2FyZHMsPG86cD48L286cD48L3A+
DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5EYXZpZDxvOnA+PC9vOnA+PC9w
Pg0KPC9kaXY+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+
PC9wPg0KPGRpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5FbCBqdWUuLCA3IGZlYi4g
MjAxOSBhIGxhcyAxNjo0MSwgQWRsZXIsIE1pY2hhZWwgKCZsdDs8YSBocmVmPSJtYWlsdG86bWlj
aGFlbC5hZGxlckBpbnRlbC5jb20iPm1pY2hhZWwuYWRsZXJAaW50ZWwuY29tPC9hPiZndDspIGVz
Y3JpYmnDszo8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGJsb2NrcXVvdGUgc3R5bGU9ImJvcmRl
cjpub25lO2JvcmRlci1sZWZ0OnNvbGlkICNDQ0NDQ0MgMS4wcHQ7cGFkZGluZzowaW4gMGluIDBp
biA2LjBwdDttYXJnaW4tbGVmdDo0LjhwdDttYXJnaW4tcmlnaHQ6MGluIj4NCjxkaXY+DQo8ZGl2
Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21z
by1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7
R2VvcmdpYSZxdW90OyxzZXJpZiI+VGhlIENDSS1QIGludGVyZmFjZSBkaWZmZXJlbnRpYXRlcyBi
ZXR3ZWVuIE1NSU8gKG1lbW9yeSBtYXBwZWQgSS9PKSBhbmQgbWFpbiBtZW1vcnkgcmVhZC93cml0
ZSByZXF1ZXN0cy4gTU1JTyBpcyBhbiBGUEdBLXNpZGUgYWRkcmVzcyBzcGFjZSwNCiBtYWlubHkg
dXNlZCBmb3IgaW1wbGVtZW50aW5nIEZQR0Etc2lkZSBDU1JzLiBUaG9zZSBDU1JzIGFyZSBleHBv
c2VkIGluIHRoZSBzb2Z0d2FyZeKAmXMgYWRkcmVzcyBzcGFjZSBidXQgYWN0dWFsbHkgcmVzdWx0
IGluIFBDSWUgdHJhbnNhY3Rpb25zIHRvIHRoZSBGUEdBLjwvc3Bhbj48bzpwPjwvbzpwPjwvcD4N
CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28t
bWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dl
b3JnaWEmcXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNz
PSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJv
dHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVv
dDssc2VyaWYiPkNDSS1Q4oCZcyBtYWluIG1lbW9yeSByZWFkL3dyaXRlIHJlcXVlc3RzIGFyZSBl
eGFjdGx5IHdoYXQgeW91IGFyZSBhc2tpbmcgZm9yOiBETUEgdG8gaG9zdCBtYWluIG1lbW9yeS4g
VGhlIHByaW1hcnkgYWRkcmVzcyBzcGFjZSB1c2VkIGZvcg0KIHRob3NlIHJlcXVlc3RzIGlzIGEg
4oCccGh5c2ljYWzigJ0gSS9PIGFkZHJlc3Mgc3BhY2UgdGhhdCBtYXBzIHRvIGhvc3QgcGh5c2lj
YWwgYWRkcmVzc2VzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSB2aXJ0dWFsIGFkZHJlc3Nl
cyBvbiB0aGUgRlBHQSB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNvZnR3YXJl4oCZcyB2aXJ0dWFs
IGFkZHJlc3Mgc3BhY2UuIEZvciB0aGF0IHlvdSBjYW4gdXNlIHRoZSBNUEYgVlRQIGV4dGVuc2lv
bi4gU2VlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vT1BBRS9pbnRlbC1mcGdhLWJiYi90
cmVlL21hc3Rlci9zYW1wbGVzL3R1dG9yaWFsLzAzX2NjaXAiIHRhcmdldD0iX2JsYW5rIj4NCnNl
Y3Rpb24gMyBvZiB0aGUgdHV0b3JpYWw8L2E+Ljwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNs
YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2lu
LWJvdHRvbS1hbHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEm
cXVvdDssc2VyaWYiPiZuYnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29O
b3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1h
bHQ6YXV0byI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0dlb3JnaWEmcXVvdDssc2Vy
aWYiPi1NaWNoYWVsPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg
c3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRv
Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7R2VvcmdpYSZxdW90OyxzZXJpZiI+Jm5i
c3A7PC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVy
LXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAg
Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJn
aW4tYm90dG9tLWFsdDphdXRvIj48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtjb2xv
cjpibGFjayI+RnJvbToNCjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7
Y29sb3I6YmxhY2siPk9QQUUgJmx0OzxhIGhyZWY9Im1haWx0bzpvcGFlLWJvdW5jZXNAbGlzdHMu
MDEub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BhZS1ib3VuY2VzQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7
IG9uIGJlaGFsZiBvZiBEYXZpZCBOaWN1ZXNhICZsdDs8YSBocmVmPSJtYWlsdG86ZGF2aWQubmlj
dWVzYS5hcmFuZGFAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+ZGF2aWQubmljdWVzYS5hcmFu
ZGFAZ21haWwuY29tPC9hPiZndDs8YnI+DQo8Yj5EYXRlOiA8L2I+VGh1cnNkYXksIEZlYnJ1YXJ5
IDcsIDIwMTkgYXQgOTo1MyBBTTxicj4NCjxiPlRvOiA8L2I+JnF1b3Q7PGEgaHJlZj0ibWFpbHRv
Om9wYWVAbGlzdHMuMDEub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BhZUBsaXN0cy4wMS5vcmc8L2E+
JnF1b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86b3BhZUBsaXN0cy4wMS5vcmciIHRhcmdldD0iX2Js
YW5rIj5vcGFlQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7PGJyPg0KPGI+U3ViamVjdDogPC9iPltPUEFF
XSBNYWluIE1lbW9yeSBBY2Nlc3MgZnJvbSBGUEdBPC9zcGFuPjxvOnA+PC9vOnA+PC9wPg0KPC9k
aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFs
dDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4N
CjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRv
cC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+SGkgYWxsLA0KPG86cD48L286
cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9w
LWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj4mbmJzcDs8bzpwPjwvbzpwPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2lu
LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+SSdtIGdldHRpbmcgc3Rh
cnRlZCB3aXRoIHRoZSBleGFtcGxlcywgc3BlY2lmaWNhbGx5IHdpdGggdGhlIGhlbGxvX3dvcmxk
IGZyb20gdGhlJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL09QQUUvaW50ZWwtZnBn
YS1iYmIvdHJlZS9tYXN0ZXIvc2FtcGxlcy90dXRvcmlhbC8wMV9oZWxsb193b3JsZCIgdGFyZ2V0
PSJfYmxhbmsiPmludGVsLWZwZ2EtYmJiPC9hPiZuYnNwO3JlcG9zaXRvcnkuDQogRXZlcnl0aGlu
ZyB3b3JrcyBqdXN0IGZpbmUgYnV0IEkgd2FzIHdvbmRlcmluZyBpZiBpdCBpcyBwb3NzaWJsZSBm
b3IgbWUgdG8gYWNjZXNzIHRoZSBNYWluIE1lbW9yeSAoTm90IElPKSBmcm9tIHRoZSBGUEdBIHVz
aW5nIHRoZSBDQ0kgcHJvdG9jb2wuJm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+
DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNv
LW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8
ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRv
O21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj5JIGhhdmUgYW4gcnRsIHRvIHN1bSB0d28gdmVj
dG9ycywgc28gbXkgaWRlYSB3YXMgdG8gcHJvdmlkZSB0aGUgYWRkcmVzc2VzIGZvciB0aG9zZSB0
d28gdmVjdG9ycyBmcm9tIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiwgYWxsb2NhdGVkIGluIEdl
bmVyYWwgUHVycG9zZSBNZW1vcnkuIFRoaXMgd2F5LCBpZGVhbGx5LA0KIHRoZSBGUEdBIHNob3Vs
ZCBiZSBhYmxlIHRvIGFjY2VzcyB0aG9zZSB2ZWN0b3JzIHdpdGhvdXQgaGF2aW5nIGEgc2hhcmVk
IGJ1ZmZlciAoTU1JTykuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i
TXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0
b20tYWx0OmF1dG8iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xh
c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4t
Ym90dG9tLWFsdDphdXRvIj5JcyBpdCBwb3NzaWJsZSB0byBkbyB0aGlzLCBtYXliZSB1c2luZyBz
b21lIE1QRiBleHRlbnNpb24/IEluIGNhc2UgdGhpcyBpcyBub3QgZmVhc2libGUsIEkgc2hvdWxk
IGFsbG9jYXRlIGEgc2hhcmVkIGJ1ZmZlciBpbiBNTUlPIHNwYWNlIGFuZCB0aGVuIGNvbXVuaWNh
dGUgdGhlIHZlY3RvcnMgdGhyb3VnaA0KIHRoYXQgYnVmZmVyLCByaWdodD88bzpwPjwvbzpwPjwv
cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2lu
LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+Jm5ic3A7PG86cD48L286
cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1h
cmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPlRoYW5rcyE8bzpw
PjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ibG9ja3F1b3Rl
Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg==

--===============6613478253623594195==--