From 71ccbeffe6b26f75a4659a6a51c7f8e0fb90ea31 Mon Sep 17 00:00:00 2001 From: Tropicananass Date: Wed, 28 Jul 2021 21:26:40 +0100 Subject: [PATCH] multithreaded app --- RpiLedBars/.vscode/launch.json | 7 +- RpiLedBars/Makefile | 36 +- RpiLedBars/cava_config | 25 + RpiLedBars/cava_test | 25 + RpiLedBars/file.wav | Bin 0 -> 432044 bytes RpiLedBars/install.sh | 5 + RpiLedBars/pixled.service | 12 + RpiLedBars/res/.asoundrc | 50 ++ RpiLedBars/res/install_i2s_mems_mic | 18 + .../{src => res/pixled}/rpi_dma_utils.c | 1 + .../{src => res/pixled}/rpi_dma_utils.h | 0 RpiLedBars/{src => res/pixled}/rpi_pixleds.c | 17 +- RpiLedBars/{src => res/pixled}/rpi_pixleds.h | 9 +- RpiLedBars/{src => res/pixled}/rpi_smi_defs.h | 3 - .../{ => res}/src/artnet/ArtnetnodeWifi.cpp | 0 .../{ => res}/src/artnet/ArtnetnodeWifi.h | 0 .../{ => res}/src/artnet/NodeReportCodes.h | 0 RpiLedBars/{ => res}/src/artnet/PollReply.cpp | 0 RpiLedBars/{ => res}/src/artnet/PollReply.h | 0 .../{ => res}/src/artnet/artnet_op_codes.h | 0 .../src/artnet/artnet_protocol_settings.h | 0 RpiLedBars/res/src/cava/rpi_microphone.c | 159 +++++++ RpiLedBars/res/src/cava/rpi_microphone.h | 42 ++ RpiLedBars/res/src/cava/rpi_spectrum.c | 447 ++++++++++++++++++ RpiLedBars/res/src/cava/rpi_spectrum.h | 14 + RpiLedBars/res/src/output/raw.c | 15 + RpiLedBars/res/src/output/raw.h | 2 + RpiLedBars/{ => res}/src/smi/VitualMemory.cpp | 0 RpiLedBars/{ => res}/src/smi/VitualMemory.hpp | 0 RpiLedBars/{ => res}/src/smi/utils.h | 0 RpiLedBars/{ => res}/src/tmp/main.c | 0 RpiLedBars/res/src/tmp/rpi_cava.c | 93 ++++ RpiLedBars/res/src/tmp/rpi_cava.h | 16 + RpiLedBars/res/src/tmp/rpi_microphone.c | 103 ++++ RpiLedBars/res/src/tmp/rpi_microphone.h | 10 + RpiLedBars/{ => res}/src/tmp/rpi_pixleds.h | 0 RpiLedBars/src/artnet/artnet.cpp | 1 - RpiLedBars/src/artnet/artnet.h | 4 - RpiLedBars/src/drivers/common.c | 49 ++ RpiLedBars/src/drivers/common.h | 50 ++ RpiLedBars/src/drivers/dma/rpi_dma.c | 90 ++++ RpiLedBars/src/drivers/dma/rpi_dma.h | 33 ++ RpiLedBars/src/drivers/dma/rpi_videocore.c | 125 +++++ RpiLedBars/src/drivers/dma/rpi_videocore.h | 33 ++ RpiLedBars/src/drivers/gpio/rpi_gpio.c | 75 +++ RpiLedBars/src/drivers/gpio/rpi_gpio.h | 26 + .../src/drivers/leddriver/rpi_leddriver.c | 132 ++++++ .../src/drivers/leddriver/rpi_leddriver.h | 19 + .../src/{ => drivers/selector}/rpi_selector.c | 0 .../src/{ => drivers/selector}/rpi_selector.h | 0 RpiLedBars/src/drivers/smi/rpi_smi.c | 223 +++++++++ RpiLedBars/src/drivers/smi/rpi_smi.h | 14 + RpiLedBars/src/main.c | 306 ++++++------ RpiLedBars/src/rpi_artnet.c | 70 --- RpiLedBars/src/rpi_midi_controller.c | 95 ++++ RpiLedBars/src/rpi_midi_controller.h | 10 + RpiLedBars/src/rpi_param.c | 1 + RpiLedBars/src/rpi_param.h | 4 + RpiLedBars/src/tasks/artnet/rpi_artnet.c | 139 ++++++ .../src/{ => tasks/artnet}/rpi_artnet.h | 6 +- .../{ => tasks/artnet}/rpi_artnet_op_codes.h | 0 .../{ => tasks/artnet}/rpi_artnet_packets.h | 0 .../src/{ => tasks/artnet}/rpi_artnet_utils.h | 0 RpiLedBars/src/tasks/cava/rpi_cava.c | 146 ++++++ RpiLedBars/src/tasks/cava/rpi_cava.h | 16 + RpiLedBars/wget-log | 11 + 66 files changed, 2527 insertions(+), 260 deletions(-) create mode 100644 RpiLedBars/cava_config create mode 100644 RpiLedBars/cava_test create mode 100644 RpiLedBars/file.wav create mode 100755 RpiLedBars/install.sh create mode 100644 RpiLedBars/pixled.service create mode 100644 RpiLedBars/res/.asoundrc create mode 100644 RpiLedBars/res/install_i2s_mems_mic rename RpiLedBars/{src => res/pixled}/rpi_dma_utils.c (99%) rename RpiLedBars/{src => res/pixled}/rpi_dma_utils.h (100%) rename RpiLedBars/{src => res/pixled}/rpi_pixleds.c (97%) rename RpiLedBars/{src => res/pixled}/rpi_pixleds.h (90%) rename RpiLedBars/{src => res/pixled}/rpi_smi_defs.h (99%) rename RpiLedBars/{ => res}/src/artnet/ArtnetnodeWifi.cpp (100%) rename RpiLedBars/{ => res}/src/artnet/ArtnetnodeWifi.h (100%) rename RpiLedBars/{ => res}/src/artnet/NodeReportCodes.h (100%) rename RpiLedBars/{ => res}/src/artnet/PollReply.cpp (100%) rename RpiLedBars/{ => res}/src/artnet/PollReply.h (100%) rename RpiLedBars/{ => res}/src/artnet/artnet_op_codes.h (100%) rename RpiLedBars/{ => res}/src/artnet/artnet_protocol_settings.h (100%) create mode 100644 RpiLedBars/res/src/cava/rpi_microphone.c create mode 100644 RpiLedBars/res/src/cava/rpi_microphone.h create mode 100644 RpiLedBars/res/src/cava/rpi_spectrum.c create mode 100644 RpiLedBars/res/src/cava/rpi_spectrum.h create mode 100644 RpiLedBars/res/src/output/raw.c create mode 100644 RpiLedBars/res/src/output/raw.h rename RpiLedBars/{ => res}/src/smi/VitualMemory.cpp (100%) rename RpiLedBars/{ => res}/src/smi/VitualMemory.hpp (100%) rename RpiLedBars/{ => res}/src/smi/utils.h (100%) rename RpiLedBars/{ => res}/src/tmp/main.c (100%) create mode 100644 RpiLedBars/res/src/tmp/rpi_cava.c create mode 100644 RpiLedBars/res/src/tmp/rpi_cava.h create mode 100644 RpiLedBars/res/src/tmp/rpi_microphone.c create mode 100644 RpiLedBars/res/src/tmp/rpi_microphone.h rename RpiLedBars/{ => res}/src/tmp/rpi_pixleds.h (100%) delete mode 100644 RpiLedBars/src/artnet/artnet.cpp delete mode 100644 RpiLedBars/src/artnet/artnet.h create mode 100644 RpiLedBars/src/drivers/common.c create mode 100644 RpiLedBars/src/drivers/common.h create mode 100644 RpiLedBars/src/drivers/dma/rpi_dma.c create mode 100644 RpiLedBars/src/drivers/dma/rpi_dma.h create mode 100644 RpiLedBars/src/drivers/dma/rpi_videocore.c create mode 100644 RpiLedBars/src/drivers/dma/rpi_videocore.h create mode 100644 RpiLedBars/src/drivers/gpio/rpi_gpio.c create mode 100644 RpiLedBars/src/drivers/gpio/rpi_gpio.h create mode 100644 RpiLedBars/src/drivers/leddriver/rpi_leddriver.c create mode 100644 RpiLedBars/src/drivers/leddriver/rpi_leddriver.h rename RpiLedBars/src/{ => drivers/selector}/rpi_selector.c (100%) rename RpiLedBars/src/{ => drivers/selector}/rpi_selector.h (100%) create mode 100644 RpiLedBars/src/drivers/smi/rpi_smi.c create mode 100644 RpiLedBars/src/drivers/smi/rpi_smi.h delete mode 100644 RpiLedBars/src/rpi_artnet.c create mode 100644 RpiLedBars/src/rpi_midi_controller.c create mode 100644 RpiLedBars/src/rpi_midi_controller.h create mode 100644 RpiLedBars/src/rpi_param.c create mode 100644 RpiLedBars/src/rpi_param.h create mode 100644 RpiLedBars/src/tasks/artnet/rpi_artnet.c rename RpiLedBars/src/{ => tasks/artnet}/rpi_artnet.h (51%) rename RpiLedBars/src/{ => tasks/artnet}/rpi_artnet_op_codes.h (100%) rename RpiLedBars/src/{ => tasks/artnet}/rpi_artnet_packets.h (100%) rename RpiLedBars/src/{ => tasks/artnet}/rpi_artnet_utils.h (100%) create mode 100644 RpiLedBars/src/tasks/cava/rpi_cava.c create mode 100644 RpiLedBars/src/tasks/cava/rpi_cava.h create mode 100644 RpiLedBars/wget-log diff --git a/RpiLedBars/.vscode/launch.json b/RpiLedBars/.vscode/launch.json index fd94da6..393334c 100644 --- a/RpiLedBars/.vscode/launch.json +++ b/RpiLedBars/.vscode/launch.json @@ -11,7 +11,7 @@ "program": "${workspaceFolder}/bin/pixled", "args": [ "-n", - "5", + "60", // "-t" ], "stopAtEntry": false, @@ -27,7 +27,10 @@ } ], "miDebuggerPath": "${workspaceFolder}/sgdb.sh", - "preLaunchTask": "${defaultBuildTask}" + "preLaunchTask": "${defaultBuildTask}", + "logging": { + "engineLogging": true + } } ] } \ No newline at end of file diff --git a/RpiLedBars/Makefile b/RpiLedBars/Makefile index 6e0de35..d7cb743 100644 --- a/RpiLedBars/Makefile +++ b/RpiLedBars/Makefile @@ -1,24 +1,24 @@ -CC=gcc -CFLAGS=-Wall -g -D_DEBUG -LDFLAGS=-lwiringPi #-lpthread -SRCDIR=src -OBJDIR=obj -BINDIR=bin -SRC=$(notdir $(wildcard $(SRCDIR)/*.c)) -OBJ=$(SRC:.c=.o) -BIN=pixled +CC := gcc +CFLAGS := -Wall -g -D_DEBUG +LDFLAGS := -lwiringPi -lasound -lfftw3 -lpthread -lm -all: $(addprefix $(BINDIR)/, $(BIN)) +SRC := src +OBJ := obj +BIN := bin/pixled -$(OBJDIR)/%.o: $(SRCDIR)/%.c - if [ ! -d $(OBJDIR) ]; then mkdir "$(OBJDIR)"; fi - $(CC) -c -o $@ $< $(CFLAGS) +# SOURCES := $(wildcard $(SRC)/*.c) +SOURCES := $(shell find $(SRC) -type f -name "*.c") +OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) + +all: $(BIN) + +$(OBJ)/%.o: $(SRC)/%.c + if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi + $(CC) -I$(SRC) -c $< -o $@ $(CFLAGS) -$(BINDIR)/$(BIN) : $(addprefix $(OBJDIR)/, $(OBJ)) - if [ ! -d "$(BINDIR)" ]; then mkdir "$(BINDIR)"; fi +$(BIN) : $(OBJECTS) + if [ ! -d "$(dir $(BIN))" ]; then mkdir -p "$(dir $(BIN))"; fi $(CC) -o $@ $^ $(LDFLAGS) clean: - rm -rf $(BINDIR)/* $(OBJDIR)/* - if [ -d $(OBJDIR) ]; then rmdir "$(OBJDIR)"; fi - if [ -d "$(BINDIR)" ]; then rmdir "$(BINDIR)"; fi \ No newline at end of file + rm -rf $(OBJ) \ No newline at end of file diff --git a/RpiLedBars/cava_config b/RpiLedBars/cava_config new file mode 100644 index 0000000..b3c7247 --- /dev/null +++ b/RpiLedBars/cava_config @@ -0,0 +1,25 @@ +[general] +framerate = 60 +autosens = 0 +sensitivity = 200 +bars = 128 + +[input] +method = alsa +source = plughw:1 + +[output] +method = raw +channels = mono +mono_option = left +raw_target = /tmp/cava_output +data_format = ascii +ascii_max_range=65535 +bit_format = 16bit + +[smoothing] +integral = 0 +monstercat = 1 +waves = 0 +gravity = 0 + diff --git a/RpiLedBars/cava_test b/RpiLedBars/cava_test new file mode 100644 index 0000000..24f246c --- /dev/null +++ b/RpiLedBars/cava_test @@ -0,0 +1,25 @@ +[general] +framerate = 60 +autosens = 0 +sensitivity = 200 +bars = 20 + +[input] +method = alsa +source = plughw:1 + +[output] +method = raw +channels = mono +mono_option = left +;raw_target = /tmp/cava_output +data_format = ascii +ascii_max_range=65535 +bit_format = 16bit + +[smoothing] +integral = 0 +monstercat = 0 +waves = 0 +gravity = 0 + diff --git a/RpiLedBars/file.wav b/RpiLedBars/file.wav new file mode 100644 index 0000000000000000000000000000000000000000..9aa2a9494a3fa1a9f3b9efbce9d64110e9ff8054 GIT binary patch literal 432044 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 sA$s&?|D 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 z%0D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

k5lL`&R9KA9>&Ezjw;gNM$vLEi?_p8=!A% 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

y2i^{P zJU*9pB0jz47j5fH|5-_Jn6z63BJm) zOhway?2ogWVY{m{UN7UdO&R~x7tTN%bNe`B>O4Z4DNS|5j)RN=tjp!y@N873)$*B% zmd(e!og3c}=TO;>O(DyyQKZ+*4KjC*ax67o2)n?~;e7|%{d`Yfa_$CvWKFSMJkUz&X+oWnyeM&rN%oG@QHQbkoDwrwtiW7i-PT=RM8kJ)``|C^ZC;J zgI_=KFBu~}C!bgcQm1Kxwm~1~3(>yso9(3)-l>hb)*!q;5dKOz{#55n1=fnYb5oR_ao(KZQNK{er$W?=hx}y>*Xsx_D!cNe_Q^z)B37* z(#jaGukrMo&MNITew;6#9sVo*EFI+=WBtS0dK!%WaqYT~GJRs)YEBaSsD-uE5@@^n zt`5rVUQE818)pj*MbjMRo#}rtkIP|evLRfYF|LR23+i)+vE;?-`UGXaPrA?ikM6VQ zA;#I?8)tuMeEdB>TlR(Vr1kQ`Sny@^vG3E@_tcdx?DxC|rWvaqi&Iov`$&=o8~R@dYdbK z4x5MZR`or~c(Quf&p5e@a1n5@GHk}THrktgdpG`gr!Dr$F+4s4 zpZd0a0sG&1qi@}W#~x*{2bHXY=54+u-tB|VH~9HczLS)5xcC^SJuY2e?fiK2ucwrA zi@1(xw)tNQ_H*PBdxvqB^kn(A<_=PZkN6w%5AlsFgyX#%w&_!mnCEHNr)g);1dacr zqPhLU+G0K5(#G8Ga^Di~^E5Pftpx$k+!x5QnY!P?Gh`Pl!=x5&E~ z+Ewr&w+>hTy})z)*GqqieD6_S{j2ci``!Mh8^w23heMUIr?SL+Irf38E33Okc^}_# zmNLX!t&hXifqM!r=GyF(rjL~KZV+cw#;TXA@Gqhcz1x~=fXV2mzJvwT(K`mgL4c zjp<}uoF!prIj!Kv9+UG?Irbrs#M66HDc&;fDy}G8cMx{c$}7t`cy=Sh&M^KcPDVz% zjC{+Y{Z?LAh(FQy#XZS*!)mE-j62nFmgIhUT&0ep-A+dvdz>NHswvm)%D`XPBYuIO zo%(zunHA@@u133D9mKr)E@O+)+*R_9vs?Ba3VT@(DG!_3=^sPsQczaE4QZ5w}iqH*;Myv~=$yhzU-4R<}BZ}a~qU1j6U z8REW#FNgoZ_!%?jrQCFde>=N(m$QjmoJAZZ-Jf_oJ8l7@whN7CPVfkUP8^(Hv@gd6)cdMYB_UX>cO{AY->L z)y2ueyXDna9yOI|GyK!a@Ru@7Ko?`)*c)&sD1D<&4p7fA-hV+^AC~4RWe9uXPy3cB z%HS?V{u2ICyu87emVox+m#L?1;%dV$k%xOMg*(AdiLWe=umu=*L(WCl03Y{I3VRO6 z;Cr$14VLzI<@qo8it8hNHGJzxyTbT4_AR6T4Ab`SSJuJ)yGP+;u5phrd-C~nV0|FH zuN}qOL~r;j`S0RB;@hsqqmedboRq>YNMqmmiS*^f-Njum-!k%#y%pp59Cqy&f`)iB zQAhtN&syaTJM|C1Es)1G;wyPq*S_{zSemb!ag`D1Py_v~W+u}8j-$!Dr^ zzT$iAVHeiojUQ5d;c;mH!tYt-c}uy9>gU#l@>|?^$GI1pSM}Zb{I#W7r|%pITIri_ zqp|LlhoPB*ChjE7P@a$Qd|KEUtn6K|{5Jeju6>~Vj&HqMe(WCP7ko>sIk-EPKF~&- zWzMz5{f@^7ar4o;iSe6)w)}57-^*&t!-J~DeNu& zh;Iwwv3OLCJd~k`vX~#|$E6*l?l(yDuDHRzG0tKqZoDzKMxOD$T=2RXeRc30y5Hg3 zz<(-iUoGB`F1)E`3|>e_E~Zg<#9gs!aJQi)Bhzu*cFH{*?j8QvyWOhXvA$*fA+3h9 z51-=>X(qcbB5QBsk25FF`u5m|vPPM!!gnU)LvMAZmyV?iz5wIt3wt+(b0Ck<5!1={ z%f$aeCs=Qew*iwkU2``yJLsmi#yod~?xI_}(G$*(SD$HB;gV>vnJG9QRqu`0pubm~^8#rVFxM{VvAAOx4;1~S~ z)ON~(#%Qbw7TzhfUKnrJZ}3qc1IeA?izk~%W`w@ICxV%#5txqpu70EV;t-E_WSd%%I3^Wp`K!Y@n!T~ z)RXgt=|FACJ(J|k?p#70#d+-GVvOW}AMbw-_ggfz_+w9^x^{BEHut8s^{R2wFmRmk z#oEeJZO6$iu7jg+P_ z+(@*qnqR+ekLzympuMdV%+DXPA9j5e=a}t-)rJ4co>NErXG78UwBL1vJv_Dz^95-4 z692PscmCVa_mi%xK8AYhnNGoXA(YxC>WFxrX|dup_OUxgwgdFRhr4xoKA545XL3vX*4lurtMsjW-Un^r$4S3Poek&O z>q}MPKE=N}e+m4q6z&S9p&zbn_8!wp^!up)A^z*I)BA(}@&o@>?3X@{_E0oWDPL7_ zWMSB|H&z(Wo_1F~iI{u#ix1#u!1#`ewP#*4Wuor&2lq=4_-zty&&>tdC`@#84 zVeb~D+qhANyWs|?kE-(Rg#I~vzJ~h=?gHPkO+Ear{Ff=)7;zuNcLCo@zX;uYyiV6H z!`{MM!n@_aOZ;2PeULma;kFb$N7_5M@A?LB8Kwux@TvMjoO%Bl&YASWdqFqoBh%o& zF<*_d>ofEzd-bW5&tQ-Ct2j)N8t@nXL?c>axm_AJIj|Y zActaK?Gf^#8J^ZA;yt;%ihOg1CDu37hvZsEGHo6AOL*grjPLq#4!t|3gf1v*Xk3n4Xku+1<7wBEm$=wp zx`RAz%-_T~W`Xf*tfSv;3{Xuu_CtRY|2uG7jfb1l=k_$xtLU9S2|EJ$Ex60Y#l5N3 zpcvja!TpVwyVmJ<%f-+>(P!7E@ONg_nX^;xX@!PBTrK>fG13 z52O9YyrjBxE%__Jova+@54o|lCCpb2cRy+pnqBf6E8l&=8|GVYvmbPwdsksM7LW9# z_|v%4-OFO*FWqKtbE|NaX9zw6(ft9x)m-KS_K9{1*Tl!2uiS&%TpkCa8{sb27t+SP zuRh$10bB9;3;2;B-a;y=obJb^MZS~Gq=Po_!yZV88%KyIdpX}Q^#J8(I`z)~^ z5ql*02X)yU3`f^geAq5pA+DUbFQoZZ+zS8Q4{+1`&sTEejMHfJm->iAjbHWqpfL2e+iER_CeFD(qF56EznMH)hAw|=fBi%Vt?==ZtQ{YuaDfoe*=CM zrH{FWecbe@zETqX4sH8A{JKgrm2SOJUmT||KB3=L5`IE|nhH0H-t0^!bTr;d#$+?- z+Cz=iVx2tJ#N*yTQ}}qF?hG`uz^&3O;J!!i#(LXI^5kpsWr1fgSqUj=U!kl*%NQKJwvAL55FG2tK}E#ke89a_kxeDP23LGRsQX{)_ijjaUj0y$LSf>W=p+o>Z23%G*JFNAc6}pUjPO8SX?C z-s0SdccdSJ{t@L`LUtM#6o|nrb?si39&UmDo#XDmZ z-;tl@Hx|wZfhOqVZtg5`CHZH=El>w*)X&rWS4cY%3>KbE&aWZw-B-%hqm0V?sdN*3 z*Ca3k?s~XKd=ncuxs`9}fp^>?tE+yxDDRaZ-g%z};*3??g9v-d@jlFL($yA@|J+_m z{*Nr*4F>Q(ioPvqZ;a+HOWK#*?QZ$D(Z^?p!?FrA@zSr|~vs>=nO7zF(?s4ipZ%Bj0NGZ)>kjwfRG}<-dfN>IdV% zpZda+(kFc9NaMUg-mZUb)CV6I{{VV>tm$;_spP8t!W8xtVxC+-WHC8BMju?SpPm?U zSp0cl4VqWE6VP1)O7M5XuPJvLI{UGCnLZr0BjT-2HXw2dGV22}e*p9;5$j6a$G34D5K8}7iS(CtS{KSO?(iH|d<_RQ0K z?%vXNK|2Y=TtDpotOxe%(+qHt_I#(dxDqb*e`8NS_Tio9Eu5c;H&Lz^_qDLOT5731 zKWVHIXPH0X9;?mU*Ur|H@)`QiA!Pqp_(kyaNt|IxrK**C9#mXEou{8VQ=cx-|3BgV3~sr;7Uw&n@9N7r-X!QKZWEo+g^U;+ zdVw4JzTc1`_ApX4@+c07zD?FxThHfl9|otBGbfTemy)gZ$gMqOU(CB!kZo;^Z>N!w z|B-*i$h&wm?{)I;Bk@bo)*ugK4`()gu}$31V6$=c3EbDfFUGygjH@p+CLaVgfeVbK zA2T00+Z-s)7#?bT{UQAOWNJh7+l|E+nL~6pC#YpkQcqmiYk1UH{6(|}aZ8IEZhSt7 z8}qf|=0~Rk=N{8Ud^f`N$-DY>{vet?I2a@&CbZ0Zrf+ znP0`*N8S@k4XUuWP?Zd>VGX~gaeXbeQfiXzHMnq}f&Jia5x0{6chI!9dtgVJGuE~5 z!wq|@ovS<3i1#Y-2Z*l@U;0REIkoL&NPj+D_d3q~!&R?q4@%nm>)8|G_byTHZH_or zo_8wmOwb>%Ve*`Z_oLFihhJOnK>V)5uM+x~!M*q%4K70avN9YXZE5hJZ*Prmb(2;zB|-yU2$2Oiu_f!&dp9;!@Sh&;zdXtRSJMCZy!O&ad-(|6 zX6gO|Q~5`jTP~C?-m~%^WnQhlZPhkk)ox>+zdv5Z#XGZ`j{}EmSLR}QES~rUk85PCFeH!;p3wKA{RV&!hiaSVOk|kje>nd;( z{XCH@noo{Z1n-k+Wy!y@$V6-EInLI{*_N;|)}HLLwqAITu#vdfEBHZtQR9Ix$j1xG z*?DC7Rx9b;V zWG%YxV>L@1IjDo)!g6I-x6@7?+?4KZ*a>CpUOR(8+%Y+qx;x5-X*YXW@{|P{?tFx#e1L=@z`ITxAlMR0tbp;<$vlc{!8_=O5A9;9{$_b z{=>uMwHQ3iE{uQ*DuE5@1VV)NI zd@Iq$osy~Y3VUOdr5xTtuUHg;1U|qkk zN7REJKTuz~6@(qfYlQa)6ZEaP7ui=|9I7A2T5_zd#+W?rH})3SjlPbx{1yB$1}8>S ztkVoaUlaY7=)?MSOMTn?FYSag-N~(mXOSauw)~{xWDEIlPBC*NxO?FKAV2;iPh!8F z3@O~%aL+p*57%7WOJqx&J?Jd1CwgaM@)mNaKV2U>{9ZJtl5e+@VcyJ5?{nk)#7*SW zY_JyJpV6!ZwS-sTVV;ur@UOw^G5D+b+siZd-<^X$@{*z2g|n`Q`Kh-M?#+$sNx-!tGS^oMf~64wsh^Z4(LUuR+S#=@JugU~MrxB7-r zaO`@d^U?N4S6kZ7#7%+!9gyqkA`tVrI@~xXavy{av?0$2!Jm`b6B3yhNWlNPp;MY|Hj@+NJ-*S>f^e z;yiurL47ICfU@tDK8BkBZqhd^2_H`9Op+$fJjaXj`>Op@}(U466auJ4l{(D`G}mWPeyei z$L5MV8!l{z76oKg;mp84AIB(wMC9x410Jk%wGX(43|^=F8^|}b6W6Pw^}b7d=%e=FHF$4- zCHBD69`G4|SMVg7>EHwOZMc*1sLWlDUw6D;fUhRs$;#MUzDI-(^gRy=mlh5i_tyS$ zbLq}o=NqLfE&t8j3#9!XuDb9>;m5eGl%t*UTrbUo;x83nPulv*v=l_0+`%mYKIGp8 zj+cMD&3*%1N%b*M8UCa{_EGOW=$N|v6ToZqkoT(6C~zsAv6uJ;a9il8li}ur>(Ct| z{E>QOwR0IJXcsy4w5S>-xXD7@JJ+|NQ}+B~BmuZ%cu&hczBJBN6&0T_L@3 zM`|s7J?&`_cnP18csM7K7t;mLX=6LJtyo*$sBO95n8Geo*r<*5;v3Pti>9GAAM4eZ zlJ#sQBbh`+J8Dc~diun96!`g_TNW`MlO zMah!u$)jWr_b2(((b#n_5NA^3>?hfkhLEYpp}7;yIAh}fjFVd#GkP7 zI-O-~UlEK$XP+wek8;cd_A~dp1N9&DO;0}=H60o27%-|~Op8LBw%sPC^I`{6Bk}vJJzdD4KWCM!9Mz<6q*Ip??PL zGu)x*CIWND+)=&_A{xlm@X#-fsA7{Jk ziLZ^WJAHjH9XdvTyj$O6`z5aiujpG}fSZ7I-Tb6J80RkEM*ELGHV?cbziUB^b9PA^ z`g)tb=?q5h2b`}+?TY-rP4ULNjoV@35f@6%W^xg1?yG1{X?N|E`8*e=PfO`*%kyRY!ye;fTywwN6z(wjIb)dirw50tgD=2T{#oiS#!i*|=W&K^ zt2*?~Z;EkMoY9MWba6JWy#LZ3TP}-!i~rtv&fHkK&EjKU_ag1Xn;+>qZEinpj!p8s z8qFAO%YDxjZLlJJcDVS~;vNIeQsv#+Y1}Q1GhvI(p{$waaqunC|A0^2JzIqjo6Gq> zW&Bk9&*C2fF{X?=4Nr4VLiasri2n)F)yMY?ZJwQ%^x1A}*!_&A5$ zO`4a{pRAw0ppQ2uFE-J&v4^%?`T^3f2lL^|kps6&w@JTV6@D^eGWk@NyovMRSD?9B z`hMijkJ4Bp%4Nj=NETg4E`?3J*yEzFV=XE*g*%1ZdmR2~`Zweun}2y3**99;Ix_Ne zGBg7^INp%R^~l(G|9v)ndNx_zf^5E7`Uc>5^qa`tkI+rz&JsQ!oW>vT$X_IFy!&)H z`R@egzRO8=wsxs#oi;a7=UQNB~r#yas_@T|0# z2>**V@*5HH*qi=;S02xxYa#6dJc8d9XnLV(0O*$dm@;(nZO?P973VJSadsnk z#oKPqWaJ*wUrUcv^}VI=86;c^uNw0FO8q^e{$l^Kp*miMt^|K?|HmT#*G~WMT5i~n ztl&Q}_l&b0VLLEA?f;HD;N|>}v8Omx{hLeX3-Ecsf8{Jv8Yz4Xc+-Ds?wCIF{~jlO zUG#7IzhnP&qBhk|TWZAL72iA2#XIj0gKzw=?SrrO@&o#tl%*y34tRSbN1Lew?$GZ3 zQkJk+I2?@A=FGeEMZlUuI-C0kT+9P^(;*LO|8WlNCwiiv_S_QgU${-eaW~{oa14K2 z{bvp6FK(L8jk`N>w#3=)+$6@Z`t)1+YZd+RQV@4^7YfI@KJOo-{q^Z)pojij8SP=x zHN)p~{bwv?)=>W%D(`vlpX#qilN0V~<&I>-kH9)gavwV_!|y)*_ixZ!K5PYsjllF9 z{{-%#XfD#X{}u1dVCo4PDGQrO=|s?5nc|+dJIZlSJB1C9Kb0xYtQ-j+ch1~3O>vh! zbYoX?aRt~**}d10J|G|Iw%n24d4N3JLhr;m;VyrUI18NO4)thp zalbO&l$e88%!SY3cYeNbPSx4yw6AiUA^rFKqK z`O0ndT-=?!mX4T8KR8d4H_!jn;)!RC}Xzlmf~oFQ>fEngu%&TGUuhtOH0$-QCR=g6`q z_>Lf_;w*~$XYr0us*cxM{NKfEOvp`fvBt*@TdwJH^baZ9^W5UX?a-W!_6NNFfD1YL zviPf%eY>(hs+=py>x0Pj&`YD}nVY%xcG4vBz7u)gkAD{T8Z_>eW$zN?u+82Wv?upV zieCXx=&otQT+3Do>?nng;NHNzYWLo95D`F;9&-?gt${0H$S@(5{TJkS~3$pwhA8!4yF?9z6YYe#X%u!(m3p7vFRJ6L#% z_>0k*3+BJH#r?EPYp?lYZM-*lU;mk_Kiy*d_X_teadG!_Dcb$f?!&F5Uo?RW8#3Ls z)t&M?1MfH+btwG#z?r7h8$RqPvuT{-?9nJR&x4}!{}$XR{uJd1+cMwb8TM#4%Y$9h ze2c#PExp~7USA{JgU)x~D<7wfX8~(NX%3nt%D6AOD?kPC8vOa(uo3eDIkC>)b}U(O z8rkt0dDE5LxdhPhxwW{v=-=P?U#9b$@xL!k1!=pHGnWd7JkIHzBm z4D)75_QpV30^c5P47pd9tSe0>-bW5TMlOCs{yFE6-iLpce;U15nI3r*OsD%A3&(ij za&Q>>mq4s7$D39$#y>D*CteqmuRGB{240kwjr4Q?oimSaI-W}hg?*FsGymgcci3=Y zFQl+ecRBwWeAvBAVf%7ActpA1mPa`>?sCN3CYM6@6o@l>+kFEY<+&l+`2H#I@h$=z zEa`RbcJ!;kzVZs2>%-`kutnw$e}0m`JRKAFq)PL*P_8v}&1dLNRnB<(m>$nX=(CgQ zLFZ@UEu37NTMAr6|LrH-kN!Kt-0)-byVd4;x6y^&>Aj91&Z$a0eQQDZp-;CyIe3yyaqr4+QP5ghB z?i2Z5X%0O=xtt5i`=Y&ozZ-u&{K6K)Rd^Hy@=pEaGnPN<;1UqF9PSie4P=#g)PDzV7~uqh;|gV4PFLy@Q$?!=Z$lm@0kJOZL)Z0ZKVG@X)|$0 z{Z#%=aB(&+?mZ5KcP6@U*L|b5@jDteXyR^D&^PLOU4f4r^t zvGIca!mvf1PeU7L1>&xIL;iiGYXZ;Cb>1Z$Ye^%~E+RV)AS+%38)AMSld7EVr&TDi^SQhAn*e z(etq&#$x^HfPcj;2WzB%TAjt%swX`#PrhLbe;@pei}Gp0qrla0)&bHxTyG2H*U_E| zK9DZ%d&U0e8^HP3!Z};^`g3{E-}i*A2z#@+iulOm80im?=fh}U#PbPdbjBu~3Z7J^ z*~<5ocxx894BFz#d>|TjAJSj^x5C9);+X5+uKck^J4ijXlExX}6lHl){PE~Ua$_$! z{)^TAr?{iOTRlGoXYV?NZSo7?AM`&i0c*vdq`Xc2Um3iNF7{!=4u=1$kY+skm$ZX1 z+EtvB-pQS%P1rL@clh7G6aI@^2Jg1gv4NhNf+)i?Xxhl}Eog6~G@ zPU1gMy47ghi7VIzKS*1T{C)t=TIW;1Dt)632pbmGjdDe4uR-^PGHszptrw+VxNNMX z*U{@!X#jXnpLs-FA92s4p9b>oJFI_{C?eZcv6Y$lWA{Cwzq>z3&^@nQGrCb(hp{ZN{}@YgU&gbR9PEp1Hvve z+rnwScDzHIJz0C)tzE}?_7Akl%D?+!i=}~w?AnfEUmuF*i-WJF!<>f4I-b|IFq{)M&#x;VcQ?*rcn z-;vz@2HkDoeb7$07nxs=?4Lx}?Zu5Z06X!UujK!vaXzM?*WV-mAEW0U6ZZ!Fv{jym zg8s@=O};(pf!gA?N%u0h6KKP~2miPi@+MxTrahQXD^w=uc{(1(4F``|;L_JnJR@4dpi@m|R-5BCe+pD5!#bXq%e&7aL9_cbTp zV!nBpIrJmumScoFm|I#O$giU_$BcKx(?szt&11`PUzBd3xoFA%&ABU?hsSx<%3zQ= z>jH7Bq#G&WiU#4?Y|e^^ocP; ztecO3>xZr*o)6&}wrs=p=@;VW!@DDsmT)T*@YX-_1o_>rJcomtzHN~2_zvzP?zJ(; z2C=T*U76TwO;<{Dmb8O~OM#8T_X&5GUrG7gfw!?s{sZg}%%9Uf%3oLgcIO%+91eMfQVlI7|cH>-I;Vq9i2QgF| ze^*;>q#wkXcl!#TE04IV9(FdYS*JN%cC2#= z@DI5hwjRSq->r1PLeQ4nUq&aydv0+i>P`mXS#?#_7>j)73iuh^uq!4!|!y~ zhvuMh4)p;0m*vsM+pNFgF%~?*|D*UG_^?HiH_5LbaNj3~?TOgKeTHs|x6Zt~n*N5n zR5`3!rzv1P+PmS|=*Xp%`(@>R#D zORbb;xbk1CENz9a_Z{x1q^8PO9BcyLD{~9w911=_|A~FupX}dWWRG<@cun|AXP6e) z>y0~;uQ(4?(fOwB_H*M*?qu!-_FgOTPXk}$QBt1H*FzJ->6Iz(b(TEydmiA+pyb`N`crrur`p~jm*W>Y1DBu^?!tMKwsgw z|J5AasGSWq2JA|&yC;@g$N0hjQiJ=m|MXkwe^vK$q6o<*&G4l9Kkv?VZSl# z_SE;kZUk)68U<*V;tm%VZ$!=qZ^VC(cTed?z!wn?+b9n!!|}>szd7u~#@m#+A&576 zUxaf9IlV1D?Dof=6kBeIUB1E{8hto5)u)K!TuR?$`yky5w!^M~ z%yIVPNa+*0&iHxvDcucP@Yj%TASeNbzy)1@{(l#Wf+bV-K>w@G&6nHykLRKjhO$ynCN{jPfi; zgm{c>FDVDe$ge!G^XstI|+V z0!_RLw;#H1eE)j1F}F1)i+BFgw^3I05Vi!H`@X8aImR#X?e7ThfseDmfsgO1ikCIm zG?N?mK6Z*PM|brC^?`NUyg~i^s-9vVe1iCx*A_*~Zb1&37(>kjan3H>&*8)Vc)aiT zBHS|24V|%6dQ<#gU<*DCxlyK*#5q5lE1{!HQ*Yn0T%EL0e__+HuR55d&eUr%-pv0g z?-cx>=7xRpx5Tvs#-@eyfQcJp#UrJ=O!~0r`Gk6Q#ys8_%-4ce@I%BOqmF06@8v&? zbL1`gr;EQHbdhG7wl^6#(-e2mQe*A*8|`{6V7n|oDBMcifyTFs(e1;nA?%H_yi#8{ zRQvaiS}uovmu~Pf-S-ZCI2o)3yM^a~tAX>!`A+U1(k%ef(Z_lEID32{xEo9Zv-S0U z(lsIQn!uD~VhURuMC3IycaqJc6!DNZMuqkXZjS}|$ zY^oXh6-}Hy!7InRKHfgbVN3hzLSp{E&niErgoqV z+9u!}{wQy}byOc8YuknI83s34em9bLUy*}H%GcU>n#Uz))8*vk_2evDRfTz*ySMpK zvN~))EhNjY6c;u`ck`b`#*pf7Kr%80doB|*A$IgZOURmzPcL-jygqNXtR{Ti*G1A4`yj9fA0A;gwp5hK_Q#@mA(@fsR zI;lE1Ro<7veXktzgg@l&$6cw;ZugycsI$BIZ{V_b5OKKJ)+?AXOxe7;bbucIUFapw}+ zKxJ*C3br=8vfV!izd>0`a8zWnZhYmT1gPM2^GrAw_@hh5%$ zAD#o?KIh+oR~x)m;uUvZ*(1)wq|eG5YYD&chu+@E^?py9jLx}`L^r28_;dueF>~na z+xXdZ%2&zrN-~3elsuB$X-}ra-G|5M!!`V|j(r??^Cx(be*pImbmxnk%iWjT5q>zi z7P8a%=vIMuCM3cD6jQo{odwS=a_R%Fz0foFf}K~ zH%NOXK0okZhBj>4o+kg$;f;jLprbF+A9#F>?lp9ufG%+5@sBxw%){eOPdo1YfXH|Bf0@s4rAEbi0j;w_Id z${u!g;?8BfxnVy&vDcJm`txEhezJ7;_pCCUrOdU^?7`Zv2mM-ys|1Mpe*En6I-9cX(hyM)uya3+^&zbzrAg6oDj+4j^XT9 zt@`^&@e4uBr6-aBah5l1M4p02Q#=;Kv0)f*x#xeRt%mO9;imx)zd29>l^bmWU(olw=~`38%in9!DM?kdc%3>sE6E3S$hh% zBEvi5X|A5!k4oeDzgCvx=)HyX0(*q%FL5u+`v<&N!4INSn$U?w>4CF+R~huJ=n8f_ z(|gMM2!FsXI;02pcSuv;Gkx18I_f%cyM3Rx(Naxi`WF5B>Zr1^#of*6 z;!l$HX5mWG%u=S<``th4KzV*tjswg$cZhos?-%jt>wDioXCFFGlh+V*r=q_f{vCR+ zhC52r#TUaj?5ggKW`}P&!d;-r@{D}|^SX4kZ|f-EBmHmY#c7c6JpXIV1MlYFtQ=q9 z?Y*ybq;GHzFTbel*QleC;&zJ*yAy}w|1mynio_e|IqWiCD$U)((I(>l)CJ1=s&92Z zE;W|UI(t4-n*U?zzT>za{s(}++oHW>L_<5Jy%dr*3g1cyg%Aow6w($VqLPeC3K>}~ zrA4K^cS=N*w=^~Up0AJJAFs!)*WLT>-gmFpz3yK3x-ZmcBDl}@w<$ZnxR3DjgW7z9 z_0hNZ`f2crzI2~8p^u&nQ`SQL;x209?pgAyey4*Md^(-s-(P5sbTT&C#Y~I&=Y{<9 zSexnR^fUDy4u7aR{tmtnw$96(OMBZQY3M)2*>w?hq|cCeBQ?n>{xf~nQoo$k5A^jj zx`$y8Fy3Abo&Jz_`|_8Ef2TR+Y$wi{Q@Z-etHO=U>9FbbzPWn?+8Fy}*^S@OS;h}T z_c`;f;AQ6P_h?4E@!c6sscw#2XD4lxbwAoU1wA|^zNx(I2`8~1jnAYXn{QXD`%S(P zYxWO?JHxGkKDF}Amipz8a=t(d?pN<$xMk44?eaUn%GhH>!ZUQGy1HNFyQw<8i+`6g z*XU@ZPs#rReD46HmxJJ4Wa8ws?_7m{qo?k z4S=*6Iv?ko^yxD1VNTYj3-P?Y@U0V)A>bwX*_=-{$x}w3tl&;j);N6@cD?f}XCQif zoc}{rc8@Y--DI!&;9bdHH2EQLmAvt$S=^I)mEW0qGE@BJ_Kd%Bk0$hzJ1V!VZx)sw zcUxm!bH?}WohJ|Cb-`!)aZ8~4!|;(4%6|lpI!9l0#jpC&mFldVi{ZsR;bF=N{?brf z*z#bzBfV0e#JT5RAnv#{l%8AM0PS&qB_;1?^puZC3mN)e?Rpx{AZ;vu*V8n>eh+Dl`6RIpc4DadMrp zJi?s%*LVrNgSgY%%$%{;6!y21x8a1|=LTcK*+p`lF;Lt1{L)-`T>R6@iL}7{OZ)f>xqj5)s!xr(s%DPZF&J)uPzs`8PY;_gWjYnss63cK2y z&}?`7llkghTKlYZ;ti~%89erElee@#_5+oe)sDv2A}{-&&+Cgg+c?B6hkozXe-rgpyuTDS@#u|Z^uyv!)X;A) zppSp!ex#4tO3c`6KTkhz6L&V)sE_Gir+fVGHuA)MasNGyJ4ol?Y1fH+m|IV}GyCLP z|NBR7=ud_H=q~cVB92|E%(`Zj|J=ks9w2-Z-o73WFTxET-Beu8Sj&ie#Q2DFb@l|4 zAMyBx`282soKeJmtF#gLTzmm*gDmi?;{VS|pBgy)AA$w^UGV&{iFgUOg*;&+!~Nnk zY$qNNKY|}WPd*J7es7QsJS~53>B>uw2#1}-xJ&)!RyvZ~jR$LuN^smMPkUKwWVePY zV%@S+onjwnBJjRa8v7ojjBmR1$sm0(M}3DV(;c$pUiA*U_HjlNHY#uR57^^Mt7x;k z(dmBum(BM0^dz@AXf2*JkUoTKzaew~`APm;K)k!E4hen6 z%sWeSA>nwG12cX;a^NPFkEfg}#LQ zX=&*4c{?j(fBzzF@1`wmgQT66w_M)R`ed>`8m_!n^1LJ6o$=%u>%n#4N;v-$4*Qt@ zNPASiuwxeIJO7F+Cj33vtq$}ulBeLr`vK$hxq<7AkaWE{ zZ=R=Z%=3NR%^>uCroxT4a^5tLFSE{wGtQ9RH-h#2S;ZX!P4S;j_)Sqfu_K<+6;FK! zueML01kLUbu7J}44+{OX-T0LCNKye0JAsd+_|bkm&-rjt8y`ICY@SO5^RR#Mr<$Xum1UR{su}yiM%i7Z@hgZX!#{VFAPu|PQlF7x7 zuILQBG8wy){fo+YJ9kwD>qU^KlD5G6#kbFZM)HPzuP=S0y>A@SFIQ<-S9M=4zM*o5 zspHq;!sb~n{^+BN#6KgwmO8A{S1Yt>gFHWgIm-DM+@xe-pRh2wtpxyDJ{dGp?G`i}9k)%b~hi9^PVJ)VpW=Qp@hh414&FU_5c z3~n9kqF%=1PI(_yR_JcTIYb-d(tWu&Q%cwHhdyR5b78c(z@AO=i?N>H_&%D${!BtY z1pi_0F7tj#bv)^(;L-RByC50c3+^AM6@)5`QijCw@Hm6kNT4UfQ?9bIH-O zt(Rtz-MI<(-I?Uz8Tga%7jv9h&%p=z-v;}H4}L>;Y@R&~dB@MTru&+#2CkXuJYkk} zaPJIzK;p(LtGhf`!(Sr*=&$KSe2(5vw|<1P_#3=QJ=THB^YKjeDx=In8Nu`dtm=$~ixS%VeMZSnIsSJ$d-v>ZCYRyMVXJE;o_s5woZXno&0Po{!egAVC(jsL6^uDHFw^!R-Wl14 zcl?Q;x&s-uQPauRy@yU&yBfpx$kLK$=;2vMm$k;~e$u*_8#Y^G4fZD7PvO3k*k{BG zI$8_Hy1u^kTW{fO%$3lIaaTCK);x-R<4WX?Eaqo%^gZO5_2%Pn^YT)V6~rB=;^d_P z=J_e}{SWRYbfGF5zYTp^%*~H}^h1xDpo3xaZxh-w3k|7>R?R{G@}q~xxH+W_mo^6O z7&P{mDs~+YxHSFPD=4=yuDZWiT`_2vRs}odCTi8C^ zfc_2t=Z&mk8>6X>>8WxHUWwLU<2_3Ebk1kN#263@S)bqfHU=aJog5B z=r`d5?eWF-&dmRZzH|TP4zf_++>Vab_4MkLH&0nJ)!~Y!mQ`1h|I}}kdj9WfvZlBR zV1c^t6IYGfKwC<*)L-(f)`sTlFtoXTkv8ZG{9j+ptw-;zHvNHG*7LQ|Lksn1^yh8* zvwn5D>^1NfX+7Y*s6Tt_!~f~qdGb`z&x5#M>EA;j7kCF=S?(m|bduJ;raMm6o%L5G z%ln51@V6}f-#eFT2Y-Hiv}+l90C-j&yr-S<(G9<@il_W&yj+TpJZKDU#-sY+>Aj7k z6T-1hAaf`2=5`_DE_CmfSg%}yw!e(lzn>NV%3>{(#eNH5CoOT8G96|{W;E^A2)juj9@S@q}!^np|rBfyA}PLheo24$uaIL>al^l zK>9IxTY(Lm{1fR*z{l{fRL=x#SGS;@U+o|(g0s}Um9~x7?s@uQ1lR`H&PXQU!LR7s znjrM9N`S}pvGgR1{yLA_SeQNGwDQ4>PFFhDzj*=@jMMl=++FP~Pi1qSJdm*sGzAS9VqJQdb?6NK)9~5%O_ze*{Eg6r zu<=yGH(D!mwf4|;O$(|Aec9wA5N$rocNbY-w$PrezBAT0OLFte6XC1WjqYsvk#z4o zh8}Mk??8rKpBwdER(;_dGCe5%0d8YBN0s-zzKe6jYrq+>QCunIeBt}KwB>}d7wErN z)G6+a-Yxx0?qkxkON+jIS^fNrB#(UEKn`hZ)N6*iuLJe;-9qgxt-XKpvss&V07LZq zXznHYijHs^dbVAZwbHj@k62lmH%Q#MO@9OK`ow!D>0;j>BOG^w=<%lPaikAxW9VP~ z0cV0ZcIngF{O%OR8-MA0XzMKdirMu?$bET@t?IF+HXcJ?HlMUf;-BW;Yb<_j+_nbv z$unUPHTOXdTb9D9OEYcx6TrS&yu;tizt zq}?j*Y4hh&@v%o(*jgpKdGUj^`sP&V)b=p{I+&|>gDEHJGn#kiYg${L#qvA_%82&{ zR1$k`1LXHsN#^@88*_=f$%T)y%N%XgvUli=B=rc^2fKsj-hvRlc$uk2A}Yj zd>T9gO-PHV%N}WTgp%pPZ^^qy8PSH4=4WSaA8|oD+||$Qd3A#KoibiOYMpNnpy4re zM7g_^c^Ud~MEp$fsJPGom|5q&ByBs0J=1aO(aE<$$1q>e3T>S# zoTy9aN>tK@@5Q(D4{G?Iow@Np9`a9P->--N7PdEM`M2)cCoTQ|uwB^%#NDdG;zmn% zZ!BqIOoT1T7XIrk{`=jax-yCwJEO(LeqcWS7V?H}+Yic|VjSe~4Y=tD}i!TJf z3tVrVCEle@$Li;>;jtKPo{2AaM*E$oW^BOX)yehvcDxI?P?~o>lDJpIZe)5D{2TOt z6+A!oso4BWtKbn|a%bb?CGd?2c*$VNd+R9Q`>y{YU@@IJH-v1gbp zR(@0PE?#+)vh#?4gnJj2ES6#2&k_{o*r$>MsdTUGwMv|%u4 zDeVF96?k2G*jNmGp~W0p6ZVH<(YMSFphN3tOf8xc@V^zJ$Bm9I7LZZf;8VAql%{?!#p4O?+hz&{xdp z9sXkcK51-!V@@GJ>;^4Fr*9Wm z18>-h)(^r9t_2nFvNL$iM!aAdUa%eXXU=Lh^H?qO-a%iFaEo>NzU)Ta|& z&wW$=f_3a^)xc|gcS%j>C$-VK+SW_H-_3U#R3U?Mt0`vyxEEd)P}z6J2&-puvvU6o z;J;UVMgF$6&@SQ5^4?lmxfRLL+PGJHujl`u9C@0|Gpsb-BYk*;%yWVM9Hn1R_;+EO zBjn}-{>usdUf0^ExxT#tPE+mycoSm(&A+hMmmCux_UhlYK8QOsU;Dq;`?r7lw_zV- zlJMEaL3w^}BqT4wyT~Eym zztH+mjO+K&=(Sn28`J{y{F1}wRC9E8i8b#5{)yt|g5S~G-R2*?{N%Lx*}**R&MkvB zK5y>UH_z9hfuWP>3?rS44$z56j@lEMMeYe2xEPIa?;veqzE`x~A4|URZdB$h<0M*k z&n_~~Hv3`rT7CgfZ#R$OJcCBj14*CR<-A}g+DbO6C*Nps--sIpujLl&eR&=u*W9>S zcpIGU>@$IZThSzOPb>R}9cYp~_b9jB4)jdg`CIHmNuL7pDdV&Hg0oJSN!|FGat@y zdCvBoYkcPtaIw6d;1rX7oo{Vgi@t*RX34Gct9w!H>L%|QdsFtOl24_TQ2$xVZRa~* zsqg3N_B5PjzQ0wzx1}|P_rA30zVW&8ZwD`e_*P5btf(Iz(vSKw9ipH9=R42opNaa4 zec?1WHx>RA+`(T)|K|rE`yY49^ON|o@Xqs3yhoER0CB#R7#r+FB`+8!q1#)}__)gd zKVuw>!y|viD?=aYY5bs&@v~lBMPn@9jxCO^haSln#$LV{gQxM@#Gb$PMEArTN6#CJ zKX{5R4m!?`UwRjsZi=Sw!t2K$I-%~3rc1@;#S5%OGPcuuTc^yoo(X$^BwqZ!R`K6RtDgy=9VIh&HS+Pn(&eHPQY#Xhd7-1qtF*H7BT;u@9WM~kk$M19fhU(u|C=yPB6YOL_B74QZA?3bz&dix%_ zczt=a84a5Yrt=?==W=;URiq;$TwK20{BMYBCC@w3r-?7}AH7e{Rn}5*^TpkbM|=v( z%F{-AZuwU55A@w!entsyJv4I{9`e3=?nnQ2XwMdPk8_a~kr!Seb^KKR8p2abTT6oZ z+V+<=UtUJPgK_*pPgC*3;DxQ)A=(i1G^hR>qd$MrFO_^_y1sl!A6G{o>1u>*n&d?@ zo5N`+en0+ttMFm8`a%9#@D9S80q+Ihl|y`=xb}C+xHzwHBFREXO^-R>t$OEaXov9o2M(_-Bp#Yx(Vgr9I4tW#&eH zYoGQ1+Ve8@E6X4HLf#2WPGxmw2k%*BT?_Xr`Q67zLSLbtxLjb7IKw$(^Ja&+#y(H7 z!F>GNI-Km2-l6IUZ0}yBZCE-4y>}TKv{XVI@p8ALmMEV^!WQS6qfOgo=OPXpMnIkzz+9>__G&o5f z@%~8WPDD=O{BYjT_OtY9U%cHJS~>)OuIpc2gvZ>m)4fals0$wTBp!7PP9op^%3b5T zp)XNhdEe;Q=DyQQ8ybPI8ULiXA=Vb`$tRoryFT1^m3bRztk28&F5Q51oBy_3o$us+ zp?+1sE6N-TR;yPBW&9~mGvzgcAN!Nj;LKEpw_}pu#rG9|x4IP3C+^E6J;db!S(NcG z{BC$($a%~3+blTus$Um*&i74gr?j=P>wS`BsDD{d_pt`TDtvYB^-O_^{oZi5>D3^GmZ-5zxDy%!^7FI%GhBFebfHA{yQJY zm&;lRlofU-D4A#Mj~4!tf4{kqSGblnLFi2Xki$M~cIzg5ySuq`t2uVNId_}66!u16 zFmF5C3yCwUDduh1wYx$bn`D{0(YK+~?uaF;(4E|9&0zE-_Hs6%IoZ&<*=Ulzpkx#p zI1O!!cOz%-REG8aiJkU;c98$b2MyMl=j4>eWRwfIS=U?Ji#tFzIeXQAx(fx!BDusB zk#>jpk5^jnFGn}HGeM1&VSuZE5oV6UxPpAa_8jB+@o7U zPFRW$3lEX@C7c7`R%PA-uP$i#1HQG)`eP~j3cu|VG7G38-&XFd@7=fj9uMPhFRmQC zSKw_F{#N(};fccU!8^K0UxLRM;ZF<6bqn;1@O;p3F`b3))OWFcE>H>n7Wr~((+qXZ zDcltP&befodDa#Dd*pi(?t$;nWO-i$*DthhJ>T6y@a_Wb759m}JJfN8I(6so0l$~L zz2Fw}-AU?GR5|6ucZW0C_kIKyX?H&L|3o_$a(n8F0^(co-zjblcMO~?`fskjYN_8U z=)b!DSH2Bsx&Paq{MXBW-Q{17)5phGTN98UkK?xuje+`jZ$g$_NzS~2KbP_G8y@|) zw5?>tNAcu}!e#Nuhw<1eK-eOPH%I6G^4~t_)`S1uH3@r32k@v14(NY8>OwrG2563t z#oJ+_XIS4@K88n?w~qYVI&vfTTTsv1^9=sd8z1@6+I2k`YhLWbW0v7JZ&=e#HgAHj zbT{X6gF|>tE_~#A?qu*W_zX0Lmza0+%{TX>2@mweL2+_n*uxsiA7>u)=E62;Lf0wj zlHa~JsA*0AG8y0zb3SafPC*kwe=8@x((^ywlH8AGOy{4=ea-$*$S%P*((?BFD>#Sa z|AOqY93SaX(RcBPxoG&0V21s!y&yY!UIpFi1n#@c9^j?qUVNm8v=(UDbo9<%R#IA? zNE=?s{vzJ-rf>`RAL9#~g}=mS8Y=$~-0IT)#+#0)LovLjhdjrH>%hGQZG2uiUF8`n z&z-(i6a>E-rH=IF(#O^La&)n|Ha&-Cdc!0o`=wjU5%sm{AMN`IG=P6Me%C=1G`qWhwL-WU+MZ7tZ-M^G83g|>E=Bk|91lw|6iuuYYbdrENl}O?)`9zNSjiG+-c3S*_vdc zaTI5EVH+oG49C5}{L=o#FQyq^i=>ychUrZXY?Q~n6mao5^ggYPhUT#6nALe67{TA! zm{rJg2Lm#A% zbIFqF3OMdTrg`w4O<9c(FjV|8>9qo%3^><3ydT6_dgv|Du}IEX9~S3^?aGk#+TcZ> zST|O|iz=AkaZVGqWv(^1@8TaOuBY_iS?l13?!^Rh;1TnGFfgyfL^<@olem}N z^;dm>hgS4mXE900n3dqhd-mt^|0C~R;)|YN~&K^{+16 zSACXp$0)CpvaS_Ba0j}&4NbRC7<-^y>>+-*#s5U>zXpAU$KeH~@d*2d=~Hl;a=#Y$ z4}SjzeqRtDd4&J+b!04jr4Ih_HMiY*d|ui@IHj!#rmx0NxR1drD(z)BIjt$GfMZ~u z_!ZojlvP4{-VOBKH)@BvO~7ONs%tI~bvva#kE+WF^}B}~dzg9PW|3za=)`ZYH7Tks zk-w5W7vpEwfzHAsK{IIuH)GxAJzBcbKwQz_}6bHTt-`|FDevB=?kl-=_aB0S&<+|0MPVoWG?r{p-j4 zpQruL`NClzp{@T+j*NHM(naFt7&8sIab9-;|0rYcT(T~CJRNFou(6xbmk<4VcU(di zOfJG#<1XPV{O$x~Z1RTvox|qd6^HbbIX9Vn8MgTU6}JbEz0X`9jZS>ce-gApFXjtl z1&Of_CivtOoiSGUAYRuCoB%bYjm2xX;Hg`MPjc(yx%=_!8u)nE zn)K~JNxXO&p4&{?3*yI%+lZeB-d?=B7`bnT@O9*yO>nP-_nvYW;nAhVpMYOVT6gd} ze_b-q?c}=8>*DcbwaWb0kbmwX|D-yYv=#8Kh=i)>e@zqrg58T*Ans3)}7i`OdYeyPrgg9(;u(s zhZ@|w^%cF+G@pL2R>|7O8s%I6WSF(b7hrs>i@*l|s-5s_+=zPtEb(tTiu=xbWr%-# zq5s>_e_vn?@RzZ2fiZJE7{~v$wOpwZWMkpZ#$W4mtvQO)BLbHc5nssOD*o-PEvaGr zhOW`eAYXp+FuvS4kMfNBu%CNnUj1n7Kb{-U#h=UI&F}e59Sys(;6?MPf;soU6Xq0n z!CA4GQ6_(!eEK=L>K^$6U~_|-e&@+)T<_giib@n?h9(y9qR zM4s9wZ(HB2CHxY&O#UypSIR?HO`9seIk{{;c$EKPxMM&aY1P!HrTm|BL-wl4zfIbu z+EP^?oTGnwX=4N7ZHqZhZ^q+4*@5%N^kM&^sekzk z`7AsBla0H8JIR0l#aJkXkJ#ri;~$dw9ZY}%d>~;E_HImd^(r^ zUFn6bUn?p95I1x&YfF2;ocqLFtYt2mgK-}?bJv#+VfrD6v-5-2?=1lRzvRQh*7tbJ z9R3>idCr*oZ;>IML=Ot%EpOl@@0V0QKJppJiEf;SpY%3~myvru#6J#_Y4DDuZ3R3I zttpD`oI%HnpjVHfSD%TihYocGJNRdzMUBhQ*#r;EUqCtYxo3pGQvS0b?oUlYr>2Wv zjK>rwqdls;B52z=!oz$oH(FN9H%p7dlalJ-8{fMZZCu0sSsfaS>kr30qhyMDKZ5uD zfCt{8&dWin{O^5Vo+RW&_nwj(V4t$xp-O*~uLF2NT~^5VDxO*ZZ@o$1Y{iEQg5LV= zV*OeM9Mg{__48c*J>su}*I$3$h(`~`&ku+%%Kz_q_?f;gBi(zPX}ni*JGUtsJc``8 z+&3n{xmupG_&X{T|E^O?u z#g;a*hPhnWeebj%zVM5<#^6a~HEbBP&!K;e&6kbWczY+evEEPodHgqWX9_pWtz79< z#pM8(ieF<)hfY$1Y;;l0sUp^9kKq|3xW9w$=GszgvjX4+@>&yVb;Wx_Jk1G;3D-Gk zEp5IY2JyDuqsQr^9ksRw_WI+UjN}b-`cm_|y)|OI5pnDg`RXtF*dXq6o;i@YubI9p zKJ@FtZueriVOuQDjV=)PtGFwyHD3b-`03rHJ@GRWjzLD>kcsy~EZ}j)=0pi*H%-jPHTO0BAU~zdH zqF1}*yWAQ%Y?sE}*m$e{Lvil$rtE^G_xR>r>K5-@I9E(^$rEqJHxM6hBbJ3TQr?Hr z#jw>C_RPNJF9e(&Wo)th$t5EuCE)hgt^t48+k5ViUs}8yeVw*^s-EnR#9P7X z9r`AVHaw-SWBKc7M=f=T^UY1_$!=M?ocq4=3dxTaXLQ|9>AwQ}6U4>+gp=s>zt#X> zh!1-&FTp>`4O?k(KKTK8lWdVjJ)=HxZdp^f7WuIuSP-&>w$bfN&*r~~Tyht=B?tEj zJmX1mU&8+g?r3sJ$hEb|DDFHZe{$D|?;+i}X}S@tv+np)+B4FAme!hohPZ9|p^bX2 z)HjFVhy0x-zNwxCv~xW8RD0gimd5Jyy7U*6*HFFJ!n=yUv3vuR*F)UnaN-S4Wv3VU z)@C~7|KL@} z13y)_2I?Gp2xR!QxbQCFu!$Qs^TJm9U~wg-!B0+es{uCQGUs_=zo(cwgl*P;#Q8Vr zYWc48&q6PBy!LeT%}MH9LV9KCaX&n45`1bLyl6bE@}Gx@yD-L(^ez7Ho#O8_jt&?< zrNNuVEgS7=@aA#m#%JdA)PIaM^FHhgKY<>sLzLxeZIj$?Z9kxO4mLB)hI^q)}(CMsb_AO|5=tIWaS*<|WK51qx z9{P?2(D*;#O+~k7qvi4DR1e`pctPAtm?-W9cZM>)QdX?tTjL`Q@sPNubeQ{1N$UrE z^)oyy8{T>ge)d*5x+QquNzenh3!MIgA8wa64R2fmuQJ{@NnD&6)|a<|H9+v@OXRiB zoBo5>cKd%Gzl-|?9{LCV`76Gg-#TEHxP|aO1b4t4hyVBIhQ7{j-^0h#+wte+)&?)a zpHBunL*A*(%~}>I4ru|pA7yIr5`2OqU zruyWof}or{1<0KF74ethSIp2FzIg8ZwkhaX^7PrQ@ zS-p3u?|g0F&z+)8Pe{8T?rqj4AH#iK+#A~S9kBPD&C$*ynV3r((tm#-$q(Har2Cm{cwszy73Tt zI^&GRt$6Vf@>kfRe-*H|m)>=@do8)G1&!&K_}xoRI^p53t! z0r588A!(z4yA#Oc{s)~iM=Oi#eas#qejINM^&s~>W$wR^7CeG>^hZL@t`UHA&6}ob@b$?Fs-fnJ9bZtMVjkf(I?Pa)^fF)pz_ycJD zeDw1S+W(Y1p)>Iee}D2rA>k(cbz)CTd^UKuEAs|B{aa?poh@M;`i&>Az%~v-rQ4?*e!` z$)vaQUka`TrKCM*KdueDfPct9`M^B>d1Tt#eDiv6uClHrlU@S8A$P`o?)K7K!wo&o zM?eCKld%TDS+Lo6xRc4cXLEB2UkSIkd`*NWD&qtG547(-bw3M~R$j#4NEZ7=JwMaN zW%@Vv@}}tHg2MOevlqcg{yV{Q`tE>sU&)=z-J|{4xi^48;#&J(r~ThJ+x^zReh|Nz zZ)_YFU!S|lc(_|!0cpqK;8n?1_!n`D;1%&Emvv1#5?o`wG!d_G2A4i%Oinod-y6v* zPB>HKzl^)s_?>0^mOE{If?sSpqYNbO9DHF2_ze7jUz`sr@W)#e$IXR1&8f?C(*fik zXkOH}j%Bkyeb$`2!TkA<+t0iSdxwv5&y!}4B&o{14elm_d@juJM7FOcD ziR3$FjKM?J6e4GV{rJj6^R^4#vX{RfzS7^kuYo5l!w1g82eyF4XhX;*wb6&G_@6}| zTJxVkM~0#=A>WyQ6U0 z!#!L6oWiTscZM?Qq9)DtNxc8~vHp4lU*4`Se(co?Ej^Wtos_0 zfBrPb*OMpS7yeS(y}nn@Tn`(+tMQjkXFjz~4*SM&|7U>k7SIxnnT-D2#hr`xlu}M^Wmq4F{hl=JH;%TBJuS>u zW!Rxio`V}}{I7i{c-;wg_yg{3aK?$7CQrNt75ZxNHpL^_@uqsSDU}vd=PTvupv?JO;?nlMN|S3o{VtI9K0o<(rU ztjYD_CJBdq(1XHb;Vs3xu93bxv$CR z4qf_)`b+?4q~D`n^W=%QHOKnyN_DBO9Yy`ahrk$PqK&qV@IPbU!&!IQ-JF^wo}IWP z-te9dHp+8|JJeWO$K7B&$9>QW!DFof-7(MDQ0ssO%o9h)IvL7k7ccQHc;*g!A?}BG z^TTj=h!6XmVdHNMI?xf_2|Jqmvsr(lRk4pmE=xW|!@{QYW$0AA3rl`WM}UpemV=Y{ ztvBH_b_v5y;ZekHOQzwqUF10nZwk9rrOA1*7khDK z?W$xCmh3UT9NJw$n}qX73%!valxbf#ZHl)aFHhH!%(n)g{8xS4D@gYXPbEvm-L~JW zI(MvM%~0t-TN%Ua+S9D#97|gJOYs(I9ei(y^j+knmCCH4%wqD-CQnV{PV!wkGRbji zyU0t=US@4j-TH&9cdasxz!}efIa#h_E&G|u{#o9iYRFq%AM$4b+bX)Zq3jWGH`TVU zS<7Cb@-}EATU5z#%;zrod)Cqa^kQvP+^9Lnn>&thr4xkqX^7gJVlb$CTP z#;JdGb^KYs{ltH@eygqSC-leJ)*1t>Bd)T}c+z@iuDCDZcJbZW;_CTFd8{$m3`;_G zFDveDaj||YX^fp?Y8?{NI!knfciUw|w!cqcthY2C;te{96p z*IEax#RJycHzLQZAiJzuPoICe{n};D%U03>mB!vt`n~ib>+q}@b;V5z;=W%jgu|1R~~6(HXL z-&~;VOXSb%yLW;`;s=U5vIdRatiN~YBkgFbt?tmJ`INDT`zJYVoci49yXUFL1*^zH zzBNYL7ht@4e7}V3CyiW})RymndOP1sx4@eib@siUzL8Bh^i-!U!F%MZBL9gE>Z%Wp z!QUp|@9K0$yB7N9C0oeC?nYYgfcD6H zj&T-y_l1qE`o`$v#2ZbZjN{9LcilnbCBKQqc%)x`&%mM`Acc?f=Xw0aMkT0nVO&D&Md!?rJd|FAij&f+hRk9a>IxfE@vE&dVi zIC1mHF7?ro(8Wwa*sWuiBlF%~F0}ds^xmFf+8wW0jVImXTN}}zf@G>c&~~=}(|q7J zve9kgCM%C^ytD~Ad=|PDI*EPIvE3!n3$!ZqNq$k*o#dF1@hYNguc2{qx4MXLEtB`b zplRsam-tWIA-h4^crgTKA98;gzKaG2btH5b- zSHl^uFWQUGqKso;zj}lWUD$ss%iZjo)8y@?O*d+9?7N;V-wt@r=+YVd(Iz?)$v^tG zusS$bi?<1q^ZlolXmd8>WvYMQQ@xHV&)Ohu!5yJ3Q{k~mmgWXmt7{!$_n6bGjG1^- zx0P}8v%Z+1y==6^`xcpZnJ1#pMd7S6CZ3aTfb=_s?J1}6Zc+$JFBwl)Nz1DYdk@J# zZs=v$yG!rkkN2-~8P{xPq|N!`3@(eY`!YUK&e|z4-fxw5ul3aPXa3vwaHlRK|AkI| z=w}=?r>--XUWFd-kDPC=u}_uM40>-44!6dOcYB@@*AV^~b1vQw&uf1DA-yVp3G2U{ z)`#)_ZL7bn`GkK{rZ-g5-RAQ7(q4f#QkmJ6-$ps>t^1^9-oz^b=Luzz?ULPKz3^ab z(_?6cx6_mP>QGz#d#Pg|>13Sr8aNYAqDA7TDVMFQp>Z_t-& z=t?o={ei|z7nfC?rpWUmoT|caphJ&?LegVRkA|hKlo57#Lw9owx)nC{H(6I-3crkc z-6pLP{0DvWK|C(xjW&2$*l-PfHZ(9fEG@TuZ^k|#-mwvc-3<0Jk~nuc$9g`GwBqRJ z`{a+@cwWdMlgSd#DKB(j!oKXC^2HtO*U;l9@QqRE?(^vI)8Lr!3*0SuDO(vyZTap+ zU$5}pUzAl{o!QLIoKZfiTskw!E8q{fVcY9g{YBPEUs12(@T32-{6!YmXYoG35qJ%i zMJ`L?9f3>qO}y>A7X z|J|*uhT0K!#|kOujCDpOZCV@U_*T51aE~(9%A;+uzDVCur@Q@Ya$OQOnYSAgQ`EJZ zdOxeoZJ@OF?gj73zm<&ihc=#-z8k(%X%zXlvY&i#y}lgtsX(#$-?5 zjy!Upt0-zL_;d;_Sr^eelN$An-nh}&Mtm0{(inZb)>O}o4!`w`4O3{1$pQ_yuPyZF_&mxd3%)=wORa_O85l4y3$L4 ziC~`eD&oF?zeHJ+@x=<@Hs8zUJ8hIfcPIUse;xcdBP)EV{!v!fvhtTEZ-PSV{)BwD za%-vo>)LzE{MDEz14r6boVdP>*0)4-k%_3(>&HFGnBPP+IixB zuYkvbkF8PuR@YYYyKA4$hWnCwt%0*v9lwRYSl*YE7iXBagHxRU?5(trJm z{~=>%F#k6(c8nWmaOrO2w}f>=ysI(Wn4fK&hh3@>WHtOh{Z;xL{QB{n|D7we=XZ}j zIa_#U4tn5(axV`3aadW@C`TDeZI2eBH z+dgGJpKp$KHb+OH2Tz&*-=jHu(14!cV>BRiW5%N`?%bx&qEpS#ygKMi@W740y@kv< zf6%}!=;Do_6I$CH{T+?hyv=_Gt^X4*$Oqbj7N9A>1Jkwg$K9yQ(c8snF}WZePNw?= zA8LqJuSfSk+i5>(2l~!!FMbZ57&axhaoL$l7Lprom2ZQ%?%X19x+o*=Kwp8@f3KXi z%DH+cnRYw+&mE1Y+yrkQ_gOg2LFljlEv{Vf7xn*Md3}`MU0R$gUarj0U-(=-V;^u1 zzB)nNGU*?~8v#bci*GIfuL)NWuH_r?2HqXYKegSS@-}CXTghqMyy`QIdnfsB5E<-2 zGS)b<)}_+7h|i*~?bUtwj*JduS_J;*WU%a;@x+Z}u?^M};1hX6R=a*1`B7ip%57^+ zuzd?2B~R3$lRAvkCuP-pm3n=kui}l~c;A;!OY#c8z0kCx|8l4QHp+h+0siq%clzh? zu5d$RVF-TH3=cX7f8680d!r&bj{jBmFX`fB-W6Pd4=<4RjkucdLO&_^e-8OVm+EHj zFUC)KX|EY)1FhdeZd0ci@s+8cuL9+O1haGF~J;v5KU-k&hNl`iUi+48}gwY^U?S& zWQ?$t)Py_{XHR9s{YtJYf%fd@ABG-nN0+(>%}1{WgGKxypY1@~!uISaIPbt2#D7p) zAG9pL@H4*ALE8D~-t*<~igIX0B_7f4J`~ljliz@%}qqm5h!; zCw2Hio|=IDr(_A*dY^A?2BGWtqx99{Uze|tJg+D(2b`?Z-DOK^slyz2YqiO^)+2Ee&P8Pk*>_GD^_``*8Z_v>SC^?G$(t8Dk=lV#X!9Odn*4`pjLWQO`mp~W zm%GHB3%9;+NV$BzO@I%e1c;A%`?qsGp^sThohD*G&PR}`G_uygv^W}d>p36>I$H~*xTzv$5 zh;Q^WADywKMa=0Dct|_xrurQ&V}S-?{8Hhgz%lkR9tyqi4&Ejk7Ah?}Ec zTi{$Mf4rquSlF9%Y4Eh0l;1+$CGdX4gS?LxXE4bR;1JriR9s7CekaThV#c20Xk~5G zj-Rx6`#Tf6_9#+m6GTl}DuPVEjdWLRcyp0!U zOankw5W0P6c$&wz!X`@vw7sCX9{l!VGyMKJb^kz}vuiKi_w+{oZty=+?i6J{u8*4O zyE)poL)u*BRR?pV-67A*fPQ9jGbk!O5FIc_KUoh7EtLCAs5>ymh@ zCf+>hBX1k;L1KX;xwOU6Y5*S@&m?!f3!j>14ko>>`aa z@83aJ=Gr5TbAp4?k{yY*^WJhMHT=bgED13hC;tQmKsv@&Q|Bebp%I#o~j zQaIIw2lLZkNIsXZJO78`ymy+6gufPDwSSiEz-Q~A-{+9Cu0WGRN9J02;yv#v{N6TC z@8f@p|1J4CgZ#kVyYxG0zLC^cZe`)E!k@rnYbsp_BF`LoYvB3)(D*^VnNu9y&-8r$ zkSpi4UGt9^tFj{ipEz`$6noK8Ei&tIO!bY~bbt%RoHZTO0ps zjBn4uzw4Hih7Xq&x0t-ty-emVczU0>1^6EQzoaYvby7HVXGY@h&G7Mo@Op~tB&{yq zc!EC{-gpyPr(Ie72*$(NB2O!PaR&Z)7o1t(5%@pJca!-3zH9F{t))H*{Iiwa59CzN zD&>{(J+@<##@r9Yg|6ZXb$(2q@yfnLS~Kw<$va!PBX^fLa$)+8Iygg1-skRCX5sSI zAKcdPJ1Zyhx+|YfvL@*Vc1f>N(f(v5Yk`W^RTbPjlwJq^KXAjHtlX*G+WKmOI!x1s zhT7Chn*)D_0)60pYjcms4aUfjJ&_v63K#D8wQguY}eW91KVkLA=}kQ#3@;aevp zE#!Gap2pyaF&H+eW6Tyd4ztU1Km5Y*<9^WM9M(M9$fbC7>umHnK@s8pS&V1J&H@9> zw^y_4lN{!Qv`fXg|B%@4OzpLV?f0ajd7c$rD2HBk5Bh^{mP0!xqCc@uGzndKOWI7d z;&D|%fC>_%g2!Rdj%#M%D_VfqJ|yHfPWlPP4Luq#$uTq7_Htp@2x5Vmm(!kJ9A z2-~~G@u|?WjQ!1@xQ)pf*ONI8lZp0`JDvpJ^S=r{=Px2{sC;GN<8N`VJ?$<0IG*$VZuXb6UbZOWOU)UxbFmN=qvY7V&3= zA9lk+M}HN+J8j8i{(Q=Mhigrc#9Q^(s6$(Ixy65+4t^CrsE*w9D{XCW3@ifu{NLb3 zKjK4MjD?qj&j5E}(%r_yDe$`Zm++Sp;vU3XjvFsG<29df3tFd*G`@P^73`RY&PK8t z?+E*p&)^9s!N1mtL-7koQfV<`w}mnL4fh1tVoI7a=_~L;cWfd5F#ZGlaffFPe#EY2 zGEdxV@GEDvw<7;<=E7sfJ=+k;SKwjef2HyNM0RH)!hdrQirZp7#apCt*ZN`ZKD;T; zxU-mtrOesY=GqtFesl0s6?qMfKf%8oj0a&u_B=A(4e0%^7~Df(C-_GAPHsWG;07=o zop5hEaN}Lm$A$#RlMrN<^2l$ua7ejQ!+i*H4_iOUS3bIZ)(3!k(5x!ynC^?Eg zjUkszM61H4<9*Va!2KAHIgW0HEO!x_<~%DIh0nyDvQ^T`a)%3-N6+YhXZ8>qDWEJ-TypX}jSLtFdoyp`~{!_}! zqP&{wHXnQ~+*7%Ye7BnLc=c_iJ>;--4Y&|4-I?T0?z{+t<7jT^NY;d#%2!DlaFg?e z_vqJ=kq*yYxis`2Ltmze{)_h-0M>2h!$_`tYoXxuF`)@DiT zV2pSVKApg|hnG3~J=eHugr3K{bal}9&_N14%GbasWzhdkR*LT`zMgSx?UYnA4+F`SIs2@6d>g20UQaRiLszReIxro~;J-n9C+;cX!{DejZ87|!xAk#V z>+ND-KAIADWjmsSd(oSq|I5+8zT*D|bjOm}X!Hu{r=>N=J1V0$WUz#7q;x8GGM8P; zcvmKA4vv9+zHvV|2@1mx`zXKr_66$jJpS|#m+p3QzB(RN_v6ySmct!rcy(p|Dqrxc zYT8F0Oa}VKd+1=imr_mMP4fK@P3r~c3b@zEhv%ivbdrL~+YaYR<;1&)6Sd=OFi74X zq^ozb9PL~O!hU2?@xOwQ8_M}c$Z4JQ#T#h6yHXijn+L>sJ3ASzAO1pvL$~y(GN-_Q z%Qxa(@;msqE4zqqKLGZrPv|%XFJb30BPZSG`?v8|k++8U3UE3L&ldj;_>_N{dVHr1 zi?xxyYx=uBXwM&SXvf{VN#Jb|=XG;{v(zMX_Cj`EstmfQ$qfCuOy3NbzYMrqUsaG! z-!xh18_rlWYl7YIn(}`q&v()mNh3?8kAf{=r?fbeBHyI*e50IyF;8FJq|KqH(@r}= zuTeiFj|+!xV#uJ*7}Genqq86P6hkjI?nS0ujDru95$9JQDD#4-lW*(-58_Ras%u_u z>=EpO_a&Sfc+~ayQ-AQJdGH(8+uP}P)<(neDmuu?7U9X_OPeDD_~X5scyqy;DIIG+ zaUs}b-h^%N$HlLLcN^FHI>`y;6gAhnn}1=utFiC>tbV=q`%3lsO!#*Gi}m3e^=YDR z*Gdl?v2R(Ak;jsL%6U_H)47GX3w`HC-+Nx(V&F^up~^Zg|5NhQt4%)?ZUg^0-_N4H zE7X6HdgkJP2fyrvUUXG2@10N|I{3~1#ZRmqeG=&pqci!Dd;;eiR8WZo}mO*z$ zpiw`9zxj8fZ!^#;_WP2DgbN9W-q|8_>mxjreX-2?^&B*FlyF6K(|%X#okb z42Zqfpsl~FQ`~>wsjRRiycGRyD_l5eH|Qq(q`cl#jJL(pON8$NS$yxXx?HTB$=tuB zx!V-)Y-em)&lUfcI=7Xtu=IgoyFB~Fcg0Wsz^nS=O_jObtO1UQ>%&j4C+Uo@da3VfgW5_-AYUwHW#1B`^a24g1!iAKDd<+yF25>tnzj zzofqWTa~*M{Db%P52kB0bv?3E{B&%Ctuw%5M;>U~uDY+m;o}Mq<6VOvg-ayC09#ZfM>wxrr{wMI5&`-Y@Kl83|#+Lm9 z_!<3;T;E6XKo&wu<0Jd_fM2w`TH#24JTCsG+R|)OjAsg>QoMHh*vH;Fqm$e==8cn=2i_bn|4HHFqD7-CQbTZk9G@7no}ga0i=9 zdCar-&8x-y^UT}na9T-w#TOTmr{sUc(H~4l*e?t6H^xEBp^cVinanCMK zb&yBD(S1zYX!CIR4+*mgnN;JlZJm@-zbyV+>|=HG@18_+@#@%LOM+fr>i=dJ_bI+# zkoz~>ca4V(J$$JX)l1~{) zX+SnhuQz^{`{wJuw=j5tv1dOaIg5Yk|JUzd<+W3Ge0z^{yd&8F0%tc|HcrxJ%E4FC z4?!8_7BH@VH0IZ$*WNBj{+54@y8J6{x$!?x{1M@s#J98-`_|kTB29Wan12DB{N^aV z$BfR{Ec0!exfJh*^*65@nVYYJ0^*v$``erxY;L}ZE*3%?I-9G_<(-5!gbrsH^x-4) zaV^@n10CCsp2gXYv$|w9{K@8gU-(t!J0g6SJnnWS?UZ*DzED+OdXnjlXy`}i)I2n; zqBZ=RU<|lV+*lCdxIYv&_#TBDdX>(^(s%hULrY)a=9L!vX;sj?k?5Oqo8$rz`j>HD zQx@bCE-oB;CXaDn6F#l%)7&=7tb%vp1If?Y;EjNcp5PMY?FJvozt%T9s{1(YiFdJc zfb;YZ**B>S_G-^F+Eq}S$Rg=SXmAB|oX&^C1v~|Pr$3l9krq0iy_6TSN$C2~M^EpT z_d>MRd1CUmv<>PNGhUD*ZF*Z z|L60Z=dN?kz3=LqDk@ zyg|6N@UOo61nvGU{EzjmSDV2W}hXxK(-9E9;qfcGFJ}k3NZSD|});^-`39-&$un3%^f5DXvwW$5Ps1vep3(Aly?UF$#74A^Ea6_8eR)| z*C+QrAa9@GJ_Vj33)_)l*KzGzBxfvB4f6LFayZ@x`ko#NUAqIXu<0IqBF5VJIeO;@ za{nEAp*1)Fd_Z^XB|h#!9FIqw;e1~n;r7S(Y5pd79K)T9|5#8PcxNaNqo@9*zxvQs z!|>R^zc2U~uhT%-ISY3H_h|U`TJpL4FL678cuQs(I1SA+cnnsSO7z<#?hJZrHUDOM z$o;2uI%q79i>2Mg|1g?~Al|Wi9-g;Zb9H)aG-yYktrU*;Q)8WRD*QW@b%k=j4dQ-C z3;9M|+_j$VJ3D~4`QuK>#b{#F^gy~W^yO@M^r6Fx!QTpJuy5!Ep2q7zP*c6JGmw7q zf9=p__Tvv5T4mJPPW9MIUTx6@|HyYFh_}#VY!l;v1>yH?o8?^>&QExLi)S}ui2LPz znD4k%IpQus+#SDEoveXxj+p*J8+IM@&X&_X6n+ zw6lld{wJ=cs=G`-TB%FZO{OcwftN9k;A}YQz0o ze|k=T{~BHm?ls_Cee@jR(4&>em7(O)aoq*j=RQhSpGeomn&T7@_n$r@ql>{`3ZJeoyzyNQZX$p0C8wQF&qvWQ6+vtA`(^sJ zFMZ~1gu%_Y8}lWz%| z_(%D!bJc-2%JaQ&ewO|wo${q`kMsGletQ7e4&tm!P31aU8A8v#t~_xbhP{wx@gH{zoNK{b>gIZF=5!ExHTLShz`qNgL-5~$t_~QZ3~z!J z@*gMNx?(~1o{wfZ_(j-#x%4EuUGk`-Z;aHQWAAN`w%r;;IL-&}1H2KO57kE^Tt^@M zMSmQpPxTUxz7y-K-r!2c+=X|N2kMuVK*fZ>UvCGzWW{!huwxL@UbXZlxoGnfnaezZkH zH;|R%$nE>d$}@#;ggY1SSZktZ@>0ClfZqHo!6*C+(BF)|^8?wMWcpe87Lu9PKl91b zV@+z0eE-469j_F33XYKG{7gO;{@&6u9vy^VBJZt{Cg)!A+pO3I8{T_ zR{l%TI9rqBUCo8ST3PzU|MD1!IngkAE+X$w<)6gu;J>TSe=Xci{N_rzA)LDWb)_Fo zr@=`*{HJjrZHzW?lr~VqC-2Z66)EhCR)q z>j$@&wE5^J^IyuHiFYk!_ig!FX#>&CK-Zr?>T{RyG`uI0jn%;v{GyJWNy(?-d4aSi z@ZUq$Z31z&t)}oYa`PoH0{-b_TYtFLw9<9b=Yi+Q@DqejgL5z`^OdWNw1xabl>a7WkMlRz`c~%v^GG~7*n@`!op*W7{d#(=nQX5Tf=MTY&5!nvJe z(Zyb92l<@qJC2lBoV~nRJ}czkRle#iJG+|B0->Wnk`FtjIdtOr|M&e}qwm8WqU~C9$S3)akN01*y_m0ndkc4@Zyn+PJxqFYcx>1tcSH;O&lkfTFRq`o zx3rzG2Qq~JLT%_9eYK^w?w!SSA-*5Mtp{g5oF|1p;J$`$alGm)LyVvP7XK;Qn)bW~tsjPc=WW72O6x@a9831>N0wbeeq9en3vVTdtTE-aWYSR}bl>Ipv_pH1 zJkLgd9h~Rk560ttaX(9&2=6@cpW?TRyo_^Zab|HX@Ro7@kL+C|F3z;<#P>;fv%xWN zPY@S#gTv+PUPJ8HrI*O$S-{(y={>UcKkxzEt>6;)Tj0Nhz6{*sf%6Hu7O=;cPUBvL z_HPj9)@RGV5`*o(>|0UKuN4enmjV-9&Z+TD2d2ctmb(@}gq>7D7Z&U9R? zPxhjVZZOw)#~h;#A^#0s^D*8Xl=V2S{greJ{2rh--4k|%!|p{tcpc!!-T1@6Wc=8m zPrAd~XzrcUHJmYQB5pWlaD-HIDk25``(XCUK+WbYqHDIRj z&C2$+Jg$P*j!u4?8}r=QOFI*vr|He&pq+56|NdiMSOQ#vUthHLKht5-;yh_R`5lCp zI|PMs$f>?#t@^C)+cto|@i|j^O?)QH|9jtayzqJWoMg;#lrhIi!X424t4`N}qUd5R zH^wkc)t5PY>I32otUHaVD%!9$@&dYk^4%zpSex#HR~7j*67Sw)T8REhX%E49P53wA zI5QLV9CmQ}E6>wtx}kX&&6RjmlzyW;Hz-expGGUkY;dKpHQW4&HW6cm3-F40=stL# zhV~ac=HPHnA@A|NCx}kO|~K9nfByF>KxeKk2h)=!d8BcMx2s zKgJ!2uermy&fBDG$t7=erDf#VP%>yZ`BM`g@+6%EZX#D=f8{#zENq_K#~nasSKC$0}@375^Y!hMjB)m0te zVE;7r7uQz0HOw4mk2ayH3EbVzgQOoK{UERw|1E$G;uK@Rl4gZD+Cp|mIA4#9t{em0!@1YUcIw-%GG07LP47esg| z+KT#coS{2XUo8hhFCM^+xm|62zOS_P`r#p91>IT?&0qT6Z1iUdKcR15r~gmY|EKHs z$B_?Z_^(7ukL7qXA=a2K7B@#+MgGR}>`0H#jlAKTBNq0YuHpVE9P65K4s;_KWX&** z;JS;OyOCkHkxx6wu0dp6%!h`;V{0kyc%`CbSnTWV=HDCcr_$XE%&o}K1H=#I$0x0a zzXQZuKhBw^eejO`%dg~ZE}O1b);RASay-^CA3{flrVHS{2d^&LIAddNGc^^zi@&S* zxF7$4x^VU;T?UE@dmAF&e#q-Uyf^d?o?Xe|SYLI%JU;~QXfRyed@Af5dd#cSFY0xT zIy#m7`@(wjr$#O zXStlREa#4qp5a9qta<0R{2v#<4VgY%{$1riitN1|+D8BPRov3tnE&(!A87}*w1>EJ zLdF;9UqE*Sx_!jmDegFY?G>lR;`pGN?yIu*OLEL|Kk&N zkX`{nzgc^GRGyu*>6Y4gSMVOFgSIDrj;@M+VNE2* zoU%BG^+NNdTnx_1`rP?k=g3mf1)e!yI#oY?5nl9Z@+5ipH0=n#;F|;H@_5ln`3(Gz#rq-U+MD0JHr9snS$J&&H=?mm zk&cu{*ief1R(mR|{fqoGxe$9$Q_%DS>_y~7%5?{vQ@Qr2@;3gCVYvCS@&b%_S#gzAv?|fxyOrGxLTb?Cr?LTFAuhK+xC&3vT zJmlXU{35OdK6j$Il6!&hRq+2Kr`Ldw$#8cU(v#c;>gP~(wF<9o@GHSTRXOhE5Brp# zqdQCZKWiy@iFiJQTQ=#TVe7&@8H%IR%a>JE~=sVK^Yt1zX*gq9Al({{j4*k zodz%V!tO#Bwiw&Pd5`~Y?ojP!g8uUkD5*>fg=0SDE?G{>Mi1m)jXGcD#`&z+0L95DA%j>pg*4`RI` zbYs{JIzrlXxbCi|N2N95#$Nd4@(lY1S8>@g$zhx1UO*4#e)8O@4BOS~aOEhc97BEA zk>c$0@=lH;wy09fw!H%HC~;C=aX%x@~;P> z?*@vyntL>`-WIldQ$zCBJ>$Yzks;)NGvQ_8L;m+7v)KvE4f(G_^CLK(KhCLN47!uk zbV+W_4ZBhHaq{Q%&Tcv>-ranQE}9H4&b2+DEHm(m`Q!oe_#BP#yAS%`_q>e0KblwR z#uoI}!}#2zGWLag1wPNyPiJvsJ+lQE4MHc!d?;*Q#Qc(7;)qW_$iJ$2gFUkRA6R1U z5%=xCqi2hom$1*7+3Acs7`c&o1shuhTU$Hf#CbpOr01}4xCq2M4NJ^pN;{LXoxhfO zT4VD?bDP3@>zAR8bEBVwuhGX|;jwUwI@>bM8O{dI@U({i4W7NEKhB*9V$JqVv@uV- z80{gxInIuT4VasxmsLjR71LwlUiNJ}eVcm&X#kqW@?a+>xg(NqQ^v9I{zCT**ZH9I z2Am1#%BfE_LQ-e-!!~64Qhh!JBEE=m$1!MPfA2c@U4%P=G5j@vIdtA1k3&J6Bl6#* z8~i6-xD7z8Pv5T0Tft`hk5R_*+CA7;n;u>oEJA}W1 ze=Yv!qYr!4ABvANLlZzPxc>?p-{sHI#9sKL;6HumR&Lyx=uS^xC~Y8|?}0Nv`6BVJ z>i5kRX_~$~M*sg@^EK{BjllijByh2`VZeET^ohQ2{WaaJ|8E53T0WS3X~ZqbWp6q? z#eW4i?zHz0xl7J}%eCg4w~OBa!cN7h!g0o94w)HyJExId-bF~QxH0~ZyBp3(6m;Y? z@^mr(LvWu!Q$pG*^89abh`7haeI>tH{7;Fy623V{+y@TZY&mRblm@XMbd~V2Am*B} zw>VSzeudW!oPp+Oyhh^h&D;E~Z))K?*^J38gnv@5H^DsRjPoVs#Bb%67e<%QLHjzW zB0NI;>C%lm(*6AEChrSMORI^0DdqhX`~*MFXZ{Z2T&wl^$S(~=V^1~zBE6&UiG8y; zmvjPfJ~2Jdox{D!H^iPHof>;tX^(Hb6CB`M*5KbldDr1{qkKazt^)BbJ-D%sA2hMo z82e#A0d~l9b#(Ec90(`s;tOTjUmJJ`So_Os=mPiD(njrLKW*qk?WPz1`{Ij%o1}#e zbK}bVjCR)z%;0}edu$C35U!-%zRw?f+wrz{j5}XJql@J(@`yA07xLeVZ=8)>&K(Ko z33QKZ_nXlb4ZQ`YCie$$6MkQ6-*K+vSN^Hux`GqYHPYUH2FrvOgI%C3oJqj`N$}3W zv$DQ@nm)EpzicP%UU=i>O{As9z&)j~H>wy;FbLHO19VXvS;2ZwE(QWb_Q+-FQ zkJQ$G?$(w<-kT`Ce~|<&&gYr!4G8jYNN~ zw6G~%!8de~r+W_tUDw$6&Qz`*%IqvsybF|qhr5V{bA`?mr1_w=^mg#xQ=VhF@!vcR zuPk1_E6@Jw)msm_z3}yTns4Pl;dBAJd`FBkqMl33V+tsNmORUBFh;w{vxPfxTPph- z;zr|ULu+P?o`y{+t+!yeB48DG!-^1rJ;qLge6Ow+`cL(cld%)NJ^S9*j zEVxs+g#K7TKZ|@4+8SK_KmQ=VS?C^=Ur%LTs(j&RDr?-Ij642Q zpRty|1x=h8iM9CBbk_Uy{116WivsgEBPCVW%TP3fME49(zYKcv6?2FxscT?XG_9|nHJ;;CkwEy#JdBr+YoLjh^e2sa`t;+PO zb04od3lVp^#+wsegU>4YJVB@2re0$XyU>5@++3=s0j|X_>&d2cNr6mqT7ut3uoTO`p;hT4c+~Zb$!=9$`bE))zgRc=deYQ*$K@tC#2h;Ju-Sj|A0c{zagcKYxtITTw{NPc+;=Kxecy7M_VAT95Od2obLx(F9xME0)R8#r zp7{y?g>}{3RXw|pnf~!@Eu1GAqMn=uNw@pn8?>1|{@1bo=K=C@J}R9r?`_6Nt$fdH z<$nRc4)Xs=TkE1tyrE3-uEl%4|5oPwp`WkQ zcbs8KaSo;w+<&F7j=t-EDWm+qIj6dh|HQgwK2ThBd7i3|gw39)tJ{IK<*+kZm=in0 zpAJ?RF;BBro{xfWPM*&eUgUpki~n%)>REM8$fm=5OX!lA7md@#{nzS&U3miKKR`=4Jz^RjPto3@D}JxR`5ewxeXE^sI7z#DRXenwpZY0VDfJmT_)XwkL~5n}>^r2f=-T=pO88G+ zQSUL1odvfI8Tq^X|A;n;KF%S8%v_|rhbVj8OaB($?P$(ct}~VWLg_7h$A0+5`Huej zS?tNhd9rHi?k4S>{?1jj-_XC^(6sfv=gTMVJ2VWrs=neKgV@Jp*DPdYioHPRXp%X5 zyicB{sT*UByafFp%H|E0!uf}tzWo^giFMpuLKzQI#v7DB?6p*r$9i!s#QldZ=CMPB zFZ2IB=-VGK_h@Qv;VweKF0k_)X}&o{Z*z_*;)Z}}!j0h_EAG4_>2LF#-^_E$nv0az zkK%oUquu3VyCkCB-&8NH#ovWd_9B#Y?s)yi0$*N?a-J z;~{O(n@`zUo8%rzE{|@H^mwP|0qy8(<#z&7@pa{Y@bc+yhKepB<#VA+NvGt0efIQ%e!q&$|3Q84Cw`5x{HlFy^*?XbFWv_4Y8SC4yHnPrLYCyI80Fy`p{Xr5x923mfrumMWK#2fGwuqo!~s`xb4cxwap7a?aH^ z2XTwYrvu!V#h+2ZUT{U{%G@#CPaoWfXSDtO+{wJFG`YroLZ7KzO25}v{*e~F!vyDQ%kxFwHMSMpe2PJbvv7rDp!Gu-k1fRCg#V1p;_ zcOI!fgdQ0TMrhOH(VmPyyLEXKIaQ7SA!VNo_gLzA%cwW!#E_?ypFZKED%J?N&-&lF$JRO_HxtTurwfxT4H+zU1E{}cjeI0G= z5sgqLZL=_TUgbaRt1NLx^dWw_EG^THMruFDEB6p>rk1$b`l|PLQ$KD+x+2bW4b+w{ zHV&Di4OWJGES~27shGChM&Dz1CTu6<&!w|r7jGh_NA#lwz**tEm;Q6GejIPtKE62=U|5$!6>7Q|?wv@46d-7!$+&0SjfNvWm?I*G(zO|Ho)klo!QOv`1|?q=jo%*`ETRiL=o=o+FuiG?gQ=NJZ-6;w!THb{!pJ~|0RC|nrnB> zg{>c^?Qrzk=ql&Kndd8v9WsV}~- zUQgD)9wSSt>30>SJ;L8t-#kU%I+Q$hm%1>&p5*_DbqD+9X@CElJ)`(P^JiRpR%x_0 zHOYUu2t4n<9!;No%{4y=`yy!+|C?|Qm;Ms}wfskeOWvLf<>wSIoLa>xB zY{tD`{3q-`{cE1{x_){%*t~+gTkcH468jv>%uSaon|}P+4|McWeQU8k0ygmfD(y1y z7x5pq82xwlFTU3YmY5eU)gSnuTLcywQ!G-h@72*VeNkF<{#j^-q4`q!pI|7Q77Lw$ zokzdVqbC=TA>y`tM`y!ditj>sUCP}oe55k|f!}839VdQ0zWejP`2!v3JG_sYx{@>T z_V)h1w>Eh*hrg~mS+?YUp~J` z=PVT$=L=#zKkg@2LHoV_uu)$=T7POt_bo@$M;~G%IK8dUvDcJ)f-Us@&HB{-`pF-3 zZs^^aF>V$CFPoJ=@}9C$?^?~it=KK?U#^l}+GlDw%~&3X!1(@@^_IZ~WQoQB_r zWYUdf)G|Dakx|!xt>W5}C2R2bfu4`|jt7$?Q{g>@7d!Q7n7BF0d2`4NM)on)UO&y&XXUoL@HTln3q1tdB=Y#m&$J-Y`S}={xyz_>5R@@nN(IkD@mrz)PG0on-A-oO;;Fm=(Bss zk^1CNEB&$9k6d{Bf-TZc6`m-~Tg5S^DA*pqjqI6%_E$XET2J4RBjw4Zm*8#GcW2>q zjeNc)SI#0ot_gW0&rW#VgYOu)w}@{|22GL2borkmZZ!NA=yuCX`BNS42>8wLFZ+%4 z@^9>)@V6#!e#G-pxb69$B8TST(+KWg;BNmi<=YGR8L#{AGOR|GgB= ziR9ir{5!=N%j8+ytI4gm>73cx!GGK34W^KFab|?=r~Iq%Z#&rJCC47!Wp4E^{fKrq zcthLjv)g}Zj@EytJ$!h#|7UHehD%B5qz&N4>qn?&K;(&&f?!&f4>5((7#JmFz?Zq z-y;_`>Z>F4-7fm+x%&1_GHNiGsgDj6ZlsS7hW{*C(cgGyR8{hj`z;tiUKsnNweWlK zza?&kK0gaA)Ble%$N2=bCm&us$$8{cd>^+CwyO*v_tck*>8tzbTXFZ#8^O7|@y&tY zcXAtcH+bT`F2y*x1@b0pR1L%J>I>1;}!UJ{lpmUQ|q}?$X8`(piW|JS({sn z-WaORir_U=Stfq1zSQ+lI^ZiZ-MBRWLRZWL)t1HXCWTu~tv?#oj}Teacw#e!|$% zy8wmr7|wjASleKeEBDst%9v9EC_y z=gPoXuke0E4YJ^6;=BBvHAA7bjaDxXp!q1@#}DbvrcGQB)4X_E3=? zSw#1Cs6;nu1HHAQm$aR2#@S)7wLksf-K#WLyNt71XKJHttLGcUg>BjMv_o@_JYD;a z^Hz(E#bYkB#$4bO{;ud>N4qcD8|WSTZz2B+=Tu`KliEt%l5+7o;~IAglRewQdS0Bj zi@RN~>SIS62Q}QKkN>NW>w967e*c*Meirv>{dSYS zy~?=oKXT&(@~0OlP2QXj=d>T}89YId+%WVZ`)&w$SDtne> zYb!GO4YK?hG$(#eH+)QPk0)Qj3zMu-kpFF_xpP6LmYis9Z<0L$x?v_h_kC>r@qOdY z5A8#J;v6kFV7xO+?^w5Z!`%A~bCCDwP4P#{ub8}UlgAd}9`OFc^Ir0~oqU$a_bGf% z{y@3F3^;>6Q&%4uQ@`ilz}P(&$=M4SYj5ja^6`D^1b8p|z<>6U^VD$H(>*KI&1_}- z7u_ZJH^;v(=px_EQ>@qHI}A-XJYK+~rSNLsQ=1N|>sva#Ltaa7^r`;^&k>(l1MuC$ zl<_A#uAuYw_Z?{Ri|7uab28mkNBvdxpIkwoe4@_J_n+((|Iu9ENY6||_dMNnHoe$U zdJ%AydS4EwuX10E?j3mFEHFl($AACc{)Kk&-b%DT+HawEHfa;1>Hoo@YqX_U6FFFW zOVaMpety+fMr%7u%}2@_mkg(;D&zHv^xK7hF&?>${%N?*x2=(=`PzxJl`DL=ennUhP7E~i2&er$CHuV$Y*woC8>9D2d z7T&?lKad#@fD_1;X7pekaWzh~mO>7VB%d~sX*1B>Nw>`|>wZgRHpIoRBk!hF^g(3P zAt%@ulr|XMr{#^~jj896Wsi`93o0lVd3Ge-bSs%T3e2L@>d`f0$h_+0;v(`d#_wl| z>r79b4`;sc@$}dw{DBqEE@KJQhS9IIIc2h$e+2hNeCCVm z1WxiFtdX`xecz!De=%ozq_T4P|7)T>(Kux#JnbN_t!n(|>VB zdV&7)tN6M{8t-WH%f-jtCg&ycn|m9>=--WtSlimmoRB~69Jrg72J7pwFLj{49sN3F zK~-bWAL+o-WJBCT8>6q6k~S92KlI|0#;;ER`zi&SGeyXg1zYHtU-9C)N0`f#9r6B~ zcVqKE<~&o^(_iLJpMtOX7i{{bacg# zpJe#QGW|CdbtsIe|q3TdUgjLbv`{4bD*2#c@G_aGrjOH{V-5^E4u7SI=Q~G z>?i(lbnx>&N^}!8B#tjAnoN z)kZ%WTnzUDv{(6_<9*9BzTtUwUQGR;f_{j+>v5m(-)!(7wC1++|JB8>9bN~6iD>Tj z-&{lYnh)o@wo_|M|J{ z=q~@c^8H@g)ADVjO`NQ4T!8L(ZE-ceoy0E^XWcPf1D=-_`!fr*)7Jb&w9kj>|K@c4 z^i{@N+>?JY=J?r~s=jjAdgYp zy>8ma7~UA630;4AQF2)LMPV{6{YH*iUr)P?AIxpj)d!OC=&@EdsVQqDK%lCkv2Px8N5{8)Kki0(b~|IkxcbNA41tLUZ9Xg9-I zz|HdPE^UXr?1SWZXR140wobWDf>T`FIMCPkpJGh%95|l;7yK(J%V=Yy@}Q)0bV55* zTnF^~f-%DPMZCH_o&Fm~Kd!|0etG_j{!038nfUL_@8hNyFUMCnfYa*_D`!Fd1C z#lo>3d?%PL{OxhZ5_lTRMZM;Q@>pg}x8-PU1kJJPW0mx|{Kw%rMm}FF<3-}s7z<1hS{X?C3JJ>k! zQ2Eih>%_K$O8{2*()boDRV>=g7B#s93WpMlQ?X*IO@ zQ>BNkVzw&^?^}PbUpUuNIJX@42cFr_n5CF8x4sZ}zSx3F*A|1j-~ZBHm-e0b7<)e> z&%f|_S~nWSF`sqnyk+6|+4gW%Y|55(9cknE@ z3a>anYOg<+QV*r^oa{ReQjX`*-y-c;{r>>z+vVx5a`KK=IvUQnqSkVX`c^#R9R1_u z4ZENDM`IUuUSb`rU{iE7nRFfbwU!*S_mNLFu5oTZ?+dSrvCbpn;tX$T<(w^k4f(Zk zJDrW@hrjG`@lPc8egsd58~>-dA9?wcH0Pfadu{1tyu1Ht?M-;3{LbA`u(zF8lcUR| zh3q_CzMuOa;r{ux9Rc? zJ93ATzxVoHc3^YZlD*2@?>w^mD(O!d+YJ)G6n&gyyYvrZ9OE~3mckBUUWi|HX^-JI ze4DWhoF&S0pY$&DKx=VL_-_#(XOspg7kgKED}3uIxq*6!JEU>f$N8Q7s{FmTnO+0z zlc$&9x?7uz!H>PkuHxhU%*)XHA^%h59rv7uh<}D|+7EpZb>f_B;hgOA@*SYObP<1G;!KC)z_B z<@j9sT=X^Jzw!6~_G05LmB;1@m}>k(u?4|+jo4d z{f4cwb<(CPYdzsA{O(eux^UfF4!hks?#i#yP9D(~|1`$xWz4lNy2tU*p2LP*%&YQA zfW4J8ReZd!^QU&}d|%x0NME6AAnqyY&e!H*=--mI3{=++2XejdliR}?z+cz6@IG`` zirWj#GCX^!_s(c1#rNR%mGmLfKafv*uKO-2-c>zE+BL?BD~uPfF<0xd$sB|`N7@Z= zE|gXVuYSrt8?49Q95II-%3JIw3wZm*5A&s?xYd5V4%cgBC09=0H!CZjvj9r2D`UumuMwXi=? zneOUAXZ=X$ETo&OS=9;?qcDu=-aTxYke$z3l8VM9N+i2U5y_uHU{oYuZKrVuCF@z3hqjEHd5m)4Y|4Tl=|1#H}##`bJ!z<2LmGi%~7jHb8KY}-e`@R3oTN25e zdU>~TXhZ+g26W58S^PV!jmEjLWzzqo7#`C$F4Q*ST|Rdx@@ny)NpFP5*Wxx9zy7Q3 zO+4O-vekbk{ zXShDv%D6cM)-&{KJX_yuG)yOrra5N|3RO?J;mA8$#p`IS4+2bYVByL0qUDh}ej z>ojtm4YNF#Tn~GfYvEs@p->5IYR) zhT|SduEUMH7jfS6OniQ|wsDB?yW*b?8gWP9HD3H#{PzV7`fud>p*Zi#r82^CA2i+{ zr@QhnYbSlV?xW<6-~-`)zgTay2J^8sm;?AXST{LWo?Gy_QCojew-P~l&W{~xq)%-2j8i(;e2_6%ky3Sb+_}8I3QXbx0%73C8wZU4H z{JcXHZ_uX7aQ4QtsQ9qay-Hs324TFJ__#70DSVMK91N=QcSKW(`xCk;cz-}wqe77TXRa0f4tq>NEshc#*X~gD)%+whr_7`hQfOlG(mre@NMYd z<$7~HdkZQ(ri@MHRn-6RwK|*4KT3Ia^Rv61K3CV5gHM!wsPIkVZ&$w0;cO8XHtmY} zpJM&$5_s#>^=;Z**xWveKkVJb`x=i+I~CsR!b{MP_pPgZU(^>H<++@E+rbID<7Y{a zGd*+R9U1Cv&FB1Q%axSm+U!$Ea*kn+(quhxV;CQN8qx%miv%xaSuP_*9UM)gGTV!Dadz{ zW#n1mZoT{Wxi3CzjERWXybl@I9!y6Y_sni4KMygNkMpV3A+X_@_a!6yke3x=&Vc4| zcwdV90?iBJ!YiDR+`q1N1fq>SpZI-#F-J@wb78jeFRp$t~e}=b&KQ`(No}=%ly7 zAiAYA@Gf6oj6UANyAa-A_&b}Jy{(XYg0XZ+tS5%8wOQP;aO@YRz3H(#xh3hv4aQdG z_*>xr1*oJfz2JG9B3;7mEPN?__X^!M72P~}wnG>97}s-S95-10m%(34zm4E$*E8P) z!uIAdz9H_sUWslB{3qr0r#x3kU!rc#L9;+PGKufUFpkI$G6;1 zwYlT*yBm)O(QMYX$LkMG_{(e8lhBQU8-3;~`Nf+PVGE-b_b^bD|0_5>xtrjxhC2%F z!}v_l|Bj`%hwFbaPoTfk+v3mDCmZT}=ZfD;`EJz5t_OAXxu(*N)xX1L*>(DT%x}-v zr>&{v3qagG`3{)p7i^1_z~?D6rR8N!Chj7p-^BINudfBpPaM*$g8!jyBFf5PsNwxs@B^keTw|E*v;*(J#cm z0+t&p_Yd@kDUqj0`K8~pB;_5uFx8Koomi^3_UJ%%mAy29=T=8uHqKKZB0wm-Lr zHujXb7v<+Imo!noWydH_7oLje-uVB8{|aR+qMzR+-TMHAH>HQ^Ti)48(f7iR(>8MA zFFfM>e_J#^kgHb%cOml#@U!x;)mZqZuekbI*d-{~r)GO5KPDXa<=^5)KPt)Xqs+$H zxefY7%F+Pu&;di##j)JOrC%uSGU+qmmsHmq{U61&_jlm1sgmBn>qq=!+F695-}4x2Mw{D*_JAN$ui-hQhgzu%<2haOrAyN?%em^sv>l*?&Yw;625QZcRzj&;D6_vr^DGtSqb$NR zu&$<@--8zT+zXnDYp8C{14Gb;d~r`FkHqs=v|RyvwyA!UNqOj)^c&oh)Nv2>e<^pQ z`tOA2H1U6^<6pV&sEeNB>VsE77kF2aaTogEX8Qk*lKwVc^jPkR&nx0%J#>F~4@>(3 z==x#Hu<#yOJz@6J(!_Lu(+3QGiP0{pe)D1UyMfqbd`VD--9tm5R`Eu?5hyT+@jg`YY-Dx?v zpAL%eY6<5R@nwzes~OKvpqIW4`b(TXP-imGy`~%fTS>c*oV})E#{4l!ve0jWzCtaV} z4Gnwad5}6~7cHF!Vh`bU;m!Dmjm|g3{iTfY25dj&44V!0=>5Ni<6Vu<#VyD4Ui@pT zd;3YLqH;ZlN4emMM=}511M1LtDIXd2C$1v?F+K@phb^SbEsR9fq%VRi&({u`Xe+Vb^`P=3<-7y0aOWv+ zjCH!99U$)*qYTB|;D;p}Pp5B+tw6vagaVaOe7#kK{KV{mtk;QD$?l)JXp? z1#S>tk3Sn%VgIUNAI+pYDK6CiZ|La=qt`<##CPpdLCaC!LYk`-YWxeS>${jF~8H zkhHKl6!qB~bd%g2tEGN6NZ*P* zVRnOad;MdIbp`8Gg|(*^aE=lGq`tgIn-1G0u`d$)Gv2bvO)+*SC$npMn*x>39$6iZ*70z?QCGd#-xYLza`_EP7 zZ_m46cRuW^ya6i6>lA6rxG`VZ4E(vdgSvkR#DDU(@QLcaDG1qqm2hW#N1_W^euDZs zMIE(}{+qbiSB-t_XXIB8er@UTZc*H)cb_H29(pf4P8N5xvYEf6r_hnZ1zR=?{3q+x zdmB89srMJat^Cn1zwjSzljaO^+Ry)YnD9aHUkC4l*eBhkeU9-TH`4|dNBczkpZxmZ zQw`1spb}m;0qr@D248`D@iV^4)9}~_&1A3`ZsgMm9Ibs#m)~FV{~Pp&H%9t};`H}a z0_~f49>{+%{L1`yio4i5>WQ#<3NZw&yvbC&lpUziL|F+XT#4l!E%Ok?>i=-1%=6B>4d(~0u)K4@+U zO7R~BM)SV{?;PWRk!VgbZa;$?1ME`9$mNAkk=HH8Wbr=f$@s+h=UV=b@E!+a;9ki+ z1iT4ij$azxnaVc7_?lg>*!xQNfpy_pQ5%xA(x(|PEgr--0_nXr0=D$sT{git=aGoWth5sRV1RQMb zVh=bE?mfcig0MT~yllDvoPp1?c-$|~>3BEc_hwr@0nMSx7H_botE~+uQ=Y9 zYp+kq=L@uPHYnyQ-it{qL9BJ|h8t@Jp6@5}OIYn6CNnhjdov8Gs z_^=IrkN$1WbL;-?B<0i5N?^~sAkA5)Dy+(WKx1|ipsr}N9? z#Zs_A{wJf2^(5<0nZ2xh6r4B7nYe=;dajQ6{l$$ZH?Jjc?TP2wc=zK!9RC&Ma^~M9 zuCja|fj>!@Y|ims)(G0^hj_QgE9OLDJG8%Yti_`?d0zp)8OnPc z`uV_KdyKcz{qlbqj8%Wb)kRfx-hlral1c@z|E)F|f$ZRvV&C4U)Z zcpKgi@Yv%GJG5z_w5nX9G48JA=KRC8@z3Cg-iSF|*zrA>yG`2j+(FW-bK{%3i+fUf ztd&jRegi(^zXh+gc*eRJTXHGpyXVF?Nk0wjjs69B+`~2Jk9l%F0o*07r#jvU>gz`f z)%)e*V-4pLxS`Wp>Ql4$Kf$M@{L4vuUOt_;Vat=P`sA&Uyf-=U0k?)e`7=Iei*F20 zfOEb)W3C-`xsLYifHMC|$W1z}_R zS+w7X-;Vwue($^%&SJeM?r-TaJ|3;_HP#1f>PMM-0=Jv-miKgX1<=7b(EEP*FJr`0 zjVo&yH^!Nm26!#Svo)y7AM^8b(JeP#JPDuSzQ2|{zQLbe+QR$1VHdTRv`KIeRyWp& zMVz;ca|wHm@g|iwoeH*Yo1;Afj|up{0ge;zJ(3h>7URvP zYQBp67P(Kho=@DYD|@!@)3CdYZOSc9kr?+kI((XJ7H zKKe5H-W+kOgq=yvk=G{vwdgl!bLQvyeE8$kZ`_@~03YY|;v8Qtk3P;lqX7aAUuAU**u}3h%Rq95@Ca=N0n>c#hNW zLLb)G&#gP8eu%Upt3PokKQ1BEBL1TlM)k({`vlDoFp@cZc1JuybjDD({rm2;45uZurN1 zc9c4)AnqUKbtWY*$E&QeJ)n%SKHtzc%=K+Y3CB6Okn^!N8D~yL%?#;-pa2R#6&d2dJiH(K_1YyjzV|&A~ET(0Lj?Hy+Qn@{M`c z`@&UxZ%xeXpQK&Dnr(`+PTxqo#5lJmcLaRv>voe7r}U*)B{Y3^3L? z>$e2N`zZey)33$%lI(&y=VA7%Ug-z(R1j#@!7+rB` z-PKpTk26|0+Ts%RVUIpnQ=T}-a2MP={r}#-N!}RE!|@*lXNI=(qW<%k_7i(<@dnOr zb#@m2t;*U74cmoz9o)gn@~C{)z?p^T!Q2}1*dl$5c65(?`z!xb=m)^PQG7FT?p+k# z$h=>icAKjB{t?>c9opI#_eYQvBQBI!6;o&Ws!uh&#+%v=- z>U+?-}k+CW<8 zdu~!^hpL}fQI)k%*@qOtj?K;k5j8nENrPY^Lyd}6ue#Xm%cWatS zi+#xF@Uq{PH~atW^X6L09CumlTjtAs%O>^pg}M9!dB5bp?S@{T4SPn(yXwgtIlZV% zu?HS&vZrewb;!BSc#cx`w|&Da@`!boI?6GCdnNeCe=`bRBl$YonFi7aafa_taV4dX zl0I90*6?#BayG`N#*l@#&yIwv+r}G?an?UIKofHN1hRE28T}+#-$Z(}gA?)imb{Jo z4Hrq<1m`fiCeEEdM+R@l|43oy?X&akse*5q17|Y5I10_nX#apSi=K$H`t|6RvUF#h zOkMbQ8 z&{b8wy27ysa3G#1&@Ju}q}YRqdD9>2N zQ=K*Tzn1}Z{2v4SPwU`SS0@#v?dHE<+;sm-7ys2|{{LR^=J?;YXZ-6Xe&{cgDPR4mZwiT&V7f%6FmgMDPTE+@XlJ66eh{>%71C(&(3}WBWpd zedX9kkNx2_{;%@J2#**G6!%RJhzmIv_p8b%Z_GjVL-#K~dtK>EFyHrt-Jx;v_HIG; zj%{W~F3#nodD87?rLM*(&Y7f>;QlSHfpSbzA4{ZllvYyNo=|>S<*EN`BRTenii-Ds zZs9J#Hgu)I>&lR{;Zx=FtoD49w&y-c;U2{qc#Y++DK6f=JYoQZBXy4mtPo&RfRCEs>NGVVhZ z({C>3R&frpJ^EO)-#h*Tb-2M<%Gu6Qj^%H!9B;^Lvoin1AMe`6+@}nv2W|nCmGNx+ zSMv8#wsZ0E=25{e^bO87hP~z=rF|jpcI_kf8m5?Em@nmi%GcRAx#;bN&^|Q(3v6P>wib*;8G8=6oufttsXKH_CUq zdRgr|w!@8gQwGBQe>B~99LUB0IPj}vgoZYiEu=)WBq=3AqKFnnMTj({NlH5!N}3v) zN`s=%Ae9+1Dx)DOoG3}^_k6uS-`^jv$KAc|b+4Q6*WK&xb@v|2ZKEFL@R}^%eUY%W z$`^<`2|n%+b%L(}oT27t;hzy7=arZ8zlP=lWoardWFB0OF?a@i$iBVM&|lJgb)g^U zvBoP~&(v0%y{jFZedLfoHNX|hd8;`0or?2e=U4d!^&cesB>YL*p@qEMMao^k-r6C) zlW#y{{KLkZUY3@in}NQf{A1ikxlUK!xVIDU2)}2X#JK)U{6_Q#DA%r_nY^}YuLs4) zzl!Io^FZm?qNX>1H}rE)Z8t)EasCU}0InULKdDP`7Y03DGqcmqE2JMP&r;G{h2~pj zDx<8^=pd~BUh&T4tD6HDe_t^--r2U zpsPt1{R6^&ChmkbGVTu~)4qZG4xB?8T?_-Fc6*pb`<|52|L!P}r;N0zNSx`~@HShrQ5z7Fj)0*<;N!THL?ZIjy+tmGUvlTuT|wi1|#J?1!c} z+a-td6!|}cF3vy>R0jKWxfPtXOnOGS*mkC!%yk#SD_35s3^9lL2XU?pHyyv<@M9|! zI$7=(YcFLw6ODVx=}~ov^b5MTPJSlQEVjR-wgRrF5ASgFDz&e z!@n6GVdE5ic>z9Azw&5185hfg5C03&JT1@o2gZZOO#I{FU*q{2{;k&3ZMoLqsWaT2 z@|`SQ8U8omqYT64w^?4Lr4L={gP<4x0Y5{hLRb0>-KltV1dHYU6TJQ|{zxx328 zIZ+B5$+N(#a3j(9=VXerq?fq9rF=Pfoz8kAy$InT6QzrlXOgsQK>XK3ISO0%>+orf&qirt>{jMJgU7vShKQS?Oq=9)9oPN*%(gu( z~0~I|Igk{JSvuUsqZzF3zII%CiQZH{ua;;}-mWg!>52K2g|;r#Haw#yfk( z^sDiGH@7|b6Q7Vf4V3Ld=^o>b5RoT`0K0nRAX=gJoUd=EL;0{u?X4)MMG&c7H=AErKNZb$Pu zh_N5%r$f0(`lFSPeQpX{-nrsWfTQnH1ljugw#lq~ys-VXya-+JjWf*8mH8sLJEa?= zOzpum`GtJ`9o-e^c2Vw9+UFE(9w*=XV%rnn1Hk=o1Iz`B;5)<;#Qp zg@09_I5T?&o%5Hxmo)JX>G#sRUl+0`9fQU>YF;Y*kT`pl#s3W1H6?dw!^Skubkf^+ z^e`9iVa}Xrp7lSY{IjyeI}}aTXLsdg=T!7*75JIT)fR-UpM96yh#Ti8ab|k3IXuo2 z$4x5ax&DHeP)EfWmq=~b~vhp4--}l8=0w2K95Az}TSZ|~_%Lx0K1MqSW zKX;Sf+co( z=XO5O`sEA$G1A_QW@lhso;q0vS<|P(t%J&{TiE~aX`OQ-+Jn*5SD*IW(9sv75BsK1 zxau1APjZLCc%MH}_Bcaf(3UppT!ZU}yF$cOz??xb9;w1;-jFQc8p zU5uYI_H0dyBR<5sBAgb$m${JStHbelcJ-=a;r zfUrw=1h}V`N5ii~-$Xih*mCH8aYw(Z@OAoYvU0xW+j$nvN#g8bkt5B~sX{RTdZHatm;`CU220-m3_?;ag4a-sR9yuaGvz^C)Rz zjBd~e?CIitg0N8x+rRX^dWD^IA5d4_&VZYPSIC2~wTQjD!$3Lyu(Jp`6?V%tls{}L zhLSaLHt()LW&@wU2VviJ7`Fs@=j=Z95bjQX+Ivo4lX)Y^zgxw-dyof;+g%usbSfEH zh1_37*2lUl*5F|`7W-3=<5QMf7H!xhgnjDcU>jhckoHuLT|m4iJrjid-h%%$JlRd8 zdxXPg-9BVmNsh;!?P6tF&VM+#0{#iWE+T!4XPmn`k1Ec9*lHBE=8wxKWNlCBj*|X) z_?ps&&T}c;KHME#=QC*tUiZq6O-%}$8W8`x%kCG(o?#uI+?pw^$*?fDt_^_Y)27a#aDfsolwtM@S!chqj?Tjk^TTGH4Fb9$lnqkM<#P z_lb+L_LX-9b^Kj@UIyNJN?*gb2Dhr4GsNOw!@qF5|Bo)mSdaZ#c4BcaC10ygLl-*{ z-(!{OFJ+8%S~K{IjVpI~^5f{^uIYO2e7t`~>keYvTg(-txlLS0WqJ-yTje(Jc;#2% z-v(bu6Z+F_XtZf!CG9A``u!9(g%5uOg5|3dN_H*~Z= zjLizhWJ4@IRo0>CdMcm0Me*OD;#~JgVft_S3~sqGV-GivlP>=Gdj|JF{Pu)%mX&6M zxI;;2%+5xOdsEI8i|?#Anx)EhojSa!+*7&pgx%drLwz%4d^`BXJ0|HJxWC|z^39w8 zcO#y$XE07&mT%ZMIeUtC7Sa$9Hf?bSsUCbMG<44#=hcyS4SBRv_DS-)U7ME#Pw~f@ zTYO_zX&<=aJnk6yr|{bc{wH;q%>5EB+VMnf+}OC?hwkF;X&O(*xsh(tnjRDXB@G+O z74)5R#Jys?I;TnhNEbRmeLUPVOD8DDNBDn)?^b#4r;nGSW4oG5;(wj~4!!3=Jifw@ ztz}{J80%+eX}JO(tE7$n2C^bo$2;ziy#>1P--*xjXv-SoQ@GB0b7ycV|4ZDkSNtPr zxJ&S9jNd-e`7daCM>(2tHwe>HQrwRXJ^U%OYvkoDGB@)5bX3N<(mIDuA8R9bpu%n~ zY}ImiZ9N%2**nXzKWCku>Vda}e*)I{p=0E((r=W{G;``~5Npy( z(s_$2S2qXuGe5^##~VO}y%yWWxQCIx6USaE-5|V9ns(}8&0W|pG~>p3g|%|N0nMY_ zC(uk*wqxb%ovpMKwBWx~y5p4pLTwj19Xq+?PFwm#+&S=U8qzH7>`XL`(-(Jwr?q)4 zpf;D^e0? z*W+FaVjMlI9LE_y&ZN_2#?uo1Kj3{6xe8tz@pw)8(C4nv4uWY{_#@+4%-^FN%K!{2&~*yUy)$ zPcRxCov--!C>!EDP&n?lMcLW(rSkG?A-o-rO>p#+bTEGhbiaal12NYB&im3?Xx;sb z^NRc{|DnM{z2aOVY^f^1b>@x}eguRqUD%Cx=kbZ0&OUzX!e$~D@54{dvjyhCr= z1{e3vhUmJ$4TKunfEnbHJ=NN^}UMV!yg~K*1-sB6rxi}vR8?z?D z`z!0;;1luP;EtEq)m*k~DRjUU;8|hqUf8(Bd4@Blbez1#$vf`dy~+O%+%=cEEKPH12BTjgeirD5{v2*)?)}RB6q<{T3GbWaEzVv>au+*i z8RlHFDgPT>_FtJzTt3s-I!8GEJJSz@Jz~5A>_10&nY4$qJN(yK;SXRK|J~xh<2DAT zqmO^b#aXET)TGPNoZ>x~SpAGWH$;(L(zQ}J#p9B1A~ zMqlx70C88!`*Eow_*tHJD$g0p7IvaXD@#*pipGx zxAA|Wk9}kALB)OWc>6B(B)f-`Z6AOtGIzW!nXN+E<4NI8n1TXYVr2Q;%;Sn9@N1%_PyGoJryKC zm(P!JOW?g4P2BB``^MGPC)T3JnoD{qyY+Eld+@Y4whHMX;i=}rz07-$o14xuKmKM8 zo50UzKCuhQ<3Y@mvF`mAY%ou~#$^K(_XG1Ypch`Jzzs3C)x@hd9^Q#4Z0^^=4a6(# z&_@7wL<;-HWB9KIVI$v7JpC;_2lzwBOdrEf4u1T>`(5R*c8Yz^Twfk>XY?9*TxRZV zVO@AGH`a7ln3LlTi#YG{c0@XZj`so*ZH+zBn)oKX;%!~JQ2GV^<=i+AIyLggzbAj_uve*%yKHGs zdAU=T#wh#6a8C)-OY^p8*l-GY~E&z1W{JXdx zlp)@KQ?7InnlWhD*yXO^T=~a)9p}ks7xbm@9jq=x)#W?>z2M3UmyoWf`kbd;%joQX z;8hxaq7#rLaSEH!EEYya%1HmuCxf-fS-3GmraaZN$a@;2&WRS(>fnGB#)R+z)FH4gX4d z_bO#5Lx*Y!{6jreRi{VQZ@O@I?eL!X!?Z<9i^10FA9wK{ z{L<$0q^|%n4?ltT=gM~&d`EZ-@_&M1B*NQPoSf3 zq~*eKAO0?BpQm$}-||c5sWseV;dK9TJNH#(U#DCpK-j=F!}mF5Ih>!HP7+=vA9`!?-gyt< z`^+z&b1#Lv55H%G-DyfQPHQ!VZD zoi^KD8^xJm-2c2*-^BT&GtN8<#9fqE#h=1o!+PlkYpJ!?bCa$2oX6!`02|@-K6nY9 zE*9rODb`_et}|X9CAnuy8@lV==;JPncL?)-a1-TOL3!ei+f?DT=uZ_^l@xCp?E=F7 zc@Fpj+#=rEFm#}NE_g4lUbnCbc z^)WlI9N)pDg4=yqj{Ta^MlRY{hyx;u|RQbK1BAUe2SEx71?opZ?^A&GpY{ zj>Y>_c~_G@&QG?6Z(coQlTjk*_yvXlvJmT!Uyzs^Hh&|-H&}=~SHr#7~>?z(JIl*}H?G|@)Ux#l1 zM&L#iXIBy+W#5y-*+5#45_{EYNED}{b+UtiA>Di zNQu479D8vmz`cxosc=Jik!#tzA$biP^Pc=ET)go>zbNiy9j4q*3dg%LOVvrg)3yQjLfQm54*&JxJ|G#tIR{qtmP(L);dx^tYP4dcchSDcl{p5|hF?7gP> z(mk(^asGFnb_!jo96p=*r_1+f>D*zD_bO5|G}Xnkxk&rq@gIDg-?2f--e&t$zewfK!GXcaZyNuWyvU zmbyjT8vmJY8T}o$0fo)RAmP`w(~aC?;C7P6IZV6pw~_=7;`pshi?I~RM#aUL9JKdY3<(mHH$(oXo;zszF+yPJFsx*O%~TrJrHJCr-znc|0mBtLq1ng~upGhUjcEY7>a-Y35yKF+^)g&(e5 zXUO*h<+0aVya75_dCK793^nfuqF>I3`&vHzgsVsw=YH&9(>ign?@k7!w)`K0So^iY z|9&pHUAznAJf!#+&0pHynQNxorccysEZ3Wjg+8=IIP|FX+HZqA!aj6&WnKyYD`+b& z)}8Ul;CJfrKDse@9SP`O=_2k$aLv$sAZ^?&d{4iPR6on@uqTZ-3e$evq00HZxbplr zDCgmL-h!vSh5UzlJ&o>!7#G6YH(w6II{ls0zj#x9e{pPLbMVf=l^hrQmX>eyNR@8Ht6GW+4|d^higzwsUKJjNZi;vBvtob&1Qqx=p) z7rHRrG+(VE>@KtaaA$9wB)nUUm$gsq)0IIN=cja|{Ejg-6aGr+ zKE)^Obi2v#VP%@FOmQFZDRtfr&!%X$%Xa}c^nk(g*WO|O5_d>*3-BtQpUBgBZ62yj z{lUZN-a}`9v3T#atZ(1|--fkA9!y@h11I{Pe&8-3D}OcLUt&G5p3Jo7i1kGpDDF4( z);H;RP**TNU+;J%A^a zEza}I6=`Q}5pv8rIK8NS&fupXgnm@Kt<_%^kAo-Vb+Y)K@MMdS%Y!|IufZei49?*! zlP2zFyI)b1Bi66wl!+dcCMjcQbl<5{3Gwvid>Go$*~o)5N8BPbHQ{58`--^G?L)8k zABOmUR{j$Ft*u^=&lS?0q-|TO-#_Z(ytdGp>C^E(YHkFYp$R?u5d6dTD{Q^uZ22%e z`vEd5Pe=Ew_6ggC7qrbC+9}Ry>)?GfH|Culcv!pVZqwrpYW`KHFt7qdTohTeOsCNp#3p(R<5FKD|z-BXjh2{@ZRc9g=U=qbQtcS}P~2yY^O&#H=V&^qH~q4DrNQu_ z?`>6{M*1*p*J?}moHUK`Jb{0qxOM#Q@umgJ;HXF=fBmrAOGygU!TP{ zyad1IzO#Ldheg8Oj00oAGm7j?@r-ZJ9!z>uc|)GGQ;t3Gc$NPi_(!CPGYM;u;;kXJ z*~K1zdE+YV7}@2eI1B$+njzAxRp%+nOBXKQ@(Z0Y))UVdgI5`kA^Wb8{|My>`;OJ( z%E2AMZ3!`?i*M+{h zo?sJx-)hVG%4cjR_q^i2WW~Ffz2)~Nn&;57!^sbjZT-mY)664b???AYH;XT?JY&H^ zbk1aQtXpF)|4Euo*b)7iTonrLPNSiBD*&N=ufeiShly#Tm!xczNGA zbg>*~Lt(o#Q{1O`IPWRy*9iUX;$|poeeR{$ZP1)*x|?^_O%PsM99+rsnB51KGqq%3K+5 z9vp!-)M%~l>e}z7CJs$rm_iy;v(k|X* zy%vv{heJPXu6^s^!5%n;opV>^+a|4cOXuO)MOi;UA2Qr{&(Zg93XjICIcSZ}y0ZB1 z#w)%#^I59MrP~!}k6X~kxE_Tr&No&{do-SLKW!nJr=)dul~-|Jfqx3mkQdgtxtX*F zX`^WS+x1aLZtR`k4d@^Fax~5)Q|NS97kA-Cpkvz@{^HGrtD-)>;n-7tMw$_LgstT( z;4S&qLht_|neAk(m*bzEVcV8}lHOP;#!bw3_HB#3uBq~gz4jlai*;~y<#WcC%kVdn zKI}iEokC89yg5Y~yNQc`L4C*lS~v`hrix>yR@fOpS$@mCEy*u(QKr?LUqi=bJ|;%dhBv77m-JF6#cGHn>k)kcBz+ zvH#@88=r5&h5Y>j?ka9myl=vHHoh6Kr!MruQz8#M^;ue_d|Sosq0IE7bSBa&`YkKd zHe;#3Z}$`6&Ac4@+MB`2=oW&5v`y&#&LQIe0(lR-!fyOda2@>d%5)7L*GhkxGOgfR z$K`*)KFZfjxnm#kEIh+5>wCDPgsY=lW$v-ZmfV+3ZOzrsfd|Nwy?iU?>%2c6Kcf58 z{Nm0*@eXcdxY&dCPl)6mNuGvB*x|9|PYcY`t@$q!x1AerNp^-J}&h8xIffOIQA;M z!xwvy#hViD-sFq%uY`Zts_qK!oThktBkqgzQ0{8VumCRXz#bJpi+iOuGKZ(>(p;l| z+;z$g;bU#|JDzW&4_<$B_mFQFAWgninw`=5mXkfh)E;D|<+I9Gap1e$ZUL%jY;KH`DlRg@x{krp; zKjWMz9VMT)KrgiSNFVF{9nv@hDfWvdE6W7%v9h(ncL>@`rBnY@3*R=<*(1x5_x;k% zQl9?8_e(!b{HfeNXd|!Dz_(YtoxU4BNg3)W%f0&GA$WBv-n&@AZGhKM--3OBc$+G_ zN0C?Ivp~Ao^Rw?8@Igf&+UHK_`f{Ix>t&r3XLhf1-$duF<>GB@ z`@+RLDz~dc8Et%ma=ndT?B84uw~c!@nu+kSwy-aqTYO9mf|1rGF;rFjLIGbA?yva}1FJySsVHUr=u3{d%NSctleZUpcz9Jms z^E2_rc)Vwl@F~uLKjv1z?>w+gTuJWt(#1a==7U<&>c?V@gip+!sib&gv$$g--`KlL zlhpM-?(V?;`2S>;x;+KoOgc6~sT%h(@%5EAWY&7_XJ|uaohTe_`vdsJ7_2Ppj48eP zfAEiR%jdlXl@QMF4 z#J5&LnL-D;-`HEBP7BeulkPsa_2g~53;7cG-k3U9eUAgzi|>s-=8&sF1?l#Nzt5Nn zTilS{o$>h;-apUs)#iY5<`?(hvUhCqazNe{Iw%=he5)}}#ymgKn2Y}hlePJIVY+N? z%pYz={OE~k8k$}C>GffUT>L*~4)=3Fw@lZgEukEjpbb0QvjMx|NaUcRds`^A}fA9PLev+m4G#l@b%aC8UC_cHm}Q!VyPjJY_E%poHV1kZ?z z`Rh5nLI!rir=@hUW^iUx{Ku<;@pl@U6G2ZjG0*KKpUKkt?owT8Uc$4j@E2gcblrtx z{ZSX3tt>HrhrCj@JWG6gZL=0czE$z63HQCY*mD^qKe}(~r5%4jLq;Vu=>XqCtoz)P zP7}cM;@Kv}dl&gX_tB z+E@!uBO}X+YYOk%&rjlYB7f{Ho-Z9;G4^>1n~js@rTx+jd_RPaub zg)%x{ENmS@Z)qeSdyuh*mFft`9zrSYx)VC<`xI}-??hVMh^bu<80%KNoLiekJ|`yyA>3 z^qaTvI0CPsAm-#7qEFC{(#Kuk=vcXjJnrPa%Z;<`ki9>N3w<_pox_zY+PNkgGBwV~ zVoxp3rBdt#zbU_W`Ts)WY`OR!lkrphvuUVyJU}^mi6d)Mocqs{cdUB`%P(v_F9rAE z6LylZM}7w0&I;0z(#9EKjAL$bPsaRE==MLujet8ApK9t8-~UJ2A10;!aa$c6~7y#y^OP@1r-@oy{D37f*t%=t7Tr7lhucABz7peZ&0= zF6PS9)$3yArE?bheeq3HgdYIsoTzxu{b6lmuOQA((w|_ix}G83OmvmQRgT!F_YOy% zO;`T`?rPeoTljf=Pwn_7SwXy_NkJ^VOx zyF>gKZuI3N+WsqU88lP1|9<4$alk$KbieR={j-<2*U-&_b00n43d(K3(dgW*NKHZL zIVVM((Z!e^B5oi&`~K9&Jkm_ML)7I|Fb>a7WapJ=p5$+=Jh8vi8B_zI`^UT_pKD9=xinY9mr|Cn zr}#qpt-^6{=MoTaG^lsppj_+CXWq%q^UZ(#!5!*S6~1_TPJP10zbkyar%e}0vA=8X zO!VaVe@4DmzQ$NuV!T|eUm6MTiT_6NZz%JR%Hn=c@voSj%rjH8$6`EM;K42>4V9NW zVEG8;nvecCygmYptJV$DqZ}6n=ra$Eo=MsGlh*{iUz#ZZbmhN?JG>U() zcGwL+eUW1h{f@gpT&x!_;l^HWtRHU0GurD-`8flLv$15~A)hP{Yk{zLkF(DB7i)2M zQdT*1HD~nc3q1E#?g{E}jk?5|;(YXDmGLZocZ-Vu;Mm)Zb`N{C;{PRY@Uw+4-f|3` z`Agv`%Jc}HFUX6G51Wn9RpXpKvr8y+*O7Q{(^uQ|(Zk$W=a-eYbw~RDZ!$Ddp0N9g zHGbG_g^h$Qm*U*Kf_6Mzo5nfK7wThOSgh@h)35_9&K$x9ry;)2SdWd<_j|}|Gu&7D zE9_eALBv~<`3$%Q(*3Be^oUsJ##v7Om%BfRz8WY^ZS-Nc7HhnCUm*6??-dT-`?KpB z0~*2oDgJD3od9{45g%_#+zWcB$0YTMcMQKYCWpeEgU40M(^B5{@ryU!tBOAreyeY> zA$|{`3x63rYw=$K_nPwPpW^<5F`DM`|DwDPXyeDUN9-@I;jg6aL%%!-jkAKH9pau> zaX&8u=9((9Q&We8DAg%+Rh*@ zc7Md%fcaeQ@`tq7DzCdWd8IoihiliZ%6^mdF&{ZQOXoy?0_Qfxzi#5ZzPz#@8)Myf zQQ3DD`oA~pQ*Y@{lqS|;rO?Ei^6?(Vy=?WoX`Zi@);wPP>nYwOsf=eAxGH$rN6U+p zeW^AMoilXHLE3ycKEBmLhnSAvAniFuyFV_Ucq65!K7U)jtKr)zhrNyBzdY`#rZ^wD zQohDhI#m1|^wD;Ah>Lr1-rh*Zss9`_{UZ+Cfma7-QQol2tNGV+YiKw3;o_f2#kc#Z z{9nOmC-nBWay#QH-p=?~n_ZyoZUuXQO6cxG6aUP+Lc7+|F4mpJTi*9``=S3tId0Mx z^_4sBqT8b^&Y*Xa_5o>q|M_XSd(4~beVeCA^R#-!`uQR=q5q`s(Z~AMnLzP=$`kT9N1sg8ANEA! z4fEvgTpof?%w>JWlj-R`d9zhX##XvoJH(ybd+?+4#=EU4bf%ih)CGN<;l^GZIg#Gu zkNIhe_PA7k+e=7W(8fJTZ|vvx+IyC^ZXlj5NM5FWoGYgLjopXQI3q6p@zqJX2ej*N zXyY63wnv-+<_+Ll;GSY(>orJucJLefxtFnchdf4V!~Ny`sPejhmhN$X>lpoh8@h*- z^JaMOm88D%ZHCs~K@Pq9G~-mi=I@M+57c=L+TQBoJ4xP0Nq86cBzITO>$GvKUBpfsk!jM+Hx8`JJ5Ggo><3NBmHkbQ26~Q zyE=zG*p15L%qQN^PH|t$d1G<@U)C5cWsO&p`!L=s@Vj2Uc0WY=h; z*7A(==r4?|*jIT;y4cgWA^J_aI9nJmzco>AW1L-I@js~@<;}zVu_rW0I{QU=6Y!6r z;@;B^`At$k?<=KPYaJ@@ZpL4?ai8dzo=?llpa4#<(|A1J8Kl zAneBId&R%^_SS#TJO6sg2GTdmb&|G;H}{=^ratnr9tt@a_CV=Yb*Lx(E+Ez~+BfYh zK4ezx<&A@1g-1&~n;Y*XjVp2}pQ#T<>C=wJ;Rfk$QRaiu|E7$w&N~xb$mSvXw;De^ zI$w(JPGzLy=c#Z{=>NO$u@9SXlWvN7-63yh*eU+oHpaIx)3;Xw?n-p@_-sEtjTaYt z(Oa}Z*pJ8EimGEI&qgC%4F4;>PYc(T zPi^V1#ixuuev@s}i^>rD7TP55q+O~=YcC{s`rmj;-R1o|KCSTR#BFQ59jIU3mr7sC zcYplYH{`k6B=#Wc`7WFh$C*ZsGb8&W#k(cD!@Xh-U{6*2lQ!N4I~ly8Uz_5+H$FY3 zw>O+F)Yi4-8+MLAf@(!~UvKe81>pO%ikNRob%;cvgS+!S`A+DeeV? zEv)^V1R!&y-iJ$F>$f{6L-1eAB%BEIqsf+Xk4!`u7{(W>)!9r(!MP0UU>S&Tymthp}VdzZAIW2;eAg=X6~@!P+A!V) z+M%vr>z^O>H+!?ZMjJHH$49Gk=q_#frx;u8BVr#n>;zJLmut~4Rri_N>s;*^_v`M` zZqNQ=&1FsW|F?SNvN)UV4?UZr8^qr(xYAn12V$KVByB3tf<14&|>$`iv z^WqkQctc~JI>g!3S;lMVAVa|ltaZ;=^F63Hc#l7ILr;a_UJW3nKeqvo^3mtKRyytS`+~ENVRWyrG#cH&*V%R~gftV6FVZR^%Nt zH_OL8(NqeYFKvAL?vvyT)V~FP=$BjY|D69Ob%}W(Y|rAH`Y!dTFRw-1eYs(8Il?%q zWNfsTU$oKL+QeCZZUOhEabTV;WXHw$J44U0=M?YB?k~>0sk+A3Pp{yNfYMBX=+3zHH2` zla$LIU0$Sp;xNZ!E%_kfA?nHAGX8s?yQ)LnD-JvNSG1Kemj=K)FN*(-6!z8UDSvfs z?;c&OgYw(_p|8aIGUl`Nr0+c56!?apE?oRq^b2Dw*0=t>6?%T$wMeDp+giKFKb_oJ zN&~r7#Kr&pMv?^^$cnSbfO2F&D?I&wI(yGPzvnL0LVDpXWYiPFJIg1=@k+cOC3oV# zRM*PC7y60vtbnEtd2$NaLY}qI57z5>cYV7KuC(}g-|q!+Z^G??mwzSYf5cV7bARRO zVJyelNMq&l&#hDieK&N=@hXAWe&R1s$LHl)9nFJi<4j~UesTY6AGo1-ULlXrL1SGU z|I~gJ|9`mNC@J31v<8oV7v}BKUWuo@#5hY!duadI`?MFB4w2^@=-1&B`gJqyIGuY8 zy1BY_y*~RKgk4w*;b+9%>f4zPXAd~Xe)OOCOa&9*uGF6~x7trF{%5#9_Yb^2lBP4) zdMbaakIk>?UTF-ku%pdk-`I|8A3ptuhhdh6DSsO+7IAL0&9_k4 z%kYOhu0XbY=evtL@bUIlZSk=W=N*DP3H}@3-{s;SL$}m7^ah%TG)mlkj(@`T^X)G8 z?Y@N8yU2L~`VY9~i1Z)#T;FcIgMI_Lhrpx!CyDc~pyJ+fhKv8Emh)Xd;QsQb=xgFZ zUgVx=ck->*w&uS=-1}&E2D^*%{pVWN5YKSS;^lsO@h_YMjLS>G}E~Y;3#% znqppJSDO9+XX%IbzM;Q-*Ee#z>zha5!~UhLxYwmw4K{hs7UNA%x%ALSuy zo!{Z&zc776uE16Ij>?DJ8@XM*pK{PI_I3C#u)Z0=ts(9R{(Iy%Qr=6vxpIPVyu&h> z+Xj9!{~Bp0tu^+3CTs8*qd*zx3CaQyf zZ=~tm7t|&GgYX-7x-lMa4E>~SrmI_X<$q26whL>|_^&}O5q*GWoAwVG)Q$V1@8mJx zfc@7L^YoM4hrw2UeUNL2Z=)ZY>&MIWX>Z?LLuoroTL&GzEWP9V{FEE}1>RT5asEvO zDE{RYV~37WoV)#KoV*X-66asDu?L;T7(Y9UwTUw}-D=)Wspfr*>TEx_r&e`u zTe@E227*h(-&(_dIrtXTt4U7Pu)hJ$tZog3&p*;k;_om1Qt((UcV=plGiW~&{tmQ2 zKT{s}ftF|&;yYV@!-PADKZ$!UURT1u&p(OVS^RczRPX{5`1>oc{?E2d zUpE3Rjfp??*%kU_fp9(kulc`16McNK@zBtC_={|uAM%mR{GQBx+V~3F-Z)@0SH*v6 zi~osl6JEWOeI-Dj&GUu#D?!)T#W^5cALBdh%g)(Z{lv$9%G=nqCNGciO%=9BzL{9p z4ka(cF6J!X-DhNAGjrF@qPxKE55_QI2=}FYukwb@G?iHU0M@k9?Cm$lR~N7~kkx zGV~zwv}t^^zTK+aHstJ0zS~~`nVN`=6*99`ZR@>5t*gMVhg#p&R`0s(RO;AE5Z42o$$w)Vb*5NPIE=p@+q`=2zzIKe zm^*i1hBW7(Ie;vlME1@nCm$gDb`@@d_fg_@LiZPUFFZTJH-IlCU7f?}Y=@IQ;!BG! zA-=Kr&!k_9&lq*8#=nhx-=KWur8yPMlz)HWRqC<^-7fMS%Do)zb^P~&Il@~&MKn9q zcPqZj@R^I|IquQIFY<5IcE`wPG@0E8M7meC({<1O%iE8{R_Y|6iYznyxvsBhjm!ajobdr><+r#<_j*$X^|&m;K! ztgM5Tsl4_X0(Ypi7wLob!f%NmEuY%l0pM794F>=4H-q0tomWeHnDA5hELW$$mHlJT z)VQdr>_@8G&-~A-TYK(_>iZ-2L-ibHp6X@X++z%0$A5?Pr{cLk=&C)cz@0CC4EIHI z*j(fD2jjQ~Sa19_ct5o-kM7H^RF}3j}Tv%TMMqH@8Df?*l*^p&c35vt$X5s zsyn!YtY`MHHo35zF=72Qy`(-WjYpZ{-a&S^C*H;?-pcY$Z=Qu_ocN`?x-(nCcm>1w z<6guJ_}kEI$772$`*82rRsGF@Yg1uc8TLnMx1Fp5g#YFb8-xD;(;?Fd!vB#C=W!QU zGj1e5eoyog^t*y5(e(xANkgwpbho_T8kWvooU6otj=h*X&7E(6 z9h;r;&<7gA-%oxG-%_kwL(fmn?vwwk#s8vn{GXt+bhnakldPqGljeHve{lYbonOGa z16)t@aOfA$;2Yec{={Noy_6!-^d=I z6n^oRJN8_

sAGrMdBRbN7SRJ|potTlq$*-*DyIS9yN{NqCO(9|6~#yARwd zyfU|yaC>eg@T9UIz-@=e-`r@Ejp84$=6b_?`Z>LBq&DxPeLHabTaO)LjvXbgt#(}t zt_$4{{$K7oGzX#`#eXAs7wxBX!P4CSz<!HMYTl&Q4-`$^xoGG?lQcptNDj0NN1 zG2`VjxLrUqW5a$~F>d=A5C5PUhbI2fJ`#9qH1{(;yBg!i7`yv%&oc(Y2E~6>;%(T_ z!Bgymw%+l-_gz+*=i`j&kpG-p?L;PnUcTAhaG~$t!M)D6?%q!EPS+&y&+J^hH;~qn z5B5dUZRYp&;M3jAEub^K&AWK1FS+G?^W>k(DfT+-hvaw*uqC;*1%5HvbvJnzI@gJG zt-Z**OZhJXZLQ@Wg)2oquCzwz#%%$P3cZWmJd6KR{)+UvRouI{r-0|^V#oh)9grq- zr-AS3WPgBT=n*3sTi#9%A7F0kN5;1#!((mmF!}rq9GRUzjQNv0h`euDmE9kAs_+2w zz}@DGL(LO4%^@e6Yns&2SlnjjtVzJUlg(x69CJ{6bJdC5A?B*)a5F(O;bXvuaDByp z55@~$C9bu!t@&G<*T-?Y!?mbw4w2V7?i28{%z+nym!-c`zAu@>u2iNWTx*ovq89lt z+{qkOLV4$#hu)IDy!2mkFAzUR{8;hB(Z6YqJWAXwapuT0UfoBj>rv*t+t3_@_CoH% z+F>Q=%m0^j&7~WR*GJOCdSNoUJB2@%-zVCuj`kd)t*3&Qw0A{q+}>K?IDK%DKGKh= ziT)a(U-qJr$}-j{yUEY^YsTG#F799U2G{VPP{y3j|LV@@b>{%% zeY5#1&I6wQ&)zq%_nQ0L2U~2exyAQny_~z46W%e`^dZM9`1YRgt@>tDYu{yK^TF@r z_QAgImSn(lWW{sj(SPKs|Es1;$(cpu&i;UWOYO`rkq3o$#rGq!`4BW6$=9>#hI@cn;5+F* zMPClQNRD2~Z3(|nUTwI2#jnI?16YCQCeR#Reelr|dLig2?g{C7f-zvMxCg$bb1ilj zMX&knE9C;Gf%oWWZRu?T;VaRJ{^3p*4&3|vZ5E?ngg5sMyhHb)1LZEtQVv8J$HSk3 z_gZw{q8s?NI>PM%sxPr0EIe1-poR9-7qIgJoACZb_&4tB+&7fteE1pj?bCw}!tc*# zCp6D`V=g^)jy1v@{V|)q#eHEmo^TDsf6pEMC3*e1`4;{!@yqAYkMR2vk6qOBWBeYH z&#}tcM7hdqqrS?vM!Q5f+Hz-Ye2Y3AppX9I))d~(y-Xjq)?b^AkuK(l`;3>r%t3pD z(eQukM{{8+WB$5K-`<1n2LIo^1l_UbA9G9E&z#cBe1E1n!I?_f73I~&qyN6<*mL~c zxV#a5>1OXI1LHUTc~!h4K873rDc-=1wb0uU4`x|Yu_?>PZP$1I6z|^TMdpu2=8Lty ziFLjcw$*WWzSvj)(>L_3`Qcs==kkf`+_d=r@>^)wXXnzwacA7wVs5t!J68S!eZ#$c ztF_Bo2m97%m@_Wp#(S{whUhuwi_T=hyVk{1%@eJ-t;mQKWXWQB;ML^FKK%Qc8=kf& z^aPqO$&c}5%HCiC+84-}$H<=>!5-G@hgz3s@I6_zoSgazoMsMaBfKYfE1H|p_J!|* z?s;%DoPEA@GoG>kcNw?2@Z)4y&}@{)4RBM%t*4{bLcf~)dl`?x_%_G4CpkEcj2vL@ zIhIWQ3U0CVSK`x0`qt*GP5k$RD}=WSFB886uZ!@Cy|5ecx`8`Dp6`K^#g#^Lt2US* z??=>ky0rgjo1?%aW$Ff(l<9ahkHDR(OwFZx6aVh;4aA3jeTsC0;V;1dFffY$GPL$4 z^L%qd>?<~@My{$y3GvZRACT`$!47qKT(~j%DdLV$$0MZ~jCK^*uHHk1`%6E9zmqg{ zr1TE@(4p?+ZdRU!>b?%_4Hhc9`5+&wY$tLTfpW?_S6}aIt#FR{;TU@h6O4&{)$J`X z1I-4|P5L9W%iro0d%#ukm?+(K(mhYN8X#?FW2+Rmn{~-xk6Y^~=lrui?GX zdSt2bHxqm(-DGj`-dE!0;{;`?r z8t?8_vu6`lyfx~ZO)GrE-V({(w$Xij_djhb?osC3tPg+Y zFY^~2&UepVC++fg@jhR1ANqIm-RtB^kKc>)oBSXdvWI!_5^y%T;ok!31~Q`}*%7+i zND%)DXa;9(n#z+uyOTqst$A-HlQxh|yNI6;YHem~3d-WO7_ZOp8ZXTR`5g=XG{0UY zeIsy(bZf1FAH`=Z*Bkoz9kT8iJja-K+kx%;w^}pDyZBF`xrS^!PTuq66*i7fs@q9m z1pRIoYvtDX{)Bd`G|i;#fW8SG>RE6U*w0)(jxIHsj`b>8+m62?n)mUZ&8-K9$@gC2 zcxRv9mU~F|5ZU|+IsG)KPqrUtJ#Y!!YWl?nYk|Ya^2f;eN4eGDccm8`gJu#O-6nS; z|0|`Keh<6#h26HRWRqDWR6@NKCAE5sfpK;O-!2cw$Kis*X6+WBMJuc1d z%5c6iR1$x;ysC+ROdUT`zGJn^EO3c78zJ0VUIXRTP~H`#eO9_#<#if<|AE)>Y%Tl{ z_e(q`pxINKKdwzZsGBa;*EP6%Y3C;T>Jt6dmj5m^zbVIPb7Na+&X&)Y^5`nhx$xcK zXW@6hHojVU9y5L}k-n0&bCqo&{%;y*YmJ3NjM;fHmW{)EjF-~BmHmAS)qNv__-DYC zGIq8ZuMhZ!!p5Y&xYv!T+kHFL;db+lJz|cGJM^E#cWMrtXwEy@cfZ;9Y)>_vX%EI- ztm5swN;?&InDQ97-sZ)2@V9~kr8yIAIcwWiArrt7a=|-lDdx?1@B0`sr#?CK5ZP1$ zG$qgKlV{uD-{C)i+?kB7KRI*-S#u3sIkM|OvhHg%_x+#zISyTOxZTLQ8f4}GGV?Do zvnBsa=7_cA>tyouOYXzMqtG=ZAFm`ApT}<%c-I`&`s63=UPeDy1LX$7ds+AV ztAF0qe|zcUlVe?Aem&s-bo6)=|2kvM{FpB@Rx0rKFrNM^Z_U78#uzBW{o7c&(%3rA z*zym66mRFmdvg6tS_fG3)!D^ft2r!e8QD+eCcY7KRq;QncD{wD#8ohNJqTCcT*jV1 zzYZ!$AGS{M?bO2~_AS_Uq#4`U%7gFBVV!)V@lV!OzSEZAZ{M=HrTE9q9lr5qWJXQ0 zel-6&?nH9nU~-@=xv*!*EAoC5dD57is!kq$LjFClk{(A#qa!8yP&(e){%g?ITK{gi z(o5L_EH+OqBuhaD{$uC>--6G@m0!ZP5B}Z-_V^Y!oBv7}EEXOyUs=GD@N4K6oxojl z$>Diq7u(k|l1O5a7g zCiw18f7v8$KRoIR{{S8pcN6ywWhjZhhH^4^&K>dEMn~zOev{SVHavI8tAV%?V1qiH zq77Eb=R7*tAJRPq-%z?^r5n$!%za<_%ebxRIz#9`blChj{pV@;8Qe?hv`>k9OZ#3Z zJYktRTwdewUXAx(_$~kk$)mA$Jw#mOvzPo!^S=V7f@{^k5jYLs5_o(9R|S+qcQN=A zTm@=^)$lLj^%EU&10C*mdA%;}82NWmjv30+7QCXYb%dV>51LD#USZu}UY%=xy2ZS* z(0nr9x?rI3vckM`nt7&_IjtJ#U>@sX{v5=;MfgecPjzD|_6R$gf7Wf1{tst(f17`- z%ih|-u4Mdmi28+ zEotpq%9`8yvXgIbr8Ve&-05I#S$jL&zSf=W5A%cKE;Xk-?fdjbW`5cC<;|~LS@;=o zV|~A4eakO`ir{YFHW{DxA`{-GZ?qsMR+%4$aW|VA4kAxRg?s9DdN zovdwT&+Hs=Q-ofv7d^@P$7BElTXk~g$IlF*z($ACsZpv~Ve}pd-?j(=5@$8Pz z?fiSf50JK!@UO~umHBWxe$K}74Pb>fJwZFJhp&fzBYsB=8-(++UCxY&2y*Er~GetHzm6k}$dv3098#4zLQAmeDGG4!*!s2aa{Dg6LW z1W%y-*Zi~=?G|Z9pnneTJoHbA51qQXv33i0tGL0|D|6|8XYjv><^pm5q91P!bEGjH z@n7NhtGwOTH7hQ_PvalNoW}fgO3e8GZ)bLJ;pl41vFvtoV65 zSxKIJyN&$1}kPY4o?LdD z;t$Np4{U_vzJxw#&CPkPxVms33V(!0Z_vj2-C0*!POgr$-tS=Te+U0sxEsW=%}Z^_ z>kGl#WN`y>_%E`$1)9guE*Aa`emfWr-Y^C{p6{r#Q(j{gBR z5&jy@Hz3YOdmAsOikky}h4D}Vk8JKlMrVOm^va#B|2D>0GsbEg%U>Da--Dr> z)d^g|U*`|{_$R za%y+-=M}Oi=I9T|skY)~lWFV4?@YdJ=MOu%FUYrnWaER@_(RFLj^yS`WZg6H%gMwh zAuGwma^jx{Uy+e-klP2)&1%vQdYiXv@?TF@H{fm|@7sYlK_}rW(EP(a1YJk|kKw0) zXNB(~l|84qhD~6;6x0Ii%s*j^68_Me_A$S$GJo|n5ADNk zD7@a>^(B9I^Vu9w$Nagi9vMyFs|@Y~?Z8du=uzg>sp3n5^Uc@w%->gmcg>%7;`t4D z7XEv5M}SxHd(a$N7XB=7qI8wryIiN23 zyU^Fx&M$!x+S&eVeovp+@6Olj&nNZujof|p>&5!JBltnwT}G;jWAE^G}p zn)_yh;qU`MTQrBnd}u6fD#u31xSIpw46e!U_8!c2_AGN%;d;ht*q*;v(we0t{oVM! z7c4Zk-H|QcWU)_~j`ltD0=N1ms>OT-j)&i5Zi@TWHUFZQ_^!VDlU`!3skqg*&;8&J z>uqyQ+$GuOJDp};IMiGc_eGZbexETX1cV*MChk69xNm(r*)WsL|J8ofdh%m9m_?Sf zBUeu2b|7OeC3l9BH&1{o$)&F3-`-@|`QQisrJx>&v#5vRegrGYvufaDaEJVAz3TYU6!(xoun)wWe-WHI}$0OY!ww1DIp|l zo64JYBef{O#l)MyE7Hvr_sVK6%puG*@!Ba?R~h4e7V@ zkHc>eKHc%GDg8!#LZ{Tkqd7OuK9*FklhCh%>f+i9cgMpXUAju#Xk|W$emws|ai!5b zhvs2%&r2KPT{a~5kL21@%uh&Pk9LCa|L6#3J4>xF?nA<*&tLNG7nqZ6rw2|T``@4oj1AHP?W3J>#rbr_LUAR9?-L*MvpJzt z_@~naUu$3e;U(BtyK_u33p>aHa=x&~vW?t7 z*W4`5PnLv3VX5$LXP9fz-Y2(1zFzDno~Ej=sdEiIk^;P<(86dt;z28 zWZzTdUdZk0KtVr$|Z~QwfH^)tza}6`x;q$Dc2ds^pvv4$+Hok zIG1@Y9>0itSAB-c`wE&)^ZZKj;Q^0!rf zCFm?%PM$g3)6lQvI%inWWjpXV2-d-9vVWcTw%q%>-@E&cf2Q}>S^QJ#yBHqE&pF0) z82-oN5%vE|od(l$HPqoohSZU@3DdRc!;>eJnL%pZ0X%MmKOT)L;2!8 zHWeS|LUzZO&PwGVbkY@`btqU*O>ySsSY^{$>Fd}B)DEl@=D#7v0^PKQN!9~mY1(7_KXg7_^MJI@c#k*M=q%3=I;bZa zKY7Z#$n%@{o!Vp{&{os!-1D{DA$U70nNQKaKQboT%6|gA^(JiKKU3R}{kk&zJ7AUa z2BN)AzbHe0-2_`8{{Ix@?Og6Mk!M;eEQQkO6Upv2y@mMM4mU1q& zv~MrG3;ZT-eCRdvvM=Bvx@}xZ`@FC`>ASF8{6@O&Bz^vot3wRT(wV=ULj{&$QNVg>G;Rpszzk#<>;JkOD*L)mRnEyzIflqzpuKi62Am}d-Scy z;fIe+lu2^6$;R1m3ewypvwKRGwkN4+(eTZ>r2w@OlyLp5jMBZ}Il+ zaz*uswZSjoZuPoF9m;dd;eG4BIxn9Q6+AN7ar_*dlq ztiD6k(V5CLLs`|~E_K}I8IJJ2I(d&{yt`xg2f-Hp-mucM#97LtrH}QE_xH`?Zp&T1 z%fY@|?5*D6`|KfoiSN-*dzv8aZ)v|s`&#%A;RpGX?^;ef*v|a{?$JidYa89Qi3_yl zWpJG~|CR6++}h@9S7_%m|8kCIlkvb7ykNI&)*SS+I19Po-`c|8>Mm}wez;KjRs8?x zgDcVeq^}ejN5;!iL>?{BxG|u$p?J&u> zp((vk%NSuI-EcJjpYR&}(IoT+_haF>BljNKq4HG4=PP9`;{GJ=rmEK8=*2Q{OI5mC zo^!;Pr6Y#mTT}Y;+`ENq&=2QJyAtm>Yctunq!DZvK3MvHA!v8V^Iv)`#wX|0@IBDJ zqHN`-l4xcLpMb8edd1n4D7S|4*VD;+$xdQAeJ8#3B7RG} zql?w)LGgcjH?73a^=`YwJN7Ml&_U~bgOgypZ`Ph0`l-D5lej~L7xG6(j&`p2b=u4l?dVMU>@V%l8IgPx zG|+~h)pqYr1$#wdqclB5r-fb3pLdcc+WQmQbKDC(S6?_=|ERBjbfSyGMw#;-*G zqI;i=D=p7GL5Fo(;n&2?fgr~!ADdC|)Y+37+P>u86HkG-*~UmO3M zSDiPHEewb=jU}YNj{d)Jgt?16g|#vF&+>q8=_KoSy{+Hv`la_N|2A=rl-B@VzeVIq zxXSsM8|!rQ)$Jj86pqI4AMppP;~(%Vx}(wjChZ7wqsOEl>Um<$G@ZNHbKXGi4}mrO z8$I(hX}3$O;GLB6-bRx7_X{6`hdXAuwYYo8`!?R;yYf|_bEcp@4z|gEP~`L8s_-}A zA0@p#eNe@F?ZoZOz0G@u^dFduM}6+S;*P}g6EyF0zu^wz-pSogZ@h@+H055%ALEF) zQyu4K;_hQrdct{*^p5YpOgp$mdl;l$oWXx6U0@A4ok`DEH3sVRZ(B=?$@|gT*p1v- z^uPr0Ki#wk*`GFB^V?=jv4akWj@oss&7H5^v+b3C7B&wn*!w<@8+YHsUO`W3AAo)6 zbS8P+kZkU)kG#s?g#7j|^Zd5{b&)jP^S9*k zA~IkT*}D(-IXD?Q2$Q`z#;rBUfW4u;_+Dg39Wv!}*hx%_lCZOOHXg{~S%Gnn!f2V_t@Kkhw=~bBl&(ONc8aZUsK2#N8tAIJAq* zg+?lCfimqqrMINFM>m;2_NHQg>|T5h!b9G)27L#33H>qVC>Qa64|m}4r@GIoP6mVX z`RRMOo{T=sb2SrZZ85J!v()@%1m4{s?$-^$>jm*|kn1mcC*A3ZeaQVj-kCMaw3qjG zo$yYm&wrx#Ig6e;ZcJwaE~z7|A8wY{xup zcN_h&hj#nT9_Gp7U!b3A!es5Zlei($C(&PRwdpG2%EBS?S*ys$!-sTOJMJy|$9jF` zIQ^r3d2@GeEBLXzu?GAgt<|pfXt@uS({}Z(6=n4|X|F;Xaj~CWo_m}4VZ*m`R)JOhYK4lY*`m0rKA zuv>Bi{{ZnD;1PNH(1~%r`Zex}@+_wt?<2!vPUGG{K81|ChP=C)?0QrB%gVh`8A%>@ zcJuw*^To}FUB#b`?n3clPpc9CJTlOJTY3tQ&+u!D-;u`570nOB?!;8#a!`XDeV^-m zcp4=ACFOVE{w{8fd@=T($*oE5Hjr;D`WwW3Pd3*hqkoWgB&;T*-GRzao5!p*&X2XV z1JK8wN@YCP2OS>sl>ZKSy;>db;C58*ZsL!Fb^LLD(;PJq#;Y+to$%WWuUGMZTA8oX z|C`MTOy%8Gnn z%eMocUDYk_kc<`%bdhhh@V@fInbK#`EaT2bx0L^KZeQVM>Uxg4odxC5N8O);iNbr~ z(=Yfcdo7#`weUMtePV83)i+^JC2!|$_T7IJ$G~R#+c&vOTlvuUi?&ai1u~vAt=l@vw8>M~ZSv#Sf$gL=Rn)h(7cl(fU z#J*&j>ZL0g-Vj4Sx7YJ>f>JGOWW{|*VW)76!d6D$GyvK3Zp=-;Xi{Enm zE6Y#Crt7uuGw3q+*Ye)lJ-dPN|Clu1I$|rX|0(6}`o=hYXD@xJrM@-TIXrPIlSw)%4$vY{23;LdBdj}qtL(g9@0 zPh{Q*GUh9Cs2Q2^I+#@ErDV?GxB;?6W`&I!?_Px+#KTkdl`A$EzV!de*pgTpsPAe#dj>41=7YS`%L){ zhSJiU2}zU0Jxe$2g?^K~58|~A+||p~xIfCfFZW|~4}fy==faa32dioe&7CRt;(EgqWRfXo^OoupH#m%U*gPVe(L+e`N`B* ze0_DQ>)HSI4jz|wFPww!3gykjcO(DLczi4VV|?QdKtE-z;V%tST{IFZce};%9v{zEhlQ%pHB(Lwwf{2=dp77n)fA4Fw)_&`6w~nVxuioiw2U#Bf@QME*eYn$@%^KUm`UJaW1)HeNxVPyK z`b@5@-*ty?^`Xwff9s=rkeMIrFhlj}7)Rb2{ZikKJ3Gt7{}00Ma_j?qM9%gn3+6%G z8=6iIT8GL1z?Ec9C$h*LqqIN#OqTqKrX1Q%(yRr=94*Z@CJ&n1$i=S0v2J!0d?IgK zGOoF_5@?Pyhj0%nmo_GUhpards{I>svr;vBq=va6_hj*L4&w^$8R$o#8Bvq`hghHb z+}vmqwB+9h;tWE4^Qs0%*uSb{oX;O;Bg2MBKH4*xn=KW;tGM~K3uheDp~|XPlRi3( zoJU_q+R3%7y$Q456!*FkyG>~T`ghIm{-|s34WE+Anxa1Qq?bk46*`)iIVTu%&vb|S z?q_auoVv%p(O`45Z_wI5%rBySojX~4Pw${Mcey-ai({~N&_|u@L#3I}D(WZh8Z;+z zODLCZmh^=>_r#|Hp6%qVpu88oOKXaGfA9SS^P|_j=Pt0;JB)qJkJM#`I-$>{Amws4m=@hx1e-eu98ivI!#ekIX#q~DIE-yYT8 zE~Oj4qpv=L#q`;ObY2~JNgHfK$K6ZU{Y8hJ%&kJtb&+qId~Ku;5HBr1VvG=WNDq#- zFZ{Z8|DZ9;5ym4~A9>msroZvbPKa|!!^G9o{&$57(4J=;a-DpY@$1BYp>*d!;vYo? zyR%_K{VaVjY*)WqN`EZj>`MvXXBTzX?_&INu{`B>DeRZ!mHK(i=USub1V^J+-8@#` z-|>(Acz8qKZ%!suA`9Z*1EbN$U4VCCxH(_gBz%F4IF1~-4NX0;{+~Y}XV~M4|4bL| zbze;0)FOADBail>^Qv=ymEKyM|6J#p=4Q8%VZF(%LGar)?N`A-uZz;DXUbn0NP2S7F z=!Vh_ljxyZ^hY^)%^UJqdgB?oP{Pa|D{X&`Wve;ITkl%qx1z z7dA6uAMOUU4MYF%zbvo2ak&aUgXp8+ioxRit!XCg?!dtwPamEM(p*CF{^U#_6FVNF* zx1gnG`w`u2c@Brp%Grav5Wo4#`4lQE^9S)u(QSg5BTo~z(b%j8_hMz$fl8hw?9U9+ zR$?6^&M}ttO&5vZ0=xN+(GIt0A1$=IhTNvY)#UM=a|PkfzBhZC`7?h1w$B~W-N9`u zz9(Mwywl6HtzGb6s9mns&UaJJsWCS2K6<0M(7WF(PuTexqkp`uKitZ7C$n(w>l1C= zoz%j;)XVAqweW_ve~dmK{J5VY4C$j1-WB9FPowM69=gU=$t6xI9$haYFBC#8r z**;0bxgSZ7|3l0m)2a!xLy@-1KM&ZGP1kZ`E$c<;cS(0|DTNJt_Q~TeUUp7A|3kh$ z3vuRih_r!ZZXfP5=)UNW^+f9|82#wyO|Fl(_`LqAY6lYJ-p|t>ojy@ z&AHscPLs^h*sIFt$=?_H(?QM|=Ec(Ee37&Gxgk78&-^OBA` zbYLGk&i-Sv|5%v+g?-J|!q3KBj@w!Id1I;GblW}Zu#F<<$iF{qHrCpXpSfR-dxu+% z&EmP((G5GGu`iZda_f1n8Qw{Jv#^1_+_!#?uK6!m)6e^QXY;-9o6wB#ZYO)kH>0f} zEzau4o~-{Q$9!ucSYIg2%bMXeL%v3I-*;$sz!c?` zQO=Xx9op40`YiSr_L9~aua&}6v{7gEQ(y7_$s!z>$op{miX9DKU6=AvlxwGsDAm3_yy$EI%!{uOVAvC zg}&mPqsVK?66<_v4taBj@N;;^n&AW7F44EejaA0=c=Ztu+f+Z0ZG*}FE@aX@<5Samdn+zwdZ`>yZB5!D@yN1{_ZL5W$(lqX>KKLsc>!X9C5LhTGG21>0R9E z8Jln?ct7lb<=wa&oL3= z;qwtW{Il;poEtX8*au6u%eRm8qsikM(wd@+@3Oz}PvmeWk8gpxuu+?-t^Ksnu689) zrik@`G*DZcfOa9Bu?X%KcPiR8@HhVx(yl@iSKDk@C2csX(f*ty4 zHF9pTzI6(@v^SYGRA1kspNBn%F5qle+Q9vaY^Vgi$%DRRKrQi4i$9UuntP>u<;jdM z$gx%AOAGR+5x1;x74hr`r>QZs&_3FMBVD{i^-c^Ima}s`EFVCG2tC?YR#39PEeWTgAuu zji;q;6Q8}W8~M*B+b`h8xxdJhy{FhGTH^hDPhPWAl2@X6OWtNM15McXstz6HSp?nj z>w#uJSd9Kb{G3Hee@NSizAArR{%_>@2LDCA_aWZ>P~qVBFnrEGh~7Cv8hasWvN~7? z%-wur=VQ`e(nA-;w{3^!CGBDe_WwaJswILn*ba-GS^m&iAYzCFVD;2}C_H9Zmg z$zelvg|=QveAvC30*m<@8V^j=7s3wPF#Tc`{nQ*P>L+u#WAvT)H`grv$=-E7R{T7O zwUAK|dZ-R}lep*UqtWQUL;JEmI0^kYX`d)#jWJ04_hzs%YS3o`(3e$a*slMNdaTzM zV?BL?JQqmciqDVuoh5t-_kY|j;D0E2s6HS6XZw^KxPo3gi!6xo*=5{W+!(w0e_p!G znC=|oy&h!D`()2l<4N`z({?U9B&jKR*ofR)Prm&jTnEhna%+n8FS)m%jd@epZ*-R} zY^vvW(hd6)8{ERxx zk zH}kpeeTOCDsw!_iUA2Y|nj!51U>h_2;8|Y5qcxhr!tUAUKJ;ZHd3(~Y8^p!A)eY#r zlm8EH*u;JoUZvk&kk_0e-c^c!3ba(t>*)RmlldR_{AYL{*|XD8`C)j+vzGI$9lYnN z+}K;%F7HV6SL68<-Zj+IUTZ;rhaR7%E_bTOY51;E<`(pO%O7X^-LuZs@aUwRpP;RG zI$Zjz>h%?VbLDvyVt!Ly8Rf-C-D19dI@)ND=V~99fHls-8LI90hJEn$-uFm-g5AaV z2WB2Be35u-pXn)W?m^$jeeit0@!*yE&m(BgNAG{p1s!VKm>((OjzFZL+ugToFKq@kUPmae2G}Fd_bKyw@iC`DpU#l4jXVSRPZQrl{LOe)Q|A+< zJt>2Yw(IN{R0!&c0f@U%p;&thD%l za@!OBdq7K1#j@S}J=J*dxhD;5R@$ z`og2(iaQDYOUiBroz&|k@pqv&{!T9u?;W|@y~9a(JtS>+bc>XAI@uQg94aBdyLs9E zU;0}9#-8OUe9g~tAN4sAT|cP7{{q?fhUa>PJB@sF_8}cd_TNk1Uj!@Zi3-Bj<+3|` zd8X$sEpJJAl~MR#<_Y*ij=jW_ls~}pck~{vq62=R3!Ej&*W&dsebSNJQMe&qW4y1m zbjX_!b~&$-?=8GTSGYTvHY;ldn*Qh$ny}w-_`mf@%lI$HuYtPFq_3=9=bs>SmNmX~ ziD#(@>{}({s{A-zTVDE&(*IQUa&DYwyjI>B>h!jV_zSg&^=6lxh zO@0z@jk0iNcBy<*`8UYdSK0ATlrQjg9xG2#MrmnR%73QsFMqO6mtOG=&Jh12_X=fR z#$CmYHZ;|D`M`G_>id2KkHYEtVr6~gLjA(JMB)E{(O>Abv`!!SNWbYT{S7#bzr6kz z`XlUXwI!!cAWMdk5zeipW#pdylsttDd7bgWfJhFK% znY3JdZ`c>VSI8^>drjlXpV(VBAIUe9Y3^X>edLLCN%kgk1v2Pmi2Db@$3LA?11N*$ zDdCW*rwPaYPIq!K=6I#Z{;BFYMLfAy_;*};?g{XNeD1|sz;wf zoPU{9-52vE&)Cc}uad8aa^B~@i`Jd-yp%gv`TgMoI7eM?;m${Q7`m|a6!*hFqd&^i zAIAtcmv01qzrsSOg!W!}roj-XFCV#_epZhW+&SLG3vjV#8>2qfJ99U6tAy`sp7mk% z+vs^?&GSpRA5KUAG5TTR8Nn~u7o)fG>B7IsKiz!w5J9Onw~uyEY3`CNY^ z1Jc*}U)*<&b6k_;=^*}2a^fOm;d5ar+3|+(r{s`*wbY1A=_7v&i2rvq(03P+BhBQE zv1godjx+G><%xBl>c;4Qns3b~m;P(qz9-ZcJ`6UJQ(;@UbjUaIxE!AT3z8}*bGW=? ziOIntpJwoHC9@7ZepbCn`)M(%hH0bH#0vb|d##;Zx1O zwwh-(t6_cVFmuJj+umTI&-(uA03(v?o+`J^=kAc#SmIigV(P&2tu-SFwqe zf5P_*bYV;5JoT_YnDo1=F`^dnq?;TQ-vC z9rM4queC<_P1qssESQe=ApF8E=keZe8@%p;n|+UKz30{VvE`9Z#ea%A_EYDszQvKA z<4kl%ia#s9pR{NvY%^xI@C)B7>U9i!<{2N8zL5W1JinG_1w1StnzR(J+dNNKbr_`% z@voTL@;C=lnCFi~6Z>RiwTr)%-2|V;=iSo7;cd|AzQ@Jl_H$JnJ+VPQe z!7=pB^K`~{bi%#DJ+$pJr6syzSMh%sAK8aaS8+f6KmD>$pNX>|Go>F-XHA9YrS*jo z`cwyf>sM%pr}dBgB7CAB4$}u`;&T)9=YJn|^8XF=OuB`B`Q3Oe#*n+<)gt<+H2>hv zv&7Yb)pU|I@idS;Fc!_N$cK{TPuR;UEB_PZ%|qnpZe-*FvMY4X4m2^IZbyzfx0g@h z_7j#joy8r^okdpl6VGO2{J%c!N)L1)FT);kjOlBUzx~Cv5BtLax`&)8Q8!BjZAa+W$jOovsL-U`1-2>>GLks0M5dH>D{M#(-jKx}BH*TyAvj3F6;M!YB z)70rq{PD|`(SCw%*Kno%t{$^slziE9>?h3`&r}^^J{G#ho?byuKCUito;2o_%FHi| zAHJ#640<6c+yT}Rs@9KOq zK5_ozc0A~~)K5K~^UIMIcMW6h@c{XzdB^e3+Lqq)X!Y6~p9N@7@vg2>*Unt~u6cp7 zTH|k=k}kzJ?AmvQ#`ts=cak#P{m&)jjj=`SbF#~ks>1^5kuTosTF({xr)A`2BPKQC z{v;f6d!vbGs;69Y^uoSrd;UFry9(;D7SCvZu@4siVVeN7c`dsg?yDfQ-6J^ zgg#ZCE`40z@jt`pKUsUs_roYWci~RcUJsJ~7T4YI6#vTI*ZUZ$&%I1{x6vP;f+~3J z11sPfJeTX!rKS6yVH(IE_eFcb3gMk_pfvXG^5NXK#ZSf~)>Go&#)HUv$fp;` z7yoljdveE%Tfpy}OkPMXjYeCOdlUNqkY6v;t7GZauj%Xa$vN|fd@5OH9+E!CE5^q? zT1J z6}J+;rU~pSJxh&xU=6^`bz%u zn!|B*8gVn{jfK*grntuU0U2LiMiw^aBef5r7k6* zm**LbX1Ka<^8PD&mVMPH-sJ_p#TxH>xNjH#=8L_q$Hc|h>QZi;RlS*8mTUf*N=Y~0 zD*O-kNc123-eHfl9lVLpJK}DWK3iGmsMGVl!wKr;%zu8yGdRN<^Sd0+vPAih`KFDP zeUA2WEj_gwzd`V(Hse2(`D1a3Tb6qTy0~k7j&jEEf1_=6&~9gI`{VS3&*23A{kUJ~ zXT9{R#`rmJ zv-YLL?V~@(czPn*u%TWPt$WpZGXJ$OlYAORZqy)e{-hsvkfSTe(Kt_0$sA!faqI*q z`$G8|bi0!$bs%gd59OBSn!BViWSIYSrP*+g{7d0mv@d%fF%SLF`~Hc0p6~akZ{R#?HZRVn$#;`- z;~Ye+#ysttM%{x z!oTXTEijF9-an9YQ-tp!hwM?L%k<*ymXcQqc5J)PJS zdLBL#KLE|^;`+gGaldhEgY~Gw`GaNV9qdkIXU`M+?|Gbg!BF#zP5fc&zJvKodFeC6 zPn7>jco1LvS$QkEINLr6*f>t_%X7H7!x-~{{%B$!=xB6(;Uw|h(2Z8lh`SJulPAvR z$&>FydyF*aAMyn-L;jh<`=Z;x?FS9ykGp*8oNKDvC~nxyj5DF-`B&p{A*_VSc)pI- z|84S2?kF_NpqBXe@GOs?J+H*xQyT7FzQ*1#Bx=XxI<8~2vy z!bbWm{;e8wIA`?J6XIU=y<;6TY}eG#2F7a>VcV<&w9+P z=qruHU#4%Yl-85J`3w4pzZ}mv|L81DihtN&f_^z{K>s~{@o$;XkxqxF=u-d?G@4wAcNy< zNt|`Ko8SGQR88INf#s?4_7<)#KK|_%YnCy8sj95nbjl5M-iK z^D6o~&StKr^Fz0fLh~Fn!}n6|c!;q}=+-#*6K6wX{Bdm1iQCsZv8J1j@s9d?ri(n& zqn@d|_t^rvsq3fcV$FFfOaW(7(owKT{66YeR=(K3H6P2qW#NA{&aYV*&+-rqRo*AyTB!G40fOdGzEt1ZVGM6Lb4Dyruaapu42NAU*=$2|33=--p;&`-)!wjqZ=LG9C0?|5DGT_`mx< z1kG>y{+s4?kDC*I3KPkPx#Y&({4Mz7UyAHS=M#i4B|r8fS9*zWPR=xi8>y`iVW6@0 zb7a#5GN?Z}R+@aff$aL5tg9>BgN!>v*gjOgo-B=dz@BLOh;x@MA1wU}v`>>`4e^LI z;JwMx)5*78$wTKQb9*wn78!1?Qm|tgXTIY+&vfqH_;kZF&J>hGzY(w2+;;NC9$Va( zYp$G4@HD#f)!}$}82wCT$KGAgP7-H7CVhY|&gQL?evq-ugY?JC@Rza3?Ob;_^4)Ni z@GdZ1-EM$a=!QDzooh&Ms^=!-mCKB2e&)^-jj!vsfm(AwxfVb$b z_@7-F&v_KA<==-cyA`?`+bqZDapkhPkxEJ*L5HC&=&-i@q2pps6!RqWIWLcnRG*im zohZJs`aSA7%ZS?|?L&ObQ`4zyh9m9?Pq?JUw zRrp4E<3ACnDdS>!j{$S&RLS!+@~pq(6MJ#7ms;AlE#aFT<2_GNpJDhM51YMf`ZA5D z-|Bhy)ztG7H0ScyK|fLaIlkkK{MX>qLpb(fW9{=bW7V$O=JVR?b=v1u+G`h&zeQQC zw4-~t{h=4SpS4^2a&ay!UCr;lcB&6YYv1+dads?kgeCBm_Jz@)=)za=V$mUi=&@&Nx0J(yre!G zYdo?3=uC3zCcH{NjdhyAu($9(`tJn&dJfEzHeCF>@|Kr2TU?C&!}ix}@E0Dpl2zsw zd4IBN3Yih;LmrJ0x0&2{o&RZc){Iiv3|zvUARK4&u8^lZgxqNhp=(1gkCDfjlXNS8 z+yhui2HgceKnMBa4nle9b^a~K=0kxlw?umte-%94uZ{nhr1!bzIQcv7-^yPF$9o3$ z$?}s%jP1k9Jes_n2C=4AQG0n0-skTmu7~swF4 zM!k#n+l%(wtCKH9`|U;h?W?~bJHIm@T4?;esA#{vXusW_hw)deaTM*h+qvOQ&!G%E}dQ}+Hbd3 zW8ErjOcm|77wxwf?Y9^0w-@cV+e5ZyU$ozDea|_Eup3dd-)=95O^Jt~XusW=4{L@u zSzj#LZ+F(%-ha`4d(nRT+t$YKv_@aF-)@g(LD7DD(SCc;etXe=d(nP-(SCc;etXe= zyK{)n$QA9k7w&Zx?YBGY)WdnAqWyMvU)}R9+HWt~Z!g+!FWPS}+HYqkzM_P^tz{dRXpiuT*x$1;a1+HWt~Z+BOsXusVZngh)v-5D*~Z+E9^e<<2- zFWPS}+HWt~Z!g+!FWPS}+HWt~Z!g+!cYn;eoTB}9_ln)&byvA)zug_^qW$)NZ9o+5 zw-@cV7wxwf?Y9^0w-@cV7wxwf?Y9^0w-@cV7wxwf?Y9^0w-@cV7wxwf?Y9^0w-@cV f7wxwf?Y9^0w-@cV7wxwf?Y9^0xBq{!-~Rsq8~@q* literal 0 HcmV?d00001 diff --git a/RpiLedBars/install.sh b/RpiLedBars/install.sh new file mode 100755 index 0000000..c3dbf49 --- /dev/null +++ b/RpiLedBars/install.sh @@ -0,0 +1,5 @@ +# make +cp ./bin/pixled bin/service_pixled +sudo -s bash -c "cp pixled.service /etc/systemd/system; systemctl daemon-reload" +# sudo -s bash -c "systemctl enable pixled" +sudo -s bash -c "systemctl restart pixled" \ No newline at end of file diff --git a/RpiLedBars/pixled.service b/RpiLedBars/pixled.service new file mode 100644 index 0000000..dc428da --- /dev/null +++ b/RpiLedBars/pixled.service @@ -0,0 +1,12 @@ +[Unit] +Description=pixled +After=network.target + +[Service] +ExecStart=/home/pi/LedBars/RpiLedBars/bin/service_pixled -n 60 +Restart=always +User=root +Group=root + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/RpiLedBars/res/.asoundrc b/RpiLedBars/res/.asoundrc new file mode 100644 index 0000000..6d1ca12 --- /dev/null +++ b/RpiLedBars/res/.asoundrc @@ -0,0 +1,50 @@ +#The below 2 sections are commented, they control the default sound card to use +#This set up is for a Pi with an I2S microphone attached using the guide +#from adafruit at +# https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout +#Uncomment and the I2S will be your default card (assuming same setup) +#but you won't get audio playback because both recording and playback will be +#defaulted +#TODO - Figure out how to set default for recording separately +#To adjust use aplay -l to work out the devices you have and their card number +#For recording devices use arecord -l + +#pcm.!default { +# type hw +# card 1 +#} + +#ctl.!default { +# type hw +# card 1 +#} + +#This section makes a reference to your I2S hardware, adjust the card name +# to what is shown in arecord -l after card x: before the name in [] +#You may have to adjust channel count also but stick with default first +pcm.dmic_hw { + type hw + card sndrpii2scard + channels 1 + format S32_LE +} + +#This is the software volume control, it links to the hardware above and after +# saving the .asoundrc file you can type alsamixer, press F6 to select +# your I2S mic then F4 to set the recording volume and arrow up and down +# to adjust the volume +# After adjusting the volume - go for 50 percent at first, you can do +# something like +# arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v myfile.wav +pcm.dmic_sv { + type softvol + slave.pcm dmic_hw + control { + name "Boost Capture Volume" + card sndrpii2scard + } + min_dB -3.0 + max_dB 30.0 +} + + diff --git a/RpiLedBars/res/install_i2s_mems_mic b/RpiLedBars/res/install_i2s_mems_mic new file mode 100644 index 0000000..7b9e69e --- /dev/null +++ b/RpiLedBars/res/install_i2s_mems_mic @@ -0,0 +1,18 @@ +https://makersportal.com/blog/recording-stereo-audio-on-a-raspberry-pi +https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-test + +sudo pip3 install --upgrade adafruit-python-shell +cd /tmp +sudo wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/i2smic.py +sudo python3 i2smic.py + +# plug microphone +sudo reboot +arecord -l +arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v file.wav + +# Control record volume +cp res/.asoundrc ~/.asoundrc + +# alsa API +http://www.equalarea.com/paul/alsa-audio.html \ No newline at end of file diff --git a/RpiLedBars/src/rpi_dma_utils.c b/RpiLedBars/res/pixled/rpi_dma_utils.c similarity index 99% rename from RpiLedBars/src/rpi_dma_utils.c rename to RpiLedBars/res/pixled/rpi_dma_utils.c index 6b814ae..476d207 100644 --- a/RpiLedBars/src/rpi_dma_utils.c +++ b/RpiLedBars/res/pixled/rpi_dma_utils.c @@ -80,6 +80,7 @@ void gpio_set(int pin, int mode, int pull) { gpio_mode(pin, mode); gpio_pull(pin, pull); } + // Set I/P pullup or pulldown void gpio_pull(int pin, int pull) { volatile uint32_t *reg = REG32(gpio_regs, GPIO_GPPUDCLK0) + pin / 32; diff --git a/RpiLedBars/src/rpi_dma_utils.h b/RpiLedBars/res/pixled/rpi_dma_utils.h similarity index 100% rename from RpiLedBars/src/rpi_dma_utils.h rename to RpiLedBars/res/pixled/rpi_dma_utils.h diff --git a/RpiLedBars/src/rpi_pixleds.c b/RpiLedBars/res/pixled/rpi_pixleds.c similarity index 97% rename from RpiLedBars/src/rpi_pixleds.c rename to RpiLedBars/res/pixled/rpi_pixleds.c index 68873ec..eef1ccb 100644 --- a/RpiLedBars/src/rpi_pixleds.c +++ b/RpiLedBars/res/pixled/rpi_pixleds.c @@ -32,17 +32,13 @@ #include "rpi_pixleds.h" -#include #include -#include #include #include #include #include -#include #include -#include "rpi_artnet.h" #include "rpi_smi_defs.h" // Structures for mapped I/O devices, and non-volatile memory @@ -103,7 +99,7 @@ int chan_num; // chan_num++; // } // } -// signal(SIGINT, terminate); +// signal(SIGINT, terminate_smi); // map_devices(); // init_smi(LED_NCHANS > 8 ? SMI_16_BITS : SMI_8_BITS, SMI_TIMING); // map_uncached_mem(&vc_mem, VC_MEM_SIZE); @@ -163,7 +159,7 @@ int chan_num; // } // } // } -// terminate(0); +// terminate_smi(0); // } // Convert RGB text string into integer data, for given channel @@ -240,7 +236,7 @@ int hexdig(char c) { } // Map GPIO, DMA and SMI registers into virtual mem (user space) -// If any of these fail, program will be terminated +// If any of these fail, program will be terminate_smid void map_devices(void) { map_periph(&gpio_regs, (void *)GPIO_BASE, PAGE_SIZE); map_periph(&dma_regs, (void *)DMA_BASE, PAGE_SIZE); @@ -251,11 +247,11 @@ void map_devices(void) { // Catastrophic failure in initial setup void fail(char *s) { printf(s); - terminate(0); + terminate_smi(0); } // Free memory segments and exit -void terminate(int sig) { +void terminate_smi(int sig) { int i; printf("Closing\n"); if (gpio_regs.virt) { @@ -274,7 +270,8 @@ void terminate(int sig) { // Initialise SMI, given data width, time step, and setup/hold/strobe counts // Step value is in nanoseconds: even numbers, 2 to 30 -void init_smi(int width, int ns, int setup, int strobe, int hold) { +void init_smi(int ledChan, int ns, int setup, int strobe, int hold) { + int width = ledChan > 8 ? SMI_16_BITS : SMI_8_BITS; int i, divi = ns / 2; smi_cs = (SMI_CS_REG *)REG32(smi_regs, SMI_CS); diff --git a/RpiLedBars/src/rpi_pixleds.h b/RpiLedBars/res/pixled/rpi_pixleds.h similarity index 90% rename from RpiLedBars/src/rpi_pixleds.h rename to RpiLedBars/res/pixled/rpi_pixleds.h index 344bd96..18beb1c 100644 --- a/RpiLedBars/src/rpi_pixleds.h +++ b/RpiLedBars/res/pixled/rpi_pixleds.h @@ -41,11 +41,6 @@ #define TX_BUFF_SIZE(n) (TX_BUFF_LEN(n) * sizeof(TXDATA_T)) #define VC_MEM_SIZE (PAGE_SIZE + TX_BUFF_SIZE(CHAN_MAXLEDS)) -#if TX_TEST -// Data for simple transmission test -TXDATA_T tx_test_data[] = {1, 2, 3, 4, 5, 6, 7, 0}; -#endif - void test_leds(); int str_rgb(char *s, int rgbs[][LED_NCHANS], int chan); void set_color(uint32_t rgb, TXDATA_T *txd); @@ -54,8 +49,8 @@ void swap_bytes(void *data, int len); int hexdig(char c); void map_devices(void); void fail(char *s); -void terminate(int sig); -void init_smi(int width, int ns, int setup, int hold, int strobe); +void terminate_smi(int sig); +void init_smi(int ledChan, int ns, int setup, int hold, int strobe); void setup_smi_dma(MEM_MAP *mp, int nsamp, TXDATA_T **txdata); void start_smi(MEM_MAP *mp); diff --git a/RpiLedBars/src/rpi_smi_defs.h b/RpiLedBars/res/pixled/rpi_smi_defs.h similarity index 99% rename from RpiLedBars/src/rpi_smi_defs.h rename to RpiLedBars/res/pixled/rpi_smi_defs.h index 80c452b..5745f8e 100644 --- a/RpiLedBars/src/rpi_smi_defs.h +++ b/RpiLedBars/res/pixled/rpi_smi_defs.h @@ -29,9 +29,6 @@ #define SMI_18_BITS 2 #define SMI_9_BITS 3 -// DMA request -#define DMA_SMI_DREQ 4 - // Union of 32-bit value with register bitfields #define REG_DEF(name, fields) \ typedef union { \ diff --git a/RpiLedBars/src/artnet/ArtnetnodeWifi.cpp b/RpiLedBars/res/src/artnet/ArtnetnodeWifi.cpp similarity index 100% rename from RpiLedBars/src/artnet/ArtnetnodeWifi.cpp rename to RpiLedBars/res/src/artnet/ArtnetnodeWifi.cpp diff --git a/RpiLedBars/src/artnet/ArtnetnodeWifi.h b/RpiLedBars/res/src/artnet/ArtnetnodeWifi.h similarity index 100% rename from RpiLedBars/src/artnet/ArtnetnodeWifi.h rename to RpiLedBars/res/src/artnet/ArtnetnodeWifi.h diff --git a/RpiLedBars/src/artnet/NodeReportCodes.h b/RpiLedBars/res/src/artnet/NodeReportCodes.h similarity index 100% rename from RpiLedBars/src/artnet/NodeReportCodes.h rename to RpiLedBars/res/src/artnet/NodeReportCodes.h diff --git a/RpiLedBars/src/artnet/PollReply.cpp b/RpiLedBars/res/src/artnet/PollReply.cpp similarity index 100% rename from RpiLedBars/src/artnet/PollReply.cpp rename to RpiLedBars/res/src/artnet/PollReply.cpp diff --git a/RpiLedBars/src/artnet/PollReply.h b/RpiLedBars/res/src/artnet/PollReply.h similarity index 100% rename from RpiLedBars/src/artnet/PollReply.h rename to RpiLedBars/res/src/artnet/PollReply.h diff --git a/RpiLedBars/src/artnet/artnet_op_codes.h b/RpiLedBars/res/src/artnet/artnet_op_codes.h similarity index 100% rename from RpiLedBars/src/artnet/artnet_op_codes.h rename to RpiLedBars/res/src/artnet/artnet_op_codes.h diff --git a/RpiLedBars/src/artnet/artnet_protocol_settings.h b/RpiLedBars/res/src/artnet/artnet_protocol_settings.h similarity index 100% rename from RpiLedBars/src/artnet/artnet_protocol_settings.h rename to RpiLedBars/res/src/artnet/artnet_protocol_settings.h diff --git a/RpiLedBars/res/src/cava/rpi_microphone.c b/RpiLedBars/res/src/cava/rpi_microphone.c new file mode 100644 index 0000000..9085577 --- /dev/null +++ b/RpiLedBars/res/src/cava/rpi_microphone.c @@ -0,0 +1,159 @@ +#include "rpi_microphone.h" + +#include +#include + +#define CHANNELS_COUNT 1 +#define SAMPLE_RATE 44100 + +snd_pcm_t *capture_handle; + +int write_to_fftw_input_buffers(int16_t frames, int16_t buf[frames * 2], audio_data_t *audio); + +void *microphone_listen(void *arg) { + audio_data_t *audio = (audio_data_t *)arg; + microphone_setup(audio); + while (1) { + microphone_exec(audio); + } +} + +void microphone_setup(audio_data_t *audio) { + int err; + snd_pcm_hw_params_t *hw_params; + snd_pcm_uframes_t frames = audio->FFTtreblebufferSize; + unsigned int sampleRate = SAMPLE_RATE; + + if ((err = snd_pcm_open(&capture_handle, audio->source, SND_PCM_STREAM_CAPTURE, 0)) < 0) { + fprintf(stderr, "cannot open audio device %s (%s)\n", audio->source, snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) { + fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_any(capture_handle, hw_params)) < 0) { + fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params, + SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "cannot set access type (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "cannot set sample format (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params, CHANNELS_COUNT)) < 0) { + fprintf(stderr, "cannot set channel count (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &sampleRate, NULL)) < 0) { + fprintf(stderr, "cannot set sample rate (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_period_size_near(capture_handle, hw_params, &frames, NULL)) < + 0) { + fprintf(stderr, "cannot set period size (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params(capture_handle, hw_params)) < 0) { + fprintf(stderr, "cannot set parameters (%s)\n", snd_strerror(err)); + exit(1); + } + + snd_pcm_hw_params_get_rate(hw_params, &audio->rate, NULL); + + snd_pcm_hw_params_free(hw_params); + + if ((err = snd_pcm_prepare(capture_handle)) < 0) { + fprintf(stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror(err)); + exit(1); + } +} + +void microphone_exec(audio_data_t *audio) { + int err; + snd_pcm_uframes_t buffer_size; + snd_pcm_uframes_t period_size; + snd_pcm_uframes_t frames = audio->FFTtreblebufferSize; + + snd_pcm_get_params(capture_handle, &buffer_size, &period_size); + int16_t buf[period_size]; + frames = period_size / 2; + + err = snd_pcm_readi(capture_handle, buf, frames); + + if (err == -EPIPE) { + /* EPIPE means overrun */ + fprintf(stderr, "overrun occurred\n"); + snd_pcm_prepare(capture_handle); + } else if (err < 0) { + fprintf(stderr, "error from read: %s\n", snd_strerror(err)); + } else if (err != (int)frames) { + fprintf(stderr, "short read, read %d %d frames\n", err, (int)frames); + } + + pthread_mutex_lock(&audio->lock); + write_to_fftw_input_buffers(frames, buf, audio); + pthread_mutex_unlock(&audio->lock); +} + +void reset_output_buffers(audio_data_t *data) { + memset(data->in_bass_l, 0, sizeof(double) * data->FFTbassbufferSize); + memset(data->in_mid_l, 0, sizeof(double) * data->FFTmidbufferSize); + memset(data->in_treble_l, 0, sizeof(double) * data->FFTtreblebufferSize); + memset(data->in_bass_l_raw, 0, sizeof(double) * data->FFTbassbufferSize); + memset(data->in_mid_l_raw, 0, sizeof(double) * data->FFTmidbufferSize); + memset(data->in_treble_l_raw, 0, sizeof(double) * data->FFTtreblebufferSize); +} + +int write_to_fftw_input_buffers(int16_t frames, int16_t buf[frames * 2], audio_data_t *audio) { + if (frames == 0) + return 0; + + for (uint16_t n = audio->FFTbassbufferSize; n > frames; n = n - frames) { + for (uint16_t i = 1; i <= frames; i++) { + audio->in_bass_l_raw[n - i] = audio->in_bass_l_raw[n - i - frames]; + } + } + for (uint16_t n = audio->FFTmidbufferSize; n > frames; n = n - frames) { + for (uint16_t i = 1; i <= frames; i++) { + audio->in_mid_l_raw[n - i] = audio->in_mid_l_raw[n - i - frames]; + } + } + for (uint16_t n = audio->FFTtreblebufferSize; n > frames; n = n - frames) { + for (uint16_t i = 1; i <= frames; i++) { + audio->in_treble_l_raw[n - i] = audio->in_treble_l_raw[n - i - frames]; + } + } + uint16_t n = frames - 1; + + for (uint16_t i = 0; i < frames; i++) { + audio->in_bass_l_raw[n] = buf[i * 2]; + audio->in_mid_l_raw[n] = audio->in_bass_l_raw[n]; + audio->in_treble_l_raw[n] = audio->in_bass_l_raw[n]; + n--; + } + + // Hann Window + for (int i = 0; i < audio->FFTbassbufferSize; i++) { + audio->in_bass_l[i] = audio->bass_multiplier[i] * audio->in_bass_l_raw[i]; + } + for (int i = 0; i < audio->FFTmidbufferSize; i++) { + audio->in_mid_l[i] = audio->mid_multiplier[i] * audio->in_mid_l_raw[i]; + } + for (int i = 0; i < audio->FFTtreblebufferSize; i++) { + audio->in_treble_l[i] = audio->treble_multiplier[i] * audio->in_treble_l_raw[i]; + } + return 0; +} diff --git a/RpiLedBars/res/src/cava/rpi_microphone.h b/RpiLedBars/res/src/cava/rpi_microphone.h new file mode 100644 index 0000000..bd241a9 --- /dev/null +++ b/RpiLedBars/res/src/cava/rpi_microphone.h @@ -0,0 +1,42 @@ +#if !defined(__RPI_MICROPHONE_H__) +#define __RPI_MICROPHONE_H__ + +#include +#include + +typedef struct { + int FFTbassbufferSize; + int FFTmidbufferSize; + int FFTtreblebufferSize; + int bass_index; + int mid_index; + int treble_index; + double *bass_multiplier; + double *mid_multiplier; + double *treble_multiplier; + double *in_bass_l_raw; + double *in_mid_l_raw; + double *in_treble_l_raw; + double *in_bass_l; + double *in_mid_l; + double *in_treble_l; + int format; + unsigned int rate; + char *source; // alsa device, fifo path or pulse source + int im; // input mode alsa, fifo or pulse + unsigned int channels; + bool left, right, average; + int terminate; // shared variable used to terminate audio thread + char error_message[1024]; + pthread_mutex_t lock; +} audio_data_t; + +void *microphone_listen(void *arg); + +void microphone_setup(audio_data_t *audio); + +void microphone_exec(audio_data_t *audio); + +void reset_output_buffers(audio_data_t *data); + +#endif /* __RPI_MICROPHONE_H__ */ \ No newline at end of file diff --git a/RpiLedBars/res/src/cava/rpi_spectrum.c b/RpiLedBars/res/src/cava/rpi_spectrum.c new file mode 100644 index 0000000..cae11d9 --- /dev/null +++ b/RpiLedBars/res/src/cava/rpi_spectrum.c @@ -0,0 +1,447 @@ +#include "rpi_spectrum.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "rpi_microphone.h" + +typedef struct { + int framerate; + int number_of_bars; + int lower_cut_off, upper_cut_off; +} param_t; + +typedef struct { + double sens; + double gravity; + double integral; + double userEQ[128]; +} config_t; + +param_t param = { + .framerate = 60, .number_of_bars = 128, .lower_cut_off = 50, .upper_cut_off = 10000}; +config_t conf = {.sens = 1, .gravity = 0, .integral = 0, .userEQ = {1}}; + +pthread_t microphoneListener; + +audio_data_t audio; + +fftw_complex *out_bass_l; +fftw_plan p_bass_l; +fftw_complex *out_mid_l; +fftw_plan p_mid_l; +fftw_complex *out_treble_l; +fftw_plan p_treble_l; + +// input: init +int *bars_left; +double *temp_l; + +int bass_cut_off = 150; +int treble_cut_off = 2500; + +void init_plan(int bufferSize, double **in, double **in_raw, fftw_complex **out, fftw_plan *p); + +void spectrum_start_bg_worker(); + +void spectrum_stop_bg_worker(); + +void spectrum_setup(char *audio_source) { + for (size_t i = 0; i < 128; i++) { + conf.userEQ[i] = 1; + } + + memset(&audio, 0, sizeof(audio)); + + audio.source = malloc(1 + strlen(audio_source)); + strcpy(audio.source, audio_source); + + audio.format = -1; + audio.rate = 0; + audio.FFTbassbufferSize = 4096; + audio.FFTmidbufferSize = 2048; + audio.FFTtreblebufferSize = 1024; + audio.terminate = 0; + audio.channels = 1; + audio.average = false; + audio.left = true; + audio.right = false; + audio.bass_index = 0; + audio.mid_index = 0; + audio.treble_index = 0; + audio.bass_multiplier = (double *)malloc(audio.FFTbassbufferSize * sizeof(double)); + audio.mid_multiplier = (double *)malloc(audio.FFTmidbufferSize * sizeof(double)); + audio.treble_multiplier = (double *)malloc(audio.FFTtreblebufferSize * sizeof(double)); + + temp_l = (double *)malloc((audio.FFTbassbufferSize / 2 + 1) * sizeof(double)); + + bars_left = (int *)malloc(256 * sizeof(int)); + + for (int i = 0; i < audio.FFTbassbufferSize; i++) { + audio.bass_multiplier[i] = 0.5 * (1 - cos(2 * M_PI * i / (audio.FFTbassbufferSize - 1))); + } + for (int i = 0; i < audio.FFTmidbufferSize; i++) { + audio.mid_multiplier[i] = 0.5 * (1 - cos(2 * M_PI * i / (audio.FFTmidbufferSize - 1))); + } + for (int i = 0; i < audio.FFTtreblebufferSize; i++) { + audio.treble_multiplier[i] = 0.5 * (1 - cos(2 * M_PI * i / (audio.FFTtreblebufferSize - 1))); + } + + // BASS + // audio.FFTbassbufferSize = audio.rate / 20; // audio.FFTbassbufferSize; + // audio.in_bass_l = fftw_alloc_real(audio.FFTbassbufferSize); + // audio.in_bass_l_raw = fftw_alloc_real(audio.FFTbassbufferSize); + + // out_bass_l = fftw_alloc_complex(audio.FFTbassbufferSize / 2 + 1); + // memset(out_bass_l, 0, (audio.FFTbassbufferSize / 2 + 1) * sizeof(fftw_complex)); + + // p_bass_l = + // fftw_plan_dft_r2c_1d(audio.FFTbassbufferSize, audio.in_bass_l, out_bass_l, FFTW_MEASURE); + + init_plan(audio.FFTbassbufferSize, &audio.in_bass_l, &audio.in_bass_l_raw, &out_bass_l, + &p_bass_l); + + // MID + // audio.FFTmidbufferSize = audio.rate / bass_cut_off; // audio.FFTbassbufferSize; + // audio.in_mid_l = fftw_alloc_real(audio.FFTmidbufferSize); + // audio.in_mid_l_raw = fftw_alloc_real(audio.FFTmidbufferSize); + + // out_mid_l = fftw_alloc_complex(audio.FFTmidbufferSize / 2 + 1); + // memset(out_mid_l, 0, (audio.FFTmidbufferSize / 2 + 1) * sizeof(fftw_complex)); + + // p_mid_l = fftw_plan_dft_r2c_1d(audio.FFTmidbufferSize, audio.in_mid_l, out_mid_l, + // FFTW_MEASURE); + + init_plan(audio.FFTmidbufferSize, &audio.in_mid_l, &audio.in_mid_l_raw, &out_mid_l, &p_mid_l); + + // TRIEBLE + // audio.FFTtreblebufferSize = audio.rate / treble_cut_off; // audio.FFTbassbufferSize; + // audio.in_treble_l = fftw_alloc_real(audio.FFTtreblebufferSize); + // audio.in_treble_l_raw = fftw_alloc_real(audio.FFTtreblebufferSize); + + // out_treble_l = fftw_alloc_complex(audio.FFTtreblebufferSize / 2 + 1); + // memset(out_treble_l, 0, (audio.FFTtreblebufferSize / 2 + 1) * sizeof(fftw_complex)); + + // p_treble_l = fftw_plan_dft_r2c_1d(audio.FFTtreblebufferSize, audio.in_treble_l, + // out_treble_l, + // FFTW_MEASURE); + + init_plan(audio.FFTtreblebufferSize, &audio.in_treble_l, &audio.in_treble_l_raw, &out_treble_l, + &p_treble_l); + + reset_output_buffers(&audio); + + spectrum_start_bg_worker(); +} + +void spectrum_start_bg_worker() { + pthread_mutex_init(&audio.lock, NULL); + if (pthread_create(µphoneListener, NULL, microphone_listen, (void *)&audio) < 0) { + perror("pthread_create"); + } + + int timeout_counter = 0; + while (audio.rate == 0) { + usleep(2000); + ++timeout_counter; + if (timeout_counter > 2000) { + fprintf(stderr, "could not get rate and/or format, problems with audio thread? " + "quiting...\n"); + exit(EXIT_FAILURE); + } + } +} + +void spectrum_stop_bg_worker() { + if (pthread_cancel(microphoneListener) != 0) { + perror("pthread_cancel"); + } + if (pthread_join(microphoneListener, NULL) != 0) { + perror("pthread_join"); + } +} + +void spectrum_execute() { + int bars[256]; + int bars_mem[256]; + int bars_last[256]; + int previous_frame[256]; + int fall[256]; + float bars_peak[256]; + + int height, lines, width, remainder, fp; + + bool reloadConf = false; + + for (int n = 0; n < 256; n++) { + bars_last[n] = 0; + previous_frame[n] = 0; + fall[n] = 0; + bars_peak[n] = 0; + bars_mem[n] = 0; + bars[n] = 0; + } + + width = 256; + height = UINT16_MAX; + + // getting numbers of bars + int number_of_bars = param.number_of_bars; + + if (number_of_bars > 256) + number_of_bars = 256; // cant have more than 256 bars + + // process [smoothing]: calculate gravity + float g = conf.gravity * ((float)height / 2160) * pow((60 / (float)param.framerate), 2.5); + + // calculate integral value, must be reduced with height + double integral = conf.integral; + if (height > 320) + integral = conf.integral * 1 / sqrt((log10((float)height / 10))); + + // process: calculate cutoff frequencies and eq + + double userEQ_keys_to_bars_ratio; + + if (number_of_bars > 0) { + userEQ_keys_to_bars_ratio = (double)(((double)(number_of_bars < 128 ? number_of_bars : 128)) / + ((double)number_of_bars)); + } + + // calculate frequency constant (used to distribute bars across the frequency band) + double frequency_constant = log10((float)param.lower_cut_off / (float)param.upper_cut_off) / + (1 / ((float)number_of_bars + 1) - 1); + + float cut_off_frequency[256]; + float upper_cut_off_frequency[256]; + float relative_cut_off[256]; + double center_frequencies[256]; + int FFTbuffer_lower_cut_off[256]; + int FFTbuffer_upper_cut_off[256]; + double eq[256]; + + int bass_cut_off_bar = -1; + int treble_cut_off_bar = -1; + bool first_bar = true; + int first_treble_bar = 0; + int bar_buffer[number_of_bars + 1]; + + for (int n = 0; n < number_of_bars + 1; n++) { + double bar_distribution_coefficient = frequency_constant * (-1); + bar_distribution_coefficient += + ((float)n + 1) / ((float)number_of_bars + 1) * frequency_constant; + cut_off_frequency[n] = param.upper_cut_off * pow(10, bar_distribution_coefficient); + + if (n > 0) { + if (cut_off_frequency[n - 1] >= cut_off_frequency[n] && + cut_off_frequency[n - 1] > bass_cut_off) + cut_off_frequency[n] = + cut_off_frequency[n - 1] + (cut_off_frequency[n - 1] - cut_off_frequency[n - 2]); + } + + relative_cut_off[n] = cut_off_frequency[n] / (audio.rate / 2); + // remember nyquist!, per my calculations this should be rate/2 + // and nyquist freq in M/2 but testing shows it is not... + // or maybe the nq freq is in M/4 + + eq[n] = pow(cut_off_frequency[n], 1); + + // the numbers that come out of the FFT are very high + // the EQ is used to "normalize" them by dividing with this very huge number + eq[n] *= (float)height / pow(2, 28); + + eq[n] *= conf.userEQ[(int)floor(((double)n) * userEQ_keys_to_bars_ratio)]; + + eq[n] /= log2(audio.FFTbassbufferSize); + + if (cut_off_frequency[n] < bass_cut_off) { + // BASS + bar_buffer[n] = 1; + FFTbuffer_lower_cut_off[n] = relative_cut_off[n] * (audio.FFTbassbufferSize / 2); + bass_cut_off_bar++; + treble_cut_off_bar++; + if (bass_cut_off_bar > 0) + first_bar = false; + + eq[n] *= log2(audio.FFTbassbufferSize); + } else if (cut_off_frequency[n] > bass_cut_off && cut_off_frequency[n] < treble_cut_off) { + // MID + bar_buffer[n] = 2; + FFTbuffer_lower_cut_off[n] = relative_cut_off[n] * (audio.FFTmidbufferSize / 2); + treble_cut_off_bar++; + if ((treble_cut_off_bar - bass_cut_off_bar) == 1) { + first_bar = true; + FFTbuffer_upper_cut_off[n - 1] = relative_cut_off[n] * (audio.FFTbassbufferSize / 2); + } else { + first_bar = false; + } + + eq[n] *= log2(audio.FFTmidbufferSize); + } else { + // TREBLE + bar_buffer[n] = 3; + FFTbuffer_lower_cut_off[n] = relative_cut_off[n] * (audio.FFTtreblebufferSize / 2); + first_treble_bar++; + if (first_treble_bar == 1) { + first_bar = true; + FFTbuffer_upper_cut_off[n - 1] = relative_cut_off[n] * (audio.FFTmidbufferSize / 2); + } else { + first_bar = false; + } + + eq[n] *= log2(audio.FFTtreblebufferSize); + } + + if (n > 0) { + if (!first_bar) { + FFTbuffer_upper_cut_off[n - 1] = FFTbuffer_lower_cut_off[n] - 1; + + // pushing the spectrum up if the exponential function gets "clumped" in the + // bass and caluclating new cut off frequencies + if (FFTbuffer_lower_cut_off[n] <= FFTbuffer_lower_cut_off[n - 1]) { + + FFTbuffer_lower_cut_off[n] = FFTbuffer_lower_cut_off[n - 1] + 1; + FFTbuffer_upper_cut_off[n - 1] = FFTbuffer_lower_cut_off[n] - 1; + + if (bar_buffer[n] == 1) + relative_cut_off[n] = + (float)(FFTbuffer_lower_cut_off[n]) / ((float)audio.FFTbassbufferSize / 2); + else if (bar_buffer[n] == 2) + relative_cut_off[n] = + (float)(FFTbuffer_lower_cut_off[n]) / ((float)audio.FFTmidbufferSize / 2); + else if (bar_buffer[n] == 3) + relative_cut_off[n] = + (float)(FFTbuffer_lower_cut_off[n]) / ((float)audio.FFTtreblebufferSize / 2); + + cut_off_frequency[n] = relative_cut_off[n] * ((float)audio.rate / 2); + } + } else { + if (FFTbuffer_upper_cut_off[n - 1] <= FFTbuffer_lower_cut_off[n - 1]) + FFTbuffer_upper_cut_off[n - 1] = FFTbuffer_lower_cut_off[n - 1] + 1; + } + upper_cut_off_frequency[n - 1] = + cut_off_frequency[n]; // high_relative_cut_off * ((float)audio.rate / 2); + center_frequencies[n - 1] = + pow((cut_off_frequency[n - 1] * upper_cut_off_frequency[n - 1]), 0.5); + } + } + + // process: execute FFT and sort frequency bands + pthread_mutex_lock(&audio.lock); + fftw_execute(p_bass_l); + fftw_execute(p_mid_l); + fftw_execute(p_treble_l); + pthread_mutex_unlock(&audio.lock); + + // process: separate frequency bands + for (int n = 0; n < number_of_bars; n++) { + + temp_l[n] = 0; + + // process: add upp FFT values within bands + for (int i = FFTbuffer_lower_cut_off[n]; i <= FFTbuffer_upper_cut_off[n]; i++) { + if (n <= bass_cut_off_bar) { + + temp_l[n] += hypot(out_bass_l[i][0], out_bass_l[i][1]); + + } else if (n > bass_cut_off_bar && n <= treble_cut_off_bar) { + + temp_l[n] += hypot(out_mid_l[i][0], out_mid_l[i][1]); + + } else if (n > treble_cut_off_bar) { + + temp_l[n] += hypot(out_treble_l[i][0], out_treble_l[i][1]); + } + } + + // getting average multiply with sens and eq + temp_l[n] /= FFTbuffer_upper_cut_off[n] - FFTbuffer_lower_cut_off[n] + 1; + temp_l[n] *= conf.sens * eq[n]; + + bars_left[n] = temp_l[n]; + } + + // process [filter] + + // if (p.monstercat) { + // if (p.stereo) { + // bars_left = monstercat_filter(bars_left, number_of_bars / 2, p.waves, p.monstercat); + // bars_right = monstercat_filter(bars_right, number_of_bars / 2, p.waves, p.monstercat); + // } else { + // bars_left = monstercat_filter(bars_left, number_of_bars, p.waves, p.monstercat); + // } + // } + + // processing signal + + // bool senselow = true; + + for (int n = 0; n < number_of_bars; n++) { + // // mirroring stereo channels + // if (p.stereo) { + // if (n < number_of_bars / 2) { + // bars[n] = bars_left[number_of_bars / 2 - n - 1]; + // } else { + // bars[n] = bars_right[n - number_of_bars / 2]; + // } + + // } else { + bars[n] = bars_left[n]; + } + + // process [smoothing]: falloff + // if (g > 0) { + // if (bars[n] < bars_last[n]) { + // bars[n] = bars_peak[n] - (g * fall[n] * fall[n]); + // if (bars[n] < 0) + // bars[n] = 0; + // fall[n]++; + // } else { + // bars_peak[n] = bars[n]; + // fall[n] = 0; + // } + + // bars_last[n] = bars[n]; + // } + + // process [smoothing]: integral + // if (p.integral > 0) { + // bars[n] = bars_mem[n] * integral + bars[n]; + // bars_mem[n] = bars[n]; + + // int diff = height - bars[n]; + // if (diff < 0) + // diff = 0; + // double div = 1 / (diff + 1); + // // bars[n] = bars[n] - pow(div, 10) * (height + 1); + // bars_mem[n] = bars_mem[n] * (1 - div / 20); + // } + + memcpy(previous_frame, bars, 256 * sizeof(int)); + + for (size_t i = 0; i < number_of_bars; i++) { + printf("%5d, ", bars[i]); + } + printf("\n"); +} + +int *spectrum_display_bars() { return bars_left; } + +void init_plan(int bufferSize, double **in, double **in_raw, fftw_complex **out, fftw_plan *p) { + *in = fftw_alloc_real(bufferSize); + *in_raw = fftw_alloc_real(bufferSize); + + *out = fftw_alloc_complex(bufferSize / 2 + 1); + memset(*out, 0, (bufferSize / 2 + 1) * sizeof(fftw_complex)); + + *p = fftw_plan_dft_r2c_1d(bufferSize, *in, *out, FFTW_MEASURE); +} + +void compute_param() {} + +void compute_config() {} \ No newline at end of file diff --git a/RpiLedBars/res/src/cava/rpi_spectrum.h b/RpiLedBars/res/src/cava/rpi_spectrum.h new file mode 100644 index 0000000..500d144 --- /dev/null +++ b/RpiLedBars/res/src/cava/rpi_spectrum.h @@ -0,0 +1,14 @@ +#if !defined(__RPI_SPECTRUM_H__) +#define __RPI_SPECTRUM_H__ + +void spectrum_setup(char *audio_source); + +void spectrum_start_bg_worker(); + +void spectrum_stop_bg_worker(); + +void spectrum_execute(); + +int *spectrum_get_bars(); + +#endif /* __RPI_SPECTRUM_H__ */ \ No newline at end of file diff --git a/RpiLedBars/res/src/output/raw.c b/RpiLedBars/res/src/output/raw.c new file mode 100644 index 0000000..f7a5737 --- /dev/null +++ b/RpiLedBars/res/src/output/raw.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +int16_t buf_16; +int8_t buf_8; + +int buffer[200]; + +int print_raw_out(int bars_count, int fd, int is_binary, int bit_format, int ascii_range, + char bar_delim, char frame_delim, int const f[200]) { + memcpy(buffer, f, sizeof(int) * bars_count); + return 0; +} diff --git a/RpiLedBars/res/src/output/raw.h b/RpiLedBars/res/src/output/raw.h new file mode 100644 index 0000000..f2f50cf --- /dev/null +++ b/RpiLedBars/res/src/output/raw.h @@ -0,0 +1,2 @@ +int print_raw_out(int bars_count, int fd, int is_binary, int bit_format, int ascii_range, + char bar_delim, char frame_delim, int const f[200]); diff --git a/RpiLedBars/src/smi/VitualMemory.cpp b/RpiLedBars/res/src/smi/VitualMemory.cpp similarity index 100% rename from RpiLedBars/src/smi/VitualMemory.cpp rename to RpiLedBars/res/src/smi/VitualMemory.cpp diff --git a/RpiLedBars/src/smi/VitualMemory.hpp b/RpiLedBars/res/src/smi/VitualMemory.hpp similarity index 100% rename from RpiLedBars/src/smi/VitualMemory.hpp rename to RpiLedBars/res/src/smi/VitualMemory.hpp diff --git a/RpiLedBars/src/smi/utils.h b/RpiLedBars/res/src/smi/utils.h similarity index 100% rename from RpiLedBars/src/smi/utils.h rename to RpiLedBars/res/src/smi/utils.h diff --git a/RpiLedBars/src/tmp/main.c b/RpiLedBars/res/src/tmp/main.c similarity index 100% rename from RpiLedBars/src/tmp/main.c rename to RpiLedBars/res/src/tmp/main.c diff --git a/RpiLedBars/res/src/tmp/rpi_cava.c b/RpiLedBars/res/src/tmp/rpi_cava.c new file mode 100644 index 0000000..c8bbc0b --- /dev/null +++ b/RpiLedBars/res/src/tmp/rpi_cava.c @@ -0,0 +1,93 @@ +#include "rpi_cava.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +pid_t cavaPid; +pthread_t fifoReader; +int cavaFifo; +uint16_t buffer[20]; + +static void *fifo_to_buffer(void *arg); + +void setup_cava() {} + +void close_cava() { stop_cava_bg_worker(); } + +void start_cava_bg_worker() { + if ((cavaPid = fork()) == -1) { + perror("fork"); + exit(1); + } + + if (cavaPid == 0) { + /* Child process*/ + char *args[] = {"/usr/local/bin/cava", "-p", "/home/pi/LedBars/RpiLedBars/cava_config", NULL}; + + if (execv(args[0], args) != 0) { + perror("execv"); + } + + } else { + + sleep(1); + if ((cavaFifo = open("/tmp/cava_output", O_RDONLY)) < 0) { + perror("open"); + close_cava(); + exit(1); + } + + pthread_create(&fifoReader, NULL, fifo_to_buffer, NULL); + } +} + +void stop_cava_bg_worker() { + if (pthread_cancel(fifoReader) != 0) { + perror("pthread_cancel"); + } + if (pthread_join(fifoReader, NULL) != 0) { + perror("pthread_join"); + } + close(cavaFifo); + kill(cavaPid, SIGTERM); +} + +int get_cava_buffer(uint16_t buffer_dst[20]) { + memcpy(buffer_dst, buffer, 40); + return 0; +} + +static void *fifo_to_buffer(void *arg) { + while (1) { + int totalRead = 0; + while (totalRead < 40) { + int nread; + nread = read(cavaFifo, ((uint8_t *)buffer) + totalRead, 40 - totalRead); + if (nread >= 0) { + totalRead += nread; + } else { + if (errno != EAGAIN) { + perror("read"); + } + } + } + + printf("data[%d] : ", totalRead); + for (size_t i = 0; i < 20; i++) { + printf("%5u;", buffer[i]); + } + printf("\n"); + } + return NULL; +} diff --git a/RpiLedBars/res/src/tmp/rpi_cava.h b/RpiLedBars/res/src/tmp/rpi_cava.h new file mode 100644 index 0000000..5c59e1a --- /dev/null +++ b/RpiLedBars/res/src/tmp/rpi_cava.h @@ -0,0 +1,16 @@ +#if !defined(__RPI_CAVA_H__) +#define __RPI_CAVA_H__ + +#include + +void setup_cava(); + +int get_cava_buffer(uint16_t buffer_dst[20]); + +void close_cava(); + +void start_cava_bg_worker(); + +void stop_cava_bg_worker(); + +#endif /* __RPI_CAVA_H__ */ \ No newline at end of file diff --git a/RpiLedBars/res/src/tmp/rpi_microphone.c b/RpiLedBars/res/src/tmp/rpi_microphone.c new file mode 100644 index 0000000..2a9036a --- /dev/null +++ b/RpiLedBars/res/src/tmp/rpi_microphone.c @@ -0,0 +1,103 @@ +#include "rpi_microphone.h" + +#include +#include +#include +#include + +#define CHANNELS_COUNT 1 +#define SAMPLE_RATE 44100 + +snd_pcm_t *capture_handle; +char const *deviceName = "plughw:1"; + +void setup_microphone() { + int err; + snd_pcm_hw_params_t *hw_params; + unsigned int rate = 44100; + + if ((err = snd_pcm_open(&capture_handle, deviceName, SND_PCM_STREAM_CAPTURE, 0)) < 0) { + fprintf(stderr, "cannot open audio device %s (%s)\n", deviceName, snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) { + fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_any(capture_handle, hw_params)) < 0) { + fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params, + SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "cannot set access type (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "cannot set sample format (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &rate, 0)) < 0) { + fprintf(stderr, "cannot set sample rate (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params, 2)) < 0) { + fprintf(stderr, "cannot set channel count (%s)\n", snd_strerror(err)); + exit(1); + } + + if ((err = snd_pcm_hw_params(capture_handle, hw_params)) < 0) { + fprintf(stderr, "cannot set parameters (%s)\n", snd_strerror(err)); + exit(1); + } + + snd_pcm_hw_params_free(hw_params); + + if ((err = snd_pcm_prepare(capture_handle)) < 0) { + fprintf(stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror(err)); + exit(1); + } + + return; +} + +#define BUFFERSIZE 1024 +short buf[BUFFERSIZE]; + +void read_microphone() { + int err; + short max = SHRT_MIN; + + if ((err = snd_pcm_readi(capture_handle, buf, BUFFERSIZE)) != BUFFERSIZE) { + fprintf(stderr, "read from audio interface failed (%s)\n", snd_strerror(err)); + } else { + for (size_t i = 0; i < BUFFERSIZE; ++i) { + if (buf[i] > max) { + max = buf[i]; + } + } + printf("%d, ", max); + printf("\n"); + } +} + +void fft() { + // fftw_complex *in, *out; + // fftw_plan my_plan; + // in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N); + // out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N); + // my_plan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); + // fftw_execute(my_plan); /* repeat as needed */ + // fftw_destroy_plan(my_plan); + // fftw_free(in); + // fftw_free(out); + // return; +} + +void close_microphone() { snd_pcm_close(capture_handle); } \ No newline at end of file diff --git a/RpiLedBars/res/src/tmp/rpi_microphone.h b/RpiLedBars/res/src/tmp/rpi_microphone.h new file mode 100644 index 0000000..482014b --- /dev/null +++ b/RpiLedBars/res/src/tmp/rpi_microphone.h @@ -0,0 +1,10 @@ +#if !defined(__RPI_MICROPHONE_H__) +#define __RPI_MICROPHONE_H__ + +void setup_microphone(); + +void read_microphone(); + +void close_microphone(); + +#endif /* __RPI_MICROPHONE_H__ */ \ No newline at end of file diff --git a/RpiLedBars/src/tmp/rpi_pixleds.h b/RpiLedBars/res/src/tmp/rpi_pixleds.h similarity index 100% rename from RpiLedBars/src/tmp/rpi_pixleds.h rename to RpiLedBars/res/src/tmp/rpi_pixleds.h diff --git a/RpiLedBars/src/artnet/artnet.cpp b/RpiLedBars/src/artnet/artnet.cpp deleted file mode 100644 index 9a2aaa9..0000000 --- a/RpiLedBars/src/artnet/artnet.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "artnet.h" diff --git a/RpiLedBars/src/artnet/artnet.h b/RpiLedBars/src/artnet/artnet.h deleted file mode 100644 index 93a36a4..0000000 --- a/RpiLedBars/src/artnet/artnet.h +++ /dev/null @@ -1,4 +0,0 @@ -#if !defined(__ARTNET_H__) -#define __ARTNET_H__ - -#endif // __ARTNET_H__ diff --git a/RpiLedBars/src/drivers/common.c b/RpiLedBars/src/drivers/common.c new file mode 100644 index 0000000..32611f6 --- /dev/null +++ b/RpiLedBars/src/drivers/common.c @@ -0,0 +1,49 @@ +#include "common.h" + +#include +#include +#include +#include +#include + +// Use mmap to obtain virtual address, given physical +void *map_periph(MEM_MAP *mp, void *phys, int size) { + mp->phys = phys; + mp->size = PAGE_ROUNDUP(size); + mp->bus = (void *)((uint32_t)phys - PHYS_REG_BASE + BUS_REG_BASE); + mp->virt = map_segment(phys, mp->size); + return (mp->virt); +} + +// Free mapped peripheral or memory +void unmap_periph_mem(MEM_MAP *mp) { + if (mp) { + unmap_segment(mp->virt, mp->size); + } +} + +// ----- VIRTUAL MEMORY ----- + +// Get virtual memory segment for peripheral regs or physical mem +void *map_segment(void *addr, int size) { + int fd; + void *mem; + + size = PAGE_ROUNDUP(size); + if ((fd = open("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC)) < 0) + fprintf(stderr, "Error: can't open /dev/mem, run using sudo\n"); + mem = mmap(0, size, PROT_WRITE | PROT_READ, MAP_SHARED, fd, (uint32_t)addr); + close(fd); +#if DEBUG + printf("Map %p -> %p\n", (void *)addr, mem); +#endif + if (mem == MAP_FAILED) + fprintf(stderr, "Error: can't map memory\n"); + return (mem); +} + +// Free mapped memory +void unmap_segment(void *mem, int size) { + if (mem) + munmap(mem, PAGE_ROUNDUP(size)); +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/common.h b/RpiLedBars/src/drivers/common.h new file mode 100644 index 0000000..5652292 --- /dev/null +++ b/RpiLedBars/src/drivers/common.h @@ -0,0 +1,50 @@ +#if !defined(__COMMON_H__) +#define __COMMON_H__ + +// Location of peripheral registers in physical memory +#define PHYS_REG_BASE PI_23_REG_BASE +#define PI_01_REG_BASE 0x20000000 // Pi Zero or 1 +#define PI_23_REG_BASE 0x3F000000 // Pi 2 or 3 +#define PI_4_REG_BASE 0xFE000000 // Pi 4 + +#define CLOCK_HZ 250000000 // Pi 2 - 4 +//#define CLOCK_HZ 400000000 // Pi Zero + +// Location of peripheral registers in bus memory +#define BUS_REG_BASE 0x7E000000 + +// Get virtual 8 and 32-bit pointers to register +#define REG8(m, x) ((volatile uint8_t *)((uint32_t)(m.virt) + (uint32_t)(x))) +#define REG32(m, x) ((volatile uint32_t *)((uint32_t)(m.virt) + (uint32_t)(x))) +// Get bus address of register +#define REG_BUS_ADDR(m, x) ((uint32_t)(m.bus) + (uint32_t)(x)) +// Convert uncached memory virtual address to bus address +#define MEM_BUS_ADDR(mp, a) ((uint32_t)a - (uint32_t)mp->virt + (uint32_t)mp->bus) +// Convert bus address to physical address (for mmap) +#define BUS_PHYS_ADDR(a) ((void *)((uint32_t)(a) & ~0xC0000000)) + +// Size of memory page +#define PAGE_SIZE 0x1000 +// Round up to nearest page +#define PAGE_ROUNDUP(n) ((n) % PAGE_SIZE == 0 ? (n) : ((n) + PAGE_SIZE) & ~(PAGE_SIZE - 1)) + +// Structure for mapped peripheral or memory +typedef struct { + int fd, // File descriptor + h, // Memory handle + size; // Memory size + void *bus, // Bus address + *virt, // Virtual address + *phys; // Physical address +} MEM_MAP; + +// Use mmap to obtain virtual address, given physical +void *map_periph(MEM_MAP *mp, void *phys, int size); + +// Free mapped peripheral or memory +void unmap_periph_mem(MEM_MAP *mp); + +void *map_segment(void *addr, int size); +void unmap_segment(void *addr, int size); + +#endif // __COMMON_H__ \ No newline at end of file diff --git a/RpiLedBars/src/drivers/dma/rpi_dma.c b/RpiLedBars/src/drivers/dma/rpi_dma.c new file mode 100644 index 0000000..8c9510b --- /dev/null +++ b/RpiLedBars/src/drivers/dma/rpi_dma.c @@ -0,0 +1,90 @@ +#include "rpi_dma.h" + +#include + +#include "rpi_videocore.h" + +// DMA channels and data requests +#define DMA_SMI_DREQ 4 +#define DMA_PWM_DREQ 5 +#define DMA_SPI_TX_DREQ 6 +#define DMA_SPI_RX_DREQ 7 +#define DMA_BASE (PHYS_REG_BASE + 0x007000) +// DMA register addresses offset by 0x100 * chan_num +#define DMA_CS 0x00 +#define DMA_CONBLK_AD 0x04 +#define DMA_TI 0x08 +#define DMA_SRCE_AD 0x0c +#define DMA_DEST_AD 0x10 +#define DMA_TXFR_LEN 0x14 +#define DMA_STRIDE 0x18 +#define DMA_NEXTCONBK 0x1c +#define DMA_DEBUG 0x20 +#define DMA_REG(ch, r) ((r) == DMA_ENABLE ? DMA_ENABLE : (ch)*0x100 + (r)) +#define DMA_ENABLE 0xff0 +// DMA register values +#define DMA_WAIT_RESP (1 << 3) +#define DMA_CB_DEST_INC (1 << 4) +#define DMA_DEST_DREQ (1 << 6) +#define DMA_CB_SRCE_INC (1 << 8) +#define DMA_SRCE_DREQ (1 << 10) +#define DMA_PRIORITY(n) ((n) << 16) + +// Virtual memory pointers to acceess GPIO, DMA and PWM from user space +MEM_MAP dma_regs; + +char *dma_regstrs[] = {"DMA CS", "CB_AD", "TI", "SRCE_AD", "DEST_AD", + "TFR_LEN", "STRIDE", "NEXT_CB", "DEBUG", ""}; + +void dma_setup(MEM_MAP *mp, int chan, int nsamp, uint8_t **txdata, int offset, uint32_t dest_ad) { + map_periph(&dma_regs, (void *)DMA_BASE, PAGE_SIZE); + + DMA_CB *cbs = mp->virt; + + *txdata = (uint8_t *)(cbs + offset); + enable_dma(chan); + cbs[0].ti = DMA_DEST_DREQ | (DMA_SMI_DREQ << 16) | DMA_CB_SRCE_INC | DMA_WAIT_RESP; + cbs[0].tfr_len = nsamp; + cbs[0].srce_ad = MEM_BUS_ADDR(mp, *txdata); + cbs[0].dest_ad = dest_ad; +} + +void dma_close() { unmap_periph_mem(&dma_regs); } + +// Enable and reset DMA +void enable_dma(int chan) { + *REG32(dma_regs, DMA_ENABLE) |= (1 << chan); + *REG32(dma_regs, DMA_REG(chan, DMA_CS)) = 1 << 31; +} + +// Start DMA, given first control block +void start_dma(MEM_MAP *mp, int chan, DMA_CB *cbp, uint32_t csval) { + *REG32(dma_regs, DMA_REG(chan, DMA_CONBLK_AD)) = MEM_BUS_ADDR(mp, cbp); + *REG32(dma_regs, DMA_REG(chan, DMA_CS)) = 2; // Clear 'end' flag + *REG32(dma_regs, DMA_REG(chan, DMA_DEBUG)) = 7; // Clear error bits + *REG32(dma_regs, DMA_REG(chan, DMA_CS)) = 1 | csval; // Start DMA +} + +// Return remaining transfer length +uint32_t dma_transfer_len(int chan) { return (*REG32(dma_regs, DMA_REG(chan, DMA_TXFR_LEN))); } + +// Check if DMA is active +uint32_t dma_active(int chan) { return ((*REG32(dma_regs, DMA_REG(chan, DMA_CS))) & 1); } + +// Halt current DMA operation by resetting controller +void stop_dma(int chan) { + if (dma_regs.virt) + *REG32(dma_regs, DMA_REG(chan, DMA_CS)) = 1 << 31; +} + +// Display DMA registers +void disp_dma(int chan) { + volatile uint32_t *p = REG32(dma_regs, DMA_REG(chan, DMA_CS)); + int i = 0; + + while (dma_regstrs[i][0]) { + printf("%-7s %08X ", dma_regstrs[i++], *p++); + if (i % 5 == 0 || dma_regstrs[i][0] == 0) + printf("\n"); + } +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/dma/rpi_dma.h b/RpiLedBars/src/drivers/dma/rpi_dma.h new file mode 100644 index 0000000..0d96c5e --- /dev/null +++ b/RpiLedBars/src/drivers/dma/rpi_dma.h @@ -0,0 +1,33 @@ +#if !defined(__RPI_DMA_H__) +#define __RPI_DMA_H__ + +#include + +#include "../common.h" + +#define DMA_CHAN_A 10 +#define DMA_CHAN_B 11 + +// DMA control block (must be 32-byte aligned) +typedef struct { + uint32_t ti, // Transfer info + srce_ad, // Source address + dest_ad, // Destination address + tfr_len, // Transfer length + stride, // Transfer stride + next_cb, // Next control block + debug, // Debug register, zero in control block + unused; +} DMA_CB __attribute__((aligned(32))); + +void dma_setup(MEM_MAP *mp, int chan, int nsamp, uint8_t **txdata, int offset, uint32_t dest_ad); +void dma_close(); + +void enable_dma(int chan); +void start_dma(MEM_MAP *mp, int chan, DMA_CB *cbp, uint32_t csval); +uint32_t dma_transfer_len(int chan); +uint32_t dma_active(int chan); +void stop_dma(int chan); +void disp_dma(int chan); + +#endif // __RPI_DMA_H__ \ No newline at end of file diff --git a/RpiLedBars/src/drivers/dma/rpi_videocore.c b/RpiLedBars/src/drivers/dma/rpi_videocore.c new file mode 100644 index 0000000..1cd66a0 --- /dev/null +++ b/RpiLedBars/src/drivers/dma/rpi_videocore.c @@ -0,0 +1,125 @@ +#include "rpi_videocore.h" + +#include +#include +#include +#include + +// Mailbox command/response structure +typedef struct { + uint32_t len, // Overall length (bytes) + req, // Zero for request, 1<<31 for response + tag, // Command number + blen, // Buffer length (bytes) + dlen; // Data length (bytes) + uint32_t uints[32 - 5]; // Data (108 bytes maximum) +} VC_MSG __attribute__((aligned(16))); + +void disp_vc_msg(VC_MSG *msgp); + +int open_mbox(void); +void close_mbox(int fd); +uint32_t msg_mbox(int fd, VC_MSG *msgp); +void *map_uncached_mem(MEM_MAP *mp, int size); + +void videocore_setup(MEM_MAP *mp, int size) { map_uncached_mem(mp, size); } +void videocore_close(MEM_MAP *mp) { + unmap_periph_mem(mp); + if (mp->fd) { + unlock_vc_mem(mp->fd, mp->h); + free_vc_mem(mp->fd, mp->h); + close_mbox(mp->fd); + } +} + +// Allocate uncached memory, get bus & phys addresses +void *map_uncached_mem(MEM_MAP *mp, int size) { + void *ret; + mp->size = PAGE_ROUNDUP(size); + mp->fd = open_mbox(); + ret = (mp->h = alloc_vc_mem(mp->fd, mp->size, DMA_MEM_FLAGS)) > 0 && + (mp->bus = lock_vc_mem(mp->fd, mp->h)) != 0 && + (mp->virt = map_segment(BUS_PHYS_ADDR(mp->bus), mp->size)) != 0 + ? mp->virt + : 0; + printf("VC mem handle %u, phys %p, virt %p\n", mp->h, mp->bus, mp->virt); + return (ret); +} + +// Allocate memory on PAGE_SIZE boundary, return handle +uint32_t alloc_vc_mem(int fd, uint32_t size, VC_ALLOC_FLAGS flags) { + VC_MSG msg = { + .tag = 0x3000c, .blen = 12, .dlen = 12, .uints = {PAGE_ROUNDUP(size), PAGE_SIZE, flags}}; + return (msg_mbox(fd, &msg)); +} +// Lock allocated memory, return bus address +void *lock_vc_mem(int fd, int h) { + VC_MSG msg = {.tag = 0x3000d, .blen = 4, .dlen = 4, .uints = {h}}; + return (h ? (void *)msg_mbox(fd, &msg) : 0); +} +// Unlock allocated memory +uint32_t unlock_vc_mem(int fd, int h) { + VC_MSG msg = {.tag = 0x3000e, .blen = 4, .dlen = 4, .uints = {h}}; + return (h ? msg_mbox(fd, &msg) : 0); +} +// Free memory +uint32_t free_vc_mem(int fd, int h) { + VC_MSG msg = {.tag = 0x3000f, .blen = 4, .dlen = 4, .uints = {h}}; + return (h ? msg_mbox(fd, &msg) : 0); +} +uint32_t set_vc_clock(int fd, int id, uint32_t freq) { + VC_MSG msg1 = {.tag = 0x38001, .blen = 8, .dlen = 8, .uints = {id, 1}}; + VC_MSG msg2 = {.tag = 0x38002, .blen = 12, .dlen = 12, .uints = {id, freq, 0}}; + msg_mbox(fd, &msg1); + disp_vc_msg(&msg1); + msg_mbox(fd, &msg2); + disp_vc_msg(&msg2); + return (0); +} + +// Display mailbox message +void disp_vc_msg(VC_MSG *msgp) { + int i; + + printf("VC msg len=%X, req=%X, tag=%X, blen=%x, dlen=%x, data ", msgp->len, msgp->req, msgp->tag, + msgp->blen, msgp->dlen); + for (i = 0; i < msgp->blen / 4; i++) + printf("%08X ", msgp->uints[i]); + printf("\n"); +} + +// Open mailbox interface, return file descriptor +int open_mbox(void) { + int fd; + + if ((fd = open("/dev/vcio", 0)) < 0) + fprintf(stderr, "Error: can't open VC mailbox\n"); + return (fd); +} +// Close mailbox interface +void close_mbox(int fd) { + if (fd >= 0) + close(fd); +} + +// Send message to mailbox, return first response int, 0 if error +uint32_t msg_mbox(int fd, VC_MSG *msgp) { + uint32_t ret = 0, i; + + for (i = msgp->dlen / 4; i <= msgp->blen / 4; i += 4) + msgp->uints[i++] = 0; + msgp->len = (msgp->blen + 6) * 4; + msgp->req = 0; + if (ioctl(fd, _IOWR(100, 0, void *), msgp) < 0) + printf("VC IOCTL failed\n"); + else if ((msgp->req & 0x80000000) == 0) + printf("VC IOCTL error\n"); + else if (msgp->req == 0x80000001) + printf("VC IOCTL partial error\n"); + else + ret = msgp->uints[0]; +#if DEBUG + disp_vc_msg(msgp); +#endif + return (ret); +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/dma/rpi_videocore.h b/RpiLedBars/src/drivers/dma/rpi_videocore.h new file mode 100644 index 0000000..e83951b --- /dev/null +++ b/RpiLedBars/src/drivers/dma/rpi_videocore.h @@ -0,0 +1,33 @@ +#if !defined(__RPI_VIDEOCORE_H__) +#define __RPI_VIDEOCORE_H__ + +#include + +#include "../common.h" + +// Videocore mailbox memory allocation flags, see: +// https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface +typedef enum { + MEM_FLAG_DISCARDABLE = 1 << 0, // can be resized to 0 at any time. Use for cached data + MEM_FLAG_NORMAL = 0 << 2, // normal allocating alias. Don't use from ARM + MEM_FLAG_DIRECT = 1 << 2, // 0xC alias uncached + MEM_FLAG_COHERENT = 2 << 2, // 0x8 alias. Non-allocating in L2 but coherent + MEM_FLAG_ZERO = 1 << 4, // initialise buffer to all zeros + MEM_FLAG_NO_INIT = 1 << 5, // don't initialise (default is initialise to all ones) + MEM_FLAG_HINT_PERMALOCK = 1 << 6, // Likely to be locked for long periods of time + MEM_FLAG_L1_NONALLOCATING = (MEM_FLAG_DIRECT | MEM_FLAG_COHERENT) // Allocating in L2 +} VC_ALLOC_FLAGS; + +// VC flags for unchached DMA memory +#define DMA_MEM_FLAGS (MEM_FLAG_DIRECT | MEM_FLAG_ZERO) + +void videocore_setup(MEM_MAP *mp, int size); +void videocore_close(MEM_MAP *mp); + +uint32_t alloc_vc_mem(int fd, uint32_t size, VC_ALLOC_FLAGS flags); +void *lock_vc_mem(int fd, int h); +uint32_t unlock_vc_mem(int fd, int h); +uint32_t free_vc_mem(int fd, int h); +uint32_t set_vc_clock(int fd, int id, uint32_t freq); + +#endif // __RPI_VIDEOCORE_H__ \ No newline at end of file diff --git a/RpiLedBars/src/drivers/gpio/rpi_gpio.c b/RpiLedBars/src/drivers/gpio/rpi_gpio.c new file mode 100644 index 0000000..3e3d24c --- /dev/null +++ b/RpiLedBars/src/drivers/gpio/rpi_gpio.c @@ -0,0 +1,75 @@ +#include "rpi_gpio.h" + +#include +#include +#include + +#include "../common.h" + +// GPIO register definitions +#define GPIO_BASE (PHYS_REG_BASE + 0x200000) +#define GPIO_MODE0 0x00 +#define GPIO_SET0 0x1c +#define GPIO_CLR0 0x28 +#define GPIO_LEV0 0x34 +#define GPIO_GPPUD 0x94 +#define GPIO_GPPUDCLK0 0x98 + +#define GPIO_MODE_STRS "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" + +// Virtual memory pointers to acceess GPIO, DMA and PWM from user space +MEM_MAP gpio_regs; + +char *gpio_mode_strs[] = {GPIO_MODE_STRS}; + +// definitions + +void gpio_setup() { map_periph(&gpio_regs, (void *)GPIO_BASE, PAGE_SIZE); } + +void gpio_close() { unmap_periph_mem(&gpio_regs); } + +// Set input or output with pullups +void gpio_set(int pin, int mode, int pull) { + gpio_mode(pin, mode); + gpio_pull(pin, pull); +} +// Set I/P pullup or pulldown +void gpio_pull(int pin, int pull) { + volatile uint32_t *reg = REG32(gpio_regs, GPIO_GPPUDCLK0) + pin / 32; + + *REG32(gpio_regs, GPIO_GPPUD) = pull; + usleep(2); + *reg = pin << (pin % 32); + usleep(2); + *REG32(gpio_regs, GPIO_GPPUD) = 0; + *reg = 0; +} + +// Set input or output +void gpio_mode(int pin, int mode) { + if (gpio_regs.virt) { + volatile uint32_t *reg = REG32(gpio_regs, GPIO_MODE0) + pin / 10, shift = (pin % 10) * 3; + *reg = (*reg & ~(7 << shift)) | (mode << shift); + } +} + +// Set an O/P pin +void gpio_out(int pin, int val) { + volatile uint32_t *reg = REG32(gpio_regs, val ? GPIO_SET0 : GPIO_CLR0) + pin / 32; + *reg = 1 << (pin % 32); +} + +// Get an I/P pin value +uint8_t gpio_in(int pin) { + volatile uint32_t *reg = REG32(gpio_regs, GPIO_LEV0) + pin / 32; + return (((*reg) >> (pin % 32)) & 1); +} + +// Display the values in a GPIO mode register +void disp_mode_vals(uint32_t mode) { + int i; + + for (i = 0; i < 10; i++) + printf("%u:%-4s ", i, gpio_mode_strs[(mode >> (i * 3)) & 7]); + printf("\n"); +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/gpio/rpi_gpio.h b/RpiLedBars/src/drivers/gpio/rpi_gpio.h new file mode 100644 index 0000000..9f39848 --- /dev/null +++ b/RpiLedBars/src/drivers/gpio/rpi_gpio.h @@ -0,0 +1,26 @@ +#if !defined(__RPI_GPIO_H__) +#define __RPI_GPIO_H__ + +// GPIO I/O definitions +#define GPIO_IN 0 +#define GPIO_OUT 1 +#define GPIO_ALT0 4 +#define GPIO_ALT1 5 +#define GPIO_ALT2 6 +#define GPIO_ALT3 7 +#define GPIO_ALT4 3 +#define GPIO_ALT5 2 + +#define GPIO_NOPULL 0 +#define GPIO_PULLDN 1 +#define GPIO_PULLUP 2 + +void gpio_setup(); + +void gpio_close(); + +void gpio_pull(int pin, int pull); + +void gpio_mode(int pin, int mode); + +#endif // __RPI_GPIO_H__ \ No newline at end of file diff --git a/RpiLedBars/src/drivers/leddriver/rpi_leddriver.c b/RpiLedBars/src/drivers/leddriver/rpi_leddriver.c new file mode 100644 index 0000000..1ad781e --- /dev/null +++ b/RpiLedBars/src/drivers/leddriver/rpi_leddriver.c @@ -0,0 +1,132 @@ +#include "rpi_leddriver.h" + +#include +#include +#include + +#include "../common.h" + +#include "../dma/rpi_dma.h" +#include "../dma/rpi_videocore.h" +#include "../gpio/rpi_gpio.h" +#include "../smi/rpi_smi.h" + +#if PHYS_REG_BASE == PI_4_REG_BASE // Timings for RPi v4 (1.5 GHz) +#define SMI_TIMING 10, 15, 30, 15 // 400 ns cycle time +#else // Timings for RPi v0-3 (1 GHz) +#define SMI_TIMING 10, 10, 20, 10 // 400 ns cycle time +#endif + +#define TX_TEST 0 // If non-zero, use dummy Tx data +#define LED_NBITS 24 // Number of data bits per LED +#define LED_PREBITS 4 // Number of zero bits before LED data +#define LED_POSTBITS 4 // Number of zero bits after LED data +#define BIT_NPULSES 3 // Number of O/P pulses per LED bit + +// Length of data for 1 row (1 LED on each channel) +#define LED_DLEN (LED_NBITS * BIT_NPULSES) + +// Transmit data type, 8 or 16 bits +#if LED_NCHANS > 8 +#define TXDATA_T uint16_t +#else +#define TXDATA_T uint8_t +#endif + +// Ofset into Tx data buffer, given LED number in chan +#define LED_TX_OSET(n) (LED_PREBITS + (LED_DLEN * (n))) + +// Size of data buffers & NV memory, given number of LEDs per chan +#define TX_BUFF_LEN(n) (LED_TX_OSET(n) + LED_POSTBITS) +#define TX_BUFF_SIZE(n) (TX_BUFF_LEN(n) * sizeof(TXDATA_T)) +#define VC_MEM_SIZE (PAGE_SIZE + TX_BUFF_SIZE(CHAN_MAXLEDS)) + +/* Global */ +MEM_MAP vc_mem; +TXDATA_T *txdata; +TXDATA_T tx_buffer[TX_BUFF_LEN(CHAN_MAXLEDS)]; + +void swap_bytes(); + +void leddriver_setup() { + gpio_setup(); + videocore_setup(&vc_mem, VC_MEM_SIZE); + smi_setup(LED_NCHANS, SMI_TIMING, &vc_mem, TX_BUFF_LEN(CHAN_MAXLEDS), &txdata); +} + +void leddriver_close() { + printf("Closing\n"); + videocore_close(&vc_mem); + smi_close(LED_NCHANS); + gpio_close(); +} + +void set_color(uint32_t rgb, int index) { + int msk; + TXDATA_T *txd = &(tx_buffer[LED_TX_OSET(index)]); + + // For each bit of the 24-bit RGB values.. + for (size_t n = 0; n < LED_NBITS; n++) { + // Mask to convert RGB to GRB, M.S bit first + msk = n == 0 ? 0x800000 : n == 8 ? 0x8000 : n == 16 ? 0x80 : msk >> 1; + // 1st byte or word is a high pulse on all lines + txd[0] = (TXDATA_T)0xffff; + // 2nd has high or low bits from data + // 3rd is a low pulse + txd[1] = txd[2] = 0; + if (rgb & msk) { + txd[1] = (TXDATA_T)0xffff; + } + txd += BIT_NPULSES; + } +} + +// Set Tx data for 8 or 16 chans, 1 LED per chan, given 1 RGB val per chan +// Logic 1 is 0.8us high, 0.4 us low, logic 0 is 0.4us high, 0.8us low +void rgb_txdata(int *rgbs, int index) { + int i, n, msk; + TXDATA_T *txd = &(tx_buffer[LED_TX_OSET(index)]); + + // For each bit of the 24-bit RGB values.. + for (n = 0; n < LED_NBITS; n++) { + // Mask to convert RGB to GRB, M.S bit first + msk = n == 0 ? 0x800000 : n == 8 ? 0x8000 : n == 16 ? 0x80 : msk >> 1; + // 1st byte or word is a high pulse on all lines + txd[0] = (TXDATA_T)0xffff; + // 2nd has high or low bits from data + // 3rd is a low pulse + txd[1] = txd[2] = 0; + for (i = 0; i < LED_NCHANS; i++) { + if (rgbs[i] & msk) + txd[1] |= (1 << i); + } + txd += BIT_NPULSES; + } +} + +void leddriver_refresh() { +#if LED_NCHANS <= 8 + swap_bytes(); +#endif + + while (dma_active(DMA_CHAN_A)) { + usleep(10); + } + + memcpy(txdata, tx_buffer, TX_BUFF_SIZE(CHAN_MAXLEDS)); + enable_dma(DMA_CHAN_A); + start_smi(&vc_mem); + usleep(10); +} + +// Swap adjacent bytes in transmit data +void swap_bytes() { + uint16_t *wp = (uint16_t *)tx_buffer; + int len = TX_BUFF_SIZE(CHAN_MAXLEDS); + + len = (len + 1) / 2; + while (len-- > 0) { + *wp = __builtin_bswap16(*wp); + wp++; + } +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/leddriver/rpi_leddriver.h b/RpiLedBars/src/drivers/leddriver/rpi_leddriver.h new file mode 100644 index 0000000..68e7a19 --- /dev/null +++ b/RpiLedBars/src/drivers/leddriver/rpi_leddriver.h @@ -0,0 +1,19 @@ +#if !defined(__RPI_LEDDRIVER_H__) +#define __RPI_LEDDRIVER_H__ + +#include + +#define CHAN_MAXLEDS 6 * 60 // Maximum number of LEDs per channel +#define LED_NCHANS 8 // Number of LED channels (8 or 16) + +void leddriver_setup(); + +void leddriver_close(); + +void set_color(uint32_t rgb, int index); + +void rgb_txdata(int *rgbs, int index); + +void leddriver_refresh(); + +#endif // __RPI_LEDDRIVER_H__ \ No newline at end of file diff --git a/RpiLedBars/src/rpi_selector.c b/RpiLedBars/src/drivers/selector/rpi_selector.c similarity index 100% rename from RpiLedBars/src/rpi_selector.c rename to RpiLedBars/src/drivers/selector/rpi_selector.c diff --git a/RpiLedBars/src/rpi_selector.h b/RpiLedBars/src/drivers/selector/rpi_selector.h similarity index 100% rename from RpiLedBars/src/rpi_selector.h rename to RpiLedBars/src/drivers/selector/rpi_selector.h diff --git a/RpiLedBars/src/drivers/smi/rpi_smi.c b/RpiLedBars/src/drivers/smi/rpi_smi.c new file mode 100644 index 0000000..c6ed788 --- /dev/null +++ b/RpiLedBars/src/drivers/smi/rpi_smi.c @@ -0,0 +1,223 @@ +#include "rpi_smi.h" + +#include + +#include "../dma/rpi_dma.h" +#include "../gpio/rpi_gpio.h" + +// GPIO first pin +#define SMI_SD0_PIN 8 + +// Data widths +#define SMI_8_BITS 0 +#define SMI_16_BITS 1 +#define SMI_18_BITS 2 +#define SMI_9_BITS 3 + +// Clock registers and values +#define CLK_BASE (PHYS_REG_BASE + 0x101000) +// #define CLK_PWM_CTL 0xa0 +// #define CLK_PWM_DIV 0xa4 +#define CLK_SMI_CTL 0xb0 +#define CLK_SMI_DIV 0xb4 +#define CLK_PASSWD 0x5a000000 +#define PWM_CLOCK_ID 0xa + +// DMA request threshold +#define REQUEST_THRESH 2 + +// Register definitions +#define SMI_BASE (PHYS_REG_BASE + 0x600000) +#define SMI_CS 0x00 // Control & status +#define SMI_L 0x04 // Transfer length +#define SMI_A 0x08 // Address +#define SMI_D 0x0c // Data +#define SMI_DSR0 0x10 // Read settings device 0 +#define SMI_DSW0 0x14 // Write settings device 0 +#define SMI_DSR1 0x18 // Read settings device 1 +#define SMI_DSW1 0x1c // Write settings device 1 +#define SMI_DSR2 0x20 // Read settings device 2 +#define SMI_DSW2 0x24 // Write settings device 2 +#define SMI_DSR3 0x28 // Read settings device 3 +#define SMI_DSW3 0x2c // Write settings device 3 +#define SMI_DMC 0x30 // DMA control +#define SMI_DCS 0x34 // Direct control/status +#define SMI_DCA 0x38 // Direct address +#define SMI_DCD 0x3c // Direct data +#define SMI_FD 0x40 // FIFO debug +#define SMI_REGLEN (SMI_FD * 4) + +// Union of 32-bit value with register bitfields +#define REG_DEF(name, fields) \ + typedef union { \ + struct { \ + volatile uint32_t fields; \ + }; \ + volatile uint32_t value; \ + } name + +// Control and status register +#define SMI_CS_FIELDS \ + enable: \ + 1, done : 1, active : 1, start : 1, clear : 1, write : 1, _x1 : 2, teen : 1, intd : 1, intt : 1, \ + intr : 1, pvmode : 1, seterr : 1, pxldat : 1, edreq : 1, _x2 : 8, _x3 : 1, aferr : 1, \ + txw : 1, rxr : 1, txd : 1, rxd : 1, txe : 1, rxf : 1 +REG_DEF(SMI_CS_REG, SMI_CS_FIELDS); + +// Data length register +#define SMI_L_FIELDS \ + len: \ + 32 +REG_DEF(SMI_L_REG, SMI_L_FIELDS); + +// Address & device number +#define SMI_A_FIELDS \ + addr: \ + 6, _x1 : 2, dev : 2 +REG_DEF(SMI_A_REG, SMI_A_FIELDS); + +// Data FIFO +#define SMI_D_FIELDS \ + data: \ + 32 +REG_DEF(SMI_D_REG, SMI_D_FIELDS); + +// DMA control register +#define SMI_DMC_FIELDS \ + reqw: \ + 6, reqr : 6, panicw : 6, panicr : 6, dmap : 1, _x1 : 3, dmaen : 1 +REG_DEF(SMI_DMC_REG, SMI_DMC_FIELDS); + +// Device settings: read (1 of 4) +#define SMI_DSR_FIELDS \ + rstrobe: \ + 7, rdreq : 1, rpace : 7, rpaceall : 1, rhold : 6, fsetup : 1, mode68 : 1, rsetup : 6, rwidth : 2 +REG_DEF(SMI_DSR_REG, SMI_DSR_FIELDS); + +// Device settings: write (1 of 4) +#define SMI_DSW_FIELDS \ + wstrobe: \ + 7, wdreq : 1, wpace : 7, wpaceall : 1, whold : 6, wswap : 1, wformat : 1, wsetup : 6, wwidth : 2 +REG_DEF(SMI_DSW_REG, SMI_DSW_FIELDS); + +// Direct control register +#define SMI_DCS_FIELDS \ + enable: \ + 1, start : 1, done : 1, write : 1 +REG_DEF(SMI_DCS_REG, SMI_DCS_FIELDS); + +// Direct control address & device number +#define SMI_DCA_FIELDS \ + addr: \ + 6, _x1 : 2, dev : 2 +REG_DEF(SMI_DCA_REG, SMI_DCA_FIELDS); + +// Direct control data +#define SMI_DCD_FIELDS \ + data: \ + 32 +REG_DEF(SMI_DCD_REG, SMI_DCD_FIELDS); + +// Debug register +#define SMI_FLVL_FIELDS \ + fcnt: \ + 6, _x1 : 2, flvl : 6 +REG_DEF(SMI_FLVL_REG, SMI_FLVL_FIELDS); + +// Pointers to SMI registers +volatile SMI_CS_REG *smi_cs; +volatile SMI_L_REG *smi_l; +volatile SMI_A_REG *smi_a; +volatile SMI_D_REG *smi_d; +volatile SMI_DMC_REG *smi_dmc; +volatile SMI_DSR_REG *smi_dsr; +volatile SMI_DSW_REG *smi_dsw; +volatile SMI_DCS_REG *smi_dcs; +volatile SMI_DCA_REG *smi_dca; +volatile SMI_DCD_REG *smi_dcd; + +MEM_MAP smi_regs, clk_regs; + +void setup_smi_dma(MEM_MAP *mp, int nsamp, uint8_t **txdata, int len); + +void smi_setup(int channels, int ns, int setup, int strobe, int hold, MEM_MAP *mp, int nsamp, + uint8_t **txdata) { + map_periph(&smi_regs, (void *)SMI_BASE, PAGE_SIZE); + map_periph(&clk_regs, (void *)CLK_BASE, PAGE_SIZE); + + int width = channels > 8 ? SMI_16_BITS : SMI_8_BITS; + int i, divi = ns / 2; + + smi_cs = (SMI_CS_REG *)REG32(smi_regs, SMI_CS); + smi_l = (SMI_L_REG *)REG32(smi_regs, SMI_L); + smi_a = (SMI_A_REG *)REG32(smi_regs, SMI_A); + smi_d = (SMI_D_REG *)REG32(smi_regs, SMI_D); + smi_dmc = (SMI_DMC_REG *)REG32(smi_regs, SMI_DMC); + smi_dsr = (SMI_DSR_REG *)REG32(smi_regs, SMI_DSR0); + smi_dsw = (SMI_DSW_REG *)REG32(smi_regs, SMI_DSW0); + smi_dcs = (SMI_DCS_REG *)REG32(smi_regs, SMI_DCS); + smi_dca = (SMI_DCA_REG *)REG32(smi_regs, SMI_DCA); + smi_dcd = (SMI_DCD_REG *)REG32(smi_regs, SMI_DCD); + smi_cs->value = smi_l->value = smi_a->value = 0; + smi_dsr->value = smi_dsw->value = smi_dcs->value = smi_dca->value = 0; + if (*REG32(clk_regs, CLK_SMI_DIV) != divi << 12) { + *REG32(clk_regs, CLK_SMI_CTL) = CLK_PASSWD | (1 << 5); + usleep(10); + while (*REG32(clk_regs, CLK_SMI_CTL) & (1 << 7)) + ; + usleep(10); + *REG32(clk_regs, CLK_SMI_DIV) = CLK_PASSWD | (divi << 12); + usleep(10); + *REG32(clk_regs, CLK_SMI_CTL) = CLK_PASSWD | 6 | (1 << 4); + usleep(10); + while ((*REG32(clk_regs, CLK_SMI_CTL) & (1 << 7)) == 0) + ; + usleep(100); + } + if (smi_cs->seterr) + smi_cs->seterr = 1; + smi_dsr->rsetup = smi_dsw->wsetup = setup; + smi_dsr->rstrobe = smi_dsw->wstrobe = strobe; + smi_dsr->rhold = smi_dsw->whold = hold; + smi_dmc->panicr = smi_dmc->panicw = 8; + smi_dmc->reqr = smi_dmc->reqw = REQUEST_THRESH; + smi_dsr->rwidth = smi_dsw->wwidth = width; + for (i = 0; i < channels; i++) + gpio_mode(SMI_SD0_PIN + i, GPIO_ALT1); + + setup_smi_dma(mp, nsamp, txdata, width + 1); +} + +void smi_close(int channels) { + for (size_t i = 0; i < channels; ++i) + gpio_mode(SMI_SD0_PIN + i, GPIO_IN); + if (smi_regs.virt) { + *REG32(smi_regs, SMI_CS) = 0; + } + stop_dma(DMA_CHAN_A); + unmap_periph_mem(&clk_regs); + unmap_periph_mem(&smi_regs); + dma_close(); +} + +// Start SMI DMA transfers +void start_smi(MEM_MAP *mp) { + DMA_CB *cbs = mp->virt; + + start_dma(mp, DMA_CHAN_A, &cbs[0], 0); + smi_cs->start = 1; +} + +// private + +// Set up SMI transfers using DMA +void setup_smi_dma(MEM_MAP *mp, int nsamp, uint8_t **txdata, int len) { + smi_dmc->dmaen = 1; + smi_cs->enable = 1; + smi_cs->clear = 1; + smi_cs->pxldat = 1; + smi_l->len = nsamp * len; + smi_cs->write = 1; + + dma_setup(mp, DMA_CHAN_A, nsamp, txdata, len, REG_BUS_ADDR(smi_regs, SMI_D)); +} \ No newline at end of file diff --git a/RpiLedBars/src/drivers/smi/rpi_smi.h b/RpiLedBars/src/drivers/smi/rpi_smi.h new file mode 100644 index 0000000..79ea29d --- /dev/null +++ b/RpiLedBars/src/drivers/smi/rpi_smi.h @@ -0,0 +1,14 @@ +#if !defined(__RPI_SMI_H__) +#define __RPI_SMI_H__ + +#include "../common.h" +#include + +void smi_setup(int channels, int ns, int setup, int strobe, int hold, MEM_MAP *mp, int nsamp, + uint8_t **txdata); + +void smi_close(int channels); + +void start_smi(MEM_MAP *mp); + +#endif // __RPI_SMI_H__ \ No newline at end of file diff --git a/RpiLedBars/src/main.c b/RpiLedBars/src/main.c index 3a96531..978686c 100644 --- a/RpiLedBars/src/main.c +++ b/RpiLedBars/src/main.c @@ -1,147 +1,133 @@ #include +#include #include #include #include #include #include -#ifdef _WIN32 -#include -#else +#include #include -#endif -#include "rpi_artnet.h" -#include "rpi_pixleds.h" -#include "rpi_smi_defs.h" +#include "drivers/leddriver/rpi_leddriver.h" +#include "drivers/selector/rpi_selector.h" -#include "rpi_selector.h" +#include "rpi_midi_controller.h" +#include "tasks/artnet/rpi_artnet.h" +#include "tasks/cava/rpi_cava.h" /* Command-line parameters */ bool IsTestMode = false; int chanLedCount = 0; -/* Global */ -MEM_MAP vc_mem; -TXDATA_T *txdata; +pthread_t *bgTasks[4] = {NULL}; void parseCommandLineArgs(int argc, char const *argv[]); +void terminate(int sig); + void execute_test_mode(); void execute_artnet_mode(); void execute_autonomous_mode(); -void execute_autonomous2_mode(); +void execute_manual_mode(); + +void adjust_loop(struct timespec const *loopStart); int main(int argc, char const *argv[]) { - int previousMode = 0; + int previousMode = -1; // setup parseCommandLineArgs(argc, argv); signal(SIGINT, terminate); + struct sched_param sp; + sp.sched_priority = 32; + if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp)) { + fprintf(stderr, "WARNING: Failed to set stepper thread to real-time priority\n"); + } + setup_selector(); - // setup led - map_devices(); - init_smi(LED_NCHANS > 8 ? SMI_16_BITS : SMI_8_BITS, SMI_TIMING); - map_uncached_mem(&vc_mem, VC_MEM_SIZE); + // // setup led + // map_devices(); + // init_smi(LED_NCHANS, SMI_TIMING); + // map_uncached_mem(&vc_mem, VC_MEM_SIZE); - setup_smi_dma(&vc_mem, TX_BUFF_LEN(chanLedCount), &txdata); + // setup_smi_dma(&vc_mem, TX_BUFF_LEN(chanLedCount), &txdata); + leddriver_setup(); + + setup_midi_controller(); artnet_init(); + setup_cava(); // loop while (1) { + struct timespec loopStart; + clock_gettime(CLOCK_MONOTONIC, &loopStart); int mode = get_selector_position(); + execute_midi_controller(); - if (mode != previousMode) { + if (mode != -1) { + if (mode != previousMode) { #if defined(_DEBUG) - print_selector(); + printf("swtching to mode : %d\n", mode); #endif - } + /* stop previous bg task */ + switch (previousMode) { + case 1: + stop_artnet_bg_worker(); + break; + case 2: + stop_cava_bg_worker(); + break; + default: + break; + } - switch (mode) { - case 0: - // mode test - execute_test_mode(); - break; - case 1: - // artnet mode - execute_artnet_mode(); - break; - case 2: - execute_autonomous_mode(); - break; - case 3: - // autonomous mode 2 - execute_autonomous2_mode(); - break; + /* start new bg task */ + switch (mode) { + case 1: + start_artnet_bg_worker(); + break; + case 2: + start_cava_bg_worker(); + break; + default: + break; + } + } else { + switch (mode) { + case 0: + // mode test + execute_test_mode(); + break; + case 1: + // artnet mode + execute_artnet_mode(); + break; + case 2: + execute_autonomous_mode(); + break; + case 3: + // manual mode + execute_manual_mode(); + break; - default: - printf("error in selector \n"); - break; + default: + if (mode != previousMode) { + fprintf(stderr, "Error in selector\n"); + } + break; + } + } + previousMode = mode; } - previousMode = mode; + adjust_loop(&loopStart); } - - // printf("%s %u LED%s per channel, %u channels\n", IsTestMode ? "Testing" : "Setting", - // chanLedCount, - // chanLedCount == 1 ? "" : "s", LED_NCHANS); - - // for (size_t colorIndex = 0; colorIndex < 3; ++colorIndex) { - // for (size_t i = 0; i < chanLedCount; ++i) { - // set_color(on_rgbs[colorIndex], &tx_buffer[LED_TX_OSET(i)]); - // } - - // #if LED_NCHANS <= 8 - // swap_bytes(tx_buffer, TX_BUFF_SIZE(chanLedCount)); - // #endif - - // memcpy(txdata, tx_buffer, TX_BUFF_SIZE(chanLedCount)); - // start_smi(&vc_mem); - // usleep(CHASE_MSEC * 1000); - // sleep(1); - // } - - // artnet_init(); - - // // loops - // if (IsTestMode) { - // while (1) { - // test_leds(); - // sleep(3); - // } - // } else { - // while (1) { - // artDmx_t *artDmx; - // if (artnet_read(&artDmx) == OpDmx) { - // uint16_t dmxLength = (artDmx->lengthHi << 8) | artDmx->lengthLo; - // unsigned int ledCountInFrame = dmxLength / 3; - // uint16_t maxBound = ledCountInFrame < chanLedCount ? ledCountInFrame : chanLedCount; - // unsigned int universe = artDmx->subUni & (LED_NCHANS - 1); - // for (size_t i = 0; i < maxBound; ++i) { - // uint8_t *rgb = artDmx->data + (i * 3); - // rgb_data[i][universe] = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - // rgb_txdata(rgb_data[i], &tx_buffer[LED_TX_OSET(i)]); - // } - - // #if LED_NCHANS <= 8 - // swap_bytes(tx_buffer, TX_BUFF_SIZE(chanLedCount)); - // #endif - - // memcpy(txdata, tx_buffer, TX_BUFF_SIZE(chanLedCount)); - // // enable_dma(DMA_CHAN); - // start_smi(&vc_mem); - // // usleep(10); - // // while (dma_active(DMA_CHAN)) - // // usleep(10); - // } - // } - // } - // terminate(0); } void parseCommandLineArgs(int argc, char const *argv[]) { @@ -170,73 +156,105 @@ void parseCommandLineArgs(int argc, char const *argv[]) { } } } + +void terminate(int sig) { + leddriver_close(); + exit(0); +} + // Pointer to uncached Tx data buffer -TXDATA_T tx_buffer[TX_BUFF_LEN(CHAN_MAXLEDS)]; // Tx buffer for assembling data +// TXDATA_T tx_buffer[TX_BUFF_LEN(CHAN_MAXLEDS)]; // Tx buffer for assembling data void execute_test_mode() { // RGB values for test mode (1 value for each of 16 channels) uint32_t on_rgbs[] = {0xef0000, 0x00ef00, 0x0000ef, 0xefef00, 0xef00ef, 0x00efef, 0xefefef}; uint32_t off_rgbs = 0x000000; - static int i = 0, offset = 0, ledIndex = 0; + static int i = 0, offset = 0; - if (ledIndex < chanLedCount) { - set_color(ledIndex <= offset % chanLedCount ? on_rgbs[i] : off_rgbs, - &tx_buffer[LED_TX_OSET(ledIndex)]); - ++ledIndex; + for (size_t ledIndex = 0; ledIndex < chanLedCount; ++ledIndex) { + set_color(ledIndex <= offset % chanLedCount ? on_rgbs[i] : off_rgbs, ledIndex); + } + leddriver_refresh(); + + if (offset < chanLedCount) { + ++offset; } else { - ledIndex = 0; - -#if LED_NCHANS <= 8 - swap_bytes(tx_buffer, TX_BUFF_SIZE(chanLedCount)); -#endif - - memcpy(txdata, tx_buffer, TX_BUFF_SIZE(chanLedCount)); - start_smi(&vc_mem); - usleep(CHASE_MSEC * 1000); - if (offset < chanLedCount) { - ++offset; + offset = 0; + if (i < 7) { + ++i; } else { - offset = 0; - if (i < 7) { - ++i; - } else { - i = 0; + i = 0; + } + } +} + +// RGB data +int rgb_data[CHAN_MAXLEDS][LED_NCHANS]; + +void execute_artnet_mode() { + uint8_t *dmxData; + + for (size_t ledBar = 0; ledBar < LED_NCHANS; ledBar++) { + if (artnet_get_dmx_data(ledBar, &dmxData) == 0) { + for (size_t i = 0; i < chanLedCount; ++i) { + uint8_t *rgb = dmxData + (i * 3); + rgb_data[i][ledBar] = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + rgb_txdata(rgb_data[i], i); } } } + + leddriver_refresh(); } -void execute_artnet_mode() { - artDmx_t *artDmx; - // RGB data - int rgb_data[CHAN_MAXLEDS][LED_NCHANS]; +void execute_autonomous_mode() { + int ret; + uint16_t *buffer; - if (artnet_read(&artDmx) == OpDmx) { - uint16_t dmxLength = (artDmx->lengthHi << 8) | artDmx->lengthLo; - unsigned int ledCountInFrame = dmxLength / 3; - uint16_t maxBound = ledCountInFrame < chanLedCount ? ledCountInFrame : chanLedCount; - unsigned int universe = artDmx->subUni & (LED_NCHANS - 1); - for (size_t i = 0; i < maxBound; ++i) { - uint8_t *rgb = artDmx->data + (i * 3); - rgb_data[i][universe] = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; - rgb_txdata(rgb_data[i], &tx_buffer[LED_TX_OSET(i)]); + if ((ret = get_cava_buffer(&buffer)) == 0) { + for (size_t ledBarIndex = 0; ledBarIndex < 4; ++ledBarIndex) { + uint16_t barMax = 0; + for (size_t bar = 0; bar < 20 / 4; ++bar) { + unsigned barIndex = ledBarIndex * 20 / 4 + bar; + if (barMax < buffer[barIndex]) { + barMax = buffer[barIndex]; + } + } + unsigned ledToLight = barMax * chanLedCount / UINT16_MAX; + + for (size_t i = 0; i < ledToLight; ++i) { + rgb_data[i][ledBarIndex] = 0xff0000; + rgb_txdata(rgb_data[i], i); + } + for (size_t i = ledToLight; i < chanLedCount; ++i) { + rgb_data[i][ledBarIndex] = 0x000000; + rgb_txdata(rgb_data[i], i); + } } -#if LED_NCHANS <= 8 - swap_bytes(tx_buffer, TX_BUFF_SIZE(chanLedCount)); -#endif - - memcpy(txdata, tx_buffer, TX_BUFF_SIZE(chanLedCount)); - enable_dma(DMA_CHAN); - start_smi(&vc_mem); - usleep(10); - while (dma_active(DMA_CHAN)) - usleep(10); + leddriver_refresh(); } } -void execute_autonomous_mode() {} +void execute_manual_mode() {} -void execute_autonomous2_mode() {} \ No newline at end of file +void adjust_loop(struct timespec const *loopStart) { + struct timespec loopEnd; + long elapsedTimeUs, remainingTimeUs; + + clock_gettime(CLOCK_MONOTONIC, &loopEnd); + elapsedTimeUs = (loopEnd.tv_nsec - loopStart->tv_nsec) / 1E3 + + ((unsigned)(loopEnd.tv_sec - loopStart->tv_sec)) * 1E6; + remainingTimeUs = 16000 - elapsedTimeUs; + + if (remainingTimeUs >= 0) { + // printf("loop remaining time %ld\n", remainingTimeUs); + usleep(remainingTimeUs); + } else { + printf("loop overlap by %06ldus\n", -remainingTimeUs); + printf("loop start %ld.%09lds\n", loopStart->tv_sec, loopStart->tv_nsec); + printf("loop end %ld.%09lds\n", loopEnd.tv_sec, loopEnd.tv_nsec); + } +} \ No newline at end of file diff --git a/RpiLedBars/src/rpi_artnet.c b/RpiLedBars/src/rpi_artnet.c deleted file mode 100644 index 889e00f..0000000 --- a/RpiLedBars/src/rpi_artnet.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "rpi_artnet.h" - -#include -#include -#include -#include - -#include "rpi_artnet_utils.h" - -int udpSocket = -1; -char buffer[1024]; - -void sendPollReply(struct sockaddr_in srcAddr); - -void artnet_init() { - struct sockaddr_in serverAddr; - - /*Create UDP socket*/ - udpSocket = socket(PF_INET, SOCK_DGRAM, 0); - if (udpSocket < 0) { - perror("Opening socket failed"); - } - - /* Configure settings in address struct */ - serverAddr.sin_family = AF_INET; - serverAddr.sin_port = htons(ARTNET_PORT); - serverAddr.sin_addr.s_addr = inet_addr("0.0.0.0"); - memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero)); - - /* Bind socket with address struct */ - bind(udpSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); -} - -int artnet_read(artDmx_t **artDmx) { - struct sockaddr_in srcAddr; - socklen_t srcLen = sizeof(srcAddr); - ssize_t bufferLen = - recvfrom(udpSocket, buffer, ARTNET_MAX_BUFFER, 0, (struct sockaddr *)&srcAddr, &srcLen); - - if (bufferLen <= ARTNET_MAX_BUFFER && bufferLen > sizeof(artnetHeader_t)) { - artnetHeader_t *artnetHeader = (artnetHeader_t *)buffer; - if (memcmp(artnetHeader->id, ARTNET_ID, sizeof(ARTNET_ID)) == 0) { - switch (artnetHeader->opCode) { - case OpDmx: - if (bufferLen >= 20) { - *artDmx = (artDmx_t *)buffer; - } - break; - case OpPoll: - sendPollReply(srcAddr); - break; - default: - break; - } - } - - return artnetHeader->opCode; - } - return -1; -} - -void sendPollReply(struct sockaddr_in srcAddr) { - /* Configure settings in address struct */ - srcAddr.sin_family = AF_INET; - srcAddr.sin_port = htons(ARTNET_PORT); - memset(srcAddr.sin_zero, '\0', sizeof(srcAddr.sin_zero)); - - sendto(udpSocket, (uint8_t *)&artPollReply, sizeof(artPollReply_t), 0, - (struct sockaddr *)&srcAddr, sizeof(srcAddr)); -} \ No newline at end of file diff --git a/RpiLedBars/src/rpi_midi_controller.c b/RpiLedBars/src/rpi_midi_controller.c new file mode 100644 index 0000000..929efcf --- /dev/null +++ b/RpiLedBars/src/rpi_midi_controller.c @@ -0,0 +1,95 @@ +#include "rpi_midi_controller.h" + +#include + +static snd_seq_t *seq_handle; +static int sys_port; +static int in_port; + +void subscribe_system_port(); + +void subscribe_midi_controller(snd_seq_addr_t controller); + +void handle_system_port_events(snd_seq_event_t *ev); + +void handle_in_port_events(snd_seq_event_t *ev); + +void setup_midi_controller() { + if (snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_INPUT, SND_SEQ_NONBLOCK) != 0) { + SNDERR("snd_seq_open"); + } + + if (snd_seq_set_client_name(seq_handle, "Midi Listener") != 0) { + SNDERR("snd_seq_set_client_name"); + } + + sys_port = snd_seq_create_simple_port(seq_handle, "listen:in", + SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_NO_EXPORT, + SND_SEQ_PORT_TYPE_APPLICATION); + + if (sys_port < 0) { + SNDERR("snd_seq_create_simple_port"); + } + + subscribe_system_port(); + + in_port = snd_seq_create_simple_port(seq_handle, "listen:in", + SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, + SND_SEQ_PORT_TYPE_APPLICATION); + + if (in_port < 0) { + SNDERR("snd_seq_create_simple_port"); + } + + snd_seq_addr_t controller = {.client = 24, .port = 0}; + subscribe_midi_controller(controller); +} + +void execute_midi_controller() { + snd_seq_event_t *ev = NULL; + int ret; + while ((ret = snd_seq_event_input(seq_handle, &ev)) > 0) { + if (ev->dest.port == sys_port) { + handle_system_port_events(ev); + } else if (ev->dest.port == in_port) { + printf("ev %02d : %#010x - %#010x - %#010x\n", ev->type, ev->data.raw32.d[0], + ev->data.raw32.d[1], ev->data.raw32.d[2]); + } else { + fprintf(stderr, "unkonwn midi dest port\n"); + } + } + if (ret < 0 && ret != -EAGAIN) { + SNDERR("snd_seq_event_input"); + } +} + +void close_midi_controller() {} + +void subscribe_system_port() { + snd_seq_addr_t sender = {.client = 0, .port = SND_SEQ_PORT_SYSTEM_ANNOUNCE}; + snd_seq_connect_from(seq_handle, sys_port, sender.client, sender.port); +} + +void subscribe_midi_controller(snd_seq_addr_t controller) { + snd_seq_connect_from(seq_handle, in_port, controller.client, controller.port); +} + +void handle_system_port_events(snd_seq_event_t *ev) { + if (ev->type == SND_SEQ_EVENT_PORT_START) { + snd_seq_addr_t *newport = (snd_seq_addr_t *)&ev->data; + if (newport->client != snd_seq_client_id(seq_handle)) { + fprintf(stdout, "New port %d:%d\n", newport->client, newport->port); + subscribe_midi_controller(*newport); + } + } +} + +void handle_in_port_events(snd_seq_event_t *ev) { + if (ev->type == SND_SEQ_EVENT_PORT_START) { + snd_seq_addr_t *newport = (snd_seq_addr_t *)&ev->data; + if (newport->client != snd_seq_client_id(seq_handle)) { + fprintf(stdout, "New port %d:%d\n", newport->client, newport->port); + subscribe_midi_controller(*newport); + } + } +} diff --git a/RpiLedBars/src/rpi_midi_controller.h b/RpiLedBars/src/rpi_midi_controller.h new file mode 100644 index 0000000..73b6066 --- /dev/null +++ b/RpiLedBars/src/rpi_midi_controller.h @@ -0,0 +1,10 @@ +#if !defined(__RPI_MIDI_CONTROLLER_H__) +#define __RPI_MIDI_CONTROLLER_H__ + +void setup_midi_controller(); + +void execute_midi_controller(); + +void close_midi_controller(); + +#endif /* __RPI_MIDI_CONTROLLER_H__ */ \ No newline at end of file diff --git a/RpiLedBars/src/rpi_param.c b/RpiLedBars/src/rpi_param.c new file mode 100644 index 0000000..30f0937 --- /dev/null +++ b/RpiLedBars/src/rpi_param.c @@ -0,0 +1 @@ +#include "rpi_param.h" diff --git a/RpiLedBars/src/rpi_param.h b/RpiLedBars/src/rpi_param.h new file mode 100644 index 0000000..8b0cc72 --- /dev/null +++ b/RpiLedBars/src/rpi_param.h @@ -0,0 +1,4 @@ +#if !defined(__RPI_PARAM_H__) +#define __RPI_PARAM_H__ + +#endif /* __RPI_PARAM_H__ */ \ No newline at end of file diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet.c b/RpiLedBars/src/tasks/artnet/rpi_artnet.c new file mode 100644 index 0000000..49de7ad --- /dev/null +++ b/RpiLedBars/src/tasks/artnet/rpi_artnet.c @@ -0,0 +1,139 @@ +#include "rpi_artnet.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rpi_artnet_utils.h" + +int udpSocket = -1; +char buffer[1024]; +bool isUdpListenerRunning = false; +pthread_t udpListener; +uint8_t artDmxBufferArray[16][512]; + +static void *artnet_udp_handler(void *arg); + +void artnet_send_poll_reply(struct sockaddr_in srcAddr); + +void artnet_init() {} + +void start_artnet_bg_worker() { + isUdpListenerRunning = true; + + if (pthread_create(&udpListener, NULL, artnet_udp_handler, NULL) < 0) { + perror("pthread_create"); + } +} + +void stop_artnet_bg_worker() { + isUdpListenerRunning = false; + + if (pthread_join(udpListener, NULL) != 0) { + perror("pthread_join"); + } +} + +int artnet_get_dmx_data(unsigned int univerve, uint8_t **dmxData) { + if (univerve > 8) { + fprintf(stderr, "Universe %d out of bounds %d\n", univerve, 16); + *dmxData = NULL; + return -1; + } + *dmxData = artDmxBufferArray[univerve]; + return 0; +} + +static void *artnet_udp_handler(void *arg) { + struct sockaddr_in serverAddr; + struct pollfd fds[1]; + int timeoutMs; + int ret; + int flags; + + /* Create UDP socket */ + udpSocket = socket(PF_INET, SOCK_DGRAM, 0); + if (udpSocket < 0) { + perror("Opening socket failed"); + } + + /* Set non-blocking socket */ + flags = fcntl(udpSocket, F_GETFL, 0); + fcntl(udpSocket, F_SETFL, flags | O_NONBLOCK); + + /* pollfd structure and timeout */ + memset(fds, 0, sizeof(fds)); + fds[0].fd = udpSocket; + fds[0].events = POLLIN; + timeoutMs = 10; + + /* Configure settings in address struct */ + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(ARTNET_PORT); + serverAddr.sin_addr.s_addr = inet_addr("0.0.0.0"); + memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero)); + + /* Bind socket with address struct */ + bind(udpSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); + + struct sockaddr_in srcAddr; + socklen_t srcLen = sizeof(srcAddr); + + while (isUdpListenerRunning) { + + if ((ret = poll(fds, 1, timeoutMs)) == 1) { + ssize_t bufferLen = + recvfrom(udpSocket, buffer, ARTNET_MAX_BUFFER, 0, (struct sockaddr *)&srcAddr, &srcLen); + + if (bufferLen <= ARTNET_MAX_BUFFER && bufferLen > sizeof(artnetHeader_t)) { + artnetHeader_t *artnetHeader = (artnetHeader_t *)buffer; + + if (memcmp(artnetHeader->id, ARTNET_ID, sizeof(ARTNET_ID)) == 0) { + switch (artnetHeader->opCode) { + case OpDmx: + if (bufferLen >= 20) { + artDmx_t *artDmx = (artDmx_t *)buffer; + uint16_t dmxLength = (artDmx->lengthHi << 8) | artDmx->lengthLo; + uint8_t *artDmxBuffer = artDmxBufferArray[artDmx->subUni & 0x00ff]; + if (dmxLength <= 512) { + // store for later use + memcpy(artDmxBuffer, artDmx->data, dmxLength); + } + } + break; + + case OpPoll: + artnet_send_poll_reply(srcAddr); + break; + + default: + break; + } + } + } + } else if (ret < 0) { + fprintf(stderr, "error polling %d: %s\n", udpSocket, strerror(errno)); + } + } + + close(udpSocket); + + return NULL; +} + +void artnet_send_poll_reply(struct sockaddr_in srcAddr) { + /* Configure settings in address struct */ + srcAddr.sin_family = AF_INET; + srcAddr.sin_port = htons(ARTNET_PORT); + memset(srcAddr.sin_zero, '\0', sizeof(srcAddr.sin_zero)); + + sendto(udpSocket, (uint8_t *)&artPollReply, sizeof(artPollReply_t), 0, + (struct sockaddr *)&srcAddr, sizeof(srcAddr)); +} \ No newline at end of file diff --git a/RpiLedBars/src/rpi_artnet.h b/RpiLedBars/src/tasks/artnet/rpi_artnet.h similarity index 51% rename from RpiLedBars/src/rpi_artnet.h rename to RpiLedBars/src/tasks/artnet/rpi_artnet.h index 1cf76ee..818e59f 100644 --- a/RpiLedBars/src/rpi_artnet.h +++ b/RpiLedBars/src/tasks/artnet/rpi_artnet.h @@ -5,6 +5,10 @@ void artnet_init(); -int artnet_read(artDmx_t **artDmx); +void start_artnet_bg_worker(); + +void stop_artnet_bg_worker(); + +int artnet_get_dmx_data(unsigned int univerve, uint8_t **dmxData); #endif // __RPI_ARTNET_H__ diff --git a/RpiLedBars/src/rpi_artnet_op_codes.h b/RpiLedBars/src/tasks/artnet/rpi_artnet_op_codes.h similarity index 100% rename from RpiLedBars/src/rpi_artnet_op_codes.h rename to RpiLedBars/src/tasks/artnet/rpi_artnet_op_codes.h diff --git a/RpiLedBars/src/rpi_artnet_packets.h b/RpiLedBars/src/tasks/artnet/rpi_artnet_packets.h similarity index 100% rename from RpiLedBars/src/rpi_artnet_packets.h rename to RpiLedBars/src/tasks/artnet/rpi_artnet_packets.h diff --git a/RpiLedBars/src/rpi_artnet_utils.h b/RpiLedBars/src/tasks/artnet/rpi_artnet_utils.h similarity index 100% rename from RpiLedBars/src/rpi_artnet_utils.h rename to RpiLedBars/src/tasks/artnet/rpi_artnet_utils.h diff --git a/RpiLedBars/src/tasks/cava/rpi_cava.c b/RpiLedBars/src/tasks/cava/rpi_cava.c new file mode 100644 index 0000000..4b823bb --- /dev/null +++ b/RpiLedBars/src/tasks/cava/rpi_cava.c @@ -0,0 +1,146 @@ +#include "rpi_cava.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +#define MAXLINECHAR 128 * (5 + 1) + 1 + +pid_t cavaPid; +bool isFifoReaderRunning = false; +pthread_t fifoReader; +int cavaFifo; +char lineBuffer[MAXLINECHAR]; +uint16_t buffer[128 + 2]; + +static void *fifo_to_buffer(void *arg); + +void setup_cava() { + if ((cavaPid = fork()) == -1) { + perror("fork"); + exit(1); + } + + if (cavaPid == 0) { + /* Child process*/ + pthread_setschedprio(pthread_self(), 30); + char *args[] = {"/usr/local/bin/cava", "-p", "/home/pi/LedBars/RpiLedBars/cava_config", NULL}; + + if (execv(args[0], args) != 0) { + perror("execv"); + } + + } else { + sleep(1); + } +} + +void close_cava() { + stop_cava_bg_worker(); + kill(cavaPid, SIGTERM); +} + +void start_cava_bg_worker() { + isFifoReaderRunning = true; + pthread_create(&fifoReader, NULL, fifo_to_buffer, NULL); +} + +void stop_cava_bg_worker() { + isFifoReaderRunning = false; + if (pthread_join(fifoReader, NULL) != 0) { + perror("pthread_join"); + } +} + +int get_cava_buffer(uint16_t **buffer_dst) { + *buffer_dst = buffer; + return 0; +} + +size_t valueIndex = 0, charOffset = 0; +char strValue[6] = "0\0"; +bool hasToBeDiscarded = false; + +static void *fifo_to_buffer(void *arg) { + struct pollfd fds[1]; + int timeoutMs; + int ret; + + if ((cavaFifo = open("/tmp/cava_output", O_RDONLY | O_NONBLOCK)) < 0) { + perror("open"); + close_cava(); + exit(1); + } + + memset(fds, 0, sizeof(fds)); + fds[0].fd = cavaFifo; + fds[0].events = POLLIN; + timeoutMs = 10; + + hasToBeDiscarded = true; + + while (isFifoReaderRunning) { + + if ((ret = poll(fds, 1, timeoutMs)) == 1) { + int nread; + nread = read(cavaFifo, lineBuffer, 128 + 1); + + if (nread >= 0) { + for (size_t i = 0; i < nread; ++i) { + char current = lineBuffer[i]; + + if (hasToBeDiscarded) { + if (current == '\n') { + charOffset = 0; + strValue[charOffset] = '\0'; + valueIndex = 0; + hasToBeDiscarded = false; + } + + } else { + if ('0' <= current && current <= '9') { + strValue[charOffset++] = current; + } else if (current == '\n' || current == ';') { + strValue[charOffset] = '\0'; + charOffset = 0; + buffer[valueIndex++] = atoi(strValue); + + if (current == '\n' || valueIndex > 129) { + valueIndex = 0; + + if (valueIndex > 129) { + fprintf(stderr, "Buffer overflow, \\n missed, discarding next\n"); + hasToBeDiscarded = true; + } + } + + } else { + fprintf(stderr, "Unexpected char %d [%c]\n", current, current); + } + } + } + } else { + if (errno != EAGAIN) { + perror("read"); + } + } + } else if (ret < 0) { + fprintf(stderr, "error polling %d: %s\n", cavaFifo, strerror(errno)); + } + } + + close(cavaFifo); + + return NULL; +} diff --git a/RpiLedBars/src/tasks/cava/rpi_cava.h b/RpiLedBars/src/tasks/cava/rpi_cava.h new file mode 100644 index 0000000..0aaf0cd --- /dev/null +++ b/RpiLedBars/src/tasks/cava/rpi_cava.h @@ -0,0 +1,16 @@ +#if !defined(__RPI_CAVA_H__) +#define __RPI_CAVA_H__ + +#include + +void setup_cava(); + +int get_cava_buffer(uint16_t **buffer_dst); + +void close_cava(); + +void start_cava_bg_worker(); + +void stop_cava_bg_worker(); + +#endif /* __RPI_CAVA_H__ */ \ No newline at end of file diff --git a/RpiLedBars/wget-log b/RpiLedBars/wget-log new file mode 100644 index 0000000..4779e59 --- /dev/null +++ b/RpiLedBars/wget-log @@ -0,0 +1,11 @@ +--2021-07-24 09:17:35-- https://forums.adafruit.com/download/file.php?id=49380 +Resolving forums.adafruit.com (forums.adafruit.com)... 34.200.112.132 +Connecting to forums.adafruit.com (forums.adafruit.com)|34.200.112.132|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 1510 (1.5K) [application/octet-stream] +Saving to: ‘file.php?id=49380’ + + file.php?id=49380 0%[ ] 0 --.-KB/s file.php?id=49380 100%[===================================================================================================================>] 1.47K --.-KB/s in 0s + +2021-07-24 09:17:36 (3.03 MB/s) - ‘file.php?id=49380’ saved [1510/1510] +