From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5762726789321646356==" MIME-Version: 1.0 From: Sreeni (Sreenivasa) Busam (Stellus) Subject: Re: [SPDK] Request for more details on SPDK driver API. Date: Mon, 13 Nov 2017 21:16:57 +0000 Message-ID: <8900e026c0704a08bd334ba735fd4567@stellus.com> In-Reply-To: 82C9F782B054C94B9FC04A331649C77A9D427D30@FMSMSX108.amr.corp.intel.com List-ID: To: spdk@lists.01.org --===============5762726789321646356== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable That is good. I thought the callback was taking only one parameter. Your co= mments below is helpful to understand the status of the I/O request. Thanks Paul. From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Luse, Paul E Sent: Monday, November 13, 2017 11:56 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Request for more details on SPDK driver API. So if you checkout the nvme hello_world read completion for example: static void read_complete(void *arg, const struct spdk_nvme_cpl *completion) { } You'll see it doesn't check for errors (ugh) but if you look in the complet= ion struct you'll see a status field that you can check.... struct spdk_nvme_cpl { /* dword 0 */ uint32_t cdw0; /* command-specifi= c */ /* dword 1 */ uint32_t rsvd1; /* dword 2 */ uint16_t sqhd; /* submission que= ue head pointer */ uint16_t sqid; /* submission q= ueue identifier */ /* dword 3 */ uint16_t cid; /* command ide= ntifier */ struct spdk_nvme_status status; }; From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sreeni (Sreeni= vasa) Busam (Stellus) Sent: Monday, November 13, 2017 12:48 PM To: Storage Performance Development Kit > Subject: Re: [SPDK] Request for more details on SPDK driver API. Hi guys, A simple follow-up question to Paul's answer. Let us assume that I/O to NVMe device has been issued and submit has comple= ted and is successful. Is it a safe assumption that the callback function p= rovided in the spdk_nvme_ns_cmd_read() gets called when the read or write I= /O has completed successfully without errors? If the I/O has failed for any= reason, the callback is not called correct? I am using the case when the request is issued without the bdev layer. Thanks, Sreeni From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sreeni (Sreeni= vasa) Busam (Stellus) Sent: Sunday, November 12, 2017 10:37 PM To: Storage Performance Development Kit > Subject: Re: [SPDK] Request for more details on SPDK driver API. Hi Paul, Thank you very much for taking the time to write a clear and lengthy reply = addressing my questions. I have got a fair understanding about the bdev lay= er and the use of it. I looked at the hello_world and fio example code already and tested the cod= e, and they were working well with a local NVMe SSD device connected. I nee= d to check out the blob hello_world example though. I will take a look at the presentations and follow-up if I have any other q= uestions. I have to join the #spdk channel, and will contact you if I need = any help there. I have a few questions regarding how the failures of read and write request= s are handled in the lower layer and controller level, if they are handled = and other questions. Sreeni From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Luse, Paul E Sent: Saturday, November 11, 2017 6:41 AM To: Storage Performance Development Kit > Subject: Re: [SPDK] Request for more details on SPDK driver API. Hi Sreeni, Welcome! Before I give you the start of an answer (others will chime in as= well I'm sure) I should mention that we're also on IRC at freenode in the = #spdk channel. You can generally find an expert there that can help via re= al-time or slightly delayed discussions :) Also, if you haven't checked out the presentations from our summit earlier = this year they are at http://www.spdk.io/news/2017/05/03/summit_presentatio= ns/ and there's some good ones in there that might help you. In most of those decks you'll find an architecture diagram that might help = pull all of this together for you. The key point for understanding your que= stions is to realize that SPDK is a collection of layered modules, some opt= ional, that all work together to form a storage stack in user space. So if= you think of the top of the stack being front end protocol modules like iS= CSI and NVMeoF and then the next big layer down being a generic block layer= followed by a lower device driver layer it should start to make more sense= . The generic block layer is a lightweight block abstraction at the top an= d then device specific modules at the bottom to interface with device drive= rs. So, anywhere you see an API with "bdev" in it, like the 2 you mention, = you're in the generic block layer. If the application you've constructed i= s based on NVMe then the next layer down will be the NVMe driver where you'= ll find the API that you listed in (1) below. As I mentioned though, a lot= of the layers are optional including the bdev layer. If you wanted to wri= te an application that didn't use bdevs (you knew it was only ever going to= be NVMe and didn't want the minimal overhead of bdev) you could use those = NVMe driver APIs directly in your application. Hope that makes sense, again I'm sure others will add more clarifying bits = of information as well. Here are some examples: https://github.com/spdk/spdk/tree/master/examples/nvme/hello_world is an ap= plication that doesn't use bdev, talks directly to NVMe https://github.com/spdk/spdk/tree/master/examples/blob/hello_world is a sim= ple blobstore example (I didn't mention blobstore above but its another opt= ional layer) that does use a bdev. In this example it uses a ram disk (mall= oc) back end but could also easily use an NVMe back end directly and there'= s an open patch that shows how that works at https://review.gerrithub.io/#/= c/375460/ - both of these might not be the best example for your question b= ecause blobstore is thrown in the mix but you can see the bdev portion in t= here as part of blobstore in a subdir called bdev under /lib/blob Anyway, hope that helps more than it confuses :) Feel free to keep asking q= uestions until it makes sense... Thx Paul PS: there's also a bunch of existing bdev back end modules here https://git= hub.com/spdk/spdk/tree/master/lib/bdev that may help clarify the concepts. = Note that you can also stack bdevs in order to intercept IO coming and goin= g so you can do value added things easily, we call those "virtual bdevs" an= d you'll see some examples in the dir I just mentioned (ie split, lvol) From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sreeni (Sreeni= vasa) Busam (Stellus) Sent: Friday, November 10, 2017 6:25 PM To: spdk(a)lists.01.org Subject: [SPDK] Request for more details on SPDK driver API. I am new to SPDK driver and trying to understand the various API's availabl= e to do I/O on NVMe local device and using NVMeoF protocol on a target devi= ce. I see different interfaces for the read and write I/O operations. It seems there are two types of interfaces available. 1. spdk_nvme_ns_cmd_read() and spdk_nvme_ns_cmd_write() and related functio= n. This is used for PCIe devices. It seems to apply to devices attached loc= ally. 2. spdk_bdev_read_blocks() and spdk_bdev_write_blocks() and related API's i= n lib/bdev. I have been looking at the code and trying to understand how this API and r= elated APIs for the module has been used, the API's in 2. are used for blob= fs I/O operation spdk/lib/blob/bdev/*, when there is a blob filesystem and = for I/O operation on NVMe devices using NVMeoF protocol spdk/lib/nvmf/*. Is this a correct assumption? Is the lib/bdev layer developed to address on= ly these cases? Can the lib/bdev API be used on a local NVMe device? If so, is there a test= program to understand how to create a bdev device and do the I/O on NVMe S= SD block device? Please let me know if there is an example to understand how to use the lib/= nvmf interfaces. I want to test a device on remote target using NVMeoF prot= ocol. Thanks very much for any help in the lib/bdev API. --===============5762726789321646356== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPgo8c3R5bGU+ PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWlseTpXaW5n ZGluZ3M7CglwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAwO30KQGZvbnQtZmFjZQoJe2ZvbnQt ZmFtaWx5OiJDYW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CkBm b250LWZhY2UKCXtmb250LWZhbWlseToiTWFsZ3VuIEdvdGhpYyI7CglwYW5vc2UtMToyIDExIDUg MyAyIDAgMCAyIDAgNDt9CkBmb250LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3Nl LTE6MiAxNSA1IDIgMiAyIDQgMyAyIDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6IlxATWFs Z3VuIEdvdGhpYyI7CglwYW5vc2UtMToyIDExIDUgMyAyIDAgMCAyIDAgNDt9Ci8qIFN0eWxlIERl ZmluaXRpb25zICovCnAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKCXtt YXJnaW46MGluOwoJbWFyZ2luLWJvdHRvbTouMDAwMXB0OwoJZm9udC1zaXplOjExLjBwdDsKCWZv bnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30KYTpsaW5rLCBzcGFuLk1zb0h5cGVybGlu awoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOiMwNTYzQzE7Cgl0ZXh0LWRlY29yYXRp b246dW5kZXJsaW5lO30KYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkCgl7bXNv LXN0eWxlLXByaW9yaXR5Ojk5OwoJY29sb3I6Izk1NEY3MjsKCXRleHQtZGVjb3JhdGlvbjp1bmRl cmxpbmU7fQpwLk1zb0xpc3RQYXJhZ3JhcGgsIGxpLk1zb0xpc3RQYXJhZ3JhcGgsIGRpdi5Nc29M aXN0UGFyYWdyYXBoCgl7bXNvLXN0eWxlLXByaW9yaXR5OjM0OwoJbWFyZ2luLXRvcDowaW47Cglt YXJnaW4tcmlnaHQ6MGluOwoJbWFyZ2luLWJvdHRvbTowaW47CgltYXJnaW4tbGVmdDouNWluOwoJ bWFyZ2luLWJvdHRvbTouMDAwMXB0OwoJZm9udC1zaXplOjExLjBwdDsKCWZvbnQtZmFtaWx5OiJD YWxpYnJpIixzYW5zLXNlcmlmO30Kc3Bhbi5FbWFpbFN0eWxlMTgKCXttc28tc3R5bGUtdHlwZTpw ZXJzb25hbDsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOwoJY29sb3I6d2luZG93 dGV4dDt9CnNwYW4uRW1haWxTdHlsZTE5Cgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7Cglmb250 LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsKCWNvbG9yOiMxRjQ5N0Q7fQpzcGFuLkVtYWls U3R5bGUyMAoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOwoJZm9udC1mYW1pbHk6IkNhbGlicmki LHNhbnMtc2VyaWY7Cgljb2xvcjojMUY0OTdEO30Kc3Bhbi5FbWFpbFN0eWxlMjEKCXttc28tc3R5 bGUtdHlwZTpwZXJzb25hbDsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOwoJY29s b3I6IzFGNDk3RDt9CnNwYW4uRW1haWxTdHlsZTIyCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7 Cglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsKCWNvbG9yOiMxRjQ5N0Q7fQpzcGFu LkVtYWlsU3R5bGUyMwoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5OwoJZm9udC1mYW1p bHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7Cgljb2xvcjojMUY0OTdEO30KLk1zb0NocERlZmF1bHQK CXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsKCWZvbnQtc2l6ZToxMC4wcHQ7fQpAcGFnZSBX b3JkU2VjdGlvbjEKCXtzaXplOjguNWluIDExLjBpbjsKCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBp biAxLjBpbjt9CmRpdi5Xb3JkU2VjdGlvbjEKCXtwYWdlOldvcmRTZWN0aW9uMTt9Ci0tPjwvc3R5 bGU+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQi IHNwaWRtYXg9IjEwMjYiIC8+CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48 eG1sPgo8bzpzaGFwZWxheW91dCB2OmV4dD0iZWRpdCI+CjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBk YXRhPSIxIiAvPgo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJv ZHkgbGFuZz0iRU4tVVMiIGxpbms9IiMwNTYzQzEiIHZsaW5rPSIjOTU0RjcyIj4KPGRpdiBjbGFz cz0iV29yZFNlY3Rpb24xIj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiMxRjQ5N0QiPlRoYXQgaXMgZ29vZC4gSSB0aG91Z2h0IHRoZSBjYWxsYmFjayB3YXMgdGFraW5n IG9ubHkgb25lIHBhcmFtZXRlci4gWW91ciBjb21tZW50cyBiZWxvdyBpcyBoZWxwZnVsIHRvIHVu ZGVyc3RhbmQgdGhlIHN0YXR1cyBvZiB0aGUgSS9PIHJlcXVlc3QuPG86cD48L286cD48L3NwYW4+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+VGhh bmtzIFBhdWwuPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48YSBu YW1lPSJfTWFpbEVuZENvbXBvc2UiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9wPgo8ZGl2Pgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTti b3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+ CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPkZyb206PC9iPiBTUERLIFttYWlsdG86c3Bkay1ib3Vu Y2VzQGxpc3RzLjAxLm9yZ10gPGI+T24gQmVoYWxmIE9mCjwvYj5MdXNlLCBQYXVsIEU8YnI+Cjxi PlNlbnQ6PC9iPiBNb25kYXksIE5vdmVtYmVyIDEzLCAyMDE3IDExOjU2IEFNPGJyPgo8Yj5Ubzo8 L2I+IFN0b3JhZ2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAx Lm9yZyZndDs8YnI+CjxiPlN1YmplY3Q6PC9iPiBSZTogW1NQREtdIFJlcXVlc3QgZm9yIG1vcmUg ZGV0YWlscyBvbiBTUERLIGRyaXZlciBBUEkuPG86cD48L286cD48L3A+CjwvZGl2Pgo8L2Rpdj4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5TbyBpZiB5b3UgY2hlY2tvdXQgdGhl IG52bWUgaGVsbG9fd29ybGQgcmVhZCBjb21wbGV0aW9uIGZvciBleGFtcGxlOjxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5 N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPnN0YXRpYyB2b2lkPG86cD48L286cD48L3NwYW4+PC9w Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+cmVhZF9j b21wbGV0ZSh2b2lkICphcmcsIGNvbnN0IHN0cnVjdCBzcGRrX252bWVfY3BsICpjb21wbGV0aW9u KTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9 ImNvbG9yOiMxRjQ5N0QiPns8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj59PG86cD48L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+WW91JiM4MjE3O2xsIHNlZSBpdCBkb2VzbiYjODIxNzt0IGNoZWNrIGZvciBl cnJvcnMgKHVnaCkgYnV0IGlmIHlvdSBsb29rIGluIHRoZSBjb21wbGV0aW9uIHN0cnVjdCB5b3Um IzgyMTc7bGwgc2VlIGEgc3RhdHVzIGZpZWxkIHRoYXQgeW91IGNhbiBjaGVjayYjODIzMDsuPG86 cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+c3RydWN0IHNwZGtfbnZtZV9jcGwgezxv OnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNv bG9yOiMxRjQ5N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvKiBkd29yZCAwICovPG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFG NDk3RCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHVpbnQzMl90Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNkdzA7Jm5ic3A7Jm5ic3A7IC8qIGNvbW1hbmQtc3BlY2lm aWMgKi88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0 eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgLyogZHdvcmQgMSAqLzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1 aW50MzJfdCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByc3ZkMTs8 bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJj b2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg LyogZHdvcmQgMiAqLzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1aW50MTZf dCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzcWhkOyZuYnNwOyZu YnNwOyZuYnNwOyAvKiBzdWJtaXNzaW9uIHF1ZXVlIGhlYWQgcG9pbnRlciAqLzxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5 N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1aW50MTZfdCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyBzcWlkOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAv KiBzdWJtaXNzaW9uIHF1ZXVlIGlkZW50aWZpZXIgKi88bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNw OzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xv cjojMUY0OTdEIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLyogZHdvcmQgMyAqLzxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5 N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB1aW50MTZfdCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyBjaWQ7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IC8qIGNvbW1hbmQgaWRlbnRpZmllciAqLzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyBzdHJ1Y3Qgc3Bka19udm1lX3N0YXR1cyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0dXM7PG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFG NDk3RCI+fTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjoj MUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+ CjxkaXY+CjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0UxRTFFMSAx LjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGEg bmFtZT0iX19fX19yZXBseXNlcGFyYXRvciI+PC9hPjxiPkZyb206PC9iPiBTUERLIFs8YSBocmVm PSJtYWlsdG86c3Bkay1ib3VuY2VzQGxpc3RzLjAxLm9yZyI+bWFpbHRvOnNwZGstYm91bmNlc0Bs aXN0cy4wMS5vcmc8L2E+XQo8Yj5PbiBCZWhhbGYgT2YgPC9iPlNyZWVuaSAoU3JlZW5pdmFzYSkg QnVzYW0gKFN0ZWxsdXMpPGJyPgo8Yj5TZW50OjwvYj4gTW9uZGF5LCBOb3ZlbWJlciAxMywgMjAx NyAxMjo0OCBQTTxicj4KPGI+VG86PC9iPiBTdG9yYWdlIFBlcmZvcm1hbmNlIERldmVsb3BtZW50 IEtpdCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnNwZGtAbGlzdHMuMDEub3JnIj5zcGRrQGxpc3RzLjAx Lm9yZzwvYT4mZ3Q7PGJyPgo8Yj5TdWJqZWN0OjwvYj4gUmU6IFtTUERLXSBSZXF1ZXN0IGZvciBt b3JlIGRldGFpbHMgb24gU1BESyBkcml2ZXIgQVBJLjxvOnA+PC9vOnA+PC9wPgo8L2Rpdj4KPC9k aXY+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+SGkgZ3V5cyw8bzpwPjwvbzpw Pjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0 OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5BIHNpbXBsZSBmb2xsb3ctdXAgcXVlc3Rpb24gdG8g UGF1bCYjODIxNztzIGFuc3dlci48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5MZXQgdXMgYXNzdW1lIHRoYXQgSS9P IHRvIE5WTWUgZGV2aWNlIGhhcyBiZWVuIGlzc3VlZCBhbmQgc3VibWl0IGhhcyBjb21wbGV0ZWQg YW5kIGlzIHN1Y2Nlc3NmdWwuIElzIGl0IGEgc2FmZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxi YWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGluIHRoZSBzcGRrX252bWVfbnNfY21kX3JlYWQoKSBnZXRz IGNhbGxlZCB3aGVuIHRoZQogcmVhZCBvciB3cml0ZSBJL08gaGFzIGNvbXBsZXRlZCBzdWNjZXNz ZnVsbHkgd2l0aG91dCBlcnJvcnM/IElmIHRoZSBJL08gaGFzIGZhaWxlZCBmb3IgYW55IHJlYXNv biwgdGhlIGNhbGxiYWNrIGlzIG5vdCBjYWxsZWQgY29ycmVjdD88bzpwPjwvbzpwPjwvc3Bhbj48 L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5JIGFt IHVzaW5nIHRoZSBjYXNlIHdoZW4gdGhlIHJlcXVlc3QgaXMgaXNzdWVkIHdpdGhvdXQgdGhlIGJk ZXYgbGF5ZXIuPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+VGhhbmtzLDxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiMxRjQ5N0QiPlNyZWVuaTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv cD4KPGRpdj4KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUx IDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 Yj5Gcm9tOjwvYj4gU1BESyBbPGEgaHJlZj0ibWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4wMS5v cmciPm1haWx0bzpzcGRrLWJvdW5jZXNAbGlzdHMuMDEub3JnPC9hPl0KPGI+T24gQmVoYWxmIE9m IDwvYj5TcmVlbmkgKFNyZWVuaXZhc2EpIEJ1c2FtIChTdGVsbHVzKTxicj4KPGI+U2VudDo8L2I+ IFN1bmRheSwgTm92ZW1iZXIgMTIsIDIwMTcgMTA6MzcgUE08YnI+CjxiPlRvOjwvYj4gU3RvcmFn ZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQgJmx0OzxhIGhyZWY9Im1haWx0bzpzcGRrQGxp c3RzLjAxLm9yZyI+c3Bka0BsaXN0cy4wMS5vcmc8L2E+Jmd0Ozxicj4KPGI+U3ViamVjdDo8L2I+ IFJlOiBbU1BES10gUmVxdWVzdCBmb3IgbW9yZSBkZXRhaWxzIG9uIFNQREsgZHJpdmVyIEFQSS48 bzpwPjwvbzpwPjwvcD4KPC9kaXY+CjwvZGl2Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZu YnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMx RjQ5N0QiPkhpIFBhdWwsPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+VGhhbmsg eW91IHZlcnkgbXVjaCBmb3IgdGFraW5nIHRoZSB0aW1lIHRvIHdyaXRlIGEgY2xlYXIgYW5kIGxl bmd0aHkgcmVwbHkgYWRkcmVzc2luZyBteSBxdWVzdGlvbnMuIEkgaGF2ZSBnb3QgYSBmYWlyIHVu ZGVyc3RhbmRpbmcgYWJvdXQgdGhlIGJkZXYgbGF5ZXIgYW5kIHRoZSB1c2Ugb2YgaXQuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6 IzFGNDk3RCI+SSBsb29rZWQgYXQgdGhlIGhlbGxvX3dvcmxkIGFuZCBmaW8gZXhhbXBsZSBjb2Rl IGFscmVhZHkgYW5kIHRlc3RlZCB0aGUgY29kZSwgYW5kIHRoZXkgd2VyZSB3b3JraW5nIHdlbGwg d2l0aCBhIGxvY2FsIE5WTWUgU1NEIGRldmljZSBjb25uZWN0ZWQuIEkgbmVlZCB0byBjaGVjayBv dXQgdGhlIGJsb2IgaGVsbG9fd29ybGQgZXhhbXBsZSB0aG91Z2guPG86cD48L286cD48L3NwYW4+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+SSB3 aWxsIHRha2UgYSBsb29rIGF0IHRoZSBwcmVzZW50YXRpb25zIGFuZCBmb2xsb3ctdXAgaWYgSSBo YXZlIGFueSBvdGhlciBxdWVzdGlvbnMuIEkgaGF2ZSB0byBqb2luIHRoZSAjc3BkayBjaGFubmVs LCBhbmQgd2lsbCBjb250YWN0IHlvdSBpZiBJIG5lZWQgYW55IGhlbHAgdGhlcmUuCjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMx RjQ5N0QiPkkgaGF2ZSBhIGZldyBxdWVzdGlvbnMgcmVnYXJkaW5nIGhvdyB0aGUgZmFpbHVyZXMg b2YgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMgYXJlIGhhbmRsZWQgaW4gdGhlIGxvd2VyIGxheWVy IGFuZCBjb250cm9sbGVyIGxldmVsLCBpZiB0aGV5IGFyZSBoYW5kbGVkIGFuZCBvdGhlciBxdWVz dGlvbnMuPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+U3JlZW5pPG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFG NDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8ZGl2Pgo8ZGl2IHN0eWxl PSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBw dCAwaW4gMGluIDBpbiI+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxiPkZyb206PC9iPiBTUERLIFs8 YSBocmVmPSJtYWlsdG86c3Bkay1ib3VuY2VzQGxpc3RzLjAxLm9yZyI+bWFpbHRvOnNwZGstYm91 bmNlc0BsaXN0cy4wMS5vcmc8L2E+XQo8Yj5PbiBCZWhhbGYgT2YgPC9iPkx1c2UsIFBhdWwgRTxi cj4KPGI+U2VudDo8L2I+IFNhdHVyZGF5LCBOb3ZlbWJlciAxMSwgMjAxNyA2OjQxIEFNPGJyPgo8 Yj5Ubzo8L2I+IFN0b3JhZ2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDs8YSBocmVm PSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEub3JnPC9hPiZndDs8YnI+ CjxiPlN1YmplY3Q6PC9iPiBSZTogW1NQREtdIFJlcXVlc3QgZm9yIG1vcmUgZGV0YWlscyBvbiBT UERLIGRyaXZlciBBUEkuPG86cD48L286cD48L3A+CjwvZGl2Pgo8L2Rpdj4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJjb2xvcjojMUY0OTdEIj5IaSBTcmVlbmksPG86cD48L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+V2VsY29tZSEmbmJzcDsgQmVmb3JlIEkgZ2l2ZSB5b3UgdGhlIHN0YXJ0IG9m IGFuIGFuc3dlciAob3RoZXJzIHdpbGwgY2hpbWUgaW4gYXMgd2VsbCBJJiM4MjE3O20gc3VyZSkg SSBzaG91bGQgbWVudGlvbiB0aGF0IHdlJiM4MjE3O3JlIGFsc28gb24gSVJDIGF0IGZyZWVub2Rl IGluIHRoZSAjc3BkayBjaGFubmVsLiZuYnNwOyBZb3UgY2FuIGdlbmVyYWxseSBmaW5kIGFuIGV4 cGVydCB0aGVyZSB0aGF0CiBjYW4gaGVscCB2aWEgcmVhbC10aW1lIG9yIHNsaWdodGx5IGRlbGF5 ZWQgZGlzY3Vzc2lvbnMgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTpXaW5nZGluZ3M7 Y29sb3I6IzFGNDk3RCI+Sjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6 IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+QWxzbywgaWYgeW91IGhhdmVuJiM4MjE3O3Qg Y2hlY2tlZCBvdXQgdGhlIHByZXNlbnRhdGlvbnMgZnJvbSBvdXIgc3VtbWl0IGVhcmxpZXIgdGhp cyB5ZWFyIHRoZXkgYXJlIGF0CjxhIGhyZWY9Imh0dHA6Ly93d3cuc3Bkay5pby9uZXdzLzIwMTcv MDUvMDMvc3VtbWl0X3ByZXNlbnRhdGlvbnMvIj5odHRwOi8vd3d3LnNwZGsuaW8vbmV3cy8yMDE3 LzA1LzAzL3N1bW1pdF9wcmVzZW50YXRpb25zLzwvYT4gYW5kIHRoZXJlJiM4MjE3O3Mgc29tZSBn b29kIG9uZXMgaW4gdGhlcmUgdGhhdCBtaWdodCBoZWxwIHlvdS48bzpwPjwvbzpwPjwvc3Bhbj48 L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpw PiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJjb2xvcjojMUY0OTdEIj5JbiBtb3N0IG9mIHRob3NlIGRlY2tzIHlvdSYjODIxNztsbCBmaW5k IGFuIGFyY2hpdGVjdHVyZSBkaWFncmFtIHRoYXQgbWlnaHQgaGVscCBwdWxsIGFsbCBvZiB0aGlz IHRvZ2V0aGVyIGZvciB5b3UuIFRoZSBrZXkgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgeW91ciBx dWVzdGlvbnMgaXMgdG8gcmVhbGl6ZSB0aGF0IFNQREsgaXMgYSBjb2xsZWN0aW9uIG9mIGxheWVy ZWQKIG1vZHVsZXMsIHNvbWUgb3B0aW9uYWwsIHRoYXQgYWxsIHdvcmsgdG9nZXRoZXIgdG8gZm9y bSBhIHN0b3JhZ2Ugc3RhY2sgaW4gdXNlciBzcGFjZS4mbmJzcDsgU28gaWYgeW91IHRoaW5rIG9m IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGJlaW5nIGZyb250IGVuZCBwcm90b2NvbCBtb2R1bGVzIGxp a2UgaVNDU0kgYW5kIE5WTWVvRiBhbmQgdGhlbiB0aGUgbmV4dCBiaWcgbGF5ZXIgZG93biBiZWlu ZyBhIGdlbmVyaWMgYmxvY2sgbGF5ZXIgZm9sbG93ZWQgYnkgYQogbG93ZXIgZGV2aWNlIGRyaXZl ciBsYXllciBpdCBzaG91bGQgc3RhcnQgdG8gbWFrZSBtb3JlIHNlbnNlLiZuYnNwOyBUaGUgZ2Vu ZXJpYyBibG9jayBsYXllciBpcyBhIGxpZ2h0d2VpZ2h0IGJsb2NrIGFic3RyYWN0aW9uIGF0IHRo ZSB0b3AgYW5kIHRoZW4gZGV2aWNlIHNwZWNpZmljIG1vZHVsZXMgYXQgdGhlIGJvdHRvbSB0byBp bnRlcmZhY2Ugd2l0aCBkZXZpY2UgZHJpdmVycy4gU28sIGFueXdoZXJlIHlvdSBzZWUgYW4gQVBJ IHdpdGggJiM4MjIwO2JkZXYmIzgyMjE7IGluCiBpdCwgbGlrZSB0aGUgMiB5b3UgbWVudGlvbiwg eW91JiM4MjE3O3JlIGluIHRoZSBnZW5lcmljIGJsb2NrIGxheWVyLiZuYnNwOyBJZiB0aGUgYXBw bGljYXRpb24geW91JiM4MjE3O3ZlIGNvbnN0cnVjdGVkIGlzIGJhc2VkIG9uIE5WTWUgdGhlbiB0 aGUgbmV4dCBsYXllciBkb3duIHdpbGwgYmUgdGhlIE5WTWUgZHJpdmVyIHdoZXJlIHlvdSYjODIx NztsbCBmaW5kIHRoZSBBUEkgdGhhdCB5b3UgbGlzdGVkIGluICgxKSBiZWxvdy4mbmJzcDsgQXMg SSBtZW50aW9uZWQgdGhvdWdoLCBhIGxvdCBvZgogdGhlIGxheWVycyBhcmUgb3B0aW9uYWwgaW5j bHVkaW5nIHRoZSBiZGV2IGxheWVyLiZuYnNwOyBJZiB5b3Ugd2FudGVkIHRvIHdyaXRlIGFuIGFw cGxpY2F0aW9uIHRoYXQgZGlkbiYjODIxNzt0IHVzZSBiZGV2cyAoeW91IGtuZXcgaXQgd2FzIG9u bHkgZXZlciBnb2luZyB0byBiZSBOVk1lIGFuZCBkaWRuJiM4MjE3O3Qgd2FudCB0aGUgbWluaW1h bCBvdmVyaGVhZCBvZiBiZGV2KSB5b3UgY291bGQgdXNlIHRob3NlIE5WTWUgZHJpdmVyIEFQSXMg ZGlyZWN0bHkgaW4geW91ciBhcHBsaWNhdGlvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjoj MUY0OTdEIj5Ib3BlIHRoYXQgbWFrZXMgc2Vuc2UsIGFnYWluIEkmIzgyMTc7bSBzdXJlIG90aGVy cyB3aWxsIGFkZCBtb3JlIGNsYXJpZnlpbmcgYml0cyBvZiBpbmZvcm1hdGlvbiBhcyB3ZWxsLiZu YnNwOyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9v OnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMx RjQ5N0QiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zcGRrL3NwZGsvdHJlZS9tYXN0ZXIv ZXhhbXBsZXMvbnZtZS9oZWxsb193b3JsZCI+aHR0cHM6Ly9naXRodWIuY29tL3NwZGsvc3Bkay90 cmVlL21hc3Rlci9leGFtcGxlcy9udm1lL2hlbGxvX3dvcmxkPC9hPiBpcyBhbiBhcHBsaWNhdGlv biB0aGF0IGRvZXNuJiM4MjE3O3QgdXNlIGJkZXYsIHRhbGtzIGRpcmVjdGx5IHRvIE5WTWU8bzpw PjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xv cjojMUY0OTdEIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc3Bkay9zcGRrL3RyZWUvbWFz dGVyL2V4YW1wbGVzL2Jsb2IvaGVsbG9fd29ybGQiPmh0dHBzOi8vZ2l0aHViLmNvbS9zcGRrL3Nw ZGsvdHJlZS9tYXN0ZXIvZXhhbXBsZXMvYmxvYi9oZWxsb193b3JsZDwvYT4gaXMgYSBzaW1wbGUg YmxvYnN0b3JlIGV4YW1wbGUgKEkgZGlkbiYjODIxNzt0IG1lbnRpb24gYmxvYnN0b3JlIGFib3Zl CiBidXQgaXRzIGFub3RoZXIgb3B0aW9uYWwgbGF5ZXIpIHRoYXQgZG9lcyB1c2UgYSBiZGV2LiBJ biB0aGlzIGV4YW1wbGUgaXQgdXNlcyBhIHJhbSBkaXNrIChtYWxsb2MpIGJhY2sgZW5kIGJ1dCBj b3VsZCBhbHNvIGVhc2lseSB1c2UgYW4gTlZNZSBiYWNrIGVuZCBkaXJlY3RseSBhbmQgdGhlcmUm IzgyMTc7cyBhbiBvcGVuIHBhdGNoIHRoYXQgc2hvd3MgaG93IHRoYXQgd29ya3MgYXQKPGEgaHJl Zj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMvYy8zNzU0NjAvIj5odHRwczovL3Jldmll dy5nZXJyaXRodWIuaW8vIy9jLzM3NTQ2MC88L2E+IC0gYm90aCBvZiB0aGVzZSBtaWdodCBub3Qg YmUgdGhlIGJlc3QgZXhhbXBsZSBmb3IgeW91ciBxdWVzdGlvbiBiZWNhdXNlIGJsb2JzdG9yZSBp cyB0aHJvd24gaW4gdGhlIG1peCBidXQgeW91IGNhbiBzZWUgdGhlIGJkZXYgcG9ydGlvbiBpbiB0 aGVyZSBhcyBwYXJ0IG9mIGJsb2JzdG9yZQogaW4gYSBzdWJkaXIgY2FsbGVkIGJkZXYgdW5kZXIg L2xpYi9ibG9iPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+QW55d2F5LCBob3Bl IHRoYXQgaGVscHMgbW9yZSB0aGFuIGl0IGNvbmZ1c2VzCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6V2luZ2RpbmdzO2NvbG9yOiMxRjQ5N0QiPko8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiMxRjQ5N0QiPiBGZWVsIGZyZWUgdG8ga2VlcCBhc2tpbmcgcXVlc3Rpb25zIHVudGlsIGl0 IG1ha2VzIHNlbnNlJiM4MjMwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu PjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlRo eDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9 ImNvbG9yOiMxRjQ5N0QiPlBhdWw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh bj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5Q UzogdGhlcmUmIzgyMTc7cyBhbHNvIGEgYnVuY2ggb2YgZXhpc3RpbmcgYmRldiBiYWNrIGVuZCBt b2R1bGVzIGhlcmUKPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NwZGsvc3Bkay90cmVlL21h c3Rlci9saWIvYmRldiI+aHR0cHM6Ly9naXRodWIuY29tL3NwZGsvc3Bkay90cmVlL21hc3Rlci9s aWIvYmRldjwvYT4gdGhhdCBtYXkgaGVscCBjbGFyaWZ5IHRoZSBjb25jZXB0cy4gTm90ZSB0aGF0 IHlvdSBjYW4gYWxzbyBzdGFjayBiZGV2cyBpbiBvcmRlciB0byBpbnRlcmNlcHQgSU8gY29taW5n IGFuZCBnb2luZyBzbyB5b3UgY2FuIGRvIHZhbHVlIGFkZGVkIHRoaW5ncwogZWFzaWx5LCB3ZSBj YWxsIHRob3NlICYjODIyMDt2aXJ0dWFsIGJkZXZzJiM4MjIxOyBhbmQgeW91JiM4MjE3O2xsIHNl ZSBzb21lIGV4YW1wbGVzIGluIHRoZSBkaXIgSSBqdXN0IG1lbnRpb25lZCAoaWUgc3BsaXQsIGx2 b2wpPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHls ZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPgo8ZGl2Pgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlk ICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+CjxwIGNsYXNzPSJNc29O b3JtYWwiPjxiPkZyb206PC9iPiBTUERLIFs8YSBocmVmPSJtYWlsdG86c3Bkay1ib3VuY2VzQGxp c3RzLjAxLm9yZyI+bWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4wMS5vcmc8L2E+XQo8Yj5PbiBC ZWhhbGYgT2YgPC9iPlNyZWVuaSAoU3JlZW5pdmFzYSkgQnVzYW0gKFN0ZWxsdXMpPGJyPgo8Yj5T ZW50OjwvYj4gRnJpZGF5LCBOb3ZlbWJlciAxMCwgMjAxNyA2OjI1IFBNPGJyPgo8Yj5Ubzo8L2I+ IDxhIGhyZWY9Im1haWx0bzpzcGRrQGxpc3RzLjAxLm9yZyI+c3Bka0BsaXN0cy4wMS5vcmc8L2E+ PGJyPgo8Yj5TdWJqZWN0OjwvYj4gW1NQREtdIFJlcXVlc3QgZm9yIG1vcmUgZGV0YWlscyBvbiBT UERLIGRyaXZlciBBUEkuPG86cD48L286cD48L3A+CjwvZGl2Pgo8L2Rpdj4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPkkgYW0g bmV3IHRvIFNQREsgZHJpdmVyIGFuZCB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGUgdmFyaW91cyBB UEkmIzgyMTc7cyBhdmFpbGFibGUgdG8gZG8gSS9PIG9uIE5WTWUgbG9jYWwgZGV2aWNlIGFuZCB1 c2luZyBOVk1lb0YgcHJvdG9jb2wgb24gYSB0YXJnZXQgZGV2aWNlLgo8bzpwPjwvbzpwPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+SSBzZWUgZGlmZmVyZW50IGludGVyZmFjZXMgZm9yIHRoZSBy ZWFkIGFuZCB3cml0ZSBJL08gb3BlcmF0aW9ucy48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+SXQgc2VlbXMgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBpbnRlcmZhY2VzIGF2YWls YWJsZS48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+MS4gc3Bka19udm1lX25z X2NtZF9yZWFkKCkgYW5kIHNwZGtfbnZtZV9uc19jbWRfd3JpdGUoKSBhbmQgcmVsYXRlZCBmdW5j dGlvbi4gVGhpcyBpcyB1c2VkIGZvciBQQ0llIGRldmljZXMuIEl0IHNlZW1zIHRvIGFwcGx5IHRv IGRldmljZXMgYXR0YWNoZWQgbG9jYWxseS48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCI+Mi4gc3Bka19iZGV2X3JlYWRfYmxvY2tzKCkgYW5kIHNwZGtfYmRldl93cml0ZV9ibG9j a3MoKSBhbmQgcmVsYXRlZCBBUEkmIzgyMTc7cyBpbiBsaWIvYmRldi48bzpwPjwvbzpwPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+SSBoYXZlIGJlZW4gbG9va2luZyBhdCB0aGUgY29kZSBhbmQg dHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgQVBJIGFuZCByZWxhdGVkIEFQSXMgZm9yIHRo ZSBtb2R1bGUgaGFzIGJlZW4gdXNlZCwgdGhlIEFQSSYjODIxNztzIGluIDIuIGFyZSB1c2VkIGZv ciBibG9iZnMgSS9PIG9wZXJhdGlvbiBzcGRrL2xpYi9ibG9iL2JkZXYvKiwgd2hlbiB0aGVyZSBp cyBhIGJsb2IgZmlsZXN5c3RlbSBhbmQgZm9yIEkvTyBvcGVyYXRpb24KIG9uIE5WTWUgZGV2aWNl cyB1c2luZyBOVk1lb0YgcHJvdG9jb2wgc3Bkay9saWIvbnZtZi8qLjxvOnA+PC9vOnA+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj5JcyB0aGlzIGEgY29ycmVjdCBhc3N1bXB0aW9uPyBJcyB0aGUg bGliL2JkZXYgbGF5ZXIgZGV2ZWxvcGVkIHRvIGFkZHJlc3Mgb25seSB0aGVzZSBjYXNlcz88bzpw PjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Q2FuIHRoZSBsaWIvYmRldiBBUEkgYmUg dXNlZCBvbiBhIGxvY2FsIE5WTWUgZGV2aWNlPyBJZiBzbywgaXMgdGhlcmUgYSB0ZXN0IHByb2dy YW0gdG8gdW5kZXJzdGFuZCBob3cgdG8gY3JlYXRlIGEgYmRldiBkZXZpY2UgYW5kIGRvIHRoZSBJ L08gb24gTlZNZSBTU0QgYmxvY2sgZGV2aWNlPzxvOnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNv Tm9ybWFsIj5QbGVhc2UgbGV0IG1lIGtub3cgaWYgdGhlcmUgaXMgYW4gZXhhbXBsZSB0byB1bmRl cnN0YW5kIGhvdyB0byB1c2UgdGhlIGxpYi9udm1mIGludGVyZmFjZXMuIEkgd2FudCB0byB0ZXN0 IGEgZGV2aWNlIG9uIHJlbW90ZSB0YXJnZXQgdXNpbmcgTlZNZW9GIHByb3RvY29sLjxvOnA+PC9v OnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KPHAgY2xh c3M9Ik1zb05vcm1hbCI+VGhhbmtzIHZlcnkgbXVjaCBmb3IgYW55IGhlbHAgaW4gdGhlIGxpYi9i ZGV2IEFQSS48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8 L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8L2Rp dj4KPC9ib2R5Pgo8L2h0bWw+Cg== --===============5762726789321646356==--