sumaclust_v1.0.35/000777 000765 000024 00000000000 13641112434 016044 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumaclust.h000666 000765 000024 00000001152 12551664362 020247 0ustar00celinemercierstaff000000 000000 /* * sumaclust.h * * Created on: april 2, 2012 * Author: mercier */ #ifndef SUMACLUST_H_ #define SUMACLUST_H_ typedef struct { int32_t next; int32_t threads_number; int* potential_nexts_list; fastaSeqPtr* db; int n; int normalize; int reference; BOOL lcsmode; BOOL fast; double threshold; BOOL stop; int sizeForSeqs; int16_t** addresses; int16_t** iseqs1; int16_t** iseqs2; int seeds_counter; double worstscore; double max_ratio; int64_t elapsedtime; } thread_control_t; #endif /* SUMACLUST_H_ */ sumaclust_v1.0.35/mtcompare_sumaclust.h000666 000765 000024 00000000500 12551664362 022312 0ustar00celinemercierstaff000000 000000 /* * mtcompare.h * * Created on: 12 mars 2013 * Author: celinemercier */ #ifndef MTCOMPARE_H_ #define MTCOMPARE_H_ int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize, int reference, BOOL lcsmode, int threads_number, double max_ratio); #endif /* MTCOMPARE_H_ */ sumaclust_v1.0.35/Licence_CeCILL_V2-fr.txt000644 000765 000024 00000051733 12551664362 022216 0ustar00celinemercierstaff000000 000000 CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL Avertissement Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: * d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, * d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) sont: Commissariat à l'Energie Atomique - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. Institut National de Recherche en Informatique et en Automatique - INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. Préambule Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modification et de redistribution du logiciel régi par cette licence dans le cadre d'un modèle de diffusion en logiciel libre. L'exercice de ces libertés est assorti de certains devoirs à la charge des utilisateurs afin de préserver ce statut au cours des redistributions ultérieures. L'accessibilité au code source et les droits de copie, de modification et de redistribution qui en découlent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. Article 1 - DEFINITIONS Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. Contributeur: désigne le Licencié auteur d'au moins une Contribution. Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. Contribution: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. Module: désigne un ensemble de fichiers sources y compris leur documentation qui permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce Module et le Logiciel s'exécutent dans des espaces d'adressage différents, l'un appelant l'autre au moment de leur exécution. Module Interne: désigne tout Module lié au Logiciel de telle sorte qu'ils s'exécutent dans le même espace d'adressage. GNU GPL: désigne la GNU General Public License dans sa version 2 ou toute version ultérieure, telle que publiée par Free Software Foundation Inc. Parties: désigne collectivement le Licencié et le Concédant. Ces termes s'entendent au singulier comme au pluriel. Article 2 - OBJET Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. Article 3 - ACCEPTATION 3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: * (i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; * (ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. 3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissance. Article 4 - ENTREE EN VIGUEUR ET DUREE 4.1 ENTREE EN VIGUEUR Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. 4.2 DUREE Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. Article 5 - ETENDUE DES DROITS CONCEDES Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. 5.1 DROIT D'UTILISATION Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: 1. la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. 2. le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. 3. la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. 5.2 DROIT D'APPORTER DES CONTRIBUTIONS Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette Contribution et la date de création de celle-ci. 5.3 DROIT DE DISTRIBUTION Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au Code Source complet du Logiciel en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE Lorsque le Licencié apporte une Contribution au Logiciel, les conditions de distribution du Logiciel Modifié en résultant sont alors soumises à l'intégralité des dispositions du Contrat. Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de code source ou de code objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, et que, dans le cas où seul le code objet du Logiciel Modifié est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au code source complet du Logiciel Modifié en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du code source ne devra pas excéder le simple coût de transfert des données. 5.3.3 DISTRIBUTION DES MODULES EXTERNES Lorsque le Licencié a développé un Module Externe les conditions du Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué sous un contrat de licence différent. 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL Le Licencié peut inclure un code soumis aux dispositions d'une des versions de la licence GNU GPL dans le Logiciel modifié ou non et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis aux dispositions d'une des versions de la licence GNU GPL et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. Article 6 - PROPRIETE INTELLECTUELLE 6.1 SUR LE LOGICIEL INITIAL Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2. 6.2 SUR LES CONTRIBUTIONS Le Licencié qui a développé une Contribution est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. 6.3 SUR LES MODULES EXTERNES Le Licencié qui a développé un Module Externe est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion. 6.4 DISPOSITIONS COMMUNES Le Licencié s'engage expressément: 1. à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; 2. à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non. Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. Article 7 - SERVICES ASSOCIES 7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. 7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. Article 8 - RESPONSABILITE 8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. 8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. Article 9 - GARANTIE 9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. 9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). 9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. 9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. Article 10 - RESILIATION 10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. 10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. Article 11 - DISPOSITIONS DIVERSES 11.1 CAUSE EXTERIEURE Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... 11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. 11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. 11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. 11.5 LANGUE Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. Article 12 - NOUVELLES VERSIONS DU CONTRAT 12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. 12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. 12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure, sous réserve des dispositions de l'article 5.3.4. Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE 13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. 13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. Version 2.0 du 2006-09-05. sumaclust_v1.0.35/Makefile000644 000765 000024 00000001373 13446717535 017524 0ustar00celinemercierstaff000000 000000 PREFIX=/usr/local CFLAGS=-I$(PREFIX)/include EXEC = sumaclust SUMACLUST_SRC = sumaclust.c \ mtcompare_sumaclust.c SUMACLUST_OBJ = $(patsubst %.c,%.o,$(SUMACLUST_SRC)) SRCS = $(SUMACLUST_SRC) LIB = -lsuma -lm #-ll include ./global.mk all: $(EXEC) ######## # # sumaclust compilation # ######## # executable compilation and link ifeq ($(CC),gcc) LFLAGS = -fopenmp else LFLAGS = endif sumaclust: $(SUMACLUST_OBJ) $(LIBSUMA) $(CC) $(LDFLAGS) -o $@ $(LFLAGS) $(SUMACLUST_OBJ) $(LIB) $(LIBSUMAPATH) ######## # # project management # ######## clean: rm -f $(SUMACLUST_OBJ) rm -f $(EXEC) $(MAKE) -C ./sumalibs clean install: all install -d $(DESTDIR)$(PREFIX)/bin/ install -m 755 $(EXEC) $(DESTDIR)$(PREFIX)/bin/ sumaclust_v1.0.35/Licence_CeCILL_V2-en.txt000644 000765 000024 00000051151 12551664362 022203 0ustar00celinemercierstaff000000 000000 CeCILL FREE SOFTWARE LICENSE AGREEMENT Notice This Agreement is a Free Software license agreement that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: * firstly, compliance with the principles governing the distribution of Free Software: access to source code, broad rights granted to users, * secondly, the election of a governing law, French law, with which it is conformant, both as regards the law of torts and intellectual property law, and the protection that it offers to both authors and holders of the economic rights over software. The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) license are: Commissariat à l'Energie Atomique - CEA, a public scientific, technical and industrial research establishment, having its principal place of business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange, 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France. Preamble The purpose of this Free Software license agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an open source distribution model. The exercising of these rights is conditional upon certain obligations for users so as to preserve this status for all subsequent redistributions. In consideration of access to the source code and the rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, the risks associated with loading, using, modifying and/or developing or reproducing the software by the user are brought to the user's attention, given its Free Software status, which may make it complicated to use, with the result that its use is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the suitability of the software as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no provisions are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the use thereof to its provisions. Article 1 - DEFINITIONS For the purpose of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this license agreement, and its possible subsequent versions and annexes. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and possibly its Object Code form and, where applicable, its documentation, "as is" when it is first distributed under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder(s) of the economic rights over the Initial Software. Licensee: means the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any other individual or legal entity, who distributes the Software under the Agreement. Contribution: means any or all modifications, corrections, translations, adaptations and/or new functions integrated into the Software by any or all Contributors, as well as any or all Internal Modules. Module: means a set of sources files including their documentation that enables supplementary functions or services in addition to those offered by the Software. External Module: means any or all Modules, not derived from the Software, so that this Module and the Software run in separate address spaces, with one calling the other when they are run. Internal Module: means any or all Module, connected to the Software so that they both execute in the same address space. GNU GPL: means the GNU General Public License version 2 or any subsequent version, as published by the Free Software Foundation Inc. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE The purpose of the Agreement is the grant by the Licensor to the Licensee of a non-exclusive, transferable and worldwide license for the Software as set forth in Article 5 hereinafter for the whole term of the protection granted by the rights over said Software. Article 3 - ACCEPTANCE 3.1 The Licensee shall be deemed as having accepted the terms and conditions of this Agreement upon the occurrence of the first of the following events: * (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; * (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2 One copy of the Agreement, containing a notice relating to the characteristics of the Software, to the limited warranty, and to the fact that its use is restricted to experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it has read and understood it. Article 4 - EFFECTIVE DATE AND TERM 4.1 EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2 TERM The Agreement shall remain in force for the entire legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF RIGHTS GRANTED The Licensor hereby grants to the Licensee, who accepts, the following rights over the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Besides, if the Licensor owns or comes to own one or more patents protecting all or part of the functions of the Software or of its components, the Licensor undertakes not to enforce the rights granted by these patents against successive Licensees using, exploiting or modifying the Software. If these patents are transferred, the Licensor undertakes to have the transferees subscribe to the obligations set forth in this paragraph. 5.1 RIGHT OF USE The Licensee is authorized to use the Software, without any limitation as to its fields of application, with it being hereinafter specified that this comprises: 1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. 2. loading, displaying, running, or storing the Software on any or all medium. 3. entitlement to observe, study or test its operation so as to determine the ideas and principles behind any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modifications to the Software, and the right to reproduce the resulting software. The Licensee is authorized to make any or all Contributions to the Software provided that it includes an explicit notice that it is the author of said Contribution and indicates the date of the creation thereof. 5.3 RIGHT OF DISTRIBUTION In particular, the right of distribution includes the right to publish, transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, one or more copies of the Software by any means. The Licensee is further authorized to distribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to distribute true copies of the Software in Source Code or Object Code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Object Code of the Software is redistributed, the Licensee allows future Licensees unhindered access to the full Source Code of the Software by indicating how to access it, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the distribution of the resulting Modified Software become subject to all the provisions of this Agreement. The Licensee is authorized to distribute the Modified Software, in source code or object code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the object code of the Modified Software is redistributed, the Licensee allows future Licensees unhindered access to the full source code of the Modified Software by indicating how to access it, it being understood that the additional cost of acquiring the source code shall not exceed the cost of transferring the data. 5.3.3 DISTRIBUTION OF EXTERNAL MODULES When the Licensee has developed an External Module, the terms and conditions of this Agreement do not apply to said External Module, that may be distributed under a separate license agreement. 5.3.4 COMPATIBILITY WITH THE GNU GPL The Licensee can include a code that is subject to the provisions of one of the versions of the GNU GPL in the Modified or unmodified Software, and distribute that entire code under the terms of the same version of the GNU GPL. The Licensee can include the Modified or unmodified Software in a code that is subject to the provisions of one of the versions of the GNU GPL, and distribute that entire code under the terms of the same version of the GNU GPL. Article 6 - INTELLECTUAL PROPERTY 6.1 OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes that the Initial Software will remain ruled at least by this Agreement, for the duration set forth in Article 4.2. 6.2 OVER THE CONTRIBUTIONS The Licensee who develops a Contribution is the owner of the intellectual property rights over this Contribution as defined by applicable law. 6.3 OVER THE EXTERNAL MODULES The Licensee who develops an External Module is the owner of the intellectual property rights over this External Module as defined by applicable law and is free to choose the type of agreement that shall govern its distribution. 6.4 JOINT PROVISIONS The Licensee expressly undertakes: 1. not to remove, or modify, in any manner, the intellectual property notices attached to the Software; 2. to reproduce said notices, in an identical manner, in the copies of the Software modified or not. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors on the Software and to take, where applicable, vis-à-vis its staff, any and all measures required to ensure respect of said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES 7.1 Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of services. The terms and conditions of such technical assistance, and/or such maintenance, shall be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2 Similarly, any Licensor is entitled to offer to its licensees, under its sole responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it is free to decide. Said warranty, and the financial terms and conditions of its application, shall be subject of a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY 8.1 Subject to the provisions of Article 8.2, the Licensee shall be entitled to claim compensation for any direct loss it may have suffered from the Software as a result of a fault on the part of the relevant Licensor, subject to providing evidence thereof. 8.2 The Licensor's liability is limited to the commitments made under this Agreement and shall not be incurred as a result of in particular: (i) loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss that is suffered by the Licensee due to the use or performance of the Software, and (iii) more generally, any consequential loss. In particular the Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY 9.1 The Licensee acknowledges that the scientific and technical state-of-the-art when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of possible defects to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software which are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the suitability of the product for its requirements, its good working order, and for ensuring that it shall not cause damage to either persons or properties. 9.2 The Licensor hereby represents, in good faith, that it is entitled to grant all the rights over the Software (including in particular the rights set forth in Article 5). 9.3 The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any warranty as to its commercial value, its secured, safe, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any error, that it will operate without interruption, that it will be compatible with the Licensee's own equipment and software configuration, nor that it will meet the Licensee's requirements. 9.4 The Licensor does not either expressly or tacitly warrant that the Software does not infringe any third party intellectual property right relating to a patent, software or any other property right. Therefore, the Licensor disclaims any and all liability towards the Licensee arising out of any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any and all liability as regards the Licensee's use of the name of the Software. No warranty is given as regards the existence of prior rights over the name of the Software or as regards the existence of a trademark. Article 10 - TERMINATION 10.1 In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2 A Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS 11.1 EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as defective functioning or interruptions of the electricity or telecommunications networks, network paralysis following a virus attack, intervention by government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2 Any failure by either Party, on one or more occasions, to invoke one or more of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its right to invoke said provision(s) subsequently. 11.3 The Agreement cancels and replaces any or all previous agreements, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as between the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4 In the event that one or more of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall prevail, and the Parties shall make the necessary amendments so as to comply with said act or legislative text. All other provisions shall remain effective. Similarly, invalidity of a provision of the Agreement, for any reason whatsoever, shall not cause the Agreement as a whole to be invalid. 11.5 LANGUAGE The Agreement is drafted in both French and English and both versions are deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT 12.1 Any person is authorized to duplicate and distribute copies of this Agreement. 12.2 So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, who reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3 Any Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement or a subsequent version, subject to the provisions of Article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION 13.1 The Agreement is governed by French law. The Parties agree to endeavor to seek an amicable solution to any disagreements or disputes that may arise during the performance of the Agreement. 13.2 Failing an amicable solution within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the more diligent Party. Version 2.0 dated 2006-09-05. sumaclust_v1.0.35/sumalibs/000777 000765 000024 00000000000 13641112222 017656 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/._global.mk000644 000765 000024 00000000253 13446627704 020064 0ustar00celinemercierstaff000000 000000 Mac OS X  2y«TEXTATTR«œœcom.apple.TextEncodingUTF-8;134217984sumaclust_v1.0.35/global.mk000644 000765 000024 00000000520 13446627704 017644 0ustar00celinemercierstaff000000 000000 LIBSUMAPATH = -L./sumalibs LIBSUMA = ./sumalibs/libsuma.a CC=gcc LDFLAGS= ifeq ($(CC),gcc) CFLAGS = -O3 -s -DOMP_SUPPORT -fopenmp -w else CFLAGS = -O3 -w endif default: all %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< $(LIB) ######## # # libraries compilation # ######## ./sumalibs/libsuma.a: $(MAKE) -C ./sumalibs sumaclust_v1.0.35/README.md000644 000765 000024 00000000113 13170202054 017305 0ustar00celinemercierstaff000000 000000 [See the wiki](https://git.metabarcoding.org/obitools/sumaclust/wikis/home)sumaclust_v1.0.35/sumaclust.c000644 000765 000024 00000105534 13641111363 020234 0ustar00celinemercierstaff000000 000000 /** * FileName: sumaclust.c * Author: Celine Mercier * Description: star clustering of DNA sequences * **/ #include #include #include #include #include #include #include "sumalibs/libutils/utilities.h" #include "sumalibs/libfasta/sequence.h" #include "sumalibs/libfasta/fasta_header_parser.h" #include "sumalibs/libfasta/fasta_header_handler.h" #include "sumalibs/libfasta/fasta_seq_writer.h" #include "sumalibs/liblcs/upperband.h" #include "sumalibs/liblcs/sse_banded_LCS_alignment.h" #include "mtcompare_sumaclust.h" #include "sumaclust.h" #define VERSION "1.0.35" /* ----------------------------------------------- */ /* printout help */ /* ----------------------------------------------- */ #define PP fprintf(stdout, static void PrintHelp() { PP "------------------------------------------------------------\n"); PP " SUMACLUST Version %s\n", VERSION); PP "------------------------------------------------------------\n"); PP " Synopsis : star clustering of sequences.\n"); PP " Usage: sumaclust [options] \n"); PP "------------------------------------------------------------\n"); PP " Options:\n"); PP " -h : [H]elp - print help\n\n"); PP " -l : Reference sequence length is the shortest. \n\n"); PP " -L : Reference sequence length is the largest. \n\n"); PP " -a : Reference sequence length is the alignment length (default). \n\n"); PP " -n : Score is normalized by reference sequence length (default).\n\n"); PP " -r : Raw score, not normalized. \n\n"); PP " -d : Score is expressed in distance (default : score is expressed in similarity). \n\n"); PP " -t ##.## : Score threshold for clustering. If the score is normalized and expressed in similarity (default),\n"); PP " it is an identity, e.g. 0.95 for an identity of 95%%. If the score is normalized\n"); PP " and expressed in distance, it is (1.0 - identity), e.g. 0.05 for an identity of 95%%.\n"); PP " If the score is not normalized and expressed in similarity, it is the length of the\n"); PP " Longest Common Subsequence. If the score is not normalized and expressed in distance,\n"); PP " it is (reference length - LCS length).\n"); PP " Only sequences with a similarity above ##.## with the center sequence of a cluster\n"); PP " are assigned to that cluster. Default: 0.97.\n\n"); PP " -e : Exact option : A sequence is assigned to the cluster with the center sequence presenting the\n"); PP " highest similarity score > threshold, as opposed to the default 'fast' option where a sequence is\n"); PP " assigned to the first cluster found with a center sequence presenting a score > threshold.\n\n"); PP " -R ## : Maximum ratio between the counts of two sequences so that the less abundant one can be considered\n"); PP " as a variant of the more abundant one. Default: 1.0.\n\n"); PP " -p ## : Multithreading with ## threads using openMP.\n\n"); PP " -s #### : Sorting by ####. Must be 'None' for no sorting, or a key in the fasta header of each sequence,\n"); PP " except for the count that can be computed (default : sorting by count).\n\n"); PP " -o : Sorting is in ascending order (default : descending).\n\n"); PP " -g : n's are replaced with a's (default: sequences with n's are discarded).\n\n"); PP " -B ### : Output of the OTU table in BIOM format is activated, and written to file ###.\n\n"); PP " -O ### : Output of the OTU map (observation map) is activated, and written to file ###.\n\n"); PP " -F ### : Output in FASTA format is written to file ### instead of standard output.\n\n"); PP " -f : Output in FASTA format is deactivated.\n"); PP "\n"); PP "------------------------------------------------------------\n"); PP " Argument : the nucleotide dataset to cluster (or nothing \n"); PP " if the standard input should be used). \n"); PP "------------------------------------------------------------\n"); PP " http://metabarcoding.org/sumaclust\n"); PP "------------------------------------------------------------\n\n"); } #undef PP /* ----------------------------------------------- */ /* printout usage and exit */ /* ----------------------------------------------- */ #define PP fprintf(stderr, static void ExitUsage(stat) int stat; { PP "usage: sumaclust [-l|L|a|n|r|d|e|o|g|f] [-t threshold_value] [-s sorting_key] [-R maximum_ratio] [-p number_of_threads]\n"); PP "[-B file_name_for_BIOM-formatted_output] [-O file_name_for_OTU_table-formatted_output] [-F file_name_for_FASTA-formatted_output] dataset\n"); PP "type \"sumaclust -h\" for help\n"); if (stat) exit(stat); } #undef PP static char* sortingKey="count"; static int sortSeqsP(const void **s1, const void **s2) { int res; double r1; double r2; r1 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); if (r2 > r1) res = 1; else if (r2 < r1) res = -1; else res = 0; return(res); } static int reverseSortSeqsP(const void **s1, const void **s2) { int res; double r1; double r2; r1 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) *s2)->header)); if (r1 > r2) res = 1; else if (r1 < r2) res = -1; else res = 0; return(res); } int uniqSeqsDoubleSortFunction(const void *s1, const void *s2) { int c; char* str_r1; double r1; double r2; c = strcmp(((fastaSeqPtr) s1)->sequence, ((fastaSeqPtr) s2)->sequence); if (c == 0) { str_r1 = getItemFromHeader(sortingKey, ((fastaSeqPtr) s1)->header); if (str_r1 == NULL) { fprintf(stderr, "\nERROR: '%s' not in sequence header(s).\n\n", sortingKey); exit(1); } r1 = atof(str_r1); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) s2)->header)); if (r2 > r1) c = 1; else if (r2 < r1) c = -1; else c = 0; } return(c); } int uniqSeqsDoubleReverseSortFunction(const void *s1, const void *s2) { int c; char* str_r1; double r1; double r2; c = strcmp(((fastaSeqPtr) s1)->sequence, ((fastaSeqPtr) s2)->sequence); if (c == 0) { str_r1 = getItemFromHeader(sortingKey, ((fastaSeqPtr) s1)->header); if (str_r1 == NULL) { fprintf(stderr, "\nERROR: '%s' not in sequence header(s).\n\n", sortingKey); exit(1); } r1 = atof(str_r1); r2 = atof(getItemFromHeader(sortingKey, ((fastaSeqPtr) s2)->header)); if (r1 > r2) c = 1; else if (r1 < r2) c = -1; else c = 0; } return(c); } void printInBIOMformat(fastaSeqPtr* uniqSeqs, int count, int numberOfCenters, char* biomFile_name) { int i, j, n; FILE* biomFile; struct tm* tm_info; time_t timer; char buffer_date[20]; fastaSeqPtr* c; fastaSeqPtr* seq; int id_len; int row_number; BOOL first_center = TRUE; int buffer_col_rows; int buffer_col_rows_1; int buffer_col_rows_2; buffer_col_rows = 29; buffer_col_rows_1 = 9; buffer_col_rows_2 = 20; n = 0; biomFile = fopen(biomFile_name, "w"); if (biomFile == NULL) fprintf(stderr, "\nCan't open BIOM output file.\n"); //, %s outputFilename); for (i=0; iaccession_id); j=0; if ((*seq)->cluster_center) // center sequence { n++; (*seq)->cluster_weight_unique_ids = 1; if (first_center) { (*seq)->columns_BIOM_size = id_len + buffer_col_rows; (*seq)->columns_BIOM = (char*) malloc(((*seq)->columns_BIOM_size)*sizeof(char)); strcpy((*seq)->columns_BIOM, "{\"id\": \""); first_center = FALSE; } else { (*seq)->columns_BIOM_size = id_len + buffer_col_rows + 1; (*seq)->columns_BIOM = (char*) malloc(((*seq)->columns_BIOM_size)*sizeof(char)); strcpy((*seq)->columns_BIOM, ",{\"id\": \""); } memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*seq)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); n++; (*seq)->cluster_weight_unique_ids++; (*seq)->columns_BIOM_size = (*seq)->columns_BIOM_size + id_len + buffer_col_rows; (*seq)->columns_BIOM = realloc((*seq)->columns_BIOM, ((*seq)->columns_BIOM_size) * sizeof(char)); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); n++; (*seq)->cluster_weight_unique_ids++; (*seq)->columns_BIOM_size = (*seq)->columns_BIOM_size + id_len + buffer_col_rows; (*seq)->columns_BIOM = realloc((*seq)->columns_BIOM, ((*seq)->columns_BIOM_size) * sizeof(char)); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->columns_BIOM + (*seq)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } } } else // not a center sequence { n++; c = (*seq)->center; id_len = strlen((*seq)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*seq)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); n++; (*c)->cluster_weight_unique_ids++; (*c)->columns_BIOM_size = (*c)->columns_BIOM_size + id_len + buffer_col_rows; (*c)->columns_BIOM = realloc((*c)->columns_BIOM, ((*c)->columns_BIOM_size) * sizeof(char)); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows - id_len - 1, ",{\"id\": \"", buffer_col_rows_1); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - id_len - buffer_col_rows_2 - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->columns_BIOM + (*c)->columns_BIOM_size - buffer_col_rows_2 - 1, "\", \"metadata\": null}", buffer_col_rows_2+1); } } } } time(&timer); tm_info = localtime(&timer); strftime(buffer_date, 20, "%Y-%m-%dT%H:%M:%S", tm_info); fprintf(biomFile, "{\"id\": \"None\",\"format\": \"Biological Observation Matrix 1.0.0\"," "\"format_url\": \"http://biom-format.org\",\"type\": \"OTU table\"," "\"generated_by\": \"SUMACLUST %s\",\"date\": \"%s\",\"matrix_type\": \"sparse\"," "\"matrix_element_type\": \"int\",\"shape\": [%d, %d],", VERSION, buffer_date, numberOfCenters, n); // print data row_number = 0; n = 0; fprintf(biomFile, "\"data\": ["); for (i=0; icluster_center) // center sequence { for (j=0; j<(*seq)->cluster_weight_unique_ids; j++) { if ((row_number == (numberOfCenters - 1)) && (j == ((*seq)->cluster_weight_unique_ids - 1))) // last seq to print fprintf(biomFile, "[%d,%d,1]],", row_number, n); else fprintf(biomFile, "[%d,%d,1],", row_number, n); n++; } row_number++; } } // end data // Print rows first_center = TRUE; for (i=0; icluster_center) // center sequence { if (first_center) { fprintf(biomFile, "\"rows\": [{\"id\": \"%s\", \"metadata\": null}", (*seq)->accession_id); first_center = FALSE; } else fprintf(biomFile, ",{\"id\": \"%s\", \"metadata\": null}", (*seq)->accession_id); } } // Print columns fprintf(biomFile, "],\"columns\": ["); for (i=0; icluster_center) // center sequence fprintf(biomFile, (*seq)->columns_BIOM); } fprintf(biomFile, "]}"); fclose(biomFile); } void printInOTUtableFormat(fastaSeqPtr* uniqSeqs, int count, char* OTUtableFile_name) { int i, j; FILE* OTUtableFile; fastaSeqPtr* c; fastaSeqPtr* seq; int id_len; OTUtableFile = fopen(OTUtableFile_name, "w"); if (OTUtableFile == NULL) fprintf(stderr, "\nCan't open OTU table output file.\n"); //, %s outputFilename); for (i=0; iaccession_id); j=0; if ((*seq)->cluster_center) // center sequence { (*seq)->line_OTU_table_size = id_len*2 + 2; (*seq)->line_OTU_table = (char*) malloc(((*seq)->line_OTU_table_size)*sizeof(char)); strcpy((*seq)->line_OTU_table, (*seq)->accession_id); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*seq)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); (*seq)->line_OTU_table_size = (*seq)->line_OTU_table_size + id_len + 1; (*seq)->line_OTU_table = realloc((*seq)->line_OTU_table, ((*seq)->line_OTU_table_size) * sizeof(char)); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); (*seq)->line_OTU_table_size = (*seq)->line_OTU_table_size + id_len + 1; (*seq)->line_OTU_table = realloc((*seq)->line_OTU_table, ((*seq)->line_OTU_table_size) * sizeof(char)); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*seq)->line_OTU_table + (*seq)->line_OTU_table_size - 1, "\0", 1); } } } else // not a center sequence { c = (*seq)->center; (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*seq)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); if ((*seq)->next != NULL) // not last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) // identical sequences { id_len = strlen((*(seq)+j)->accession_id); (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); } if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence { id_len = strlen((*(seq)+j)->accession_id); (*c)->line_OTU_table_size = (*c)->line_OTU_table_size + id_len + 1; (*c)->line_OTU_table = realloc((*c)->line_OTU_table, ((*c)->line_OTU_table_size) * sizeof(char)); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 2, "\t", 1); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - id_len - 1, (*(seq)+j)->accession_id, id_len); memcpy((*c)->line_OTU_table + (*c)->line_OTU_table_size - 1, "\0", 1); } } } } // Print rows for (i=0; icluster_center) // center sequence { fprintf(OTUtableFile, (*seq)->line_OTU_table); fprintf(OTUtableFile, "\n"); } } fclose(OTUtableFile); } void printSeq(fastaSeqPtr* seq, fastaSeqPtr* center, double score, FILE* output) { int i; char* score_n; char* score_v; char* cluster_n; char* cluster_v; char* center_n; char* center_true; char* center_false; int id_size; score_n = (char*) malloc(14*sizeof(char)); score_v = (char*) malloc(20*sizeof(char)); strcpy(score_n, "cluster_score"); sprintf(score_v,"%f", score); id_size = strlen((*center)->accession_id); cluster_n = (char*) malloc(8*sizeof(char)); cluster_v = (char*) malloc((id_size+1)*sizeof(char)); strcpy(cluster_n, "cluster"); strcpy(cluster_v, (*center)->accession_id); center_n = (char*) malloc(15*sizeof(char)); strcpy(center_n, "cluster_center"); center_true = (char*) malloc(5*sizeof(char)); strcpy(center_true, "True"); center_false = (char*) malloc(6*sizeof(char)); strcpy(center_false, "False"); (*seq)->header = table_header_add_field((*seq)->header, cluster_n, cluster_v); (*seq)->header = table_header_add_field((*seq)->header, score_n, score_v); if ((*seq)->cluster_center) (*seq)->header = table_header_add_field((*seq)->header, center_n, center_true); else (*seq)->header = table_header_add_field((*seq)->header, center_n, center_false); printOnlyHeaderFromTable((*seq)->header, output); printOnlySeqFromFastaSeqPtr((*seq), output); if ((*seq)->next != NULL) { for (i=1; ((((*seq)+i)->next != NULL) && (((*seq)+i)->uniqHead == FALSE)); i++) { ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, cluster_n, cluster_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, score_n, score_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, center_n, center_false); printOnlyHeaderFromTable(((*seq)+i)->header, output); printOnlySeqFromFastaSeqPtr(((*seq)+i), output); } if ((((*seq)+i)->next == NULL) && (((*seq)+i)->uniqHead == FALSE)) // last sequence { ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, cluster_n, cluster_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, score_n, score_v); ((*seq)+i)->header = table_header_add_field(((*seq)+i)->header, center_n, center_false); printOnlyHeaderFromTable(((*seq)+i)->header, output); printOnlySeqFromFastaSeqPtr(((*seq)+i), output); } } } void putSeqInCluster(fastaSeqPtr* seq, fastaSeqPtr* center, double score) { (*seq)->center = center; (*seq)->score = score; } int compare(fastaSeqPtr* db, int n, BOOL fastOption, double threshold, BOOL normalize, int reference, BOOL lcsmode, double max_ratio) { double score; double scoremax; double worstscore; BOOL toCluster; static BOOL first=TRUE; int32_t i,j,k; int center; float p; BOOL found; int lmax, lmin; int16_t* address; int16_t* iseq1; int16_t* iseq2; int l1; int l2; char* s1; char* s2; int sizeForSeqs; int LCSmin; if (lcsmode || normalize) fprintf(stderr,"Clustering sequences when similarity >= %lf\n", threshold); else fprintf(stderr,"Clustering sequences when distance <= %lf\n", threshold); fprintf(stderr,"Aligning and clustering... \n"); int* centers = (int*) malloc(n * sizeof(int)); for (i=0; i < n; i++) centers[i] = -1; k=0; found = FALSE; calculateMaxAndMinLen(db, n, &lmax, &lmin); sizeForSeqs = prepareTablesForSumathings(lmax, lmin, threshold, normalize, reference, lcsmode, &address, &iseq1, &iseq2); if (lcsmode || normalize) worstscore = 0.0; else worstscore = lmax; for (i=0; i < n; i++) { if (i%100 == 0) { p = (i/(float)n)*100; fprintf(stderr,"\rDone : %f %% %d clusters created",p,k); } if (first) { first = FALSE; if (normalize && lcsmode) score = 1.0; else if (!lcsmode) score = 0.0; else score = (*(db+i))->length; (*(db+i))->cluster_center = TRUE; putSeqInCluster(db+i, db+i, score); centers[k] = i; k++; } else { scoremax = worstscore; center = 0; found = FALSE; toCluster = FALSE; j=0; s1 = (*(db+i))->sequence; l1 = (*(db+i))->length; while (((found == FALSE) && (centers[j] != -1) && (fastOption == TRUE)) || ((fastOption == FALSE) && (centers[j] != -1))) { score = worstscore; if ((double) ((*(db+i))->count) / (double) ((*(db+centers[j]))->count) <= max_ratio) { filters((*(db+i)), (*(db+centers[j])), threshold, normalize, reference, lcsmode, &score, &LCSmin); } if (score == -1.0) { s2 = (*(db+centers[j]))->sequence; l2 = (*(db+centers[j]))->length; score = alignForSumathings(s1, iseq1, s2, iseq2, l1, l2, normalize, reference, lcsmode, address, sizeForSeqs, LCSmin); } if (((score >= threshold) && (lcsmode || normalize) && (score > scoremax)) || ((!lcsmode && !normalize) && (score <= threshold) && (score < scoremax))) { toCluster = TRUE; scoremax = score; center = centers[j]; if (fastOption == TRUE) found = TRUE; } j++; } if (toCluster) { if (!lcsmode && normalize) scoremax = 1.0 - scoremax; (*(db+i))->cluster_center = FALSE; putSeqInCluster(db+i, db+center, scoremax); } else { if (normalize && lcsmode) score = 1.0; else if (!lcsmode) score = 0.0; else score = (*(db+i))->length; (*(db+i))->cluster_center = TRUE; putSeqInCluster(db+i, db+i, score); centers[k] = i; k++; } } } fprintf(stderr,"\rDone : 100 %% %d clusters created. \n",k); free(centers); free(iseq1-sizeForSeqs+lmax); free(iseq2-sizeForSeqs+lmax); if (normalize && (reference == ALILEN)) free(address); return(k); } void computeClusterWeights(fastaSeqPtr* uniqSeqs, int n) { int i,j; fastaSeqPtr* seq; fastaSeqPtr* center; char* cluster_weight_n; char* cluster_weight_v; int cluster_weight; for (i=0; icluster_center) (*seq)->cluster_weight = (*seq)->count; else { center = (*seq)->center; ((*center)->cluster_weight)+=(*seq)->count; } } for (i=0; icluster_center) cluster_weight = (*seq)->cluster_weight; else { center = (*seq)->center; cluster_weight = (*center)->cluster_weight; } cluster_weight_n = (char*) malloc(15*sizeof(char)); cluster_weight_v = (char*) malloc(20*sizeof(char)); strcpy(cluster_weight_n, "cluster_weight"); sprintf(cluster_weight_v,"%d", cluster_weight); (*seq)->header = table_header_add_field((*seq)->header, cluster_weight_n, cluster_weight_v); if ((*seq)->next != NULL) // not the last sequence { for (j=1; ((((*seq)+j)->next != NULL) && (((*seq)+j)->uniqHead == FALSE)); j++) (*(seq)+j)->header = table_header_add_field((*(seq)+j)->header, cluster_weight_n, cluster_weight_v); if ((((*seq)+j)->next == NULL) && (((*seq)+j)->uniqHead == FALSE)) // last sequence (*(seq)+j)->header = table_header_add_field((*(seq)+j)->header, cluster_weight_n, cluster_weight_v); } } } int main(int argc, char** argv) { int32_t carg = 0; int32_t errflag = 0; char* sort; double threshold = 0.97; double max_ratio = 1.0; BOOL lcsmode = TRUE; BOOL fastOption = TRUE; BOOL normalize = TRUE; BOOL reverse = FALSE; BOOL onlyATGC = TRUE; int reference = ALILEN; int nproc = 1; BOOL printBIOM = FALSE; BOOL printOTUtable = FALSE; BOOL printFASTA = TRUE; BOOL printFASTAtofile = FALSE; FILE* FASTA_output = stdout; fastaSeqCount db; int i,n; fastaSeqPtr* uniqSeqs; char* biomFile_name; char* OTUtableFile_name; char* FASTA_file_name; int numberOfCenters; sort = malloc(1024*sizeof(char)); strcpy(sort, "count"); biomFile_name = malloc(1024*sizeof(char)); OTUtableFile_name = malloc(1024*sizeof(char)); FASTA_file_name = malloc(1024*sizeof(char)); while ((carg = getopt(argc, argv, "hlLanrdet:p:s:ogB:O:R:fF:")) != -1) { switch (carg) { /* -------------------- */ case 'h': /* help */ /* -------------------- */ PrintHelp(); exit(0); break; /* -------------------------------------------------- */ case 'l': /* Normalize LCS/Error by the shortest sequence length*/ /* -------------------------------------------------- */ reference=MINLEN; break; /* -------------------------------------------------- */ case 'L': /* Normalize LCS/Error by the largest sequence length */ /* -------------------------------------------------- */ reference=MAXLEN; break; /* -------------------------------------------------- */ case 'a': /* Normalize LCS/Error by the alignment length */ /* -------------------------------------------------- */ reference=ALILEN; break; /* -------------------------------------------------- */ case 'n': /* Normalize LCS by the reference length */ /* -------------------------------------------------- */ normalize=TRUE; break; /* -------------------------------------------------- */ case 'r': /* No normalization */ /* -------------------------------------------------- */ normalize=FALSE; break; /* -------------------------------------------------- */ case 'd': /* Score is expressed in distance */ /* -------------------------------------------------- */ lcsmode=FALSE; break; /* ---------------------------------------------------------------------------------------------------------- */ case 'e': /* center with the best score > threshold is chosen, otherwise first center with a score > threshold */ /* ---------------------------------------------------------------------------------------------------------- */ fastOption=FALSE; break; /* ------------------------------------------------------------------- */ case 't': /* Clusters only pairs with similarity higher than (threshold) */ /* ------------------------------------------------------------------- */ sscanf(optarg,"%lf",&threshold); break; /* ------------------------------------------------------------------- */ case 'R': /* maximum ratio between counts of two sequences connected by an edge */ /* ------------------------------------------------------------------- */ sscanf(optarg,"%lf",&max_ratio); break; /* -------------------------------------------------- */ case 'p': /* number of processors to use */ /* -------------------------------------------------- */ sscanf(optarg,"%d",&nproc); break; /* -------------------------------------------------- */ case 's': /* Sorting option */ /* -------------------------------------------------- */ sscanf(optarg, "%s", sort); sortingKey = sort; break; /* -------------------------------------------------- */ case 'o': /* reverse sorting */ /* -------------------------------------------------- */ reverse=TRUE; break; /* -------------------------------------------------- */ case 'g': /* replace n's with a's in sequences */ /* -------------------------------------------------- */ onlyATGC=FALSE; break; /* -------------------------------------------------- */ case 'B': /* file name to print results in BIOM format */ /* -------------------------------------------------- */ sscanf(optarg, "%s", biomFile_name); printBIOM=TRUE; break; /* -------------------------------------------------- */ case 'O': /* file name to print results in OTU table format */ /* -------------------------------------------------- */ sscanf(optarg, "%s", OTUtableFile_name); printOTUtable=TRUE; break; /* -------------------------------------------------- */ case 'f': /* don't print results in FASTA format */ /* -------------------------------------------------- */ printFASTA=FALSE; break; /* ---------------------------------------------- */ case 'F': /* file name to print results in FASTA format */ /* ---------------------------------------------- */ sscanf(optarg, "%s", FASTA_file_name); printFASTAtofile=TRUE; break; case '?': /* invalid option */ errflag++; break; } } if (errflag) ExitUsage(errflag); fprintf(stderr,"===========================================================\n"); fprintf(stderr," SUMACLUST version %s\n",VERSION); #ifdef __SSE2__ fprintf(stderr," Alignment using SSE2 instructions.\n"); #else fprintf(stderr," Alignment using standard code, SSE2 unavailable.\n"); #endif fprintf(stderr,"===========================================================\n"); if ((threshold == 0.0) || (normalize && (threshold > 1.0))) { fprintf(stderr, "\nERROR: Please specify a threshold > 0, and < 1 when scores are normalized.\n\n"); exit(1); } fprintf(stderr,"Reading dataset..."); db = seq_readAllSeq2(argv[optind], TRUE, onlyATGC); fprintf(stderr,"\n%d sequences\n",db.count); if (db.count == 0) { fprintf(stderr, "\nNo valid sequences. Exiting program.\n\n"); exit(1); } if (!onlyATGC) (void)cleanDB(db); if (!lcsmode && normalize) threshold = 1.0 - threshold; if (threshold > 0) (void)hashDB(db); addCounts(&db); // first sorting of sequences to have good unique heads if ((strcmp(sortingKey, "None") != 0) && (strcmp(sortingKey, "none") != 0)) { if (reverse == FALSE) qsort((void*) db.fastaSeqs, db.count, sizeof(fastaSeq), uniqSeqsDoubleSortFunction); else qsort((void*) db.fastaSeqs, db.count, sizeof(fastaSeq), uniqSeqsDoubleReverseSortFunction); } // getting the vector of unique seqs uniqSeqs = (fastaSeqPtr*) malloc((db.count)*sizeof(fastaSeqPtr)); n = uniqSeqsVector(&db, &uniqSeqs); uniqSeqs = realloc(uniqSeqs, n*sizeof(fastaSeqPtr)); // putting a flag on the last sequence for (i=0; i<(db.count-1); i++) ((db.fastaSeqs)+i)->next = (db.fastaSeqs)+i-1; ((db.fastaSeqs)+(db.count)-1)->next = NULL; // sorting unique sequences if (strcmp(sortingKey, "count") == 0) { fprintf(stderr,"Sorting sequences by count...\n", n); if (reverse == FALSE) qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), sortSeqsWithCounts); else qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), reverseSortSeqsWithCounts); } else if ((strcmp(sortingKey, "None") != 0) && (strcmp(sortingKey, "none") != 0)) { fprintf(stderr,"Sorting sequences by %s...\n", sortingKey); if (reverse == FALSE) qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), sortSeqsP); else qsort((void*) uniqSeqs, n, sizeof(fastaSeqPtr), reverseSortSeqsP); } if (max_ratio > 0) fprintf(stderr,"Maximum ratio between the counts of two sequences to connect them: %lf\n", max_ratio); // Computing if (nproc==1) numberOfCenters = compare(uniqSeqs, n, fastOption, threshold, normalize, reference, lcsmode, max_ratio); else numberOfCenters = mt_compare_sumaclust(uniqSeqs, n, fastOption, threshold, normalize, reference, lcsmode, nproc, max_ratio); // Computing cluster weights computeClusterWeights(uniqSeqs, n); // Printing results // FASTA file if (printFASTA) { if (printFASTAtofile) { FASTA_output = fopen(FASTA_file_name, "w"); if (FASTA_output == NULL) fprintf(stderr, "\nCan't open FASTA output file.\n"); //, %s outputFilename); } for (i=0; icenter, (*(uniqSeqs+i))->score, FASTA_output); } fprintf(stderr,"Done.\n"); } // BIOM file if (printBIOM) { fprintf(stderr,"Printing results in BIOM format...\n"); printInBIOMformat(uniqSeqs, n, numberOfCenters, biomFile_name); fprintf(stderr,"Done.\n"); } // OTU table file if (printOTUtable) { fprintf(stderr,"Printing results in OTU table format...\n"); printInOTUtableFormat(uniqSeqs, n, OTUtableFile_name); fprintf(stderr,"Done.\n"); } // Freeing for (i=0; i < db.count; i++) { free(((db.fastaSeqs)[i]).table); free_header_table(((db.fastaSeqs)[i]).header); } free(db.fastaSeqs); free(sort); free(uniqSeqs); return(0); } sumaclust_v1.0.35/mtcompare_sumaclust.c000644 000765 000024 00000021550 13641111346 022277 0ustar00celinemercierstaff000000 000000 /* * mtcompare_cumaclust.c * * Author: Celine Mercier * */ #ifdef OMP_SUPPORT #include #endif #include #include #include #include #include "sumalibs/libfasta/sequence.h" #include "sumalibs/libutils/utilities.h" #include "sumalibs/liblcs/upperband.h" #include "sumalibs/liblcs/sse_banded_LCS_alignment.h" #include "sumaclust.h" static double computeScore(void* c, int32_t seed_number, int32_t i, int thread_number,int32_t maxcount) { thread_control_t *control=(thread_control_t*)c; fastaSeqPtr* db = control->db; fastaSeqPtr db_i = db[i]; fastaSeqPtr db_seed_number = db[seed_number]; int LCSmin; double score; score = control->worstscore; if (db_i->count <= maxcount) filters(db_i, db_seed_number, control->threshold, control->normalize, control->reference, control->lcsmode, &score, &LCSmin); if (score == -1.0) score = alignForSumathings(db_seed_number->sequence, control->iseqs1[thread_number], db_i->sequence, control->iseqs2[thread_number], db_seed_number->length, db_i->length, control->normalize, control->reference, control->lcsmode, control->addresses[thread_number], control->sizeForSeqs, LCSmin); return score; } inline void putSeqInClusterMT(void *c, int32_t center_idx, int32_t seq, double score) { // saves a sequence as belonging to a cluster and its score with the seed thread_control_t *control=(thread_control_t*)c; fastaSeqPtr* db = control->db; fastaSeqPtr pseq = db[seq]; pseq->center = db+center_idx; pseq->center_index = center_idx; // saves cluster pseq->score = score; // saves score with the seed pseq->cluster_center = FALSE; } int64_t timevaldiff(struct timeval *starttime, struct timeval *finishtime) { int64_t msec; msec=(finishtime->tv_sec-starttime->tv_sec)*1000000; msec+=(finishtime->tv_usec-starttime->tv_usec)/1000000; return msec; } void computeOneSeed(void* c) { thread_control_t *control=(thread_control_t*)c; BOOL found; int32_t seed_number; int32_t nextone=control->n; int64_t elapsedtime; struct timeval current; struct timeval start; seed_number = control->next; found = FALSE; //printf("\n seed = %d, n = %d", seed_number, control->n); #ifdef OMP_SUPPORT omp_set_num_threads(control->threads_number); #endif gettimeofday(&start,NULL); #ifdef OMP_SUPPORT #pragma omp parallel default(none) \ firstprivate(found) \ firstprivate(seed_number) \ firstprivate(control) \ shared(nextone) #endif { int32_t i; double score; int32_t current_seed; #ifdef OMP_SUPPORT int thread_id=omp_get_thread_num(); #else int thread_id=0; #endif int nseq = control->n; BOOL fast = control->fast; BOOL lcsmode = control->lcsmode; int normalize = control->normalize; double threshold = control->threshold; BOOL first = TRUE; BOOL not_already_in_a_cluster; BOOL threshold_bad; int32_t priv_nextone=control->n; int32_t maxcount = (double)(control->db[seed_number]->count) * control->max_ratio; fastaSeqPtr* db = control->db; #ifdef OMP_SUPPORT #pragma omp for schedule(dynamic,10) #endif for (i=seed_number+1; \ i < nseq; \ i++) { current_seed = db[i]->center_index; not_already_in_a_cluster = current_seed == i; // At the beginning all the sequences are their own center if ((! fast) || not_already_in_a_cluster) { score = computeScore((void*)control, seed_number, i, thread_id,maxcount); // computes LCS score or 0 if k-mer filter not passed if (lcsmode || normalize) threshold_bad = (score < threshold); else threshold_bad = (score > threshold); if (threshold_bad) // similarity under threshold { if (!found && not_already_in_a_cluster && (i < priv_nextone)) { priv_nextone=i; // saves potential next seed // *potential_nexts_list = i; found = TRUE; // saves the fact that a next seed // has been found for this thread } } else if (not_already_in_a_cluster || \ ((! fast) && \ (db[i]->score < score))) { // if seq matching with current seed : // clustering with seed if seq doesn't belong to any cluster yet // OR in exact mode and the score is better with this seed if (! lcsmode && normalize) score = 1.0 - score; putSeqInClusterMT((void*)control, seed_number, i, score); // saves new seed for this seq } } // if ((! fast) || on_current_seed) } // for (i=seed_number+1;... #ifdef OMP_SUPPORT #pragma omp flush(nextone) #endif if (priv_nextone < nextone) #ifdef OMP_SUPPORT #pragma omp critical #endif if (priv_nextone < nextone) nextone=priv_nextone; } gettimeofday(¤t,NULL); elapsedtime = timevaldiff(&start,¤t); control->elapsedtime+=elapsedtime; control->next=nextone; if (control->next < (control->n)-1) (control->seeds_counter)++; else if (control->next == (control->n)-1) { control->stop = TRUE; (control->seeds_counter)++; } else if (control->next == control->n) control->stop = TRUE; } void initializeCentersAndScores(void *c) { // Initializing the scores table for each seq : thread_control_t *control = (thread_control_t*) c; int32_t i; fastaSeqPtr *db_i; int scoremax; if (control->normalize && control->lcsmode) scoremax = 1.0; else if (!control->lcsmode) scoremax = 0.0; else scoremax = (*(control->db))->length; for (i=0, db_i = control->db; i <= control->n-1; i++,db_i++) { (*db_i)->center = (control->db)+i; (*db_i)->center_index = i; (*db_i)->score = scoremax; (*db_i)->cluster_center = TRUE; } } void freeEverything(void *c) { thread_control_t *control=(thread_control_t*)c; int i; // free(control->potential_nexts_list); if ((control->reference == ALILEN) && (control->normalize || !control->lcsmode)) { for (i=0; i < control->threads_number; i++) free(control->addresses[i]); free(control->addresses); } free(control->iseqs1); free(control->iseqs2); } int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize, int reference, BOOL lcsmode, int threads_number, double max_ratio) { thread_control_t control; int32_t i; int lmax, lmin; if (lcsmode || normalize) fprintf(stderr,"Clustering sequences when similarity >= %lf\n", threshold); else fprintf(stderr,"Clustering sequences when distance <= %lf\n", threshold); fprintf(stderr,"Aligning and clustering... \n"); #ifdef OMP_SUPPORT control.threads_number = omp_get_max_threads(); #else control.threads_number = 1; #endif if (threads_number < control.threads_number) control.threads_number = threads_number; calculateMaxAndMinLen(db, n, &lmax, &lmin); control.addresses = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); control.iseqs1 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); control.iseqs2 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*)); for (i=0; i < control.threads_number; i++) control.sizeForSeqs = prepareTablesForSumathings(lmax, lmin, threshold, normalize, reference, lcsmode, (control.addresses)+i, (control.iseqs1)+i, (control.iseqs2)+i); control.db = db; control.next = 0; control.normalize = normalize; control.reference = reference; control.threshold = threshold; control.max_ratio = max_ratio; control.lcsmode = lcsmode; control.stop = FALSE; control.fast = fast; control.seeds_counter = 1; // control.potential_nexts_list = (int*) calloc(control.threads_number, sizeof(int)); control.n = n; if (lcsmode || normalize) control.worstscore = 0.0; else control.worstscore = lmax; control.elapsedtime=0; fprintf(stderr, "%d threads running\n", control.threads_number); // initialize scores table : initializeCentersAndScores(&control); while (control.stop == FALSE) { if ((control.next)%100 == 0) { float p = ((float)(control.next)/(float)n)*100; fprintf(stderr,"\rDone : %f %% ",p); } computeOneSeed(&control); } for (i=0; i < control.threads_number; i++) { free((*((control.iseqs1)+i))-(control.sizeForSeqs)+lmax); free((*((control.iseqs2)+i))-(control.sizeForSeqs)+lmax); } freeEverything(&control); fprintf(stderr,"\rDone : 100 %% %d clusters created. \n\n", control.seeds_counter); fprintf(stderr,"Pure computation time %f \n\n", (double)control.elapsedtime/1000000.); return(control.seeds_counter); } sumaclust_v1.0.35/._sumaclust_user_manual.pdf000644 000765 000024 00000000412 13447150660 023367 0ustar00celinemercierstaff000000 000000 Mac OS X  2Ø ATTR Ð:Ðcom.apple.lastuseddate#PSà*$com.apple.metadata:_kMDItemUserTags¹Ñœ\ŠV.4bplist00  sumaclust_v1.0.35/sumaclust_user_manual.pdf000644 000765 000024 00000246577 13447150660 023202 0ustar00celinemercierstaff000000 000000 %PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x¥›[“ÅÇßçS4Žƒµfw<÷Ñ8/!˜JH‘ÊK‘ªÀ6&¬ –ÌÅ_–Ï’Ó3ýÿuK£Ý•vËåÒìéӧϽOßÞ¸ÏÝW¸¶È›¶ª*×­ë›2o›~é6/Ü—îµ{òѶt«­+ÇÛÕuø™á¿tE¾ä¿á¶]“·ÝP»¡É›¡ë·Ž°¶Í«¶/zw•Àê|¨‹ªÍÚ®¶uïÚ*_¶õl»*/»nˆ•«­±®Ë2®\mü]ñ²Úä« ß3Pw"Œ–°ÊºÎûº«Œ¯ÖæEWg/ë./ëeYâŬó"3ƒrÊz$µ+÷*ÛÑ¡tÑ™v–Ý2óÖæƒY±6H™7Ͱthºí ³GkM‰ÜfšºéÍúf´Lm[”IϨiQÀƒKìQZkY7§%y©Šr(#uä¬Å¯ÄÀ«`£ŒA"Á¢Ô2RGâÁøzå^>6¿º¢_6µÿjCî2ÿU–}׺Ñ[ÍðݲÝõÖcÄÉ”#žI˜wUaj2ãmÙdÞ”umÑ“p ;Ú °Ñ[‡fÙvŽžæbU]6ƒÑ Ô1œà™F+`a5ï­Àš¼î«¶ò‘zfžßµmÓFkIÜØ$£—ÈÇÌÔÓËè¥ÎZQ$ò€¦«Ö\¦é¶ô¬´öe»ª5mY'_Ų°? É]¤öC•­Öî/—Ά[í·^º²íÝåÚ=¹¼ô¹èò¥û[¬_œùΕ[¼=3šöûÿ>²Ù¬~Tã·úø^¯õñ>ò@‘N›ïβi°'¡iû³×Œ»ºŒÆ­1÷µ»ü»ûøÒR®’JÖumnç“â°Ì«²±tì*…5yß—>Qª¯á{åʢɫ¡RŠæÕyk¹1¥˜Àè­¾{+3»eÛŠ}o)y‡ÅP¤zîÒ³™!ó¦´(»Íöîí+ËYØ>›lÿe0&” ¼’\À˜5à5îÌR€y þ@Ë/|aOá' Ý/¸O†jl:½ ̨‡c ßÄçEðÁlAÛ{ƒÇ©Š`LzIÎ-ßH¼”&z­ ÎÎ÷Ä¡·äü=ö¦ 2bY|éo8çío¥8äÞ@wjÊЧ…¹…ˆpd"„¹p(†f ˆÀ'#Š©5Z‡šÊÈKÓ˳,f‘»…‘åÛF™Rè‰.xð÷½²"¬KoÑ@(n‹4`ÓFÆF= &Šà®¡ƒÿBPv4§èW¾)rÂÄ 1 ó=ÿ~þ³Ä¼5ÕEC@}²…PH'eŠQ¾:.‡v,WEsP‚8ØôÁ w·x7AbÃñélÑMÐ[æyÓÿMóü<×·]—[EV:_)ñm¶Ïl¶ÿT9ëãôõaÊOcÅŠUÃVÞöÆZo‹†jÈ«e_åGQôE×Ùº&³Ùhüw§Ù¨+ª|XÖF»o³”C_ðšPŸÜæ5÷m›™÷C›hÁ ×x¡\G‘7¤õKð*_¿ŒNl„}JöÈ+À¬¾" ÷ü*£#w«?–Îb]D/p-”肸êC <Îb(–-~yµ?4-û úî¡&¶ôJmêd%ºã”/ƒˆ>ØCÔð >Bn‰y *0R ç*;£KPŽª½Àý#_‰1WÝi¾¬ËaâsÑdÔ€D@BŽ™uŸ{Çlp?-6D^ AíIq¸ñnžô…‚5åõSC+`xÖxDƒÉ !°)Qœ·Dd´#zh”p~6Ez¶ø§BþÃ3gëÎ>ª):¹€Oèñ+¿Ëׇyä:ß›ûAÍdžDó r…wЈEÑ•xBîS²©K²é·¢´Ïù–Åðq$õÇ™ióCà?[l¶&Ú}£§±sí,Ø­Œ:rBœf1©Y)[@€4Ò7äŸ#™¬LKq ‡Iñ1÷6Ô™(Ž„qSþ–hN¢e‹¢Áî2µ[°a­¹LS`BÇ«ÈNÏ Mï·ŒlW£=!nÝøbî 9µÜ§‚ÐôüòÌÙ>Föð¬‘$®”Ù;ì2øýÆ®«l{²)gICfr‹‹¿‰ÛOB¶ð¼ZáºWf ƒÅŠÆ¸+R%– a’Z.¤°¹å3)y¶»·V[Ѽ_ËÎÙŒ™‚¶×ÊMâ’¹±2(¢B@Ø-«±ÌSÃÎFLÔûq)`o›½³y›®°"ŽãvÙ•ZèÅM dû…è iC·lqsžGt—Ádq¯E¬aBx”*°ˆá“ͲY2{%FŸMÀ8Y@‰|Ñ9–­Hƒ|b2’ÆfÛhôÁï£ì>››ªÏ—}ã¹FÜ……O8Ç#/qW›¸iÖæÏãìigOkq„Çq€œ´*É8cŠõ«’¨ÇÚJ÷®±Ò¯ªMú¦¬ì t3ØÃ!B¬–!™Ç)›¢õ•|Ú/À¬’ú¼ó—¼jmiWû‹e2‚Ýi°”âN_(žPÕηi:[ØKƒá IågJHQA*ë€Èçñ´Iuy["š3hµHoÏCöÑQÓ¼•ç{ù†IE8©¤”Ôi. ™_MH‰ËE~„Ci TÐÙ‚!iš_p'žÚ¸ÍÆ+ú·ét>‡{Úü˜êtç¶dUdAkjA0'׈}nÜÁÛ796X*¦F42c£J÷×q‰A¾©øI_¬xsN3/ýgIŒÇ2—Ó_¤Ü0ŠƒG(I¾8éÆåNåТæi‚þavžiMOfx¸3>a¶÷x(>:êñZž÷Äž<:íñÐDk|vä¯Yí>ŠO€xÊÅ£ ‡‚Œ‡EêèKÏÎÆgZ_>¶'‡Á0­ÜÚ=’e™wKËò¾ M'žz×êú¢(*w¹²WVcY|áßËUnÙt!†ëéÑâ½xøÇ÷}µøêìáãÎ\ä<~ïÉW‹âQiÿU¥!”õûgîò'åŽÈ‚Yo‡{Œ6툈…‹æàÈ~ÈéEÑmé*L×¹lö¤>Ðvûå8n><}üpøÓã÷äùYvì˜!E^;¦-PÂJBbŽcjd;ò‰jfOTOõ‚ÊÞªÚ¿ ûõé[›ÂöŠ/”æþØm\ ¬µã@"Y b©mDêV oŸ*m¿¤WlTÚ¡É2ÓHÇÓø+„ íb±ÓÞ Èõ\q™ÅŠ3޽}²,7þŠ›.v8°|:þm“y¬àŽt9âÌí*»´ëGÓ\Ù„8Û¾xóó‹×«¦"¹˜ÙÈK›–þáX|ûVÚs·ÊN‘[{!9>Â'iÓ+äÑ®GÜîaOð&GßVÞìö“=½E{ÒŽšŽZ’`Š·Ò¯0MÏQAF/玌Éh›ÉvÖ7“ñn«ù]›Î{»ßv2>“CˆQ›¾wCN¥vQ²Ë iKí;µT¢ö·k0ýBó>û«âï~a> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 11 0 obj [ 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R ] endobj 18 0 obj << /Length 19 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x–wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû endstream endobj 19 0 obj 2612 endobj 7 0 obj [ /ICCBased 18 0 R ] endobj 21 0 obj << /Length 22 0 R /Filter /FlateDecode >> stream xµ[m“Åþ¾¿b¥SU$ù¼ÚÝÙWŒæ€ãÍ1†sQ©\>cR>ßHþ,¿%OÏôÓ3+élr¹¼~v¶§ßgz¦õ2œ¿Ì˼-‹¦­ë:oÇ6h›~ȯ¾Ï¿É_䛓ë*¿¸Î+ÿçúâ¦ñÆ?ÍËb°¿ÛvMÑv£UW´mUå— V÷Eåš.žbm1”ýµ+šÑõy_7E®.ª®#r‘»ºœYõ邼µÐõÑ©ÿ·øQ ï红oÊ1W—…«›Æ[U#ÁUC1Ž}ëõéãßU}1ÖÕD½ÛDŸÄÄÛÿÄbu‹kò žËøw­+ª¶o…VÄ#â8‘z Õ´ãUêˆ$:%æeÔø'‰(u«Ô$ðà=7J®ZÌ$‹R5l\‡$š@eóYø›˜RD2Îð'&ŽÄð7Ì‚ØaBO}‚€!ÅHw-¬õ©ˆÕHFe“WM',P÷IôÓ â—Q­ROÀøº)ú}Øþ‰·ªç“ µ¤÷~»•M þ\„h•˜‡ÈD9aTpÖüö¥…0‰'€ùDÄb E¬‘Ï‘ô(qDU_×}b "©¯*¦ú ã¿´ àH="ÊC̲–²tP#>ÊÉ5ÙÔn(:hPL«ÁP»¾pU´êS@ ·¯rµ™–ˆ„-Ý˰$fLêqS@@ŠÑ^÷Xdú¶ï&Š3@Ý»bè‘'" Š€­È*±Vƒ@Ä¢Ð} ÷ÆÃd0Ñ¡†{Ý”EݸI €º G=]/)¦e› €Pÿ„(cFʉâ9jŒn„n\›ÆÝ—¸¥æ–ÌDŒ PñIøÛ¨$ü £šA+'×äà¶ÑŸMt¬Ño+úè¯a3踃­ÃÚŸ‹G”}'û®`°¥HªbÞQC„Ú8‹b£N$ª ´¸ÎÓ<ž”ß4äâá}Û#Í2ü)}âÕXI•Xч¿³`7êD@+„0õŒ¡”½* L‰Ý|ë¡»é+lFPf ùÅeþÁY޵J¾º‹ÝM]曳3):ΞæÿÈ—_åc…âbùŸUJu¾ü™ù 3¸ø–È >„WÙò¾ºü‰ï~äÃs>|ÏRüÚæ¸TÚ eÃíåõ+å€ßýJB6G<ã›|•ý3?û,ÿè Eö ØiaCº÷ º :ÆÆ¹°Œ¾ŽJ0쟧Ãþu=xgÀv?ïGìµÆ¡ ¹tÀ^ŸÈE^ð˜Qj?Å@ [c¤@ì+ˆiAÙ ´#àçGÒ3¤Ç¾{è\þ<‹|¶ÊBò¶Äx‘dÄÆ¿cŠ´tlyý‚iT?Ï–¿Ø;¾²¯®‘O±™ƒ¹Æ%râ Æ`K Mƒ>3–Xo™)AJ¢nÈÀ’-c9S2 +6öM]¦b‡][ÛÔ f$g BO‰PŒ«Ó̉krÉ" L7`‹œW&±(²¦¥DWdáæ4®l "-]ÈPÊFŒÔ„ Zƒ©p_ªfJ˜ª™Ì§j&¶G[¦xeAjYÃ,O$¿kÃmK )ª™‘ª™XYŸ(!pà YV8ÛÙòÓ€M5¨˜&CÑ`Ó ðpM¬ÁQ¥Î!"õ”ç_ò;Ó¯¨%×Ç/½ïºÆa¡©î…F@,ÕF,ªÐ†iªMˆC2Iµê©~‰Ñä«*ô¬ê(©,L b‰r4‘'(Ü*Õb›ša›º7Õâh±Zº$2Õ>úéû¿|»\‹<‰¼Žä=Éë DîkÔÐ;iwyœÿúã«gïÄÙg/}iêÞö@ÓŽ%cõm•0 «oÃ`Ö†Y¹ÂM9FÕÊ[hÚÉ$°Τ¢áéeRÐbõ:r ™èIÅ}¬}³ÆHd•‡¡˜³ÅͶ¨¥ë\³}SòV«xjnOãÏÝÊå8Q„Üé~Ø«¯ÏV9âûl¹CÇ4g71z’ÞÝOøôé õŠv¡‹rvYlmû÷¦uÍø6IžÓˆ‡iDí{™nßv,€ÛŸíÓŠ]fy€/õ]¶4Å™EÿGÍE5‡zª ±Wö޼ªhssR3Ã15ÀvÖÛÄLÿ6”Tç†\]Ù”&“¾Ìöœ×\ÏI¬Æxs ãäÅF› \\fÞ°#›‰Ïi¿£¿˜.cà˜æKüÊ&ˆGHj‚Œ6Í—¿ÅC(òa¾°«¤Ò/ÈÙÏ·Q’AžX äî{Ïæª vÛîngjÑ(½ àÌq¯Õs©“Ú¬ ó‹éñ&eKÆHdÃÒÞœ ]™Ñm’Ì–oöG(Ù\·V¹¤F¹­Ü³íLhÓµ%Þgš1ƒ˜°ŸªŽ~j1ôÿÅ Üš(_`¶ Ùí4‘-¯8ÓMCr[Jl­·3ž,TíÕ•9 '0f쫛ī×ùÒ&5z»tÎWÇ[Ë’¹3Ä Y×#;¿™›ºøjw†ð&[~¼ÊqQˆãí²Òâ‚`Ä£Çú¨'ºwd"®*Ôr‘ž+ÿŽ0o°û<»Ì&gð®,)š_ÅiŸ¬ ñëe$¾í+QÀ“œnibüQ¿fJ3 ç4 N^E—àPÓ.©¶…[erÓë72HžmÚr'ÏÂK¼FE ²]šj0DAa—È¡t€Y1ôº{oEnÃ2^Mˇᚘ·Ü¼øŠ7áIhwܱFô¤ü¹•Y$ž7ß{Ë)€–’¨)ß½·J(Ö-ï½§¥bü|«V”.¹´«îv•˜®ÈZ+fr40©q>l‹ë;Çó»ÅõlÑß_$Åbjv^xú¶’ßwáiW rêų»ÜŒv·qf> zJƒ ×ðB‹çáBBèžþÄ]®@AÊ\Ô.7“óÃ,&v.›¯»Yu¾š¯góÅ ïÝÑzsr¾Ú¬»×›ÆÙýÍz<‹ùÑ8{°ù`óÞû뫌w’4¬1¢Á ʇÏ[\ãW¸öËq‰Ô¹w}ÛΛC'!MÓ][öicHS£™ÏM;CœÍø“v1Žo¤àÜñlŠˆœdÒÿ óNšC KäÔcgˆñZlip³ïBA+b7£ ZAÙzÖ ™¥éÆ>¶†_怆 é—¥ý0 „ê±5ÄxS÷H-Õ¢¶†ÈÙäàÐs!3ƒfǶr±5Ää´ÞC 9›C ƒäì#–È©Ô퓇Ô"hllºÖ·Øš•ЩâڲƇ¶žšœ‘j_´¨Í¡6JdÔfb‰_(õDä!Þ]l7‡bµÍ¡ ¥¹qâ¯ÄÈY°¥?s. iD×I±e× cÊW@&þª£B’ "ü2¦=Rg©”Zh1_ÒBiÂlÐ2ì4®`”RGdu-|IÌdâ¯:Ê{“®ü“ò¥—1H­Ô}1–UÓ“=ÇÊÌ(î®2S“¤LÐÒqQM4Õñþzef7+3 *) ~bÁaü®ãfe¦êÕÄ(Êœî:âç[ËÏŸ¼ë@÷ù»Ž²/N?9ŸÞ;=:mN»Ó“Swz¾ªe?[Ìîuëû'E³9_΋; ëÅúäh6Þs›¶{ À§‹ãù_Æã;Ç›£ùl<è³Å½;ÇïtG~Ù"óf-øç‹óÕXt›{óãns¾:9Ú|þÅÿõòt<ŸÍºfsrgöÙ™Œ}¸3öá£/7³ù;E·ÿƒÇ;<þêëG_í¬ m}ʉk9iØyû³®Ð %­I'eèÁ…¼ø“.ÕˆþÔ]¶`êÔ1ÿ—$9JVKB¶äe"ÚèƒùA‰ #n°åšÇwF wz-n!ia)®1¾ÃժŠ:&IâŰ/ÚªãLâ©ÆS'’“År¢A]Ñ(â•gÿESHÕÊÝPXU¢ˆ¶ö˜Ò!4×IÃ’uÒ0æ×Ы"Ô‰HƒIºÔØVáW,“j´ð¨N’jJ‡;Sý Ÿ¸u‰4LtÇ~PÚÆ6¤Ãx8p‰ô~z#ÕC'%g  ã`¯J4tŸô€”ÚAL*Ȥ¢à(ï£ÚBIÌR¸|)Ä øcZP˜i<©p))ÞRÒA]XçGôt$æ HZQب ¡È0Û>õ‘®Aª9=Y '®ª»‰A ›ªž“*§~¦£^§JOk¯*…÷©ž“*½ËZôé¨×©´ÔP;ª­íåÑ&n·–GÔ)ÙU”ã¾>Û*Ê»–‡º{ª³fÑ-°žÝ¦@kFÔo÷îv›'ïnÎ6Íx¾:_uGõÞZíÐkáXŸù^¦lô-É_ ‘e|…g­¼ú«¿Û6SHÏ/Úœü57þ•&вíõ¼«±¦ßy/ðuAçÀ%^¸­µ³VCâM¶|eG~¯pìÊc3ÿ/†Ä°ƒÎHyZ6ø›yä¹ù³«ùÈò2tÍÎNÆp†ê¹àñ¢\š{Àd1ÎM\æù!ªÄ!å­E™ž!ùö’N¥B¦”;×N ±üôÅO?c"VÿiL§ M,þ¤j: ~œ¥{FÕÝòÉõ·?ÀŠ·š…v™ÒƦ´Ñ?þÑiÓ®é'¤Ðn¶¤–Í— æ[:J;â%¨´Ç w¸Ö‰ŽòHM&Ï—û¼Ôs5aâñÿ÷}Û< endstream endobj 22 0 obj 4255 endobj 20 0 obj << /Type /Page /Parent 3 0 R /Resources 23 0 R /Contents 21 0 R /MediaBox [0 0 595 842] >> endobj 23 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream xÅ]ív·‘ýßO13œ³¦Fähú»[´’Ø\åÄJ¯c®ÛòÆ-ÇI,g-æcó–ûy–½Ô½Àt)R’Ï*'æðºPuQ]ÐÍ.~XìínÛ´UU-Ú±]ôM¹m›~X¼x¶ødñýâÁùU¹¸¼Z”áW—×µ/Ðþ|iÿC+ÈݻݰëÛæ¿VUßnwc·¸|¾x÷bQ6± ~ÖâªÆ¡¸x¾xpqa}^|³ø|qüÑßî- ¢Z?ÿŠŸ.¿ã'}yõ×{è­Þ²Ÿåâøjq¯À×lûŒ¾ñ¦’')’Ki oú—{ETBMÙâ¿)uö ¯ý#[@%Ó±8ò=¿bÛ™j²KÊî7-ŽÿB/ATnëêóš ÿý[^#N^<£…l«ñ•¿¢–êZ¶¿ˆMŠãé"qªpÇêB_éƒ.ÿzª×õäÑê¹uTü[ “ø¹ úê…ô”4œVêj©ìòJò~ bK_}O½.]aì¾X\y‹ã—¯v/ž“ùÏÝ“ÿ,Âþùèïóá˜S}æ~á?·&8^3jÔ[Ì´R'ðþs2­äDRn¢4Ä»íØWm3"Œò„C`­‡v[C³hªr[U]¹xžcÝvW—‹ïr¨ßÖ-ây=4Ûr7öES Û¦®-ØVÛ¾Kˆrâëݶov&Þ1ȪÆm³‡„Õø²®Ë²(Ý´‰*@” ²ÛBÛÚÔJ˜e€J¸ð¢)›í–e*1«©*131´HW:7Eéb‹:\.¾µ<µ˾kúòà§ŒfXx€f ËyN]ÎÕŠÊ'sž3ƒÄ3±Ct‘yêíÜç<§š ¢urˆœg Tp’œgb™røÅ¼†ÿÛ0@õÐwð‰ŒÃf1ê;p¬Ý¶u×ãÊzÛuCÊÑp8À‡l°ââ‹„™áãvhKø4ÛRÖåœ"JwmÜ1ÃØJþEÙ…˶•ðàö]]uÑWƒ à9 ÎaP•˜™ ‚,ogÞkFCVg4éŽH…છ07ºýœªˆsªÝv·Ûaöt™Ï®Ì^ÌÉ0ÇJé s¬ãËïþvõ×g/î-.þäÉqç¶38ÌŠÐ]5íc6”UÖÝþ”îøq”=¥øvènÆf,·ÝØZŠŽT<Ï1Ƽ¬™»%âè¶ÃÄVÁ¬Æm5ö)¼¯±ß–cצV¯±Ý}{˱Ùöã`Á’>Ÿ AÅFô,%ŒAIÂuŸKG +©ÊVßÁh·‡P2™á'C¢sC"Üèe!/]™nׄ¹A…)ÁÑH}NÕÍT4§™6æ4³Ý!¶Ä_º[Åi 7Ð*]˜Æg>†Ó‘Îiöè,œºL¦ðDBðlx¬¡öÜÔ¡äjúB<2 ìÇ,ŽÅ±Gng“›"‘³t:vÛºl2Ì·-JÏ9DÂ\û8ñBÅ# WÌ nj*8"75UÙ*ºi4ˆ˜l¦ð°Ëe4D»;®Ǻq}ŸŸI¬ûÝÕå_lÆ8t«5«Ç×lzÝé¡lc˜ÛŸdŸ$ébÛþÌ®¬;$ª)n‡d±jÌì2 q¨¬+ z†˜«áwÄ•6$KøZÙv@êm_Yâ-Áí×l›Æ2©0Œy½-ñÑíê óǪ.0Ý3Ñþ+4òÞ!'¶€ë Hu&uá"@ý¶é-}S®ùg³ÃPj±_`1KŠF)7(ªA{®Oî@EÚ÷y¡ïÈ–| +4î—$eÿr8ÖâùÅÜ ˜¬›2Xë+ bWöðj5S]}r`¦Œ.I·ó¼K^åßÇÙ(DÖ©ŠßS7Q§â^êj{Ç;'îÞÎ6š0›Þ9²XŒê~×W—_q÷‹¦ë+]õZFS5 b]|QÊô›Å±îÀë›P>n4S7YÜÊMd‚uŠfsµØgr6ÙME5j0!ÞŠÙé- žymr6Epß±*޵½œ:H÷ü5Þ&å4”Ô‰=^o"[H{òÆïÈ;YQwÚf{.?OZ³µGZŠc~q—ȉð(ÉbïTL Q4m¸ÞìY´½†ù7rb.8»©¢è¡îÓû(;œp){ؘRô…Xb‹œåé‰ 5‰e^?Y.©®Ë^a¯|^̳äß4팺Çÿ#ß|®y–î$… Z0%4 {y, µVÈ×­š±E„\«®¡<_VmeåÁ„a’n¬‚…æË*“Ûj°šIØ{­P0l+,OP<‚Å ðmØ…b+È*QcëÑ6«¦(Ë C”kkvM:Ú ˜$"(ycã'h•0,_ƺ…$ÊÆìÅ¢J$ ˆ@–4%fÒÇ`!™“ž±@n»jN²±Li9ϩϹ^ä™Úç<Ëy&–q(¾¦¬æLW}ñœÆ‡<§1œŽtÎs6úâ™XÆ|‹ÌG ŒeŸ¶m­6—ù)±œAa-j­yjòž§} ÇËÆß‘=‹ võ}ú•ÁSDz6$J~éˆûed0b9ƒŽt¨5]ðÔ(œ¶u‰ò::ñ{Å‘=3¡=~e¸›(=gËïŸWعiÝ °˜EÁ" k\7_=ûáweÚ¡xÅõöN±“Ý¢ p(p2"jB¢Tª ›Ìò#V:L6Jš½¥´á© M®æ¼•6²iK6ñ}i®KÔaªvþ“wg˜ß‡âw üf; ¯0”¿lK^‚òKߣœ9Ú¾K ¸èvT²oí¨oàªGEÅภHw[‚á¤VÔ=Y˜3ÌV9ÃÄ(‡$…µaäH€§F2¬‘›¯íôˆá4æb˜P²–q=Câ cƒÆ°²Ä9­ w£ê6€lÇØh6» >Åø™Ôr{4™ƒ(òb—‡'¬°ÉvfvÓÛ3—^dHF[%þ„xlL²?“ŒÅ{*ò&{Ø.ÙŒè×3äÕ#¯¯î@× ŽUuóÀ[½vàÅ^:÷B{:2ͨ:¼ˆ³ÓYù8« šGÊP5ÒäÖE§À«%:?0µÅR’'Ó';߃èCÛ¤ jç{æA5CükÀ00¦¬iP~ÆQö„\ún&…  ªV(ï†.U 8—&É”-À½Ã[¤`bü"Æ $—¡$Í­w"0×µL ¢h ›%k%\ŒðVžU[:ÌŽ5âK‡L¾ß”P"õàÓιZb˜ŠÂž°;šÛ˜3ìí°:#‹€¢‚Ú0($@ÃGùÁSdêHbxoÌÉ0›ÑZˆ¢pÙû7~­Õ®Å²0 ª ãHDî¬Õ'œÆ¶²é,>Ë=òTm_¥¬†²‹;;e ªÁ…›2 }¶ûbXâ/"°Ñƒ*e£‡ËŒ@Mg“¦l]Ôì |…‰pâAÒ[¯TošÎ¶`¤ÅIÃl®™ÕןͶØ`kÃÉÙlöøáë‡l”Zœr˜VH/nz$Ãëø×tÍnÙD •K®®”~Ïè/Du !œv«O@cWűºJU|ͱyÕâïJÊ1¬Þn  %„ôU—TëÝ÷œÑüçûT‚•RYrà‰¶ýÇŒª™ l:û"³-ä¸%™òÞ¡OˆÕ5Ö8f Ç=ÕYvÇù~au‰¥rÓÛyÇ„ád4ΠÁ-ŽÙ_…3?C£í5fbm‡p â[Ìýz|IÌD¡~2 .‚¸ÓÆÃs.ø˜ ¡ŸÚì™­ÌîÎ*™AT¼f·íІFQxB¢&‰¨¾IŠX0Güq#Ê·À®¶shÁKMhŠ‹š9úx¥˜ƒQxBtó¼á2M6ðÔN–\˜ÿ÷Ý×ÎZMˆ‚3ô¹øùBCU)᯾K¥0­&Š×'žF•ÊÔ—Åño*!*I¾.¢¸üš ÿùŸq1m¥§%¡uZ²ÜªvxÔüqšÞŸ¦ç3µ·‘6I^ððGZHÉ";3mOóøXêÓ{´û›éþàIÎìT§“\–Øš|‘íj ãÄÞ¡Ô&¬@ø­0?ÝU2fº»²²‡Ø†ÃPöVûR3Ì©Ë&<ŒÝ‚GB+̼ƒq(°ªpXOAЬv(Åã9â„AÖgGlŸ¨N”ÆÌ•K/2$ª`¢ØÈdîp:ÛD 3™vÛIxøªA4 Ž˜ZR•˜™Hƒˆ%£ƒÐ™(¶\‡ëÓœ-±} xˆg,¬çÒr¢½Ïƒz‘hÚ˜Mís¢‰âK F‹PK­Òø XXr„2¢}üLÆÚD‰h¶Ê‰&–ˆHÞE¢£ …S€•u€³£{¾*,êœUX}/Óll[¤„ u·kûè¬%¶àÌa ¡³–x°H˜qh"ì°ÛÅ ÒQøª‚¬ðU@\ãÐÄ–q(S³æ‰I¸­TË¡‹ÎTp„ÎT%9ŒKäØJÒa"ipè«w: ˆÐZàÍëjUkkZ+{¥P«d‡€ÿšsTxT„áKâßP²ÛN’³Òõ롟‡sÃâøÐixÄGžÍ`°WŽÐÙÆiÏÄÅñì^‹c7ýg †B¦Údz¦Jjù¢'Ô U<Ô7ê§ ã!åæÁôT¸®’*~»"dÐá:Cv,ä@ÖºnecÞn^%-AºßSVÑ¢bVõ8¡ÄƒJ'6ëQîr¹hQ•Â¥{)«µºžR»û@xD»O ˆ”• ”²2,¦,ˆ¢p†é¤¨%U‰}Œ9IŒçÃ(4]·.ÛKX™¤9Å™5óþ&*IqÏéx¼#ç83æ äÁ4dw’ã¤ÍL[¥‘OÏVÇÌ9äëÇ81Qâ˜XÎ11QŠÐ¦B@þÛ048wŽâAî¢ð¬ˆù`DñŽy®Â+_P4Ø1­ 3Eµ°©DÛ½\eFv-vÚÕθQº_”îÚÈ!Ø ¾Ìù^y®¢pXs•ß(¦2hª3£A 3¿5£!‹Ò‘ ¯”«n*WvV®L¹D© …¨×LU6!ÆÜw¶ÜPBÈVb¸Ïpà×Cmö¾Åò»$§(Ì“SñzÉi‘'§˜ã•TðSÔOÕFFwþô”q K±…èa?übšéB‚oÙ9=e/ñ¦Ì¤¯^bêño,(²KеZ¹UµXŸTfMS*HšJ»ìpºàvñ¯6EnÊÓ,äÞ~ óéuÕSäQöø—ìË4ˆÞ) Xùάe1> \Ë™ÌO…%—Hí€í86޲õ8Š+Ái•&¨ –vÎø„ùiÓÙÁ=bÁOqä ëga ">ŒkNhÒ±£˜!Á-‡ÞjDbØL°ý{¬°£pPQÑS£pGŠ:eCÉ`h‚ Ù½ó %ÛX"Dذ·±x„<ž½5-@V}ÍiAÓ8̃*@ÿ#­`ßó­²a ¨1•ç5)Ù‚9K¹Q¡\ü«âXÙD3u8 åJ‡OlOŸu»š&ÄC©`_ó½ðã2©0*#¤—Ô ½Êôiê¢Æ\ kž“‰_)‰j¨ÖSV’^>E»¹~ ¬*}² LÆ×ÛNuŽ“Z7öÓ7ÌH¹¸C}~ïÉN›0cí×ç ¼^2ÕâÓóf‡Èˆª];ØÉÀ›;ŠÑðlwTò ÖÓÁæ$uq|Ý eÚ]oÔ‡wJ’tî7d[þtíÙ­|`·á ‡'4~á]†xýXƒZ6Æ;kQ,É`þPã² GŠñÐÁ^*š¿„ ÜÅÿÛ„ÀÎjØ,£k°„lQÁ„€vŸñ¾;T_î+ÈÅôlRc{¥•Ôw‡ö]®M–‚Ô é ¯GÝ!®B–kÙáÒ3Äu€,Z‹³ØöbÓ‹XÑã @#Ž´HúÂ^¤¬h¿˜µ®¡ýjF¹ ö«,”$" õgÓ,ÉØcL–ã8Ý–˜ðˆÁJO(ú¶›lOfÚ$¨.U…™‰Ñ Èò¡ÑåÒ3$ª¦ªXw(´cÜð*#ŸJl½´¶Áeƒ?k÷=Ó1u1´³qkl„Ù•;œr‚àñ ¼í¢HJ8b-N˜ØÊÈ)¡Ë€×ÿR¡3‰Òq Œ†,bù˜%ÌÊ„˜1JºÝC8•æläJ(Ì!$f{ÇI&’üÃY¶·óË; Ú&DB–n Hím‰Ìhã0‰4 æ-‰4Yq˜ÈˆÆ’@v«ºHÐ6!2Ý|Fä'¼ÅYêR ê`x˜¥e¼I ¯b©Âëž‹ôºç»½¸Á§¹éÕ1xÃOØï9ÅO<ËÃyníïì­?^ï>Aaðɺ_?9Ï–ëå£nýÈ€u6Æ䥯®™õ×ôì÷ÀuñÜÞä þ·èÿ½îé½î¨;;íÖ›îßï‡Ûî¬^>Z› ÎæÑùѲÛ,Ë=, ½ìåÖ^LœLuÂ>­OD¤Ó/n¥ÓvuT»JÅ– /¥i¬;O£TZÝJ¥ ¾g'ÆÐéûmjW÷·ËO¹7­fÛNÕ<ƒšžu6pgçG'ÐèߺfýðõÑõƒüãj‰Wʼn¦È<22W×Óô3è¹Ìtý1\ s£‰ MNT÷Ö“£n³OãÙº7Ë•Ý bMƒ¦Æé^ÓÍx2 Çå;?Âðâ @5%n¹þüóòóÏ¥ûòô~t¾mÖOï­O·÷7Ë1¤.׿zz/Þ¹¼auÖ\gH²úÓÏÖÙ¿qiÖ¯ÎÖc÷†ÅŸ­;<»þIùÓ§OcïÙ—ësôŽ/~~G=ÈýgëØßo¿(‚°È>¡’wú“;wš»츖vmAØob3Æ~ýÅù™œõp~rr~¶þèþCF˃fÞÜãÌÔìþô~ûõ/†\ 8ØûgÛwŸ7ëÇ#Âój|p½zxþô¸s _›ÖG97mµíkêÆhEŸY¯3V› ânƒå9 ^-ùe¹þ/cÛ€ÿìÍÇ2l‘¡.^â¦(ÑÁÍ÷Öêt¹>²AøÇëß$íÍ÷Ôí¨mdæFÓÜ(a`õ#ØŒËxÿ‹¯ýû ÝA‘'ç&?ÝšÁ}ý%‚üfù%}üÙÔÆ†Éô€²OïGèÒoY»ƒîÃ)}P¯³Lqˆ·v¦cù†3LµkùÂbÊ{ð/‹ ¯½zk<¹²>‚c¯vËÇ]wø<…-K°e÷ÍãsѰYoܯâ͵Á>„Õ+äËó3Œ"ÈCü8?ÛàŽ?Ïù?пZ?=F¸ íýž<±\—KÉ}ÑãÍSÒSG}b”€¤yÜ“Gݪ1Ç C‰/"²Yßßzþ¤;ûõW)Çáo¼|õ²9K…g5¦zm WL˜¼Yç˜RBU¸¨þò÷àý˾Ï0P±Ýgkä’ÕºíÞ±|hcÜ{…Ié ãƵ[>ÒÀ",¿uÚ=YFAvAð\j1„£zòäþcº—V“bá D¹7íÂ%6ó'åƒõ‘÷Œ;6®6§ÝYµó#³P:~Œ{œßýÊU³‰f åξ„¯Ã¯¶«SpÃÐL1ϼyåt#šO߸ë—Íl¾ùKs¨ Þ¿¿ÄøÆ{ðþÿ±^®n1=[ÿòWïÿ:øÆ üÁbá©¥¢¼QÕ¢¦PK‹çh5âsÒ7îÝlúþMÚŸ¬ž¬{ŽdªZþòéÿŸúØÕ™øñ‡SõAõ‡¿ùèƒßä\âc‚y⪠£e³Ý³>#øÆyÇy˜©âˆÝ¯ÝaéÜ ºÐC²GÙ* Ö ñäÞ×ÙâiUKm'®­ëé_lb¡Ô~fÅR<ŽbiÓY±´Â‰ª à ^T­ìt Ê塊¥©k–…d%)a¡$Š¥IéÌ —N¤Åb)Þ.‰­l”÷ +axëd…*1ŠQz½Ûmë]x¡MÜG[Ždµa±˜,–¬ÆCÕA:‘B:ìP÷XôºRÕ¢¤h[òÖƒ0TI{œW½Qvª*)–³z) –³Æ)Œ%£¢Âó–A:œ4rò±7tØŸƒ€,Í*üm<òïÒ“I²o,z±Wl˜^F«ƒ¬ H(énSBþË¥ûþê%TõÇ2”P±a€?‚GwTùÃÓsvÛ¸÷r¶=v¼Uð×X›S;Î$Hâ ²X.ÕY±øj÷ÑØ…×ÚxåÏŒ“½ÂÃýUHæ¯Â¢¡Š*LuQC‚t"ù}v¬÷ʨ{n{ 2SU”L ©wK2SuF&dù~K2SU”L§÷–d£ MÉ„,ŒóRªºa-wFHOw­îzôÝþ(ž× Ù½Z&4šuÞÅ”èÁëÍ“îtì6oÒ­N·V('q¥r§¥o±Ròv¸B¿>+ª·±lH&†(©¼ýÁÑý.±ÛöhùöÓ§—ëÕòôKkü;=]Ù?û¯ý¿®OÔöa‰ÿÚ¿úÏnÛY(p!†3lÌ€‚Sû9b•¹Åo0ÄVho_È¢ÃD„âÎÓð>pF>\m7·§$1²Üc$ÍòìþTrÃmÐ#NÐ(»×@êUdêUi/4î8yÚÆ‘{eϧ÷é°ÜáaF %Þ΢eS²!\†dȾӎ‘|£DXq1 Kv¸ô4o‘¸Ã™Êñ-P8Æ‘zÈJŽÛíQz¯ÓÇ#–ºÃ‰ä{NÂb¸  “Õöú~“ÉuØKï{,z*/ql¼ßሞõ Ó+{MÉPv*e åLïÂ`9Ó;±ÌNŒ›IW¢XH‡,梉Mà00d1½³U8%é´3é@$KïÙˆ$‹¼]ò JÏx ·LïåÙgibÔ,ŽeˆÍö7#Àæ½Üس±ÄV®Vroõ6F ÷݈ Z’‰`÷Êý2ËF(*^isE@öÞ<°ÚȃT¹}ðþìçåÃñyÿÍj¹ÚtËÒ+XïÞZ@¼àšôŽEvx‰Ã+§',>ñ>0<™­>ñìýÐ8–c·ƒ‡e`Å;f°Ê3çÁœ}§ûHî§ÂÂÓ“0%JOéI:dé g$ºðnRÈbz ¬Gqœ>îÉ'{Güɯ¶GGòô$,Þò1Წ¦tØèH‡Îƒt8” nIfAsçd¦!I™« KdÂfd%1‹ß’L{rá2³;Àž½/!3>aíu”ž†Åy’Jca´s¼sžêß¿uZZ¾µœ§µý,uË¿d·£M~ŒÏ9Øu§ø^C÷Gð:mÿõ> endobj 28 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT4 17 0 R /TT1 8 0 R /TT3 10 0 R >> >> endobj 30 0 obj << /Length 31 0 R /Filter /FlateDecode >> stream x­œË’#ņ÷õµq¸Ú1-$ÕE’wÃÅޱ <"X/°˜a0ƒÔ`Ï[zÖgñ©Êü¿“ª,©[=³uÖÉsùÏ-3+¥ŸÊÏÊŸÊyÙÎgM»\.ËvÓ–«f1k›Õº<¼*¿((ßûà¸(wÇr1ü;îÎÑFÿÚöÿŒÊøÎÖóùz¾j‡¡ÛôÏz¾èf]S—»}ùþ¶\4Äþ¯×år½^Û}ùÞvÛËܾ.ÿ^V/¾)Ų¬ö_éÓî{}âáñîÆäUÿ7š"ÌËi^iúá(ò#c?é!ó^‰Óz´ƒP¿äßh¤¼)%¥ì=€ú`ì>{&ó‹Ê…Š#ć‹j¬Vhúoiæ|$¥÷R>=ÿ(¶.?Ú†{L$4«z¶êêÕt<|.Å>ЇúÀ£—Û›r±š­<¢†E…O¾Ö¬^åò*Ið¶Ý|ÖuËÅ r9a4ýP2o?Ö§O†p-ª^ãÅ¢¬f£0¶ñ!b üÅê}VTÿÔy¬ýÕÖ“©º™7™DIÈQ~Qý†P "YtNƒõ¯# D%‹…<úŒ?þñ©lm¬]Y–bíÉÊ®‘·ÊÊ 9WT¸ß§‘ûä,D2Ì.}6•L`æšÃ€WF=zcVLð;¾ÕÍ@3,1{@h":/ìð­ŠõŽ!±¹_·5v¤Ä¢VNtdß/q^Ag"àÈXKå#a}öøÀD à¥9¨%RDq{|ªìéê,{°Šâ%…¢êE ˜ÌF¥ñý·Ò$°Bã+EÙBÁÄÍÞ*²(Õf‹ þ(5¸þ¹•;‹*qg\Þ`„ˆ‰“ vîLFô b//@F! © ç «ÇèÁ½vLDZl•3TB8–Â)ìaŒPœ ò£JZZ\E¼$I8€ÉØ+õ  ñUT¸æ÷}pZÿåcáf$W.4δÞu›%P 2Ö;‹J¢ÏÁ{ ³xHúaÇQ ´ˆu/N-™cTÃy"QVIsCº|ƒcyBC^D ¨ð¸ô½ì’Ák’—šÃûQá~“ʬPÕÈ) -%rA£¹IS¢~j2 Ú-PÆÊ IRZ­» 3…z޳Q)ÞÆé ­ôúíÐ }Šø¯çóUÿ©ãbä—T67Rêá5=ñc˼3uj#–¥Š ^‘lªûaxÇ«}‘TJo@™øsvy4b K“°Š°A¯óøEfÌ••!2Æ{÷±'ηzS¶M¿ÇãGä@¾œŒ“±fØëq2®62»£; ÷+òe¾Ñ^E`á7ÂÞ̽2i&Vêùr“­ áµ‘óø”Úc˜œB«¨ð×…xÍA”L2S}){…œûOh’‡I‡ÆrºlÑ4ÈÁí¿Ž„f1‚Y4L—îp„„¬ÃqŒºÃx¤?@¾ÉOÊb&_¤ç QTŒh2¸9抗 µtfª‰çÞ˜ Úé’PTŸÄ~õ^™n“k´zÞæG^©÷؉å+k<€¬1¯DoRVhøOÇXˆófàI¤|xPŽöû$å5×¹‘²ŸÐ¥Û‘EEb‹#`iîá1Âc€'»NÇ}D-½ÈŠ$ßc›‡iÁÏF‹'ÔA¤AdÁ®ö`€; `%ôƒº  F¶;Bö ’åQh—hQç‰Nêù*?=À0PäèõÂÕ¤™tÏ!…¿_ðj½ÿYqØ}Ž~o³E,}‚b5ˆûU5&±_Hì .u7M‹ŠÚï›BÂ&o"Ä …!!¦'÷3ÝåBÀÄ7ß[Ëщ*á± 6RÏM÷²ú4¦­:SH‡¼º·ÇNŽIå%•PÅØ=M3²—{ãóëó ³yµ^$'¦P†¤þà){Vx’„I(Ó9@Â4%2{WÕü ¡ÿО6X¬€<@¤Ʊ¹_1ç‚O5 #ÒÝË“8y±ÊwÅÏ‘/s]“$>D{­ÓcEJœB%/×Bƒp@vü¸DÚà <ÔýïT(‘‘œ8ÇDŠ=Èý b/ìÁÎZÂè+ÐÐ Y×áÈ{K&ð3…€™¸“þ€h\1í ×ü!}ô´h&›‹Y,ÆŽ„‹BŒºb”IžY9zÜ…z±ÙœÓÂî(\pÝ»W¢_‡wÙÚÉ6ßCç.ÝŠ/\‚GáÏ@‘‰ŠÎNº% 6ܳÐw5¡I,[«ÇÆÿ¯7…½á¿•Óx*µYM‰n0!ŸXyP¶d±ÌKOmN19³¶Œtrm:&ÎBº„fkK‹”ù@¬‡aèJ§‰a%ûÞĈ[^³p>Ÿ/Ëínt§^ÚMˆ“Gu÷æ•i²ýW¸2ŸmV˶ÙÌÍÆøÉäê“Ý!² ݪYnÊÆî$-{ƒ¸OǺ™í¯å÷éØjV¯ÖÅj9k7ýEЦYÛÕ¦º+WÆÀDÕ>²+Ûål½š/û¾líòSÝÌ;ÆŠárÔ|½¶‘y¸-¢ƪ¿A5ŒÕÝÌ´mM«d¬-MW8óº™ÍëM¢A0›Q4™yX‡„KÑÔs‚€äïÊ7ýu¬Ùf±êšÕbòSq1 ±˜¥#2Ó*jnZëR„1&ÇÀ¡‹Æ$À0‹à·;<3v^p cå+8Rˆ5&Œq{240Voz߬Wus¢Œ%øùX;kÛnÓÏ\´óÅ•a³®7µ=€Ûéj¤ vmc1©úÀZX’4 “©1Y¶‹®ç¸÷¡¦‘Æ‹±ÃtlS·«„»¡ÚµËuÑçIÐ!Ž˜^®«Æ£EKÐéf=÷>3…Écú‡áàU »88”+2'¥§ÛÌêvÑveR€Úp‘°úßß¼ü<è†b~®·iÌovu1áî×U•)Ólšµ_¤ðBB‘/^¶quCe®oe“%ÖèÐɾEó30d†òïÛOïV3ÌöϪDv¢4ªÓ#¸‚z$EmïÉòrzs¾ìaá1ªJ¯qïÏ)a"m¤8&ùú…N«55^Íb¿‹Ó“×E˜+¡7¤×¤¯â>Å ñ•a,‚-‹Úë“»ŽvQ·^Zœ4x[Ko€¶¬!QMO|!‹²~HŽ7˜&d² û÷ú:CHSlH!t—Wõ Ÿ ©ìÎ,rErK“—ü€ÞîR)(„*m$É\L?KTFv^/ ŸTÐÿP ¿”ÝG‰–åÙ3ô¾2ÛcøK¸DÁÛˆ+‘¨æ”Ôœ¢òã1Àñ¤ÓDÉ2’§Éª.?§“ ü `ûY[¼Ë]ë>™ë5;ÚÂZêpëþ¹NAe+çÃàÁ‡ и?JÞòF2‡ÉâYž¸Ägð8Sl˜%6zÃ% +01Tο…³HÈ¢šdÒ‹‰TI vŠ<áñ+*•šöóá–O9¤|,gÒ5>Ù•CvfîĈ4kF;Z €àõ Q€ƒÀôÂÈTôA†žHcС¥‹âa[ï´/›—'ÉüÆv¬ã~Š )è&Œ[¾(^èhà@˜^¼Y㕯+0{¯‚]ú÷'$Ë¿Ÿƒ‡Ì1Q³kÍßÏ~YaÀâôòË›g×¾7å|µÝHÉÔnäzÅÄ„SßáöÑY­ˆ'bܺV¾ú¹®8Q_)n8œÜp³p½TäÙbìÒÕL "±8‹T ó±75Æýi2¬ÎW¬/”&DüK)ˆg€æ1Ǧ¥ßΪ2°IäÃMÜ¢ÉWšMZ¥„T@I®ßI ‰€Ú„î' ü+l )4ÄÏ‚13Óµ¡Wúl>þá âÅ:ƒž9„ûD$<U›È6yáq^60A"­€‹lh k€|,&¼wf|ÐŒ˜6#ÏŠá«¡÷ï §ï6m²†-Âbr{é8#4R,Ä%25Fgr«U¾C±|ÌJDbi ŠÊ‰í(­Gy›ôW2Ñß„é­M>?•NœŠb1%ýÚ9÷ä~í§ño)@ غ ä¢ztGŠ•œhüZ=§{Èâ~¬ò ðȶ q'ªD@É#ŒÃCRU'îÀ1`u:ûôKvW¶¬3©4¼Ñ/N¾ M‰fý"$Þ_×ï5zç¢_ÇejÇNñ…š(rÇê#ŽýîÖ»AŒ2ûV(3dNzÒ‹‹ÎNÉ7KÛôº)ùîK°B‹Ðjr{¾µÓB/ݘ¢ÖtIV¨€\‡)ªå²hÕ@Hí†9¿ð$IHü\-Õûj>ä‘*Ùû{)A¡k¶†Õ³Qùzh- E¤}[B0^° L®¥c`{S¶Ê¹2Óòwý!g7Ÿg',ZÀ]¸À“\D›X¤Nrgè‰`øQíÃDí@§'  רÔ[£\?Ö–ðA”Ö›ˆ"7 –ôŒ’\%ô|D¤ˆáKåѓĂý‰š¡”g¤p“‰^«"ÐüÝÏÏŸØó›€45¦müSÀ•ÀÖJÇ‹êH>‹ÜO·Šå´0 Äî·×d?MvÙOÏ/‘Nâï1#ÚœÜ0Fimk2k<žà ¿¨˜€ˆ)±>YŠâ¡ì¸! ?Í×߸WŠÂ—×,y’«~öýƒ¸}²æš(¼‹‚¾"ÊQO’¯nL}JÓe!ÞуDvLVwhP è Z‘I´ ­’~¡Ñ±§LâT¡ÅŠ’ÜAL"ñ5I –+ÓÇvzýõ•ÑëôήùŒÓG2@M]‹P¸û'«WD Ìg'Õ«¨¾ˆgˆ#À%‡zü6Ï6ûµ‡$©f}¨Pþ«></¸|kÌO¶ÔÜrðµ6¡;q³ÞÏØ¡…‘ fÀ‹«Q¾´mA4Pv©bá ÖҢȶG|ý;9N$ÇP¡®O¥H¸j xKWiÖÊs}¸­Ã§¢bˆš…/ð¿ž!FX{º>Gò߆«»®?{xÚ­R¦õÄÁObHL ÍÚ²¹"â–!pýˆ4‹%Ço¶’˺8W³з§“w\þÎZ?¹’,ÉFÊ'òá©`gààKtñùÒMÓ)ƒž8å¨rÁTþÂñ|űl»®˜Â¯Ekýå÷•˜cøžÙ’ÔÆ6rŒ­A“ÜF†wÉ >Xctçf‘ÐiT·W7 3»#»åA?Š©2Åéβz`ñø<±µ^˜ÁcOâk0ƒ0yT6ßiÊ:d–rÓÄCs……%ÞÀ›>®;šñÄã0¿.¦aßÞq´~ G=ŽÖûsha\­¹ }ÐPwoƒ5¾îÁ> endobj 32 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT5 24 0 R /TT6 33 0 R /TT4 17 0 R /TT1 8 0 R >> >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode >> stream x­™ËrÛFE÷ó³«$ˆ/ñ±´,”Š\q‰U^ØYØ´•¸bÊà$–?6ß’!Ñ÷4„!DÓQy ÓÓ{o÷ Ûø"ÞÆa<ŸÊÉl>çËó8ž ËÙd<‹Õûø2Þijgõ(®ë8Úý«×}ö!Ù_§Åí¿d•ü–‹áp1œŸï¶ÿœÌÏåh™ünâÓUM“ôßÉ"NæãaXmâÙj5K1W×ñU,ž|Ääb‹úñ›~ÜèÇæ½~ñèó ìvÅAÊ'íþG¸ùl+¿g+8Ñæ7ƒÐä ï²=oô„ì>é îÌ&Ô$oe‹6ªÄ_ãê§øãªaï0Ê!Cy<'§“Ö±ÁzËoƒµ²Ù‹¹!@^{1o°®åˆj*j–B±žÍŸ*þ/ý5ìyÆ´þ nÈ dLzð\`?BA$8ÂfƒB¾ÄѼœÇ‚„l-õe).pN®ÀQí¨a¿)M²òwa“ ¤"L·>3&Éli ðùËrwFµt#I'9>ržö´Älj§–ORÈ¥0Š_J¥²„¢u:À”ͯìïvcß?šÔŒ¡x`°’Ä7 «Ö¸ëNNòÑŸ¥R p02/bî¸Íß÷gÍùgúq%¯ `™´&¿L²Œ S­ºì’‚·ÿUWsŒZ]­a¦¸$Ohˆ¸ Ü>¨M^ªLþò&‹~lŸK«éÜݰrhÉŽ¤àÒŠ&R(ˆ´y¬¾\̲¾$æsO ÜJ3v&…‚M´gÅ#kùQCF²uDR_Ø(O&¬@©\g³Ö¹.;MzaË»\à<Ñ´“ÏΚ1o¤î]&yÄÝt¹‚hbà¦ÒʆG\ ´d+¡Ðn-¨ÈDYäo/hñ÷SGNT+Ç Í¥³ð'²Õ^Ò9k‹–öe‹ J£Fr’l¥†»Gj Åp‘5‚RLK-<?Á%ª>éè2sH¡ÂžÌ[8úM°™OòwO¦ ®J‡ zÊãôJæÎR,葬:nùµ¤2Û–‰õ÷ ¿p’€ 4µa’lîOØ[þ(p ”°¢”ã›龜öõØ& €|9éÈ`È[е'­ÛyÚõ(WÍÅDHüªI"¢ÁõMF>¬!‚íGüÁl¦@‚ùÜæt$šZF ä5M]´­|MòœI$G`Œqˆjá-KŠÝZQúŒ3 äIeß:­„rG³yz÷¾—ýEN,|òìx‚h¿â@e‚&D‚Yy´°óoR£ñ²NçËô pWÏöûŸË[¬¬¬[¬Ø˜tðeKù’jâEßjrrAŒþækÜÄçX3C©'Ã/Üð#ð}|(ówÀºÿKÝý3‚àÁ†–êxn 7­\qˆ¶'jsöº“bî}—}úIy)6 Ëq¶@v²ø×€ …l1ñ D›ÍˆÁ„ûŠ"È/É¥Göp®üí7ïÅbéÔì;,ù ø´Ü[ð?À"*ån ,È“k?Aó¦Aäìä¥ÏM¡øJŒL;4ÛäXïCïö¨Í¿=i3ù6Mé½}Eàv_ØT&o¹¹0©¢Š£]¾Vx&8Ûäï’]™\Ù ÂPŸ¥õƒ^¼`Liñ@qK.(¡"™n ¡ÈK@I¯‹+ÁrI"¯e§«tK§ëTÈ‘³ÿ{Ûr4Ê^K¦ÂäÔÛ¡"i z«éÓ·¡‹œm%ÕZ#$‘üF(.íx2Â|Že±~ÅÜËö÷6{I³üö|‰"æC åœ@€$ NÙ°8•·—ãf1:âž`ϧÛÿEÓé%ŒúÈã4òC¿Òþ“ŽÈ% 8¢eE7W„âðñ#ñø^û’åd’%‡ßI÷ê³¾Dud+>° o„HÀ“d¢¯õIĹAh¥N”úLyñ!Çíq endstream endobj 36 0 obj 1595 endobj 34 0 obj << /Type /Page /Parent 3 0 R /Resources 37 0 R /Contents 35 0 R /MediaBox [0 0 595 842] >> endobj 37 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT6 33 0 R /TT1 8 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Count 5 /Kids [ 2 0 R 20 0 R 25 0 R 29 0 R 34 0 R ] >> endobj 38 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 16 0 obj << /A 39 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [342.633 236.2396 517.2716 249.0525] >> endobj 39 0 obj << /Type /Action /S /URI /URI 40 0 R >> endobj 40 0 obj (mailto:celine.mercier@metabarcoding.org) endobj 15 0 obj << /A 41 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [379.9957 253.8573 402.4308 266.6703] >> endobj 41 0 obj << /Type /Action /S /URI /URI 42 0 R >> endobj 42 0 obj (http://hpc.sourceforge.net/) endobj 14 0 obj << /A 43 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [30.43069 301.105 326.4167 313.9179] >> endobj 43 0 obj << /Type /Action /S /URI /URI 44 0 R >> endobj 44 0 obj (https://git.metabarcoding.org/obitools/sumaclust/wikis/home) endobj 13 0 obj << /A 45 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [453.5824 569.3755 482.8619 582.1884] >> endobj 45 0 obj << /Type /Action /S /URI /URI 46 0 R >> endobj 46 0 obj (http://www-leca.ujf-grenoble.fr/?lang=en) endobj 12 0 obj << /A 47 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [30.43069 663.8708 177.4915 676.6837] >> endobj 47 0 obj << /Type /Action /S /URI /URI 48 0 R >> endobj 48 0 obj (file:///Users/celinemercier/Documents/workspace/sumaclust/metabarcoding.org/sumaclust) endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MJKBCR+Consolas /FontDescriptor 49 0 R /ToUnicode 50 0 R /FirstChar 33 /LastChar 101 /Widths [ 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 550 ] >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode >> stream x]”Íjã0F÷~ -;‹9’ÒŒ¡t(d1?LfÀ±å`˜8Æqyû9ßM§3tqÀŸ%]ëH²V/ÛÏÛqXÜêû|jwyqý0vs>Ÿ.s›Ý>†±(×®Úå-Ù»öØLÅŠÁ»ëyÉÇíØŸ\Uέ~0ä¼ÌWw÷Üöù“Þ}›»<ãÁÝýzÙÙ›Ýeš~çc狺v]î)÷¥™¾6ÇìV6ô~ÛÑ>,×{Fýëñó:eÇŒQÞ¦Ôžº|žš6ÏÍxÈEå}]½¾ÖE»MÉßFìû·®ë²®„÷±.ªõšÞoJÅ@Z׊‘Þû'ÅD¾ ŠÎ∊D nŸˆÀ‡,6D ÕJí‰@LêÜÎbG¢uÎD ¶jí‰à}ꉵĽ"®Â{†q´ªrÀUPêAWAÔâ\ÑJáÌw£I\•­®Á|£&pŒÕÒ\Q pD›®Á|ƒ••µj%®Â{¼ˆ¸ ¢*G\Q WÁJZ+®Ñ|©@+®‚ÊZ«ˆ« ³v?â*ˆV ×h¾l:­¸ ZµìWá}´ˆk4ß$Áˆ« ³æqt¶V\¥h“Ä5šo´YáÍ——ŒÅ5Ý6T›’ŒÕAâkQ 9Áþ² ü~¹ùð#$¼ë¦)%¼Q: oAÔÙNx ¾¢Ix'“儜‹(gOQ'!!*(¥eäÜD›0¢œ[U–ÝQÁXm?¥Ž–‘³cÐY»Éß`PJç“3kõ]©Ad¡þ[ ݺÍÞoŸö2Ï\> endobj 52 0 obj << /Length 53 0 R /Length1 20668 /Filter /FlateDecode >> stream xÍ|y|EþvU÷Ü“™Ì$“LBf2$L’! B&'¹!áLÈAS¹/Á ¢ˆŠÀòCT@˜ ‡áP@#x,*в®²U\E2yŸêJ³Èîûû|Þý¼ì§Ÿ§««««¾u{†Y÷Ín z²„ˆ$©njí "}z^m«›3ËÆÏCw¢ hœ1q*?ï~œ­uâ”ùü<®!1³šjëù9¹NkB?§}À=š¦ÎšÇÏcÿB ™2½®ëz¯'þØÔÚy]Ï'ŸãÜ6­vj_²ÜcÆ} ]×i!!e")'•¤Œ Á1”RÈ£ËG Q@û“ádQ˜ˆ“ E¿€2”—âŠÕ·ìÒÄεãýüJ´éÎ#Âã˜8µâÅÕ·Vu<©œ¬±âTƒø÷)¯v\¥ã·VùJ•“¥”º.JTpˆØq¿6„±µ ‚,¨,H— ²ðÉ¢C7eqC¿Ëâº,~“Å5Yü*‹_dñYü,‹«²¸"‹ŸdqY—dñ£,~Åßeñ½,¾“Å·²øFeñµ,.Èâ+Y´ËâKY|!‹¿Éâ¼,>—Åg²ø«,>•Å_dqNŸÈâcYœ•ÅG²øPgdñ,Þ—Å{²8-‹?Ëâ]Y¼#‹·eñ–,NÉâ¤,Þ”E›,ÞÅë²8!‹ã²8&‹×dñª,ŽÊâˆ,Ëâ,ZeñŠ,Êâ€,öËbŸ,¼²h‘…G{eñ²,vËb—,vÊâ%Y¼(‹d±CÏËb»,¶ÉâO²Ø*‹-²xN›dñ¬,ž‘ÅÓ²Ø(‹§d±AOÊâ Y¬—Åã²X'‹µ²X#‹Çd±ZͲxD+e±BËb¹,’Å2Y,•Ų¸_‹e±H e1_ód1Wsd1K3eqŸ,¦Ëbš,¦ÊbŠ,&ËâYL’E“,&Ê¢Q ²¨—E,&È¢V5²/‹q²+‹1²-‹jYTÉb¤,FÈ¢R²(“E©,JdQ,‹á²&‹!²,‹YäÈ"[nYdÉ"Sýe‘!‹¾²H—Eš,ReÑG.Y¤È"YI²pÊ¢÷>6Ie§ “za9fR‚#–áì!œ}€#%N§{1DØéèÄq/ ม3ØQX‚»ÀÝ%8.0õâèf¢°Ø[Ÿ]Ù*ÜïÍîŒ<$,yë#ý³„E$ ˜ˆHoù`÷.BÊã…8_€óñÂ|¨ùP? ópe­tœ.Mì(ÌÁóçâù&mÂ\÷lá>š9]ÌŽœ&dGNJlªœ˜ØXÙX_Y—8¡²6¥¦ÒY“U#ŒOW9êØ(aƨ/G #++³*iEbyeV9=^N·He‰¥•%‰Å•3Š©³˜n)¤3 éñB:½º iAb~e^bneNbv¥»U˜æÕú¦“½)‘8Ÿ,w÷iý >8"ÌDöݽû’Ó pù^o7{A« z»GEbÕÀ‰z#zâŒHD;9ù8upºÅ馷[|d+½ÁéwN×9ýÆé§_9ýâ wâ†pú™ÓUNW8ýÄé2§Kœ~äô§¿súžÓwœ¾åô §‹œ¾ætÓWÞ°¾xz;§/9}ÁéoœÎsúœÓgœþÊéSNátŽÓ'œ>æt–ÓGÞÐþxЇœÎpú€ÓûœÞãtšÓŸ9½ËéNosz‹Ó)N'9½É©Óœ^çt‚ÓqNÇ8½ÆéUNG9át˜Ó!N­ÞldþN9à´ŸÓ>N^N-œ<œörÚÃéeN»9íâ´“ÓKœ^äô§œžç´ÓÿpÚÆéOœ¶rÚÂi3§ç8mâô,§g8=Íi#§§8màô$§'8­çô8§uœÖrZÃé1N«9=Êi§f¯u,ø§•œVpz˜ÓrNqZÆéANK9-áô§û9-æ´ˆÓBN 8Íç4Ó\Ns8Íæ4‹ÓLN÷qº—Ó NÓ9Mã4•ÓN“9ÝÃi§&N95rjàTÏ©ŽÓNµœj8ç4ŽÓXNc8æ4ŠS5§*op%¬;’ÓN•œ*8•s*ãTÊ©„S1§áœ†qÊ©ˆÓNƒ9rÄ©€S>§ÞÞNÞÞÞÞN'76à àuàp8¼¼ އC@+ð p8ìö^ ð{—ÝÀ.`'ðð"ð°xØlþl¶Ï›€gg€§ÀSÀàIà `=ð8°X ¬VÍÀ#ÀJ`€M0]<` L—÷‹EÙì¸˜Ìæs€YÀLà>`:0 ˜ L&÷“€&`"Ð4õ@0¨j€ñÀ8`,0 TUÀH`P Te@)PÃaÀ`0PäÙ€È2þ@ÐHÒ€T àR€d p½IýÒïþ{î©þïÉÊ’“ö^A=EL÷¹óEti$3I3Ù@v©†ºPÿ3Ér²•ì!'È;ä UÑ:ô®»þ£Se8 ¤ó²ïΛ½”?û.úƨ¬*å¹N‹ø#¿¦\Nü|×|ø>íì¥xÃ7¦“¨;{u^ÜD#§ XHv]Ù¨\®|QyåêŲ¤Þüdll0ovÉ=À2<†Œ%èCdÎî…=fáÐ|²€,$‹É42|?y,#“•8Ÿ‰~õ²¡+È#dy”¬&‘5yö\˜«ºB¯!,.Kc9Raw4ßqÏ:²5²‘àÂC YÙK6x@²³/ÕRòP—VJ6­ÆJÌÊ»¹`9][°òò¼ÿÆí![‰]å%aWŸÇ=ÿÎ^rYå8/‘]ÄC¼dÙO’WPò=(»g _€…^‚˜E^ƬÂãb3ûÉ×öþËÕVr˜!GÉ«èI­ä;Êa¯‘¶®sã5Äy!o’“äù39 ‹Ÿƒz‹¼KÎÉGÒù§ä+r™Ü _oQçQ'É7ä;òùá?‘+ä*¹†:º…ºº…žËê)5Š>ÚÊøÿÓ“ÿƒ^öÿ~ˆ½E˜@ÿ,\ïð©obèÿëÅLãSçôÚ1ä1_ îóS%©ôÊÊŸˆ^™JtÊpá½Îkô#Õ×D«²(‚:¯‘‘d!îAõãÇ3zTuUeEyYiIñðaC‹† .TŸ—›“íΘ9 ¿Œ¾éi©ÎÞ‰ =c¢{8¢"C,f“¿A¯ÓjÔ*¥BÄZ.!ßQPcóÄÔx1ŽÂÂDvî¨E@í5‚ þÇcc÷ÕâÒbº³ñ®˜nÓ};&5Ù‰ ¶|‡Ís:Ïak¥£J« Wç9ªmžK’&iEŒtbÀ‰ÝŽ;lù!My6­±å{ æ45ç×ä%&н.ב۠KL -:=¤ÊÓÓ1£…öH%!ôÌï×"=Ö#Fç×Ö{JJ«òóÂíöj)ŒäJiyT¹µ”–m’y&«l- Ç›m5‘ 5ñ~õŽúÚ1U±75‹ùÍÍ+<æxO/Gž§×‚¯C`ÀO‚#/ßï@ÆŠÊn?€z”Ñ&‡­ùW‚Ì;.ýˆ\ßRÛ¢Š6ýJØEVÄÛfòÐZYä 9Dùìv–—U­n2'ž%¥UüÜF&„{‰Û_íjØ•ãò• Jve‰|åöí5X6ß‘_Óõ7§)ijd‚-15+ýE{Ѹnóˆ15êš×64;òPBØ’TTyÜyîÚ.cæ·$9¿¶…˜ÄÌPZåq:fx,Žnm ‘èüIåUÒ-<4ßcÉõšº®»<Î|Ü‹&’ßÌ*†e¥å(­:D\_¶ô±…ïs‘>¤šåÜ‹J‰Éo®ªoôDÖ„×£}6ÚªÂíw5ÌWí¨j¨fµä0yz}‰Çრ”îBÙîŠ-GF±=êh­J«Ym!ÀV€ƒ#g.˜<*~Êj4g€­Š†9žÒƒ©?¤ƒ1:·7ƒqkna¸[úü/Y ç@6<šÛyR Êæ‰?çÿš5›e¨—-¿!ïŽ þ!QœHìJíßçS`¶è2² aÕYÈʘ @ÛpYãPN)ˆÕbˆÍCJlUŽGµmÈ]RÅ*‡ÙZªß¢ró7HµÝÕJ*þpƯ÷½}­KyØÕS/U*«Sé|t~û´ð®Ëƒå˶f£¨¼™=ÙÑ• ±¡û fT1ƒkWõ 胞Z€QÒQPë°™l͵­K&4·¸ÝÍ3òkšú¡4;×7;Ê« "¥N¿8|{t)¢E9‰ xrZtei‹›®,UuÈDˆmeE•W€£¥&§º¥®U²ad—BÊY;a)•áD#Å?ä&d‰tU!Hçu­”Ha<Â(©Ã;4)Ì$Ǧàan)¬t¯&؃p¾­žÕÍ¢ê¦æšjÖ³H0êÔC‰Gp „{HåçÑ9r0Ü2{›ŒÏôWû¯ñï0%›–˜®›‹Ì¯˜? Èø<àV`x`?äFAð}K…{w%‰D Ç"ú´7ÑßÐJûì7™4aê×h H œL8Ø]n“B0l4™z†>¦zJÌöÇÒ6bOÅšK²:þÖñ—2œ—¨ó|û'í¦«'ÍÎö7϶''Q³Ý,ÁbjG¬+%µOoÁáHu¥thJp ê-¤ö((Œ·†ˆU a²-gb¡¢^ußÚ¸¡“ÝŽ^“žnHöµF'¬¶€€H«ÑhT†ß¸¨ ¿™­˜ps³ð]bevìæ[Ë ]áõ®Ò‰?¸¢»âØBŒø– ê‘(Æ Ôj¨zw€NThJ@µ”ØÔ*­NÓJîn‚(j{jUk„-> µ*[©TPªÀÍ(ªËi–þ²\(ìØ€Œ¾.§éR uº\a!§S¯hk£]œœdwˆvÑA]¢¨óúèŽ/Ç¢Þ_Æœ?O#|”á·þ$éÈ'¨xIÄëÈ™m´Ém 9©ŠÐí *NEZév·9RgmŽV…\PgÇ\P!?—²$«gPÓ'gÛaò€ ØþMÕn¶ÛÌ•º»(J7»R ²L¯^ql¶o'šå†ûRÇÆ}2 qx«7³nPl|\É̃GŸÞ@WŒ[WßGî{ýžÑº¤¡M´£ç Wwßİ´ÒŽ_RJÒ»ûÞ‡¾6¦óŠxA>ÕŸ±[÷àVzÊ«Œ@ƒ²î/6R£¹•¼ºr„"J(5¶yh9Ÿ\Æ^BöÛMŸ´%'E«6bFKp¥[ƒbbQF!ÈàJIK/<·Û÷ƒï\ÙÆ¿<(´+–ùªžì8Œ´([ó­(*Ñ'r1\fee±.ŸEM'WOòœ#a³ÃìÂÑ%^÷v|æõ Ñ^¡ªãEexÇ9NA Ï Ù³ô¤çªÕ+4Èø·^¯Ò_Ôæ* £¤à:¯~Üf:fAí©]IµÓO}‰FßG4ñÖÏ4Q±|Æ[7"Ýï‘î§HWÉæe}Á­%T%d+º¬ œFÕÂ¶Èøi‡é€ÐãÇbÜ™Œ6ÓbdŸáŽ0øi4z€Yq¿Òß?ТT„¨C·ÖíßÚùw¨¿VP+DÚO¥Ò˜ ~Ù:žR¢‡E\]£ƒ‹ÖŒ¾ìã2ÐŒL !m)l¨1u iŒÕ¢CŒEG +КèR¤î ÓgžXØš©°¾èþÈ“‘~èSÑI3v\§¿¼ã;të 45ËŽxÅ„¼ÏE©¯ ï’±Ÿj”:=:ðvÔ˜¿Ê-êDF­Ê¥¬ÂR²²\‹‹ðJ–:Ûí)æ 4 »ƒŠfVm4ÐŒz»òoÙ´éäe;ð\UÇTß8ŒV·| GñR}*£ó²Â©LÄ,Kz%é‰ÝY‡Òõ ýÞ?Çñ ›u(§ÔŸ•ŠòiilàW³aHêÜÝÑ×1ò;ËW¿:éþ# ”­> ^”yÈ1|áÈŠùÃcz [0¢bAqŒ°ÁÓI^(½û·g÷Pˆ1»®½0óXóÐÒUG&Í:öø0ò&¥FÌí½YcŸ¿Æ¢f-Ø  ±\T©4íÚlÖãïìÒLÅMì`—2G¼>àþ¶•Û¼tF­wEÉ¡çŸ8¸có.qUÉs‹†ùâ•áñ5gßÿpÇ7ÍxöN´£pÔE(ÖEn­JIh°–`ìkÛ¦‹ÔJ£€.:XÝf µ…êº_Ðgër1H]‰å&Ãé¼ÄÆrtÖ³WOâmÕ%5’Þâ휱 SlûðÂxáo¿Ü;5+¶ÂKÇÝ·}RrA“òÒ‡õ¾lî‹k³ÅÒmIYÑ&ÖÃSF=0,sju¶)p|± šÔä+‰È(gíhzçeñ"ê4•´Ä`˜nCí&"ߺni1‡©?‰Å[y?spalÜ·‰J{†´àýzãßYM³a™íø$žÕx[ûÙ«¬ÏvÍ뱩ÁÁ¬†1ë«ØÏjŸíª Kw•xqèÊc3ûL_UtdîˆùÃýk.YXÓ¿ïœCKìʇه=SøôÚ®@:aì£c{küLÚÝÝlá©C“S‹ú'÷É,Ÿ1,÷Á†*½Q³5ØÚ8"uè€ä>+Ù¼4ubB¨IÞù²‘F«©â¢*[”šF™“WOJ#*>Õ®0ùï÷-+–Ý\¬X¶‘Ùf*lsiXYk'híAÄ µök¶>;à+ÞÚ1búà³_Ñ ö,¬y§¥¢WÝÈœ³kú‚““½9“†>¶ÂKOMÙ»0×={{ƒ8ýÖ–a³†÷Üþ¤8žõ¯åxÞ Ñ‡5¨“í ÒR|ÿÆã5Øc[é;nm’ߟ)Ö§4**ÌVÔJ14YÌ¿‡•$\S”±~Ç냭O¤x¶­=k´£X¹¦¹\©h>Q*uê@‘ÕHYügwÄd­({iìˆÅÑíŸpßìÊç«ì¥£&¤Œ~¼!mïùìq"zº{xvÄŠÒ„aM™OíªªžãxÎÏ ïY¶¨¢c(};,)7."µWÈàb”hkç/°àr´©̇úÈ#xWŒŸçÐ}n“Eë§ íð/Ñ–G}¤Q¢®KRׄ9Ïb5s»)ÅÄžê?j3o\âüÞW}xôMÑ® #¬JðZS†§Ùó—övÝ“4`jy² Yüæ#ƒ£¢•C| 7”.;´ ø¡q©AÉ¥|¡kLõzÔôæÎŸÅÝâ ìúzý‰•}SSÕÝØJµníþÔ?àw} ÖbêWfDЈ°"2Ë–/·×0g¥% F:Â[úkô˜uwÞš¡—}C>¥é2‹ãcÓ†/ã ·tK‰ŒItB”{ÜÀÜy£ÓbóÇg žæòëŸdÍž’dMpõa1ušÇn™ewOβgöSjƒãâãÅȤ’¾‘ŽÃã÷è?œþ[Q=§ÐÿBˆ³ÅË«½ØKº×íOýBMzåÍ c¹¾”°¶q׸ew˜Ù ‹éZZ«ÙP$žÚ3²Ô‘™3ܵgªWqqY†íÂÒY3%:ðÝ7qsrn\À+­hŸl­|íS‹)û(ñÇ×’B±¶mqµØ·j±·Sh¯©K1÷të,L -äW±Õü·xô0V©§YU›øÄ„ùí,RílÈïš ÙPE¯ùÎÑOiü­Ïè̈”蠠蔈.Ǭ½õüºuJ“Ñ-%&((&¥[Dr ÛåDÿ‰…mt$çÑÐ÷iµD÷¾Ä¤&" …]3½ê6Q…^[,èÔ¢BY®è²›0Ùÿæ—èBliî ’ð^Tû“/aÏúÆ7¾^BXÇ7Êå·6Ñw}X¨óýÃ<û¶Îoq›»l¡“lA>Ë¥f~GáÙô.ý΢*®­¹é·nKuJâ‡þ—H ["BZé^o˜ûž½ÞÄhŒ¸{ÝVƒ¡·Su-®$ðZTIDtXxqX©A®uô#¶Üeë|çÕ ”é,wíæ®E.«þ;¤ËÊ;šÍ⵿Õl‰ŠuÚ¶¨ýC̶Ø$ûÖåš°ä>ý{”V„ôNuǽ*œqpCÒª³; ¯¥çÅ-}Ft,<–Q’l½g:ë ¾óÑr{EI¬h¯B0k¯V¢gíÕÏ"k©¾ÔtS]BÐHØ\À}&i¢sÆò+7ܭϪÊÐHŸÝ²§j¤-3gXÒñÇm}òã̯´vÜ+,s/o¸h­c°/ÐáÉ]ûLïV»cžbû‚ßýK×ÙôÞµ/øÃJ©k]ø/»]Î"ï½SvÍÍ’ÙÛkèÔÜáÓÙ{ ’ǘúf¿± «¿ã‹gŸ/=þÐØUc™+†`¥ÈùÚêko _Múî3èlç÷zu1˜ª0‡i 1~a¦¿bm¥ã#žEØ†ŽØ$±ÕxÛ9KÝ‹ì ¬ÿn’&Þ(zhÿ¤¤ñÉ{žÕa"ýÃ*$é×ê­‚æá·ÊÑùùÆ(~q⿬AŽ!¯S‘W¶ö „ÿ±O‹=Ûãõëw›ímÐþeºJm‰íìíÙ9EWºk¶OGFÓUlӕΡé]³}ÆÜÃK]õ}ŸÙ«}¬­êÁ‘ñÞP×°>˜î{6d¬†¶Oy}ý“9öF]xî‡ZT<<6…Mø!¯£uÁ¯¡ÐHùKiŽÐäTƒNhÒZ³FCKýn"g¼y±‰ò ŒY.XíH“›×Û[”Õ/Wmú“Ê#–—8U$yÄM®yçÔCsCÓGdv,d½ó VGðÔTR~ˆ$Ð}Â{„÷Сþì3ëÒ‡)~PÎ6(¡…=b¯™Ô¶XNéÖmÑïÕ zãuµ¼TC¥víS˜Ã C#_°+Q1|§’ÆÜ“±lJã“Ùm/¶-ð¤é1°lìg㮲ª=#Ï L™4:ofER츭óú¯^¶>-»:=$(£±¬zÁP; H­ÈîÝÝ`Ù–—nqŒsÇÕÈ0˜žµZÎðð„^½BÂ2 à–¥$ +з±³’ÔÜg{ÝÁ:µZcõׄ¨M¿ùé Åä¦Õr/=/e¹NKƒüYæ:’V!ÑlÙ“ʶ2ætÉÄ—zâÛýïÏ~õ°ï[ŠaÕ—9sFÒ}þ†]-‚ßãÔ’è;ö¸O˜2ÙßÄFXû¾Lñ† lxöº:«@‚ŠýŠýoÀžl“L/’!ÖˆmžŽ´ˆÃ¾çÔ&UbiIiâ³›÷ì±eæbøƒ­ÂÚŽû¿ÅØ‘)<ƒgæ ]Eà™’áöWªà“Õ¨áŠÕ-©ØÚù[+ª5¥*•’5¬”'ü}±~¡’?…¹^O§`¡Ë(Ô‘sòZjú/Ç|sÞìhÚ¶Cxâ–ψÆ3r¤o¶­uÇ**•ŸŸ^ ç^«QP³Ù$*Áßßd FƒB' M÷Zç—Ä ø~_º­z“Ÿ¿Y§P j­¦X¥.hi€”«,û‡&§ßGò÷pw¬ íèeÿØ?ita> æâE`Ž EÎã­‹°¯:½ngE@ü㋟Kô.þx Þ–Æ)¾ (؈ËQ“¹ËW {YË)@éz¡tzòQ‹CÓÚù»»Ã!Ø”D…ŸVÇ|ÜÅjµªîèRø«PÌŽü:]N—éd þð>v¿@U:Ñ?Üí' ŽŽ2jŠ_al3-^¡i«&}Y,%Ui,–$´8þ1‹£!jGø?ÔŽ2ò/)鉚?O:ÿKZPÞD°?E¯o}W}¿´Óå¾Õ_À«*žó­ ø–R8È|÷Ó}lkIúûj¤BJÜK`±hipphXPkç—°¢ (…GFtûë 4IAU#-–®öåÊÊÈèÛå×èÛÕÎBÚ\a¼¡Q*µsÙµ‘?«°ßÎÔ{ÞZÜ'"©|HžÍ7ý¤ÏÕïÔÛýœ|`€ l•ݲê±v¹i«ðò wxõ¦%N· ¯d4‚’êÔ6µø›²X@V÷ šë¬².¥ôeÀHßÖ–r¾ù…ì©’g”ÚÅÓ·Î éð°ÞèøH¾X8ÿøÊ'Ò¾ìÛ)œÁ7†CIÄ!b„X©½êßJã[T,IöÂæ$F@k0_ËimxÙU38!¢G„Éîr8²“#2ç˜wZŽw÷Šë“Ô;&$bÀ¨Ìò§ç é äžuct(ÖP½’H| «{¦—èzàwQÂJîz4üƒx8[üÛÇÓ»Ö¨7þMvhFd߸Ðи¾‘¶ô¸¸ôÿKþ”wı±{cúLçeá´4—ÅG‹2´UÀÏ“˜kã¼ÝË0ĵàÿ!‘Ö+Øá1Ñ]9º{-¸îÊô¤;ž,úî8‘.v8îÁë6øPký1³%JAÄ HBZtlñ„É¿fDˆÊL KÌŒr `<€öëéˆâ'QŽÌÞaH=å}q~¥,³Ãê!Šw{„5Ó|,ŽëØ)Œ ïoGÜv_£°\Õˆ¸Ì‹ºr?Çâ7ØYÌoŒØX Ë·o÷5²ÿd…’åôc±]˜ŠØÆýH¹ãɶßÚ.Ž¡odyHð'(ÏÀ_mõ4pÈíÛ¯SO…›NJ™½¢Ò  t+1[¬Âï>WòÔ}K|‹ÚŽûÆÐ]‚rþÕŸž;Ñ·Ô×û;_Åk,MÒìwgšû÷ëÕ#ðêçÎ4™×46- ÕDéTz:áž}+Þ8î[¬<ã«ìøuÊwÿ¸qÿÄtû7ôsºˆ¥YuXòEldº{Õ ä³ŽCå‡âÕ‡Ì lëlçï&øË±ÀH/ùÑA¾FuΣ¿ÂR±!CW*‚^èn­Bñ¡jŠø!¾óÿ‡TØþ$Õ.J¾ïRj|T÷(lK|ŠFß5ØÖÿ€(ˆ¿J7Þ®3EãM¼b÷5®ÅÓNˆavF" auöÃAŒôJʶC§¥­ «8L1ÂŽˆÝݰόÇIÐoã1oàMÞ‚G’mÝ"¢å~Þ„=Ü$w VAVC¸!ܪUFvP¨àÒrP£÷óW˜ðöf’;A­µuõ‹x5 8Ð? [˜>òU…FIΠÀÝþ¦,“ 6á” y»ÇÅD)ù \.æ}HI1ËÜ'íç­íføÚ¤Ýë'gqjb¬éáM‰„TW Þ"ºD;à ÂÜi´‹ ÕÑODwÕã£/£·Sõ„ãÜ׎}Ï::ñ¦{ºoǃt܃tˆï þmtœolW…]Œ+°@b‡ÿuHKHT+]Íw «÷YtIðº„ÃM»¹Í!Q–üSÆ_ö¯‹¸¬lêT*¦K&æ€=Ûî2µcy"{ÄåAV ïíŽMà@!N ?| ã€LÚ½ 'sþÁùŒ=J±ãœïìòÔ¼éÃã:vRQèåßÛ]æb§Âê ¿µÔo÷íÙpü¼oT®Í×Ч*Ë‘óà‰U‘#èÓ®ŠÌ¨œe'ЖV`®¹¨´cÈØ§¢:̯¹õXgéýT—”¨/üºtŸf‚®¦°ZÂà=4|gëjo;Q³ŽÝ¬Œf¯Ñ.Þz—–øN¹éÖghmâáO|vs)ž³ϹÚHó =j5Ûàžàö£v“á ±Ô ¶VŽIÏa ó“°V»ä°@Se³Û@,ÙßO…®‹wZ¨ÕvñÊ­ÿ¡eåMý,ai#”¯Ì¨rbÉÈ5M=KV\n¢%eóêª\I#sb†ôŸ9|\Ÿ U-y`eé·ÈÝv¬oÏ!widÔ!ìOwœ)Vg«Óií!j±«XçŽ0kÓSBN™Ó÷Z©Õ—}µ‡ýJ\æ­ßVËliÐå dnv¶Çù„µÏ.çëi]ûžþ¤/=°‰›ŸzÞùúsž]=|QÚÀæÂ «ªz&œ_øäSýkó£—,Êy´$jذ¡Ž¦Í÷¤Í¬wÕ'ÓÕ#žº7[§Ù¤÷säŒëŸV’¾&²_eÚ¤š°°~ubż¢5IE(¯å}=ÜN²‘ntìAkþéQÐ#nC >*ør·nQáWC&`Î ÅKÛ%ä_éŠÆ½Hr±°Cº].öŠy=YõˆïW¬kVDnNVhÚªA%KF%íÝ~]8Þñõ}㼫*é¶Ú­3Ýx¬Ølð‹Ôµ`º°i£o]TåŒC ÑËTân Kh¥k÷ëØ.o;(J—–p),ödDDZ¨2ðjÀ„äS·{k¡çyOƒùpal`N¸»ßty%${ÞK§ì˜Ñ/l@ý“ï,_úèìݳjYÏ×Ô=Y—r0bàøœ˜áEyÝz jÊËŸK7Ú<;7Í_Ÿ¬?º£¹.}c߯µÕ½¢ûM\[; 67Új XúrSBtáDŒÂøõ¿G¹TÄþ ¾›Nácýk¿r‚Àº˜‹¹éœmذ!k\6 |ßñù)!£c 8K1ÿæ Åüm°O½”N"Fi°O¥ †aÖzÎèV´àÀà>Îq'ýÌf•íTxúªŠu+©÷fpã´ŸM‘½ì‚JÑÕÓÓÿèf§w¼“MG׿³ßwmÏÔùK.ÎM¶×Ôm¨KÉ™»£¾öùyy¾´¾ãó{FdÖäDå…ÇNÎó]j©ØØ§aÝXf’¦5£7ÏÎs¯ùšöˆÔ”›Y“ÛÃÂì3)oê-?+Ê”ë1êZñ.¹?)"åÙø^~3‡oWá˜ßxx^mt¼»›‘ D²¼éƒ¼‰e¯6ÜX!– ¥´ÿus¾f]:‹ŸÅÌìľʉ¥%·ê¿|ù /émÃÿ~UQv«q»ˆ†Š6;0}RæõÄH? cï¼Ïï>„ï\> àÛ,Ì»ÛÎÃÌ锯Ò3S„­5S»xazÇûïOÃÏK¥5bÒ`[ÎR”“[Ÿ;}ÚÌéSjñ„üÙÕ¬Q endstream endobj 53 0 obj 12637 endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MSZGIW+Helvetica /FontDescriptor 54 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 355 0 0 889 0 191 333 333 0 0 278 333 278 278 556 0 556 556 556 556 0 0 0 556 278 278 0 584 0 0 1015 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 0 667 611 722 0 944 667 667 0 278 0 278 0 0 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 0 0 0 0 0 0 0 0 500 ] >> endobj 54 0 obj << /Type /FontDescriptor /FontName /MSZGIW+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth 441 /MaxWidth 1500 /FontFile2 55 0 R >> endobj 55 0 obj << /Length 56 0 R /Length1 21268 /Filter /FlateDecode >> stream xÕ|yxTÕÝÿ9w™{gÍìûd2™ÌL’=!Œ!«" ²oB„°ThTAŠ ²¸`T¢K,­bU,.­­mZ_´˜›ßçÜ Ò÷}ŸþÑç}žßL¾çžsïsÏùžïù.ŸsnæÏ[0…I+áɰÑæL%êgÈfBÄ;&Íž0'Y¶&„nœÔ2?-Y3 ágM3mv²,?Dˆ.0mÖâ®ß;.RúÖô)&'¯“Ë8–Nljd™ã˜1}öüEɲõ êwϺmR×uûݺÙu=Ÿ|ˆrÚO&Ìž’¼È|3æÜv;;â3ø8’¶9ó¦tÝO›Ð¾7 ÅÙzò Ñ’[‰D8bÆw,!Òºp•]ÇçÝë|Æ[Rª¾#Y-ß2ä¾äùiú¯þ9årLÿ€üNh¯ÜÏŽš,%‹ÅõýÝWÔß!©o'#rÚÉP5¨”“s›´Òä~Ð㠞̠÷’Å Õ ‡ABwîi”Ó{÷ rüEº˜xéÀ¸^Þh÷Ý:}ðívª9øhð÷îOPFïêÙo$Úëtôqú™L‚ô)¡KH#ɤ[dÍ ŽÇ¥§ÉP+ˆWSJŸÞŸZ|™ö"â7Q’*Ђ.È ~VÐÎÑýÁWbí¿JE)ž<x4øËÀ´àË =ÉK»³pÇ Á§³‚ëSÛé–ýÁí¿y yXÀO_ÎÎÚœ\ ^¼±Û³?Xë7ÅõÁÒòP°$p>˜k—)ʹÁÁì‚ß3ðCÜ–†J#qKÐXìƒK©ºXк›n%ÙtëþÈÀà‹È¢»d•ol§?=ИYi§K⥙³c‘¬ÁÁHV},†üM'¥åÒÍÒuR¡”#eJQ)$ù$»l•ͲI6È:Y–¥vúÌþê æÝCªÁ–=d,¶ÓçpR8BŸUO>{HdN&²½½óLx‰½î9hf9d^Ш9M;}ö@òÔ³ñ Àr‚zÁ̱<¤„£2G’6úóv Yál©vW[ûY*êkÿ§d¼zåJšó?Ü4жqЈ¦¶Ýæ¶B–é 4_¹Ý}%ó?ç/À¥)599ƒ†/>Ð2gæÔº)áºñáº) ñm÷¶Lw·µNLKÛ7s»ÖÆGÇOœ4'Li›žRÛ63\›¶¯Eý]ËSÙå–pí>2µîƦ}SãSj÷·Ä[êÂj›L¬™7öšg­î~Ö¼šÿæY5¬²yìYÕßõxÖXvy"{ÖXö¬±ìYãÕg±Î×ÍQsû|HgZÝŒAim™#ÚÜ0º©-mBsm;Ý“µ ˆxŒ˜Å£$Sl%^!Ÿ éü=è;*#;?O³2»óï|%õ0#N©®"ÇÈÏÉV²—hÈ.ä3É8²™œ¢31·Çƒä=šJòH+æ};LNÓÎÎ3d*y÷Ï'¯ d1à7³‰W×ÑHç”ãÈO$Ë;Ÿ ¤œ¬$GIj]G::Ÿî<€«ÃÉH²›ìÁïMÃÜ>ÁÖù\çy"“Pçr\9Ó9¸s/±’^¤† ÃÙåäeáÏuN'nR‰Öm#‘íäWäKz=Ø9½³¥ó­ÎO ªnâ'#ð]JÒOø½ÂÊÎmíTÀ‰L’§Ž'ëÉ/Pÿ^|AµÖÑ[é|ºžnàâÜ]ÜAa…èRàCiÀ·‘ÜFî“ãä[òýšsóf~>ÿZgIç=„^²žL!-ø®Âwút„jhoÚŸ£KéCtý—Í䚸…Ü"îs~(?†_ÌÿN¸]Ø/®7kôÊwG:Ot¾K\$@n&óÈ2ôîò¹@.Ruùi„VÒ:ßVº•;L·ÓÃÜ0zŒ¾Åí¦ ŸÒ¯é%Nä œƒËáæsë¹=Ü+ÜoùüþaþüwB?‘·‹Ÿi"ÒÊDeµòÛÎÊÎO:ÿ +“F¦† %· èíRL~†^<‹ï^ŒÚqò9¥~?¥~ÒAþ .j¥^ZH‡à;”^O§ÒôQú"¾/«mùžÃ@pZι8?7‚›ÈÍæZ¹w¹VÞÇgóùÑü^|Oòïñ—øK‚(؇Рk…ÙÂ|w»„ý›b…ØO*Þ$¶Š«Åµü$ñŒøžf™ff¿ækÍ7P‹ƒ¥Û¤µSÙ_A–ü4­/$?!“h-H6b4¶Ó d ¤k2½üšC2;ÇòËø®7¤áeòSHë²”¬æÇíïó»ÉYHÊ,TÙJv 5$ nÂèÜEzCŠº¾ñ¬ì¬ÌX4’N¥Aåû}^ÛåtØmV‹ÙhÐë´²¤ž£¤W]¸~|Z[t|› 76æ²rxNL¸êÄxLå´¶úkïiKc¿›€K×ÜÇS{ÜOÞモšÓªHUn¯´ºpZÛojÃiítô MÈÿ¼6ÜœÖ֡懨ùûÕ¼ùP?H«sO¯Mk£ãÓêÚê[¦¯©_›Û‹ŽƒºÜ^LqĉžUÜFúOX Kú³;êÚ¼áÚº6Oy\ã#u&· »¡©®Ö 5ãN oÂ3r{ÍhC;ɽ†ÉáÉ÷¶ÇÉÄñ,7aLS?¡¹Ïê²ä´¹Âµm®%Ÿ¹,^ÉÕ­½êb©Ÿ0eM}[|ü½`.+Žg¥ kQ4" Õr+š›Ú芮F°6ÎDKYs“6!2~fZ›6\ž¾fæx0— oÚï{UåÛF†5í÷Ä=j!·×a÷²Êz8÷ºÜëØ±2ä^–<þùîäù·±£{Ùñ?â8hx7(ã@xÚÙ–6I}H-gÉ”r²fR9ø„O3E7g =ýÛ8È i#&´µŽ¸ÒŒéµÉÆŸY»_ëñªF¨¦÷_cÂýæpÚšï`­Ç‡;¾¼öÌ„®3šˆù;Â.²î–•6:áJ¾…Ëz=ÝžÎÆ·ES”ÃN ÌXÃÚÜf‡ÖjKkÆ x“½µí°¦}”®kn§+ÚImà0|Tþ–q¸Ü‹‰ÚŒZ<…Ü^8‘B.¯WZ=ž\Ïd%mMÚš“פէM‡0 õˆ SÖ4烃#šÀ'r#žoöug§47÷A=ù¬ü·¯iF 3»jÀQ=•ŸÀM½{Á˜òÑaM74µµÖúÚâµÍˆï±aMmÇ ¹Í͸« »¥hñÒî®6¢ÍÙ¸^”¬¾K+ªh^³†Õ9¢)j;¶fo ›oÉr;%=OÄ»N´v cy;m†ßâùÔ1…ChV3ãi1DúŠDÁgÿß9\ÚÝnü² ­-U9\þâpÅ¿Ãá>ÿ‡+»[z ‡«ÐæJÆá¾ÿwîw ‡«ÿwÇ»ÛF^‡ÖÆU×ü‡8Üÿßápí¿Åáºî–^Ãáz´¹Žq¸áÿŽÃ×pxÀÿÎáÝíF#¡µUþqxÈ¿Ãá¡ÿ‡¯ïné5†6_Ï8|Ãÿ‡‡_Ãáÿ;‡oìn79­½QåðMÿ!úw8Üôoq¸¹»¥×px4ÚÜÌ8|s7‡ã¾6rµní¡vÉ\1¹Šåð”D+©á*8Ÿ%Ã¥©¡«È6n7YªÅùÝ8ŽÄq/»G¸Ä»¨ÇbP h®}ÊHx†Œ‘ƒäñ&’ Ú„8n4è)ä÷ Ÿ’½š 2 åí¸÷~·M³[½gÎc÷€Æã¾îÙ-ýœDPÎf„û[AùøÍpP ‚ÿJËA8ïDZ/h9=A–ãZ+Ž«Q÷rvÄîmU¡/«qõ×…r+òz<ËÊŽ ¨¿Ý£¬¹‚iˆ†Þƒrù%ƒT¨r…±„EKtˆ¶dE2‘õ<JfA„HˆM-Û:C¹‰‡x‰Ï ¨çSû¥!ÊIWKaÄ£ä¢$†ˆ Î#ð瓟D›¹ˆtóáå z(ÂébRBJIbØ Ò‘géKú[‰“ë5õïúåÿ_‡Úin]×™RôuÒFz?}›¸t®†›Ê½Ã Âhá+q¹Ø&~¥qj¾’–HмNþF[¬ª3éêuãt+õVýtýç†*£l,5.3 4½ž’™rcÊJó0ó‹–*Ë.ë<ë˶©¶lçí7Ú[ìß:†:^w–;Ÿq~ëzÛî¾Ãcõó|ã]é}ϧñMG‹8p˜oÏà!ý“X¥œßNln'ä-+#ψ<ŽŽ<ŽÚÉ‹ø!7弈šD{YB–¨FX×~ùOâÑ‹ýÛ…!—€}áŽáü\n\׳"q;§yD€ fñB–䑵JèH# ¨¡†t¼— ÕU‰ª‚Þ”«_n\êâàöÀâ x4qÌÏ«é<§yK|r›iŒAš¾‰×"®ÌÔd˜fØhØixÝpÖð½Až.M¦zkJŠÁ”buŒÙ½}¡oÆXn†þÛ¢ Q—b*q¹¼ÙÜ·½3ä¿Z3R¿ugdxŠ«‡»s†šÑ¦Ë߃†ÖM©ýœäW ©î¸œÈ?Þq¡ƒZ¬ŒVåå,5/èíî¿8>œæézû íÙ>êMwûˆ9Íê£Î(rv?r…\Íp5_›ë£9‰'ìóK‰+âðQ[ITä‡6N~è•Ìtì\‚`XN–—ñE4l--)ކÓ5»³ÈzÕ5rÕypúôýœ>ýÀ·]þÃm…‹ß4rñâ‘ìÄý¸ ä pNrí§ïg'î?Í»ØÈO_O½"Á¸µÓš¡ÕyyÞ Ág£f 9B#é÷ŠŽÛ˜¿Ý‹„µ'wšÍëØ¸ÓÉì÷“C¬qlR_=îeEŽðÞ3gÎ4e¿Ç‡›©ÊMNÜ%QÝPŽãüVž'¯cø8ïÉw¿¥P]%&çK!îôíÍJÞf¦e˜~‰wþ^ð‹›¡ üdnܵJ¤õ²£$Eô—HFk9›»\ŸÚ0·w¿Ó‘è ÕÕè fk1ñ£4âj#bÔirgBú¬™Ô'#gÖ ç282©CâÑù3‰E@Âfa÷T̹ËI.§Å,q¡´XÔR\f YK-Å\8³Ø]Î">~ÇøQË”?)ʲÕ-´dÍŽEÏ>¶>¿ñ9qógû”Óʇ¿T¾úãZya/­¿øÙ?éð ´RyWù胿Nò(=*>»#>´T¨F‰·~’º$u9]ÅÉÙòhÏ­ž;ø¦¡WýÜŸ)ßþ3F]'ï­ž»yÑC-”>Æsiå÷ß:QÍ’Ççœ|õðòáEà¾Öß( “7^|qrF2&ž®åt²sòe«F#q*J2psIÇ-Ћ_óIàÛ©ëyºÑ(?£k§MÄ”“ÊÁï.T% UÕ8TY*T®qÌX Kͯ¥@O[´Ô*¡E( ÷”RB›XËÝ¿ùw¿ä¾:±Pé¸6~Ýå[Qž`m£°ûbž·Âç<Ïi´Þä* õ¶Q¶i6¡l0JÄknZ`µÙ¬¦”4«M"6—ÎU‚†¥Ç½ÆŸ™LkŸA(I;0Z¤rïm¤<-½!”ñï:Žc°;ªíó®Œ4›ªây$‡cÏ }¦;Hµ\”O…«‹¥Ó4Ñ9¡u#¡A!“h|HdOrn0ua®bÃÍÆz,,ÛUãcZ•Ç$)*v.”žKX—Æo||ˡֱ+ò·Íæ¾H<Ö·0w،רõ’Ò±Wù/3½¥2õôŸlŒkyþ9e^ÔR^ýµòÆkX¥ÇÈ è|_°`n0ßhO<Ï#戙ÎFM“8]\í¹Ç»Ù«­—¥P,V¢Ó¹C%fQ(ñp%®JJ-À*æÈ¸ÞH²|wf”³2œ‰Š¥ƒ†/Z’ïVùÔ>1.%5i0êñêm”·F¸hzJF&I³¤fRÞöDõ(†M¡L´!¡^°&bˆ]£I1 àÕÐ$gl& õYRl-J³9a7Á”(B…j–o-«»ó…hÕ¾©oþý«/hÅšëïVN¼}Ž+Ü÷ØO—o½g½¡"õ,pËÊýúUš©|¾õ/Ê¿Vžûpþ¼íÑ­ûZûãÕ§¬ƒBHõƒ ã^1[â³ \ S&Òɇ:9´èޤ1ƒ0w¹1ðcÌÌ&2á}z!t.±^µm¨¶»õ¦Àƒ¨ˆH8ÖÛ–mÖÈ:æIHÅVÝd3DÄΪfŽfê¾bÆÕÊÿÅ’cꫪ÷™(ýn°ø®wß=c–](J†soÜÚØâoÀÓ92†|,ÜÆ—ª}ŠÅ4üFJÓÄ«•8tgLˆ9·°ÍUæï«˜iO$0˜‹ á¶K‚íR_ºk—2bÏVß'ïJ•âgð·’7âÍ¥¥Åõ¡‘ÓµÓb3ûM«YÔ÷¤çõ:½'ÇS‘Ù·œ/7•…4r…C«©×7XšÈH¾)4ÕyÒxÒtÖ~Öqö:“^çÑEu7éEGu¹yÀ’u<'—ÈíôþÞð@Çý¹Y•8¼/LÖüŽ|kÅGyÁrU'Þ±VTw¼s¼ÃüNU⸆m•h>ï¹ ÷XLD‡™cs¡µø°Žb( ÆÊUu¬Ë˜ÂÃ&E…NWYo‚ÞMÎ\Jƒ“ û*Ì(si„°ðɈóvÞtݪM‰Mzþà t+|ú—Ê×OO'ð%OÜôÓ‡©¸qê ¡pýŠSYxÞóÊKÊWÊòSϪüéâîS3šG[ËbüT $}áWqjl.>¬‘6Ñ锿‡ß$lÖ=­k×¶ë4™ð¯$†r²V‹DG$‘®¥¼f×é"Vœ³‹bZŸêõ"¯Õ ‘ê9 Ç,UÂ@5ǵX~Óhu¼ˆÒ®¸ÕhdæQú¨Îc0n­ ó ½à’HxÔ)S_ ½á‚#7$¡š„j5€R½Œ|UÃÂ*pÌ×&o^•çFLÅNð8ÁoÎa¶ƒ©bsU•‚¼büÆR=µÁäC|˜òëþбâÎqnCâÈc§¹û¹Ñ̈ð“.ö§íJ£êen_ätÀ32É]ñòÑÆÑ–™ÜLãLËnaH`l´p9˜"màaLNuqúÔ˜,øf¤„½ÙZG$ÓéÉÊn§·µLMN"ôg¨ùû!ª³¨fj1ñ£“`u{EÙÑD%·CE¯œ€¹JLߥª…EÃ!ËUYžI¡jé¡Ù1‹rÇ—ÕÿdAÍ]Ê#ôÙCC î¼TYð*·^}üú¬!sË'5¯P>N¬ç‡…ËЯT$FÏìËã}‚‰K¢mËÍ ïmÎ唎zÝíÏ@*Fwžçb> )ûâ•>qÝ(òAX®»è*qµM!ó+‹CÓ'Àú8´©\jª‡/à*Íoš¶Àã ¦mÍL2`HGW÷Ñs|8×È0Ý3Ù‡ø][ÔñEõNm!1ÚÍ…ÔjI1K~”DÂRÊ ¼Îm($)V$²WS· sŽhÒl&SvâN¸J2u!´ §‹ÙÊ\¤²"¸•ª÷Í&pXH¥Å–WB¯íÿ½òÝß¿þðö¾©¯xÜ«œí$Ï}öÌ‹´!SüL9wdÝåMå5EQ~ùtó_5…#©.Y.°y½ÆˆÉãñ¾jY4 •P9ÕÐ¥èx”:-GT#‰’ ñ'‰YFoH´V}!•ìÀÁÔP"›õ+ÂzÂüf3iPEÀb—8 ý[S®›?°Ò›òû¿+äFÐüš¶*+{w;b·5ß;¢Zhޥ͢íì+Ê™¿Uö«}@l&t z {CãRª èùT„TZ9U§— œÁÀÍ ®Rë5ñr„xŒ¦vª?Úp¥CªP_8‰ÇFS¶ºJ•ídh׈îò/¯çs.¿Ëßqé8ÍA¥f·bÚ‹Gã£ÆˆÂn´°‚nÖ mW+4·R¯^}²NßNGáÉv±R}2óÿåá½ü¥Ë§¹3‰üêƒö&&3û4©ó÷lb¤09ïçÓ¬¤+8>@ƒâJºÚÿBš—S‡“7Ïv.sr)N‹QX™n¶¤Ú¬V‡Ô'wÈÆ>^m˜ ‡ùTk;7óB_iŽØ¼]Aª'›É¦Íœ“l`—¼'Ôp )òªÌƒGꩊ±]ªM•„^¾1ø#i4 >$<„DC„BÊñ¢  ‰6(R‘C‚ƒ.¡WÅÉ;âK†e$Ç* YÂ1}˜…œLècüç›>(x-ãOÏœVþò9NP‘Wй­½§ ½û åÒK¿9ù2Í ‰Ÿ»]ùãöõÊo•3ÊEåП)÷Ô寎ޖ3ðéwè<:÷Ü[œ:fÛ!ÿùªìTÇC²6•ç8r:I¤ˆFô©.¢'ƒÁøx¨…ñÄ W"©ÙAÖ+òÁ æ,²„‘†·Ÿâ.Ÿ:•NôÙÎÝr±?·7qƒú¼S”ñ<ž¸Ø.É!6„äå`Oƒ ¹üÞ¨'|ê~‰€xd{îIAܤ€KD™÷J”‹¼Ð`ÿÞ¨gf®4ìs4 M<ÄZäm;Á}qùT÷í^Ô» q¡>ùu¼¹–‚a£ZÞI=üY*Ú¨Ÿ·ë}†Q´‰‡~À¿£ÿÀ t‚±Ž[É 7p›8.K—i,ו¸Q\ 'E&uo”¡7Xy¬"G RÙ7ꂼ^“0P.a BÔ¶¾`#;c"\@´ð¼çBEþÜç™QQ1GÕfÂuÁ¼}FC;Ý}ÃX`ÊìÞÏqü*qHÞ’„°ôø*1y,èMÆÎ›Kçk i)Øn).-`×Åa o¢ºƒþ‚z ÊØ×”ÑâËâÑKQáÜÅþü¤Ü·^ÊÎæ–~T|ù Çø,fƒ/l %n/£åŽÁ41Ú@›8ü†«¶5îRcCrØ(©ãu:ª‘1*¸ö¼(x Ì_Ø×i‰Goè’˜+ãò=fÛ“J¦º YÞÀª¥¯±ŽÐ±0ïL~(þ¶ýûüè)/s}ÐèÑÂŽ‹ý…§.ÝŒö1ŸgXç»âÐ ö“5ñ^«°Hr‚¾Ê”Oé4ýeGŸÞ×GÒú9¿_o-ཀྵî½'ú~3ÖmÄÔÉ[H¼ !ê‡ >TH½²»áC… *døP!ð!_!ð!$lÞªÆKÀ×ÂCfÀCÄZb†ƒI,vkˆ¶ypçqeƒòì+Ï>ô2¶Ëùþ¦üýoç•?þƒ:Lâg_UÞRë$|Ÿ¤ÙïPóÅ'èâU)'”7/(ûÄq'¦ëÿ >èо ñ’†Öņ%V¡ÑÞdŸn_b$9Õb6ë¨)…YÌi¬Ak·^gŠÊßáüo”‚yÌIÝo[0¡)À ±6‡ÐÀJ…‰êº„Zìå6ÿ潕Â|뢚ەùtíÊâÑN>Ó™X/îTøy÷3™ßù®ð=Ɖ­)ñqY)±p4Zj* 5D'F—˜fho•Ý&W„k6M7íNçu¦>éé:^ð»WÚóósü}ì¼Ð'GÛ›Ó™dKFz0³wo‹;â G2½…Áˆe‰ä{ Íì²dpÌ~tP¬À"]娰^æ%ŠXTÃ=$3Ï$2墹 °A¾É!¹yêĂÿ°sˆÏáΡ7Írˆ6¦Ï¡=ÍC^ÊB’jõ㢉* f³ªÔ™<$1æý1ÔG wÆ‹æSUg0 Œ¬ 廜AvÃ.0M_FiªT<éâœ1û ~âÄ«7¬ ðgÚÿHJÁÍçÚ¶Œ®|ë·nX«<ò7å«­[yn=·tèƒiý_TTÉíU2æÐëʾk©¾ý¡‰³ Ózç§WN;~áíµ÷~%`ùb0ÍŒu⸗jR‰Ä 2 ‚É%ŽˆÂ%GfN= U¦sáJÌf°>2-_"œR,o(ñèދߊ&&óݰÏÌž°UĪxØ%ÆÄr3¯#œØÇ¬uòN§]1xÝ4b÷¸Ü‡6\cg¯LÈ*ÈU1Uæ4C)¨˜+õ>Ÿ_Õü»ÄÍo X©¬UÖ®Àõ^žÿøÌÇŸ÷¿öò åï*ßS݃4…¯@_#Xúœ‹öèMñ ²–.’kéWÑ•‚Ø@qµ|£0D®Ñ­–WéNr'øÒI½¡I?Mš®_Í­äWJ«õsù ÒýÓÜþ)i·>»Æu²Þ#;u£$^t\¿ÌºL1Ô `‡A¯(¯‡Á×D‚`KÏK²‰Á¢fe\æ… :N{¡UOèJƒÇ¸lö€Ïˆ**¼ ®C2ŽJFQ®*H-]5$¯cU^LÃA-öDèÚO±2—Z䤕µ:èÞ-qUxœ&ýª¥fù5ÄWbŽ n• ºRtÃâú¿xÕ ¨D­P«•“õam™C ²ù˜JfqIÂ-w¯b™¥2–À`v°45vžMK‹ðGÃZXžuÐÁïÓÁÔqNYvFyVÙsFi…)ìa-þÊ¥~ ÊV‹Åbäô䥸œLZÊÁ ò£„iü4¡…[$߃ÒÇôe\™X.OE˜ÊGÐ5Q–d­„`UÔà(k#V^+ÉÓ±õœ(ëÑ}IÃ6Œ"b%²`;‹±—´^#O³¶SÃc= [‡¸›‡z¾Ç!©YÜZC•äy8À–#ÔƒùªCÒf…ÐmÖ}Öyêý†3)¶èB:¿C±qâ?”ùÜß¹Ó‰ßr…‰âD 7óƒõ»ýf«ñ÷ųï¨=SˆXyŽ'6š"^4š#øFïx­V z/`Ç[\«á8Q¡ìµò<ñ讈¦i…;QUÑ7ß ¯B®°´næ°Â§€¡ÍÚÊØZÛ C¢Àñ2FX€ˆWeÛÔÄܶe×aÇ_ ®÷Êåõ‰6nÏÞ¢¤U™¥àÐ%q?ï'fÁ/Y“ Z@‰áhß„fu;e® iCÔ˜ 0(ÒB­´õ½÷ 'Öÿpz=êÍWfÓ½j½ýâi.ïñ EWåš4oúðjÝUIŒ®Š©§.優™Õ‚¾W¿0çPþ»ïÒV¥µ“hŠ×ÿs‡ê; ®ÌvI§¨»>Š—g÷¦:3|>¬¨Ñ”T2'ž·CÚé?ëçÓå”TN$Ä%‹.5 ×Ûc²7Í›gΣYÄXbUèèØ+2vþ|WTÞÁ` Ö³Tï¶:5:§Æ¥V‡äŠR›65 fÁqclBÀXaµØ±8ÂÝð3Àû–½•OŽ?ùÃ÷ç–ÜXX±ƒ›úÀ?ÿéáhÃ+â+‰¿ ¹AéP.(J[exÈê¥_¼üôÇ/œÙ4nŸjñfÿ–0TÝC³3ž¿ÓC7»wÉ»Ýü@Ù²ÕÎóvMÀ+ˆ6$ŸÏeŽY)–¤,Þ€.æòøñº”t 4oi—Ä gUC:**XL~•3£v°“-bpè¢Äd3£— oâÊð–Š·èÆ(ð$Z·&Êð–Ѓ·¨ SÄ™D[$ukA!Ð&|Ø"‰{ïS×^ó¼eÏ ì}σsîöìMýæÈÛ©õ¿0´í줻wÍ~|û‡«¾û-ú¯5ôé#åçøŒ«žÈÂxa™©Á4Ê´SxÚ'Fd;—&H6péÅ<[ž9Ëbõõ1¯'5¸*4¯æêî'Î%¸vl½n¿VG(uëÑ7?âá¢Dç“£è :ºè•5‰âªN¢k‹0JX·[tøþÁíK·ïXrÏÓt͈Þ}Ÿ}¢ú™Û(¿þ˜ÞòÅÙS¿~õ­7¸²âÔA\àb¿ “šhîÅ¿ÒQˆ?;Ï ^è?ÛE ñś䇽;ƒ¼hâRD»ÃdMqØã†¸]ÎòÒAúøôuþ„ï}ù÷Ú÷‚p}ÖŸ°œ°rcd1”‘²ÅȨÐH’3ðKº€S‘6ùwúagJÄ/ztÉ‚µÜ@LôÆ2ò¤˜Ç½Ú‘~D’ªè¿“P×q¡ì!&c»åJQE*Ti©'a˜w¼ÆBEA `5ÛÌv³€ 5龌(I#(M h]R”è¦(5šÂÞN‰Hd7ä +Á`4S2À.ºœÜìœì;éܱd.pZø°Ð*¡äŠ& ‰ À#EÌï…³ Å~ð½òR«ùò×âý›~~coû>éú‚ዯ~Rù+uÿ‰õ™Ÿ½c—HÃBí#o˜5ð‰_¼6¶´¡ò¼a~3 -€lZ£DÔßu` ýÓ ¶ÃEâ߯"ÁxŽÐè>ì/Œ4OÙ~lÿ-[ž?ºwÒr.Wçå˜Nq’ñ^˜5²KrÉ1!f[ -e›‘³a³‹% ‘1K‡HÑEœˆ5ðíÐĤNaqL—¹¨R­Ee‹›ª1P—g™aš’ŒÍ,áåãE£îúˈÜ髿¼pÊÿÃB¿h~4q÷‹–²¦-ï%N29äð†¡•ðïØ^»Ò¸_úL€pjxur›%ñÌ;ÚýcKŽ'ªŽw‹ºcŠ`lñoù!|„ìKï‰GÙZ/ü.ôÅþz²3>¹™£}dêá0Á\šQâ4q±f‘´J<ÌŸâÏawÜcYÒòÜrî!%ÏU`™Gñ"•f¶\“%¼R%j´²È yă¼F'it¯»²ˆNòþÐÄÃÔ™ôZê§|Žˆ¤ þqµêÃcaN%‚‹_Èq猗š™å*Y]³:˜‡®$}cÉn}–þöse*Ý÷¹²Ó³ÚöÐÊm‰‰œòµ«ÑI¶–Å“¬8F±k—§O¯bÙ ³IWoõÁƒÉíAàø¯‰ Ø™º"^)É’I“â’]&WJLŽA…6znÒOÓÂ7öè8Á \#B7ÏámºL( K–Æé~o{¯9“ÁäðÄ2Û©ñj!:o¾ÐqáŠЏÀcÖɯlªIJ”£K¢\W<.–jŽ®‘°ýñâæ¹­C{eT=1åý¡ÙGn2óáCÞ¬9Swò7_ŸÑ·:£þ¦Ûn\—(㾸uغ‰¸#³ =ú&“)Ÿ>3ýÅnè#knɰê=’Çãàb)^Ÿ6æðx}íT o©Ë& nO)©þ°:ª·ia¹,\”J.äD#r:»!J¨‰ì„sÄ›¨¶%lÃW†•!6W6[ŠaƒI:D\Ñ{ð‹OmÜø ¼Ø{YùÇGÊejý³f>MÙ±qÜC—÷ï9ÏŸS¾„{˜Pž£9—á„Ç™OÔ¢Œ"èº +ó㽞–wº¸L9Ío1i)Ec øõé&.æöfèà醲ÒS<áŒÿÖÓU•<Û·¥öÑïôÑ¢Ä‡Ž‰N$ÔcŠÞ¥öIíów™w›3Û´F‹’ò‰—-™†l s¯ïŒÔ¿x¤.‚TÉÛ[¿ù§/(‡æoY<¼wåÁÅ¿{»u̾#“·Ü1j¿oÝ€Ì*å/èão)IøˆÉb•2²Ø€>¦‘%ñ¢rw£»É½‹îwù5™²ÕÅëi’Müz§I‚ãçÌrؽحð„Ò¯²kªß«:~]]íê©/h0ŽF9úg"!~®Iª¾ËóKbnV¶÷& ¹±ì²aa‹êý±ÅÆêö¿ÔËо`'½ïæÂ¼=Ïç>¶pòmâ]6ngÛ„M÷Ž}ì×ïpýúgÔo¸”°q$5`¡žÒWô÷ úi!×Ç£1>j,ãÁ$›9“Ö¢5Äd6Ý,:Ùk£Ì·%«­ÖA$Ý(UL3,WT©>Îö,$·Nui 6źýKxõÇ“·Šî€Ùg¾çA¨„Ã¥[9þežÛ;/±™ñ¼¦ó,ÿ‚0ˆí»§yñûʵ›Åև훛³5™‘Xi¨>ÔÑ»)cTljÆ´èbÃbãbSKx~ÆüÈüèŽÔ]½l<\>1Wȳ¯Ãçò»¹ö¼Ìý 9)p‘t£Nȱ¹_÷l’ÈÛ’£Ï—´&3'‘üP¾7èvºc®~™Q)–é-0cæ~$–çé]°¿ÛO…ªLú)fäXw+ò‘v!´, fª3 ͦ¹\ÔH6d †ˆ6*…(PÙÖ( XqÎgw‡hZJzˆ„ÒMF9¦ ÑhD«JÂÿë@’jñ‡2›ŒŒ“»²ÔÕeu*\™àlÝAÅf¯†fáò¹œÒ¿b³˜ ÑýZŽÔîš¼¹oìöûV_7ÿƒÃßÞÚŸÛ-Fû=As5$ŽeC@âº.H|+ñã@Äß @œñŽfOâáH»»'K…ÃÇ2DðF™°uW™sðw>~oÜÆU`Á"»±#¿7nb¹Þ€n«?eØ:~»ô¸H¯[ËÕ G»Ï0€tîܹðj}\‘Þz„¢g{æ·?8¨œ:rîwG”_ƒ¥ùÁ—ó —Îð}/¿ †vÉá'Èê±gaŸN®nÓí#šê6¼ÌÑfÈo3¾‡ÿý¡³X÷qrE[ÿöQðd)§þåû>P6ÑÅŸ+ß+ÊyºXÈWVÑÅbâRâú òËq(Ô“½³õFü'k÷¸wºy”[­MÖiÒB~¡´Ö¾o³mvlrnrí"»œæF2ÈÑà:åjÅ×En•¸ƒì`6Ú%fdŠn‡Ë‰¸ÅaЧds¸œ>5“9—ý×pŸ~×;ÉÂ0ôóîäXu TÒýšF!öô38Ù6 MÜêÀÂs¶Õår‹ØØ©s\g¬gGuËÞ\l…Àæ Ïa#2SºêéÒ²~´ œçùЉèÝk¶µn‹f¥æg› óÍb?“2ÿ4 R!šò€òåsÊÔƒùI£&ä–ʆBÔïb¼Âžgþ ô[瞯)Ó4’Q¤‰ŽÒ@3Ðiš…¢³Y“Åf5[ÛXB¹ DGØ?W%$ö“¼~ [àÞßítªî²º <áÕ]a°o蕺¾MÇ–QìåpP¶¦˜ûiâ ß/±š[s¹•¾¹Ž'Û×'0û@Vvó)VL°I}Ä(M–i ã|±v²L<¦I]ï*]õHâC¶9µ½ú5² öÈÌY‚U;³Ž½rªõ€‘ùÛÀIøE*Nâ&1!^êûÌC~ÄKL‚]Oô¥f¹ƒÿ›¤…ÞMëBæºMÎ{èqW ËO`wxRÝAÿgü$‚÷U$ºÿ‚£p¶ƒøü+š<}úÄ¥÷T[„ÿ‰g ™¢fz&õ8×’°ÂÂÞv4éO¾áhë~³‘½Ó˜ ß4ùcòÆ,¬Ì°7|k1ù¾bòmÅ~$NjIþ¿ûo6°7–ýÏš¡äzõ¿ê Çʹÿ¿æ&&J¤™ŒÆÿŸƒÝ‡È1µqL»R5§A[È£ŒÊiœ2«eÊü“&àJò*ˤzª@ƒAc@³@w€Ö‚¶ž½: úô%è2„Ûòƒzª@ƒAc@³@w€Ö‚¶ž½: úô%è2˜fùA½@U Á 1 Y ;@kAÛ@Ï€^}út‚äõUƒÆ€fî­m=z tô!èKÐeØÈêª Íêìú€A¤;O1‚×–Ó{”¡¯¹?Ö£œÙ£ÌÞb½º~´ãš2C ®¾ž×£ eÍõÞ=Ê…=ÊìÍØ«ëƒnº¦\Ò£Œ7œ¯¹Þ§G™ý7ª«ëëÛ£ïQ¾®G¹¦G/\]S_mr]2›yW?¿¡G¹±GÀ5÷c¼¯)éQÚ£|}ò°å=Ê7ö(ìQÕ£ÜÔ£ÜÜ£|sòØe6³¯æÇÄåI=Ê“{”Uýv•¼Oíq}Zòôå=Ê·ö(ÏêQžÝ£ÌP¹«Û[òœå¹=Êóz”oïQžß£¼ G¹¥Gyaò¢eõÕ«øµäÚëižkË—T­ûÿYÃ÷ endstream endobj 56 0 obj 14391 endobj 33 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XFAJQH+Helvetica-Oblique /FontDescriptor 57 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 556 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 556 0 556 556 0 556 556 222 0 500 222 833 556 556 0 0 333 500 278 0 0 722 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] >> endobj 57 0 obj << /Type /FontDescriptor /FontName /XFAJQH+Helvetica-Oblique /Flags 96 /FontBBox [-933 -481 1571 1138] /ItalicAngle -6 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 58 0 R >> endobj 58 0 obj << /Length 59 0 R /Length1 11360 /Filter /FlateDecode >> stream xÕZ tTU¶=÷ U•J©Œ•¤’zEe$’„A(B*„9Œ&‘! ƒD†€(˜Fl "*È °T´U$"EˆPI" ¶¶Bw;ñ•vjµûëòÿV»ý’Tý}_U%• .þZ®^ë¿—óîôÞ½çî³ï¹Cjͪµ5LM$RIyeC-©WZû¾zEeƒ'ö)Ò{«×(ž´üg"qGmÃ’žt@‘>nÉò;¼ßG8ˆÂóëj*{Ê©an2"h—ŽØ õß#ÚI³ÓYɬ榳³ˆP6%ST º5ý,뤱r^¢QrNS®šéýŠÎ²“4ÆQ¥Ñ[Ñ)ª ýrœ×5ÖN©4„b¨·¢v†$*Ow²ûÆzc¡“&¥;id$=}¼‘šØ3ô ä ˆHõì>º²òDê=‡T;»¯UÒÙ:ØÃ&Û%óœðh³Qhþ£“iÚ3¿gü¤“Eƒj±èÖ` ¯gO°Çi1™ÙÓ”È6P1¥°GO¤.7W è9j€4ADõÉØs­ñÙæ3,ƒ%†o’(^b'ÍŸÏ4ÿu¸S`­æsÉN ÁËñHÙ›»â3Ÿ[b>iñIÅ'ÍÏÅ-7ïŽw²G[ͻ✠ß<ä ÖÆáÓ“æ©{Í‹‡«åS÷:…–VóH”ϳšsó-æqŸš³’:†tfÜTsÚð?˜ð!^SPi¢Í`6Åí6BQ|œ=y¤“a(hMœlî@Ý=1)5¯“Ýy¢8ex¢“m°å§ìM-NNLjNL-JNF|ÞEíí­ÚñÚlmº6E›¤µhcµáºP]ˆn.H§×étZ'{¾uœYÓÉZÀ 3k9¡Óèd'{™R';ªf=¥“t‚ŽtáN÷‡mÉîd-m "#DNjÔ˜ÆÉŽ‚Ä<ë¨Í,ñ˜¤„<Žž$0@“ÉÁîwjèÞÈÆqÆq¡c #‹ êQ¡–øžé?}Yœcï”Ù¥Ž#qeŽlqÇ•ù^7ú"?®Y‹¢š‚ôô)³î8ÑØ°´Ö^cµWXí5 Ç}uFGS•¢_ÚÀ ‡˜TQU]ÇÃÊGƒµ¦Ð±ÔZ¨oT¿P\Ë‹­…Ç©Ö>§ôx­­¦°µÑÖh·V–¨*Xµ _[Û{ÛZUð#mðÊVñ¶ªÔï´µ€Wñ¶ð¶ð¶ªlUj[¼óöúÙ«×€Š½~ŠâH™í˜4³¼Ô¡T–:Ù3È,\Û%‡Ði9…šäÊ’Ì0Ü{n¢+÷Üs]Ÿ¹/ |…ë¿Ý£E¢v”¶“K3®‹î§tŒ4t˜ºà^Ò~z•–ÂÍgmô6ų¡˜&$rÒTzÜì²»–~ƒ÷×Ð9ÚCÇ)߬ ”îäw‘ ñ*ÚBOº(Ÿ~M§i$jÝI_ÑsînÍ¢¹t„ZðýkdeÇ…0é÷§nÍD[Pr™¦º¹C)[è j¾"Ö¹4Ú¤Çé½L_ÒfÖÆêÜîKîÜ£‰fãÞHmì#vLüµtÐýw·Ëm††ihµ‚vÓS¨ÿî.°ÚΖ±5l7ÛÃlÂf¡M¸WŠ’{\¸Ì‰¸‹i%m£6 tžþAÿC_3£"®_G¸¿qÒô’÷¤†qoŽ}ê$ Æ&°¶‘=ŒšÿÄÒ„¹B©°NX/|&Lç‹wˆWK­Òy¿¨ùÎÕé¾à~Ë…âVZE›Ð»st‰¾¥Hdfb‰l4+` q7±¬]8ÄÚY‰ÐÅ.±#Â_Ø'ìkvÉB!¤ k„ÝB‹pNxC¨÷ˆˆ¿ÇJ‚|Hþ«œ¨ùm•k»ë ×h õ½[$Y`™šN‹¨½m ›ènôâ(îc°ÚyzLà÷'db_Ñ÷@X(‹aÙlîél«eõì1ÖûŒªË?¹Çƒ%˜„ÙB•°BhÞ‚ÄŠiâd±\<†û¢ø¶x ·,…IÒDi’´ƒVHâ~F: lÞ”FÊcåéò<¹IÞ.ï«ÅËòÛò&ÍNM«ækÍiR´Sµ+µ;´mЭ Lð¿$J`Ç0{ÞFÕTȪØ^šÀ±JÖ v-¦mÀ«¥Ð÷&q¢8L8nÝ ¶> Öl§ùâ!z×}D|LYŽJ›èY*âhŸG›iXä¹ì†ÑŸgô<Æ+ ,Qºk.ÅHYd‘ÏP²-5-5%9)1Á:Ä¢`F0ÅÆD£"#ÂÃB !ÁAúV#K¢À(Ãn-ªPI)ÉZ\œÉÓÖJdTúeT`¤+Ž¢þï8þ]%Šú½iÛµÞ´yÞ´õ¾ÉB”14&3C±[Ç ­Š“•Ï,EüþBk™âøJOSãªñ`Ä-| Øu…ŠƒU(vGQc]³½¢03ƒµÛ>3ƒ{òŠ4¡r#ü/MàoØ1ÖB»#ÚŠ8ÊÄD{åbGÉÌR{a¬ÅR†ÔäSsu>pÂUÆÐÍzè3Á!€3b¢CNœTéhšíS£®Ð£\ÅÒÂÖ€èuŽ*(ÃûÍ!£`)¼bUš¿Ãd^aýêËþ9•ÞMbÈwÄ ¹¡{¹âÀ8òò¦‘Ï¥‰èuÑZÇíÛ¨Úi«Ñî—4‡†ëìÇü^Rjq(eÈÀb3cŠ“JJ3¶³ÌÉÜ÷:©0®ëmqÑBgpªÕ¢}$23‘fAlh†R„–‹8W”f¥yÒâf¥H©™¤D5DAMsYœ] œhZ´•ÅöFkÊÊF¡ž,^>ÁëÍe¨a©·„jVV^–¹VL*)Yêh*ŒuØ Ë`竤ÔÑæ–•á­á½šBc¾¨öèœ ‡§¡<ÇS –6M¨¢¬¹™×9»Ôjqt57Ç6óñæI; ̰y3œÄ_á;YS ¾E`µÄª6°X-P«Œcz(íc–ô?pn¯Þø2ÚæªçÿB¼„GÝ£{5í‡ðè<š#|ó¿á±ý÷óÛzõ†’ã¡­ME¸àBx \xCÛ{5í‡pt¶s„'þû.î‡ð¤ŸGxr¯ÞPr ´¬"<õBxÚ <ý†žÑ«i?„K ó Žð̳ú!<ûçžÓ«7”œ mç¨Ïû…¾åF.½!„Ëz5í‡p9t.ãßÚ‹°-ÖAþ~¸i€Û¥_Ü1Ï÷ƒ+%9” „‘ØW¡„Çäy8ØXMCØi„¬„l„d@¶° ´ûó&„Û5GGdêØŽüÛPÏYù}‡øMãh†ñ½;® lK¶!Tè¬7GÍðpêr#*ÿ‘Köæi~¤¬–[Â<¯Ç3º#DƒqØe PõÕ0 Ç–’_‘ê3J}þÿð³;~ã^Hëé$}ÈRI8".”‚¤ÊUØì\ÕšƒÚ í8½y) <`UÀ½ »ªœm^’OÃFZªççŒNÒe9I‚èBœD— <ÒŽcç·H!¦Uc"ÊÞÇ Ï‹öR'±¬ØvbìüX,ºÔ âÄÎŒ-k'‰9ñ)ç2bÆç,†dH´ÓÙý±|ú‡ NiÚµ`Q»*¼#ìƒ>® ¶¾Œ9¡ç-鯇Y´–Ø?“]zaÚÂv’Ø tïšÔwUU= ¼q7>lx^ŽÖúÁå¡—¯\A=ñ%7£¿xRèùÊó…È¿ýô—y†Ì«ðv(€gðŒN4ì`\)&°œ0«h­Rð\×v6ö£®ä÷tv¿.” Û{Ö‰Õ?L`NW1ô=¬жÌEßúÕ‡œÄ’xC¼/–ÃÐwöç ®¯„/»g± ÷螆:õàöÍ?[«¿ú!^õ=æ ö´aÉŽÔj$+:Â’ð´dçæå²Ï…=ç_NOp}sÕ•}Ï)bÌjךålǯϚ‡È§?¸ø¼»g·ôÙ%®zðIUŸ÷ûØpO¸M?øëcæ2³s½påCýðÁ3FxºMìä·ãc1¥É<ÈDÈ-%u­}g!§  Á ÆË8a"ú ",À±9 ³!t¤“Ì `¯Y¦÷Pïß Â4£CÄIäCŠ!¥:ÈzÈ6È~Èaˆr¼€ƒç¤dŒ4.Y8ð´4lxbv^î86ˆ f-îH,ór“¬C²æ&ädGEjEMd0ÖbÖ!ÉIy8°6cÒ3E˜4ƒ‚MYK¦— ẠcæüÙSÓfÿî@qñþž}¦!¢xo¦Àj+^úâ¶=¿ ãt-@×âC×t-@×t-@×t-@×t-@×t-@×t-@ׂfÀØHm¤ÖÂýÜHÎ Æ}Šuˆ #ÅÜd•½Ò¯efíþ:~ɾû—Œ±_1ºúnû¬‹ïæç±ù¯êZ?(zèѻްŠ[g.ŸüäS¯,È8ú¡¡%¦fÅ™°À –¹Z[´ùD3Ç6Ã5ZzU* 3e²±þØÆs(ãý°õÎ+]½ŽÝÈß0r°ùp x’@bðmØ€mØ€mØ€mØ€mØ€mØ€mðmØìˆÞšãQ³â[ØŠl`+[Ø ÀV¶°€­l`+[Ø ÀVÐŒ“Œ¨/Ù§i24MVï<<'Bn,¬ƒl…ìƒ< 9¹ñÎ?ÉÐ4ŠpãEå到˜þ=Gõ1°¢êîUjù¤àµmn’Ø–‘÷Ì›ésw½zôµˆS‚yØ=o.ÊϘøÜÆ.ß<’MìØt÷™e£”äew[3Þ”~—$Y'líÎ~½ñʧ‹“Çìš÷Á¬’±8̆>ÞºèÑO«Þr¡‹¯Ú·`ýñüR$ÝëoÑë<¼†Pãgb?‡îY,Eð7"|&öùijb¯¯7À×sK©¾ÞC` a€! ðõª†ƒðÌ…Ö0/‹±ú8ݶvÖ¨êÍcÙÕþ@t¨ykÃÛC×·Áë¾?Ó2ò©²Çzf O5æ•>úvÏEÎUôKX5_æú÷̻꛻ü—…˜¬ KCV{êãS,ÿTÆ))íÚÛòé×á[5«ó¨3г*þɵšwÙØ7zÁû½Ë;=ÇJïà ûÕKJ𛞘ÎSñ`9Ì*j¡™óèI!ë3—Y?{¿mîQùtw »àZÙS%˜š]·©:nG¿×ªýî×ëëìÙ¿×í/·¹.¶ñU7ªñðBs~4‰^ôGÏ[Ïu]ëËæ] ö#J(Ïå}õv>–gÄúe$òŒD¡¤QÑÐc‡ÆcN ‡¢|ë…(pH]¢ñõÂõK4ƒÕr‰ã¦õò(ŠÏë|i:©>‘G<Þ.iUfŽ®½½i|BÄŒ5ïfã÷u>Y>mé)ë–SG Žn¨}5c}›”µFÂÍãŠæÍ>8ggOžðŲ’Ïô<$t®ÈžòØ›œsž±t˜EÿèXêƒèºÕR¼õw—z’Uøº «tϺ)8„øÆRÆRÆRÆRÆRˆw,iýúλ §‚‰‚w»E©è¬ûthÌ]§ˆ‰Ýd˘Q”Ÿ¹Ž÷tá¬Çoy’§ª1‹ƒ# FÜ^ßó&S«ÜïI—¤éØGéUVx$}=ô[þQ$´Æ¯"< l ®Xò¹b õHÐZ‚Ö´–àŠ%¸b ®X‚+–àŠ%¸bþ/a ®XR]qêÓû\±Ðçê1ièáŠõpÅz¸b=\±®XW¬‡+ÖÃëáŠõ>W¬‡+Ö{\±— ÜÛ†æ d"äñ94T¼¢˜2;ž~-)¡æ©g?Ìs½äú×çGŒbó>ó!u[[>eƒ[\=®Xz7–ö6×—àÆ xx`ø¿ò@Ç‚ÎoìôáȧMXµ—A>A>pËð“Ñ äσÈ(íPì'4ÜþË[’•W–ÉFSJHLȶSÑ›a÷öÜ‚xFŽ­êÙ¯ú€ÛÜïHS¥)4”Þó·v×2ÌOËtž‘ÎÇ/ßÜ·cWŸî³9ß®I°‘I°‘a¡YYÙ Ùyr râ.%؈“ÅIa¨/J­™ÇÔu?ß®™À&¾|W·k&ôÝ„¾›Ðwún›L`“ l2M&°É6™À&ØÄ7ðžõ}HÅ’°åònĬ>VDEš1Y«»`LÕ,70vøáÅ-aƒs‡¬Øº9¿Æ¤0±ýÓ†èLYÔÞ1hðëäÛ#Ë•x×µ«_?ËJʇÝrË­ö„ȸ„!i“~µÿ¥åu7gOœn+J‹‹Ëʰ?üÀ¥÷žàþã¬ûkáK¹ý(÷àÍYú]ô°(Žy”Ÿüv $xáçËOƒwÃýh¤êELp¢·ÛêF3)/Ìš—Ã^;ik1·ì 6<8>"ÞbOÞ4.rßCæ‡är×[»{ìùaLØ ûÕá•Ý\ßïpΰÿ‡¢ þü¸nŽðÎ5}Ê_çµ¼7Z¿)¡Ï#v !mïé‹xó`À0µà,Ä*ò¿ŽX¶å÷ »¿­ç³Î4ׯÎYRVw›8µ»]œxí²xs÷o¡®Êmü>Pâºô?!¹nêöI>{‘Xqò~ëÓ †ƒ$fɳhùIÌ,1¾§mˆ8ÖÜý¹Ð<¤»i§H‡v÷ȇx{"?#•ò1b±~^ç—ž¾‰ž¾Œ>7ृwÁ ­:1מÄN‹ï]áè!fFŽÏFuÔð7>VV½n€ÓÀÊ-Ÿ—+çå ækÍj3$DZc£ge'¶Æ·o=¿'~O‚‰õd´e\mû¸Mnœ/¿ØÜvv/î<Ü0óõ×/\ÃÙŠ@äþRƒªüØ­âÀO^(‹r¨ìpÅø­ÿËtüÂÿ‡ÿÐeD9~GÙ…/VL­ŽïA©´hüä™ÅéÅ5ËkÖÔWWfΨZ^;~aÊßô]üë!Û Ü“†8!˜¤é]Èïñb„¤@ò!ÅRHd=dd?ä0Ä ¹yò…Û{¡ê3R¤3¤‡Hž: ]2 ]9 ]5 ½x@ZµƒŸ~K”£Ÿýô¯^6 Íqõï¯úÛ\¿úù Ô¿|å€ôªéÕÒêomýêã§yþõm蟾¦Züîôv endstream endobj 59 0 obj 6271 endobj 24 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NADBOA+Courier /FontDescriptor 60 0 R /Encoding /MacRomanEncoding /FirstChar 49 /LastChar 208 /Widths [ 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 600 0 0 0 0 0 0 600 0 600 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 0 600 0 600 600 600 600 600 0 0 600 0 600 600 600 600 600 600 600 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 ] >> endobj 60 0 obj << /Type /FontDescriptor /FontName /NADBOA+Courier /Flags 32 /FontBBox [-655 -409 1063 1090] /ItalicAngle 0 /Ascent 754 /Descent -246 /CapHeight 587 /StemV 76 /XHeight 457 /StemH 70 /MaxWidth 823 /FontFile2 61 0 R >> endobj 61 0 obj << /Length 62 0 R /Length1 12548 /Filter /FlateDecode >> stream xÕš{t[Õï÷Ñ9–­È²-K¶’Ȳõ–,+‘-¿’˜{oí³÷ïñýýöïhÓ†ÍË•KÝ¡tµpÑÒu+”ùoü ¥lׯYºÎêëŸ)¥õ_˦ Õ×>åÚ¸bÝÊ5VßVÃçWÞtkþûe;•JþbÕò¥Ë¬ÏÕi®]«°úZ×èª5›¶Z}ý[\×ÝtóõùÏË.¢?iÍÒ­ùç«“ôƒk—®YnÝ?~PúënÞ¸)ß¿œëÕë6,Ï߯õÓ@iümо£êoU™ÙSj;Sz’ýjæ÷lmÒ÷-®¾à”6¦ÂœîGÛ¬ë[7®ýäË—NUl«xŽìùØ*Š7Ùøò¥/V±­ø‰ù}yê¥ZÔ㺲µhCʰ/И§&©Œ «zî«hy•-VsÕd•.ŽØÕôóîQ/0ÑBn*ýší¯¾¦«ÙçmH•ó¼òœùÕ£{ybJíQ[Ô~µ—¿OÒåÖ+¥?¤Æ¨RÜšžwDÙö?­i÷ ÑÎn?¢zGÙ½¾øÚqG”–g®îԖб¥H…héé`ß ë»´?2ÜÜ=gÙî`_pÕÒeƒF̼òÁòݙ࠺¬5/ï Nð›Ë&1!óðnß=À 7ägàjeÎpSYz^pP/쿤ðŽ^ÿà´Þ(œ9xlaÿà±^h`€»ìÅ•²bÙ½µærÖlOñy…5ËeýƒÓüƒj`÷n™ó²þHhðŽÝ»ý»ÙG¾D1 ©‘ÓòH‚9ÄÌ#Ú ™ŒK$ä—H(b½<Û‘žwYÿLV§Œ×Õ ãuÍàú¸\ *Á\ÐzŒ×Ï~ÂuX¸_=¶ƒeà «À"0,kÀa sÌfŽ?_¡uËö•ªTvm.ý6õ0c6ZÿÝ?=ÿ¡qÞMeôìXÖ|ÞxiÇAÏSNP ßT©jgðÏ j•GyUöïS£ÕFÆÊGÿ_ý󛫤¾«]d‹Û>Ói*›kOÚ/(¿ "[qÒqݨœ3œƒ•ªò®cU¿¨þ}͵îµ<Þ^¯°¦M­È=`¬(;Q”«Y˜gC5øä ýš£|\ö=Z†ÙÒùÜqR Óý-Ã\mhÄhimó¸CîXÈZa¨Óuÿér”W}ñç öfY®¦¡Iý˲ <öªhP:dÑÀŒvžhç‰nžTÆgÃ(º. föQ£3þ£èª|ÊÀQ¾§±¢&¾<ÑÚ¦Ui‘p¼³£«;6EkÏÖ×¹å× ™£=š[Ûâr•5%ÂA­ÙYçôÔ?<КLžy"™l8h´Ùl‘Àè¨c¡®G¿z%Œò/Ðß”õªGXï¿—U©võÎ0ë²cTFËô2õG_Û5Ó}j"9`¬·‚]`xÇÁ»Ày «f¿iVŸfsÒÎÐÎäÛ'…eÇJv¬dÇÃ*ÀR\<ÙÒCLéy4ÓbݪYÍW•` Øö‚ÇÀsàUð༆åHãs`»¦µÍÓT­«[uvÄ#a{9ÿóµäéÕìÕZ(߶ו#omTgû±@ [[ô·K§nŒØ]±ñÑÆ*Ï´Ÿ^ð·¹_5þ6í¸‘…â¶ ½qt˸é?ihèÐú¾wãöŽt…çÂô”hÈ3eÎÛý<7|Éø[ZÆ¥ãzµ>¿)"6¢+b«±‘èP¢³Zd˜AC‹£‘ƒ©p4àB.4àB.4àB.4àB.4àB.4àB]*î®ÿg̹ æÂž-mÌe0—Á\sÌe0—Á\sÌe0—ajS¡Alj!¤YœN+;:ê(j3,Ú +×”¼zke ÖR/v$‘õÖòU쎯†iÕ˜-yÀLd,¨¡íçÚ`>°\b­m±ölÊkÑ: OÑø-U¶‡LŸ(oÔð Sƒßù·ç¿ßÑÞ¼g×ßmúâxnZ$’¾,šŸŽ†µ_ýúßz/¼iõ¢KÛ¶®Ý³xíÍ×Þ¶èÚÅ_}búÅö¦æHìÑýßOÜ}Óß<ÐÚ}jêjtt5:› • « hÉiêk<ÉFÒlVÄÜâsc[4NQN6Tdž&pqMríäà:©(½¼÷Ÿ“^¹H¯Ü’^›ÉšS—¥WÅÕ ŒfÔ¢ŒÑL<‰Âøò`[?ÝÏrƒ$2AÕV­`'xGÀkàðø¸pc7³E™_–à]ÊöÙQ²0ý3S#¥ds—¨Á 7…ã“5hÖ‚¬ZqÄvm"†sžp4‘ MzQK4¬oG"áTã™ßi Ñ`ÀŽ6侨ŠFb±H,¨›iNär¨pþ½¹§ÆÎÉÆS¹l<;'›‰n*ÑÍ‹èfºúꈚÏŒ3X|7 ï¦-òî”q6á4íÖň+3„)v*&6VNÓcº¹+Å]C*ñ¤Ì1Ñâ…Em¢\¬hë“e`rÉ€W¼¢¾¼7Œ“q2 õ*ÜÖ0$Þà¥å2½¡`ýü]²ŒÂýq–@6%ËêâÚ-aÂ3EëÑL/hÑ<#B„Ó " §@Jb‡ÇÒ›|Ñg[õ›ª¶ñ‚¡æîšßt<%÷‡I©ì¬–ºWªÓéTºêxí…=­©žÜG(bz} ¦;ßæÒþdÛ FBñÀé $*K&õ«Ï¼˜b*ÛÔÓ‚±dÐô­{ñP$… æžýq§ñêðiWX«¶˜ª¦ª.0U5LU SUÃTÕ0U5LU SUÃTÕ0U5LU SUÃTB,ÂIâv„bÏ%²Küè¢Ñ®+À-àÛàp< ^o3~|@ã°á&=uïE:JT­Ë)†îJ4h†«JÂU%᪒pUI¸ª$\U®* W•„«JÂU%áªÒz܇4>ò8–P+ó”©iü˜´=ÆlÐV­`'xGÀkàà$ìi5*ƇU{ViÙÚα¯Î[kÜ™;ñŸÿ‘{CÿÉj­gþýЋ/zü…m—æ>Éýƒ¶„l«]“{øL¥¦ýþ÷švöýßçÎ"YtÖŸçÀ (ïõ!þxÈn†a=;,(ä.ܦN°ð?2ð%ÈÇ›2´X†ËÐbZ,C‹eh± -–¡Å2´X†ËX¸Ìr”´Uø³þô0gÚŒpMµÐ$Bo*ÑBµ T[|iƒâ悚˜ÊŠ6Õ´¦Õ3™ˆZGs#¾CJ%&â‘Y•°š×Þ‚lþyxÿCûªoKã¾0 µ­¯ ÓÞø¯Ó_žzʨ͵nÚ¼qÓéÛBÑd0«YäõüsÏ åÞö ÃÃpU…š¦Ù‡Y’]œ)&‹Rt°°¯/E1£1HQhE¼ÂˬÕž—4ÉG´5£(Ñ0T"Ѩ)¡°.è:'⩦ˆCE×E,âµDk‰Y»ß|öTe3Ÿ=†gKVØZ*|ý|Ò*)>+®7j¾<³µháD<¡×Z4mÇwïÙ½ë­ÞI­©I¹Áp49>4iÒ¼t$¢Ü··ãÂù{¾9¶Ùs<4! ¯oËØõc=ó§n7ü¹›–/[¾âôa'3ÎÜÓ‡‘q÷_±ñÑ`u²!÷‹¦x$6Ûnh‘¥ý$0~›»gwq:mjˆë© u¿ýª:wß-·È莳0vèÏàÏÚ*šÈ3È™£‹}{¸zà&7Ùá&;Üd‡›ìp“n²ÃMv¸É7Ùá&;ÜDÒ!¹í4N!‹±ÌgÅ2øŽv¹ƒò'ó9™ÏÉ|Næs2Ÿ“ùœÌçd>'ó9I0$˜N3ÁŒ²>_á„çò|X–ËòaY>,ˇeù°,–åò|X–¯`Y>,ËdžÐýyif¢Äº»º%­óÄÂÎba½~_<ÙÜû ­»ziø¾ oíò§Çš¹·½›û­|ç¢}ú#ÔÔ:o(kj»ä²#ßýÞOc±Ê1‰¦‹ÕêOœÐ|æyߦV ëEú³ô#ê=!;á×:Çb­Øf SÐ]h†ü¢è¥1KÀ„‚¨D*j©V¡#¡èEG(:BÑŠŽPt„¢#¡è¡è… i>m‘\²ŽùBg a¡‚P£ ÓV­`'xGÀkà`æäŽQ‹¢å€•—§â¼Õ¢ÅB¦Ð5oÅO~°Yó“©ñËÞZý~î-üñ¯´ú̪ê3ËmwU?~ÛögµGþçþoÄ­¾¶­üÝ÷´Ú³êÙ ñ;·|çnËžG=eM0Ñ·‡ø3ʬ¡´±*“ÑFáõ¡U\%Òøà»6Ú’'ŠÒ¶‹´©¢IuÁH¢w{ÑÈDÌvæ³RáO9NùMAIåÁÇlIFª¹fà–Øÿ1+èÉ›”bÂRXhÖ!4rëßoniNœÙ Ÿ8Ð<.•üá/?\wãøhí®¶õ×i×5·¤ã¹ƒ÷F#RŒ‰Dm×ÇiõþÓ²MÉÑ‹×N„LgöCÁÛsëíúq˜nmÃ0û0TÌÜI;›KÓ2yE‡WtxE‡WtxE‡WtxE‡WtxE‡Wtx%o&Ð8ÄLÒìÑÁ^H1*M˨d M<­ÝôüvF&cIR¤›,±åŒ dJòLJÈßγ¦Ô%·©›Œ¤0Fâ¥Ô$&И úÁ*°ì‚Càx ¼$G”2ZµœÄ“øq?NâÇIü8‰'ñã$~œÄ“øqÁIü8‰ŸËþÂÊÎþ$/JR;•Љ$†ÅCU1¤tÄ9Äšv/¥8Ü€83¹Xš£Oœé*ž¿lsïI8ÇZ~Ñ´ß 0f/+YËÓ*X¢Í\GÖ\‡m%H¢P' :O ó:O ó:O ó:O ó:O ó:O 8+H5äe7u " ¤ñÕî|%ÂT…ûÿR05뀅D _GmÿÄÓÛÞœxÐß8çÞù{ÿ1“M'“¹Ï3¡æ‰‘–¯üAä‚T(“û<‘Èôî1T*j½'×Ó;ýùƒ¹žNÜÔœ ho¾m÷ŠÜ’ÆDs“œwÅAôµ°l þ›P+‡ø4ÙLÊ)ÖiUZ~¤_ˆ‘f¤Ä‘<2à±Ä«ãHS¼¾&§M«j&<a¤¡iŸ-y ”dÖŠÛC¥uۨĴ)ÉØôi‰£ÚôD,’9ýE2™Jim/5·$“ZÌßd<Ó„Lÿ•ÍñÓ®PTö Û¶q¬‰Ô{P4• c2¶èWs‡XŒÏÜY¥¹3óôV#°Â¾J·!VÂwaá‘Û`ñ%G.÷ˆÅÛ"O,mkNhsýÚ$7sI³à:cOS³(ä«}…eН¬â·“‡õh=ÃR¯„eÄW¨  yºð÷ D©Î|E¸Ob‚øJ«é+UÜÕjZžS" ¾2Æô•:î\Üc…¨ª¢Dw£d€šx1ä»e€¤ª8Ð  %ÞÔ.í%2Ð)uòÞ€E$©Å™$šÄ¡èX$šÄ¡’8T’½'q¨$•Ä¡’8TM$q¨$sãPU,Í: å‰3ÉÙXœIª~RÀWêP6)äçP’B›¬ç>Ï¡Zl–±ý‡Je2KÎyTæ‚÷¦ES“p¨áPѾg»š›q(Û¶`2ª÷ôü)jL%ÏùSª13ýiùÖFý0þT¬éVÝH§â !h2‘Æ0Vƒ[Á.°<Ž‚ãà] ÑD*Fµl·–S'rëTæ ¦:ˆ©bªƒ˜ê ¦:ˆ©|ÚALuSÄÔüIç§€ÄTñ"»S´ÿ&û³ôʺ»±³Yà*°l;À^ðx¼ ~ò¯9¡Lb¨•çñFݲ ;V!'D3´Ú± ;VaÇ*ìX…«°cv¬ÂŽUر ;V!çKIvÌJˆø4¯Ô̼YÙV|ÿåWöí{ùç¶Çr'?þ(wR‹~ô‘ÛøÒÞ½/¿¼÷ÁŸi‹ÞÎ}ªÕ¼ý¶VûTÖ¤f»ÜIî’TÚÄ;qJ<˜{.wÉ"ç,rÎ"ç,rÎ"ç,rÎ"ç,rÎ"ç,rÎZ[þ€Æ) [΢·Â›<‰75¦/KÕ]ªN4*w9ú-Ic#iK,iÌ`5¸ìûÀãà(8Þb#afê*jÓ'NÉI¤èÇù‚Ô¹|Ÿü‡5Ê뮘|%f9ö_×ñ}æòuŠÎ Ì[c’MŒ±fÑè×zf½S‘4vdí·$RZŽM.Ï9)ž8Ï–}Ç2¹YÉæö™ÏÌöæäƒþÞGתΪWo8|Öu×áŸìÞ=øÔY&‚Qr£*˜ŒD¼uKûúrŸ¾þrn^Ÿí©»v>=¸k÷ v±»¸×Ìi;´ïYg&v1Dq¢Âv»°Ÿ>p%X(«`ò %«PX…Â*òŽðS@¬Bª VkGóvªü.æµÞ†U¢EyÕ$QJjürè…È}ã|rN¿õ¢¬úýd€ªCQù‚þ9ýž«¦½|ýó[=KtÒ&þ,Übú³vàÏüÙ?;ðgþìÀŸø³vàÏÂLp¸) ËÃŽ¬ŒN„ã£l\ÞîĸŠhâ´XŠÇ*£˜¬®¹å°µÏç%¹ç¿‡n?=x×]O?}×ÝOÙ6N9|ã˹³Zõ¿\{ Ï߸7o»ÐãéÍ’PõebɸöêÎ'ŸÞµóéçŸÔîí›—{ù—Zu_ßÒ:/µ»àWÆv¢Aê)Ãù=”q31¼E}S^œ8ÍC"3§8´'Ë‹¿ËÕ¢kü?{gIP-¼P³QÄETVM¦#&Iì¼\„—îVž"if!*Îå6C»Hò©3Éæ–'{—¶&’ïûÿrËÀÚîoMË‚\½§©Ø¶ñÂ1Rç}b˦Ùc'ß¼Uö}øìdž}O³uQÓQO˜Î.%L×Ñ.ðžd$dazM¯Éà5¼&ƒ×dðš ^“Ák2xM¯Éà5Ô¬Jb¯É˜^SÁ¼KVÁ’U–¬‚%«`É*X² –¬‚%«`É*X² –¬‚%«`É*ÓØªXM§éWç*Ëùw›ç\§Q|©±Ä—&ÈÀ„’œgŠ L‘ :“¤kSؾq’šÝœ‚g«ÀJ°ì{Ácà9ð*ø øø_À%¦äŠð|½¤|ò2,JØÕÉ|Næs2Ÿ“ùœÌçd>'ó9™ÏÉ|NæsZ‚ûÆç@覑UŬ’X ‹Jb1¼4†—ÆðÒ^ÃKcxi /a©1¼4†—Æ(‰Å(‰ÅÌ’˜¼¢$BYQ<×çÃÕ³A?X¶‚àAp¯w€Dñnóê«§p^xen%eæÁ•ãªõN–z¡Zf•Ø…þÅßã‡C±æÑ5®Ôëo¸cå7ºñö›?ÿ°áœÒ#é&oçÖK®ÝxËK'Žýú™‰wßɺ)•NÇ'„Ý]Ó¯ì›uÁ=;¾õÝ–D6»¹3Ó©mk¹lÚÔ.£lÇžÔñùÚ°ñ~~u1D’ýSùa]Äôm ¦oK=G„Û̵œ«¼/¨àÚZôó´˜IºäEÞñ±äÁ­ö“…œYÜÚY`寡m;³Z?̱H'.q5_r›¬YR!áN>Ç“­ƒY@Ó·´K¥r7^±òor ‰¶žëöÏÜü÷ ¯û‰T¼ãŠõ±D:¬/ sÎÊ>°ê†d ÔæKDçÍ,YÖ¤-@/¯w¶4gþÎæhùµa›új˜?v¢šDR^šÒ”: u˜Rb¡H³œ«¼ó™^*U5êI|^ËgíÅü¦J$‹K wçÆÊcK|6ÿ“R9§Z~õ5ê—B%åhLÒi«àç5 Ra¥›¤,&QˆWš¯J8¹p¸—#J¡LSú±¶æ†k~°+‰§ÞŠ7o£NÇÉÉ®‹}´®7›hÞñk뿹i÷*m(†¦¹4“#fïÜî§žÖ~&ùMC+‰÷B:ûžñ&:˜¤A+=ps3èayRq©NE7˜?ǘHc«Á­`ØGÁqð.øüÈÏ1š™±õ¤DÁÊüiTB¶G±‹A¸¬·€oƒÀAð,x¼ >Ÿ“ËhÔÛú!X©<ˆvˆ}¡áÙròâÔkµXO½ h)ù"ö9ÃÈ;å¹ü; Ó)ÍL¸[L§[LG6c¨jSŸR÷¦0€¾­ßÉ2¬Ï†¤<•¿K²ÉXDóíâ{ºÉV Ý Ç…ŸUñ^ÐoV}~Úùê‡é¨åù¯Ø–l•LF“58R±D\svÅëÝîqÁI?ÞæL&¢Í5ßxttËÌÖh‡VÙÔÍþΕHDSUÚé\,ÞÏÚÞ %ÂѦÄèˆQfœ9¤=oL´å–Øú)5FÃñ íŒG†°_i·ñ*øŒüÝ^=›ÿǼªØÖ ¸óûÙý#ú}#úóGô/Ñ_8¢éˆþâý¥#ú×蛿¯/YÿŠŸË1¿tÔ¬Îë¯Ñ¿iDíˆþÍ#úëFôùmúyóoÑß8¢¿iD󈾔(JÖôHÿÍçm endstream endobj 62 0 obj 7270 endobj 17 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ONKNYY+Helvetica-Bold /FontDescriptor 63 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 722 0 722 722 667 611 0 722 278 0 0 611 833 0 778 0 0 0 667 611 722 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 611 389 556 333 611 0 778 556 556 ] >> endobj 63 0 obj << /Type /FontDescriptor /FontName /ONKNYY+Helvetica-Bold /Flags 32 /FontBBox [-1018 -481 1436 1159] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 720 /StemV 149 /XHeight 532 /StemH 127 /AvgWidth 621 /MaxWidth 1500 /FontFile2 64 0 R >> endobj 64 0 obj << /Length 65 0 R /Length1 13688 /Filter /FlateDecode >> stream xÅ{ xTUÒè9wïÛKº;é5Kw§;éìûÖÈMHB „°˜`"  d4PÑV™qCE\¦ 42øòøq\yˆ:(¢è/0(f\&ŠJúö_çv!ß|óù¾ç7¯;Õg½çÔ©ªS§ªÎÍâEwv -ZƒhÔ0½½kR>yÑúY Ú»Âå˜K¾9kÉbg¸Ìf@ûú9]·.—…Ro»uþòÈóf¡Ø7;;Úg‡ÛÑ ¤EP.ãH= / —cê Ý5ÿŽY‘vŒ‡´/‹ÌÎBÙy{û‚Žpÿ< Ò”®;~µ8\Î= iW×¢ŽHÜø½0ÔzÑ ¤Bó‘€(¤‡/`È_RoC ´’v€´ igfD•~‹ ‚2ÜãÞ¬5$óî­ê¯¯œôªW«ª¡ŸJéOà.UNEHƒ¡ýõê¡ÒJ>ÞjI F€€Ñiéûé%¼Å´H*ì`Úñží/ã,àÁEå׳$©f­-uÌZ»¶&µ\…kQ1ƒ‘W!’Vözžuðè^’Qá„ê-އ’TÅG°x¦c°8 `)Öñ½ç·Ž+ßyÊßzroA¿“Åc'Ê¡½×q<-@Aò†'À`)Êñšç.ÇŸŠS/tôz¡®×±¯’ŽÝÅw9žX§Ô<ž¦$yxg¯ãQ’p<ão]«4l ?xw8éZ§LtÇ~%¹}€zö€c'Ù1Ä’ÚÑê™ïhñøSÊ8©×QO;à¨óžpÔ’©{Rx¢¢ðè…ã¼ð´žÃŽ”ð ‰¤·ípzêñ0~Æ£[ž[åi¼ç`MJš§Æ»µ(€”9Hˆ’äöp2Ë{?Æ¢T<%áûkRg¼¹×±’ûkRŠ“ô%ÉèØï­ñ®(H˜ÀS¤ ~?›ŸÊçóé|*ŸÌ»ø>–Œ‚^Ð A},¥IŠáô$á`Ç`Ä(y=Eòð¿ˆÂ…Æ£‡î1/)³–G|Õ•ÿâ§M©l«Lÿécý)›nÅñþ­µ“›ü{ã›ýy$Šo¾®ýÿ%ÛQO×6.ß߸üò´ªwU›»ª Í¿qI§Õ¿f¦Ó¹ïòrÒàôÓÉm3gu’´½Ã¿ÜÝQé¿ì®tîkTžÖ<47º+÷¡iUSšöM“:*{¥Æ*w{eóþ†ªš 7̵ah®šª1W¬†ÌÕ <7l® ¤¹Ì5Ì5ÌÕ 5(s¥§WÍ\Ø>d`¢LvŠg*P@ÿìh#z~«Ð%ühšÏp ô)Bw£? GB]¨ •Á÷f‘ • ÏB+C¯…~@¨Ã<ŽÆñ¡C(uÃw'Ú…5ÔÌÐ>dEuh)hö»ÑëèL¨7ô9Œ_„.`ÎfF†>c¡Æ‡6 ½è va7NÃ7‡.@½plA{Cõ¡%ðÜ—Ð+M@+a¶O°'ãt¼D÷‡Ö„ÅAÛT4 ¾ Ð]h;Ú…žWzÍdâXŒ_‰j¡í~ô&º„¾¥›Š+ð2ê]úsú+f$³3t ð˜ óµ¡G0 Tñà©x6îÂÏãñáï¨bªöÑï2]Ìc€ÛT´=†Ž WÑÛèCtõ£Q3€Óh<¯Ä¿‡çþ›Ê§Z©UÔ&ê õ%KÄðÌFööpˆ ½úpN@ih$ìôI¨ uÀwº݉~ƒÖamCûжçÐ9,b=ÎÆ¹x,ž‚oÆ·áåèA¼¿„Ïâóø"þ °‹¦”›Ê¦–À|wS¨ç©^êÕOèÅô*ºþˆþŽ11­L|ϱ™ìb.Ž«å'É¿“Ï…2C›C;/føzP*ÊD£1T\€Ö'7Ív¡ÝèYôêE½¡«Ø‡Ž¡·¯OЗè p,¾.œ‡KpžÎÇ ðoðvÀp/>XƇÑi|_…¯Œl”ŠÊ¤n¦Ú©åð݉¶So+ôÑÐ.:…ΤkéÉ¡¯éçé}ô7L3YȬdz˜íÌ#l;н‰Îv±[Øìqöoì—ìÏus»¹¹·y/à·ó2N\œ8 ½ˆ^©ÛJwAÙƒÆàuÀÕièMÞ~ô ºŠ~@}èidšp39ô „Ö7 ?Ñ¿F¥èAê·ÔøP½‡Vá¼Ð+ø5ô•ÒRS¼ÉIw¢ËéHˆ‹µÛ¬³)&ÚhÐGé´µ¨xŽeh £Œ*wu›ÓŸÜæg’Ý55™¤ìn‡Šöë*ÚüN¨ª¾±ßIžk‡¦zJÐsΰžR¸§4Ô륨43ÃYåvúOTº<}Räï«t7;ýýJ¾^ÉoVòZÈ»\ð€³ÊÚYéôã6g•¿zIgOU[ef>$Áa ff CIHMö£1í«@¹¢1¤G•ßòÛ܇6:©ª}¶¿aRSUe¬ËÕœ™áÇcf¹gú‘»Â•yœ<J0©± æÎ̘ëüÑFÍl÷ì Íl#¹ö–&?ÝÞì§ÚȆt¿Å]é·¬¸`ý©x-WµéºF?•TÝÞÑSí—Ú6ÑI±”Ú7A©v²†¥îinòã{9‚„‚{xác"©mžÓ¯rW¸;{æµÍQCS¯]²W¹Û*›ý¨±©×&Ù”BfÆ!ëê‘. Ê¡ÌòÌr’ŽtYW‡Ó¿¯ ןê#©uõ±!­m¢ &s»Çš~ç,˜h¸–ŸŽÔ3«ÈŸf «œ øŒñS Jt’ŸM×î_39‚F{ge¹y•½*›]9—*š¡[~0úëÝΞopÖÝÿÅ5í‘.Iÿ-"„ÿC"äÇí×òKÈù™GR§ÕÝIØ·Da5”ÝÖªë* LέL083jHÕдãû›8tOUÆ‚†žq 4§›[ ÓA!#*Ò\ ªa¢j"ÎgϸÙ=Îjg'ˆ“¤¤ÐÐÑÓœ ›ÜdASš\~©9v(ÛÑÜ<ÆÉ"ãÀ#н§F˜R¥*;²3jaUÉ M“šük*cýRe3„¸¯¡ÉßòÛÜ ½r†0ŒW͵FpΜsÒ =/< ˜5k`ˆæž2æä&·Ëß×ÓÛCv]¸ òð )R@¤ ¡p¯i€g!q»b’»Ü.@«™Ð4øšYÿï)\8„7ã"yÛÏ!yûÏ"ùÌ!Lo ù,Ày&!ùìÿ$︎äˆ}í¤|²Ø‹.A¾ `; =É| i¸}És{Ñ6·: m*”]¤ó+4ò+! i¤Ù0– òÝ0ö¨»Ò|_6‹íÎJ_¥¯Ó—é‹õ3Çš»³¬‘ *ècÍè ÝúÒR 7·¢VìRƒãïÇÝ…©l¼$ð,n¡D¹wFð“9òËÔKàçWâI?Ž&R(Ò:Í®d¿Täi±”z“ø;þw}3ÕÛ?‡YŠ7°ÏÄô2Å¿0¯ªÏPÄ|h=û½Uo `µä¶ ‚]Sî ic¹]å0[„bGowE'Øœ®®ç§)òPßÒPoðõ¿ÓËì/+í7ú²õÀ4‚±±¸Èå´˜-®do²;‘2Řó󊋊]r9½ÉÜò^Äf¼ø¹¼üfBö”'÷=ñ‡Ç§f;pnŠ|PÉG 637½u``Cϼ¢6ùëï¿¿2Ï·èkùÔ›'pm®ïþ¯„Õª`M–ò–1/xy¯¦É8ϸ’ÙD÷0=Æíôvf»ñyZK¥™TifÊ$pÅz» '™lV[;÷»#‹ ’Åô£²²þkKÀ \Xì.‚…˜&=O¥B%~Ç™–}ß©#7?ÜV_²äQ¹7xµ’9:8úô’'>ùZNÈ_{-–ϼ)÷~D= ¸RW£lrC𨪅N@ø$z ö¡/)z„¤4h™Úôœ\¬Èx0 Po 蜫O0>æˆüjÉ÷ÈWÈ$˜ÐƒÙÇöÁÀÅ’…Oc†(•À-Áv5-$©l¢:€ã`Éφù§lçúó°æ p.øÓn3¸v1¦`<Õ\.ÿ•퓃òó!Ü s\ÓjT(ʼni4ÍR”ZX!‰·k)u²i´}®Æå×O h‹²Re¢,®}wâ\JÂyò_ƒ}ìÑà_©¼GSoWôÆ:XÐöœB…ÉÀPg8Ø} êm,÷Ü‘¸pá¾kù”íbX;†0É‹ÈÅy;Ø£¶ Óf/‰E©R¢¨rV í<ørü4™ 'Ê'Xv»puæê7ìÑ«cå+ /·ÁmP ŒeD}ÒfâAÅÌ‚M•мBºÊcH3ó…B©ªÄ8u–£; н†h«azÊð*º"|¯ŠcQe¬*†7Úy»h1‚Ê7dGñeb™q…ñê€ñU£.Š)1ÊhP ˆÕñmyZg@”N … ÅÐ^Ê¥Õy£lф@OÛôgÏZƒ¥z…, ¬AW-> ʃ/7-lÅðGxQPTÊ%Æl"œÁÌ|Xþ„’?“ß•/Sò'¸kˆR§/¤?œv5y7íáôÁX Çr¸rC g>=£VίrÉkÖ˜¶›}›eËã,´ºxðÌ™ƒÔÑsOËÇäcOüñÓ¸—>}.8ú,Öýð=Ž’¿ùáù›o?÷ÜÛø>¼åøsÏ—o£á`†Hrè «\³ ºý„4Oˆ‚›d›ÚeqY’çh:´s/dªSõ©¦{²w„©Ä~Èô†é¬éTÆåèËæ¢4ÿ¥Cu¢Õ‘d’ujÆšõNºõ¸òìš)OWe[·f,…­)ö\G‘á&T”eËÉ à„ý?)ÍEmö€âŒ,4Ž!Ì¢ü"J”Qš…Þäl z´°¹ò˜ˆJåL1³CS èTTˆñJ]jí•wIÒ†]›¶`'¶|†Ç ò{ÂüšÛ–Þ_ù[ùé©ëäãòEùcù5 ¿Ú‘w³5kÕ¸o‚»`Ôœ÷ÿ‚¹+—ï)Ij›6ÑkwJÓùÊò·˜¿È¤Àr~9rÏ£Iƒ¹4žbrŠ£nꥒàLl’Tç}.r‚ÅP? *XOt 9Ë"›Ÿ9.•߫أòÕ«c˜#)}ü!6 ±‹ò¥X³S\¹Ae6›Äb­ÝJ›lëOÊ%LFP\ÊÙƒƒ­$Q(ÓÄ„¥§ïÂ>OÉŸ—x°oÜzù.ù® ã¨IìÑÁ%Û«ýëêítÏà’Ëk¿újíeº¶7ÈôÈÐGL 3l8&ޤ ‹–ã ˜y/'ÿóbÚßÝ:- ·)ÑötˆI3ÉYÉYi¤‚‰U'Æš3F8ø4Q‘§]ê³F¦N¶—Úëc3…úBÛÈÒ?cв¿€ÂDêKÄyƒïÄ… ÊjÀ°:r`!†ìYرé©Ðá(ÌñÀ~XjQ±·(|D%ò+è€-&WöBOw"Hœ½ÑÔG±Å9ÒtoŤ-ÓÏOLÕ:½#-A”ûUcâèý7Rt\œü†V¤GÖ·,þÝÿ~xê“]”Ñ`Riôoã¸òù|)FÙ‹Çäç%•=вyìØWdMÁø’mškD’”YøÌïOÏ5áw)´2ô)³ Î##r¢ )IåTëŒdóyµèô°jÓ:ÊžïZ¯ÚæJÜîj˜96ÎGã~8ŽË á-Œ¦P Þd¯‰h-Xk¾QÙnX;¡ýÌ?¿:Ýݘë“?ÃqEåõK“V$øv<<"á׿a¦Ëo|+˽EΆ l_p .%opqë6ßW»tS ŒïØÐ¦øN¬ðÛ¥ªæ=fª;35;ËÄ寀éÕè×L‚•â˜øSŒ'ÁΛu¢FPã‰Q'è‹¢¨(Áow E›ÃÙíª‰¬'b'” ßoðù|`,))áéB°ï+‰,ƒ01“ˆôR…z”ÓzÁ•Ó±¹0..ÿ¾ÙSTØ-N¹WþA}güúf­r,uxTnÅu«—[?Ú݋㒰 —>û^”Lw/ô°º‰RÆ% X¿¦xJO#‹GÏsb¼GT›h{´ƒsÐ^Æî°im Ží®šªˆŒ†΃r"Û-ÌO¢³‘ÙB¶u¡»Aù[®P+væ`—|yÔ®ÅÿK¾Šñ郫;F7®ºsér¦å¦zJøQÚÖÞ„ ¿Á, .zñצÙ´íO°³Cg™À0ÁzVW-tÇlÃ;ÀþÆ*–Ó³öZ¶Z?Îy/¾'ªÛ!ÒfÚm޶Ôuæ:Ë8{‹¹Å2Ý~À|ÿwç§~<®Ö¯g×ê0Û·Hùu3twèh.–ó$ºx‹1#Vm¦©DºÈ²21¡M³FCiìʡے`s{€פ“g+ؽçû³Ãä86}[Á‚ «öbvr¶˜yWD+\ôh$Æ'èða~åÍëÏŒ•¢ÕTÐ̵œÜTœ`ÁnõôMƒ'壨q!†^üëy ï¼<çöö5µ÷í®HÍ‹ÍiŸýÖà, ¯À_—ÚȾVð]åÙP¢Qì>šä PLPcžjà ìGÐT^“ j-à{ŠÐ›¯•h^¼A£ƒr4zzÛÀ?µap  îL#JýZ@^a—^… †›^Ä,€µ«ÑWR¯DU³ïP(& lã©ìöá~Õ+ìÂûü9á¬J-pV.›ÎfRØL®˜.áê讕nææÑs¹eÌzf½…†þ#³—ÛàÌ_è×{-7žŸÆ®gÖ ÇØ×„÷é÷™ù3‚šU©–åÔjx?‡‡,Ü‹”“¦ÁoRÇÏp”JdhNäE°÷íZ,z‘Ú©ÎQKjF ^N·«áS²[•°È?ˆëF69°-¾îú¬tFñóW4CF¨óù¢ºõqéQ [AO€¹‚]*°¼yƒënlųp»¼o’÷ÈW—È—Ø#ƒñNyFp6>µR~†Ðj#üx’¤h a‘%Æ—Ûvˆõa{ »Axü)އ‡àù5°Ž]Ìtxëàhy=*.ÃkHðkH˜ 1«y  –CºÒ ö@ºÒ>pàïÀ-ôwÁ 4h -Ä©2AOß$ŒZF½’Ñ0¼‰¢ÂQð„Õ£È%€Uº&t XäØ ã5Àû0à˜ôÉÀµÕ€ÿj&l'+‚Nøšèˆ¬ÃivMìÃY—‰` YHÊ>°É—¥)ùlLòœ%™ù“ÏÜiHSaöäu«êG;K&7Íg¦—Tû&Ï N¢ŒN©›Y0.¸”ÚО1qbfs°‹‘™ê‘ŠóÚ23aýdß¶ƒ®"Q¼Z)“Å&œ„‹q“ºSÍa£žSy@ùëÑÂY¢(»Í@|´vð1rª†ýþ2_dÿ˵xéžÓòYKÚ’‹â`Gç6uÏeZö&RÛ¦eMYYÞì§$Uźì™]Lp‹Dë¥ ÍzÍz=mÑZ£æhiÖcáÕÚj¨"‹Ý.l6{/Ù?tÜ…ÍlCÄÌ&ÑEhшúTNxâ~€oâD&L]¾÷ÞU«º»WQYòòßáûŽSĆc‚o¿Þ»{÷¾}»w÷ΑŸÅS¿úO—Ÿú‚’€–«äÉÌNM-HÅx)Õ-ˆqvÊãäíœè‰VÛt‚Öª-ÒÛ9G¬ÃêµýK{Q9ëLưqjpȪ*4’£W± ‰½¢½øWw…ØQÚ¸tU„êCD¦>TGǦiŸé‚p‚¾"·a Ó‚±|–¦ºÊÖ¯0//H¦eEèx©¥ƒÅ²Zš¨ÒsÉ6-­b\ju­8N=ÖUé¬I=M ñ‰NȘÓ³=#ÃÈ3)ꌌ(“èŒ7×'ò¦L¾>Éž¥AñõQ™¨>Ý–™u5>qJÅ¿ .8(f›°<¡?Ê;7ç–Ö[p+q­Á'Þw’â|ƒ:¹ÁùVP çv&ƒï=K•PøÀ”Y))rèP]]ÿé71°ãSΖ½°ubZZhïÔ)_Ê¡oáŬ–:§///Çf•UU¹fÛûO¼Vì1›k¶”¤Lj\ùø‰÷÷аÁ® }N-c;A¿Œ? Ïˆrh2 /á…ˆÁ-’™G-æ¬Àš(n€QyÑCÀ'këö»Ú{Þ)=,(%üù8ßyî/;œäB‚#ÆYØ4ñ ¦íؾo_âMÚx]÷ãsèÇqŽ|òx°oŒ ãwY¾>wõÙ§¡KÌTÐy䯢NÊÍvsš¹Ä<ïà9;œ”œY§Yð‡ìZÑk·ªíq¸Èj‹ûÉl!úÄ諾£ÐœxBpTµ¯÷݉/Á9'¨%áÇÌÞEÁ«oòeÆi³jÊ7S²ñLEðŽÖìÉK¤¹Ô¤«/ïdó¢K3^h;L=´ÓÁYç‚w65ÈGÞÂFÄBàU X@Ì~ ÖÃ"ì'Ñ×k9M$G"¯±$è®DÞ£©nìzj/N…°ÓÏ>/¿G‚‹{™ŠÁ/iÃÕ—iûàEÈCdeÓÀÀk[˜–¶  z)ž‰fì"걊'NešÅ-ÌñQæâ‹ÌAþ°xŒyC<Å| ^`®0†¶2,í5Bì“a­ Íz`Š*«¨VyvÕVQ¥öaNÌð"ƒ8n*Ô*U<Ø64E†âà}bro!<ÁÙö™°„D®+Â÷õÙÖcúc°À~Õé'¯”Ä áÞSúîtaÜY¬hÖ¿bÕ³Ýé«„ëKCml·ÞúSObþ-Ä­ù`âáWíx±¼ ·èÅ“åÿýŸP)”U>†KƒýÁ·ñXùðÄ$úÍPîÈÞ—º¼â4qޏEÜ-¾-‚‘†9.Ž7h3y§vŸ«­å[yrâ.å—kµ–¨"m·j½z»: æbb4‚–rj4^£Z-r<å/Üï¬V4i€N¯B*#Ú¡ŠáÍ@#V­ `Í~h!•4Ñ ¶“yˆfõç­ƒ@‘+P~õçƒçÁ@Qny@œ0\ò°`ý5.[ñJ~䂇äIø5›ûB0ÿ tWT<{ÃRF‘(ïó¤ÕÙméŒÜ…Gýã¸Í陿úHrV¾û-ІùfÑàYÚsõ¤üÆLs1äüQ>!òVë¿úx¡’KË7‰^”Ñ­Ä»"ïÃÛÅ•`uUû±5h¼x^ oOß±Þ•mD“Ñxwº Þ›Žnï‘H8‘8òáˆï9qBí„ææôšŽùK:ÏÕžYqÇü٤׵‰@øúN| ðU¸ÖCêÈÚºÖlxÀÐpàc€¯Â §ô:r$€€6€.€5›ðôœøà+B”Päƒà3”ÇpŠßX1¬\>¬¬]×=_9¬½jX¹zX¹fXY1+®ü¯ÌõøÕ+OVž<¬> endobj xref 0 72 0000000000 65535 f 0000083633 00000 n 0000003998 00000 n 0000027350 00000 n 0000000022 00000 n 0000003978 00000 n 0000004117 00000 n 0000007029 00000 n 0000042904 00000 n 0000000000 00000 n 0000028744 00000 n 0000004238 00000 n 0000028462 00000 n 0000028225 00000 n 0000027970 00000 n 0000027746 00000 n 0000027511 00000 n 0000073762 00000 n 0000004293 00000 n 0000007008 00000 n 0000011417 00000 n 0000007065 00000 n 0000011396 00000 n 0000011524 00000 n 0000065603 00000 n 0000020379 00000 n 0000011658 00000 n 0000020358 00000 n 0000020486 00000 n 0000025200 00000 n 0000020620 00000 n 0000025179 00000 n 0000025307 00000 n 0000058350 00000 n 0000027133 00000 n 0000025441 00000 n 0000027112 00000 n 0000027240 00000 n 0000027461 00000 n 0000027632 00000 n 0000027688 00000 n 0000027868 00000 n 0000027924 00000 n 0000028091 00000 n 0000028147 00000 n 0000028347 00000 n 0000028403 00000 n 0000028584 00000 n 0000028640 00000 n 0000029906 00000 n 0000029181 00000 n 0000029886 00000 n 0000030154 00000 n 0000042882 00000 n 0000043596 00000 n 0000043846 00000 n 0000058328 00000 n 0000058960 00000 n 0000059220 00000 n 0000065582 00000 n 0000066147 00000 n 0000066380 00000 n 0000073741 00000 n 0000074195 00000 n 0000074453 00000 n 0000083412 00000 n 0000083433 00000 n 0000083473 00000 n 0000083526 00000 n 0000083552 00000 n 0000083594 00000 n 0000083613 00000 n trailer << /Size 72 /Root 38 0 R /Info 1 0 R /ID [ <67a6a604db234baabb96891b8c06513b> <67a6a604db234baabb96891b8c06513b> ] >> startxref 83777 %%EOF sumaclust_v1.0.35/._sumaclust_user_manual.md000644 000765 000024 00000000260 13447147451 023223 0ustar00celinemercierstaff000000 000000 Mac OS X  2~°ATTR°  com.apple.lastuseddate#PSŸÑœ\zà5 sumaclust_v1.0.35/sumaclust_user_manual.md000644 000765 000024 00000024165 13447147451 023020 0ustar00celinemercierstaff000000 000000 # Sumaclust: fast and exact clustering of sequences [metabarcoding.org/sumaclust](metabarcoding.org/sumaclust) ## Introduction With the development of next-generation sequencing, efficient tools are needed to handle millions of sequences in reasonable amounts of time. Sumaclust is a program developed by the [LECA](http://www-leca.ujf-grenoble.fr/?lang=en). Sumaclust aims to cluster sequences in a way that is fast and exact at the same time. This tool has been developed to be adapted to the type of data generated by DNA metabarcoding, i.e. entirely sequenced, short markers. Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the 'erroneous' sequences created during amplification and sequencing protocols, deriving from 'true' sequences. Currently, Sumaclust is available as a program that you can download and install on Unix-like machines. ## Download and installation of Sumaclust ### Download Sumaclust can be downloaded from the metabarcoding.org GitLab. The archive of the latest tagged version can be downloaded on the GitLab wiki page: [https://git.metabarcoding.org/obitools/sumaclust/wikis/home](https://git.metabarcoding.org/obitools/sumaclust/wikis/home) The versions downloaded this way are for Unix-like systems compatible with SIMD SSE2 instructions and POSIX threads. Pre-compiled versions of GCC for OS X can be found [here](http://hpc.sourceforge.net/), that might be helpful if you encounter problems compiling the programs. Send an email at for other versions, or if you have any inquiries. ### Installation Untar the archive, go into the newly created directory and compile: ``` tar –zxvf sumaclust_v[x.x.xx].tar.gz cd sumaclust_v[x.x.xx] make -C sumalibs install make install ``` You can compile Sumaclust with `clang`, which deactivates `OpenMP`, with: ``` make CC=clang ``` ## Documentation Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the "erroneous" sequences created during amplification and sequencing protocols, deriving from "true" sequences. ### Using Sumaclust #### Input The input can be either the standard input (stdin), or a file in FASTA format. #### Usage ``` sumaclust [-l|L|a|n|r|d|e|o|g|f] [-t threshold_value] [-s sorting_key] [-R maximum_ratio] [-p number_of_threads] [-B file_name_for_BIOM-formatted_output] [-O file_name_for_OTU_table-formatted_output] [-F file_name_for_FASTA-formatted_output] [dataset] ``` Argument: the sequence dataset to cluster. For help : ``` sumaclust -h ``` #### Examples ``` sumaclust -t 0.97 my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta ``` ``` sumaclust -d -r -t 2 my_dataset.fasta > clusters_of_seqs_with_distance_<=_2_differences.fasta ``` #### Options ``` -h : [H]elp - print the help -l : Reference sequence length is the shortest. -L : Reference sequence length is the largest. -a : Reference sequence length is the alignment length (default). -n : Score is normalized by reference sequence length (default). -r : Raw score, not normalized. -d : Score is expressed in distance (default : score is expressed in similarity). -t ##.## : Score threshold for clustering. If the score is normalized and expressed in similarity (default), it is an identity, e.g. 0.95 for an identity of 95%. If the score is normalized and expressed in distance, it is (1.0 - identity), e.g. 0.05 for an identity of 95%. If the score is not normalized and expressed in similarity, it is the length of the Longest Common Subsequence. If the score is not normalized and expressed in distance, it is (reference length - LCS length). Only sequences with a similarity above ##.## with the representative sequence of a cluster are assigned to that cluster. Default: 0.97. -e : Exact option : A sequence is assigned to the cluster with the representative sequence presenting the highest similarity score > threshold, as opposed to the default 'fast' option where a sequence is assigned to the first cluster found with a representative sequence presenting a score > threshold. -R ## : Maximum ratio between the counts of two sequences so that the less abundant one can be considered as a variant of the more abundant one. Default: 1.0. -p ## : Multithreading with ## threads using openMP. -s #### : Sorting by ####. Must be 'None' for no sorting, or a key in the fasta header of each sequence, except for the count that can be computed (default : sorting by count). -o : Sorting is in ascending order (default: descending). -g : n's are replaced with a's (default: sequences with n's are discarded). -B ### : Output of the OTU table in BIOM format is activated, and written to file ###. -O ### : Output of the OTU map (observation map) is activated, and written to file ###. -F ### : Output in FASTA format is written to file ### instead of standard output. -f : Output in FASTA format is deactivated. ``` #### Output Sumaclust's default output is in fasta format. There are four fields added in the headers of all sequences. Those fields are of the form [key=value;]. The four keys are `cluster`, `cluster_score`, `cluster_center` and `cluster_weight` and their values correspond respectively to the identifier of the center of the sequence's cluster, the similarity score of the sequence with this center, a boolean indicating whether the sequence is the center of its cluster, and the total number of sequences in the cluster to which the sequence belongs. Example where `seq_1` is a cluster center and `seq_2` is clustered with `seq_1`: ``` >seq_1 species=Heracleum maximum; count=3; cluster=seq_1; cluster_score=1.0; cluster_center=True; cluster_weight=5; atcctattttccaaaaacaaacaaaggcccagaaggtgaaaaaag >seq_2 species=Cnidium cnidiifolium; count=2; cluster=seq_1; cluster_score=0.955556; cluster_center=False; cluster_weight=5; atcctattttccaaaaacaacaaaggcccataaggtgaaaaaag ``` There is a possibility to print the clusters in BIOM format with the `–B` option, and/or in OTU map (observation map) format with the `–O` option. The FASTA output can then be deactivated with the `–f` option. The FASTA output is written to the standard output by default, but can be written to a file using the `–F` option. In the following examples, the first one prints results in FASTA and BIOM formats, and the second one prints results in BIOM and OTU map formats: ``` sumaclust -B clusters_of_seqs_with_similarity_>_97%.biom my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta ``` ``` sumaclust -F -B clusters_of_seqs_with_similarity_>_97%.biom -O clusters_of_seqs_with_similarity_>_97%.txt my_dataset.fasta ``` ### How SUMACLUST works #### Clustering algorithm Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. The problem is defined as follows: Sumaclust browses through the dataset, in the order in which the sequences have been sorted with the -s option. By default, sequences are sorted by decreasing abundance, because this enables to identify 'true' and 'erroneous' sequences the best, as 'true' sequences tend to end up as cluster centers. The first sequence of the ordered list is considered the center of the first cluster. Each sequence, following the ordered list, is compared with the centers of the existing clusters, respecting the initial list's order. If the similarity of the query sequence with a center is above a chosen threshold, and their abundance ratio is below the maximum ratio chosen, the sequence is grouped in the cluster of this center. Otherwise, a new cluster is created with the query sequence as the center. #### About the abundance ratio An edge is created between a query sequence and a center sequence only if their abundance ratio, i.e. the query sequence’s count divided by the center sequence’s count, is below the maximum ratio chosen with the `–R` option. This can prevent sequences that are very abundant, and therefore likely true sequences, to be considered a variant of another true sequence that is only a little more abundant and very close to them. #### Similarity computation ##### Similarity indice A good way to evaluate the similarities between full-length sequences is to use indices based on the length of the Longest Common Subsequence (LCS), and in particular, a good similarity indice is the length of the LCS divided by the length of the shortest alignment representing this LCS, giving an identity percentage. This is the similarity indice used by Sumatra by default. Other similarity indices are available through the options. ##### Fast computation of the similarity *Lossless k-mer filter.* Since we are usually interested in higly similar sequences, Sumatra uses similarity thresholds under which similarities are not reported. A lossless filtering step enables to only align couples of sequences that potentially have an identity greater than the chosen threshold. This filter is based on the number of overlapping k-mers that the sequences must share in order to have an identity at least equal to the threshold. With typical DNA metabarcoding datasets (a few millions sequences of 50-300 bp and threshold around 90-95% id), we empirically determined that the most efficient filtering was achieved with 4-mers and 5-mers. *Alignment within a diagonal band.* Alignments are computed using a Needleman-Wunsch algorithm. In the scoring system used, matches are rewarded by one point, and mismatches and insertions/deletions are not penalised. The computation of the length of the LCS and the length of the alignment by the NWS algorithm has a quadratic complexity in time. It is responsible for most of the computation time. At high identity thresholds, the alignment computation can be done only in a diagonal band of the alignment matrix, gaining a considerable amount of time depending on the threshold. *Parallelization.* There are two levels of parallelization implemented in Sumatra. Both the filtering and the alignments steps are optimized with the use of Simple Instruction Multiple Data instructions (SIMD). Since 4-mers enable to work easily with SIMD instructions, we implemented a 4-mer filter. Moreover, the program can be run on multiple threads. sumaclust_v1.0.35/sumalibs/Licence_CeCILL_V2-fr.txt000755 000765 000024 00000051733 13446627177 024047 0ustar00celinemercierstaff000000 000000 CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL Avertissement Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: * d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, * d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) sont: Commissariat à l'Energie Atomique - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. Institut National de Recherche en Informatique et en Automatique - INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. Préambule Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modification et de redistribution du logiciel régi par cette licence dans le cadre d'un modèle de diffusion en logiciel libre. L'exercice de ces libertés est assorti de certains devoirs à la charge des utilisateurs afin de préserver ce statut au cours des redistributions ultérieures. L'accessibilité au code source et les droits de copie, de modification et de redistribution qui en découlent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. Article 1 - DEFINITIONS Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. Contributeur: désigne le Licencié auteur d'au moins une Contribution. Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. Contribution: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. Module: désigne un ensemble de fichiers sources y compris leur documentation qui permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce Module et le Logiciel s'exécutent dans des espaces d'adressage différents, l'un appelant l'autre au moment de leur exécution. Module Interne: désigne tout Module lié au Logiciel de telle sorte qu'ils s'exécutent dans le même espace d'adressage. GNU GPL: désigne la GNU General Public License dans sa version 2 ou toute version ultérieure, telle que publiée par Free Software Foundation Inc. Parties: désigne collectivement le Licencié et le Concédant. Ces termes s'entendent au singulier comme au pluriel. Article 2 - OBJET Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. Article 3 - ACCEPTATION 3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: * (i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; * (ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. 3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissance. Article 4 - ENTREE EN VIGUEUR ET DUREE 4.1 ENTREE EN VIGUEUR Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. 4.2 DUREE Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. Article 5 - ETENDUE DES DROITS CONCEDES Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. 5.1 DROIT D'UTILISATION Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: 1. la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. 2. le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. 3. la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. 5.2 DROIT D'APPORTER DES CONTRIBUTIONS Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette Contribution et la date de création de celle-ci. 5.3 DROIT DE DISTRIBUTION Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au Code Source complet du Logiciel en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE Lorsque le Licencié apporte une Contribution au Logiciel, les conditions de distribution du Logiciel Modifié en résultant sont alors soumises à l'intégralité des dispositions du Contrat. Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de code source ou de code objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: 1. d'un exemplaire du Contrat, 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, et que, dans le cas où seul le code objet du Logiciel Modifié est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au code source complet du Logiciel Modifié en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du code source ne devra pas excéder le simple coût de transfert des données. 5.3.3 DISTRIBUTION DES MODULES EXTERNES Lorsque le Licencié a développé un Module Externe les conditions du Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué sous un contrat de licence différent. 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL Le Licencié peut inclure un code soumis aux dispositions d'une des versions de la licence GNU GPL dans le Logiciel modifié ou non et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis aux dispositions d'une des versions de la licence GNU GPL et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. Article 6 - PROPRIETE INTELLECTUELLE 6.1 SUR LE LOGICIEL INITIAL Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2. 6.2 SUR LES CONTRIBUTIONS Le Licencié qui a développé une Contribution est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. 6.3 SUR LES MODULES EXTERNES Le Licencié qui a développé un Module Externe est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion. 6.4 DISPOSITIONS COMMUNES Le Licencié s'engage expressément: 1. à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; 2. à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non. Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. Article 7 - SERVICES ASSOCIES 7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. 7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. Article 8 - RESPONSABILITE 8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. 8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. Article 9 - GARANTIE 9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. 9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). 9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. 9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. Article 10 - RESILIATION 10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. 10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. Article 11 - DISPOSITIONS DIVERSES 11.1 CAUSE EXTERIEURE Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... 11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. 11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. 11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. 11.5 LANGUE Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. Article 12 - NOUVELLES VERSIONS DU CONTRAT 12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. 12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. 12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure, sous réserve des dispositions de l'article 5.3.4. Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE 13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. 13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. Version 2.0 du 2006-09-05. sumaclust_v1.0.35/sumalibs/Makefile000755 000765 000024 00000002226 13446717721 021341 0ustar00celinemercierstaff000000 000000 PREFIX=/usr/local SOURCES = libfasta/fasta_header_parser.c \ libfasta/fasta_seq_writer.c \ libfasta/fasta_header_handler.c \ libfasta/header_mem_handler.c \ libfasta/sequence.c \ libfile/fileHandling.c \ liblcs/sse_banded_LCS_alignment.c \ liblcs/upperband.c \ libutils/utilities.c \ libutils/debug.c SRCS=$(SOURCES) OBJECTS= $(patsubst %.c,%.o,$(SOURCES)) LIBFILE = libsuma.a RANLIB = ranlib CC=gcc LDFLAGS= CFLAGS = -O3 -w default: all all: $(LIBFILE) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< $(LIB) libfasta/fasta_header_parser.c: libfasta/fasta_header_parser.l flex -Pheader_yy -t $< > $@ libfasta/dic_parser.c: libfasta/dic_parser.l lex -Phashtable_yy -t $< > $@ clean: rm -rf $(OBJECTS) $(LIBFILE) $(LIBFILE): $(OBJECTS) ar -cr $@ $? $(RANLIB) $@ install: all install -d $(DESTDIR)$(PREFIX)/lib/ install -m 644 $(LIBFILE) $(DESTDIR)$(PREFIX)/lib/ install -d $(DESTDIR)$(PREFIX)/include/ for lib in libfasta liblcs libsse libutils libfile ; do \ install -d $(DESTDIR)$(PREFIX)/include/$$lib ; \ cp $$lib/*.h $(DESTDIR)$(PREFIX)/include/$$lib ; \ done sumaclust_v1.0.35/sumalibs/libutils/000755 000765 000024 00000000000 13641112222 021501 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumalibs/libsse/000755 000765 000024 00000000000 13446627177 021162 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumalibs/libfasta/000755 000765 000024 00000000000 13641112222 021437 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumalibs/liblcs/000755 000765 000024 00000000000 13641112222 021122 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumalibs/Licence_CeCILL_V2-en.txt000755 000765 000024 00000051151 13446627177 024034 0ustar00celinemercierstaff000000 000000 CeCILL FREE SOFTWARE LICENSE AGREEMENT Notice This Agreement is a Free Software license agreement that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: * firstly, compliance with the principles governing the distribution of Free Software: access to source code, broad rights granted to users, * secondly, the election of a governing law, French law, with which it is conformant, both as regards the law of torts and intellectual property law, and the protection that it offers to both authors and holders of the economic rights over software. The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) license are: Commissariat à l'Energie Atomique - CEA, a public scientific, technical and industrial research establishment, having its principal place of business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange, 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France. Preamble The purpose of this Free Software license agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an open source distribution model. The exercising of these rights is conditional upon certain obligations for users so as to preserve this status for all subsequent redistributions. In consideration of access to the source code and the rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, the risks associated with loading, using, modifying and/or developing or reproducing the software by the user are brought to the user's attention, given its Free Software status, which may make it complicated to use, with the result that its use is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the suitability of the software as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no provisions are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the use thereof to its provisions. Article 1 - DEFINITIONS For the purpose of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this license agreement, and its possible subsequent versions and annexes. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and possibly its Object Code form and, where applicable, its documentation, "as is" when it is first distributed under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder(s) of the economic rights over the Initial Software. Licensee: means the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any other individual or legal entity, who distributes the Software under the Agreement. Contribution: means any or all modifications, corrections, translations, adaptations and/or new functions integrated into the Software by any or all Contributors, as well as any or all Internal Modules. Module: means a set of sources files including their documentation that enables supplementary functions or services in addition to those offered by the Software. External Module: means any or all Modules, not derived from the Software, so that this Module and the Software run in separate address spaces, with one calling the other when they are run. Internal Module: means any or all Module, connected to the Software so that they both execute in the same address space. GNU GPL: means the GNU General Public License version 2 or any subsequent version, as published by the Free Software Foundation Inc. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE The purpose of the Agreement is the grant by the Licensor to the Licensee of a non-exclusive, transferable and worldwide license for the Software as set forth in Article 5 hereinafter for the whole term of the protection granted by the rights over said Software. Article 3 - ACCEPTANCE 3.1 The Licensee shall be deemed as having accepted the terms and conditions of this Agreement upon the occurrence of the first of the following events: * (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; * (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2 One copy of the Agreement, containing a notice relating to the characteristics of the Software, to the limited warranty, and to the fact that its use is restricted to experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it has read and understood it. Article 4 - EFFECTIVE DATE AND TERM 4.1 EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2 TERM The Agreement shall remain in force for the entire legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF RIGHTS GRANTED The Licensor hereby grants to the Licensee, who accepts, the following rights over the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Besides, if the Licensor owns or comes to own one or more patents protecting all or part of the functions of the Software or of its components, the Licensor undertakes not to enforce the rights granted by these patents against successive Licensees using, exploiting or modifying the Software. If these patents are transferred, the Licensor undertakes to have the transferees subscribe to the obligations set forth in this paragraph. 5.1 RIGHT OF USE The Licensee is authorized to use the Software, without any limitation as to its fields of application, with it being hereinafter specified that this comprises: 1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. 2. loading, displaying, running, or storing the Software on any or all medium. 3. entitlement to observe, study or test its operation so as to determine the ideas and principles behind any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modifications to the Software, and the right to reproduce the resulting software. The Licensee is authorized to make any or all Contributions to the Software provided that it includes an explicit notice that it is the author of said Contribution and indicates the date of the creation thereof. 5.3 RIGHT OF DISTRIBUTION In particular, the right of distribution includes the right to publish, transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, one or more copies of the Software by any means. The Licensee is further authorized to distribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to distribute true copies of the Software in Source Code or Object Code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Object Code of the Software is redistributed, the Licensee allows future Licensees unhindered access to the full Source Code of the Software by indicating how to access it, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the distribution of the resulting Modified Software become subject to all the provisions of this Agreement. The Licensee is authorized to distribute the Modified Software, in source code or object code form, provided that said distribution complies with all the provisions of the Agreement and is accompanied by: 1. a copy of the Agreement, 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the object code of the Modified Software is redistributed, the Licensee allows future Licensees unhindered access to the full source code of the Modified Software by indicating how to access it, it being understood that the additional cost of acquiring the source code shall not exceed the cost of transferring the data. 5.3.3 DISTRIBUTION OF EXTERNAL MODULES When the Licensee has developed an External Module, the terms and conditions of this Agreement do not apply to said External Module, that may be distributed under a separate license agreement. 5.3.4 COMPATIBILITY WITH THE GNU GPL The Licensee can include a code that is subject to the provisions of one of the versions of the GNU GPL in the Modified or unmodified Software, and distribute that entire code under the terms of the same version of the GNU GPL. The Licensee can include the Modified or unmodified Software in a code that is subject to the provisions of one of the versions of the GNU GPL, and distribute that entire code under the terms of the same version of the GNU GPL. Article 6 - INTELLECTUAL PROPERTY 6.1 OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes that the Initial Software will remain ruled at least by this Agreement, for the duration set forth in Article 4.2. 6.2 OVER THE CONTRIBUTIONS The Licensee who develops a Contribution is the owner of the intellectual property rights over this Contribution as defined by applicable law. 6.3 OVER THE EXTERNAL MODULES The Licensee who develops an External Module is the owner of the intellectual property rights over this External Module as defined by applicable law and is free to choose the type of agreement that shall govern its distribution. 6.4 JOINT PROVISIONS The Licensee expressly undertakes: 1. not to remove, or modify, in any manner, the intellectual property notices attached to the Software; 2. to reproduce said notices, in an identical manner, in the copies of the Software modified or not. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors on the Software and to take, where applicable, vis-à-vis its staff, any and all measures required to ensure respect of said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES 7.1 Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of services. The terms and conditions of such technical assistance, and/or such maintenance, shall be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2 Similarly, any Licensor is entitled to offer to its licensees, under its sole responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it is free to decide. Said warranty, and the financial terms and conditions of its application, shall be subject of a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY 8.1 Subject to the provisions of Article 8.2, the Licensee shall be entitled to claim compensation for any direct loss it may have suffered from the Software as a result of a fault on the part of the relevant Licensor, subject to providing evidence thereof. 8.2 The Licensor's liability is limited to the commitments made under this Agreement and shall not be incurred as a result of in particular: (i) loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss that is suffered by the Licensee due to the use or performance of the Software, and (iii) more generally, any consequential loss. In particular the Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY 9.1 The Licensee acknowledges that the scientific and technical state-of-the-art when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of possible defects to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software which are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the suitability of the product for its requirements, its good working order, and for ensuring that it shall not cause damage to either persons or properties. 9.2 The Licensor hereby represents, in good faith, that it is entitled to grant all the rights over the Software (including in particular the rights set forth in Article 5). 9.3 The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any warranty as to its commercial value, its secured, safe, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any error, that it will operate without interruption, that it will be compatible with the Licensee's own equipment and software configuration, nor that it will meet the Licensee's requirements. 9.4 The Licensor does not either expressly or tacitly warrant that the Software does not infringe any third party intellectual property right relating to a patent, software or any other property right. Therefore, the Licensor disclaims any and all liability towards the Licensee arising out of any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any and all liability as regards the Licensee's use of the name of the Software. No warranty is given as regards the existence of prior rights over the name of the Software or as regards the existence of a trademark. Article 10 - TERMINATION 10.1 In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2 A Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS 11.1 EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as defective functioning or interruptions of the electricity or telecommunications networks, network paralysis following a virus attack, intervention by government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2 Any failure by either Party, on one or more occasions, to invoke one or more of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its right to invoke said provision(s) subsequently. 11.3 The Agreement cancels and replaces any or all previous agreements, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as between the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4 In the event that one or more of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall prevail, and the Parties shall make the necessary amendments so as to comply with said act or legislative text. All other provisions shall remain effective. Similarly, invalidity of a provision of the Agreement, for any reason whatsoever, shall not cause the Agreement as a whole to be invalid. 11.5 LANGUAGE The Agreement is drafted in both French and English and both versions are deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT 12.1 Any person is authorized to duplicate and distribute copies of this Agreement. 12.2 So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, who reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3 Any Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement or a subsequent version, subject to the provisions of Article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION 13.1 The Agreement is governed by French law. The Parties agree to endeavor to seek an amicable solution to any disagreements or disputes that may arise during the performance of the Agreement. 13.2 Failing an amicable solution within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the more diligent Party. Version 2.0 dated 2006-09-05. sumaclust_v1.0.35/sumalibs/libfile/000755 000765 000024 00000000000 13641112222 021260 5ustar00celinemercierstaff000000 000000 sumaclust_v1.0.35/sumalibs/libfile/fileHandling.h000755 000765 000024 00000000777 13446627177 024062 0ustar00celinemercierstaff000000 000000 /** * FileName: fileHandling.h * Authors: Tiayyba Riaz, Celine Mercier * Description: Header file for file handling functions * **/ #ifndef FILEHANDLING_H_ #define FILEHANDLING_H_ #include "../libutils/utilities.h" /* Prototypes */ FILE *file_open(char* fileName, BOOL abortOnError); char file_nextChar(FILE* fp); char *file_nextLine(FILE *fp, char *buffer, int32_t bufferSize); FILE *file_openrw(char* fileName, BOOL abortOnError); void exitIfEmptyFile(FILE *file); #endif /*FILEHANDLING_H_*/ sumaclust_v1.0.35/sumalibs/libfile/fileHandling.c000755 000765 000024 00000003535 13446627177 024050 0ustar00celinemercierstaff000000 000000 /** * FileName: fileHandling.c * Authors: Tiayyba Riaz, Celine Mercier * Description: C file for file handling functions * **/ #include #include #include #include "../libutils/utilities.h" /* * Function Name: fileOpen(char* fileName, BOOL abortOnError) * Description: Opens the file and returns the pointer to file object */ FILE *file_open(char* fileName, BOOL abortOnError) { FILE* fp; if (fileName == NULL && abortOnError) ERRORABORT(FILE_OPENING_ERROR, "File name not given."); if (fileName == NULL) return NULL; fp = fopen(fileName, "r"); return fp; } FILE *file_openrw(char* fileName, BOOL abortOnError) { FILE* fp; if (fileName == NULL && abortOnError) ERRORABORT(FILE_OPENING_ERROR, "File name not given."); if (fileName == NULL) return NULL; fp = fopen(fileName, "w+"); return fp; } /* * Function Name: fileNextChar(FILE* fp) * Description: Reads the file and returns next character, if file is null or its end of file, returns \�. */ char file_nextChar(FILE* fp) { if (fp == NULL) return '\0'; if(feof(fp)) return '\0'; return (char) fgetc(fp); } /* * Function Name: *fileNextLine(FILE *fp, char *buffer, int32_t bufferSize) * Description: Reads the file and returns next line, if file is null or its end of file, returns \�. */ char *file_nextLine(FILE *fp, char *buffer, int32_t bufferSize) { if(fp == NULL) return NULL; if(feof(fp)) return NULL; return fgets(buffer, bufferSize, fp); } void exitIfEmptyFile(FILE *file) { long savedOffset = ftell(file); if (fseek(file, 0, SEEK_END) != 0) { fprintf(stderr, "\nError moving the offset in an input file\n"); exit(1); } if (ftell(file) == 0) { fprintf(stderr, "\nInput file is empty.\n"); exit(1); } fseek(file, savedOffset, SEEK_SET); } sumaclust_v1.0.35/sumalibs/liblcs/upperband.h000755 000765 000024 00000001472 13446627177 023311 0ustar00celinemercierstaff000000 000000 #ifndef UPPERBAND_H_ #define UPPERBAND_H_ int buildTable(const char *sequence, unsigned char *table, int *count); int compareTable(unsigned char *t1, int over1, unsigned char* t2, int over2); int threshold4(int wordcount,double identity); int thresholdLCS4(int32_t reflen,int32_t lcs); int hashDB(fastaSeqCount); BOOL isPossible(fastaSeqPtr, fastaSeqPtr, BOOL, int, double, BOOL); BOOL isPossibleSumathings(fastaSeqPtr seq1, fastaSeqPtr seq2, int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode); void filters(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin); void filtersSumatra(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin); #endif sumaclust_v1.0.35/sumalibs/liblcs/_lcs_fast.h000755 000765 000024 00000032736 13446627177 023275 0ustar00celinemercierstaff000000 000000 /* * Print a SSE register for debug purpose */ #ifdef __SSE2__ static void printreg(VTYPE r) { STYPE a0,a1,a2,a3,a4,a5,a6,a7; #if VMODE STYPE a8,a9,a10,a11,a12,a13,a14,a15; #endif a0= EXTRACT_REG(r,0); a1= EXTRACT_REG(r,1); a2= EXTRACT_REG(r,2); a3= EXTRACT_REG(r,3); a4= EXTRACT_REG(r,4); a5= EXTRACT_REG(r,5); a6= EXTRACT_REG(r,6); a7= EXTRACT_REG(r,7); #if VMODE a8= EXTRACT_REG(r,8); a9= EXTRACT_REG(r,9); a10= EXTRACT_REG(r,10); a11= EXTRACT_REG(r,11); a12= EXTRACT_REG(r,12); a13= EXTRACT_REG(r,13); a14= EXTRACT_REG(r,14); a15= EXTRACT_REG(r,15); #endif printf( "a00 :-> %7d %7d %7d %7d " " %7d %7d %7d %7d " #if VMODE "%7d %7d %7d %7d " " %7d %7d %7d %7d " #endif "\n" , a0,a1,a2,a3,a4,a5,a6,a7 #if VMODE , a8,a9,a10,a11,a12,a13,a14,a15 #endif ); } /* * set position p of a SSE register with the value v */ static inline VTYPE insert_reg(VTYPE r, STYPE v, int p) { switch (p) { case 0: return INSERT_REG(r,v,0); case 1: return INSERT_REG(r,v,1); case 2: return INSERT_REG(r,v,2); case 3: return INSERT_REG(r,v,3); case 4: return INSERT_REG(r,v,4); case 5: return INSERT_REG(r,v,5); case 6: return INSERT_REG(r,v,6); case 7: return INSERT_REG(r,v,7); #if VMODE case 8: return INSERT_REG(r,v,8); case 9: return INSERT_REG(r,v,9); case 10: return INSERT_REG(r,v,10); case 11: return INSERT_REG(r,v,11); case 12: return INSERT_REG(r,v,12); case 13: return INSERT_REG(r,v,13); case 14: return INSERT_REG(r,v,14); case 15: return INSERT_REG(r,v,15); #endif } return _MM_SETZERO_SI128(); } static inline STYPE extract_reg(VTYPE r, int p) { switch (p) { case 0: return EXTRACT_REG(r,0); case 1: return EXTRACT_REG(r,1); case 2: return EXTRACT_REG(r,2); case 3: return EXTRACT_REG(r,3); case 4: return EXTRACT_REG(r,4); case 5: return EXTRACT_REG(r,5); case 6: return EXTRACT_REG(r,6); case 7: return EXTRACT_REG(r,7); #if VMODE case 8: return EXTRACT_REG(r,8); case 9: return EXTRACT_REG(r,9); case 10: return EXTRACT_REG(r,10); case 11: return EXTRACT_REG(r,11); case 12: return EXTRACT_REG(r,12); case 13: return EXTRACT_REG(r,13); case 14: return EXTRACT_REG(r,14); case 15: return EXTRACT_REG(r,15); #endif } return 0; } #define GET_H_SYMBOLE(s,p) ((p && p < lseq1) ? (s)[(p)-1]:255) #define GET_V_SYMBOLE(s,p) ((p && p < lseq2) ? (s)[(p)-1]:0) #define LSHIFT_SCORE(r) { r = _MM_SLLI_SI128((r),sizeof(STYPE)); } #define SET_H_SYMBOLE(r,p,s) { r = insert_reg((r),(STYPE)GET_H_SYMBOLE(seq1,(s)),(p)); } #define PUSH_V_SYMBOLE(r,s) { r = insert_reg(_MM_SLLI_SI128((r),sizeof(STYPE)),(STYPE)GET_V_SYMBOLE(seq2,(s)),0); } #define EQUAL(f1,f2) _MM_AND_SI128(EQUAL_REG((f1),(f2)),SET_CONST(1)) int FASTLCSSCORE(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath) { int lseq1,lseq2; // length of the both sequences int itmp; // tmp variables for swap const char* stmp; // int nbands; // Number of bands of width eight in the score matrix int lastband; // width of the last band // Register for scanning the score matrix VTYPE minus1; VTYPE minus2; VTYPE current; VTYPE left; VTYPE top; VTYPE diag; VTYPE sminus1; VTYPE sminus2; VTYPE scurrent; VTYPE sleft; VTYPE stop; VTYPE sdiag; VTYPE way; VTYPE onevect; VTYPE maxvect; VTYPE fhseq; // The fragment of the horizontal sequence // to consider for aligment VTYPE fvseq; // The fragment of the horizontal sequence // to consider for aligment VTYPE match; int band; int line; int limit; int lcs; int h; int i; column_t *column; // Made seq1 the longest sequences lseq1=strlen(seq1); lseq2=strlen(seq2); if (lseq1 < 10 || lseq2 < 10) return simpleLCS(seq1,seq2,ppcolumn,lpath); if (lseq1 < lseq2) { itmp=lseq1; lseq1=lseq2; lseq2=itmp; stmp=seq1; seq1=seq2; seq2=stmp; } // we add one to both lengths for taking into // account the extra line and column in the score // matrix lseq1++; lseq2++; // a band sized to the smallest sequence is allocated if (ppcolumn) column = *ppcolumn; else column=NULL; column = allocateColumn(lseq2,column,VMODE); // Check memory allocation if (column == NULL) return -1; for (i=0; idata.CMENB[i]=MIN_SCORE; column->score.CMENB[i]=-1; } nbands = lseq1 / VSIZE; // You have VSIZE element in one SSE register // Alignment will be realized in nbands lastband = lseq1 - (nbands * VSIZE); // plus one of width lastband except if // lastband==0 if (lastband) nbands++; else lastband=VSIZE; lastband--; // printf("seq1 : %s seq2 : %s\n",seq1,seq2); minus2 = SET_CONST(MIN_SCORE); minus1 = _MM_SETZERO_SI128(); sminus1= _MM_SETZERO_SI128(); sminus2= _MM_SETZERO_SI128(); onevect= SET_CONST(1); maxvect= SET_CONST(MAX_SCORE); h=0; fhseq = _MM_SETZERO_SI128(); fvseq = _MM_SETZERO_SI128(); // // Beginning of the first band // for (line = 0; line < VSIZE; line++,h++) // avant VSIZE - 1 { // printf("line= %4d h= %4d\n",line,h); SET_H_SYMBOLE(fhseq,line,h) PUSH_V_SYMBOLE(fvseq,line) minus2 = insert_reg(minus2,0,h); minus1 = insert_reg(minus1,MIN_SCORE,line); // 0 avant match = EQUAL(fhseq,fvseq); if (lpath) { sminus2 = insert_reg(sminus2,line-1,line); // Je ne suis pas certain de l'initialisation sminus1 = insert_reg(sminus1,0,line); } // printreg(fvseq); // printreg(fhseq); // printreg(match); // printf("================================\n"); current = minus1; // The best score is the upper one // It cannot be the best as set to MIN_SCORE left = minus1; // printf("Vert = "); printreg(current); LSHIFT_SCORE(minus1) // I shift minus1 so now I'll compare with the left position minus1=insert_reg(minus1,(column)->data.CMENB[line],0); top=minus1; if (lpath) { sleft=sminus1; // I store the path length corresponding to the upper path LSHIFT_SCORE(sminus1) // I shift to prepare the score coming from the left side sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0); stop=sminus1; sdiag=sminus2; } // printf("Horz = "); printreg(minus1); current = GET_MAX(current,minus1); // Look for the best between upper and left // printf("BstHV= "); printreg(current); // // printf("Diag = "); printreg(ADD_REG(minus2,match)); diag=minus2; // minus2 = ; // Minus2 contains the diagonal score, so I add the match reward // Diag score are setup to 0 so this one will win on the first iteration current = GET_MAX(current,ADD_REG(minus2,match)); if (lpath) { // printf("\n"); // printf("current: "); // printreg(current); // printf("current: "); // printreg(SUB_REG(current,match)); // printf("diag : "); // printreg(diag); // printf("left : "); // printreg(left); // printf("top : "); // printreg(top); way = EQUAL_REG(SUB_REG(current,match),diag); scurrent= OR_REG(AND_REG(way,sdiag), ANDNOT_REG(way,maxvect)); // printf("sdiag : "); // printreg(scurrent); way = EQUAL_REG(current,left); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft), ANDNOT_REG(way,maxvect))); // printf("sleft : "); // printreg(scurrent); way = EQUAL_REG(current,top); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop), ANDNOT_REG(way,maxvect))); // printf("stop : "); // printreg(scurrent); scurrent= ADD_REG(scurrent,onevect); sminus2=sminus1; sminus1=scurrent; } // printf("line %d :Best = ",line); printreg(current); // // printf("================================\n"); minus2=minus1; minus1=current; // printf("min2 = "); printreg(minus2); // printf("min1 = "); printreg(minus1); // printf("================================\n"); // printf("\n"); // printf("sdiag : "); // printreg(sminus2); // printf("scur : "); // printreg(scurrent); // printf("current: "); // printreg(current); // printf("%8s\n",seq1); // printf("%8s\n",seq2); // printf("================================\n"); } ///// <<<<<<<<------- Fin du debut de la premiere bande // printf("================================\n"); (column)->data.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(current,VSIZE-1); if (lpath) (column)->score.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(scurrent,VSIZE-1); for (band=0; band < nbands; band++) { // SET_H_SYMBOLE(fhseq,line,h) // minus2 = insert_reg(minus2,0,line); // minus1 = insert_reg(minus1,MIN_SCORE,line); // 0 avant // h++; for (; line < lseq2; line++) { // printf("Je tourne avec line= %d \n",line); PUSH_V_SYMBOLE(fvseq,line) match = EQUAL(fhseq,fvseq); // printreg(fvseq); // printreg(fhseq); // printreg(match); // printf("================================\n"); current = minus1; left = minus1; // Store the last current score in extra column (column)->data.CMENB[line-VSIZE]=EXTRACT_REG(current,VSIZE-1); LSHIFT_SCORE(minus1) minus1=insert_reg(minus1,(column)->data.CMENB[line],0); top = minus1; // printf("Vert = "); printreg(current); if (lpath) { sleft= sminus1; (column)->score.CMENB[line-VSIZE]=EXTRACT_REG(scurrent,VSIZE-1); LSHIFT_SCORE(sminus1) sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0); stop=sminus1; sdiag=sminus2; } // printf("line = %d --> get = %d\n",line,(column)->data.CMENB[line]); // printf("Horz = "); printreg(minus1); current = GET_MAX(current,minus1); diag=minus2; current = GET_MAX(current,ADD_REG(minus2,match)); if (lpath) { // printf("\n"); // printf("current: "); // printreg(current); // printf("current: "); // printreg(SUB_REG(current,match)); // printf("diag : "); // printreg(diag); // printf("left : "); // printreg(left); // printf("top : "); // printreg(top); way = EQUAL_REG(SUB_REG(current,match),diag); scurrent= OR_REG(AND_REG(way,sdiag), ANDNOT_REG(way,maxvect)); // printf("sdiag : "); // printreg(scurrent); way = EQUAL_REG(current,left); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft), ANDNOT_REG(way,maxvect))); // printf("sleft : "); // printreg(scurrent); way = EQUAL_REG(current,top); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop), ANDNOT_REG(way,maxvect))); // printf("stop : "); // printreg(scurrent); scurrent= ADD_REG(scurrent,onevect); sminus2=sminus1; sminus1=scurrent; } minus2=minus1; minus1=current; // printf("\n"); // printf("sdiag : "); // printreg(sminus2); // printf("scur : "); // printreg(scurrent); // printf("current: "); // printreg(current); // printf("%8s\n",seq1); // printf("%8s\n",seq2); } // printf("================================\n"); // end of the band and beginnig of the next one limit=(band==(nbands-1)) ? lastband:VSIZE; for (line = 0; line < limit; line++,h++) { // printf("Je fini avec line= %d \n",line); SET_H_SYMBOLE(fhseq,line,h) PUSH_V_SYMBOLE(fvseq,line) minus2 = insert_reg(minus2,MIN_SCORE,line); minus1 = insert_reg(minus1,MIN_SCORE,line); current = minus1; left=minus1; match = EQUAL(fhseq,fvseq); if (lpath) { sminus2 = insert_reg(sminus2,lseq2-VSIZE+line,line); sminus1 = insert_reg(sminus1,h,line); sleft= sminus1; } // printf("\n"); // printf("fhseq = "); printreg(fhseq); // printf("fvseq = "); printreg(fvseq); // printf("----------------------------------------------------------------\n"); // printf("match = "); printreg(match); (column)->data.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(current,VSIZE-1); LSHIFT_SCORE(minus1) minus1=insert_reg(minus1,(column)->data.CMENB[line],0); top=minus1; current = GET_MAX(current,minus1); if (lpath) { (column)->score.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(scurrent,VSIZE-1); LSHIFT_SCORE(sminus1) sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0); stop=sminus1; sdiag=sminus2; way = EQUAL_REG(current,minus1); scurrent= OR_REG(AND_REG(way,sminus1), ANDNOT_REG(way,scurrent)); } diag=minus2; current = GET_MAX(current,ADD_REG(minus2,match)); if (lpath) { way = EQUAL_REG(SUB_REG(current,match),diag); scurrent= OR_REG(AND_REG(way,sdiag), ANDNOT_REG(way,maxvect)); way = EQUAL_REG(current,left); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft), ANDNOT_REG(way,maxvect))); way = EQUAL_REG(current,top); scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop), ANDNOT_REG(way,maxvect))); scurrent= ADD_REG(scurrent,onevect); sminus2=sminus1; sminus1=scurrent; } // printf("currt = "); printreg(current); minus2=minus1; minus1=current; // printf("\n"); // printf("sdiag : "); // printreg(sminus2); // printf("scur : "); // printreg(scurrent); // printf("current: "); // printreg(current); // printf("%8s\n",seq1); // printf("%8s\n",seq2); // printf("Je stocke line= %d la valeur %d\n",lseq2-VSIZE+line,(column)->data.CMENB[lseq2-VSIZE+line]); } } // printf("\n"); // printf("line = %d, h= %d, lastband = %d\n",line,h,lastband); // printf("currt = "); printreg(current); lcs = extract_reg(current,lastband); if(lpath) *lpath= extract_reg(scurrent,lastband); // printf("lastband = %d (%d) lcs = %d\n",lastband,lseq2,lcs); if (ppcolumn) *ppcolumn=column; else freeColumn(column); return lcs; } #else int FASTLCSSCORE(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath) { return simpleLCS(seq1,seq2,ppcolumn,lpath); } #endif /* __SSE2__ */ sumaclust_v1.0.35/sumalibs/liblcs/banded_LCS_alignment.h000755 000765 000024 00000000351 13446627177 025300 0ustar00celinemercierstaff000000 000000 /* * banded_LCS_alignment.h * * Created on: november 8, 2012 * Author: mercier */ double banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, double threshold, BOOL n, int ref, BOOL lcsmode, int16_t* address); sumaclust_v1.0.35/sumalibs/liblcs/_lcs.ext.3.c000755 000765 000024 00000001361 13446627177 023201 0ustar00celinemercierstaff000000 000000 #include "_lcs.h" #include #include #include #include #define VSIZE (16) #define VTYPE vInt8 #define STYPE int8_t #define CMENB byte #define VMODE true #define FASTLCSSCORE fastLCSScore8 #define INSERT_REG _MM_INSERT_EPI8 #define EXTRACT_REG _MM_EXTRACT_EPI8 #define EQUAL_REG _MM_CMPEQ_EPI8 #define GREATER_REG _MM_CMPGT_EPI8 #define SMALLER_REG _MM_CMPLT_EPI8 #define ADD_REG _MM_ADD_EPI8 #define SUB_REG _MM_SUB_EPI8 #define AND_REG _MM_AND_SI128 #define ANDNOT_REG _MM_ANDNOT_SI128 #define OR_REG _MM_OR_SI128 #define SET_CONST _MM_SET1_EPI8 #define GET_MAX _MM_MAX_EPI8 #define GET_MIN _MM_MIN_EPI8 #define MIN_SCORE INT8_MIN #define MAX_SCORE 127 #include "_lcs_fast.h" sumaclust_v1.0.35/sumalibs/liblcs/sse_banded_LCS_alignment.c000755 000765 000024 00000046433 13446627177 026160 0ustar00celinemercierstaff000000 000000 /* * sse_banded_LCS_alignment.c * * Created on: 7 nov. 2012 * Author: celine mercier */ #include #include #include #include #include "../libutils/utilities.h" #include "../libsse/_sse.h" /*static void printreg(__m128i r) { int16_t a0,a1,a2,a3,a4,a5,a6,a7; a0= _MM_EXTRACT_EPI16(r,0); a1= _MM_EXTRACT_EPI16(r,1); a2= _MM_EXTRACT_EPI16(r,2); a3= _MM_EXTRACT_EPI16(r,3); a4= _MM_EXTRACT_EPI16(r,4); a5= _MM_EXTRACT_EPI16(r,5); a6= _MM_EXTRACT_EPI16(r,6); a7= _MM_EXTRACT_EPI16(r,7); fprintf(stderr, "a00 :-> %7d %7d %7d %7d " " %7d %7d %7d %7d " "\n" , a0,a1,a2,a3,a4,a5,a6,a7 ); } */ static inline int extract_reg(__m128i r, int p) { switch (p) { case 0: return(_MM_EXTRACT_EPI16(r,0)); case 1: return(_MM_EXTRACT_EPI16(r,1)); case 2: return(_MM_EXTRACT_EPI16(r,2)); case 3: return(_MM_EXTRACT_EPI16(r,3)); case 4: return(_MM_EXTRACT_EPI16(r,4)); case 5: return(_MM_EXTRACT_EPI16(r,5)); case 6: return(_MM_EXTRACT_EPI16(r,6)); case 7: return(_MM_EXTRACT_EPI16(r,7)); } return(0); } void sse_banded_align_lcs_and_ali_len(int16_t* seq1, int16_t* seq2, int l1, int l2, int bandLengthLeft, int bandLengthTotal, int16_t* address, double* lcs_length, int* ali_length) { register int j; int k1, k2; int max, diff; int l_reg, l_loc; int line; int numberOfRegistersPerLine; int numberOfRegistersFor3Lines; BOOL even_line; BOOL odd_line; BOOL even_BLL; BOOL odd_BLL; um128* SSEregisters; um128* p_diag; um128* p_gap1; um128* p_gap2; um128* p_diag_j; um128* p_gap1_j; um128* p_gap2_j; um128 current; um128* l_ali_SSEregisters; um128* p_l_ali_diag; um128* p_l_ali_gap1; um128* p_l_ali_gap2; um128* p_l_ali_diag_j; um128* p_l_ali_gap1_j; um128* p_l_ali_gap2_j; um128 l_ali_current; um128 nucs1; um128 nucs2; um128 scores; um128 boolean_reg; // Initialisations odd_BLL = bandLengthLeft & 1; even_BLL = !odd_BLL; max = INT16_MAX - l1; numberOfRegistersPerLine = bandLengthTotal / 8; numberOfRegistersFor3Lines = 3 * numberOfRegistersPerLine; SSEregisters = (um128*) calloc(numberOfRegistersFor3Lines * 2, sizeof(um128)); l_ali_SSEregisters = SSEregisters + numberOfRegistersFor3Lines; // preparer registres SSE for (j=0; ji, scores.i); // Computing alignment length l_ali_current.i = p_l_ali_diag_j->i; boolean_reg.i = _MM_CMPGT_EPI16(p_gap1_j->i, current.i); l_ali_current.i = _MM_OR_SI128( _MM_AND_SI128(p_l_ali_gap1_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i)); current.i = _MM_OR_SI128( _MM_AND_SI128(p_gap1_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, current.i)); boolean_reg.i = _MM_AND_SI128( _MM_CMPEQ_EPI16(p_gap1_j->i, current.i), _MM_CMPLT_EPI16(p_l_ali_gap1_j->i, l_ali_current.i)); l_ali_current.i = _MM_OR_SI128( _MM_AND_SI128(p_l_ali_gap1_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i)); current.i = _MM_OR_SI128( _MM_AND_SI128(p_gap1_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, current.i)); boolean_reg.i = _MM_CMPGT_EPI16(p_gap2_j->i, current.i); l_ali_current.i = _MM_OR_SI128( _MM_AND_SI128(p_l_ali_gap2_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i)); current.i = _MM_OR_SI128( _MM_AND_SI128(p_gap2_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, current.i)); boolean_reg.i = _MM_AND_SI128( _MM_CMPEQ_EPI16(p_gap2_j->i, current.i), _MM_CMPLT_EPI16(p_l_ali_gap2_j->i, l_ali_current.i)); l_ali_current.i = _MM_OR_SI128( _MM_AND_SI128(p_l_ali_gap2_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i)); current.i = _MM_OR_SI128( _MM_AND_SI128(p_gap2_j->i, boolean_reg.i), _MM_ANDNOT_SI128(boolean_reg.i, current.i)); /* fprintf(stderr, "\nline = %d", line); fprintf(stderr, "\nDiag, r %d : ", j); printreg((*(p_diag_j)).i); fprintf(stderr, "Gap1 : "); printreg((*(p_gap1_j)).i); fprintf(stderr, "Gap2 : "); printreg((*(p_gap2_j)).i); fprintf(stderr, "current : "); printreg(current.i); fprintf(stderr, "L ALI\nDiag r %d : ", j); printreg((*(p_l_ali_diag_j)).i); fprintf(stderr, "Gap1 : "); printreg((*(p_l_ali_gap1_j)).i); fprintf(stderr, "Gap2 : "); printreg((*(p_l_ali_gap2_j)).i); fprintf(stderr, "current : "); printreg(l_ali_current.i); */ // diag = gap1 and gap1 = current p_diag_j->i = p_gap1_j->i; p_gap1_j->i = current.i; // l_ali_diag = l_ali_gap1 and l_ali_gap1 = l_ali_current+1 p_l_ali_diag_j->i = p_l_ali_gap1_j->i; p_l_ali_gap1_j->i = _MM_ADD_EPI16(l_ali_current.i, _MM_SET1_EPI16(1)); } // shifts for gap2, to do only once all the registers of a line have been computed Copier gap2 puis le charger depuis la copie? for (j=0; j < numberOfRegistersPerLine; j++) { if ((odd_line && even_BLL) || (even_line && odd_BLL)) { p_gap2[j].i = _MM_LOADU_SI128((p_gap1[j].s16)-1); p_l_ali_gap2[j].i = _MM_LOADU_SI128((p_l_ali_gap1[j].s16)-1); if (j == 0) { p_gap2[j].i = _MM_INSERT_EPI16(p_gap2[j].i, 0, 0); p_l_ali_gap2[j].i = _MM_INSERT_EPI16(p_l_ali_gap2[j].i, max, 0); } } else { p_gap2[j].i = _MM_LOADU_SI128(p_gap1[j].s16+1); p_l_ali_gap2[j].i = _MM_LOADU_SI128(p_l_ali_gap1[j].s16+1); if (j == numberOfRegistersPerLine - 1) { p_gap2[j].i = _MM_INSERT_EPI16(p_gap2[j].i, 0, 7); p_l_ali_gap2[j].i = _MM_INSERT_EPI16(p_l_ali_gap2[j].i, max, 7); } } } // end shifts for gap2 } /* /// Recovering LCS and alignment lengths \\\ */ // finding the location of the results in the registers : diff = l1-l2; if ((diff & 1) && odd_BLL) l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - floor((double)(diff) / (double)2); else l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - ceil((double)(diff) / (double)2); l_reg = (int)floor((double)l_loc/(double)8.0); //fprintf(stderr, "\nl_reg = %d, l_loc = %d\n", l_reg, l_loc); l_loc = l_loc - l_reg*8; // extracting the results from the registers : *lcs_length = extract_reg(p_gap1[l_reg].i, l_loc); *ali_length = extract_reg(p_l_ali_gap1[l_reg].i, l_loc) - 1; // freeing the registers free(SSEregisters); } double sse_banded_align_just_lcs(int16_t* seq1, int16_t* seq2, int l1, int l2, int bandLengthLeft, int bandLengthTotal) { register int j; int k1, k2; int diff; int l_reg, l_loc; int16_t l_lcs; int line; int numberOfRegistersPerLine; int numberOfRegistersFor3Lines; BOOL even_line; BOOL odd_line; BOOL even_BLL; BOOL odd_BLL; um128* SSEregisters; um128* p_diag; um128* p_gap1; um128* p_gap2; um128* p_diag_j; um128* p_gap1_j; um128* p_gap2_j; um128 current; um128 nucs1; um128 nucs2; um128 scores; // Initialisations odd_BLL = bandLengthLeft & 1; even_BLL = !odd_BLL; numberOfRegistersPerLine = bandLengthTotal / 8; numberOfRegistersFor3Lines = 3 * numberOfRegistersPerLine; SSEregisters = malloc(numberOfRegistersFor3Lines * sizeof(um128)); // preparer registres SSE for (j=0; j 0) { if (normalize) { if (reference == MINLEN) LCSmin = threshold*l2; else // ref = maxlen or alilen LCSmin = threshold*l1; } else if (lcsmode) LCSmin = threshold; else if ((reference == MINLEN)) // not lcsmode LCSmin = l2 - threshold; else // not lcsmode and ref = maxlen or alilen LCSmin = l1 - threshold; } else LCSmin = 0; return(LCSmin); } int calculateSSEBandLength(int bandLengthRight, int bandLengthLeft) { // *bandLengthTotal= (double) floor(bandLengthRight + bandLengthLeft) / 2.0 + 1; int bandLengthTotal= (double)(bandLengthRight + bandLengthLeft) / 2.0 + 1.0; return (bandLengthTotal & (~ (int)7)) + (( bandLengthTotal & (int)7) ? 8:0); // Calcule le multiple de 8 superieur } int calculateSizeToAllocate(int maxLen, int minLen, int LCSmin) { int size; int notUsed; calculateBandLengths(maxLen, minLen, ¬Used, &size, LCSmin); // max size = max left band length * 2 if (!size) // Happens if there is no threshold (threshold is 100% similarity) and generates bugs if left to 0 size = 1; //fprintf(stderr, "\nsize for address before %8 = %d", size); size*= 2; size = (size & (~ (int)7)) + (( size & (int)7) ? 8:0); // Calcule le multiple de 8 superieur size*= 3; size+= 16; //fprintf(stderr, "\nsize for address = %d", size); return(size*sizeof(int16_t)); } void iniSeq(int16_t* seq, int size, int16_t iniValue) { int16_t *target=seq; int16_t *end = target + (size_t)size; for (; target < end; target++) *target = iniValue; } void putSeqInSeq(int16_t* seq, char* s, int l, BOOL reverse) { int16_t *target=seq; int16_t *end = target + (size_t)l; char *source=s; if (reverse) for (source=s + (size_t)l-1; target < end; target++, source--) *target=*source; else for (; target < end; source++,target++) *target=*source; } void initializeAddressWithGaps(int16_t* address, int bandLengthTotal, int bandLengthLeft, int l1) { int i; int address_00, x_address_10, address_01, address_01_shifted; int numberOfRegistersPerLine; int bm; int value=INT16_MAX-l1; numberOfRegistersPerLine = bandLengthTotal / 8; bm = bandLengthLeft%2; for (i=0; i < (3*numberOfRegistersPerLine*8); i++) address[i] = value; // 0,0 set to 1 and 0,1 and 1,0 set to 2 address_00 = bandLengthLeft / 2; x_address_10 = address_00 + bm - 1; address_01 = numberOfRegistersPerLine*8 + x_address_10; address_01_shifted = numberOfRegistersPerLine*16 + address_00 - bm; // fill address_00, address_01,+1, address_01_shifted,+1 address[address_00] = 1; address[address_01] = 2; address[address_01+1] = 2; address[address_01_shifted] = 2; address[address_01_shifted+1] = 2; } double sse_banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int LCSmin) { double id; int bandLengthRight, bandLengthLeft, bandLengthTotal; int ali_length; //fprintf(stderr, "\nl1 = %d, l2 = %d\n", l1, l2); calculateBandLengths(l1, l2, &bandLengthRight, &bandLengthLeft, LCSmin); //fprintf(stderr, "\nBLL = %d, BLR = %d, LCSmin = %d\n", bandLengthLeft, bandLengthRight, LCSmin); bandLengthTotal = calculateSSEBandLength(bandLengthRight, bandLengthLeft); //fprintf(stderr, "\nBLT = %d\n", bandLengthTotal); if ((reference == ALILEN) && (normalize || !lcsmode)) { initializeAddressWithGaps(address, bandLengthTotal, bandLengthLeft, l1); sse_banded_align_lcs_and_ali_len(seq1, seq2, l1, l2, bandLengthLeft, bandLengthTotal, address, &id, &ali_length); } else id = sse_banded_align_just_lcs(seq1, seq2, l1, l2, bandLengthLeft, bandLengthTotal); //fprintf(stderr, "\nid before normalizations = %f", id); //fprintf(stderr, "\nlcs = %f, ali = %d\n", id, ali_length); if (!lcsmode && !normalize) switch(reference) { case ALILEN: id = ali_length - id; break; case MAXLEN: id = l1 - id; break; case MINLEN: id = l2 - id; } //fprintf(stderr, "\n2>>> %f, %d\n", id, ali_length); if (normalize) switch(reference) { case ALILEN: id = id / (double) ali_length; break; case MAXLEN: id = id / (double) l1; break; case MINLEN: id = id / (double) l2; } //fprintf(stderr, "\nid = %f\n", id); return(id); } double generic_sse_banded_lcs_align(char* seq1, char* seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int* buffer_size, int16_t** iseq1, int16_t** iseq2, int* buffer_sizeS) { double id; int l1; int l2; int lmax, lmin; int sizeToAllocateForBand; int maxBLL, notUsed; int sizeToAllocateForSeqs; int LCSmin; l1 = strlen(seq1); l2 = strlen(seq2); if (l2 > l1) { lmax = l1; lmin = l2; } else { lmax = l2; lmin = l1; } if (!lcsmode && (normalize==TRUE)) { threshold = 1.0 - threshold; } LCSmin = calculateLCSmin(lmax, lmin, threshold, normalize, reference, lcsmode); // Allocating space for matrix band if the alignment must be computed if ((reference == ALILEN) && ((lcsmode && normalize) || (!lcsmode))) // checking if alignment must be computed { sizeToAllocateForBand = calculateSizeToAllocate(lmax, lmin, LCSmin); if (sizeToAllocateForBand > (*buffer_size)) { // reallocating if needed address = reallocA16Address(*address, sizeToAllocateForBand); } } // Allocating space for the int16_t arrays representing the sequences calculateBandLengths(lmax, lmin, ¬Used, &maxBLL, LCSmin); sizeToAllocateForSeqs = 2*maxBLL+lmax; if (sizeToAllocateForSeqs > *buffer_sizeS) { (*(iseq1)) = realloc((*(iseq1)), sizeToAllocateForSeqs*sizeof(int16_t)); (*(iseq2)) = realloc((*(iseq2)), sizeToAllocateForSeqs*sizeof(int16_t)); } iniSeq(*(iseq1), maxBLL, 0); iniSeq(*(iseq2), maxBLL, 255); *(iseq1) = *(iseq1)+maxBLL; *(iseq2) = *(iseq2)+maxBLL; // longest seq must be first argument of sse_align function if (l2 > l1) { putSeqInSeq((*(iseq1)), seq2, l2, TRUE); putSeqInSeq((*(iseq2)), seq1, l1, FALSE); id = sse_banded_lcs_align(*(iseq1), *(iseq2), l2, l1, normalize, reference, lcsmode, *address, LCSmin); } else { putSeqInSeq((*(iseq1)), seq1, l1, TRUE); putSeqInSeq((*(iseq2)), seq2, l2, FALSE); id = sse_banded_lcs_align(*(iseq1), *(iseq2), l1, l2, normalize, reference, lcsmode, *address, LCSmin); } return(id); } int prepareTablesForSumathings(int lmax, int lmin, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int16_t** iseq1, int16_t** iseq2) { int sizeToAllocateForBand; int maxBLL; int notUsed; int sizeToAllocateForSeqs; int LCSmin; LCSmin = calculateLCSmin(lmax, lmin, threshold, normalize, reference, lcsmode); // Allocating space for matrix band if the alignment must be computed if ((reference == ALILEN) && (normalize || !lcsmode)) // checking if alignment must be computed { sizeToAllocateForBand = calculateSizeToAllocate(lmax, lmin, LCSmin); (*(address)) = getA16Address(sizeToAllocateForBand); } // Allocating space for the int16_t arrays representing the sequences calculateBandLengths(lmax, lmin, ¬Used, &maxBLL, LCSmin); sizeToAllocateForSeqs = 2*maxBLL+lmax; (*(iseq1)) = malloc(sizeToAllocateForSeqs*sizeof(int16_t)); (*(iseq2)) = malloc(sizeToAllocateForSeqs*sizeof(int16_t)); iniSeq(*(iseq1), maxBLL, 0); iniSeq(*(iseq2), maxBLL, 255); *(iseq1) = *(iseq1)+maxBLL; *(iseq2) = *(iseq2)+maxBLL; return(maxBLL+lmax); } double alignForSumathings(char* seq1, int16_t* iseq1, char* seq2, int16_t* iseq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int sizeForSeqs, int LCSmin) { double id; iniSeq(iseq1, sizeForSeqs, 0); iniSeq(iseq2, sizeForSeqs, 255); if (l2 > l1) { putSeqInSeq(iseq1, seq2, l2, TRUE); putSeqInSeq(iseq2, seq1, l1, FALSE); id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, lcsmode, address, LCSmin); } else { putSeqInSeq(iseq1, seq1, l1, TRUE); putSeqInSeq(iseq2, seq2, l2, FALSE); id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, lcsmode, address, LCSmin); } return(id); } sumaclust_v1.0.35/sumalibs/liblcs/_lcs.ext.2.c000755 000765 000024 00000001401 13446627177 023173 0ustar00celinemercierstaff000000 000000 #include "_lcs.h" #include #include #include #include #define VSIZE (8) #define VTYPE vInt16 #define STYPE int16_t #define CMENB shrt #define VMODE false #define FASTLCSSCORE fastLCSScore16 #define INSERT_REG _MM_INSERT_EPI16 #define EXTRACT_REG _MM_EXTRACT_EPI16 #define EQUAL_REG _MM_CMPEQ_EPI16 #define GREATER_REG _MM_CMPGT_EPI16 #define SMALLER_REG _MM_CMPLT_EPI16 #define ADD_REG _MM_ADD_EPI16 #define SUB_REG _MM_SUB_EPI16 #define AND_REG _MM_AND_SI128 #define ANDNOT_REG _MM_ANDNOT_SI128 #define OR_REG _MM_OR_SI128 #define SET_CONST _MM_SET1_EPI16 #define GET_MAX _MM_MAX_EPI16 #define GET_MIN _MM_MIN_EPI16 #define MIN_SCORE INT16_MIN #define MAX_SCORE 32000 #include "_lcs_fast.h" sumaclust_v1.0.35/sumalibs/liblcs/upperband.c000755 000765 000024 00000022121 13446627177 023276 0ustar00celinemercierstaff000000 000000 #include "../libsse/_sse.h" #include #include #include "../libutils/utilities.h" #include "../libfasta/sequence.h" #include "sse_banded_LCS_alignment.h" inline static uchar_v hash4m128(uchar_v frag) { uchar_v words; vUInt8 mask_03= _MM_SET1_EPI8(0x03); // charge le registre avec 16x le meme octet vUInt8 mask_FC= _MM_SET1_EPI8(0xFC); frag.m = _MM_SRLI_EPI64(frag.m,1); // shift logic a droite sur 2 x 64 bits frag.m = _MM_AND_SI128(frag.m,mask_03); // and sur les 128 bits words.m= _MM_SLLI_EPI64(frag.m,2); words.m= _MM_AND_SI128(words.m,mask_FC); frag.m = _MM_SRLI_SI128(frag.m,1); words.m= _MM_OR_SI128(words.m,frag.m); words.m= _MM_SLLI_EPI64(words.m,2); words.m= _MM_AND_SI128(words.m,mask_FC); frag.m = _MM_SRLI_SI128(frag.m,1); words.m= _MM_OR_SI128(words.m,frag.m); words.m= _MM_SLLI_EPI64(words.m,2); words.m= _MM_AND_SI128(words.m,mask_FC); frag.m = _MM_SRLI_SI128(frag.m,1); words.m= _MM_OR_SI128(words.m,frag.m); return words; } #ifdef __SSE2__ inline static int anyzerom128(vUInt8 data) { vUInt8 mask_00= _MM_SETZERO_SI128(); uint64_v tmp; tmp.m = _MM_CMPEQ_EPI8(data,mask_00); return (int)(tmp.c[0]!=0 || tmp.c[1]!=0); } #else inline static int anyzerom128(vUInt8 data) { int i; um128 tmp; tmp.i = data; for (i=0;i<8;i++) if (tmp.s8[i]==0) return 1; return 0; } #endif inline static void dumpm128(unsigned short *table,vUInt8 data) { memcpy(table,&data,16); } /** * Compute 4mer occurrence table from a DNA sequence * * sequence : a pointer to the null terminated nuc sequence * table : a pointer to a 256 cells unisgned char table for * storing the occurrence table * count : pointer to an int value used as a return value * containing the global word counted * * returns the number of words observed in the sequence with a * count greater than 255. */ int buildTable(const char* sequence, unsigned char *table, int *count) { int overflow = 0; int wc=0; int i; vUInt8 mask_00= _MM_SETZERO_SI128(); uchar_v frag; uchar_v words; uchar_v zero; char* s; s=(char*)sequence; memset(table,0,256*sizeof(unsigned char)); // encode ascii sequence with A : 00 C : 01 T: 10 G : 11 for(frag.m=_MM_LOADU_SI128((vUInt8*)s); ! anyzerom128(frag.m); s+=12,frag.m=_MM_LOADU_SI128((vUInt8*)s)) { words= hash4m128(frag); // printf("%d %d %d %d\n",words.c[0],words.c[1],words.c[2],words.c[3]); if (table[words.c[0]]<255) table[words.c[0]]++; else overflow++; if (table[words.c[1]]<255) table[words.c[1]]++; else overflow++; if (table[words.c[2]]<255) table[words.c[2]]++; else overflow++; if (table[words.c[3]]<255) table[words.c[3]]++; else overflow++; if (table[words.c[4]]<255) table[words.c[4]]++; else overflow++; if (table[words.c[5]]<255) table[words.c[5]]++; else overflow++; if (table[words.c[6]]<255) table[words.c[6]]++; else overflow++; if (table[words.c[7]]<255) table[words.c[7]]++; else overflow++; if (table[words.c[8]]<255) table[words.c[8]]++; else overflow++; if (table[words.c[9]]<255) table[words.c[9]]++; else overflow++; if (table[words.c[10]]<255) table[words.c[10]]++; else overflow++; if (table[words.c[11]]<255) table[words.c[11]]++; else overflow++; wc+=12; } zero.m=_MM_CMPEQ_EPI8(frag.m,mask_00); //printf("frag=%d %d %d %d\n",frag.c[0],frag.c[1],frag.c[2],frag.c[3]); //printf("zero=%d %d %d %d\n",zero.c[0],zero.c[1],zero.c[2],zero.c[3]); words = hash4m128(frag); if (zero.c[0]+zero.c[1]+zero.c[2]+zero.c[3]==0) for(i=0;zero.c[i+3]==0;i++,wc++) if (table[words.c[i]]<255) table[words.c[i]]++; else overflow++; if (count) *count=wc; return overflow; } static inline vUInt16 partialminsum(vUInt8 ft1,vUInt8 ft2) { vUInt8 mini; vUInt16 minilo; vUInt16 minihi; vUInt8 mask_00= _MM_SETZERO_SI128(); mini = _MM_MIN_EPU8(ft1,ft2); minilo = _MM_UNPACKLO_EPI8(mini,mask_00); minihi = _MM_UNPACKHI_EPI8(mini,mask_00); return _MM_ADDS_EPU16(minilo,minihi); } int compareTable(unsigned char *t1, int over1, unsigned char* t2, int over2) { vUInt8 ft1; vUInt8 ft2; vUInt8 *table1=(vUInt8*)t1; vUInt8 *table2=(vUInt8*)t2; ushort_v summini; int i; int total; ft1 = _MM_LOADU_SI128(table1); ft2 = _MM_LOADU_SI128(table2); summini.m = partialminsum(ft1,ft2); table1++; table2++; for (i=1;i<16;i++,table1++,table2++) { ft1 = _MM_LOADU_SI128(table1); ft2 = _MM_LOADU_SI128(table2); summini.m = _MM_ADDS_EPU16(summini.m,partialminsum(ft1,ft2)); } // Finishing the sum process summini.m = _MM_ADDS_EPU16(summini.m,_MM_SRLI_SI128(summini.m,8)); // sum the 4 firsts with the 4 lasts summini.m = _MM_ADDS_EPU16(summini.m,_MM_SRLI_SI128(summini.m,4)); total = summini.c[0]+summini.c[1]; total+= (over1 < over2) ? over1:over2; return total; } int threshold4(int wordcount,double identity) { int error; int lmax; wordcount+=3; error = (int)floor((double)wordcount * ((double)1.0-identity)); lmax = (wordcount - error) / (error + 1); if (lmax < 4) return 0; return (lmax - 3) \ * (error + 1) \ + ((wordcount - error) % (error + 1)); } int thresholdLCS4(int32_t reflen,int32_t lcs) { int nbfrag; int smin; int R; int common; nbfrag = (reflen - lcs)*2 + 1; smin = lcs/nbfrag; R = lcs - smin * nbfrag; common = MAX(smin - 2,0) * R + MAX(smin - 3,0) * (nbfrag - R); return common; } int hashDB(fastaSeqCount db) { int32_t i; int32_t count; fprintf(stderr,"Indexing dataset..."); for (i=0; i < db.count;i++) { db.fastaSeqs[i].table = util_malloc((256)*sizeof(unsigned char), __FILE__, __LINE__); db.fastaSeqs[i].over = buildTable((const char*)(db.fastaSeqs[i].sequence), db.fastaSeqs[i].table, &count); } fprintf(stderr," : Done\n"); return db.count; } BOOL isPossible(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode) { int32_t reflen; int32_t maxlen; int32_t lcs; int32_t mincount; if (seq1->length < 12 || seq2->length < 12) return TRUE; maxlen = MAX(seq1->length,seq2->length); if (reference==ALILEN || reference==MAXLEN) reflen = maxlen; else reflen = MIN(seq1->length,seq2->length); if (normalize) { if (! lcsmode) threshold = 1. - threshold; lcs = (int32_t)ceil((double)reflen * threshold); } else { if (! lcsmode) threshold = reflen - threshold; lcs = (int32_t) threshold; } if (lcs > MIN(seq1->length,seq2->length)) return FALSE; mincount = thresholdLCS4(maxlen,lcs); return compareTable(seq1->table,seq1->over,seq2->table,seq2->over) >=mincount; } BOOL isPossibleSumathings(fastaSeqPtr seq1, fastaSeqPtr seq2, int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode) { // optimized version of the filter for sumaclust and sumatra int32_t reflen; int32_t lcs; int32_t mincount; if (l1 < 12 || l2 < 12) return TRUE; if (reference==ALILEN || reference==MAXLEN) reflen = l1; else reflen = l2; if (normalize) lcs = (int32_t)ceil((double)reflen * threshold); else { if (! lcsmode) threshold = reflen - threshold; lcs = (int32_t) threshold; } mincount = thresholdLCS4(l1,lcs); return compareTable(seq1->table,seq1->over,seq2->table,seq2->over) >=mincount; } void filters(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin) { // score takes value -1 if filters are passed. score must be initialized in calling function. int l1; int l2; l1 = seq1->length; l2 = seq2->length; if (l1 >= l2) { *LCSmin = calculateLCSmin(l1, l2, threshold, normalize, reference, lcsmode); if (l2 >= *LCSmin) { if (isPossibleSumathings(seq1, seq2, l1, l2, threshold, normalize, reference, lcsmode)) // 4-mers filter *score = -1.0; } } else { *LCSmin = calculateLCSmin(l2, l1, threshold, normalize, reference, lcsmode); if (l1 >= *LCSmin) { if (isPossibleSumathings(seq2, seq1, l2, l1, threshold, normalize, reference, lcsmode)) // 4-mers filter *score = -1.0; } } } void filtersSumatra(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin) { // score takes value -2 if filters are not passed, -1 if filters are passed and >= 0 with max score if the 2 sequences are identical. int l1; int l2; l1 = seq1->length; *score = -2.0; if (strcmp(seq1->sequence, seq2->sequence) == 0) // the 2 sequences are identical { if (lcsmode && normalize) *score = 1.0; else if (!lcsmode) *score = 0.0; else *score = l1; } else if (threshold != 0) { l2 = seq2->length; if (l1 >= l2) { *LCSmin = calculateLCSmin(l1, l2, threshold, normalize, reference, lcsmode); if (l2 >= *LCSmin) { if (isPossibleSumathings(seq1, seq2, l1, l2, threshold, normalize, reference, lcsmode)) // 4-mers filter *score = -1.0; } } else { *LCSmin = calculateLCSmin(l2, l1, threshold, normalize, reference, lcsmode); if (l1 >= *LCSmin) { if (isPossibleSumathings(seq2, seq1, l2, l1, threshold, normalize, reference, lcsmode)) // 4-mers filter *score = -1.0; } } } else *LCSmin = 0; } sumaclust_v1.0.35/sumalibs/liblcs/_lcs.ext.1.c000755 000765 000024 00000005520 13446627177 023200 0ustar00celinemercierstaff000000 000000 #include "_lcs.h" #include #include #include #include // Allocate a band allowing to align sequences of length : 'length' column_t* allocateColumn(int length,column_t *column, bool mode8bits) { int size; bool newc = false; // The band length should be equal to the length // of the sequence + 7 for taking into account its // shape size = (length+1) * ((mode8bits) ? sizeof(int8_t):sizeof(int16_t)); // If the pointer to the old column is NULL we allocate // a new column if (column==NULL) { column = malloc(sizeof(column_t)); if (!column) return NULL; column->size = 0; column->data.shrt=NULL; column->score.shrt=NULL; newc = true; } // Otherwise we check if its size is sufficient // or if it should be extended if (size > column->size) { int16_t *old = column->data.shrt; int16_t *olds= column->score.shrt; column->data.shrt = malloc(size); column->score.shrt= malloc(size); if (column->data.shrt==NULL || column->score.shrt==NULL) { fprintf(stderr,"Allocation Error on column for a size of %d\n" , size); column->data.shrt = old; column->score.shrt= olds; if (newc) { free(column); column=NULL; return NULL; } return NULL; } else column->size = size; } return column; } void freeColumn(column_p column) { if (column) { if (column->data.shrt) free(column->data.shrt); if (column->score.shrt) free(column->score.shrt); free(column); } } int fastLCSScore(const char* seq1, const char* seq2,column_pp column,int32_t* lpath) { return fastLCSScore16(seq1,seq2,column,lpath); } int simpleLCS(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath) { int lseq1,lseq2; // length of the both sequences int lcs; int itmp; // tmp variables for swap const char* stmp; // int32_t *score; int32_t *path; column_t *column; int32_t i,j; int32_t sl,su,sd; int32_t pl,pu,pd; // Made seq1 the longest sequences lseq1=strlen(seq1); lseq2=strlen(seq2); if (lseq1 < lseq2) { itmp=lseq1; lseq1=lseq2; lseq2=itmp; stmp=seq1; seq1=seq2; seq2=stmp; } lseq1++; lseq2++; // a band sized to the smallest sequence is allocated if (ppcolumn) column = *ppcolumn; else column=NULL; column = allocateColumn(lseq1*2,column,0); score = (int32_t*) column->score.shrt; path = (int32_t*) column->data.shrt; memset(score,0,lseq1 * sizeof(int32_t)); for (j=0; j < lseq1; j++) path[j]=j; for (i=1; i< lseq2; i++) { sl=0; pl=i; for (j=1; j < lseq1; j++) { sd=score[j-1] + (seq2[i-1]==seq1[j-1] ? 1:0); pd=path[j-1] + 1; su=score[j]; pu=path[j] + 1; score[j-1]=sl; if (su > sl) sl=su, pl=pu; if (sd > sl) sl=sd, pl=pd; } } lcs = sl; if(lpath) *lpath=pl; if (ppcolumn) *ppcolumn=column; else freeColumn(column); return lcs; } sumaclust_v1.0.35/sumalibs/liblcs/_lcs.h000755 000765 000024 00000001345 13446627177 022250 0ustar00celinemercierstaff000000 000000 #include "../libsse/_sse.h" #define bool char #define false (1==0) #define true (1==1) typedef struct { int16_t size; union { int16_t *shrt; int8_t *byte; } data; union { int16_t *shrt; int8_t *byte; } score; } column_t, **column_pp, *column_p; column_p allocateColumn(int length,column_t *column, bool mode8bits); void freeColumn(column_p column); int fastLCSScore16(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath); int fastLCSScore8(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath); int simpleLCS(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath); int fastLCSScore(const char* seq1, const char* seq2,column_pp column,int32_t* lpath); sumaclust_v1.0.35/sumalibs/liblcs/banded_LCS_alignment.c000755 000765 000024 00000010750 13446627177 025277 0ustar00celinemercierstaff000000 000000 /* * banded_LCS_alignment.c * * Created on: 7 nov. 2012 * Author: merciece */ #include #include #include #include "../libutils/utilities.h" typedef struct { int score; int l_path; }infos; int calculateScore(char nuc1, char nuc2) { return(nuc1 == nuc2); } infos** banded_align(char *seq1, char *seq2, int l1, int l2, int bandLengthRight, int bandLengthLeft) { int i, j; //int c; //double id; int start, end; int diag_score, delete, insert, mismatch; int l_path, l_path_i, l_path_d; int bestScore; int mismatch_margin; int stop; int diag_index; infos **matrix; l1++; l2++; mismatch_margin = bandLengthLeft; // the biggest one diag_index = l1-l2; // diagonal index stop=0; //fprintf(stderr,"\nseq1 = %s, seq2=%s, bandLengthR = %d, bandLengthL = %d", seq1, seq2, bandLengthRight, bandLengthLeft); // Matrix initialization~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ matrix = (infos**) malloc(l1 * sizeof(infos*)); for (i = 0; i < l1; i++) matrix[i] = (infos*) malloc(l2 * sizeof(infos)); for (i = 0; i < l1; i++) for (j = 0; j < l2; j++) { matrix[i][j].score = 0; matrix[i][j].l_path = 0; } for (i = 0; i < l1; i++) matrix[i][0].l_path = i; for (j = 0; j < l2; j++) matrix[0][j].l_path = j; // Matrix initialized~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for (i = 1; i < l1; i++) { start = i - bandLengthLeft; if (start < 1) start = 1; end = i+bandLengthRight+1; if (end > l2) end = l2; for (j = start; j < end; j++) { delete = matrix[i-1][j].score; l_path_d = matrix[i-1][j].l_path + 1; insert = matrix[i][j-1].score; l_path_i = matrix[i][j-1].l_path + 1; mismatch = 0; diag_score = calculateScore(seq1[i-1], seq2[j-1]); bestScore = matrix[i-1][j-1].score + diag_score; l_path = matrix[i-1][j-1].l_path + 1; if (diag_score == 0) // mismatch mismatch = 1; if ((insert > bestScore) || ((insert == bestScore) && (l_path_i < l_path))) { bestScore = matrix[i][j-1].score; l_path = l_path_i; mismatch = 0; } if ((delete > bestScore) || ((delete == bestScore) && (l_path_d < l_path))) { bestScore = delete; l_path = l_path_d; mismatch = 0; } /*if (((i-j) - diag_index == 0) && (mismatch == 1)) { //fprintf(stderr, "\nR = %d, L = %d\n", bandLengthRight, bandLengthLeft); if (bandLengthRight+bandLengthLeft == 0) { stop = 1; //fprintf(stderr, "\nBREAKING LOOPS\n"); break; } if (bandLengthRight != 0) bandLengthRight = bandLengthRight - 1; if (bandLengthLeft != 0) bandLengthLeft = bandLengthLeft - 1; }*/ (matrix[i][j]).score = bestScore; (matrix[i][j]).l_path = l_path; } //if ((bandLengthRight + bandLengthLeft == 0) && ((matrix[i][j].l_path - matrix[i][j].score) > mismatch_margin)) if (stop==1) break; } return(matrix); } void calculateBandLength(int l1, int l2, double threshold, int* bandLengthRight, int* bandLengthLeft) { (*bandLengthLeft) = round(-l1 * threshold + l1); (*bandLengthRight) = round(-l1 * threshold + l2); // fprintf(stderr,"\nR=%d, L=%d", (*bandLengthRight), (*bandLengthLeft)); } double calculateId(infos** matrix, int len1, int len2) { double id; int l_ali; int l_lcs; l_lcs = matrix[len1][len2].score; l_ali = matrix[len1][len2].l_path; if (l_lcs == 0) id = 0.0; else id = (double) l_lcs / (double) l_ali; //fprintf(stderr, "\n%d, %d\n", l_lcs, l_ali); return(id); } double banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, double threshold, BOOL n, int ref, BOOL lcsmode, int16_t* address) { double id; int bandLengthRight, bandLengthLeft; int i,j; char* s1; char* s2; s1 = (char*) malloc(l1*sizeof(char)+1); s2 = (char*) malloc(l2*sizeof(char)+1); for (i=l1-1, j=0; i>=0, j double sse_banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int LCSmin); int calculateSizeToAllocate(int maxLen, int minLen, int LCSmin); void calculateThresholdFromErrorNumber(int error, int length, double* threshold); void iniSeq(int16_t* seq, int size, int16_t iniValue); void putSeqInSeq(int16_t* seq, char* s, int l, BOOL reverse); double generic_sse_banded_lcs_align(char* seq1, char* seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int* buffer_size, int16_t** iseq1, int16_t** iseq2, int* buffer_sizeS); int prepareTablesForSumathings(int lmax, int lmin, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int16_t** iseq1, int16_t** iseq2); double alignForSumathings(char* seq1, int16_t* iseq1, char* seq2, int16_t* iseq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int sizeForSeqs, int LCSmin); int calculateLCSmin(int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode); #endif sumaclust_v1.0.35/sumalibs/libfasta/fasta_seq_writer.h000755 000765 000024 00000000556 13446627177 025212 0ustar00celinemercierstaff000000 000000 #ifndef FASTA_SEQ_WRITER_H_ #define FASTA_SEQ_WRITER_H_ #include "sequence.h" void printOnlySeqFromFastaSeqPtr(fastaSeqPtr, FILE*); void printOnlySeqFromChar(char*, FILE*); void printOnlyHeaderFromFastaSeqPtr(fastaSeqPtr, FILE*); void printOnlyHeaderFromTable(element_from_header*, FILE*); void printHeaderAndSeqFromFastaSeqPtr(fastaSeqPtr, FILE*); #endif sumaclust_v1.0.35/sumalibs/libfasta/header_mem_handler.c000755 000765 000024 00000004331 13446627177 025421 0ustar00celinemercierstaff000000 000000 #include #include #include "header_mem_handler.h" #include #define FIELD_BUFFER 1024 char* malloc_field(int *free_size) { char* field = (char*) malloc(sizeof(char) * FIELD_BUFFER); field[0] = 0; (*free_size) = FIELD_BUFFER; return field; } int check_mem_field(int size_needed) { int number_of_chunks_to_alloc; number_of_chunks_to_alloc = size_needed / FIELD_BUFFER + 1; return number_of_chunks_to_alloc; } char* realloc_field(int number_of_chunks_to_alloc, char* field) { int size_needed; size_needed = number_of_chunks_to_alloc * FIELD_BUFFER; field = realloc(field, (size_needed)*sizeof(char)); return field; } char* check_and_realloc_field(char* field, int size_needed, int* free_size) { size_needed = size_needed + strlen(field); int number_of_chunks_to_alloc = check_mem_field(size_needed); if (strlen(field)>0) field = realloc_field(number_of_chunks_to_alloc, field); else { free(field); field = malloc(number_of_chunks_to_alloc * FIELD_BUFFER); } (*free_size) = number_of_chunks_to_alloc*FIELD_BUFFER - size_needed + 1; return field; } char* store_in_field(char* field, char* yytext, int* free_size, int* i) { int size_needed; size_needed = strlen(yytext)+1; if (size_needed > (*free_size)) field = check_and_realloc_field(field, size_needed, free_size); else (*free_size) = (*free_size) - size_needed + 1; strcpy(&(field[(*i)]),yytext); (*i) = (*i)+size_needed-1; return field; } char* store_in_header_table(char* field, char** storing_place, int* free_size, int* i) { int size_needed; size_needed = strlen(field)+1; *storing_place = (char*) malloc(size_needed*sizeof(char)); strcpy(*storing_place,field); (*i)=0; free(field); field = malloc_field(free_size); return field; } element_from_header** check_and_realloc_mem_in_header_table(element_from_header** p_header, int* nbf, int* memory_allocated) { (*nbf)++; if (*nbf == *memory_allocated) { (*memory_allocated)++; *p_header = (element_from_header*) realloc(*p_header, (*memory_allocated) * sizeof(element_from_header)); } return p_header; } void end_header_table(element_from_header** p_header, int nbf) { nbf = nbf - 1; //fprintf(stderr, "nbf = %d", nbf); sprintf((*p_header)->value, "%d", nbf); } sumaclust_v1.0.35/sumalibs/libfasta/sequence.c000755 000765 000024 00000023153 13446627177 023451 0ustar00celinemercierstaff000000 000000 /** * FileName: sequence.c * Authors: Tiayyba Riaz, Celine Mercier * Description: C file for sequence reading and parsing * **/ #include #include #include #include #include "../libutils/utilities.h" #include "sequence.h" #include "../libfile/fileHandling.h" #include "fasta_header_handler.h" #include "fasta_header_parser.h" /* * Function Name: seq_getNext(FILE *fp, char *fieldDelim) * Description: Gets the next sequence from file by calling another function, passes the sequence * to other function to get the header elements and nucleotide suquence into a strcuture of * type fastaSeq and returns a pointer to this newly populated structure. */ fastaSeqPtr seq_getNext(FILE *fp, char *fieldDelim, BOOL isStandardSeq, BOOL onlyATGC) { char *seq; char *header; char *strTemp; fastaSeqPtr seqElem; int seqLen; seq = seq_readNextFromFilebyLine(fp); if (seq == NULL) return NULL; /* Find header separator \n, if not found return NULL */ strTemp = strchr(seq, '\n'); if(strTemp == NULL) return NULL; seqLen = strlen(strTemp); header = (char*) util_malloc(1+(strlen(seq) - seqLen)*sizeof(char), __FILE__, __LINE__); /* Separate header in header variable */ strncpy(header, seq, strTemp - seq); header[strTemp - seq] = '\0'; /* Get memory for new sequence structure element */ seqElem = (fastaSeqPtr) util_malloc(sizeof(fastaSeq), __FILE__, __LINE__); /* Parse header and assign values to structure fields */ seq_fillHeader(header, fieldDelim, seqElem); /* Get clean sequence and assign to structure field */ if (isStandardSeq) if (onlyATGC) seq_fillSeqOnlyATGC(strTemp, seqElem, seqLen); else seq_fillSeq(strTemp, seqElem, seqLen); else seq_fillDigitSeq(strTemp, seqElem, seqLen); /* Type cast the char * seq to void pointer and deallocate the memory pointed by this */ util_free((void *)seq); /* Return new sequence structure element */ return seqElem; } char *seq_readNextFromFilebyLine(FILE* fp) { char newc = '\0'; BOOL seqCompleted = FALSE; int length = 500; int32_t len; char tempstr[length]; char* buffer; if (feof(fp)) return NULL; newc = file_nextChar(fp); if (newc != '>') ungetc(newc, fp); buffer = util_malloc(1*sizeof(char), __FILE__, __LINE__); buffer[0] = '\0'; while(!seqCompleted) { newc = file_nextChar(fp); if(newc == '>' || newc == '\0') { seqCompleted = TRUE; if (newc == '>') ungetc(newc, fp); // Make sure next time we start from sequence delimiter > } else { ungetc(newc, fp); if(file_nextLine( fp, tempstr, length) != NULL) { len = strlen(tempstr) + strlen(buffer) + 1; buffer = util_realloc(buffer, len, __FILE__, __LINE__); strcat(buffer, tempstr); } else { seqCompleted = TRUE; } } } return buffer; } /* * Function Name: seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem) */ void seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem) { char* IdEnd; int IdSize; seqElem->rawheader = strdup(header); IdEnd = strchr(header, ' '); if (IdEnd == NULL) IdSize = strlen(header); else IdSize = strlen(header) - strlen(IdEnd); seqElem->accession_id = (char*) util_malloc(1+IdSize*sizeof(char), __FILE__, __LINE__); strncpy(seqElem->accession_id, header, IdSize); (seqElem->accession_id)[IdSize] = '\0'; } /* * Function Name: seq_fillSeq(char *seq, fastaSeqPtr seqElem) * Description: Parses the whole sequences for actual nucleotide sequences and stores that * sequence in the field of structure 'seqElem' . */ void seq_fillSeq(char *seq, fastaSeqPtr seqElem, int seqLen) { char* seqTemp; char c; int32_t index = 0, seqIndex = 0, len = strlen(seq); char* seqAlphabets = "acgtACGT-nN"; seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__); while (index < len) { c = seq[index++]; if (strchr(seqAlphabets, c) != NULL) seqTemp[seqIndex++] = tolower(c); } seqTemp[seqIndex] = '\0'; seqElem->length=seqIndex; seqElem->sequence = strdup(seqTemp); } void seq_fillSeqOnlyATGC(char *seq, fastaSeqPtr seqElem, int seqLen) { char* seqTemp; char c; int32_t index = 0, seqIndex = 0, len = strlen(seq); char* seqAlphabets = "acgtACGT"; int notAllATGC = 0; seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__); while (index < len) { c = seq[index++]; if (strchr(seqAlphabets, c) != NULL) seqTemp[seqIndex++] = tolower(c); else if (c != '\n') notAllATGC = 1; } if (notAllATGC) seqTemp[0] = '\0'; else { seqTemp[seqIndex] = '\0'; seqElem->length=seqIndex; } seqElem->sequence = strdup(seqTemp); } void seq_fillDigitSeq(char *seq, fastaSeqPtr seqElem, int seqLen) { char* seqTemp; char c; int32_t index = 0, seqIndex = 0, len = strlen(seq); seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__); while (index < len) { c = seq[index++]; if ((c >= '0' && c <= '9') || c == ' ') seqTemp[seqIndex++] = c; /*else { printf("Error in input file"); exit(0); }*/ } seqTemp[seqIndex] = '\0'; seqElem->sequence = strdup(seqTemp); } fastaSeqCount seq_readAllSeq2(char *fileName, BOOL isStandardSeq, BOOL onlyATGC) { FILE* fp; fastaSeqPtr seqPtr; fastaSeqPtr seqPtrAr; int32_t counter = 0; int32_t slots = 1000; fastaSeqCount allseqs; int32_t discarded=0; if ((fileName == NULL) || (strcmp(fileName, "-") == 0)) fp = stdin; else { fp = file_open(fileName, TRUE); exitIfEmptyFile(fp); } if (fp == NULL) { fprintf(stderr, "\nCould not open file.\n"); exit(1); } seqPtrAr = (fastaSeqPtr) util_malloc(slots*sizeof(fastaSeq), __FILE__, __LINE__); seqPtr = seq_getNext(fp, " ", isStandardSeq, onlyATGC); while (seqPtr != NULL) { if (counter == slots) { slots += 1000; seqPtrAr = (fastaSeqPtr)util_realloc(seqPtrAr, slots*sizeof(fastaSeq), __FILE__, __LINE__); } if ((seqPtr->sequence)[0] != '\0') seqPtrAr[counter++] = *seqPtr; else discarded++; util_free((void *)seqPtr); seqPtr = seq_getNext(fp, " ", isStandardSeq, onlyATGC); } fclose(fp); if (counter != slots) seqPtrAr = (fastaSeqPtr)util_realloc(seqPtrAr, counter*sizeof(fastaSeq), __FILE__, __LINE__); allseqs.count = counter; allseqs.fastaSeqs = seqPtrAr; if (discarded) fprintf(stderr, "\nDiscarded %d sequences that did not contain only 'AaTtGgCc' characters.", discarded); return allseqs; } int32_t seq_findSeqByAccId (char *accid, fastaSeqCountPtr allseqs) { int32_t i; for (i = 0; i < allseqs->count; i++) { if (strcmp (accid, allseqs->fastaSeqs[i].accession_id) == 0) return i; } return -1; } void seq_printSeqs (fastaSeqCountPtr allseq) { int32_t i; for (i = 0; i < allseq->count; i++) //for (i = 0; i < 4; i++) { if (allseq->fastaSeqs[i].sequence == NULL) continue; if (allseq->fastaSeqs[i].rawheader) printf (">%s\n", allseq->fastaSeqs[i].rawheader); else printf (">%s\n", allseq->fastaSeqs[i].accession_id); printf ("%s\n", allseq->fastaSeqs[i].sequence); } } int cleanDB(fastaSeqCount db) // replace not a/t/g/c with a's { int32_t i; char *seq; BOOL changed; int32_t seqchanged=0; int32_t nucchanged=0; fprintf(stderr,"Cleaning dataset..."); for (i=0; i < db.count;i++) { changed=FALSE; for (seq = db.fastaSeqs[i].sequence; *seq!=0; seq++) { if (*seq!='a' && *seq!='c' && *seq!='g' && *seq!='t') { changed=TRUE; nucchanged++; *seq='a'; } } if (changed) seqchanged++; } if (seqchanged) fprintf(stderr," : %d nucleotides substituted in %d sequences\n",nucchanged,seqchanged); else fprintf(stderr," : Done\n"); return(db.count); } void addCounts(fastaSeqCount* db) { int s; char* count; element_from_header* header; char* count_n; char* count_v; count_n = (char*) malloc(6*sizeof(char)); count_v = (char*) malloc(2*sizeof(char)); strcpy(count_n, "count"); strcpy(count_v, "1"); for (s=0; s < db->count; s++) { header = header_parser_main(db->fastaSeqs[s].rawheader); count = getItemFromHeader("count", header); if (count == 0) // no count field { header = table_header_add_field(header, count_n, count_v); db->fastaSeqs[s].count = 1; } else db->fastaSeqs[s].count = atoi(count); db->fastaSeqs[s].header = header; } } int uniqSeqsVector(fastaSeqCount* db, fastaSeqPtr** uniqSeqs) { int i, j, k; *(*(uniqSeqs)) = db->fastaSeqs; db->fastaSeqs[0].uniqHead = TRUE; i = 0; k = 1; for (j=1; j < db->count; j++) { if (strcmp(db->fastaSeqs[i].sequence, db->fastaSeqs[j].sequence) == 0) { db->fastaSeqs[i].count += db->fastaSeqs[j].count; db->fastaSeqs[j].uniqHead = FALSE; } else { db->fastaSeqs[j].uniqHead = TRUE; *(*(uniqSeqs)+k) = (db->fastaSeqs)+j; k++; i = j; } } return(k); } void calculateMaxAndMinLen(fastaSeqPtr* db, int n, int* lmax, int* lmin) { int i; int l; *lmax = 0; for (i=0; i < n; i++) { l = (*(db+i))->length; if (l > *lmax) *lmax = l; } *lmin = *lmax; for (i=0; i < n; i++) { l = (*(db+i))->length; if (l < *lmin) *lmin = l; } } void calculateMaxAndMinLenDB(fastaSeqCount db, int* lmax, int* lmin) { int i; int l; *lmax = 0; for (i=0; i < db.count; i++) { l = ((db.fastaSeqs)+i)->length; if (l > *lmax) *lmax = l; } *lmin = *lmax; for (i=0; i < db.count; i++) { l = ((db.fastaSeqs)+i)->length;; if (l < *lmin) *lmin = l; } } int sortSeqsWithCounts(const void **s1, const void **s2) { return(((fastaSeqPtr) *s2)->count - ((fastaSeqPtr) *s1)->count); } int reverseSortSeqsWithCounts(const void **s1, const void **s2) { return(((fastaSeqPtr) *s1)->count - ((fastaSeqPtr) *s2)->count); } sumaclust_v1.0.35/sumalibs/libfasta/fasta_header_parser.h000755 000765 000024 00000000274 13446627177 025627 0ustar00celinemercierstaff000000 000000 #ifndef FASTA_HEADER_PARSER_H_ #define FASTA_HEADER_PARSER_H_ typedef struct { char *name; void *value; }element_from_header; element_from_header* header_parser_main(char*); #endif sumaclust_v1.0.35/sumalibs/libfasta/fasta_header_handler.c000755 000765 000024 00000005402 13446627177 025741 0ustar00celinemercierstaff000000 000000 #include #include #include #include "sequence.h" #include "fasta_header_parser.h" #include "fasta_header_handler.h" char* char_header_add_field(char* header, char* name, char* value) { int lheader = strlen(header); header = (char*) realloc(header, (lheader+strlen(name)+strlen(value)+4)*sizeof(char)); if (header[lheader-1] == '.') { strcpy(header+lheader-1,";"); strcpy(header+lheader," "); strcpy(header+lheader+1,name); strcpy(header+lheader+1+strlen(name),"="); strcpy(header+lheader+1+strlen(name)+1,value); } else { strcpy(header+lheader,";"); strcpy(header+lheader+1," "); strcpy(header+lheader+2,name); strcpy(header+lheader+2+strlen(name),"="); strcpy(header+lheader+2+strlen(name)+1,value); } return header; } char* fastaSeqPtr_header_add_field(fastaSeqPtr seq, char* name, char* value) { int lheader = strlen(seq->rawheader); int i; char* buffer; char* rawheader; rawheader = (char*) malloc((lheader+strlen(name)+strlen(value)+5)*sizeof(char)); strcpy(rawheader, seq->rawheader); buffer = calloc(lheader, sizeof(char)); i=0; while ((rawheader[i] != ' ') && (rawheader[i] != 0)) i++; if (rawheader[i] == ' ') strcpy(buffer, rawheader+i); else strcpy(rawheader+i, " "); i++; strcpy(rawheader+i,name); strcpy(rawheader+i+strlen(name),"="); strcpy(rawheader+i+strlen(name)+1,value); strcpy(rawheader+i+strlen(name)+1+strlen(value),";"); strcpy(rawheader+i+strlen(name)+1+strlen(value)+1, buffer); free(buffer); return(rawheader); } element_from_header* table_header_add_field(element_from_header* header, char* name, char* value) { int nbf; nbf = atoi(header[0].value); nbf++; header = (element_from_header*) realloc(header, (nbf+1)*sizeof(element_from_header)); header[nbf].name = (char*) malloc((1+strlen(name))*sizeof(char)); strcpy(header[nbf].name, name); header[nbf].value = (char*) malloc((1+strlen(value))*sizeof(char)); strcpy(header[nbf].value, value); sprintf(header[0].value, "%d", nbf); return(header); } void free_header_table(element_from_header* header) { int i; int nbf = atoi(header[0].value); for (i = 0; i <= nbf; i++) { free((header[i]).name); free((header[i]).value); } free(header); } char* getItemFromHeader(char* name, element_from_header* header) { char* value = 0; int nbf; int i; nbf = atoi(header[0].value); for (i = 1; i <= nbf; i++) { if (strcmp(header[i].name,name)==0) value = header[i].value; } return value; } void changeValue(element_from_header* header, char* name, char* newValue) { int i; int nbf = atoi(header[0].value); for (i = 1; i <= nbf; i++) { if (strcmp(header[i].name, name)==0) { header[i].value = realloc(header[i].value, (1+strlen(newValue))*sizeof(char)); strcpy(header[i].value, newValue); } } } sumaclust_v1.0.35/sumalibs/libfasta/fasta_seq_writer.c000755 000765 000024 00000002640 13446627177 025201 0ustar00celinemercierstaff000000 000000 #include #include #include #include "sequence.h" #include "fasta_header_parser.h" void printOnlySeqFromFastaSeqPtr(fastaSeqPtr seq, FILE* output) { char nuc; int n=60; int l = strlen(seq->sequence); for (n=60; nsequence[n]; seq->sequence[n]=0; fprintf(output,"%s\n",seq->sequence+n-60); seq->sequence[n]=nuc; } fprintf(output,"%s\n",seq->sequence+n-60); } void printOnlySeqFromChar(char* seq, FILE* output) { char nuc; int n=60; int l = strlen(seq); for (n=60; n%s\n",seq->rawheader); } void printOnlyHeaderFromTable(element_from_header* header, FILE* output) { int i; int nbf; nbf = atoi(header[0].value); fprintf(output,">%s ",header[1].value); for (i = 2; i <= nbf; i++) { if (strcmp(header[i].name, "definition") != 0) { fprintf(output,"%s",header[i].name); fprintf(output,"="); fprintf(output,"%s; ",header[i].value); } } if (strcmp(header[nbf].name, "definition") == 0) fprintf(output,"%s; ",header[nbf].value); fprintf(output,"\n"); } void printHeaderAndSeqFromFastaSeqPtr(fastaSeqPtr seq, FILE* output) { printOnlyHeaderFromFastaSeqPtr(seq, output); printOnlySeqFromFastaSeqPtr(seq, output); } sumaclust_v1.0.35/sumalibs/libfasta/sequence.h000755 000765 000024 00000005505 13446627177 023457 0ustar00celinemercierstaff000000 000000 /** * FileName: sequence.h * Authors: Tiayyba Riaz, Celine Mercier * Description: Prototypes and other declarations for sequences * **/ #ifndef SEQUENCE_H_ #define SEQUENCE_H_ #include #include #include "../libutils/utilities.h" #include "fasta_header_parser.h" typedef struct { char* accession_id; // identifier char *rawheader; // not parsed header element_from_header* header; // parsed header char *sequence; // DNA sequence itself int32_t length; // DNA sequence's length int32_t count; // abundance of the sequence unsigned char *table; // 4mer occurrence table build using function buildTable int32_t over; // count of 4mer with occurrences greater than 255 (overflow) struct fastaSeqPtr* next; // next unique sequence for example BOOL cluster_center; // whether the sequence is a cluster center or not int32_t cluster_weight; // cluster weight when sequence is cluster center int32_t cluster_weight_unique_ids; // cluster weight when sequence is cluster center, counting the number sequence records double score; // score with cluster center for example struct fastaSeqPtr* center; // pointer to the sequence's cluster center int32_t center_index; // index of the sequence's cluster center BOOL uniqHead; // whether the sequence is a unique head or not char* columns_BIOM; // to print in BIOM format int columns_BIOM_size; // size allocated for columns_BIOM char* line_OTU_table; // to print in OTU table format int line_OTU_table_size; // size allocated for line_OTU_table struct hashtable *sample_counts; // sample counts for sumaclean }fastaSeq,*fastaSeqPtr; typedef struct { int32_t count; fastaSeqPtr fastaSeqs; }fastaSeqCount, *fastaSeqCountPtr; fastaSeqPtr seq_getNext(FILE *fp, char *fieldDelim, BOOL isStandardSeq, BOOL onlyATGC); char *seq_readNextFromFilebyLine(FILE* fp); void seq_fillSeq(char *seq, fastaSeqPtr seqElem, int seqLen); void seq_fillSeqOnlyATGC(char *seq, fastaSeqPtr seqElem, int seqLen); void seq_fillDigitSeq(char *seq, fastaSeqPtr seqElem, int seqLen); void seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem); fastaSeqCount seq_readAllSeq2(char *fileName, BOOL isStandardSeq, BOOL onlyATGC); int32_t seq_findSeqByAccId (char *accid, fastaSeqCountPtr allseqs); void seq_printSeqs (fastaSeqCountPtr allseq); int cleanDB(fastaSeqCount); void addCounts(fastaSeqCount* db); int uniqSeqsVector(fastaSeqCount* db, fastaSeqPtr** uniqSeqs); void calculateMaxAndMinLen(fastaSeqPtr* db, int n, int* lmax, int* lmin); void calculateMaxAndMinLenDB(fastaSeqCount db, int* lmax, int* lmin); int sortSeqsWithCounts(const void **s1, const void **s2); int reverseSortSeqsWithCounts(const void **s1, const void **s2); void readSampleCounts(fastaSeqCount* db, char* key_name); #endif /*SEQUENCE_H_*/ sumaclust_v1.0.35/sumalibs/libfasta/header_mem_handler.h000755 000765 000024 00000000774 13446627177 025435 0ustar00celinemercierstaff000000 000000 #ifndef HEADER_MEM_HANDLER_H_ #define HEADER_MEM_HANDLER_H_ #include "fasta_header_parser.h" char* malloc_field(int*); int check_mem_field(int); char* realloc_field(int, char*); char* check_and_realloc_field(char*, int, int*); char* store_in_field(char*, char*, int*, int*); char* store_in_header_table(char*, char**, int*, int*); element_from_header** check_and_realloc_mem_in_header_table(element_from_header**, int*, int*); void end_header_table(element_from_header** p_header, int nbf); #endif sumaclust_v1.0.35/sumalibs/libfasta/fasta_header_parser.l000755 000765 000024 00000010432 13446627177 025630 0ustar00celinemercierstaff000000 000000 /* * Add -ll in Makefile if you modify this file to convert to .c */ %x REGID %x REGNAME %x REGVAL %{ #include #include #include "header_mem_handler.h" #include "fasta_header_handler.h" #define MEMALLOCATED 10 #define BUFFER 5 #define YY_DECL int header_parser(int *nbf, int *memory_allocated, element_from_header **p_header) %} WORD [^>[:blank:]=;]+ WORDID [^>[:blank:]]+ SUP > EOL \n SEP ; SPACE [[:blank:]]+ EQUAL = %% int i; int size_needed; int free_size; char* field; {SUP} { /*printf("\n{SUP},%s",yytext);*/ BEGIN(REGID); } {WORDID} { i=0; field = malloc_field(&free_size); (*p_header)[*nbf].name = (char*) malloc(3*sizeof(char)); strcpy(((*p_header)[*nbf]).name,"id"); size_needed = strlen(yytext)+1; (*p_header)[*nbf].value = (char*) malloc(sizeof(char)*size_needed); strcpy(((*p_header)[*nbf]).value,yytext); (*nbf)++; } {SPACE} { BEGIN(REGNAME); } {WORD} { /*fprintf(stderr,"\n{WORD} **%s**",yytext);*/ field = store_in_field(field,yytext,&free_size,&i); } {SPACE} { /*fprintf(stderr,"\n{SPACE} **%s**",yytext);*/ if (i != 0) field = store_in_field(field,yytext,&free_size,&i); } {EQUAL} { /*fprintf(stderr,"\n{EQUAL},%s",yytext);*/ field = store_in_header_table(field, &((*p_header)[*nbf].name), &free_size, &i); BEGIN(REGVAL); } {SEP} { /*fprintf(stderr,"\n{SEP},%s",yytext);*/ (*p_header)[*nbf].name = (char*) malloc(19*sizeof(char)); strcpy((*p_header)[*nbf].name,"definition"); field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); BEGIN(REGNAME); } {WORD} { /*fprintf(stderr,"\n{WORD} **%s**\n",yytext);*/ field = store_in_field(field,yytext,&free_size,&i); } {SPACE} { /*fprintf(stderr,"\n{SPACE} **%s**\n",yytext);*/ field = store_in_field(field,yytext,&free_size,&i); } {SEP} { /*fprintf(stderr,"\n{SEP},%s\n",yytext);*/ field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); BEGIN(REGNAME); } {EQUAL} { /*fprintf(stderr, "\nWarning : separator ';' probably missing in header after %s",(*p_header)[*nbf].name);*/ } <> { field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); end_header_table(p_header, *nbf); free(field); BEGIN(INITIAL); return 0; } <> { /*(*p_header)[*nbf].name = (char*) malloc(sizeof(char)*19); strcpy((*p_header)[*nbf].name,"other_informations"); field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); */ end_header_table(p_header, *nbf); free(field); BEGIN(INITIAL); return 0; } %% int header_yywrap() { return 1; } element_from_header* header_parser_main(char *h) { int nbfields,memory_allocated; element_from_header* header; char* nbfields_n; char* nbfields_v; nbfields_n = (char*) malloc(9*sizeof(char)); nbfields_v = (char*) malloc(5*sizeof(char)); memory_allocated=MEMALLOCATED; nbfields=1; strcpy(nbfields_n, "nbfields"); strcpy(nbfields_v, "1"); header = (element_from_header*) malloc(memory_allocated * sizeof(element_from_header)); header[0].name = nbfields_n; header[0].value = nbfields_v; YY_BUFFER_STATE state; state=yy_scan_string(h); header_parser(&nbfields, &memory_allocated, &header); yy_delete_buffer(state); return header; } sumaclust_v1.0.35/sumalibs/libfasta/fasta_header_handler.h000755 000765 000024 00000001150 13446627177 025742 0ustar00celinemercierstaff000000 000000 #ifndef FASTA_HEADER_HANDLER_H_ #define FASTA_HEADER_HANDLER_H_ #include "sequence.h" char* char_header_add_field(char*,char*,char*); char* fastaSeqPtr_header_add_field(fastaSeqPtr seq, char* name, char* value); element_from_header* table_header_add_dic(element_from_header* header, char* name, struct hashtable *hashtab); element_from_header* table_header_add_field(element_from_header* header, char* name, char* value); void free_header_table(element_from_header*); char* getItemFromHeader(char*, element_from_header*); void changeValue(element_from_header* header, char* name, char* newValue); #endif sumaclust_v1.0.35/sumalibs/libfasta/fasta_header_parser.c000755 000765 000024 00000144743 13446627177 025634 0ustar00celinemercierstaff000000 000000 #line 3 "" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer header_yy_create_buffer #define yy_delete_buffer header_yy_delete_buffer #define yy_flex_debug header_yy_flex_debug #define yy_init_buffer header_yy_init_buffer #define yy_flush_buffer header_yy_flush_buffer #define yy_load_buffer_state header_yy_load_buffer_state #define yy_switch_to_buffer header_yy_switch_to_buffer #define yyin header_yyin #define yyleng header_yyleng #define yylex header_yylex #define yylineno header_yylineno #define yyout header_yyout #define yyrestart header_yyrestart #define yytext header_yytext #define yywrap header_yywrap #define yyalloc header_yyalloc #define yyrealloc header_yyrealloc #define yyfree header_yyfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE header_yyrestart(header_yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t header_yyleng; extern FILE *header_yyin, *header_yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up header_yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up header_yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via header_yyrestart()), so that the user can continue scanning by * just pointing header_yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when header_yytext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t header_yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow header_yywrap()'s to do buffer switches * instead of setting up a fresh header_yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void header_yyrestart (FILE *input_file ); void header_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE header_yy_create_buffer (FILE *file,int size ); void header_yy_delete_buffer (YY_BUFFER_STATE b ); void header_yy_flush_buffer (YY_BUFFER_STATE b ); void header_yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void header_yypop_buffer_state (void ); static void header_yyensure_buffer_stack (void ); static void header_yy_load_buffer_state (void ); static void header_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER header_yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE header_yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE header_yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE header_yy_scan_bytes (yyconst char *bytes,yy_size_t len ); void *header_yyalloc (yy_size_t ); void *header_yyrealloc (void *,yy_size_t ); void header_yyfree (void * ); #define yy_new_buffer header_yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ header_yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ header_yy_create_buffer(header_yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ header_yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ header_yy_create_buffer(header_yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *header_yyin = (FILE *) 0, *header_yyout = (FILE *) 0; typedef int yy_state_type; extern int header_yylineno; int header_yylineno = 1; extern char *header_yytext; #define yytext_ptr header_yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up header_yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ header_yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 12 #define YY_END_OF_BUFFER 13 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[29] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 2, 3, 1, 12, 4, 5, 7, 6, 8, 9, 10, 11, 2, 3, 4, 5, 8, 9, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[6] = { 0, 1, 2, 3, 3, 4 } ; static yyconst flex_int16_t yy_base[36] = { 0, 0, 4, 23, 0, 9, 0, 14, 0, 27, 0, 0, 29, 29, 0, 0, 29, 29, 0, 0, 29, 29, 0, 0, 0, 0, 0, 0, 29, 19, 23, 23, 7, 5, 3, 1 } ; static yyconst flex_int16_t yy_def[36] = { 0, 29, 29, 2, 3, 28, 5, 28, 7, 28, 30, 31, 28, 28, 32, 33, 28, 28, 34, 35, 28, 28, 30, 31, 32, 33, 34, 35, 0, 28, 28, 28, 28, 28, 28, 28 } ; static yyconst flex_int16_t yy_nxt[35] = { 0, 28, 11, 27, 26, 12, 11, 25, 24, 12, 14, 15, 16, 17, 13, 18, 19, 20, 21, 13, 10, 10, 10, 10, 22, 23, 22, 28, 13, 9, 28, 28, 28, 28, 28 } ; static yyconst flex_int16_t yy_chk[35] = { 0, 0, 1, 35, 34, 1, 2, 33, 32, 2, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 29, 29, 29, 29, 30, 31, 30, 9, 3, 28, 28, 28, 28, 28, 28 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int header_yy_flex_debug; int header_yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *header_yytext; #line 1 "fasta_header_parser.l" /* * Add -ll in Makefile if you modify this file to convert to .c */ #line 10 "fasta_header_parser.l" #include #include #include "header_mem_handler.h" #include "fasta_header_handler.h" #define MEMALLOCATED 10 #define BUFFER 5 #define YY_DECL int header_parser(int *nbf, int *memory_allocated, element_from_header **p_header) #line 502 "" #define INITIAL 0 #define REGID 1 #define REGNAME 2 #define REGVAL 3 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int header_yylex_destroy (void ); int header_yyget_debug (void ); void header_yyset_debug (int debug_flag ); YY_EXTRA_TYPE header_yyget_extra (void ); void header_yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *header_yyget_in (void ); void header_yyset_in (FILE * in_str ); FILE *header_yyget_out (void ); void header_yyset_out (FILE * out_str ); yy_size_t header_yyget_leng (void ); char *header_yyget_text (void ); int header_yyget_lineno (void ); void header_yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int header_yywrap (void ); #else extern int header_yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO fwrite( header_yytext, header_yyleng, 1, header_yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( header_yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( header_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, header_yyin))==0 && ferror(header_yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(header_yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int header_yylex (void); #define YY_DECL int header_yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after header_yytext and header_yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 32 "fasta_header_parser.l" int i; int size_needed; int free_size; char* field; #line 696 "" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! header_yyin ) header_yyin = stdin; if ( ! header_yyout ) header_yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { header_yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = header_yy_create_buffer(header_yyin,YY_BUF_SIZE ); } header_yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of header_yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 29 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 29 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 40 "fasta_header_parser.l" { /*printf("\n{SUP},%s",header_yytext);*/ BEGIN(REGID); } YY_BREAK case 2: /* rule 2 can match eol */ YY_RULE_SETUP #line 45 "fasta_header_parser.l" { i=0; field = malloc_field(&free_size); (*p_header)[*nbf].name = (char*) malloc(3*sizeof(char)); strcpy(((*p_header)[*nbf]).name,"id"); size_needed = strlen(header_yytext)+1; (*p_header)[*nbf].value = (char*) malloc(sizeof(char)*size_needed); strcpy(((*p_header)[*nbf]).value,header_yytext); (*nbf)++; } YY_BREAK case 3: YY_RULE_SETUP #line 60 "fasta_header_parser.l" { BEGIN(REGNAME); } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 64 "fasta_header_parser.l" { /*fprintf(stderr,"\n{WORD} **%s**",header_yytext);*/ field = store_in_field(field,header_yytext,&free_size,&i); } YY_BREAK case 5: YY_RULE_SETUP #line 69 "fasta_header_parser.l" { /*fprintf(stderr,"\n{SPACE} **%s**",header_yytext);*/ if (i != 0) field = store_in_field(field,header_yytext,&free_size,&i); } YY_BREAK case 6: YY_RULE_SETUP #line 75 "fasta_header_parser.l" { /*fprintf(stderr,"\n{EQUAL},%s",header_yytext);*/ field = store_in_header_table(field, &((*p_header)[*nbf].name), &free_size, &i); BEGIN(REGVAL); } YY_BREAK case 7: YY_RULE_SETUP #line 81 "fasta_header_parser.l" { /*fprintf(stderr,"\n{SEP},%s",header_yytext);*/ (*p_header)[*nbf].name = (char*) malloc(19*sizeof(char)); strcpy((*p_header)[*nbf].name,"definition"); field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); BEGIN(REGNAME); } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 90 "fasta_header_parser.l" { /*fprintf(stderr,"\n{WORD} **%s**\n",header_yytext);*/ field = store_in_field(field,header_yytext,&free_size,&i); } YY_BREAK case 9: YY_RULE_SETUP #line 95 "fasta_header_parser.l" { /*fprintf(stderr,"\n{SPACE} **%s**\n",header_yytext);*/ field = store_in_field(field,header_yytext,&free_size,&i); } YY_BREAK case 10: YY_RULE_SETUP #line 100 "fasta_header_parser.l" { /*fprintf(stderr,"\n{SEP},%s\n",header_yytext);*/ field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); BEGIN(REGNAME); } YY_BREAK case 11: YY_RULE_SETUP #line 109 "fasta_header_parser.l" { /*fprintf(stderr, "\nWarning : separator ';' probably missing in header after %s",(*p_header)[*nbf].name);*/ } YY_BREAK case YY_STATE_EOF(REGVAL): #line 113 "fasta_header_parser.l" { field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); end_header_table(p_header, *nbf); free(field); BEGIN(INITIAL); return 0; } YY_BREAK case YY_STATE_EOF(REGNAME): #line 123 "fasta_header_parser.l" { /*(*p_header)[*nbf].name = (char*) malloc(sizeof(char)*19); strcpy((*p_header)[*nbf].name,"other_informations"); field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i); p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated); */ end_header_table(p_header, *nbf); free(field); BEGIN(INITIAL); return 0; } YY_BREAK case 12: YY_RULE_SETUP #line 136 "fasta_header_parser.l" ECHO; YY_BREAK #line 918 "" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(REGID): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed header_yyin at a new source and called * header_yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = header_yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( header_yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * header_yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of header_yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ header_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; header_yyrestart(header_yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) header_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 29 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 29 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 28); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up header_yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ header_yyrestart(header_yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( header_yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve header_yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void header_yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ header_yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = header_yy_create_buffer(header_yyin,YY_BUF_SIZE ); } header_yy_init_buffer(YY_CURRENT_BUFFER,input_file ); header_yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void header_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * header_yypop_buffer_state(); * header_yypush_buffer_state(new_buffer); */ header_yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; header_yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (header_yywrap()) processing, but the only time this flag * is looked at is after header_yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void header_yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; header_yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE header_yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) header_yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in header_yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) header_yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in header_yy_create_buffer()" ); b->yy_is_our_buffer = 1; header_yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with header_yy_create_buffer() * */ void header_yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) header_yyfree((void *) b->yy_ch_buf ); header_yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a header_yyrestart() or at EOF. */ static void header_yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; header_yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then header_yy_init_buffer was _probably_ * called from header_yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void header_yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) header_yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void header_yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; header_yyensure_buffer_stack(); /* This block is copied from header_yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from header_yy_switch_to_buffer. */ header_yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void header_yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; header_yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { header_yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void header_yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)header_yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in header_yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)header_yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in header_yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE header_yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) header_yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in header_yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; header_yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to header_yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * header_yy_scan_bytes() instead. */ YY_BUFFER_STATE header_yy_scan_string (yyconst char * yystr ) { return header_yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to header_yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE header_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) header_yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in header_yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = header_yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in header_yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up header_yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ header_yytext[header_yyleng] = (yy_hold_char); \ (yy_c_buf_p) = header_yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ header_yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int header_yyget_lineno (void) { return header_yylineno; } /** Get the input stream. * */ FILE *header_yyget_in (void) { return header_yyin; } /** Get the output stream. * */ FILE *header_yyget_out (void) { return header_yyout; } /** Get the length of the current token. * */ yy_size_t header_yyget_leng (void) { return header_yyleng; } /** Get the current token. * */ char *header_yyget_text (void) { return header_yytext; } /** Set the current line number. * @param line_number * */ void header_yyset_lineno (int line_number ) { header_yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see header_yy_switch_to_buffer */ void header_yyset_in (FILE * in_str ) { header_yyin = in_str ; } void header_yyset_out (FILE * out_str ) { header_yyout = out_str ; } int header_yyget_debug (void) { return header_yy_flex_debug; } void header_yyset_debug (int bdebug ) { header_yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from header_yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT header_yyin = stdin; header_yyout = stdout; #else header_yyin = (FILE *) 0; header_yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * header_yylex_init() */ return 0; } /* header_yylex_destroy is for both reentrant and non-reentrant scanners. */ int header_yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ header_yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; header_yypop_buffer_state(); } /* Destroy the stack itself. */ header_yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * header_yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *header_yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *header_yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void header_yyfree (void * ptr ) { free( (char *) ptr ); /* see header_yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 136 "fasta_header_parser.l" int header_yywrap() { return 1; } element_from_header* header_parser_main(char *h) { int nbfields,memory_allocated; element_from_header* header; char* nbfields_n; char* nbfields_v; nbfields_n = (char*) malloc(9*sizeof(char)); nbfields_v = (char*) malloc(5*sizeof(char)); memory_allocated=MEMALLOCATED; nbfields=1; strcpy(nbfields_n, "nbfields"); strcpy(nbfields_v, "1"); header = (element_from_header*) malloc(memory_allocated * sizeof(element_from_header)); header[0].name = nbfields_n; header[0].value = nbfields_v; YY_BUFFER_STATE state; state=header_yy_scan_string(h); header_parser(&nbfields, &memory_allocated, &header); header_yy_delete_buffer(state); return header; } sumaclust_v1.0.35/sumalibs/libsse/_sse.h000755 000765 000024 00000035215 13446627177 022275 0ustar00celinemercierstaff000000 000000 #ifndef _SSE_H_ #define _SSE_H_ #include #include #ifdef __SSE2__ #include #else typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); #endif /* __SSE2__ */ #ifndef MAX #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)<(y)) ? (x):(y)) #endif #define ALIGN __attribute__((aligned(16))) typedef __m128i vUInt8; typedef __m128i vInt8; typedef __m128i vUInt16; typedef __m128i vInt16; typedef __m128i vUInt64; typedef union { __m128i i; int64_t s64[ 2]; int16_t s16[ 8]; int8_t s8 [16]; uint8_t u8 [16]; uint16_t u16[8 ]; uint32_t u32[4 ]; uint64_t u64[2 ]; } um128; typedef union { vUInt8 m; uint8_t c[16]; } uchar_v; typedef union { vUInt16 m; uint16_t c[8]; } ushort_v; typedef union { vUInt64 m; uint64_t c[2]; } uint64_v; #ifdef __SSE2__ static inline int8_t _s2_extract_epi8(__m128i r, const int p) { #define ACTIONP(r,x) return _mm_extract_epi16(r,x) & 0xFF #define ACTIONI(r,x) return _mm_extract_epi16(r,x) >> 8 switch (p) { case 0: ACTIONP(r,0); case 1: ACTIONI(r,0); case 2: ACTIONP(r,1); case 3: ACTIONI(r,1); case 4: ACTIONP(r,2); case 5: ACTIONI(r,2); case 6: ACTIONP(r,3); case 7: ACTIONI(r,3); case 8: ACTIONP(r,4); case 9: ACTIONI(r,4); case 10: ACTIONP(r,5); case 11: ACTIONI(r,5); case 12: ACTIONP(r,6); case 13: ACTIONI(r,6); case 14: ACTIONP(r,7); case 15: ACTIONI(r,7); } #undef ACTIONP #undef ACTIONI return 0; } static inline __m128i _s2_max_epi8(__m128i a, __m128i b) { __m128i mask = _mm_cmpgt_epi8( a, b ); a = _mm_and_si128 (a,mask ); b = _mm_andnot_si128(mask,b); return _mm_or_si128(a,b); } static inline __m128i _s2_min_epi8(__m128i a, __m128i b) { __m128i mask = _mm_cmplt_epi8( a, b ); a = _mm_and_si128 (a,mask ); b = _mm_andnot_si128(mask,b); return _mm_or_si128(a,b); } static inline __m128i _s2_insert_epi8(__m128i r, int b, const int p) { #define ACTIONP(r,x) return _mm_insert_epi16(r,(_mm_extract_epi16(r,x) & 0xFF00) | (b & 0x00FF),x) #define ACTIONI(r,x) return _mm_insert_epi16(r,(_mm_extract_epi16(r,x) & 0x00FF) | ((b << 8)& 0xFF00),x) switch (p) { case 0: ACTIONP(r,0); case 1: ACTIONI(r,0); case 2: ACTIONP(r,1); case 3: ACTIONI(r,1); case 4: ACTIONP(r,2); case 5: ACTIONI(r,2); case 6: ACTIONP(r,3); case 7: ACTIONI(r,3); case 8: ACTIONP(r,4); case 9: ACTIONI(r,4); case 10: ACTIONP(r,5); case 11: ACTIONI(r,5); case 12: ACTIONP(r,6); case 13: ACTIONI(r,6); case 14: ACTIONP(r,7); case 15: ACTIONI(r,7); } #undef ACTIONP #undef ACTIONI return _mm_setzero_si128(); } // Fill a SSE Register with 16 time the same 8bits integer value #define _MM_SET1_EPI8(x) _mm_set1_epi8(x) #define _MM_INSERT_EPI8(r,x,i) _s2_insert_epi8((r),(x),(i)) #define _MM_CMPEQ_EPI8(x,y) _mm_cmpeq_epi8((x),(y)) #define _MM_CMPGT_EPI8(x,y) _mm_cmpgt_epi8((x),(y)) #define _MM_CMPLT_EPI8(x,y) _mm_cmplt_epi8((x),(y)) #define _MM_MAX_EPI8(x,y) _s2_max_epi8((x),(y)) #define _MM_MIN_EPI8(x,y) _s2_min_epi8((x),(y)) #define _MM_ADD_EPI8(x,y) _mm_add_epi8((x),(y)) #define _MM_SUB_EPI8(x,y) _mm_sub_epi8((x),(y)) #define _MM_EXTRACT_EPI8(r,p) _s2_extract_epi8((r),(p)) #define _MM_MIN_EPU8(x,y) _mm_min_epu8((x),(y)) // Fill a SSE Register with 8 time the same 16bits integer value #define _MM_SET1_EPI16(x) _mm_set1_epi16(x) #define _MM_INSERT_EPI16(r,x,i) _mm_insert_epi16((r),(x),(i)) #define _MM_CMPEQ_EPI16(x,y) _mm_cmpeq_epi16((x),(y)) #define _MM_CMPGT_EPI16(x,y) _mm_cmpgt_epi16((x),(y)) #define _MM_CMPGT_EPU16(x,y) _mm_cmpgt_epu16((x),(y)) // n'existe pas ?? #define _MM_CMPLT_EPI16(x,y) _mm_cmplt_epi16((x),(y)) #define _MM_MAX_EPI16(x,y) _mm_max_epi16((x),(y)) #define _MM_MIN_EPI16(x,y) _mm_min_epi16((x),(y)) #define _MM_ADD_EPI16(x,y) _mm_add_epi16((x),(y)) #define _MM_SUB_EPI16(x,y) _mm_sub_epi16((x),(y)) #define _MM_EXTRACT_EPI16(r,p) _mm_extract_epi16((r),(p)) #define _MM_UNPACKLO_EPI8(a,b) _mm_unpacklo_epi8((a),(b)) #define _MM_UNPACKHI_EPI8(a,b) _mm_unpackhi_epi8((a),(b)) #define _MM_ADDS_EPU16(x,y) _mm_adds_epu16((x),(y)) // Multiplication #define _MM_MULLO_EPI16(x,y) _mm_mullo_epi16((x), (y)) #define _MM_SRLI_EPI64(r,x) _mm_srli_epi64((r),(x)) #define _MM_SLLI_EPI64(r,x) _mm_slli_epi64((r),(x)) // Set a SSE Register to 0 #define _MM_SETZERO_SI128() _mm_setzero_si128() #define _MM_AND_SI128(x,y) _mm_and_si128((x),(y)) #define _MM_ANDNOT_SI128(x,y) _mm_andnot_si128((x),(y)) #define _MM_OR_SI128(x,y) _mm_or_si128((x),(y)) #define _MM_XOR_SI128(x,y) _mm_xor_si128((x),(y)) #define _MM_SLLI_SI128(r,s) _mm_slli_si128((r),(s)) #define _MM_SRLI_SI128(r,s) _mm_srli_si128((r),(s)) // Load a SSE register from an unaligned address #define _MM_LOADU_SI128(x) _mm_loadu_si128(x) // Load a SSE register from an aligned address (/!\ not defined when SSE not available) #define _MM_LOAD_SI128(x) _mm_load_si128(x) // #define _MM_UNPACKLO_EPI8(x,y) _mm_unpacklo_epi8((x),(y)) #else /* __SSE2__ Not defined */ static inline __m128i _em_set1_epi8(int x) { um128 a; x&=0xFF; a.s8[0]=x; a.s8[1]=x; a.u16[1]=a.u16[0]; a.u32[1]=a.u32[0]; a.u64[1]=a.u64[0]; return a.i; } static inline __m128i _em_insert_epi8(__m128i r, int x, const int i) { um128 a; a.i=r; a.s8[i]=x & 0xFF; return a.i; } static inline __m128i _em_cmpeq_epi8(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.s8[z]=(x.s8[z]==y.s8[z]) ? 0xFF:0 R(0); R(1); R(2); R(3); R(4); R(5); R(6); R(7); R(8); R(9); R(10); R(11); R(12); R(13); R(14); R(15); #undef R return r.i; } static inline __m128i _em_cmpgt_epi8(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.s8[z]=(x.s8[z]>y.s8[z]) ? 0xFF:0 R(0); R(1); R(2); R(3); R(4); R(5); R(6); R(7); R(8); R(9); R(10); R(11); R(12); R(13); R(14); R(15); #undef R return r.i; } static inline __m128i _em_cmplt_epi8(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.s8[z]=(x.s8[z]y.s16[z]) ? 0xFFFF:0 R(0); R(1); R(2); R(3); R(4); R(5); R(6); R(7); #undef R return r.i; } static inline __m128i _em_cmplt_epi16(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.s16[z]=(x.s16[z]>=b; x.s64[1]>>=b; return x.i; } static inline __m128i _em_slli_epi64(__m128i a, int b) { um128 x; x.i=a; x.s64[0]<<=b; x.s64[1]<<=b; return x.i; } static inline __m128i _em_setzero_si128() { um128 x; x.s64[0]=x.s64[1]=0; return x.i; } static inline __m128i _em_and_si128(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.u64[z]=x.u64[z] & y.u64[z] R(0); R(1); #undef R return r.i; } static inline __m128i _em_andnot_si128(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.u64[z]=(~x.u64[z]) & y.u64[z] R(0); R(1); #undef R return r.i; } static inline __m128i _em_or_si128(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.u64[z]=x.u64[z] | y.u64[z] R(0); R(1); #undef R return r.i; } static inline __m128i _em_xor_si128(__m128i a, __m128i b) { um128 x; um128 y; um128 r; x.i=a; y.i=b; #define R(z) r.u64[z]=x.u64[z] ^ y.u64[z] R(0); R(1); #undef R return r.i; } static inline __m128i _em_slli_si128(__m128i a, int b) { um128 x; x.i=a; #define R(z) x.u8[z]=(z>=b) ? x.u8[z-b]:0 R(15); R(14); R(13); R(12); R(11); R(10); R(9); R(8); R(7); R(6); R(5); R(4); R(3); R(2); R(1); R(0); #undef R return x.i; } static inline __m128i _em_srli_si128(__m128i a, int b) { um128 x; x.i=a; #define R(z) x.u8[z]=((b+z) > 15) ? 0:x.u8[z+b] R(0); R(1); R(2); R(3); R(4); R(5); R(6); R(7); R(8); R(9); R(10); R(11); R(12); R(13); R(14); R(15); #undef R return x.i; } inline static __m128i _em_loadu_si128(__m128i const *P) { um128 tmp; um128 *pp=(um128*)P; tmp.u8[0]=(*pp).u8[0]; tmp.u8[1]=(*pp).u8[1]; tmp.u8[2]=(*pp).u8[2]; tmp.u8[3]=(*pp).u8[3]; tmp.u8[4]=(*pp).u8[4]; tmp.u8[5]=(*pp).u8[5]; tmp.u8[6]=(*pp).u8[6]; tmp.u8[7]=(*pp).u8[7]; tmp.u8[8]=(*pp).u8[8]; tmp.u8[9]=(*pp).u8[9]; tmp.u8[10]=(*pp).u8[10]; tmp.u8[11]=(*pp).u8[11]; tmp.u8[12]=(*pp).u8[12]; tmp.u8[13]=(*pp).u8[13]; tmp.u8[14]=(*pp).u8[14]; tmp.u8[15]=(*pp).u8[15]; return tmp.i; } #define _MM_SET1_EPI8(x) _em_set1_epi8(x) #define _MM_INSERT_EPI8(r,x,i) _em_insert_epi8((r),(x),(i)) #define _MM_CMPEQ_EPI8(x,y) _em_cmpeq_epi8((x),(y)) #define _MM_CMPGT_EPI8(x,y) _em_cmpgt_epi8((x),(y)) #define _MM_CMPLT_EPI8(x,y) _em_cmplt_epi8((x),(y)) #define _MM_MAX_EPI8(x,y) _em_max_epi8((x),(y)) #define _MM_MIN_EPI8(x,y) _em_min_epi8((x),(y)) #define _MM_ADD_EPI8(x,y) _em_add_epi8((x),(y)) #define _MM_SUB_EPI8(x,y) _em_sub_epi8((x),(y)) #define _MM_EXTRACT_EPI8(r,p) _em_extract_epi8((r),(p)) #define _MM_MIN_EPU8(x,y) _em_min_epu8((x),(y)) #define _MM_SET1_EPI16(x) _em_set1_epi16(x) #define _MM_INSERT_EPI16(r,x,i) _em_insert_epi16((r),(x),(i)) #define _MM_CMPEQ_EPI16(x,y) _em_cmpeq_epi16((x),(y)) #define _MM_CMPGT_EPI16(x,y) _em_cmpgt_epi16((x),(y)) #define _MM_CMPLT_EPI16(x,y) _em_cmplt_epi16((x),(y)) #define _MM_MAX_EPI16(x,y) _em_max_epi16((x),(y)) #define _MM_MIN_EPI16(x,y) _em_min_epi16((x),(y)) #define _MM_ADD_EPI16(x,y) _em_add_epi16((x),(y)) #define _MM_SUB_EPI16(x,y) _em_sub_epi16((x),(y)) #define _MM_EXTRACT_EPI16(r,p) _em_extract_epi16((r),(p)) #define _MM_UNPACKLO_EPI8(a,b) _em_unpacklo_epi8((a),(b)) #define _MM_UNPACKHI_EPI8(a,b) _em_unpackhi_epi8((a),(b)) #define _MM_ADDS_EPU16(x,y) _em_adds_epu16((x),(y)) #define _MM_SRLI_EPI64(r,x) _em_srli_epi64((r),(x)) #define _MM_SLLI_EPI64(r,x) _em_slli_epi64((r),(x)) #define _MM_SETZERO_SI128() _em_setzero_si128() #define _MM_AND_SI128(x,y) _em_and_si128((x),(y)) #define _MM_ANDNOT_SI128(x,y) _em_andnot_si128((x),(y)) #define _MM_OR_SI128(x,y) _em_or_si128((x),(y)) #define _MM_XOR_SI128(x,y) _em_xor_si128((x),(y)) #define _MM_SLLI_SI128(r,s) _em_slli_si128((r),(s)) #define _MM_SRLI_SI128(r,s) _em_srli_si128((r),(s)) #define _MM_LOADU_SI128(x) _em_loadu_si128(x) #define _MM_LOAD_SI128(x) _em_loadu_si128(x) #endif /* __SSE2__ */ #define _MM_NOT_SI128(x) _MM_XOR_SI128((x),(_MM_SET1_EPI8(0xFFFF))) #endif sumaclust_v1.0.35/sumalibs/libutils/debug.h000755 000765 000024 00000000572 13446627177 022776 0ustar00celinemercierstaff000000 000000 /* * debug.h * * Created on: 4 sept. 2012 * Author: coissac */ #ifndef DEBUG_H_ #define DEBUG_H_ #ifdef DEBUG #undef DEBUG #endif #ifdef DEBUG_ON #define DEBUG(format,...) fprintf(stderr,"[%s:%d] : "format"\n",__FILE__,__LINE__,__VA_ARGS__) #else #define DEBUG(format,...) #endif #include char * int2bin(int64_t i,size_t bits); #endif /* DEBUG_H_ */ sumaclust_v1.0.35/sumalibs/libutils/utilities.h000755 000765 000024 00000002625 13446627177 023724 0ustar00celinemercierstaff000000 000000 /** * FileName: utilities.h * Author: Tiayyba Riaz * Description: Header file for miscellenious functions and macros * **/ #ifndef UTILITIES_H_ #define UTILITIES_H_ #include #include #include //static char *basecodes = "00100020000000000003000000"; //#define BASEIDX(ch) basecodes[ch - 'a'] - 48 #ifndef MAX #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)<(y)) ? (x):(y)) #endif typedef char BOOL; #define TRUE (3==3) #define FALSE (!TRUE) #define ALILEN (0) #define MAXLEN (1) #define MINLEN (2) /* Error Codes */ #define FILE_OPENING_ERROR (1) #define MEM_ALLOC_ERROR (2) /* Prototypes */ void errorAbort(int32_t code, char* errorMsg, char* fileName, int32_t lineNumber); char *str_strrstr(char *src, char *delim); void str_removeSpaces(char *src); void str_sepNameValue(char *name, char *value, char *src, char *delim); char *str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim); void util_free(void *chunk); void *util_realloc(void *chunk, size_t newsize, const char *filename, int32_t line); void *util_malloc(size_t chunksize, const char *filename, int32_t line); BOOL util_findInArr(int32_t tempArr[], int seqNo, int32_t noOfSeqs); void* getA16Address(int size); void** reallocA16Address(void** address, int size); /* Macros */ #define ERRORABORT(code, msg) errorAbort((code), (msg), __FILE__, __LINE__) #endif /*UTILITIES_H_*/ sumaclust_v1.0.35/sumalibs/libutils/debug.c000755 000765 000024 00000000711 13446627177 022764 0ustar00celinemercierstaff000000 000000 /* * debug.c * * Created on: 4 sept. 2012 * Author: coissac */ #include #include #include "debug.h" char* int2bin(int64_t i,size_t bits) { static char str[65]; uint64_t u; if (bits > 64) return NULL; str[bits] = 0; // type punning because signed shift is implementation-defined u = *(unsigned *)&i; for(; bits--; u >>= 1) str[bits] = u & 1 ? '1' : '0'; return str; } sumaclust_v1.0.35/sumalibs/libutils/utilities.c000755 000765 000024 00000010472 13446627177 023716 0ustar00celinemercierstaff000000 000000 /** * FileName: utilities.c * Author: Tiayyba Riaz * Description: C file for miscellenious functions and macros * **/ #include "utilities.h" #include #include #include /* * Function Name: errorAbort(int errorCode, char* errorMsg, char* fileName, int lineNumber) * Description: Reports an error on standard error and aborts */ void errorAbort(int32_t errorCode, char* errorMsg, char* fileName, int32_t lineNumber) { fprintf(stderr,"Error %d in file %s line %d : %s\n", errorCode, fileName, lineNumber, errorMsg); abort(); } void *util_malloc(size_t chunksize, const char *filename, int32_t line) { void * chunk; chunk = calloc(1,chunksize); if (!chunk) errorAbort(MEM_ALLOC_ERROR,"Could not allocate memory.",filename,line); return chunk; } /* * Function Name: util_realloc(void *chunk, int32_t newsize, const char *filename, int32_t line) * Description: Overloading realloc funstion, changes the size of the memory object pointed to by chunk * to the size specified by newsize. If memory cannot be allocated, gives the error on stderr and aborts. */ void *util_realloc(void *chunk, size_t newsize, const char *filename, int32_t line) { void *newchunk; newchunk = realloc(chunk,newsize); if (!newchunk) { errorAbort(MEM_ALLOC_ERROR,"Could not allocate memory.",filename,line); } return newchunk; } /* * Function Name: util_free(void *chunk) * Description: Returns the memory specified by chunk back to operating syste. */ void util_free(void *chunk) { free(chunk); } BOOL util_findInArr(int32_t tempArr[], int seqNo, int32_t noOfSeqs) { int index; for(index = 0; index < noOfSeqs; index++) { if(tempArr[index] == seqNo) return TRUE; } return FALSE; } /** * * String handling utilities * **/ /* * Function Name: str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim) * Description: chops the string startig from source to the delimeter specified. */ char *str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim) { char *temp; int32_t len; /* returns a pointer to the first occurance of delim in src*/ temp = strstr(src, delim); if (temp == NULL) return NULL; if (includeDelim) { /* temp - src + strlen(delim) -> a string between src and delimeter including delimeter*/ len = temp - src + strlen(delim); strncpy(dest, src, len); } else { len = temp - src; strncpy(dest, src, temp - src); } dest[len] = '\0'; return dest; } /* * Function Name: str_sepNameValue(char *name, char *value, char *src, char *delim) * Description: . */ void str_sepNameValue(char *name, char *value, char *src, char *delim) { char *temp; temp = strstr(src, delim); if(temp != NULL) { strncpy(name, src, temp - src); strcpy(value, temp + strlen(delim)); } else { strcpy(name, src); strcpy(value, ""); } } /* * Function Name: str_removeSpaces(char *src) * Description: Removes the spaces from the start and end of the string. */ int str_isSpace (char ch) { switch (ch) { case ' ': case '\t': case '\n': return 1; } return 0; } void str_removeSpaces(char *src) { int32_t start = 0, end = strlen(src) - 1; int32_t index = 0; if (src == NULL || end < 0) return; while(str_isSpace(src[start]) && start < end) start++; while(str_isSpace(src[end]) && end > start) end--; if ( start == end && src[start] == ' ') { src[0] = '\0'; return; } if (start > 0) { while(start <= end) { src[index] = src[start]; index++; start++; } src[index] = '\0'; return; } src[end+1] = '\0'; } /* * Function Name: str_strrstr(char *src, char *delim) * Description: Searches the position of last occurence of string delim in src. */ char *str_strrstr(char *src, char *delim) { char *last, *next; next = strstr(src, delim); last = next; while(next != NULL) { last = next; next = strstr(last + 1, delim); } return last; } void* getA16Address(int size) { void* address; address = (void*) malloc(size); while ((((long long unsigned int) (address))%16) != 0) address++; return(address); } void** reallocA16Address(void** address, int size) { if (*(address) == NULL) *(address) = malloc(size); *(address) = realloc(address, size); while ((((long long unsigned int) (*(address)))%16) != 0) (*(address))++; return(address); }