From 0729f6481dd61d4f98ea534d651d7f1b9a7d5d4b Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Sun, 24 Mar 2019 16:25:03 -0400 Subject: [PATCH] AppImage packaging Disabled by default. To kick the the tires: wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage sudo mv linuxdeploy-x86_64.AppImage /usr/local/bin/linuxdeploy sudo chmod +x linuxdeploy-x86_64.AppImage Enable VPP_BUILD_APPIMAGE e.g. in ccmake make build | make build-release The vpp AppImage lands in .../install-xxx-native/VPP-x86_64.AppImage. To run it: ./VPP-x86_64.AppImage vpp unix interactive To run it (as root) and inhale the usual startup.conf: sudo ./VPP-x86_64.AppImage \${HERE}/bin/vpp -c \${HERE}/etc/vpp/startup.conf To run vppctl, or any of the usual vpp binaries: ./VPP-x86_64.AppImage vppctl [etc] Change-Id: Ide8cf4658cbb56f1d36a1ce7fc8f7338f8d38278 Signed-off-by: Dave Barach --- src/CMakeLists.txt | 2 +- src/tools/appimage/AppRun | 14 +++++ src/tools/appimage/CMakeLists.txt | 27 +++++++++ src/tools/appimage/vpp.desktop | 11 ++++ src/tools/appimage/vpp.png | Bin 0 -> 22242 bytes src/tools/appimage/vpp.svg | 112 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 165 insertions(+), 1 deletion(-) create mode 100755 src/tools/appimage/AppRun create mode 100644 src/tools/appimage/CMakeLists.txt create mode 100644 src/tools/appimage/vpp.desktop create mode 100644 src/tools/appimage/vpp.png create mode 100644 src/tools/appimage/vpp.svg diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d467da7549a..248d7b8d39e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -98,6 +98,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") set(SUBDIRS vppinfra svm vlib vlibmemory vlibapi vnet vpp vat vcl plugins vpp-api tools/vppapigen tools/g2 tools/elftool tools/perftool cmake pkg + tools/appimage ) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") set(SUBDIRS vppinfra) @@ -141,4 +142,3 @@ pr("Host processor" "${CMAKE_HOST_SYSTEM_PROCESSOR}") pr("Target processor" "${CMAKE_SYSTEM_PROCESSOR}") pr("Prefix path" "${CMAKE_PREFIX_PATH}") pr("Install prefix" "${CMAKE_INSTALL_PREFIX}") - diff --git a/src/tools/appimage/AppRun b/src/tools/appimage/AppRun new file mode 100755 index 00000000000..b4c243c2038 --- /dev/null +++ b/src/tools/appimage/AppRun @@ -0,0 +1,14 @@ +#!/bin/sh +SELF=$(readlink -f "$0") +HERE=${SELF%/*} +export PATH="${HERE}/usr/bin/:${HERE}/usr/sbin/:${HERE}/usr/games/:${HERE}/bin/:${HERE}/sbin/${PATH:+:$PATH}" +export LD_LIBRARY_PATH="${HERE}/usr/lib/:${HERE}/usr/lib/i386-linux-gnu/:${HERE}/usr/lib/x86_64-linux-gnu/:${HERE}/usr/lib32/:${HERE}/usr/lib64/:${HERE}/lib/:${HERE}/lib/i386-linux-gnu/:${HERE}/lib/x86_64-linux-gnu/:${HERE}/lib32/:${HERE}/lib64/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +export PYTHONPATH="${HERE}/usr/share/pyshared/${PYTHONPATH:+:$PYTHONPATH}" +export XDG_DATA_DIRS="${HERE}/usr/share/${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" +export PERLLIB="${HERE}/usr/share/perl5/:${HERE}/usr/lib/perl5/${PERLLIB:+:$PERLLIB}" +export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas/${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}" +export QT_PLUGIN_PATH="${HERE}/usr/lib/qt4/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt4/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt4/plugins/:${HERE}/usr/lib32/qt4/plugins/:${HERE}/usr/lib64/qt4/plugins/:${HERE}/usr/lib/qt5/plugins/:${HERE}/usr/lib/i386-linux-gnu/qt5/plugins/:${HERE}/usr/lib/x86_64-linux-gnu/qt5/plugins/:${HERE}/usr/lib32/qt5/plugins/:${HERE}/usr/lib64/qt5/plugins/${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}" +# EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2 | cut -d " " -f 1) +# exec "${EXEC}" "$@" +# So you can run vppctl, etc. +eval exec $* diff --git a/src/tools/appimage/CMakeLists.txt b/src/tools/appimage/CMakeLists.txt new file mode 100644 index 00000000000..1b83656dbf8 --- /dev/null +++ b/src/tools/appimage/CMakeLists.txt @@ -0,0 +1,27 @@ +# Copyright (c) 2018 Cisco and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +option(VPP_BUILD_APPIMAGE "Build VPP AppImage" OFF) +if(VPP_BUILD_APPIMAGE) + install(FILES AppRun DESTINATION . + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_WRITE GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + install(FILES vpp.desktop DESTINATION .) + install(FILES vpp.png DESTINATION .) + install(FILES vpp.svg DESTINATION share/icons/hicolor/scalable/vpp.svg) + install(CODE "EXECUTE_PROCESS(COMMAND ln -s . ./usr + WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX})") + install(CODE "EXECUTE_PROCESS( + COMMAND linuxdeploy --appdir vpp --output appimage + WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/..)") +endif() diff --git a/src/tools/appimage/vpp.desktop b/src/tools/appimage/vpp.desktop new file mode 100644 index 00000000000..008965c8905 --- /dev/null +++ b/src/tools/appimage/vpp.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=VPP +Exec=vpp %F +Icon=vpp +Type=Application +Categories=Network; +Comment=Vector Packet Processor +Name[en]=VPP +Terminal=false +StartupNotify=true +NoDisplay=false diff --git a/src/tools/appimage/vpp.png b/src/tools/appimage/vpp.png new file mode 100644 index 0000000000000000000000000000000000000000..ef78981dd2d0a741a00e42caaba7e3f2899ebe5e GIT binary patch literal 22242 zcmeIac~p*T9|roQt+pX;v(jKLp`_BFQDiGB6`>M^Qj*dnO?D(S7*a@+qye=vHEBST z(43G&uQZ_|O&ZSid&2jfKhHYntaa8p-}=_tU*7k5@8^E*`!`&_>v!GHNqyaQeB%Yj zGYrGG{_iyg48twRFn?J7$%9W?N(^f7e>@gC>(($M^uOrr`11@ihgrWy!^rK*r}`uR z)_(VF?&^In^ySY#{r~)D&fAW{C6m`q(`Z`M+b+E-{L9`uc9kx5_4iA6ySlh+mv8;F z;k-*#_Qq9b52=4S^>=p6N%`u0oiX|Ti!3gP&)VcKE;6b4ljuG>T`!wSohrFy&AmTV zL}WIs*f*x^TE52)54DDdl;rH}Y!yuF)SXn5wlNG7JunMXR)0T{4}Tx@!^HI!G`Sf@ z{7MWL!%QnJ$F<|FtnuIDGO`Tg^GM)-m;Y~N{x2GV+_g#X%Bz>Y zi7#%M%;cRU^f%`6!o+@K1jDSKC3vZ|F3tYgB^fac6RbKQz9nTxgc7%Ejj-#Rvq~{* z%*@PWSFXHX%J?jp7&x)X-BY5-S7^!m(Zo1$Ykjqoc~{x!+1lFP+?qNM7ruXdqUhTC^9ELo zx`Cfo;S5RBSt>_*HbiW)Xezl-QCW!*8i#*$1YG>EZ`$%tLcJJG8CGOjvnW61fe>37@n)453h-`IKdADg*Pe+63?3Mdzk(@l)<*sdbwbx@ zYHDIy_kL#8qM=zU}#xJj^_~E>sE_V2pw5-Il3&uMH ztgbj{;fB5SuI3Mhdg?G;3)i=Yt?u5vi|0Gr-pA`xJuz^626Utx#N0{qp53XJ==)L0|Xc%n~fOke=F*6GlGNTpFnAIdBdBv=mQZ z{h|1*v_oS)p1`ZqS2X{$RL(^V8N#Uw@K=tK9HTCY(Jr)e6&doKdhzzH2>$Gj{cJc<;dX_AsT`HHLvznT+MK5=IR< zo|dIo6fwqw;eqz9`VKD`=jH{qwuWhM-EG_cV2UrtY#^ zv)0m*3?O%~Ns5!4^+h{EV|sDdYooGA70ZYJj7^kb<{W|9J^ik?<&g3mgKa&ZUQOj! z?o`K5WcEJuKg!KZq308p>Iaj7H1)~OpH~)tf;qE9GgkY9 zJM-1ZcYe)_7c&s)Fy?>Ujqy1Jw>i1k@Ou79vB-})1_u}{C}nloo)G-FSFKnSk=(et4> z?Oq8ATb{q~ftNP5+u{=Cla|wAZEtbMsERhUwlk%Ub!gVM+2vuDr9j zYC{n3ReY2G`kpP;hYRj!7G}wooBlA5_|iG^dmFsH;kK0egc_X3_-I>L8>I?G*?fANz3NNu z$Z)m5?gd5hrbx;sGY&PAC7#-gD+&t>TV5>79hrG#@fGj;-Xp^=|J_9~@s3ql5F$Yw zT^HK0IOI`)km8C(x>x84>RlUzfAn_fMQHF)z~|)`LFS>btKj0Nb>V4OUN`)x@Uon( zfz_F#LMa;~Jib10sCTYq2eYy^$}mmwNmnf>jabF$DiS42ZLN&kwnOm`A8n5J#v7*p z@obNdBMql(cN|&f%rkD8$^E6T>*@@xLW;XIr!mn}1O(;g6tx>7`BuDngB)-SyJjF3 zl0NwLDd*FjG75&9AC@O@;rDi-=E@%jj6S=!CB|D61qows+%9u51=6xM>c3Edc-Q%; z!38-ZLmgPoqeA9mIuQStnx-#D$}{5AjMe%uAa+ktM4@&2?=-d$;dch2IeV+eMazz_p<_n6#9(i}2HqTcZe5?k; z4si51CAYiyOnU#va0X}zDPG@WF!xs|AhPZNK(_v$`hm&cSH@e#0Fc`ByCQV5%;Cd0WxuT zvM`Loc#@@c^+j^gv{PL^y`20r;422%GYLF?T7iivDZvG&X98LP8R_Mh zdG*|>7I2CYYA9$0E?c_o_5xb7g_^NEO#@=-iXv+kYaKaqL{?4?0ngzvpL~Aj`^W4< zu8_4U|1UqMD+^?duaUL#y(!jvm`^m{%b8)R4(1?Zse`Dn|+*9iIT}eR+4E;e&6btFZp+ z6hZIb2b4L>sZwSVR$^_Rc161D=;+)u%~;{gGq$*^wYsm1!vWISNcN09bTBq`SbOF0 z$4fAaH!NOK&;slYZjSO+rKc~FV~pl&`Yz?)LEHA}W$Juqo}zcF8v1qHj!gk(2s-@j zBTeh_PV2t{0|P5=nRw++cYNTY*^FRbz$TiIi;9Q#PMo!T4j#1n*r0A$Nc|JBD50rh zy4aPgiHVC@KRh^XrTtr>ESJy7p7V<0T^apb6Zz)NE8~7io}F4Gq7(6OQ*oDY_<3EW z#Rt;g`vJn~%g`kjSg48=^IWW(X;hLjaJ>Kb_S*k5Qk8pLK4;#%fu7H^k@%4kExxza zICQ>ySS=uQ^qy^PA<`*pqKU$ck&LEqaFg3#SOs&c5uAC}%_*`qjQa7Wxe+U^gN2hT zD1T=;bdk+t`)Z8$} zAdxm7mejV}O_(VeAfn<(YKs4yb>*fECm>w zlQ9p)lHl?{%mj^*==*?L46HhBQD6zP;lDy7?La++aSBP-1q3~kghtl%4fQqzXMM?B z;>?q~s3?8|>?h#t{B@LjF7LJOOe|F!8BA}vdYawGohCP2zPu3#RvUJsr3%{3B*^*k zL@h4juG8dKnP#8;eM{TKMq^RMH*eoYVkiC!ras5UZ8$wsDhRt%Eg&qU>Y;!|FtqyX zuvglX-{m6{{SouJ9;11paHD)ZqUf3+-Z$It?0FjM*54Gyrj^A)O!YiX-v-o$b^P9a zkNYZuy>Q|6CWRiYK*8yhNPxoUU|V+$bhk=dmq)Xn-}2&AXlUrx497i~Ib3R!v2hsC z#h;qKx>Q3D;DE_}{PYWE~d6|39%A>0UXU~o`NqgY+)T8quFYRcxfZRg(3;|V6 zFdN}IZNDnXox68lPgN0Mm&InveOqpzKFY7sQ;VSW)2m~mUkC^aofYDD3ReF5_k*s& z*@-eXtAjf7CsLHfzhPW?_RD1z<{kR@>?8{)TB2{=TE^~=QFc#H&(e`YI{*`9Wo2Q@ zjF)fB!^y2x@p{i9R>?bSjjN5%eEVMsp(uVo;}b(sWtH50`v#FRm0r`ffTU1Z^90HC zIg*(zSLudgxS<7kJ60c#c9x@&zFp{d5wIpGb|%v|UDJ2|7GvX?*e@77)z#ZgObo4z z;>ci8_(s9T1_lP$%5@_1&Ty8X&;_B6f(}5eQ8=}EagpoJ>l-djdF;nWA;x38rf;m{ z>wWPB%>cZtVfkqvex{|k{9OVcV)Ne8E0Vz&`4}kYQ(J~FW<0YVU zTfij8p-D5D=n&lKY1crtj#T!vGUaa@+5%36a^!EBA9^mg&1;DYqhC_~?qY=ZaKA%W z0pSH~MTUWp!ofMPQLHewVg}Q<+mGisu!dW6gli$()4 zr-8b1`*3#MXx0#5I$JT?d5*?GPGMjd_TzeKg7|*|{p9&t`QK|XM{Y)84CZ%9)zh6A z1ZOQ?QP1v8H@DxDaMoJ;q-$|`Wt>i|iM)3PAa|p8#^MdZA}SW|A01~`F-IerWqxuz zF<(H7W!#Kvc#KAjqw-&>{U6SERYeWUVwhrw5HpuodmMURS;fN%g3jO)ip&b_H}A01 zRnk8I>$EI5H66pgac{qsIF<2<-D$0#F2wIgh4j?huD|n@Q#r!I*1Oi5uw?JVX9-SA zPED20n(692P!&};RZsb>(tKOR9pRT(+HIdGqO5=%e{kAYB|d}cx|kDD3Ap7!&$cRL zDXEqFU&3_Z=|zlBskCg%6vdorIW{#(eXuM8tKIv4CuQM@0xK3=*NwPL3#RSIV@5gN z0r(`YwB_Az6jf{xRC^tq&osCN)!;%4HGL&3e(f-2$OOZ>j6+tV{0hv_Xd=_1jBCzw zh6cR*PI&v94>rzBl(~KT7u{3wP_g;S)G$-W_4Kr}5JoSJo4P0;ao5nw>0nEF%xGA? z`JwOJgLovm{)v2<8-6GG_XE|rFK_SBd4QTBQAVkS(5qRdEG^7Z^(Fjwb{GN0pnZ-cdE*bak-rapT@EMAsgh^Nh$s%7%@E9&q z>S1+-fwM=e0Hv0OT<>R><&YN{eFje_|2w@;+HvIbJ-6Su?qv>OFr=1g9Nw5<4PA^tPOGNG7V?ySX@h{#UJ ziva>Mi;{B&+7KbtH74?vSbY8P#G!J%7p%3##=~CP+S&lEnXxn= zg~8EE{$5{%;3}6-{-|@52t}!l7hn|J{do4A=X_7(6>*z`O$W_#(^1HnQxqJWYFUJ2 z&x{8^SqbOfL9{TI85~Do)6+17gK!Ey2M*{Wx>NyDsbVBNb)Zm#af<{9T| zB^XkFcVCr7d9()R?}nh#cy^r#vT7U{hkH(~l|SiKCoWCj+wH&VMk+-b*S^X=;;Ib5 z1kX)hIhLt;T0Z9_ZVLKEQWYOp3z$*Rt$6+VGBOTGGX;W0^Z+xZW&dvc`cx|TPMPW| ztOBL?K9h-9vSJkG z@5mi155R7p(+}!kHFzJ+_3#6y5O8UaGWB=FE8CR#PoCd6(4L|fQSlH~9-EP&=&ZHt zKY4+DfU@#Ai;RqM*PV$(cw6yrLeR8bnSx7jAmewa2CQIum_=mf-IBMZVTS zygdycUs**3vbet`8qA`!Rp}MlV*vrd-Il|H{T1+7xTr^ORzqN|xwndQ;p8U{LM$2D z^BMF!BaV`8Kb2$$GMdPlQLC**_1G4mYx|oiLJ=v!MB8G>g+<)^g7p4WeGVdX=8>LH zu+)bMn_?{*^H0(qt&ou|F5#1Z^OsnJlK~Q`*C0o<2v!!Z6l>@xv=&Pd2wIBfcL{^V z<>aV_F5QMQY0W~9_`)2|9~OW-Y<{aKVAN|dm@Wb(DCEhvZrw_hQLReae53K*Ls-00 z`qz>roM$p+#BVLwX?-RFg|C!qZ$=rVh0kdXK|j7^NjVozN3D`R!h-3T~7VJ2DX6lvMw%HITt67f}^kg1#t#kSwyzl~*#TXq7TI}COe zQN&=cKQmXe5!Mbg_3)uDuO-qJ=D7)x88tD50y{j!7CeOGV0R*jrhK-m5bF!)*egGc z%jfF~+2R)z01!aPyfCz7b7=(rEOr=Ny5oTY`d<_-$6>i{tP2)-mA!$=lp47>Dh%$~ zY-Y26;25R^-fycYvh~nFcOrO&(Y}e(L14F{wKL7A74r8pToGpGvh9jz&nw*EWvb;m z<)QAXL>ZLUwuXv9noRT{Rw;}VKeOpzo;TvEMb-6 zuk%2yd1^AU34fw`HAM1<$-8~LWOZ(6AZmA>50^A>JsHZPiF^`|Zf?8NIO_HqC3+qu zUHb|L`@hAq3>M?FVV0oLG4u=a9~}N>VC8hCZPil8ACke|=sAcnbA&a0Pra{-_iCzG zCmM)C>(-~-FIEDpT=ttf*MO>Gd;;+E0Ndn@MF7c2F}}1*Xqy?lFqc8yq8Oyk%vpvp zP<#D^^daBkIw=Q&`8T|8o+9HoG%|rX6B?rd)TUSZv_Iz;k117`QY)aSx^E0qiRTn2 zpYGzobXwj;c{&aJ(gIki{n$pZWKaJ+)9^8j#PJx7f+t;7fh7)}Hoaf!iN|;8PdT)} zaZq+SGl$=gXSx;nb(U)fyp`ahDu_49A-Pb*GPsG^fUQuXP;LX-6bNz!tw01W4eCSa z{S>J5zNw1K^~1ueFO-%|_#2#ETglvi?dtBM^))l|Q?r`je60Zg_2(B+99pr*TK_Du zD+;aG&SPB^rX99vo zcjs#Q8@Lpsu^EMn$I>X(?_it@gS`hiV{C)!5$lD+cDPf^E_yZW_V`oD ztfi%@KR&?}lsogdQ^DQF4%E)*pPaGwiNiB4rhkQOf?$U5F@8~1A=HCvjoxNx_P#-V zW2W!aOB;CXP2Z%^JzbX4P`U0~WWmo6-}=wxSXa1k5mGpXqUj4#3RLqLiHR@iN7cu~-QuV{=buLaPY;?JsVf zMuW%Wqng#L+j}bBzTI*CYU#fH`vZO^DE4|}^;g-`yug8N1r232dPu8=0lP(RY9v=O%>iHE#88qT9BGM=9^yArl11%Sar_0i=0fggOyBqYzl7yI#x5+?>wT?E)R ze_mthstz{fOSV}*Ik#|=Ia|mkKsvPf*6(cY3-W1+2nZm5!deMC@TC---t~>cI%18f z@Tp!bZ0c08*5TpUndI|H>Y8m#iw%0y2TUEGEbM~KU)Sw_Y35o#UDIzOID&aan?Q|U z&jhURsh(V3Gdz$oqLedG1L;IdbaJw!<3NfzdhVpSK-=xI(pV$|g*-N3LdT}C~=o==x(mFM~K$WgO|TKd%j+rHlAWyCMXXl!(dmUJ!@u*yd}jlFIK zu4_X43OrP*h%VX|kEsew`Sgi=HbK7Ma}#ddIE{Qt`#T*Lsz?y&K>gs0VE>B>4i*7| zauQU_9lvrvLGgENF8(Ke6{Bv9M_9jOd~nMzX$r23!>E-=mRGU)i8ALd%UJ1lx7U(r zg#F3@6`$qX2Z!+$h2s{K({eXL`Crdp7Zh-Esu+Qwq>C{c&oc+wZdgLef$Pvh?0#ax zsE0XLM(;(dy5^H%;P#kDB%Ug-I-y-&t#$nM1*J2jp*dkSq9Z)%R*c%fY^` zM46J3bw9?CrbYjoP3yb**mc2M|J|uUF@R^5U^TM#$F*!J8bZvpC0hzHK7w@lKyQaA z$y(Y1ZYRXW%QNcR{dm^c3FYZ2yg!!SdL0r4hLL+z?&E(^cAvpSQB@$iuT|IhK-7{L9Qas=6xa`bB14&dw9K^Xnq+wY3Y59rzvvF<(K<-J0b(+FAOsUAk{JY z=0Aq{y4yN0C9#nEu&1Zz&*qc93w&g-WxsRScA8$7*-_cNlIhWwGgJ2K}!Bm`A;#?#Rk}kv8T#Vt0x_U0k z25q7OHV$LdU4A?sr;wku@F;Bov5tt6MHi(l*#&%tail%^I%yH{UE@9;=FDY`5i^DV z(|`Ipj15GAQM-V8D$pXU7Fc&}N;sEKo27N0RYHC|_l3S`JZzyoIO9ThtKo&g9pe~% zGc4A!-}vwmUioWN3n`n zGoo5XOvWVa^W(|0qP%Fyss|KS^YQUXgN2wSZLx-&20>ngLIBwossavj*J)1BDoN)> z>YE|^Oi%)>1mLmHpKbr3D{X^X%hDT9Enz7K)IZ7;p%bP=J3>d;X$wGUo)04XFDP2_ibh_7VB-K}G|B;d(RE_L>)JW2&g=igV;Ng?u$Q`JTyW8E9L-%YK)mj+=^5K~+O zXkx)CLyET&Z~ExiIFb#*;WR3hzBoQhB>0Jg0VJ&;RE5E@np3kWjAIHcd$y&R%$8} zj7rHJc5f5%vD|CTsB01awTkj|8SEVyZitPGTj)F~ZxbG1jtn(S)qdPjJ55aw*7$he zB|sv4CK0G}aWXi*zACjLLp^z)Qi%;zs~J1 z*c!cKWVpjHo^d*b4V>Qim|rcxdnjeZ*#p}i!0Oew`Zi!~j4tN>$jUuUoQK!&x2Sks zu0A9BI2xEhGWo&R5?16m%|~xH?t9!Fc$9KWSGgvCoGzF6E_^tay0jYrz6nTIFJ^=> zZ~gb%w{N#V#$!8Ciy2Ycrtv~bPU56&ys_n$cEp&!CewWaU%YrhT;v z2xc$s`sGdEaBpsu(%1wCy6zH*f&lk9$nNVS##AqdTsoYtATv zMkmy4T;nQ^4pHY+Z?+)@xIh$=ju)P2$)u{NMr>z*6cnp8L0|!$2=3}xn%qA7yW47( zz`UH-j9dofar=C))}rpdT`E>J*!uyJmP23Xdr65~LZo2A-Bk``eZF74SUnIspI{Bx zD(&9gGE2qXX+!wR&m3=3_8RQNulc%y zc$m%msQQNJqwk}9t^jU&TE4+U2Ef+>L|jF=zKM4!)@lYY-i;-D)wjWPtB(m@t^Dno%&0g9 z%C~jsBN|#cXXK9j$PFf*z?nyXKE;#Qm#iWM8isq)$o0F5P?oVR{`F>UG=@jt`xA*W z1Q!_f!8V&3^Wi3QYE8``A8u{|j%&LnNg`WTehjc_<3pijFJMNO`AEArac6A(*6eiB z-h(q6K`^LVK>Y$N<=s?t!j)DYcryzfo2LH@q+5cD`1A_bNULTsBJPi z{)(e^TgYnSa=Xy}0D?*i!5r7UBW)}kb!BpP&+F>N$NLK9bIvMpB~U~XilMp_G9in~ zYwHsYgI?iJGA8h0Mss14L8}3&IJ6(&Wa4!d7eUR`r8ZnN^7pR`3{rMvH&VM0QC-@( zM0%f%%_(Gix_bcbUKEYe!+~h)>BgpKm6{Sf(L7-FP}~VXw2V+JDNi7e<3OpiA;PhG z_)EvIr1Kd4Jy;p>JQRy0e5}BT)r;3PkuH$ck?`oRrSFSLdy+ETmSSKfbnp80>(%4b zr^9rk)e(_Keq2OP3_#>I+Pc5K*y;UE-g_z%-o^-r{2iX(H`m7dpn_!d{{?MY;N34Z zvJeF6wzLCgZGS{-oBGxSkZrot5^fD)NKUr~#yIzO6xm>N;I9~tcm0XZ9^D@b-U zK55!8KIIJo@QRYotK+kwiv9iB=F0Dhkh{d`{v6N=16|i`xeHD6d^{L>C5(71qRBPg z7Fj)6A4}Q*0X~2Zwu*{1L|Lta!dM#aQVdu17@9BE(&i{F@|N|QvFB7z%`67)W%l%-gvM&zCD|@kjXZr%58@N8 z8cKv~zdoZatR5Hf@g&c|yX-3d%mcJEAR|Ugyq~Lp!xXV%cky2h6DJAD(G(KS z;ZOzbT1GN}eyINmydA;w~ zk1iQiLVfLjr&MXluU$U>JX}5=&j9{J0kkriJ8MnWwzj9ybw{Co7nn#ZO4Sq5ar7(d zM{-c1fIZ(wwLcb{P8jL)u$lSb8p-VLN(2BpdlY?I80s5%YnT$pf0kfgD(&WJ6y}Rv zI^IV7_h+6%?dEzB2iIr?%$f`dE2?-SI@6R{PN7y$xoZvlZUqU$5pw8xC)9iW_?$R3 z=p}k|VTi71$}>)9L5dcz8h9aTO>Xgjut{bg_(wYVV*v!wLxG!aV2LCi{jpf1mN5`D zvtXoD!GbOR7^88x>G&SvT}6i~MB_>oB<}2et_{N-{ldz-$7*_Sw!q}cKtVwS-jMGW z(t4K@@ix*tG8ly-YY&WgRBN3u1rwY0Azp20A2kNhJ2QwEx6l^Lsmvo6&A zeTxAQboW3vPohZVywUIb8fWItGD$mtP*t7Nd0c8u+JT_4>JEd`$1*_`G|7UJ3rh?U zkgi4Wvy$mPA*}NB|ERRB4>^^+I2GZhv^S zK+#Qu+;7~);h4|57K%1mz;#`@$bPyJj?X01-~Gc@nG>VOW1|oLLGC|c#!~+duimUg z!}0I;@sw|-^}L1yGZF+`SrwpxKZHRlGo*H0QQ}T8P<0;9D7~+17_?u zDLBeB!}i6^lMwYvIU8&vPMk$Mgl-Tv^<~iTWVeXAr_|1`R@_sAHo(^V`!5CG8Cz0l zZpS2SPs#4tuH0R&nF?CP4cN#MJ%q&b=lX#iCR;@~gL;kjLwYni&eGdx78k;)ECKV_ zLoa&Ja#U~IMhSQj`5fXHA~l%ZfWpftj=n_C`2m!~3)LvC5hnix>e|^RR99`Nn6eRhnu}4mALb8jZIgRl(*t=?Z|*R2>yAG@KI9dg%pp4IYXcAf6OwOGaK7z zlwNlrYgx|sTlN^JC9kM%jQVjKAcWkZy4=8q{s@Sh#^}>e$5(^**qZI`ydhFq(RqBH z7=@rmSHS8KcxNRw@r;K=2U5}4Z73xO-D>fiQGts{s3Yt(+K=?u$D#`X?P<6Y@4GZd z81f4F18>s%N?miNlEk}hnvX7-=!zO3%XA#BA+@W_3ZGM)lRV6BYn+Yhs`VbK<>Ap! z1=jEhAbyZAC*VcYSuP`FSk!%}Py$A}qlOI!hdV~R$RbhSNmG3nLtQfC+<}_D^FSxF za9j&DA)%-;^P~R zpOLU}xQ&-7vPKisp=zUi0a!B2w(3N-$F-h$LXqMa$c#ob8iGl5LF#y5G}4b$Z)3I* zaGVP6?h5e%8?Gow6JBNs+XX&1@#D_fbj~aN)9t4$1+gSKeIALRX31LXw=MNK1ze?n z2ke_Lxd)l7=!n9|;5SQz&%`Q5A`(7Y(*}*~6{pJeM3c=@ble>vysC%8p6UyjB|VST zw2Xl+9fg}y`-^35?d@vAh}wUFXsN(X5=D!Bh=1HL35|9hKEY`e^C89c9PB;8H+u%s zRIkWb_0@hn>SMEju0|CGT+G7ExJfvBn-mP|{@-cb{};|FkK|@&1=nOIk0=c1yc0jD zKX=k1;XgEXpL4CBt9|uv!N$KfSlMLWjoWkG?R;p--dp$P+1c4#uit3(E>wQq*F}5B z*IOqT-uar>xpI#ES?%XBPU#t5-h(}sYVV_)KYErnUujnssdHVx-U&7P0rpM2R1dz( zqeuekHMhNpB;H^;@0*fe!@c3R!P;>K11W!)twwO;BT3*=^PC6W6JIByD?$jAcvbXw z&_*GBPXUg1S-eSiNQDrg0MNnIeUa1Y{IgpaW`;Mt7r-CSCBB<K|KjK#enMxz*i6CI#z6ZSZNd~vJ+=yGpFcF6!ek}z3qg@uwTL+;m#cpXJnTsk% zTs|Rz#ffdI`_d)C$M~p5gKZ?0vjX~#7H9@K6wf`8Pg5p_OIt5i3)}0XdVTw?Lel0_ zO+d%P=$I>=76)e?(=BU5tJLzCc$r+}apE7?wSALu$P&ko;;c4tAH$mrCQnY?`}{KX zi|OE0kV?->x0aX_+Im-KPQ^udGK1F-tTF-L(8C%7C0g7vK6AvyWK+WT=i~{gvbV*<}N<~C2bdYS_L`;whmP#22-cOCJ|v_N($XPF5Y~Qqo(eYR08mL z(T0&;1FZ_caYU^;XFi-km+RI+lx&Jd8y$zGGfO&UF}#1_X|C-%a3IK+UsZvW@s)<+ zbk{R&B)B2Lh68mYfo5^_Uo_D$h&pCBp3$6i5@(4sx~Gk&A)GFWMY_$K1ds<9x2<)t zlMH*QJCq?7z#XKHt~6}XqG?F>ehjxSM3UyfgqNxuKQIq5tz`zf)?Kg4yjFrL)Yglc z{U;nX^SK}2Y&t+3gp;WEx~FAcq-QgswzaOx_v&;&T^+rc3FOn6^^mc0NLC3fd=r<_ zE=T)=@FY0EfgE#*%5lj#xRdza&#&)ELwx4eek)B|Z|*kMl|Qd)^q+6jCOjUDsQq{M zAD`1K>ELb2l9c_2sOrtR^fn0R9`jq{qv(Y2rbHv{vbiU559@epp5UNp-FK^`8k?It zvXuylqo6ZMrXK)oWLod*NIm%e5g8NC52STZJBO$9IiR0tWPvuRH0)F1<3-E+g9A9F zBLHg_wM28APREn_<>7@rW&q0$FL#|_%FTtsVr5AtbVV_#bUC2=%@^Li{#b+n#GC`!)P<f+%;*5rO&W{-QDn zL)1vpE^GOB?1UL1k?Q1+KB_G@%!h2i5!~nwn6wRw+17D)kJ6^b{({V{0-x_YHfg8n zeIG;X5G;ruf=9bagM><~<`+otDyO=M(ii+$Py}1zXn>STY(1TF{QboZaG#(vu6GBx z*di){`U#DEc!XBX^9_#gikuhIlT?W{gR2dqu_C47+e=REkAog}yN|h;pm1s(_kfpz z4{;ei$WxUvuM19Ul`W#nwBx3bCLh!MO2Vl2l-wQeJayz8{{H@8c%)Hz7`SU?k)ke6 z>|bHb)yLnT=vLGyS(wvdWF&39ovW}+j0r*dII+8@%Ud$oe{aCKOV!S!{2`GQdl3MB z4Y14wzT5ZAO4ZO^EBqEDcd$?_^>iBCl@4&UjmDr6$5hNf*Tm3to?!8jtf;MiS z*&VR*6%K+u0A={|EA<Yh42-M@P?ECZ^&W zO?Ufdb8~aL9u?~E>!Eow#bq}s+o0Vv!~`U=i&cDYvD?D-jo8d-eIEL!BQkFM6f9qA*=O3>!2P9u?H?Ui4v8$^3%IxR z_h+4t`NQzp>R2oC=>1gH(fr;h)v$Z@b`KI%cAKyu_Q@EI2nfk^N@lm>wF%U({%tc* zo?OFxZx~5Xo32vE`Z(5e=V{~yQWdre*sZjwPJl)it~6>)ZtsrrHbUdPOeOX?>pxRp zP9h7So}F#$xX&wq9x6vaQ(v=&)L*P;%e-D|-EBJRFobxZBO)iBET|HO8{*7tGP?LM zQsNb1W?O&x9aJTSIIE;nW{uuwd}w4I>+Gb))z-64)AMXIj1%h=VZ%}y(i{t>1U@g4 zbzg}|l^2~w=(U|&yUbF-CA|~^R-oN2B z4v=Nw@fNQWb~XY| zP5zl6s?!w@eauHM%EVnO{`(78ukOv*m}o5`you@P13caCt{pFYFptXt@H;e8V-+o# zVE1d=l!EnQ5z}zWR8(7U{d?KiUUD0X2@n`KlaA81=`uqgCm#X+qItaN=`RQBcxvIpd z^cAmDH8^y3@?>fIw+|AGB=D$Qy4W!H801GfSWF~nS8wh}cJ~!Yc1=-mAdvc!aY)@p z1nsLy@tO|Z#%Vx?u*j-CfEFAGG9*-dbt!mc=MgCzmOHqIP_W#Qf4W8pT2ZsRQl{k( zvM0^WH)`B)_LL4kH~<9}p}o1u-5`y)A%ZoS(|TIU6NjeZoB6GFk^kaBSO{=~|bfj+`w43X2 za$+f7Cn0k9!&y2vsZ-WA8AZr+2xWku7SKkFqZT}=V=&YrdiQ``GPQUKa^h_!-r9Pf z&yrvY5|ZB106~ONz-@q#d^9PH-L)>0>>p7oE17ThO5iwKoD$O|Xi7q|*2N1DXw<_% z@tbYT{dP16P}rRGF{vFnKSCo{-}Z{*MI3cC1K^}X46xvtH2rC$a!>$9M(#RIaWAtT zOWZ_9x=q}9%m}cQ-y)T9-xEDA1AM|3HFg9HVKWg$FMGHsY8;?p(s5P>I~wlxU>U=h zC7}vV&K(|50OAACpUndOXAlNVp>ht{HXA_y5~T+nWOG%*fZ!CxRgRDG(87pL^x79`vjouFdH&mrFtf0^&RZjf#23k+`Q*`hEhp(sMaF~?JagjXGrA)*M9M~er zPL1_>zRRxAbL=8V8*EvpHf7fS$8^=_l`tNhQ#}RAf${Eg2{GK~?kf=0oY@V1T7;(| zAT&o=My1O;&zjoWBH+521VV5W`B(9m=R(cLQl<8reXnbCW}2AkDH+1~(}$2IHEXTQ0N zlNLpQw6p0Y1QuuxZ8C1ITkY6Cb1YN74$8269CHu`;@yweo5_G_G;*IJN844M0Oa(e zBiCC9#Q;?p`8cIZR7adu#X2@}+{UW{^64lFWF8J^9FWwkb$$0Ha+a{yXpV96xcLKc zIG{j-S9ls7SA^>0Lgd)VY-RF*UMz5I+*Av6QtBK(qr{g+R;sMpnMKpyMR1qjvqh8O z30{kI3g^%5GJ1gfiA*(;xKJq*V@4OQ!s{BOz%l1GQ41Y?C_-*@m=uAa;X4OuoL(fr zaxZ>-bzi@s9$I5*8C$kV|2%$P-V~(J=uaoBTLskR+dwNpQ+NblFlThJ22AV!{`}uM z{6A#`$;sV_Ti-|sd2z)a?N))hd*G`=BN?YV+V{5K3KaooUmbFU;uCX?qL;c7^3(tR r{NFnKf5ZrGoc8ayFlwdKN4N)Hw%P0q9Xo_D$*f + + + + + + + + + image/svg+xml + + + + + + + V P P + -- 2.16.6