From a6bb660129f74ba931178fcc9b6371d2d3432bf4 Mon Sep 17 00:00:00 2001 From: Pariterre Date: Fri, 27 Aug 2021 10:29:36 -0400 Subject: [PATCH 1/2] Added STL reader --- include/ModelReader.h | 8 + include/Utils/IfStream.h | 37 +- src/ModelReader.cpp | 95 + src/Utils/IfStream.cpp | 49 +- test/models/meshFiles/stl/pendulum.STL | Bin 0 -> 104884 bytes test/models/meshFiles/stl/pendulum_ascii.STL | 14674 +++++++++++++++++ test/models/pendulum.bioMod | 57 + test/test_biorbd.cpp | 8 + 8 files changed, 14925 insertions(+), 3 deletions(-) create mode 100644 test/models/meshFiles/stl/pendulum.STL create mode 100644 test/models/meshFiles/stl/pendulum_ascii.STL create mode 100644 test/models/pendulum.bioMod diff --git a/include/ModelReader.h b/include/ModelReader.h index 068e4d07..e3dcd8e6 100644 --- a/include/ModelReader.h +++ b/include/ModelReader.h @@ -185,6 +185,14 @@ class BIORBD_API Reader const utils::Path& path); #endif + /// + /// \brief Read a STL file containing the meshing of a segment + /// \param path The path of the file + /// \return Returns the mesh + /// + static rigidbody::Mesh readMeshFileStl( + const utils::Path& path); + protected: /// /// \brief Read a Vector 3d diff --git a/include/Utils/IfStream.h b/include/Utils/IfStream.h index 895cbc6f..76570e1c 100644 --- a/include/Utils/IfStream.h +++ b/include/Utils/IfStream.h @@ -12,6 +12,8 @@ namespace BIORBD_NAMESPACE namespace utils { class Equation; +class Vector3d; + /// /// \brief Wrapper for the an std::ifstream with increased capacities /// @@ -129,6 +131,31 @@ class BIORBD_API IfStream const std::map &variables); #endif + /// + /// \brief Read a certain amounts of bits in binary + /// \param output Where the result is store + /// \param n_elements Number of bits to read + /// \return True on success + /// + bool readFromBinary( + char* output, + int n_elements); + + /// + /// \brief Read a float in binary file + /// \param result The float to put the result into + /// \return True on success + /// + bool readFromBinary( + float& result); + + /// + /// \brief Read a float in binary file + /// \return True on success + /// + bool readFromBinary( + Vector3d& result); + /// /// \brief Advance in the file to a specific tag /// \param tag The tag to reach @@ -142,10 +169,12 @@ class BIORBD_API IfStream /// /// \brief Advance in the file to a specific tag /// \param tag The tag to reach + /// \param maxTag The number of element to read before giving up /// \return True on success /// bool reachSpecificTag( - const String& tag); + const String& tag, + unsigned int maxTag = -1); /// /// \brief Counts the number of consecutive lines starting with the same tag and then brings it back to the initial position @@ -162,6 +191,11 @@ class BIORBD_API IfStream void getline( String& text); + /// + /// \brief Reset the file cursor to the 0 position + /// + void resetCursor(); + /// /// \brief Close the file /// @@ -175,6 +209,7 @@ class BIORBD_API IfStream protected: std::shared_ptr m_isOpen;///< If file is open + char m_floatBuffer[sizeof(float)]; ///< Buffer for reading float in binaries private: std::shared_ptr m_ifs;///< the ifstream diff --git a/src/ModelReader.cpp b/src/ModelReader.cpp index 1b5e3875..3445c79f 100644 --- a/src/ModelReader.cpp +++ b/src/ModelReader.cpp @@ -256,6 +256,9 @@ void Reader::readModelFile( mesh = readMeshFileVtp(path.folder() + filePath.relativePath()); } #endif + else if (!filePath.extension().tolower().compare("stl")) { + mesh = readMeshFileStl(path.folder() + filePath.relativePath()); + } else { utils::Error::raise(filePath.extension() + " is an unrecognized mesh file"); @@ -1984,6 +1987,98 @@ void Reader::readRtMatrix( } #endif // MODULE_VTP_FILES_READER +rigidbody::Mesh Reader::readMeshFileStl( + const utils::Path &path) +{ + // Read a bone file + + // Open file + // std::cout << "Loading marker file: " << path << std::endl; +#ifdef _WIN32 + utils::IfStream file( + utils::Path::toWindowsFormat( + path.absolutePath()).c_str(), std::ios::in | std::ios::binary); +#else + utils::IfStream file( + path.absolutePath().c_str(), std::ios::in | std::ios::binary); +#endif + + // The next step test if the file is ASCII or binary + bool isBinary = false; + try { + file.reachSpecificTag("facet", 20); + } catch (std::runtime_error) { + isBinary = true; + file.resetCursor(); + } + + rigidbody::Mesh mesh; + if (isBinary){ + // Know the number of points + char headerChar[80] = ""; + char nbTrianglesChar[4]; + char dummy[2]; + file.readFromBinary(headerChar, 80); // Skip header + file.readFromBinary(nbTrianglesChar, 4); + unsigned int nbTriangles = *((unsigned int*) nbTrianglesChar); + + mesh.setPath(path); + utils::Vector3d normal; + utils::Vector3d vertex; + for (unsigned int i = 0; i> Reader::readViconMarkerFile(const utils::Path &path, diff --git a/src/Utils/IfStream.cpp b/src/Utils/IfStream.cpp index ac763a0d..f976dd44 100644 --- a/src/Utils/IfStream.cpp +++ b/src/Utils/IfStream.cpp @@ -5,6 +5,7 @@ #include #include "Utils/Error.h" #include "Utils/Equation.h" +#include "Utils/Vector3d.h" using namespace BIORBD_NAMESPACE; @@ -59,13 +60,19 @@ bool utils::IfStream::readSpecificTag( read(text); return true; } -bool utils::IfStream::reachSpecificTag(const utils::String& tag) +bool utils::IfStream::reachSpecificTag( + const utils::String& tag, + unsigned int maxTag) { utils::String text; - while (read(text)) + unsigned int i = 0; + while (read(text) && i < maxTag){ if (!text.tolower().compare(tag)) { return true; } + ++i; + } + utils::String outMessage(tag + " parameter could not be found in Data file.."); @@ -156,6 +163,38 @@ bool utils::IfStream::read( } return out; } + +bool utils::IfStream::readFromBinary( + char *output, + int n_elements) +{ + m_ifs->read(output, n_elements); + return true; +} + +bool utils::IfStream::readFromBinary( + float& output) +{ + m_ifs->read(m_floatBuffer, 4); + output = *((float*) m_floatBuffer); + return true; +} + +bool utils::IfStream::readFromBinary( + utils::Vector3d& v) +{ + m_ifs->read(m_floatBuffer, 4); + v[0] = *((float*) m_floatBuffer); + + m_ifs->read(m_floatBuffer, 4); + v[1] = *((float*) m_floatBuffer); + + m_ifs->read(m_floatBuffer, 4); + v[2] = *((float*) m_floatBuffer); + return true; +} + + #ifdef BIORBD_USE_CASADI_MATH bool utils::IfStream::read( RBDLCasadiMath::MX_Xd_SubMatrix result, @@ -203,6 +242,12 @@ void utils::IfStream::getline(utils::String& text) std::getline(*m_ifs, text); } +void utils::IfStream::resetCursor() +{ + m_ifs->clear(); + m_ifs->seekg(0); +} + // Close the file bool utils::IfStream::close() diff --git a/test/models/meshFiles/stl/pendulum.STL b/test/models/meshFiles/stl/pendulum.STL new file mode 100644 index 0000000000000000000000000000000000000000..fb6f4bc660f41880af0ab70288c338bfcb8b5591 GIT binary patch literal 104884 zcmbrH3D{NR{{FX$RLDFJDMKP6iF()CDG^7ZLn?*H(9u9dlir=8q#Q%Y9C9cbG9T^z zZgXai;b%zZ@o|uK#b*X!m)&<>m;HgHWZ4a5RK# z-=Pgeu_43eNf#qTK?p=cMm13bA#b7FKq%d2pxx)`gvo%2_R6(yGHT4Sf>1`KSFT3| zOEhHI9>#hle?jZOr6*+QbC)e=uHgQ?ib(C1TJqioBCqA7|LOme*P!)z{Wu!_Dfs^u zAY7%2aJ{Mk+NRt;S6z8!aKq4c#gDEYQNxC6d0ZR1s~730r?u9JE$#!Z^Cj z`?+|_yPnu`y%oidW5)l93`@N5`ftT^z8jyAL4VaNTy}gKZ**(7Be%r#j~kWdpEw~Q z!xFfZ!P<;x*zM}*9`6(<-cfKPpWXYz;+iY`vD1GOh*euGMd^-<-zhG;rS?xOD@#1F z?c2py_AwcXa2a-4;Zh#Gl`p!isK{lBtu}bOc+G)n8SGKGM6(p)87vdI_8$C2vBUn8 zD~uBARxk-&%jOQrjobTt!rRWi!@nw0h}@7GooM>V15>q9>LZ ze8g&{gC~z&l_9jU?Ly$9hfPPM9otor%Mt@-tSmm#^!Er{j{g4V;#;!~QJ`0L9h|UY zm(l~>GS)|I9F}PJ*Vd(}xMelr+L^()UjDlem*~blrv(caCVi_>k;@X& zuk4fb9o47rjls85{V{6Xx7P&iXLx;b&u0UjoyB`aMH!Z8`sn4smFFZKuaurYeX84| zG;*|-NOA@hW!OAgs`RQL#b{~Q5`U~$xM(Tz{SnDvom=A4Ar}YNk4zdl6}4L)KQjpW z_@%3HL^3pt$~efd#Qb;83qIL6DTB6@fs1kUdDVPJRmL%A+Fe2U1ixLiTzFsb!@s=N za!cNJsi<8`Tr~8dpv_T9+ttv?j|WdI@MkYi&wC^|bu<6%td^2TPDL4(c%)nk{xiXh zqq3|lflKtfWe*1LyqrW(k?WR~cL#H}S+%wQey=R?(74-!!eL44!}bc7^3L4m*5IuA z>k@T8dJe}@lxx|RqVzC|k;1u40Hob^_~6}?@XBJ_EMkZ=SQ(UwqeBl~$FiNHkBCQ4vBF zxh$daMF>T>UhT5!>e-7qG#96grM78!h(Xc;DFP)Q<^moBp$BJ6An z*Cmx+Nw|?ysV3_Gf6APUC2)ym1}UCFMJ`K7Z*%Si30p}uA(!Yjw@)v$|=Wm1O zly?8YyE-hry!2yRKbQ5-^Mn{56NP=0aHtkNt3R z!WyivmQ;a;(3)i?HF~_V1TN89Pe+~V=U$@(6}dE~FK7LkURgpT-?J_$!}bc7^0eF@ z`Ynl|BA3?3#T6U)jH+7>pvq1f{qf|1TJN08S3~L zA>2BrzjA2}a!jPRae_)Uac?jr`h70ctwBrR5g?8 zji>*aURmOXHci57>a(-Qfy*xGIAQz#@Q!PT%a{D#I2fVYwZtL4*9uqvG^tmXz$Nf>xLiIBprP$flIVLPu|a|$YqJE4_!B$R(%w8 zOV<*(M6)&%#$oQ6Z#HzDu+w+`+?VwfC#a}hOZ@Aeb;23-_jj@hT%uW<$wd9PvO7=M zbXv1;#W3HiyB}*FzHw^Ra{zAJwJ!A#y7$mE!$ye&74^gt+S5eGdu0h+qE}978ooC% zsaG$|TRlAPpT6%i>%Tv?yTWVHI^&FFxN%&&vT^v!c7C6DfztT>4z&NY0=lmnC)@)i`W?jLA@h z%diA4*TaS-B42bL?0no|A#*a?@|kDg%&9^Yq}0~p7xLkX|N6VrOX_u>#(s8KEloVd z%nnwF4LkJ>&tK`kGd{{69)8fl&r>TSdB%&1^44DGsBqGjetzbddyfiV{VZt~$F}?Z zKK;Va$N!lOON@Hq$ncEkl4jLxuW+e{cXu5S<~o|$^UBDn$o1*q0pUHNe_Di=v`nMx zgGx2=+Mt2q_47@JP`5rTfy*v8`Jx#g?R{AI=@>r?yyi*!hR09$&$GnVpiq}VMeSN* zQsTV7~pofC=btt5Fi%5I64kp5#t^>(bzL`QD7aN5iAj)Fbx|)IB%y>3?Y(-Za=B&vA+F@!9s_{*NXdsj0|i3F)s6PCAN~UpX{v z`i$RR8!hV{w!YXeD~^@wOLSRLQHCX!b?O~HGS+-Y33cPJ1TN7JAAE3l<#9;_6}i6u z_MmX|A%CVAC9m8(zlg42QT%uXh@eG!` zT%Vk_dpP0>zdmRwPEe^PhF#Pl-1e-bky`?n8&kvaIG(}rRjy<2+BrP2e!r8Zr8q&Q zn)q;FyKwf&zt<~Vq95+Te;xF9LR61YSUd2`3`l~NKxMXpVX zJA}ut^dqOG_{gbL6C<`hu?*KM zD(aOb#+|ZzG@~+(SJ&JteEnzN?yEcQ9nSCQzjq&c?!a)X_o{m3GN>rS68G%gB|LLl z(zmlEaEboQ|Mm~Nw@f0a$YqJ#nfrx3`c)BbSq%)s@WQgc+8WTYTUg%S>-p`1@IQU3 z&Hx-iMH!Y@_EgvKpbt!jmX#x@R1@?tvIgCbmwPeouX5uc=*+ zZs)b=y0$o?ig4qY zvf++3&)@F1@Js)5WX*a#yiOkn6}4-LoA;ht^Uq(a_79hF=O#yX`sj3jJ@9#(EBD!R zg1;W5rR0(GOo=6~TQH-`gj=ePS8kotmU@Ltn)MXVV427@{JR!izxvT%@2I8ZD@ZEU zL`{d|yF5R`Tt_La(kr$;T%t#h>#@(mt*QvOtn9XQ$6L>L-J{_5TE-V22Nktzi7DrQ z+4a2rs`m3ruUNXcM6)eaG73_v+;+p=H9SwNJpS5guS1@znKY$p|8N8q(U#zO*m#B| zaEX>qULRC&(JP+Jtz<~JUbUXFPS9r!e`MGrY!vkB<~1$F2`b94MEj1P*Bp6D(#S1= zOElxFWE7-SS-J0e!I+hPzq@jaErLbU{5n@l$;T2ZqAl_GPi=yIJDRhMN(L1XJ08Dt zuxN!pUeS{J5&yke$4&=({BroVZ)?(#=&z z2A4rw>J={O?xS`J)>yyl*zSn#b6>6*{joojxqr!jYC3M^w=tGNa<4ctSYm9`Cc$fG znQv#Im0m&MQm@#i;~Df)4fiW@!mrB32uFUCk-4Cw&jvzk+z~@k@et8tw?_x%cFGA1Z3s5?&Q`*o|#A-hg()u)UG9-ZrP!j{LF+U zaEU&kUrxw*oGyn4&ih7zx1nVh24k~h4Vz=LJD#o7oiLG;7Wc>d6u*ARD zzPXtE6p~#ZxRk-R5FZE2M6UZ=99-mS5td<`pi)hIvgJ|5c_FCfB`d&o1&z5iP|DD%C{)Bd#naKT~80T%y_D;u$(RYip28 z%MCqmonIE~$&om*!8&g**7Fx4w!Z(}#d=Ocn&W(&pi)h26MnW>&&*^KxJ0vNBZNEp zP?5_L+kX1P;^Zf5EP+cjN4`o%K}r>tiS($0zFe$lW29Mz6+*%hRH}*lp88;Moc)ugKFP%8n3`Uh(9z zB|e)su^4+IrP3=1T=XjWsTZa5G>s*`zJ6pe@?=eNBx9E|YiZU$mW7|QF z&L(h)jy+|HLOQo8~&QMz- za7nAB*j$DiIhATcbmR)Mpb^=&AXsi1Q*s7#lOpWQt&U^KBd3x?#4-wUSwfl_1eSDs zeNch6L~@2D7_Dfwo=Ar46&1NG5nH+rm8*I`r&ka5b=I^>_vqXiFq#Sc1`t zW?P74xL#3_%M!7r>rlD4CnU|hm^Ax*B*U!_DoI4_y4Ll|64G*sW)F^MP@yN5NY1c? zGz7=vcm@@EVu|DoOGrcT8)A_RH*zYOGVle>2n$N&dOhUOLHBqJvefGt}wT( zs3^k{(y?(Q5{yGFr4zVlS9$5be??o?CCx9iMV6K8RhK=x6z{6_^KkYzI(0-%9yt}Y zTTMj9QD9kFLYgsY-6UsFQARb9oM8#O&b3u0XHZc_HIbZQ3A?pxUrElOqKs-HlA%TA z)`unRKB(W(NG7N#!xGZT`*}6NQ9_@m6S!!XyyW8*ZCRJJK2Il9sV4Yc6D^_WbuDd) zz(q#n%+jH%*uT57f5D}rcJk7tBD$K0t@DChmXMZ9pX;cdoIwTJ63H2skcQB=gnrL9 zvaDRMsL&G#t<6}5+Y&8-OSG1HEW;60R1^k?DL8CIl?wycMP9>%iMP^h*i5(q%D#DoTVjjiH#s?B`>zl-N=<;3D&tjj}dMw zsh_>B{8EH8b3n>Vo?)S)o>)RU`3P4{aJ19s=>#s?B`^6%O#(dTZ77|c9D@zu%4BH)^Byhe(S}pb7fS!l%e11(C_d>wsuF@zx3sA zgGF$hj}UGgROG5A>U)`xVF_uuM01>vXHcOhmPpR9gfs+4?RW+idSZ#>3`s!YD)ht> z$r+ZAhDbjHprQ;**xxl+)ib&3+pPQ^m2|_AsKn=T>mUDpTTfIf&>Xu&aNNx%>=Bi3 zg9_o6uG(t&#Uz);G2>&Fn#-abQg;(py*6zNilL)qB)goJagy47Q zw4}x4w_6FVbMp(B_P7$+b{$cGFu$^BzYR*9)zte|W#~Jq(w4M(!m(ZdU;BTBC`jp3 z^Lu@+UHwL%KG(Nhgb?5eDsu6hgf!c7FA_G*5GHe=gWd#nRX@T<3x47WZkflHrpjHwWX zdgXd$u8Q22p_u{^Yzq}a!evmAi@619ZDW<+VvTI=mcS)K+p&K8wUSY&SFTr70{b?!2#$YlwBM>?Ki30$J}zvOM#9uwta zi{Tf7;~7+F7lPjx&L(h)j{Nd)WSwh!ZTK}^ccgCkZQMV&thBE{Xnd95#*JjyWra(< zVm)ab`loUQS-JaC?{ZpqN$QUf747X1RCq(4o!^&^UvnlAa`8ELWmfgdR_GPyqRNPz z@8-oN5uE#qu;yJRiS?AYAtF% zuk-|(B`vzLbRo1yIf5lhPoN`9Hn?Lv5*|3~k|wL_^oy6}=m65&_*{Za9|McF`=WM8b`O zN)l07x{+~+VC44Q6MRmu^j|*?D$1|~8p0nFtqaYzn@G5EP)Q=$Q9XbN&^YiC*6E#GcetM1*2paM;vKBrfXC@4oR+bg>i5_{zcD$w*$pR>-R zy;6lOv3fg>5S3oh7Gtt>gwQZ5y`m>}DbQQ_q9dn5hNUCRN@yjcdWniwOOgBM1xwiP zC`&`+at~}VKj_%1)@>Q~w{flJ_iWX2I)O{QLVM!z)lLXEo9eedD%vWo=5AItflC=^ zPvjqYG@Sp)a5oMr%CMUIZP^4aWuQIr<*lpd_wP5*Wl&Lu)jZXaP2f@n+7p{zv_t-= zle)VMD$1~$=T5Q-T*^Ru;=C3;^2HaocNtWaVKu)moK4_T2HF#+cNmzT`^oAqgNib& z=GS|(30%rRdt&(T;rY73kJs6XGH^-ro5I-yF13XA#9_g>eBURBxeO|{T{otNUsKK| z_yuLRtRlp`#u$#-w3ywUo_7q za47@ri3jJNUEXEG7H(NlQQxiR7u2%}T*^Ru;()1Vly{tah0CC#46FGq_iO@}GSHs5 zqwfjje_i~c%b=nRtL<-+=W=NTE@hy7#^{F*E!TD4(Cr^olwmc$fu2p^QU=-+K`vkJ zbw)dvK}8u>^ULhn1TJNuJ+bn*UCN!i2QGt(GOXr(>)8Y@WuQIr+W57~VdH)-gNib& z<|(Ue0+%w-p7`jzm+JO^VVKLHq719KE1ON=QU=-+Utc__?%W^Gav4;VVRiHlZyJG1 z8EBs|_T{@u2ek0t=TwwoHQ(*o1TJNuJu#)pm8F+^)#g>PZ>6xBcW7i2xYQEb6H8kk zQ1{xF6I=!rjl*i**^y1)QU=-+t6zR^UALK|Tm}_oSk2o*vI$(uKzrh=O;*-5Isa&v zK}8u>^G=g&0+%w-p6K*btMVZ&4{#Y&lwmb*UCAbJDFf|^{~nz$f6=U+%b=nRtL@u7 za=A1Dmom^k8E8*jJ@u6GSGPSC+KMu8N!zzzb%=c3Z=k8y%Z zHNjbCHi1ht=Zq1epbE!6X^v6SoDD<>H(x@fn&4U_Lbwb|;1ZpP|Xwhj3XIKK4Xx3Aluzly4D1u{Gg(yhbiZn+bXkVv zCUA-7C=nqFs@T5Uy!4S%v3-~3YBG}H#$gFuBG_*#L_tawW>ut_{g7t%t3pUPf=V^P zyhep6K(I_iaDa#@12Hi1htSCbW@ zAf*c1s5J9s(rnWeLL#=cTY}zJh(Z#9OBwbmHTtbaMJ`LEkArz*5zO!Y@o`v!ncK=Z zBw{1Sr3{W3&RG91KNeN^#S66N^mR7C=Mlo)U80giaHpX{m90zK{vL$=4Tx0)>D*ng z1bUTQ%C?Kf_EP*H}}{60rEflC=^PrNhz<*?CFewLGp zGOXqoM6wB7%0PSKr03SkU;F$KZX8sUVKwir$|i6r1MP_sm+X>XzOkQmrlJh1we_sp zO40~i%0T;!kB=HyE?w{MVA(fqSk3!1vI$(uKzpKe?*8S6Z`jr?D=Hd?)x3cto4}^FE$z0+%w-o@js0{`pq_@W&D=%CMSaS2lr58E8+O{cCNx z_c`w@R;Bt4n|h0<@^~L;Hi1hmp*``ywAym>wa2>b1{K?`H17b;CU7YO?TLTvmM?FX_jjtP*mk9P8*w&) zOBrZSjJdm2`Gx}yaO0q2+m+@W$=L)hWuQGV^1#)~NB?(_%b;T0mF6wZ*#s_Spgr-- zUW@A%_Z;amsMvO;dAD0OflC=^PmEi5eBE_d`0qg~wq0r7?Uqg8QU=-+4;+1A>5L)% zJBo^JSDNpuYyy`u(4MHjUUOH5s&KqQbIr-;5yD-6P)Q;xSC9qI`D;!Qs)*nn!Wsvk zlcE3mYfdWF1T@5|>p?0IdLOwm_&h?maZpJjc$;~yFmkukf`cyfcN*+FQmy7~t3D%* zz@Qk}pO7mt~pOHr3 zQU=;*oUqzz`7^d2?8ZUGwkys1M}0;bflC=^pK<&HTjg)P`9POJ#kMQW8%upg8i7k0 zXrHn7lU?&y<#u%$RBXG__U)&+TpEE(8EBs|W6vYLgh z_CGscY_XBcpkmvV=KZ`rBaOhN47AVK_{rM*wrzKDclD{*cBOU1s2mw`X#_51pnb1a z{8n4eAH3^Bs#L${zE5NS7cus2=DA!NflDo+ea1gesx2>^c7YoQ74_X}-kzRK;8F(K z6aCK~R~~ZK32uE*QHIsL(>jT?Q3pSj}7Kvk6?vKzpL*+~dl_ zr+?)#s3^l~`+nzKE{(vY47AS}G-yEi&7i5<TGYThTEP2f@n+7n}s?_R!fwtoVG ziZZO`E!WuuE@hxSal*~pm9KBQpBo1iWmw(XyrDanOCxY81MM?5+p0}U1E@hxSaq*lp>b|?&KLJ5S8CLTq^=tx{ zGSHql^!TewoAmJKB~+AQHRmYV1TJNuJz>uiIbO*n&3Pi9M+kR*MJ0(yK2M}w5i7Uo z6v?O%4MF}qF^zz(^eQi9+eLrAz@H~35^fw+k_gc*qwsLsS;6*0{ra%)^tO7ZF}sHA z9qQjwnaiaSxRi(X8N2*nuW+ZP6Wq2-MeE$^Ys{O*bGbAEmom^kLiQH-!1pJO1fUD$20hzK=eaOCxY81MM@``LUn@MxIGy<10&_3gcOa7LBe4Xdr_aGHzSba^WJ;T3ULPi>aOBraN(fFvb`Q45g z>oTY)!|FR1?io&K=HHi^%cT*xl!5jcXY`wt@7d^cckV+)8CEa(dCze9J!GU2xRinR z87tqa&98G)GnYX{8CL6vQ8_Z?(gLiFEX)GAzN>eKvth*<7o~3GQad#mtm6Ge{A_jl*sw()zv$*DsowZJ3AtJqU8J55$nt6>lK}9Z0@H9k(aJ{kw zF44@-LjgcU-<5mc%P&iX4v zA&I~xn&%-agoMkWB9|pN>#q=nBm$Rcp6jd-5-x*^T$bRhzd{s}2wb9hKD9zfxC|f_flQE zfBCX-eKW_pu_rPq!GB3f%X~quT`i!Y?=SN2`aW->C@ky7wq@}$E!2~mom^k zW5>VFFU{S?A9tzPcBMH6XA`)Tfo>ocjV*0D&EGc|_w6-7`x)oB=TNQg)Az>U+o=tI zotfJ)g}|i@w9h!BSKqq*FBqS<74;pL^qJe-8l1&nfacN&TxtpJGd@`Jp1Q^V=briuleTysMvO;Z&`VFFlQSw(gLgp?`>P& zy{~@`fQoHbdfu`JgLht@-0&ThM&MEg+Gor?IV@kc)y{5xP_gYwKT<9Q|CvBW8i7k0 zXrFP%5&g@P-}AquL&df${q(#?f>SpmBaOhN47ATUd)Dys9(9kod#O}xyV64^KOQ`> zz@H=Ka%luEWuSdVVc@v(p)a50GN{;grMqnTWbl_7GSUcK%0T;!H3!s|+iiAsCi z7oQDq+Z7e{-RkoAnL*Hpj5Gq5GSEKb;gcQ<2VU==hohnlt1lgLad7=eGSUcK%0T;! ztFJpLEDZL~w^LDu)lDD0Jh<{4GSUcK%0T;!69-=t+}F(?cd01DYL3B<$fXgul!5jc z4fks+XZl*_a@ln*U3sfjfjhkF2^CAA^QTX3IQmp)s4eTFr3z7>p?~}xUS+5vLf1Re zF~S24cX-nXXy3Tnm!e(WqgA{1nkqund!qzBfq^K+IJcah0c z?<+)Q94srl6r{CgDP>eu<;W2OaN-uBm`>4bIN`@z)Ut%biw(3ZwwiN39; z1XCvYV`60-?)uykxJ1{^njFjus|Yu8I}S^KJbG5JL7SwJQ(@_{<#Qy8FDpyn5`ELy zi-R#WNf}h+vIIw>c!ni#iN3wbWx?*fk}{~sWeJW%@eE7g539Z}Y9f8xwFEBF>HEhWTb~o`zN4R~Jo(`%!G(*@uJnrQ+RAq2wi0Eq zM_FR!igSbekMviNjwonEO1I00HM^MY?%C1p^N%MzS9$1^N}OY}GG zZwa1jl9WM3E=zFc9M7->F44F2To7FGX427zigPub-Ai-k9M7->E)i=Vc3W`xlB5hO zwq0q?oZ}gmz$K!~jkgEwFH6dxV%wGG%(;>w;r0)EH27dhA^2gKKQgcf#|bKG*AhL) z7lPfk_RpS2_gYKf63yNm&!8fgC5p`_2cKP4b^jxFWWXhwV@xEYpbEzf=~>rK3$|+Y zXO2FWSnZq{_4h#hyifGVV8?+=dCcNPdgaDJMJ`L6aQ&>{?m0;rmcS*N*~oYX6}c>N z{96|V>z$gEVF_HKnN^KvP?5_L^QO)Yem*=Y!xFeeGdmp5pdyzgbUco{|Dzz*wk3^A z+Rm3mw_PgL#FCcR1YaFu#-Rw8VF_HKnca~unn6V_OVl)<8|-&dQidgPiDs56o)DL^Ep`&!8fgB@PMZ2irC?X8=Oo z`mh8p(ae6vGpNXAiTjo>2u9_TGAw~hG_$zz3@UP2VxM-m2Y1X#%CH13(ac82GpNXA ziF>}dBY5eTqzp^o63wi7JcEi{mT14@T|t+jNk?i+;1bOpfp`WLxh!$p|LzKITbh(% z30$J>d`Wa4q#~Ck);(xZkRP7(t!4>aqM6-^kAsR_mUwQvMZwY?-Wj|+Bq_rZxI}ZlqH*L3?Y|!ow7tpCmvD5} zHM!LsA03fPBXB7L?K7^OyLb4%=O^TCMH#rHIX?P~Gy<1eLi>#C4!u2W{^6-EgNkie zn&YF-NF#751MM@m{^;BA-MK?t1{K?`G{;Aukw)NB2HIy__{J9b>o)z1%b;T0mFD>9 zGtvlL%0T;!zDIY=KX%JrE`y3~SDNFa&qyP1DFf{@+HHJbe%Fy(y9_F}U1^SwJ|m65 zr3|#s82`Z0`EF;daC691Y`fANAALp|flC=^pRwE7qw?>6e6P!(V%wGG_~NRxYQEb6GPvs$>00xE-r(LZC9G>_G|)|GSHs*@3C$3`@h!BWl*v0N;ChEP2f@n z+7oYuP4lIr2Dl6=wq0rFQL+hK%0PRf{qs+S=be3u%b;T0m1aIDo4}$mom_vnA-KGVDfH$&Vq_yX0 zD7s@i72B>fcL%ZwT*^Ru;#xC9?svZXKBr>a zm1Z_Fo4}Wnn#-jTxRinR8LbXKu{?O}yDo!@ZC9E*G}#0$WuQH= z_qvCc58q*D*`@r@ul{${sMvO;nd{9aa47@riP>MaE?<6T zPd5%Kwq0rFdb0^!%0PQ!?TL-b|Cb-+GN{;grJ3u^CU7YO?TKZ*7T4|CeWc5vV%wEw zt~Z;&r3|zuK0D*Yy3$DhTm}`}t~7JK*#s_SpgnQq^Rr7&_x1A(RBXG_%sFHexRinR z#G6+S4jR}0W`-(D^LN+qJhj!UjlHhsl-GH7Fpa>ame4+<>q#|XryKn91ys~`t8d zP*H}}Q#RbO=K0&nNF#751MM@GkK8i<*1UsU1{GyQ^!Z;CS$mWsw<^#c<- z1Xn)e=XZ0tGy<10&_3hXUq_V3&GqLDRFq-$j>qpDEL!2`^mDm10+%w-KI8n^gUSoO zT+OWyD$20>@t@iR`*tKFjliW0w9mNpke=lSwrJxrs3^ngE4SDpSTv1wo<`tO2HI!5 z{zBXG7GwPNAQfd;y>j36f-x)EcGC!4%0T;!C+4qN-hZtB&3-D%uzGCMCc$fGk&#B= zQU=;*e0TRVbwfAu*Mn4)VfFn>{!`O&D>BjuT*^TEjA0i|s=Kb?t-4f{VRiSpFV~Fz znB!F%flC=^pD}99yGx%n^~YT*%CMSaa5jNU8E8-Jwqj~&(HQ^zaoY`d*YG^G)q5TC zT+O5@JUf_1;8F(KXKa4xm6Gy<10&_3hUeg0Pd;D#66c{>%`uJnQvcMD#+ z+26;><@!pM_g7jx++7GSEI_|Ch(- z7k_!MTUJ!mcdKhU9N*>n8DyjpxRinR8T))UGQVs20hd8V8CDPfu0_|cek3D}z@-ed z&zL=GQ2y|p8@X+liZZNTu<3-ZEskK@O(SqA1MM^RtJyDq(}~-;3@Xa7deqDpyMB2; z8EFJAWuSdVzwg@Szdxdz%b=nRtNRXFx2F5AWTX+el!5jc$F69eAG)HS%b=nRtNWZ1 z);zrr$HX)Omom^kW9IqKgokYHfAfrrGOYge+0$xToJd9*flC=^pD}TRv0>dY{x@Z* zD8uTH9=W9E-C8oz2wciQ`;6~b%nMew^WU{plwmdByN<}E5xA6r_QYpr?UDatdgrn# zQyR|bm0|TAZ$002j{@h3X#_5{g!UO9Uc7I9<+L4L1{Gyk{m5QZyB^(+^W8K8mom^k z<3HOE%s;W*zXywoGOXTt=Z(6q{RtUq1TJNuea25W4$lYu9;>qzW#E#&Zo!N$6K>)9 zBaOhNme4+9(Wc|__jDZYGN{;gr9W?TCr3|!)=<_91To6qFMiyjDnP{NLzxfvO-8Wf=V?p=Hi|;#j<&BsgOkA63yNvUvzy? zk;@WWZPu^mf}@i%EP+cjM~Qd_6}c?&*PDmboYF2S!xFe$hME0{j)VCNxh(NsmkBjj zz2x_EM-Ca90+(oJ zrs5e?lQJxUOEj|y@eC?* zS)ym-CPA-4QidgPiDp(Lo6qM6-^XHb#L5=(dcvF7>rlQJxU zOEfc6@eC?*Sz^Tl|E~FFO@GZ9UFVj-C7Kzwcm@@@EOAkzcWb6>pOj$WP#iGQzV30$I?@r+~?Y(?4<3!i+v=HH2bcSl+(w5kN zn{GAFC;r_wvvneHNi$Oz9|x6cqRst#*4)=4X&jcoC7Kz}N=8A-R-`R4?(Ft8k2kzG zvNCeFK4?n>E@`g9;~7+{iC=cxxhDDh+!DA%b9JwbT%q-evw~}n_w!ert7~q-YR<16 zkxL_RDFf{@{=UJn;hoR=XC|m9!)ng2eMTCAOBraN@!_Jy;nep2UJ(^#Sk3vh&qyP1 zDFf{@x?Q?jev7C5y&@{gu$uF0pOHr3QU=;*oU&}Y{FFC(xVcv<%CMUAYoC!u;8F(K zXZ*H#_k7FG{kzYoD8p*buYE=uflC=^pRr)d!2JB9S9jx}q717!zxEkv1TJNuea7f# zN8}%vTXOdes3^l~&aZt&8i7k0XrGbmJU)Nhnf+Y`6=hh>`L)kTBXB7L?K5tiRGZ)R zx`MlpLq!=@bAIhJ(gj`E@pdOBrZSOx|&a{E~;ey9_GIu$uGhYyy`u(4JU! z`0Dw2=MQulRFq*g=hxW;E@hxSG4=IF!;MPAT?Q3pSk3u$Hi1hSXixm`@`&))-^RKO zD$1~$GxBT#mom_v=(ygE!T5%Gbt=lRn)B;y0+%w-p6I&ZAEg_1@N@T6lwmdJ*VzOv zWuQIr?@cDwt=!r#D=Nycn)B;y0+%w-o_MF*Q+3B(?VtCdq717!zs@FbDFf|^0mGV= z-~RPTx6Y|3!)ng2vk6?vKzrh+-FGUl*vdbDMMW7_bAFvo;8F(K6P;)DEH8PrwHpT& zWmwJmbvA)Z8E8*TJ8E!w(wv;jprQ<`IU~;|a47@riBn&!|J#q#A9TldD$1~$^XqH^ zmom_v_%Rq?Uh>0{E`y3Ptmce7o4}rJ@Y0IU~;|a47@ri6_6P zEw4Z2*&16>1}^EynSL&fz@?VZKI7ca&MuF>u~BF%wq0rN<7E@L)Dqeg2i1)!j~e%P zmqEq0E6rWGYyy`u(4Hu?JE^?lm!&R)ifvb#du-VRE@hxS@zVUimY@E$W!_e7yVBfa z%O-HCCA23Vo0Bg;`P5D>gNkientN>71TJNuJ@M?aw&j&4`R7Zh*mkA4E0;~+QU=-+ zD;lp}{_LTFZX8r>yVBfa%O-Fs1MP|R&Uw7ru*=G3REUPI`F8`R5iCQQqccU8usuv9+-wvT#=&ya=c|_P!&}S`I=1rXiQP^g zR9rD^jQe#;tG~W}WULjRBaepjAMw`)RFq-$ir(iHx4VLjGy<10&_3hQTUXB?)34zgr=cxn;BsU7%dFyY z|0E-g_`1R6mQ{p!=kGh@XPxA))o|H%rJw!q(&D9`kda25yqZ=*3TV}o_xUi?wb zS#CeK`o&$AEk1V>GSUcK%0T;!d*+^9uG_GMTUJ!mcdPGv>Vw6Lo?uy}5xA6r_8Esy zJ)`{M^;ftID$1~W)Inb^K6*MCX#_51pnb-Oz9*Dlz2rleK}8u>&s*o0#cv)=MjC-j z8EBtz)kBAt&+WXS+XtyA!|K~^X;z%ECK+i2E@hy7#_Zq1@)~2>xeO}Gu)5Pt>l8bE z$FU@hz@-ed&)DzyUCKZ18@LQA%CP#`*S9Ec`Y0J`1TJNuea7wM*D4Qa+|M7c8ro6@ zF6kSFwkv*gH5q9HE@hy7#_rQzs_XQEe@_Dy+pct%J-Za|swE?hz@-ed&zO1fq`C_l z{;r6MZC85k{9eU3D&Mtf1TJNuea6_A?|pL$BU z>B6T%Te0m*ZxepD_@_7c9!w)}sU@_}*!+dD<@?t?&1F!r?MiQb|GSH)T|!10flC=^ zpD}R#+VYHUcLcU#+m+_KJ)6L#me7tUZ1C%(e9Lq1a~YgXs9mdf`|YM;v&uNq2wciQ z`;0F)ADjQ`$cb)QQBj7~^FP0#c=anRt26?aGSEKbmENc12QPfuWl&Lu)ic^%SDabd zuF?ox%0T;!p$GNP_xsLoyHu26b^jx-EM8ODKhg+X%0T;!HSX!2zrOPhZXcwg46E;5 zdvFghA1TJNuea6INcFrHxK6DvWlwtL;OJ)`O-bY3nflC=^pV97{X8C2e9_ccu zD8uRv4>_-R!BR5P2wciQ`;1Sndn!C`n*X~ZD$20BbN`9O{g#uFM&MEg+Gn&n|BUeC zEBw3<6=hg`_)jB?!<+Cum`31I2HIy_Hsy}sruF=HEfr;0&G)V&a%luEWuQe=<{8|q z0q3}KaV{#&{un2yR1=(KW)rwXbIuqc+;cJ<`{d#nCC%ADgmB}aQcZ9z5+PiMC2)yO zTvm>tB9|ptH<1k2E6!L&aHS`mIC4i&sU|oE$1^N}OEl{#PT0P4OccSft3ni{Y(<)* zk2Eb+2nk0}sU|qCWD~eVbCie>1yyX{ZC?7wso1_tb2S;saO1E9E)ncE6`~-e3NtLy z%!EiY`&A(%96_a;V2-0g6d+h8A~?cHvlJ?Xgv+2(O>peWCUA*P-`edS#rd@e_U3p7 z6}c?InR7OQOEl+Qae|6mmaylE(PJW&YJzjrcm|bfg0u5%0+(pcwc~_6mT<)?g5ye@ zpdyzgxE9SOaEa#1vO*N3RAC#HX1+|CZMs58#I|-z(Ax@8NFs14!(OFE*B}+SERjAA z=8Z)#zx&6>5h2X{ZnRe{6W6Yp5$1@Y@kZ}7^mw#ei8~FwKb!2d&Ib705e@(HcN(ZD z!xCr+*E4tjgGv%{@TZ)~aNeMF5vo`MeeVk9OB#quh9%^prKTgQGAe{Bwp|FDq4D^; zOX`&>BKEp^u+!;;tyB}xepwyA&FH#?CI8gR2`hFfJ<#n;*LSO*@3MPo_YTb5r4hK4 zhxQqNU%sN$rn!IP5Eb>%>Lc6sEKRP=4yF;fl!5jcCpKAL?D&D7DWakbtD_@NBXHT} z<}>zsyS6;Fe^WQ>+-2U+#arI>GeuSp{{H9UTeDf`X#_51pnb*zz0NLw^w@@VwxV(1 zk{&Q)W$}@wWTX+e)DqffEPMNm@><7U<}#?*c3s{PtCbF(%+*91F}T6ydK)2Te?PQ* zS<8?8I2tOpUFkI&tzLSf1sQ1sE@hzoINol3X!+2!Hgfv}72B@#CC@f5oi&52?KA?H zGSEKbrNN!bU);8*%b;T0m0tIN^-2R;laWT?QU=;*%xt@9`OlU3 zN%p}s0+%w-KI5)mKC4^&!|^VIifvcA-CtXmrj92gjliW0w9i<6=)Afk#*B6uRBXG_ z99OalT*^RuV(c>D_q-|>wcNP$blpUEyt4Yo0c)3f9^n7VG?z;waH%D<&*;BH z_wv%EerAG-`fl}zr`9N~c#dDDNF#751MM^3dtzYu+i#n=aZpi))zd$2RGNPx8EFJA zWuSe=rtc3gZ`<}!H&aAK8CJjW`ftT^zT?-$(gLjHJ7de8R*rHRRFq-$mg}u3 zb{s=S8i7k0XrJ-d?zQFL?z!5{+)+`6)f|Jf30%rRdt!_K)s`157*SMZs}0^RUQ_>9 zn98vFiEZC5zOs*h8Y7oWBXFrDw9h!L{uc;0|MW%o{Xs<;R(D+dPI1{S{x4Z`xikWo zGSEKb^}Ek3pZ(}`cig3-467$>{ZVnyT4baVxRinR8F##Wa=G@tS6v1bWmvt|)?XHT z6#QTP=5lESE@hy7#`mxPwfz1=E#0w%iZZNzuh;V8+9cxmQCPN2HF!R zY`>!Jh3AiU8B~;EHOI$n0+%w-p6GJ?kkWnE_?bJ-!j)n5HfOdkbsomA4y6&el!5jc z2eQU=;*?EUN=b=O?y-x5Pb8CI_`VZ&0}PGqDJ zxRinR8N)aHwXXTT{w^66Wmvs$zD4Ql=47N1xRinR8QXr{s{D_Q{arFD%CLIm%*Lf1 z-t>QEn#-jTxRinR8E5@3EWbCw-zB4>46C1>v%GlsrDUWLxRinR8ULyOh0Wrv{!RlG zWmvuU;4g|D8vY_TmrEmXDFf{@20s3`@0`1NF#751MM@eZC+bGzvUwLJxE0vR`Y$8P2f@nT14fF zzM#tJ)d!Sb{%nFfu1KFW-(M$kEgB)*?1x;})W3gB^q0@|sc3sFsbn~UN;MI_eQ@df z#5b8)0+;APhjuBg-|*X1(G1Ra<@#cFhtkr`{FOK7+VOEvsV0VOuxsguz+ZVqGc18i zG}jFA3@UP2;YC8qzp^o63w+wJcEi{mf*TAPEe^P9_-w%blaSyUReT{Xs#^d z8C2x5#A7XYDqZ$eQidgPiRP*}oVGjh-YZMs63v-xg(yg=!d5N)!u;JztKa1JF7|>7Araf7EV1;Yol3!TNx#EFTgt#C z&G|z-gGx2A^=jLfMlVmwummpAoCn1-sK{lBW~a3(_3fPWTQ8QtC7ScOcm@@@EV1Fg zwkn$^!AmcS*N z>x6g)6}c?&{LY(|{=0$yR*UW*mcS*N>z#N86}c>N|ErspYHE@)EP+dO;l1>W~B*dC1qFwmuSu(;u%!rvcxmx%}eM0Jt@Ny zxI}Xv6wja{mnFjMwk$2ZEh)nixI}Y47tf#~mnCi(y>;p8a#DsRaEa!;G@e04E=x>p zzHRA@SCTR;flD;!*YON0a#`ZIleR0h`7|lR61YTjoekmm8mcS*N z>z#N86}c?&+(o;Vo>|?W=|}f-OW+dCbz3}xid>c$F|SLh)kaAfmcS*N>(59=!B(U# z@!j1AmyX>cDTB5|;F9JZQY6D2OQ=*6IuB0HummpAoH@rcI5&{Xo-;7R7AL4w6Z`gS zTUv2y(s_v`aEWH7FrGn0E=%0`dE3(e<|k!X0+(oJJmVQu$WQ$@qSW{0zqo7MYyy{P?k>g&Dsoxk^>cfb+Ai?- zyrS#e61YTjmo%P1MJ`Jm^G#4{R)0@7o4_U7-eZaOii%v8c;e~3ORZi>%CH13(cBS= z_lk;KmN@F=j-`GLPc%k*WeHrOxzdkkP?5_L??2PAbY)_OC2)ym1|gndx5Vn>yyj8j zgtm5OSgHxlqg053l+rC>_mv5^^mZ-92`bRc&)7XG`do(HUX`IeO7l#7t_=S1&t*^{ z0|MH)3-`S+zNYU_ehwMJwkyqc?AuQxa48S%GnRe+K`?3fq`a-zcBR>leMTCAOD&;& z#I$0aT!!>yV7j=J|m65r3|#sc%tb#`ME0&cNtV{yV7=#%H`4sT*^TEj3fTCbAD{z zKjlruwkypHn;%CSflC=^pYd(q{qrr~+t!VPifvb#88)AhM&MEg+GmVe{pkFeAN}g) zsj1j@rI|1D8EFJAWuSe=elL&AZ+yaoE`y3~SDN`UpOHr3QU=;*v>Px!zxppnxC|<` zU1{dad`239OBraNQP-z7|Im4tySZ>Gwq0q?mVHJVflC=^Pkb|~Howt>)7<@9Dz;r| z&V929T*^RuV#xy&^Sws5sk0T^t~BSq*#s`Ng!V+RY;^v{Pi}A-RBXG_ocm@IxRinR zL~h=Y{Aq7|>oTa=cBMJ@%_eXu1MP`h9y=)C{D3XXwqo0r=4?5ez@?VZp6KxAZuxIo zba5F}Y`fB&YiARvF*ltrDsLO%Eg%% zT4$NGq_Z+3SE!tShK+jf1U_o z+m+_dpU+4ma48S%Gj7Pw3FaTCN^^(C zXQUChl!5jc<3E2iJnofcW8V@8i7k0 zXrFOl{jY3p_ltk7kBV(qnmaT;BaOhN47AU9?Vls^zx?EXA(o15SDHICJ|m65r3|#s z*mc0Te3Q>la_4YVY`fCjq461M1TJNuea2URtIZEuXNEh6qhi~Y<_?X|NF#751MP`d zpQz1`yNZC9FmI@ts+WuQIb|GnxQPIq{$OBp(o z;m!|~f0CF=HBp@rJ%?kq4w?*ozN-CtRXK-CBj}ZzNiB$_EjwGsc_Q<3@~xVC6+s0W zf-~7{0+(nza~I99vp9Cv2s)lYMeSOGd94WHmX$rz=bBtJEky{otfc^=G&4wX zf{I+0u(LSP{oE3`L^FdF$#8q^H|=i;o~wW3j9j<$To7FGra!uVFr*OtFs%AXC%LFp z6KfxKTX6Ui^UOp+Y1ITSecp3?A=qu}stngF>*{jj?Lqs?e6JD-mqA7CT4JM~cLpyH zF}+f!VgxSH*N?s{*s@&};d(_yuIIK}6zu)Hf0H)ZYB{<-s8kc{9<(UP4>uz(h?UC{ zxb*pL|GO)=ZK=6~B_Kx3x^`NyRsCN+h*-Iz{@ndY|5p&vUeT6Z?RUH@=+ZFHK(<%>*d%n0Mc?TzJTaoVEp;8r!aLDdYIJE(+E=HK|ur&wnizb{w4lq|X5<=>%V3#^=-c}L^>sd>byRT_e$qCAD~XD@swD^&5wsXV z@Xd48>OwRNk!tI|rm?u{MyjCZg+wegTC`de6bt?V5sM^l6kbwr(JqvN*fyZJ55bMBq*&6#&|XHjzCcfNb(&dj|t$t`o|yYuC)U()nRzGly9{afa_syFf6>X_qT+%$} z(+s}mFPHBNz@9%T;a@TLucqe-D$4M0()-u(hgUG1E8oGxX?ERc991BwD8mW%&}b0h z?E10$7v`Z;f{HSn;2Zeu1TH@dL!vLGieCfY3xez+ArS~FqMcy3igp5*X!g)Z3Ev^j zcVuJtsg$6icAfCA$`7x3=!X-yMAN@CgNj^E@D2QS0+(p+>6G9emCN^qAUh?fj1ufz z(N5qJ&Dd-ZeN}uH9pBZ8anm5e*`*@d3HIG;Cvb_Te?y`#r3&|twD0+n5CQ^0Wt3o7 z8u^-ci4(X)Z#vGyx$<46d{--WhH7L4f{NO8f_fN?j>-vKqSEXT6YQzjPT&&F zJeCrERG!CPgegHq?K;7(f9(V=(dGaSu#$_`Umc}c#~l(9fuJ%<_}@jFBg)q~ zeO+}^qOW$TNISvGZ+cWt;A-!OuaY^<%2t{|W%LMHr%DNL*Z<0$C#WdH3H}bBW;lUM zG^+zC;XU{DNRBoosHj~hSTSuUaEWFeHzhb;xqS76{-p$!QG)fIb^@1ZRsmDOUA{KO zT3AZZL$&KG@m#-DlzXlP;Ih9d@)y#GRmuNq` zozAfnOWgxw@wd^9o%@RKzgyIdGjM&|U;B$6&MsCfCOHC^GSE7zPG|4zLh;(3xW@z) zWw>7a?8)MqugS;}xRim88MjZb6}N0T6lO~*%5Z&p&(pFl^ z;&{lQq72u&u0B|7>?9*c;8F%UW*pdhsCVg!wH2=@1DEte=MENkUOracS2+TgT0+N+ zKX)JLou6L_8C1Mo=@Z3Fv2BHn9Dz$2=$P^T*lh2<*`T|c+~-9ddlas)1A zpkqdP1y{M|RFvWRj-O7Ja|`!Xj=-f1bj;ZC)zs>z7vjB3MH#L;=ieUG<0D7lQU*F^ ze7R+E_3mm6Qc;HMv-iI>sKzRD4}l!1;J8wb`_ zc2#pC6=k^ob^GF=o_BKuE@hx&#>=w{EA!RdPDL56C%!m3sGlD>0+%w-F=OwErNMOd zjH03p*X92U80gs*h)#~cr3`c=-YCakIjVY8$`KmIpj>F>J$`tm%E%G8=toU_Ud~nP z<(%b}Qip!XC9U)J$LnO|2wZ9j9s5yT!H_}4+m+V!ziWkz9Dz$2=$KL6i6MiEw=1pt z_?!R8$Pu`dfsPsHw@$9!xNS0IQ1N!9H6G_4ezv+EIRck5&@p4We3ma?91j^(yj^L{ zE7zYUBS+v;20CV3DaYUOr`8Iuc)QY?A3wO^P}PqdflDo+V@5SohYTv-uC(U)%kyO9 z2wciQ$BYll@we}lrLI@JU1|OM_A(hc0$2G{tr_u2IsPVIiWz!Bsx3KO>*-wgBS+v; z20HemdIJdOii$E^>s_M09ytP+GSI_o-s756QHE>12i5mgdCfN^a47>FGj^2kaMxXm z_bwG>xYqkzJw9>-E@hx&#`@ODp8k178MvhNURsay9Dz$Mp<_llGw7W Date: Fri, 27 Aug 2021 10:44:26 -0400 Subject: [PATCH 2/2] Bumped version number --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24a65a2f..26c788d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.0") cmake_policy(SET CMP0042 NEW) endif() -project(biorbd VERSION 1.7.2) +project(biorbd VERSION 1.7.3) set(BIORBD_ROOT_FOLDER ${PROJECT_SOURCE_DIR}) set (BIORBD_NAME_NO_SUFFIX ${PROJECT_NAME}) set (CMAKE_CXX_STANDARD 11)