[Xorp-hackers] Cli style guide draft

Hasso Tepper hasso@linux.ee
Sat, 15 Apr 2006 13:16:39 +0300


--Boundary-00=_IgMQEQvQ0zFQ0Fy
Content-Type: text/plain;
  charset="iso-8859-15"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

As I promised, here are my ideas about cli style guide. Feel free to 
comment, make additions etc.

**************

* Configuration commands (node names) SHOULD be less than 20 symbols  
  long. The length of configuration command + short help MUST NOT exceed 
  76 symbols.

  This is to ensure that the output of possible completions would fit into 
  80 symbols wide terminal. In most of cases it's wrapping that makes the
  output look really bad.

  So, keep the length of node names and short help minimum. Node names are 
  especially important. If it can be shortened below 20 symbols without 
  loosing the point, it should be done. If it can't be done, OK, but these
  cases should be kept minimum. For example:

  restore-original-config-on-shutdown -> restore-system-conf
  enable-ip-router-alert-option-check -> router-alert-check

* No units in node names (sec, msec), this info should be in short help.
  For example:

  interpacket-delay-msecs  Minimum delay between outbound RIPng packets.
  vs.
  interpacket-delay    Minimum delay between outbound RIPng packets (msec)

* Avoid "Set ...", "Edit ..." etc in short help strings.

  Short help string should just describe shortly variables/commands. And 
  note that it can be logically wrong as well - variables and commands 
  aren't always set, but sometimes deleted as well. For example:

  horizon    Set the horizon type applied to routes announced on  address.
  vs.
  horizon    Horizon type applied to announced routes

* Short help strings begin with capital letter and don't have dot in the 
  end.

  Just to make the look consistent.

* Keep parameters user have to configure minimum.

  For example timers with jitter can be described as "some-timer-min" 
  and "some-timer-max" (as it is in rip(ng)). If user wants to change 
  timer, he/she has to configure two parameters. But mostly it's just 
  average value which user wants to change. So, prefer "some-timer" 
  and "some-jitter" with good default to jitter, better in percents than 
  in absolute value.

* Commands should describe what they do, not for what they can be used.

  For example there is command in rip(ng):

  accept-non-rip-requests  Answer RIP requests made from non-RIP processes

  It's not clear at all what it does. Better use following command and 
  help and describe for what it can be used in documentation: 

  source-port-check    Answer RIPng requests made only from RIPng port


**************

I played with these ideas in RIPng configuration and picture (to make sure 
that mail clients don't mess result with wrapping) with result is 
attached.


regards,

-- 
Hasso Tepper

--Boundary-00=_IgMQEQvQ0zFQ0Fy
Content-Type: image/png;
  name="xorp-ripng.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="xorp-ripng.png"

iVBORw0KGgoAAAANSUhEUgAAAtQAAAEvCAIAAADq8sHgAAAAAXNSR0IDN8dNUwAACXRpQ0NQaWNj
AAB42u2ZZ1AUaRrH3+6eHBiYGYYMQxyCRAkDSM5JJAdRgRkyjDAkBUzI4gqsICKSFEFEARdcXYKs
oiKKAVFQwIDuIIuAsi6uIioqN+gHr+qu7tN9ubp5Prz9q38/VW+Hp6p/VQ2A7HgiJykVNgAgiZfG
93WxZwaHhDKxowAFKIAMYAAiOKnJXn7O/kBYK73gX+rdKIBWjvd0//35/1hEbhKPCwCEE3I8NyqV
I+Q0Icdyk7gr+fgKZ6YlCzPYUch0vvAChRy8wpHfOHGFY77xzq89/r4OQi4DAEeK+cqEoysc+ZWp
p1aYE8tPAkC2S9iv9m3fryWuuXITzDheWhSfF5GoBf7b9U97iaWuPPDI9LjENN043v/oPivz8o3e
WH2dA4hR8T3bLHwH7FcAICXfM7XDAFB2A9DR8z2LPA5AZwkA0k856fyMbxlqZUEDgnAS6UAGKAJV
oAl0gREwA5bAFjgBd+AN/EEI2Ag4IBYkAT7IBDlgF8gHhaAEHARVoBY0gCbQCs6ATnAeXAbXwC1w
F4yAx0AApsBLMA/egSUIgrAQGaJBMpASpA7pQEYQG7KGnCBPyBcKgcKhGIgHpUM50G6oECqFqqA6
qAn6BToHXYZuQEPQQ2gCmoX+hj7CCEyC6bACrAHrw2zYDvaA/eENcAycAmfBefA+uAKuh0/BHfBl
+BY8Agvgl/ACAhAiwkCUEV2EjTgg3kgoEo3wke1IAVKO1COtSDfSj9xDBMgc8gGFQdFQTJQuyhLl
igpAcVApqO2oIlQV6iSqA9WHuoeaQM2jvqDJaHm0DtoC7YYORsegM9H56HJ0I7odfRU9gp5Cv8Ng
MAwMC2OGccWEYOIx2ZgizGFMG+YSZggziVnAYrEyWB2sFdYbG4FNw+ZjK7GnsBexw9gp7HscEaeE
M8I540JxPFwurhzXjOvBDeOmcUt4cbw63gLvjefit+KL8Q34bvwd/BR+iSBBYBGsCP6EeMIuQgWh
lXCVME54QyQSVYjmRB9iHHEnsYJ4mnidOEH8QKKStEkOpDBSOmkf6QTpEukh6Q2ZTNYg25JDyWnk
feQm8hXyU/J7MZqYnpibGFdsh1i1WIfYsNgrCp6iTrGjbKRkUcopZyl3KHPieHENcQfxCPHt4tXi
58THxBckaBKGEt4SSRJFEs0SNyRmqFiqBtWJyqXmUY9Rr1AnaQhNleZA49B20xpoV2lTdAydRXej
x9ML6T/TB+nzklRJY8lAyS2S1ZIXJAUMhKHBcGMkMooZZxijjI9SClJ2UlFSe6VapYalFqXlpG2l
o6QLpNukR6Q/yjBlnGQSZPbLdMo8kUXJasv6yGbKHpG9KjsnR5ezlOPIFcidkXskD8try/vKZ8sf
kx+QX1BQVHBRSFaoVLiiMKfIULRVjFcsU+xRnFWiKVkrxSmVKV1UesGUZNoxE5kVzD7mvLK8sqty
unKd8qDykgpLJUAlV6VN5YkqQZWtGq1aptqrOq+mpOallqPWovZIHa/OVo9VP6Ter76owdII0tij
0akxw5JmubGyWC2scU2ypo1mima95n0tjBZbK0HrsNZdbVjbRDtWu1r7jg6sY6oTp3NYZ2gVepX5
Kt6q+lVjuiRdO90M3RbdCT2Gnqderl6n3it9Nf1Q/f36/fpfDEwMEg0aDB4bUg3dDXMNuw3/NtI2
4hhVG91fTV7tvHrH6q7Vr411jKOMjxg/MKGZeJnsMek1+WxqZso3bTWdNVMzCzerMRtj09nr2EXs
6+Zoc3vzHebnzT9YmFqkWZyx+MtS1zLBstlyZg1rTdSahjWTVipWEVZ1VgJrpnW49VFrgY2yTYRN
vc0zW1Vbrm2j7bSdll283Sm7V/YG9nz7dvtFBwuHbQ6XHBFHF8cCx0EnqlOAU5XTU2cV5xjnFud5
FxOXbJdLrmhXD9f9rmNuCm4ctya3eXcz923ufR4kDz+PKo9nntqefM9uL9jL3euA1/ha9bW8tZ3e
wNvN+4D3k3WsdSnrfvPB+KzzqfZ57mvom+Pb70fz2+TX7PfO396/2P9xgGZAekBvICUwLLApcDHI
Mag0SBCsH7wt+FaIbEhcSFcoNjQwtDF0Yb3T+oPrp8JMwvLDRjewNmzZcGOj7MbEjRc2UTZFbDob
jg4PCm8O/xThHVEfsRDpFlkTOc9x4BzivOTacsu4s1FWUaVR09FW0aXRMzFWMQdiZmNtYstj5+Ic
4qriXse7xtfGLyZ4J5xIWE4MSmxLwiWFJ53jUXkJvL7Nipu3bB5K1knOTxakWKQcTJnne/AbU6HU
DaldaXThh3kgXTP9h/SJDOuM6oz3mYGZZ7dIbOFtGdiqvXXv1uks56zj2ahsTnZvjnLOrpyJbXbb
6rZD2yO39+5Q3ZG3Y2qny86Tuwi7EnbdzjXILc19uztod3eeQt7OvMkfXH5oyRfL5+eP7bHcU/sj
6se4Hwf3rt5bufdLAbfgZqFBYXnhpyJO0c2fDH+q+Gl5X/S+wWLT4iMlmBJeyeh+m/0nSyVKs0on
D3gd6ChjlhWUvT246eCNcuPy2kOEQ+mHBBWeFV2VapUllZ+qYqtGqu2r22rka/bWLB7mHh4+Ynuk
tVahtrD249G4ow/qXOo66jXqy49hjmUce94Q2NB/nH28qVG2sbDx8wneCcFJ35N9TWZNTc3yzcUt
cEt6y+ypsFN3f3b8uatVt7WujdFWeBqcTj/94pfwX0bPeJzpPcs+2/qr+q817bT2gg6oY2vHfGds
p6ArpGvonPu53m7L7vbf9H47cV75fPUFyQvFPYSevJ7li1kXFy4lX5q7HHN5sndT7+MrwVfu9/n0
DV71uHr9mvO1K/12/RevW10/f8Pixrmb7Judt0xvdQyYDLTfNrndPmg62HHH7E7XXfO73UNrhnqG
bYYv33O8d+2+2/1bI2tHhkYDRh+MhY0JHnAfzDxMfPj6Ucajpcc7x9HjBU/En5Q/lX9a/7vW720C
U8GFCceJgWd+zx5PciZf/pH6x6epvOfk5+XTStNNM0Yz52edZ+++WP9i6mXyy6W5/D8l/qx5pfnq
179s/xqYD56fes1/vfx30RuZNyfeGr/tXVi38PRd0rulxYL3Mu9PfmB/6P8Y9HF6KfMT9lPFZ63P
3V88vowvJy0vi1xA5AIiFxC5gMgFRC4gcgGRC4hcQOQCIhcQuYDIBUQuIHKB/2MX+PrvRljIynJs
DAD/bAA8bwNQWQWARjQAlLB/AEpyAwzt5FOhAAAAHHpUWHRhdXRob3IAAHja80gsLs5XCEktKEgt
AgActQSPxnz/2QAAIABJREFUeNrtnVuS5LgNRdUdub7+q1XWX6/Q9pSdkdYDAkEQBKhzPiamKzNF
EAQpvu/29fW1AQAAAETxGxcAAAAAnQ8AAACg8wEAAADgwevzH3///v3z508Gs/5tyec/k1gFdXlH
VEws/SQ3PW6TmBHvfy+bZWvdMyWXV4AP47OsTD3Pu8nsulkPbH1O3Mv3c8PpLtUkPY88hp2alNC2
zH6ba2F+hyxZKJ8PzFkEp1bJpgZnyj25hFkWnvnApsyrlJueE/nyZdkFAKBrNPnv/1++X/vALC9W
ZNl4yX2fT9OF2Rj3j/R98/ev3o4+nRiUf9Wa5Z+/f05+KMvY1/hbCw0PlOP41FFmz9ss7ImopkLR
1GrZ+N2jbn2oicOfrymNNJhhKBTZGzuylbKcZaE9dHkZfP5Fv6JRKMv6olTa4N5UukSUYLzNjFMb
hFW540e2nkdoZ2W37LJzjWYeTJio6flIOcW3+9rpr+S0DFneTMsu8oyWwfjbJJQzq5osyI4yG99q
oe2jzr9oHKJ88lX25Y8M5tnMMIeN7A29S11K2RDzV1lWFoqXGcJzXMo9Psv6Uv5MWvjI3M4PjSjB
eNtr9HS5RFhDkT/y6jj68ntEx0c57hmR/+x9PTHp5DuqZPNmGe+erv6BvsEW6cARaV0NyN5jiZ6G
bI3o2k046WewXHxY19XHj/qN9K2JMa3Qn3+4+r67DaNXbV79nYDj4t/bYuEjfUU91lhD+XV20k//
blh2sQWf+z6s0U1YoRMNPSFaNMsBw6DPFkCoIJHRW3eDguzD/FmObG2CX1KGLFeJw4D9Ii+zKfKK
1671sWXp+BDZDN93g5DW57p7QCHpj5+N88bC9IRofPcoz0Sde+s2NHqTlOm76ZjYbsx9hw19++rn
M7xeUjEt9pL8NodUhl5eZMkFHy1zf1p/WjlLs9Oq/Gd9fxqsN4sNW8Oi1zfLtgWUzMPcmCzbXhZD
265x55bdrbLt+Ujbc33pTTluuT/9aNPNaLl8pDzuZZtYk9O66jWPNqPJG7ti6jHDNgS/TavVQvP0
6W5jV8yk63EL+ggfGszQpzjOUe5NinscGrzUNPnhVV6Zs6wvZeVHLk2le0TZorc/y60TBPqgiuhP
o2oLCWcI8KHwK8oCAKrDJWMAAAAQygsXAGRmxMIQAMBkWHYBAACASFh2AQAAgFD+b9nluJFt9ATv
6b5ueZ9tRW3uocbnkU0HAABQsdN2uXpZTnlDd34nfxdk6E8AAABywrILAAAAhGLXdnEUMr7VfRin
jb71CdZ/CtC8P7Ldh90pPS/cWXR8oFK9XXgsqzwAAGBnt+yy4+qdtA1WOb9Vf/bSRu/M1+n/jDC+
9fJp2fge1ewYaU0AAHjQzIfLiLZfrbi0elb+WYEe1XjmPAAAwLnzYXuTRaoVN00AFCKD8dxnBQAA
NTofW6xascuAPiF5JL/DygsAAJ6Jw2mXEWrFE6cBVpWe93oyez4AAKAT7cxHpMr5JiqP+2qjd64Z
nSYxwvgrMeswbwAAALiBtkuVaQkAAIA14JIxAAAAoPMBAAAAdD5ACZskAAAAZF4BaRjuGo8kuXkA
AAB0Pu7f5ZpTIacbM6e8+48qKnJewL3P95DO3204PVw3h+oG8CB8T7ucvlH0f+xJJdJ4GOTtZYwh
lqqHBAAMxXPPx5IDl+PVFwAAANCD27KLY89D0HxX6ssff/Xz/4IA/W3/gwnhyBGwcMu75tq6qwAQ
ntYUUZrh+1Ww3V5Ad7tGqQxFm6N2fW7NR7eev83yxnYrgKfhsuzSKvi+/e+W7jfHj4QnKOe0P/+y
e6ZhVpz5D/cexlUAHMtOU8r6j+TkWr/WGvOtSdjM6HRU0//IPbCrLN/WegBg5mMIwlhnxDCIoVU2
5AB4D5rNBZewxF1Msj1kljeU6bK+CUDnw9K+ZFiY0Dderaay7DLlpXXq9shXVIbXYQnBHfoNADCh
85Gk/zEodXoes95np0EVWRZJyl3YAZOnpOiLAIAez9MuUyZOA/Tr6XlMfJ/1BJXthzHHbuPtCaub
SdwOAJlx3vPRNP9xbG4My8OdIvL0POb2ME4DYOf2z6ASSln/0TFK3SPq9IFKb+zOktjMsDlKk8Tp
l4/ubbWQPR8Aj+LX19fX9/d32DuG69UBAACeju8NpwAAAAAyqNoCAAAAnQ8AAACg8wEAAABA52MI
TVvur24Ht6X7zBum18gyYRPv8KIZbzVbc409QD0W23DaXxtt+h2jL2NYtZX5ydf03BE2tfqXI3xY
sU2j8wF1YeYDZraq/TeJAQBAOXwuGTOId28d2uinN3PcSplrjJdviVbevGQQdteY15qvKj2Pd6ZO
le4Jm8iweT/89FcGC2UzXG4FPJrRavxnBDY56ioGNCEqixYd78FTxltTeY0rFIB7Riy7GFTO9R/J
ouStA2hB1/tWylyZll7YfXvSssuI2CBs+sNm5yuD52890PS1pnz1GC98+TYhZVr6v+xyIaRlM8Pg
KICMMx+GYUrTR5098dP6c/oc5fz/1U3YsFLYNJm3UthkjudbH4YZn0Tg0GxGhooDdD78R7GpHmiu
P1dmnEqQMFZYLGzczagYNkPfPYYsyz5M8uIs1wIMVcgCGNX5GCGonVPKfJY3HjKfQdg8LWxWfbEZ
8iXsIJleK+l/wAj8T7vIjWb/sbH+heHqY3HuAiFs6oYNfXGh9/lmlj8pHQjDYeZDkMZ2EUDfdcbl
IUKrlLnNeJcHXp3vOF3MNki0lx44EjbZwkbv+eNJjVMzImf4NWl5pS6ndVVeZm9cBbZLHG4su8A4
al0yRsccCBt4QogStLA2XDIGAAAAobxwAQDAXFjvgMexmLYLAAAAJIdlFwAAAFi68zFxF9UsAW7E
1vv9Q9gQNk+g1fMI3kJhgpddRleJhFUOsfVb826NIWwIm6FmFH1V0/mAurDsAjObzp9ddUptFAAA
WIMh2i4aJejT+6RvFdUFMWileLesZL15qEsvKbY+rufxtuEqAAibumFjlrm/slBZXk0Wuj9QuNFO
EzZysB3vcFNGTpPnvbwBcMmIZRdBa7tTG327FoO++q38qdkMZRIria0PChLCZu2w6ZG5b3Jpzz1d
jg80y9wbiltOy2aGobwAps18KDleGn011rl9zlAjbU3V6Q8XE1ufwjJhY8vyAmHztHiOzK9yGmyE
/TRTML/zMXH/1zjFiu1OG90xXxXF1gmb1rBxz1fFsBn6xlrjbFfO8uIaNEjX+TCrgb9HsccnTBw6
fBrjbgZi67LnCRvCpsqUQ5iFsibi3ApL/wPM+J92yXP6K8MFEoitlzOPsKkVNssfu/15x7+ZlRF2
eIAvv76+vr6/vx3jUj62IJ9WuAr0ps35rfu0Rx9b0BzHkLNmc++t8alOu2zX51YIm9JhI3hef0pO
mMjxOo7he9pFE9j9ESWk1XPoxlBeAM2g7QIAkBaOmcCScMkYAAAAhPLCBQAAaeGYCdD5AACACf0P
nACLwbILAAAAhDJk5uNUesCl8y6fWZh7fANai1Ie2xUNm+NmQOWxhYcMduXDFNRcgKcwVNtlypPZ
Cl6x8zG01CLDxkW/Y3vktbbUXIDnwLILpECpZgIAAAvgr+2iuQvodKCjv9vHcNkw28WLjo8JG/1t
UaeXcTXlS07L5iib4LtN2N395jcAGEX/sougBn71na1xnlmjE+2VFgR3L8YV5ZSw+XtAmferX+m1
0ZVRLWvZuyyHCRZqPtpMwu62jwCg8MzHbkhhq9joOMMaYSOLzRosTCLRPrRxGHGbRRKXAkBE58Pc
DE0RJYdyXY0qYaNfBFmA0fVLU8pCbHBPFwCdj8v6v5NE8m3aaGtW6n9UCZvR/Y8kYusjPO8yn/Fp
GHLwAKnwP+1iXnhWfpM5jFWHzoadkvnDZugpHrPY+uii9P1oaLoAMAWHmY/j8EvYKaaZCJUfqNn5
r08LkrylrobOi4XNVVpePRvNA93zJbja9pHNeJZdACox4pIxAJgyx8AQHwBKwCVjAAAAEAqqtgBV
YTUBAOh8AMCE/gdOAIBysOwCAAAA1Tofg/a4XV1NDWswaLMkYTO0yAT39nuegguucQAzcdd2AZjY
+aChr5s18yUukNxplBccYdkFAAAAQnHbcKqR/N4O4t3bnWq25trmz2cKaWW4iBpsQ6VCYXNUUj0a
f/ynnJbtSIshX+aacuX5TS1z35qQHABzHXUbvY4B4O5eTf1qypetvDjGtT4uyy5Kye/dX65Us+V3
hvA0oZ3ijvaE3YsrHfkFwub0m8LTzJXI0J+T07rNctMt5nqZ+6YtIxr3znJUU5Y7A2CEe6/qly1f
tvLi9jxmPrSYu6U9/dkmaSg6zgkxq5EtGTZJ0ppVU4aK4JRw1NCwbHJvwtaSBpzOR5bwQpQSnhM2
nSP4isZjYRLjh9aXK+O5PY/OR976RizCc8LGYHawzH3dMWseRz1wSkA/sUSbvx71TrsQhVArbIZu
ULDZkFB93pyur8Eleh4GI/PkS2MJOzyewNiZD/Ps2ZXy+M8/T5/JTN0yLBA2O+340z8e0z09nmCz
UBasFw5WaM5c7NwrfKSXuW/dlCC718tRvtF7mtatkfoHernXPV+t5UVj/gj6T7sAQOcQMHKol3Da
AwCeBpeMAcx/6wMAPApUbQGC4KY7AID/wrILAAAARMKyCwAAgJHpy6lF13OdtV1Wmkmee6ZXmbqg
qVHOvUeFCEO+EsZhtqLksPoyLcDxraOUYhF+RaGUs0d5bCodc5ddMnfZemzrz1fTEyr2fJ8j35Ct
KOcGdqEymptZ230YXn+hWa5VIypWTJZdIEWF4SQIAJRrwZLMN+SURpJ5eZXB2wXHsrnSpBZ+a1BU
H6FJLYTa7ZRm6yy6cA5ihFB4hvrzni08lp0houRf7apokxr48VcLFKVBDv7KyfIKmqHqyaXs66jb
CmtwlJCWso2aeBuv3kLlwlD+Ztn3QjO53bBlec0r1xyXXU5n8+R7nQ03TwuKz4Y7pJWyzq0y7q2d
UEH/2mvWVK9/HTntcfxvZ0Qpy1Spcn4bLRWL0qbebquw5o8MWRuh+d4vcy80I/KvlFneoW+WT3/V
ZGFnsCVplnsWoeQHahqQzo8ytOSTZz7k0W3YM70uxj6WqMuTT4Pj9MkV59A6Jz/mRtTTpkMH+dBx
Fi3PbPaUB+rD5j0T7FWJZmV5VrM8N/Zsaa0x85H0krEmlQffByobU8MDzRFTWlEdahWle1rc5p6z
E1+6Ovg2y2GLGnJaT6sOr7R1aeiATD+quOpiJ+8dFxIKf9Sxz/xFGTnw5cRvof6H+/28eZpl+cz/
0OrwmdbTqkOi0y5hx1Plrx17pj+xHin5HTb6ZOi5zERC/IHe44L6GsuFGQ5h2dId6v+f8n2zTLPc
47FWh3uVzukukHJ9F+fTLq1LcY7S2JtalPxW2fyqu/ou4NtfnearyXKlhUop86sHpn1b2CLq9len
f7ndw9+6mp6/KJU1RRnYn07bOTBSNt1d893mKE1ENYVNfLPc6t7SzfK4ZZfb1sYWURunXZYfYjI0
B4oSQBhtE5Mb16tb4ZIxGhGgKAHASIbr1Sv67UXoPLCqIOxOUQL0BBvxBr0ss+wCAAAAJWDZBQAA
AOh83NFzwgpSFeLpNc8UbvWa4n6x2ENCYmh5Ua0gF3OXXagPUFfgu/TFo6t2PmhSEnqGQoEjLLsA
AABAKA6nXWwKwhqFbln++LjXms3Yqw7U+tWlfZWsb3XYl6wpSkcpJenND7w1z0s2Xele949ub/vW
iMibfWjI8s7CU/McfQiL0L/sYlMQvvrC++9NWslb5dl7Ohly6W/t6tL62OhRsm4NsMVqikYOXv/R
1q0vL+TFnOUr947TRm/6ywgf9mfZLAHfWc2hFnmXXfq7unSW6zK67FZSss5WU9yV5Oa6fbp7dxds
2FQ8WiUCntYgQDzDLxlz6bESeRA/Bgq+VSl/TQkTySvRJ05ybGe0D6dEFBea0fmgxwoLDvTNaUVq
bSfs89kE0FdtHCJncd7qdJ2qh4V8GFn1YAqJll0YV0GqYJsill2lptgO0wbPFiRpATKYkacxRI4O
fvj19fX1/f3tPiTSbMbefeFqv7Qcl2yQXqAf4LW9X9+ceW25bz3tUrqmCErx/R9t4kmNpoGv12mX
Ee7tDLamg0s2H/Zn+TQtTrvAHrRdAAAAIBIuGQMAAAA6HwAAAEDnAwAAAIDOBwAAANTjVdHooy4G
FC3EN46lWfFKgOPZwibZlxFuXMDhEw2jjapbGSEITrtAhtet48l+QQalUOejkJ5RT6JDDR7tjdLX
UcQYz40dcAXLLpCC44XKAACwKg7LLu97fz9fJFc934TC05B/WLYT75a1woWLmGx3ggla9qeRdmth
jAOVtbL1Ci9NkfWLrRtiY7sWkbc1DnIACMYLOfK9VsvW9grGuztKqFbwdPqXXQQBdKHhSCI8DUm6
F/rYMK/X2C4R18iL775jsPDvAaXHrn4lmOG+4NWTlkvqV2n1tzZXAaAxPqCN0nteaby7o+SYBGY+
enHpyXYqcR9vbqZ/vSTBxTpavnz3q9a4ddevL1EoSpM+B+LmxmFo1vofPsg8Q/spz3ZszDfDiM6H
YbgpiCaP0FOmxw0lXrFeiyALM1FXr7Nc5JZtJWVNpfwQ0PkY2EwIMtzC4qJNT3lV4Wl4WhdnaHud
YUvKoCYlf+Ogb/RK9JWb4o1GGD757dUitH7NXXcbqg9nI9um5DE29OzPj6vfXH2nyQAXa22bcpIU
cWml+ON2EN8I/Ik09nyA/8zH1Vjq+PfdKuxpP105OXnam74a2XDaJXmT91kig8prF36+AT+08yTH
fH/PxmXngb4FuCpr/eympkk5zaZv43Bl/FV5Ra413z7w1PhPF+3c1W+hbVcTLIvLaRfcCFCxzydU
Yeo1AIyDS8YAAAAglBcuAHgUmvlz5sYBYCxouwAAAEAkLLsAAACEgrAfyy6qwqs4Be11siOsVhQS
kSewlwns0gtMa6+OtYao4I1sjgqzJ/Wlhc9ZdonsA+bpb1a5WmArJSJPYC+T69LxQ/ArvZHNUc+s
sztYdgEAAIjrDQRfqpuz//FydKV834780efskCDDvZk0qfvFu08vRb7SEBd+axPvNohcP7ZKO4rI
E9jLBLac1nZ9352cr9Zb6vUhas7yLths+TI80D3LQkjLdVlW8LB5o7UFcJmi6GwcCuCy7KJUHt9M
+tfypeydEtK2aatb2fRWuWqbD1uTyNZXyC8iT2CvEdiyew2q9LeO0oST2RtKP9vylSrLTcEvp2Uz
wyV6Nd80F4rt4YvMfLh0uEZMDSk75rYfjuhgnj6zRw08OSVE5IsGdqqH5wns01Rs6Ub+StOIeeUr
iaPco9dshvKHSXQBC70dXqMjIEwn2iY9EFxU7uLdC+w4KyQiXyiw4+exlgzs/PWr+mmdiuOlLVyL
Z8mdxa+w0orv2yaslubO7KkauFle/Gn9jxEi8gT2EwI7/3u9tGC9weYRddnF+P5aKTxwyc18WU67
9Dcu8Qrg2dIq3TueLiJPYC8f2O5K8Xnqjq9gfWZHmeuyb3Z6nnbq23FHx9POjb1G1wqlhPStNPan
yrPmgZtOQlpZkK1jC0Gu2tbx16iB7/7pq8M+qzOaU0SewK4V2IJSfGTYDE1Lv4PqNthaHTUiy1el
bHbU1ZSJeb1+VpOyjVz9CSXPJWNcmANhocUlPwDU5eXfd5mdwyVjAAAAoYRdr57WA2i7wCPqObex
AVCXIRHP0XYBAACADLDsAgDwUNh5ALN4PbbKNd1/6jizl+TsyXQzju1R/ulTwibPyakRTk6SqbAc
IewOM0m77DK0szz67gTuZzTY5mItYfOEcaogi8MgO2dBUy6wg2UXAIAn9jwQdoeJvByD2Ka1ffyn
Tbxb3++Wb262aU+0Gi/rRG8e4t0GM47XYc3SbiZsHh42+l91BoDcfPWH6NYucy/83CuwbZ5fU9gd
ZuGy7OKiPC7Xgaavyd8RVM63AULPtlx0Kll3miH8j8EMIWY+aTKMsHlU2OjzYgiA2/AzPFCTUFMA
I+wOzHzcjD9mcRrZgpZ3oUK68q0+y5nzVUjSdo2wKc0g0QBfX10J5m3jhd2TRBEzHxDX+QiLPEF5
3PeBI35V+u0yKMsxO+Hdja8bNhlGBZ3V3BAwejNsyy6RUT1ObP2Bwu6wVOej1huXrv30LAf0Pwib
QmFzum2iVgBczXyUC+zlhd1hFjVOu+RRQ6472E0+ahmxqEHYrGGG2YZZxgtixXmqIcLuMJdfX19f
39/fXpXtNgqvJvFORwnjji2cnpJoSuvWjFbjDZvnmzLen5bvhnZzWoTNE8JGLmU5LwYf2qZnWr2h
PO3SZGFPrTx97LjApvMB/wfaLgAAD5lGmmISm0XgCJeMAQA8FITdgc4HAAAA0PkAAAAmAADofAAA
yLCVASA5L1zQ2fSgcu7VcD9kXBhZXs8MUZTiAQqQ9rQLo4q1vTHojgGuECVEUYoHyA/LLgCwVFcM
pXiA/Lwca3vPxUSR2ujbJP3rpouSjglNVzmfOHh9ctjIZhhi4zZfV8aXDlGU4gFy4bLsYlB8nqiN
vuXQv24aMCVUOXeJmU+asvOcsLk1zBwbp+41R2mSEEUpHuApMx9JxgRmffkM+tdm40tjVihNYvwy
sukPHNyjCwiwSOcjrIrKWtu2YVmY/nWSRi3VWC3myICvsHtw2LCL1iXGcC/A4p2PckOWMP3r0j4s
3f+oGzYj9OUfGKIoxQOkosZpl6Gt7RT9654nL/nuGXFqYL2w2dq3VqxXYQ2BhFI8QDZewQ3B52hD
Vs3+/MLVr7aWXR2nvzpNVDDy2AzpL1Da5aipQTz1hsaM078k38NP2AhmnFrVFBuDAiBziOojKsBR
APAf0l4ytvzojZVmwgZKlwJlDWCGS8Z4LQGsBkrxAMlB2yW0QWy9vgkAAGBBWHYBAACASFh2AQAA
gFBYdsmO+1m+bIcDKx5WPG7faZJiOf0VPDwgBS2ehI+lpkAvLLvEVLkMjxr0wH5jym3FbRJMafoL
NeXhJvmmrlQLoqY8IbCzwbILzB9ioksOAPAofJZdDJrUsja6QV58M+lfKwXQr4w/WijLi9t8uPvU
3RtT5pmFe7o6C+UqqFqLMt4bmiwrL3R3qUTHQrkqPlsLINQUW13+NNucZX2tbK3Lcikra4q5tnY2
sLJ7q9eUDK+Ax9G/7OIiV338p0aVfuuW4RY0xG8V1YUpzdZxvE3lvN/zx4dHNiJTstxalELYfKLM
4NWv9FluEpfvrESfTxDM6KmVetfpI0pIvSfLrWY0Bbb+L00V9urLPbGhcW+hmpLkFcDMhw9etzV7
fU0WrA8TQJfNEP4+wp8Txy6+vj1+0zA0NPjhdD6gJ6ERZeF+K/ksk8ICdfQKYFhGDLfaD81y5poS
9goA585HgAKCbbYzMkSUIh0B8wfKX2WoNgbjzcGmT6u1iaxyWmeoiLxQ9XxVdeJrStGWvemVH9NC
ri3CR0dkzsyHsNZO8SfM8txVWyFsxgXbuJyOblVHXIwbOTxwKa9OD5/uB6JJia/v5WoKjMPhtEv1
k2k5BeRGj03//MPEPR+DnHncPhbWqo7L8p8PFq5cTZsJBlmVvDpU30mQs6agIVp15sNFrlrZKR6h
f33VX+6Z+72SFzfka6g3bMuxqRqvXZY/z+7O0ka/XW73yvLoCrsL46sK2xOHpzWlM8un+xua8jWo
VtrCRjYprH6NqDtJakqGV8ATefglY/RJoVyIRgYtFYQma+2agj9nwSVjAAD0NgBCQdsFIDXBa0aQ
PAAofWrKIqDtAgAAAJGw7AIAAGAkZl1swdW3uTMftY56upha7nRrmDNzuuWBIQqQvDrkqZXs/p7f
+XhCq9ckq0E7la3zQYgCLi2U5RKep/NhhmUXSFFveWsCQLkWLHJPa/z1iUN5uRTA7n9atZtPtcF2
Hj/VRhc+2rolpDdRa9vgDSHLNjVwmxx8Z1qOFe9dfMdrSX3NIETlIZRG871Tefz4T9sDN6vmuy3L
t2HQ5F5b2HjFhjIODc2Xzb2lW1GXANB/tCajl11u9cqbJKRtut6bt7x45/xYp251vxz8bRK3Hva6
ePv433FmEKKakBDkxQ3K47I3+h+orDs9MveOd8zbwsYrNvRVw9x8GdxbtBUVvtkZva0Pf/TMh2aA
myGrjnf3nkbArGyepjvCwt1EheNEok1I1teMxUJ0hA0TpcyHFlA5UeJa4F6z/OfaEx+vlcrYJptu
E3aPdJohX2YL5bTCdLEnmrFGiHqZkZAkSo0T0+qPDXbRRo4BhtZlOh/OVetqjVBePly1gxlm4a3y
uPuUw3axfhxvxnNC1KwvX7o6ZKhE5rAx5EveT1M6APJPwAj70rh0dWzno/OtIPx84vvGXD8LacbK
Wb7SjK1oBiFa68WTpBIZzNhtJggLG/0Db7dWFPV82CDEfSe+0Edcqe/y8i2Gps6dRkJ698B+EXl5
fLDp5MXN3riVkL5VA3fsOzcpj+/ifvTCxwgzCNH+wHax8DbXnT70rUStYSO4d2JsNIVNa/M1qI0q
0YoOKpSN0y5JBnCtW4IBCFF4ctgQhxOLtW4qkXDJGAAAgJGYKYr1JkJ+fX19fX9/J+9LPvomFqgw
3CFEIVvYEIeQmoTLLgAAALAwLLsAAAAYYc+HkbkzHw/UK8+f5RgLNXeWI95NCwUPbBwK1UpUbed3
PtAr5x3g2/mg6pJHXPrkLFe5gQaH2GDZBVLUW96aAFCuBQu+OBVhufNXCHrlWwUxaGVap5fr2W6A
luvS538HmUGIykMopb68fGO3nK/jP20P3BRy8IZKdJXl2zBocq8tbLxiQxmHhubL5t7SrahLAGwP
PyU3etnlmXrlmcWgW5O4yr7LJUjH/44zgxDVhIQgcy98pLdQU5SdouRNEX4bUf1jTaU3ZBv6Y0Nf
Ncx0L13MAAAKWUlEQVTNl8G9RVtR4Zud0dv68EfPfGgGuBmy6qhVOEKw3jdfIywckUHDNe2DzFgs
REfY4O6lfvm0lUp/ASNxr+PDl5/5eK1UxmF65cFhYcgXFwo9PES9zEhIfv280Wn1xwa7aCPHAEPr
Mp0P/9Hwacnl1ytn0POE3JUO0eqK6smrueBec9gY8iXvpykdAPnbGUGNlmHh2M4HeuVJbAZCdI1B
cF1h991mgrCw0T/wdmtFUc+HDUIGCd+Pe/JqnQ/0yjXeSCUGLW8WubIw+D3qaAYh2h/YLhbe5rrT
h76VqDVsBPdOjI2msGltvga1USVa0UGFsnHaJckADr1yIESBsHFJC0YXa91UIuGSMQAAACMxUxTr
TYT8+vr6+v7+Tt6XRK8cCFEgbLzSAphPwmUXAAAAWBiWXQAAAEJhp0iimY+Jbqolm360vKLxC2yI
6/e81/3oNNnVq8OTC/SBbS9auFU7Hyg+V39tb+zGL9vfmvvAJvUiWDWYq7e9dD42ll0gSb3lhQEA
D2n3gq9bzdm6vtxdaVPNlq/7bVV8Pn3m7StQr95uM0PQbpYvs/Pdtd4pPO1Yhd5XTh1d7WtGpxy8
l7y4MuabHnhbK20hKgShV9XreaDhJvLOxuHUUVeNQ0+w9bSi+rTMLYChPaTttU1RdJZyAfqXXVxU
s+XFM40oc+c0vkG93WCGQRp7XE5lkV55csJLZ/z43xFm2NTbN4XWdqu8+G3M2/6iybWLDrt71dPn
RVkrfX1oMMMWbC6taOtHTdLztvaQtlcZ851F2frwRWY+bke306eGzPryYertu2un+ycVzFnWT1Q4
Tgk2Pc1mhtngyGuY3U1a8mqHJJkSzHC3MEmJT9RmK9T2zvVAoSr/ymmW7y6e4PJw1242eMOcZTkt
355HEjPCtLYXfmdP34ga3KSUgCxPaXu9hiLC2soavHIGkE3xuXqP9XRAH6l/fZuW+8zHdrHFIdIM
bn7M5sMRMW+wsLr0/PJD55Xa3u1i48vCbdTw0y6ta7qtT3jasduJZ7TelSF4+7SLGQlfG45r5GvE
/NUDvfYWFKp61Y1c8iipV0KnDZfXw0+fnLPv8nJ35a7/eLVpWS88rVR8NksSm9Xbfc3YLlYTZG/0
SM/fCk9//nNn2ND1lxFmKOOwP2zMUuZheuWtFh4d7h7zTY7SHP1w8eFtQxTp+c4HbuOl50+LkrbX
PTaGNg6hDL1kjMsbgOEgAMCURilz08clYwAAAKHETFFkngih8wEAAACx5NF2AQAAgCfAzAcAAEAo
7PkoqWo7IukHyjrP9cbtYbP8hdJvYbksJ28lRlQHoO11DzZUbat2Ph54lr1w99ba+eBV+gSDWx+o
+T6dj+WDuXrbS+djY9kFktRbXhgA8JB2L1glZ1lhORcxaPkW23G63tvzZJ2Vgtp6b3TWis//DjKj
U+VcLuXT6+GvyksT800PvK2VthAVgtCr6vU80BCHnY3DqaOuGoeeYOtpRfVpaVqApizfxjBtb0+I
2j7KTv+yi4sYtLx41q+nbJibWlXWuUlHW+8NW9gc/zvCDJsouVBetr9oYt5RDt4QbAa1+s6AbJVf
0ASAow8NZtiCzaUVbf2oqSmwtYe0vcqY7yzK1ocvMvNxO7qdPjVk1pevK+tsznK8N1ozGyyXNW4k
YY75JALrs8ivH+luYZISD14sKNr2zvVAoSr/ymmW7y6e4PLIIOuMUuvE8nrgO3v6RtTgJmWxwH5g
lse1vV5DEWFtZQ1eOQPIJmRcvceaQdb5gQNZOmrZfDgi5g0WVq96yw+dF2t7ha0nS7ZRw0+7tK7p
tj7hacduORWyjN8c18jXcOnVA303G61d9R54DUG5tvd0vdXr4adPztl3ebm7ctd/VEqZ7ySSZSVr
Xz3lx8o6n37ZVye6vwp5maGMw/6waZVN73mgV9unF3YfFPNNjtIc/XDx4W1DFOn5zgeeZvn0L75F
SdvrHhtDG4dQhl4yxjAdGA4CAExplDI3fVwyBgAAEErMFEXmiRA6HwAAABBLHm0XAAAAeALOR21b
NxwBAAAAnY+ungd9Dmjtp35C/JQostZiMhwHcB/GyA+ce7YL4Ik4LrtwpgBioqX0LQLVq4nyNg6c
DwACbDgFAACAUDyXXQwiYQCnw9MwQW3NKLlHlf40dfNdTKdpterLC4rqt9dL9zhKL5tu80ZPvBks
XFPlHCAMr2WXU31wADlg3sixNE5Qu/VVp0xL+U2bAU368pq+gkbY/TaJVhkEjfG2v7SWpsHCfpVz
AGY+AOYQKUoeOQC90qkK9mHpAFjJQmY+AAZ2Pt4Ty9Q0mIW7oLY5LZYgM5TyFDNqy20AlOt80POA
R42k5bTCZj4o5YRmCNroAPADp12AcbBzWu+Xza0O6qq7AfSOIiABngl7PiBRM60cILoLajumdapB
f6tKrzTAd+h/q6i+M17WEL/Kl/ArzVmS3a/M3hDMMGijL6tyDhCGr7bL6eEFAABmCABg1MwHfXwA
AACQYc8HAAAAhMKeDwCYALOkAKkQVkJH1FY6HwAAACBpPrvzOyANWxfs6u5tgJ6IikwuSa4f6P/R
A8FBmZKfFuDD+CwrU88fOWkVmPO67vO0S9qrAxO6T5ByWLg+VLeQjuz0ZjRnETSp2EzJlHtyCbNM
58P9gU09RZtsk8/MBwAAaJpp4cISsgwJiywbL7mb0y8h3SM8rembK2XTbaLkwq92kx8u2uitxt9a
aHigHMdXMvc2z9ssdJcyN3tj8xOR18eh/tZ2mxmGQpG9sSNbKctZFtpDl5fB6R1ut6kUyrK+KJU2
uDeVLhElGG8zQ9h7ofyowKX+u2UXvUJ3p7r07UfKKT6NbLqXKLny4fpJrU7jb5MwyMHrp+9cjG+1
sFPK3FGi/SrL8l8EiXalenvrcNOgZW8IG9kbrbetuwvWm+NQWSheZmx+U99Jsqwv5c+khY/M7fzQ
iBKMt71GT5dLhDUU+SNzzPQU9C2/bX1qc8fc8PymnBueP7F7eLygOnM/VTZvlvHu6eof6BtseVTx
HJ/5bhM7dymuEV27CSf9DJaLD+u6+lQHINVLKqYV+vMPV98vd3a94aitQUK6R+bg/dtjjTWUX2cn
/fTvhmUXW/C578Ma3YQVqgZeShxPuLXCUPXeM+SOR/hyxvzo2mRoZNIeIIhvKoO1eErvnE3X+Thd
rbwqrc8v96hLHx8im+H7bhDS+lx3D1hau3p+pDcWJrkAurAXpPQ0QHD0JinTd9Mxsd0I7nnYSnn0
fIbXSyqmxV6S3+aQytDLSyinPvGZo9Xbc5Zmp1X5z/r+NFhvFhu2hkWvb5ZtCyhpCcuy7WUxtO0a
d27Z3Srbno/yMx+nWtunH226GS2Xj5THvWwTa3JaV73m0WY0ecNXet4wBL9Nq9VC8/Spu0S7pk1p
EpH3DZvNpBQ/ImzCmhT3ODR4qWnyw6u8MmdZX8rKj1yaSveIskVvf5ZbJwhydZE/T7sAJJkhwIfC
rygLAAhroLhkDAAAAFYAYTmA1IxYGAIAOBI6q8qyCwAAAETyLyE7x2hhkvDbAAAAAElFTkSuQmCC

--Boundary-00=_IgMQEQvQ0zFQ0Fy--