From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============1604388233572364554==" MIME-Version: 1.0 From: Sreeni (Sreenivasa) Busam (Stellus) Subject: Re: [SPDK] Regarding NVMe driver command queue depth. Date: Fri, 17 Nov 2017 00:59:18 +0000 Message-ID: In-Reply-To: 82C9F782B054C94B9FC04A331649C77A9D430805@FMSMSX108.amr.corp.intel.com List-ID: To: spdk@lists.01.org --===============1604388233572364554== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Thanks Paul. I got the idea what happens for queue size. Let me take a look at the code and test. From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Luse, Paul E Sent: Thursday, November 16, 2017 4:05 PM To: Storage Performance Development Kit Subject: Re: [SPDK] Regarding NVMe driver command queue depth. Hi Sreeni, So in NVMe the queues are SW constructs that can be made pretty much any si= ze as long as they are smaller than what the HW reports as its max via CAP.= MQES. In the PSDK NVMe driver you can see how the value is determined in t= his function: void nvme_ctrlr_init_cap(struct spdk_nvme_ctrlr *ctrlr, const union spdk_nvme_ca= p_register *cap) { ctrlr->cap =3D *cap; ctrlr->min_page_size =3D 1u << (12 + ctrlr->cap.bits.mpsmin); /* For now, always select page_size =3D=3D min_page_size. */ ctrlr->page_size =3D ctrlr->min_page_size; ctrlr->opts.io_queue_size =3D spdk_max(ctrlr->opts.io_queue_s= ize, SPDK_NVME_IO_QUEUE_MIN_ENTRIES); ctrlr->opts.io_queue_size =3D spdk_min(ctrlr->opts.io_queue_s= ize, ctrlr->cap.bits.mqes + 1u); ctrlr->opts.io_queue_requests =3D spdk_max(ctrlr->opts.io_que= ue_requests, ctrlr->opts.io_queue_size); } So you can control the number via the options structure, struct spdk_nvme_c= trlr_opts, passed in when you probe for devices. So think of it as the siz= e of the submission queue that you create as limited by HW. Does that make sense? Thx Paul From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Sreeni (Sreeni= vasa) Busam (Stellus) Sent: Thursday, November 16, 2017 12:26 PM To: spdk(a)lists.01.org Subject: [SPDK] Regarding NVMe driver command queue depth. Hi Paul, I was reading about the driver from SPDK site, and interested in understand= ing the queue depth for a device. "The specification allows for thousands, but most devices support between 3= 2 and 128. The specification makes no guarantees about the performance avai= lable from each queue pair, but in practice the full performance of a devic= e is almost always achievable using just one queue pair. For example, if a = device claims to be capable of 450,000 I/O per second at queue depth 128, i= n practice it does not matter if the driver is using 4 queue pairs each wit= h queue depth 32, or a single queue pair with queue depth 128" When queue depth is mentioned for device, is it the number of commands that= can be issued from application to controller, and outstanding at any time? Is there NVMe driver API to set the queue depth? Is my understanding correc= t if I think that the size of queue is at firmware level? Please give some detail about the parameter. Thanks, Sreeni --===============1604388233572364554== 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+ PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWlseToiQ2Ft YnJpYSBNYXRoIjsKCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fQpAZm9udC1mYWNlCgl7 Zm9udC1mYW1pbHk6Ik1hbGd1biBHb3RoaWMiOwoJcGFub3NlLTE6MiAxMSA1IDMgMiAwIDAgMiAw IDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6Q2FsaWJyaTsKCXBhbm9zZS0xOjIgMTUgNSAy IDIgMiA0IDMgMiA0O30KQGZvbnQtZmFjZQoJe2ZvbnQtZmFtaWx5OiJcQE1hbGd1biBHb3RoaWMi OwoJcGFub3NlLTE6MiAxMSA1IDMgMiAwIDAgMiAwIDQ7fQovKiBTdHlsZSBEZWZpbml0aW9ucyAq LwpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsK CW1hcmdpbi1ib3R0b206LjAwMDFwdDsKCWZvbnQtc2l6ZToxMS4wcHQ7Cglmb250LWZhbWlseToi Q2FsaWJyaSIsc2Fucy1zZXJpZjt9CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5 bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjojMDU2M0MxOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGlu ZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlv cml0eTo5OTsKCWNvbG9yOiM5NTRGNzI7Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30Kc3Bh bi5FbWFpbFN0eWxlMTcKCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsKCWZvbnQtZmFtaWx5OiJD YWxpYnJpIixzYW5zLXNlcmlmOwoJY29sb3I6d2luZG93dGV4dDt9CnNwYW4uRW1haWxTdHlsZTE4 Cgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1z ZXJpZjsKCWNvbG9yOiMxRjQ5N0Q7fQpzcGFuLkVtYWlsU3R5bGUxOQoJe21zby1zdHlsZS10eXBl OnBlcnNvbmFsLXJlcGx5OwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7Cgljb2xv cjojMUY0OTdEO30KLk1zb0NocERlZmF1bHQKCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsK CWZvbnQtc2l6ZToxMC4wcHQ7fQpAcGFnZSBXb3JkU2VjdGlvbjEKCXtzaXplOjguNWluIDExLjBp bjsKCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9CmRpdi5Xb3JkU2VjdGlvbjEKCXtw YWdlOldvcmRTZWN0aW9uMTt9Ci0tPjwvc3R5bGU+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Cjxv OnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjEwMjYiIC8+CjwveG1sPjwhW2Vu ZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8bzpzaGFwZWxheW91dCB2OmV4dD0iZWRp dCI+CjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIxIiAvPgo8L286c2hhcGVsYXlvdXQ+PC94 bWw+PCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9IiMwNTYzQzEi IHZsaW5rPSIjOTU0RjcyIj4KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlRoYW5rcyBQYXVsLiA8bzpwPjwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjoj MUY0OTdEIj5JIGdvdCB0aGUgaWRlYSB3aGF0IGhhcHBlbnMgZm9yIHF1ZXVlIHNpemUuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6 IzFGNDk3RCI+TGV0IG1lIHRha2UgYSBsb29rIGF0IHRoZSBjb2RlIGFuZCB0ZXN0LjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGEgbmFtZT0iX01haWxFbmRDb21w b3NlIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9hPjwvcD4KPGRpdj4KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAj RTFFMUUxIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPgo8cCBjbGFzcz0iTXNvTm9y bWFsIj48Yj5Gcm9tOjwvYj4gU1BESyBbbWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4wMS5vcmdd IDxiPk9uIEJlaGFsZiBPZgo8L2I+THVzZSwgUGF1bCBFPGJyPgo8Yj5TZW50OjwvYj4gVGh1cnNk YXksIE5vdmVtYmVyIDE2LCAyMDE3IDQ6MDUgUE08YnI+CjxiPlRvOjwvYj4gU3RvcmFnZSBQZXJm b3JtYW5jZSBEZXZlbG9wbWVudCBLaXQgJmx0O3NwZGtAbGlzdHMuMDEub3JnJmd0Ozxicj4KPGI+ U3ViamVjdDo8L2I+IFJlOiBbU1BES10gUmVnYXJkaW5nIE5WTWUgZHJpdmVyIGNvbW1hbmQgcXVl dWUgZGVwdGguPG86cD48L286cD48L3A+CjwvZGl2Pgo8L2Rpdj4KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJjb2xvcjojMUY0OTdEIj5IaSBTcmVlbmksPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFG NDk3RCI+U28gaW4gTlZNZSB0aGUgcXVldWVzIGFyZSBTVyBjb25zdHJ1Y3RzIHRoYXQgY2FuIGJl IG1hZGUgcHJldHR5IG11Y2ggYW55IHNpemUgYXMgbG9uZyBhcyB0aGV5IGFyZSBzbWFsbGVyIHRo YW4gd2hhdCB0aGUgSFcgcmVwb3J0cyBhcyBpdHMgbWF4IHZpYSBDQVAuTVFFUy4mbmJzcDsgSW4g dGhlIFBTREsgTlZNZSBkcml2ZXIgeW91IGNhbiBzZWUgaG93IHRoZSB2YWx1ZSBpcwogZGV0ZXJt aW5lZCBpbiB0aGlzIGZ1bmN0aW9uOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9z cGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0Qi PnZvaWQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0 eWxlPSJjb2xvcjojMUY0OTdEIj5udm1lX2N0cmxyX2luaXRfY2FwKHN0cnVjdCBzcGRrX252bWVf Y3RybHIgKmN0cmxyLCBjb25zdCB1bmlvbiBzcGRrX252bWVfY2FwX3JlZ2lzdGVyICpjYXApPG86 cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+ezxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHJsci0m Z3Q7Y2FwID0gKmNhcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+ CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgY3RybHItJmd0O21pbl9wYWdlX3NpemUgPSAxdSAmbHQ7Jmx0OyAoMTIg JiM0MzsgY3RybHItJmd0O2NhcC5iaXRzLm1wc21pbik7PG86cD48L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6IzFGNDk3RCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8qIEZvciBub3csIGFsd2F5cyBzZWxl Y3QgcGFnZV9zaXplID09IG1pbl9wYWdlX3NpemUuICovPG86cD48L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IGN0cmxyLSZndDtwYWdlX3NpemUgPSBjdHJsci0mZ3Q7bWluX3BhZ2Vfc2l6 ZTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgY3RybHItJmd0O29wdHMuaW9fcXVldWVfc2l6ZSA9IHNwZGtfbWF4KGN0cmxyLSZndDtvcHRz LmlvX3F1ZXVlX3NpemUsIFNQREtfTlZNRV9JT19RVUVVRV9NSU5fRU5UUklFUyk7PG86cD48L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFG NDk3RCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0cmxyLSZndDtvcHRzLmlvX3F1ZXVlX3NpemUg PSBzcGRrX21pbihjdHJsci0mZ3Q7b3B0cy5pb19xdWV1ZV9zaXplLCBjdHJsci0mZ3Q7Y2FwLmJp dHMubXFlcyAmIzQzOyAxdSk7PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0cmxyLSZndDtvcHRzLmlvX3F1ZXVlX3JlcXVlc3RzID0gc3Bk a19tYXgoY3RybHItJmd0O29wdHMuaW9fcXVldWVfcmVxdWVzdHMsIGN0cmxyLSZndDtvcHRzLmlv X3F1ZXVlX3NpemUpOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPn08bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjoj MUY0OTdEIj5TbyB5b3UgY2FuIGNvbnRyb2wgdGhlIG51bWJlciB2aWEgdGhlIG9wdGlvbnMgc3Ry dWN0dXJlLCBzdHJ1Y3Qgc3Bka19udm1lX2N0cmxyX29wdHMsIHBhc3NlZCBpbiB3aGVuIHlvdSBw cm9iZSBmb3IgZGV2aWNlcy4mbmJzcDsgU28gdGhpbmsgb2YgaXQgYXMgdGhlIHNpemUgb2YgdGhl IHN1Ym1pc3Npb24gcXVldWUgdGhhdCB5b3UgY3JlYXRlIGFzIGxpbWl0ZWQgYnkgSFcuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6 IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+RG9lcyB0aGF0IG1ha2Ugc2Vuc2U/IDxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlRoeDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlBhdWw8bzpw PjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xv cjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+CjxkaXY+CjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0UxRTFF MSAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PGEgbmFtZT0iX19fX19yZXBseXNlcGFyYXRvciI+PC9hPjxiPkZyb206PC9iPiBTUERLIFs8YSBo cmVmPSJtYWlsdG86c3Bkay1ib3VuY2VzQGxpc3RzLjAxLm9yZyI+bWFpbHRvOnNwZGstYm91bmNl c0BsaXN0cy4wMS5vcmc8L2E+XQo8Yj5PbiBCZWhhbGYgT2YgPC9iPlNyZWVuaSAoU3JlZW5pdmFz YSkgQnVzYW0gKFN0ZWxsdXMpPGJyPgo8Yj5TZW50OjwvYj4gVGh1cnNkYXksIE5vdmVtYmVyIDE2 LCAyMDE3IDEyOjI2IFBNPGJyPgo8Yj5Ubzo8L2I+IDxhIGhyZWY9Im1haWx0bzpzcGRrQGxpc3Rz LjAxLm9yZyI+c3Bka0BsaXN0cy4wMS5vcmc8L2E+PGJyPgo8Yj5TdWJqZWN0OjwvYj4gW1NQREtd IFJlZ2FyZGluZyBOVk1lIGRyaXZlciBjb21tYW5kIHF1ZXVlIGRlcHRoLjxvOnA+PC9vOnA+PC9w Pgo8L2Rpdj4KPC9kaXY+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9w Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj5IaSBQYXVsLDxvOnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0i TXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SSB3 YXMgcmVhZGluZyBhYm91dCB0aGUgZHJpdmVyIGZyb20gU1BESyBzaXRlLCBhbmQgaW50ZXJlc3Rl ZCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBxdWV1ZSBkZXB0aCBmb3IgYSBkZXZpY2UuPG86cD48L286 cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTMuNXB0 O2ZvbnQtZmFtaWx5OiZxdW90O0FyaWFsJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzMzMzMzMzti YWNrZ3JvdW5kOndoaXRlIj4mIzgyMjA7VGhlIHNwZWNpZmljYXRpb24gYWxsb3dzIGZvciB0aG91 c2FuZHMsIGJ1dCBtb3N0IGRldmljZXMgc3VwcG9ydCBiZXR3ZWVuIDMyIGFuZCAxMjguIFRoZSBz cGVjaWZpY2F0aW9uIG1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgdGhlIHBlcmZvcm1hbmNlCiBh dmFpbGFibGUgZnJvbSBlYWNoIHF1ZXVlIHBhaXIsIGJ1dCBpbiBwcmFjdGljZSB0aGUgZnVsbCBw ZXJmb3JtYW5jZSBvZiBhIGRldmljZSBpcyBhbG1vc3QgYWx3YXlzIGFjaGlldmFibGUgdXNpbmcg anVzdCBvbmUgcXVldWUgcGFpci4gRm9yIGV4YW1wbGUsIGlmIGEgZGV2aWNlIGNsYWltcyB0byBi ZSBjYXBhYmxlIG9mIDQ1MCwwMDAgSS9PIHBlciBzZWNvbmQgYXQgcXVldWUgZGVwdGggMTI4LCBp biBwcmFjdGljZSBpdCBkb2VzIG5vdCBtYXR0ZXIKIGlmIHRoZSBkcml2ZXIgaXMgdXNpbmcgNCBx dWV1ZSBwYWlycyBlYWNoIHdpdGggcXVldWUgZGVwdGggMzIsIG9yIGEgc2luZ2xlIHF1ZXVlIHBh aXIgd2l0aCBxdWV1ZSBkZXB0aCAxMjgmIzgyMjE7PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj5XaGVuIHF1ZXVlIGRlcHRoIGlzIG1lbnRpb25lZCBmb3IgZGV2aWNl LCBpcyBpdCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHRoYXQgY2FuIGJlIGlzc3VlZCBmcm9tIGFw cGxpY2F0aW9uIHRvIGNvbnRyb2xsZXIsIGFuZCBvdXRzdGFuZGluZyBhdCBhbnkgdGltZT8KPG86 cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPklzIHRoZXJlIE5WTWUgZHJpdmVyIEFQ SSB0byBzZXQgdGhlIHF1ZXVlIGRlcHRoPyBJcyBteSB1bmRlcnN0YW5kaW5nIGNvcnJlY3QgaWYg SSB0aGluayB0aGF0IHRoZSBzaXplIG9mIHF1ZXVlIGlzIGF0IGZpcm13YXJlIGxldmVsPwo8bzpw PjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+UGxlYXNlIGdpdmUgc29tZSBkZXRhaWwg YWJvdXQgdGhlIHBhcmFtZXRlci48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPlRoYW5rcyw8bzpwPjwv bzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+U3JlZW5pPG86cD48L286cD48L3A+CjwvZGl2 Pgo8L2JvZHk+CjwvaHRtbD4K --===============1604388233572364554==--