From ad9dca840f6964c10d8f832002b806100a1230bb Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Fri, 8 Nov 2019 16:23:21 +0100 Subject: [PATCH] ecriture des regles de makefile en cours --- .DS_Store | Bin 6148 -> 6148 bytes Makefile | 495 ++++++++++++++++++++++++++++++++++++++++++++++++++++ OLDMakefile | 2 +- a.out | Bin 0 -> 8520 bytes astuce | Bin 0 -> 8520 bytes libtest.a | Bin 0 -> 1616 bytes main.c | 24 +++ main.o | Bin 0 -> 676 bytes putchar.c | 6 + putchar.o | Bin 0 -> 684 bytes transform.c | 4 + transform.o | Bin 0 -> 628 bytes truc | Bin 0 -> 8520 bytes 13 files changed, 530 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100755 a.out create mode 100755 astuce create mode 100644 libtest.a create mode 100644 main.c create mode 100644 main.o create mode 100644 putchar.c create mode 100644 putchar.o create mode 100644 transform.c create mode 100644 transform.o create mode 100755 truc diff --git a/.DS_Store b/.DS_Store index 19ffb61de62c02f2c3c1a70ff216e2d251332f6a..c5effae810f6131b3bdaf6c24b66dc4cc767dfec 100644 GIT binary patch delta 135 zcmZoMXfc=&$z8&r$56nK!jR^fv$>IZIU^&-}gE8?EFyn5hioE8a-xxb~cFk<~Zhhmd)%OfB6AJ Cs~`*j delta 98 zcmZoMXfc=&$z94&sa78E diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7a7f077 --- /dev/null +++ b/Makefile @@ -0,0 +1,495 @@ + +# - - - - - - - - - +# variables names +# - - - - - - - - - + +NAME = libft.a +CC = gcc +CFLAGS = -Wall -Wextra -Werror -I. -c +SRCS = ft_atoi.c \ + ft_bzero.c \ + ft_isalnum.c \ + ft_isalpha.c \ + ft_isascii.c \ + ft_isdigit.c \ + ft_isprint.c \ + ft_memccpy.c \ + ft_memchr.c \ + ft_memcmp.c \ + ft_memcpy.c \ + ft_memmove.c \ + ft_memset.c \ + ft_strcat.c \ + ft_strchr.c \ + ft_strcmp.c \ + ft_strcpy.c \ + ft_strdup.c \ + ft_strlcat.c \ + ft_strlen.c \ + ft_strncat.c \ + ft_strncmp.c \ + ft_strncpy.c \ + ft_strnstr.c \ + ft_strrchr.c \ + ft_strstr.c \ + ft_tolower.c \ + ft_toupper.c \ + \ + ft_itoa.c \ + ft_memalloc.c \ + ft_memdel.c \ + ft_putchar.c \ + ft_putchar_fd.c \ + ft_putendl.c \ + ft_putendl_fd.c \ + ft_putnbr.c \ + ft_putnbr_fd.c \ + ft_putstr.c \ + ft_putstr_fd.c \ + ft_strclr.c \ + ft_strdel.c \ + ft_strequ.c \ + ft_striter.c \ + ft_striteri.c \ + ft_strjoin.c \ + ft_strmap.c \ + ft_strmapi.c \ + ft_strnequ.c \ + ft_strnew.c \ + ft_strsplit.c \ + ft_strsub.c \ + ft_strtrim.c \ + \ + ft_lstnew.c \ + ft_lstdelone.c \ + ft_lstdel.c \ + ft_lstadd.c \ + ft_lstiter.c \ + ft_lstmap.c \ + \ + ft_any.c \ + ft_atoibase.c \ + ft_convertbase.c \ + ft_foreach.c \ + ft_issort.c \ + ft_arraymap.c \ + ft_putnbrbase.c \ + ft_strmultisplit.c +OBJ = $(addprefix $(ODIR)/, $(SRCS:.c=.o)) + +# - - - - - - - - - - +# rules to execute +# - - - - - - - - - - + +# when you write "make" in command line it will execute the +# first rule wrote in the Makefile, wich is ALL by convention +# because usually when you type "make" you expect it to build all +# it first verify if ODIR is created and if not create it +# then it calls NAME to create the library +all: $(ODIR) $(NAME) + +# ODIR create the folder where all the .o files will be stored +$(ODIR): + mkdir -p $(ODIR) + +# NAME will create the library libft.a +# first it checks if any OBJ (files.o) have more recent +# date of modification than NAME (libft.a), and for each +# it will execute + +# first it checks if the date of modification of any .o (OBJ) +# is more recent thant the one of libft.a (NAME) +# and for each of them it will execute +# if only one .c has been modified then only one .o will have been too +# so NAME will execute only for this one +# ranlib doesn't need to be seen so it's precedeed by a "@" +$(NAME): $(OBJ) + ar -rc $@ $< + @ranlib $@ +$(ODIR)/%.o: %.c + $(COMPILE.c) -o $@ $< +clean: + /bin/rm -rf $(ODIR) +fclean: clean + /bin/rm -f $(NAME) +re: fclean all +.PHONY: clean + + +all: $(NAME) +$(NAME): $(OBJ) + ar rc $(NAME) $(OBJ) + @ranlib $(NAME) +clean: + /bin/rm -f $(OBJ) +fclean: clean + /bin/rm -f $(NAME) +re: fclean all +.PHONY: clean fclean all re + + + + + + + +# ------------------------------------------------------ # +# explication complete etapes par etapes depuis le debut # +# ------------------------------------------------------ # + +## SOMMAIRE [140 G] +## 1 - compiler avec gcc [161 G] +# compiler un programme... [165 G] +# compiler en plusieurs fichiers... [190 G] +# les .o : pre-compiler... [238 G] + +## 2 - creer une librairie [272 G] +# ar rc [276 G] +# ar rc en plusieurs fois [301 G] +# ranlib [322 G] + +## 3 - fichiers .h [335 G] +# ecrir un header [] +# comment ca se compile [] + +## 4 - ecrire un make file... [] +# makefile basique [] +# ne pas tout recompiler... [] +# fichiers .o dans un dossier... [] +# make un autre makefile [] + +## ---------------------- +## 1 - compiler avec gcc +## ---------------------- + +# - - - - - - - - - - - - - - - - - - - - - - +# compiler un programme qui contient un main +# - - - - - - - - - - - - - - - - - - - - - - + +# quand on ecrit un programme il contient un main et les +# fonctions dont le main a besoin (ex ft_putchar) : +# +# # #include +# # +# # void ft_putchar(char c) +# # { +# # write(1, &c, 1); +# # } +# # +# # int main() +# # { +# # ft_putchar('0'); +# # return (0); +# # } +# +# on peut compiler ce fichier avec gcc en faisant : +# gcc file.c +# et ca sort un executable a.out +# si on l'execute "./a.out" ca ecrit 0 dans la console + +# - - - - - - - - - - - - - - - - - - - - - - - +# compiler un programme en plusieurs fichiers +# - - - - - - - - - - - - - - - - - - - - - - - + +# on va vite vouloir mettre chaque fonctions utilisee +# dans un fichier a part afin de mieux gerer les modules +# d'un programme. donc si on sort ft_putchar du fichier : +# +# # int main() +# # { +# # ft_putchar('0'); +# # return (0); +# # } +# +# et qu'on execute "gcc file.c" on va avoir une erreur +# car file.c utilise ft_putchar mais gcc ne sait pas ce +# que c'est, donc il faut faire deux choses : +# +# 1 - d'une part indiquer a main() que ft_putchar() +# existe, en ecrivant au dessus non pas toute la fonction +# (puisqu'on veut la mettre dans un fichier a part) mais +# uniquement son prototype : +# +# # void ft_putchar(char c); +# +# 2 - et d'autre part qu'on rajoute le fichier contenant +# la fonction ft_putchar a la compilation : +# +# [ft_putchar.c] +# # #include +# # +# # void ft_putchar(char c) +# # { +# # write(1, &c, 1); +# # } +# +# [main.c] +# # void ft_putchar(char c); +# # +# # int main() +# # { +# # ft_putchar('0'); +# # return (0); +# # } +# +# si on compile les deux ca marche : +# gcc main.c ft_putchar.c + +# - - - - - - - - - - - - - - - - - - - - - - - +# les .o : pre-compiler certains fichiers pour +# ne pas les recompiler a chaque fois +# - - - - - - - - - - - - - - - - - - - - - - - + +# ca fonctionne mais gcc doit a chaque fois recompiler +# ft_putchar.c alors qu'il n'est pas modifie, donc on peut +# le compiler une bonne fois pour toute et l'ajouter a la +# compilation finale quand on en a besoin sans que l'ordi +# ait a tout retraduire dans son langage +# +# mais si on essaye de compiler ft_putchar seul +# +# # gcc ft_putchar.c +# +# ca nous donne une erreur car pour compiler, gcc a besoin +# de trouver un main ! +# +# on va donc utiliser l'option -c pour creer un fichier +# objet .o qui est deja traduit en langue d'ordinateur +# et pret a etre rajoute a la compilation : +# +# # gcc -c ft_putchar.c --> donne ft_putchar.o +# +# qu'on peut compiler avec le fichier contenant le main : +# +# # gcc file.c ft_putchar.o +# +# on va maintenant voir comment faire une libraire qui +# contient tous nos fichiers objets + +## ------------------------ +## 2 - creer une librairie +## ------------------------ + +# - - - - +# ar rc +# - - - - + +# pour mettre tous les fichiers .o dans un seul fichier .a +# on utilise un programme d'archive ar avec les options rc +# - r indique d'inserer les .o en remplacant si necessaire +# - c de creer une nouvelle archive +# +# le nom de l'archive doit commencer par lib et +# finir par .a : +# +# # ar rc libtest.a ft_putchar.o +# +# on obtient un fichier libtest.a qui contient les +# fichiers objets .o +# +# on peut l'utiliser a la compilation de cette manniere : +# +# # gcc main.c -L. -ltest +# +# -L indique ou est la librairie (ici elle est dans le +# dossier courant .) +# -l indique son nom (TEST car on n'indique pas lib et .a) + +# - - - - - - - - - - - - - +# ar rc en plusieurs fois +# - - - - - - - - - - - - - + +# on n'est pas oblige de creer une librairie en une seule +# fois, ce qui est bien pratique nottament pour les +# makefiles, on verra ca apres. +# +# ca signifie que si notre librairie contient plusieurs +# fonctions, par exmple la librairie libfruits.a contient +# banane.o et orange.o, on peut creer la librairie +# avec banane.o puis y ajouter orange.o, sans auncune +# manipulation speciale : +# +# # ar rc libfruits.a banane.o +# # ar rc libfruits.a orange.o +# +# revient au meme qu'ecrire : +# +# # ar rc libfruits.a banane.o orange.o + +# - - - - +# ranlib +# - - - - + +# ranlib creer un index du contenu de la librairie et le +# place dedans, c'est utile des que la librairie est tres +# grande afin que gcc sache acceder rapidement aux +# fonctions dont il a besoin dedans +# +# # ranlib libtest.a +# +# ranlib s'utilise apres avoir creer la lib avec ar rc + +## ---------------- +## 3 - fichiers .h +## ---------------- + +# - - - - - - - - - - - - +# ecrire un header +# - - - - - - - - - - - - + +# si on utilise une librairie c'est parce qu'on peut avoir +# souvent besoin des memes fonctions dans un programme +# mais si a chaque fois qu'on utilise une fonction de la +# librairie on doit ecrire son prototype, ca va poser deux +# problemes : +# +# le prototype d'une seule fonction peut etre ecrit a +# pleins d'endroits, donc si la fonction change un peu on +# doit retrouver tous les emplacements des prototypes et +# les modifier un par un +# +# et d'autre part, si on utilise pleins de fonctions dans +# l'ecriture d'un programme on va devoir reecrire a chaque +# fois son prototype et c'est tres relou +# +# afin d'eviter ca on ecrit tous les prototypes, ainsi que +# les includes, et les structures, les defines, et autres, +# dans un seul fichier pour tout un programme, ou dans le +# cas present pour toute la librairie, et on l'inclus +# systematiquement au debut d'un fichier contenant des +# fonctions de la librairie, gcc s'occupera de l'expandre +# a la precompilation +# +# # +# # +# # +# # +# # +# # +# # +# +# # +# # +# # +# # +# # +# # +# # +# +# # +# # +# # +# # +# # +# # +# +# # +# # +# # +# # +# # +# # +# # +# # +# +# # +# # +# # +# # +# # +# # +# # +# # +# # +# + +# - - - - - - - - - - - - +# comment ca se compile +# - - - - - - - - - - - - + +# +# +# +# +# +# +# +# +# +# +# +# +# +# +# +# + +## ---------------------------------------------------- +## 4 - ecrire un make file pour aider a la compilation +## ---------------------------------------------------- + +# - - - - - - - - - +# makefile basique +# - - - - - - - - - + +# - - - - - - - - - - - - - - - - - - - - - - - - - +# ne pas tout recompiler a la moindre modification +# - - - - - - - - - - - - - - - - - - - - - - - - - + +# - - - - - - - - - - - - - - - - - - - - +# mettre les fichiers .o dans un dossier +# - - - - - - - - - - - - - - - - - - - - + +# - - - - - - - - - - - - +# make un autre makefile +# - - - - - - - - - - - - + +# exemple d'un makefilede basic +# +# # NAME = libtest.h +# # CC = gcc +# # CFLAGS = -I. -c +# # SRCS = example01.c \ +# # example02.c +# # OBJ = $(SRCS:.c=.o) |ecrit les fichiers .c en .o +# # +# # all: $(NAME) |make execute sa premiere regle NAME +# # $(NAME): $(OBJ) |NAME execute d'abord OBJ +# # ar -rc $@ $< | +# +# Make a des built-in pattern rules : +# https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html +# par exemple pour construire des .o a partir de .c +# qui sont utilisees par défaut si les variables +# sont bien nomee (genre CC ou CFLAGS) +# +# cependant si on veut mettre les fichiers .o dans un +# sous-fichier BUILDS il n'y a pas de built-in pattern +# il faut donc l'ecrire nous-meme : +# +# # NAME = libtest.h +# # CC = gcc +# # CFLAGS = -I. +# # SRCS = example01.c \ +# # example02.c +# # ODIR = ./builds +# # OBJS = $(addprefix $(ODIR)/, $(SRCS:.c=.o)) +# # +# # all: $(NAME) +# # $(NAME): $(OBJS) +# # ar -rc $@ $< +# # +# # $(ODIR)/%.o : %.c +# # $(COMPILE.c) -o $@ $< +# +# cette regle est appellee par $(OBJS) puisque +# cette variable appelle la regle $(ODIR/file.o) +# +# COMPILE est une built-in variable qui execute +# les regles CC et CFLAGS avec l'option -c +# +# % = "tout" +# $@ = "la valeur a gauche de :" +# $< = "la premiere valeur a droite de :" +# $^ = "toutes les valeurs a droite de :" +# diff --git a/OLDMakefile b/OLDMakefile index 2a5736b..6f1cbeb 100644 --- a/OLDMakefile +++ b/OLDMakefile @@ -123,7 +123,7 @@ ### OBJ = $(SRCS:.c=.o) |ecrit les fichiers .c en .o ### ### all: $(NAME) |make execute sa premiere regle NAME -### $(NAME): $(OBJ) |NAME execute d'abord OBJ +### $(NAME): $(OBJ) |NAME execute d'abord OBJ ### ar -rc $@ $< | ## ## Make a des built-in pattern rules : diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..ca2a6d453345a84aa7ba9f965e656d76186ea2df GIT binary patch literal 8520 zcmeHN&ubGw7@gQwi||FZ0RiWO_E~DE`{{KGS?BH32bouh_2q^4Ymmc2cIYQ#0sPpWnLX<1?ZW z*YK6Yl`Ega7F^1~=ytn2K_=hKj%<9(xE z>V7&PWjekeUl`-rzghPu4)SrG1aWoU4iDYDVGj=ZYtE{hConChlOazquTK0fdfCA$ z-@6&*abj(jrKA(RC`S;Z_G~WzbB-mHj30rs3>w!ZeZS|mW!0@;P0)%GO`-+flg~Ll z=~SX;av?nlOgjZ<9?|UA=S`FSj|<0M_uYH3`SKEC7CZzOt%sGfuC!}-7rKCYm~Gn5 zVg72qSXV*geFxxdWB#G-O-v@Kzgki7%Hci=}nJt+y!Jr84LPxabw_ zU&T^v`9t`@`!!`8UtHW-S=?FP@K7n1{FZ7v`6GqW8}74<+XdTGwb*Lj+v00MtZ4t# zlwQ{(1cq17WKcxMysif**QRk1-@bUBSKhauCWZw|^$vkOdOzZHzNgYy=ia^rd-HI4 z*Uzxp{i9F)Qpo6(J5EX=G}?uxFfFd`$U6S>cHhKFP}OT8zK>lHMX~f$|sNf{%}-bAs*`Q z5uF@u!F%yU-$j{p{7-NK3W?m5Un%2LfoR_CK-*rk&q F{R05D^`rm* literal 0 HcmV?d00001 diff --git a/astuce b/astuce new file mode 100755 index 0000000000000000000000000000000000000000..ca2a6d453345a84aa7ba9f965e656d76186ea2df GIT binary patch literal 8520 zcmeHN&ubGw7@gQwi||FZ0RiWO_E~DE`{{KGS?BH32bouh_2q^4Ymmc2cIYQ#0sPpWnLX<1?ZW z*YK6Yl`Ega7F^1~=ytn2K_=hKj%<9(xE z>V7&PWjekeUl`-rzghPu4)SrG1aWoU4iDYDVGj=ZYtE{hConChlOazquTK0fdfCA$ z-@6&*abj(jrKA(RC`S;Z_G~WzbB-mHj30rs3>w!ZeZS|mW!0@;P0)%GO`-+flg~Ll z=~SX;av?nlOgjZ<9?|UA=S`FSj|<0M_uYH3`SKEC7CZzOt%sGfuC!}-7rKCYm~Gn5 zVg72qSXV*geFxxdWB#G-O-v@Kzgki7%Hci=}nJt+y!Jr84LPxabw_ zU&T^v`9t`@`!!`8UtHW-S=?FP@K7n1{FZ7v`6GqW8}74<+XdTGwb*Lj+v00MtZ4t# zlwQ{(1cq17WKcxMysif**QRk1-@bUBSKhauCWZw|^$vkOdOzZHzNgYy=ia^rd-HI4 z*Uzxp{i9F)Qpo6(J5EX=G}?uxFfFd`$U6S>cHhKFP}OT8zK>lHMX~f$|sNf{%}-bAs*`Q z5uF@u!F%yU-$j{p{7-NK3W?m5Un%2LfoR_CK-*rk&q F{R05D^`rm* literal 0 HcmV?d00001 diff --git a/libtest.a b/libtest.a new file mode 100644 index 0000000000000000000000000000000000000000..e312c0d7b3912fdcf636562d09a815f3100ace4e GIT binary patch literal 1616 zcmbtUPiqrV5TC83Eo)o%;6Xv~i5|RIcQo(v5f0FHp{v>3~+2am(4PkE2!9t$@$v$qx+lQUAFyTtL$w8iiLU> zwRDD70DaU8s638>=F@sBY5=dtyxobbVGseN)VDKf_19h5K*bzGuC=I?kdMdTzApk8 zRNg?HM}0#MLq)lWTA+1`bmjgh8Kc&S38eC~fb+Q4jVB-l5_P4<3T86c}xHQ11YnXfq_4RNhDh_V1TF>Y1 ztSo5Y7`{Nj=X7+9&?ZV6kMnqEesz!Xwz^0aQ(gv*#Q^`ykG3RJ}i0;<4ZR zY8CrOZz(@H?t4Sw`7b-eFO=>l-l5-nZ~a7YIsd7WinnR}9!P$x^E=J&%UBRW#cQ-v WJYN~Tr@ls_|9kVjXg96_@&5-2U$>nA literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..f282343 --- /dev/null +++ b/main.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/11/08 13:33:32 by hulamy #+# #+# */ +/* Updated: 2019/11/08 13:33:45 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + + +/*void ft_putchar(char c); + +int transform(int a); +*/ +int main() +{ + int a = 't'; + a = transform(a); + ft_putchar(a); + return (0); +} diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..7160f6f25d3c6a0013abc94f16c945abc8bee520 GIT binary patch literal 676 zcma)3F-yZ>5WQ4sMQzQXpx}^#gNvX}j*1pCIEYkmku$`UbVv*(#o{Csif$eKDQ*f1 zj;{Uz!9o9ki25$y_tDQm@WH!#?{arJlBbXNuL_YfMhM_Icq76Cfdz0w{2#c~^=I8< zJa&>$_6nHusFy3Pe6w-b9C@SaTF5@R<+!Bog1Im~l9|KPBn!fvyXjdwJz?J6v7aw% z@%wM?W8+iWZ&wjsMXlZW{Rj8xUbKa}(#5$}xwuWd zbG}bb&vo4C%ES;|OQ + +void ft_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/putchar.o b/putchar.o new file mode 100644 index 0000000000000000000000000000000000000000..824021b0886f1afe93a6eb61d44abcf6fc422fb0 GIT binary patch literal 684 zcma)3F-yZh6n?4F7PU2lgMwfO2Nyw{94i{g;2=`LMIIrhq(f^62@Os{LE1sc=udHT z(B0KPAUG&EN(bZjk~2Zp86m*c)6hA03wW zca&+VSVte3CD8qdpk`q9eC~!$-z##=zvnwvrEL|rR6k{D5u<7?aTi<#^Ji%;5D5Xf zRPqUg=sPSch&WIB4#*sGR#T<^9Zv1Zt37%*+vBeX=`op(tt?meZJfPHAA4eb+M_4) z{IS$ky?;J-DV@(K-ncp;BQXtgsa8)>wTaw1m}Uj^|IvQayr~>Cs&WX}08yTABUa^t aWmyy&h$V{;?nWHMk?T7l@i6Q~9{m6d|3u;d literal 0 HcmV?d00001 diff --git a/transform.c b/transform.c new file mode 100644 index 0000000..4fa854c --- /dev/null +++ b/transform.c @@ -0,0 +1,4 @@ +int transform(int a) +{ + return(--a); +} diff --git a/transform.o b/transform.o new file mode 100644 index 0000000000000000000000000000000000000000..3c17daeb6d2fcfef79ff5cb1e97f63613f3d7196 GIT binary patch literal 628 zcmX^A>+L^w1_nlE1|R{%EI_;i#83cYAdm!N3lJX%sDO&!fU1GtHx zttf%8A^Z^6h!6xH#u9-tK<0tm0tYM%4RAJ)5g(tNpIeZaToPZJSDu-d5+Cp5f-Elq z>Lw-s#JiQWq^3ae+Yo7V{qgX fXk&8bWkWI?sGJRCFh8>C@g+rxdBth@MY#+BMln04 literal 0 HcmV?d00001 diff --git a/truc b/truc new file mode 100755 index 0000000000000000000000000000000000000000..704aeb393fda8aaa24f743376925b3ee50e8be39 GIT binary patch literal 8520 zcmeHNOKVd>6rR|sMN6By@NK;m6m`+o$D&9ViS*hOi?3D?p^QnJkU)}_n;Y7K#bOl_ zN~H_;y6^}13w%_exN<4Da-kBzg3DNn@%tuo)0~gy(U}o%V(!k*$J7-CMFTonBOyv$2FqR zuEVRkYbDpA1eJ0iJQ}XK1^KR92X8%m>wrB{!h%R~LR4y$rCb z&u&4zpSBjuQq+lF)K}pn_v|mg<{ZnY>E8`y?HBG#>fhF@WHszx4bX-fU7{7*lg~Ll z=~S#|Vm3Vin{o)sJnp{lOYZyBzxFtvjD8q=d+!W<7Bm1AZM&4Rt+;Di37kSZ$UZG6 zFn{7$*jIkxbNis|WB!5lPnb$zGZ*ADGMjVbneGeS$SV~?5ac+N`14kk&y(6FUq%cA zh5^HXVZbn87%&VN1`GrLnt>aU;^*Sr#^T(@!fFMLVtMR!qPzX*ef8kPGW#P7--4_5 z20g2GnJ=G9FW1ByA1ahz@SI&-FW42; ziY(GHFkl!k3>XFs1BL;^fMLKeU>GnA z7zX|e20FTe*O+KWh?j@zGF--R-;B%aYmQhJPOu{+r=64=hd~KQ+{ZV|Oj5>Y;^TQY zj=SzC!~0w(n$0C9os8(uL{nK2PPlR^?~W&