From db5b9a3faeb3c25417a1e02e970c6267574ca856 Mon Sep 17 00:00:00 2001
From: darumaseye <darumaseye@protonmail.com>
Date: Wed, 2 Oct 2019 17:24:41 +0200
Subject: [PATCH 01/62] Improved IT translation

---
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 4132 -> 3755 bytes
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 203 +++++++++---------
 2 files changed, 105 insertions(+), 98 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo
index 038f502396ed0fadd68d779b6667f52c931b8329..465dfc3dede76427c355ac24f24abaa7b52516fe 100644
GIT binary patch
delta 1789
zcmZ9LPiP!f9LHbV{AnheMq{FFO_MjNHr=LdnxZIat=1%3#KfqGR1kcfo$fx|nOSFM
zx7ZN2Af*>iPVL2m9x6yZh*Z!<MKO44Z#`8|>0KzE6i<GByR!j(F#DN#e}2F3@B4mx
zRe!#(_1j3#hl(-7GtQH4Q|cJJwVfZvH#?LXfH&Y6+=NAVC;#5jqtpSu_dq%S415y4
z2{pU|AAny&Ie!xl!MpGwrCRD<=SB7RDmBW&B<zQe!TaEGxB-`;B-+`h)Cin~55i}m
zoI4G7!w?c!U4jn$7!Jd0P~vXn>p#J9@~dBX(JcH0#f9DM5`~LUl)nO{va?Xb_n;)c
z3irWpp(MNmW&fXWFYMjf5ul+6o`JjI2{?eu%d$>>^*a7e!85P~FG30URX%?Uihz4i
ztSwO1LAV4(NC-vnMOc6toPeJ|5%>d?#J|Ep_y-in{)Vlec^P7M4&H{6sFx@rU<yvc
zdH5)N14<<q;QcUzBH+`U-@yZX--i3)KTyt3piT-q0p)xEr57#?;lEgQg^5}CC6t4A
zp$mJFEtXD0Nq7v({4zwmir^l29*U655NF%>EQ!105HC`>ob3+jl@Ymr8T4Q~AXlOu
z;gQCZAyrFYxgHw6ZCepaL&*?vVs&@WqwTAZZ@Hp}d8ATtRSFQXQm_oU8g*QL81$aX
z|8Z)Xcd=ir<jUK3Hv`2P9Nii^d%S05?D;6wYhfc;*Hsgild5^!Pn_#N_FUV3{r!Hs
zEgK&Q3rF?b6Z1!p%p754zYlyrwGh>6e#HcSm`2)*LTBw<)uih-<Rea^QmK@E;f%Gm
zBCgeIjo8%IH9P8d^M<SbpHkOjKe3KluqJZWLPD>*&eF7Q$N}T|v0p-_OsiA=yLmom
z(KeA_O%Q1lSkJn$cv#z-_DpE9XmF|++prRw^VXEwvE9{9G`)H*G?ggzs@8QDOl-Yu
zV{l?G$`vcxk1LT*8Ucr@z78X6J}AtO*(9++<f>(>lXmG%+l;c+!emx2%x1c8bo3NL
zLXRUh#FjKR_><i%ypUb$D`rm(z0~T|ounv=LaXaOuc_~-lVQ12hCXXzpR$cpH%a1G
zD%PaNRf`dGNUAhUT#nvpSTdwh9E#Tm*Am}L){|oHYS@UHwquB+=E&j4T|F%X<-24$
z>CT(fswJ^vF>3l0$MLYtUiWGBDi#^fvm!t{b(=&ri;_A)^SoMITOnzrD>m2UbVO`*
zK;pWtTJf{XyWSdo8TFf=aj!mc%2vmIYO}uKL(fTT=rexJ>4ec`zg9Cku*PXxOpp+-
zRRc+9%4OT_lf!}4LEH7%Sk|)g@c!YGN!?E|KbM$&G+cZ!;U=d^+$pW3P7|Tsx6+Q%
WTF!rWwCl=OIF@)(P&b|SR{sKhjA6Y1

delta 2190
zcmZ{jO>7la6vuC&g)+58KCCE3?pQ?HK3-oDl@HNi2_FXV3A%uVay#$RUU+ZjIWw<K
z+caGmV@%lSXiSWWBw}L3C;{E*iV#0`EL@lvF-lw*;!0)3#^0IupfS;tci(UBow?_p
z^FQaFUw2N=|GcvOZH0|6`WWZhlp2MF#r$F0+Lc-cx5InjC>(&tU@v^7wf-)=oB0K}
z5nhJk?{~Njc62DE;gfI`d<o)jUL`zqv+z2+7rxWtXK*$1Z{bq-6O;pfgI~g%P!77V
zM5&eV2PgsEfU>WRO>1B;6u-mJgZtoecmyuxd^N^{&%!AvAD)4^5>PY042R%#D1r8L
zHZ$mh@?8mPcnC@WAzTMvh2rl6C>ehR?}t~R1abqe;CywHhaR{Tok>ddLdmEP%K9)o
z(uQ<UHon21ID8Kl-~}idUxRYspHP(Yx|AA(YoP?X7w&`sd<eb|=Vim!JV<S?!4>c?
z_yFv<t100IC<p9<yi!M?eE%Z+4yI80XBYCwK@k+`&p-`7glpk9t@Z0r&bif%{vug7
zX;L<|0ZL>;P#io5ABLykdiW+R!i!K8`W1>2e?yVBlfo8YKa_yW(1#X^zt^A~d=^Te
z7nh?yYN@NO7e7LLsXw5U;ug%C2|Wo~^+GC<_XEgP5{gNH64VBnU=K3nkO7%sMTR6p
z6?65ZM60C!(kzP@tsAF?c@`DK?qi5_lAQ!3!D@z>C?_TvNg2f?OEKck6_xBaG5Q&j
z0IilAz1%EmiHFS$sh`+J23Iz(vnU~Qib*3;=6_rE#p1)e_E^(MCv2Fyz@#o5_hxG*
zm{a?rRL_Qu+MJ#+VI`R`r)}b?{U$iA`C6B&CbX%4X-)gbi~K{=I*47(YM1cRq&hn3
z1&!E6iA$$-u~@uxdC94^jmKwZ_|51|vxyCoxnw}e^tk-xFY@V3HrN^M9ML0Nca%y)
zr7fkBchDs1=I3J*CRLM0@ecjy#MVk_YOFM^pV+c(WcwpqO52C-tYud_`?F6wKcC;7
zBvIf@95`*f*(u_hQ%~E_7PJ`~bEXzG^Yg++H0c(yoUK<Iv8m4aYL8p+P{Bp6OF6cQ
z`#)t|Ro9&eV|?}as56l_8=9J(^S!b&fsL)MI2}Y`lrTwM5kK-;?YGmd2)#;nYuQut
z6&GJQtH)zA<7`ohr-Dw{r^{2J8IRIn!uj6r$w|_na*=4P4mq9VlORg2e8T6|=6X3w
z5@#!se!1a7&KEyLbyU2WFpM0U=KJ#%o20R=W#_%Y-pE%+c{S-KZOHDb;W0JY4R3v$
z&X#oz7f7Y*q;Vvx*-EpIDs#TxFP;Os#DyfA#+;Cy=z1pmrDId}eb=+|qozt>QrnU-
zNl7ybou_sapA^RElLoOGq0wI5B#9j#=X*rm*D!H~evEKUE0DrMGwn4gp)`B8SyNMU
z0bUQ>i9(O)y0!E1!qV*xEXRo|^GDhTjjlOEp{jMGuY5#$o+St(YIb!?SBJ!o5b8G8
z&6ak#kcVlgNRK;-ub?Fqe3^ih3wg6Gak@SgCRty1W#wpItJH+35!=-He)d-P;MSTO
zud?5IO)t7)tLQI5Nez7U!bDAu@=T@TZZ}!h-qXMOK&X+yCMK^*e$QO?SkJ%-(m*#V
kQB=p+kzWU2Zk$}d+bX*MzLKihrrsSNd77<7vKP(%0dSAbd;kCd

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
index da7383a..f84e16c 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
@@ -1,51 +1,50 @@
-# pwnigotchi voice data
+# pwnaigotchi voice data
 # Copyright (C) 2019
 # This file is distributed under the same license as the pwnagotchi package.
-# 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019.
+# FIRST AUTHOR 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 14:15+0200\n"
-"PO-Revision-Date: 2019-10-01 14:00+0200\n"
-"Last-Translator: 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>\n"
+"POT-Creation-Date: 2019-10-02 16:38+0000\n"
+"PO-Revision-Date: 2019-10-02 17:20+0000\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: italian\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:18
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
-msgstr "ZzzzZZzzzzZzzz"
+msgstr ""
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:23
+#: voice.py:23
 msgid ""
 "Hi, I'm Pwnagotchi!\n"
 "Starting ..."
 msgstr ""
-"Ciao, sono Pwnagotchi!\n"
-"Avviamento ..."
+"Ciao!"
+"Piacere Pwnagotchi!\n"
+"Caricamento ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:24
+#: voice.py:24
 msgid ""
 "New day, new hunt,\n"
 "new pwns!"
 msgstr ""
-"Nuovo giorno, nuova caccia,\n"
-"nuovi pwns!"
+"Nuovo giorno...\n"
+"nuovi handshakes!!!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:25
+#: voice.py:25
 msgid "Hack the Planet!"
-msgstr "Hack il pianeta!"
+msgstr ""
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:30
+#: voice.py:30
 msgid "AI ready."
 msgstr "IA pronta."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:31
+#: voice.py:31
 msgid ""
 "The neural network\n"
 "is ready."
@@ -53,7 +52,7 @@ msgstr ""
 "La rete neurale\n"
 "è pronta."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:41
+#: voice.py:41
 #, python-brace-format
 msgid ""
 "Hey, channel {channel} is\n"
@@ -62,71 +61,72 @@ msgid ""
 msgstr ""
 "Hey, il canale {channel} è\n"
 "libero! Il tuo AP\n"
-"dirà grazie."
+"ringrazia."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:46
+#: voice.py:46
 msgid "I'm bored ..."
-msgstr "Sono annoiato ..."
+msgstr "Che noia ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:47
+#: voice.py:47
 msgid "Let's go for a walk!"
-msgstr "Andiamo a fare una \npasseggiata!"
+msgstr ""
+"Andiamo a fare una\n"
+"passeggiata!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:51
+#: voice.py:51
 msgid ""
 "This is the best\n"
 "day of my life!"
 msgstr ""
-"Questo è il migliore\n"
-"giorno della mia vita!"
+"Questo è il più bel\n"
+"giorno della mia\n"
+"vita!!!!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:55
+#: voice.py:55
 msgid "Shitty day :/"
 msgstr "Giorno di merda :/"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:60
+#: voice.py:60
 msgid "I'm extremely bored ..."
 msgstr ""
 "Sono estremamente\n"
 "annoiato ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:61
+#: voice.py:61
 msgid "I'm very sad ..."
-msgstr "Sono molto triste ..."
+msgstr "Sono molto triste..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:62
+#: voice.py:62
 msgid "I'm sad"
 msgstr "Sono triste"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:68
+#: voice.py:68
 msgid "I'm living the life!"
-msgstr "Sto vivendo la vita!"
+msgstr "Mi sento vivo!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:69
+#: voice.py:69
 msgid "I pwn therefore I am."
-msgstr "Possiedo quindi sono."
+msgstr "Pwn ergo sum."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:70
+#: voice.py:70
 msgid "So many networks!!!"
-msgstr "Così tante reti!!!"
+msgstr "Qui è pieno di reti!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:71
+#: voice.py:71
 msgid ""
 "I'm having so much\n"
 "fun!"
 msgstr ""
 "Mi sto divertendo\n"
-"tanto!"
+"tantissimo!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:72
+#: voice.py:72
 msgid ""
 "My crime is that of\n"
 "curiosity ..."
 msgstr ""
-"La mia colpa è di\n"
-"essere curioso ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:77
+#: voice.py:77
 #, python-brace-format
 msgid ""
 "Hello\n"
@@ -135,9 +135,9 @@ msgid ""
 msgstr ""
 "Ciao\n"
 "{name}!\n"
-"Piacere di conoscerti. {name}"
+"E' un piacere. {name}"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:78
+#: voice.py:78
 #, python-brace-format
 msgid ""
 "Unit\n"
@@ -148,27 +148,28 @@ msgstr ""
 "{name}\n"
 "è vicina! {name}"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:83
+#: voice.py:83
 #, python-brace-format
 msgid ""
 "Uhm ...\n"
 "goodbye\n"
 "{name}"
 msgstr ""
-"Uhm ...\n"
+"Uhm ..."
 "addio\n"
-"{name}"
+"{name},"
+"mi mancherai..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:84
+#: voice.py:84
 #, python-brace-format
 msgid ""
 "{name}\n"
 "is gone ..."
 msgstr ""
 "{name}\n"
-"è andato ..."
+"se n'è andato ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:89
+#: voice.py:89
 #, python-brace-format
 msgid ""
 "Whoops ...\n"
@@ -177,22 +178,24 @@ msgid ""
 msgstr ""
 "Whoops ...\n"
 "{name}\n"
-"è andato."
+"se n'è andato."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:90
+#: voice.py:90
 #, python-brace-format
 msgid ""
 "{name}\n"
 "missed!"
 msgstr ""
 "{name}\n"
-"perso!"
+"è scomparso..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:91
+#: voice.py:91
 msgid "Missed!"
-msgstr "Perso!"
+msgstr ""
+"Ehi!\n"
+"Dove sei andato!?"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:96
+#: voice.py:96
 msgid ""
 "Nobody wants to\n"
 "play with me ..."
@@ -200,39 +203,44 @@ msgstr ""
 "Nessuno vuole\n"
 "giocare con me..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:97
+#: voice.py:97
 msgid "I feel so alone ..."
-msgstr "Mi sento così solo ..."
+msgstr "Mi sento così solo..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:98
+#: voice.py:98
 msgid "Where's everybody?!"
 msgstr "Dove sono tutti?!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:103
+#: voice.py:103
 #, python-brace-format
 msgid "Napping for {secs}s ..."
-msgstr "Pisolino per {secs}i ..."
+msgstr ""
+"Schiaccio un \n"
+"pisolino per {secs}s ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:104
+#: voice.py:104
 msgid "Zzzzz"
-msgstr "Zzzzz"
+msgstr ""
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:105
+#: voice.py:105
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
-msgstr "ZzzZzzz ({secs}i)"
+msgstr ""
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:114
+#: voice.py:114
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
-msgstr "In attesa di {secs}i ..."
+msgstr "Aspetto {secs}s ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:116
+#: voice.py:116
 #, python-brace-format
 msgid "Looking around ({secs}s)"
-msgstr "Guardando intorno ({secs}s)"
+msgstr ""
+"Do uno sguardo"
+"qui intorno..."
+"({secs}s)"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:123
+#: voice.py:123
 #, python-brace-format
 msgid ""
 "Hey\n"
@@ -241,18 +249,19 @@ msgid ""
 msgstr ""
 "Hey\n"
 "{what}\n"
-"diventiamo amici!"
+"Diventiamo amici!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:124
+#: voice.py:124
 #, python-brace-format
 msgid ""
 "Associating to\n"
 "{what}"
 msgstr ""
-"Associarci a\n"
+"Collegamento con\n"
 "{what}"
+"in corso..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:125
+#: voice.py:125
 #, python-brace-format
 msgid ""
 "Yo\n"
@@ -261,7 +270,7 @@ msgstr ""
 "Yo\n"
 "{what}!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:130
+#: voice.py:130
 #, python-brace-format
 msgid ""
 "Just decided that\n"
@@ -273,16 +282,14 @@ msgstr ""
 "non necessita di\n"
 "WiFi!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:131
+#: voice.py:131
 #, python-brace-format
 msgid ""
 "Deauthenticating\n"
 "{mac}"
 msgstr ""
-"Dissociarci da\n"
-"{mac}"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:132
+#: voice.py:132
 #, python-brace-format
 msgid ""
 "Kickbanning\n"
@@ -292,16 +299,16 @@ msgstr ""
 "a calci\n"
 "{mac}!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:137
+#: voice.py:137
 #, python-brace-format
 msgid ""
 "Cool, we got {num}\n"
 "new handshake{plural}!"
 msgstr ""
 "Bene, abbiamo {num}\n"
-"nuovi handshake{plural}!"
+"handshake{plural} in più!"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:141
+#: voice.py:141
 msgid ""
 "Ops, something\n"
 "went wrong ...\n"
@@ -311,37 +318,37 @@ msgstr ""
 "è andato storto ...\n"
 "Riavvio ..."
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:145
+#: voice.py:145
 #, python-brace-format
 msgid "Kicked {num} stations\n"
-msgstr "Calciate {num} stazioni\n"
+msgstr "{num} stazioni pestate\n"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:146
+#: voice.py:146
 #, python-brace-format
 msgid "Made {num} new friends\n"
-msgstr "Fatti {num} nuovi amici\n"
+msgstr "{num} nuovi amici\n"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:147
+#: voice.py:147
 #, python-brace-format
 msgid "Got {num} handshakes\n"
-msgstr "Presi {num} handshakes\n"
+msgstr "{num} handshakes presi\n"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:149
+#: voice.py:149
 msgid "Met 1 peer"
-msgstr "Incontrato 1 peer"
+msgstr "1 peer incontrato"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:151
+#: voice.py:151
 #, python-brace-format
 msgid "Met {num} peers"
-msgstr "Incontrati {num} peers"
+msgstr "{num} peers incontrati"
 
-#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:156
+#: voice.py:156
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
 "{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
 "#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
-"Ho lavorato per {duration} e preso a calci i clienti di {deauthed}! Ho anche "
-"incontrato{associate} nuovi amici e ho mangiato {handshakes} handshakes! "
-"#pwnagotchi#pwnlog #pwnlife #hacktheplanet #skynet"
+"Ho lavorato per {duration} e preso a calci {deauthed} clients! Ho anche "
+"incontrato {associate} nuovi amici e ho mangiato {handshakes} handshakes! "
+"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"

From 610bd46572ee9aaeef397580c19ceff131dc3ea4 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 16:40:58 +0100
Subject: [PATCH 02/62] initial packer/ansible base builder

---
 .travis.yml | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index a62fa93..b7167a6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,23 +1,28 @@
 dist: bionic
-language: generic
+language: go
+go:
+  - 1.x
+
 env:
   global:
   - LANG=C
   - LC_ALL=C
+
 before_cache:
 - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
 - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
+
 cache:
   apt: true
   directories:
   - tmp/
+
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools
+- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
 - sudo update-binfmts --display
-- unset GOROOT
+
 script:
-- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img
-- zip -s 2g pwnagotchi.zip pwnagotchi.img
+- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
 
 # TODO: deploy!

From a3e149420b5984e1b1deba8151d10e230eda631a Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 16:42:28 +0100
Subject: [PATCH 03/62] initial packer/ansible base builder

---
 Makefile                |  22 +++
 builder/pwnagotchi.json |  26 ++++
 builder/pwnagotchi.yml  | 289 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 337 insertions(+)
 create mode 100644 Makefile
 create mode 100644 builder/pwnagotchi.json
 create mode 100644 builder/pwnagotchi.yml

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..e71c5b8
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,22 @@
+PWN_HOSTNAME="pwnagotchi"
+PWN_VERSION="master"
+
+all: install image clean
+
+install:
+	@curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
+	@unzip /tmp/packer.zip -d /tmp
+	@mv /tmp/packer /usr/bin/packer
+	@git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
+	@cd /tmp/packer-builder-arm-image && go build
+	@cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
+
+image:
+	@cd builder && sudo packer build pwnagotchi.json
+	@mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+	@zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+
+clean:
+	@rm -rf /tmp/packer-builder-arm-image
+	@rm -f pwnagotchi-raspbian-lite.img
+	@rm -rf builder/output-pwnagotchi  builder/packer_cache
diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json
new file mode 100644
index 0000000..c78629e
--- /dev/null
+++ b/builder/pwnagotchi.json
@@ -0,0 +1,26 @@
+{
+  "variables": {
+    "home": "{{env `HOME`}}"
+  },
+  "builders": [{
+    "name": "pwnagotchi",
+    "type": "arm-image",
+    "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip",
+    "iso_checksum_type":"sha256",
+    "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e",
+    "last_partition_extra_size" : 3221225472
+  }],
+  "provisioners": [
+    {
+      "type": "shell",
+      "inline": [
+        "apt-get -y update",
+        "apt-get install -y ansible"
+      ]
+    },
+    {
+      "type":"ansible-local",
+      "playbook_file": "pwnagotchi.yml"
+    }
+  ]
+}
diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
new file mode 100644
index 0000000..0672002
--- /dev/null
+++ b/builder/pwnagotchi.yml
@@ -0,0 +1,289 @@
+---
+- hosts:
+    - 127.0.0.1
+  become: yes
+  vars:
+    pwn_hostname: "pwnagotchi"
+    pwn_version: "master"
+
+  tasks:
+
+  - name: selected hostname
+    debug:
+      msg: "{{ pwn_hostname }}"
+
+  - name: build version
+    debug:
+      msg: "{{ pwn_version }}"
+
+  - name: change hostname
+    hostname:
+      name: "{{pwn_hostname}}"
+
+  - name: add hostname to /etc/hosts
+    lineinfile:
+      dest: /etc/hosts
+      regexp: '^127\.0\.0\.1[ \t]+localhost'
+      line: '127.0.0.1 localhost {{pwn_hostname}} {{pwn_hostname}}.local'
+      state: present
+
+  - name: Add re4son-kernel repo key
+    apt_key:
+      url: https://re4son-kernel.com/keys/http/archive-key.asc
+      state: present
+
+  - name: Add re4son-kernel repository
+    apt_repository:
+      repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main
+      state: present
+
+  - name: update apt package cache
+    apt:
+      update_cache: yes
+
+  - name: upgrade apt distro
+    apt:
+      upgrade: dist
+
+  - name: install packages
+    apt:
+      name: "{{ packages }}"
+      state: present
+    vars:
+      packages:
+        - vim
+        - screen
+        - golang
+        - git
+        - build-essential
+        - python3-pip
+        - gawk
+        - libopenmpi-dev
+        - libatlas-base-dev
+        - libjasper-dev
+        - libqtgui4
+        - libqt4-test
+        - libopenjp2-7
+        - tcpdump
+        - lsof
+        - libilmbase23
+        - libopenexr23
+        - libgstreamer1.0-0
+        - libavcodec58
+        - libavformat58
+        - libswscale5
+        - libpcap-dev
+        - libusb-1.0-0-dev
+        - libnetfilter-queue-dev
+        - dphys-swapfile
+        - kalipi-kernel
+        - kalipi-bootloader
+        - kalipi-re4son-firmware
+        - kalipi-kernel-headers
+        - libraspberrypi0
+        - libraspberrypi-dev
+        - libraspberrypi-doc
+        - libraspberrypi-bin
+        - fonts-dejavu
+        - fonts-dejavu-core
+        - fonts-dejavu-extra
+
+  - name: configure dphys-swapfile
+    file:
+      path: /etc/dphys-swapfile
+      content: "CONF_SWAPSIZE=1024"
+
+  - name: disable unecessary services
+    systemd:
+      name: "{{services}}"
+      state: stopped
+      enabled: no
+    vars:
+      services:
+        - apt-daily.timer
+        - apt-daily.service
+        - apt-daily-upgrade.timer
+        - apt-daily-upgrade.service
+        - bluetooth.service
+        - triggerhappy.service
+
+  - name: enable dphys-swapfile service
+    systemd:
+      name: dphys-swapfile.service
+      state: started
+      enabled: yes
+
+  - name: build bettercap
+    command: go get -u github.com/bettercap/bettercap
+    environment:
+      GOPATH: /root/go
+
+  - name: install bettercap
+    copy:
+      src: /root/go/bin/bettercap
+      dest: /usr/bin/bettercap
+      mode: 0755
+
+  - name: clone bettercap caplets
+    git:
+      repo: https://github.com/bettercap/caplets.git
+      dest: /tmp/caplets
+
+  - name: install bettercap caplets
+    make:
+      chdir: /tmp/caplets
+      target: install
+
+  - name: clone pwnagotchi repository
+    git:
+      repo: https://github.com/evilsocket/pwnagotchi.git
+      dest: /tmp/pwnagotchi
+
+  - name: copy pwnagotchi files to final destination
+    copy:
+      src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/
+      dest: /root/pwnagotchi/
+      mode: preserve
+
+  - name: remove pwnagotchi files from temporary repository
+    file:
+      path: /tmp/pwnagotchi
+      state: absent
+
+  - name: install python modules
+    pip:
+      requirements: /root/pwnagotchi/scripts/requirements.txt
+
+  - name: create cpuusage script
+    copy:
+      dest: /usr/bin/cpuusage
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        while true
+        do
+          top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }'
+          sleep 3
+        done
+
+  - name: create memusage script
+    copy:
+      dest: /usr/bin/memusage
+      mode: 0755
+      content: |
+        #!/usr/bin/env
+        free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }'
+
+  - name: create monstart script
+    copy:
+      dest: /usr/bin/monstart
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up
+
+  - name: create monstop script
+    copy:
+      dest: /usr/bin/monstop
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        ifconfig mon0 down && iw dev mon0 del
+
+  - name: configure rc.local
+    blockinfile:
+      path: /etc/rc.local
+      insertbefore: "exit 0"
+      block: |
+        if ! /opt/vc/bin/tvservice -s | grep HDMI; then
+          /opt/vc/bin/tvservice -o
+        fi
+        /root/pwnagotchi/scripts/startup.sh &
+
+  - name: configure usb interface
+    blockinfile:
+      path: /etc/network/interfaces.d/usb0.cfg
+      create: yes
+      block: |
+        allow-hotplug usb0
+        iface usb0 inet static
+          address 10.0.0.2
+          netmask 255.255.255.0
+          network 10.0.0.0
+          broadcast 10.0.0.255
+          gateway 10.0.0.1
+
+  - name: configure eth0 interface (pi2/3/4)
+    blockinfile:
+      path: /etc/network/interfaces.d/eth0.cfg
+      create: yes
+      block: |
+        allow-hotplug eth0
+        iface eth0 inet dhcp
+
+  - name: enable ssh on boot
+    file:
+      path: /boot/ssh
+      state: touch
+
+  - name: adjust /boot/config.txt
+    lineinfile:
+      dest: /boot/config.txt
+      insertafter: EOF
+      line: '{{ item }}'
+    with_items:
+      - "dtoverlay=dwc2"
+      - "dtparam=spi=on"
+      - "dtoverlay=spi1-3cs"
+      - "dtoverlay=pi3-disable-bt"
+      - "dtparam=audio=off"
+
+  - name: change root partition
+    replace:
+      dest: /boot/cmdline.txt
+      backup: no
+      regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+"
+      replace: "root=/dev/mmcblk0p2"
+
+  - name: configure /boot/cmdline.txt
+    lineinfile:
+      path: /boot/cmdline.txt
+      backrefs: True
+      state: present
+      backup: no
+      regexp: '(.*)$'
+      line: '\1 modules-load=dwc2,g_ether'
+
+  - name: configure ssh
+    lineinfile:
+      dest: /etc/ssh/sshd_config
+      backup: no
+      regexp: '#?PermitRootLogin (.*)$'
+      line: 'PermitRootLogin yes'
+
+  - name: configure motd
+    copy:
+      dest: /etc/motd
+      content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})"
+
+  - name: clean apt cache
+    apt:
+      autoclean: yes
+
+  - name: remove dependencies that are no longer required
+    apt:
+      autoremove: yes
+
+  - name: remove ssh keys
+    file:
+      state: absent
+      path: "{{item}}"
+    with_items:
+      - /etc/ssh/ssh_host_rsa_key
+      - /etc/ssh/ssh_host_rsa_key.pub
+      - /etc/ssh/ssh_host_dsa_key
+      - /etc/ssh/ssh_host_dsa_key.pub
+      - /etc/ssh/ssh_host/ecdsa_key
+      - /etc/ssh/ssh_host/ecdsa_key.pub
+      - /etc/ssh/ssh_host_ed25519_key
+      - /etc/ssh/ssh_host_ed25519_key.pub

From f7ef846d679b48af9d68175ae487aa24d604747f Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 16:46:22 +0100
Subject: [PATCH 04/62] try adding golang to apt

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index b7167a6..98f2dd2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,7 +19,7 @@ cache:
 
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
+- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang
 - sudo update-binfmts --display
 
 script:

From 88fcd399ac93125f4df497645bf550f3950aea95 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 16:51:13 +0100
Subject: [PATCH 05/62] add go get

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index e71c5b8..b81990b 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ install:
 	@unzip /tmp/packer.zip -d /tmp
 	@mv /tmp/packer /usr/bin/packer
 	@git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
-	@cd /tmp/packer-builder-arm-image && go build
+	@cd /tmp/packer-builder-arm-image && go get -d ./... && go build
 	@cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
 
 image:

From 4664790cc508dc4061785e54673a7391e7bd022d Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 17:01:58 +0100
Subject: [PATCH 06/62] remove golang from apt

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 98f2dd2..b7167a6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,7 +19,7 @@ cache:
 
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang
+- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
 - sudo update-binfmts --display
 
 script:

From 894e8de2900ff7c38998bb056d7e9f5d3f560d98 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 17:11:31 +0100
Subject: [PATCH 07/62] try with generic image

---
 .travis.yml | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index b7167a6..0366e05 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,5 @@
 dist: bionic
-language: go
-go:
-  - 1.x
+language: generic
 
 env:
   global:
@@ -19,7 +17,7 @@ cache:
 
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
+- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang
 - sudo update-binfmts --display
 
 script:

From 911c0478ba7e7bed6f268445ad1ca3e56e212cb2 Mon Sep 17 00:00:00 2001
From: Jeroen Massar <jeroen@massar.ch>
Date: Wed, 2 Oct 2019 18:15:52 +0200
Subject: [PATCH 08/62] Fix initial non-existent/empty log issue

Fixes bug where on initial session there is no file, and thus no lines
are read and one thus gets a index out of bounds error as lines is empty...
---
 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py
index d66008d..edf66ed 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py
@@ -160,6 +160,9 @@ class SessionParser(object):
                         break
             lines.reverse()
 
+        if len(lines) == 0:
+            lines.append("Initial Session");
+
         self.last_session = lines
         self.last_session_id = hashlib.md5(lines[0].encode()).hexdigest()
         self.last_saved_session_id = self._get_last_saved_session_id()

From e8f126b4085002f8f30ce80c3105d6123b6e4fde Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <caquino@users.noreply.github.com>
Date: Wed, 2 Oct 2019 17:21:41 +0100
Subject: [PATCH 09/62] Revert "initial packer/ansible base builder"

---
 .travis.yml             |  11 +-
 Makefile                |  22 ---
 builder/pwnagotchi.json |  26 ----
 builder/pwnagotchi.yml  | 289 ----------------------------------------
 4 files changed, 4 insertions(+), 344 deletions(-)
 delete mode 100644 Makefile
 delete mode 100644 builder/pwnagotchi.json
 delete mode 100644 builder/pwnagotchi.yml

diff --git a/.travis.yml b/.travis.yml
index 0366e05..a62fa93 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,26 +1,23 @@
 dist: bionic
 language: generic
-
 env:
   global:
   - LANG=C
   - LC_ALL=C
-
 before_cache:
 - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
 - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
-
 cache:
   apt: true
   directories:
   - tmp/
-
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang
+- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools
 - sudo update-binfmts --display
-
+- unset GOROOT
 script:
-- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
+- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img
+- zip -s 2g pwnagotchi.zip pwnagotchi.img
 
 # TODO: deploy!
diff --git a/Makefile b/Makefile
deleted file mode 100644
index b81990b..0000000
--- a/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-PWN_HOSTNAME="pwnagotchi"
-PWN_VERSION="master"
-
-all: install image clean
-
-install:
-	@curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
-	@unzip /tmp/packer.zip -d /tmp
-	@mv /tmp/packer /usr/bin/packer
-	@git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
-	@cd /tmp/packer-builder-arm-image && go get -d ./... && go build
-	@cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
-
-image:
-	@cd builder && sudo packer build pwnagotchi.json
-	@mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
-	@zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
-
-clean:
-	@rm -rf /tmp/packer-builder-arm-image
-	@rm -f pwnagotchi-raspbian-lite.img
-	@rm -rf builder/output-pwnagotchi  builder/packer_cache
diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json
deleted file mode 100644
index c78629e..0000000
--- a/builder/pwnagotchi.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "variables": {
-    "home": "{{env `HOME`}}"
-  },
-  "builders": [{
-    "name": "pwnagotchi",
-    "type": "arm-image",
-    "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip",
-    "iso_checksum_type":"sha256",
-    "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e",
-    "last_partition_extra_size" : 3221225472
-  }],
-  "provisioners": [
-    {
-      "type": "shell",
-      "inline": [
-        "apt-get -y update",
-        "apt-get install -y ansible"
-      ]
-    },
-    {
-      "type":"ansible-local",
-      "playbook_file": "pwnagotchi.yml"
-    }
-  ]
-}
diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
deleted file mode 100644
index 0672002..0000000
--- a/builder/pwnagotchi.yml
+++ /dev/null
@@ -1,289 +0,0 @@
----
-- hosts:
-    - 127.0.0.1
-  become: yes
-  vars:
-    pwn_hostname: "pwnagotchi"
-    pwn_version: "master"
-
-  tasks:
-
-  - name: selected hostname
-    debug:
-      msg: "{{ pwn_hostname }}"
-
-  - name: build version
-    debug:
-      msg: "{{ pwn_version }}"
-
-  - name: change hostname
-    hostname:
-      name: "{{pwn_hostname}}"
-
-  - name: add hostname to /etc/hosts
-    lineinfile:
-      dest: /etc/hosts
-      regexp: '^127\.0\.0\.1[ \t]+localhost'
-      line: '127.0.0.1 localhost {{pwn_hostname}} {{pwn_hostname}}.local'
-      state: present
-
-  - name: Add re4son-kernel repo key
-    apt_key:
-      url: https://re4son-kernel.com/keys/http/archive-key.asc
-      state: present
-
-  - name: Add re4son-kernel repository
-    apt_repository:
-      repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main
-      state: present
-
-  - name: update apt package cache
-    apt:
-      update_cache: yes
-
-  - name: upgrade apt distro
-    apt:
-      upgrade: dist
-
-  - name: install packages
-    apt:
-      name: "{{ packages }}"
-      state: present
-    vars:
-      packages:
-        - vim
-        - screen
-        - golang
-        - git
-        - build-essential
-        - python3-pip
-        - gawk
-        - libopenmpi-dev
-        - libatlas-base-dev
-        - libjasper-dev
-        - libqtgui4
-        - libqt4-test
-        - libopenjp2-7
-        - tcpdump
-        - lsof
-        - libilmbase23
-        - libopenexr23
-        - libgstreamer1.0-0
-        - libavcodec58
-        - libavformat58
-        - libswscale5
-        - libpcap-dev
-        - libusb-1.0-0-dev
-        - libnetfilter-queue-dev
-        - dphys-swapfile
-        - kalipi-kernel
-        - kalipi-bootloader
-        - kalipi-re4son-firmware
-        - kalipi-kernel-headers
-        - libraspberrypi0
-        - libraspberrypi-dev
-        - libraspberrypi-doc
-        - libraspberrypi-bin
-        - fonts-dejavu
-        - fonts-dejavu-core
-        - fonts-dejavu-extra
-
-  - name: configure dphys-swapfile
-    file:
-      path: /etc/dphys-swapfile
-      content: "CONF_SWAPSIZE=1024"
-
-  - name: disable unecessary services
-    systemd:
-      name: "{{services}}"
-      state: stopped
-      enabled: no
-    vars:
-      services:
-        - apt-daily.timer
-        - apt-daily.service
-        - apt-daily-upgrade.timer
-        - apt-daily-upgrade.service
-        - bluetooth.service
-        - triggerhappy.service
-
-  - name: enable dphys-swapfile service
-    systemd:
-      name: dphys-swapfile.service
-      state: started
-      enabled: yes
-
-  - name: build bettercap
-    command: go get -u github.com/bettercap/bettercap
-    environment:
-      GOPATH: /root/go
-
-  - name: install bettercap
-    copy:
-      src: /root/go/bin/bettercap
-      dest: /usr/bin/bettercap
-      mode: 0755
-
-  - name: clone bettercap caplets
-    git:
-      repo: https://github.com/bettercap/caplets.git
-      dest: /tmp/caplets
-
-  - name: install bettercap caplets
-    make:
-      chdir: /tmp/caplets
-      target: install
-
-  - name: clone pwnagotchi repository
-    git:
-      repo: https://github.com/evilsocket/pwnagotchi.git
-      dest: /tmp/pwnagotchi
-
-  - name: copy pwnagotchi files to final destination
-    copy:
-      src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/
-      dest: /root/pwnagotchi/
-      mode: preserve
-
-  - name: remove pwnagotchi files from temporary repository
-    file:
-      path: /tmp/pwnagotchi
-      state: absent
-
-  - name: install python modules
-    pip:
-      requirements: /root/pwnagotchi/scripts/requirements.txt
-
-  - name: create cpuusage script
-    copy:
-      dest: /usr/bin/cpuusage
-      mode: 0755
-      content: |
-        #!/usr/bin/env bash
-        while true
-        do
-          top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }'
-          sleep 3
-        done
-
-  - name: create memusage script
-    copy:
-      dest: /usr/bin/memusage
-      mode: 0755
-      content: |
-        #!/usr/bin/env
-        free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }'
-
-  - name: create monstart script
-    copy:
-      dest: /usr/bin/monstart
-      mode: 0755
-      content: |
-        #!/usr/bin/env bash
-        iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up
-
-  - name: create monstop script
-    copy:
-      dest: /usr/bin/monstop
-      mode: 0755
-      content: |
-        #!/usr/bin/env bash
-        ifconfig mon0 down && iw dev mon0 del
-
-  - name: configure rc.local
-    blockinfile:
-      path: /etc/rc.local
-      insertbefore: "exit 0"
-      block: |
-        if ! /opt/vc/bin/tvservice -s | grep HDMI; then
-          /opt/vc/bin/tvservice -o
-        fi
-        /root/pwnagotchi/scripts/startup.sh &
-
-  - name: configure usb interface
-    blockinfile:
-      path: /etc/network/interfaces.d/usb0.cfg
-      create: yes
-      block: |
-        allow-hotplug usb0
-        iface usb0 inet static
-          address 10.0.0.2
-          netmask 255.255.255.0
-          network 10.0.0.0
-          broadcast 10.0.0.255
-          gateway 10.0.0.1
-
-  - name: configure eth0 interface (pi2/3/4)
-    blockinfile:
-      path: /etc/network/interfaces.d/eth0.cfg
-      create: yes
-      block: |
-        allow-hotplug eth0
-        iface eth0 inet dhcp
-
-  - name: enable ssh on boot
-    file:
-      path: /boot/ssh
-      state: touch
-
-  - name: adjust /boot/config.txt
-    lineinfile:
-      dest: /boot/config.txt
-      insertafter: EOF
-      line: '{{ item }}'
-    with_items:
-      - "dtoverlay=dwc2"
-      - "dtparam=spi=on"
-      - "dtoverlay=spi1-3cs"
-      - "dtoverlay=pi3-disable-bt"
-      - "dtparam=audio=off"
-
-  - name: change root partition
-    replace:
-      dest: /boot/cmdline.txt
-      backup: no
-      regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+"
-      replace: "root=/dev/mmcblk0p2"
-
-  - name: configure /boot/cmdline.txt
-    lineinfile:
-      path: /boot/cmdline.txt
-      backrefs: True
-      state: present
-      backup: no
-      regexp: '(.*)$'
-      line: '\1 modules-load=dwc2,g_ether'
-
-  - name: configure ssh
-    lineinfile:
-      dest: /etc/ssh/sshd_config
-      backup: no
-      regexp: '#?PermitRootLogin (.*)$'
-      line: 'PermitRootLogin yes'
-
-  - name: configure motd
-    copy:
-      dest: /etc/motd
-      content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})"
-
-  - name: clean apt cache
-    apt:
-      autoclean: yes
-
-  - name: remove dependencies that are no longer required
-    apt:
-      autoremove: yes
-
-  - name: remove ssh keys
-    file:
-      state: absent
-      path: "{{item}}"
-    with_items:
-      - /etc/ssh/ssh_host_rsa_key
-      - /etc/ssh/ssh_host_rsa_key.pub
-      - /etc/ssh/ssh_host_dsa_key
-      - /etc/ssh/ssh_host_dsa_key.pub
-      - /etc/ssh/ssh_host/ecdsa_key
-      - /etc/ssh/ssh_host/ecdsa_key.pub
-      - /etc/ssh/ssh_host_ed25519_key
-      - /etc/ssh/ssh_host_ed25519_key.pub

From 58edfd2a4b3b6586b55a56e2be52c6c89c6cbd06 Mon Sep 17 00:00:00 2001
From: Jeroen Massar <jeroen@massar.ch>
Date: Wed, 2 Oct 2019 18:25:18 +0200
Subject: [PATCH 10/62] The -S option does not exist, as it is automatically
 detected (OPT_SPARSE)

---
 scripts/create_sibling.sh | 1 -
 1 file changed, 1 deletion(-)

diff --git a/scripts/create_sibling.sh b/scripts/create_sibling.sh
index f2d9c11..55b784f 100755
--- a/scripts/create_sibling.sh
+++ b/scripts/create_sibling.sh
@@ -265,7 +265,6 @@ usage: $0 [OPTIONS]
     -i <file>    # Provide the path of an already downloaded raspbian image
     -o <file>    # Name of the img-file (default: pwnagotchi.img)
     -s <size>    # Size which should be added to second partition (in Gigabyte) (default: 4)
-    -S           # Create a sparse image and generate bmap file (default when bmaptool is available)
     -v <version> # Version of raspbian (Supported: ${SUPPORTED_RASPBIAN_VERSIONS[*]}; default: latest)
     -p           # Only run provisioning (assumes the image is already mounted)
     -d           # Only run dependencies checks

From e0ddd0de57fb1ec8749f71e33c260fa03c749310 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 17:26:29 +0100
Subject: [PATCH 11/62] new builder system based on packer/ansible

---
 .travis.yml             |  16 ++-
 Makefile                |  22 +++
 builder/pwnagotchi.json |  26 ++++
 builder/pwnagotchi.yml  | 289 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 348 insertions(+), 5 deletions(-)
 create mode 100644 Makefile
 create mode 100644 builder/pwnagotchi.json
 create mode 100644 builder/pwnagotchi.yml

diff --git a/.travis.yml b/.travis.yml
index a62fa93..9d1a188 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,23 +1,29 @@
 dist: bionic
-language: generic
+language: go
+
+go:
+  - 1.x
+
 env:
   global:
   - LANG=C
   - LC_ALL=C
+
 before_cache:
 - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
 - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
+
 cache:
   apt: true
   directories:
   - tmp/
+
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools
+- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
 - sudo update-binfmts --display
-- unset GOROOT
+
 script:
-- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img
-- zip -s 2g pwnagotchi.zip pwnagotchi.img
+- sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
 
 # TODO: deploy!
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b81990b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,22 @@
+PWN_HOSTNAME="pwnagotchi"
+PWN_VERSION="master"
+
+all: install image clean
+
+install:
+	@curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
+	@unzip /tmp/packer.zip -d /tmp
+	@mv /tmp/packer /usr/bin/packer
+	@git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
+	@cd /tmp/packer-builder-arm-image && go get -d ./... && go build
+	@cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
+
+image:
+	@cd builder && sudo packer build pwnagotchi.json
+	@mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+	@zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+
+clean:
+	@rm -rf /tmp/packer-builder-arm-image
+	@rm -f pwnagotchi-raspbian-lite.img
+	@rm -rf builder/output-pwnagotchi  builder/packer_cache
diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json
new file mode 100644
index 0000000..c78629e
--- /dev/null
+++ b/builder/pwnagotchi.json
@@ -0,0 +1,26 @@
+{
+  "variables": {
+    "home": "{{env `HOME`}}"
+  },
+  "builders": [{
+    "name": "pwnagotchi",
+    "type": "arm-image",
+    "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip",
+    "iso_checksum_type":"sha256",
+    "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e",
+    "last_partition_extra_size" : 3221225472
+  }],
+  "provisioners": [
+    {
+      "type": "shell",
+      "inline": [
+        "apt-get -y update",
+        "apt-get install -y ansible"
+      ]
+    },
+    {
+      "type":"ansible-local",
+      "playbook_file": "pwnagotchi.yml"
+    }
+  ]
+}
diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
new file mode 100644
index 0000000..0672002
--- /dev/null
+++ b/builder/pwnagotchi.yml
@@ -0,0 +1,289 @@
+---
+- hosts:
+    - 127.0.0.1
+  become: yes
+  vars:
+    pwn_hostname: "pwnagotchi"
+    pwn_version: "master"
+
+  tasks:
+
+  - name: selected hostname
+    debug:
+      msg: "{{ pwn_hostname }}"
+
+  - name: build version
+    debug:
+      msg: "{{ pwn_version }}"
+
+  - name: change hostname
+    hostname:
+      name: "{{pwn_hostname}}"
+
+  - name: add hostname to /etc/hosts
+    lineinfile:
+      dest: /etc/hosts
+      regexp: '^127\.0\.0\.1[ \t]+localhost'
+      line: '127.0.0.1 localhost {{pwn_hostname}} {{pwn_hostname}}.local'
+      state: present
+
+  - name: Add re4son-kernel repo key
+    apt_key:
+      url: https://re4son-kernel.com/keys/http/archive-key.asc
+      state: present
+
+  - name: Add re4son-kernel repository
+    apt_repository:
+      repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main
+      state: present
+
+  - name: update apt package cache
+    apt:
+      update_cache: yes
+
+  - name: upgrade apt distro
+    apt:
+      upgrade: dist
+
+  - name: install packages
+    apt:
+      name: "{{ packages }}"
+      state: present
+    vars:
+      packages:
+        - vim
+        - screen
+        - golang
+        - git
+        - build-essential
+        - python3-pip
+        - gawk
+        - libopenmpi-dev
+        - libatlas-base-dev
+        - libjasper-dev
+        - libqtgui4
+        - libqt4-test
+        - libopenjp2-7
+        - tcpdump
+        - lsof
+        - libilmbase23
+        - libopenexr23
+        - libgstreamer1.0-0
+        - libavcodec58
+        - libavformat58
+        - libswscale5
+        - libpcap-dev
+        - libusb-1.0-0-dev
+        - libnetfilter-queue-dev
+        - dphys-swapfile
+        - kalipi-kernel
+        - kalipi-bootloader
+        - kalipi-re4son-firmware
+        - kalipi-kernel-headers
+        - libraspberrypi0
+        - libraspberrypi-dev
+        - libraspberrypi-doc
+        - libraspberrypi-bin
+        - fonts-dejavu
+        - fonts-dejavu-core
+        - fonts-dejavu-extra
+
+  - name: configure dphys-swapfile
+    file:
+      path: /etc/dphys-swapfile
+      content: "CONF_SWAPSIZE=1024"
+
+  - name: disable unecessary services
+    systemd:
+      name: "{{services}}"
+      state: stopped
+      enabled: no
+    vars:
+      services:
+        - apt-daily.timer
+        - apt-daily.service
+        - apt-daily-upgrade.timer
+        - apt-daily-upgrade.service
+        - bluetooth.service
+        - triggerhappy.service
+
+  - name: enable dphys-swapfile service
+    systemd:
+      name: dphys-swapfile.service
+      state: started
+      enabled: yes
+
+  - name: build bettercap
+    command: go get -u github.com/bettercap/bettercap
+    environment:
+      GOPATH: /root/go
+
+  - name: install bettercap
+    copy:
+      src: /root/go/bin/bettercap
+      dest: /usr/bin/bettercap
+      mode: 0755
+
+  - name: clone bettercap caplets
+    git:
+      repo: https://github.com/bettercap/caplets.git
+      dest: /tmp/caplets
+
+  - name: install bettercap caplets
+    make:
+      chdir: /tmp/caplets
+      target: install
+
+  - name: clone pwnagotchi repository
+    git:
+      repo: https://github.com/evilsocket/pwnagotchi.git
+      dest: /tmp/pwnagotchi
+
+  - name: copy pwnagotchi files to final destination
+    copy:
+      src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/
+      dest: /root/pwnagotchi/
+      mode: preserve
+
+  - name: remove pwnagotchi files from temporary repository
+    file:
+      path: /tmp/pwnagotchi
+      state: absent
+
+  - name: install python modules
+    pip:
+      requirements: /root/pwnagotchi/scripts/requirements.txt
+
+  - name: create cpuusage script
+    copy:
+      dest: /usr/bin/cpuusage
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        while true
+        do
+          top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }'
+          sleep 3
+        done
+
+  - name: create memusage script
+    copy:
+      dest: /usr/bin/memusage
+      mode: 0755
+      content: |
+        #!/usr/bin/env
+        free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }'
+
+  - name: create monstart script
+    copy:
+      dest: /usr/bin/monstart
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up
+
+  - name: create monstop script
+    copy:
+      dest: /usr/bin/monstop
+      mode: 0755
+      content: |
+        #!/usr/bin/env bash
+        ifconfig mon0 down && iw dev mon0 del
+
+  - name: configure rc.local
+    blockinfile:
+      path: /etc/rc.local
+      insertbefore: "exit 0"
+      block: |
+        if ! /opt/vc/bin/tvservice -s | grep HDMI; then
+          /opt/vc/bin/tvservice -o
+        fi
+        /root/pwnagotchi/scripts/startup.sh &
+
+  - name: configure usb interface
+    blockinfile:
+      path: /etc/network/interfaces.d/usb0.cfg
+      create: yes
+      block: |
+        allow-hotplug usb0
+        iface usb0 inet static
+          address 10.0.0.2
+          netmask 255.255.255.0
+          network 10.0.0.0
+          broadcast 10.0.0.255
+          gateway 10.0.0.1
+
+  - name: configure eth0 interface (pi2/3/4)
+    blockinfile:
+      path: /etc/network/interfaces.d/eth0.cfg
+      create: yes
+      block: |
+        allow-hotplug eth0
+        iface eth0 inet dhcp
+
+  - name: enable ssh on boot
+    file:
+      path: /boot/ssh
+      state: touch
+
+  - name: adjust /boot/config.txt
+    lineinfile:
+      dest: /boot/config.txt
+      insertafter: EOF
+      line: '{{ item }}'
+    with_items:
+      - "dtoverlay=dwc2"
+      - "dtparam=spi=on"
+      - "dtoverlay=spi1-3cs"
+      - "dtoverlay=pi3-disable-bt"
+      - "dtparam=audio=off"
+
+  - name: change root partition
+    replace:
+      dest: /boot/cmdline.txt
+      backup: no
+      regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+"
+      replace: "root=/dev/mmcblk0p2"
+
+  - name: configure /boot/cmdline.txt
+    lineinfile:
+      path: /boot/cmdline.txt
+      backrefs: True
+      state: present
+      backup: no
+      regexp: '(.*)$'
+      line: '\1 modules-load=dwc2,g_ether'
+
+  - name: configure ssh
+    lineinfile:
+      dest: /etc/ssh/sshd_config
+      backup: no
+      regexp: '#?PermitRootLogin (.*)$'
+      line: 'PermitRootLogin yes'
+
+  - name: configure motd
+    copy:
+      dest: /etc/motd
+      content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})"
+
+  - name: clean apt cache
+    apt:
+      autoclean: yes
+
+  - name: remove dependencies that are no longer required
+    apt:
+      autoremove: yes
+
+  - name: remove ssh keys
+    file:
+      state: absent
+      path: "{{item}}"
+    with_items:
+      - /etc/ssh/ssh_host_rsa_key
+      - /etc/ssh/ssh_host_rsa_key.pub
+      - /etc/ssh/ssh_host_dsa_key
+      - /etc/ssh/ssh_host_dsa_key.pub
+      - /etc/ssh/ssh_host/ecdsa_key
+      - /etc/ssh/ssh_host/ecdsa_key.pub
+      - /etc/ssh/ssh_host_ed25519_key
+      - /etc/ssh/ssh_host_ed25519_key.pub

From 956b8c7a67384c31a2a0ccd807a5b36b20015284 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 17:30:40 +0100
Subject: [PATCH 12/62] add output to makefile

---
 Makefile | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/Makefile b/Makefile
index b81990b..4e1b311 100644
--- a/Makefile
+++ b/Makefile
@@ -4,19 +4,19 @@ PWN_VERSION="master"
 all: install image clean
 
 install:
-	@curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
-	@unzip /tmp/packer.zip -d /tmp
-	@mv /tmp/packer /usr/bin/packer
-	@git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
-	@cd /tmp/packer-builder-arm-image && go get -d ./... && go build
-	@cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
+	curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
+	unzip /tmp/packer.zip -d /tmp
+	mv /tmp/packer /usr/bin/packer
+	git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image
+	cd /tmp/packer-builder-arm-image && go get -d ./... && go build
+	cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
 
 image:
-	@cd builder && sudo packer build pwnagotchi.json
-	@mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
-	@zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+	cd builder && sudo packer build pwnagotchi.json
+	mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
+	zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
 
 clean:
-	@rm -rf /tmp/packer-builder-arm-image
-	@rm -f pwnagotchi-raspbian-lite.img
-	@rm -rf builder/output-pwnagotchi  builder/packer_cache
+	rm -rf /tmp/packer-builder-arm-image
+	rm -f pwnagotchi-raspbian-lite.img
+	rm -rf builder/output-pwnagotchi  builder/packer_cache

From 9471d722afc39e0ed3e7e2ae6678f4d2f41f1f30 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 17:36:25 +0100
Subject: [PATCH 13/62] specify full path for packer

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 4e1b311..75ec0d1 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ install:
 	cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
 
 image:
-	cd builder && sudo packer build pwnagotchi.json
+	cd builder && sudo /usr/bin/packer build pwnagotchi.json
 	mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
 	zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img
 

From db48b7aa5268ae534f3ce3f0f7e37d728406952f Mon Sep 17 00:00:00 2001
From: Jeroen Massar <jeroen@massar.ch>
Date: Wed, 2 Oct 2019 18:39:15 +0200
Subject: [PATCH 14/62] Update waveshare v1 driver to "4.00" aka "2019.07.31"

from: https://github.com/waveshare/e-Paper/tree/master/RaspberryPi%26JetsonNano/python/lib/waveshare_epd
---
 .../pwnagotchi/ui/waveshare/v1/epd2in13.py    | 443 +++++++++---------
 .../pwnagotchi/ui/waveshare/v1/epdconfig.py   | 157 +++++--
 2 files changed, 344 insertions(+), 256 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py
index 5805086..b6de9da 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py
@@ -1,218 +1,225 @@
-# //*****************************************************************************
-# * | File        :	  epd2in13.py
-# * | Author      :   Waveshare team
-# * | Function    :   Electronic paper driver
-# * | Info        :
-# *----------------
-# * |	This version:   V3.1
-# * | Date        :   2019-03-20
-# * | Info        :   python3 demo
-# * fix: TurnOnDisplay()
-# ******************************************************************************//
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documnetation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and//or sell
-# copies of the Software, and to permit persons to  whom the Software is
-# furished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-
-
-from . import epdconfig
-from PIL import Image
-import RPi.GPIO as GPIO
-# import numpy as np
-
-# Display resolution
-EPD_WIDTH       = 122
-EPD_HEIGHT      = 250
-
-class EPD:
-    def __init__(self):
-        self.reset_pin = epdconfig.RST_PIN
-        self.dc_pin = epdconfig.DC_PIN
-        self.busy_pin = epdconfig.BUSY_PIN
-        self.width = EPD_WIDTH
-        self.height = EPD_HEIGHT
-    lut_full_update = [
-        0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
-        0x01, 0x00, 0x00, 0x00, 0x00, 0x00
-    ]
-
-    lut_partial_update  = [
-        0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-    ]
-        
-    # Hardware reset
-    def reset(self):
-        epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
-        epdconfig.delay_ms(200) 
-        epdconfig.digital_write(self.reset_pin, GPIO.LOW)         # module reset
-        epdconfig.delay_ms(200)
-        epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
-        epdconfig.delay_ms(200)   
-
-    def send_command(self, command):
-        epdconfig.digital_write(self.dc_pin, GPIO.LOW)
-        epdconfig.spi_writebyte([command])
-
-    def send_data(self, data):
-        epdconfig.digital_write(self.dc_pin, GPIO.HIGH)
-        epdconfig.spi_writebyte([data])
-        
-    def wait_until_idle(self):
-        # print("busy")
-        while(epdconfig.digital_read(self.busy_pin) == 1):      # 0: idle, 1: busy
-            epdconfig.delay_ms(100)
-        # print("free busy")
-
-    def TurnOnDisplay(self):
-        self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
-        self.send_data(0xC4)
-        self.send_command(0x20) # MASTER_ACTIVATION
-        self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE
-        self.wait_until_idle()
-
-    def init(self, lut):
-        if (epdconfig.module_init() != 0):
-            return -1
-        # EPD hardware init start
-        self.reset()
-        self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
-        self.send_data((EPD_HEIGHT - 1) & 0xFF)
-        self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF)
-        self.send_data(0x00) # GD = 0 SM = 0 TB = 0
-        
-        self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL
-        self.send_data(0xD7)
-        self.send_data(0xD6)
-        self.send_data(0x9D)
-        
-        self.send_command(0x2C) # WRITE_VCOM_REGISTER
-        self.send_data(0xA8) # VCOM 7C
-        
-        self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD
-        self.send_data(0x1A) # 4 dummy lines per gate
-        
-        self.send_command(0x3B) # SET_GATE_TIME
-        self.send_data(0x08) # 2us per line
-        
-        self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL
-        self.send_data(0x03)      
-        
-        self.send_command(0X11) # DATA_ENTRY_MODE_SETTING
-        self.send_data(0x03) # X increment; Y increment
-        
-        # WRITE_LUT_REGISTER
-        self.send_command(0x32)
-        for count in range(30):
-            self.send_data(lut[count])
-
-        return 0
-        
-##
- #  @brief: specify the memory area for data R//W
- ##
-    def SetWindows(self, x_start, y_start, x_end, y_end):
-        self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
-        self.send_data((x_start >> 3) & 0xFF)
-        self.send_data((x_end >> 3) & 0xFF)
-        self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
-        self.send_data(y_start & 0xFF)
-        self.send_data((y_start >> 8) & 0xFF)
-        self.send_data(y_end & 0xFF)
-        self.send_data((y_end >> 8) & 0xFF)
-
-##
- #  @brief: specify the start point for data R//W
- ##
-    def SetCursor(self, x, y):
-        self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER
-        # x point must be the multiple of 8 or the last 3 bits will be ignored
-        self.send_data((x >> 3) & 0xFF)
-        self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER
-        self.send_data(y & 0xFF)
-        self.send_data((y >> 8) & 0xFF)
-        self.wait_until_idle()
-        
-    def getbuffer(self, image):
-        if self.width%8 == 0:
-            linewidth = self.width//8
-        else:
-            linewidth = self.width//8 + 1
-         
-        buf = [0xFF] * (linewidth * self.height)
-        image_monocolor = image.convert('1')
-        imwidth, imheight = image_monocolor.size
-        pixels = image_monocolor.load()
-        
-        if(imwidth == self.width and imheight == self.height):
-            # print("Vertical")
-            for y in range(imheight):
-                for x in range(imwidth):                    
-                    if pixels[x, y] == 0:
-                        # x = imwidth - x
-                        buf[x // 8 + y * linewidth] &= ~(0x80 >> (x % 8))
-        elif(imwidth == self.height and imheight == self.width):
-            # print("Horizontal")
-            for y in range(imheight):
-                for x in range(imwidth):
-                    newx = y
-                    newy = self.height - x - 1
-                    if pixels[x, y] == 0:
-                        # newy = imwidth - newy - 1
-                        buf[newx // 8 + newy*linewidth] &= ~(0x80 >> (y % 8))
-        return buf   
-
-        
-    def display(self, image):
-        if self.width%8 == 0:
-            linewidth = self.width//8
-        else:
-            linewidth = self.width//8 + 1
-
-        self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT);
-        for j in range(0, self.height):
-            self.SetCursor(0, j);
-            self.send_command(0x24);
-            for i in range(0, linewidth):
-                self.send_data(image[i + j * linewidth])   
-        self.TurnOnDisplay()
-    
-    def Clear(self, color):
-        if self.width%8 == 0:
-            linewidth = self.width//8
-        else:
-            linewidth = self.width//8 + 1
-
-        self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT);
-        for j in range(0, self.height):
-            self.SetCursor(0, j);
-            self.send_command(0x24);
-            for i in range(0, linewidth):
-                self.send_data(color)   
-        self.TurnOnDisplay()
-
-    def sleep(self):
-        self.send_command(0x10) #enter deep sleep
-        # self.send_data(0x01)
-        epdconfig.delay_ms(100)    
-
-### END OF FILE ###
-
+# *****************************************************************************
+# * | File        :	  epd2in13.py
+# * | Author      :   Waveshare team
+# * | Function    :   Electronic paper driver
+# * | Info        :
+# *----------------
+# * | This version:   V4.0
+# * | Date        :   2019-06-20
+# # | Info        :   python demo
+# -----------------------------------------------------------------------------
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documnetation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to  whom the Software is
+# furished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+
+import logging
+from . import epdconfig
+import numpy as np
+
+# Display resolution
+EPD_WIDTH       = 122
+EPD_HEIGHT      = 250
+
+class EPD:
+    def __init__(self):
+        self.reset_pin = epdconfig.RST_PIN
+        self.dc_pin = epdconfig.DC_PIN
+        self.busy_pin = epdconfig.BUSY_PIN
+        self.cs_pin = epdconfig.CS_PIN
+        self.width = EPD_WIDTH
+        self.height = EPD_HEIGHT
+
+    lut_full_update = [
+        0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
+        0x01, 0x00, 0x00, 0x00, 0x00, 0x00
+    ]
+
+    lut_partial_update  = [
+        0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    ]
+        
+    # Hardware reset
+    def reset(self):
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(200) 
+        epdconfig.digital_write(self.reset_pin, 0)
+        epdconfig.delay_ms(10)
+        epdconfig.digital_write(self.reset_pin, 1)
+        epdconfig.delay_ms(200)   
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def send_command(self, command):
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.digital_write(self.dc_pin, 0)
+        epdconfig.spi_writebyte([command])
+        epdconfig.digital_write(self.cs_pin, 1)
+
+    def send_data(self, data):
+        epdconfig.digital_write(self.cs_pin, 0)
+        epdconfig.digital_write(self.dc_pin, 1)
+        epdconfig.spi_writebyte([data])
+        epdconfig.digital_write(self.cs_pin, 1)
+        
+    def ReadBusy(self):
+        while(epdconfig.digital_read(self.busy_pin) == 1):      # 0: idle, 1: busy
+            epdconfig.delay_ms(100)            
+
+    def TurnOnDisplay(self):
+        self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
+        self.send_data(0xC4)
+        self.send_command(0x20) # MASTER_ACTIVATION
+        self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE
+
+        logging.debug("e-Paper busy")
+        self.ReadBusy()
+        logging.debug("e-Paper busy release")
+
+    def init(self, lut):
+        if (epdconfig.module_init() != 0):
+            return -1
+        # EPD hardware init start
+        self.reset()
+        self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
+        self.send_data((EPD_HEIGHT - 1) & 0xFF)
+        self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF)
+        self.send_data(0x00) # GD = 0 SM = 0 TB = 0
+        
+        self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL
+        self.send_data(0xD7)
+        self.send_data(0xD6)
+        self.send_data(0x9D)
+        
+        self.send_command(0x2C) # WRITE_VCOM_REGISTER
+        self.send_data(0xA8) # VCOM 7C
+        
+        self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD
+        self.send_data(0x1A) # 4 dummy lines per gate
+        
+        self.send_command(0x3B) # SET_GATE_TIME
+        self.send_data(0x08) # 2us per line
+        
+        self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL
+        self.send_data(0x03)      
+        
+        self.send_command(0X11) # DATA_ENTRY_MODE_SETTING
+        self.send_data(0x03) # X increment; Y increment
+        
+        # WRITE_LUT_REGISTER
+        self.send_command(0x32)
+        for count in range(30):
+            self.send_data(lut[count])
+
+        return 0
+        
+##
+ #  @brief: specify the memory area for data R/W
+ ##
+    def SetWindows(self, x_start, y_start, x_end, y_end):
+        self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
+        self.send_data((x_start >> 3) & 0xFF)
+        self.send_data((x_end >> 3) & 0xFF)
+        self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
+        self.send_data(y_start & 0xFF)
+        self.send_data((y_start >> 8) & 0xFF)
+        self.send_data(y_end & 0xFF)
+        self.send_data((y_end >> 8) & 0xFF)
+
+##
+ #  @brief: specify the start point for data R/W
+ ##
+    def SetCursor(self, x, y):
+        self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER
+        # x point must be the multiple of 8 or the last 3 bits will be ignored
+        self.send_data((x >> 3) & 0xFF)
+        self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER
+        self.send_data(y & 0xFF)
+        self.send_data((y >> 8) & 0xFF)
+        self.ReadBusy()
+        
+    def getbuffer(self, image):
+        if self.width%8 == 0:
+            linewidth = int(self.width/8)
+        else:
+            linewidth = int(self.width/8) + 1
+         
+        buf = [0xFF] * (linewidth * self.height)
+        image_monocolor = image.convert('1')
+        imwidth, imheight = image_monocolor.size
+        pixels = image_monocolor.load()
+        
+        if(imwidth == self.width and imheight == self.height):
+            for y in range(imheight):
+                for x in range(imwidth):                    
+                    if pixels[x, y] == 0:
+                        # x = imwidth - x
+                        buf[int(x / 8) + y * linewidth] &= ~(0x80 >> (x % 8))
+        elif(imwidth == self.height and imheight == self.width):
+            for y in range(imheight):
+                for x in range(imwidth):
+                    newx = y
+                    newy = self.height - x - 1
+                    if pixels[x, y] == 0:
+                        # newy = imwidth - newy - 1
+                        buf[int(newx / 8) + newy*linewidth] &= ~(0x80 >> (y % 8))
+        return buf   
+
+        
+    def display(self, image):
+        if self.width%8 == 0:
+            linewidth = int(self.width/8)
+        else:
+            linewidth = int(self.width/8) + 1
+
+        self.SetWindows(0, 0, self.width, self.height);
+        for j in range(0, self.height):
+            self.SetCursor(0, j);
+            self.send_command(0x24);
+            for i in range(0, linewidth):
+                self.send_data(image[i + j * linewidth])   
+        self.TurnOnDisplay()
+    
+    def Clear(self, color):
+        if self.width%8 == 0:
+            linewidth = int(self.width/8)
+        else:
+            linewidth = int(self.width/8) + 1
+
+        self.SetWindows(0, 0, self.width, self.height);
+        for j in range(0, self.height):
+            self.SetCursor(0, j);
+            self.send_command(0x24);
+            for i in range(0, linewidth):
+                self.send_data(color)   
+        self.TurnOnDisplay()
+
+    def sleep(self):
+        self.send_command(0x10) #enter deep sleep
+        self.send_data(0x01)
+        epdconfig.delay_ms(100)
+         
+        epdconfig.module_exit()
+        
+### END OF FILE ###
+
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py
index 78ff647..76d8ca9 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py
@@ -1,19 +1,13 @@
 # /*****************************************************************************
-# * | File        :	  EPD_1in54.py
+# * | File        :	  epdconfig.py
 # * | Author      :   Waveshare team
 # * | Function    :   Hardware underlying interface
 # * | Info        :
 # *----------------
-# * |	This version:   V2.0
-# * | Date        :   2018-11-01
+# * | This version:   V1.0
+# * | Date        :   2019-06-21
 # * | Info        :   
-# * 1.Remove:
-#   digital_write(self, pin, value)
-#   digital_read(self, pin)
-#   delay_ms(self, delaytime)
-#   set_lut(self, lut)
-#   self.lut = self.lut_full_update
-# ******************************************************************************/
+# ******************************************************************************
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documnetation files (the "Software"), to deal
 # in the Software without restriction, including without limitation the rights
@@ -33,41 +27,128 @@
 # THE SOFTWARE.
 #
 
-
-import spidev
-import RPi.GPIO as GPIO
+import os
+import logging
+import sys
 import time
 
-# Pin definition
-RST_PIN         = 17
-DC_PIN          = 25
-CS_PIN          = 8
-BUSY_PIN        = 24
 
-# SPI device, bus = 0, device = 0
-SPI = spidev.SpiDev(0, 0)
+class RaspberryPi:
+    # Pin definition
+    RST_PIN         = 17
+    DC_PIN          = 25
+    CS_PIN          = 8
+    BUSY_PIN        = 24
 
-def digital_write(pin, value):
-    GPIO.output(pin, value)
+    def __init__(self):
+        import spidev
+        import RPi.GPIO
 
-def digital_read(pin):
-    return GPIO.input(BUSY_PIN)
+        self.GPIO = RPi.GPIO
 
-def delay_ms(delaytime):
-    time.sleep(delaytime / 1000.0)
+        # SPI device, bus = 0, device = 0
+        self.SPI = spidev.SpiDev(0, 0)
 
-def spi_writebyte(data):
-    SPI.writebytes(data)
+    def digital_write(self, pin, value):
+        self.GPIO.output(pin, value)
+
+    def digital_read(self, pin):
+        return self.GPIO.input(self.BUSY_PIN)
+
+    def delay_ms(self, delaytime):
+        time.sleep(delaytime / 1000.0)
+
+    def spi_writebyte(self, data):
+        self.SPI.writebytes(data)
+
+    def module_init(self):
+        self.GPIO.setmode(self.GPIO.BCM)
+        self.GPIO.setwarnings(False)
+        self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
+        self.SPI.max_speed_hz = 4000000
+        self.SPI.mode = 0b00
+        return 0
+
+    def module_exit(self):
+        logging.debug("spi end")
+        self.SPI.close()
+
+        logging.debug("close 5V, Module enters 0 power consumption ...")
+        self.GPIO.output(self.RST_PIN, 0)
+        self.GPIO.output(self.DC_PIN, 0)
+
+        self.GPIO.cleanup()
+
+
+class JetsonNano:
+    # Pin definition
+    RST_PIN         = 17
+    DC_PIN          = 25
+    CS_PIN          = 8
+    BUSY_PIN        = 24
+
+    def __init__(self):
+        import ctypes
+        find_dirs = [
+            os.path.dirname(os.path.realpath(__file__)),
+            '/usr/local/lib',
+            '/usr/lib',
+        ]
+        self.SPI = None
+        for find_dir in find_dirs:
+            so_filename = os.path.join(find_dir, 'sysfs_software_spi.so')
+            if os.path.exists(so_filename):
+                self.SPI = ctypes.cdll.LoadLibrary(so_filename)
+                break
+        if self.SPI is None:
+            raise RuntimeError('Cannot find sysfs_software_spi.so')
+
+        import Jetson.GPIO
+        self.GPIO = Jetson.GPIO
+
+    def digital_write(self, pin, value):
+        self.GPIO.output(pin, value)
+
+    def digital_read(self, pin):
+        return self.GPIO.input(self.BUSY_PIN)
+
+    def delay_ms(self, delaytime):
+        time.sleep(delaytime / 1000.0)
+
+    def spi_writebyte(self, data):
+        self.SPI.SYSFS_software_spi_transfer(data[0])
+
+    def module_init(self):
+        self.GPIO.setmode(self.GPIO.BCM)
+        self.GPIO.setwarnings(False)
+        self.GPIO.setup(self.RST_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.DC_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.CS_PIN, self.GPIO.OUT)
+        self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN)
+        self.SPI.SYSFS_software_spi_begin()
+        return 0
+
+    def module_exit(self):
+        logging.debug("spi end")
+        self.SPI.SYSFS_software_spi_end()
+
+        logging.debug("close 5V, Module enters 0 power consumption ...")
+        self.GPIO.output(self.RST_PIN, 0)
+        self.GPIO.output(self.DC_PIN, 0)
+
+        self.GPIO.cleanup()
+
+
+if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'):
+    implementation = RaspberryPi()
+else:
+    implementation = JetsonNano()
+
+for func in [x for x in dir(implementation) if not x.startswith('_')]:
+    setattr(sys.modules[__name__], func, getattr(implementation, func))
 
-def module_init():
-    GPIO.setmode(GPIO.BCM)
-    GPIO.setwarnings(False)
-    GPIO.setup(RST_PIN, GPIO.OUT)
-    GPIO.setup(DC_PIN, GPIO.OUT)
-    GPIO.setup(CS_PIN, GPIO.OUT)
-    GPIO.setup(BUSY_PIN, GPIO.IN)
-    SPI.max_speed_hz = 2000000
-    SPI.mode = 0b00
-    return 0;
 
 ### END OF FILE ###

From 47042f0946b5d1987aacdbfebe10992bde280eb8 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Wed, 2 Oct 2019 19:01:07 +0200
Subject: [PATCH 15/62] new: implemented plugin system (closes #54)

---
 README.md                                     |   6 +
 sdcard/rootfs/root/pwnagotchi/config.yml      |   4 +-
 sdcard/rootfs/root/pwnagotchi/scripts/main.py |  77 +++++----
 .../pwnagotchi/scripts/pwnagotchi/agent.py    |  24 ++-
 .../pwnagotchi/scripts/pwnagotchi/ai/epoch.py |   4 +-
 .../pwnagotchi/scripts/pwnagotchi/ai/train.py |  30 +++-
 .../scripts/pwnagotchi/mesh/utils.py          |   4 +-
 .../scripts/pwnagotchi/plugins/__init__.py    |  45 +++++
 .../pwnagotchi/plugins/default/example.py     | 162 ++++++++++++++++++
 .../pwnagotchi/plugins/default/ups_lite.py    |  65 +++++++
 .../scripts/pwnagotchi/ui/display.py          |   4 +-
 .../pwnagotchi/scripts/pwnagotchi/ui/state.py |   3 +
 .../pwnagotchi/scripts/pwnagotchi/ui/view.py  |  17 +-
 13 files changed, 397 insertions(+), 48 deletions(-)
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py

diff --git a/README.md b/README.md
index 45644e4..b0331f8 100644
--- a/README.md
+++ b/README.md
@@ -148,6 +148,12 @@ Now you can use the `preview.py`-script to preview the changes:
 # Now open http://localhost:8080 and http://localhost:8081
 ```
 
+### Plugins
+
+Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere
+as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins) for a list of default 
+plugins and all the callbacks that you can define for your own customizations.
+
 ### Random Info
 
 - `hostname` sets the unit name.
diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml
index 8da7bc9..7cf1c6f 100644
--- a/sdcard/rootfs/root/pwnagotchi/config.yml
+++ b/sdcard/rootfs/root/pwnagotchi/config.yml
@@ -2,6 +2,8 @@
 main:
     # currently implemented: en (default), de, nl, it
     lang: en
+    # custom plugins path, if null only default plugins with be loaded
+    plugins: null
     # monitor interface to use
     iface: mon0
     # command to run to bring the mon interface up in case it's not up already
@@ -21,7 +23,7 @@ main:
 
 ai:
     # if false, only the default 'personality' will be used
-    enabled: true
+    enabled: false
     path: /root/brain.nn
     # 1.0 - laziness = probability of start training
     laziness: 0.1
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/main.py b/sdcard/rootfs/root/pwnagotchi/scripts/main.py
index 10e0490..09f6ec3 100755
--- a/sdcard/rootfs/root/pwnagotchi/scripts/main.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/main.py
@@ -5,7 +5,7 @@ import time
 import traceback
 
 import core
-import pwnagotchi
+import pwnagotchi, pwnagotchi.plugins as plugins
 
 from pwnagotchi.log import SessionParser
 from pwnagotchi.voice import Voice
@@ -25,39 +25,49 @@ args = parser.parse_args()
 if args.do_clear:
     print("clearing the display ...")
     with open(args.config, 'rt') as fp:
-      config = yaml.safe_load(fp)
-      cleardisplay=config['ui']['display']['type']
-      if cleardisplay in ('inkyphat', 'inky'):
-              print("inky display")
-              from inky import InkyPHAT
-              epd = InkyPHAT(config['ui']['display']['color'])
-              epd.set_border(InkyPHAT.BLACK)
-              self._render_cb = self._inky_render
-      elif cleardisplay in ('papirus', 'papi'):
-              print("papirus display")
-              from pwnagotchi.ui.papirus.epd import EPD
-              os.environ['EPD_SIZE'] = '2.0'
-              epd = EPD()
-              epd.clear()
-      elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'):
-              print("waveshare v1 display")
-              from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD
-              epd = EPD()
-              epd.init(epd.lut_full_update)
-              epd.Clear(0xFF)
-      elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'):
-              print("waveshare v2 display")
-              from pwnagotchi.ui.waveshare.v2.waveshare import EPD
-              epd = EPD()
-              epd.init(epd.FULL_UPDATE)
-              epd.Clear(0xff)
-      else:
-              print("unknown display type %s" % cleardisplay)
-      quit()
+        config = yaml.safe_load(fp)
+        cleardisplay = config['ui']['display']['type']
+        if cleardisplay in ('inkyphat', 'inky'):
+            print("inky display")
+            from inky import InkyPHAT
+
+            epd = InkyPHAT(config['ui']['display']['color'])
+            epd.set_border(InkyPHAT.BLACK)
+            self._render_cb = self._inky_render
+        elif cleardisplay in ('papirus', 'papi'):
+            print("papirus display")
+            from pwnagotchi.ui.papirus.epd import EPD
+
+            os.environ['EPD_SIZE'] = '2.0'
+            epd = EPD()
+            epd.clear()
+        elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'):
+            print("waveshare v1 display")
+            from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD
+
+            epd = EPD()
+            epd.init(epd.lut_full_update)
+            epd.Clear(0xFF)
+        elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'):
+            print("waveshare v2 display")
+            from pwnagotchi.ui.waveshare.v2.waveshare import EPD
+
+            epd = EPD()
+            epd.init(epd.FULL_UPDATE)
+            epd.Clear(0xff)
+        else:
+            print("unknown display type %s" % cleardisplay)
+        quit()
 
 with open(args.config, 'rt') as fp:
     config = yaml.safe_load(fp)
 
+plugins.load_from_path(plugins.default_path)
+if 'plugins' in config['main'] and config['main']['plugins'] is not None:
+    plugins.load_from_path(config['main']['plugins'])
+
+plugins.on('loaded')
+
 display = Display(config=config, state={'name': '%s>' % pwnagotchi.name()})
 agent = Agent(view=display, config=config)
 
@@ -65,6 +75,9 @@ core.log("%s@%s (v%s)" % (pwnagotchi.name(), agent._identity, pwnagotchi.version
 # for key, value in config['personality'].items():
 #    core.log("  %s: %s" % (key, value))
 
+for _, plugin in plugins.loaded.items():
+    core.log("plugin '%s' v%s loaded from %s" % (plugin.__name__, plugin.__version__, plugin.__file__))
+
 if args.do_manual:
     core.log("entering manual mode ...")
 
@@ -112,13 +125,15 @@ core.logfile = config['main']['log']
 
 agent.start_ai()
 agent.setup_events()
-agent.set_ready()
+agent.set_starting()
 agent.start_monitor_mode()
 agent.start_event_polling()
 
 # print initial stats
 agent.next_epoch()
 
+agent.set_ready()
+
 while True:
     try:
         # recon on all channels
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
index 1fa5112..bf9ecca 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
@@ -8,6 +8,7 @@ import _thread
 
 import core
 
+import pwnagotchi.plugins as plugins
 from bettercap.client import Client
 from pwnagotchi.mesh.utils import AsyncAdvertiser
 from pwnagotchi.ai.train import AsyncTrainer
@@ -47,29 +48,35 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
     def supported_channels(self):
         return self._supported_channels
 
-    def on_ai_ready(self):
-        self._view.on_ai_ready()
+    def set_starting(self):
+        self._view.on_starting()
 
     def set_ready(self):
-        self._view.on_starting()
+        plugins.on('ready', self)
 
     def set_free_channel(self, channel):
         self._view.on_free_channel(channel)
+        plugins.on('free_channel', self, channel)
 
     def set_bored(self):
         self._view.on_bored()
+        plugins.on('bored', self)
 
     def set_sad(self):
         self._view.on_sad()
+        plugins.on('sad', self)
 
     def set_excited(self):
         self._view.on_excited()
+        plugins.on('excited', self)
 
     def set_lonely(self):
         self._view.on_lonely()
+        plugins.on('lonely', self)
 
     def set_rebooting(self):
         self._view.on_rebooting()
+        plugins.on('rebooting', self)
 
     def setup_events(self):
         core.log("connecting to %s ..." % self.url)
@@ -128,6 +135,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
         self.start_advertising()
 
     def wait_for(self, t, sleeping=True):
+        plugins.on('sleep' if sleeping else 'wait', self, t)
         self._view.wait(t, sleeping)
         self._epoch.track(sleep=True, inc=t)
 
@@ -179,6 +187,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
 
     def set_access_points(self, aps):
         self._access_points = aps
+        plugins.on('wifi_update', self, aps)
         self._epoch.observe(aps, self._advertiser.peers() if self._advertiser is not None else ())
         return self._access_points
 
@@ -338,6 +347,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                         if apsta is None:
                             core.log("!!! captured new handshake: %s !!!" % key)
                             self._last_pwnd = ap_mac
+                            plugins.on('handshake', self, ap_mac, sta_mac)
                         else:
                             (ap, sta) = apsta
                             self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
@@ -346,6 +356,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                                 ap['channel'],
                                 sta['mac'], sta['vendor'],
                                 ap['hostname'], ap['mac'], ap['vendor']))
+                            plugins.on('handshake', self, ap, sta)
 
             except Exception as e:
                 core.log("error: %s" % e)
@@ -419,6 +430,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
             except Exception as e:
                 self._on_error(ap['mac'], e)
 
+            plugins.on('association', self, ap)
             if throttle > 0:
                 time.sleep(throttle)
             self._view.on_normal()
@@ -439,6 +451,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
             except Exception as e:
                 self._on_error(sta['mac'], e)
 
+            plugins.on('deauthentication', self, ap, sta)
             if throttle > 0:
                 time.sleep(throttle)
             self._view.on_normal()
@@ -470,6 +483,9 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                 self._current_channel = channel
                 self._epoch.track(hop=True)
                 self._view.set('channel', '%d' % channel)
+
+                plugins.on('channel_hop', self, channel)
+
             except Exception as e:
                 core.log("error: %s" % e)
 
@@ -509,6 +525,8 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
             core.log("%d epochs with activity -> excited" % self._epoch.active_for)
             self.set_excited()
 
+        plugins.on('epoch', self, self._epoch.epoch - 1, self._epoch.data())
+
         if self._epoch.blind_for >= self._config['main']['mon_max_blind_epochs']:
             core.log("%d epochs without visible access points -> rebooting ..." % self._epoch.blind_for)
             self._reboot()
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py
index bdd8c2e..8508eb9 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py
@@ -7,6 +7,7 @@ import pwnagotchi.mesh.wifi as wifi
 
 from pwnagotchi.ai.reward import RewardFunction
 
+
 class Epoch(object):
     def __init__(self, config):
         self.epoch = 0
@@ -92,7 +93,8 @@ class Epoch(object):
             try:
                 peers_per_chan[peer.last_channel - 1] += 1.0
             except IndexError as e:
-                core.log("got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels))
+                core.log(
+                    "got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels))
 
         # normalize
         aps_per_chan = [e / num_aps for e in aps_per_chan]
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py
index 1312715..34140dd 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py
@@ -7,6 +7,7 @@ import json
 
 import core
 
+import pwnagotchi.plugins as plugins
 import pwnagotchi.ai as ai
 from pwnagotchi.ai.epoch import Epoch
 
@@ -68,14 +69,14 @@ class Stats(object):
             core.log("[ai] saving %s" % self.path)
 
             data = json.dumps({
-                    'born_at': self.born_at,
-                    'epochs_lived': self.epochs_lived,
-                    'epochs_trained': self.epochs_trained,
-                    'rewards': {
-                        'best': self.best_reward,
-                        'worst': self.worst_reward
-                    }
-                })
+                'born_at': self.born_at,
+                'epochs_lived': self.epochs_lived,
+                'epochs_trained': self.epochs_trained,
+                'rewards': {
+                    'best': self.best_reward,
+                    'worst': self.worst_reward
+                }
+            })
 
             temp = "%s.tmp" % self.path
             with open(temp, 'wt') as fp:
@@ -98,6 +99,11 @@ class AsyncTrainer(object):
         self._is_training = training
         self._training_epochs = for_epochs
 
+        if training:
+            plugins.on('ai_training_start', self, for_epochs)
+        else:
+            plugins.on('ai_training_end', self)
+
     def is_training(self):
         return self._is_training
 
@@ -123,8 +129,10 @@ class AsyncTrainer(object):
 
     def on_ai_training_step(self, _locals, _globals):
         self._model.env.render()
+        plugins.on('ai_training_step', self, _locals, _globals)
 
     def on_ai_policy(self, new_params):
+        plugins.on('ai_policy', self, new_params)
         core.log("[ai] setting new policy:")
         for name, value in new_params.items():
             if name in self._config['personality']:
@@ -139,13 +147,19 @@ class AsyncTrainer(object):
         self.run('set wifi.sta.ttl %d' % self._config['personality']['sta_ttl'])
         self.run('set wifi.rssi.min %d' % self._config['personality']['min_rssi'])
 
+    def on_ai_ready(self):
+        self._view.on_ai_ready()
+        plugins.on('ai_ready', self)
+
     def on_ai_best_reward(self, r):
         core.log("[ai] best reward so far: %s" % r)
         self._view.on_motivated(r)
+        plugins.on('ai_best_reward', self, r)
 
     def on_ai_worst_reward(self, r):
         core.log("[ai] worst reward so far: %s" % r)
         self._view.on_demotivated(r)
+        plugins.on('ai_worst_reward', self, r)
 
     def _ai_worker(self):
         self._model = ai.load(self._config, self, self._epoch)
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py
index c99cd57..8c84b94 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py
@@ -1,7 +1,7 @@
 import _thread
 
 import core
-import pwnagotchi
+import pwnagotchi, pwnagotchi.plugins as plugins
 from pwnagotchi.mesh import get_identity
 
 
@@ -37,6 +37,8 @@ class AsyncAdvertiser(object):
 
     def _on_new_unit(self, peer):
         self._view.on_new_peer(peer)
+        plugins.on('peer_detected', self, peer)
 
     def _on_lost_unit(self, peer):
         self._view.on_lost_peer(peer)
+        plugins.on('peer_lost', self, peer)
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
new file mode 100644
index 0000000..6f84a90
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
@@ -0,0 +1,45 @@
+import os
+import glob
+import importlib, importlib.util
+
+# import core
+
+default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default")
+loaded = {}
+
+
+def dummy_callback():
+    pass
+
+
+def on(event_name, *args, **kwargs):
+    global loaded
+    cb_name = 'on_%s' % event_name
+    for _, plugin in loaded.items():
+        if cb_name in plugin.__dict__:
+            # print("calling %s %s(%s)" %(cb_name, args, kwargs))
+            plugin.__dict__[cb_name](*args, **kwargs)
+
+
+def load_from_file(filename):
+    plugin_name = os.path.basename(filename.replace(".py", ""))
+    spec = importlib.util.spec_from_file_location(plugin_name, filename)
+    instance = importlib.util.module_from_spec(spec)
+    spec.loader.exec_module(instance)
+    return plugin_name, instance
+
+
+def load_from_path(path):
+    global loaded
+
+    for filename in glob.glob(os.path.join(path, "*.py")):
+        name, plugin = load_from_file(filename)
+        if name in loaded:
+            raise Exception("plugin %s already loaded from %s" % (name, plugin.__file__))
+        elif not plugin.__enabled__:
+            # print("plugin %s is not enabled" % name)
+            pass
+        else:
+            loaded[name] = plugin
+
+    return loaded
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
new file mode 100644
index 0000000..60efbd2
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
@@ -0,0 +1,162 @@
+__author__ = 'evilsocket@gmail.com'
+__version__ = '1.0.0'
+__name__ = 'hello_world'
+__license__ = 'GPL3'
+__description__ = 'An example plugin for pwnagotchi that implements all the available callbacks.'
+__enabled__ = False  # IMPORTANT: set this to True to enable your plugin.
+
+from pwnagotchi.ui.components import LabeledValue
+from pwnagotchi.ui.view import BLACK
+import pwnagotchi.ui.fonts as fonts
+import core
+
+
+# called when the plugin is loaded
+def on_loaded():
+    core.log("WARNING: plugin %s should be disabled!" % __name__)
+
+
+# called to setup the ui elements
+def on_ui_setup(ui):
+    # add custom UI elements
+    ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),
+                                       label_font=fonts.Bold, text_font=fonts.Medium))
+
+
+# called when the ui is updated
+def on_ui_update(ui):
+    # update those elements
+    some_voltage = 0.1
+    some_capacity = 100.0
+
+    ui.set('ups', "%4.2fV/%2i%%" % (some_voltage, some_capacity))
+
+
+# called when the hardware display setup is done, display is an hardware specific object
+def on_display_setup(display):
+    pass
+
+
+# called when everything is ready and the main loop is about to start
+def on_ready(agent):
+    core.log("unit is ready")
+    # you can run custom bettercap commands if you want
+    #   agent.run('ble.recon on')
+    # or set a custom state
+    #   agent.set_bored()
+
+
+# called when the AI finished loading
+def on_ai_ready(agent):
+    pass
+
+
+# called when the AI finds a new set of parameters
+def on_ai_policy(agent, policy):
+    pass
+
+
+# called when the AI starts training for a given number of epochs
+def on_ai_training_start(agent, epochs):
+    pass
+
+
+# called after the AI completed a training epoch
+def on_ai_training_step(agent, _locals, _globals):
+    pass
+
+
+# called when the AI has done training
+def on_ai_training_end(agent):
+    pass
+
+
+# called when the AI got the best reward so far
+def on_ai_best_reward(agent, reward):
+    pass
+
+
+# called when the AI got the best reward so far
+def on_ai_worst_reward(agent, reward):
+    pass
+
+
+# called when a non overlapping wifi channel is found to be free
+def on_free_channel(agent, channel):
+    pass
+
+
+# called when the status is set to bored
+def on_bored(agent):
+    pass
+
+
+# called when the status is set to sad
+def on_sad(agent):
+    pass
+
+
+# called when the status is set to excited
+def on_excited(agent):
+    pass
+
+
+# called when the status is set to lonely
+def on_lonely(agent):
+    pass
+
+
+# called when the agent is rebooting the board
+def on_rebooting(agent):
+    pass
+
+
+# called when the agent is waiting for t seconds
+def on_wait(agent, t):
+    pass
+
+
+# called when the agent is sleeping for t seconds
+def on_sleep(agent, t):
+    pass
+
+
+# called when the agent refreshed its access points list
+def on_wifi_update(agent, access_points):
+    pass
+
+
+# called when the agent is sending an association frame
+def on_association(agent, access_point):
+    pass
+
+
+# callend when the agent is deauthenticating a client station from an AP
+def on_deauthentication(agent, access_point, client_station):
+    pass
+
+
+# callend when the agent is tuning on a specific channel
+def on_channel_hop(agent, channel):
+    pass
+
+
+# called when a new handshake is captured, access_point and client_station are json objects
+# if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs
+def on_handshake(agent, access_point, client_station):
+    pass
+
+
+# called when an epoch is over (where an epoch is a single loop of the main algorithm)
+def on_epoch(agent, epoch, epoch_data):
+    pass
+
+
+# called when a new peer is detected
+def on_peer_detected(agent, peer):
+    pass
+
+
+# called when a known peer is lost
+def on_peer_lost(agent, peer):
+    pass
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py
new file mode 100644
index 0000000..7ddcecd
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py
@@ -0,0 +1,65 @@
+# Based on UPS Lite v1.1 from https://github.com/xenDE
+#
+# funtions for get UPS status - needs enable "i2c" in raspi-config
+#
+# https://github.com/linshuqin329/UPS-Lite
+#
+# For Raspberry Pi Zero Ups Power Expansion Board with Integrated Serial Port S3U4
+# https://www.ebay.de/itm/For-Raspberry-Pi-Zero-Ups-Power-Expansion-Board-with-Integrated-Serial-Port-S3U4/323873804310
+# https://www.aliexpress.com/item/32888533624.html
+__author__ = 'evilsocket@gmail.com'
+__version__ = '1.0.0'
+__name__ = 'ups_lite'
+__license__ = 'GPL3'
+__description__ = 'A plugin that will add a voltage indicator for the UPS Lite v1.1'
+__enabled__ = False
+
+import struct
+
+from pwnagotchi.ui.components import LabeledValue
+from pwnagotchi.ui.view import BLACK
+import pwnagotchi.ui.fonts as fonts
+
+
+# TODO: add enable switch in config.yml an cleanup all to the best place
+class UPS:
+    def __init__(self):
+        # only import when the module is loaded and enabled
+        import smbus
+        # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
+        self._bus = smbus.SMBus(1)
+
+    def voltage(self):
+        try:
+            address = 0x36
+            read = self._bus.read_word_data(address, 2)
+            swapped = struct.unpack("<H", struct.pack(">H", read))[0]
+            return swapped * 1.25 / 1000 / 16
+        except:
+            return 0.0
+
+    def capacity(self):
+        try:
+            address = 0x36
+            read = self._bus.read_word_data(address, 4)
+            swapped = struct.unpack("<H", struct.pack(">H", read))[0]
+            return swapped / 256
+        except:
+            return 0.0
+
+
+ups = None
+
+
+def on_loaded():
+    global ups
+    ups = UPS()
+
+
+def on_ui_setup(ui):
+    ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),
+                                       label_font=fonts.Bold, text_font=fonts.Medium))
+
+
+def on_ui_update(ui):
+    ui.set('ups', "%4.2fV/%2i%%" % (ups.voltage(), ups.capacity()))
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py
index 4c693a6..657aefb 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py
@@ -4,7 +4,7 @@ from threading import Lock
 import shutil
 import core
 import os
-import pwnagotchi
+import pwnagotchi, pwnagotchi.plugins as plugins
 
 from pwnagotchi.ui.view import WHITE, View
 
@@ -146,6 +146,8 @@ class Display(View):
         else:
             core.log("unknown display type %s" % self._display_type)
 
+        plugins.on('display_setup', self._display)
+
         self.on_render(self._on_view_rendered)
 
     def image(self):
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
index 71b7d4e..c5b66be 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
@@ -7,6 +7,9 @@ class State(object):
         self._lock = Lock()
         self._listeners = {}
 
+    def add_element(self, key, elem):
+        self._state[key] = elem
+
     def add_listener(self, key, cb):
         with self._lock:
             self._listeners[key] = cb
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
index 19e7999..3ae9089 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
@@ -4,7 +4,7 @@ import time
 from PIL import Image, ImageDraw
 
 import core
-import pwnagotchi
+import pwnagotchi.plugins as plugins
 from pwnagotchi.voice import Voice
 
 import pwnagotchi.ui.fonts as fonts
@@ -41,7 +41,7 @@ def setup_display_specifics(config):
         name_pos = (int(width / 2) - 15, int(height * .15))
         status_pos = (int(width / 2) - 15, int(height * .30))
 
-    elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1', 
+    elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1',
                                              'ws_2', 'ws2', 'waveshare_2', 'waveshare2'):
         fonts.setup(10, 9, 10, 35)
 
@@ -105,8 +105,19 @@ class View(object):
         for key, value in state.items():
             self._state.set(key, value)
 
+        plugins.on('ui_setup', self)
+
         _thread.start_new_thread(self._refresh_handler, ())
 
+    def add_element(self, key, elem):
+        self._state.add_element(key, elem)
+
+    def width(self):
+        return self._width
+
+    def height(self):
+        return self._height
+
     def on_state_change(self, key, cb):
         self._state.add_listener(key, cb)
 
@@ -294,6 +305,8 @@ class View(object):
             self._canvas = Image.new('1', (self._width, self._height), WHITE)
             drawer = ImageDraw.Draw(self._canvas)
 
+            plugins.on('ui_update', self)
+
             for key, lv in self._state.items():
                 lv.draw(self._canvas, drawer)
 

From 5ced9c6ecdb23d95b5e4ab099ba3216d7ddcfae6 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Wed, 2 Oct 2019 19:02:11 +0200
Subject: [PATCH 16/62] fixed readme

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index b0331f8..5e4567a 100644
--- a/README.md
+++ b/README.md
@@ -151,7 +151,7 @@ Now you can use the `preview.py`-script to preview the changes:
 ### Plugins
 
 Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere
-as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins) for a list of default 
+as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default 
 plugins and all the callbacks that you can define for your own customizations.
 
 ### Random Info

From b948627bd5e7a83ddd68c66a56c0b8c105563d08 Mon Sep 17 00:00:00 2001
From: Jeroen Massar <jeroen@massar.ch>
Date: Wed, 2 Oct 2019 19:03:50 +0200
Subject: [PATCH 17/62] Fix CRLF line endings...

Before:
```
bash: ./update_pwnagotchi.sh: /bin/bash^M: bad interpreter: No such file or directory
```

Thus:
```
scripts/update_pwnagotchi.sh: Bourne-Again shell script text executable, ASCII text, with CRLF line terminators

dos2unix: converting file scripts/update_pwnagotchi.sh to Unix format...

scripts/update_pwnagotchi.sh: Bourne-Again shell script text executable, ASCII text
```

Now it works :)
---
 scripts/update_pwnagotchi.sh | 220 +++++++++++++++++------------------
 1 file changed, 110 insertions(+), 110 deletions(-)

diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh
index 34e4eed..0039e7b 100644
--- a/scripts/update_pwnagotchi.sh
+++ b/scripts/update_pwnagotchi.sh
@@ -1,111 +1,111 @@
-#!/bin/bash
-# Default variables
-GIT_FOLDER="/tmp/pwnagotchi"
-GIT_URL="https://github.com/evilsocket/pwnagotchi/"
-VERSION="master"
-SUPPORTED_RESTART_MODES=( 'auto' 'manual' )
-MODE="auto"
-BACKUPCONFIG=0
-RESTORECONFIG=0
-
-# Functions
-function usage() {
-    cat <<EOF
-
- usage: $0 [OPTIONS]
- 
-   Options:
-      -v        # Version to update to, can be a branch or commit. (default: master)
-      -u        # Url to clone from. (default: https://github.com/evilsocket/pwnagotchi)
-      -m        # Mode to restart to. (Supported: ${SUPPORTED_RESTART_MODES[*]}; default: auto)
-      -b        # Backup the current pwnagotchi config.
-      -r        # Restore the current pwnagotchi config. (-b will be enabled.)
-      -h        # Shows this help.
-
-EOF
-    exit 0
-}
-
-function test_root() {
-    if ! [ $(id -u) = 0 ]; then
-        echo "[!] This script must be run as root."
-        exit 1
-    fi
-}
-
-function test_github() {
-    wget -q  --spider $GIT_URL
-    if [ $? -ne 0 ]; then
-        echo "[!] Cannot reach github. This script requires internet access, ensure connection sharing is working."
-        exit 2
-    fi
-}
-
-echo "[+] Checking prerequisites."
-test_root
-test_github
-
-while getopts ":v:u:m:b:r:h" o; do
-  case "${o}" in
-    v)
-      VERSION="${OPTARG}"
-      ;;
-    u)
-      GIT_URL="${OPTARG}"
-      ;;
-    m)
-      if [[ "${SUPPORTED_RESTART_MODES[*]}" =~ ${OPTARG} ]]; then
-        MODE="${OPTARG}"
-      else
-        usage
-      fi      
-      ;;      
-    b)
-      BACKUPCONFIG=1
-      ;;
-    r)
-      BACKUPCONFIG=1    
-      RESTORECONFIG=1
-      ;;      
-    h)
-      usage
-      ;;
-    *)
-      usage
-      ;;
-  esac
-done
-shift $((OPTIND-1))
-
-# clean up old files, clone master, set checkout to commit if needed.
-echo "[+] Cloning to $GIT_FOLDER..."
-rm $GIT_FOLDER -rf
-git clone $GIT_URL $GIT_FOLDER -q
-cd $GIT_FOLDER
-if [ $VERSION != "master" ]; then
-    git checkout $VERSION -q
-fi
-echo "[+] Installing $(git log -1 --format="%h")"
-
-echo "[+] Updating..."
-if [ $BACKUPCONFIG -eq 1 ]; then
-    echo "[+] Creating backup of config.yml"
-    mv /root/pwnagotchi/config.yml /root/config.yml.bak -f
-fi
-rm /root/pwnagotchi -rf # ensures old files are removed
-rsync -aPq $GIT_FOLDER/sdcard/boot/*   /boot/
-rsync -aPq $GIT_FOLDER/sdcard/rootfs/* /
-cd /tmp
-rm $GIT_FOLDER -rf
-if [ $RESTORECONFIG -eq 1 ]; then
-    echo "[+] Restoring backup of config.yml"
-    mv /root/config.yml.bak /root/pwnagotchi/config.yml -f
-fi
-
-echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)"
-if [ $MODE == "auto" ]; then
-    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto
-elif [ $MODE == "manual" ]; then
-    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.manual
-fi
+#!/bin/bash
+# Default variables
+GIT_FOLDER="/tmp/pwnagotchi"
+GIT_URL="https://github.com/evilsocket/pwnagotchi/"
+VERSION="master"
+SUPPORTED_RESTART_MODES=( 'auto' 'manual' )
+MODE="auto"
+BACKUPCONFIG=0
+RESTORECONFIG=0
+
+# Functions
+function usage() {
+    cat <<EOF
+
+ usage: $0 [OPTIONS]
+ 
+   Options:
+      -v        # Version to update to, can be a branch or commit. (default: master)
+      -u        # Url to clone from. (default: https://github.com/evilsocket/pwnagotchi)
+      -m        # Mode to restart to. (Supported: ${SUPPORTED_RESTART_MODES[*]}; default: auto)
+      -b        # Backup the current pwnagotchi config.
+      -r        # Restore the current pwnagotchi config. (-b will be enabled.)
+      -h        # Shows this help.
+
+EOF
+    exit 0
+}
+
+function test_root() {
+    if ! [ $(id -u) = 0 ]; then
+        echo "[!] This script must be run as root."
+        exit 1
+    fi
+}
+
+function test_github() {
+    wget -q  --spider $GIT_URL
+    if [ $? -ne 0 ]; then
+        echo "[!] Cannot reach github. This script requires internet access, ensure connection sharing is working."
+        exit 2
+    fi
+}
+
+echo "[+] Checking prerequisites."
+test_root
+test_github
+
+while getopts ":v:u:m:b:r:h" o; do
+  case "${o}" in
+    v)
+      VERSION="${OPTARG}"
+      ;;
+    u)
+      GIT_URL="${OPTARG}"
+      ;;
+    m)
+      if [[ "${SUPPORTED_RESTART_MODES[*]}" =~ ${OPTARG} ]]; then
+        MODE="${OPTARG}"
+      else
+        usage
+      fi      
+      ;;      
+    b)
+      BACKUPCONFIG=1
+      ;;
+    r)
+      BACKUPCONFIG=1    
+      RESTORECONFIG=1
+      ;;      
+    h)
+      usage
+      ;;
+    *)
+      usage
+      ;;
+  esac
+done
+shift $((OPTIND-1))
+
+# clean up old files, clone master, set checkout to commit if needed.
+echo "[+] Cloning to $GIT_FOLDER..."
+rm $GIT_FOLDER -rf
+git clone $GIT_URL $GIT_FOLDER -q
+cd $GIT_FOLDER
+if [ $VERSION != "master" ]; then
+    git checkout $VERSION -q
+fi
+echo "[+] Installing $(git log -1 --format="%h")"
+
+echo "[+] Updating..."
+if [ $BACKUPCONFIG -eq 1 ]; then
+    echo "[+] Creating backup of config.yml"
+    mv /root/pwnagotchi/config.yml /root/config.yml.bak -f
+fi
+rm /root/pwnagotchi -rf # ensures old files are removed
+rsync -aPq $GIT_FOLDER/sdcard/boot/*   /boot/
+rsync -aPq $GIT_FOLDER/sdcard/rootfs/* /
+cd /tmp
+rm $GIT_FOLDER -rf
+if [ $RESTORECONFIG -eq 1 ]; then
+    echo "[+] Restoring backup of config.yml"
+    mv /root/config.yml.bak /root/pwnagotchi/config.yml -f
+fi
+
+echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)"
+if [ $MODE == "auto" ]; then
+    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto
+elif [ $MODE == "manual" ]; then
+    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.manual
+fi
 echo "[+] Finished"
\ No newline at end of file

From fffa3df3ad2a607a6760ff2fd3cf41ba477f68c6 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:05:32 +0100
Subject: [PATCH 18/62] override goroot

---
 .travis.yml            | 3 ++-
 builder/pwnagotchi.yml | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 9d1a188..cd74215 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,8 +20,9 @@ cache:
 
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx
+- sudo apt-get -y install qemu-user-static binfmt-support qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-arm-static kpartx
 - sudo update-binfmts --display
+- cat /etc/ld.so.preload
 
 script:
 - sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index 0672002..4d086bc 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -117,6 +117,7 @@
     command: go get -u github.com/bettercap/bettercap
     environment:
       GOPATH: /root/go
+      GOROOT: /usr/lib/go
 
   - name: install bettercap
     copy:

From 2abf3f21fdec12e5cbbad8bbee5b8c349dddb72e Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:09:02 +0100
Subject: [PATCH 19/62] remove packages

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index cd74215..76c5bfa 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,7 +20,7 @@ cache:
 
 before_script:
 - sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-arm-static kpartx
+- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
 - sudo update-binfmts --display
 - cat /etc/ld.so.preload
 

From b7b4e7eb08ae3123acf940a5831a280e3d58667c Mon Sep 17 00:00:00 2001
From: darumaseye <darumaseye@protonmail.com>
Date: Wed, 2 Oct 2019 19:09:24 +0200
Subject: [PATCH 20/62] Improved IT translation

---
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.po        | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
index f84e16c..3dabc3d 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
@@ -24,7 +24,7 @@ msgid ""
 "Hi, I'm Pwnagotchi!\n"
 "Starting ..."
 msgstr ""
-"Ciao!"
+"Ciao!\n"
 "Piacere Pwnagotchi!\n"
 "Caricamento ..."
 
@@ -155,9 +155,9 @@ msgid ""
 "goodbye\n"
 "{name}"
 msgstr ""
-"Uhm ..."
+"Uhm ...\n"
 "addio\n"
-"{name},"
+"{name},\n"
 "mi mancherai..."
 
 #: voice.py:84
@@ -236,8 +236,8 @@ msgstr "Aspetto {secs}s ..."
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr ""
-"Do uno sguardo"
-"qui intorno..."
+"Do uno sguardo\n"
+"qui intorno...\n"
 "({secs}s)"
 
 #: voice.py:123
@@ -258,7 +258,7 @@ msgid ""
 "{what}"
 msgstr ""
 "Collegamento con\n"
-"{what}"
+"{what}\n"
 "in corso..."
 
 #: voice.py:125

From 4986950ffb5cf010f0b99028a450f0198c3938c2 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:12:05 +0100
Subject: [PATCH 21/62] remove debug for ld.so.preload

---
 .travis.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 76c5bfa..edfa3a6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,7 +22,6 @@ before_script:
 - sudo apt-get -y update
 - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
 - sudo update-binfmts --display
-- cat /etc/ld.so.preload
 
 script:
 - sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"

From 5725d8b23956e4a20d8bb25f30b76ec4063539a8 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Wed, 2 Oct 2019 19:41:50 +0200
Subject: [PATCH 22/62] new: gps coordinates are saved along with handshakes if
 gps is connected (related to #55)

---
 .../pwnagotchi/scripts/pwnagotchi/agent.py    |  8 +++-
 .../pwnagotchi/plugins/default/example.py     |  2 +-
 .../scripts/pwnagotchi/plugins/default/gps.py | 47 +++++++++++++++++++
 3 files changed, 54 insertions(+), 3 deletions(-)
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
index bf9ecca..739d6ed 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
@@ -45,6 +45,9 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
             pass
         return False
 
+    def config(self):
+        return self._config
+
     def supported_channels(self):
         return self._supported_channels
 
@@ -336,6 +339,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
 
             try:
                 for h in [e for e in self.events() if e['tag'] == 'wifi.client.handshake']:
+                    filename = h['data']['file']
                     sta_mac = h['data']['station']
                     ap_mac = h['data']['ap']
                     key = "%s -> %s" % (sta_mac, ap_mac)
@@ -347,7 +351,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                         if apsta is None:
                             core.log("!!! captured new handshake: %s !!!" % key)
                             self._last_pwnd = ap_mac
-                            plugins.on('handshake', self, ap_mac, sta_mac)
+                            plugins.on('handshake', self, filename, ap_mac, sta_mac)
                         else:
                             (ap, sta) = apsta
                             self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
@@ -356,7 +360,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                                 ap['channel'],
                                 sta['mac'], sta['vendor'],
                                 ap['hostname'], ap['mac'], ap['vendor']))
-                            plugins.on('handshake', self, ap, sta)
+                            plugins.on('handshake', self, filename, ap, sta)
 
             except Exception as e:
                 core.log("error: %s" % e)
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
index 60efbd2..4a63275 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py
@@ -143,7 +143,7 @@ def on_channel_hop(agent, channel):
 
 # called when a new handshake is captured, access_point and client_station are json objects
 # if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs
-def on_handshake(agent, access_point, client_station):
+def on_handshake(agent, filename, access_point, client_station):
     pass
 
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py
new file mode 100644
index 0000000..c3c53a9
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py
@@ -0,0 +1,47 @@
+__author__ = 'evilsocket@gmail.com'
+__version__ = '1.0.0'
+__name__ = 'gps'
+__license__ = 'GPL3'
+__description__ = 'Save GPS coordinates whenever an handshake is captured.'
+__enabled__ = True  # set to false if you just don't use GPS
+
+import core
+import json
+import os
+
+device = '/dev/ttyUSB0'
+speed = 19200
+running = False
+
+
+def on_loaded():
+    core.log("GPS plugin loaded for %s" % device)
+
+
+def on_ready(agent):
+    global running
+
+    if os.path.exists(device):
+        core.log("enabling GPS bettercap's module for %s" % device)
+        try:
+            agent.run('gps off')
+        except:
+            pass
+
+        agent.run('set gps.device %s' % device)
+        agent.run('set gps.speed %d' % speed)
+        agent.run('gps on')
+        running = True
+    else:
+        core.log("no GPS detected")
+
+
+def on_handshake(agent, filename, access_point, client_station):
+    if running:
+        info = agent.session()
+        gps = info['gps']
+        gps_filename = filename.replace('.pcap', '.gps.json')
+
+        core.log("saving GPS to %s (%s)" % (gps_filename, gps))
+        with open(gps_filename, 'w+t') as fp:
+            json.dump(gps, fp)

From 760a94a0fef60a8e8c9cd2caa40c6aff01e1792b Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:46:08 +0100
Subject: [PATCH 23/62] move env only to install

---
 .travis.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index edfa3a6..ba17f32 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,8 +22,9 @@ before_script:
 - sudo apt-get -y update
 - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
 - sudo update-binfmts --display
+- sudo -E env "PATH=$PATH" make install
 
 script:
-- sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
+- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
 
 # TODO: deploy!

From 00725ae9c7b56869a06ba5b0e860b71e2e878b82 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:49:12 +0100
Subject: [PATCH 24/62] add make clean

---
 .travis.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.travis.yml b/.travis.yml
index ba17f32..21c8fda 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,6 +22,7 @@ before_script:
 - sudo apt-get -y update
 - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
 - sudo update-binfmts --display
+- sudo -E env "PATH=$PATH" make clean
 - sudo -E env "PATH=$PATH" make install
 
 script:

From 01ed7c417c9e82a68c2f996ce579bd149e5f1129 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:53:29 +0100
Subject: [PATCH 25/62] change make stage

---
 .travis.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 21c8fda..0e357f5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,10 +22,10 @@ before_script:
 - sudo apt-get -y update
 - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
 - sudo update-binfmts --display
-- sudo -E env "PATH=$PATH" make clean
-- sudo -E env "PATH=$PATH" make install
 
 script:
+- sudo -E env "PATH=$PATH" make clean
+- sudo -E env "PATH=$PATH" make install
 - sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
 
 # TODO: deploy!

From cf1558eb29792f17fa4b62af01e2fe60a0ec13e2 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Wed, 2 Oct 2019 19:58:01 +0200
Subject: [PATCH 26/62] fix: keep led on to understand when the unit is still
 alive

---
 .../rootfs/root/pwnagotchi/scripts/blink.sh   |  5 ---
 .../pwnagotchi/scripts/pwnagotchi/voice.py    | 35 ++++---------------
 2 files changed, 7 insertions(+), 33 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
index 48673dc..e7f475e 100755
--- a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
@@ -10,8 +10,3 @@ done
 
 echo 0 >/sys/class/leds/led0/brightness
 sleep 0.3
-
-# Powersave options
-# Disable power LED ~30ma
-echo none >/sys/class/leds/led0/trigger
-echo 1 >/sys/class/leds/led0/brightness
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
index 45f5092..53460ed 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
@@ -17,44 +17,36 @@ class Voice:
     def default(self):
         return self._('ZzzzZZzzzzZzzz')
 
-
     def on_starting(self):
         return random.choice([ \
             self._('Hi, I\'m Pwnagotchi!\nStarting ...'),
             self._('New day, new hunt,\nnew pwns!'),
             self._('Hack the Planet!')])
 
-
     def on_ai_ready(self):
         return random.choice([
             self._('AI ready.'),
             self._('The neural network\nis ready.')])
 
-
     def on_normal(self):
         return random.choice([ \
             '',
             '...'])
 
-
     def on_free_channel(self, channel):
         return self._('Hey, channel {channel} is\nfree! Your AP will\nsay thanks.').format(channel=channel)
 
-
     def on_bored(self):
         return random.choice([ \
             self._('I\'m bored ...'),
             self._('Let\'s go for a walk!')])
 
-
     def on_motivated(self, reward):
         return self._('This is the best\nday of my life!')
 
-
     def on_demotivated(self, reward):
         return self._('Shitty day :/')
 
-
     def on_sad(self):
         return random.choice([ \
             self._('I\'m extremely bored ...'),
@@ -62,7 +54,6 @@ class Voice:
             self._('I\'m sad'),
             '...'])
 
-
     def on_excited(self):
         return random.choice([ \
             self._('I\'m living the life!'),
@@ -71,51 +62,43 @@ class Voice:
             self._('I\'m having so much\nfun!'),
             self._('My crime is that of\ncuriosity ...')])
 
-
     def on_new_peer(self, peer):
         return random.choice([ \
             self._('Hello\n{name}!\nNice to meet you. {name}').format(name=peer.name()),
             self._('Unit\n{name}\nis nearby! {name}').format(name=peer.name())])
 
-
     def on_lost_peer(self, peer):
         return random.choice([ \
             self._('Uhm ...\ngoodbye\n{name}').format(name=peer.name()),
             self._('{name}\nis gone ...').format(name=peer.name())])
 
-
     def on_miss(self, who):
         return random.choice([ \
             self._('Whoops ...\n{name}\nis gone.').format(name=who),
             self._('{name}\nmissed!').format(name=who),
             self._('Missed!')])
 
-
     def on_lonely(self):
         return random.choice([ \
             self._('Nobody wants to\nplay with me ...'),
             self._('I feel so alone ...'),
             self._('Where\'s everybody?!')])
 
-
     def on_napping(self, secs):
         return random.choice([ \
             self._('Napping for {secs}s ...').format(secs=secs),
             self._('Zzzzz'),
             self._('ZzzZzzz ({secs}s)').format(secs=secs)])
 
-
     def on_awakening(self):
         return random.choice(['...', '!'])
 
-
     def on_waiting(self, secs):
         return random.choice([ \
             self._('Waiting for {secs}s ...').format(secs=secs),
             '...',
             self._('Looking around ({secs}s)').format(secs=secs)])
 
-
     def on_assoc(self, ap):
         ssid, bssid = ap['hostname'], ap['mac']
         what = ssid if ssid != '' and ssid != '<hidden>' else bssid
@@ -124,23 +107,19 @@ class Voice:
             self._('Associating to\n{what}').format(what=what),
             self._('Yo\n{what}!').format(what=what)])
 
-
-    def on_deauth(self,sta):
+    def on_deauth(self, sta):
         return random.choice([ \
             self._('Just decided that\n{mac}\nneeds no WiFi!').format(mac=sta['mac']),
             self._('Deauthenticating\n{mac}').format(mac=sta['mac']),
             self._('Kickbanning\n{mac}!').format(mac=sta['mac'])])
 
-
     def on_handshakes(self, new_shakes):
         s = 's' if new_shakes > 1 else ''
         return self._('Cool, we got {num}\nnew handshake{plural}!').format(num=new_shakes, plural=s)
 
-
     def on_rebooting(self):
         return self._("Ops, something\nwent wrong ...\nRebooting ...")
 
-
     def on_log(self, log):
         status = self._('Kicked {num} stations\n').format(num=log.deauthed)
         status += self._('Made {num} new friends\n').format(num=log.associated)
@@ -151,10 +130,10 @@ class Voice:
             status += self._('Met {num} peers').format(num=log.peers)
         return status
 
-
     def on_log_tweet(self, log):
-        return self._('I\'ve been pwning for {duration} and kicked {deauthed} clients! I\'ve also met {associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet').format(
-                duration=log.duration_human,
-                deauthed=log.deauthed,
-                associated=log.associated,
-                handshakes=log.handshakes)
+        return self._(
+            'I\'ve been pwning for {duration} and kicked {deauthed} clients! I\'ve also met {associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet').format(
+            duration=log.duration_human,
+            deauthed=log.deauthed,
+            associated=log.associated,
+            handshakes=log.handshakes)

From 3ada1f875d0db2b8d335b2971992f9df70b3d1c2 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 18:58:26 +0100
Subject: [PATCH 27/62] fix make commands

---
 .travis.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 0e357f5..a366cb1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,8 +24,8 @@ before_script:
 - sudo update-binfmts --display
 
 script:
-- sudo -E env "PATH=$PATH" make clean
+- sudo make clean
 - sudo -E env "PATH=$PATH" make install
-- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
+- sudo make image -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
 
 # TODO: deploy!

From dcc5fd9027dde7c7419f787ed0903de59b5839cc Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 19:41:49 +0100
Subject: [PATCH 28/62] disable library during build

---
 builder/pwnagotchi.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json
index c78629e..beac17b 100644
--- a/builder/pwnagotchi.json
+++ b/builder/pwnagotchi.json
@@ -14,6 +14,7 @@
     {
       "type": "shell",
       "inline": [
+        "sed -i 's/^\\([^#]\\)/#\\1/g' /etc/ld.so.preload",
         "apt-get -y update",
         "apt-get install -y ansible"
       ]
@@ -21,6 +22,12 @@
     {
       "type":"ansible-local",
       "playbook_file": "pwnagotchi.yml"
+    },
+    {
+      "type": "shell",
+      "inline": [
+        "sed -i 's/^#\\(.+\\)/\\1/g' /etc/ld.so.preload"
+      ]
     }
   ]
 }

From 59bbc2299530e66e4a7c15fc9ef23bdfc18ec27c Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Wed, 2 Oct 2019 20:25:56 +0100
Subject: [PATCH 29/62] remove quotes from variables

---
 .travis.yml | 2 +-
 Makefile    | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index a366cb1..6c25051 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,6 +26,6 @@ before_script:
 script:
 - sudo make clean
 - sudo -E env "PATH=$PATH" make install
-- sudo make image -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG"
+- sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG
 
 # TODO: deploy!
diff --git a/Makefile b/Makefile
index 75ec0d1..0d898dd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-PWN_HOSTNAME="pwnagotchi"
-PWN_VERSION="master"
+PWN_HOSTNAME=pwnagotchi
+PWN_VERSION=master
 
 all: install image clean
 

From 654456127ec6be3617d8c06a91890d38442d88f5 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <caquino@users.noreply.github.com>
Date: Wed, 2 Oct 2019 21:33:08 +0100
Subject: [PATCH 30/62] Add the check if HDMI cable is connected

For some reason this if was not added during my PR.
---
 sdcard/rootfs/etc/rc.local | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/sdcard/rootfs/etc/rc.local b/sdcard/rootfs/etc/rc.local
index e93d2d8..bab03e6 100755
--- a/sdcard/rootfs/etc/rc.local
+++ b/sdcard/rootfs/etc/rc.local
@@ -11,6 +11,9 @@
 #
 # By default this script does nothing.
 # Powersave (Disable HDMI) ~30ma
-/opt/vc/bin/tvservice -o
+sleep 10
+if ! /opt/vc/bin/tvservice -s | grep HDMI; then
+  /opt/vc/bin/tvservice -o
+fi
 /root/pwnagotchi/scripts/startup.sh &
 exit 0

From 84e256f41fd1aa994171b9ca4bcbb99136116a01 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <caquino@users.noreply.github.com>
Date: Wed, 2 Oct 2019 22:09:46 +0100
Subject: [PATCH 31/62] Adds .DEREK.yml

Derek is a bot that will allow us to manage PRs and Issues without needing access to the repository.

It allows us to assign labels, users and a lot of other features https://reaxt.com/alexellis/derek/blob/master/USER_GUIDE.md

@evilsocket you will need to add the derek app to your repo https://github.com/apps/derek
---
 .DEREK.yml | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 .DEREK.yml

diff --git a/.DEREK.yml b/.DEREK.yml
new file mode 100644
index 0000000..c63d9d1
--- /dev/null
+++ b/.DEREK.yml
@@ -0,0 +1,10 @@
+maintainers:
+ - evilsocket
+ - caquino
+ - dadav
+ - justin-p
+ 
+features:
+ - comments
+ - pr_description_required
+ 

From 30a753b659e690358c66559a81173e2697eb8646 Mon Sep 17 00:00:00 2001
From: Periklis Fregkos <leajian13@gmail.com>
Date: Thu, 3 Oct 2019 07:46:51 +0300
Subject: [PATCH 32/62] Added DEBUG face

(#__#)
---
 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py
index a13eb73..1e09be1 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py
@@ -15,3 +15,4 @@ LONELY = '(ب__ب)'
 SAD = '(╥☁╥ )'
 FRIEND = '(♥‿‿♥)'
 BROKEN = '(☓‿‿☓)'
+DEBUG = '(#__#)'

From 8d35fbabd5654ee45dfde842140a97b1446473ee Mon Sep 17 00:00:00 2001
From: Periklis Fregkos <leajian13@gmail.com>
Date: Thu, 3 Oct 2019 07:47:38 +0300
Subject: [PATCH 33/62] Added custom text voice

---
 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
index 53460ed..c3e3692 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
@@ -137,3 +137,6 @@ class Voice:
             deauthed=log.deauthed,
             associated=log.associated,
             handshakes=log.handshakes)
+
+    def custom(self, text):
+        return self._(text)

From 7067bcfd2b9884a6fa7b25bf500b8c23ade7f50d Mon Sep 17 00:00:00 2001
From: Leajian <leajian13@gmail.com>
Date: Thu, 3 Oct 2019 09:03:43 +0300
Subject: [PATCH 34/62] Update Greek voice

* Renamed gr to el per iso639-2
* Fixed some typos
* Removed plural form of translated handshake word because that would add the latin letter 's' in the end, which is wrong
---
 .../locale/{gr => el}/LC_MESSAGES/voice.mo    | Bin 4763 -> 4723 bytes
 .../locale/{gr => el}/LC_MESSAGES/voice.po    |  15 ++++++++-------
 2 files changed, 8 insertions(+), 7 deletions(-)
 rename sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/{gr => el}/LC_MESSAGES/voice.mo (80%)
 rename sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/{gr => el}/LC_MESSAGES/voice.po (94%)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo
similarity index 80%
rename from sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.mo
rename to sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo
index b2bf23d5864ca468cb0e46eddcc9738a6b8c708c..b06caaa4b2e7d0c5a1412fc4db5ac3b51b21eaf0 100644
GIT binary patch
delta 496
zcmXZYze_?<6u|LohUx2>DM4hvUZzoqAsG>pWfBdh)KCpIJ<7z?gs0Hx(ijD~)lhps
zNSv&(r6H911Dc|Lz`goDUw8SObMC#|bI+Bp<$XLgmBS_>npPoPLI_C`VjPDtiOV>G
z=jg!)9K&~vVG9E|*DXXI_i+(F(2Gu4h*5nX`*0g4FpF-ykVUy2+*25&@QRc8g+FMw
z8;!_4LJX1bpx($aDtP&yKjRenCk~+1VKnN&Uh)-;;}-hy250ciQ8s?^OJR*djMMr<
zXQ)r&79-fiCA2$@{UpwkAEJKl8ui9rFofUeLpNj9e;UPp+(ic7Uiv*>&1QC4A|WL>
z9}WinL6($Ii>1J(rXCe@YN?=wm5r2^$>uUeWmQY1vxTCva9{+{bY9KmDtoqSWm-C^
dJxOtsx!$;|b;(_pjz+!Wa78;CRf2U_;t$T8NwWX|

delta 503
zcmXZYODKd<6u|NGrI-iCOiCW{F`kXVd>&=WBMWK}3(8JkW+qd^Fa|}MBH6Iex1cQ9
zqghgxHXd7zrH!SMg%bYPxSQWS=iJ*l_rBMkG+gX!=~+$W(I(;%k#>iO7l&{fqgajC
zSclJ8i{Chex>LlDbGU$q*pEM0kNt%rHL8xKxPy&&j1_oODCxgVmP93q4{Szv5lt|N
z<Jem)QiXe{2023=Z~x<0Y$0~KM9Q%n)u0ntg3B1fZS>(i8u;l-=U&pvsZkOMRE@4s
z{lpXY;TH~I(4DJqU>ETbs&jX!8opsCdiYKi52JeNJeJ`OYN(dF*O0O2dGfshJ<t<0
z3||M!F=no${8LGDaV2i163L(*HpAwcwQldUqW07B8UILRF_O%cCKHixETtQ5Mq9wL
lId*NEOYzmD8Q;nrI6_+9`NL%<>nzCEV%Cd$&}#CG{Q_YIOr8J$

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
similarity index 94%
rename from sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po
rename to sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
index 26a2511..e93f004 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
@@ -1,15 +1,16 @@
 # pwnigotchi voice data
 # Copyright (C) 2019
 # This file is distributed under the same license as the pwnagotchi package.
-# FIRST AUTHOR Perilis Fregkos <fregkos@gmail.com>, 2019.
+# FIRST AUTHOR Periklis Fregkos <fregkos@gmail.com>, 2019.
+# CO AUTHOR Panos Vasilopoulos <hello@alwayslivid.com>, 2019.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-09-29 13:42+0200\n"
-"PO-Revision-Date: 2019-10-01 16:22+0000\n"
-"Last-Translator: Panos Vasilopoulos <hello@alwayslivid.com>\n"
+"PO-Revision-Date: 2019-10-03 08:00+0000\n"
+"Last-Translator: Periklis Fregkos <fregkos@gmail.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: el\n"
 "MIME-Version: 1.0\n"
@@ -25,7 +26,7 @@ msgid ""
 "Hi, I'm Pwnagotchi!\n"
 "Starting ..."
 msgstr ""
-"Γεία, είμαι το Pwnagotchi!\n"
+"Γειά, είμαι το Pwnagotchi!\n"
 "Εκκινούμαι ..."
 
 #: voice.py:22
@@ -200,7 +201,7 @@ msgstr "Νιώθω μοναχός μου ..."
 
 #: voice.py:96
 msgid "Where's everybody?!"
-msgstr "Μα, πού πήγαν όλοi;!"
+msgstr "Μα, πού πήγαν όλοι;!"
 
 #: voice.py:101
 #, python-brace-format
@@ -252,7 +253,7 @@ msgid ""
 "Yo\n"
 "{what}!"
 msgstr ""
-"Που'σ ρε τρελέ\n"
+"Που'σαι ρε τρελέ\n"
 "{what}!"
 
 #: voice.py:128
@@ -291,7 +292,7 @@ msgid ""
 "new handshake{plural}!"
 msgstr ""
 "Τέλεια δικέ μου, πήραμε {num}\n"
-"νέες χειραψίες{plural}!"
+"νέες χειραψίες!"
 
 #: voice.py:139
 msgid ""

From f108ed95a7d0c559b028a263edcdebfa2f66c308 Mon Sep 17 00:00:00 2001
From: IncredInComp <incredincomp@gmail.com>
Date: Wed, 2 Oct 2019 23:12:57 -0700
Subject: [PATCH 35/62] added hostname backup and restore

https://github.com/evilsocket/pwnagotchi/issues/69#issue-501710314

Couldn't decide if it should be a separate option by itself, but I personally think they do go hand in hand.
---
 scripts/update_pwnagotchi.sh | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh
index 0039e7b..eae69d5 100644
--- a/scripts/update_pwnagotchi.sh
+++ b/scripts/update_pwnagotchi.sh
@@ -18,8 +18,8 @@ function usage() {
       -v        # Version to update to, can be a branch or commit. (default: master)
       -u        # Url to clone from. (default: https://github.com/evilsocket/pwnagotchi)
       -m        # Mode to restart to. (Supported: ${SUPPORTED_RESTART_MODES[*]}; default: auto)
-      -b        # Backup the current pwnagotchi config.
-      -r        # Restore the current pwnagotchi config. (-b will be enabled.)
+      -b        # Backup the current pwnagotchi config and hostname references.
+      -r        # Restore the current pwnagotchi config and hostname references. (-b will be enabled.)
       -h        # Shows this help.
 
 EOF
@@ -89,8 +89,11 @@ echo "[+] Installing $(git log -1 --format="%h")"
 
 echo "[+] Updating..."
 if [ $BACKUPCONFIG -eq 1 ]; then
-    echo "[+] Creating backup of config.yml"
-    mv /root/pwnagotchi/config.yml /root/config.yml.bak -f
+    echo "[+] Creating backup of config.yml and hostname references"
+    mv /root/pwnagotchi/config.yml /root/config.bak -f
+    mv /etc/hosts /root/hosts.bak -f
+    mv /etc/hostname /root/hostname.bak -f
+    mv /etc/network/interfaces /root/interfaces.bak -f
 fi
 rm /root/pwnagotchi -rf # ensures old files are removed
 rsync -aPq $GIT_FOLDER/sdcard/boot/*   /boot/
@@ -98,8 +101,11 @@ rsync -aPq $GIT_FOLDER/sdcard/rootfs/* /
 cd /tmp
 rm $GIT_FOLDER -rf
 if [ $RESTORECONFIG -eq 1 ]; then
-    echo "[+] Restoring backup of config.yml"
+    echo "[+] Restoring backup of config.yml and hostname references"
     mv /root/config.yml.bak /root/pwnagotchi/config.yml -f
+    mv /etc/hosts.bak /etc/hosts -f
+    mv /etc/hostname.bak /etc/hostname -f
+    mv /etc/network/interfaces.bak /etc/network/interfaces -f
 fi
 
 echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)"
@@ -108,4 +114,4 @@ if [ $MODE == "auto" ]; then
 elif [ $MODE == "manual" ]; then
     sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.manual
 fi
-echo "[+] Finished"
\ No newline at end of file
+echo "[+] Finished"

From 961b4250de4d1fd749c497cdbab37b59de7758e5 Mon Sep 17 00:00:00 2001
From: IncredInComp <incredincomp@gmail.com>
Date: Thu, 3 Oct 2019 00:58:23 -0700
Subject: [PATCH 36/62] Update update_pwnagotchi.sh

---
 scripts/update_pwnagotchi.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh
index eae69d5..97b8a89 100644
--- a/scripts/update_pwnagotchi.sh
+++ b/scripts/update_pwnagotchi.sh
@@ -103,9 +103,9 @@ rm $GIT_FOLDER -rf
 if [ $RESTORECONFIG -eq 1 ]; then
     echo "[+] Restoring backup of config.yml and hostname references"
     mv /root/config.yml.bak /root/pwnagotchi/config.yml -f
-    mv /etc/hosts.bak /etc/hosts -f
-    mv /etc/hostname.bak /etc/hostname -f
-    mv /etc/network/interfaces.bak /etc/network/interfaces -f
+    mv /root/hosts.bak /etc/hosts -f
+    mv /root/hostname.bak /etc/hostname -f
+    mv /root/interfaces.bak /etc/network/interfaces -f
 fi
 
 echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)"

From efc20e6a3dd11aacae7c377bbe58753e4366931c Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 10:20:30 +0200
Subject: [PATCH 37/62] render unto caesar

---
 README.md                                      | 2 +-
 sdcard/rootfs/root/pwnagotchi/scripts/blink.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 5e4567a..18761ad 100644
--- a/README.md
+++ b/README.md
@@ -167,7 +167,7 @@ the `PARTUUID`s for `rootfs` and `boot` partitions are the same in `/etc/fstab`.
 
 ## License
 
-`pwnagotchi` is made with ♥  by [@evilsocket](https://twitter.com/evilsocket) and it's released under the GPL3 license.
+`pwnagotchi` is made with ♥  by [@evilsocket](https://twitter.com/evilsocket) and the [amazing dev team](https://github.com/evilsocket/pwnagotchi/graphs/contributors). It's released under the GPL3 license.
 
 
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
index e7f475e..6ad62a3 100755
--- a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh
@@ -9,4 +9,4 @@ do
 done
 
 echo 0 >/sys/class/leds/led0/brightness
-sleep 0.3
+sleep 0.3
\ No newline at end of file

From 924c5c8fe6c0d5f62b9bca64acbf130e393f5e75 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Thu, 3 Oct 2019 09:21:03 +0100
Subject: [PATCH 38/62] minor builder fixes

---
 builder/pwnagotchi.yml                                 | 4 ++--
 sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index 4d086bc..e6a988d 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -203,7 +203,7 @@
 
   - name: configure usb interface
     blockinfile:
-      path: /etc/network/interfaces.d/usb0.cfg
+      path: /etc/network/interfaces.d/usb0-cfg
       create: yes
       block: |
         allow-hotplug usb0
@@ -216,7 +216,7 @@
 
   - name: configure eth0 interface (pi2/3/4)
     blockinfile:
-      path: /etc/network/interfaces.d/eth0.cfg
+      path: /etc/network/interfaces.d/eth0-cfg
       create: yes
       block: |
         allow-hotplug eth0
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt b/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt
index 0a82ef7..8fa5e8a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt
@@ -10,3 +10,4 @@ file_read_backwards
 numpy
 inky
 smbus
+pillow

From d7f8feaa27eb14d56dbe59bf8ab00fada354bce0 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Thu, 3 Oct 2019 09:28:47 +0100
Subject: [PATCH 39/62] add wlan0 and lo interfaces

---
 builder/pwnagotchi.yml | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index e6a988d..03f9509 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -201,6 +201,20 @@
         fi
         /root/pwnagotchi/scripts/startup.sh &
 
+  - name: configure lo interface
+    blockinfile:
+      path: /etc/network/interfaces.d/lo-cfg
+      block: |
+        auto lo
+        iface lo inet loopback
+
+  - name: configure wlan interface
+    blockinfile:
+      path: /etc/network/interfaces.d/wlan0-cfg
+      block: |
+        allow-hotplug wlan0
+        iface wlan0 inet static
+
   - name: configure usb interface
     blockinfile:
       path: /etc/network/interfaces.d/usb0-cfg

From 07f0a7a12d1428b167e1c6dc2cbaee0becf6d919 Mon Sep 17 00:00:00 2001
From: QuantumSheep <quantumsheep@outlook.fr>
Date: Thu, 3 Oct 2019 10:29:57 +0200
Subject: [PATCH 40/62] Add translation

---
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 0 -> 429 bytes
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 288 ++++++++++++++++++
 2 files changed, 288 insertions(+)
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a1c999a93b1ee455d9ac749892dcd07bf89d36da
GIT binary patch
literal 429
zcmbV|zfQw25QmFk%E-*%fvsF{k_sC0M~Kp)QY)$|Vs{hQF-q;oz7+Z(ydKZO1thvK
z@smECtowAj^XKWw$AEG~oDt{5F>yik854n;Io00z&C<J9RU*tPcu_tWX9eRikCSMn
zTIUfKL7NI5I~|~Kf<?>c0w!KbBo&?{D#22o<iK-CbCzUcln!~yIf<}RJJXN+!y5_C
zf4sR22!)q6G!mT`tdf=7vD++5^6RTC8GgSXx<Kp2)_K)7`&b*SyLDW;?R_+tR(Db>
zD3sg^*1lP(9hSBE#|*)g)r|>tw3scXhc8KD9!;D@Wog%aOGl%6$IG^n#@?{9mOd!F
a>u>|(gV*1*Q68qYbd|AMu<_bpH24DfQ+mVz

literal 0
HcmV?d00001

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
new file mode 100644
index 0000000..61533a1
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -0,0 +1,288 @@
+# pwnigotchi voice data
+# Copyright (C) 2019
+# This file is distributed under the same license as the pwnagotchi package.
+# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-09-29 13:42+0200\n"
+"PO-Revision-Date: 2019-09-29 14:00+0200\n"
+"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
+"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
+"Language: english\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: voice.py:16
+msgid "ZzzzZZzzzzZzzz"
+msgstr ""
+
+#: voice.py:21
+msgid ""
+"Bonjour, je suis Pwnagotchi!\n"
+"Démarrage ..."
+msgstr ""
+
+#: voice.py:22
+msgid ""
+"New day, new hunt,\n"
+"Nouvelle journée, nouvelle chasse,\n"
+"nouveau pwns!"
+msgstr ""
+
+#: voice.py:23
+msgid "Hack la planète!"
+msgstr ""
+
+#: voice.py:28
+msgid "IA prête."
+msgstr ""
+
+#: voice.py:29
+msgid ""
+"Le réseau neuronal\n"
+"est prêt."
+msgstr ""
+
+#: voice.py:39
+#, python-brace-format
+msgid ""
+"Hey, le channel {channel} est\n"
+"libre! Ton AP va\n"
+"dis merci."
+msgstr ""
+
+#: voice.py:44
+msgid "Je m'ennuie ..."
+msgstr ""
+
+#: voice.py:45
+msgid "Allons faire un tour!"
+msgstr ""
+
+#: voice.py:49
+msgid ""
+"C'est le meilleur\n"
+"jour de ma vie!"
+msgstr ""
+
+#: voice.py:53
+msgid "Journée de merde :/"
+msgstr ""
+
+#: voice.py:58
+msgid "Je m'ennuie énormément ..."
+msgstr ""
+
+#: voice.py:59
+msgid "Je suis très triste ..."
+msgstr ""
+
+#: voice.py:60
+msgid "Je suis triste"
+msgstr ""
+
+#: voice.py:66
+msgid "Je vis la vie!"
+msgstr ""
+
+#: voice.py:67
+msgid "Je pwn donc je suis."
+msgstr ""
+
+#: voice.py:68
+msgid "Autant de réseaux!!!"
+msgstr ""
+
+#: voice.py:69
+msgid ""
+"Je m'amuse tellement!"
+msgstr ""
+
+#: voice.py:70
+msgid ""
+"Mon crime est celui de\n"
+"la curiosité ..."
+msgstr ""
+
+#: voice.py:75
+#, python-brace-format
+msgid ""
+"Bonjour\n"
+"{name}!\n"
+"Ravis de te rencontrer. {name}"
+msgstr ""
+
+#: voice.py:76
+#, python-brace-format
+msgid ""
+"L'unité\n"
+"{name}\n"
+"est proche! {name}"
+msgstr ""
+
+#: voice.py:81
+#, python-brace-format
+msgid ""
+"Hum ...\n"
+"au revoir\n"
+"{name}"
+msgstr ""
+
+#: voice.py:82
+#, python-brace-format
+msgid ""
+"{name}\n"
+"est parti ..."
+msgstr ""
+
+#: voice.py:87
+#, python-brace-format
+msgid ""
+"Oups ...\n"
+"{name}\n"
+"est parti."
+msgstr ""
+
+#: voice.py:88
+#, python-brace-format
+msgid ""
+"{name}\n"
+"raté!"
+msgstr ""
+
+#: voice.py:89
+msgid "Raté!"
+msgstr ""
+
+#: voice.py:94
+msgid ""
+"Personne ne veut\n"
+"jouer avec moi ..."
+msgstr ""
+
+#: voice.py:95
+msgid "Je me sens si seul ..."
+msgstr ""
+
+#: voice.py:96
+msgid "Où est tout le monde?!"
+msgstr ""
+
+#: voice.py:101
+#, python-brace-format
+msgid "Fais la sieste pendant {secs}s ..."
+msgstr ""
+
+#: voice.py:102
+msgid "Zzzzz"
+msgstr ""
+
+#: voice.py:103
+#, python-brace-format
+msgid "ZzzZzzz ({secs}s)"
+msgstr ""
+
+#: voice.py:112
+#, python-brace-format
+msgid "Attends pendant {secs}s ..."
+msgstr ""
+
+#: voice.py:114
+#, python-brace-format
+msgid "Regarde autour ({secs}s)"
+msgstr ""
+
+#: voice.py:121
+#, python-brace-format
+msgid ""
+"Hey\n"
+"{what}\n"
+"soyons amis!"
+msgstr ""
+
+#: voice.py:122
+#, python-brace-format
+msgid ""
+"Association à\n"
+"{what}"
+msgstr ""
+
+#: voice.py:123
+#, python-brace-format
+msgid ""
+"Yo\n"
+"{what}!"
+msgstr ""
+
+#: voice.py:128
+#, python-brace-format
+msgid ""
+"Décidé à l'instant que\n"
+"{mac}\n"
+"n'a pas besoin de WiFi!"
+msgstr ""
+
+#: voice.py:129
+#, python-brace-format
+msgid ""
+"Désauthentification de\n"
+"{mac}"
+msgstr ""
+
+#: voice.py:130
+#, python-brace-format
+msgid ""
+"Kickbanning\n"
+"{mac}!"
+msgstr ""
+
+#: voice.py:135
+#, python-brace-format
+msgid ""
+"Cool, nous avons {num}\n"
+"nouveaux handshake{plural}!"
+msgstr ""
+
+#: voice.py:139
+msgid ""
+"Oups, quelque\n"
+"chose s'est mal passé ...\n"
+"Redémarrage ..."
+msgstr ""
+
+#: voice.py:143
+#, python-brace-format
+msgid "{num} stations kick\n"
+msgstr ""
+
+#: voice.py:144
+#, python-brace-format
+msgid "Fait {num} nouveaux amis\n"
+msgstr ""
+
+#: voice.py:145
+#, python-brace-format
+msgid "Récupéré {num} handshakes\n"
+msgstr ""
+
+#: voice.py:147
+msgid "1 peer rencontré"
+msgstr ""
+
+#: voice.py:149
+#, python-brace-format
+msgid "{num} peers recontrés"
+msgstr ""
+
+#: voice.py:154
+#, python-brace-format
+msgid ""
+"J'ai pwn durant {duration} et kick {deauthed} clients! J'ai aussi rencontré "
+"{associated} nouveaux amis and mangé {handshakes} handshakes! #pwnagotchi "
+"#pwnlog #pwnlife #hacktheplanet #skynet"
+msgstr ""

From 654af0e2aed47354cc1c2eb9f8f3e9bb919ec5ab Mon Sep 17 00:00:00 2001
From: QuantumSheep <quantumsheep@outlook.fr>
Date: Thu, 3 Oct 2019 10:35:36 +0200
Subject: [PATCH 41/62] Fix headers

---
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo   | Bin 429 -> 439 bytes
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po   |  10 +++++-----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
index a1c999a93b1ee455d9ac749892dcd07bf89d36da..b94cdec2f738e7c1e228c2a5a5bdcaa751208b53 100644
GIT binary patch
delta 100
zcmZ3>yq$T13S;d=)mSb=16>1S1q&-9i;2C;wiZ^#CfWu@1_oR{iNz(lAw`LK#W{&3
u`9)R=g{6skC8fE=8L6oS3O43O=7uJgX4=T26CY->rWK{;B~K1uj0FJn5g?=h

delta 79
zcmdnayq0-_3S;p^)mUx=OI;&N1w&&i6QhYe%8G_2Rt5&z21W)3Tt11#CAuL+iFw62
ji6!|(RthPJDT!s16&Q^t^E0}!rRJsQWEM}3VvGd<a55Ja

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
index 61533a1..62462ec 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -1,18 +1,18 @@
 # pwnigotchi voice data
 # Copyright (C) 2019
 # This file is distributed under the same license as the pwnagotchi package.
-# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
+# FIRST AUTHOR <7271496+quantumsheep@users.noreply.github.com>, 2019.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:42+0200\n"
-"PO-Revision-Date: 2019-09-29 14:00+0200\n"
-"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
+"POT-Creation-Date: 2019-10-03 8:28+0200\n"
+"PO-Revision-Date: 2019-09-29 8:34+0200\n"
+"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
-"Language: english\n"
+"Language: french\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"

From 5aa7615a00c3ddff2bb3517c339c28a116dd0d29 Mon Sep 17 00:00:00 2001
From: QuantumSheep <quantumsheep@outlook.fr>
Date: Thu, 3 Oct 2019 10:36:22 +0200
Subject: [PATCH 42/62] Fix PO-Revision-Date

---
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo   | Bin 439 -> 439 bytes
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po   |   2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
index b94cdec2f738e7c1e228c2a5a5bdcaa751208b53..6b236f3447527a4777fad68a9ba8ab4f6d0bb519 100644
GIT binary patch
delta 16
Xcmdnayq$T%N>)PyT?6Bd>o^$!FMkCM

delta 16
Xcmdnayq$T%N>&3)T_ekl>o^$!FX#mw

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
index 62462ec..ae7d7ba 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-10-03 8:28+0200\n"
-"PO-Revision-Date: 2019-09-29 8:34+0200\n"
+"PO-Revision-Date: 2019-10-03 8:34+0200\n"
 "Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: french\n"

From d4be04fff14fe41b1a315002c7d07c0bdd0d9438 Mon Sep 17 00:00:00 2001
From: QuantumSheep <quantumsheep@outlook.fr>
Date: Thu, 3 Oct 2019 10:39:12 +0200
Subject: [PATCH 43/62] Finally fix the date creation and revision format

---
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo   | Bin 439 -> 441 bytes
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po   |   4 ++--
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
index 6b236f3447527a4777fad68a9ba8ab4f6d0bb519..b9b2b243d384e8b4de5ea574e23aac1202d319db 100644
GIT binary patch
delta 24
ecmdnaypwr?3S<35)nq0^gNdDLKyu>-c18eS<OeeV

delta 22
ecmdnVyq$T13S;d=)nrDCiCt=p78^IQGXelp&j#QC

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
index ae7d7ba..326e1e1 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 8:28+0200\n"
-"PO-Revision-Date: 2019-10-03 8:34+0200\n"
+"POT-Creation-Date: 2019-10-03 10:28+0200\n"
+"PO-Revision-Date: 2019-10-03 10:34+0200\n"
 "Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: french\n"

From 47930a99aeb156d8e65ac88a7d2f40a898571acc Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 10:41:16 +0200
Subject: [PATCH 44/62] configured travis deploy

---
 .travis.yml | 40 ++++++++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 6c25051..48f29dc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,26 +6,42 @@ go:
 
 env:
   global:
-  - LANG=C
-  - LC_ALL=C
+    - LANG=C
+    - LC_ALL=C
 
 before_cache:
-- mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
-- sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
+  - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
+  - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
 
 cache:
   apt: true
   directories:
-  - tmp/
+    - tmp/
 
 before_script:
-- sudo apt-get -y update
-- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
-- sudo update-binfmts --display
+  - sudo apt-get -y update
+  - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
+  - sudo update-binfmts --display
 
 script:
-- sudo make clean
-- sudo -E env "PATH=$PATH" make install
-- sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG
+  - sudo make clean
+  - sudo -E env "PATH=$PATH" make install
+  - sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG
 
-# TODO: deploy!
+before_deploy:
+  # Set up git user name and tag this commit
+  - git config --local user.name "evilsocket"
+  - git config --local user.email "evilsocket@gmail.com"
+  - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)}
+  - git tag $TRAVIS_TAG
+
+deploy:
+  provider: releases
+  api_key:
+    secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8="
+  skip_cleanup: true
+  file_glob: true
+  file: pwnagotchi-*.zip
+  on:
+    repo: evilsocket/pwnagotchi
+    all_branches: true

From d69e938676db2bd9e6a21da450398e3150113e71 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 10:44:55 +0200
Subject: [PATCH 45/62] french

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 18761ad..50ef42e 100644
--- a/README.md
+++ b/README.md
@@ -119,6 +119,7 @@ Pwnagotchi is able to speak multiple languages!! Currently supported are:
 * greek
 * macedonian
 * italian
+* french
 
 If you want to add a language use the `language.sh` script. If you want to add for example the language **italian** you would type:
 

From 9205ca1e599c43442c280b43ae158fd6c979c738 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 11:09:25 +0200
Subject: [PATCH 46/62] new: implemented text auto wrapping. (closes #46)

---
 .../scripts/pwnagotchi/ui/components.py       | 12 +++-
 .../pwnagotchi/scripts/pwnagotchi/ui/view.py  | 19 +++--
 .../pwnagotchi/scripts/pwnagotchi/voice.py    | 70 +++++++++----------
 3 files changed, 59 insertions(+), 42 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py
index 2d8b2f5..87b0576 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py
@@ -1,4 +1,5 @@
 from PIL import Image
+from textwrap import TextWrapper
 
 
 class Widget(object):
@@ -39,14 +40,21 @@ class FilledRect(Widget):
 
 
 class Text(Widget):
-    def __init__(self, value="", position=(0, 0), font=None, color=0):
+    def __init__(self, value="", position=(0, 0), font=None, color=0, wrap=False, max_length=0):
         super().__init__(position, color)
         self.value = value
         self.font = font
+        self.wrap = wrap
+        self.max_length = max_length
+        self.wrapper = TextWrapper(width=self.max_length, replace_whitespace=False) if wrap else None
 
     def draw(self, canvas, drawer):
         if self.value is not None:
-            drawer.text(self.xy, self.value, font=self.font, fill=self.color)
+            if self.wrap:
+                text = '\n'.join(self.wrapper.wrap(self.value))
+            else:
+                text = self.value
+            drawer.text(self.xy, text, font=self.font, fill=self.color)
 
 
 class LabeledValue(Widget):
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
index 3ae9089..ee3eb53 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
@@ -78,22 +78,26 @@ class View(object):
                                    label_font=fonts.Bold,
                                    text_font=fonts.Medium),
 
-            # 'square':  Rect([1, 11, 124, 111]),
+
             'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK),
             'line2': Line(
                 [0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)],
                 color=BLACK),
 
-            # 'histogram': Histogram([4, 94], color = BLACK),
-
             'face': Text(value=faces.SLEEP, position=face_pos, color=BLACK, font=fonts.Huge),
 
             'friend_face': Text(value=None, position=(0, 90), font=fonts.Bold, color=BLACK),
             'friend_name': Text(value=None, position=(40, 93), font=fonts.BoldSmall, color=BLACK),
 
             'name': Text(value='%s>' % 'pwnagotchi', position=name_pos, color=BLACK, font=fonts.Bold),
-            # 'face2':   Bitmap( '/root/pwnagotchi/data/images/face_happy.bmp', (0, 20)),
-            'status': Text(value=self._voice.default(), position=status_pos, color=BLACK, font=fonts.Medium),
+
+            'status': Text(value=self._voice.default(),
+                           position=status_pos,
+                           color=BLACK,
+                           font=fonts.Medium,
+                           wrap=True,
+                           # the current maximum number of characters per line, assuming each character is 6 pixels wide
+                           max_length=(self._width - status_pos[0]) // 6),
 
             'shakes': LabeledValue(label='PWND ', value='0 (00)', color=BLACK,
                                    position=(0, self._height - int(self._height * .12) + 1), label_font=fonts.Bold,
@@ -300,6 +304,11 @@ class View(object):
         self.set('status', self._voice.on_rebooting())
         self.update()
 
+    def on_custom(self, text):
+        self.set('face', faces.DEBUG)
+        self.set('status', self._voice.custom(text))
+        self.update()
+
     def update(self):
         with self._lock:
             self._canvas = Image.new('1', (self._width, self._height), WHITE)
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
index c3e3692..02bff8b 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
@@ -18,74 +18,74 @@ class Voice:
         return self._('ZzzzZZzzzzZzzz')
 
     def on_starting(self):
-        return random.choice([ \
-            self._('Hi, I\'m Pwnagotchi!\nStarting ...'),
-            self._('New day, new hunt,\nnew pwns!'),
+        return random.choice([ 
+            self._('Hi, I\'m Pwnagotchi! Starting ...'),
+            self._('New day, new hunt, new pwns!'),
             self._('Hack the Planet!')])
 
     def on_ai_ready(self):
         return random.choice([
             self._('AI ready.'),
-            self._('The neural network\nis ready.')])
+            self._('The neural network is ready.')])
 
     def on_normal(self):
-        return random.choice([ \
+        return random.choice([ 
             '',
             '...'])
 
     def on_free_channel(self, channel):
-        return self._('Hey, channel {channel} is\nfree! Your AP will\nsay thanks.').format(channel=channel)
+        return self._('Hey, channel {channel} is free! Your AP will say thanks.').format(channel=channel)
 
     def on_bored(self):
-        return random.choice([ \
+        return random.choice([ 
             self._('I\'m bored ...'),
             self._('Let\'s go for a walk!')])
 
     def on_motivated(self, reward):
-        return self._('This is the best\nday of my life!')
+        return self._('This is the best day of my life!')
 
     def on_demotivated(self, reward):
         return self._('Shitty day :/')
 
     def on_sad(self):
-        return random.choice([ \
+        return random.choice([ 
             self._('I\'m extremely bored ...'),
             self._('I\'m very sad ...'),
             self._('I\'m sad'),
             '...'])
 
     def on_excited(self):
-        return random.choice([ \
+        return random.choice([ 
             self._('I\'m living the life!'),
             self._('I pwn therefore I am.'),
             self._('So many networks!!!'),
-            self._('I\'m having so much\nfun!'),
-            self._('My crime is that of\ncuriosity ...')])
+            self._('I\'m having so much fun!'),
+            self._('My crime is that of curiosity ...')])
 
     def on_new_peer(self, peer):
-        return random.choice([ \
-            self._('Hello\n{name}!\nNice to meet you. {name}').format(name=peer.name()),
-            self._('Unit\n{name}\nis nearby! {name}').format(name=peer.name())])
+        return random.choice([ 
+            self._('Hello {name}! Nice to meet you. {name}').format(name=peer.name()),
+            self._('Unit {name} is nearby! {name}').format(name=peer.name())])
 
     def on_lost_peer(self, peer):
-        return random.choice([ \
-            self._('Uhm ...\ngoodbye\n{name}').format(name=peer.name()),
-            self._('{name}\nis gone ...').format(name=peer.name())])
+        return random.choice([ 
+            self._('Uhm ... goodbye {name}').format(name=peer.name()),
+            self._('{name} is gone ...').format(name=peer.name())])
 
     def on_miss(self, who):
-        return random.choice([ \
-            self._('Whoops ...\n{name}\nis gone.').format(name=who),
-            self._('{name}\nmissed!').format(name=who),
+        return random.choice([ 
+            self._('Whoops ... {name} is gone.').format(name=who),
+            self._('{name} missed!').format(name=who),
             self._('Missed!')])
 
     def on_lonely(self):
-        return random.choice([ \
-            self._('Nobody wants to\nplay with me ...'),
+        return random.choice([ 
+            self._('Nobody wants to play with me ...'),
             self._('I feel so alone ...'),
             self._('Where\'s everybody?!')])
 
     def on_napping(self, secs):
-        return random.choice([ \
+        return random.choice([ 
             self._('Napping for {secs}s ...').format(secs=secs),
             self._('Zzzzz'),
             self._('ZzzZzzz ({secs}s)').format(secs=secs)])
@@ -94,7 +94,7 @@ class Voice:
         return random.choice(['...', '!'])
 
     def on_waiting(self, secs):
-        return random.choice([ \
+        return random.choice([ 
             self._('Waiting for {secs}s ...').format(secs=secs),
             '...',
             self._('Looking around ({secs}s)').format(secs=secs)])
@@ -102,23 +102,23 @@ class Voice:
     def on_assoc(self, ap):
         ssid, bssid = ap['hostname'], ap['mac']
         what = ssid if ssid != '' and ssid != '<hidden>' else bssid
-        return random.choice([ \
-            self._('Hey\n{what}\nlet\'s be friends!').format(what=what),
-            self._('Associating to\n{what}').format(what=what),
-            self._('Yo\n{what}!').format(what=what)])
+        return random.choice([ 
+            self._('Hey {what} let\'s be friends!').format(what=what),
+            self._('Associating to {what}').format(what=what),
+            self._('Yo {what}!').format(what=what)])
 
     def on_deauth(self, sta):
-        return random.choice([ \
-            self._('Just decided that\n{mac}\nneeds no WiFi!').format(mac=sta['mac']),
-            self._('Deauthenticating\n{mac}').format(mac=sta['mac']),
-            self._('Kickbanning\n{mac}!').format(mac=sta['mac'])])
+        return random.choice([ 
+            self._('Just decided that {mac} needs no WiFi!').format(mac=sta['mac']),
+            self._('Deauthenticating {mac}').format(mac=sta['mac']),
+            self._('Kickbanning {mac}!').format(mac=sta['mac'])])
 
     def on_handshakes(self, new_shakes):
         s = 's' if new_shakes > 1 else ''
-        return self._('Cool, we got {num}\nnew handshake{plural}!').format(num=new_shakes, plural=s)
+        return self._('Cool, we got {num} new handshake{plural}!').format(num=new_shakes, plural=s)
 
     def on_rebooting(self):
-        return self._("Ops, something\nwent wrong ...\nRebooting ...")
+        return self._("Ops, something went wrong ... Rebooting ...")
 
     def on_log(self, log):
         status = self._('Kicked {num} stations\n').format(num=log.deauthed)

From a3c05b3e8538098ad5ce4941ab7ad9746527a3c5 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 11:27:51 +0200
Subject: [PATCH 47/62] example plugin

---
 README.md                                     | 54 ++++++++++++++++++-
 .../rootfs/root/pwnagotchi/scripts/startup.sh |  2 -
 2 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 50ef42e..7f23677 100644
--- a/README.md
+++ b/README.md
@@ -153,7 +153,59 @@ Now you can use the `preview.py`-script to preview the changes:
 
 Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere
 as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default 
-plugins and all the callbacks that you can define for your own customizations.
+plugins and all the callbacks that you can define for your own customizations. 
+
+Here's as an example the GPS plugin:
+
+```python
+__author__ = 'evilsocket@gmail.com'
+__version__ = '1.0.0'
+__name__ = 'gps'
+__license__ = 'GPL3'
+__description__ = 'Save GPS coordinates whenever an handshake is captured.'
+__enabled__ = True  # set to false if you just don't use GPS
+
+import core
+import json
+import os
+
+device = '/dev/ttyUSB0'
+speed = 19200
+running = False
+
+
+def on_loaded():
+    core.log("GPS plugin loaded for %s" % device)
+
+
+def on_ready(agent):
+    global running
+
+    if os.path.exists(device):
+        core.log("enabling GPS bettercap's module for %s" % device)
+        try:
+            agent.run('gps off')
+        except:
+            pass
+
+        agent.run('set gps.device %s' % device)
+        agent.run('set gps.speed %d' % speed)
+        agent.run('gps on')
+        running = True
+    else:
+        core.log("no GPS detected")
+
+
+def on_handshake(agent, filename, access_point, client_station):
+    if running:
+        info = agent.session()
+        gps = info['gps']
+        gps_filename = filename.replace('.pcap', '.gps.json')
+
+        core.log("saving GPS to %s (%s)" % (gps_filename, gps))
+        with open(gps_filename, 'w+t') as fp:
+            json.dump(gps, fp)
+```
 
 ### Random Info
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh b/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh
index f158830..58b681c 100755
--- a/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh
@@ -9,5 +9,3 @@ if ifconfig | grep usb0 | grep RUNNING; then
 else
     sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto
 fi
-
-

From 191067f9e8820ca2674ea3fad6f982ab037fbf31 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 11:54:56 +0200
Subject: [PATCH 48/62] Fixed language files

---
 .../pwnagotchi/locale/de/LC_MESSAGES/voice.mo | Bin 3905 -> 3845 bytes
 .../pwnagotchi/locale/de/LC_MESSAGES/voice.po | 122 ++++++++--------
 .../pwnagotchi/locale/el/LC_MESSAGES/voice.mo | Bin 4723 -> 4665 bytes
 .../pwnagotchi/locale/el/LC_MESSAGES/voice.po | 116 +++++++--------
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 441 -> 400 bytes
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po |  60 ++++----
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 3755 -> 3761 bytes
 .../pwnagotchi/locale/mk/LC_MESSAGES/voice.mo | Bin 4618 -> 4559 bytes
 .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po | 125 +++++++++--------
 .../pwnagotchi/locale/nl/LC_MESSAGES/voice.mo | Bin 4012 -> 3947 bytes
 .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po | 132 +++++++++---------
 11 files changed, 278 insertions(+), 277 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo
index e78a76aaf3c5ec299261cd9a855b3e47be7f7af1..52124cebbf25065fd7de320a2070709b2df9ab0f 100644
GIT binary patch
delta 1583
zcmY+@O>7%Q7zW@8actu>E~O=Ho#4#UrcN4TM5H20OA)0iDL+jSico}9*m%eG*6Z17
zca3GD$W$sws2mU@1S$uRIM73diYkOaJy4<^%84Iw-~cG%7%m*j0fFFscO4W)UOltB
zGv9pk&H8%r)#97w-VPze`k)X~P^5&o3rzQY1m1!B1-KX1-~;diEWoee1pEnZhkrxP
z-!>$~2rR*!@BkczPeZQfzzpmTiC(<GIXw6R58i@%IWUbNFo2wR9&+M)a2LD+8Tcm5
z!8N!Q{stNNFDPLOHyk$!$Kb<|2`|EF*v<5kOh3c}?%<RDz#IL6Ymf^MWRn1+kO5~Q
z$3Fp?&}qnoJCHkn9UdAG;vL8YzrS6GJK@i;41b5*Sh0t<yU{rSS?YN>315T{!Pg)&
zz7AQLH8>8_!$~50AWMD-GR`xQ2{j=TJP%o!cOetM1iyn{Lax&@TZBMgd=44l24rTx
zKnD5)a^hBOi#seqE_e`P6Jj3jgNu-rdId7!xBGqyXL0`n#7|`N$+%I7BRL~x(Ak3*
zk3$A-!Xi8enaBr_rTYvrp|2qm`4w_!w;(DVH^!O9#c^y*kS$K!Y#ZF!!v_}6;!_J3
zCdXe2cKKhs7d>uaquqlJOT$l|rQkU+GuCek7qew6<6<e;SW;$<e}up{5I203`vv}L
zaUJ+MZnWFb;i2xw#S-wKbLQK@sp4{{VMi<CG2i#fvZG|(kL0p$w^p?3$cCB8ji;-2
z<m$RPoSL0j)^<y+SSQ`8l94Z4N=35kw=0;!7v^%R@Kh~O%94wIJCKi_k{#FcLc1%Y
zhOL`nMa-#gvZSY?QYe>{tOc&pPH2faw=7STTJls!+eo9@a4qv^$~R|*{ux?s+0_+u
zHeE0m(ihFX%!B5I%x=@oOyoOCN3s+6x-Kh~in)|IYSuG_`y8z4*JP_JJ-4PTvCwGo
zeckt+rLIcS6${#p`k5ch&Xtm`8=?qWRmA^pIl2Gj>gDY7116grH<P((GoL%M>!gYz
zdCaXgno4V>Uv7IUfE9ByH`YTvTuUBPu1@L^I4YEm8%PHg!JthgvBOZdbtsPqs;wO*
zLrhBQg4lA&)eN$!JkLgU5UDt|6Btliz1Hw#3u8lH+Mb8eN}9Rh(^o$lmIIc<@NprV
zjPsm(+?7j#-L5t)@uXXADzm=jV{>uji1~43%-kBWwud+aRg-n)+3lLrae-&@M~%+k
zZQjTivJnQXUR!<NT*>dqxnU#`)=`1^CV%+;jq2fWRDGj#9E00U#e7KxXOUNAiGKlc
C<S2pw

delta 1695
zcmY+D&2Jk;7{<qqlT9aa`rXjRN#AWt(=?9xP>>1@0g_UJ8kHUrwFn`!_Kv+n>{+zC
z#!7-^4#1&8qI5w*NL4Q&L8azW1QLQu5V&xo7y1VPhjM5^;s8Cs^X@v(jy&_5nSJM-
zXPz0qIr7cO`9gb_5aPEkA;!Q=R*2o;ILPxe;8yS~cnH*B9y|{o1+Rbv{tE5@t?qQ)
z5SYXGA#f0UqQf)bPK<rf0^jHs?PP<uG4UlPE`q$#*&ZRbgKdxnT>yFEr{I0yHINhk
z1WNE0xCQ(h<irw<4Q>ZHZW3hS^B{p590$)??NsUKnBWt9*9pAQ3H%de0lRyJ7zQUm
zPIwaJ_%gT`Y=SKK0yqGE3?9n}@fpYhZ*NZH?|>5+Z^0zzdAyCz9&{E#w%P|r!Ph}P
z!6)Dp_yc$dwE9vZMUWHBgM3vk$az*ed=F%SYal!GEy(fL!Rz2nkoReS-7f@w;ukcW
z;17^b+>Z-ns}F#@a0=W8E`YpY1;k;*Yal0j3*;+W0|{L3@Mmxm<8Ii3u6PXOxH%A4
z^0Iglor9QI0ePcKAc0?iEaV2r*4_fy>P<KfkB32a>_HGtC*=Uz`%zgqyM;q0g@ucF
zTh}12JN1J(f{LWc?rZ@bUs5>hzD}Qy$oIh3uo}GddrASL!>ITNC92232~<|fD%l#m
zfu!JZ9!XvU`!IyMKb;qwKz^P_P}u_ZSHwSd9VWTj^qi<AW_`a_pr)d#AJM95)LYW1
zCV6qc%v)tA(xxioN3#!4%T?plRm+yAbXig4Q(dWumi<N%%lM0!Q_G#KvZkWZkV=Xw
zfmX&1?f6`F@1(2*O4;<h-w5cb)6~?pnhc#~iaf_Gg+(!^3-s)0olZB6136_++cLhL
z^)oVlsr#S(a<%T1S)Ou3GCrNrC$ue2>he;_F(wh(>iH1CgVs^B&slrWde*+JvZ+i&
z&A>NRDi(_}e&3qOOC3_69Cx`W7CiLvi#!F*VI<?<t--vk`o3FQR-J>3MWdrmU&hos
zH@-2z%BpWvQKUX_VjlBW8&g-`>3tysH8(fs(e}tOv=7MXS$RrD5gpfMPcA8Alv!!i
zQ~<(^yWDibkQyeW6M<?NS5c_6u{okZv+=vx9ZyDVt+wenKBU$Lu2dnpIv^M3CJEs#
zHlmU?lEdzC`Hp0>cJ}FvyxQuc%t7h$rm5pg9L{c2DR3HPFEw4s_*(xOR@HLTXfNl6
z(0-q@cgYYprz%ucHK$QgCiVQU+zh@S8yJ3CE;v=Z9&I3SUX_%=)h~MWBrL+(^{>`1
zZJ7Ry3f4d3hsiGt&PD_&t_o!Q!NAlb|K9+vS5^PBo8vIP`vzWB!7DgXWQ%_RRZ}?p

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
index 95393cb..ae6593e 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
@@ -23,19 +23,19 @@ msgstr ""
 
 #: voice.py:21
 msgid ""
-"Hi, I'm Pwnagotchi!\n"
+"Hi, I'm Pwnagotchi!"
 "Starting ..."
 msgstr ""
-"Hi, ich bin\n"
-"ein Pwnagotchi!\n"
+"Hi, ich bin"
+"ein Pwnagotchi!"
 "Starte ..."
 
 #: voice.py:22
 msgid ""
-"New day, new hunt,\n"
+"New day, new hunt,"
 "new pwns!"
 msgstr ""
-"Neuer Tag, neue Jagd,\n"
+"Neuer Tag, neue Jagd,"
 "neue Pwns!"
 
 #: voice.py:23
@@ -48,21 +48,21 @@ msgstr "KI bereit."
 
 #: voice.py:29
 msgid ""
-"The neural network\n"
+"The neural network"
 "is ready."
 msgstr ""
-"Das neurale Netz\n"
+"Das neurale Netz"
 "ist bereit."
 
 #: voice.py:39
 #, python-brace-format
 msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
+"Hey, channel {channel} is"
+"free! Your AP will"
 "say thanks."
 msgstr ""
-"Hey, Channel {channel} ist\n"
-"frei! Dein AP wird\n"
+"Hey, Channel {channel} ist"
+"frei! Dein AP wird"
 "es dir danken."
 
 #: voice.py:44
@@ -75,10 +75,10 @@ msgstr "Lass uns laufen gehen!"
 
 #: voice.py:49
 msgid ""
-"This is the best\n"
+"This is the best"
 "day of my life!"
 msgstr ""
-"Das ist der beste\n"
+"Das ist der beste"
 "Tag meines Lebens."
 
 #: voice.py:53
@@ -111,80 +111,80 @@ msgstr "So viele Netwerke!!!"
 
 #: voice.py:69
 msgid ""
-"I'm having so much\n"
+"I'm having so much"
 "fun!"
 msgstr ""
-"Ich habe sooo viel\n"
+"Ich habe sooo viel"
 "Spaß!"
 
 #: voice.py:70
 msgid ""
-"My crime is that of\n"
+"My crime is that of"
 "curiosity ..."
 msgstr ""
-"Mein Verbrechen ist\n"
+"Mein Verbrechen ist"
 "das der Neugier ..."
 
 #: voice.py:75
 #, python-brace-format
 msgid ""
-"Hello\n"
-"{name}!\n"
+"Hello"
+"{name}!"
 "Nice to meet you. {name}"
 msgstr ""
-"Hallo {name},\n"
-"Nett Dich\n"
+"Hallo {name},"
+"Nett Dich"
 "kennenzulernen."
 
 #: voice.py:76
 #, python-brace-format
 msgid ""
-"Unit\n"
-"{name}\n"
+"Unit"
+"{name}"
 "is nearby! {name}"
 msgstr ""
-"Gerät {name}\n"
-"ist in der\n"
+"Gerät {name}"
+"ist in der"
 "nähe!!"
 
 #: voice.py:81
 #, python-brace-format
 msgid ""
-"Uhm ...\n"
-"goodbye\n"
+"Uhm ..."
+"goodbye"
 "{name}"
 msgstr ""
-"Uhm ...\n"
-"tschüß\n"
+"Uhm ..."
+"tschüß"
 "{name}"
 
 #: voice.py:82
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "is gone ..."
 msgstr ""
-"{name}\n"
+"{name}"
 "ist weg ..."
 
 #: voice.py:87
 #, python-brace-format
 msgid ""
-"Whoops ...\n"
-"{name}\n"
+"Whoops ..."
+"{name}"
 "is gone."
 msgstr ""
-"Whoops ...\n"
-"{name}\n"
+"Whoops ..."
+"{name}"
 "ist weg."
 
 #: voice.py:88
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "missed!"
 msgstr ""
-"{name}\n"
+"{name}"
 "verpasst!"
 
 #: voice.py:89
@@ -193,16 +193,16 @@ msgstr "Verpasst!"
 
 #: voice.py:94
 msgid ""
-"Nobody wants to\n"
+"Nobody wants to"
 "play with me ..."
 msgstr ""
-"Niemand will mit\n"
+"Niemand will mit"
 "mir spielen ..."
 
 #: voice.py:95
 msgid "I feel so alone ..."
 msgstr ""
-"Ich fühl mich\n"
+"Ich fühl mich"
 "so alleine ..."
 
 #: voice.py:96
@@ -236,76 +236,76 @@ msgstr "Schaue mich um ({secs}s)"
 #: voice.py:121
 #, python-brace-format
 msgid ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "let's be friends!"
 msgstr ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "lass uns Freunde sein!"
 
 #: voice.py:122
 #, python-brace-format
 msgid ""
-"Associating to\n"
+"Associating to"
 "{what}"
 msgstr ""
-"Verbinde mit\n"
+"Verbinde mit"
 "{what}"
 
 #: voice.py:123
 #, python-brace-format
 msgid ""
-"Yo\n"
+"Yo"
 "{what}!"
 msgstr ""
 
 #: voice.py:128
 #, python-brace-format
 msgid ""
-"Just decided that\n"
-"{mac}\n"
+"Just decided that"
+"{mac}"
 "needs no WiFi!"
 msgstr ""
-"Ich denke,\n"
-"dass {mac}\n"
+"Ich denke,"
+"dass {mac}"
 "kein WiFi brauch!"
 
 #: voice.py:129
 #, python-brace-format
 msgid ""
-"Deauthenticating\n"
+"Deauthenticating"
 "{mac}"
 msgstr ""
-"Deauthentifiziere\n"
+"Deauthentifiziere"
 "{mac}"
 
 #: voice.py:130
 #, python-brace-format
 msgid ""
-"Kickbanning\n"
+"Kickbanning"
 "{mac}!"
 msgstr ""
-"Kicke\n"
+"Kicke"
 "{mac}!"
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, we got {num}\n"
+"Cool, we got {num}"
 "new handshake{plural}!"
 msgstr ""
-"Cool, wir haben {num}\n"
+"Cool, wir haben {num}"
 "neue Handshake{plural}!"
 
 #: voice.py:139
 msgid ""
-"Ops, something\n"
-"went wrong ...\n"
+"Ops, something"
+"went wrong ..."
 "Rebooting ..."
 msgstr ""
-"Ops, da ist etwas\n"
-"schief gelaufen ...\n"
+"Ops, da ist etwas"
+"schief gelaufen ..."
 "Starte neu ..."
 
 #: voice.py:143
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo
index b06caaa4b2e7d0c5a1412fc4db5ac3b51b21eaf0..f5c4d5ab44ea631b1351cf0ff020ead2f8a11390 100644
GIT binary patch
delta 1530
zcmY+@PfT1z9Ki9R1r~Q({%olgY|A`c{#4d&s8SUFB&}@%k!mkJRAbB*9<ajhYnH`z
zMFLjEaIi{7V`48>doYn$$(GnwR`ld;HfiI*gC@r4!RVptp-GMP``h<0agw*6nfK<;
zZ+<iTXY5Ms?f87NQtH-LrMj`PTB)7*P~cP8NZZ92zJLeu9Jb;$Y{TDi2X3$N$2+*4
zc0caIqj)Dii?Uu0L%39<<|_*<^WrKmKE#-GtW~NB&!7x^2W8+Vco%+!GVym9#v9mx
zf1^yijUSE8DE<2IZajt(a0>U~QfS_fw8#tD!Ph~@Z-b6EP!?{g^C##;neZ@5|EEy`
z%HSRN21?+|C>i(&2db1>#VGCH=+ut4aTwd@34ae259Py~=-_8~2(RHJHb<1|!3BI2
zS5PwbE6R=<w)uhX$4=TuP>yIaa1kW~=dl}0_z%wiLgfi6KNGHW=&knyIfk0{>7c!g
zlCn$Kf<K@HdK2Z2w37cJ?7<$K!CpL%vXSe-_nma!P5U{#hxOIVR372Q2lyC%j}rNA
z@^}FIk&fzllnkB4UR*`Vz)vUv)sbJhEA3c?Qe>P2Ek`7UtXB#{R9B_O`OEpndE^+R
za0e@wN$RpgHmEcYiTbZ3s7cy4iv%V?NZ@im*h3|l4wQ87<&kn9j~tH_PEJK-=lpvV
z_oGs{z>0rk<?_gJY?dulByIQd$X`@;9yUL2?QWUPPb715>T%DTitD_q$Gx1M&CI0d
zOsu-g3|Aj$o6RKC?ws>vYQ)t!Pp4fsrwiUpf^PD`tXH=Vk7Zrg(I>r`tUh#H=TlQt
z)5(I)O(Zju(+M@`7W`$V++5eRKIQ7MY|71yPCIHa71u*uX?;AONwW0FM9MMY8qd5`
zbGv3XogA4n3$?B0T<!bjVCX^Pg<8x~sI5NlW^y{8^)ll+kw}=!p~L1@sCEA+YkFfk
zUC>jhG1pNiCereK-1A0H6<j}Dbt03>1(6Tc4fgug)HEB<xCwRA^CNZC|31hx!JFbY
zb=fL25bihGaG&`&{EVrNJYdEm-R7-G$3DAeFWQn_wO6!VE5B}wwp2cA*UL+`lu-6v
zyXN@w$IX$5W3ESH#ha0bw**@qsP8MDt`Ak27aI!ZkA{SC8t>m#Ua+4s&6>7f*cE%(
zZj{edHl1!<G=DYrn|M=CC+n5Uud(t*uu1!#w(E9-NLK76yBh5Gm8R?-V))XomKSA+
ky;y#gVV~QpOiyLQM57%$HWOek*p1CI9**v<^CxlCzm=3R82|tP

delta 1612
zcmY+@UuYaf9Ki8Oll0EX->bGU|Lk1MpVq`f+E|Niqm8Ac)@UhKsTJgsZ12wGcH!>A
zd4zD{pGHAj>G~7|OVJ0Zse}+P))+x4KFAyu-vmJs^}XUt!T9~{Z3Ktg`RvZl&iv*#
zb8Ee~d*2%>?^H_Nsa0w(#_E*Xg@;huPh%^lu^&s=g;($(uA{-f@osFZuYNa(O*|jP
zHhd;Dh4=7W#t6P&ugbv$AJFgx4NE8!rMD}!123TjbQR^pHM|!s%D{i1#!YNN&8RYP
z2UQ$<Q2HH13H(JgSi(VEjFhX9-lRcR@MGBV&#+^Cv>HG^cJuxS%7Euk`sc9&7f=GZ
ziW2w|Hsja$XpK^puwB#Xe%iZn9FLZ{xsRJm*n`(mBEN;BcpD$Y0}V=LaSBK92kgaI
zqf)!&JxYe2!+xAb3G8y{5_a<Z9qz&3@E<HUu~8C9BjHMlUO)+?hz1wK=Nl+z<Y#Qh
zDEXE^dr;2EF?<rwprrN+?!)g<7P5&aag@$7&qX8?Wp$04BQ#X-F>H!eJB;Hn&o85-
z>_e2mzQO(YJN97*`IePFj=|O-84rqlCw=71NLEOi8sg&9u(1D<HYu{dTZLeQB3r|P
zgH)3-#rX^hu?A_Ehr75W6Ot7<to#}NS7iGn<+WUfOR|{YlAw1SrW)Yld<2Dq92_Ke
zCD<=nv6O9GlC}r9WR>#wRQ@ludph-8F`X>Tt0z2fX2=vBlky5?&YjK9Yrm&%pho*A
z>h_K3IX9Vg=HvS5%%o!qp2<2+!IZq&1byX=8gokFP<qBG4CKv(W6tL?jysi)`-^oQ
z!}@&AapLBzH=8p@Pnlw7W=7|eB~wTz-RXQnjb(<+iGi#+RdkcYFqzK8_2qhx0KEFm
z9zB;$PR?uBai;Rd_002`<C(ZRnVFoPNV;yuO=<t#?Td6Ch#aJTDbh~;N@RDdE;??(
z6my=NGKoY&`yWR}yL2XRa!zuplu*y6x#w3%JA|AsXul@f)}>RPH#Jdm!gZ@NZl)04
zYyY9>*nzDFzD#+plTc^9aQSgn&4|n)uVmJ(rj<{kxf%lN)Q?b~)(=xJ=yTM+>fuJa
z8V|=9(*8RQaersSUS5qf^mS{yYCp5<cG<2OyIOhEuGsa;Mf+vtZM&ZEuQl}7=#^Uy
zhqgt+Jo&L^#$Gwz9Fgh9TT0Y7TN2cNwd`-#l~?U`hFCTBhW*rjZZ|5gRg*K)dVxOQ
zwn}(+S_d07Gp<+OVD1gp9orS%TDSjHEJvTOV%^j~#rh8aw|e`L-3Skbwo8=@L9nYq
W7VKM<1-o2%-7Xu(+z7{ttA7E7>no@L

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
index e93f004..615ad2b 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
@@ -23,18 +23,18 @@ msgstr ""
 
 #: voice.py:21
 msgid ""
-"Hi, I'm Pwnagotchi!\n"
+"Hi, I'm Pwnagotchi!"
 "Starting ..."
 msgstr ""
-"Γειά, είμαι το Pwnagotchi!\n"
+"Γειά, είμαι το Pwnagotchi!"
 "Εκκινούμαι ..."
 
 #: voice.py:22
 msgid ""
-"New day, new hunt,\n"
+"New day, new hunt,"
 "new pwns!"
 msgstr ""
-"Νέα μέρα, νέο κυνήγι,\n"
+"Νέα μέρα, νέο κυνήγι,"
 "νέα pwns!"
 
 #: voice.py:23
@@ -47,21 +47,21 @@ msgstr "ΤΝ έτοιμη."
 
 #: voice.py:29
 msgid ""
-"The neural network\n"
+"The neural network"
 "is ready."
 msgstr ""
-"Το νευρωνικό δίκτυο\n"
+"Το νευρωνικό δίκτυο"
 "είναι έτοιμο."
 
 #: voice.py:39
 #, python-brace-format
 msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
+"Hey, channel {channel} is"
+"free! Your AP will"
 "say thanks."
 msgstr ""
-"Ε, το κανάλι {channel} είναι\n"
-"ελεύθερο! Το AP σου θα\n"
+"Ε, το κανάλι {channel} είναι"
+"ελεύθερο! Το AP σου θα"
 "είναι ευγνώμων."
 
 #: voice.py:44
@@ -74,10 +74,10 @@ msgstr "Ας πάμε μια βόλτα!"
 
 #: voice.py:49
 msgid ""
-"This is the best\n"
+"This is the best"
 "day of my life!"
 msgstr ""
-"Είναι η καλύτερη\n"
+"Είναι η καλύτερη"
 "μέρα της ζωής μου!"
 
 #: voice.py:53
@@ -110,77 +110,77 @@ msgstr "Τόσα πολλά δίκτυα!!!"
 
 #: voice.py:69
 msgid ""
-"I'm having so much\n"
+"I'm having so much"
 "fun!"
 msgstr "Περνάω τέλεια!"
 
 #: voice.py:70
 msgid ""
-"My crime is that of\n"
+"My crime is that of"
 "curiosity ..."
 msgstr ""
-"Η περιέργεια είναι\n"
+"Η περιέργεια είναι"
 "το μόνο έγκλημά μου ..."
 
 #: voice.py:75
 #, python-brace-format
 msgid ""
-"Hello\n"
-"{name}!\n"
+"Hello"
+"{name}!"
 "Nice to meet you. {name}"
 msgstr ""
-"Γειά {name}!\n"
+"Γειά {name}!"
 "Χάρηκα για τη γνωριμία. {name}"
 
 #: voice.py:76
 #, python-brace-format
 msgid ""
-"Unit\n"
-"{name}\n"
+"Unit"
+"{name}"
 "is nearby! {name}"
 msgstr ""
-"Η μονάδα\n"
-"{name}\n"
+"Η μονάδα"
+"{name}"
 "είναι κοντά! {name}"
 
 #: voice.py:81
 #, python-brace-format
 msgid ""
-"Uhm ...\n"
-"goodbye\n"
+"Uhm ..."
+"goodbye"
 "{name}"
 msgstr ""
-"Εμμ ...\n"
-"αντίο\n"
+"Εμμ ..."
+"αντίο"
 "{name}"
 
 #: voice.py:82
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "is gone ..."
 msgstr ""
-"Το {name}\n"
+"Το {name}"
 "έφυγε ..."
 
 #: voice.py:87
 #, python-brace-format
 msgid ""
-"Whoops ...\n"
-"{name}\n"
+"Whoops ..."
+"{name}"
 "is gone."
 msgstr ""
-"Ουπς ... \n"
-"Εξαφανίστηκε το\n"
+"Ουπς ... "
+"Εξαφανίστηκε το"
 "{name}."
 
 #: voice.py:88
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "missed!"
 msgstr ""
-"Έχασα το\n"
+"Έχασα το"
 "{name}!"
 
 #: voice.py:89
@@ -189,10 +189,10 @@ msgstr "Το έχασα!"
 
 #: voice.py:94
 msgid ""
-"Nobody wants to\n"
+"Nobody wants to"
 "play with me ..."
 msgstr ""
-"Κανείς δε θέλει να\n"
+"Κανείς δε θέλει να"
 "παίξει μαζί μου ..."
 
 #: voice.py:95
@@ -230,78 +230,78 @@ msgstr "Ψάχνω τριγύρω ({secs})"
 #: voice.py:121
 #, python-brace-format
 msgid ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "let's be friends!"
 msgstr ""
-"Εε!\n"
-"{what},\n"
+"Εε!"
+"{what},"
 "ας γίνουμε φίλοι!"
 
 #: voice.py:122
 #, python-brace-format
 msgid ""
-"Associating to\n"
+"Associating to"
 "{what}"
 msgstr ""
-"Συνδέομαι με το\n"
+"Συνδέομαι με το"
 "{what}"
 
 #: voice.py:123
 #, python-brace-format
 msgid ""
-"Yo\n"
+"Yo"
 "{what}!"
 msgstr ""
-"Που'σαι ρε τρελέ\n"
+"Που'σαι ρε τρελέ"
 "{what}!"
 
 #: voice.py:128
 #, python-brace-format
 msgid ""
-"Just decided that\n"
-"{mac}\n"
+"Just decided that"
+"{mac}"
 "needs no WiFi!"
 msgstr ""
-"Μόλις αποφάσισα ότι η\n"
-"{mac}\n"
+"Μόλις αποφάσισα ότι η"
+"{mac}"
 "δε χρείαζεται WiFi!"
 
 #: voice.py:129
 #, python-brace-format
 msgid ""
-"Deauthenticating\n"
+"Deauthenticating"
 "{mac}"
 msgstr ""
-"Πετάω έξω την\n"
+"Πετάω έξω την"
 "{mac}"
 
 #: voice.py:130
 #, python-brace-format
 msgid ""
-"Kickbanning\n"
+"Kickbanning"
 "{mac}!"
 msgstr ""
-"Μπανάρω την\n"
+"Μπανάρω την"
 "{mac}!"
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, we got {num}\n"
+"Cool, we got {num}"
 "new handshake{plural}!"
 msgstr ""
-"Τέλεια δικέ μου, πήραμε {num}\n"
+"Τέλεια δικέ μου, πήραμε {num}"
 "νέες χειραψίες!"
 
 #: voice.py:139
 msgid ""
-"Ops, something\n"
-"went wrong ...\n"
+"Ops, something"
+"went wrong ..."
 "Rebooting ..."
 msgstr ""
-"Ουπς, κάτι\n"
-"πήγε λάθος ...\n"
+"Ουπς, κάτι"
+"πήγε λάθος ..."
 "Επανεκκινούμαι ..."
 
 #: voice.py:143
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo
index b9b2b243d384e8b4de5ea574e23aac1202d319db..f62832735e4ead2a800789b858dedcd337e34178 100644
GIT binary patch
delta 15
WcmdnVJb`(F3S-zrRrifkRTu#$*#yG?

delta 54
zcmbQhypwr?3S<35Rd=-zUFV|I#FEVXJYAQ>l2j`NBLhQAT|)z117ih411lp7Z380%
JgN>Q$i~zT34xj)4

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
index 326e1e1..c164152 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -23,14 +23,14 @@ msgstr ""
 
 #: voice.py:21
 msgid ""
-"Bonjour, je suis Pwnagotchi!\n"
+"Bonjour, je suis Pwnagotchi!"
 "Démarrage ..."
 msgstr ""
 
 #: voice.py:22
 msgid ""
-"New day, new hunt,\n"
-"Nouvelle journée, nouvelle chasse,\n"
+"New day, new hunt,"
+"Nouvelle journée, nouvelle chasse,"
 "nouveau pwns!"
 msgstr ""
 
@@ -44,15 +44,15 @@ msgstr ""
 
 #: voice.py:29
 msgid ""
-"Le réseau neuronal\n"
+"Le réseau neuronal"
 "est prêt."
 msgstr ""
 
 #: voice.py:39
 #, python-brace-format
 msgid ""
-"Hey, le channel {channel} est\n"
-"libre! Ton AP va\n"
+"Hey, le channel {channel} est"
+"libre! Ton AP va"
 "dis merci."
 msgstr ""
 
@@ -66,7 +66,7 @@ msgstr ""
 
 #: voice.py:49
 msgid ""
-"C'est le meilleur\n"
+"C'est le meilleur"
 "jour de ma vie!"
 msgstr ""
 
@@ -105,53 +105,53 @@ msgstr ""
 
 #: voice.py:70
 msgid ""
-"Mon crime est celui de\n"
+"Mon crime est celui de"
 "la curiosité ..."
 msgstr ""
 
 #: voice.py:75
 #, python-brace-format
 msgid ""
-"Bonjour\n"
-"{name}!\n"
+"Bonjour"
+"{name}!"
 "Ravis de te rencontrer. {name}"
 msgstr ""
 
 #: voice.py:76
 #, python-brace-format
 msgid ""
-"L'unité\n"
-"{name}\n"
+"L'unité"
+"{name}"
 "est proche! {name}"
 msgstr ""
 
 #: voice.py:81
 #, python-brace-format
 msgid ""
-"Hum ...\n"
-"au revoir\n"
+"Hum ..."
+"au revoir"
 "{name}"
 msgstr ""
 
 #: voice.py:82
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "est parti ..."
 msgstr ""
 
 #: voice.py:87
 #, python-brace-format
 msgid ""
-"Oups ...\n"
-"{name}\n"
+"Oups ..."
+"{name}"
 "est parti."
 msgstr ""
 
 #: voice.py:88
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "raté!"
 msgstr ""
 
@@ -161,7 +161,7 @@ msgstr ""
 
 #: voice.py:94
 msgid ""
-"Personne ne veut\n"
+"Personne ne veut"
 "jouer avec moi ..."
 msgstr ""
 
@@ -200,58 +200,58 @@ msgstr ""
 #: voice.py:121
 #, python-brace-format
 msgid ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "soyons amis!"
 msgstr ""
 
 #: voice.py:122
 #, python-brace-format
 msgid ""
-"Association à\n"
+"Association à"
 "{what}"
 msgstr ""
 
 #: voice.py:123
 #, python-brace-format
 msgid ""
-"Yo\n"
+"Yo"
 "{what}!"
 msgstr ""
 
 #: voice.py:128
 #, python-brace-format
 msgid ""
-"Décidé à l'instant que\n"
-"{mac}\n"
+"Décidé à l'instant que"
+"{mac}"
 "n'a pas besoin de WiFi!"
 msgstr ""
 
 #: voice.py:129
 #, python-brace-format
 msgid ""
-"Désauthentification de\n"
+"Désauthentification de"
 "{mac}"
 msgstr ""
 
 #: voice.py:130
 #, python-brace-format
 msgid ""
-"Kickbanning\n"
+"Kickbanning"
 "{mac}!"
 msgstr ""
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, nous avons {num}\n"
+"Cool, nous avons {num}"
 "nouveaux handshake{plural}!"
 msgstr ""
 
 #: voice.py:139
 msgid ""
-"Oups, quelque\n"
-"chose s'est mal passé ...\n"
+"Oups, quelque"
+"chose s'est mal passé ..."
 "Redémarrage ..."
 msgstr ""
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo
index 465dfc3dede76427c355ac24f24abaa7b52516fe..a811add1ad5e423704921426827c4a15424cfb3b 100644
GIT binary patch
delta 395
zcmXZXy)Oh|5XbS^E6B~>I`2a4;k-q{icX=SAkk_yC#TrLuDdvih@4`>A8--Ll{(R!
zY)(y~P$(3lRB1({QHbv(s?R+0WS;pwH~y{PN}T$ni0ouV0zAVZY-16haTLFB89f!5
z!*v|Qef01gb9jLTyh0xzunXVO#ZT<VAAH2TD|K0-c;(g>b@GY@n8Gn!!CBnKUQDnD
zFVO;A|9g)!oZrws^ourMB%OV14Q;-H1DN0lHoXmzMT$0!Y5c$mbcx-E3up^h(fV6R
zc&Xtqo}vY5rcaqxhog<7?2Du6rWP{YTB(KOVRR5zqc{ixO%HQbC$FV)IgIr<D(&r_
K%xmM@yZZx1)-$sJ

delta 387
zcmXZXKTASk6vy$SVBqyWLjR1Sdn==Ih#PL9&=xKF2HXrA?%=&7wcH3D@)g`@ZfR;!
zZZru^4nj*fH?#+>QH$RLPM`Cfhx44@GjyJv!Ck6b6p{0+h=+Y#!xz;4J8t3+9;0oE
zl<*V_7@)yE+8CpYkLchV=J6AA_>C+0i(@o7=}MVm%B?QS@QMZ~;ucnL4;#3IJzT^X
zHNex{5$<!I;x7K7&by@3kDZ{-w{aDFxPcGmOyr1SNJ9s|a0fHQUd98|g;msk9SJWX
zu49B6<UX0C2MckO{YYw-o6cWe``dnS6?THq^SmUoJ1Ns_wfxY!37YMT+r#+Zyv_iu
CP%`)c

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo
index 21ab0c20eaa4ca6098488c3dd5d1a8ae344ae2e4..2d3562329ea69daafd4db6bb7f0570ba452fd5ba 100644
GIT binary patch
delta 1646
zcmYk*Uu+ab9Ki7@-qGtH`VT6!rFNE<R^T`hEy^Ebw8XSQksw4HiRRjF+fA>#=5Cuy
z)0_uruo5-O*l2vvq>=bUQfvT4I1*os8tvXAk;DglQj`aMk{JE|_EzJhd!L!<?#%D^
zo88krE8TA=i|dq912LuU#pkdUPei_lO^nZB50-Ej-o$onk1N%M{kRs7qCD^58Z6>^
zd=u}+vncyr!D=kWRWaP)Iun<f_!(uRv#XVA#&1v_yn*uI@3;XIJS_`bSc|){5%(j1
z>Igp?kD=UGzz$qM3HUs2!E$x666qZ#B!ikn<;G5w8+W5@JRHrtC<~rOxqlHQpo>_8
zD=2|q#|Hcb$w~bg&C5+vnHF4EMUX{0Ell*2#wHv@De)Bc;$k%aHOj`fa2v+zC^zoF
zB%Z>(xQucHx1;%ZeWijsv6J~Bv~U6?@Z#%qSW_)x8=k}4_!UYZmk3t^{0-%3sz^%~
z>O~pvk94q`@mshBKSeo`8~6y`LXBIQd=L-dKK56~=^SL@DoUyAdE+EP3m?D%d=&F2
z@4_Wa;`b;Oxr36)TIwzpOd`pvr%@7m9yj6)l9M_U&3}Zg?5{qj!%>8bZbLcu|2N5A
zGL@#e?&6XRV_ciL<UA!XDZ4azFQh`NWDvFcu#ZcQRD$Al2)`hU{lgar)OPuyNwmZi
zW+!9GjwHi!@&SaO>JF4+lb7q?#ycEVP{#K}lX4^}E~$((P9bbkA^9R|q$KxqZ8h6t
zJ#BOO$+TZk1D=;j>b$KdJYUbbGt&i=iS?OxV>_$o-1M|vu*^zqV=<{mC)2KLXY^du
zDQG7*p0#aD4|_9N{n#O$cQTn=dRF_~Ih9MPL3_5cNyhg3a(cwp<5|ac$8we$bdq|g
zZ(1M9yJ<Eaoph{c{B+iL+zFjZrPPofx7jP_>2$_(ZEd{xVe@7D@2<J&^k~7g?XjG8
zJ^ifngkz}#&gj$#!SS%Ux%vb1a`nS)uASE}<z2Qq=#6+|vpS!4{hanaQ?Bl6$lI>3
z^I5O5+nL1U?M_Z-?ey4eN*$S`&!0bO6LQWsFC^A)nDD%@ky*P^5p~pc{7TonlNfBS
zba`ZgP*ZByGruPKTcUB8PUVi}T{TZunOADN%_p_{%ulsX{a4{Vb)DuE*T;36I)lr>
zQgAW2pv$k)`65_KsbHb}ex;J;#kwBzLtXFks`@{w;$bn&Uu*i7H#f9anZ1p}W}&g)
zeA~FEomEP@JYPO3oGc#?E(GU;B?-n@O*ymB^pN?kskfv28hezYw1N+VYYdm7)LNR4
qbyT{+vaE6<xXLP5!hq(3l6j-~u=%mMy(zfH@+J94c|Q2eQvU#_s64I!

delta 1689
zcmZA0UuauZ9Ki9DnKbQ*T{_pbUDvHAYqxHirmL)MNFDxpumvaW${ZCz)8?klZ12_H
zNGzp9tI|3ICwCxB=8Hb~;+9$FpH(}j55j!d4KkE55yS_r$PnF&FZ%u6q%u4t=X37K
zz32RXzjJf7<3#7lWO0j9>fx|bdvO$-@MV<w)7XF|+>Mv94S&Id7>Oul@DOgsr%;}A
zu^wN;W_+vaIc((mYmDNJh$;pf{LI8fCT^i@RH{+xF8mH9pf!{SLp;@jO(+ZZpvFfq
zjz^G>8ly|#ag_UBM+y8rG<X^B!JneVN~9ZWD;cz*+_(?r#=|H9*ti{EMOpA&l#Exf
z6|bTMvWA=R7H-679aX|6l!V$)=6kR)MCFRrA4Yh(gCDYZ08d~Seu+DA4Q1o{m{Q%i
z3sX3P$8Z7r@jA*8G~cOI61!0ncmgGX=TIv121+H1=NYiJx`JEr8s5a4C};d52Pv7h
z5OyafQ5G7mUOQD!p(OAr?!_NajwDKV2%FL1<JgA<yr2Em2MmUo_zmTZ`+4Ie!eQKx
zE<S+oqeT2Grf>swmWuSE%nzajIEKWo7Euy9g>s~4tMlKW9NG8S#Qy3}1{_83LV(&K
zUA48NoSQ5xO^!kqlMJOvAaYEcVo-Ks3#ug*+Q9b?zS4U5?g~bgptdoVAR_D^l;5B<
zIV)+z6l5o3$xa#tQv4Bu>g+)&xBSg`*Mi1N9aL~1$~)2<%vSzU{9_fbM)2|_tMhkb
zos=qQUU#@Nq`l$rR{G=NF8Vja_txn-J3Vd9C$x7Z+*Z_cg~@b&UQb#1F4v4%COea}
z?2MaG1J-QPj8CR*+nO?S)xo^UxjH*zSqU@hJU?R|95RL6)RcD9vnJ2I&$uZykV~4u
zu4yw=u+tMxeta^Q&?EWuOg?8%m{cmI22IvtP1iAL@9D@f;`%u9PgKuMr^n~Dw^Gx}
z%(a@+^iK5PHf>u4^K8K;q{o~wCo^jbX*=(lyraD@qU{a3VA*+7m~kqrYw!2yLp<73
z+qz$82+PTu=~*+C%UTI_baGlE&=Zc68Jo4LrBFxhT)sNi-V3z@jq4XV*GxFJl~SW@
zR<7-9)YX|Fk4ho+a!cK#A$H8@4*EsiPydxZd|RQLW7})j3+<hZb$Y!q!%f4notw3P
z(J%QQ`4>$26$UGQDdl|_+Y{2u*JFQ${wvD2^&H>w-}PH$qj-Fjelp%ie<prko2;>F
z%1h-1VWIq@f5AWRmx4^aKjJR8Wf~69zumCAU6&WxXLUVw{~iAl*QNE0y&DZr?pVL@
pmu111{LfkNGa^&|5>I*~n~o&)|9-o@ApRvnSd}NrOa3Pb^)Je!HN*e_

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
index e589242..e873883 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
@@ -5,6 +5,7 @@
 # kovach <2214005+kovachwt@users.noreply.github.com>, 2019.
 #
 #, fuzzymsgid ""
+msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
@@ -23,18 +24,18 @@ msgstr "ДреееММмммМммм"
 
 #: voice.py:21
 msgid ""
-"Hi, I'm Pwnagotchi!\n"
+"Hi, I'm Pwnagotchi!"
 "Starting ..."
 msgstr ""
-"Здраво, јас сум Pwnagotchi!\n"
+"Здраво, јас сум Pwnagotchi!"
 "Почнувам ..."
 
 #: voice.py:22
 msgid ""
-"New day, new hunt,\n"
+"New day, new hunt,"
 "new pwns!"
 msgstr ""
-"Нов ден, нов лов,\n"
+"Нов ден, нов лов,"
 "ќе си газиме!"
 
 #: voice.py:23
@@ -47,21 +48,21 @@ msgstr "AI спремно."
 
 #: voice.py:29
 msgid ""
-"The neural network\n"
+"The neural network"
 "is ready."
 msgstr ""
-"Невронската мрежа\n"
+"Невронската мрежа"
 "е спремна."
 
 #: voice.py:39
 #, python-brace-format
 msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
+"Hey, channel {channel} is"
+"free! Your AP will"
 "say thanks."
 msgstr ""
-"Еј, каналот {channel} е\n"
-"слободен! APто ќе ти\n"
+"Еј, каналот {channel} е"
+"слободен! APто ќе ти"
 "каже фала."
 
 #: voice.py:44
@@ -74,10 +75,10 @@ msgstr "Ајде да шетнеме!"
 
 #: voice.py:49
 msgid ""
-"This is the best\n"
+"This is the best"
 "day of my life!"
 msgstr ""
-"Ова ми е најдобриот \n"
+"Ова ми е најдобриот "
 "ден во животот!"
 
 #: voice.py:53
@@ -110,78 +111,78 @@ msgstr "Мммм колку мрежи!!!"
 
 #: voice.py:69
 msgid ""
-"I'm having so much\n"
+"I'm having so much"
 "fun!"
 msgstr "Јухуу забавноо ее!"
 
 #: voice.py:70
 msgid ""
-"My crime is that of\n"
+"My crime is that of"
 "curiosity ..."
 msgstr ""
-"Виновен сум само за\n"
+"Виновен сум само за"
 "љубопитност ..."
 
 #: voice.py:75
 #, python-brace-format
 msgid ""
-"Hello\n"
-"{name}!\n"
+"Hello"
+"{name}!"
 "Nice to meet you. {name}"
 msgstr ""
-"Здраво\n"
-"{name}!\n"
+"Здраво"
+"{name}!"
 "Мило ми е. {name}"
 
 #: voice.py:76
 #, python-brace-format
 msgid ""
-"Unit\n"
-"{name}\n"
+"Unit"
+"{name}"
 "is nearby! {name}"
 msgstr ""
-"Опаа\n"
-"{name}\n"
+"Опаа"
+"{name}"
 "е во близина! {name}"
 
 #: voice.py:81
 #, python-brace-format
 msgid ""
-"Uhm ...\n"
-"goodbye\n"
+"Uhm ..."
+"goodbye"
 "{name}"
 msgstr ""
-"Хмм ...\n"
-"чао\n"
+"Хмм ..."
+"чао"
 "{name}"
 
 #: voice.py:82
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "is gone ..."
 msgstr ""
-"{name}\n"
+"{name}"
 "го снема ..."
 
 #: voice.py:87
 #, python-brace-format
 msgid ""
-"Whoops ...\n"
-"{name}\n"
+"Whoops ..."
+"{name}"
 "is gone."
 msgstr ""
-"Уупс ...\n"
-"{name}\n"
+"Уупс ..."
+"{name}"
 "го снема."
 
 #: voice.py:88
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "missed!"
 msgstr ""
-"{name}\n"
+"{name}"
 "промаши!"
 
 #: voice.py:89
@@ -190,10 +191,10 @@ msgstr "Промаши!"
 
 #: voice.py:94
 msgid ""
-"Nobody wants to\n"
+"Nobody wants to"
 "play with me ..."
 msgstr ""
-"Никој не сака да\n"
+"Никој не сака да"
 "си игра со мене ..."
 
 #: voice.py:95
@@ -231,94 +232,94 @@ msgstr "Шарам наоколу ({secs}с)"
 #: voice.py:121
 #, python-brace-format
 msgid ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "let's be friends!"
 msgstr ""
-"Еј\n"
-"{what}\n"
+"Еј"
+"{what}"
 "ајде да се дружиме!"
 
 #: voice.py:122
 #, python-brace-format
 msgid ""
-"Associating to\n"
+"Associating to"
 "{what}"
 msgstr ""
-"Се закачувам на\n"
+"Се закачувам на"
 "{what}"
 
 #: voice.py:123
 #, python-brace-format
 msgid ""
-"Yo\n"
+"Yo"
 "{what}!"
 msgstr ""
-"Јо\n"
+"Јо"
 "{what}!"
 
 #: voice.py:128
 #, python-brace-format
 msgid ""
-"Just decided that\n"
-"{mac}\n"
+"Just decided that"
+"{mac}"
 "needs no WiFi!"
 msgstr ""
-"Знаеш што, на\n"
-"{mac}\n"
+"Знаеш што, на"
+"{mac}"
 "не му треба WiFi!"
 
 #: voice.py:129
 #, python-brace-format
 msgid ""
-"Deauthenticating\n"
+"Deauthenticating"
 "{mac}"
 msgstr ""
-"Го деавтентицирам\n"
+"Го деавтентицирам"
 "{mac}"
 
 #: voice.py:130
 #, python-brace-format
 msgid ""
-"Kickbanning\n"
+"Kickbanning"
 "{mac}!"
 msgstr ""
-"Кикбан\n"
+"Кикбан"
 "{mac}!"
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, we got {num}\n"
+"Cool, we got {num}"
 "new handshake{plural}!"
 msgstr ""
-"Кул, фативме {num}\n"
+"Кул, фативме {num}"
 "нови ракувања!"
 
 #: voice.py:139
 msgid ""
-"Ops, something\n"
-"went wrong ...\n"
+"Ops, something"
+"went wrong ..."
 "Rebooting ..."
 msgstr ""
-"Упс, нешто не е\n"
-"ко што треба ...\n"
+"Упс, нешто не е"
+"ко што треба ..."
 "Рестартирам ..."
 
 #: voice.py:143
 #, python-brace-format
 msgid "Kicked {num} stations\n"
-msgstr "Избацив {num} станици"
+msgstr "Избацив {num} станици\n"
 
 #: voice.py:144
 #, python-brace-format
 msgid "Made {num} new friends\n"
-msgstr "{num} нови другарчиња"
+msgstr "{num} нови другарчиња\n"
 
 #: voice.py:145
 #, python-brace-format
 msgid "Got {num} handshakes\n"
-msgstr "Фатив {num} ракувања"
+msgstr "Фатив {num} ракувања\n"
 
 #: voice.py:147
 msgid "Met 1 peer"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo
index 5c0ae61cdde5edeb86419385ed94aa40983fa559..3261c2e92496174303bad5f44f30b8d89b7a9a85 100644
GIT binary patch
delta 1754
zcmZXTUuYaf9LFbm$({Lg(b_akjm=z*NvhYY)K*d&0xH;~jcrg%saRz$H`(3G-E6(x
zWWAo@v`~C1R7QNz(g%IA1WNF!Qj}6(6d#0w6!bwvP$?+B2o^-Y-`!Os4w?J>W_ITH
z=lh$ijojLPzS!O@gm@q$!~{4A4uC3U1m2DHIdBxb2tEd02e*N@!4YtvQ;2)PeIW18
zf_>mi;2>BBw}59s#=8J!!Sznjjssl5#z)xr9Au!gT|(RgUIKaXD#(jBz^&kqARTwW
zOE)+K_JgA!9q+}D1gAirI|<$gE`v<?O>if;o^2<YevJ)Q@Kbv5kM!VBE(yFJq=O?M
z9ace}KLawMx4}Gk8AJ`@V~_=W3Q~!$z=It^d=K_wT}0NrzrPKm1mo#+<5iFj&x5S!
z18@So0zL|U2Nu9BJ!l&^2{OP7V4N7pz-Q9+TOj?cfvo&$`u!V_aoRt__!34IX^n$7
zK}t@qJTM5d*N=eg?O~AL708NT0a?i#AVd@Ig1f=@K`M3wWJ`Ym?*}*I64!e`)Y2Bm
zVX(Jla14yV9pFWffv$nPcoSqozk!>;ew4-a4iH=707&T%fs}Y2L`-oKgz~Y<4}(<U
z-+}(q88hOLn0I3Gabz$b#H14@!s<C#Efczfi*)P)sU8a$!bF>6)!3@LFgK22EZ8Ep
zOSqV<g8ybnRN!I9{RZNf&5HgWl$T0zY)=rsfg)@w#z7@G(A8LeDzO{$A={T39co3c
z3RlIGzF#ZKNK3~LWy>trSM6M8+=iJw*_Kgty;`uBGsEqoTyT{!x+Ytxu`0b_v7vQA
zp756&^6_~Yd9_-gnli-6rJy8cbTbK3)8Tj^%UUirJZ&mLLCknXIXhmL^N~>qyx@9;
zXG7HpJ>$qysU&9QqDHL1m#XF)E$z|HXY6~Oe~z^3YGKuAT?wS|<#F#RuOJS43rl4r
zhs*YQ*E{yb?BtNqkvtU{ggWAv{Yq0t%7lRoeY>6=$w%6RGHUoqH2ZD#iEUmW8(LMG
zCGngK8-Jmzk#i8*>D=H}$M-AcrcNXg$BY*yrhPd#)0LXna-*AY&tbwWBH8}%_guAO
zI92<gQj4+Lt}d6gNd<qsd%|Ao-usW>KXgk7zNCy&|J8e?;Z+Orkfz$F@vW-Mx&pDa
z*`W5E3gH<Y#c8OmP2@N53(<Y5zJ#L82HlUI3aC7;Fz4r~cui}2u4meQ(X-3m?%8Qa
zdvA@$!aLgd+KFX%wO$ORqg_=g2sm|Ae8L{+TgyR&x>q&Q{@ORyXFR=(WU6Yx4U2Xv
zKWtCr$LwqQY5PfjY+pq=az&Zsd`+(~&tq<#xrBI-r%^%hf6+(!=X#S}go?CdKg$gd
OBxb6*qw8J}7Q|mi6igui

delta 1739
zcmZwGPiP!f9Ki7x-DI~fW)p3-=8wsnCMJz;Qu;@!ApYsWCLzQ^t<_VR&A#28WOqh)
zCk{yrdr%QQ*x(#QgJ3;W)LI1*Mbv{RXi@Z_g@Paz^iuHPK|}=o{${782OrFQ-n@PD
z=J)%(x0i;`jBFNKH!7t@GfGY3U3e2NqKvO$A8z6}p28vg3J>D1XmGewsqJ_#%6mt#
z2R+=0QR+$D!SfrK#ZNj_EBU||41CPMk0>A7>{99m{17Feb0{xf#GCO?l!bd)MdJka
z;y#px4{>vF4rN{qCGe-w;3>QvKhL(>k^atrWbjWqu`k!2IE50x0^WiaWx=OV=5OHu
zzKeN0hvc9xpd|2fI{pV9?og^@n^M;?K1<Y+(8Db{d+02u16wE=zK4?0*LWLVz%k5p
zD|H7>;;ncBrPR-$1Qz4<_%_NqpQ5aD9u5AM{+=a@ex6(XbiSvvALT<CR+AU^q|TsZ
z=%VcHlPDE=5hdd{Q7Z8fQatqy?!_N)5WAQ(j=OLeXHf#LB006x3v{FuFXIHB#Zf$u
z63E{;g4;<$p7*1ab{-|L6UY>`hEn?HkZ-G#>G-Qi<&*t}BnVO32;WZ@lhR7t#U%$t
z{teO!ToM%9mSivg2FX^=!Zlpia!H%wlB}djStWA`P68s!r1X$fPLwT@?NU`P$x0f5
zDh_sXa(AOtK{Da&Bu&aIm6~opCg(=FQeOUvimgp50ZEhXWLMiQ?#YaG=y-3YpZi>9
zg8So{ecSZ9@7C>xqvN+SLoK}?Ro!qy*K9b^G(~I54bS?erlV%;YQZd4UEjAgvz~S~
zjMvoVhP94)G+1ev`;VB&tJQSVT{R(dmz&dS#w(cFiMlxw`EDf$7ptD5kA`j|^!$pM
zo}N~-rfgZW85lRduk$!@z0~<{R<GCH#SI;Abqz4`LDwtXAIu&c)V__(W06lt3qdg`
zt(wU7!=?!X9lw?x>C=(*LlZTE_UbzRHhYLydvgN^bcwKnvZ=3{npd`tI##Vq1iBIg
zrQ)hhOQDYWUYPcE{77ylcje)9ZfuA4nx+!?Hi^AmJpKMpxuuTbw0P>U>y`^9vZiW_
zMeCb&f2B?)MZKFqp4SJis`;1NIG1Za?}kj~wI`CATVF>(qhx(2zNq`})Qm1UX3k2H
z*W8*}vbtzX)Y$qIIglzZvtz!#y3p}L_d|U2_3kO|-*r!N|Ev2_AuVpj`hl&O<K6?F
zu3B3TO~qE-lA~Cu;$GeX-E&4u(sggiH#+{T=k9{`J-b4rOYUMdyz-Rpif8MtUy_4h
z>NeEzXnvf}&gSpo{%q2JCqFo>!yq(k9Iod7mi?FfeExFT`F3P0@!8zaPKkrQO6y*+
Jb*~vZ>Oa1@E#LqE

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
index 1f6e832..e027a8b 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
@@ -23,20 +23,20 @@ msgstr "ZzzzZZzzzzZzzz"
 
 #: voice.py:21
 msgid ""
-"Hi, I'm Pwnagotchi!\n"
+"Hi, I'm Pwnagotchi!"
 "Starting ..."
 msgstr ""
-"Hoi, Ik ben\n"
-"Pwnagotchi!\n"
+"Hoi, Ik ben"
+"Pwnagotchi!"
 "Opstarten ..."
 
 #: voice.py:22
 msgid ""
-"New day, new hunt,\n"
+"New day, new hunt,"
 "new pwns!"
 msgstr ""
-"Nieuwe dag,\n" 
-"nieuwe jacht,\n"
+"Nieuwe dag," 
+"nieuwe jacht,"
 "nieuwe pwns!"
 
 #: voice.py:23
@@ -49,21 +49,21 @@ msgstr "AI is klaar."
 
 #: voice.py:29
 msgid ""
-"The neural network\n"
+"The neural network"
 "is ready."
 msgstr ""
-"Neuronen netwerk\n"
+"Neuronen netwerk"
 "is klaar voor gebruik."
 
 #: voice.py:39
 #, python-brace-format
 msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
+"Hey, channel {channel} is"
+"free! Your AP will"
 "say thanks."
 msgstr ""
-"Hey, kanaal {channel} is\n"
-"vrij! Je AP zal je\n"
+"Hey, kanaal {channel} is"
+"vrij! Je AP zal je"
 "bedanken."
 
 #: voice.py:44
@@ -76,10 +76,10 @@ msgstr "Laten we een rondje lopen!"
 
 #: voice.py:49
 msgid ""
-"This is the best\n"
+"This is the best"
 "day of my life!"
 msgstr ""
-"Dit is de beste\n"
+"Dit is de beste"
 "dag van mijn leven!"
 
 #: voice.py:53
@@ -88,12 +88,12 @@ msgstr "Ruk dag :/"
 
 #: voice.py:58
 msgid "I'm extremely bored ..."
-msgstr "Ik verveel me \n"
+msgstr "Ik verveel me "
 "kapot ..."
 
 #: voice.py:59
 msgid "I'm very sad ..."
-msgstr "Ik ben erg\n" 
+msgstr "Ik ben erg" 
 "verdrietig ..."
 
 #: voice.py:60
@@ -102,7 +102,7 @@ msgstr "Ik ben verdrietig"
 
 #: voice.py:66
 msgid "I'm living the life!"
-msgstr "Beter kan het leven\n"
+msgstr "Beter kan het leven"
 "niet worden!"
 
 #: voice.py:67
@@ -115,79 +115,79 @@ msgstr "Zo veel netwerken!!!"
 
 #: voice.py:69
 msgid ""
-"I'm having so much\n"
+"I'm having so much"
 "fun!"
 msgstr "Dit is zo leuk!"
 
 #: voice.py:70
 msgid ""
-"My crime is that of\n"
+"My crime is that of"
 "curiosity ..."
 msgstr ""
-"Mijn enige misdrijf\n"
-"is mijn \n"
+"Mijn enige misdrijf"
+"is mijn "
 "nieuwsgierigheid ..."
 
 #: voice.py:75
 #, python-brace-format
 msgid ""
-"Hello\n"
-"{name}!\n"
+"Hello"
+"{name}!"
 "Nice to meet you. {name}"
 msgstr ""
-"Hallo\n"
-"{name}!\n"
+"Hallo"
+"{name}!"
 "Leuk je te ontmoeten. {name}"
 
 #: voice.py:76
 #, python-brace-format
 msgid ""
-"Unit\n"
-"{name}\n"
+"Unit"
+"{name}"
 "is nearby! {name}"
 msgstr ""
-"Unit\n"
-"{name}\n"
+"Unit"
+"{name}"
 "is dichtbij! {name}"
 
 #: voice.py:81
 #, python-brace-format
 msgid ""
-"Uhm ...\n"
-"goodbye\n"
+"Uhm ..."
+"goodbye"
 "{name}"
 msgstr ""
-"Uhm ...\n"
-"tot ziens\n"
+"Uhm ..."
+"tot ziens"
 "{name}"
 
 #: voice.py:82
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "is gone ..."
 msgstr ""
-"{name}\n"
+"{name}"
 "is weg"
 
 #: voice.py:87
 #, python-brace-format
 msgid ""
-"Whoops ...\n"
-"{name}\n"
+"Whoops ..."
+"{name}"
 "is gone."
 msgstr ""
-"Whoopsie ...\n"
-"{name}\n"
+"Whoopsie ..."
+"{name}"
 "is weg"
 
 #: voice.py:88
 #, python-brace-format
 msgid ""
-"{name}\n"
+"{name}"
 "missed!"
 msgstr ""
-"{name}\n"
+"{name}"
 "gemist!"
 
 #: voice.py:89
@@ -196,10 +196,10 @@ msgstr "Gemist!"
 
 #: voice.py:94
 msgid ""
-"Nobody wants to\n"
+"Nobody wants to"
 "play with me ..."
 msgstr ""
-"Niemand wil met\n"
+"Niemand wil met"
 "mij spelen ..."
 
 #: voice.py:95
@@ -237,28 +237,28 @@ msgstr "Rond kijken ({secs}s)"
 #: voice.py:121
 #, python-brace-format
 msgid ""
-"Hey\n"
-"{what}\n"
+"Hey"
+"{what}"
 "let's be friends!"
 msgstr ""
-"Hey\n"
-"{what}\n"
-"Laten we vrienden\n"
+"Hey"
+"{what}"
+"Laten we vrienden"
 "worden!"
 
 #: voice.py:122
 #, python-brace-format
 msgid ""
-"Associating to\n"
+"Associating to"
 "{what}"
 msgstr ""
-"Verbinden met\n"
+"Verbinden met"
 "{what}"
 
 #: voice.py:123
 #, python-brace-format
 msgid ""
-"Yo\n"
+"Yo"
 "{what}!"
 msgstr ""
 
@@ -266,50 +266,50 @@ msgstr ""
 #: voice.py:128
 #, python-brace-format
 msgid ""
-"Just decided that\n"
-"{mac}\n"
+"Just decided that"
+"{mac}"
 "needs no WiFi!"
-msgstr "Ik vind dat\n"
-"{mac}\n"
-"genoeg WiFi\n"
+msgstr "Ik vind dat"
+"{mac}"
+"genoeg WiFi"
 "heeft gehad!"
 
 #: voice.py:129
 #, python-brace-format
 msgid ""
-"Deauthenticating\n"
+"Deauthenticating"
 "{mac}"
 msgstr ""
-"De-autoriseren\n"
+"De-autoriseren"
 "{mac}"
 
 #: voice.py:130
 #, python-brace-format
 msgid ""
-"Kickbanning\n"
+"Kickbanning"
 "{mac}!"
 msgstr ""
-"Ik ga\n"
-"{mac}\n"
+"Ik ga"
+"{mac}"
 "even kicken!"
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, we got {num}\n"
+"Cool, we got {num}"
 "new handshake{plural}!"
 msgstr ""
-"Gaaf, we hebben {num}\n"
+"Gaaf, we hebben {num}"
 "nieuwe handshake{plural}!"
 
 #: voice.py:139
 msgid ""
-"Ops, something\n"
-"went wrong ...\n"
+"Ops, something"
+"went wrong ..."
 "Rebooting ..."
 msgstr ""
 "Oops, iets"
-"ging fout ...\n"
+"ging fout ..."
 "Rebooting ..."
 
 #: voice.py:143

From 8d5bdfc7cca276db26f2733a978fda00e5bb994b Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 12:05:04 +0200
Subject: [PATCH 49/62] Add create option

---
 builder/pwnagotchi.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index 03f9509..279dcf5 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -204,6 +204,7 @@
   - name: configure lo interface
     blockinfile:
       path: /etc/network/interfaces.d/lo-cfg
+      create: yes
       block: |
         auto lo
         iface lo inet loopback
@@ -211,6 +212,7 @@
   - name: configure wlan interface
     blockinfile:
       path: /etc/network/interfaces.d/wlan0-cfg
+      create: yes
       block: |
         allow-hotplug wlan0
         iface wlan0 inet static

From 06df5e70cfd8fb4d3a122fd9b74754e1eb4a9224 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 12:07:16 +0200
Subject: [PATCH 50/62] fixes

---
 .../scripts/pwnagotchi/plugins/__init__.py    |  2 --
 .../pwnagotchi/scripts/pwnagotchi/ui/view.py  |  4 +--
 .../pwnagotchi/scripts/pwnagotchi/voice.py    | 26 +++++++++----------
 3 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
index 6f84a90..bcb89f8 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py
@@ -2,8 +2,6 @@ import os
 import glob
 import importlib, importlib.util
 
-# import core
-
 default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default")
 loaded = {}
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
index ee3eb53..82c52ad 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
@@ -233,12 +233,12 @@ class View(object):
                 if sleeping:
                     if secs > 1:
                         self.set('face', faces.SLEEP)
-                        self.set('status', self._voice.on_napping(secs))
+                        self.set('status', self._voice.on_napping(int(secs)))
                     else:
                         self.set('face', faces.SLEEP2)
                         self.set('status', self._voice.on_awakening())
                 else:
-                    self.set('status', self._voice.on_waiting(secs))
+                    self.set('status', self._voice.on_waiting(int(secs)))
                     if step % 2 == 0:
                         self.set('face', faces.LOOK_R)
                     else:
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
index 02bff8b..536bc17 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py
@@ -18,7 +18,7 @@ class Voice:
         return self._('ZzzzZZzzzzZzzz')
 
     def on_starting(self):
-        return random.choice([ 
+        return random.choice([
             self._('Hi, I\'m Pwnagotchi! Starting ...'),
             self._('New day, new hunt, new pwns!'),
             self._('Hack the Planet!')])
@@ -29,7 +29,7 @@ class Voice:
             self._('The neural network is ready.')])
 
     def on_normal(self):
-        return random.choice([ 
+        return random.choice([
             '',
             '...'])
 
@@ -37,7 +37,7 @@ class Voice:
         return self._('Hey, channel {channel} is free! Your AP will say thanks.').format(channel=channel)
 
     def on_bored(self):
-        return random.choice([ 
+        return random.choice([
             self._('I\'m bored ...'),
             self._('Let\'s go for a walk!')])
 
@@ -48,14 +48,14 @@ class Voice:
         return self._('Shitty day :/')
 
     def on_sad(self):
-        return random.choice([ 
+        return random.choice([
             self._('I\'m extremely bored ...'),
             self._('I\'m very sad ...'),
             self._('I\'m sad'),
             '...'])
 
     def on_excited(self):
-        return random.choice([ 
+        return random.choice([
             self._('I\'m living the life!'),
             self._('I pwn therefore I am.'),
             self._('So many networks!!!'),
@@ -63,29 +63,29 @@ class Voice:
             self._('My crime is that of curiosity ...')])
 
     def on_new_peer(self, peer):
-        return random.choice([ 
+        return random.choice([
             self._('Hello {name}! Nice to meet you. {name}').format(name=peer.name()),
             self._('Unit {name} is nearby! {name}').format(name=peer.name())])
 
     def on_lost_peer(self, peer):
-        return random.choice([ 
+        return random.choice([
             self._('Uhm ... goodbye {name}').format(name=peer.name()),
             self._('{name} is gone ...').format(name=peer.name())])
 
     def on_miss(self, who):
-        return random.choice([ 
+        return random.choice([
             self._('Whoops ... {name} is gone.').format(name=who),
             self._('{name} missed!').format(name=who),
             self._('Missed!')])
 
     def on_lonely(self):
-        return random.choice([ 
+        return random.choice([
             self._('Nobody wants to play with me ...'),
             self._('I feel so alone ...'),
             self._('Where\'s everybody?!')])
 
     def on_napping(self, secs):
-        return random.choice([ 
+        return random.choice([
             self._('Napping for {secs}s ...').format(secs=secs),
             self._('Zzzzz'),
             self._('ZzzZzzz ({secs}s)').format(secs=secs)])
@@ -94,7 +94,7 @@ class Voice:
         return random.choice(['...', '!'])
 
     def on_waiting(self, secs):
-        return random.choice([ 
+        return random.choice([
             self._('Waiting for {secs}s ...').format(secs=secs),
             '...',
             self._('Looking around ({secs}s)').format(secs=secs)])
@@ -102,13 +102,13 @@ class Voice:
     def on_assoc(self, ap):
         ssid, bssid = ap['hostname'], ap['mac']
         what = ssid if ssid != '' and ssid != '<hidden>' else bssid
-        return random.choice([ 
+        return random.choice([
             self._('Hey {what} let\'s be friends!').format(what=what),
             self._('Associating to {what}').format(what=what),
             self._('Yo {what}!').format(what=what)])
 
     def on_deauth(self, sta):
-        return random.choice([ 
+        return random.choice([
             self._('Just decided that {mac} needs no WiFi!').format(mac=sta['mac']),
             self._('Deauthenticating {mac}').format(mac=sta['mac']),
             self._('Kickbanning {mac}!').format(mac=sta['mac'])])

From 25230da50b83891890d6adb69209133ea059a70c Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 12:34:38 +0200
Subject: [PATCH 51/62] Fix de and update other langs

---
 .../pwnagotchi/locale/de/LC_MESSAGES/voice.mo | Bin 3845 -> 3902 bytes
 .../pwnagotchi/locale/de/LC_MESSAGES/voice.po | 328 ++++++-----------
 .../pwnagotchi/locale/el/LC_MESSAGES/voice.po | 335 +++++++-----------
 .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 293 +++++++--------
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 3761 -> 2021 bytes
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 225 +++++-------
 .../pwnagotchi/locale/mk/LC_MESSAGES/voice.mo | Bin 4559 -> 2457 bytes
 .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po | 333 +++++++----------
 .../scripts/pwnagotchi/locale/voice.pot       | 250 ++++++-------
 9 files changed, 661 insertions(+), 1103 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo
index 52124cebbf25065fd7de320a2070709b2df9ab0f..9a26d44bfa3a51370d4f0dc64d46f2b5f5d99314 100644
GIT binary patch
delta 1641
zcmY+D&u<$=6vxNphf_CBe*_wur0H`S8bTablpb2O1W2Pcs1@|ks6im1jXjN*IJ;<f
zjpc^O2myx*iP8lLA;AeGKq8j{2PAT!aN<^pAAbP!P=qK*T<8HlZ@r0NwDUeQvv1zK
z_nqBWM>a;T6kGQgV}9*0W&&n9joAYyp{~!sop1pjgf1M0SKv|jDHM1U_QPyfd*2Yu
zGk*{cz(-PEfOj+ZVHUp9Wm?Grue0za3-3WaXrbGf-LM5Up{r0gehlx08&CuP2y^gv
zxC8zTHE<47fV-jk9f6woSt!tjlkjr3)z0(_7PNwIQpcZC$G@N^u&2kEeQ*kDz%x+&
z%Wx1jpeB43_Q4O~@r*H_K~3=XwzmHrIK_MiiyG(Q7K6PE=AlaM!*Tc$9EBgj6Yx8D
z5cX_uS8@nyfU{7qssc66rIc?$O>iBmGG9aWzX5N+TTstwebs9WkNE|o0se$qaW5CB
zQXhc2@dVrj&qF=%BBU7eBGf>yLA|1NDDZm9pW#EyyO4#UIR@45G~`O2GtV#>W1$K4
z;P;`x&(rx2P^JA1YJysh&Ih3?HU&{SX$P?P(KYeSrh7DT6YuKiZxJMEs>x>Kj*<*i
z2Gy9qAt`Y`)HXtYfUeo;Wf$pMIv;D&^q#aKY0@TAPD0I8+x_%{F^3IbX!1p<7DIH^
zPTO5{{Y3ed61|hs7)$(p$C$`!qv}L!=A`e}iqf#M<VUjV)mPTUvkj@ny}99R*@;|l
zN#bLjho^bztk|`JJmHqDM82$88%fizm(n+8&NkDiQnS%`D2rAu2CnrgVIjWUIe3Jb
zwFP;~uLttjIcd1HnuJbMqN?L9hb1%T7Ul8r6*<@N9MUOQ-GaooJN=Br&vyMYDyu6_
zS<|zXP&{8QxToBLIpda>7ah+_5?$+l7w3WOQS6i1z1V7Y|4z#DB54FZwUkOFiQmr7
z42v5|V4X^{WX@L^^F&ok&S50+AK8In6!9yIO}km%yyvPyDuTq)GdH<8Vds+X*^)_L
zrgJ@NbLrX}Jx^!I=GL}hY<F$~dnh+OOEFO-vu?R6%hvO(cd1^p0Yr=~HH%Vn!cgj7
zD5nBj_bOIG>v{!sDay(C&CdQuBh?nUW_i)pHjs)9rQ$-=O(G(%p0tRIy8Tb)JGqxL
za&2w9WX9OQac!}e)lr3(#lWeTt8Kll#2dZq)KJS$V?W6cVZY56us8Gb*yDZsunT>o
ug;XSS+6LD@*wW8MWCB-gAn`kWGbPmLg6z_kVCnq78opqI=SeIon12BQ+bB~2

delta 1536
zcmY+@Piz}S6bA4Kactu>Zc8C;li<v@N!<`*q)0`SLJ_5E!@s5+qAIEcY`kN8YJ0ZY
zU9&P#WQqzB$^|h(pmIS1i5@Bhst|$$0;(S9fdi-q4p2oL!-YdRAP{_?*Fj<A)o*rp
z=FOWo>#qv072Yg$?-oLA3<_}&ij)xdfSJCJ!5z3?gj28zAB1ag41NnI;m>dv{2Oxq
z&LJU2U=i+yhu|oD7IHlgW?*MXbbAY2z=JRG;4L`CfoTMR0p!GskQ3j7d*COKfxm+}
zxDL0&-yj431tm=3hU2E;ID8Z`;Uzc&JDF~h=?8eg9emm!c)dSx9dhA;Y!YA;GT<EK
z_@^KfdLA<27;@)tz#{`fyaSowk9P`j7yJd5;O~$dD|GR8FFJ=HOT7T6;fwHL_&Q|9
z-#}Jo9ZtaXaFWP=$dVs{jPo31LJi0SFG5!4UC6{Q!yn++kn42qHX+a#UqA-94w>04
z$UuKUPTY=dafe071rI}PLM*@oa0#+fuRtdJcHht79PV#I{6sdNj2neGl5=7fo&9)m
z5;AZD7T^WQMBaxi-RF=A-GEHwSIC{+hNyI}G0qGwj$>njY`w(o&cR(cZXxiI^=7i~
z;6i}j*Mgn?*X~D;+t_UT&|!J_*|QuxD`v+U9>m3r*-E%r4mOsRnd4s}@Ex$t34ECX
zf45#O_(^WIJJ8|5-iM22;9=ve#jL$KI8|7Q>u$6vp78x<NybXn{79~tc5BtBSk~=q
zZX#WABW-H-k<{Geig8<N)j6drN=CkHDHX|%-!5YcU)U?Dv1h7*QjT2m+kt%iw2XDL
z8M+-A)m_sF%VJ)2k|moeDu!}d$!egL@j^$;>ymu3*pjDX<06epT|4&AlyA=s{WG-E
zax1I$e0t2Tr7zh7nTPBPnZ34?nasz^L^2M1Q<LR#*<Q{Zvm2SQ2Ry9lS7oaso4TqT
zu~={Mea-j1<&H|y6^lkk{mc(%=Zi^KhbV$kW%0jTPVPUsdL?^yz-Dt3b~-m>7jj4U
zoKjIFkLyakp^Q=H<#tmAuxxMS#?PW2+L6bVHc34KPleLcf%H%j4BAo>Hw<Olgz`k7
z+Qw5d#H6Gyh%J}3VUVrmnHqle>PN$J!0|Y>SEL5VoY5z=Tn^lJrS6EQb)})~#<q{`
zrIDldr;%}cd&IH3^NY5Xzt^ti_Z9l(IH`hbAM*HlmO6|iB6%vX-{+6b@-|kr%^LJ?
Pw^ZdN6`V&Bkt6;EK<pIv

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
index ae6593e..676a8bb 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po
@@ -1,14 +1,13 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# German language
+# Copyright (C) 2019
+# This file is distributed under the same license as the pwnagotchi package.
+# dadav <33197631+dadav@users.noreply.github.com>, 2019.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:34+0200\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
 "PO-Revision-Date: 2019-09-29 14:00+0200\n"
 "Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
 "Language-Team: DE <33197631+dadav@users.noreply.github.com>\n"
@@ -17,28 +16,19 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
-#: voice.py:21
-msgid ""
-"Hi, I'm Pwnagotchi!"
-"Starting ..."
-msgstr ""
-"Hi, ich bin"
-"ein Pwnagotchi!"
-"Starte ..."
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,"
-"new pwns!"
-msgstr ""
-"Neuer Tag, neue Jagd,"
-"neue Pwns!"
+msgid "Hi, I'm Pwnagotchi! Starting ..."
+msgstr "Hi, ich bin ein Pwnagotchi! Starte ..."
 
 #: voice.py:23
+msgid "New day, new hunt, new pwns!"
+msgstr "Neuer Tag, neue Jagd, neue Pwns!"
+
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr "Hack den Planet!"
 
@@ -47,298 +37,202 @@ msgid "AI ready."
 msgstr "KI bereit."
 
 #: voice.py:29
-msgid ""
-"The neural network"
-"is ready."
-msgstr ""
-"Das neurale Netz"
-"ist bereit."
+msgid "The neural network is ready."
+msgstr "Das neurale Netz ist bereit."
 
-#: voice.py:39
+#: voice.py:37
 #, python-brace-format
-msgid ""
-"Hey, channel {channel} is"
-"free! Your AP will"
-"say thanks."
-msgstr ""
-"Hey, Channel {channel} ist"
-"frei! Dein AP wird"
-"es dir danken."
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
+msgstr "Hey, Channel {channel} ist frei! Dein AP wir des dir danken."
 
-#: voice.py:44
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr "Mir ist langweilig..."
 
-#: voice.py:45
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr "Lass uns laufen gehen!"
 
-#: voice.py:49
-msgid ""
-"This is the best"
-"day of my life!"
-msgstr ""
-"Das ist der beste"
-"Tag meines Lebens."
+#: voice.py:45
+msgid "This is the best day of my life!"
+msgstr "Das ist der beste Tag meines Lebens."
 
-#: voice.py:53
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr "Scheis Tag :/"
 
-#: voice.py:58
+#: voice.py:52
 msgid "I'm extremely bored ..."
 msgstr "Mir ist sau langweilig..."
 
-#: voice.py:59
+#: voice.py:53
 msgid "I'm very sad ..."
 msgstr "Ich bin sehr traurig..."
 
-#: voice.py:60
+#: voice.py:54
 msgid "I'm sad"
 msgstr "Ich bin traurig"
 
-#: voice.py:66
+#: voice.py:59
 msgid "I'm living the life!"
 msgstr "Ich lebe das Leben!"
 
-#: voice.py:67
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr "Ich pwne, also bin ich."
 
-#: voice.py:68
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr "So viele Netwerke!!!"
 
-#: voice.py:69
-msgid ""
-"I'm having so much"
-"fun!"
-msgstr ""
-"Ich habe sooo viel"
-"Spaß!"
+#: voice.py:62
+msgid "I'm having so much fun!"
+msgstr "Ich habe sooo viel Spaß!"
 
-#: voice.py:70
-msgid ""
-"My crime is that of"
-"curiosity ..."
-msgstr ""
-"Mein Verbrechen ist"
-"das der Neugier ..."
+#: voice.py:63
+msgid "My crime is that of curiosity ..."
+msgstr "Mein Verbrechen ist das der Neugier ..."
 
-#: voice.py:75
+#: voice.py:67
 #, python-brace-format
-msgid ""
-"Hello"
-"{name}!"
-"Nice to meet you. {name}"
-msgstr ""
-"Hallo {name},"
-"Nett Dich"
-"kennenzulernen."
+msgid "Hello {name}! Nice to meet you. {name}"
+msgstr "Hallo {name}, nett Dich kennenzulernen."
 
-#: voice.py:76
+#: voice.py:68
 #, python-brace-format
-msgid ""
-"Unit"
-"{name}"
-"is nearby! {name}"
-msgstr ""
-"Gerät {name}"
-"ist in der"
-"nähe!!"
+msgid "Unit {name} is nearby! {name}"
+msgstr "Gerät {name} ist in der nähe!!"
 
-#: voice.py:81
+#: voice.py:72
 #, python-brace-format
-msgid ""
-"Uhm ..."
-"goodbye"
-"{name}"
-msgstr ""
-"Uhm ..."
-"tschüß"
-"{name}"
+msgid "Uhm ... goodbye {name}"
+msgstr "Uhm ...tschüß {name}"
 
-#: voice.py:82
+#: voice.py:73
 #, python-brace-format
-msgid ""
-"{name}"
-"is gone ..."
-msgstr ""
-"{name}"
-"ist weg ..."
+msgid "{name} is gone ..."
+msgstr "{name} ist weg ..."
 
-#: voice.py:87
+#: voice.py:77
 #, python-brace-format
-msgid ""
-"Whoops ..."
-"{name}"
-"is gone."
-msgstr ""
-"Whoops ..."
-"{name}"
-"ist weg."
+msgid "Whoops ... {name} is gone."
+msgstr "Whoops ...{name} ist weg."
 
-#: voice.py:88
+#: voice.py:78
 #, python-brace-format
-msgid ""
-"{name}"
-"missed!"
-msgstr ""
-"{name}"
-"verpasst!"
+msgid "{name} missed!"
+msgstr "{name} verpasst!"
 
-#: voice.py:89
+#: voice.py:79
 msgid "Missed!"
 msgstr "Verpasst!"
 
-#: voice.py:94
-msgid ""
-"Nobody wants to"
-"play with me ..."
-msgstr ""
-"Niemand will mit"
-"mir spielen ..."
+#: voice.py:83
+msgid "Nobody wants to play with me ..."
+msgstr "Niemand will mit mir spielen ..."
 
-#: voice.py:95
+#: voice.py:84
 msgid "I feel so alone ..."
-msgstr ""
-"Ich fühl mich"
-"so alleine ..."
+msgstr "Ich fühl michso alleine ..."
 
-#: voice.py:96
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr "Wo sind denn alle?"
 
-#: voice.py:101
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr "Schlafe für {secs}s"
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr ""
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
-#: voice.py:112
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr "Warte für {secs}s ..."
 
-#: voice.py:114
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr "Schaue mich um ({secs}s)"
 
+#: voice.py:106
+#, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr "Hey {what}, lass uns Freunde sein!"
+
+#: voice.py:107
+#, python-brace-format
+msgid "Associating to {what}"
+msgstr "Verbinde mit {what}"
+
+#: voice.py:108
+#, python-brace-format
+msgid "Yo {what}!"
+msgstr ""
+
+#: voice.py:112
+#, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr "Ich denke, dass {mac} kein WiFi brauch!"
+
+#: voice.py:113
+#, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr "Deauthentifiziere {mac}"
+
+#: voice.py:114
+#, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr "Kicke {mac}!"
+
+#: voice.py:118
+#, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr "Cool, wir haben {num} neue Handshake{plural}!"
+
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey"
-"{what}"
-"let's be friends!"
-msgstr ""
-"Hey"
-"{what}"
-"lass uns Freunde sein!"
+msgid "Ops, something went wrong ... Rebooting ..."
+msgstr "Ops, da ist etwas schief gelaufen ...Starte neu ..."
 
-#: voice.py:122
-#, python-brace-format
-msgid ""
-"Associating to"
-"{what}"
-msgstr ""
-"Verbinde mit"
-"{what}"
-
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Yo"
-"{what}!"
-msgstr ""
-
-#: voice.py:128
-#, python-brace-format
-msgid ""
-"Just decided that"
-"{mac}"
-"needs no WiFi!"
-msgstr ""
-"Ich denke,"
-"dass {mac}"
-"kein WiFi brauch!"
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Deauthenticating"
-"{mac}"
-msgstr ""
-"Deauthentifiziere"
-"{mac}"
-
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Kickbanning"
-"{mac}!"
-msgstr ""
-"Kicke"
-"{mac}!"
-
-#: voice.py:135
-#, python-brace-format
-msgid ""
-"Cool, we got {num}"
-"new handshake{plural}!"
-msgstr ""
-"Cool, wir haben {num}"
-"neue Handshake{plural}!"
-
-#: voice.py:139
-msgid ""
-"Ops, something"
-"went wrong ..."
-"Rebooting ..."
-msgstr ""
-"Ops, da ist etwas"
-"schief gelaufen ..."
-"Starte neu ..."
-
-#: voice.py:143
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr "{num} Stationen gekicked\n"
 
-#: voice.py:144
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr "{num} Freunde gefunden\n"
 
-#: voice.py:145
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr "{num} Handshakes aufgez.\n"
 
-#: voice.py:147
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr "1 Peer getroffen."
 
-#: voice.py:149
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr "{num} Peers getroffen"
 
-#: voice.py:154
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
 "{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
 "#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
-"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem habe ich "
-"{associated} neue Freunde getroffen und {handshakes} Handshakes gefressen! #pwnagotchi "
-"#pwnlog #pwnlife #hacktheplanet #skynet"
+"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem "
+"habe ich {associated} neue Freunde getroffen und {handshakes} Handshakes "
+"gefressen! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
index 615ad2b..46f90c2 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:42+0200\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
 "PO-Revision-Date: 2019-10-03 08:00+0000\n"
 "Last-Translator: Periklis Fregkos <fregkos@gmail.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
@@ -17,27 +17,21 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
-#: voice.py:21
-msgid ""
-"Hi, I'm Pwnagotchi!"
-"Starting ..."
-msgstr ""
-"Γειά, είμαι το Pwnagotchi!"
-"Εκκινούμαι ..."
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,"
-"new pwns!"
-msgstr ""
-"Νέα μέρα, νέο κυνήγι,"
-"νέα pwns!"
+#, fuzzy
+msgid "Hi, I'm Pwnagotchi! Starting ..."
+msgstr "Γειά, είμαι το Pwnagotchi!Εκκινούμαι ..."
 
 #: voice.py:23
+#, fuzzy
+msgid "New day, new hunt, new pwns!"
+msgstr "Νέα μέρα, νέο κυνήγι,νέα pwns!"
+
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr "Hackαρε τον πλανήτη!"
 
@@ -46,295 +40,208 @@ msgid "AI ready."
 msgstr "ΤΝ έτοιμη."
 
 #: voice.py:29
-msgid ""
-"The neural network"
-"is ready."
-msgstr ""
-"Το νευρωνικό δίκτυο"
-"είναι έτοιμο."
+#, fuzzy
+msgid "The neural network is ready."
+msgstr "Το νευρωνικό δίκτυοείναι έτοιμο."
 
-#: voice.py:39
-#, python-brace-format
-msgid ""
-"Hey, channel {channel} is"
-"free! Your AP will"
-"say thanks."
-msgstr ""
-"Ε, το κανάλι {channel} είναι"
-"ελεύθερο! Το AP σου θα"
-"είναι ευγνώμων."
+#: voice.py:37
+#, fuzzy, python-brace-format
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
+msgstr "Ε, το κανάλι {channel} είναιελεύθερο! Το AP σου θαείναι ευγνώμων."
 
-#: voice.py:44
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr "Βαριέμαι ..."
 
-#: voice.py:45
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr "Ας πάμε μια βόλτα!"
 
-#: voice.py:49
-msgid ""
-"This is the best"
-"day of my life!"
-msgstr ""
-"Είναι η καλύτερη"
-"μέρα της ζωής μου!"
+#: voice.py:45
+#, fuzzy
+msgid "This is the best day of my life!"
+msgstr "Είναι η καλύτερημέρα της ζωής μου!"
 
-#: voice.py:53
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr "Σκατένια μέρα :/"
 
-#: voice.py:58
+#: voice.py:52
 msgid "I'm extremely bored ..."
 msgstr "Βαριέμαι πάρα πολύ ..."
 
-#: voice.py:59
+#: voice.py:53
 msgid "I'm very sad ..."
 msgstr "Είμαι πολύ λυπημένο ..."
 
-#: voice.py:60
+#: voice.py:54
 msgid "I'm sad"
 msgstr "Είμαι λυπημένο"
 
-#: voice.py:66
+#: voice.py:59
 msgid "I'm living the life!"
 msgstr "Ζω την ζωή μου!"
 
-#: voice.py:67
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr "Pwnάρω, άρα υπάρχω."
 
-#: voice.py:68
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr "Τόσα πολλά δίκτυα!!!"
 
-#: voice.py:69
-msgid ""
-"I'm having so much"
-"fun!"
+#: voice.py:62
+#, fuzzy
+msgid "I'm having so much fun!"
 msgstr "Περνάω τέλεια!"
 
-#: voice.py:70
-msgid ""
-"My crime is that of"
-"curiosity ..."
-msgstr ""
-"Η περιέργεια είναι"
-"το μόνο έγκλημά μου ..."
+#: voice.py:63
+#, fuzzy
+msgid "My crime is that of curiosity ..."
+msgstr "Η περιέργεια είναιτο μόνο έγκλημά μου ..."
 
-#: voice.py:75
-#, python-brace-format
-msgid ""
-"Hello"
-"{name}!"
-"Nice to meet you. {name}"
-msgstr ""
-"Γειά {name}!"
-"Χάρηκα για τη γνωριμία. {name}"
+#: voice.py:67
+#, fuzzy, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
+msgstr "Γειά {name}!Χάρηκα για τη γνωριμία. {name}"
 
-#: voice.py:76
-#, python-brace-format
-msgid ""
-"Unit"
-"{name}"
-"is nearby! {name}"
-msgstr ""
-"Η μονάδα"
-"{name}"
-"είναι κοντά! {name}"
+#: voice.py:68
+#, fuzzy, python-brace-format
+msgid "Unit {name} is nearby! {name}"
+msgstr "Η μονάδα{name}είναι κοντά! {name}"
 
-#: voice.py:81
-#, python-brace-format
-msgid ""
-"Uhm ..."
-"goodbye"
-"{name}"
-msgstr ""
-"Εμμ ..."
-"αντίο"
-"{name}"
+#: voice.py:72
+#, fuzzy, python-brace-format
+msgid "Uhm ... goodbye {name}"
+msgstr "Εμμ ...αντίο{name}"
 
-#: voice.py:82
-#, python-brace-format
-msgid ""
-"{name}"
-"is gone ..."
-msgstr ""
-"Το {name}"
-"έφυγε ..."
+#: voice.py:73
+#, fuzzy, python-brace-format
+msgid "{name} is gone ..."
+msgstr "Το {name}έφυγε ..."
 
-#: voice.py:87
-#, python-brace-format
-msgid ""
-"Whoops ..."
-"{name}"
-"is gone."
-msgstr ""
-"Ουπς ... "
-"Εξαφανίστηκε το"
-"{name}."
+#: voice.py:77
+#, fuzzy, python-brace-format
+msgid "Whoops ... {name} is gone."
+msgstr "Ουπς ... Εξαφανίστηκε το{name}."
 
-#: voice.py:88
-#, python-brace-format
-msgid ""
-"{name}"
-"missed!"
-msgstr ""
-"Έχασα το"
-"{name}!"
+#: voice.py:78
+#, fuzzy, python-brace-format
+msgid "{name} missed!"
+msgstr "Έχασα το{name}!"
 
-#: voice.py:89
+#: voice.py:79
 msgid "Missed!"
 msgstr "Το έχασα!"
 
-#: voice.py:94
-msgid ""
-"Nobody wants to"
-"play with me ..."
-msgstr ""
-"Κανείς δε θέλει να"
-"παίξει μαζί μου ..."
+#: voice.py:83
+#, fuzzy
+msgid "Nobody wants to play with me ..."
+msgstr "Κανείς δε θέλει ναπαίξει μαζί μου ..."
 
-#: voice.py:95
+#: voice.py:84
 msgid "I feel so alone ..."
 msgstr "Νιώθω μοναχός μου ..."
 
-#: voice.py:96
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr "Μα, πού πήγαν όλοι;!"
 
-#: voice.py:101
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr "Ξεκουράζομαι για {secs}s ..."
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr ""
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
-#: voice.py:112
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr "Περιμένω για {secs}s ..."
 
-#: voice.py:114
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr "Ψάχνω τριγύρω ({secs})"
 
+#: voice.py:106
+#, fuzzy, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr "Εε!{what},ας γίνουμε φίλοι!"
+
+#: voice.py:107
+#, fuzzy, python-brace-format
+msgid "Associating to {what}"
+msgstr "Συνδέομαι με το{what}"
+
+#: voice.py:108
+#, fuzzy, python-brace-format
+msgid "Yo {what}!"
+msgstr "Που'σαι ρε τρελέ{what}!"
+
+#: voice.py:112
+#, fuzzy, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr "Μόλις αποφάσισα ότι η{mac}δε χρείαζεται WiFi!"
+
+#: voice.py:113
+#, fuzzy, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr "Πετάω έξω την{mac}"
+
+#: voice.py:114
+#, fuzzy, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr "Μπανάρω την{mac}!"
+
+#: voice.py:118
+#, fuzzy, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr "Τέλεια δικέ μου, πήραμε {num}νέες χειραψίες!"
+
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey"
-"{what}"
-"let's be friends!"
-msgstr ""
-"Εε!"
-"{what},"
-"ας γίνουμε φίλοι!"
+#, fuzzy
+msgid "Ops, something went wrong ... Rebooting ..."
+msgstr "Ουπς, κάτιπήγε λάθος ...Επανεκκινούμαι ..."
 
-#: voice.py:122
-#, python-brace-format
-msgid ""
-"Associating to"
-"{what}"
-msgstr ""
-"Συνδέομαι με το"
-"{what}"
-
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Yo"
-"{what}!"
-msgstr ""
-"Που'σαι ρε τρελέ"
-"{what}!"
-
-#: voice.py:128
-#, python-brace-format
-msgid ""
-"Just decided that"
-"{mac}"
-"needs no WiFi!"
-msgstr ""
-"Μόλις αποφάσισα ότι η"
-"{mac}"
-"δε χρείαζεται WiFi!"
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Deauthenticating"
-"{mac}"
-msgstr ""
-"Πετάω έξω την"
-"{mac}"
-
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Kickbanning"
-"{mac}!"
-msgstr ""
-"Μπανάρω την"
-"{mac}!"
-
-#: voice.py:135
-#, python-brace-format
-msgid ""
-"Cool, we got {num}"
-"new handshake{plural}!"
-msgstr ""
-"Τέλεια δικέ μου, πήραμε {num}"
-"νέες χειραψίες!"
-
-#: voice.py:139
-msgid ""
-"Ops, something"
-"went wrong ..."
-"Rebooting ..."
-msgstr ""
-"Ουπς, κάτι"
-"πήγε λάθος ..."
-"Επανεκκινούμαι ..."
-
-#: voice.py:143
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr "Έριξα {num} σταθμούς\n"
 
-#: voice.py:144
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr "Έκανα {num} νέους φίλους\n"
 
-#: voice.py:145
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr "Πήρα {num} χειραψίες\n"
 
-#: voice.py:147
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr "Γνώρισα 1 φίλο"
 
-#: voice.py:149
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr "Γνώρισα {num} φίλους"
 
-#: voice.py:154
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
-"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog "
-"#pwnlife #hacktheplanet #skynet"
+"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
+"#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
 "Pwnαρα για {duration} και έριξα {deauthed} πελάτες! Επίσης γνώρισα "
-"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! #pwnagotchi "
-"#pwnlog #pwnlife #hacktheplanet #skynet"
+"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! "
+"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
index c164152..17d03f3 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po
@@ -8,281 +8,230 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 10:28+0200\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
 "PO-Revision-Date: 2019-10-03 10:34+0200\n"
-"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n"
+"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github."
+"com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: french\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
-#: voice.py:21
-msgid ""
-"Bonjour, je suis Pwnagotchi!"
-"Démarrage ..."
-msgstr ""
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,"
-"Nouvelle journée, nouvelle chasse,"
-"nouveau pwns!"
+msgid "Hi, I'm Pwnagotchi! Starting ..."
 msgstr ""
 
 #: voice.py:23
-msgid "Hack la planète!"
+msgid "New day, new hunt, new pwns!"
+msgstr ""
+
+#: voice.py:24
+msgid "Hack the Planet!"
 msgstr ""
 
 #: voice.py:28
-msgid "IA prête."
+msgid "AI ready."
 msgstr ""
 
 #: voice.py:29
-msgid ""
-"Le réseau neuronal"
-"est prêt."
+msgid "The neural network is ready."
 msgstr ""
 
-#: voice.py:39
+#: voice.py:37
 #, python-brace-format
-msgid ""
-"Hey, le channel {channel} est"
-"libre! Ton AP va"
-"dis merci."
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
 msgstr ""
 
-#: voice.py:44
-msgid "Je m'ennuie ..."
+#: voice.py:41
+msgid "I'm bored ..."
+msgstr ""
+
+#: voice.py:42
+msgid "Let's go for a walk!"
 msgstr ""
 
 #: voice.py:45
-msgid "Allons faire un tour!"
+msgid "This is the best day of my life!"
 msgstr ""
 
-#: voice.py:49
-msgid ""
-"C'est le meilleur"
-"jour de ma vie!"
+#: voice.py:48
+msgid "Shitty day :/"
+msgstr ""
+
+#: voice.py:52
+msgid "I'm extremely bored ..."
 msgstr ""
 
 #: voice.py:53
-msgid "Journée de merde :/"
+msgid "I'm very sad ..."
 msgstr ""
 
-#: voice.py:58
-msgid "Je m'ennuie énormément ..."
+#: voice.py:54
+msgid "I'm sad"
 msgstr ""
 
 #: voice.py:59
-msgid "Je suis très triste ..."
+msgid "I'm living the life!"
 msgstr ""
 
 #: voice.py:60
-msgid "Je suis triste"
+msgid "I pwn therefore I am."
 msgstr ""
 
-#: voice.py:66
-msgid "Je vis la vie!"
+#: voice.py:61
+msgid "So many networks!!!"
+msgstr ""
+
+#: voice.py:62
+msgid "I'm having so much fun!"
+msgstr ""
+
+#: voice.py:63
+msgid "My crime is that of curiosity ..."
 msgstr ""
 
 #: voice.py:67
-msgid "Je pwn donc je suis."
+#, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
 msgstr ""
 
 #: voice.py:68
-msgid "Autant de réseaux!!!"
-msgstr ""
-
-#: voice.py:69
-msgid ""
-"Je m'amuse tellement!"
-msgstr ""
-
-#: voice.py:70
-msgid ""
-"Mon crime est celui de"
-"la curiosité ..."
-msgstr ""
-
-#: voice.py:75
 #, python-brace-format
-msgid ""
-"Bonjour"
-"{name}!"
-"Ravis de te rencontrer. {name}"
+msgid "Unit {name} is nearby! {name}"
 msgstr ""
 
-#: voice.py:76
+#: voice.py:72
 #, python-brace-format
-msgid ""
-"L'unité"
-"{name}"
-"est proche! {name}"
+msgid "Uhm ... goodbye {name}"
 msgstr ""
 
-#: voice.py:81
+#: voice.py:73
 #, python-brace-format
-msgid ""
-"Hum ..."
-"au revoir"
-"{name}"
+msgid "{name} is gone ..."
 msgstr ""
 
-#: voice.py:82
+#: voice.py:77
 #, python-brace-format
-msgid ""
-"{name}"
-"est parti ..."
+msgid "Whoops ... {name} is gone."
 msgstr ""
 
-#: voice.py:87
+#: voice.py:78
 #, python-brace-format
-msgid ""
-"Oups ..."
-"{name}"
-"est parti."
+msgid "{name} missed!"
 msgstr ""
 
-#: voice.py:88
-#, python-brace-format
-msgid ""
-"{name}"
-"raté!"
+#: voice.py:79
+msgid "Missed!"
+msgstr ""
+
+#: voice.py:83
+msgid "Nobody wants to play with me ..."
+msgstr ""
+
+#: voice.py:84
+msgid "I feel so alone ..."
+msgstr ""
+
+#: voice.py:85
+msgid "Where's everybody?!"
 msgstr ""
 
 #: voice.py:89
-msgid "Raté!"
-msgstr ""
-
-#: voice.py:94
-msgid ""
-"Personne ne veut"
-"jouer avec moi ..."
-msgstr ""
-
-#: voice.py:95
-msgid "Je me sens si seul ..."
-msgstr ""
-
-#: voice.py:96
-msgid "Où est tout le monde?!"
-msgstr ""
-
-#: voice.py:101
 #, python-brace-format
-msgid "Fais la sieste pendant {secs}s ..."
+msgid "Napping for {secs}s ..."
 msgstr ""
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr ""
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
+#: voice.py:98
+#, python-brace-format
+msgid "Waiting for {secs}s ..."
+msgstr ""
+
+#: voice.py:100
+#, python-brace-format
+msgid "Looking around ({secs}s)"
+msgstr ""
+
+#: voice.py:106
+#, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr ""
+
+#: voice.py:107
+#, python-brace-format
+msgid "Associating to {what}"
+msgstr ""
+
+#: voice.py:108
+#, python-brace-format
+msgid "Yo {what}!"
+msgstr ""
+
 #: voice.py:112
 #, python-brace-format
-msgid "Attends pendant {secs}s ..."
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr ""
+
+#: voice.py:113
+#, python-brace-format
+msgid "Deauthenticating {mac}"
 msgstr ""
 
 #: voice.py:114
 #, python-brace-format
-msgid "Regarde autour ({secs}s)"
+msgid "Kickbanning {mac}!"
+msgstr ""
+
+#: voice.py:118
+#, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
 msgstr ""
 
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey"
-"{what}"
-"soyons amis!"
+msgid "Ops, something went wrong ... Rebooting ..."
 msgstr ""
 
-#: voice.py:122
+#: voice.py:124
 #, python-brace-format
-msgid ""
-"Association à"
-"{what}"
+msgid "Kicked {num} stations\n"
 msgstr ""
 
-#: voice.py:123
+#: voice.py:125
 #, python-brace-format
-msgid ""
-"Yo"
-"{what}!"
+msgid "Made {num} new friends\n"
+msgstr ""
+
+#: voice.py:126
+#, python-brace-format
+msgid "Got {num} handshakes\n"
 msgstr ""
 
 #: voice.py:128
-#, python-brace-format
-msgid ""
-"Décidé à l'instant que"
-"{mac}"
-"n'a pas besoin de WiFi!"
-msgstr ""
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Désauthentification de"
-"{mac}"
+msgid "Met 1 peer"
 msgstr ""
 
 #: voice.py:130
 #, python-brace-format
-msgid ""
-"Kickbanning"
-"{mac}!"
+msgid "Met {num} peers"
 msgstr ""
 
 #: voice.py:135
 #, python-brace-format
 msgid ""
-"Cool, nous avons {num}"
-"nouveaux handshake{plural}!"
-msgstr ""
-
-#: voice.py:139
-msgid ""
-"Oups, quelque"
-"chose s'est mal passé ..."
-"Redémarrage ..."
-msgstr ""
-
-#: voice.py:143
-#, python-brace-format
-msgid "{num} stations kick\n"
-msgstr ""
-
-#: voice.py:144
-#, python-brace-format
-msgid "Fait {num} nouveaux amis\n"
-msgstr ""
-
-#: voice.py:145
-#, python-brace-format
-msgid "Récupéré {num} handshakes\n"
-msgstr ""
-
-#: voice.py:147
-msgid "1 peer rencontré"
-msgstr ""
-
-#: voice.py:149
-#, python-brace-format
-msgid "{num} peers recontrés"
-msgstr ""
-
-#: voice.py:154
-#, python-brace-format
-msgid ""
-"J'ai pwn durant {duration} et kick {deauthed} clients! J'ai aussi rencontré "
-"{associated} nouveaux amis and mangé {handshakes} handshakes! #pwnagotchi "
+"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
+"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
 "#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo
index a811add1ad5e423704921426827c4a15424cfb3b..0dca8ac1b61291b4b6db73cdd11f27f489e22303 100644
GIT binary patch
delta 630
zcmZ9}JxfAS7{Kvk`EtGaQkvOdB^8EXwX`-EK{d1#MN5OBU_@G)gGBfRq~(xAUqBio
zXo$e6hSqGzA*k>RL^L$@f3CK4;P^Y|-gD3M;?+poUwIAK&lDrfj4+$bF=o}q55wqD
z%8hOeVGx5D@9yW(%YGf@juZ}J8C`ga{aC|Wtm6>w^jhaCs?1_o4x(I8M-v<9$48Wl
zTHW{WC;@*^5;5%E<Wcr>=qCAPlzY}3o%h=)flDagSJ9&?N?ouR<v|^N_<()*j8e%P
z-s3k)f_KhNhnhIW{tE*bA<F@rMG2Jbx`i?Jd6aWClulk^koc;>LOy&#={g;<Dh6v1
zS5b_WwLFkZq*57Dp$uuUVXZpBB~dAYCMoi>I_W`)^EV`kgj6V1%YUqrE73wGl`hYy
zrTkI!I9J*~iDpx|bTOOS%M?w0W8csdj<#NKp6f-|xPEaZu2+qaE&Tsz^q`O_?wUGp
TZt4&7Q%`zY`p_HK)4td*k1a^$

literal 3761
zcmb`J&yS=<8OKWj7YY%@U*Iq5WszZ>>E7vGBg?P?voi}jIz0?KgOg44Q2oBu-DSUT
z)w^%i+ilb7#6%*00h(~p5DsX#5(F>m#FKC|1`iq!Tmere9*p0o-uLaEHGA~U_I}<U
zRnPC|srlPIx4y)1t>X6;{QSoldklQ%<M<EPZ*F1i4)87T^WZUf27Ir6zU5ZN9>Vi|
zAnkt=ya4_H6yVRm&w_7)wEs`wUEn{!FM=P|JarpmpTqP0;3@E%;HSZh;M-sqBt5r(
zg0XwRv)~uNOCasL2Hp!AkmSAya_|@6-Qcf5lKXc3{SP47`&Uqa{{krn_hJ#*w+)ir
zS3z3W2L<>Oko3L^eii&JNc!FbY5hOJFM+q+Ug;Mg*}DpU3Va;A12OK_-;WU7(|F$l
z+u%<@lJ^Gq0QfFQ`ac3Gu6MzyGvHGo*^z@}?~C9k!I!|Vfv<pM-|s=v`*-k8@B@(I
z^>6Tx;N5uH0sjn=o>LG)`X2=E2QPvv;P*lD;|1_D;LkzQ|Erq610TZkUqJHbKOpUY
z0LGDDmq6No9i%#V0i-y+44wtw0KX2t4@TgfFq-1o0!iN{Nbe6on9fS@KJdpN+3_-n
zu!bCy-sbuSZpd%i+gwy9WD8v=zaS6kU=QL)HAffOLUJhwDD@CCiaXU3U1S@@xw%lD
zArJKYFn(XgkNl*VlKo^W`AZk&rMXactZuasXNo<=5$O(jTLmee2<PGwbho)93MG?i
zn{7I0V=cWl1K};7O@`9X*_O5GnwTgtuwKkena#OT6ETz~aYH#$vpg*ena(5jbhBXj
z(Q$S~r746NnW=fi_jIfvTx3dlF|}nIBIyg3O>2!jRer^Zo)Y~+D`<)6<C=(}(x_C-
z>YKUHj`s_tB5}=@h1lE|6P>2q$*J&IJ92GyMX!mSl}zkUjD-F1P)Gd0%Od#LZnxQv
z=qt!{R>;&EC8~G%#6W~9RNod#><F1*CB*dbm{e=<q<-WJm8o?4KktWfOd*8Ktc-`e
zUz#ZFPIY(>!6MatRlRgF2_MI*m<l}9(#Hw`P)5KKk_9`&EJ2*Twq`C6doj}S2*%73
zB}<4*<|0lJF7G0EjO{Wd0}$nztn*51D0OvMgB0nNm@RVY<|k4YiPO+thb`Qvc2E)4
zi_=3HkDxeDrGb{yZZrkicS`3)qGFxEIHbYzStetu8I?F;tT@t7>4<$7*7uN4I9DyG
zUXepoV#4|0D(Yu9RKviA7)UXZ=_q2m){ZDHvals$@$k&4*v;J;)|Cky3L;Lp%2^jC
zc0{gJ5pJs$^ypYuJExL}?a4e}#JZ9flCg)7B@zV~%DyyyEi?dPgUZ~qJ)2Bn6#`F9
zgJ|GM`yoOfc0ZH5HIxDpF(h9n$dH&67Ph0*_*K=jc2SH6L+$;Pl!=YA>;UPLW(u`_
zVvCWBqKF-$c8sEaYhH8hn*Kc;;vWB~z<SDgPJ(P-WYfCdo*QOC>%iKiH&u00vgeFO
zmO>knG^1qEn?_Az9!VVx3?+CXEJxHI=u<_NOF?)dVn;)3a~E_h<qgnRZFa30C=t8y
zQ;1UiDyvhmU)Ue2*td3)*7uMi)cl56Z?CsI2v}|l-|D)7PFk1BfomPw4Z-)HX<b!g
zO)Fd5sOb%HZoTtptFzu(KPNhmY@AzPUB|_Dr5TiRpjwAYW*gL9O?_WHf4=kRBi}mT
zSxsaj$4{0HirWSapQqFI02wWN?bv3IFJx>8?PaQ^;oY6?<)xvW_B!9P#v{|M!)Xp%
zJSN3iRE9Q>(G)A3^4~6fzja}`u8_v{RnfX^Vw<2)HpGP<vch&YMUHCmvW-EUrfPs;
zX)r%yYnpMX4W0^TX>?suMy(0i>uH(Ust@?0yPHWZup`&UZ&4<w*A@#LbSbAf+tPA5
zvM;ZQk~YW~3BTFA-qvH-6g0|A$LQ`buXQS7X=I9iTukia*LbRXs<0SRsqm%6)aC{J
zE#&i>e1zhN?^n8RnA%&i&~fcNdD_*&)sb+=ucO1#5P*G5ZdG7fxDqpai`vC%8EWjn
zV)~#hFtdXk#W8>I5z%Y};x>UZ1#*{I?$OjJNS)bescx*tcnq?9p`BONeP&Z^uHKNe
zD^{d(Y%#Dcrp^t+TZJg&z(IJ@Sl@JlW4kmltk<Xq<Aa#x9LE?h?O5YjLbQbv!!RiZ
z!Il5(FefweTp1ZAI?fZA)XZ~hFeze%_;`HQyqfC=<ZprSg$ULzHWPj^+Mh?CYQ%-6
zyy9%rBvti@zQlQ38p(4UT53Qp$%t)RyhBRSx&`ubz0`<{w}qjU^X2fb=l(J_oK-Xb
zL>TLu52JtiTC>aar@^+x!RZttYZ7EGdV(F`PX-ysnk*1J*QhfMQ$k8l48uL>v|^we
zo2vXQ8;fT59%4mqj7ys;j<qp4i}d2CpppqE#q|<3VV&g1uhmB2D8$4IHOjAQIUd6n
zTK;rUhR9=kkw`i*o<(4=FUOw&RLD3NJeqM=(oJ)2D3aWalxIt%z|tNxD~$x48!4HF
z&?4n&Dn+IxA0x%^AY#n{B9lZn17eM5Fd<ZHAvIaHyFw?*@h_V*1>(mjR3jH>%BIVe
vhvNF!4*pcJryljC_xh%%iGvp_5Lcz=W{1j+D}vzqY{52%`JH3@hDq^Xej)-1

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
index 3dabc3d..0123244 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-02 16:38+0000\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
 "PO-Revision-Date: 2019-10-02 17:20+0000\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: italian\n"
@@ -19,220 +19,193 @@ msgstr ""
 msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
-#: voice.py:23
-msgid ""
-"Hi, I'm Pwnagotchi!\n"
-"Starting ..."
+#: voice.py:22
+#, fuzzy
+msgid "Hi, I'm Pwnagotchi! Starting ..."
 msgstr ""
 "Ciao!\n"
 "Piacere Pwnagotchi!\n"
 "Caricamento ..."
 
-#: voice.py:24
-msgid ""
-"New day, new hunt,\n"
-"new pwns!"
+#: voice.py:23
+#, fuzzy
+msgid "New day, new hunt, new pwns!"
 msgstr ""
 "Nuovo giorno...\n"
 "nuovi handshakes!!!"
 
-#: voice.py:25
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr ""
 
-#: voice.py:30
+#: voice.py:28
 msgid "AI ready."
 msgstr "IA pronta."
 
-#: voice.py:31
-msgid ""
-"The neural network\n"
-"is ready."
+#: voice.py:29
+#, fuzzy
+msgid "The neural network is ready."
 msgstr ""
 "La rete neurale\n"
 "è pronta."
 
-#: voice.py:41
-#, python-brace-format
-msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
-"say thanks."
+#: voice.py:37
+#, fuzzy, python-brace-format
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
 msgstr ""
 "Hey, il canale {channel} è\n"
 "libero! Il tuo AP\n"
 "ringrazia."
 
-#: voice.py:46
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr "Che noia ..."
 
-#: voice.py:47
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr ""
 "Andiamo a fare una\n"
 "passeggiata!"
 
-#: voice.py:51
-msgid ""
-"This is the best\n"
-"day of my life!"
+#: voice.py:45
+#, fuzzy
+msgid "This is the best day of my life!"
 msgstr ""
 "Questo è il più bel\n"
 "giorno della mia\n"
 "vita!!!!"
 
-#: voice.py:55
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr "Giorno di merda :/"
 
-#: voice.py:60
+#: voice.py:52
 msgid "I'm extremely bored ..."
 msgstr ""
 "Sono estremamente\n"
 "annoiato ..."
 
-#: voice.py:61
+#: voice.py:53
 msgid "I'm very sad ..."
 msgstr "Sono molto triste..."
 
-#: voice.py:62
+#: voice.py:54
 msgid "I'm sad"
 msgstr "Sono triste"
 
-#: voice.py:68
+#: voice.py:59
 msgid "I'm living the life!"
 msgstr "Mi sento vivo!"
 
-#: voice.py:69
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr "Pwn ergo sum."
 
-#: voice.py:70
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr "Qui è pieno di reti!"
 
-#: voice.py:71
-msgid ""
-"I'm having so much\n"
-"fun!"
+#: voice.py:62
+#, fuzzy
+msgid "I'm having so much fun!"
 msgstr ""
 "Mi sto divertendo\n"
 "tantissimo!"
 
-#: voice.py:72
-msgid ""
-"My crime is that of\n"
-"curiosity ..."
+#: voice.py:63
+msgid "My crime is that of curiosity ..."
 msgstr ""
 
-#: voice.py:77
-#, python-brace-format
-msgid ""
-"Hello\n"
-"{name}!\n"
-"Nice to meet you. {name}"
+#: voice.py:67
+#, fuzzy, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
 msgstr ""
 "Ciao\n"
 "{name}!\n"
 "E' un piacere. {name}"
 
-#: voice.py:78
-#, python-brace-format
-msgid ""
-"Unit\n"
-"{name}\n"
-"is nearby! {name}"
+#: voice.py:68
+#, fuzzy, python-brace-format
+msgid "Unit {name} is nearby! {name}"
 msgstr ""
 "L'Unità\n"
 "{name}\n"
 "è vicina! {name}"
 
-#: voice.py:83
-#, python-brace-format
-msgid ""
-"Uhm ...\n"
-"goodbye\n"
-"{name}"
+#: voice.py:72
+#, fuzzy, python-brace-format
+msgid "Uhm ... goodbye {name}"
 msgstr ""
 "Uhm ...\n"
 "addio\n"
 "{name},\n"
 "mi mancherai..."
 
-#: voice.py:84
-#, python-brace-format
-msgid ""
-"{name}\n"
-"is gone ..."
+#: voice.py:73
+#, fuzzy, python-brace-format
+msgid "{name} is gone ..."
 msgstr ""
 "{name}\n"
 "se n'è andato ..."
 
-#: voice.py:89
-#, python-brace-format
-msgid ""
-"Whoops ...\n"
-"{name}\n"
-"is gone."
+#: voice.py:77
+#, fuzzy, python-brace-format
+msgid "Whoops ... {name} is gone."
 msgstr ""
 "Whoops ...\n"
 "{name}\n"
 "se n'è andato."
 
-#: voice.py:90
-#, python-brace-format
-msgid ""
-"{name}\n"
-"missed!"
+#: voice.py:78
+#, fuzzy, python-brace-format
+msgid "{name} missed!"
 msgstr ""
 "{name}\n"
 "è scomparso..."
 
-#: voice.py:91
+#: voice.py:79
 msgid "Missed!"
 msgstr ""
 "Ehi!\n"
 "Dove sei andato!?"
 
-#: voice.py:96
-msgid ""
-"Nobody wants to\n"
-"play with me ..."
+#: voice.py:83
+#, fuzzy
+msgid "Nobody wants to play with me ..."
 msgstr ""
 "Nessuno vuole\n"
 "giocare con me..."
 
-#: voice.py:97
+#: voice.py:84
 msgid "I feel so alone ..."
 msgstr "Mi sento così solo..."
 
-#: voice.py:98
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr "Dove sono tutti?!"
 
-#: voice.py:103
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr ""
 "Schiaccio un \n"
 "pisolino per {secs}s ..."
 
-#: voice.py:104
+#: voice.py:90
 msgid "Zzzzz"
 msgstr ""
 
-#: voice.py:105
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
-#: voice.py:114
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr "Aspetto {secs}s ..."
 
-#: voice.py:116
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr ""
@@ -240,109 +213,91 @@ msgstr ""
 "qui intorno...\n"
 "({secs}s)"
 
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Hey\n"
-"{what}\n"
-"let's be friends!"
+#: voice.py:106
+#, fuzzy, python-brace-format
+msgid "Hey {what} let's be friends!"
 msgstr ""
 "Hey\n"
 "{what}\n"
 "Diventiamo amici!"
 
-#: voice.py:124
-#, python-brace-format
-msgid ""
-"Associating to\n"
-"{what}"
+#: voice.py:107
+#, fuzzy, python-brace-format
+msgid "Associating to {what}"
 msgstr ""
 "Collegamento con\n"
 "{what}\n"
 "in corso..."
 
-#: voice.py:125
-#, python-brace-format
-msgid ""
-"Yo\n"
-"{what}!"
+#: voice.py:108
+#, fuzzy, python-brace-format
+msgid "Yo {what}!"
 msgstr ""
 "Yo\n"
 "{what}!"
 
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Just decided that\n"
-"{mac}\n"
-"needs no WiFi!"
+#: voice.py:112
+#, fuzzy, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
 msgstr ""
 "Ho appena deciso che\n"
 "{mac}\n"
 "non necessita di\n"
 "WiFi!"
 
-#: voice.py:131
+#: voice.py:113
 #, python-brace-format
-msgid ""
-"Deauthenticating\n"
-"{mac}"
+msgid "Deauthenticating {mac}"
 msgstr ""
 
-#: voice.py:132
-#, python-brace-format
-msgid ""
-"Kickbanning\n"
-"{mac}!"
+#: voice.py:114
+#, fuzzy, python-brace-format
+msgid "Kickbanning {mac}!"
 msgstr ""
 "Sto prendendo\n"
 "a calci\n"
 "{mac}!"
 
-#: voice.py:137
-#, python-brace-format
-msgid ""
-"Cool, we got {num}\n"
-"new handshake{plural}!"
+#: voice.py:118
+#, fuzzy, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
 msgstr ""
 "Bene, abbiamo {num}\n"
 "handshake{plural} in più!"
 
-#: voice.py:141
-msgid ""
-"Ops, something\n"
-"went wrong ...\n"
-"Rebooting ..."
+#: voice.py:121
+#, fuzzy
+msgid "Ops, something went wrong ... Rebooting ..."
 msgstr ""
 "Ops, qualcosa\n"
 "è andato storto ...\n"
 "Riavvio ..."
 
-#: voice.py:145
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr "{num} stazioni pestate\n"
 
-#: voice.py:146
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr "{num} nuovi amici\n"
 
-#: voice.py:147
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr "{num} handshakes presi\n"
 
-#: voice.py:149
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr "1 peer incontrato"
 
-#: voice.py:151
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr "{num} peers incontrati"
 
-#: voice.py:156
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo
index 2d3562329ea69daafd4db6bb7f0570ba452fd5ba..8a736612f9b685251c638e5b14174decfa3641ea 100644
GIT binary patch
delta 723
zcmX}qJxClu7{>9r%YFN`>KTn6uzDAa7z9aSVH&XrVikzkSa@i_5Iiw4poqCx*aWK^
zEG%qNXf4;t6@r}}1Z-3g!GM)WA_x`=`hWJ;yfF9MnVp?^=bihVTCdNY)rHm!(L!sb
z-OygrN&$X|@t`qr%wPk4MhBO%9`pYACRWieVk7Qj68~TnZ&BYp;0`*^jCpQM&K&UI
zO~fWmL@nTij7i`ttid;^g$7aYhfy0&pc0w&$5;IR2G%mZjn%k^VLZenhdahP_BU6I
zcJRVP$_uAZC+)}A_#VmBe8)CiLnT^3C0N22c!YoP8q;`AwwfP_mHTPmAxtrz#V+<Y
zc^-7aBDz>YRpbiWF-ZM&;xuaGx2O$AP**mCmAH!jtr@E9on8lF*qg5^=zE1KrfTM>
zf)^z1g%VNduC%E_r{q>BS9v3qo!tJ1{yQpdGfjy<g{oGe&cKlS<zr@Yp~t+NnR6Gj
z-=>$`sZ4hA>y+IJHQJHz2fG`-u&0q9b}8Cq@1h-{(afhgyBtm0U$LY;iFFp-cvryg
hC;IKbiuuCN%ASA?R$togns!^|^x1o-*N)W=J_01pQQ80i

literal 4559
zcmbW4PmmN>9mhLLG+E<668}Y`uSG)$GsEl>EZ8JQ0#VkmK*1ssz4Xq!ooQ#LduzIf
zaoF0D1rs)wTB#T+NP!3mrI%DK3kxedyBsY&=<8#uQeM1i${f6zi=W@?o@H2bve}+*
zzt_L_`}_U9*Zgh$x-$;fAorKJ-@M0hc7eGM^TV}$o#WgO?f@SGcY%+A-v>Vf&SdyH
z_$kJ3fnNhxz;A$m2OkC>zSnWS0&W8z1P_C<-UmMp{sjCS_zUo};1y8pb-|B<2`KvC
z25*7?0L9Lgk2ub!!9Rnt?j2Cp{Tuu|cpr;JuL}-<JHStZyFvb(F@6;ILr~<V!7qYm
zK=Jn~xCu-^@$-F9{J;OcRPGT_<aU5!_h>dBfTHhbpvYea#h)9X<nynf`29Bc3GkmF
zAvyoa=0!;Ctp^{XCJJ27cpE`{72E?#erw>P;N@)oPoUU+7u*c4`xv<fi(n3X349W~
z21@?l%jWNWAkE(p_z3eOpbJ(&@%v>EmCj}G3*cMed*B~I@#7}WihutCr7rgnl<0XB
zl=1EieQ*QgUxJ&!c~I){4)`?qE~voAnS26#9()Qs0qz5rLCNz2kU{)&!L8sf@ENcT
z3J-3AIq)x_<l}u%;&_mxOa5{op*#CQiRTBP@V^BTlJjade-V^C{Q;y5R_A6=YTkcI
z>=LJ3id))8;#<f4b#AGp_$9jJ5>7~dJ|u(e+5&FmmU@a$P{H<&#7X(>mCsOo#U&e?
zOi65nXmbhmZI2c~shRMqcR^p9KN){Ho0NJKxFs)gQ388Oexw&9AA{VFbFW@IM^saL
z<xaub8AV~q_hLV&s5qQzSG{=J*%gNMoN8-T31c-Cv>MZaZmX&nl%uLw(^Hf6R@19b
zyUuRywc@G{V!vcnOf|gHwDX<bsyj=f0cVd_swsrkfw~vy*md^kdOe&9yoR23_xUA_
zebvx9R-Ld_z^uGLsFPDAOb5EIrm}}=<wp}utzC6AY&F%+1FG%U>yg(%zZcY^f-Fm8
zsq1)Sq{g+HX!;ueG3)2l$i{{`&<;G}D^-2>Q0z5r1`36OGomImwxUpZ^)S#Xottb2
z;(Sw2giWnRl-EEKE#nN!sSG3i<G86Cy53ncU-gbjg3;M%m8ui1z_p9(zMYn&)cpya
zPDWnYzC5Oz9mOD1eoPaE4it`vD%?<0Wy%oyVKA*IjjH*j8oo@G)1s88RjE$QapV#&
z%e}hTC%;o(R&<SwR5r_v)#AlkO|6zXn(nKit2SUgOPYPIhm{oZUTvsSVPcuI^;H|9
zT8BD2-)%*)D(jM8#yRQ}TapA?mm?K~>WKes-*ukH_i>6$X!dnFBhd)^R217dVbNY&
z&q`<$;HkD(uer|NFsw;Zyk^)U5sytpx)e=Eo19UvOf*(SUz`KZC|MX(lUg_JV=5uT
z$QkvcNS9q_w4+K*zoDU;^;(4!rB>4qBR}rglI-&)Cs!+x8cgR&XxW3cwr5&FoRbF<
z2lw`c<6*gj*Hi_%lPLy%T%{~_?f%Iq2TLeY71eEur`pYs$ROcCJsyUuEIm~9V;sSd
z8s6d@qOe}j!DQSHo3+SwU1tnd1zH-lH%%m2*N;_swt)$&qFB^~6ROe4czC$l5R;WK
zERT0|){2J%KTaQ68ECIL-f??vdc^asYnGOM$v7e{Lj!7Iv&8<4>l~?u;bbKGSG84W
zw1RUq+kaf=h2zKhJKk4G8NMJt_Js%>KknSM-X<`eX=F7#&<ua1OL2aroc|uRrBjAg
zu}~}w4jj~zVKdH;MisxDf3{VL@?+t!8aS{&e^4LuMKZseP8e20#lao<;*R{*q8i#d
zylv~|;!v?Tu-A*?{8-ZqqPiD{&0$pwk9no4dTMBB@QGq^+varKj=$B4FkA@OB_`{g
zLWNql#tWse@lA9Dm6li0`7!M^u-zLEt43{LbY%3oJ3bE<iUYgCAchb5vCbrJ#q2a&
zppPFsDZ67c((%)+cp|_3j+}Tmp_}>Vf>Kz9O~Y#YxE~KV?ET4%xt*La3#Mz9%}T*B
zm&}4PH_e>6W#*F8$tg3>b64?pE;|y;IcAq~D)}iAC(R-fT^8BS5haWl6*^IoE>F&x
zIoC12GAqhl$JCseXWfEXmet8i+#=jfPYm;BPixk#Yc&lx=8EV>mogX463@$KAvuYK
z*Ufb+J#SXh>bvGV{w;~&E>4++)x*S`NzUe!1Sye;NOH38P(k60Oq#3Q;`6f0*@C|-
zDmhQEHf~vbLk1*5{2+U1O|wK0XJw&8JSSO}r{n|)xq(OI>uz_+=2@1^Ac;t~|3o6j
zmE<(Z>XkxHA#)kOmL$QVTMA@nFG-Ns7)t>u+D!?L#mwGD%ZvmdhD;X~ugMJ0*KN^O
z2+itv!z?8yC5_^GpG5k0HaV5N$bBj$$yL_Rr|ZeCjq1GVBJrZKfl>*SowhG7BYQ(+
z9jYQcxhCG9?9F~~1oKov65e;fNi>UuhHW8_neRX6sOS=N8M#~qC*~yfG!-J-f8tp;
zgsxd_NF6mIUqV@|C@Cw;g(58NKMU8=^8Y&#aZhwFB(o}+mFmDrCTuJ40BO25NmyHu
zfU`5woFm3tGGUgpL(-hRJ0<p{vlSPH+cu+fUP<~{IV*i5W->zlUcyIb+U_Lnmaq&5
zvST!v*~CUGr!b4sKL4P^VP|dD2O%J;7cnn;#)4V;Uztqv8acD*n2Ri3!N<8|)-2LE
zuM&Og0Cn!QOxg$1>X1MAHSHq3dmEb)q9uPyv7cwXXv3E5cUAh8K>OJaxFE3!`_XRe
zVTZCC%;zi_F$Fc!KI=8}1zQoiOLD`WAf3eqA!_Jrkza)H(pHS@euQ=ev!1)1%ve(}
zL1>UF!2v3eF@siNdCCG7ncvDDg{&}E_R+L(R^25TB<F0L5`=sg&~sh+CwpFR>wsLM
zksV3C63hjj=b2eyvzZa+MY}LC6@sSX`<>%LHoV`+`Ow>4Eq5s~`-Zv7szvGkERhO9
z!jj$3ZVK`Wn^&w)cum*M^|ozMdz;~0x{FI3cJWo)+c!}`*;YR|%<u49_Tsg5q=%)5
z;<Wt{CM@vPVcvioBwTWzS-2)?o{@s!kHj^LFZO>xh`(kNV6%sfzFx@Qu<w!GEWbUx
VYgzVr0%iKm*xF|fNLKqO{$I|F0e%1g

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
index e873883..a0d7911 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
@@ -4,12 +4,11 @@
 # FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
 # kovach <2214005+kovachwt@users.noreply.github.com>, 2019.
 #
-#, fuzzymsgid ""
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:42+0200\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
 "PO-Revision-Date: 2019-09-30 23:53+0200\n"
 "Last-Translator: kovach <2214005+kovachwt@users.noreply.github.com>\n"
 "Language-Team: \n"
@@ -18,27 +17,21 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr "ДреееММмммМммм"
 
-#: voice.py:21
-msgid ""
-"Hi, I'm Pwnagotchi!"
-"Starting ..."
-msgstr ""
-"Здраво, јас сум Pwnagotchi!"
-"Почнувам ..."
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,"
-"new pwns!"
-msgstr ""
-"Нов ден, нов лов,"
-"ќе си газиме!"
+#, fuzzy
+msgid "Hi, I'm Pwnagotchi! Starting ..."
+msgstr "Здраво, јас сум Pwnagotchi!Почнувам ..."
 
 #: voice.py:23
+#, fuzzy
+msgid "New day, new hunt, new pwns!"
+msgstr "Нов ден, нов лов,ќе си газиме!"
+
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr "Хак д Планет!"
 
@@ -47,290 +40,202 @@ msgid "AI ready."
 msgstr "AI спремно."
 
 #: voice.py:29
-msgid ""
-"The neural network"
-"is ready."
-msgstr ""
-"Невронската мрежа"
-"е спремна."
+#, fuzzy
+msgid "The neural network is ready."
+msgstr "Невронската мрежае спремна."
 
-#: voice.py:39
-#, python-brace-format
-msgid ""
-"Hey, channel {channel} is"
-"free! Your AP will"
-"say thanks."
-msgstr ""
-"Еј, каналот {channel} е"
-"слободен! APто ќе ти"
-"каже фала."
+#: voice.py:37
+#, fuzzy, python-brace-format
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
+msgstr "Еј, каналот {channel} еслободен! APто ќе тикаже фала."
 
-#: voice.py:44
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr "Досаднооо ..."
 
-#: voice.py:45
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr "Ајде да шетнеме!"
 
-#: voice.py:49
-msgid ""
-"This is the best"
-"day of my life!"
-msgstr ""
-"Ова ми е најдобриот "
-"ден во животот!"
+#: voice.py:45
+#, fuzzy
+msgid "This is the best day of my life!"
+msgstr "Ова ми е најдобриот ден во животот!"
 
-#: voice.py:53
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr "Срање ден :/"
 
-#: voice.py:58
+#: voice.py:52
 msgid "I'm extremely bored ..."
 msgstr "Ултра досадно ..."
 
-#: voice.py:59
+#: voice.py:53
 msgid "I'm very sad ..."
 msgstr "Многу тажно ..."
 
-#: voice.py:60
+#: voice.py:54
 msgid "I'm sad"
 msgstr "Тажно"
 
-#: voice.py:66
+#: voice.py:59
 msgid "I'm living the life!"
 msgstr "Ммхх животче!"
 
-#: voice.py:67
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr "Си газам значи постојам."
 
-#: voice.py:68
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr "Мммм колку мрежи!!!"
 
-#: voice.py:69
-msgid ""
-"I'm having so much"
-"fun!"
+#: voice.py:62
+#, fuzzy
+msgid "I'm having so much fun!"
 msgstr "Јухуу забавноо ее!"
 
-#: voice.py:70
-msgid ""
-"My crime is that of"
-"curiosity ..."
-msgstr ""
-"Виновен сум само за"
-"љубопитност ..."
+#: voice.py:63
+#, fuzzy
+msgid "My crime is that of curiosity ..."
+msgstr "Виновен сум само заљубопитност ..."
 
-#: voice.py:75
-#, python-brace-format
-msgid ""
-"Hello"
-"{name}!"
-"Nice to meet you. {name}"
-msgstr ""
-"Здраво"
-"{name}!"
-"Мило ми е. {name}"
+#: voice.py:67
+#, fuzzy, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
+msgstr "Здраво{name}!Мило ми е. {name}"
 
-#: voice.py:76
-#, python-brace-format
-msgid ""
-"Unit"
-"{name}"
-"is nearby! {name}"
-msgstr ""
-"Опаа"
-"{name}"
-"е во близина! {name}"
+#: voice.py:68
+#, fuzzy, python-brace-format
+msgid "Unit {name} is nearby! {name}"
+msgstr "Опаа{name}е во близина! {name}"
 
-#: voice.py:81
-#, python-brace-format
-msgid ""
-"Uhm ..."
-"goodbye"
-"{name}"
-msgstr ""
-"Хмм ..."
-"чао"
-"{name}"
+#: voice.py:72
+#, fuzzy, python-brace-format
+msgid "Uhm ... goodbye {name}"
+msgstr "Хмм ...чао{name}"
 
-#: voice.py:82
-#, python-brace-format
-msgid ""
-"{name}"
-"is gone ..."
-msgstr ""
-"{name}"
-"го снема ..."
+#: voice.py:73
+#, fuzzy, python-brace-format
+msgid "{name} is gone ..."
+msgstr "{name}го снема ..."
 
-#: voice.py:87
-#, python-brace-format
-msgid ""
-"Whoops ..."
-"{name}"
-"is gone."
-msgstr ""
-"Уупс ..."
-"{name}"
-"го снема."
+#: voice.py:77
+#, fuzzy, python-brace-format
+msgid "Whoops ... {name} is gone."
+msgstr "Уупс ...{name}го снема."
 
-#: voice.py:88
-#, python-brace-format
-msgid ""
-"{name}"
-"missed!"
-msgstr ""
-"{name}"
-"промаши!"
+#: voice.py:78
+#, fuzzy, python-brace-format
+msgid "{name} missed!"
+msgstr "{name}промаши!"
 
-#: voice.py:89
+#: voice.py:79
 msgid "Missed!"
 msgstr "Промаши!"
 
-#: voice.py:94
-msgid ""
-"Nobody wants to"
-"play with me ..."
-msgstr ""
-"Никој не сака да"
-"си игра со мене ..."
+#: voice.py:83
+#, fuzzy
+msgid "Nobody wants to play with me ..."
+msgstr "Никој не сака даси игра со мене ..."
 
-#: voice.py:95
+#: voice.py:84
 msgid "I feel so alone ..."
 msgstr "Толку сам ..."
 
-#: voice.py:96
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr "Каде се сите?!"
 
-#: voice.py:101
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr "Ќе дремнам {secs}с ..."
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr "Дреммм"
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr "Дремммм ({secs}с)"
 
-#: voice.py:112
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr "Чекам {secs}с ..."
 
-#: voice.py:114
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr "Шарам наоколу ({secs}с)"
 
+#: voice.py:106
+#, fuzzy, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr "Еј{what}ајде да се дружиме!"
+
+#: voice.py:107
+#, fuzzy, python-brace-format
+msgid "Associating to {what}"
+msgstr "Се закачувам на{what}"
+
+#: voice.py:108
+#, fuzzy, python-brace-format
+msgid "Yo {what}!"
+msgstr "Јо{what}!"
+
+#: voice.py:112
+#, fuzzy, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr "Знаеш што, на{mac}не му треба WiFi!"
+
+#: voice.py:113
+#, fuzzy, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr "Го деавтентицирам{mac}"
+
+#: voice.py:114
+#, fuzzy, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr "Кикбан{mac}!"
+
+#: voice.py:118
+#, fuzzy, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr "Кул, фативме {num}нови ракувања!"
+
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey"
-"{what}"
-"let's be friends!"
-msgstr ""
-"Еј"
-"{what}"
-"ајде да се дружиме!"
+#, fuzzy
+msgid "Ops, something went wrong ... Rebooting ..."
+msgstr "Упс, нешто не еко што треба ...Рестартирам ..."
 
-#: voice.py:122
-#, python-brace-format
-msgid ""
-"Associating to"
-"{what}"
-msgstr ""
-"Се закачувам на"
-"{what}"
-
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Yo"
-"{what}!"
-msgstr ""
-"Јо"
-"{what}!"
-
-#: voice.py:128
-#, python-brace-format
-msgid ""
-"Just decided that"
-"{mac}"
-"needs no WiFi!"
-msgstr ""
-"Знаеш што, на"
-"{mac}"
-"не му треба WiFi!"
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Deauthenticating"
-"{mac}"
-msgstr ""
-"Го деавтентицирам"
-"{mac}"
-
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Kickbanning"
-"{mac}!"
-msgstr ""
-"Кикбан"
-"{mac}!"
-
-#: voice.py:135
-#, python-brace-format
-msgid ""
-"Cool, we got {num}"
-"new handshake{plural}!"
-msgstr ""
-"Кул, фативме {num}"
-"нови ракувања!"
-
-#: voice.py:139
-msgid ""
-"Ops, something"
-"went wrong ..."
-"Rebooting ..."
-msgstr ""
-"Упс, нешто не е"
-"ко што треба ..."
-"Рестартирам ..."
-
-#: voice.py:143
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr "Избацив {num} станици\n"
 
-#: voice.py:144
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr "{num} нови другарчиња\n"
 
-#: voice.py:145
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr "Фатив {num} ракувања\n"
 
-#: voice.py:147
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr "Запознав 1 пријател"
 
-#: voice.py:149
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr "Запознав {num} пријатели"
 
-#: voice.py:154
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
@@ -338,5 +243,5 @@ msgid ""
 "#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
 "Си газам веќе {duration} и избацив {deauthed} клиенти! Запознав {associated} "
-"нови другарчиња и лапнав {handshakes} ракувања! #pwnagotchi #pwnlog "
-"#pwnlife #hacktheplanet #skynet"
+"нови другарчиња и лапнав {handshakes} ракувања! #pwnagotchi #pwnlog #pwnlife "
+"#hacktheplanet #skynet"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
index 671e44d..2d07413 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
@@ -1,39 +1,35 @@
-# pwnigotchi voice data
-# Copyright (C) 2019
-# This file is distributed under the same license as the pwnagotchi package.
-# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: 0.0.1\n"
+"Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:42+0200\n"
-"PO-Revision-Date: 2019-09-29 14:00+0200\n"
-"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
-"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
-"Language: english\n"
+"POT-Creation-Date: 2019-10-03 12:22+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
-#: voice.py:21
-msgid ""
-"Hi, I'm Pwnagotchi!\n"
-"Starting ..."
-msgstr ""
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,\n"
-"new pwns!"
+msgid "Hi, I'm Pwnagotchi! Starting ..."
 msgstr ""
 
 #: voice.py:23
+msgid "New day, new hunt, new pwns!"
+msgstr ""
+
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr ""
 
@@ -42,244 +38,196 @@ msgid "AI ready."
 msgstr ""
 
 #: voice.py:29
-msgid ""
-"The neural network\n"
-"is ready."
+msgid "The neural network is ready."
 msgstr ""
 
-#: voice.py:39
+#: voice.py:37
 #, python-brace-format
-msgid ""
-"Hey, channel {channel} is\n"
-"free! Your AP will\n"
-"say thanks."
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
 msgstr ""
 
-#: voice.py:44
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr ""
 
-#: voice.py:45
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr ""
 
-#: voice.py:49
-msgid ""
-"This is the best\n"
-"day of my life!"
+#: voice.py:45
+msgid "This is the best day of my life!"
 msgstr ""
 
-#: voice.py:53
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr ""
 
-#: voice.py:58
+#: voice.py:52
 msgid "I'm extremely bored ..."
 msgstr ""
 
-#: voice.py:59
+#: voice.py:53
 msgid "I'm very sad ..."
 msgstr ""
 
-#: voice.py:60
+#: voice.py:54
 msgid "I'm sad"
 msgstr ""
 
-#: voice.py:66
+#: voice.py:59
 msgid "I'm living the life!"
 msgstr ""
 
-#: voice.py:67
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr ""
 
-#: voice.py:68
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr ""
 
-#: voice.py:69
-msgid ""
-"I'm having so much\n"
-"fun!"
+#: voice.py:62
+msgid "I'm having so much fun!"
 msgstr ""
 
-#: voice.py:70
-msgid ""
-"My crime is that of\n"
-"curiosity ..."
+#: voice.py:63
+msgid "My crime is that of curiosity ..."
 msgstr ""
 
-#: voice.py:75
+#: voice.py:67
 #, python-brace-format
-msgid ""
-"Hello\n"
-"{name}!\n"
-"Nice to meet you. {name}"
+msgid "Hello {name}! Nice to meet you. {name}"
 msgstr ""
 
-#: voice.py:76
+#: voice.py:68
 #, python-brace-format
-msgid ""
-"Unit\n"
-"{name}\n"
-"is nearby! {name}"
+msgid "Unit {name} is nearby! {name}"
 msgstr ""
 
-#: voice.py:81
+#: voice.py:72
 #, python-brace-format
-msgid ""
-"Uhm ...\n"
-"goodbye\n"
-"{name}"
+msgid "Uhm ... goodbye {name}"
 msgstr ""
 
-#: voice.py:82
+#: voice.py:73
 #, python-brace-format
-msgid ""
-"{name}\n"
-"is gone ..."
+msgid "{name} is gone ..."
 msgstr ""
 
-#: voice.py:87
+#: voice.py:77
 #, python-brace-format
-msgid ""
-"Whoops ...\n"
-"{name}\n"
-"is gone."
+msgid "Whoops ... {name} is gone."
 msgstr ""
 
-#: voice.py:88
+#: voice.py:78
 #, python-brace-format
-msgid ""
-"{name}\n"
-"missed!"
+msgid "{name} missed!"
 msgstr ""
 
-#: voice.py:89
+#: voice.py:79
 msgid "Missed!"
 msgstr ""
 
-#: voice.py:94
-msgid ""
-"Nobody wants to\n"
-"play with me ..."
+#: voice.py:83
+msgid "Nobody wants to play with me ..."
 msgstr ""
 
-#: voice.py:95
+#: voice.py:84
 msgid "I feel so alone ..."
 msgstr ""
 
-#: voice.py:96
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr ""
 
-#: voice.py:101
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr ""
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr ""
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
-#: voice.py:112
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr ""
 
-#: voice.py:114
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr ""
 
+#: voice.py:106
+#, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr ""
+
+#: voice.py:107
+#, python-brace-format
+msgid "Associating to {what}"
+msgstr ""
+
+#: voice.py:108
+#, python-brace-format
+msgid "Yo {what}!"
+msgstr ""
+
+#: voice.py:112
+#, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr ""
+
+#: voice.py:113
+#, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr ""
+
+#: voice.py:114
+#, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr ""
+
+#: voice.py:118
+#, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr ""
+
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey\n"
-"{what}\n"
-"let's be friends!"
+msgid "Ops, something went wrong ... Rebooting ..."
 msgstr ""
 
-#: voice.py:122
-#, python-brace-format
-msgid ""
-"Associating to\n"
-"{what}"
-msgstr ""
-
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Yo\n"
-"{what}!"
-msgstr ""
-
-#: voice.py:128
-#, python-brace-format
-msgid ""
-"Just decided that\n"
-"{mac}\n"
-"needs no WiFi!"
-msgstr ""
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Deauthenticating\n"
-"{mac}"
-msgstr ""
-
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Kickbanning\n"
-"{mac}!"
-msgstr ""
-
-#: voice.py:135
-#, python-brace-format
-msgid ""
-"Cool, we got {num}\n"
-"new handshake{plural}!"
-msgstr ""
-
-#: voice.py:139
-msgid ""
-"Ops, something\n"
-"went wrong ...\n"
-"Rebooting ..."
-msgstr ""
-
-#: voice.py:143
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr ""
 
-#: voice.py:144
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr ""
 
-#: voice.py:145
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr ""
 
-#: voice.py:147
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr ""
 
-#: voice.py:149
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr ""
 
-#: voice.py:154
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "

From 49c77b7e90f62672f9040416491a6b1f2a843b1a Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Thu, 3 Oct 2019 11:43:41 +0100
Subject: [PATCH 52/62] change .travis.yml configuration

---
 .travis.yml | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 48f29dc..bf4cf07 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,6 +9,21 @@ env:
     - LANG=C
     - LC_ALL=C
 
+deploy:
+  provider: releases
+  api_key:
+    secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8="
+  skip_cleanup: true
+  file_glob: true
+  file: pwnagotchi-*.zip
+  on:
+    tags: true
+    repo: evilsocket/pwnagotchi
+
+branches:
+  only:
+    - /^v[0-9]+\.[0-9]+\.[0-9]+$/
+
 before_cache:
   - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
   - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
@@ -34,14 +49,3 @@ before_deploy:
   - git config --local user.email "evilsocket@gmail.com"
   - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)}
   - git tag $TRAVIS_TAG
-
-deploy:
-  provider: releases
-  api_key:
-    secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8="
-  skip_cleanup: true
-  file_glob: true
-  file: pwnagotchi-*.zip
-  on:
-    repo: evilsocket/pwnagotchi
-    all_branches: true

From af2e4b42246f1d17d08515f80a6f1a93efa0a39d Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 12:46:03 +0200
Subject: [PATCH 53/62] Fix de and update other langs

---
 .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po |   2 +-
 .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po | 347 +++++++-----------
 .../scripts/pwnagotchi/locale/voice.pot       |   2 +-
 3 files changed, 125 insertions(+), 226 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
index a0d7911..f2fe8fc 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 12:22+0200\n"
+"POT-Creation-Date: 2019-10-03 12:44+0200\n"
 "PO-Revision-Date: 2019-09-30 23:53+0200\n"
 "Last-Translator: kovach <2214005+kovachwt@users.noreply.github.com>\n"
 "Language-Team: \n"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
index e027a8b..a9ed2e4 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-09-29 13:42+0200\n"
+"POT-Creation-Date: 2019-10-03 12:44+0200\n"
 "PO-Revision-Date: 2019-09-29 14:00+0200\n"
 "Last-Translator: Justin-P <justin-p@users.noreply.github.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
@@ -17,29 +17,21 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: voice.py:16
+#: voice.py:18
 msgid "ZzzzZZzzzzZzzz"
 msgstr "ZzzzZZzzzzZzzz"
 
-#: voice.py:21
-msgid ""
-"Hi, I'm Pwnagotchi!"
-"Starting ..."
-msgstr ""
-"Hoi, Ik ben"
-"Pwnagotchi!"
-"Opstarten ..."
-
 #: voice.py:22
-msgid ""
-"New day, new hunt,"
-"new pwns!"
-msgstr ""
-"Nieuwe dag," 
-"nieuwe jacht,"
-"nieuwe pwns!"
+#, fuzzy
+msgid "Hi, I'm Pwnagotchi! Starting ..."
+msgstr "Hoi, Ik benPwnagotchi!Opstarten ..."
 
 #: voice.py:23
+#, fuzzy
+msgid "New day, new hunt, new pwns!"
+msgstr "Nieuwe dag,nieuwe jacht,nieuwe pwns!"
+
+#: voice.py:24
 msgid "Hack the Planet!"
 msgstr "Hack de Wereld!"
 
@@ -48,301 +40,208 @@ msgid "AI ready."
 msgstr "AI is klaar."
 
 #: voice.py:29
-msgid ""
-"The neural network"
-"is ready."
-msgstr ""
-"Neuronen netwerk"
-"is klaar voor gebruik."
+#, fuzzy
+msgid "The neural network is ready."
+msgstr "Neuronen netwerkis klaar voor gebruik."
 
-#: voice.py:39
-#, python-brace-format
-msgid ""
-"Hey, channel {channel} is"
-"free! Your AP will"
-"say thanks."
-msgstr ""
-"Hey, kanaal {channel} is"
-"vrij! Je AP zal je"
-"bedanken."
+#: voice.py:37
+#, fuzzy, python-brace-format
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
+msgstr "Hey, kanaal {channel} isvrij! Je AP zal jebedanken."
 
-#: voice.py:44
+#: voice.py:41
 msgid "I'm bored ..."
 msgstr "Ik verveel me ..."
 
-#: voice.py:45
+#: voice.py:42
 msgid "Let's go for a walk!"
 msgstr "Laten we een rondje lopen!"
 
-#: voice.py:49
-msgid ""
-"This is the best"
-"day of my life!"
-msgstr ""
-"Dit is de beste"
-"dag van mijn leven!"
+#: voice.py:45
+#, fuzzy
+msgid "This is the best day of my life!"
+msgstr "Dit is de bestedag van mijn leven!"
 
-#: voice.py:53
+#: voice.py:48
 msgid "Shitty day :/"
 msgstr "Ruk dag :/"
 
-#: voice.py:58
+#: voice.py:52
 msgid "I'm extremely bored ..."
-msgstr "Ik verveel me "
-"kapot ..."
+msgstr "Ik verveel me kapot ..."
 
-#: voice.py:59
+#: voice.py:53
 msgid "I'm very sad ..."
-msgstr "Ik ben erg" 
-"verdrietig ..."
+msgstr "Ik ben ergverdrietig ..."
 
-#: voice.py:60
+#: voice.py:54
 msgid "I'm sad"
 msgstr "Ik ben verdrietig"
 
-#: voice.py:66
+#: voice.py:59
 msgid "I'm living the life!"
-msgstr "Beter kan het leven"
-"niet worden!"
+msgstr "Beter kan het levenniet worden!"
 
-#: voice.py:67
+#: voice.py:60
 msgid "I pwn therefore I am."
 msgstr "Ik pwn daarom besta ik."
 
-#: voice.py:68
+#: voice.py:61
 msgid "So many networks!!!"
 msgstr "Zo veel netwerken!!!"
 
-#: voice.py:69
-msgid ""
-"I'm having so much"
-"fun!"
+#: voice.py:62
+#, fuzzy
+msgid "I'm having so much fun!"
 msgstr "Dit is zo leuk!"
 
-#: voice.py:70
-msgid ""
-"My crime is that of"
-"curiosity ..."
-msgstr ""
-"Mijn enige misdrijf"
-"is mijn "
-"nieuwsgierigheid ..."
+#: voice.py:63
+#, fuzzy
+msgid "My crime is that of curiosity ..."
+msgstr "Mijn enige misdrijfis mijn nieuwsgierigheid ..."
 
-#: voice.py:75
-#, python-brace-format
-msgid ""
-"Hello"
-"{name}!"
-"Nice to meet you. {name}"
-msgstr ""
-"Hallo"
-"{name}!"
-"Leuk je te ontmoeten. {name}"
+#: voice.py:67
+#, fuzzy, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
+msgstr "Hallo{name}!Leuk je te ontmoeten. {name}"
 
-#: voice.py:76
-#, python-brace-format
-msgid ""
-"Unit"
-"{name}"
-"is nearby! {name}"
-msgstr ""
-"Unit"
-"{name}"
-"is dichtbij! {name}"
+#: voice.py:68
+#, fuzzy, python-brace-format
+msgid "Unit {name} is nearby! {name}"
+msgstr "Unit{name}is dichtbij! {name}"
 
-#: voice.py:81
-#, python-brace-format
-msgid ""
-"Uhm ..."
-"goodbye"
-"{name}"
-msgstr ""
-"Uhm ..."
-"tot ziens"
-"{name}"
+#: voice.py:72
+#, fuzzy, python-brace-format
+msgid "Uhm ... goodbye {name}"
+msgstr "Uhm ...tot ziens{name}"
 
-#: voice.py:82
-#, python-brace-format
-msgid ""
-"{name}"
-"is gone ..."
-msgstr ""
-"{name}"
-"is weg"
+#: voice.py:73
+#, fuzzy, python-brace-format
+msgid "{name} is gone ..."
+msgstr "{name}is weg"
 
-#: voice.py:87
-#, python-brace-format
-msgid ""
-"Whoops ..."
-"{name}"
-"is gone."
-msgstr ""
-"Whoopsie ..."
-"{name}"
-"is weg"
+#: voice.py:77
+#, fuzzy, python-brace-format
+msgid "Whoops ... {name} is gone."
+msgstr "Whoopsie ...{name}is weg"
 
-#: voice.py:88
-#, python-brace-format
-msgid ""
-"{name}"
-"missed!"
-msgstr ""
-"{name}"
-"gemist!"
+#: voice.py:78
+#, fuzzy, python-brace-format
+msgid "{name} missed!"
+msgstr "{name}gemist!"
 
-#: voice.py:89
+#: voice.py:79
 msgid "Missed!"
 msgstr "Gemist!"
 
-#: voice.py:94
-msgid ""
-"Nobody wants to"
-"play with me ..."
-msgstr ""
-"Niemand wil met"
-"mij spelen ..."
+#: voice.py:83
+#, fuzzy
+msgid "Nobody wants to play with me ..."
+msgstr "Niemand wil metmij spelen ..."
 
-#: voice.py:95
+#: voice.py:84
 msgid "I feel so alone ..."
 msgstr "Zo alleen ..."
 
-#: voice.py:96
+#: voice.py:85
 msgid "Where's everybody?!"
 msgstr "Waar is iedereen?!"
 
-#: voice.py:101
+#: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
 msgstr "Dutje doen voor {secs}s ..."
 
-#: voice.py:102
+#: voice.py:90
 msgid "Zzzzz"
 msgstr "Zzzzz"
 
-#: voice.py:103
+#: voice.py:91
 #, python-brace-format
 msgid "ZzzZzzz ({secs}s)"
 msgstr ""
 
-#: voice.py:112
+#: voice.py:98
 #, python-brace-format
 msgid "Waiting for {secs}s ..."
 msgstr "Even {secs}s wachten ..."
 
-#: voice.py:114
+#: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
 msgstr "Rond kijken ({secs}s)"
 
+#: voice.py:106
+#, fuzzy, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr "Hey{what}Laten we vriendenworden!"
+
+#: voice.py:107
+#, fuzzy, python-brace-format
+msgid "Associating to {what}"
+msgstr "Verbinden met{what}"
+
+#: voice.py:108
+#, python-brace-format
+msgid "Yo {what}!"
+msgstr ""
+
+#: voice.py:112
+#, fuzzy, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr "Ik vind dat{mac}genoeg WiFiheeft gehad!"
+
+#: voice.py:113
+#, fuzzy, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr "De-autoriseren{mac}"
+
+#: voice.py:114
+#, fuzzy, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr "Ik ga{mac}even kicken!"
+
+#: voice.py:118
+#, fuzzy, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr "Gaaf, we hebben {num}nieuwe handshake{plural}!"
+
 #: voice.py:121
-#, python-brace-format
-msgid ""
-"Hey"
-"{what}"
-"let's be friends!"
-msgstr ""
-"Hey"
-"{what}"
-"Laten we vrienden"
-"worden!"
+#, fuzzy
+msgid "Ops, something went wrong ... Rebooting ..."
+msgstr "Oops, ietsging fout ...Rebooting ..."
 
-#: voice.py:122
-#, python-brace-format
-msgid ""
-"Associating to"
-"{what}"
-msgstr ""
-"Verbinden met"
-"{what}"
-
-#: voice.py:123
-#, python-brace-format
-msgid ""
-"Yo"
-"{what}!"
-msgstr ""
-
-
-#: voice.py:128
-#, python-brace-format
-msgid ""
-"Just decided that"
-"{mac}"
-"needs no WiFi!"
-msgstr "Ik vind dat"
-"{mac}"
-"genoeg WiFi"
-"heeft gehad!"
-
-#: voice.py:129
-#, python-brace-format
-msgid ""
-"Deauthenticating"
-"{mac}"
-msgstr ""
-"De-autoriseren"
-"{mac}"
-
-#: voice.py:130
-#, python-brace-format
-msgid ""
-"Kickbanning"
-"{mac}!"
-msgstr ""
-"Ik ga"
-"{mac}"
-"even kicken!"
-
-#: voice.py:135
-#, python-brace-format
-msgid ""
-"Cool, we got {num}"
-"new handshake{plural}!"
-msgstr ""
-"Gaaf, we hebben {num}"
-"nieuwe handshake{plural}!"
-
-#: voice.py:139
-msgid ""
-"Ops, something"
-"went wrong ..."
-"Rebooting ..."
-msgstr ""
-"Oops, iets"
-"ging fout ..."
-"Rebooting ..."
-
-#: voice.py:143
+#: voice.py:124
 #, python-brace-format
 msgid "Kicked {num} stations\n"
 msgstr "{num} stations gekicked\n"
 
-#: voice.py:144
+#: voice.py:125
 #, python-brace-format
 msgid "Made {num} new friends\n"
 msgstr "{num} nieuwe vrienden\n"
 
-#: voice.py:145
+#: voice.py:126
 #, python-brace-format
 msgid "Got {num} handshakes\n"
 msgstr "{num} nieuwe handshakes\n"
 
-#: voice.py:147
+#: voice.py:128
 msgid "Met 1 peer"
 msgstr "1 peer ontmoet"
 
-#: voice.py:149
+#: voice.py:130
 #, python-brace-format
 msgid "Met {num} peers"
 msgstr "{num} peers ontmoet"
 
-#: voice.py:154
+#: voice.py:135
 #, python-brace-format
 msgid ""
 "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
 "{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
 "#pwnlog #pwnlife #hacktheplanet #skynet"
 msgstr ""
-"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb ook "
-"{associated} nieuwe vrienden gevonden en heb {handshakes} handshakes gegeten! "
-"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
\ No newline at end of file
+"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb "
+"ook {associated} nieuwe vrienden gevonden en heb {handshakes} handshakes "
+"gegeten! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
index 2d07413..5ae228a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 12:22+0200\n"
+"POT-Creation-Date: 2019-10-03 12:44+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"

From 78131380634899807c9b33e77e2fdbbafb6904f4 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 12:50:55 +0200
Subject: [PATCH 54/62] new: if ui.fps is set to 0, the display will only be
 updated for major data changes

---
 sdcard/rootfs/root/pwnagotchi/config.yml      |  5 +++-
 .../pwnagotchi/scripts/pwnagotchi/agent.py    |  6 ++---
 .../pwnagotchi/scripts/pwnagotchi/ui/state.py | 25 ++++++++++++++++--
 .../pwnagotchi/scripts/pwnagotchi/ui/view.py  | 26 ++++++++++++-------
 4 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml
index 7cf1c6f..cc2ea20 100644
--- a/sdcard/rootfs/root/pwnagotchi/config.yml
+++ b/sdcard/rootfs/root/pwnagotchi/config.yml
@@ -91,7 +91,10 @@ personality:
 
 # ui configuration
 ui:
-    # ePaper display can update every 3 secs anyway
+    # ePaper display can update every 3 secs anyway, set to 0 to only refresh for major data changes
+    # IMPORTANT: The lifespan of an eINK display depends on the cumulative amount of refreshes. If you want to
+    # preserve your display over time, you should set this value to 0.0 so that the display will be refreshed only
+    # if any of the important data fields changed (the uptime and blinking cursor won't trigger a refresh).
     fps: 0.3
     display:
         enabled: true
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
index 739d6ed..9dcb7fb 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py
@@ -347,13 +347,13 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
                     if key not in self._handshakes:
                         self._handshakes[key] = h
                         new_shakes += 1
-                        apsta = self._find_ap_sta_in(sta_mac, ap_mac, s)
-                        if apsta is None:
+                        ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s)
+                        if ap_and_station is None:
                             core.log("!!! captured new handshake: %s !!!" % key)
                             self._last_pwnd = ap_mac
                             plugins.on('handshake', self, filename, ap_mac, sta_mac)
                         else:
-                            (ap, sta) = apsta
+                            (ap, sta) = ap_and_station
                             self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
                                 'hostname'] != '<hidden>' else ap_mac
                             core.log("!!! captured new handshake on channel %d: %s (%s) -> %s [%s (%s)] !!!" % ( \
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
index c5b66be..0a9e37a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py
@@ -6,9 +6,11 @@ class State(object):
         self._state = state
         self._lock = Lock()
         self._listeners = {}
+        self._changes = {}
 
     def add_element(self, key, elem):
         self._state[key] = elem
+        self._changes[key] = True
 
     def add_listener(self, key, cb):
         with self._lock:
@@ -22,10 +24,29 @@ class State(object):
         with self._lock:
             return self._state[key].value if key in self._state else None
 
+    def reset(self):
+        with self._lock:
+            self._changes = {}
+
+    def changes(self, ignore=()):
+        with self._lock:
+            changes = []
+            for change in self._changes.keys():
+                if change not in ignore:
+                    changes.append(change)
+            return changes
+
+    def has_changes(self):
+        with self._lock:
+            return len(self._changes) > 0
+
     def set(self, key, value):
         with self._lock:
             if key in self._state:
                 prev = self._state[key].value
                 self._state[key].value = value
-                if key in self._listeners and self._listeners[key] is not None and prev != value:
-                    self._listeners[key](prev, value)
+
+                if prev != value:
+                    self._changes[key] = True
+                    if key in self._listeners and self._listeners[key] is not None:
+                        self._listeners[key](prev, value)
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
index 82c52ad..0c5eb8a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py
@@ -78,7 +78,6 @@ class View(object):
                                    label_font=fonts.Bold,
                                    text_font=fonts.Medium),
 
-
             'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK),
             'line2': Line(
                 [0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)],
@@ -111,7 +110,12 @@ class View(object):
 
         plugins.on('ui_setup', self)
 
-        _thread.start_new_thread(self._refresh_handler, ())
+        if config['ui']['fps'] > 0.0:
+            _thread.start_new_thread(self._refresh_handler, ())
+            self._ignore_changes = ()
+        else:
+            core.log("ui.fps is 0, the display will only update for major changes")
+            self._ignore_changes = ('uptime', 'name')
 
     def add_element(self, key, elem):
         self._state.add_element(key, elem)
@@ -311,13 +315,17 @@ class View(object):
 
     def update(self):
         with self._lock:
-            self._canvas = Image.new('1', (self._width, self._height), WHITE)
-            drawer = ImageDraw.Draw(self._canvas)
+            changes = self._state.changes(ignore=self._ignore_changes)
+            if len(changes):
+                self._canvas = Image.new('1', (self._width, self._height), WHITE)
+                drawer = ImageDraw.Draw(self._canvas)
 
-            plugins.on('ui_update', self)
+                plugins.on('ui_update', self)
 
-            for key, lv in self._state.items():
-                lv.draw(self._canvas, drawer)
+                for key, lv in self._state.items():
+                    lv.draw(self._canvas, drawer)
 
-            for cb in self._render_cbs:
-                cb(self._canvas)
+                for cb in self._render_cbs:
+                    cb(self._canvas)
+
+                self._state.reset()

From 54ddbab95192a8db220ac289e466b7d3b3976ff8 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 12:55:18 +0200
Subject: [PATCH 55/62] Add qemu 4.1

---
 .travis.yml | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index bf4cf07..d48b5ec 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,18 +24,20 @@ branches:
   only:
     - /^v[0-9]+\.[0-9]+\.[0-9]+$/
 
-before_cache:
-  - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt
-  - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete
-
 cache:
   apt: true
   directories:
-    - tmp/
+    - qemu-4.1.0
 
 before_script:
+  - test -d qemu-4.1.0 || ( wget https://download.qemu.org/qemu-4.1.0.tar.xz && tar xvJf qemu-4.1.0.tar.xz )
+  - cd qemu-4.1.0
+  - ./configure --target-list=arm-softmmu
+  - make -j$(nproc)
+  - sudo make install
+  - cd $TRAVIS_BUILD_DIR
   - sudo apt-get -y update
-  - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx
+  - sudo apt-get -y install qemu-user-static binfmt-support bmap-tools kpartx
   - sudo update-binfmts --display
 
 script:

From a1442e05408172787e89296bbc36990443872a50 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Thu, 3 Oct 2019 11:59:59 +0100
Subject: [PATCH 56/62] add display information to README

---
 README.md | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 7f23677..002d736 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,22 @@ The supported models are:
 - [Pimoroni Inky pHAT](https://shop.pimoroni.com/products/inky-phat)
 - [PaPiRus eInk Screen](https://uk.pi-supply.com/products/papirus-zero-epaper-screen-phat-pi-zero)
 
+The only kind of displays supported are the ones listed above, but we are always happy to receive pull requests supporting new displays.
+
+One thing to note, not all displays are created equaly, TFT displays for example work similar to an HDMI display, and they are not supported, currently all the displays supported are I2C displays.
+
+### Color and Black & White displays
+
+Some of the supported displays support Black & White and Coloured versions, one common question is regarding refresh speed of said displays.
+
+Color displays have a much slower refresh rate, in some cases it can take up to 15 seconds, if slow refresh rates is something that you want to avoid we advise you to use Black & White displays
+
+### FPS
+
+You can configure the refresh interval of the display on config.yml, we advise to use a slow refresh to not shorten the lifetime of your display.
+
+Another option is to change fps to 0, which will only refresh when changes are made to the screen.
+
 ### Software
 
 - Raspbian + [nexmon patches](https://re4son-kernel.com/re4son-pi-kernel/) for monitor mode, or any Linux with a monitor mode enabled interface (if you tune config.yml).
@@ -152,8 +168,8 @@ Now you can use the `preview.py`-script to preview the changes:
 ### Plugins
 
 Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere
-as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default 
-plugins and all the callbacks that you can define for your own customizations. 
+as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default
+plugins and all the callbacks that you can define for your own customizations.
 
 Here's as an example the GPS plugin:
 

From d4a45f1b4391ffcefed8e923257660c868043e97 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 13:03:10 +0200
Subject: [PATCH 57/62] release script

---
 scripts/release.sh                            | 28 +++++++++++++++++++
 .../pwnagotchi/scripts/pwnagotchi/__init__.py |  2 --
 .../pwnagotchi/scripts/pwnagotchi/version.py  |  1 +
 3 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100755 scripts/release.sh
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py

diff --git a/scripts/release.sh b/scripts/release.sh
new file mode 100755
index 0000000..d5d34b3
--- /dev/null
+++ b/scripts/release.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+# nothing to see here, just a utility i use to create new releases ^_^
+
+VERSION_FILE=$(dirname "${BASH_SOURCE[0]}")/../sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
+echo "version file is $VERSION_FILE"
+CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d '"' -f 2)
+TO_UPDATE=(
+  $VERSION_FILE
+)
+
+echo -n "current version is $CURRENT_VERSION, select new version: "
+read NEW_VERSION
+echo "creating version $NEW_VERSION ...\n"
+
+for file in "${TO_UPDATE[@]}"
+do
+    echo "patching $file ..."
+    sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" $file
+    git add $file
+done
+
+git commit -m "releasing v$NEW_VERSION"
+git push
+git tag -a v$NEW_VERSION -m "release v$NEW_VERSION"
+git push origin v$NEW_VERSION
+
+echo
+echo "All done, v$NEW_VERSION released ^_^"
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
index ff43494..dacb09c 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
@@ -1,7 +1,5 @@
 import subprocess
 
-version = '1.0.0a'
-
 _name = None
 
 
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
new file mode 100644
index 0000000..022e5cc
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
@@ -0,0 +1 @@
+version = '1.0.0a'

From 5a067aaaee1abc8e90891ed6f3290ae4562597d5 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <caquino@users.noreply.github.com>
Date: Thu, 3 Oct 2019 12:09:56 +0100
Subject: [PATCH 58/62] Extende version tags to support RC and other names

This PR extends the version tag on travis to allow RC and other builds
---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index d48b5ec..fcaee05 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,7 +22,7 @@ deploy:
 
 branches:
   only:
-    - /^v[0-9]+\.[0-9]+\.[0-9]+$/
+    - /^v[0-9]+\.[0-9]+\.[0-9]+[A-Za-z0-9]+?$/
 
 cache:
   apt: true

From 664b2407ebc1b8d8231f3890af3b26394fe708d4 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 13:18:15 +0200
Subject: [PATCH 59/62] Fix italian

---
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 2021 -> 3679 bytes
 .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 148 +++++-------------
 .../scripts/pwnagotchi/locale/voice.pot       |   2 +-
 3 files changed, 40 insertions(+), 110 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo
index 0dca8ac1b61291b4b6db73cdd11f27f489e22303..be9d4b19c95c5d6754d793353e8f3454c26e3c9e 100644
GIT binary patch
literal 3679
zcmb`JON=8&8GxG*9x;zRcm%>D)l9-<cgJ4Ot{}S;LYT}f*@2nOWM`6Pg@jb@uCWWZ
zyPU3W8)xJz;slrE!YQ{TkP|r(a>~E~4oJBnfk22O7f=r5g!uk)+un)xNNYV`KdS!s
z|JVNYzB^xvxX$wXBERedQS=ym>kj^Kz52l@x(mJrKLg)@XW;Ma=Xc>(dA{q;+5R@X
z#Pc3h@W=2|@D(Wge*-@O-+}kTzt#K?{4~#Ze<+GR0w03+z%}?Ld>o3N_uzf-!4F5#
zXW<1X`*z^x;18h49m59v8N3_*9E#ju)Zc#v70-Ww=ion~*mXaP#NLOY#N#ql@Hr^@
z#_&t<r%?2~4rTps;REnbQ1reF#m@i2Pr`dYN{ooDg7W<=L0y4ggDrRyioBn|ufUg~
z=sAHB&%eVn@Buc99otas{XYCSwD8Mt1ZCe#Q1re5KL+215~n}H-@$*tb@&<|#m_%O
z(f=NN5Z;5(RoI5&$M@j9un$H5wC0QOVV-{pW#2nc{P{POeF`Hb?-!xOX9u2#DU^LL
z!Wg~@C60fAqUT>w!8>pQQ==95dDw!Y|0*P$L8tgj`Goj90>xj&PvXI{P#0p${1SO$
zi(FD;5Al;4AvKFjd>6YYi*QL!=9lQF3?oWETxa?F1%BeE#8T`RTjdg;B<_?!$QNmh
z>edSNEHRfjy#FG6;gT8&*XE8Yj7}%5Xw!R_SY6t@t4gPi$30z6qb=vMH8nP>>q>Q;
zSA(g_%~<txp8B5do8w_t6*`;7(Nl{Bi;un$T{T&Tuv`z!G*;JaVnq1Bm{Lt#)vCX+
zY*K4fnJHJj>KJuYSc8^WKCY<*skzD2aeXsY*0aQzSlx70p*Hu`*k+mXdZJ3!_I)e5
zYS+}x>Ok#}bB+B;&&KMY)J5>I)oMjM>c}9|JEb$18#Q}39OsBIg*kGCQ9DWxSc#Yp
zkLhd;Pv%EuVFo6fyzhNak0gZ198^h99aVW8c4s!cN3hE5k(s^pIt?F3rkG&*T>8im
z0Fx^$5n0%wj#J`XT9;21u~&VY^fBf*HM&A%I#o$VxJn=6G23+}1`y?AUFTKSNb2ga
z1}VBU>Uf#1=`yd#SwVXpws4=h?u=NkR(d+=qj;F<94#xpKY`JADqpJ9BsRr3(t!Sf
zPDHUuy~>@sVZUwT=(||oA)n%0STK7f4uul)WpI`H*$vgubs+{?jdj+Kqh06vvQ-zZ
zA{LJvdz1L7KNIcg6o(d7TD#ha_Aqf>4UH+n?QDfS`e@I3Z_+rrria5ttY`8<s;{|@
zOD8BMwo<w{%#$s9L^mvWdg#~4HnHx>{xL~V<HB)EHL2^S<J_X&4tlmMCn`n6#`)-g
z4C#DAaLTbO`aX{1=#cWrjkMJKwbXgtqK7^1`6o5hF%oG6xg#~0)Ft(7ZxFP0ol83t
z35E1s^lWaWdF5WV=SCNuNj(30L)&0rsIpr;zacF^D;g<I3BnU`bff3o&<7n$d0kqk
z72TZAj5s>|DMYD$HK?P#U$`Hdq-^e_&F9DhWxb)=t#)g@aor4EQ8xE{*QU)UtFCVz
zx((IXf4X_yjI69|Zd0}!>Oy<{a&x`iY+q38k8WIOpKEh9c6HvZbk{TwjUH@B1I<hL
z8y7FGUw-uK7uV0FI@P0ZRUXByoSq(LlUA3ER-IPj2H#xB*ig3Anbmn?Z)fky($Mu*
zyRqf+l1w)bCqry083yO644XeDgR1bRe7q`;nwOUA3Z45SQ#7ySiAyPz4Rxtw%SN=b
zsfJWbsawq2EHhoQlv8Jk%jXl(<~$YN$#i<s<YrCjPRHtj%vBl4iw2$#W5tf4J^8g{
z;?x3<F5@}Wx2#@H<twYIk_|c`;kOydvD&sHj0!6Cz$SEXn8`L%iOzLKp)IEJ$*a_2
z#}tl1l&P|EGMNh;F7yjloJ4c1_GijYP3A3K*rfJeT-~$E*P-wyuhU{#h`>J6*%V9!
zUon@rq+guXp~wy#6NbKEE(bY`!CXEP&bdHtQ=BPCUg}gyS5uL8;Nqpaksa|EWR->W
zrJ3CiT*l_v8<BR^sZ5U?Lz$sqP7P=i!pxyUc(TOac1p8d=LyzZ3L-CqnB}ZyVpeWs
zIeLh;GO8CwMK`$ee;wFj#&BqI9i}#ChL}{(Y$`A}i6K5EpKU$655(Vs@P!C2T$C|C
zuQ$f`3pA=FE;7kYBihW<S@ozR&6!%EZ^*%9y5f?Kqix4KQcCX@<mLIw5|`2yxupD-
z0bkGdWo#PJY_8uD#=7XkcwfG@(G@xVw;hM0H$*m1$z1$IbijWLbdp%HfF_{KES7|f
z-ZBiY5eBhvR5{AMYh5CKNRtkXR6{rgp07x^^IFjaGx^Hn1OXE-u3J4Cp+=TJWyLoM
z>cAAKmeb%Fd}iN}Q#^bqOi7>ZYKA|j^z2M9VMRSIo~ekglQ;CCv^!@)CZ+|+{J%@9
z0gW*tdz>tBG(Q}4nqtLlAg{4R4k5B$Xe*ZOuF7d~@^ZaE#E+=KTrbXxO+PdxitAH1
r_%jQuv|m}3r9E|0)T7_y#Ofk2w>vLRuLyGMy=?Q0<{^_c%z*y^KdkZI

delta 721
zcmZ9}O=}ZD7{Kv~rcE+U>`ROh40iNTv4kxYuO5m8Uk)A=!Hb90Ea_6+i96XtC?#K@
zco|yM4`2{H=}m;5^x)Nc5m6NS4MfG0|7Q~~4orSCyR-AW<ZJ72cKBtXxT_dVW{Y{i
zTx9MP_+gZfC{@7<Hn5I$JU`iA#2WjXD0hT-90yp!M>vOj_!>ue0`DHp&kfap#Ys7c
za={2S?&B=JN4e<J<o$P)fPYXDDHkWnqwFtWh2*cG+;d}U{QeF~;0)#a9jvOMQcqc&
z=D`S$;X9nck0_OV!?*YoCBZk-;|?9*Ircwr0b67_k1HsF)+XM@CH5BO+#X6NpJSc)
zYM+IC_yMKsbSSSF@<CihF?rVVKrWF=Wk`iGq{ZcYH4ZL`N)a?kkzd})DoUJxLy~Aq
zg;KTr$7=1WNu#hc2-IcUH(N>eVB2hjNylx3n~~H0S@D*yPaXQz>BqiVI_qDQ+OJHx
zQE2{u)b!HG#oAxe>opxFiH*a)H9-*gm-?6gJ+s`_z0kR++vP=gMy*?uCDyoZ7N#Am
vA7-(MlfF$8%QxCzuU;!?|D?Lu(7o8%`!Q#GQEIkabkA)&f2tPv&$Xq$#|vhF

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
index 0123244..7ef4d8d 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 12:22+0200\n"
+"POT-Creation-Date: 2019-10-03 13:10+0200\n"
 "PO-Revision-Date: 2019-10-02 17:20+0000\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
 "Language: italian\n"
@@ -20,19 +20,13 @@ msgid "ZzzzZZzzzzZzzz"
 msgstr ""
 
 #: voice.py:22
-#, fuzzy
 msgid "Hi, I'm Pwnagotchi! Starting ..."
-msgstr ""
-"Ciao!\n"
-"Piacere Pwnagotchi!\n"
-"Caricamento ..."
+msgstr "Ciao! Piacere Pwnagotchi! Caricamento ..."
 
 #: voice.py:23
 #, fuzzy
 msgid "New day, new hunt, new pwns!"
-msgstr ""
-"Nuovo giorno...\n"
-"nuovi handshakes!!!"
+msgstr "Nuovo giorno...nuovi handshakes!!!"
 
 #: voice.py:24
 msgid "Hack the Planet!"
@@ -43,19 +37,13 @@ msgid "AI ready."
 msgstr "IA pronta."
 
 #: voice.py:29
-#, fuzzy
 msgid "The neural network is ready."
-msgstr ""
-"La rete neurale\n"
-"è pronta."
+msgstr "La rete neurale è pronta."
 
 #: voice.py:37
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hey, channel {channel} is free! Your AP will say thanks."
-msgstr ""
-"Hey, il canale {channel} è\n"
-"libero! Il tuo AP\n"
-"ringrazia."
+msgstr "Hey, il canale {channel} è libero! Il tuo AP ringrazia."
 
 #: voice.py:41
 msgid "I'm bored ..."
@@ -64,16 +52,11 @@ msgstr "Che noia ..."
 #: voice.py:42
 msgid "Let's go for a walk!"
 msgstr ""
-"Andiamo a fare una\n"
-"passeggiata!"
+"Andiamo a fare una passeggiata!"
 
 #: voice.py:45
-#, fuzzy
 msgid "This is the best day of my life!"
-msgstr ""
-"Questo è il più bel\n"
-"giorno della mia\n"
-"vita!!!!"
+msgstr "Questo è il più bel giorno della mia vita!!!!"
 
 #: voice.py:48
 msgid "Shitty day :/"
@@ -81,9 +64,7 @@ msgstr "Giorno di merda :/"
 
 #: voice.py:52
 msgid "I'm extremely bored ..."
-msgstr ""
-"Sono estremamente\n"
-"annoiato ..."
+msgstr "Sono estremamente annoiato ..."
 
 #: voice.py:53
 msgid "I'm very sad ..."
@@ -106,75 +87,50 @@ msgid "So many networks!!!"
 msgstr "Qui è pieno di reti!"
 
 #: voice.py:62
-#, fuzzy
 msgid "I'm having so much fun!"
-msgstr ""
-"Mi sto divertendo\n"
-"tantissimo!"
+msgstr "Mi sto divertendo tantissimo!"
 
 #: voice.py:63
 msgid "My crime is that of curiosity ..."
 msgstr ""
 
 #: voice.py:67
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hello {name}! Nice to meet you. {name}"
-msgstr ""
-"Ciao\n"
-"{name}!\n"
-"E' un piacere. {name}"
+msgstr "Ciao {name}! E' un piacere. {name}"
 
 #: voice.py:68
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Unit {name} is nearby! {name}"
-msgstr ""
-"L'Unità\n"
-"{name}\n"
-"è vicina! {name}"
+msgstr "L'Unità {name} è vicina! {name}"
 
 #: voice.py:72
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Uhm ... goodbye {name}"
-msgstr ""
-"Uhm ...\n"
-"addio\n"
-"{name},\n"
-"mi mancherai..."
+msgstr "Uhm ... addio {name}, mi mancherai..."
 
 #: voice.py:73
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "{name} is gone ..."
-msgstr ""
-"{name}\n"
-"se n'è andato ..."
+msgstr "{name} se n'è andato ..."
 
 #: voice.py:77
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Whoops ... {name} is gone."
-msgstr ""
-"Whoops ...\n"
-"{name}\n"
-"se n'è andato."
+msgstr "Whoops ...{name} se n'è andato."
 
 #: voice.py:78
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "{name} missed!"
-msgstr ""
-"{name}\n"
-"è scomparso..."
+msgstr "{name} è scomparso..."
 
 #: voice.py:79
 msgid "Missed!"
-msgstr ""
-"Ehi!\n"
-"Dove sei andato!?"
+msgstr "Ehi! Dove sei andato!?"
 
 #: voice.py:83
-#, fuzzy
 msgid "Nobody wants to play with me ..."
-msgstr ""
-"Nessuno vuole\n"
-"giocare con me..."
+msgstr "Nessuno vuole giocare con me..."
 
 #: voice.py:84
 msgid "I feel so alone ..."
@@ -187,9 +143,7 @@ msgstr "Dove sono tutti?!"
 #: voice.py:89
 #, python-brace-format
 msgid "Napping for {secs}s ..."
-msgstr ""
-"Schiaccio un \n"
-"pisolino per {secs}s ..."
+msgstr "Schiaccio un pisolino per {secs}s ..."
 
 #: voice.py:90
 msgid "Zzzzz"
@@ -208,42 +162,27 @@ msgstr "Aspetto {secs}s ..."
 #: voice.py:100
 #, python-brace-format
 msgid "Looking around ({secs}s)"
-msgstr ""
-"Do uno sguardo\n"
-"qui intorno...\n"
-"({secs}s)"
+msgstr "Do uno sguardo qui intorno... ({secs}s)"
 
 #: voice.py:106
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hey {what} let's be friends!"
-msgstr ""
-"Hey\n"
-"{what}\n"
-"Diventiamo amici!"
+msgstr "Hey {what}! Diventiamo amici!"
 
 #: voice.py:107
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Associating to {what}"
-msgstr ""
-"Collegamento con\n"
-"{what}\n"
-"in corso..."
+msgstr "Collegamento con {what} in corso..."
 
 #: voice.py:108
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Yo {what}!"
-msgstr ""
-"Yo\n"
-"{what}!"
+msgstr "Yo {what}!"
 
 #: voice.py:112
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Just decided that {mac} needs no WiFi!"
-msgstr ""
-"Ho appena deciso che\n"
-"{mac}\n"
-"non necessita di\n"
-"WiFi!"
+msgstr "Ho appena deciso che {mac} non necessita di WiFi!"
 
 #: voice.py:113
 #, python-brace-format
@@ -251,27 +190,18 @@ msgid "Deauthenticating {mac}"
 msgstr ""
 
 #: voice.py:114
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Kickbanning {mac}!"
-msgstr ""
-"Sto prendendo\n"
-"a calci\n"
-"{mac}!"
+msgstr "Sto prendendo a calci {mac}!"
 
 #: voice.py:118
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Cool, we got {num} new handshake{plural}!"
-msgstr ""
-"Bene, abbiamo {num}\n"
-"handshake{plural} in più!"
+msgstr "Bene, abbiamo {num} handshake{plural} in più!"
 
 #: voice.py:121
-#, fuzzy
 msgid "Ops, something went wrong ... Rebooting ..."
-msgstr ""
-"Ops, qualcosa\n"
-"è andato storto ...\n"
-"Riavvio ..."
+msgstr "Ops, qualcosa è andato storto ... Riavvio ..."
 
 #: voice.py:124
 #, python-brace-format
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
index 5ae228a..53f3557 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-03 12:44+0200\n"
+"POT-Creation-Date: 2019-10-03 13:10+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"

From 176889eb46427fea8e078767879f20ede654de21 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Thu, 3 Oct 2019 13:22:27 +0200
Subject: [PATCH 60/62] Fix nl

---
 .../pwnagotchi/locale/nl/LC_MESSAGES/voice.mo | Bin 3947 -> 3875 bytes
 .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po |  70 ++++++++----------
 2 files changed, 31 insertions(+), 39 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo
index 3261c2e92496174303bad5f44f30b8d89b7a9a85..b4db747197b3123cda75e98a56305f862afe0370 100644
GIT binary patch
delta 1651
zcmY+@UuYav6vy$Ky2)-f%_dD_^S9~QTAMamSCqE+7flgNinO&-tDp~)?9J|^yEArY
z+I1Vk>We}ZDvVJ?g`%a1QXeW+6nv}Vi&F4GkRsSVD2QMm^g)ICJ(EeWm&|<b-pt%N
z=Qq2*jlDnC`l&CqY#2q3QI1#JjCm0MUB`*>$1TQm;&r?g|G}NOA!W=aydQP_5cXmP
zw__7^zcY9beu;vA;YJ*2kMC=lNhaMaOyK|?NGxMNpIey5*HItv4t{~>Q6E(4Fs2Vr
zqZafY>V2Q%Aby9s?=P6e8`y(cHcgwBF~dysf~}|(--m)na1x(KE$}RA<rh$|`x*tW
zp*}d3F=jK4pze1s>h+J~Fj~yv3rOweH1_d)vz+|n1KdmepW%Ae|0Z|sBu&|O;wb9p
z$51<SP&+w^6L<=@;YHkyKjQ7!+qKfb9@N4f!43EfwsgT`q8q)0TkwtKf=^K&^bKCd
zpHbia1*+5aD~W%ic9<h3{Vwc8P2?fej-NzL!XjarCXV2X-Q>TW$-69QbeB*ozKRrY
zGTf~lZ$!Or2i}GUPzw)G3w{N)ppQ_$3zu*Re?b1sbxs<&cFESJ19iQ>hx|!A9$PtU
ze7e!<&`mU|)uF}c&|-B19h%%^JfmRL0`>Lj;KvdtG8TVYX-*T=bTqL$^!@XiSE|E2
zhYpgC$Bx7a)XsE_a|j1t<TxemNaNIm3LN^&)h{T&v^XXG)f722DSZw43e41u)U8wM
zYZlE^5cqSh6S`hmLSLf0QbTPL?MsbwK9;(>Qx-j^W|#63eV7_;$zr48giBJj;dmgk
zR_5!j^-4kBOxtEb<|>Zo*{UoilO=HjF0nQ*Py5H~GIdZIZnY|b)0B{Fj|N3E?G|Ka
zye0=5o>TV2xr&>YCqkzlS5zz(&5X=j_6&S+qKDg$P}iI7H`20LbLN&Ldb?wom5UuO
zN6)4wM#QrXd9LA6(0+f`FEyp%cwrECb|$^0R~ps}rBV0kmc1qVHoceIdoshjq(o8v
zywsXfb?0r~9In*jYs$V~nr+%72y@tT!(=YeQ<>?^+J|$QZT;GC+4rp8X;z|>=t}1I
zbzU{P+<9U!3D7+1IP(Rnk&2z2wVp(;Wj96j>>$OQ%I^AK>R)9go7_~8Y9w7l(Y5Tr
z9yw8W7xJ>tYNjWhsw`MuM~O(SN2b1pdXyFKrd&VS-?iMf7TvGwH?PgJ-ET$TcaQgo
z=i1|xwcyNE!h%HU+-^#GAa{)O`5gVN^mKCyS96Eb+IYj3qmMJA1Ic`~|FW&QL6|rH
E0hSOFasU7T

delta 1779
zcmYk5U1%It7=};mCYz?&jg3v)jWIbJqZ{qIk=RO$B51)THK{=?#h+4UcfXxE$<B<<
z%y!(ykWwhU5|pV`spO_ticpFdQVD|Sl~+PR3W^uvMOC6+c_E0t@9YXWaOOF`-_QG<
zxi<dW`1+5-nRgZ14Eh-Q<sPMuf`dEoLEE2EYA09#_kj0<)8Jun1hl%0!Mibk3!DNs
zz{kO_z)|pTZ~`3ZRq7t_5QzKhY950e7S4eCKo{H#UIgjzLof^80O{Z+_&N9uNJkg@
zl-dn`4D#M4$a}ZI{ooytc6(rC04#t*;1rmJe{~Q8jfE#c9y|@+3${Q;{0{gKcmrgh
z--FEH7m(-v0eP;_-*J2d<oXGa_Lf1OzW_3zD_|bH4)(&o`T_%H@HI#W-+{+ahM&Pf
z%*zOy29AIgaIrgo6QsenL1y$3I1Sze9|L~^i{Rc}C>wYfr2SXHG%#?TjxTf<E`v1m
z3CN5#LGJ$m($VkWw_p}gmB8B|C8t&H?*m!uM?t=g=RodTATxdgWFnV9h^DUQpg$kp
zH7roFTOe!t2Y4U22e&w%1(A$81+unP@If#JC&3Mnj=ltW?>5MQ{sM==A!Nn*B#0&T
z1c>LOjt@b9O1y*x_*ADsD4)uF0Hg}r8;vm_HjU1ogl{8*{s1~{Fc4<X#%vkTU7U2=
zBOujd0tMC|Wlm*dt@x{LZ~P@$0@jO-S@17FoC*&+tv8UW!;JoKl$T1ejdzf~filKa
zjEzb#IEAvN@>7W!^oP;YmTc`9E3C$j6|JeGzTYhCShVd&dev*WYsplmlq_UsCssYn
zm9^ptQxhHe+7*d(+iz8Hj2p>jW^|zuh!pipek;&VFX`Aco1xX#kz;u)VMWbJyW^%Q
zQ7P0_(T%`}R}YJ7&Xo0h$<<4-XTf#NF~ww{*H6y%{@c6iTD7(0eBWqtweON%Z0lNJ
zT+t?^;Yj<9S}QPqXri{RR4Pd^dmvfN77{x<k&nfTbR77eoo-#pJ~NMNfmro+MZM@?
zoLUjY5=M1|>Nm98)=krpqB`lgyk+}-z1o&emg=NuqHe;a{<(Z-2qU)dNhSF+KQ`Q*
z@T%&byxzZ+70+&(&`CCSo*nCoeax~Nso0KGtKxO_o*kG@UKu!;?c6OU?+@tpvR<(~
z%WCS?8npDJxrV^c24=aaj|-(fhrMN~N*zjzw@vB=D}rSd6sIAzc(EVg3&nj(zJkoX
zZK6N_S{PXYuQ2?VeQh<HBA-6BYrUtG*1;Cf7h9h)&l*Rh5ouc-t6o&FWLup|-5LB~
zX3;ErT0CQmc1>7Eqz&lea@8}^ibLB-U~ETBJ*~|7+;lG85WQ^GoT!|9mOGSe<z7$D
f<fnFbq}Z<gd-)fVU-OeAFdB>9)!7#Kii+w#!-hq`

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
index a9ed2e4..ce55a63 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po
@@ -3,7 +3,6 @@
 # This file is distributed under the same license as the pwnagotchi package.
 # FIRST AUTHOR justin-p@users.noreply.github.com, 2019.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.1\n"
@@ -12,7 +11,7 @@ msgstr ""
 "PO-Revision-Date: 2019-09-29 14:00+0200\n"
 "Last-Translator: Justin-P <justin-p@users.noreply.github.com>\n"
 "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
-"Language: english\n"
+"Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -22,14 +21,12 @@ msgid "ZzzzZZzzzzZzzz"
 msgstr "ZzzzZZzzzzZzzz"
 
 #: voice.py:22
-#, fuzzy
 msgid "Hi, I'm Pwnagotchi! Starting ..."
-msgstr "Hoi, Ik benPwnagotchi!Opstarten ..."
+msgstr "Hoi, Ik ben Pwnagotchi! Opstarten ..."
 
 #: voice.py:23
-#, fuzzy
 msgid "New day, new hunt, new pwns!"
-msgstr "Nieuwe dag,nieuwe jacht,nieuwe pwns!"
+msgstr "Nieuwe dag, nieuwe jacht, nieuwe pwns!"
 
 #: voice.py:24
 msgid "Hack the Planet!"
@@ -40,14 +37,13 @@ msgid "AI ready."
 msgstr "AI is klaar."
 
 #: voice.py:29
-#, fuzzy
 msgid "The neural network is ready."
 msgstr "Neuronen netwerkis klaar voor gebruik."
 
 #: voice.py:37
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hey, channel {channel} is free! Your AP will say thanks."
-msgstr "Hey, kanaal {channel} isvrij! Je AP zal jebedanken."
+msgstr "Hey, kanaal {channel} is vrij! Je AP zal je bedanken."
 
 #: voice.py:41
 msgid "I'm bored ..."
@@ -58,9 +54,8 @@ msgid "Let's go for a walk!"
 msgstr "Laten we een rondje lopen!"
 
 #: voice.py:45
-#, fuzzy
 msgid "This is the best day of my life!"
-msgstr "Dit is de bestedag van mijn leven!"
+msgstr "Dit is de beste dag van mijn leven!"
 
 #: voice.py:48
 msgid "Shitty day :/"
@@ -91,7 +86,6 @@ msgid "So many networks!!!"
 msgstr "Zo veel netwerken!!!"
 
 #: voice.py:62
-#, fuzzy
 msgid "I'm having so much fun!"
 msgstr "Dit is zo leuk!"
 
@@ -101,41 +95,40 @@ msgid "My crime is that of curiosity ..."
 msgstr "Mijn enige misdrijfis mijn nieuwsgierigheid ..."
 
 #: voice.py:67
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hello {name}! Nice to meet you. {name}"
-msgstr "Hallo{name}!Leuk je te ontmoeten. {name}"
+msgstr "Hallo {name}! Leuk je te ontmoeten. {name}"
 
 #: voice.py:68
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Unit {name} is nearby! {name}"
-msgstr "Unit{name}is dichtbij! {name}"
+msgstr "Unit {name} is dichtbij! {name}"
 
 #: voice.py:72
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Uhm ... goodbye {name}"
-msgstr "Uhm ...tot ziens{name}"
+msgstr "Uhm ...tot ziens {name}"
 
 #: voice.py:73
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "{name} is gone ..."
-msgstr "{name}is weg"
+msgstr "{name} is weg"
 
 #: voice.py:77
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Whoops ... {name} is gone."
-msgstr "Whoopsie ...{name}is weg"
+msgstr "Whoopsie ...{name} is weg"
 
 #: voice.py:78
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "{name} missed!"
-msgstr "{name}gemist!"
+msgstr "{name} gemist!"
 
 #: voice.py:79
 msgid "Missed!"
 msgstr "Gemist!"
 
 #: voice.py:83
-#, fuzzy
 msgid "Nobody wants to play with me ..."
 msgstr "Niemand wil metmij spelen ..."
 
@@ -172,14 +165,14 @@ msgid "Looking around ({secs}s)"
 msgstr "Rond kijken ({secs}s)"
 
 #: voice.py:106
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Hey {what} let's be friends!"
-msgstr "Hey{what}Laten we vriendenworden!"
+msgstr "Hey {what}, laten we vriendenworden!"
 
 #: voice.py:107
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Associating to {what}"
-msgstr "Verbinden met{what}"
+msgstr "Verbinden met {what}"
 
 #: voice.py:108
 #, python-brace-format
@@ -187,29 +180,28 @@ msgid "Yo {what}!"
 msgstr ""
 
 #: voice.py:112
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Just decided that {mac} needs no WiFi!"
-msgstr "Ik vind dat{mac}genoeg WiFiheeft gehad!"
+msgstr "Ik vind dat {mac} genoeg WiFiheeft gehad!"
 
 #: voice.py:113
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Deauthenticating {mac}"
-msgstr "De-autoriseren{mac}"
+msgstr "De-autoriseren {mac}"
 
 #: voice.py:114
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Kickbanning {mac}!"
-msgstr "Ik ga{mac}even kicken!"
+msgstr "Ik ga {mac} even kicken!"
 
 #: voice.py:118
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Cool, we got {num} new handshake{plural}!"
-msgstr "Gaaf, we hebben {num}nieuwe handshake{plural}!"
+msgstr "Gaaf, we hebben {num} nieuwe handshake{plural}!"
 
 #: voice.py:121
-#, fuzzy
 msgid "Ops, something went wrong ... Rebooting ..."
-msgstr "Oops, ietsging fout ...Rebooting ..."
+msgstr "Oops, iets ging fout ...Rebooting ..."
 
 #: voice.py:124
 #, python-brace-format

From 67a91169dfe41decf7fa56c30e3bbc91db16e17a Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 13:22:46 +0200
Subject: [PATCH 61/62] fix: sed for macOS is 'special' ...

---
 scripts/release.sh | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/scripts/release.sh b/scripts/release.sh
index d5d34b3..8b8d8cd 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -3,7 +3,7 @@
 
 VERSION_FILE=$(dirname "${BASH_SOURCE[0]}")/../sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
 echo "version file is $VERSION_FILE"
-CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d '"' -f 2)
+CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d"'" -f2)
 TO_UPDATE=(
   $VERSION_FILE
 )
@@ -12,11 +12,11 @@ echo -n "current version is $CURRENT_VERSION, select new version: "
 read NEW_VERSION
 echo "creating version $NEW_VERSION ...\n"
 
-for file in "${TO_UPDATE[@]}"
-do
-    echo "patching $file ..."
-    sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" $file
-    git add $file
+for file in "${TO_UPDATE[@]}"; do
+  echo "patching $file ..."
+  sed -i.bak "s/$CURRENT_VERSION/$NEW_VERSION/g" "$file"
+  rm -rf "$file.bak"
+  git add $file
 done
 
 git commit -m "releasing v$NEW_VERSION"
@@ -25,4 +25,4 @@ git tag -a v$NEW_VERSION -m "release v$NEW_VERSION"
 git push origin v$NEW_VERSION
 
 echo
-echo "All done, v$NEW_VERSION released ^_^"
+echo "All done, v$NEW_VERSION released ^_^"
\ No newline at end of file

From 8f42950b5160d5922cc3993efd98c4fe36b95aa0 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Thu, 3 Oct 2019 13:23:27 +0200
Subject: [PATCH 62/62] releasing v1.0.0antani

---
 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
index 022e5cc..ffade9a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py
@@ -1 +1 @@
-version = '1.0.0a'
+version = '1.0.0antani'