From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5726034450939015290==" MIME-Version: 1.0 From: Kaligotla, Srikanth Subject: Re: [SPDK] BDEV-IO Lifecycle - Need your input. Date: Wed, 20 Jun 2018 19:47:51 +0000 Message-ID: In-Reply-To: 040442CD-8933-4115-8DE1-A5E6BEC7AFC0@netapp.com List-ID: To: spdk@lists.01.org --===============5726034450939015290== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hello, First revision of changes to extend the lifecycle of bdev_io are available = for review. I would like to solicit your input on the proposed API/Code flo= w changes. https://review.gerrithub.io/c/spdk/spdk/+/415860 Thanks, Srikanth From: "Kaligotla, Srikanth" > Date: Friday, May 11, 2018 at 2:27 PM To: "Walker, Benjamin" >, "Harris, James R" > Cc: "raju.gottumukkala(a)broadcom.com" >, "Meneghini, John" >, "Rodriguez, Edwin" >, "Pai, Madhu" >, "NGC-john.barnard-broadcom.com" >, "spdk(a)lists.01.org" > Subject: RE: BDEV-IO Lifecycle - Need your input. CC: List Hi Ben, Your proposal to inter= face with the backend to acquire and release buffers is good. You have accu= rately stated that the challenge is in developing intuitive semantics. And = that has been my struggle. To me, there are two problem statements; 1. It is expected that bdev_io pool is sized correctly so the call to ge= t bdev_io succeeds. Failure to acquire bdev_io will result in DEVICE-ERROR.= The transport is already capable of handling temporary memory failures by = moving the request to PENDING-Queue. Hence the proposal to change the bdev_= io lifecycle and perhaps connect it with the spdk_nvmf_request object. Thus= all buffer needs are addressed at the beginning of I/O request. 2. I/O Data buffers are sourced and managed by the backend. One of the c= hallenges I see with your proposed interface is the lack of details like if= resource is being acquired for a READ operation or WRITE operation. The ha= ndling is quite different in each case. Since bdev_io->type is overloaded t= he type of I/O operation is lost. I suppose one can cast the cb_arg (nvmf_r= equest) and then proceed. Also, the bdev_io should be present to RELEASE th= e buffer. Zero copy semantics warrants that data buffer stays until control= ler-to-host has occurred. In other words, bdev_io lives till REQUEST come t= o COMPLETE state. What are your thoughts in introducing spdk_bdev_init() and spdk_bdev_fini()= as an alternative approach to extend the lifecyle of bdev_io and allow dat= a buffer management via bdev fn_table ? I hope I=E2=80=99m making sense=E2=80=A6 Thanks, Srikanth From: Walker, Benjamin > Sent: Friday, May 11, 2018 12:28 PM To: Harris, James R >; Kaligotla, Srikanth > Cc: raju.gottumukkala(a)broadcom.com; Meneghini, John >; Rodriguez, Edwin >; Pai, Madhu >; NGC-john.barnard-broadcom.com > Subject: Re: BDEV-IO Lifecycle - Need your input. Hi Srikanth, Yes - we'll need to introduce some way to acquire and release buffers from = the bdev layer earlier on in the state machine that processes an NVMe-oF re= quest. I've had this patch out for review for several months as a proposal = for this scenario: https://review.gerrithub.io/#/c/spdk/spdk/+/386166/ It doesn't pass the tests - it's just a proposal for the interface. 90% of = the challenge here is in developing intuitive semantics. Thanks, Ben P.S. This is the kind of discussion that would fit perfectly on the mailing= list. On Wed, 2018-05-09 at 20:35 +0000, Kaligotla, Srikanth wrote: Hi Ben, Hi James, I would like to solicit opinions on the lifecycle for bdev-io resource obje= ct. Attached is the image of RDMA state machine in its current implementati= on. When the REQUEST enters the NEED-BUFFER state, the buffers necessary fo= r carrying out I/O operation are allocated/acquired from the memory pool. A= n instance of BDEV-IO comes into existence after REQUEST reaches READY-TO-E= XECUTE state. The BDEV-IO is teared down as soon the backend returns. From = a BDEV perspective, BDEV-IO is simply a translation unit that facilitates I= /O buffers from the backend. The driver context embedded within bdev_io hol= ds great deal of information pertaining to the I/O under execution. It assi= sts in error handling, dereferencing the buffers upon I/O completion and in= abort handling. In summary, the bdev_io stays alive until request has come= to COMPLETE state. I=E2=80=99d like to hear peoples thoughts in introducin= g the plumbing to acquire BDEV-IO resource in REQUEST-NEED-BUFFER state and= release it in REQUEST-COMPLETE state. I will shortly have patch available= for review that introduces spdk_bdev_init and spdk_bdev_fini which in turn= invokes the corresponding bdev fn_table to initialize/cleanup. I wanted to use this email to communicate our intent and solicit your feedb= ack. We have a working implementation of the above proposal and prior to pu= shing it upstream for review would like to hear your thoughts. These propos= ed changes to upstream are a result of FC transport work in collaboration w= ith the Broadcom team who are also copied to this mail. Myself and John wil= l be at SPDK Dev conference and if required we can elaborate further on thi= s proposal. Thanks, Srikanth --===============5726034450939015290== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPHN0eWxl PjwhLS0NCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6 IkNhbWJyaWEgTWF0aCI7DQoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9DQpAZm9udC1m YWNlDQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7DQoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAy IDQ7fQ0KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCnAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWws IGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJ Zm9udC1zaXplOjExLjBwdDsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9DQph OmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xv cjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1z b0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJw bGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwLk1zb0xpc3RQYXJhZ3JhcGgsIGxp Lk1zb0xpc3RQYXJhZ3JhcGgsIGRpdi5Nc29MaXN0UGFyYWdyYXBoDQoJe21zby1zdHlsZS1wcmlv cml0eTozNDsNCgltYXJnaW4tdG9wOjBpbjsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1i b3R0b206MGluOw0KCW1hcmdpbi1sZWZ0Oi41aW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0K CWZvbnQtc2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7fQ0K cC5tc29ub3JtYWwwLCBsaS5tc29ub3JtYWwwLCBkaXYubXNvbm9ybWFsMA0KCXttc28tc3R5bGUt bmFtZTptc29ub3JtYWw7DQoJbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87DQoJbWFyZ2luLXJpZ2h0 OjBpbjsNCgltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsNCgltYXJnaW4tbGVmdDowaW47DQoJ Zm9udC1zaXplOjExLjBwdDsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9DQpz cGFuLkVtYWlsU3R5bGUxOQ0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsNCglmb250LWZhbWls eToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsNCgljb2xvcjp3aW5kb3d0ZXh0O30NCnNwYW4uRW1haWxT dHlsZTIwDQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOw0KCWZvbnQtZmFtaWx5OiJDYWxpYnJp IixzYW5zLXNlcmlmOw0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0eWxlMjENCgl7 bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNhbnMtc2Vy aWY7DQoJY29sb3I6d2luZG93dGV4dDt9DQpzcGFuLkVtYWlsU3R5bGUyMw0KCXttc28tc3R5bGUt dHlwZTpwZXJzb25hbC1yZXBseTsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjsN Cgljb2xvcjp3aW5kb3d0ZXh0O30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4 cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZToxMC4wcHQ7fQ0KQHBhZ2UgV29yZFNlY3Rpb24xDQoJe3Np emU6OC41aW4gMTEuMGluOw0KCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9DQpkaXYu V29yZFNlY3Rpb24xDQoJe3BhZ2U6V29yZFNlY3Rpb24xO30NCi8qIExpc3QgRGVmaW5pdGlvbnMg Ki8NCkBsaXN0IGwwDQoJe21zby1saXN0LWlkOjEzNzA3NjA5NDE7DQoJbXNvLWxpc3QtdHlwZTpo eWJyaWQ7DQoJbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0xNTc5MTc2MTIgNjc2OTg3MDMgNjc2OTg3 MTMgNjc2OTg3MTUgNjc2OTg3MDMgNjc2OTg3MTMgNjc2OTg3MTUgNjc2OTg3MDMgNjc2OTg3MTMg Njc2OTg3MTU7fQ0KQGxpc3QgbDA6bGV2ZWwxDQoJe21zby1sZXZlbC10YWItc3RvcDpub25lOw0K CW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDouNzVpbjsNCgl0 ZXh0LWluZGVudDotLjI1aW47fQ0KQGxpc3QgbDA6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXIt Zm9ybWF0OmFscGhhLWxvd2VyOw0KCW1zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1sZXZl bC1udW1iZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDoxLjI1aW47DQoJdGV4dC1pbmRl bnQ6LS4yNWluO30NCkBsaXN0IGwwOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpy b21hbi1sb3dlcjsNCgltc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVy LXBvc2l0aW9uOnJpZ2h0Ow0KCW1hcmdpbi1sZWZ0OjEuNzVpbjsNCgl0ZXh0LWluZGVudDotOS4w cHQ7fQ0KQGxpc3QgbDA6bGV2ZWw0DQoJe21zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1s ZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDoyLjI1aW47DQoJdGV4dC1p bmRlbnQ6LS4yNWluO30NCkBsaXN0IGwwOmxldmVsNQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1h dDphbHBoYS1sb3dlcjsNCgltc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVt YmVyLXBvc2l0aW9uOmxlZnQ7DQoJbWFyZ2luLWxlZnQ6Mi43NWluOw0KCXRleHQtaW5kZW50Oi0u MjVpbjt9DQpAbGlzdCBsMDpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6cm9tYW4t bG93ZXI7DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVsLW51bWJlci1wb3Np dGlvbjpyaWdodDsNCgltYXJnaW4tbGVmdDozLjI1aW47DQoJdGV4dC1pbmRlbnQ6LTkuMHB0O30N CkBsaXN0IGwwOmxldmVsNw0KCXttc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwt bnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJbWFyZ2luLWxlZnQ6My43NWluOw0KCXRleHQtaW5kZW50 Oi0uMjVpbjt9DQpAbGlzdCBsMDpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YWxw aGEtbG93ZXI7DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCW1hcmdpbi1sZWZ0OjQuMjVpbjsNCgl0ZXh0LWluZGVudDotLjI1aW47 fQ0KQGxpc3QgbDA6bGV2ZWw5DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OnJvbWFuLWxvd2Vy Ow0KCW1zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246 cmlnaHQ7DQoJbWFyZ2luLWxlZnQ6NC43NWluOw0KCXRleHQtaW5kZW50Oi05LjBwdDt9DQpvbA0K CXttYXJnaW4tYm90dG9tOjBpbjt9DQp1bA0KCXttYXJnaW4tYm90dG9tOjBpbjt9DQotLT48L3N0 eWxlPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRp dCIgc3BpZG1heD0iMTAyNiIgLz4NCjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5 XT48eG1sPg0KPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0KPG86aWRtYXAgdjpleHQ9ImVk aXQiIGRhdGE9IjEiIC8+DQo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+DQo8L2hl YWQ+DQo8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5r PSJwdXJwbGUiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPkhlbGxvLDxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJz cDs8L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5GaXJzdCByZXZpc2lvbiBvZiBjaGFu Z2VzIHRvIGV4dGVuZCB0aGUgbGlmZWN5Y2xlIG9mIGJkZXZfaW8gYXJlIGF2YWlsYWJsZSBmb3Ig cmV2aWV3LiBJIHdvdWxkIGxpa2UgdG8gc29saWNpdCB5b3VyIGlucHV0IG9uIHRoZSBwcm9wb3Nl ZCBBUEkvQ29kZSBmbG93IGNoYW5nZXMuDQo8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGEgaHJl Zj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvL2Mvc3Bkay9zcGRrLyYjNDM7LzQxNTg2MCI+ aHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvL2Mvc3Bkay9zcGRrLyYjNDM7LzQxNTg2MDwvYT48 bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhhbmtzLDxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+U3Jpa2FudGg8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8 L286cD48L3A+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNCNUM0 REYgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48Yj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkZyb206IDwvc3Bhbj48L2I+PHNwYW4gc3R5 bGU9ImNvbG9yOmJsYWNrIj4mcXVvdDtLYWxpZ290bGEsIFNyaWthbnRoJnF1b3Q7ICZsdDs8YSBo cmVmPSJtYWlsdG86U3Jpa2FudGguS2FsaWdvdGxhQG5ldGFwcC5jb20iPlNyaWthbnRoLkthbGln b3RsYUBuZXRhcHAuY29tPC9hPiZndDs8YnI+DQo8Yj5EYXRlOiA8L2I+RnJpZGF5LCBNYXkgMTEs IDIwMTggYXQgMjoyNyBQTTxicj4NCjxiPlRvOiA8L2I+JnF1b3Q7V2Fsa2VyLCBCZW5qYW1pbiZx dW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRvOmJlbmphbWluLndhbGtlckBpbnRlbC5jb20iPmJlbmph bWluLndhbGtlckBpbnRlbC5jb208L2E+Jmd0OywgJnF1b3Q7SGFycmlzLCBKYW1lcyBSJnF1b3Q7 ICZsdDs8YSBocmVmPSJtYWlsdG86amFtZXMuci5oYXJyaXNAaW50ZWwuY29tIj5qYW1lcy5yLmhh cnJpc0BpbnRlbC5jb208L2E+Jmd0Ozxicj4NCjxiPkNjOiA8L2I+JnF1b3Q7PGEgaHJlZj0ibWFp bHRvOnJhanUuZ290dHVtdWtrYWxhQGJyb2FkY29tLmNvbSI+cmFqdS5nb3R0dW11a2thbGFAYnJv YWRjb20uY29tPC9hPiZxdW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRvOnJhanUuZ290dHVtdWtrYWxh QGJyb2FkY29tLmNvbSI+cmFqdS5nb3R0dW11a2thbGFAYnJvYWRjb20uY29tPC9hPiZndDssICZx dW90O01lbmVnaGluaSwgSm9obiZxdW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRvOkpvaG4uTWVuZWdo aW5pQG5ldGFwcC5jb20iPkpvaG4uTWVuZWdoaW5pQG5ldGFwcC5jb208L2E+Jmd0OywNCiAmcXVv dDtSb2RyaWd1ZXosIEVkd2luJnF1b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86RWQuUm9kcmlndWV6 QG5ldGFwcC5jb20iPkVkLlJvZHJpZ3VlekBuZXRhcHAuY29tPC9hPiZndDssICZxdW90O1BhaSwg TWFkaHUmcXVvdDsgJmx0OzxhIGhyZWY9Im1haWx0bzpNYWRodXN1ZGFuLlBhaUBuZXRhcHAuY29t Ij5NYWRodXN1ZGFuLlBhaUBuZXRhcHAuY29tPC9hPiZndDssICZxdW90O05HQy1qb2huLmJhcm5h cmQtYnJvYWRjb20uY29tJnF1b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86am9obi5iYXJuYXJkQGJy b2FkY29tLmNvbSI+am9obi5iYXJuYXJkQGJyb2FkY29tLmNvbTwvYT4mZ3Q7LA0KICZxdW90Ozxh IGhyZWY9Im1haWx0bzpzcGRrQGxpc3RzLjAxLm9yZyI+c3Bka0BsaXN0cy4wMS5vcmc8L2E+JnF1 b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEu b3JnPC9hPiZndDs8YnI+DQo8Yj5TdWJqZWN0OiA8L2I+UkU6IEJERVYtSU8gTGlmZWN5Y2xlIC0g TmVlZCB5b3VyIGlucHV0Ljwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEyLjBwdDtjb2xv cjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21h biZxdW90OyxzZXJpZiI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj5DQzogTGlzdDxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5IaSBCZW4s PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPllvdXIgPGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vy cml0aHViLmlvLyMvYy9zcGRrL3NwZGsvJiM0MzsvMzg2MTY2LyI+DQpwcm9wb3NhbDwvYT4gdG8g aW50ZXJmYWNlIHdpdGggdGhlIGJhY2tlbmQgdG8gYWNxdWlyZSBhbmQgcmVsZWFzZSBidWZmZXJz IGlzIGdvb2QuIFlvdSBoYXZlIGFjY3VyYXRlbHkgc3RhdGVkIHRoYXQgdGhlIGNoYWxsZW5nZSBp cyBpbiBkZXZlbG9waW5nIGludHVpdGl2ZSBzZW1hbnRpY3MuIEFuZCB0aGF0IGhhcyBiZWVuIG15 IHN0cnVnZ2xlLiBUbyBtZSwgdGhlcmUgYXJlIHR3byBwcm9ibGVtIHN0YXRlbWVudHM7DQo8bzpw PjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0K PG9sIHN0eWxlPSJtYXJnaW4tdG9wOjBpbiIgc3RhcnQ9IjEiIHR5cGU9IjEiPg0KPGxpIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouMjVpbjttc28tbGlzdDpsMCBsZXZlbDEg bGZvMiI+SXQgaXMgZXhwZWN0ZWQgdGhhdCBiZGV2X2lvIHBvb2wgaXMgc2l6ZWQgY29ycmVjdGx5 IHNvIHRoZSBjYWxsIHRvIGdldCBiZGV2X2lvIHN1Y2NlZWRzLiBGYWlsdXJlIHRvIGFjcXVpcmUg YmRldl9pbyB3aWxsIHJlc3VsdCBpbiBERVZJQ0UtRVJST1IuIFRoZSB0cmFuc3BvcnQgaXMgYWxy ZWFkeSBjYXBhYmxlIG9mIGhhbmRsaW5nDQogdGVtcG9yYXJ5IG1lbW9yeSBmYWlsdXJlcyBieSBt b3ZpbmcgdGhlIHJlcXVlc3QgdG8gUEVORElORy1RdWV1ZS4gSGVuY2UgdGhlIHByb3Bvc2FsIHRv IGNoYW5nZSB0aGUgYmRldl9pbyBsaWZlY3ljbGUgYW5kIHBlcmhhcHMgY29ubmVjdCBpdCB3aXRo IHRoZSBzcGRrX252bWZfcmVxdWVzdCBvYmplY3QuIFRodXMgYWxsIGJ1ZmZlciBuZWVkcyBhcmUg YWRkcmVzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgSS9PIHJlcXVlc3QuPHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMi4wcHQiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouMjVpbjttc28tbGlzdDpsMCBsZXZlbDEgbGZvMiI+SS9P IERhdGEgYnVmZmVycyBhcmUgc291cmNlZCBhbmQgbWFuYWdlZCBieSB0aGUgYmFja2VuZC4gT25l IG9mIHRoZSBjaGFsbGVuZ2VzIEkgc2VlIHdpdGggeW91ciBwcm9wb3NlZCBpbnRlcmZhY2UgaXMg dGhlIGxhY2sgb2YgZGV0YWlscyBsaWtlIGlmIHJlc291cmNlIGlzIGJlaW5nIGFjcXVpcmVkIGZv ciBhIFJFQUQgb3BlcmF0aW9uDQogb3IgV1JJVEUgb3BlcmF0aW9uLiBUaGUgaGFuZGxpbmcgaXMg cXVpdGUgZGlmZmVyZW50IGluIGVhY2ggY2FzZS4gU2luY2UgYmRldl9pby0mZ3Q7dHlwZSBpcyBv dmVybG9hZGVkIHRoZSB0eXBlIG9mIEkvTyBvcGVyYXRpb24gaXMgbG9zdC4gSSBzdXBwb3NlIG9u ZSBjYW4gY2FzdCB0aGUgY2JfYXJnIChudm1mX3JlcXVlc3QpIGFuZCB0aGVuIHByb2NlZWQuIEFs c28sIHRoZSBiZGV2X2lvIHNob3VsZCBiZSBwcmVzZW50IHRvIFJFTEVBU0UgdGhlIGJ1ZmZlci4N CiBaZXJvIGNvcHkgc2VtYW50aWNzIHdhcnJhbnRzIHRoYXQgZGF0YSBidWZmZXIgc3RheXMgdW50 aWwgY29udHJvbGxlci10by1ob3N0IGhhcyBvY2N1cnJlZC4gSW4gb3RoZXIgd29yZHMsIGJkZXZf aW8gbGl2ZXMgdGlsbCBSRVFVRVNUIGNvbWUgdG8gQ09NUExFVEUgc3RhdGUuDQo8c3BhbiBzdHls ZT0iZm9udC1zaXplOjEyLjBwdCI+PG86cD48L286cD48L3NwYW4+PC9saT48L29sPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij5XaGF0IGFyZSB5b3VyIHRob3VnaHRzIGluIGludHJvZHVjaW5nIHNwZGtfYmRldl9pbml0KCkg YW5kIHNwZGtfYmRldl9maW5pKCkgYXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gZXh0ZW5k IHRoZSBsaWZlY3lsZSBvZiBiZGV2X2lvIGFuZCBhbGxvdyBkYXRhIGJ1ZmZlciBtYW5hZ2VtZW50 IHZpYSBiZGV2IGZuX3RhYmxlID88bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SSBob3BlIEnigJlt IG1ha2luZyBzZW5zZeKApjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5i c3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5UaGFua3MsPG86cD48L286 cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5TcmlrYW50aDxvOnA+PC9vOnA+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8ZGl2Pg0KPGRpdiBzdHls ZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6My4w cHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+RnJvbTo8L2I+IFdhbGtl ciwgQmVuamFtaW4gJmx0OzxhIGhyZWY9Im1haWx0bzpiZW5qYW1pbi53YWxrZXJAaW50ZWwuY29t Ij5iZW5qYW1pbi53YWxrZXJAaW50ZWwuY29tPC9hPiZndDsNCjxicj4NCjxiPlNlbnQ6PC9iPiBG cmlkYXksIE1heSAxMSwgMjAxOCAxMjoyOCBQTTxicj4NCjxiPlRvOjwvYj4gSGFycmlzLCBKYW1l cyBSICZsdDs8YSBocmVmPSJtYWlsdG86amFtZXMuci5oYXJyaXNAaW50ZWwuY29tIj5qYW1lcy5y LmhhcnJpc0BpbnRlbC5jb208L2E+Jmd0OzsgS2FsaWdvdGxhLCBTcmlrYW50aCAmbHQ7PGEgaHJl Zj0ibWFpbHRvOlNyaWthbnRoLkthbGlnb3RsYUBuZXRhcHAuY29tIj5TcmlrYW50aC5LYWxpZ290 bGFAbmV0YXBwLmNvbTwvYT4mZ3Q7PGJyPg0KPGI+Q2M6PC9iPiA8YSBocmVmPSJtYWlsdG86cmFq dS5nb3R0dW11a2thbGFAYnJvYWRjb20uY29tIj5yYWp1LmdvdHR1bXVra2FsYUBicm9hZGNvbS5j b208L2E+OyBNZW5lZ2hpbmksIEpvaG4gJmx0OzxhIGhyZWY9Im1haWx0bzpKb2huLk1lbmVnaGlu aUBuZXRhcHAuY29tIj5Kb2huLk1lbmVnaGluaUBuZXRhcHAuY29tPC9hPiZndDs7IFJvZHJpZ3Vl eiwgRWR3aW4gJmx0OzxhIGhyZWY9Im1haWx0bzpFZC5Sb2RyaWd1ZXpAbmV0YXBwLmNvbSI+RWQu Um9kcmlndWV6QG5ldGFwcC5jb208L2E+Jmd0OzsNCiBQYWksIE1hZGh1ICZsdDs8YSBocmVmPSJt YWlsdG86TWFkaHVzdWRhbi5QYWlAbmV0YXBwLmNvbSI+TWFkaHVzdWRhbi5QYWlAbmV0YXBwLmNv bTwvYT4mZ3Q7OyBOR0Mtam9obi5iYXJuYXJkLWJyb2FkY29tLmNvbSAmbHQ7PGEgaHJlZj0ibWFp bHRvOmpvaG4uYmFybmFyZEBicm9hZGNvbS5jb20iPmpvaG4uYmFybmFyZEBicm9hZGNvbS5jb208 L2E+Jmd0Ozxicj4NCjxiPlN1YmplY3Q6PC9iPiBSZTogQkRFVi1JTyBMaWZlY3ljbGUgLSBOZWVk IHlvdXIgaW5wdXQuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+SGkgU3Jpa2FudGgsPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPlllcyAtIHdlJ2xsIG5lZWQgdG8gaW50cm9kdWNlIHNvbWUgd2F5IHRvIGFj cXVpcmUgYW5kIHJlbGVhc2UgYnVmZmVycyBmcm9tIHRoZSBiZGV2IGxheWVyIGVhcmxpZXIgb24g aW4gdGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBwcm9jZXNzZXMgYW4gTlZNZS1vRiByZXF1ZXN0LiBJ J3ZlIGhhZCB0aGlzIHBhdGNoIG91dCBmb3IgcmV2aWV3IGZvciBzZXZlcmFsIG1vbnRocyBhcyBh IHByb3Bvc2FsIGZvciB0aGlzIHNjZW5hcmlvOjxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48YSBocmVmPSJodHRwczovL3Jldmlldy5nZXJyaXRo dWIuaW8vIy9jL3NwZGsvc3Bkay8mIzQzOy8zODYxNjYvIj5odHRwczovL3Jldmlldy5nZXJyaXRo dWIuaW8vIy9jL3NwZGsvc3Bkay8mIzQzOy8zODYxNjYvPC9hPjxvOnA+PC9vOnA+PC9wPg0KPC9k aXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5JdCBkb2Vzbid0IHBhc3MgdGhlIHRl c3RzIC0gaXQncyBqdXN0IGEgcHJvcG9zYWwgZm9yIHRoZSBpbnRlcmZhY2UuIDkwJSBvZiB0aGUg Y2hhbGxlbmdlIGhlcmUgaXMgaW4gZGV2ZWxvcGluZyBpbnR1aXRpdmUgc2VtYW50aWNzLjxvOnA+ PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Jm5ic3A7PG86 cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5UaGFua3Ms PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5CZW48 bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNw OzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+UC5T LiBUaGlzIGlzIHRoZSBraW5kIG9mIGRpc2N1c3Npb24gdGhhdCB3b3VsZCBmaXQgcGVyZmVjdGx5 IG9uIHRoZSBtYWlsaW5nIGxpc3QuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPk9uIFdlZCwgMjAxOC0wNS0wOSBhdCAyMDozNSAmIzQzOzAwMDAs IEthbGlnb3RsYSwgU3Jpa2FudGggd3JvdGU6PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxibG9j a3F1b3RlIHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItbGVmdDpzb2xpZCAjNzI5RkNGIDEuNXB0 O3BhZGRpbmc6MGluIDBpbiAwaW4gNi4wcHQ7bWFyZ2luLWxlZnQ6NC44cHQ7bWFyZ2luLXRvcDo1 LjBwdDttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206NS4wcHQiPg0KPGRpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPkhpIEJlbiwgSGkgSmFtZXMsPG86cD48L286cD48L3A+DQo8L2Rpdj4N CjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2 Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkkgd291bGQgbGlrZSB0byBzb2xpY2l0IG9w aW5pb25zIG9uIHRoZSBsaWZlY3ljbGUgZm9yIGJkZXYtaW8gcmVzb3VyY2Ugb2JqZWN0LiBBdHRh Y2hlZCBpcyB0aGUgaW1hZ2Ugb2YgUkRNQSBzdGF0ZSBtYWNoaW5lIGluIGl0cyBjdXJyZW50IGlt cGxlbWVudGF0aW9uLiBXaGVuIHRoZSBSRVFVRVNUIGVudGVycyB0aGUgTkVFRC1CVUZGRVIgc3Rh dGUsIHRoZSBidWZmZXJzIG5lY2Vzc2FyeSBmb3IgY2FycnlpbmcNCiBvdXQgSS9PIG9wZXJhdGlv biBhcmUgYWxsb2NhdGVkL2FjcXVpcmVkIGZyb20gdGhlIG1lbW9yeSBwb29sLiBBbiBpbnN0YW5j ZSBvZiBCREVWLUlPIGNvbWVzIGludG8gZXhpc3RlbmNlIGFmdGVyIFJFUVVFU1QgcmVhY2hlcyBS RUFEWS1UTy1FWEVDVVRFIHN0YXRlLiBUaGUgQkRFVi1JTyBpcyB0ZWFyZWQgZG93biBhcyBzb29u IHRoZSBiYWNrZW5kIHJldHVybnMuIEZyb20gYSBCREVWIHBlcnNwZWN0aXZlLCBCREVWLUlPIGlz IHNpbXBseSBhIHRyYW5zbGF0aW9uDQogdW5pdCB0aGF0IGZhY2lsaXRhdGVzIEkvTyBidWZmZXJz IGZyb20gdGhlIGJhY2tlbmQuIFRoZSBkcml2ZXIgY29udGV4dCBlbWJlZGRlZCB3aXRoaW4gYmRl dl9pbyBob2xkcyBncmVhdCBkZWFsIG9mIGluZm9ybWF0aW9uIHBlcnRhaW5pbmcgdG8gdGhlIEkv TyB1bmRlciBleGVjdXRpb24uIEl0IGFzc2lzdHMgaW4gZXJyb3IgaGFuZGxpbmcsIGRlcmVmZXJl bmNpbmcgdGhlIGJ1ZmZlcnMgdXBvbiBJL08gY29tcGxldGlvbiBhbmQgaW4gYWJvcnQgaGFuZGxp bmcuDQogSW4gc3VtbWFyeSwgdGhlIGJkZXZfaW8gc3RheXMgYWxpdmUgdW50aWwgcmVxdWVzdCBo YXMgY29tZSB0byBDT01QTEVURSBzdGF0ZS4gSeKAmWQgbGlrZSB0byBoZWFyIHBlb3BsZXMgdGhv dWdodHMgaW4gaW50cm9kdWNpbmcgdGhlIHBsdW1iaW5nIHRvIGFjcXVpcmUgQkRFVi1JTyByZXNv dXJjZSBpbiBSRVFVRVNULU5FRUQtQlVGRkVSIHN0YXRlIGFuZCByZWxlYXNlIGl0IGluIFJFUVVF U1QtQ09NUExFVEUgc3RhdGUuJm5ic3A7IEkgd2lsbCBzaG9ydGx5IGhhdmUNCiBwYXRjaCBhdmFp bGFibGUgZm9yIHJldmlldyB0aGF0IGludHJvZHVjZXMgc3Bka19iZGV2X2luaXQgYW5kIHNwZGtf YmRldl9maW5pIHdoaWNoIGluIHR1cm4gaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZyBiZGV2IGZu X3RhYmxlIHRvICZuYnNwO2luaXRpYWxpemUvY2xlYW51cC4gJm5ic3A7PG86cD48L286cD48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj4mbmJzcDs8bzpwPjwvbzpwPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPkkgd2FudGVkIHRvIHVzZSB0 aGlzIGVtYWlsIHRvIGNvbW11bmljYXRlIG91ciBpbnRlbnQgYW5kIHNvbGljaXQgeW91ciBmZWVk YmFjay4gV2UgaGF2ZSBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFib3ZlIHByb3Bv c2FsIGFuZCBwcmlvciB0byBwdXNoaW5nIGl0IHVwc3RyZWFtIGZvciByZXZpZXcgd291bGQgbGlr ZSB0byBoZWFyIHlvdXIgdGhvdWdodHMuIFRoZXNlIHByb3Bvc2VkIGNoYW5nZXMNCiB0byB1cHN0 cmVhbSBhcmUgYSByZXN1bHQgb2YgRkMgdHJhbnNwb3J0IHdvcmsgaW4gY29sbGFib3JhdGlvbiB3 aXRoIHRoZSBCcm9hZGNvbSB0ZWFtIHdobyBhcmUgYWxzbyBjb3BpZWQgdG8gdGhpcyBtYWlsLiBN eXNlbGYgYW5kIEpvaG4gd2lsbCBiZSBhdCBTUERLIERldiBjb25mZXJlbmNlIGFuZCBpZiByZXF1 aXJlZCB3ZSBjYW4gZWxhYm9yYXRlIGZ1cnRoZXIgb24gdGhpcyBwcm9wb3NhbC48bzpwPjwvbzpw PjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPiZuYnNwOzxvOnA+PC9v OnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhhbmtzLDxvOnA+ PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+U3Jpa2FudGg8 bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9ibG9ja3F1b3RlPg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4N CjwvaHRtbD4NCg== --===============5726034450939015290==--