From 18c38121ca45360c38c644d0837231fcefb853f6 Mon Sep 17 00:00:00 2001 From: Joe Scotto Date: Wed, 26 Nov 2025 13:07:38 -0500 Subject: [PATCH] Start PCB Edition --- ScottoT9/{ => Handwired}/Case/Keycaps.3mf | Bin .../{ => Handwired}/Case/ScottoT9 - Case.step | 0 .../{ => Handwired}/Case/ScottoT9 - Case.stl | Bin .../Case/ScottoT9 - Plate.step | 0 .../{ => Handwired}/Case/ScottoT9 - Plate.stl | Bin ScottoT9/{ => Handwired}/Case/ScottoT9.shapr | Bin ScottoT9/{ => Handwired}/Case/kle.json | 0 ScottoT9/{ => Handwired}/Firmware/default.uf2 | Bin ScottoT9/{ => Handwired}/Firmware/scotto.uf2 | Bin ScottoT9/{ => Handwired}/Firmware/vial.uf2 | Bin ScottoT9/{ => Handwired}/QMK/keyboard.json | 0 .../QMK/keymaps/default/keymap.c | 0 .../QMK/keymaps/scotto/combos.c | 0 .../QMK/keymaps/scotto/keymap.c | 0 .../QMK/keymaps/scotto/mod_lock.c | 0 .../QMK/keymaps/scotto/rules.mk | 0 .../QMK/keymaps/scotto/tapdance.c | 0 .../{ => Handwired}/QMK/keymaps/vial/config.h | 0 .../{ => Handwired}/QMK/keymaps/vial/keymap.c | 0 .../{ => Handwired}/QMK/keymaps/vial/rules.mk | 0 .../QMK/keymaps/vial/vial.json | 0 ScottoT9/{ => Handwired}/QMK/readme.md | 0 ScottoT9/{ => Handwired}/README.md | 0 ScottoT9/PCB/Firmware/scotto.uf2 | Bin 0 -> 90112 bytes ScottoT9/PCB/QMK/config.h | 7 + ScottoT9/PCB/QMK/halconf.h | 5 + ScottoT9/PCB/QMK/keyboard.json | 47 +++ ScottoT9/PCB/QMK/keymaps/default/keymap.c | 24 ++ ScottoT9/PCB/QMK/keymaps/scotto/combos.c | 11 + ScottoT9/PCB/QMK/keymaps/scotto/keymap.c | 353 ++++++++++++++++++ ScottoT9/PCB/QMK/keymaps/scotto/mod_lock.c | 135 +++++++ ScottoT9/PCB/QMK/keymaps/scotto/rules.mk | 3 + ScottoT9/PCB/QMK/keymaps/scotto/tapdance.c | 159 ++++++++ ScottoT9/PCB/QMK/keymaps/vial/config.h | 6 + ScottoT9/PCB/QMK/keymaps/vial/keymap.c | 24 ++ ScottoT9/PCB/QMK/keymaps/vial/rules.mk | 2 + ScottoT9/PCB/QMK/keymaps/vial/vial.json | 14 + ScottoT9/PCB/QMK/mcuconf.h | 6 + ScottoT9/PCB/QMK/readme.md | 27 ++ ScottoT9/PCB/README.md | 7 + ScottoT9/QMK/keymaps/test | 0 41 files changed, 830 insertions(+) rename ScottoT9/{ => Handwired}/Case/Keycaps.3mf (100%) rename ScottoT9/{ => Handwired}/Case/ScottoT9 - Case.step (100%) rename ScottoT9/{ => Handwired}/Case/ScottoT9 - Case.stl (100%) rename ScottoT9/{ => Handwired}/Case/ScottoT9 - Plate.step (100%) rename ScottoT9/{ => Handwired}/Case/ScottoT9 - Plate.stl (100%) rename ScottoT9/{ => Handwired}/Case/ScottoT9.shapr (100%) rename ScottoT9/{ => Handwired}/Case/kle.json (100%) rename ScottoT9/{ => Handwired}/Firmware/default.uf2 (100%) rename ScottoT9/{ => Handwired}/Firmware/scotto.uf2 (100%) rename ScottoT9/{ => Handwired}/Firmware/vial.uf2 (100%) rename ScottoT9/{ => Handwired}/QMK/keyboard.json (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/default/keymap.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/scotto/combos.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/scotto/keymap.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/scotto/mod_lock.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/scotto/rules.mk (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/scotto/tapdance.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/vial/config.h (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/vial/keymap.c (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/vial/rules.mk (100%) rename ScottoT9/{ => Handwired}/QMK/keymaps/vial/vial.json (100%) rename ScottoT9/{ => Handwired}/QMK/readme.md (100%) rename ScottoT9/{ => Handwired}/README.md (100%) create mode 100644 ScottoT9/PCB/Firmware/scotto.uf2 create mode 100644 ScottoT9/PCB/QMK/config.h create mode 100644 ScottoT9/PCB/QMK/halconf.h create mode 100644 ScottoT9/PCB/QMK/keyboard.json create mode 100644 ScottoT9/PCB/QMK/keymaps/default/keymap.c create mode 100644 ScottoT9/PCB/QMK/keymaps/scotto/combos.c create mode 100644 ScottoT9/PCB/QMK/keymaps/scotto/keymap.c create mode 100644 ScottoT9/PCB/QMK/keymaps/scotto/mod_lock.c create mode 100644 ScottoT9/PCB/QMK/keymaps/scotto/rules.mk create mode 100644 ScottoT9/PCB/QMK/keymaps/scotto/tapdance.c create mode 100644 ScottoT9/PCB/QMK/keymaps/vial/config.h create mode 100644 ScottoT9/PCB/QMK/keymaps/vial/keymap.c create mode 100644 ScottoT9/PCB/QMK/keymaps/vial/rules.mk create mode 100644 ScottoT9/PCB/QMK/keymaps/vial/vial.json create mode 100644 ScottoT9/PCB/QMK/mcuconf.h create mode 100644 ScottoT9/PCB/QMK/readme.md create mode 100644 ScottoT9/PCB/README.md delete mode 100644 ScottoT9/QMK/keymaps/test diff --git a/ScottoT9/Case/Keycaps.3mf b/ScottoT9/Handwired/Case/Keycaps.3mf similarity index 100% rename from ScottoT9/Case/Keycaps.3mf rename to ScottoT9/Handwired/Case/Keycaps.3mf diff --git a/ScottoT9/Case/ScottoT9 - Case.step b/ScottoT9/Handwired/Case/ScottoT9 - Case.step similarity index 100% rename from ScottoT9/Case/ScottoT9 - Case.step rename to ScottoT9/Handwired/Case/ScottoT9 - Case.step diff --git a/ScottoT9/Case/ScottoT9 - Case.stl b/ScottoT9/Handwired/Case/ScottoT9 - Case.stl similarity index 100% rename from ScottoT9/Case/ScottoT9 - Case.stl rename to ScottoT9/Handwired/Case/ScottoT9 - Case.stl diff --git a/ScottoT9/Case/ScottoT9 - Plate.step b/ScottoT9/Handwired/Case/ScottoT9 - Plate.step similarity index 100% rename from ScottoT9/Case/ScottoT9 - Plate.step rename to ScottoT9/Handwired/Case/ScottoT9 - Plate.step diff --git a/ScottoT9/Case/ScottoT9 - Plate.stl b/ScottoT9/Handwired/Case/ScottoT9 - Plate.stl similarity index 100% rename from ScottoT9/Case/ScottoT9 - Plate.stl rename to ScottoT9/Handwired/Case/ScottoT9 - Plate.stl diff --git a/ScottoT9/Case/ScottoT9.shapr b/ScottoT9/Handwired/Case/ScottoT9.shapr similarity index 100% rename from ScottoT9/Case/ScottoT9.shapr rename to ScottoT9/Handwired/Case/ScottoT9.shapr diff --git a/ScottoT9/Case/kle.json b/ScottoT9/Handwired/Case/kle.json similarity index 100% rename from ScottoT9/Case/kle.json rename to ScottoT9/Handwired/Case/kle.json diff --git a/ScottoT9/Firmware/default.uf2 b/ScottoT9/Handwired/Firmware/default.uf2 similarity index 100% rename from ScottoT9/Firmware/default.uf2 rename to ScottoT9/Handwired/Firmware/default.uf2 diff --git a/ScottoT9/Firmware/scotto.uf2 b/ScottoT9/Handwired/Firmware/scotto.uf2 similarity index 100% rename from ScottoT9/Firmware/scotto.uf2 rename to ScottoT9/Handwired/Firmware/scotto.uf2 diff --git a/ScottoT9/Firmware/vial.uf2 b/ScottoT9/Handwired/Firmware/vial.uf2 similarity index 100% rename from ScottoT9/Firmware/vial.uf2 rename to ScottoT9/Handwired/Firmware/vial.uf2 diff --git a/ScottoT9/QMK/keyboard.json b/ScottoT9/Handwired/QMK/keyboard.json similarity index 100% rename from ScottoT9/QMK/keyboard.json rename to ScottoT9/Handwired/QMK/keyboard.json diff --git a/ScottoT9/QMK/keymaps/default/keymap.c b/ScottoT9/Handwired/QMK/keymaps/default/keymap.c similarity index 100% rename from ScottoT9/QMK/keymaps/default/keymap.c rename to ScottoT9/Handwired/QMK/keymaps/default/keymap.c diff --git a/ScottoT9/QMK/keymaps/scotto/combos.c b/ScottoT9/Handwired/QMK/keymaps/scotto/combos.c similarity index 100% rename from ScottoT9/QMK/keymaps/scotto/combos.c rename to ScottoT9/Handwired/QMK/keymaps/scotto/combos.c diff --git a/ScottoT9/QMK/keymaps/scotto/keymap.c b/ScottoT9/Handwired/QMK/keymaps/scotto/keymap.c similarity index 100% rename from ScottoT9/QMK/keymaps/scotto/keymap.c rename to ScottoT9/Handwired/QMK/keymaps/scotto/keymap.c diff --git a/ScottoT9/QMK/keymaps/scotto/mod_lock.c b/ScottoT9/Handwired/QMK/keymaps/scotto/mod_lock.c similarity index 100% rename from ScottoT9/QMK/keymaps/scotto/mod_lock.c rename to ScottoT9/Handwired/QMK/keymaps/scotto/mod_lock.c diff --git a/ScottoT9/QMK/keymaps/scotto/rules.mk b/ScottoT9/Handwired/QMK/keymaps/scotto/rules.mk similarity index 100% rename from ScottoT9/QMK/keymaps/scotto/rules.mk rename to ScottoT9/Handwired/QMK/keymaps/scotto/rules.mk diff --git a/ScottoT9/QMK/keymaps/scotto/tapdance.c b/ScottoT9/Handwired/QMK/keymaps/scotto/tapdance.c similarity index 100% rename from ScottoT9/QMK/keymaps/scotto/tapdance.c rename to ScottoT9/Handwired/QMK/keymaps/scotto/tapdance.c diff --git a/ScottoT9/QMK/keymaps/vial/config.h b/ScottoT9/Handwired/QMK/keymaps/vial/config.h similarity index 100% rename from ScottoT9/QMK/keymaps/vial/config.h rename to ScottoT9/Handwired/QMK/keymaps/vial/config.h diff --git a/ScottoT9/QMK/keymaps/vial/keymap.c b/ScottoT9/Handwired/QMK/keymaps/vial/keymap.c similarity index 100% rename from ScottoT9/QMK/keymaps/vial/keymap.c rename to ScottoT9/Handwired/QMK/keymaps/vial/keymap.c diff --git a/ScottoT9/QMK/keymaps/vial/rules.mk b/ScottoT9/Handwired/QMK/keymaps/vial/rules.mk similarity index 100% rename from ScottoT9/QMK/keymaps/vial/rules.mk rename to ScottoT9/Handwired/QMK/keymaps/vial/rules.mk diff --git a/ScottoT9/QMK/keymaps/vial/vial.json b/ScottoT9/Handwired/QMK/keymaps/vial/vial.json similarity index 100% rename from ScottoT9/QMK/keymaps/vial/vial.json rename to ScottoT9/Handwired/QMK/keymaps/vial/vial.json diff --git a/ScottoT9/QMK/readme.md b/ScottoT9/Handwired/QMK/readme.md similarity index 100% rename from ScottoT9/QMK/readme.md rename to ScottoT9/Handwired/QMK/readme.md diff --git a/ScottoT9/README.md b/ScottoT9/Handwired/README.md similarity index 100% rename from ScottoT9/README.md rename to ScottoT9/Handwired/README.md diff --git a/ScottoT9/PCB/Firmware/scotto.uf2 b/ScottoT9/PCB/Firmware/scotto.uf2 new file mode 100644 index 0000000000000000000000000000000000000000..6ef4bcacb691e306ef2641ee2f67c3818844177e GIT binary patch literal 90112 zcmd?Sdw3hgxj#O$T3vjX?Ig(8th9C_TXy2a4oNTtMGA^-IRSEk+yIm0fI?`I;gloO z_Mi}G9iWiJfhJafKqyc`X{usMOI=*(g*&TUKu+LbnvmtrhCt+-wBOIH?4V%I_xb() z_&v|>ainK&Gqbb1?`P(nciwsDon@Yx>6c%6#e+m3>}MuaJCc1kT&CW2jC9TPT7~5; zJA9nA-MynF+G4qS`PI|B#JaPEx30LFS{2*QOB{^_EfgWM1ftCE=WJVC6C{JR;2NUT z^%wkzvNOSQO(CwUaLxXDq@3PQttQt%gymI)9Ef#AOJQSC1J&~S6nE{`^2qCFDJC^e z7>S{OA$B5>1$hnmjiwge%fXYTcGCh~*UsyBfx3nyihX}X*UfcVuCZLB#=cT5KeGIY z>n4PA;=6M`ovw7+ojhI{P|6(~D;<#(!H`Qy;khN+FVrmZgSu&ITgF({We zP9C`$hp?aiq%rsdUj{yxfV`j@_&`I!~8BT=a z#*!3T>XlnT<6rd`G#4y<%B4GO^|deH>jq>_sU4owJn4+E35})&csR-&$;38NCzs)e zKtT&nmQiyLj^;ghUqXcIGn3msI}uoT>gK+hn13o0h4d$6rE9)tq31HsRUYM;4W8Fp zUh+NQQU0>q^BYgt^SnptHYlN?HP70McP}7#7N9+F| z2e>BAo8OXsX0MK9xI@O`h|ZVk+vBoC`1AN0eul2{RCHM>smzwRKxSaOD?37GQIXE&`(9j4 zYhPdeh)W;Y3+_&Yn(k$#pULK;LE!pN59!LOboXWu-4va>)R{@}4bz;FiNySa>a?dk z)$|EZa6aj)C)fJQeOI-}zLJ*rTPBlV`^>W+XffBhFFFzV4^NJmSw?47)5d~)=S2k* zT%vUMig5`0=}#JiKcB>(Pr?7GOZjtm73r!5qPjA^K4hY`A!2iWZh6IW8Bj7xL?nG8 zd3E*b;!l=7h_*cVm*-HE^n}GKk(hj0sh)f$7m`ybKT4OLY%(@UOA$9;dNZseIvdvq ze9!;E0a`oFpU+zDs_DI|E!{bho9M3OC%SX0X7x@b<_j-OyMR99DJ6x(eC{>#C$=nW zxv%9=i+N@k_vB2;w9(lY(kad(1+$6Gb&hnw~NvibHE8*gT0za+Y>DJ3-VObC!4!A8K+9R0C7x_P7`Y!o{Yg? zpTu9Eft9J zJBK2cLUXr{d>|8H5amEkBoaaVh>dy+{r&|vgMa(G_@}0{>z^ub=jIrmDr+~|Gootj zU_zgso<4!k$SNj%VNzj|i1OU9A9%%NQavbDk(1!<-wb~P^uCZMi#1)O%((E5ef9v? zQBY4h=yqDq+pI*5y`@(9_4{hN*|UT*(w#Gs&Zwn(J|&%%r5ne;G58yj_#0C2|CXK; zN9dHU(dqFNI@!*kXZ}dKEG=C}N;>h3bh#tx%v!ozQ_@ZDDie*(`8EM4X4lgWij>4k z>($uxDiKBh@Wn z{9~N|_kDPF7e|5twDxm!sQruEc&i#a5a-e}vkhXpi;L_xl0$qwx^LY^@sw;5zn0U) zuVi#uyVTeRYKGV1=jIsgCh(2t;wGcf$m7mB^fP}jZ0;@v=Q&sCmurPn@*Lr7nUx=Q z-#^r>l>2s#-j`d2`>eQc99Mrbrv96f_?uGjp9;Fo2Hoxvf`ll)8~8@%8W;~}^eaV2 zVKQjAM>TqRo5ep_1ezl4Fw}zcYV~z{Lcfn_JeQ@r7wL>hCyb;^JDo0gM!KIMT{_ZP zN77}UPIvto>8?e(ETprIq{}&-ZuuGMmLQ!O>BNzAd8gCOKO^0RNSBXvWk`3L?~LOD zFb4m$B>rhB_$P6!IfG6P(CHk|seFW<1*hp*d`7x+kggEvrXbxY-%aLcI-QOa&?f-j z{mDRCGqF#Xbjldugn{M+0HZmGHh>AW4}-E%FbZ{IwBL{lzUWOSu;@3%#ngd z0oOktB31$1r=g!$EQ8d_7ZZU~exl|#>@kvqc@4y>Q_ky$l+i69=Ly3(-W@KkSEo1! z-j|LIBm(^K&Gg9fuiBD}PXn4iV=Jhqlk z7|*3;yIq-4z9K!!RhptY(d*8!&U3G_ge-fUT+^L>Rc!$x`?pTWr+sGpfy;w zilAL_<~om&<)xeENqp8J3ndj)5=0B6QYtxd%-7RHK^)E9QAmzd;zr_lE$-wYlc)e= zwUm8JCM3jH)!hr2l-gGhIe-`)T(7<=Vuf;gjfjU1FWfbh~KzkB^iXR%%!Y8cMlN4P!b57C$@^&#no{ z@5=R(Ekyykl{h9vHh5OG5l5CpDl^c7=!)|MYOWnbX^#tp?4-)1;Yr=>dOKpik=fav zINA9X%Evf{e{B8FOyZxJg8$DnISCqp&EN`lLu75c&|bt_+z+>_u{S_*Rt6~0`dnqb ztjASi*FiT!MT-;l-O5T%pBD2VV!o1+A@3kWr@T4vsqF6}R$eO;dcyACsoJ&UuTU}AVJ(c2N7JG}z_9s-@pjZABH+OH5 zpxo-Bf*Sh_ZHH%wi<|Ry;bGO2Gk!;Vr}fJpb(>NJt#zhwZA)gJsa0CiJj||DL6kda_&zM`==x4uMZOY zha=~^aQ?n_P8HWMvG+>s8EMi4?=Dw?lor+1?{eiyxwx7jvA3Y=D{>C5@}+F-v$XwJ z5vqLF|D~+PwyJ-UsZu8ZsdaW!IrM6#Z$8?VK@!qErR&(>3AOJDB9+4s(e1d}_lOU?Jz>~q?q)gu8YS{1bd$O^a0CYz zA?-w2sPPz5!9xPQbV#T5{dCG>L*o{FeApQLbCUSyq~JfG^{@HTTuC?iNO-p+JE~K@ z)OaI?V-$ZsQJw|HymB$leh;K{L_mo!I*d`HNQGkOZYPrvqKPkM9a)7K&cR1Bo21n` z#jnZ;TaK_ohdyd*T19rO)F~U)cM)2P&^*UGcvc3mI5MtR?Hi;5pf$aD(?*H6}{H- zK8?1!$K!P65Reso_FIYW9j&fILO`v(I6;(x?_B5NTIsrDUuN+y+PEzjwZU2-A@Ucd z(Ji_TVz*25K2lvSiF{FZj;(-fbvr9^qz}Si(Sk5@f0%ADR!-`jZ0m3f4qb#+n0tTW z%9e=j2`}BYDzM6EI>bSzQ=k%sCaCCk9tqP9k+N&NFt@Ml!`WBh5*jFa@!pNt-p`RR{G8Rcy19#CsQqQYGC`7VZ>tsi1|Kb`oM zEa-zd=@LaxZY#!o?tl!jTOZ8QDS3&_$Z7QI%lK__U$_GIxDr2;MLtABIb{)2O{AM; z(Xc8fLOsc2_ik-kPp*V(}Eh>K;Fx^y=k4z9*X~tph}Mf{_I0 zP@+fp!11q=G1c#aM>GwbI8Lg0DVg^CflrP@S|5;)muWSgKd6OQ|4aH9rAn`*(piae zNBr&MRA7C0I-NwNJ#rzgyuqCCcek`zA#Xo4plI?pBrHd+q{c2p z4=@{u*W#Eatwm4JAQ?53Ij!CP0s8PPhqttT{n4Qq`gQD?Ode$Ngd6X1A}Pb4zWz9Q z4XN+X!%X%&fHZiH^4_pc@eb&e>FDFJzQ=FkYV6abETZHOtFdoz{!*CmTn=&{$Gu$Y{NL*VnfD3NNUih>7uf&)8(8OlfSNC?pi+Yq--Lx zL+L$HAH&&az$g>SB(9C=Ud*Ki$%2x>11&#V_%}gi3rd1{pkKaiAGgoH;P!ny_TOsr zm>w^w-C>weuO(>i{%`aFlPOrwk;Uu0MeP#*Me26fP;UC-oo0PG6Fqwm$8i4cxR6(NYX5{+)VCTebni2b~x!w zi@PVxSDuR0bQ`;LJbls}EXp&hvkQ?tDE>B9C*Z%weMz0ggzkabCTP zkI?h`_mgrvNp#Qfp>L^Noq&edep31dyn~eoR-cVsbgv~ycc`(bN_VopV|MrKt{g9Y zswiL$5{FJ=ai6IdbQ61~B>31{>cPm^*{^U1%Xbzu0qlAYVp!fxukG(jFE>uf^cDv) zy+wgNE`n0xAZy)eO|)+3$^(|=?Vass75G_S=@BO_Rr);rHC{0ox!7o_0-324c% zX0&8@E6|Dka-YFQ3I9YQ=8FGep{>o)b}f)Cj?gKjl0-K3k?FbU5vVa;!cdwiF?%u8 z?^sow^}_!#sK$N_z3*D}hCY_&XK^~^x;`;LI@Shg$J%zTV?#T)^G9v36^6nDa{0%7 z|AJQFkv>v+x#VbnvQ5{KOL9b^eW$x6qTAW-%8S@HTQ|4EPMA!;B$Dqm+w$FeQ6g$F zlBC8K#rL-DX}y5V#XHT5fOnvf+`@PWjyJ3N(i0KV$?q-n)6SKC9$~L0bbLWhM#Y3E zwcY9Lv8F*98o$3W@*j+AnfzCnf`3mq-Bl9Fw5G$>bDPm5715#`Xx;5Ol2FqVhLvV7 zL$NSEix~QHY(?3HuCJs$sO?`yrjZ(w1s%?p_JQ6Uq~+`%N57V-cx}_xwhVViE1B|z ztPAZxz7?Cr%{yHgKrk)xNGr?ltKrd7vvt@fvydy|C`6I}K#z??*2tH6JKH8#X7w7L zC}^iaZs)vULECMuw3S%rwH9sGZB%0sEr;fYM9dF~{x6U>pG-8$d)soX7Sit4Z8;}G zcJg~+0lc%Yb%meXc~$F*pnfMS19P=<`g`23V=c!x{*A%ED2abj3jT@MqoCj2iN|GD zx9^iH+HLJyHOy?Aw~k;YkUgkzJ3z6yT1~%ec%z1yPQxri!^|XCc+;L>sD*nUmH*{9 zH=5)Y*UJ}_lE}dE%67566D6$@Wuenm5ZT*y*l0eO)bnOads>wW5^0rltQajwqcihp zhBM#2r`0F3a*_v><3kIyXTE~|BawnAXHT{XB*_cB!*k`aX!AStJJr~Wc`m3;fjBpVcAo0Hza6ElX+WpRm!P^h2iRmoVc@1l|t~3E&H?$H?y6F*JG~;|r|h zfL9>Zds=xptMH$k#D8)M{){H(t~6H5$VPXrzsZ;$+37NY`i!dlp_f6&O+&0~n7dh8 zMt_c^H<-KJffdGAav&o})SB+p&Dcina_760$D5!>|HVLBv!00Un_QXF1`nB18q_I28`$7^Ft|KOcF>)Pn4p#iZ|a_} zl_{MvV*oX+g>B~U^I6%!cBcOKTdgcC^iErOj-D}XZPKb(Ycm?4OCF-i5Bt^FyXavi z?S?)s#~ktzj=(HPS^mlU2a#p~8?#1Y_p7mu;43u3`lqG_HTK`C5&N?We`^wdYYP6q zP^mHzy{DgmQuCQjR=XNoH)!tmj@0!LovrdOj0Ihcp286|5&H$k-Klat>e*h<7W`EC z&p1_hl~Z2CC=QfyUBB4JG;wqbvFCx_S7R0y?O+;ws_cxjkvG_t!S0_^Y(wb3C5(_S zQ3{7inSEhj_?jz-^3)(-b&*8te(w54DnmOEGSWjBpM-AVE|rw&wvhW!hLxSL1~ZbP zzz$crM9S$DX7j;yaG_GyL`jFID%F|gw_5Ly2C{dT;KP;y&(FAed+$k?dj29+ne@Ndx4~bogS5V z`-J_ZEU)iH`%rXw-Ldd8?>f@Avc2pW<=w`<#h9@{dhhO2?e$UF{z+6Q_IEErSYDLv z7wun&y(c=keur!Q0iF2w@NQGFldIq3bW)3ZL33%}0>m4&c=v(Hg5V_F{O0}ge0Eo_ z8~eXSd9Gh@Qr@lG|isi zt^U!s^NhS5t<$^Jx+?brvU)Kg&%lOIg@AL_VnUqQCSxPNRMm%Y{CYPbFW~q-HU;PV zkQTAy_BTfVQPNxTUAf&#>L&LO76tAMOBSm85kqW4Hje*k+0BeV?P{h zJYcH{=Q`OKL!)~Of)v`7Pta-%Vzh>}ueV`rW}$F4BW zJh(Wp-#FtSbj40K8;Q+D`jc$I6AF#*9ehTf$fRAPh*aB*`0{c48-qV&B_{usYL59;qhvo_o$mxh%W!QPBQuvi@)XvGlZSo9Zi~Mil z9=T7rTRtw_DbEtxH9McOrkbwYfY+FHXo9G7^7X4-tLIs8W~#r!wPD^aSc+we%bgh` z@e@wRTh54I95{d!xwwy>PVsFHX~?02#oIV%?s-dGE43$BkaF!jX3x&zUo+4{7IBBW z2K@lm*I<$-W{GyaWT9n~9foK#Mu2pY$&3|_+us=crzG*8f-fG$-{MTf=E1Iy_4|e2 zsw(S=5# z+ewfFh@bdK3t3JsAq~Vy=3s0H&YI9#m`RW4|Ih!k3V(YNe>UnhTL1sQ$EKy!XwQnq zV^_vA($h>vgP#BHGyRNTn0`P=+7F0&NjXOvKBBC@UZeFcZ+un~|7tBVG?JCeN#(Hg z!pW=drMBCgrsmEyFOs|hec93$LsO6hEloC83yWQK$(m;w46R?A zvbaeC0=B;jc?KuRT}~=S5Gb2UghjpNA?M}-{glhsENUrj43Sk9Cwx5q>S~5U9#DXP zkA!5)Gw4Jzb-QO$qsd2Xo??@<#?tv|=TjvNWA;bUQb2622G zF*WTa(()u?KUL=vZ|Tl?cJd1B%UV?$x@uWWd)HBnKf`-tOrT7SwW~JFVKFqsW3%Jz zOpi0PK!hl>p*gx4b}NkcyRhBVrALDC`y0dmE0g$F;*&?~KjzhW;xSvClvxR_^LdVe zzVPQ)6^mpqw2}25JBi1BHEbX^l|DG{RG3+Jj)p!nTubyeJ=z4KWcIUJz6)U)elzMF zqiwQ%B_!5mAav_Fq@*;j8MfG>=;xI3VKZ83A|$$*T?lauNSR)Xk5ir-;_WAU&m%Jk z-4Tzi#z?PT8om12FnNH@P7?h`%1?`i)XN&Fot`1AXVeFSqXR`_zYhn^6`Xpm_l^xL@3!Xv%WejVhV+f6A#9^1uL`IIIPlh|LW>La6+C$24PQ6 zf3V^T7XBt?;3ZSMq8{~;&QRg=u2Tn&$|xpX_wM7j=(d%RNxMje7!ma)2WxBw*yor< zI%AhRo$N8rKS;%iouZS?n%%$XBhoHVhMo;Pt@Ix##^GsWI#uKqCc zl>4ZBwfKmE9GWL$UgMM_;q-caM+GDhJ?y~sp;yBPEVp}(gwraxXg;aId?u5?KbdD~ zE$&#>?fOUbtir!4iGNiJ{@FyRcu~66^PxOxDV<3iyfpElU%62w^`RDbC+d&m)zUk{L7lIFy|` zU1F5>an+{CM=Eo z*6KUTD~NQY&s0`6S0B=M!m@Iv!!Ze38^JMA60sGKnz?BewNWCbm+>7F`>IiXY8)pc zCbxduhcffXGAQ%nkSw@Q$!0Mo^CA7#weFhw0~WqRA1Vy2C`O&EPjh_Ls}B_gra2Zx zg0?(rcI!L!p~bNL$kp#1Mp|C6E+T-Y=KAyc$dt;;zKHXUlkOwulsfexuC`Z3xtQ{{ z{Gaf)b4$gMNKg!sjJ_3t>njE#J+}P>_QAywc}2ii!AZQD)TlgKX<}?QH1appIu`#2x^131l}jwe(8DNfJ*Ms^VXHN!Sz z2l#P>Y~e!&+l)q*&tKxk2Od3M3+usYUPI?Za==mvn;t6dbxnvELZ24~F%kj2Vh1O6 zVdQ8Q;Y6J?t%Hy7q3etHy7*{0G3?5K_t~S6Mp%Bg#mk8z&w-Sy#(o;NqAf5;m|ilD ze`D~kN#b9ViofF<$q)(^>~fumq@m^gyTpg~y8hOiq?s>HXPuIBnz=W4H>og2$o6zm zZ_Cv1xjw$^c)G}Kryb;ecm%XD8s8K59yf`_;QWPXe_w}hFjZA=r2-)baPIG#M1H=H zRFK1Ije2rj>3#D^*$-V6PTdy$)f zIQ9$e@CPMg9Ag}#|2^{mj3oXuQt;<(pn3;p;`Y-WY-DGHr?=Hu%V=nU@Z{+?Cc}aT zgmGHf`C1t6+lo|AFz-4>Xb-dCRS6R`)F)u6S3y`mpcmSN?+btDe+fT?aOh)|-P){8 z_H1)^26V_2T128;e#X^bamD<11k3n^>o5(S_4DJg3t?~KxYXah6n#UJnZ+9x8k#x5 zaRqTO?*$8Cdj`t`!M-e+hDVz5{2NpMXD0EVnS#H+%ec_k%!!p(kV=C@l z786-ViS^gu$GXN9mUwI@TN7j?-5Z<-dQA+G9i1I%p z)Z!(_3a-|1Dbt%K%R^99z{xl7yUl`Gcw1M|PM5Bi&9q{6;#XWell-e-E;Km9@aRX& zm{+)&gzlUJJyH?$Z?jZAtb*!*noETTFZ2QEwA$WJFH; zMQDh-fSbkDg11e34NvP!1+S$+!CSF%u(GmL$6_P z6rnCHG%Lb&a-r>>Q-z;fXlU*H-STsYtJC5>l9-l?tAg*yGJS}`SBwX93wC1$0f{(e zr>vFZ3kgw)swVBv;FnJMCoG$JpnqKgvrJJsgSO=h^C6=16l+&%;-d8LF?s)_E zoRs=(X$YBo%YLq&M>%?Ov!x-B9w40A?fi2vtaB60992#APWXrKB%!*JPD@Z^yyoqw zL7eP@efV!!UXLTMH>77ueggkb*{7ed3!yJcTwR70wrrgrS=f_@V@DDt@GSUTFBQ(| zyU<#cp6=YcbR5G!cKr9;B>v~7;Qx)>FI>t6X;C_Lu7dsi#D*2c8(oh^w;A^5e6o~? z8#WIm!X*lE@O&ztV)!yBDEEx>)wIxju=0$o;G?vNo8t#jIUn z?TZTKY|v)zT1<3}x`yG{eF-XPV{|YRSX}~blQtUvZfj>i_H{{-+lFL?A@b;O;qn5#J@lfKCqL!-9j%n7AyfyF@B zl;OMf{n16EOfOg)$RciMG1zAjmj++(q+tC#Q%5Bga|+!eg=V0GbkY#>8^>afW?x4O z-D|0C8?16Wbz1n^>`xGOlDy^xXsXE=rn3!rp~kwJ(tDy$mXte zvJU;a0IZHLO1MWXQP}7Y^AQ4THL}ji5wbNPl+C5eH6tmqnFWb5#B3XYJ1cvJ=Kbg= z2xK@`nSed8cd@Iu1!NevzcKjFN#Z{TUp$Jx&RYmun;uWIh%q$`>Hb@*U(9cAJoa#Z zVRKLv{4Zi%24}sciOs({q-IzrHK?&3*wQEG*PAhlr?=)cz!dvX9%BB0n6IQPs~P9N zg{RQZVC!8K&w>pRR$^#j^LVJ3iM-fGY#CS~=3VfN5AodN*a}0$oQo|JTRAr7i@X`{ zbqsNR*ko+X3eD>_z#I7ri{86Ayc7B#XoeejZJH_BRIqxk>!z;)_S||2(X(rqOi;kA@9s8$rjix`Ojt z`ny?KVDuZMWem1l=mfqcC?ud$L`ZDA?1;~&elzMUmIT^~t>f&FgG z*stxEsm)B%y%~+i3ipIVX*-;chV^wi@@U#4PE$K(1G+PUy)t{xkAU|~loj^Ato+8h zCM}xORO>U6U4;|9zYZ4#?BHXxgI7Mo8!az{CG+$wtY6712jk-we0CY#_KS zUT%2`GXVVELSP13+-p@@cM5s{1^w_`?=e#7%k>^8d?4IZ;2@76-*rU~hbs$dc}DXq zmV8Sne3y$H!3uo=dG#ML`)oQnzBH8fkh7lfi)OdiyK95A=2H#pQH(QT%UKl2Y{txj zh!DUmA!TqV4Ll|dJVwOK&aWe!mCf(D9zBFFG`oXO1 z7I`=CD{41xA&zsTW^h*G$d|mBCrhewB6O;;oY@7@?epP1G(|>?%Imb5 z;S_T@3W;srd9DHJf<+fJ)CTHZWf7-!59aW%F>Uf+SnFzi$$wib^8;B3G>%DosG)A8L!lyva|irsIh?&t_}6h~Kr2Ge-Q_V&`!s@)pwLc? z(3>g`V`dP=Ixr^3KY^OD;n&~=jMuU{#oA=ne$Ro;Evuhj;QYqj@aK#z1AfHv0vXMy zld$5T!g8mnk9mPl*3JjuK_Xdy*}7k1;EU6BbQ0>OxobFfHSD#rwYrXV9<-!Q6lzV31b7NY>OviH)2NM7m(wart~;w?UlmHs>f6F zW0p>heGJMnnL5^0ba6fSg;6S8R2Qg+hb?&A7VG`Bet2psX8xCJ{n_GLcmBdpErsA3 zW~p#9smzHi-)wH$qRks-^9i%X)ovnI7dTqu@aIQ&9hS%Xn~KNE)lcN#OeVq;*ydnk z_T|a`94Rw-i-W^4XJR+T7R}vEzCSCN}F z|JyQYBR^$QYsnHCTC$OfueCBCa1W}?Yjk-lt6kF4{s^&qY!r&f_^ry>l^Ph`xakzha6 zYl5dW)IG?2X0IQz8F5UIa+-y9VmE_3y9crs)nev&`ua{)|?l$HUUI z`$o&F9_SH75bSk2$n|a+Tp!xA7&Ddf2D!skDeZ1!lE-rIIEH^L|DTt{e_jgy zMFDQ-qP7p(_^sAk$h6BP;#dX?5J+f|da~D9;9l;v-dNB+qk=|fS_^_qj<(%G>pNUx zWD!t@PiNHaW&Jbl>Am&j@m76jq5A;jZ6>>i(Ek5iCPJgPB+!W3dLP=E+p+q~f+o6S zJ!xO8v(Z@-ohANSa#VJCuOrgR;aJPCmGE1zz9)JES<)|BZ+Cqu&BbiZ2T&6E5Jqkz zI_rjFj8^&4M$Ia5?w9!o$+QWP3&{OWj53~grwcYJ&`Z@jA?x?C7DJynk38uVZ{Z*8 zaEmv-4D=oI3Q0rhd6*mWX#}=q}(Wqg{+a-(f`DvxJvQ69KFbcAFJEWP5fviRDz zoF?KhOHYbAX92L=IB%Aa>t|dea}GSjB;qlwOCe&eS$BS5mM|K=E%6n2{Ukj1Y2=Cd zZKMHpou0MB4^^*>3#>k0@i3p z3Xg9cZfl>(wid^={>%Er0B8F~76ZKPE9_0SFJ*WVwJF$hw$Bk_wjIY_upPzTY3oDo zclFz~K?fFh5S0!rBX37QFkaCF(Gn7UWIekM>s-0#msg~;H<*`q9pzorQpw2a!B(QK$b2F zw7X93U+(U~$cVpx6KteS;`{QS!8={x;m_mf#?jn05qzJDg=onc_YavUIBquRoY}W^ zgwCr>U(1V)dX3Hui_d$_-DypEki%O;&HCX&j2%4 zPB@IQp6l(r>1{u?~kd5YQ=qZVdJ zOEemNF}zr#(K6{$jYccqUGEWqqzz-Yd_+L+o{jJ`OR!s211xd{G8B6{KD&EC)5Ji! z?K<}s*TMH_ZHAxrsg6Oc%*>TvaXG0rBE17TMy&qzZlc!h-s6YG=INNyl$fJ_P7p35 z_TNjo^8dh{zr~#d{XwI&+s}Ny4`R#!D@OSrh7agH{%^29>JQ2G(@%f=jHmObpJ7XR zhKQ1(*J92p{2P<_H>TjvaG97wnYFFFMt%7Cm-QO`N#wuLvwHzlH%dY)L*P#u0xhjK zg7#u7Ltt&|^&|X&)pJ&d=b;T}^_}sGi*WA5HXmDm*978fDhCTMJm#v76l>+PbogKPsnIGT)IAM9f3;`aQ|jD@bwP(? z^M{V2MN8(xMz>hl%%M5t7>-khj8%uUCzLp!aGq88Hzo0JO2MB|rh4cNd6f1qpQil@ zxf|I16`R$Y-_>KuBnEqJbSQSq@PtA>TbNQsreO5-`PxEK*vPoTHWeOxyQd=TuLzse z__aJm?6Z-MiH*L)JgaeP{o69@ ztLw13XF4>J2V^QlP`*Ceq^gDJ&lh2{U@O2@jI9J)DK_@LXp=CbZ42hIYu<;}Z(Ps( z$Myx{vC09VEgs7lh{xU-U~LfNTaOK&Rrq_8_%o&FsQky~(YUZqG7odxoP(SQ55BEE zpjL)PtdVz;Th=xWmkSJl@3|YWC_5_X;?D5BAzwGbB z{;~d}0gIcRb@xBw6Izq+->P!9wQZw5;Yytu-qPS%g@1Drf2Q;r#s6j5rPYzO>e{xD zvF8v&b&aa`7Pg07e~Od@e?a~yli#T7i@=Ft1z*w4%-TB(Jvk;(y)*c--PkJxhGN;O zyKR+`9#mtOvr>Vy?4D5{@c+QMyHu@DZwiGwTv<`97cv>GN2Q^ch*>troM8Ai*Q$BR zwZ>Ju(hDmBSzW~X_DSE<>^K0qBMqLZ^^L5Tzw%1H;Wk*L)0rz5o4fyx{9neV-paH$>zh3i|6==(mv=2&@H6nW&6bUrg{skmH@3etMFf##D8H5{yMDx zSmq_21(>_hNN!rZ!BZ4Cr;_xZBhp$2TIRO~=d{4LZdLYsFT<9;s9}YhhFaXOSoGow zc#f|d))U1}-c!maY81YFaKa*6BT9HM&pW53C{XLq^_KX}-dO=lV4c-j)Pnn* z!x`RcO9|`*R*=>!Y3(}8Uho2jUjt+W_Gfr9JFQ_H2eGm8^G|G}{@r+_Vf~M{2Iw63 zh($2-GhXDglEfYz>*!h)5p4scfCe{mB3i&OBw0z5TeGHZ0q z>HW8?W)%%gP1ci`4;8UfB8(@NAB=usVRUFj@}SyPj3}Uy{WCk`(-tbUXaLbYtsy zCh7Ln7`n0c_yzRJGav^rS{r*yZH(Gn4Y3Zz24P{xdkr>red>&|VeV=Q%!mGXJ4TS1 zeuu5n!j)xSzTH(cqUGTw9j;l5yog>)!Ats)khBO9Nt-jg1J(t+_}XPfg-I=txjVVS zEN1j?VR8bSwa&_{9utUP_Om(eL$TEZY~=C_#5DqU9cKUYjlAuw!vE4F{+FiUPoH?r zKNMS}(WY;NHVj*~Mh6|CQ8LZ>TADXg(tL?DqjctN?S4k(3N6+1NY&$Ebf(@N+L}x3 z+}NcD#T&GA6SZ`Yr=(l{opdHG9o5oxoKE-c`VPZ*`nMil**l-W+5qv`1gui&3{SK?d)RZd~m zh#rp*#s$o7_p11CtPOU$pTaupjzP%f7#n1Jniz^bulbvWSIM%!mX{fRNY<_(juEet z%D|ApYiNRZKrz1st3+x3Jl9>i=2<`To&Y%@6PuZBz?-e$E22oDeH9U zrL+bIkXfcywfMV@4OJ~V<^6su{74A6qsOxk?u7rmFY&4~OGnuKT0It+JrUmkyG~{M zut4UQ?w-fZF?VmD%5)0MK7~|TVWn8;m&$`;wV_BKwC-Kw60@4KFV0@X&wPbHuVoxp z|FQTlP2$fcJ&*SPvl_%}f3s$0%h7AF4$NRs3|foyd)Me}t3*bf(YXF@3+f#6rTeav zIuBwqPX*(EO-+9DFZS_U1(Me|iA+Wqyik|$$s?kwbGTWb2{bs z{j~&MygKze>3wV^7plw$&%R$}GxQmDx9=uqR=zMaiDwkU(**y!`d|L3MNdi^OB!xz zsc)f5=J0i%wZ%g%#@ZvMBLp*xJh@hkCq2D>erI^QONf%P=Y4a0wf;Q32TGB0E#AW1 z^g|OX<)iQM!+yH`tipd;68~i>_;Xvx_95R)AY}v(C%|E`+U;Rh*0=cfuYPqYt$kZ& zcraW>G0CxEt@Xytz}n(`rvc+G#P$Gs1Nx>6zj+y(vsVLNy$`bmw9O|2_Ee zJ=gp4Op8Ci1(wOe>$OsyrKP;(Q<o!~hO9i+XM_4W0U;aQIBFeeN>>BoS? zjs?X2jr6c~_Mk@L79XSWMZQ-90@)mR0`VV9B60aNJbY5!O0@FNqMaxMZ?R*G;Qi)j zfX|2rYy6PYG8S%Vd9iIHuuOMf-A3BdIO^^TJO&>Tj*=QTQT{eyZ}ItH(o}n;~4(2{QvSK{+FlV ze_qr?24m)gZH~@noBMq-nYDo^&4U8=jf2duHUnC zPvXBEUp!j>3j!vR)b3ziyy4?Ao0DIt&8sMm7l1yg@iz^>jra-Q32hpFO(xcSzX@JG znTLRNki^v3O~XC1h0K8`AcxaR^!68`gRv!X<*y%n_V>srMhq{8=j%AaUst(-v^2pu{vQC=L#1|J~f_%{as6-oS8;G0MBXEfXW zbE?VHYRo>&R&>S4YlPM?9}uk1JcvFsC4!Ch-rhwByMp!=SBFNfblTOMxcattJ_w)d z9grqsS{hEd2j|RN2kSF@0Gl9oEK+rtp?#am0ZTS!#L5A~4C~7vJYDNgUIM*=A8F4~ z*&I^6BR9ffMlzEZ4X{TsqCI)Hwy50!8+0Z|J~_zJd?ER@yx91_$H?VY^aYABpIL}d zTTZ#p!)6VchDDOym~(d7f3Hm9zcK}XpJ$~xxOycqq&;@UotFFkWQyJSwtr>uVj`@* z)56tm@xSdC9G^yPu;{t4-s`^=b>>H?vz6GYA7OKJi-|5>hqV?BQR=9cIL9=2eA1Ep zKC7ctvN`&}bE_m;@pa@`VUpL>*Av#+zW^_|e3&z&W%5FvS8Oq(caiHIl&4`IgRRNq zD%J-Gd?k|#tSwvdP9)2lCOB$8k@JL1uPoOKY2IVdM5hUPwSDq@!Q_1p?ZbaPOw1M7 zsiz+2A7VpmWBscw&9IokxBA|ozJ#TZN3qF2-!|GUOKUd026#+90hF)B7Z0jkxwnFe5=+o2|rhwO18|d#~J3=1AC&}qt^Q< zdB{gQExzX#u#gTl8M6^I!W-S7s%q)v=G&D!9) zV%`s3YHYIVAn+`;lfB8kDi<=4O|El#Z*pBZ5A6ecBWqEh(N&5uYk`#dVQ+9FQBG++ znz{vJO~p zf9l%*ZuLzizndd|^tbcdfJ`}c zlti}%OcjOE?56#zY2~Eoc5$UU(;KpEskQi?fWL+GMQ-Sth;PRNk<277*P3P)wuG-| znt<{aI*aw7!6oIE3rLCl(<9ah3AR}K+T&rBi5?Qcx| zzbc9URruo3`p@*CJanX-a?Q{au66VJ!tcwY`h9Py(UE~Vk^zb7f5U-@rV0bnq%Y40 z9{IkIDQUyy?=n?TSaJEgHl7aA|F&;r%{!~XjIj5y(y7-F|nR^I@g;M zbIG5PD@Crehv~FK5emz&SU0QB2S@6C5a&$Kb0%LY()fxcnx*lT2^wF?(D+J`Z?7v; zTDhLdgf?P?mN>t~f|g#YTLPX^0$Jl*o>GIn&&;a{~ zWsF9BTd=49r@e0hjHq)}n zOhAbOHLXYnqFx?)4FuaHBZ`2nkE)a!+TKcyV(%|%duM`=@MuM_j=kDCz25$l@W}k% zJ|_bM16+!|{u(^VIddNS?6dd!_FjAMwbx#2oT-S0eSua&d_#Qgzk;UMz6gpKGct#% z9iw?@93GKsq^%N#W*#?`CqfFa`KaJ<)Nv_e?5KpxYh}m=I`A%G%*e-biTY$&SHZ^) zbL5tJ0&GFJ=jn>l>w3W_cvwF6&xIBWEX8_vCk%Y&^DlIbd<1wv$H#!&lG)um`AG1R z!oOO@zd8ngb>6*hib{>+{xHzoonTbyh57jdIzB_s{enehzjd(tKlW%ih&I>VTH97T z1D14;b=6IQEKSsjf_uMga&^H9XA}pG{FuDOY3#aHUMnR_(j0Aa|G*wEHvT3@+q>Oy(%oyUoa*}?6Z0f_iDzl}QLVr1yF_c0d z9%D_etj7@l1liE{oQ-`(3GugMqls<$ESND8TIJw5KgD>1myK@p6wnJDhM03NDg0|x z{A*(H_g|SYbdr9&ob28}KGY?Zwq3^v9u>7&PhlN38#@Ml!9Sm*;=jVCl8P;-is zk;CK1?D9r#EryC{9C7(?D?%NScU%5uhWFskG1LrxBJAUqAv+?&`@-B6`3$8^3-?Z> z*U645a_FZ%PhzGhAC^o7NmNs1L-@DhbwK@IUAsSbgg#%+QgFUic6eIA`!%vtUMZ(z z4A3UeFtwtyOgxGh#GRWUF#ZWMh)evkull@?{@&ns1bO37T_^m%9GD#kK!) zRs841;J;RGl=qs~fd@}K=J0&z@ySk0v-8ltJ+P1syZMm=ef%`kuGYcP3hi%`AJ`6O zVq>rJP{?}hQ_qv~YnJuS%C0%)PphhB*6dL5fCNU$_dE`&PmqW9)lE+K!N)i+`L$yX zy!}@1w0W#_1ig;Cck(;Oz>|+EyaxS@{NJI67&^+@G);{bZbP~TvWfwne7@-|%=`@Z z`~agLTZR#_Wmfy-}z7fEadK!swbsO zO#gSDivPSA{Cj$j1UXM6$0}K~OapmMtGwQMtaG-kk(`oAnh8#R#z_zpjegb9^;&dW-*A zaIL3VW<||Xg`BLEq)&o=N0vSl9DWVWFvEAS$JD;wsq=~Xr?gC;8E1UE{|E-dSkdcq!93{&#mf2)6d|8KsE|NI#IRazCa5A35B zw0Y?FvOC-4&!?mcxhxWX0Wuyw*F&%hCHVQBU-driNq{C`B>bkL7tHBcin67~rSFSr zznm#I$?N16r?*seM*9P5n52`~WXoML*DU17*q0qdjhq@`D2_d0vtrYY$F07TaPl3C zd_dkH`{1>b?Tdup1L|t~Q1HqLl#{ylfoQLI3CMP@r?uPXm{(Q*d-Y6kxcnXmnTi}$ zHC4<(xpSOPNn3eWxZiGZ{C|Op{{rMVI{yD-)evbeXtN7?o&xx!y}G8lpzx`A-lBmO zR@)sQAstzBiHZYthJx`};Q$asWg4F37p&%GWNnpZF0)k4sy0`5RdE|oyf>kh6Q*v%0#Q+JmCRLwb@npz zvRT!Z>it#RhV`EXGVyfsImmtsJ~9@EzpUaf$Kd~4Sjh~arm1yIr_?c1`yAA;mZ}sh z)=u>CNiKVhgj=9jt=fN8ubU!}sUp-tX!$;hdPtlEo*4W^sgbwvgnFv9 znwmZ?D^#@2i;kuLgu49s7m1D5qQ);0SD)Ti^EpFa7QE=!J=yJd7%`V!LzjfmMNDX`fX^#NU(q8Cvz`C2@-de@mg9z%lpy6$j(Oy@U zrH3WZdCB85??{CWLGcy7mf5tc^$u>KzW;7<^}kldzcvQ{bJ6Ejg+4;z-=Kea*BSjY zUS0&Zrotj=DrTef)PtA)A`gu=X%)H4Z6_$S1p9~{3T^G_g`E%zG48PuYrWuagpbsu z{b+OEhbEpE?_!NeZB%~1+0|SV4a4lKM4^1$!e-aH zllKI-w!llTRz|~|t<>=O{xjR1{)_%u`2Ru`|AjI5Ym3<3nY0^YZ)n{-)>vKT+Fh;j zO*d<5v_6tV>2=9jB~-1f(pEdGT{W16s}*d!C0DJf-BqQ*TjkEi>fP0RJZ9SE@(3PS zgABZe)>#7$U&9;8%IEzVnOAvSRn4#f=Bjm7k&XLti*o8C%AAkG z15Yr6wp1VX_{>MD4Tl`x=X$2YP{d%<8ItBt_haTsX-71OFH?F=X5(LzUPI_r9!+1& zJavuLnuU<@DJy-s2NTFDHozkwG>8^QIFG`5vVOe9)&E5*{)=MpXP7(ZBQS1lgHt6B zR-8B29;v0aEX&PVkHfBW4v8Z(_l+ab-V^?}V_R#*Ys8|h)#8|~wTEk)o!Y%eFn-S* z%>DXA!Z%=)u*rF_6ZSwOzYC7T9A8g(Gv0Y6)0erm`uWU{pi9R45e1PaYx%sR!=oLy z$HH~DBH=c?e>J#HJhwkvz2$r&06xKG$r?zKU6Qc?wxds$qq}!T!u!!%nFl_z_XL+J zbL}-gAH`F^pT32sm)QLO9V-5i=br5UkAWPeMq)*rK5v8iAyDUm?E@g!8>~?27toW~ zDrxZC=o>~tbFvR>c$<@;PeJgifwg13fCq$Xxpb_L^;6t6T%@6s^P1U1&p~8$_BqhB@46qg>MJ!gOhGjds*p=g|P~ z$J8OF0Vqoy(C>jxyKSCiESfe-*xl?r9^kr5&K|WS{7NYaJam8F;_CmMD*ksO)6wxC zM~qYE2CR?CC1I#q7K~%2jsC7PA1Dm;&-8HKU@YLW+o31&Wf*Thd7T4mYlh!E<@^(R z30FZU^AX5u*FlE}a|rMaTj?1HiO_6`hqppwyC?jYqnnktvz4phQB@acOm`i$H*}PM z?`vt5oZ>c(Nf#TXY1f=B4IdppJq-t8nb`1~T}T7Z$DkhQkPt%(Snk8(iFuxe!RuuzgWe8aSZ;PN?K4!dy-0XPovWHppphU zwMhXlv?Y8(s+{cd+S1YU)51G*KsT$z88ZkzrG8l>62a>%6#H)HaU+39Q1loP8~Ekt7m!Iz!=+LP2I-NsP=TdkG>=4>oreKoCAq?FrohsEl1uv*6xRmg( zQ}M5h!T(fUE{;Kf*YyG*@Z(GiQi_28!Y z%ukM@ItRT28(=`InT6H@FCRF`?fWB*GZhL^bvOa`e!9endiFlKb1v&43 zW7GsWP3AodW5n>GgBon_BIQXUUz7AuMKk09zdtnM(whIjOU3`L82klTQUA%I4Y*ihS7 z!)~;fzs>aoHc4B8OF`vF?|62FlHZl2+ak(G3sDpswCK^OU=?!JXgO?{+U5L9UPUq8a5|gzgFJc zhjewJKf#fPM3W@>y;1KMPLb2<6YH(?3zRAfT#Jx=B^pT4Z?`!9f47SN-N~%-Mx|jK-hnayd4wv{g|*FF=5w7eu=R4k)6Q|g)fXb zkpRi63hV6t*&kV3Cv zbnxSjGRV@%zXiHGdZLvWM+iouw{iVD>|9&)^)Xt?tG_I7OjkGjgO!Zt8;;3&W0X^V zRpOwxi}v4ZmItCdq@ixMIMX_h$eC+d$j~z|$B5GR(eWaT8F{-7Z4Dq4Jf7spuS-6Z zfg|Ri(9^S$g}6uONAR@kIG^M9E2~k}vPtkX!12W@!if6Y(;F?D(YED1=p69&Y82Y5 z%TOHp?-qyuQWgKD$Z{0_%VG7qS+rE7JFNk4?j4#z;=q7UNPbr>0goN$HAa=YctG(d zK=IwO&oc+ypa*>cmG-iiHj5p0G0{sMnKP)dQX_?Sak=nd2eWI$HnE`H zm6$xuc)gD@Gv{RPU(f;lfj28Pwnl?NTrK)2E3;$B@xqnjHnPlG>#|HQfLxfruf?wD z47)9SDx}|TariG&@n41K1M!Z(i zpf=*SL*VupBZ_^XCdh8B@b{7_uXklarz;h)SY%y!l4y~5FG0Pd#v6h2MP@g;>)O9t zHoFGWfjHYQz2V$mE}!M=i@81r9p!pIicZ=8@Lu9+?|p<3i~63{o&bw+vupJ3rDePa z$}nTtGKKS&PG|q>G>*h3m2kpa!%7VBI;NM}dH{7#O zPOr$4VM+2zNEr8}R=6jjSGX@_63hMK&gWcT%!js5q=+5^=g${eAe)j7ap@H#em#`+ z3+Ly1*^o&1KO%FnLg-aUH@LnUU*qbvz{)J-#g;*xi?!6L)x0a9tI~hBIQ;KX@xLbq z|CMr*Yn7C2pS2J(WBw;)&G;nO771&>Yb=ZA+yPB+&=0-3f^yLE$K8?eHlXUZl}+t# z-|bmiw!bzBS~!vLI|vmCUkTZZDR;PYieISL3{MYuuM~#9Le5$mewROUaiJ5Q;1>?4 zXT#C^cCkV>eoz&waaR8&xUx10i#G{=!*z7kn344~(hSZ1k#(DM|4f(X5H!!>J+9>O znwQIH=vvEKr!hby$-k=FWXr8+t<0@3j%%&_br7u=1%qsu5bzG&Nn>1ts=T>u+#NK( z?2qsok>pJGmzyn%k>0>6q$n|Pc}0fpaIpWPf0p`Rui{@HgTKXd-NNB@&V_80v*z<4 zJa5^$f*W)L-nHDxF-%lwrH5xgR(Dl_P?uD(sd7z_atGC9EsBKGBg04!-Ty3<3v=YY zAglNwxDkA!pa9>t61{|TQ+vWRUN-XKomXFR1amT}vZLCBu^OKR?kMBo$*UE4+oP%H zb2Pv4u>666tKh{qIbgEqpVqnvHnSCNk1|GqbSSShFvR__CtrHH=93y-0fly+sF7I{ z#wyJ-4GhzVSnVIG?#+gM+XNbGg_Ws&7MxGU8SR^Bt#@HbSU=w4>i_pt{J$52KgM0~ z*f`0ev4UQ0GhONKHs=*x>E#qE>wRU%)*az0R!~&U94S|^eM1tDV2#LT$o0t4u_Lq~ zzlIfkIzN9=c$cC4WAyD5EP>-Z9Z{6u@-;i&AGDBIe;XCB3G_#64&TX&(p^X93y#Bg^500frdPDrEKG;jO4usG zI92NI$lC7wuf37*&A2M>t+^w?y$L#}yrk5gFhOd`WtQnu_pWG~qUj95;$1(6Kfe9{ zzKZ|%WAN7!!>U_N^KXE}SkP}=H^ZXe2>N0p7ng`h{!h^cT-{B+4$I}Jkwd#8@D%)c zP=ooOnrgx4s7dy1txodQ)HvuW$Y&$rLBKUNzwBM>#%8N7R?i&^Fasqiz)gi*d7kx{00NRj-JAzphz zc_$4KW|>W7gZ)o)HZLWnY;J$fYxUBxp!Wp20PRBI8Y(rr3qZRVLxKO!5`D%veeNl%#Q)v4WTUW^J!B+p`<%2ErIq8*^^=3<+4= z2Nn^mh!jBj8wvkBGG3nG(Gj=s$CSH~@beL!YavU2*HpoL>7s=;I}Yg5UGN-5E?@gy&66kvHo_Q&46X#XcL(w#UQ+lkSMgsSga1N# zkNF{|(B*X;U}hHv`+m~$@l&KB5`nk$ob*77`}Yc-yhlC2JxJsz-AJGhW*K1$y z-XI*UWcGWf?v`6UYnRUQBrSu40W&v8w0b;W>Q2)ftz3$pMrBWpR`;&SUgxfxdbAR@ zV|pA)h(+!+cC>OKLOj>ARde~fp6eGvgAuEi0t+hS@^l#?Uf6J6#EjpstzN2gD4NvLi78rkZho%|xWz7us7BtZL{ww@ATVYd& z`7~|m&K&O_>+|NUb-$rFX z<+EOmkF_5{Vw2|x%3_Y}@$A&? z959NW1}8gs^f}p=`JA*6$AuEs0cGV&`D^=g0f_7Wtx)k_5raRQ;Mb2EY}K*n_07AT!qg}_WcV+ErTVPW|se*K=Im0c*_Z|U4T91CfEt_+F4O2 z&NP1R?`5|0#?k|Np_$qakJ?yPQ{%L1%0N!}=#{|6gEcXm;rkpi36;k9(nTb(Z zve$mav`$7gNbtge9xo<=XR!3C-Ql--5*;-QG(}q%@YZ~LggG2@d9UQi+yNB>pkG`o zcR~YIi;|crZ-DJk=qcN{rOMrq40B$>Wew;r_VRS`-1gTkj{mPz@n4AyZ^wRfWZg#` zYm=Xm!ZU3NN*}IGW`#3oh5=gIGXLE#r40LPfX|qiD)ki!?mhIDd5!ta#mt(f6W*CA zcch5K`76iv>|x9&!|-yYe6!s|Lb<`-9X6>lX53df^K4jh`GH4E1@Zu54$9N{r>_;w z44&Rk^fc}$TBXiL6`rVrKDqh^U#~L9W5FtbUmS;)Ijje10)kavp?CW$^+@d=xE6eK zaTZH=y|p0P4nQ%4)bt{JKi%T+U!~%|3i&;WKWN1+fL0tgZ~^G-s%2#VV*NC`xPJlG z?(~hfeV(?Zrd^z-k#Hn({;)u689apag;lLaV$v4!7|n*HHXYZ~hK#PX%Q(a`FiQ}i zvz^oiOK+{Lg+d#87P*GQU))FL8o3dxdnGA<@PQrF+~J@$A9KL!^Oarf>Rfmeu}BkW zi)_KHl*VV5=dc^aL-uqLGgHhCc@X(nzGGiMg49R7_e{*5vCdmUaor&=0=rcDbu z=1ZeMXZY>yNpn9>pHwm{?*VYV9E&u-{VWAwFY0}+6B-)ZKfZCya2-@|`=E_ij#BEAwxV|U>E zM+@1=!Iir^$32X4uBT@BA_PyL2McgKG}*b7 z`8)7XXr7jegd<=EzcsaAksq*Vs03}SwAOn){+ETbWp%4F*j!BXVy*O_;Oni z)~Q!e4)m`n^mI3)V*GCF*0&XD(=_QWJ6hzF{gZ5VIZ1pLwj{U6X}Yult1uh$7u#WZ zkB}s`IkWt!6&szIXt!sulycKQB}u08BU}Rpcg@s=3PYzd8 zPlT<#|91oQh+Yz=-e1OEmZs1vHUVqEVy;`yxV}$w`tvidpGr9W`L$<+|Lqyqx$IPU zkfPsiari%|;{PCW9L1m0pVRA)G`#dn6T<5iMbXMPvsPe&)?l()MbYd1(h;90f=RD3 zCJ0(=g21BT@I`!9#5809zlEe|4M+^`DM?h)Xu@VN@W=gii^Kn4RQ&%18IIy_FsP&h z@v!~CVoivMaPK8pW0As-i-MwR`T3{l>r6uAq1xgUm$!+(v6{~F}= zAAcoi9wB%S2Eyl%$TUBj2d8P{@?Q6uQkZ$Nn9NMO)CCPe;5Ae z`G7j$wqpCL;J$5&fmfRzf20w_iiN~-avEmFG_K z%w05(?w)tY;-&MfbyatIYDliSd#<%=$&z{86hgn<;_z=)@oz?sqwPOm3;ty{)KWg} z(>M12>gIgzpFG*Q>ZDNL8`J+pj+ijltWA6E%^|BpN;8E7B8keJPi!0TW%K@Zem@TX zjVk^dk?1J??3Co>g0rHw0g$~4=1kJ{o@34jZ8XLP7Zd;K2{~sQ@DGar^sn`&t2q20 zRq=lmnT+E9P0#OF&U?N=1dGG}2P*zQ_%isPb;nHWmN2i^TsQm-3aX8tE|oiT;z?X(#=heoKw)ZCZ;(=o^_$a0o+$ zTw$nir7&Fh8NEb{sg9mtZ?PwY&BDdMNi+xYhWq+sPJK2O=P{xY{cLyUl=Zble-~pT$OdYQu zNJEExZ`e>08+5t^e$1UjvnK{8&ZdTv>}&%Wva?GXD8t@h&!F3H=l}Y|28NZ3^Vd9D zi|KuAv~f#h%SJM2S7@>7#Ja+2B7InKRNFOmyXS z*IhS`CRUV}7gDJ$H4%1s5N0fum6s3Wi*YlslQ^0m4H@`w2H*JCGYllKS&4coDZOph zKhg5E)U@T)puAgBT3TwS1{_P2JEhc+n3%{AvUK_qYCr-}Zb}=F3#(W6owUv0-3jMd#oO4X|?r4lkdZ;R#Chb(VOxn zBMYUxge}K+>uI?XhR0J($IU~)YWU%}a^FBx5$6!nY9~z|LK7jWTu#|Ye>Tnw5JUgn z;_!c5#s6_+Ig0;8nw-bUIjyOwX*o@vd($+K)-aaWc;a^AsB|pQ;>!F2O&sbNI+5SQ z1|&n>-I3x*clV^e-;jbXf9UP#=rLQZi`LIY^rFmUjMyCmglLxa(1q!lZuVTDGc99H0@ zVFjg>)J@b+tSd>OQTLXYPwEShGs)vwJXCp8IcQP_PnuX?$K#5{ui)N>`U0!9puS-O z`e!K(DJj^Mp4zEbW6#jPPvAiia7Ev5!fC?hOJRT)OOUgi$Kk(O#eXxxM)5z(YyaD~ z3?{QRub{ZNAkS(x@xBAM%X#8vGChiY-ajLa*b;>a;5xMVXrdN#IU1muXiLS^pM5eV z=vHbB#1gf*^hoD9=zkhTX({oG=^R* zQFxL)ASALUNtcKZ8cyMYX9bCcm#xfgcvL`w^ohmFIY&#cGbR-ar!G4>5ZH@|G?{Gp z&*?HY^yh^1npRSW&WO0#16n-TEa1Uro)P7NQWzf4tHq(eV$bsxhd;N)!HBltSrq>m zvh#xQxpE!i)k7@@kH(gPg2GWnqsNTBrg&Vb(>3|JGQ_j|MKW!N@4x8Iulcv5+XY=4 zwN}Dz9iX);;j?kwx1aU>!Fb-cAB0YW)b}oGd-Ssk2jEwn6GV5;EciL!u7fX>>$pAq ze!Ruuzg5M5EAkx0|8JmyNFw=dWDQ}57eF^F;;VH#%5EJ*R##3-sm?7FWWfgDOtHh^ zBeN*LE;wK7YxFYF*u?m?j3K8xYr$zf+t8pJUwdyYjj;JU%>#z# zblG#5-(Jr~kDt%3<#wkg+({!1epbSK`K}_@Cjo}F=&wh@yQmFb1pVoC>BNc%cEi{N z*8EwJ@;`>%&wq!%x{v*TQoP9#!vBO@Cbw%HUai$NL&pZP390h|HEh&#zk+%U94;dx zR{Xa_U?X0aGk-WShYfcxG5^2YRQ$Ka;QtIfc3soXhAb@m{UAG7Gq;oTaU{Rq0sBpn z@CMNNul{Qk&z-83fG*g74z*`oX&(B(c3NMwI;UJm#j7)57p!PCYsxM!#!By^)k2d+ zIny-JRV=_QNZ3idiuQ?ia$I)9%|xwxX76$J%n*tmcXkKJx6R_q= zBH^aUC?Z=iX&sU9Kf|==a}ka2`Aq)&sz@i+`a`rp*Ucm=S_kiN%#jW+avf!(9b_GCSLk5kWxXF)|9JlYl#2gTG5AO8I%sl1 zb=~U-wL8rZY)_zp1cQL^z)qnLk7neWhvcnxtWGP3f0)&prquF0lmiFKK}z2lYZ|DW zaT`(`M-^$Wy~{B}D1@yDw(039n}KY5gqN06*v`04#TR7`-*{jIm`@-OIJ@K#dFMMD5!uBb=hHs2?*e8%-s9>F;8%LS01ck$_iSVzjh+I9Sf4r{zlCf)jrh<{`5*XG?-Vw%3B&4! z5i1ndzkfy@99Z%B7pBI$cQ(xr%%@=q{z#DjO%Afs^lqGET-ryW(OD>AFvb+(pA20m_Hr zxZy_s%Vh&@D4zfQ`D7!9T4uh#xOnk`GFTe{*03l?{F{&WeN*6bI99T8dt~J2atrR^ z_mxBG#yrFp^m|`QyZobo~6m0gnhJE*>Uv#E=6slJ0hSE%#{3lK7p=9dok&Abude zk~z0*zH3!hU72=_zKEfF@wC{HNqbr07N@?G9I#x;H>HfEWwC-U_Wm`Pcx6LYuQ<1C z%MKnRbt)nH=^?KF|BQv@X2Se@IM)G?P8DFB@>?Ca||WA%TsWL zvhx_OeDnic@e*_}SqN+}&nabNvgwEBxutA$8Ol+aQjXM8)KPY-9Q|;|J+6){>SW{8 z;}f{vleH)73gbPl71~I$H|v+BYRNK=C_1ona$53W-FR14@~QXKH+c9G?Ifc&tDi!z zWGfE;XI1>4jlus^O&g}v4CA%;l)Z?WRq*nb9nYbTEI}=4Esd5De$M$XyN0r!DedX3 z&mmiAmr;51p0bAI7sW{Cp&$*pEjz)Val?J{$0=Nx<2Z5gqdOkoF%LCb%=&5RWtf!Z z=VP^38%taxwESMHQ`^bowxZ9EvKDA^hWGOCvC*yY?(lzuN|uzmJl*AT!D@L~s1b;c_~9t;E_-4{`WE zr{ez{@*A!H-2PK6J^1wbfA3X1yZ#){{)A`C&hacYkxZM;@$4+w`o`Xh!~Z8L{y#yEqWGVgxpAP) zZ_YuR-=Bf~$40XL1^Zh=5w8vII|x%S8A&;;(vXKf8~%ybOea&~EMSPe2zx2^=r^OX zxajrY`wO|w$&JhQzTHlzKpg(htN1^UU}xeVOFzuGe5oxqu2_sNCQ@t6OLG$;XU2XU zJHI_ON&V&L8*v`KjZAN0zv4S&8gx6#8unS(`SVM0i^Kl~75^7Nj5G1S5c=@Bx_3Zl zD;nwbpz|HrpToWh^!_FGJ=m2>e<6{bB}}y3d^ktN%zBnE=eou1dUJll%dQpsX6vc4 z@r#&pf=8Fk7KcBdn*l&Cf&v$c|CyNZGH{_A#{{2KFyZgj#b7c->F8Z(Oy7pP7z%Lw F{~y5FtyBO2 literal 0 HcmV?d00001 diff --git a/ScottoT9/PCB/QMK/config.h b/ScottoT9/PCB/QMK/config.h new file mode 100644 index 0000000..838fdc6 --- /dev/null +++ b/ScottoT9/PCB/QMK/config.h @@ -0,0 +1,7 @@ +#pragma once + +// OLED +#define OLED_DISPLAY_128X64 +#define I2C_DRIVER I2CD1 +#define I2C1_SCL_PIN GP27 +#define I2C1_SDA_PIN GP26 diff --git a/ScottoT9/PCB/QMK/halconf.h b/ScottoT9/PCB/QMK/halconf.h new file mode 100644 index 0000000..817e808 --- /dev/null +++ b/ScottoT9/PCB/QMK/halconf.h @@ -0,0 +1,5 @@ +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next \ No newline at end of file diff --git a/ScottoT9/PCB/QMK/keyboard.json b/ScottoT9/PCB/QMK/keyboard.json new file mode 100644 index 0000000..11bde9e --- /dev/null +++ b/ScottoT9/PCB/QMK/keyboard.json @@ -0,0 +1,47 @@ +{ + "manufacturer": "ScottoKeebs", + "keyboard_name": "ScottoT9 (PCB Edition)", + "maintainer": "joe-scotto", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true + }, + "matrix_pins": { + "cols": ["GP29", "GP11", "GP3"], + "rows": ["GP9", "GP5", "GP6", "GP7", "GP8"] + }, + "processor": "RP2040", + "url": "https://scottokeebs.com", + "usb": { + "device_version": "1.0.0", + "pid": "0x0039", + "vid": "0x534B" + }, + "layouts": { + "LAYOUT_ortho_2_4x3": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [0, 2], "x": 2, "y": 0 }, + { "matrix": [1, 0], "x": 0, "y": 1 }, + { "matrix": [1, 1], "x": 1, "y": 1 }, + { "matrix": [1, 2], "x": 2, "y": 1 }, + { "matrix": [2, 0], "x": 0, "y": 2 }, + { "matrix": [2, 1], "x": 1, "y": 2 }, + { "matrix": [2, 2], "x": 2, "y": 2 }, + { "matrix": [3, 0], "x": 0, "y": 3 }, + { "matrix": [3, 1], "x": 1, "y": 3 }, + { "matrix": [3, 2], "x": 2, "y": 3 }, + { "matrix": [4, 0], "x": 0, "y": 4 }, + { "matrix": [4, 1], "x": 1, "y": 4 }, + { "matrix": [4, 2], "x": 2, "y": 4 } + ] + } + } +} diff --git a/ScottoT9/PCB/QMK/keymaps/default/keymap.c b/ScottoT9/PCB/QMK/keymaps/default/keymap.c new file mode 100644 index 0000000..e0eb47d --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/default/keymap.c @@ -0,0 +1,24 @@ +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// ┌──────┐ ┌──────┐ +// │ left │ │ rght │ +// ├──────┼───┼──────┤ +// │ 1 │ 2 │ 3 │ +// ├──────┼───┼──────┤ +// │ 4 │ 5 │ 6 │ +// ├──────┼───┼──────┤ +// │ 7 │ 8 │ 9 │ +// ├──────┼───┼──────┤ +// │ * │ 0 │ # │ +// └──────┴───┴──────┘ +[0] = LAYOUT_ortho_2_4x3( + KC_LEFT , KC_RIGHT, + KC_1 , KC_2 , KC_3 , + KC_4 , KC_5 , KC_6 , + KC_7 , KC_8 , KC_9 , + KC_ASTERISK , KC_0 , KC_HASH +) +}; +// clang-format on diff --git a/ScottoT9/PCB/QMK/keymaps/scotto/combos.c b/ScottoT9/PCB/QMK/keymaps/scotto/combos.c new file mode 100644 index 0000000..bfda783 --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/scotto/combos.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +enum combos { + ENTER, +}; + +const uint16_t PROGMEM enter[] = {KC_RSFT, LT(1, KC_BSPC), COMBO_END}; + +combo_t key_combos[] = { + [ENTER] = COMBO(enter, KC_ENTER), +}; diff --git a/ScottoT9/PCB/QMK/keymaps/scotto/keymap.c b/ScottoT9/PCB/QMK/keymaps/scotto/keymap.c new file mode 100644 index 0000000..47c70a8 --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/scotto/keymap.c @@ -0,0 +1,353 @@ +#include "combos.c" +#include "tapdance.c" +#include QMK_KEYBOARD_H +#include +char wpm_str[10]; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// ┌──────────┐ ┌─────────────┐ +// │ left │ │ rght │ +// ├──────────┼──────────┼─────────────┤ +// │ TD(TD_1) │ TD(TD_2) │ TD(TD_3) │ +// ├──────────┼──────────┼─────────────┤ +// │ TD(TD_4) │ TD(TD_5) │ TD(TD_6) │ +// ├──────────┼──────────┼─────────────┤ +// │ TD(TD_7) │ TD(TD_8) │ TD(TD_9) │ +// ├──────────┼──────────┼─────────────┤ +// │ rsft │ TD(TD_0) │ LT(1, bspc) │ +// └──────────┴──────────┴─────────────┘ +[0] = LAYOUT_ortho_2_4x3( + KC_LEFT , KC_RIGHT , + TD(TD_1) , TD(TD_2) , TD(TD_3) , + TD(TD_4) , TD(TD_5) , TD(TD_6) , + TD(TD_7) , TD(TD_8) , TD(TD_9) , + KC_RSFT , TD(TD_0) , LT(1, KC_BSPC) +), + +// ┌──────┐ ┌──────┐ +// │ left │ │ rght │ +// ├──────┼─────────┼──────┤ +// │ tab │ up │ ent │ +// ├──────┼─────────┼──────┤ +// │ left │ down │ rght │ +// ├──────┼─────────┼──────┤ +// │ caps │ QK_BOOT │ del │ +// ├──────┼─────────┼──────┤ +// │ │ │ │ +// └──────┴─────────┴──────┘ +[1] = LAYOUT_ortho_2_4x3( + KC_LEFT , KC_RIGHT , + KC_TAB , KC_UP , KC_ENTER , + KC_LEFT , KC_DOWN , KC_RIGHT , + KC_CAPS , QK_BOOT , KC_DELETE, + KC_TRNS , KC_TRNS , KC_TRNS +) +}; +// clang-format on + +#if OLED_ENABLE +// WPM-responsive animation stuff here +#define IDLE_FRAMES 5 +#define IDLE_SPEED 20 // below this wpm value your animation will idle + +// #define PREP_FRAMES 1 // uncomment if >1 + +#define TAP_FRAMES 2 +#define TAP_SPEED 40 // above this wpm value typing animation to trigger + +#define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms +// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing +#define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024 + +uint32_t anim_timer = 0; +uint32_t anim_sleep = 0; +uint8_t current_idle_frame = 0; +// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1 +uint8_t current_tap_frame = 0; + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; } + +// Code containing pixel art, contains: +// 5 idle frames, 1 prep frame, and 2 tap frames + +// To make your own pixel art: +// save a png/jpeg of an 128x32 image (resource: https://www.pixilart.com/draw ) +// follow this guide up to and including "CONVERT YOUR IMAGE" +// https://docs.splitkb.com/hc/en-us/articles/360013811280-How-do-I-convert-an-image-for-use-on-an-OLED-display- replace +// numbers in brackets with your own if you start getting errors when compiling make sure you didn't accedentally delete +// a bracket +static void render_anim(void) { + static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, + 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x82, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x86, + 0x86, 0x40, 0x40, 0x40, 0x40, 0x21, 0x22, 0x22, 0x20, 0x11, 0x11, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x34, 0xc4, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, + 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x04, 0x02, + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x31, 0xc1, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static const char PROGMEM prep[][ANIM_SIZE] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, + 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x64, 0x18, 0x04, 0x12, 0xc2, 0xca, 0x24, 0x88, 0xf0, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x41, 0x42, 0x24, 0x98, 0xc0, 0x88, 0x88, + 0x8c, 0x9c, 0x1c, 0x1e, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc1, 0x01, 0x01, 0x02, 0x02, 0x04, 0x84, 0x44, 0x44, 0x42, + 0x82, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x80, 0x80, 0x40, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, + 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x02, 0x18, 0x19, 0x00, 0x05, 0xfe, 0x80, 0x83, + 0x83, 0x40, 0x40, 0x40, 0x40, 0x20, 0x21, 0x21, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x80, 0x00, 0x00, 0x01, 0x86, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0f, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x0f, 0x07, 0x03, 0x03, 0x61, 0xf0, + 0xf8, 0xfc, 0x60, 0x01, 0x01, 0x01, 0x3c, 0x78, 0xf8, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + }; + + // assumes 1 frame prep stage + void animation_phase(void) { + if (get_current_wpm() <= IDLE_SPEED) { + current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES; + oled_write_raw_P(idle[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE); + } + if (get_current_wpm() > IDLE_SPEED && get_current_wpm() < TAP_SPEED) { + // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1 + oled_write_raw_P(prep[0], ANIM_SIZE); // remove if IDLE_FRAMES >1 + } + if (get_current_wpm() >= TAP_SPEED) { + current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES; + oled_write_raw_P(tap[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE); + } + } + if (get_current_wpm() != 000) { + oled_on(); // not essential but turns on animation OLED with any alpha keypress + if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animation_phase(); + } + anim_sleep = timer_read32(); + } else { + if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) { + oled_off(); + } else { + if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { + anim_timer = timer_read32(); + animation_phase(); + } + } + } +} + +// Used to draw on to the oled screen +bool oled_task_user(void) { + render_anim(); // renders pixelart + + oled_set_cursor(0, 0); // sets cursor to (row, column) using charactar spacing (5 rows on 128x32 screen, anything more + // will overflow back to the top) + sprintf(wpm_str, + "WPM:%03d", + get_current_wpm()); // edit the string to change wwhat shows up, edit %03d to change how many digits show up + oled_write(wpm_str, false); // writes wpm on top left corner of string + + led_t led_state = host_keyboard_led_state(); // caps lock stuff, prints CAPS on new line if caps led is on + oled_set_cursor(0, 1); + oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false); + + return false; +} +#endif diff --git a/ScottoT9/PCB/QMK/keymaps/scotto/mod_lock.c b/ScottoT9/PCB/QMK/keymaps/scotto/mod_lock.c new file mode 100644 index 0000000..a5c70de --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/scotto/mod_lock.c @@ -0,0 +1,135 @@ +#include QMK_KEYBOARD_H + +enum tap_dance { + SFT_LOCK, + CMD_LOCK, + CTRL_LOCK, + ALT_LOCK +}; + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_HOLD, + TD_SINGLE_TAP, +} td_state_t; + +typedef struct { + bool is_press_action; + td_state_t state; +} td_tap_t; + +static td_tap_t xtap_state = {.is_press_action = true, .state = TD_NONE}; +static bool shift_locked = false; +static bool cmd_locked = false; +static bool ctrl_locked = false; +static bool alt_locked = false; + +// Determine state of tap dance +td_state_t cur_dance(tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) { + return TD_SINGLE_TAP; + } else { + return TD_SINGLE_HOLD; + } + } + return TD_UNKNOWN; +} + +// Shift lock +void sft_lock_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case TD_SINGLE_TAP: + if (shift_locked) { + unregister_code(KC_LSFT); + shift_locked = false; + } else { + register_code(KC_LSFT); + shift_locked = true; + } + break; + case TD_SINGLE_HOLD: + register_code(KC_LSFT); + break; + default: + break; + } +} + +// CMD lock +void cmd_lock_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case TD_SINGLE_TAP: + if (cmd_locked) { + unregister_code(KC_LGUI); + cmd_locked = false; + } else { + register_code(KC_LGUI); + cmd_locked = true; + } + break; + default: + break; + } +} + +// CTRL lock +void ctrl_lock_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case TD_SINGLE_TAP: + if (ctrl_locked) { + unregister_code(KC_LCTL); + ctrl_locked = false; + } else { + register_code(KC_LCTL); + ctrl_locked = true; + } + break; + default: + break; + } +} + +// ALT lock +void alt_lock_finished(tap_dance_state_t *state, void *user_data) { + xtap_state.state = cur_dance(state); + switch (xtap_state.state) { + case TD_SINGLE_TAP: + if (alt_locked) { + unregister_code(KC_LALT); + alt_locked = false; + } else { + register_code(KC_LALT); + alt_locked = true; + } + break; + default: + break; + } +} + +// Tap dance end +void sft_lock_reset(tap_dance_state_t *state, void *user_data) { + switch (xtap_state.state) { + case TD_SINGLE_HOLD: + unregister_code(KC_LSFT); + break; + default: + break; + } + xtap_state.state = TD_NONE; +} + +void generic_reset(tap_dance_state_t *state, void *user_data) { xtap_state.state = TD_NONE; } + +// Define tap dance actions +tap_dance_action_t tap_dance_actions[] = { + [SFT_LOCK] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, sft_lock_finished, sft_lock_reset), + [CMD_LOCK] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, cmd_lock_finished, generic_reset), + [CTRL_LOCK] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctrl_lock_finished, generic_reset), + [ALT_LOCK] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, alt_lock_finished, generic_reset), +}; diff --git a/ScottoT9/PCB/QMK/keymaps/scotto/rules.mk b/ScottoT9/PCB/QMK/keymaps/scotto/rules.mk new file mode 100644 index 0000000..56b5ece --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/scotto/rules.mk @@ -0,0 +1,3 @@ +TAP_DANCE_ENABLE = yes +COMBO_ENABLE = yes +WPM_ENABLE = yes diff --git a/ScottoT9/PCB/QMK/keymaps/scotto/tapdance.c b/ScottoT9/PCB/QMK/keymaps/scotto/tapdance.c new file mode 100644 index 0000000..b5e2360 --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/scotto/tapdance.c @@ -0,0 +1,159 @@ +#include QMK_KEYBOARD_H + +enum tap_dance_keycodes { + TD_1, + TD_2, + TD_3, + TD_4, + TD_5, + TD_6, + TD_7, + TD_8, + TD_9, + TD_0, +}; + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_HOLD, + TD_DOUBLE_HOLD, + TD_TRIPLE_HOLD, + TD_QUAD_HOLD, + TD_SINGLE_TAP, + TD_DOUBLE_TAP, + TD_TRIPLE_TAP, + TD_QUAD_TAP +} td_state_t; + +static td_state_t td_state = TD_NONE; + +// Determine current tap-dance state +td_state_t cur_dance(tap_dance_state_t *state) { + switch (state->count) { + case 1: + return (state->interrupted || !state->pressed) ? TD_SINGLE_TAP : TD_SINGLE_HOLD; + case 2: + return (state->interrupted || !state->pressed) ? TD_DOUBLE_TAP : TD_DOUBLE_HOLD; + case 3: + return (state->interrupted || !state->pressed) ? TD_TRIPLE_TAP : TD_TRIPLE_HOLD; + case 4: + return (state->interrupted || !state->pressed) ? TD_QUAD_TAP : TD_QUAD_HOLD; + default: + return TD_UNKNOWN; + } +} + +void symbol_finished(tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + tap_code(KC_QUOTE); + break; + case TD_SINGLE_HOLD: + tap_code(KC_1); + break; + case TD_DOUBLE_TAP: + tap_code(KC_COMMA); + break; + case TD_TRIPLE_TAP: + tap_code(KC_SEMICOLON); + break; + case TD_QUAD_TAP: + tap_code(KC_SLSH); + break; + default: + break; + } +} + +void space_finished(tap_dance_state_t *state, void *user_data) { + td_state = cur_dance(state); + switch (td_state) { + case TD_SINGLE_TAP: + tap_code(KC_SPC); + break; + case TD_SINGLE_HOLD: + tap_code(KC_0); + break; + case TD_DOUBLE_TAP: + tap_code(KC_DOT); + break; + case TD_TRIPLE_TAP: + tap_code16(S(KC_SLSH)); + break; + case TD_QUAD_TAP: + tap_code16(S(KC_1)); + break; + default: + break; + } +} + +void td_reset(tap_dance_state_t *state, void *user_data) { td_state = TD_NONE; } + +static void t9_handler(td_state_t state, bool press, uint16_t kc1, uint16_t kc2, uint16_t kc3, uint16_t kc4, + uint16_t kc_num) { + uint16_t key = KC_NO; + switch (state) { + case TD_SINGLE_TAP: + key = kc1; + break; + case TD_SINGLE_HOLD: + key = kc_num; + break; + case TD_DOUBLE_TAP: + key = kc2; + break; + case TD_TRIPLE_TAP: + key = kc3; + break; + case TD_QUAD_TAP: + key = kc4; + break; + default: + return; + } + + if (key != KC_NO) { + if (press) + register_code(key); + else + unregister_code(key); + } +} + +// Helper macro for T9 declaration +#define T9(name, kc1, kc2, kc3, kc4, kc_num) \ + void td_##name##_finished(tap_dance_state_t *state, void *user_data) { \ + td_state = cur_dance(state); \ + t9_handler(td_state, true, kc1, kc2, kc3, kc4, kc_num); \ + } \ + \ + void td_##name##_reset(tap_dance_state_t *state, void *user_data) { \ + t9_handler(td_state, false, kc1, kc2, kc3, kc4, kc_num); \ + td_state = TD_NONE; \ + } + +// Tap-dance key definitions +T9(2, KC_A, KC_B, KC_C, KC_NO, KC_2); +T9(3, KC_D, KC_E, KC_F, KC_NO, KC_3); +T9(4, KC_G, KC_H, KC_I, KC_NO, KC_4); +T9(5, KC_J, KC_K, KC_L, KC_NO, KC_5); +T9(6, KC_M, KC_N, KC_O, KC_NO, KC_6); +T9(7, KC_P, KC_Q, KC_R, KC_S, KC_7); +T9(8, KC_T, KC_U, KC_V, KC_NO, KC_8); +T9(9, KC_W, KC_X, KC_Y, KC_Z, KC_9); + +tap_dance_action_t tap_dance_actions[] = { + [TD_1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, symbol_finished, td_reset), + [TD_2] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_2_finished, td_2_reset), + [TD_3] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_3_finished, td_3_reset), + [TD_4] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_4_finished, td_4_reset), + [TD_5] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_5_finished, td_5_reset), + [TD_6] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_6_finished, td_6_reset), + [TD_7] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_7_finished, td_7_reset), + [TD_8] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_8_finished, td_8_reset), + [TD_9] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_9_finished, td_9_reset), + [TD_0] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, space_finished, td_reset), +}; diff --git a/ScottoT9/PCB/QMK/keymaps/vial/config.h b/ScottoT9/PCB/QMK/keymaps/vial/config.h new file mode 100644 index 0000000..e4ec217 --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/vial/config.h @@ -0,0 +1,6 @@ +#pragma once + +// Vial +#define VIAL_KEYBOARD_UID {0x2A, 0x7D, 0x49, 0xE7, 0x63, 0xC0, 0x9B, 0x8A} +#define VIAL_UNLOCK_COMBO_ROWS {3, 3} +#define VIAL_UNLOCK_COMBO_COLS {0, 2} diff --git a/ScottoT9/PCB/QMK/keymaps/vial/keymap.c b/ScottoT9/PCB/QMK/keymaps/vial/keymap.c new file mode 100644 index 0000000..e0eb47d --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/vial/keymap.c @@ -0,0 +1,24 @@ +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// ┌──────┐ ┌──────┐ +// │ left │ │ rght │ +// ├──────┼───┼──────┤ +// │ 1 │ 2 │ 3 │ +// ├──────┼───┼──────┤ +// │ 4 │ 5 │ 6 │ +// ├──────┼───┼──────┤ +// │ 7 │ 8 │ 9 │ +// ├──────┼───┼──────┤ +// │ * │ 0 │ # │ +// └──────┴───┴──────┘ +[0] = LAYOUT_ortho_2_4x3( + KC_LEFT , KC_RIGHT, + KC_1 , KC_2 , KC_3 , + KC_4 , KC_5 , KC_6 , + KC_7 , KC_8 , KC_9 , + KC_ASTERISK , KC_0 , KC_HASH +) +}; +// clang-format on diff --git a/ScottoT9/PCB/QMK/keymaps/vial/rules.mk b/ScottoT9/PCB/QMK/keymaps/vial/rules.mk new file mode 100644 index 0000000..6bc7063 --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/vial/rules.mk @@ -0,0 +1,2 @@ +VIA_ENABLE = yes +VIAL_ENABLE = yes \ No newline at end of file diff --git a/ScottoT9/PCB/QMK/keymaps/vial/vial.json b/ScottoT9/PCB/QMK/keymaps/vial/vial.json new file mode 100644 index 0000000..5297b3e --- /dev/null +++ b/ScottoT9/PCB/QMK/keymaps/vial/vial.json @@ -0,0 +1,14 @@ +{ + "matrix": { + "rows": 4, + "cols": 3 + }, + "layouts": { + "keymap": [ + ["0,0", "0,1", "0,2"], + ["1,0", "1,1", "1,2"], + ["2,0", "2,1", "2,2"], + ["3,0", "3,1", "3,2"] + ] + } +} diff --git a/ScottoT9/PCB/QMK/mcuconf.h b/ScottoT9/PCB/QMK/mcuconf.h new file mode 100644 index 0000000..6203668 --- /dev/null +++ b/ScottoT9/PCB/QMK/mcuconf.h @@ -0,0 +1,6 @@ +#pragma once + +#include_next + +#undef RP_I2C_USE_I2C +#define RP_I2C_USE_I2C1 TRUE diff --git a/ScottoT9/PCB/QMK/readme.md b/ScottoT9/PCB/QMK/readme.md new file mode 100644 index 0000000..11b79f3 --- /dev/null +++ b/ScottoT9/PCB/QMK/readme.md @@ -0,0 +1,27 @@ +# ScottoT9 + +![ScottoT9](https://i.imgur.com/kJeIEhAh.jpeg) + +A 14-key macropad. Case files available [here](https://github.com/joe-scotto/scottokeebs). + +- Keyboard Maintainer: [Joe Scotto](https://github.com/joe-scotto) +- Hardware Supported: RP2040 +- Hardware Availability: [Amazon](https://amazon.com) + +Make example for this keyboard (after setting up your build environment): + + make scottokeebs/scottot9:default + +Flashing example for this keyboard: + + make scottokeebs/scottot9:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +- **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +- **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +- **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/ScottoT9/PCB/README.md b/ScottoT9/PCB/README.md new file mode 100644 index 0000000..47bdc7e --- /dev/null +++ b/ScottoT9/PCB/README.md @@ -0,0 +1,7 @@ +# ScottoT9 (SK39) + +The ScottoT9 (PCB Edition) is a 14-key macropad based on the T9 keyboard layout with a 128x64 OLED display. + +You can read more about the components and how to build it [here](https://scottokeebs.com/blogs/macropads/scottot9-pcb-macropad). + + diff --git a/ScottoT9/QMK/keymaps/test b/ScottoT9/QMK/keymaps/test deleted file mode 100644 index e69de29..0000000