From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============6143873528891946395==" MIME-Version: 1.0 From: helloway Subject: Re: [SPDK] Changes and invocations to rpc/nvmf.py Date: Sat, 28 Sep 2019 02:06:05 +0000 Message-ID: <76b7ccc2.3f01.163eceeb3e8.Coremail.simple_hlw@163.com> In-Reply-To: A5F28D4A728A7E41839CDC5C3B5A01E8B74E920B@FMSMSX103.amr.corp.intel.com List-ID: To: spdk@lists.01.org --===============6143873528891946395== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Daniel, Thanks you for your detailed reply and comments. You are totally right to m= ove the some codes about string parsing/splitting inside scripts/rpc/nvmf.p= y to scripts/rpc.py. I have updated this part of the code=EF=BC=8Cplease vi= sit it. Thx, Helloway On 06/9/2018 00:25=EF=BC=8CVerkamp, Daniel wrot= e=EF=BC=9A Hi Helloway, = Thanks so much for picking up this task! Your patch is exactly the directio= n we want to move with the JSON-RPC library files in scripts/rpc/*.py. = I will post a few review comments (some minor formatting tweaks), but I=E2= =80=99d like to discuss the API design a little bit here so that it gets wi= der visibility. = I think the goal should be for the scripts/rpc/*.py files to expose native = Python-style interfaces as much as possible. For example, the construct_nv= mf_subsystem method currently takes a list of namespaces in =E2=80=9Cbdev:n= sid bdev:nsid bdev:nsid =E2=80=A6=E2=80=9D pairs, whitespace separated, in = a single string parameter. I would prefer to make this parameter a list of= Python objects, one per namespace, something like: = namespaces =3D [ {'bdev_name': 'Malloc0', 'nsid': 1}, {'bdev_name': 'Malloc1', 'nsid': 2} ] = We would still keep the string parsing code, since that is the command-line= interface exposed by scripts/rpc.py; it would just be moved out of scripts= /rpc/nvmf.py and into the scripts/rpc.py parser function. = I=E2=80=99ve just chosen the namespace list as an example, but there are ot= her parameters with similar issues; anything that is doing string parsing/s= plitting inside scripts/rpc/nvmf.py should probably be moved to scripts/rpc= .py. = This should help make the API clearer and more extensible (and hopefully mo= re like a normal Python module). Does this make sense? Any comments or sug= gestions? = Thanks, -- Daniel = From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of helloway Sent: Thursday, June 7, 2018 7:36 PM To: Storage Performance Development Kit Subject: [SPDK] Changes and invocations to rpc/nvmf.py = Hi @Daniel, @Paul and @all = I reviewed the code you have updated about =E2=80=98pass named args to bdev= .py [0]=E2=80=99. I think its functions are consistent with the py_spdk [1]= I have proposed in the past. The difference is that you made the changes o= n the basis of rpc.py, while I considered more not to modify the rpc.py to = make adjustments as much as possible. For this reason, I added one more lay= er (scripts/py_spdk/nvmf_client.py, which can invoke the /scripts/rpc/mvmf.= py) on the /script/rpc/*.py module. Actually, this layer can be integrated = into /scripts/rpc/nvmf.py by modifying rpc.py. However, I didn=E2=80=99t co= nsider modifying rpc.py to integrate and remove this extra layer. I am afra= id of influencing the use of rpc.py. = I think you did a better job, it is also applicable to my usage scenarios. = Now I have modified the /rpc/nvmf. py by referring to your code and submitt= ed the patch to the gerrit [2]. At the same time, I have written the call_s= pdk project about how the upper application calls these modified methods of= the patch and put it into my github [3], which directly bypasses the rpc.p= y and imports these /scripts/rpc/*. py modules, I hope you can spare some = time to visit them together and give me some feedbacks. = Later, I plan to put these implementations into the openstack/cyborg projec= t to realize the management of NVME accelerators. If there is no problem in= the submitted code, I am willing to help SPDK community to update the othe= r /scripts/rpc/*.py methods, for example: vhost.py, and then modify the SPD= K Driver of openstack/cyborg to use these rpc modules. I don't know what yo= u think about this? = = I It is worth mentioning that the SPDK Driver I submitted has been integrat= ed into the Openstack version Q [4]. I wonder if you guys are interested in= adopting Cyborg into SPDK to enhance the ecology of SPDK. = Any idea is appreciated. I hope to receive your reply. = [0]https://review.gerrithub.io/c/spdk/spdk/+/411952 = [1]https://review.gerrithub.io/c/spdk/spdk/+/405526/1/scripts/py_spdk/nvmf_= client.py#93 = [2]https://review.gerrithub.io/c/spdk/spdk/+/414296 = [3]https://github.com/hellowaywewe/call_spdk = [4]https://review.openstack.org/#/c/538164/ = Thx, Helloway = --===============6143873528891946395== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWw+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50 PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgo8L2hlYWQ+Cjxib2R5Pgo8c3R5bGU+CiAgICBm b250ewogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICB9CiAgICB1bCxvbHsKICAgICAgICBw YWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwog ICAgfQo8L3N0eWxlPgo8ZGl2IHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVv dDs7IGxpbmUtaGVpZ2h0OjEuNjsiPgogICAgPGRpdj4KPGRpdj5IaSBEYW5pZWwsPC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5UaGFua3MgeW91IGZvciB5b3VyIGRldGFpbGVkIHJlcGx5IGFuZCBj b21tZW50cy4gWW91IGFyZSB0b3RhbGx5IHJpZ2h0IHRvIG1vdmUgdGhlIHNvbWUgY29kZXMgYWJv dXQmbmJzcDs8c3BhbiBzdHlsZT0iY29sb3I6IHJnYigzMSwgNzMsIDEyNSk7IGZvbnQtZmFtaWx5 OiBDYWxpYnJpLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0LjY2NjY2Njk4NDU1ODEwNXB4OyI+ c3RyaW5nIHBhcnNpbmcvc3BsaXR0aW5nPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDMx LCA3MywgMTI1KTsgZm9udC1mYW1pbHk6IENhbGlicmksIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTog MTQuNjY2NjY2OTg0NTU4MTA1cHg7Ij4mbmJzcDtpbnNpZGUgc2NyaXB0cy9ycGMvbnZtZi5weSB0 byBzY3JpcHRzL3JwYy5weS4mbmJzcDs8L3NwYW4+SSBoYXZlIHVwZGF0ZWQgdGhpcyBwYXJ0IG9m IHRoZSBjb2Rl77yMcGxlYXNlIHZpc2l0IGl0LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGh4 LDwvZGl2PjxkaXY+SGVsbG93YXk8L2Rpdj48ZGl2IGlkPSJudGVzLXBjbWFpbC1zaWduYXR1cmUi IHN0eWxlPSJmb250LWZhbWlseTonJyI+PGZvbnQgc3R5bGU9InBhZGRpbmc6IDA7IG1hcmdpbjow OyI+ICAgICAgICAgICAgICAgIDwvZm9udD4KCjwvZGl2Pjxicj4KPC9kaXY+PGRpdiBjbGFzcz0i Si1yZXBseSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2YyZjJmMjtjb2xvcjpibGFjaztwYWRk aW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4O2JvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9y ZGVyLXJhZGl1czozcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDttYXJnaW4tdG9wOjQ1cHg7 bWFyZ2luLWJvdHRvbToyMHB4O2ZvbnQtZmFtaWx5OicnOyI+CiAgICA8ZGl2IHN0eWxlPSJmb250 LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjY7d29yZC1icmVhazpicmVhay1hbGw7bWFyZ2luLWxl ZnQ6MTBweDttYXJnaW4tcmlnaHQ6MTBweCI+T24gPHNwYW4gY2xhc3M9Im1haWwtZGF0ZSI+MDYv OS8yMDE4IDAwOjI1PC9zcGFuPu+8jDxhIGNsYXNzPSJtYWlsLXRvIiBzdHlsZT0idGV4dC1kZWNv cmF0aW9uOm5vbmU7Y29sb3I6IzJhODNmMjsiIGhyZWY9Im1haWx0bzpkYW5pZWwudmVya2FtcEBp bnRlbC5jb20iPlZlcmthbXAsIERhbmllbCZsdDtkYW5pZWwudmVya2FtcEBpbnRlbC5jb20mZ3Q7 PC9hPiB3cm90Ze+8miA8L2Rpdj4KPC9kaXY+CjxibG9ja3F1b3RlIGlkPSJudGVzLXBjbWFpbC1x dW90ZSIgc3R5bGU9Im1hcmdpbjogMDsgcGFkZGluZzogMDsgZm9udC1zaXplOiAxNHB4OyBmb250 LWZhbWlseTogJyc7Ij4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj48IS0tCgpfZm9udC1mYWNlCgl7 Zm9udC1mYW1pbHk6SGVsdmV0aWNhOwoJcGFub3NlLTE6MiAxMSA2IDQgMiAyIDIgMiAyIDQ7fQpf Zm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCI7CglwYW5vc2UtMToyIDQgNSAz IDUgNCA2IDMgMiA0O30KX2ZvbnQtZmFjZQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7CglwYW5vc2Ut MToyIDE1IDUgMiAyIDIgNCAzIDIgNDt9CgpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYu TXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKCWZvbnQtc2l6 ZToxMi4wcHQ7Cglmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIixzZXJpZjt9CmE6bGluaywg c3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjpibHVlOwoJ dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtG b2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOnB1cnBsZTsKCXRleHQtZGVj b3JhdGlvbjp1bmRlcmxpbmU7fQpwLk1zb0xpc3RQYXJhZ3JhcGgsIGxpLk1zb0xpc3RQYXJhZ3Jh cGgsIGRpdi5Nc29MaXN0UGFyYWdyYXBoCgl7bXNvLXN0eWxlLXByaW9yaXR5OjM0OwoJbWFyZ2lu LXRvcDowaW47CgltYXJnaW4tcmlnaHQ6MGluOwoJbWFyZ2luLWJvdHRvbTowaW47CgltYXJnaW4t bGVmdDouNWluOwoJbWFyZ2luLWJvdHRvbTouMDAwMXB0OwoJZm9udC1zaXplOjEyLjBwdDsKCWZv bnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLHNlcmlmO30Kc3Bhbi5FbWFpbFN0eWxlMTgKCXtt c28tc3R5bGUtdHlwZTpwZXJzb25hbDsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlm OwoJY29sb3I6IzFGNDk3RDt9CnNwYW4uRW1haWxTdHlsZTIwCgl7bXNvLXN0eWxlLXR5cGU6cGVy c29uYWwtY29tcG9zZTsKCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOwoJY29sb3I6 d2luZG93dGV4dDt9Ci5Nc29DaHBEZWZhdWx0Cgl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7 Cglmb250LXNpemU6MTAuMHB0O30KX3BhZ2UgV29yZFNlY3Rpb24xCgl7c2l6ZTo4LjVpbiAxMS4w aW47CgltYXJnaW46MS4waW4gMS4waW4gMS4waW4gMS4waW47fQpkaXYuV29yZFNlY3Rpb24xCgl7 cGFnZTpXb3JkU2VjdGlvbjE7fQotLT4KPC9zdHlsZT4KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24x Ij4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkhp IEhlbGxvd2F5LDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90 OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPlRoYW5r cyBzbyBtdWNoIGZvciBwaWNraW5nIHVwIHRoaXMgdGFzayEgWW91ciBwYXRjaCBpcyBleGFjdGx5 IHRoZSBkaXJlY3Rpb24gd2Ugd2FudCB0byBtb3ZlIHdpdGggdGhlIEpTT04tUlBDIGxpYnJhcnkg ZmlsZXMgaW4gc2NyaXB0cy9ycGMvKi5weS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZx dW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xv cjojMUY0OTdEIj5JIHdpbGwgcG9zdCBhIGZldyByZXZpZXcgY29tbWVudHMgKHNvbWUgbWlub3Ig Zm9ybWF0dGluZyB0d2Vha3MpLCBidXQgSeKAmWQgbGlrZSB0byBkaXNjdXNzIHRoZSBBUEkgZGVz aWduIGEgbGl0dGxlIGJpdCBoZXJlIHNvIHRoYXQgaXQgZ2V0cyB3aWRlciB2aXNpYmlsaXR5Ljxv OnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlm O2NvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkkgdGhpbmsgdGhlIGdvYWwg c2hvdWxkIGJlIGZvciB0aGUgc2NyaXB0cy9ycGMvKi5weSBmaWxlcyB0byBleHBvc2UgbmF0aXZl IFB5dGhvbi1zdHlsZSBpbnRlcmZhY2VzIGFzIG11Y2ggYXMgcG9zc2libGUuJm5ic3A7IEZvciBl eGFtcGxlLCB0aGUgY29uc3RydWN0X252bWZfc3Vic3lzdGVtCiBtZXRob2QgY3VycmVudGx5IHRh a2VzIGEgbGlzdCBvZiBuYW1lc3BhY2VzIGluIOKAnGJkZXY6bnNpZCBiZGV2Om5zaWQgYmRldjpu c2lkIOKApuKAnSBwYWlycywgd2hpdGVzcGFjZSBzZXBhcmF0ZWQsIGluIGEgc2luZ2xlIHN0cmlu ZyBwYXJhbWV0ZXIuJm5ic3A7IEkgd291bGQgcHJlZmVyIHRvIG1ha2UgdGhpcyBwYXJhbWV0ZXIg YSBsaXN0IG9mIFB5dGhvbiBvYmplY3RzLCBvbmUgcGVyIG5hbWVzcGFjZSwgc29tZXRoaW5nIGxp a2U6PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHls ZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMt c2VyaWY7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+Jm5ic3A7ICZuYnNw OyZuYnNwO25hbWVzcGFjZXMgPSBbPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtD YWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+Jm5ic3A7ICZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3snYmRldl9uYW1lJzogJ01hbGxvYzAnLCAnbnNpZCc6 IDF9LDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5 bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5z LXNlcmlmO2NvbG9yOiMxRjQ5N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDt7J2JkZXZfbmFtZSc6ICdNYWxsb2MxJywgJ25zaWQnOiAyfTxvOnA+PC9vOnA+PC9z cGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5 N0QiPiZuYnNwOyZuYnNwOyZuYnNwOyBdPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVv dDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6 IzFGNDk3RCI+V2Ugd291bGQgc3RpbGwga2VlcCB0aGUgc3RyaW5nIHBhcnNpbmcgY29kZSwgc2lu Y2UgdGhhdCBpcyB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSBleHBvc2VkIGJ5IHNjcmlwdHMv cnBjLnB5OyBpdCB3b3VsZCBqdXN0IGJlIG1vdmVkIG91dCBvZiBzY3JpcHRzL3JwYy9udm1mLnB5 CiBhbmQgaW50byB0aGUgc2NyaXB0cy9ycGMucHkgcGFyc2VyIGZ1bmN0aW9uLjxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTox MS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMx RjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZx dW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPknigJl2ZSBqdXN0IGNob3NlbiB0aGUgbmFt ZXNwYWNlIGxpc3QgYXMgYW4gZXhhbXBsZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBwYXJhbWV0ZXJz IHdpdGggc2ltaWxhciBpc3N1ZXM7IGFueXRoaW5nIHRoYXQgaXMgZG9pbmcgc3RyaW5nIHBhcnNp bmcvc3BsaXR0aW5nIGluc2lkZQogc2NyaXB0cy9ycGMvbnZtZi5weSBzaG91bGQgcHJvYmFibHkg YmUgbW92ZWQgdG8gc2NyaXB0cy9ycGMucHkuPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29s b3I6IzFGNDk3RCI+VGhpcyBzaG91bGQgaGVscCBtYWtlIHRoZSBBUEkgY2xlYXJlciBhbmQgbW9y ZSBleHRlbnNpYmxlIChhbmQgaG9wZWZ1bGx5IG1vcmUgbGlrZSBhIG5vcm1hbCBQeXRob24gbW9k dWxlKS4mbmJzcDsgRG9lcyB0aGlzIG1ha2Ugc2Vuc2U/IEFueSBjb21tZW50cyBvciBzdWdnZXN0 aW9ucz88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fu cy1zZXJpZjtjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj5UaGFua3MsPG86 cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9u dC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7 Y29sb3I6IzFGNDk3RCI+LS0gRGFuaWVsPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVv dDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItbGVmdDpzb2xpZCBi bHVlIDEuNXB0O3BhZGRpbmc6MGluIDBpbiAwaW4gNC4wcHQiPgo8ZGl2Pgo8ZGl2IHN0eWxlPSJi b3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAw aW4gMGluIDBpbiI+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxhIG5hbWU9Il9fX19fcmVwbHlzZXBh cmF0b3IiPjwvYT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWYiPkZyb206PC9zcGFuPjwvYj48c3BhbiBzdHls ZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMt c2VyaWYiPiBTUERLIFttYWlsdG86PGEgaHJlZj0ibWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4w MS5vcmciPnNwZGstYm91bmNlc0BsaXN0cy4wMS5vcmc8L2E+XQo8Yj5PbiBCZWhhbGYgT2YgPC9i PmhlbGxvd2F5PGJyPgo8Yj5TZW50OjwvYj4gVGh1cnNkYXksIEp1bmUgNywgMjAxOCA3OjM2IFBN PGJyPgo8Yj5Ubzo8L2I+IFN0b3JhZ2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDs8 YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEub3JnPC9hPiZn dDs8YnI+CjxiPlN1YmplY3Q6PC9iPiBbU1BES10gQ2hhbmdlcyBhbmQgaW52b2NhdGlvbnMgdG8g cnBjL252bWYucHk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjwvZGl2Pgo8L2Rpdj4KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CjxkaXY+CjxkaXY+CjxwIGNsYXNzPSJN c29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRv bS1hbHQ6YXV0byI+SGkgQERhbmllbCwgQFBhdWwgYW5kIEBhbGw8bzpwPjwvbzpwPjwvcD4KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJn aW4tYm90dG9tLWFsdDphdXRvIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFs dDphdXRvIj5JIHJldmlld2VkIHRoZSBjb2RlIHlvdSBoYXZlIHVwZGF0ZWQgYWJvdXQg4oCYcGFz cyBuYW1lZCBhcmdzIHRvIGJkZXYucHkgWzBd4oCZLiBJIHRoaW5rIGl0cyBmdW5jdGlvbnMgYXJl IGNvbnNpc3RlbnQgd2l0aCB0aGUgcHlfc3BkayBbMV0gSSBoYXZlIHByb3Bvc2VkIGluIHRoZSBw YXN0LiBUaGUgZGlmZmVyZW5jZQogaXMgdGhhdCB5b3UgbWFkZSB0aGUgY2hhbmdlcyBvbiB0aGUg YmFzaXMgb2YgcnBjLnB5LCB3aGlsZSBJIGNvbnNpZGVyZWQgbW9yZSBub3QgdG8gbW9kaWZ5IHRo ZSBycGMucHkgdG8gbWFrZSBhZGp1c3RtZW50cyBhcyBtdWNoIGFzIHBvc3NpYmxlLiBGb3IgdGhp cyByZWFzb24sIEkgYWRkZWQgb25lIG1vcmUgbGF5ZXIgKHNjcmlwdHMvcHlfc3Bkay9udm1mX2Ns aWVudC5weSwgd2hpY2ggY2FuIGludm9rZSB0aGUgL3NjcmlwdHMvcnBjL212bWYucHkpCiBvbiB0 aGUgL3NjcmlwdC9ycGMvKi5weSBtb2R1bGUuIEFjdHVhbGx5LCB0aGlzIGxheWVyIGNhbiBiZSBp bnRlZ3JhdGVkIGludG8gL3NjcmlwdHMvcnBjL252bWYucHkgYnkgbW9kaWZ5aW5nIHJwYy5weS4g SG93ZXZlciwgSSBkaWRu4oCZdCBjb25zaWRlciBtb2RpZnlpbmcgcnBjLnB5IHRvIGludGVncmF0 ZSBhbmQgcmVtb3ZlIHRoaXMgZXh0cmEgbGF5ZXIuIEkgYW0gYWZyYWlkIG9mIGluZmx1ZW5jaW5n IHRoZSB1c2Ugb2YgcnBjLnB5Lgo8bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRv Ij48bzpwPiZuYnNwOzwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1zby1t YXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvIj5JIHRoaW5rIHlv dSBkaWQgYSBiZXR0ZXIgam9iLCBpdCBpcyBhbHNvIGFwcGxpY2FibGUgdG8gbXkgdXNhZ2Ugc2Nl bmFyaW9zLiBOb3cgSSBoYXZlIG1vZGlmaWVkIHRoZSAvcnBjL252bWYuIHB5IGJ5IHJlZmVycmlu ZyB0byB5b3VyIGNvZGUgYW5kIHN1Ym1pdHRlZCB0aGUgcGF0Y2ggdG8gdGhlIGdlcnJpdAogWzJd LiBBdCB0aGUgc2FtZSB0aW1lLCBJIGhhdmUgd3JpdHRlbiB0aGUgY2FsbF9zcGRrIHByb2plY3Qg YWJvdXQgaG93IHRoZSB1cHBlciBhcHBsaWNhdGlvbiBjYWxscyB0aGVzZSBtb2RpZmllZCBtZXRo b2RzIG9mIHRoZSBwYXRjaCBhbmQgcHV0IGl0IGludG8gbXkgZ2l0aHViIFszXSwgd2hpY2ggZGly ZWN0bHkgYnlwYXNzZXMgdGhlIHJwYy5weSBhbmQmbmJzcDsgaW1wb3J0cyB0aGVzZSAvc2NyaXB0 cy9ycGMvKi4gcHkgbW9kdWxlcywgSSBob3BlIHlvdQogY2FuIHNwYXJlIHNvbWUgdGltZSB0byB2 aXNpdCB0aGVtIHRvZ2V0aGVyIGFuZCBnaXZlIG1lIHNvbWUgZmVlZGJhY2tzLjxvOnA+PC9vOnA+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87 bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1i b3R0b20tYWx0OmF1dG8iPkxhdGVyLCBJIHBsYW4gdG8gcHV0IHRoZXNlIGltcGxlbWVudGF0aW9u cyBpbnRvIHRoZSBvcGVuc3RhY2svY3lib3JnIHByb2plY3QgdG8gcmVhbGl6ZSB0aGUgbWFuYWdl bWVudCBvZiBOVk1FIGFjY2VsZXJhdG9ycy4gSWYgdGhlcmUgaXMgbm8gcHJvYmxlbSBpbiB0aGUg c3VibWl0dGVkIGNvZGUsIEkgYW0gd2lsbGluZwogdG8gaGVscCBTUERLIGNvbW11bml0eSB0byB1 cGRhdGUgdGhlIG90aGVyIC9zY3JpcHRzL3JwYy8qLnB5IG1ldGhvZHMsIGZvciBleGFtcGxlOiB2 aG9zdC5weSwgYW5kIHRoZW4gbW9kaWZ5IHRoZSBTUERLIERyaXZlciBvZiBvcGVuc3RhY2svY3li b3JnIHRvIHVzZSB0aGVzZSBycGMgbW9kdWxlcy4gSSBkb24ndCBrbm93IHdoYXQgeW91IHRoaW5r IGFib3V0IHRoaXM/ICZuYnNwOzxvOnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8i PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1h cmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPkkgSXQgaXMgd29y dGggbWVudGlvbmluZyB0aGF0IHRoZSBTUERLIERyaXZlciBJIHN1Ym1pdHRlZCBoYXMgYmVlbiBp bnRlZ3JhdGVkIGludG8gdGhlIE9wZW5zdGFjayB2ZXJzaW9uIFEgWzRdLiBJIHdvbmRlciBpZiB5 b3UgZ3V5cyBhcmUgaW50ZXJlc3RlZCBpbiBhZG9wdGluZyBDeWJvcmcgaW50byBTUERLCiB0byBl bmhhbmNlIHRoZSBlY29sb2d5IG9mIFNQREsuPG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1h bHQ6YXV0byI+PG86cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+QW55 IGlkZWEgaXMgYXBwcmVjaWF0ZWQuIEkgaG9wZSB0byByZWNlaXZlIHlvdXIgcmVwbHkuPG86cD48 L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6 YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+Jm5ic3A7PG86cD48L286cD48L3A+Cjxw IGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFy Z2luLWJvdHRvbS1hbHQ6YXV0byI+WzBdPGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHVi LmlvL2Mvc3Bkay9zcGRrLysvNDExOTUyIj5odHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vYy9z cGRrL3NwZGsvKy80MTE5NTI8L2E+Jm5ic3A7PG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1h bHQ6YXV0byI+WzFdPGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvL2Mvc3Bkay9z cGRrLysvNDA1NTI2LzEvc2NyaXB0cy9weV9zcGRrL252bWZfY2xpZW50LnB5IzkzIj5odHRwczov L3Jldmlldy5nZXJyaXRodWIuaW8vYy9zcGRrL3NwZGsvKy80MDU1MjYvMS9zY3JpcHRzL3B5X3Nw ZGsvbnZtZl9jbGllbnQucHkjOTM8L2E+Jm5ic3A7PG86cD48L286cD48L3A+CjxwIGNsYXNzPSJN c29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRv bS1hbHQ6YXV0byI+WzJdPGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvL2Mvc3Bk ay9zcGRrLysvNDE0Mjk2Ij5odHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vYy9zcGRrL3NwZGsv Ky80MTQyOTY8L2E+Jm5ic3A7PG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+ WzNdPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hlbGxvd2F5d2V3ZS9jYWxsX3NwZGsiPmh0 dHBzOi8vZ2l0aHViLmNvbS9oZWxsb3dheXdld2UvY2FsbF9zcGRrPC9hPiZuYnNwOzxvOnA+PC9v OnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibXNvLW1hcmdpbi10b3AtYWx0OmF1 dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8iPls0XTxhIGhyZWY9Imh0dHBzOi8vcmV2aWV3 Lm9wZW5zdGFjay5vcmcvIy9jLzUzODE2NC8iPmh0dHBzOi8vcmV2aWV3Lm9wZW5zdGFjay5vcmcv Iy9jLzUzODE2NC88L2E+PG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+PG86 cD4mbmJzcDs8L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0byI+VGh4LDxvOnA+PC9vOnA+ PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0ibXNvLWZhcmVhc3QtbGFuZ3Vh Z2U6WkgtQ04iPkhlbGxvd2F5PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtI ZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+Jm5ic3A7ICZuYnNwOyZuYnNwOzxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPC9kaXY+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDssc2Fucy1zZXJpZiI+PGJyPgo8YnI+CjxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4KPC9kaXY+CjwvZGl2Pgo8L2Rpdj48L2Jsb2NrcXVvdGU+PHN0eWxl IHR5cGU9InRleHQvY3NzIj4KICAgICAgICBhI250ZXMtcGNtYWlsLXNpZ25hdHVyZS1kZWZhdWx0 OmhvdmVyIHsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAg ICAgIGNvbG9yOiAjMzU5M2RiOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAg fQogICAgPC9zdHlsZT48IS0t77+9LS0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4= --===============6143873528891946395==--