From a25a7aafc6a281ba8b3427d8b007cbc4350ec260 Mon Sep 17 00:00:00 2001 From: Max Winterstein Date: Fri, 8 Jan 2021 21:14:17 +0100 Subject: [PATCH] Add TooGoodToGo Bridge --- README.md | 3 ++ toogoodtogo-ha-mqtt-bridge/CHANGELOG.md | 4 ++ toogoodtogo-ha-mqtt-bridge/Dockerfile | 3 ++ toogoodtogo-ha-mqtt-bridge/Dockerfile-real | 23 +++++++++++ toogoodtogo-ha-mqtt-bridge/README.md | 8 ++++ toogoodtogo-ha-mqtt-bridge/config.json | 42 +++++++++++++++++++++ toogoodtogo-ha-mqtt-bridge/icon.png | Bin 0 -> 9483 bytes toogoodtogo-ha-mqtt-bridge/run.sh | 7 ++++ 8 files changed, 90 insertions(+) create mode 100644 toogoodtogo-ha-mqtt-bridge/CHANGELOG.md create mode 100644 toogoodtogo-ha-mqtt-bridge/Dockerfile create mode 100644 toogoodtogo-ha-mqtt-bridge/Dockerfile-real create mode 100644 toogoodtogo-ha-mqtt-bridge/README.md create mode 100644 toogoodtogo-ha-mqtt-bridge/config.json create mode 100644 toogoodtogo-ha-mqtt-bridge/icon.png create mode 100644 toogoodtogo-ha-mqtt-bridge/run.sh diff --git a/README.md b/README.md index 9da5799..05bd58f 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ Home Assistant Addon repository containing ## Eufy Home Assistant MQTT Bridge ([matijse/eufy-ha-mqtt-bridge](https://github.com/matijse/eufy-ha-mqtt-bridge)) Forwards Eufy Security push notifications to Home Assistant via MQTT. +## TooGoodToGo Home Assistant MQTT Bridge ([maxwinterstein/toogoodtogo-ha-mqtt-bridge](https://github.com/maxwinterstein/toogoodtogo-ha-mqtt-bridge)) +Integrate your TooGoodToGo favourites to Home Assistant via MQTT. + ## ioBroker ([iobroker.net](http://iobroker.net)) Run ioBroker as Add-on. diff --git a/toogoodtogo-ha-mqtt-bridge/CHANGELOG.md b/toogoodtogo-ha-mqtt-bridge/CHANGELOG.md new file mode 100644 index 0000000..9a77b7b --- /dev/null +++ b/toogoodtogo-ha-mqtt-bridge/CHANGELOG.md @@ -0,0 +1,4 @@ +# Changelog + +## [0.1.0] - 2020-12-31 +- Initial release \ No newline at end of file diff --git a/toogoodtogo-ha-mqtt-bridge/Dockerfile b/toogoodtogo-ha-mqtt-bridge/Dockerfile new file mode 100644 index 0000000..bfbd528 --- /dev/null +++ b/toogoodtogo-ha-mqtt-bridge/Dockerfile @@ -0,0 +1,3 @@ +# sneaky trick to get around the requirement of {arch}-variabe based docker repositories + +FROM maxwinterstein/homeassistant-addon-toogoodtogo-ha-mqtt-bridge:latest \ No newline at end of file diff --git a/toogoodtogo-ha-mqtt-bridge/Dockerfile-real b/toogoodtogo-ha-mqtt-bridge/Dockerfile-real new file mode 100644 index 0000000..56e3031 --- /dev/null +++ b/toogoodtogo-ha-mqtt-bridge/Dockerfile-real @@ -0,0 +1,23 @@ +FROM hassioaddons/base-python +ENV LANG C.UTF-8 + +# Add poetry # TODO: Get rid of the overhead +RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - +ENV PATH=$HOME/.poetry/bin/:${PATH} +RUN poetry config virtualenvs.create false + +# Calls for a random number to bust the cache +# (https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/58801213#58801213) +ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache + +# add source and unpack +ADD "https://github.com/MaxWinterstein/toogoodtogo-ha-mqtt-bridge/tarball/main" /src.tar.gz +RUN mkdir /app && tar xvfz /src.tar.gz -C /app --strip-components=1 + +# install +WORKDIR /app +RUN poetry install --no-dev + +COPY run.sh / +RUN chmod a+x /run.sh +CMD [ "/run.sh" ] diff --git a/toogoodtogo-ha-mqtt-bridge/README.md b/toogoodtogo-ha-mqtt-bridge/README.md new file mode 100644 index 0000000..44ea0a2 --- /dev/null +++ b/toogoodtogo-ha-mqtt-bridge/README.md @@ -0,0 +1,8 @@ +# Home Assistant Add-on: TooGoodToGo Home Assistant MQTT Bridge +## Based on https://github.com/MaxWinterstein/toogoodtogo-ha-mqtt-bridge + +--- +## 🚨 This is some experimental release! 🚨 +--- + +**The underlaying docker image will be build every night until there is some kind of versioning available.** \ No newline at end of file diff --git a/toogoodtogo-ha-mqtt-bridge/config.json b/toogoodtogo-ha-mqtt-bridge/config.json new file mode 100644 index 0000000..069d2a7 --- /dev/null +++ b/toogoodtogo-ha-mqtt-bridge/config.json @@ -0,0 +1,42 @@ +{ + "name": "TooGoodToGo Home Assistant MQTT Bridge", + "version": "0.1.0", + "slug": "tgtg-ha-mqtt-bridge", + "description": "Publish TooGoodToGo stock as MQTT messages", + "arch": [ + "armhf", + "armv7", + "aarch64", + "amd64" + ], + "startup": "application", + "boot": "auto", + "options": { + "mqtt": { + "host": "homeassistant", + "port": 1883, + "username": "mqtt", + "password": "mqtt" + }, + "tgtg": { + "email": "me@example.ocm", + "password": "iliketurtles" + } + }, + "schema": { + "mqtt": { + "host": "str", + "port": "int", + "username": "str?", + "password": "str?" + }, + "tgtg": { + "email": "str", + "password": "str" + } + }, + "stage": "experimental", + "url": "https://github.com/MaxWinterstein/toogoodtogo-ha-mqtt-bridge", + "hassio_role": "default", + "hassio_api": true +} \ No newline at end of file diff --git a/toogoodtogo-ha-mqtt-bridge/icon.png b/toogoodtogo-ha-mqtt-bridge/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..847246bdbff6c22473663e84a6076066e8100111 GIT binary patch literal 9483 zcmaiabzGC*7ylT@$WbZ^3{a$zkld&V3eq4Tf`o*0Gdib)iVP6x8Uj+nhz}s8lyr=i z7$FFwQ$p(Z@csS!d%b>tJg@C}Klh$n?{n_C=bm@E+N!ivEL0#6h*s^%qo*Jc$pP?S zD98cC(rx!X@I&eT#Mlc20=Hj1BroDKsX-u4klLe%27Vcvgnpe2qomGVUfsqtBct-g zv|k;1Iwn1ZZyM}|Dgzkqs(e*(Od~i`oKQzPPfE=CO&^O;sHEMGseSUSjmkkvx!>M| ziN6%tdB=m%nW97L*2WP3oM(^jwZD5aD|JUR+p3jv38~@51?8a`frIi#rO6@|Dj-m^ zn^sT=2y`5agn*DFU>FE=jRFM%UFXD;fONzDUm#~&6veR{;>Q&8<00?;65NvSu3n;> z`_HrQu*X9t-P=yJk*?1BF5qu5L%1+IO+UJHyzs@W(}~$eio1pIg?1OI>m57^o#u)W z_qR^XFgp0&`+c5y?ips7pF9#zfoj$pIT;gU`fW{VFdy@g%3LWp-W@Xh5K9V89l-VM zoqXcGW3DDPv*JoicYN%+FAdCKme>!Vq%uzoZR8dk=V-b`7v ztCIX+_EYe|SKGaDe2iokM3)r|d&|(fUQy>F;FGj~7GNMEHT(R=;SqM-BbAoL-jO39 z!})&(oa7@XhO6e6)Rydm{z;+0Kr3-j12h%PJ`Dc8hKP^gH>s$FW&l88LY>^J7*U;Y zxy4srjv(Z1GK4OqissA?lgq81^>+oBySlJhab3xz88l0Z@Zn=jZoYQXeAMb|NQg=V z)Sx@#z6DobCa1>E`m#95Yi6KB-hCk_56m{SS6^Acj&EyhHQ&~J88qPKIaL6xWO*$H ztCvGsAlmO1UUzDrq`XszM^kAc-N%Y7wq{uBTNveDKZ<~UdYBTp&LrR+{+a<~VUg%)SKgZ3jg)B9 zaX(L6GvVLWiZSY(uKl|)Mpx$<%#`3@uS8kj~u~k2O!4U3dV7nWqil zpsIQYfeP~XHn_ZWK=W)#Gxu4|QaFT9sD@+A)>Fs5_cfeFVs!8hrvmstsixlZ`J8gB zwyVJ}7G;0bR`b6we#3offBfn4NIgm8;$-THRKcEcT_n;CPizg!rd(TJrh6#%pNq7k z%ct=3bqkF}re4Fd26OR#wb0QEg@ymp0fzZa-t%>H+CQE%oan#oKI~dr47KZ?GhFAI zWRs^9yMuSK5!kZak9zrQNPY%3B6RpKIjJX0MMh>Rt(VsG%kX#eJ>M~GTZxI_@?drN z*@GLw!4wDLAB6jQIU>dOA+1LmiqF)QLi`!+aDst^xpc65Y>2&p| zM(PxEgJnYgGRL=V#!t0*A`B^Fjj{~s3qMZTQ+F>ohIEiMju*^+VkOThVJ8L)G~eP!&C$ zk>~weE-skFaKEm$Pg`j(S11<59zyCJ?9(NZMet(5Pro1QdrXZrzy%IgBrHgETdp*) zon80~l}MzFs)Wvzm=}qy!`DFWE+mIpO0puKINE5jI-sebT0)^B<$!r5g@vug!-?4O zl1*d~g=IFPzU^Qtze<;OyL)*wdk?Oqi#BImk}#CCEy(k%W#0mf&Png4*R%!19!W5) zFKRE)M7PkD#!w=Dy`ez8o+-BaqhRM`oVCWr9>?JcDS=7pS7vB)yQ;>ulp*l_>?hZi zpD-p!2bx5Cz}|`17M*v;*2Xqx!kw3A$89TiljL`8o|NlER(6(2;Z>QJdFvXv41Kl6 z%#S{v0opmJ`RTWKI9<=PRa=Xo_gR?+1c`pH;@HL_YE)IDLgy}zopZ{db=i1vCIfCq zH%DFijd_P=TvgsyB&~jFiCLu44Pq|!zP>FkBl|T0)k$`m8j39(SjesYY=7jNJbNBn zv%DO-7&u{E+ka7C?`ZZIo8GhsKg@5u6S!FgQ1M2?>q*%tT-o0PmF>Ty0Y!HidB*+!-!vYWA?i* z1hbs7~$<1ilI2wNga9 zXzsBQV6dS-8_3bg@tgm0!|V!&oBp#F@D@=fq$7Fz+Eji*InHh8tw!g@2kcgu-INK@ z0Ic_@yp5M}nQ?6glbo{^gk@UhTd{Jp_#~ShlLluY>+EKzIn<1d?N*$Ps2@RVrz}bU zg*TW_|55tLtUt9gI%qi&;)u&`r1GA)ylHx`Pp^9@nt5nBH)`lIq>17D+bPo^rS`vt z$pqrgPih4=#qQ?HSK{e&{sZLoaJzwPf-)m53zq*~oWCLBEH34zg8zMjkQY2j2|ZmB z<9Pq0k=0BpH6>mBGT%5KvI>bmQM$ON>nS1)_Jy9len|!dB4wx#VkZ8F@U%q(qPMpq;T`wUP{hfVO)ngX4<8t>vEONZyxhj+(dTRQhmLD<=Cg)d zS0Ys~MpX4_9_t0}$U?FoRzdcjY>2I(C&Ni&y9k2N*nFbl!AEO15ufLFbm%vWkf}Y$ zTKgz#w&{MYY9aoUroO)A_rS<)$@>|r0XnC$j!B|X)Op4jN0?fi_7O*x!h-Sof@Wft z2{v6t=1WVd7<7=Vc*&smfeqo1L0Ee-{aFk9_6pou|&Bv985!mZP89 z7Wgv~E*$VM_qmS|e|3h25We5w+h~X<$#0&OG2_>&SGejxe!)j?wP(Zx&4@QrLM^#^ zLJcJnsU7L+2t0|m4W&7z=8B3O!j3$>TQsS9D@TBFha`mPzx&^+{^ffg`SI8U$zn4Z ze0~avc;$zE)(5n<`|2o909EWo_K@YzQXk@Ut?*hE!BAc9=pz*>ZGoP~`1R#>4DOea z>R2J(kVQRUk`RDR|8rPU^8-51ScLy$&k9tznN#-kvta<^4MguIMbbt|?~v5IQ0!s$ z?uP?4lsDoX(yk8nP>{`Kx^eJ3Li=x<{^8IKb<`xm5u2`u6RPF%^K7AB8S_Z9Q;pJ$ z8R4(^Jnj>r?G3&4bAPSDz^X8;$U}gZ_wN^HNPv|a*$!H$K|Gv1QO@d`D&VK$KirYv zi|UX`4A^#Y;rSRb4koY}S^LQ9qG@t+NZIpk$b@prKF*;5c^O)W`Bb5(r)2f&6A6C$ zWQe#*rK%a}qulehm7wcyYbI4Ex=yL&$hBe;?M40Rf4c}g3?6gLqh2Pap`s*w#&Rg4}{Bbsyqmb)TN{LBIuR; zA`M1aW}zR1T?-F*{@l~3yO#=f^=$0#O!_(4AWIFGy9|94J#bhqXphHxAb{O&pZ8527o*KDM5E` zHn6XAqrxsqHAfL_fJQ>VoLZhb#H7PH3Vz9Q;YmF&epaH~S2?aW- zJS(XMLUoH*?|i8|wI}Y;v2#qZ*@|@M4D(lDdA};%ZMj8C0aV6M6|CFNC`ss7FBJlH z#$%(lDQ;>ha4?}Ylqu}7r%Lc;9Jkqo2dY05uytvr(k&ll!&=2^egvQ1@0?`o9Fok4 zL_%~qJ14*YyO3p%Y?G;v9Qj3Y@G47YzF@PdskOSqeZ=dTZcuXV$-g2zN#jDxfK=u- z<~K3z=&NM=<0LR)jhg%=N9MLGB2TH4-$ zMnCEX+dL@jhCEmVP@o%4Ye9C)4I0mVj?%`0KFH&fJ9vL7L$1fCZcB96StsW@DeRZ= z3s(}-=s1l%KgICCv6jzxi>9bh#V91hq)xKzsKZAMj<#24k{|p1Zxc6iNqgAX*dM43 zkkBOWCjCux0+@O2ewfk&HH_@&$YcGC+OIfM{T$N5cQZNPPY?L%?sIEK?9pC+sHFC@(dQyQk!!Vcyf#)2NJi@}3=8JZ&+GlfE+c`+#9dvxjVr-8be*=)t2y zTF|$Lm`X90aRp47KX*lI5)};j)kZ={b#lY%+Xo{?LFZEPf5XRQHxTrkNweq)6j^;s zy9}qO4)oAC0Aj9JwZvYr0S$kb@5|W}Yvc8M*By&pUvU$xFtz&}yAQz-VaKZ1cs-n#{&%6quA&H+z1FVWOz3H8pUD!TdAA;_qF z13E9svg9~H7+#y!fIcq1=JXr=9dOwPHl0A~dil!l%E5#bjn#Fqdz|TPD;eBx%avth zK|TM*6%+kPnU?13M!oJQBJCz&%^r-)bTu5irt>ADq=c6Mz`FF_5L3~jTqIJfN`?SU zI4cBo*@5R|Dq=EBu;Mo4Ncf8eMUM}(3X{MoAcIeLBug9V#TLdS#UaLcbJm@w)06^L zW^iqXya-=3yg+GJ6RS^)s@l*_gwB(>TEBrT6&u)n$*vcrPg#}$@pid5D{fu1zv0g< z$^Th5ahEWC zpP(H$*dfR&9%%oMZvKxVd1Y)tU-x&B2@`Gy45{u-Lj>D`skmvp6MCRhHmtI6c!9!> zTBiU^(8M$>HfxZ~a~2;M{ZiJ6(TwyuG)Rgbp?vNG0jm8I+{h{DST(d+`Ja5PLq0Y? zeh}NEM9im+Z|3gx2*tQ2ptBL?`QnF?lF@+CtLYWNcW-~l-+c$il#>+N2+kw7T^+pV z4apoj{z`A|#RhETlk!EM4#$hy#TF-e!tpD8S=T@rJ1Odw6N|njC*sS*-v4&UB=-AtJd3#J7Ixa&8zveY&FNe!-Ze9(1~uf|{2Ex$9C8 zwrCR7!js4RmtJ72lA+j-^qBIY1=q}40I`f!>~(!xi9UTin& z4QDfD6$d7^p~b+YyPW6Msuw8L_MDpTJ^+YGV({6YBa@22vR$&@wMb>A>0yBgTeR`a z5NdK7xjO5(41S7~UU0#B0l2!vvsHtY@vi{sqFH9&ZqMDR0>+3Lk(tgECyp1ccJCqZ zT8Y|k*utdk!Q=fC6&j-1`tr5r!#Fy$;_?qXv(vOTU z2hEl@)fyF!R%7{veQH%J>%6txo;oEtiDiByEs{ zc5h`Mq<7OJeb>L;iQDo2axF>se_YFXHQ9tK?MEBsMAF3T`7aqyw{+abRFLrHTTW&| zkDeE8);+yJWV0r9&j1`|#Ef5ljm>w-+Mm6Yhm*y7;m) zBDoes!i9fB-=4bfskB}*zju@KC9oYeO{&@{nG#-`#n1}ifxT(IS0O;r=*#$`51-vY zFXfh8`|xr5XBw8PwS0mW>D|gu#7(LY+uD`n=ViKwW$Ae=z?tX!X<8T?uj#C&<>%LK z6NQ>c7xpYU%*cD(Apu&i%^gLke8}RB0}9q*6mjcbgxh@j3G>NQ(Ms9;GHuPbIpxZv zJBH|u5-RWj_!^1=c1+Q_5Iqf!)0HtQ&oE8y93vu41_^j+?_+~$hf-9a;a(0juISz| zGS)nzex@tQ_o{PY5a4SGnP4wFz0kJHRX%f9WEzbgvM@?625OVdLu_fY0v% zT>@<=`nu6&uAOPN=)94oMTdNV_o!4|!_KrU!)>Y+0HfkkOd^FAC5SDB)tyz z3rSf^j~_ThW3<2LhaBEE`aB+m#GzA<6#n#6le>TUPw)Wk)7sb$TmEk%7Ks}Ic))f9 zG|iSL2TnTQpV+&u8FL4}{&Gvlj!1(=rY%|+yN0?%?Jvi0;n$^A64>T{NXQbdun(vG ztg6_FcRX-Vj8$FJynbY7`x~SiNXs+qa=2b4@y{XH;dQ##ymuiIE8Qj0Ev5$D`DB`# zMxHdCd-g<1dbN37_YE=@oqEr=^HdtlDTWrQ)wmogC&ek>0Lv@rFaH9z2Z5bGK8UIN zcktF$X-kp72+yicB_>}?2zzHypETHfP;>X8CyL!2B{5hWt}D~cW`b?rWFU%(XKqUb zfcOOGOP;!o47oC+U0bdQe|E2UD~81WSK`(dJ;!G@oyE5}AUMh07X;DO4(l9C8Oovu z6Yh%dXD&Je9!ph|d;;aF$l_;ml?C-Xe97-5yd(Fn9dWQ2bwJ?^RRXu@h0d{sdJlZ+rN^dv>EFM-tM~ zFG98I23`(ig{r3%yg};3!E*=ZZ#Ro&mbyH%&_(vUXM2vz$&&@NQh0O9B{#g53Diz0 z_<+7Vy4L0B zO6e6vPvqwsC26vW`w(9LG`!B50tKO8L)NF=kJw5qV=v7XvfKjf3_~~~E^DCXIJVSm zZDTmVU{ly~iw8`&!!xQ#eGUh)@VP|xdMS09k=0uRjJK`Jq1{Pm)7O8V>E)HS2#8E& zodWtw0z}~|LgStO6??VLkdoEsY8F-%K>bvTyD93_!WOaEO*ZKmg~ zof7ySc|?%|Z5JsM_T?UfTW*Pg3F17Xm(9Uz$i?4NibhW}=Xmiub6N0L&YbneIKd}UZeTK|@*ml016f2fk@nkbG0o1F$d|_$jP-wGp{q(wG=oMvQBMIf~TS!fjI{v%%I}YezN>YWhGT2@omq`}4*Z zHyUJ9T9PmMZ}X>yg4{#IBsdb4Fs{S$OJNtL#?Dpv&%UmToJfNBn#OE1`oqct*wrAdm zuT)xGh*?6x^19sO^V{JULiCt`q-jN&?E9!%S@jUU9||A)@9(?NB+cB>*zu&>%l2c$ z3r~b9^kfb`I~RsoI3{y+6#NoVWk6$I1My|!*A})Gu(b2FwU?tw4n=FQo~I3{YFU%a zDhmt~a65*E;}p95z3sW%Y>H|3y9oI{b^MzX;qaaurA|s<5aN2*&*OPXwa7(GKg^a@ z-WeE5A6<&t6ifQ0M~TK%%1n`K<=x(DE14(`P{lyw>fj&y`(<_z^P)*JdP(r94n{eH z!kP!k+=n^NE_S2$r$tqVDZDb?QNir2DA^U9Tpa}rR{9M$qC!((d^2B`De8U%edP8r zh(@X!_Axg0z5da|^hU=fuCJP!c`)cF6sDK(P)uCnd(JbVx?BP7kw05|?ehsUCsoQO zhy5_h{og+Y!r_i85ty_XfLz=nRT6zI-eU$Um2MZ))XApbZvH(4R3Py%I_yUwUa#uP zW7jVo5rx=wXPqPp2wTPn?|*7*{B^97l6%L1X#e&$tE_T0bizP<`R|(xXVj{xQ5r5| zxAZM78WWjXQSr2zZdYOf4EMdzNycSOO@MS!$ZgloL zQ$uf#KhZbzMc_d?x=MEL{(=n4S57>Gpnj=F+l;E5ao$7Qn#%`Au0L@?u+2+3cd;1w zrh!40!UYIKR&kXJ@TdGeGU~=gDHm;J`$fwi!5bo$Y8AQXHSibOhEOL8)N^qlZfk!y zUNj#6w%3jB5p!U#Me$ur;oc3x{Zh4%TdZFMEVTEc?`o1EzFuACiMME1L!Go=IO_2C z)#+Y)_nQsz^-8xTn44yn9ooo^9XaG)h4q~_ovTIG_1S$>N#O!QxlgXE&b(}MFx#Ze zlAIH>>sdLDiw7cWMK6Pde%}pTP8QS**AVS<2vA<5K;_w@EWZz;S}$d@!D~a4Q_qNw zBD^`G7Ghd%>p@{pSkai#A==o03@KV+wCJ2@?|KG*lsE-S=8f!x-hE1sRr_scC)r)M z=TNUn-t7DZTH(9+1-8Qpk2H15tmYw!!|nwMFiiWw>ALo-$!}_!Anzte-)kAt zNd`Y%a%Vw93x;H(p8jbywXNzcb-39Y^m8Ktw|l1<0^EnbWLdfQOL2jTTE9*-`NfDr zAGAGqsONoA*X;=^96fP|s)e0>Qv8R{!tZx2VmG(MdAk-Qf!oo$zuI(*NQ9TQeO|K( z0L55Z%93ef;$IyOi@LcDJmUB+Pd^a?e+V_CKoug58ihT*rbK4Do5Un+vAI>csh#B( zA)OiA1(USJz~${vveP_DAM#N@zAF`mO|ypnz$w4!{-Q zW+xi0ial&gxo(jmUblEQ2KKu(VABxzSrT3Y&sQbToqzOFwr>r~#qtuC9-Wl2dfTS?=c zD<&qFRRz_5w|TzR*1f*&4nad@280N7X-3BX6n~5-b)Pwnyl}f=(l!0yzMICK;ES0$ z4vWSh<69rI92~bC0|a~itNG9NfmVNn;z3hprYs=uyU_V|hLgj|^g=ZA<;cj?Awf2C z