diff --git a/gomspace/libcsp/CHANGELOG b/gomspace/libcsp/CHANGELOG deleted file mode 100644 index a4945716..00000000 --- a/gomspace/libcsp/CHANGELOG +++ /dev/null @@ -1,113 +0,0 @@ -libcsp 1.4, 07-05-2015 ----------------------- -- new: General rtable interface with support for STATIC or CIDR format -- new: CIDR (classless interdomain routing) route table format with netmasks -- new: Bridge capability -- new: Added routing table (de)serialization functions for load/save -- new: Automatic packet deduplication using CRC32 (compile time option) -- new: Autogenerated python bindings using ctypesgen -- new: Task-less operation with router invocation from external scheduler function -- api: Refactor route_if_add to csp_iflist_add -- api: Refactor route_set and friends to rtable_set -- api: Refactor csp_fifo_qos to csp_qfifo -- api: Added defined to be backwards compatible with 1.x -- interfaces: Drop packets on LOOP interface not for own address (blackhole) -- interfaces: New ZMQHUB interface (using zeroMQ over TCP) -- other: Increase stack size from 250 to 1100 for csp_can_rx_task -- other: Cleanup in csp_route.c -- other: Show incoming interface name in debug message -- other: Remove newlines from debug calls -- improvement: Reduce debug hook function complexity with valist passing -- fix: csp_sleep_ms did not work - -libcsp 1.3, 07-05-2015 ----------------------- -- new: Split long process lists into multiple packets -- new: Added posix csp_clock.h -- new: cmp clock functions (requires that you provide csp_clock.h implementation) -- new: Added SFP (Small fragmentation protocol) for larger data chunks -- fix: csp_if_fifo example -- fix: NULL char at the end of rps -- doc: Updated mtu documentation -- other: Tested with FreeRTOS 8.0 -- other: Added disable-stlib option to build only object files - -libcsp 1.2, 25-10-2013 ----------------------- -- Feature release -- New: CMP service for peek and poke of memory -- New: CMP interface statistics struct is now packed -- New: Faster O(1) buffer system with reference counting and automatic alignment -- New: Thread safe KISS driver with support for multiple interfaces -- New: CSP interface struct now holds an opaque pointer to driver handle -- New: removed TXBUF from KISS driver entirely to minimize stack usage, added TX lock instead -- New: Pre-calculated CRC table .romem or PROGMEM on __avr__ -- New: Added buffer overflow protection to KISS interface -- New: Allow posting null pointers on conn RX queues -- New: Lower memory usage on AVR8 -- New: csp_route_save and csp_route_load functions -- New: option --disable-verbose to disable filenames and linenumber on debug -- Protocol: KISS uses csp_crc32 instead of it own embedded crc32 -- Improvement: Use buffer clone function to copy promisc packets -- Bugfix: Fix pointer size (32/16bit) in cmp_peek/poke -- Bugfix: Issue with double free in KISS fixed -- Bugfix: Change rdp_send timeout from packet to connection timeout to make sending task block longer -- Bugfix: Fix conn pool leak when using security check and discarding new packets -- Bugfix: Add packet too short check for CRC32 -- Bugfix: Accept CRC32 responses from nodes without CRC support -- Bugfix: Ensure csp_ping works for packets > 256 bytes -- Bugfix: Cleanup printf inside ISR functions -- Bugfix: Do not add forwarded packets to promisc queue twice -- Bugfix: Fix return value bug of csp_buffer_get when out of buffers -- Bugfix: Always post null pointer with lowest priority, not highest -- Bugfix: Add check on debug level before calling do_csp_debug, fixes #35 -- Other: Export csp/arch include files -- Other: Remove the use of bool type from csp_debug -- Other: Moved csp debug functions to csp_debug.h instead of csp.h -- Other: Ensure assignment of id happens using the uint32_t .ext value of the union, quenches warning - -libcsp 1.1, 24-08-2012 ----------------------- -- Feature release -- Defacto stable since Feb 2012 -- New: I2C interface -- New: KISS interface -- New: USART drivers for Linux, Mac and Windows -- New: Windows/MinGW support -- New: MacOSX support -- New: Interface register function -- New: Interface search function -- New: CMP service for remote route updating -- New: CMP service for interface statistics -- Improvement: Better QoS support -- Improvement: Send RDP control messages with high priority -- Improvement: WAF distcheck now works -- Improvement: Automatic endian discovery -- Improvement: Accept packets with CRC32 checksum if compiled without CRC32 support -- Improvement: Do not wake the router task if RDP is not enabled -- Improvement: Save 102 bytes of RAM by packing route entries -- Cleanup: Simplify CAN configuration -- Cleanup: Move architecture specific code to src/arch -- Bugfix: CSP_MEMFREE gives wrong answer on freertos AVR due to truncation -- Bugfix: Fixed wrong 64-bit size_t in csp_service_handler -- Bugfix: Fixed problem in csp_if_kiss when out of buffers -- Bigfix: Handle bus-off CAN IRQ for AT90CAN128 - -libcsp 1.0.1, 30-10-2011 ------------------------- -- Hotfix release -- Bugfix: missing extern in csp_if_lo.h - -libcsp 1.0, 24-10-2011 ----------------------- -- First official release -- New: CSP 32-bit header 1.0 -- Features: Network Router with promiscous mode, broadcast and QoS -- Features: Connection-oriented transport protocol w. flow-control -- Features: Connection-less "UDP" like transport -- Features: Encryption, Authentication and message check -- Features: Loopback interface -- Features: Python Bindings -- Features: CAN interface w. drivers for several chips -- Features: CSP-services (ping, reboot, uptime, memfree, buffree, ident) - diff --git a/gomspace/libcsp/CONTRIBUTORS b/gomspace/libcsp/CONTRIBUTORS deleted file mode 100644 index 97240f60..00000000 --- a/gomspace/libcsp/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -Jeppe Ledet-Pedersen -Johan De Claville Christiansen -Dan Erik Holmstrøm diff --git a/gomspace/libcsp/COPYING b/gomspace/libcsp/COPYING deleted file mode 100644 index 54c619ad..00000000 --- a/gomspace/libcsp/COPYING +++ /dev/null @@ -1,503 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - diff --git a/gomspace/libcsp/INSTALL.rst b/gomspace/libcsp/INSTALL.rst deleted file mode 100644 index e68a46ed..00000000 --- a/gomspace/libcsp/INSTALL.rst +++ /dev/null @@ -1,30 +0,0 @@ -How to install LibCSP -===================== - -CSP uses the `waf` build system (http://code.google.com/p/waf/). In order to -compile CSP, you first need to configure the toolchain, what operating system -to compile for, the location of required libraries and whether to enable -certain optional features. - -To configure CSP to build with the AVR32 toolchain for FreeRTOS and output -the compiled libcsp.a and header files to the install directory, issue: - -.. code-block:: bash - - ./waf configure --toolchain=avr32- --with-os=freertos --prefix=install - -When compiling for FreeRTOS, the path to the FreeRTOS header files must be -specified with `--with-freertos=PATH.` - -A number of optional features can be enabled by from the configure script. -Support for XTEA encryption can e.g. be enabled with `--enable-xtea`. Run -`./waf configure --help` to list the available configure options. - -The CAN drivers can be enabled by appending the configure option `--with-driver-can=CHIP`, -where CHIP is one of 'socketcan', 'at91sam7a1', 'at91sam7a3' or 'at90can128'. - -To build and copy the library to the location specified with --prefix, use: - -.. code-block:: bash - - ./waf build install diff --git a/gomspace/libcsp/README.rst b/gomspace/libcsp/README.rst deleted file mode 100644 index c8aff3d8..00000000 --- a/gomspace/libcsp/README.rst +++ /dev/null @@ -1,41 +0,0 @@ -The Cubesat Space Protocol -========================== - -Cubesat Space Protocol (CSP) is a small protocol stack written in C. CSP is designed to ease communication between distributed embedded systems in smaller networks, such as Cubesats. The design follows the TCP/IP model and includes a transport protocol, a routing protocol and several MAC-layer interfaces. The core of libcsp includes a router, a socket buffer pool and a connection oriented socket API. - -The protocol is based on a 32-bit header containing both transport and network-layer information. Its implementation is designed for, but not limited to, embedded systems such as the 8-bit AVR microprocessor and the 32-bit ARM and AVR from Atmel. The implementation is written in GNU C and is currently ported to run on FreeRTOS or POSIX operating systems such as Linux. - -The idea is to give sub-system developers of cubesats the same features of a TCP/IP stack, but without adding the huge overhead of the IP header. The small footprint and simple implementation allows a small 8-bit system with less than 4 kB of RAM to be fully connected on the network. This allows all subsystems to provide their services on the same network level, without any master node required. Using a service oriented architecture has several advantages compared to the traditional mater/slave topology used on many cubesats. - - * Standardised network protocol: All subsystems can communicate with eachother - * Service loose coupling: Services maintain a relationship that minimizes dependencies between subsystems - * Service abstraction: Beyond descriptions in the service contract, services hide logic from the outside world - * Service reusability: Logic is divided into services with the intention of promoting reuse. - * Service autonomy: Services have control over the logic they encapsulate. - * Service Redundancy: Easily add redundant services to the bus - * Reduces single point of failure: The complexity is moved from a single master node to several well defines services on the network - -The implementation of LibCSP is written with simplicity in mind, but it's compile time configuration allows it to have some rather advanced features as well: - -Features --------- - - * Thread safe Socket API - * Router task with Quality of Services - * Connection-oriented operation (RFC 908 and 1151). - * Connection-less operation (similar to UDP) - * ICMP-like requests such as ping and buffer status. - * Loopback interface - * Very Small Footprint 48 kB code and less that 1kB ram required on ARM - * Zero-copy buffer and queue system - * Modular network interface system - * Modular OS interface, ported to FreeRTOS, windows (cygwin) and Linux - * Broadcast traffic - * Promiscuous mode - * Encrypted packets with XTEA in CTR mode - * Truncated HMAC-SHA1 Authentication (RFC 2104) - -LGPL Software license ---------------------- -The source code is available under an LGPL 2.1 license. See COPYING for the license text. - diff --git a/gomspace/libcsp/waf b/gomspace/libcsp/waf deleted file mode 100644 index 4b322f1a..00000000 --- a/gomspace/libcsp/waf +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python -# encoding: ISO8859-1 -# Thomas Nagy, 2005-2016 - -""" -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -""" - -import os, sys, inspect - -VERSION="1.8.19" -REVISION="b1fc8f7baef51bd2db4c2971909a568d" -GIT="22213cd8abbd141bda40667f7ca2a48f2d6ad785" -INSTALL='' -C1='#5' -C2='#/' -C3='#,' -cwd = os.getcwd() -join = os.path.join - - -WAF='waf' -def b(x): - return x -if sys.hexversion>0x300000f: - WAF='waf3' - def b(x): - return x.encode() - -def err(m): - print(('\033[91mError: %s\033[0m' % m)) - sys.exit(1) - -def unpack_wafdir(dir, src): - f = open(src,'rb') - c = 'corrupt archive (%d)' - while 1: - line = f.readline() - if not line: err('run waf-light from a folder containing waflib') - if line == b('#==>\n'): - txt = f.readline() - if not txt: err(c % 1) - if f.readline() != b('#<==\n'): err(c % 2) - break - if not txt: err(c % 3) - txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) - - import shutil, tarfile - try: shutil.rmtree(dir) - except OSError: pass - try: - for x in ('Tools', 'extras'): - os.makedirs(join(dir, 'waflib', x)) - except OSError: - err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) - - os.chdir(dir) - tmp = 't.bz2' - t = open(tmp,'wb') - try: t.write(txt) - finally: t.close() - - try: - t = tarfile.open(tmp) - except: - try: - os.system('bunzip2 t.bz2') - t = tarfile.open('t') - tmp = 't' - except: - os.chdir(cwd) - try: shutil.rmtree(dir) - except OSError: pass - err("Waf cannot be unpacked, check that bzip2 support is present") - - try: - for x in t: t.extract(x) - finally: - t.close() - - for x in ('Tools', 'extras'): - os.chmod(join('waflib',x), 493) - - if sys.hexversion<0x300000f: - sys.path = [join(dir, 'waflib')] + sys.path - import fixpy2 - fixpy2.fixdir(dir) - - os.remove(tmp) - os.chdir(cwd) - - try: dir = unicode(dir, 'mbcs') - except: pass - try: - from ctypes import windll - windll.kernel32.SetFileAttributesW(dir, 2) - except: - pass - -def test(dir): - try: - os.stat(join(dir, 'waflib')) - return os.path.abspath(dir) - except OSError: - pass - -def find_lib(): - src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) - base, name = os.path.split(src) - - #devs use $WAFDIR - w=test(os.environ.get('WAFDIR', '')) - if w: return w - - #waf-light - if name.endswith('waf-light'): - w = test(base) - if w: return w - err('waf-light requires waflib -> export WAFDIR=/folder') - - dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) - for i in (INSTALL,'/usr','/usr/local','/opt'): - w = test(i + '/lib/' + dirname) - if w: return w - - #waf-local - dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) - w = test(dir) - if w: return w - - #unpack - unpack_wafdir(dir, src) - return dir - -wafdir = find_lib() -sys.path.insert(0, wafdir) - -if __name__ == '__main__': - - from waflib import Scripting - Scripting.waf_entry_point(cwd, VERSION, wafdir) - -#==> -#BZh91AY&SYmEKQ#/#,Y #%H4#,`(br}#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,ӭul]Z}i{l4ﱮ_plkLϱdzvݺ{]xԴRq楯y\e hgEm.ǻuw׺]2]yk={[yw@=ggkWe}}}owNz#,#,#,#,y#,x->#,<*{WLaOl5nۧF#,m6 PPu(QB#5JJeGc@#,P6bAnׯZ>H'{p#/KvPZ6tj>ޏ{zl_7Z}ۡMZlζˮ83oM<k=bWGӪUrz5O{y뽇z#/o3PKhF;l5#5v꽍٦f{%ՎڻsgR˒}}ށ#/#//Z"i@[sǭ^s +ހ>Bq*KxG5_/=='}>9믽e6mvun{E{6u.#/N»^FM>O}ӈXL|RZu.9.;/nۯ7rj;3ek|Pܧ;{U)+Kw^|#,=u #,=^|vާvqw{]8tz#Hۘ@^vlλzދg|6%WWݶx};e>&{o=}{ok:{}kL}>>ya۽v֊ﰣqM_^/:5x_-IڝynO@}o+LUS4Z:=ua+W{Sofw[{\7v_|\V:/nR+wц#/_wہ@mg#,#,:;5kGvsɮW"}t@x6wuNVvFH.SyUr^N/FϧOЦq^;N!yNēN{ovkwV]vzskNۮo6So#|w M @#,ɠ#/iOD=CjAxJhD@i2hj6SD4'#,#,#,4#,#,A!! Abh'Sh 6D='67#,#,#,#,#,'QI4jrVL*iH ?#/7R Ye˩jҵZ*1m#,-BIX(Ȃ![*E#,|R‚  FVmkjL@ ı &D4c6QSR%%(ҊmELXXMSQTDJ 4M-J̠I,hM0F)6"JmIJZS"@ %#5`2)lQmT#/A&()%҉YFiUI6d̙4lUZff6mKM5-M2jadS$djFB*M&LZH-h!`3M1lb`4HA31#/I((lR@Kɡ#2f)2Ac%4TZ#/5*ECI4l(Q&ȥ1PlMe2&FR)6T2(EBH6"X5 "J*5D3b $Ԗ)1Hd3Fa-S J!*M M%`Ĕ,0l#M#FJ!e$ ),0ɥjih#/K264ed&bIZHXCeA̠ƣfSKS[M!3HDjL@IK-,QQD‚#/&$Ȉ4 #$4P!3-EaJ!&B6Qli&I% EȶF̆L&ʓL1*1 PDTSb(2bJE*I!e2,Jiɲf&ɣ&B`B5$)YIY6J@!%(E3A2H0M*6BeȔbLE#/&60FTi#/*%k,Qe"f&DJ,5JJ256h(0IS@Hb)cIlFe3K*Mjdcal#5(Fhemv4%J2SXEbQITD%KAQV"Ɩ!e) RF*&,k&Cc)Ebd5-*c$&,32Ye#k*ERX$)dԈɦVD5 [%YYJSL+f(i5KMD%ƱX3hH3`FѶѱQ3L5E!4jQHmbY05Rhe1%h5(ږm$5!bVA,#ei6F&l3)#5I6ԲZRɶmZ4fk32IKYRSJ( C5J4Qb- 3ѵ$JME2iIFL#/%0ŠE,AieHi)e6hbĄTZ, bcl3K1`2FLlBK!IlI&h42S2T4Rma3`#5TX1S6RBlE543 3hFhɩ"aK-$L؅3R2I҈Jԙ6lei+#dfMBT)Fj[,شIlbTQfJfdѩH$FY1Қ#@Y6Jhbb&I F5BTmm1I2 &h K#5e$*50ie24´mIkhЙfHA ,#/RJQliI&k2*HI"*ƆMEc&&VJQ%4ET*Je)F`$Qdd06KdԛjIEJj&CI3dRTXiH- h#53BFV&#JKEhƲEd6%`1#hTh1E& VZSTj-V1Y-f(#(1B$4lVmhҚHe#5&ѐ66hTZI5f͐Ī1h,UMIH()DF`ƒ-dԖIeM‘QIFkTeCI$Z66Z[$Il%E$ѭFhڡK&ZeJ2bFL`lMlTȨ1$I2$jMfV?5K& |RZdI-I/E򻴖^|ưTƪ?,S^‰bObM4d7%č3m5T;%v>zyg̳',uc/eLY]Z1, tu-'e)QjoQmnfN1jqq=c,’6r6=)`S5KJ|9WY[#nei-M(@ _Q eRFƶh&O9Q 6Y6?݀45ȤU5vZQX?haR^ԛ2*2dXaZ3#,#57AOS(C (`)UAҼurKe f>Dӧ&9%CE%OUm@QE{zY]J4}]0n(iJn@rpe˒nN銃}K[lU ,D(FR-"MTFzUiz``ΙO-Li6J@`@hԨOV<ՀژD{q`CU}]l]~>ٛVp򅧆o;J0)jeN8TLhj0CfB(t\÷%v3ISʉf0 09!Κچ{z XZ%l(Oa"O– :>0@fPeJ#5WɗRcݿZ6G"_7v$#}_zF: e.W7"^*P$csWLViУ?.]u61^9d5˖ƫ)84mw {_K幣U\XQd$a됻 (hdSC"ʌ&/_W xoW{J_7*#5yWMu4"1SJBVbcXjOW#k"ȆkP?V"0KElz'< "1Ҷd< !w뼮m9u#EsHsAuBzZŎPwQ&қPTD׾XIraivdF90 L"Kv6m-82Q`"#5(@%.}UbdtA30"+it!cE0ꆀ6v,MP$Xb T}uV HCZ*SHuqf?Nyaڻ:uf/ji80jN Ho/9`>/,)B)A:+v#W*|u &7DjBQN84K&d#5*mg|͟QNo (|(s_|V'rI3mc+-IEMT}[@0Ž$‰hJZX|*&dFڐmĎȎ0Ggk;e x ǜnoqO.w􇞘7p3=FP'HOhhq{2oҿѯ%B҄:?_ͺCGʊo.WwD+:y/"]O{{X*Rpkq*(V1)"Mݴf솘PcM1AīpҤV=A=Fn.=oeH!a$hN|dm]-єL@:;֔?݌v3ܥD#PbӮZ:4@I*h=(<+4|#5B_x >4]GH |]#5b".x#/.Sθtaaؔ7lDݶ1m,8Hѓr.>y#/A; o͘HjEAhlWâ(v\v01:e9J0GIܕ[O6{0)JjU׍.agmAg@I#5Bމ`Ga-{_#/[%sO>ѻ5F31 8 971Fmz(-|4bdj~.QʤX=_oxpU5W,{#ֳ'Ti<P8):YmMbw@ @a=xեd}y+Mub#5n3M6~R-١\x@p8\6irt{PAFhSC1bR`^;4l)WZvEeCL;&#/Fҧt^yyxq.K3ᘝQI:d$Zg7B=0JBJq}>4iD%RRǒ"[CoqE1{~Y>kZ;xZoLhVR9H`Mux7cOrJD2Ǎ: uvOreDe$:3w׈X *B,J⡜^0swÓXF;n^߇\T#5pLt"3t8ǧњMH(1BP0Ajfӻ}s[{C}>7M/e-oe#5#5ּ dSR{^{}i#,$ NjGG5IO?˖WgLg]E*; z/o/bwA^?%g%zn|ö.?#}$q=^En Fcvf,#/,gg!#5~Pi::К:䲦QiW9kdUWkB#/IMvg(:0"p8H/F@:JgêUבe;tʙ3۹C~ۏzM,Tw6j)!kv|CP.QGB|r=*D2,Ѯw3J?JwHMS֥XTj,)<'i~Gu>w9w5Lf8$ZLf4.ҜLVsR`Y ALjg)œBj~oJ4}vZZU):g{u8Px󘳜le:o]<{ǽY/?35_1)4:m˿Cu (b1#/4c-;2ǣ1T]cFzfY#5FmUSZ6I+dU^S#/4O D=[q1UOֱZ~3"Yc|4oZ0]yQQF#/6#/AAz`eTT,UQPzkLCh%jVMP-R.dNdMdJ;i]\Q?8Uؖ#/ yJRN5Z+H5Z:||jnṽhq֎٘atI#&Zċ# Cm).#/6Git/iP-~Z0:~J+JmM}/sڻ^i@%CAThݰ|Ƌ[4wpUϧ#稺f\bLcBV8q^ &[>ܵk6l<9^K#/Sm/;)tVE,iw-#54&7ߺutdwi#/>Z~ә]wD|}>#uɝMgYYRTYqfб*qojf+?gmK&LC}W$3ӫ4e)ޫbՓ|Ʃڲ>u?#/$i[S߹ԉ̓|Ӡ#/Sw?{F._Y$Fl;timvCO+)~:*xd!4W'߶Q1o؄IfOz6k.&܂ws$D9812ͻs#On6؛*3ל[LhW"#1|#,TMEMqovs6]/q\<$AC}%LSM$V9l{zk;O~)tW\kרUoL|^ӑssٍeݛanʑ j@zA63W{xa$++o}Z@e]ҡ3T?مSU5an~bPI /;#5 ުR9K8ǣ9ѽ(Kh-Gs(k8Aqj wǔUsǓόUy_'~+~Xg]I#/LxBw3>gGBBq]!w]Ϝ]vgNM4aB9s5xsG YY$z@3^Gt+%y ݽ,|RT$ICY;gX$MC٢vgdK9oIV]JvsȵPRѮa3Q٬C >B0TUBEe([(hG\IIުKD+QYf_m#/t};x#Zַ>c8K|MPP和Dd!,IK惐eNMbd];>U!yzwgЪP[@?@L$NLjUPX[7ev4PiϛiyЏI'iq vy#/z8Zj wz{&|IZXDF ޏyT,c@#,`>nfkX~8~%ec< Ui۠Go _;#/[Daw "ŋ>gΤٵ]'nefqU őz='U.a6|vOsӤQɚo$!U,U}Z#W`u80HE[^ۏ`//]#/tP^(wQnV%tb(mݽpL'o 5's/@ VM^%-baݗb~c -tP#51UO,P&w̯m?buY뵮9T?M,xg ڡF΃ӮݷXGU^eku'TIAHk+~F!Ivs^Qs@M=#/fQL"SL+ܡKSiԣsOǃ:NVʹSsAPT%B'? u'.B驱Ph`1վ@vh7)wy*ޑI$5!e̍r&mCC(W&HLRiBY{Nl͡3)G54n@;7覧͑)uVfe5IDj߄!@hG4hf6DX9FF)ĻnZCDKmIyնa4A?g X< Z3޴Ic#/Hc?XXv[٠*뉣QְƟ{wN4FLdIAۃ3[BwE f찲8pVC #5L5i8.^Tiݬ40\s\ll=lpvM#/>W{l3㢏̶WTxTs+•S{EP~n^&¶P.XZ9IѮ=SF9g!8yW4`yt17,/+i'}nߔl#:>s򚧘l;B`idVF8qtyG65#/+oE{fw pp(&dqӍ|fI˿1 Ucv餑&`q|kL 5XQpj23(!;A|Y#5mJ:!ӷkMV1Ǔ&a/'kòԉ*NuDL3J?g<@dCD#5j3xXTin:2.\ iQccyH,la%Bt0?q.C`B=u"1v b*pe6o!!&[3F a6?>6L\Auͷ.ӪR|n [#5 h;2JASģ6.fJfZ%+|bcNG.g]w$93?5J7*Wkjr {o;XZwwٷ n3@\Hfŏ]Zdj!v5n>Os5_FjE[7sn(D㿁㩁۲f}o(}˥/o3M#/*\Sc"]teL(Dv5yCeKyl!8UdI 06`BB[Ce؁x\NX?~ZWxV8gE/ptv61+- Ku!+5D7KaA٦qd=3`QSObYuvL 7` _3ldZ+C|9ϻ{}2%\zmoM[ j=4q0HYa8B󺻼4;,iJH,XLֿo?Gߜ=r8Le%0(5aHRP+>{jEDEAa zV %YbT}~Z 9; < 9F*PO~+fcW%0HXf0fd<wTuH6\E0i]*ꂝD\Ll`M6WŶu=&0t"|"nLMov=E'8HSϷ!#N^ Zi[<.6P*#57ePS7bPG戎R֟2T4`@8jLLFK"f 噛#5`g-TbB®]Mt:ˮ^6-Jh?1%0")" GJ.ϯwySICQ(`a k5U4[5-Qaɋ#/XEV\ !]V"/z(~r#5+jO AK]c٫jv={[vdIj=qFRUxoͥpUswU+nn:.zӖe~<P11gM7*_'0J7(#5H0Q車W2rՓuܹh) OntI [_ٿ]A8VTP[ԓNq|tK[yVW6NᡗMHƑ @ dJ/5뱱^j-/Fd" REH4I#/ I.aϳ=u:jc5VRk/Iv޼scˁ#sDOGMF)Hcp"MUoWuuG#){Sd>?rdr6&foٲj[!J!bSB%Mk6{fp#/2ѲgZwʏ/80n\9P$=Xu,[&i /RdOʪ)(d.Z(QET(0QϵL:+wڌgw9!JiKۥsfN~\n6$<>).X! &}b 2 zl vLTd$yD}^gNьRuƖ8Tݮq/}/)$^sfl*rʴ̋U,^;\Mt0se#5k,6EUPq'=q#^D>lF)NBxSqF* Y$/#/2& ܲda=ݭ,\&f*Zj!;19TuCBs U.$ڌr\H͹-inDSU<*.;`X&cf֡ ndLNk8HQr>zehS30gc`L#~m!##ǁ/FTo]ltQ~Pbi걭 #/QmaՁ-;ݾҌ[C%߁Ijr#o"'R PxW+ۓi"#]1BF]ȌĽ4=9xOsz_;DU}>*6mc>N+~>ų3f_:ʹؽgDK;#5 EQx4{hyOfEʼnb|_'AC9<9ztFBӖP!׭Lk;w鷕#5iYŽ5VGW3a14 QcziIP%4Qhը%BF*hҪB-IWNX0; ]sW{ws"[A!!Bb3vL%LHfʖ%If&ңkvlQY\vq0Ι &1 =Ű^[-?MnzMve4.Z)M!t}^Mzߣϻ1DF"wh#52ObS&H'{_LxAN+Q dD>{]Lv0Q0$3~rBEXڌxgbdHudY#5gEkK^]JIm\%%Q.?SV%l"eHh#5[*]11CHOџ0xjg/$(o%_#5U0}q_^?3: [46?SL[13N?$y%1@zq m"z_ ׸n"=xM *3 IU+N_F,#I@*".N#5èPCdQ.q.CBk݅gbkdE=l|DU)I0 J#·MjjfuW/$㇮C?>Tb-߻񧮿ڸsǞ>8[%hy*M"MyJNm>ֿ*Ei|Xgav1t=H:oR<5{-G"j Q&j(*#,Jo|ezmf~?þ)頬M''V7q,RveSw28/Vd$/@T\cL3cv-EأL>4#,%3#5O=Q[MW9et=c_[*[شE͜ϥzd aB#5L445>KW*Yz=RL?ܲ\*wy~|ά܏N& ^ ?.T8#/Z5{ąco0Ns :9t "uO|U&;l}I~ޚG-Dǯ, ooc|HxGDy!&B1d8W_?uٓf!*O@|+N/?ugYny^9̜S:gwiDIM~4 LFڟ{!V4 A2IbBpVl#Y.tcHLJ~ z0:* #5|KTR#, TDDEW LoϗMea%'_\Zn2Sh2P, A1 Ҍ]oFi31-t1zԿͳff{{>th|tܻXgKzuGqs#/xT{s 3Gƚ/P?^tiʼrgQuBU~TrO~Cȷx8OM wkrWD_)u^xͧwD͟<ӻzs˟=m5;z4\5^-m7~}7VGifƜףɻ#/+%B{bq9N+Ž:ނ,9?fg=|Ż#/JGFju~~=vl?0zJOtVyl4S\,ZIp=%>^.S]ZUU:k;9]1Ǝ|vnjgmJyݗIͮ\2+ׯ#5U<8Ig朗ѽSIR$Mx~O6{!׿?y- +d_v:'=ʢAPe ʝ^luo>änJbۣ̚ڏ՟g՛B\z*zƿW51/U[dXhݹgW=9µYg^Y}O]/n{kv+Mrd܄ZK\68j˝qpGtKװ3fٶaȗ|~lmٺOywXo?[|MB-^]>&>D(hwsZIP؝FFU!d9SqCH"L$⟐_ *l>@EZ25fGi ߻_~z#9spXo뭼;ϏofolWECT|_~˳s+\~_x~;t~Ia&^7ͫ/=f8|EW.vծ|'ӏi̝S|Rzۻlرu+ZtPgJP9[V1qB T/;WR؞/ݩtT벙^ǮeJKNWfTSsv'k)s Q)cy#EI'!i!Z9/?#/^k#5 >_;*kM;:'Sf<)>8r߄1dsh!r˦~rl}5սwTb(c9HJYW=K`Բy5|Vr]:vwG/#t5/#/pp#IȃU^^J.Ew˻/$Wa\qZ̹%`Ϟ*;GA֏utaV$CcE(8#5*"jDF 6Ξ[k[ `Ҏ LXVaHhYSIU X0#@Ӷk,06Y8h $mE=MX޳!uX~1&~Zj]'hkQXغ913S%R(ȝ t{t/9h#08$øJ:QFk1}KIPc 0i`QV M@4 D A<wofIxS-gol,)~tgҷ1Q/4Wh?9YlZ%C̷a_#/z~ӮDՋu~-2]%<{nw;mx'=i1i5B}#5>fŮ>_^ZiBB D8%kw?Afowqע}Y?iI)B1x^@?O%>?㪥4N=/gu~>w祑kݸ5z(}spG|?~Ao{8VHm0acb!h22!In0KJإ%IH@H2)#,iuF$ZLڛ&ɮ^ĎS)jr7h(UX`ȣH*V&efeX6<+-iNF<+ړ{̈́f#/IEANivyN=QR29DInB pcK J )"%桶2)@lƃ2#/e&:E'(<)LRۊX-7օ̤J#5%F#50 (lR>7MiƗs6B⢷f /ZUV jPX`- ed?@Q'Ѹ.j.DGqrhs#/1>=j0}'tP0sM8#/$Ҿ0,.e/~hs7Q8m5_:{dltTmg"vSRi vIn7]#/CThb0IDZ^1fe!i?#8^[50!5;<(.#v;)|o2{\nXƖTM ڭEU6?SQױfhTU[wBۤ/BBW&/^a6yMRFjnH$ohq#/<ڔ%赵&r;_56UȇV1'}}CnL頀 Dڤldq!b?ӗM608;"·L!O7ztwO_DɋcꀠTH(Qk(VML ]Ƃ^1a[Tu] r2Ifq|(x8V3]*0be#5MxX0g⭖g1@aٲ=h;_FC4Fݣ*%i'eCK9ntlV Ƒ:iC9*i3b4PK5j&JQ@z+F ,#Q6k`bJ.^ )ivr6Qk0wc+z;EAhk Z4!5M)4ܦ &?}ʪ;CS^_kw3^cr*>V)mItҁHlu~&|f7TΘ77lӀDc#5DxS &21 1l'bF֓qB2,Ter9qUTМjdą9SL̅A Za|C;Ү-jތe]J1@l*Cr[9P@ tДC0]#áfӳAqCI*V&sb-^,\y`tZiAȤ GbvHƈ鐔ORkYkӿwTGgǫ{1J6O)Wj63srZ0ɩ4NX#I(9NlGqVdcLprvaGQ#5&Ӌ0ԄL#f#/j̐ ;d3,X nbIQp.6Aal#f*U2es]כW]9wP$$`ݚbVMw+^" 7+]](҆R mdGդtD(4x8)#5 Ȓ45lˌH#/ao|!BiNb!8#/oDJ[ˀ%U;3a/8k fA#/;~doa]78:ɰ`BLvP|lkx ГZͩu4f}]6ɲ,&M+wn#/ 8,F r7QJ--vmktQ6v5#5',jv+z΃+GcvsҴXqW/!X:X1qfn\Hk ƻ\ٜLOpsn\..LҪZ%'frfODHa;#/bL^v\#/7->6WoS-~oFqR2>De^F/K }`sD!!&|=mw%O~k esQ?"0J+Uny\(qUF̳Sls]$:dsu%̧_#5sL3ϋ{7f|2SD錙49i[>&02@rCwf˙YmsDz;A:vY1b]2CDv!Roqb|)ipg'ZlGL#/{Oqg=oX[å@cCY2Kdu}ވk;95[\A|+/wb$-2 ex2f*)ї-q2\3bBb`Eof/\d#/$] PqA;H;3i3ϵ@)DۜsLTHJ&=S^;y3ԞK#/a#J('Zen Zoܲ[^o(5do]h=OhG&{#5dZgHz뺁CZ$VfS%{i n˧(0G˫)'|Yxhv!Ƽ1׌sF[Huh劥xZ_)DijL< yc̯EOON4Z&NFCe5$?S?D3ʎN6v.:!H<]27|j$Ӂ0T$=̓,agG>Dމ@'.'_%暷 Ugn=-Mro^bZkI&t:p2-{n}n10cb(_Fձ+V-[}ʲP̍ Gv3^1'b/Mфnev;J)lʗqµwv]έjf;ÿQ_'.=Ӌ+~ݑjaߋgXXl#5ya(\Cvw3qf2N"^JH!և˂S'* {\q#/3ӆ_gP]<_篵Y:p"&-P&5*ZLʙᐙET4 ˩:GX_sB;2וZ~gqwFGF"[1jjuI&VڛzClg* ] ]jPP-~#/Sa[f<ҋr9bvzg\|Q h!^Mmc۸.Hn%V3ONc3i{=լ{|6RZoc.i.(aU%E;·aQ&-FL4aW*$MV !ɏI9GתbDd:ޤ-WjjW^6U;KWUvQ.*J#,ܑ$s\8' {ǧ̿=s./8<W=Z8l`;1)qZzΨ{Q‘N'{#,߮Fěnh;m1M#ˎq(VU qC%I<͙4sH51$1Ȑ'lLq-wqVa4&n2/Go\\t%*2L$m,<#5S2[s} AR&9rD,(K賨!LFFvP!fyni&aF,=x)Re޹=5"^#?#eO-eQ~,x-L lgWHח̣}܈Inh{aЌؚTyV驵0avD^f~MQNAWG~ݎQ3])#/l\|H.f|`khd7}ggXVX%AEV } /AFsY~aG6q;J*89Bʏ7oz<}*ɴQmqI88ZTD[CNVFܳk%E^V4[w \3:jRk)rP௼m9e7ƫKpWW>]4v2YsuJ*rO$pzoƼv'fʔ#HUi_}HDƚc1I=RYSeY8=XlY$]|txJeĴN 6h_Tvt޿/>J1"U5(n2*KCz׍_[bQA]#fqiׇUyNOS瞝q 7u'#5y$ rd53v{-q14Ltpo6Yu"2WΪ9VBc[#5U;elaW[Sk\Vd.an5ĝ$5jwǺ&6Kxkk7qӶd"`|HE3=k}ZǾ3NX^X\$ΞHi%F裣|3bg\#uNI{w>Y7Nnu6L55ʅvY nGF9Ն).<9ZYyByjrOpe{#鰞b\A<`STOJYL.gBVAeUbU2no]`D{TwjuD4<梺c.甴}O>kJb~n9FI럿O#YB*4/92W^my$L{7D.ɢ98}Ǘ#:HJka#//w]3mWQUpͦdE^sz0E-+aMk!J7YO+O++^A & S؞Q#/ԝ2G#5BAhwl*Nn-z!>+5S]S5Ot#5Tt>ϺSPׅz>74"x0ݍ zЍXn9~]Vro.iG\\\$yȼAw2 T܋ NW4fFٿWJﺙafZF z$?CYײew$ |<._a¹XGFdx!+x#5B:&adΓ Rª hR#5DMhDc7,O=P1e0|eɇUlޞ"^UPԛzn=c&˗M%;>^X4}sIڹG{"Bo.ZcJš&Bd[ }ά!#5%PVoWA-\c#,1D^뢊nyz_Nn/vtw~rk$cyco`]]~.Ŗ2Ooģ529#/K%yܟZ<ⒾeB;sni[%uՑuDz D]S1 +Fa  #1騃4u2#/w@kS.sϞwWCtp/Yk͗xGb;;.;EǴwΡ;a'/[ʩ ܷBvǑ(c|7㟨]b։CdYTc<7WӋUw=Z0knDqqZ7PlRjsTտI,e 51fnM<YdIu[\gWnV$Q>եTbL/b0׈֟O]MznKҿӪܼ yWAF.#5{/~ mqoG:7R<:ߣ2cAu^N!Cڊ\Ā C E|HY9(Kʿ%#/'F/;̝j>`_dG2/^3=͎ڮtìl5JP?HK3O2Y*ݻLl72R o(Lb5~CNw{E.H^:;tBz<&TcK#/vGPfef|zm$爄r{pr>ISyYCd5)cы{R\٭3Dɾd7F?H\Z H\ u?5Ud!z!ҘIhN#/$ۘtaql1Vd>C0JDm"+&-X(f#%!D 1&H+PiQc7`; sJmb U֭U"@1,>*qp۹'jWZR4?XlFHN/FT ylW#/2_Db0=KE*on~3}S*Br{o=tͶa#/J*#4W0SFq߇J6HGmօǕ=#ŀV{y`w_(tbGrX|Ulo,;gxaD,#5Jύ>GwG#$Ѓ-#,x1w@P[wpIM=SRMݡA~q18D7CVKmռN̓a*RhlWfQF=ڦ9.w:3t)IgR FݍpцVLMva5# ?3TւqBR7t)mG(eA0 ygDߔ_Y*k~+Q_*KNNJ=L 4qRhKnf=`{NV5tr~]O#@tFCP 4 &"Ӣ{tHwaP7v[J/y]TM8L -1>hfkbRMdRsӚmex:#/^,󄑢A{%dyЪ] WY0kNRF9WdoaK|X" 2CɔPQM ~㙴a#5bI#5Wcj9e[ncVtSr72A!t~T%IiLY-ٳttiq\;oNN/+#/zTR8 )#/#/_#/#/z1/ggsԃ( l%supIY GA6x=W#" ;MN]ߑ;|K4!/@CCWW|3bі뭈71|16c.<5o OCIf;#)a,~~X3qvXgj3+՜;s1sOu'GNBˬG?šQ,]XLI,uH|i8J(M}wA/Wl#/s3GJ+M %L\h婍LU2klg&jiXLPiVq!o8s +#/ZלLVN|fñ}/7MA)(c5iEIc#5m99ʉxm4l4jA8MA#5hӷҷp&V &E&u<"Jl =>M|4"RszH?WXR.O.Z MP0Ja"6._o/<1*I aʪTz36;MX}c! D&akV~tӬ 0|e\gn$#5q:3c|I&D?frd9 BMtܿu-}8A^ZO `xCQV-@F); Hb{cو_c9E#,ZI @EL0*"ï.%%R zG1iEJID*Ζͭ3<6f",`R`Su&gX@'q(&52I|]c/c3|!ٹ<"fD]q?l6%[#/^!j 9qL=M(apRjMTZXxe1cHI~({^z-#5?GJ(9ވ?rgCi>.s`?Q;#λcrwyo iV,;mGJl)],x3A##/%i!aHlu#58 sV;8P7(hWPa)/zU#/;he#5O3š 5!#FoտeC[:12 p:D>F͇(wQga(0š{z+BC0QEjun#/,YѠ$d^O39:iHPYET, q<35wmG&#/3pV` I$#5**P!*Y_AD}#/B<XԔ "B(T{#/y#/Pyg0[F p8mymp΢H]! ?9r':"MP:1H70Nl`;(Άq̣PKD}|U&>ul*4T۬%qk^80 <'OH<,u#)+#ԁH \^*pEN>>#L(1#(.UԸO{ɹ5DV% R] (׬^YO sУS7ś`CwȢ*ᩈwńNqV4Ϗ=9P a=JJC#,AH=a ȼHН}=QՂ)tEkag=L+ M)DN$[$!!&A #xK",Mσ3rr4&z8J VɛXX#[`Z;#5dtSO+ks!u~HWZu' e*:*#5Cr 2'oh(:ϲ`Lw@,7kW*/-SKUBZ#5SB6$W(M%C8/:좐fgR<#/1ThzʮelUdߜBDH$ mTK=hA0i*zM[ufr7 63PA9 N-X󹌊t;TP1m2RH(XxM(!2J97>SXc$T#r8"pyK}hG4!'))dt-vE؅[rCq[aҸ2.ˁ8#/(6 mJUKfQL:kȳ>~N\&Ϳ2BV~c7n#/ɌyC4 FDA'iT68|#52"),(5#)Pp 9QHmt,\tvvG.K} vCEΎ1d4>?P=M!5HS|z~x!ˣ47F'q0t,#[A1,Xwl#5{؋KK9lwܷ#,!I'D:u!zs,ykl;@#5LqZE ̬#/u;)Cnuf5W~"&9)#A-3aF@J2}yB;Zv`Yԃmţֺ,%)1D5$:0lTLؚ57q=%$7#,zۘ4zmSS߆t;J,uBuR!"TIȃ5~#y5$!t$cClzEu]u&fr^j`KJ E#,6z~ M: A2ANvl1vkB>܀سp?tL“712>9X+s:ŀx~ϘdcD>Xv~Beo{lP3\yEzC~UdM"aiK(S&Rif챇mOt<#5VZ:\XJ%o|~&b A+: @#50Y3zta/da1A_?!!a/ t]a&ex@=IXtQBׂeuүʥ>bmEoOwYmuw'.pQ̆!3ss#u1ygW[#saI $(HB?%6 LOya1ZDoHj/a|bB/P2w3ur æ;qHqKD[8VޱY~G#52y_~eu]fWx /}?30_}R6-bjy;#/`o~Vև(uDY_s j&8c_yfeG4ʊ$zj1rVaDkZWG-g2mjg}ag+%޳6aw1rNNs5311P`Kty!woő`N1/(Kk*>$>@~1[+9RqX̰r#,&sCR"&H<Lj㷯{(ػ.qAc?.hD d(|m7#/@OmLoO`^.޲]p0ttWG)xty(kawu+u-j߮(:l ^uyɢ`Y-Amz5yT禇˫ѥ"ߗ '9i#5|f"Ώ޸] 1z1[ĺ|ZӒ"kmYlk=x|DYe-bBfGC\".}yfn޽5Ϝvc1#, Eb"P>!#޳9NgLOp޶f` 'e3h 愀)9⬣u49s"➺_Mُ75L."H{upUg:z8]}ߚ2۝!@3'#5|#/y;bs*/ΠCxo.^Nʔ:2t7OĆ!8Kےri(ۈMgUb6vLtOt*ddtjC~yRX~Lw$j«JϜf.(|v5|cw1Y%;;v{]S0{#5O~aSFҺ}#5 SSa:; b4͑M0v8Lu_zvZ9J =T*;Rk ᖦR^4p#5~zHڞ$Op|-a{#aPt΢j+V3ZmY·EېHD۴BdBi]k%K~fQx & ۴P18G $jŋ%{jYBD^i/80(OD,|-$ʽ.kstӑM@/( 4(@vχ$葠9#ƍ_#5tM4aG.q"I";Z~˰#5]5/CKKSdixj!q mAV-#b09PUphnkYB.'Aly! wmA/ҳ4޿Yw611>o7?\/M<#5g"ѠMSfZtY>"Y:u7R#9D/;+:L20;.RU]>McNnI#/O峿,M61}^'[X* J|wsiH޴V<>O+7NEȄ*jI@JH8;׬su 0b.TStǪJ+3Ndl%fg kDI!{H_wۆ϶>e(nv"Vm@{y OAׄy \ޏv,TN-e{ed:*gsC;'J~lHg ͮEW7u+luSfMYL`fe#/k8 uq凛9,x$YGCMp@pkI_luPaw=Hw>ɩ;qx,CʍXL!T2jve.l: esj52"X~O{{ay}ۣѷnVKJ3lʺ5NҖ1,i{lӅڳ ucNi0tl_6Κ#{Ag<{]^sS)Zijތ@]ۻ}ٿ<0U&7ߵ7Ȅu0$/ *gsᚾ}+ 97uE4J ﭱeO"&ܵ*NaĚcU:bxx*Gsf&#/f2J&fEVfE*8R|ZV2r8MͫKp`}7'˵UQy9ͦQ#/(8zXiKe(UW0~y^(:zKkǒ dVjNJ~nNE^P4Ǝ#5BGeS i)lO>hfjjf )t~3ߘ BS/jn+o%CK,kUE.ЇHVD/$ۻD|v>} 1(ǝqEٰe% u2i,Ѹ.'gb9YV#5k6#5*t0#/2RJ~G`jM]beqKAJ`bi8!#/w=+-W8#,pCۈ\w_c]gѿ_tyC9YHfQ5(s68e6;iDv7:Lӊ:CÎ}y!!T}E#/nE Q&Ga #/=4!Kki7s;cQ(>=9\eV,,Y9i@{}6_w0RDXy0h~=O6{k1|=9Xƶd{<ȽRi##5;7PR*&vlVO^55q&Y_f_#5mڕ+ FoӜpيvcgUrR~y"ij!4f䋝dKm@(wa=Ǔ&Q\'9݂-ߏGlM,]_y?dCW6#/nP<W6쭲)9.9>sl:颅\`gvՇ9>Y0k|`6U%b[ya>,q+Ci1by3?T..>)xquzIo`5qY"c0c5-]lj1{bٚccGN=wFz^`#59HmjTDN#~<&}n. Eg: %{½(a#/8knXŖS4AT(qݞ2^M}Pm͵LtU#3mk$䂄ƿǡvȺ_=77n A FQWbr%)pr17 X۟~:S~:kQ˴88̄q0k13%u0#Pè!(##nj럁f](h0rt^DYU{U jz e~0^+cxXuFOUYbpw *wIsϠZ.7A&ATi$tny[_qsKk*9&`e>U\7&GI8~_MY+YcQTkC+g.U՘.45םgS{w3߶ nԷU@\l#5Z,,ndqrK[߈j[%&LPI~ba-#׶,Ps0e^8;='=a ӣM9YlV= ;J͸jV}g~f;P>w맶ZGVOA@%[?GxQD>FL+ЙDBq8;:#/y>1}~G6SA`''jYA"aKQ=eks=Z>'2ٟY*v}7W=;cU%b.qJX\@"j.6IN$6$RgRDuOA<ޤ?GbALx*UVa|OR<G7kn#/$5FSq#P-"#/ )"bNc{\`pRK$a-":\Nk"G:,dLXTJ#/p/hQh:H+P#/ #5ݙyտȓD@ޒx͉.tJQBa2Ddݠx#5V}xT1+\kgDƋFhU<C{JXqտ: (8<&'[_}fD8RH?]; F#y4IO}r$Ւ9J>pm9P{T)LHqDBD"S.ŹSHB3B= 8?#/IJ7ysRT4S4RƳrlm4UQ֫lm ϟgzag?q88?qGzNs,Xiu9r4 w`],͈C-~F*^=C$%Rff{6nkKIk}/eʆ(&?)#,Z`TS3|sVL[Wwt$N ҵ~aA|!K4i#,,*!5@Dهgp]8ԂXd#eJӥaE"E|4:#/_Qqi,BT<@#,6?i`>|v#aGdC1 >J 46}"*֦rNP Kb]; #,GD6d6Qbf(h=4xė9F)R 02!IY"{Owy_#,Ț># Fm~n5UB"{i{Ty7, ?_9Xf&f4eSu0b. Xr!_7G=/#,tal `6#$3<mFX =.Y%z#5nU[u<hqkrI F5+||ǷHIT|U3z5#zZ&`\SXD"x NģuEiVeCMfD!cGX@8l|߯,2"H~xِ,"s0F3ͮX>r6WUtvμwCŢ$G$I#`~ xa>Dyq#,u(KC!%px_GK7?h(w|4fȂdBދX}AɃ8)ID8nHtHU]O<'Wp))BCx6,M^#yk#OF#/Sf%;S-QSנg#,qOHPF!d㲀~0#//\n566ןf@x$X^X)gH#,QTCP>C?3OZ}@pH9#+9 ~~pm> ^F4w_lr  $({];7paެ{E;#Dc;x$dl6Aç]qwAр}g"D<#,;4| p-9сP$!!|4ȳ֧Kpx('B&Ex'7AjXGt" :dCp#5 )t_dc+ }eV=(~t3yxh *(k-A[06bz$y\U=@f{8-@qͲ4dGH^}3DIVWǻ?> ۦrܫk|[nz$F$A‰`(20*u4Qf#5B߅44ʽ~TN;:)1Jf &aQ$&$0buq#&nO5NǨǠm}i-#,ďOg{C1 xX#/_Ϭ<*B2 v;DjvKg''ÝX0>+ۿAS#,6nrt`9+R>SAv%V^}ML7 i3ҷ?)*绶'mYC^cCh:iH#/3D"G[#/B31tF®(wfCOj6ryf-`"÷خ[#,9R|;,p\q6{˼ *{cx۰}F`0")*F >#,d1EɊne)}a2}̄9hhX\Wl1CWlhYy홤wNA$D"DQ D]~b!.̅Qg}Mw u5@bIrI2qDf̦BLHzѽ`.~P+gP}BQp="#5 P~ X2b`hXPR@D0!#,bE&Idzj4jZ`RoaC5A#U+)'Qҡ@ m&S3oy[;skZفB#bA#eSmw^xˮ[Q{{>!9諁$:`xZ]kupA>@%|( B#,U4ð)^ 8lBB)#56 %1:hfȁ|⥅o =ve^EyѢA 7'^Sq2m80-lBɣ4{^w[F#,fm= zwwXʕ!^$;g"ظn骔UQ|7+?nC .Ij^THn}`cboZߜ16}ثKL #,$ &Oq0Y J<$ 2d#T@s}h"r#GSBPJfXu2rrٱH&*7 "?P>'п#;OZp!b÷㛁$! #Ux37^7Sɰ%by bȱ;PFKdZ*v$exzOgG#5M .JGD|̢RN%ي+.ĩ%#/ `i1;&(rE2# q8D\k\qxe~`9hTȉ\#y0nxhoHAL#,T7#/ l-#,@c?R(C.L-zt fǨu׾M" 겦#5.DՏ X9r:P׈{;JEX`&@Yo񳛹4^m@1K I2mN/2Eh0(^I},#/P $4) zj&D);&$M/9ѣD&$Zf12:6A{Wn88JnG`Tv)$+W <L!{+>U#WtŊ2-#5KW iLY_ٲ#l #ݟŵqnsTD?aȞԭ[i#/ڡ+Хff,x s&ЂAxno++'corX9oڗO>_õD~G!W*z&*|O[|vKyyZo.q26 j A ,L~AF hinݴKbDɌJ1V4J#4(P+mu6IX^F *4S g#/܄+xpKf=8 $Fh B(f~}BcY$&1t4AebʍZpqy :0G o~HwtGR*ts k*VLv ;/7Ly{ȃHDS.W?=;~c~/V@;Z߃lFQkgxګy/3bl~Ve!/f= rj-"N Wڐ2t3%'3@@D' Et@?c.ӿuQ챗#/7dr*!9Nc͏qF;O7BbqaH̀>>tɧK71n젤WP0-PBB$R$R#5"Fd(;wI2dxDrdgq!w 3g׶[)6hJYDlDt#>j)P =n7*ہA'PI%l$d 4h@+!vksZ~S!MONZ3h>"#,R]"AHZig#/y!-p=3UE#qVyO;#,&U^#,V#/ A/Ei$ж4H,-+[ VFl/F%D @jT#_US$hd8eb퍯\%:LPKw~=oRJ]fY0nEl{8lZ:{V*_8T50O~>_.ќx`KtymG"k#/&j-ҥYa]XR*,$3QGeR;tḍ]>mtNxPI_:wMg9y9+7=i<ь1!υ#51E㓶NZwmAߝar;<邺2 !(O~gƓX;0!sG;)`ۧw\#/s%yOnpȇmdE,0;% c-{U3G꫃~s|m΋fO5qow\;>Ð1 kc}_XL:nWWwgL:Vϛk{ީq:n={r7 \;=T ̈P1󰡼؈Q#,("0cՒ^7R@̄J PwASkw^ElUN٠BxFsd4(V*r.g]zBeY.Oqzydh'̬>Si(ab`&@@ rQyW:Ф5ܒe2W&.֊cfJ3,x~? <4#YXaET0PJA 1QL{8#,p}郛!^^~c^t'E{(,$!amaTbj;[!tvK.}ڿ[w}ƭΓjCY]4߼]MC7m;Sxl³d Fn`((YM" ]VӌA&LJ/ޕu[5Re,oo-]cU!%%TN!!Qn" z`m̦6~I| 0‰! +(yr.zy KKcDw}Q&;,CbٺE \(B,B&ðvȆIg1G&6)QI'72YĎ{o믉|]T-4d_. 01˳vyhzt,@zl qLB3v۠ztjZEYߕ/5Nzᎍ.ԣ)mk{Ui;QiL<4h6qcWPr̜"#Ӑm!wh^Ǝ\a[YNZ)lx4S ^ds>!4b]n&CF2g47(e׼4,J'j=f)c M8M|9ewCF $dIk6l~zɫR{!6R`jӼ'D!22$.3HQ^5#yq3ө)kyz,|cFwu  ;#/|4 >8Hkݡ9\x:GՔj+ܗ7G"&(pzc&ǡ q9#s os2,m#/haX}ԃ9oVqwx4z/s9L6mt^J$9^s b;xb\eRwX-H/Sd @3çif׃>Ooqc-,#/M,~QÉ 6ԐiN<Ҧ2 1ٴ׽d$ nyJD{Z$` L}\]/b`ȉ(ܤ&QD^"@g0Ghj{0e! \(Bg@= IMmu±)HHv@xd>dj;ɣ`DCɡK-!fBAG1iLi:6/b-j~`33)JcXCt3(Hb0#,] ;x8!=f#5E!SNٍ9}^1#5 !`v#/s 3n%%={#:1@9s( SCgU@,lKd\SU3X712Vpne.S`a2=͂!{dk2Fz9.ХaO%PȷL#5d@gHzNcpd#:7p)%l9{^Ž23^2l#/Fq[*.IeRPY.s>Şcm]ꮪ]yv$:W.DES1;|8)5sZNcʹ>۠Cndm#5U$53:glf-r%a=MXȵF%F#, q.&gE;-(j;2a!ljofrBgH"-3$(z}&[iu&yŋ]D >͌:?A!=0|xJ""VE ږ,KINw]#/f^z(>%.X`**,F"Y*( BQ^(h\!:.m6#9 ãǾ0?Ū? I5}* }zvgk)4ڷճdz=JHl=-)#,iϠ&jRQd) M"HAHNQlƀ9J\iFFMlZ)r3O:9q۹x .^<,~.T4=('k{r5{Ue\saR| " % A& s=$O}4#,TfD@7) @;S(hBDwsҥIäyk1EAPpV Eʀ?A&F71FkpLhc M`|{LȪM~eh:BH #,=fG@ 2cSuQhbXXP32[ jFO#,kV[tGɀ+@`@ $E.(A0 $'!:aDD$E"DW.)$[u[O.';tUթIlNXk#5iB LBɑ6SnW,jw^K{"oK)%4[ݼz\175K˻5k.Ά74b>tk&OR*x hD޿32FRbkͫm`\ q3K`Z6YEEb?)'Ov+EcBu‰QCț0JEj+jNIA,У3Z$`8r$RU"qQv Dd"F,Ft#۳UHA1&OӃ_J 'e#T0ɮ\;ҒhEd$rHJntBt)%A~,D Ǯiu.0Z]]mr852/6݃ȓ8A4Ra#5\K!1#/#/8 U^!%W/N/us@T{0徨(oɻnj좍AѳL˗e!ə}g(!EBRuvqܜNrA5OM&t#,(3}D~@ BT"j̢,'IחQm 94RsfnKc@wxum>ga,eTJ$hdTwi #/mFEJ$*Z̅*-Նʊ͚*؂N ' mʓ8l|a2 Ȩ(V#,@[YLopBT`3#/ U$̌i(-;#,% X8e:b=sz#/|U_ GFLM67L(sCIFEh 6ZEWZ92銯ڶD_n@V@۴Sc :hg=9ҭAm*]%]%#,ܿ;sD*;6Oۼ<6ޯd͚̪*JekrY+JfœEƵt-q+*+8(n#, @A]}z>v[it .7|^ z*,Ă$N"}v>:ٻW6ځ9!u.$@ 2[p,)Й@e*?K#5)Q`+T:n;N9Xh)Q\X/$&IeTi'T ?:x1#/o / (gT{hbn#/bDgdAcDHӹ2l`zݞaW\0ڂDvvudC!q Y:@iŢ6AU#/o{d䀶x$ U 6$cLǬzsE#5PǛ36pBAtʼnaDp@oO " $(⒢T;5<Ҟ1gN\ހ܄#ŏ~RBֈ)eb]VAHz$ #5DHx2#,B1X#,d==vߟsMjX3 vN#5QHFO~ms`j#/6#}@d#,  `|dSdo(ߞ$P8"[PO|RMamC. sgBL̒eZmr#bҤGHJ8,Gt>4g#xVcmֿ[DDL.z `tx~{Ss{.7;g֜<ԲZF[Q0I~1^zT<-`OdΙX۲X-Sdc(: MrwGuVlZn uc:K=VuAڨFjJ5C!+B1O;#5<>?f×˻щ\^6&3Xi[}^i8 66 `ڎ̄G;8{-75 hZ]zэ修Z[[',͵&ff@ J0bc詪&h 66mM0xC"o)b/rޙ/f_#,`#3Fk k FfiɓX,K/@lgp½v79isj.uCqѤFa" L(8A(2p5S(SMUJ,b1d;v%D%&~ԄȢ)q=DZ CDAF`I=h}j#/PwL!!sDNj1;-9#,rFT͜ CG糐xM}`z| jFB*)ZP|*o/FGHqB:lN0$=HDg3vkRwL qd[ 2!}c+v@VMAF6(,O#/ũ)dR%EԳDuKk^/xLj9bԲ! M;K SIyy %l+[ھhjFRȫQ5S b4Z9^PmU{.\^oߛt2D.E#U #E0AuQ- YJCGB!#/>#/'Qtp#,#,r#ɍC C7;i=h%[,9pQ9lGJejĐ3&޵@i߱M +e~+I%KL*dž|v[H'$'ӁzSbI"jn]h;ݭo#CT7!Q4#,#/$&HYJnBGA8Xn%(.db$P(a }h62`4LT5Bކ٣I <}O*-2<[Yi"mmĄV#,^a_ #/\vHPK#,I:RD#C.#X7`q/Ȣj֙" wbwXD#v;ᶖCdXS 449DGC4zwo5mx30ᤆZt6]Od34Q/|r2oD,Hu#/}g#cZ1C%ґ5)$6߀n!4ZʻI e@̝\\6NF¶n$)pjJ~ճr6~~3С׎hPsÅ jʌ4G9(!EUC377nA /N6A Q]\| B)L\aa{ylj -" ꄄTe,9[3CH&%V YAU*#,EV$:ĒA̻F$*$,#2\c 3֓=<ͨl3PA50t,-(jىI0̋#,o)MD2 lF#55`RWG'V/yeoˋ$;T2.; P O,HȅEDk-6PPrQ'HŴ^S܂}̶IMKue%#/OwQ9o̒$J@9:qi#,,F($/d~F6#poK%EKF T+ntN"s-qE(Y? B+!)Dl>W}&ϙk2/;I3z߅jwHeSRp0{&q"TI[\Q bD BNKQPa0NmjpvTs#n#/~s_{`sp#,*/Z2)Mzw0doO*TW48:%(Xr5gY3Bnc1o|p#/7[sQ!A9.%Zo-wJ,i#5#,U@W@t`?)@M5B2K '2/ZK@K:E ȍ #54 ITpǝh8ٜO&WM8Z\a,a#/ROKl=a<VN-ſI+p5AI$ Fh>k;5y2z/m5Qvbʢ'G0 c#, ϗ;4 A6e0!4ǥ.ƃ&Ǝ%"n3MI#5iI#/ #5 E4c=[&h&AYb  @#5 Z}d @쑿ih`^6wnɧU>0G{`H@ GYn#,5ӫMc=&1ƀwNGG"a樌^oq)8?L`OAM gdw!B*B"svYƉl6-oȹunIKmj6Ԅ`EUE$A #5i#,zȑ|:iC$[X7zЀm TuVzqHD!2@H%2RkHS$̖blZL2d6T!#0)6IJ̑ۦ&Mi4hRYS)#0(#/ID*hR$IIbb QPZ4M(EiKQ( Fe1!QMgz;8,09.ۜX&A~u=Jُf̈x=;p%S*F9.e :y~)W/te#/D!$t2X-q1zMF߅7y9,碓칷[BJG6k˥gd$|>/}!a h\#y,P!p ^F#, @9/rcP,SiZMa4L$$,qpx}miTx0QʙL1?bχ F=D؄}DM ! Zť=c;Ե}"DcqC‘[oZ}>rd/F t* J^faH1ՋZ 1d~杁{?Wݭ۵-ѵcH%#V i8$i m M(#%j7N.""3]{DưAarPOezAiB|J{L fev^`G$YK#5<@؏#@e?o-t;͔@kb<!C $ba#/}CogZIvƤP`M2!F Ӆ-̭;Z#Xe$|2}?VlfIԆ)ZQWo a31Mf.2^By51-,.KWZ1fޞ1`9۩LKКB$mJ 6tAIΉ>wwws!YL\.i T0R0JtɞOK7?z~#˭;"F`dά#5C0jv cTX~ܷ1Rogr3% LB 2>t#/<;;, 7xdC@p5Uƈڜy(a\rmzW2ZBA Wo0q52vس/uyh ;v[$33u,fwcbRd,vrh L_;l\;Nq#,X(c(He5-1”qDW;4Xa&(~]OuێLsx)ns/x.>Y㦫kL:Cؑ26I7= c-lvۅ%ޓ*oNdΦD@ߙ9;6.n%G=a읿n ˇbs'\R]j)XqMC#弗q.gx70ln6i¸q-n#ll#/j&(]&M7K}KJRrAa`"m86vcpLc+э\Zsl\#/eS!(BfkKZエk**)jݔJfGVXnC#B(Bۂ i#5'Ks \ ϕ1GQmPrIYM1C8CG2>TP.e[FPaN+img`r5U/V@Cd&^,I53S Qv9 Ta%3 8][PJc$d"mKJPTÔ3 31zCmΕ`LowB\G,A(Y+;tcI7rX<5iaNF:tt4 6XKe:G #5&$Y< kCEe9ziDSQHn!s(aMd&U2LTB@O6fRTQv(bȰ2P40dzݘphU-`J8T-!jYlY)7P10`aVe6IO$a`J^AX6ҌM +dLRٲ[,Ա2evgrxVE0`QhcgYfΔ:]֩ZRz LiM+3w- /с!+)e#, 8:Ha <>V-gnK`lErץ}Ď`G+PP}R9AsI`TiBf9h'Vm#,@ ΆEܝ3#/L3dJ׼сLMmH) #/#H. UV8(|WA]GDXj(L :#,߱ou)&Z7-m^%-OnL6CCۅo4Xn74"/|#-J:?ike$#3 93 }hELȆ ǠpqD` #/AĶ@ǝh۲MQf&GcrV HurU1.I8ɽ0(v)7Fk6&¥$,3HB*و@c8pvxI,afл/Y%z`XFuCTk@ ,׫z6/#5&i`pW5M4f3cm,Oq5#;pd0r\A᭍ʡJ,&0 "B @BEM )h RJU#5#/Wx;wV춌M!>cNTzqB#A!!ApV^;U KEj431[>q9"_ADpX[d.Ћih#5tݺR͎Aid-+X#dk`(o [FFK #5Mݧ`b̸;bmMv*|.㩴8KdB$1СU{n:kemi-m&@U P8C#/yPJ,Ъ1:z E[g?P;q: E]vM+okl%ɦcI]wfsuQmy#mg}Ƨpg,rHȳ"Q#/F2>Uq B0#/7>Gއa$RQ+F%E-35PhE#/ I#,U&aY_hS߷qLC]N*~Mž˦|}95v Kى#M h$FYDҠro!{M@H q:-'e #fu/V*(~RH)#,RZ ;#,v6hSXd&AUh*1"F#tJ4&i#,\% īmXԸD1!pHO3pL\e&EK1dfwGbv#/]! Bj l].t$ q.[YD*"Ix,؊(FXB`>d0A |A$& ?mFƆ~#o] 35o]Ȋæ!Ͻ k@nmpF_ol==1ɶW3yQKc+Ch laoZ4cXEz:ҙǥ VP[M3.)dCa074#53#3fi&;dѱ!6=.٢@.I9`5#/#`keL;CڠҖS3:g"K` A=:j4Y%v~g3j qv6K:AF%X)r)\d #,T0L1  C#/ 9Z$#5YE03#/nh/[棈 ? RD^NFe ejpH] 'fn ?Q?TpΠH5$L]YG=#,Z@P)^ d#,NqNU4QUUU#54FH[hbդU~+Ȓ8}ϸdhs#5}#5PO`8:ubrakwG#/dA, q2enjMtuiub;EF1p1\PitR 1;K4yYZ:ݭt &)U pQPYbȅ13ˏ5B"Q(D еfK-g)\:;X3BQ2qo#"찘J|!ֵ̕+;vՙ{o(Q4,mM/tQ6e)gL}`dCR MN2Jc`Vwvf˗\ ,,C "( Ő9xokeAE #,PJ` F2<݈ Jte.%qZȹ4R&nĉ@KB҅8Ѕ٦#5:zzٟ55]ݒm[}F.KawsK\fηs]Nh6Wi+rݤů;5;Ow^o5jB-TjCh*i#/#/ii"V#,n^62I I6V6ԢX1b"C0 fl#/+[IQY$AG?I{%"Й1}`NM.Ģ-"THlob ;;L'^aKZYL?yb<@#/NtFLJmz׫=TKy#,UEz,qP H|{LK8~L/B`BjԂ~#5lBfhZ4XR#/BDd7Qfv[M)a3ߥ}9-X6kP%,jT5\n 3v'ݬJs\mje2+@̐3p zϱk#l r*+xg"DevJ9g 끑t/Ѕ(7$txkӡ{ƤkTcEnLRY&mfvc-LԄr(|[[孠޺fҢYiElJK?__&m#|)DgvJJƶrQmo#/ԈY5PH%A@$E 5-%&i0jIk)6ͦV̵SE*Kb#EL-0Pl2%I)B2)(5&T5)YJjE(%i6jɵ4,TIYZPlH$e)3jdK61&V"FԔԦ*֥L4MJUK**|ݭMi)*M6mTi*͖cZlZj5jUPCIF9/HpnNoMYHe{20cB'~へ hY$=!^#/)Du/1_n'=Pk4#5.,=,kg]b٠3mezˣ>2A1`ydE,u}8MCFlt+YE Q(fIQ֚M$DDjXU#/ #,;{dkX',5vK60&Ӓv~#, 1"|uE.y!Jӯ2Cst!\\:q1"v_ B*750"t^+A#/tySyjzMI!4#o{a^E\^iYOW<|:xPӷrNA4btG R]Sc#Ng#>n,DB!L8r$JI֥ [JYkmGmȶ+jY>!S@`FeAB*\B#0}ז׃d>ɷ#1@ð3;x]ܩq@"Z#4ŖW_x ,Bkd+!ՁE:A#/b`5|ܤ(B1UmrͲ%6W]6M5jX,IkQlh?#,a#,AP"P7!Ba1Na3BUk0+"A0f6Ŀ&/``i4` `3c0-*m#,AV4Jg?+U4;㺣,7"I ψ>;vI#,%Ch#/;ǑOYyvǺ.uQ!«6FnCw7iD=wyG"T"q#pvv- @Y^F#Kj(h bXTe[1nXo:2 B?PCq#/e؃=_0[=CmVKbRj,muUKji+Z5FŘTD$A% !&#,3=wpAWVJPe$" %#59#:BaXLhcAُw53a Osarz( 8%cQ:GU,!Hw< 1HR**+vQhc10*5ÅhmXp[,&#/ǟqM+1y~N,HVRhx;;R# 8Jf՚0n(c<1Ыr#,*MTI%F8Y0z$it6uuOb{_zi|N&M~hֈb-"jM$%"m%21֛2hJK?qeR%XQM)i6LKfJƛYM-d։Pj"ZQU-*kU)h5z#/iO?6d"f#cD5$AJ Zj5kZn[2@$dHbuC~H_ro[W(MԿꄉ ˔uV,#/K>av\#,2~:(۰`ܧ.Hw`w0WAhDMzӊ A2=PU*PQ/j[(qXO"< ̕mB$!=L=|⪐h"jD98'ݕ2337}&$ziDk*4 @<{G#/gA'1#,bjIķXjP3v<䱬N Hw0lḆ\\(Hġk<!pI0Z~g!G i|@4/Myl&"Nk[FYD0uű[dBdbe^^07 sC+_} S .6i@11f&K>^&m5F~RE AN䥂(#bKw>d6kG:htt#,=_݌p2ɼnHcT=1,2&,KQCOun4T$Y`UD)-SƓ~˼S.(۠XcQq-' ˆAydfe@v`bqLq m]*HJJdݝ-tvw"\++6-Ky7͕E\P3HoVLƢ"3wkMm*o#/'Eq8A-H0z ] ,ӌQU̜<e͟B'0rwdj*yK5^P @3)c޷ԺWRa0;aDȢ߅o}g%.̡T BIn[FRP#[$Y Ti$kҢf/vAW<rG$bBLCh~Ņ'6A5F#,7Oߝ(F[$&ZJcnB?ja䥅Jk.91-ax}LQ#/fξ@kjGRРٱ]`B@F(iR@HE(f#5w:S tEvoοP1u5鬙kbD(uv9t` xD$6!UdE:`VAA%ZK\Gep^j<}]j~hu]vxPD^QZJW 6B #,Ƅ6% 1(2*TUF (PH}WCȢP;{kT `SU(^W{1\*&GaW0 n(w##57xnmĬc[p(#5a;@#:/2(_R(Ǧ9Z6IN0JlC*Dh) 6L"lsEg6f%YSd WL ƞB]0ȉۭDHٓ/mZhl0#/s`UD7wD01l2{TEO8 pB@u"T#,/-֗77KcI괌#d=^ix=KZ#/'6᭕FsLu8&:h)#,y, *]ZRjZ6eL֨RU["W]ڹ!(`)(Oݸc!#/ܑcVN}M<DחnOd`:g3!#T%T@DgD47:͟v ^}r G1+>irC'*YC(9$ 2idHA-"g7{=ـ/B6.W_E+ Q!yV`dvʗRڝ՞vӽl[zt֯ћSM_uҕĝVxțFFRs$h1j$_b7蒤=? Ǖhr[F*&k㱐xjV#~HReulLеd#/04孭Io#|Nz>P 4ǖ" R7%C2m﹄G#`#5H_8FHTը,\J v,nVi6ilUu[7e4\Jm}Rb`@E9q`@:DoU<Գ5Dz"*45!>MI3lAlcZ<#/rģI-{l>@ kQ LUMFa8֬bE,4#/SչW#/6MJ16߸7pl#/_p6h^on,ES`[`]Զ#5hXUջDA RF~VZ*֏3%Hk)JFl(3TqMP90yEAug#/TC~z,^G"`=T#/*UJo6M]ҫ!~ԡ{aM dpAlMH?.xS>Cŧ1M|,d50n>03hkľEFo5qIE.8<<4fji 4cCU5ٔ.!CF^2nNmEv>a0cc󱱗mi`Q00!OeSiAL]-#%/F 8]T(I8.0ayExѭퟧfpuꛧ<#5Ԥ%q y+ҜcQMBBniIłd8Γ#5<0H:@i}᤿5K`S#/$S}aS.=qP@o "ˆZKd8("|hUlCHMq2J .Vɼm*6mIZ*K][r׍hifِ§v֒Ml#, BAB2l@PKG ;Ȩ)Jkauv`Jl5YpMZҔջ-Zl8P76XjbH2@'%|my3D[kF.>/=e5)ʄ!EV񫩕I?P%X2ض-1YƣTmTͣEE3FVe$RŴ%kfv#5$9 Aﰡ:,֭{{#/&Մky_W|vm#/O:Oͷr]VÁP"#,H@rM*+~&\J[[v"V)O7]&ki)&m&VқVTW[KIQM!6^ A~jIJU G&0A F;JCay8 XEV)!P\7JW#5#/xaN"W]0mhP{5>o>O~#5?^H)AE~֕84}&mf,FE[TlcUcJY 2$hNJnLc,zdǿaCsb-PZR#5(P !gꮤM;:>$Q8du<^wᲩ[5]mY`[hƂQg{42-?⠈#;fu`vHO*Qt?0T!L3KܺnE2-!`yf@<`MmcTm-_}-HGLJ&12g#,KEdχQlՍZ5\յuX1nǝ>pD  <0?a?C_XZQA&_yqV0%h BKF@Xͅ؁Pl4$ڶvվ5IQUMoڼ݉ƮJ(DeR{%!a#ZawiZ{ҥcl‚L#5X*id-Y*  f c Š(T(`4t6L磻\EC2q4b( 1T _IP#/JKpc4a`sqcfL&CsWРqc0Ԗnݚ3@9@zDTQ1#,2vIihqX=nGo7ggHUy78~XC8GG!HC{z:\9pXɟW𶖬1] q{8띩q8 (΀TǍPUA v&ɷ䘎YJ蒤HB e#Ixm 2#5?Uy,)ji-: [G0Kl@(`-YEl8<WH#^y>;u茒i~6a!gtDž+Qˮ645A@>AEU&+t\զ[MJ!VwPDw&V3u6\JհfӱF{ͅwٸI -U#4櫆I!g#55jLRg AέR&HzM!;H@01B"fou֭mikʟnջl&4:d'@k:dG)R0 L0)A(#5l`|SCX @#/YfU4֦i/#,1۳0VQ#,umlʢԙ` *`T#0FJRRj0'P"$P prꃎs[S>5\,AL~>47H΄x²gWLlf-mEwc~#,b BO!{?=^"E#,e08g+`_}CyfHC I4>7z8blfh J 兡 #>,-j#6 `j#/$Ւ1W&h8$B(rA#/ڲ0@Ed&1<#5b#NMX; AMX`]Lw淈-GXjW/*ⶫW5Rk;fN={nj0#h~bH$G("c\<. Hk_*-jFi,%!Q*6TbIE#,5AE@w@ALZ`m6]CAX46Y7OmwMf#/bubF(yC?4Y53AgO6zƖlvA[>pZJ*m5FvC$MUtHF 0cKOxn]!p#/2Z}G%R,N 2MOBPZ Lڽϰtvc#5vbz"'/#/gyA 1>FTWlAv FE"HRD'#,#,C"XS#5`y`~#ި$ BﺌP>du`B#4趿nU 'oBx|WӗJ."5'ᱽ}P9JH( o#M-6h%w̰:wf79 Ӥ*cL@gТ\i`z\^!![$f4XBKLȭ*`&Y4n"Z}_$?/x*ۖ&o#/hHba !d;_/Q}h7"/:x/mۙUT`s6]Y3P{4֚;VBEe0:vr`4#/'8eFjqEb",q#/#+L m-0fQ2grI !.L; HNUkbf CǯFsSطR' Kv+`ǔ7={9 lGf-2>#ݺxZœxnǟSeI|>:lP#5.^)Iz npLMf f揇l5^.Jud!3@8)PhȘz#/QO@'1k:#/s>;YZ*ovfaUAݞ@J8EuBscŚ.oAMı @ipn"RVeA`T#p@~K?|v=0 iL$DXݖY` (4m#5h(>1m#/?9MI#5BHj}_5}J#/~ʭѭnDFFrٚ@7<*Veevvxw$NIY|h"'d_UwH0KU#/+g~Z}/0#/M:14=ه=.<4-Pr<ΜD1mz-jq admC\j0լ-KT\c# ^%#5I#5jwx<C3hl&W-7Ao@4PCrA)FP%DE!] O*܆~ҿ׽m OTۍ@>]`*t[6pbZ`RڡoB7#/]}ٜf hq0X>i Nm(v$El2[Bf,Di4ND$119#,(`P腤䡬GV:XiǓF}#,cm6&0hT"m#/,)^FJ&{Xg&AkcG6L~cA*u6(&B-#/4cl[n1gM#m>Jash(˰֚b…tDTѤpEНUHOID6<yp4t=(YeU$9H|m'#,:hF [s(ؘ;0fȈi-*@4!BQ bJ"4l`^)"4fjܑi%0**Mw-ݛ^M]WbkF Qd`!GQ#5?w#,YCBd1#,.&OϺP6$-ِ#,.v~O2E@_3#5#/((B2 nH B"ȢDFh, B'A9^H;y{m# BR!KFyhˆ7wRNևuדxŜcn*sjG%⋱tRSRHC)gvRKʉ#/0-2coPDS{n)ZƸK޸k!`6w/ȟG]!I.6Aȿx_N!q; HHDF*;2 yg!"^gUݾt48Y/#/H"L(pDE2%t`Y{OGwR*mTXt\T*#,;5k79O.|`Jٕ[Yì"hFb"TY@hZўS~'c5nZUI'(i(0%$٫o}6rQBT@C!U5AtKQV[OW4m淍_nkžWbW[k5shx;Zɵ!nk`[%B KV#/p^ud5\W’,b#HaN@{4T8"|@\Gؙb4c@I#,GĊ #,z@?ˀEKomW$4P!S)J#?q @>%X)ԉn"ȁUEl﵍%٥mw#5tX.BT%pZj-j&ںY$#5jK6V#5vؑDNDQ$VHAT} #,#,tP*'UOFAGB&q #5!zMX=`YH'J^`d:>BbEcdR@l14щ-3DJI2VŶVJU*ũcXf^hik2@ 91ȑ>)pM#/1<1HEd%T5Ah GGX"W#5)`#/eldE1T:UF44D"22*T #,fiL"'k&%Y;7 O®׽^PD AF B c#5Fևh.*W N0^6shhyKk#/EU)^}#,1 6۱!77q)2um:;9tM`,#5Y!VF@A1ީ-$<8kbHe.#,m“$Fb{]5LrەFU\\ֻ+kA.qY DbVU6dX|?fm8A凔}crB'Ä͸=PnO12R_'v۸ϯo. eu={pliܓ;:7OKt k/)΅-ۏ[/}E/,L'rB9]tMߊkGWtYA3[5lJڇEyF]!%#,WN-b2 ttUuĶCLK7ZXn?v#,:ÙN-Q67ʲ*pD5]NuDTSLEHEmy,[xvvb)WbOdbL(D2Swȴ;KOy7cқcP4с*mWϒq[kwy@co{T<#1܇Q'wb@뾽ʎu~HR*WOv5>#F#5wT 'RN rld5T=< Ax@2#5Շ&Gc'!c#/Xej#/*ԕ 9A%A\=Z?|4G(="LȻC=G/Kߞ<>7p%RhCِLs;IH)Y.$gF\m>Ӝ>OzһP{M9jj?/#/ۿk7UwFe1w16 X'#, JķukL9w*Gn|Pz il0;8~kFds$.jS$2*!Sږ3o`b#4@R 8D悚yvvb;8=qIzӾ.ThnAҦq<3G:M^OKp| 9#/5U #5h*N5Qu}X5EGmae"5#/PA8N) FToA\p Sh%V*RXs)fVjrʌ̕|Lvl*C_mPX =;ֈ缹e!M,-7R3u3ey@((̈gPy {ʤjPׂ%:f,ҭ&CcѮd҆#/&B\H֖N,a$߾Mn!: ، ;$7j0~jxdjl#/~T~?"%>=Lo25!*}D*sfҳ1fsWD<=^HQU:@ZXCVFѱDw*I0 65'm_okV-C0x5EƔtZJF08 D@fޭQAksmͨviGyYUSq"T'+AB`daLbBQVd{&0dUCw6=>rFaFvO9"}(Z]`@U#Dj#2Yj2ZL3^vEޓ')c !b3+nxK#c7l܁AAlȱ65љIs{)FmbmjZ#/Hj0$_u*qԊw#5Fu(3ƈ)a)pM,(PcfHSK21w̢xpk3 iY.lo! RƱ@+\ФIR7vmoĨ#/)l41lBM[:J6jje*XaLV1.ۗKG]Ȍ3Ek:@awm hqi2iq<˵aQٔ~nUJ5bࣄBc9GpF2 QU#cDF2#/BRhl;1F%c4-]Fipy+`zWdpTa#jP˲ԣr۰ꠃ? GҦfn*jR-yZzpmW\8@se-:1s[u,-J`qu6i.aZ JF$go$i-2FHFK3*ӌ!^5EIPQo#/:p0G 0%2Ȑ۾lDqJs;*ǎ}+?_X~;h4n>ξwz_3+#,B6iJ>X"B*Q)#5UHk2I=(e!eSgy[i T2۳ $UUFJ2*{џ/PE+ICcj=¾C^A"qm!JP@AJ&a28b̈́[Մzl uqFN!ݽx5i]tjaQp%-T3=gu2^? ;QppjUZ#/5G4AoD.F#5v~YzOgM#55n 5/ )"kI}ծ[1)4H)-A_r]jB#5PFR>eπ`'qx!B*Oۘ\3W@d}^j@j" QjxoC]+L"kVRQE4\#/4weٓ$X#,4w$l&1HmM$P* Xj%%ݛ&czzmF:*KHƑ#55Q#5E#,8'5 6FK^P{7g_y-Fޭ"bTiYDqbفl.g.jR4/ d$1A`Q<,1:5$m|ڬ 8tDn`*LCq- "I$PٷdÊgb(HѨ7$ǡi;M#/\W_78ڕ(,/d"B_60 h*sa-n]MA}RЗ0 T%|#, p{ W(4n%Ԣ[xc%~~>OjI:?SQ*):#se#8ba~X2aWJӭzTZ64.#51B}%s]k^v-ai=v䜭r4i>4"< f׸"5,:㻁;˶Lg&؛>f;}J`8$DW5Oا#/˝E`V@)2g 611}Xwh7!#QT7vuI3>_b7Olbwr>^BIDI(%B(jt큃 }'‘n,,).D~G~ǭn~MLFB P,+rc`6'^]hl0UqQ$*}_m[x`fo\e#/1IqokB%W*Y5X6Gg|]821w:*DyG7pl 9R%T:+\~q5gFԲ40bj"Bl3 2&#,LfڟZV) l!4vW"ihbE`BFȄTIx6;8Gxk9ɢK7Pe=#,˳RƘȭhRĹ6sLvA8M'&y DZ(`nQ?i``P̃"7VhͤB[BңS4,UMFY-ms=rkܱQ dg[YE`ٙNcQW gC #SAc՛f&3F|N.c(Fu0\;95`.iа;eC&:V3+:)t[C;Β[.59'LÙSs\Iu`B2 #/H%@ڙju >r+RfCe2g=mtyBCi fE2#,7 @杯̇jXH8΍.Q0tWF;btcir8M(e#?h0._҃ ̖57Ha< $t3 Slti#,sUP& mN5:[V-Pd+к0psW).(Ki 5fP`dYc0;1 \Zg;0SC#,ʩ&;X){(zphKbK&2_6S9`ʌwLx51X0͓~G36 x4~F(ky%\}GGѼ_kp9kIXOb\8WL3f G xıuړ #5tښbo["l]D!*~ ƹȴ7NP٨]4[ u,w1`GBmXcyӌ0fE4QHPz!hEAFH"PMO6;S]-2m)\g`unsEv#D" 3Q4"6#/K2DbHbj0Iz#/UO/wHRYu,DJb(Ů#,1a"/eHڂhC3biRCiQ p abb_B֊*EsI`dl!LZ6؈X&݄z}'яuF TTEAGnP]f^=`*;EHH) 5#,E~[ײUAs}* &ɸU$_.h"%Q v@PO.M31<+"ƒbP28dTLc`4kxKbT[A! d A5%TABJJ :#, >l|si(A:nKwLCdd&`R, N{ӳ|B|&>~Fp)~嚈Ά3FPp RKs1VDD 9Y~И]caS&J%u'CAMM iLx)A!H"Cɩ#,0BX ؂lHa>6LNpN=AU7#5h|>#,t"qvl"HjTv#5d:cDA\r,#/r}MB~e0a##K5 N"i1XY:Ed<饤CM"!,Fهa4š}C;PC-`k9NP+Z-sN ; ÷gl۔I6j*,YphYh[QU#,E% 6آj21pA-a]Z06pM NNJJRS,s#,&àN|P#,:v`R)eZҠA! .d|yl C7Y0ӮepLC8P$ E`AAU=|M#Ɖa-@!R.B6#,Rj#5~'$ceY>QŜ+4Stx_Rk ߅?ɨ|>>o*̌>k,"{M 3Ah'ĖoN憨m4kʫ@(#,$HE*oh侒 ZDbl *|d,)_vX.bv-$HL\VaI)"th5x^5^o+|MET"6uۨ &KQD Q底66@J *p$lO_wy$@! 9@eDM"!5H#,ok",H1FItI܂HKJ$*ehYfKfm_c}W)TCQ4e,ҐIOEP|f7@,)I#,Oc_T6bldMڊ*eF{j@B {(#,D"D-A5uwI⯐A5Cxt{Ġ"WDLp1 $NJ3)S T½`Ϟf)B%A{iq2 F1MCXSyL@A|Am6$ɭR)6t )sV7T"J=Z`JH(HeXOnKݨZ} @xRW69>Zؖ0l(Cmw_~C+CaXe-#"T44x d`;:`&lkrܒ}}*+|˱\ڍZ[[ƣErG6#Qd8$-#,,&OQϢIu#r"ĺ33AZMM ( phX}tf]JC`aP%LipCq5u]a%AB0Xskn^o*IbݚUҦԡ{V+*TQvך+A#,Ac)H&5h`[R4fZnNERDBNεm!XK=ۗૂYgUf48/1aU3qyjI벩"/PXL*&J8z0lcM=#/fB("y%!^K BA"5#/:8$Q; 6_c MZ׎_k|iinۦJ -~?Prgr8_`L9`~٤qʿDB6 ʇryc;ݦ"jIb8h#ߎ'\:-i#,e#CaU݁hz:9(dj2*&5趙m߶F [v3äB4Db'RmI*B#BC_`N"Rº#,m2ha/b"fg;Q۬;h-O5zwhi∤A c+qz)\ X7 ut %)`a_χ~O787v]b"jy65M\?9J<BU!pE!#ZWnwi|y$1y2IRCl`ݐG(Ay4!z#,63]ꥂ?ߞi\pxqF_TK,5()A@|n&8t00QaS,7tQy>*m4ؚ=({.eoD'4TCVzID%%-Wnmk^}IQTZDh#/1(мfӬ"5a+O(~^ K?ď Ki @r19Nac#56K*%*I}0$&Pk##=#5'e".hpH!!7E qFO$v' zj*bECkf˛%jFjro%Wؽh53_Zȣh#,wւw!=~({f80m֟x;.x#/gȤ?EBZv#/l'{pWi.#/ZXw솯S#l1zev񉒩~yAS>ӶVJszKpYk#DZ! ^G,$ }YOu68'L*ϫϣo3͏~WՑRs;jb/5Y_V7|{~.p ڋ -#<== -#-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v2\n\niQIcBAABCgAGBQJWpU3oAAoJEGelZe39+Q5kv04P/iyvALGAg2Z8oICEDjFkEXWW\nh2CMGLItAhqb3xNeV8WUMMpY4MbRRpN6cU/SPmt+as4oVn2pozca93eWD7yOxukK\n10seOyLTBamS0Wf+BNr6jYXZRQ2N7inc2p6AD75pMOFSg2HeIeQJ0aUIAxNeeojZ\nmUiLYMdtcrF1Kh7KWZAkYSbIAEjJeobLqk2oY7UyqKcODc4RtZJV1InnO4DItEWD\nnd3F5kkVMw4pwYAXaikmCXYBKHXdF5w82KxqEjrAWSoULipX0BVCsSbQ2L0UOs5h\nKXUS4M7AaYKyCcO17E7CnVXaW+vOVyGEECxtSaExWgK5MvYHIGE1OFvb12PkUvUY\nc7CiBxk6X5eZkPyxgxDj20r8zNQVGZ8jDI8Wg08yTAl8+09qCtkE8gGMdNeHYwX8\n2xDH+A3+19022ZZdyO2t5+2AzU6Kkl1qTPKaXJWFRtr8ApD45Y4D3/GAsTNqdOMi\nWeh1XvqQdHjm9rEoJX8aBXShzCMCNhmZalbUhrdzQY6/hnl0PqnlPtyvtkjCvWoF\nXLF6q8YV/ZtqCc36vePZ6lpUQB6FG3g6fhMGraT2VOmT3TROcG17pqIz5y9+85xy\nVSaDc82uHlyzIsZ7vuhV6d9x4yXnFkjMAogCJv6mitFbQsd+LtXYkU+2Zq6wOoEp\ndLLfK0Km4Vs9FYAUbuUi\n=7D7V\n-----END PGP SIGNATURE-----\n diff --git a/gomspace/libcsp/wscript b/gomspace/libcsp/wscript deleted file mode 100644 index 7b9cbdba..00000000 --- a/gomspace/libcsp/wscript +++ /dev/null @@ -1,346 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - -# Cubesat Space Protocol - A small network-layer protocol designed for Cubesats -# Copyright (C) 2012 GomSpace ApS (http://www.gomspace.com) -# Copyright (C) 2012 AAUSAT3 Project (http://aausat3.space.aau.dk) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -import os - -APPNAME = 'libcsp' -VERSION = '1.5' - -top = '.' -out = 'build' - -def options(ctx): - # Load GCC options - ctx.load('gcc') - - ctx.add_option('--toolchain', default=None, help='Set toolchain prefix') - - # Set libcsp options - gr = ctx.add_option_group('libcsp options') - gr.add_option('--includes', default='', help='Add additional include paths. Separate with comma') - gr.add_option('--install-csp', action='store_true', help='Installs CSP headers and lib') - - gr.add_option('--disable-output', action='store_true', help='Disable CSP output') - gr.add_option('--disable-stlib', action='store_true', help='Build objects only') - gr.add_option('--enable-rdp', action='store_true', help='Enable RDP support') - gr.add_option('--enable-qos', action='store_true', help='Enable Quality of Service support') - gr.add_option('--enable-promisc', action='store_true', help='Enable promiscuous mode support') - gr.add_option('--enable-crc32', action='store_true', help='Enable CRC32 support') - gr.add_option('--enable-hmac', action='store_true', help='Enable HMAC-SHA1 support') - gr.add_option('--enable-xtea', action='store_true', help='Enable XTEA support') - gr.add_option('--enable-bindings', action='store_true', help='Enable Python bindings') - gr.add_option('--enable-python3-bindings', action='store_true', help='Enable Python3 bindings') - gr.add_option('--enable-examples', action='store_true', help='Enable examples') - gr.add_option('--enable-dedup', action='store_true', help='Enable packet deduplicator') - - # Interfaces - gr.add_option('--enable-if-i2c', action='store_true', help='Enable I2C interface') - gr.add_option('--enable-if-kiss', action='store_true', help='Enable KISS/RS.232 interface') - gr.add_option('--enable-if-can', action='store_true', help='Enable CAN interface') - gr.add_option('--enable-if-zmqhub', action='store_true', help='Enable ZMQHUB interface') - - # Drivers - gr.add_option('--enable-can-socketcan', action='store_true', help='Enable Linux socketcan driver') - gr.add_option('--with-driver-usart', default=None, metavar='DRIVER', help='Build USART driver. [windows, linux, None]') - - # OS - gr.add_option('--with-os', metavar='OS', default='posix', help='Set operating system. Must be either \'posix\', \'macosx\', \'windows\' or \'freertos\'') - gr.add_option('--enable-init-shutdown', action='store_true', help='Use init system commands for shutdown/reboot') - - # Options - gr.add_option('--with-rdp-max-window', metavar='SIZE', type=int, default=20, help='Set maximum window size for RDP') - gr.add_option('--with-max-bind-port', metavar='PORT', type=int, default=31, help='Set maximum bindable port') - gr.add_option('--with-max-connections', metavar='COUNT', type=int, default=10, help='Set maximum number of concurrent connections') - gr.add_option('--with-conn-queue-length', metavar='SIZE', type=int, default=100, help='Set maximum number of packets in queue for a connection') - gr.add_option('--with-router-queue-length', metavar='SIZE', type=int, default=10, help='Set maximum number of packets to be queued at the input of the router') - gr.add_option('--with-padding', metavar='BYTES', type=int, default=8, help='Set padding bytes before packet length field') - gr.add_option('--with-loglevel', metavar='LEVEL', default='debug', help='Set minimum compile time log level. Must be one of \'error\', \'warn\', \'info\' or \'debug\'') - gr.add_option('--with-rtable', metavar='TABLE', default='static', help='Set routing table type') - gr.add_option('--with-connection-so', metavar='CSP_SO', type=int, default='0x0000', help='Set outgoing connection socket options, see csp.h for valid values') - gr.add_option('--with-bufalign', metavar='BYTES', type=int, help='Set buffer alignment') - -def configure(ctx): - # Validate OS - if not ctx.options.with_os in ('posix', 'windows', 'freertos', 'macosx'): - ctx.fatal('--with-os must be either \'posix\', \'windows\', \'macosx\' or \'freertos\'') - - # Validate USART drivers - if not ctx.options.with_driver_usart in (None, 'windows', 'linux'): - ctx.fatal('--with-driver-usart must be either \'windows\' or \'linux\'') - - if not ctx.options.with_loglevel in ('error', 'warn', 'info', 'debug'): - ctx.fatal('--with-loglevel must be either \'error\', \'warn\', \'info\' or \'debug\'') - - # Setup and validate toolchain - if (len(ctx.stack_path) <= 1) and ctx.options.toolchain: - ctx.env.CC = ctx.options.toolchain + 'gcc' - ctx.env.AR = ctx.options.toolchain + 'ar' - - ctx.load('gcc') - - # Set git revision define - git_rev = os.popen('git describe --always 2> /dev/null || echo unknown').read().strip() - - # Setup DEFINES - ctx.define('GIT_REV', git_rev) - - # Set build output format - ctx.env.FEATURES = ['c'] - if not ctx.options.disable_stlib: - ctx.env.FEATURES += ['cstlib'] - - # Setup CFLAGS - if (len(ctx.stack_path) <= 1) and (len(ctx.env.CFLAGS) == 0): - ctx.env.prepend_value('CFLAGS', ["-std=gnu99", "-g", "-Os", "-Wall", "-Wextra", "-Wshadow", "-Wcast-align", "-Wwrite-strings", "-Wno-unused-parameter"]) - - # Setup extra includes - ctx.env.append_unique('INCLUDES_CSP', ['include'] + ctx.options.includes.split(',')) - - # Add default files - ctx.env.append_unique('FILES_CSP', ['src/*.c','src/interfaces/csp_if_lo.c','src/transport/csp_udp.c','src/arch/{0}/**/*.c'.format(ctx.options.with_os)]) - - # Store OS as env variable - ctx.env.append_unique('OS', ctx.options.with_os) - - # Libs - if 'posix' in ctx.env.OS: - ctx.env.append_unique('LIBS', ['rt', 'pthread', 'util']) - elif 'macosx' in ctx.env.OS: - ctx.env.append_unique('LIBS', ['pthread']) - - # Check for recursion - if ctx.path == ctx.srcnode: - ctx.options.install_csp = True - - # Windows build flags - if ctx.options.with_os == 'windows': - ctx.env.append_unique('CFLAGS', ['-D_WIN32_WINNT=0x0600']) - - ctx.define_cond('CSP_FREERTOS', ctx.options.with_os == 'freertos') - ctx.define_cond('CSP_POSIX', ctx.options.with_os == 'posix') - ctx.define_cond('CSP_WINDOWS', ctx.options.with_os == 'windows') - ctx.define_cond('CSP_MACOSX', ctx.options.with_os == 'macosx') - - # Add CAN driver - if ctx.options.enable_can_socketcan: - ctx.env.append_unique('FILES_CSP', 'src/drivers/can/can_socketcan.c') - - # Add USART driver - if ctx.options.with_driver_usart != None: - ctx.env.append_unique('FILES_CSP', 'src/drivers/usart/usart_{0}.c'.format(ctx.options.with_driver_usart)) - - # Interfaces - if ctx.options.enable_if_can: - ctx.env.append_unique('FILES_CSP', 'src/interfaces/csp_if_can.c') - ctx.env.append_unique('FILES_CSP', 'src/interfaces/csp_if_can_pbuf.c') - if ctx.options.enable_if_i2c: - ctx.env.append_unique('FILES_CSP', 'src/interfaces/csp_if_i2c.c') - if ctx.options.enable_if_kiss: - ctx.env.append_unique('FILES_CSP', 'src/interfaces/csp_if_kiss.c') - if ctx.options.enable_if_zmqhub: - ctx.env.append_unique('FILES_CSP', 'src/interfaces/csp_if_zmqhub.c') - ctx.check_cfg(package='libzmq', args='--cflags --libs') - ctx.env.append_unique('LIBS', ctx.env.LIB_LIBZMQ) - - # Store configuration options - ctx.env.ENABLE_BINDINGS = ctx.options.enable_bindings - ctx.env.ENABLE_EXAMPLES = ctx.options.enable_examples - - # Check for python development - if ctx.options.enable_bindings: - ctx.env.LIBCSP_PYTHON2 = ctx.check_cfg(package='python2', args='--cflags --libs', atleast_version='2.7', mandatory=False) - if ctx.options.enable_python3_bindings: - ctx.env.LIBCSP_PYTHON3 = ctx.check_cfg(package='python3', args='--cflags --libs', atleast_version='3.5', mandatory=False) - - # Create config file - if not ctx.options.disable_output: - ctx.env.append_unique('FILES_CSP', 'src/csp_debug.c') - else: - ctx.env.append_unique('EXCL_CSP', 'src/csp_debug.c') - - if ctx.options.enable_rdp: - ctx.env.append_unique('FILES_CSP', 'src/transport/csp_rdp.c') - - if ctx.options.enable_crc32: - ctx.env.append_unique('FILES_CSP', 'src/csp_crc32.c') - else: - ctx.env.append_unique('EXCL_CSP', 'src/csp_crc32.c') - - if not ctx.options.enable_dedup: - ctx.env.append_unique('EXCL_CSP', 'src/csp_dedup.c') - - if ctx.options.enable_hmac: - ctx.env.append_unique('FILES_CSP', 'src/crypto/csp_hmac.c') - ctx.env.append_unique('FILES_CSP', 'src/crypto/csp_sha1.c') - - if ctx.options.enable_xtea: - ctx.env.append_unique('FILES_CSP', 'src/crypto/csp_xtea.c') - ctx.env.append_unique('FILES_CSP', 'src/crypto/csp_sha1.c') - - ctx.env.append_unique('FILES_CSP', 'src/rtable/csp_rtable_' + ctx.options.with_rtable + '.c') - - ctx.define_cond('CSP_DEBUG', not ctx.options.disable_output) - ctx.define_cond('CSP_USE_RDP', ctx.options.enable_rdp) - ctx.define_cond('CSP_USE_CRC32', ctx.options.enable_crc32) - ctx.define_cond('CSP_USE_HMAC', ctx.options.enable_hmac) - ctx.define_cond('CSP_USE_XTEA', ctx.options.enable_xtea) - ctx.define_cond('CSP_USE_PROMISC', ctx.options.enable_promisc) - ctx.define_cond('CSP_USE_QOS', ctx.options.enable_qos) - ctx.define_cond('CSP_USE_DEDUP', ctx.options.enable_dedup) - ctx.define_cond('CSP_USE_INIT_SHUTDOWN', ctx.options.enable_init_shutdown) - ctx.define_cond('CSP_USE_CAN', ctx.options.enable_if_can) - ctx.define_cond('CSP_USE_I2C', ctx.options.enable_if_i2c) - ctx.define_cond('CSP_USE_KISS', ctx.options.enable_if_kiss) - ctx.define_cond('CSP_USE_ZMQHUB', ctx.options.enable_if_zmqhub) - ctx.define('CSP_CONN_MAX', ctx.options.with_max_connections) - ctx.define('CSP_CONN_QUEUE_LENGTH', ctx.options.with_conn_queue_length) - ctx.define('CSP_FIFO_INPUT', ctx.options.with_router_queue_length) - ctx.define('CSP_MAX_BIND_PORT', ctx.options.with_max_bind_port) - ctx.define('CSP_RDP_MAX_WINDOW', ctx.options.with_rdp_max_window) - ctx.define('CSP_PADDING_BYTES', ctx.options.with_padding) - ctx.define('CSP_CONNECTION_SO', ctx.options.with_connection_so) - - if ctx.options.with_bufalign != None: - ctx.define('CSP_BUFFER_ALIGN', ctx.options.with_bufalign) - - # Set logging level - ctx.define_cond('CSP_LOG_LEVEL_DEBUG', ctx.options.with_loglevel in ('debug')) - ctx.define_cond('CSP_LOG_LEVEL_INFO', ctx.options.with_loglevel in ('debug', 'info')) - ctx.define_cond('CSP_LOG_LEVEL_WARN', ctx.options.with_loglevel in ('debug', 'info', 'warn')) - ctx.define_cond('CSP_LOG_LEVEL_ERROR', ctx.options.with_loglevel in ('debug', 'info', 'warn', 'error')) - - # Check compiler endianness - endianness = ctx.check_endianness() - ctx.define_cond('CSP_LITTLE_ENDIAN', endianness == 'little') - ctx.define_cond('CSP_BIG_ENDIAN', endianness == 'big') - - # Check for stdbool.h - ctx.check_cc(header_name='stdbool.h', mandatory=False, define_name='CSP_HAVE_STDBOOL_H', type='cstlib') - - # Check for libsocketcan.h - if ctx.options.enable_if_can and ctx.options.enable_can_socketcan: - have_socketcan = ctx.check_cc(lib='socketcan', mandatory=False, define_name='CSP_HAVE_LIBSOCKETCAN') - if have_socketcan: - ctx.env.append_unique('LIBS', ['socketcan']) - - ctx.define('LIBCSP_VERSION', VERSION) - - ctx.write_config_header('include/csp/csp_autoconfig.h') - -def build(ctx): - - # Set install path for header files - install_path = False - if ctx.options.install_csp: - install_path = '${PREFIX}/lib' - ctx.install_files('${PREFIX}/include/csp', ctx.path.ant_glob('include/csp/*.h')) - ctx.install_files('${PREFIX}/include/csp/interfaces', 'include/csp/interfaces/csp_if_lo.h') - - if 'src/interfaces/csp_if_can.c' in ctx.env.FILES_CSP: - ctx.install_files('${PREFIX}/include/csp/interfaces', 'include/csp/interfaces/csp_if_can.h') - if 'src/interfaces/csp_if_i2c.c' in ctx.env.FILES_CSP: - ctx.install_files('${PREFIX}/include/csp/interfaces', 'include/csp/interfaces/csp_if_i2c.h') - if 'src/interfaces/csp_if_kiss.c' in ctx.env.FILES_CSP: - ctx.install_files('${PREFIX}/include/csp/interfaces', 'include/csp/interfaces/csp_if_kiss.h') - if 'src/interfaces/csp_if_zmqhub.c' in ctx.env.FILES_CSP: - ctx.install_files('${PREFIX}/include/csp/interfaces', 'include/csp/interfaces/csp_if_zmqhub.h') - if 'src/drivers/usart/usart_{0}.c'.format(ctx.options.with_driver_usart) in ctx.env.FILES_CSP: - ctx.install_as('${PREFIX}/include/csp/drivers/usart.h', 'include/csp/drivers/usart.h') - if 'src/drivers/can/can_socketcan.c' in ctx.env.FILES_CSP: - ctx.install_as('${PREFIX}/include/csp/drivers/can_socketcan.h', 'include/csp/drivers/can_socketcan.h') - - ctx.install_files('${PREFIX}/include/csp', 'include/csp/csp_autoconfig.h', cwd=ctx.bldnode) - - ctx(export_includes='include', name='csp_h') - - ctx(features=ctx.env.FEATURES, - source=ctx.path.ant_glob(ctx.env.FILES_CSP, excl=ctx.env.EXCL_CSP), - target = 'csp', - includes= ctx.env.INCLUDES_CSP, - export_includes = ctx.env.INCLUDES_CSP, - use = 'include freertos_h', - install_path = install_path, - ) - - # Build shared library for Python bindings - if ctx.env.ENABLE_BINDINGS: - ctx.shlib(source = ctx.path.ant_glob(ctx.env.FILES_CSP, excl=ctx.env.EXCL_CSP), - name = 'csp_shlib', - target = 'csp', - includes = ctx.env.INCLUDES_CSP, - export_includes = 'include', - use = ['include'], - lib = ctx.env.LIBS) - - # python3 bindings - if ctx.env.LIBCSP_PYTHON3: - ctx.shlib(source = ['src/bindings/python/pycsp.c'], - target = 'csp_py3', - includes = ctx.env.INCLUDES_CSP + ctx.env.INCLUDES_PYTHON3, - export_includes = 'include', - use = ['csp_shlib', 'include'], - lib = ctx.env.LIBS) - - # python2 bindings - if ctx.env.LIBCSP_PYTHON2: - ctx.shlib(source = ['src/bindings/python/pycsp.c'], - target = 'csp_py2', - includes = ctx.env.INCLUDES_CSP + ctx.env.INCLUDES_PYTHON2, - export_includes = 'include', - use = ['csp_shlib', 'include'], - lib = ctx.env.LIBS) - - if ctx.env.ENABLE_EXAMPLES: - ctx.program(source = ctx.path.ant_glob('examples/simple.c'), - target = 'simple', - includes = ctx.env.INCLUDES_CSP, - lib = ctx.env.LIBS, - use = 'csp') - - if ctx.options.enable_if_kiss: - ctx.program(source = 'examples/kiss.c', - target = 'kiss', - includes = ctx.env.INCLUDES_CSP, - lib = ctx.env.LIBS, - use = 'csp') - - if ctx.options.enable_if_zmqhub: - ctx.program(source = 'examples/zmqproxy.c', - target = 'zmqproxy', - includes = ctx.env.INCLUDES_CSP, - lib = ctx.env.LIBS, - use = 'csp') - - if 'posix' in ctx.env.OS: - ctx.program(source = 'examples/csp_if_fifo.c', - target = 'fifo', - includes = ctx.env.INCLUDES_CSP, - lib = ctx.env.LIBS, - use = 'csp') - - if 'windows' in ctx.env.OS: - ctx.program(source = ctx.path.ant_glob('examples/csp_if_fifo_windows.c'), - target = 'csp_if_fifo', - includes = ctx.env.INCLUDES_CSP, - use = 'csp') - -def dist(ctx): - ctx.excl = 'build/* **/.* **/*.pyc **/*.o **/*~ *.tar.gz'