aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/preonic/keymaps/kjwon15/config.h67
-rw-r--r--keyboards/preonic/keymaps/kjwon15/keymap.c376
-rw-r--r--keyboards/preonic/keymaps/kjwon15/readme.md27
-rw-r--r--keyboards/preonic/keymaps/kjwon15/rules.mk2
-rw-r--r--keyboards/preonic/preonic.c2
5 files changed, 473 insertions, 1 deletions
diff --git a/keyboards/preonic/keymaps/kjwon15/config.h b/keyboards/preonic/keymaps/kjwon15/config.h
new file mode 100644
index 000000000..af7b8bc28
--- /dev/null
+++ b/keyboards/preonic/keymaps/kjwon15/config.h
@@ -0,0 +1,67 @@
1#pragma once
2
3
4#define TAPPING_TERM 200
5
6/* #define MK_3_SPEED */
7#define MK_MOMENTARY_ACCEL
8#define MOUSEKEY_MAX_SPEED 8
9
10// Must raise 5 halftones
11/* #define CUSTOM_STARTUP \ */
12/* Q__NOTE(_FS7), \ */
13/* W__NOTE(_B7), */
14
15#undef MUSICAL_NOTE
16#define MUSICAL_NOTE(note, duration) {((NOTE##note) * 1.3348398541700344), duration}
17
18#define CUSTOM_STARTUP \
19 QD_NOTE(_A6), \
20 QD_NOTE(_C7), \
21 QD_NOTE(_A7), \
22 QD_NOTE(_F7), \
23 QD_NOTE(_G7), \
24 HD_NOTE(_C8),
25
26#undef MUSICAL_NOTE
27#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration}
28
29#ifdef AUDIO_ENABLE
30 #define STARTUP_SONG SONG(CUSTOM_STARTUP)
31 // #define STARTUP_SONG SONG(NO_SOUND)
32
33 #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
34 SONG(COLEMAK_SOUND), \
35 SONG(DVORAK_SOUND) \
36 }
37#endif
38
39#define MUSIC_MASK (keycode != KC_NO)
40
41#define AUDIO_CLICKY
42#define AUDIO_CLICKY_FREQ_DEFAULT 440.f
43
44/*
45 * MIDI options
46 */
47
48/* Prevent use of disabled MIDI features in the keymap */
49//#define MIDI_ENABLE_STRICT 1
50
51/* enable basic MIDI features:
52 - MIDI notes can be sent when in Music mode is on
53*/
54
55#define MIDI_BASIC
56
57/* enable advanced MIDI features:
58 - MIDI notes can be added to the keymap
59 - Octave shift and transpose
60 - Virtual sustain, portamento, and modulation wheel
61 - etc.
62*/
63//#define MIDI_ADVANCED
64
65/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
66//#define MIDI_TONE_KEYCODE_OCTAVES 2
67
diff --git a/keyboards/preonic/keymaps/kjwon15/keymap.c b/keyboards/preonic/keymaps/kjwon15/keymap.c
new file mode 100644
index 000000000..bca3575fd
--- /dev/null
+++ b/keyboards/preonic/keymaps/kjwon15/keymap.c
@@ -0,0 +1,376 @@
1/* Copyright 2015-2017 Jack Humbert
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18#include "muse.h"
19
20enum preonic_layers {
21 _QWERTY,
22 _PURE,
23 _BLANK,
24 _LOWER,
25 _RAISE,
26 _ADJUST,
27
28 _MOUSE
29};
30
31enum preonic_keycodes {
32 QWERTY = SAFE_RANGE,
33 PURE,
34 BLANK,
35 LOWER,
36 RAISE,
37 KC_CESC,
38 SPC_MOU
39};
40
41const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
42
43/* Qwerty
44 * ,-----------------------------------------------------------------------------------.
45 * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
46 * |------+------+------+------+------+------+------+------+------+------+------+------|
47 * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ |
48 * |------+------+------+------+------+-------------+------+------+------+------+------|
49 * | C/ESC| A | S | D | F | G | H | J | K | L | ; | " |
50 * |------+------+------+------+------+------|------+------+------+------+------+------|
51 * | Shift| Z | X | C | V | B | N | M | , | . | / | SF/EN|
52 * |------+------+------+------+------+------+------+------+------+------+------+------|
53 * | Enter| Ctrl | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right |
54 * `-----------------------------------------------------------------------------------'
55 */
56[_QWERTY] = LAYOUT_preonic_grid(
57 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
58 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \
59 KC_CESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
60 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_SFTENT, \
61 KC_ENT, KC_LCTL, KC_LGUI, KC_LALT, LOWER, SPC_MOU, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
62),
63
64/* Pure
65 * ,-----------------------------------------------------------------------------------.
66 * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
67 * |------+------+------+------+------+------+------+------+------+------+------+------|
68 * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ |
69 * |------+------+------+------+------+-------------+------+------+------+------+------|
70 * | Cntl | A | S | D | F | G | H | J | K | L | ; | " |
71 * |------+------+------+------+------+------|------+------+------+------+------+------|
72 * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift|
73 * |------+------+------+------+------+------+------+------+------+------+------+------|
74 * | Enter| Ctrl | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right |
75 * `-----------------------------------------------------------------------------------'
76 */
77[_PURE] = LAYOUT_preonic_grid(
78 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
79 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \
80 KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
81 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
82 KC_ENT, KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
83),
84
85/* Blank
86 * ,-----------------------------------------------------------------------------------.
87 * | | | | | | | | | | | | |
88 * |------+------+------+------+------+------+------+------+------+------+------+------|
89 * | | | | | | | | | | | | |
90 * |------+------+------+------+------+-------------+------+------+------+------+------|
91 * | | | | | | | | | | | | |
92 * |------+------+------+------+------+------|------+------+------+------+------+------|
93 * | | | | | | | | | | | | |
94 * |------+------+------+------+------+------+------+------+------+------+------+------|
95 * | | | | |Lower | |Raise | | | | |
96 * `-----------------------------------------------------------------------------------'
97 */
98[_BLANK] = LAYOUT_preonic_grid(
99 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
100 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
101 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
102 KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
103 KC_NO, KC_NO, KC_NO, KC_NO, LOWER, KC_NO, KC_NO, RAISE, KC_NO, KC_NO, KC_NO, KC_NO \
104),
105
106/* Lower
107 * ,-----------------------------------------------------------------------------------.
108 * | ESC | ! | @ | # | $ | % | ^ | & | * | - | = | Bksp |
109 * |------+------+------+------+------+-------------+------+------+------+------+------|
110 * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
111 * |------+------+------+------+------+-------------+------+------+------+------+------|
112 * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
113 * |------+------+------+------+------+------|------+------+------+------+------+------|
114 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | HOME | END | |
115 * |------+------+------+------+------+------+------+------+------+------+------+------|
116 * | | | | | | | | Ralt | Vol- | Vol+ | Play |
117 * `-----------------------------------------------------------------------------------'
118 */
119[_LOWER] = LAYOUT_preonic_grid(
120 KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_EQL , KC_BSPC, \
121 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
122 _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
123 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
124 _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_VOLD, KC_VOLU, KC_MPLY \
125),
126
127/* Raise
128 * ,-----------------------------------------------------------------------------------.
129 * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |PrtScr|
130 * |------+------+------+------+------+------+------+------+------+------+------+------|
131 * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
132 * |------+------+------+------+------+-------------+------+------+------+------+------|
133 * | | MUTE | VOL- | VOL+ | F4 | F5 | F6 | - | = | [ | ] | \ |
134 * |------+------+------+------+------+------|------+------+------+------+------+------|
135 * | | PLAY | PREV | NEXT | STOP | F11 | F12 |ISO # |ISO / | PGDN | PGUP | |
136 * |------+------+------+------+------+------+------+------+------+------+------+------|
137 * | | | | | | | | Ralt | Vol- | Vol+ | Mute |
138 * `-----------------------------------------------------------------------------------'
139 */
140[_RAISE] = LAYOUT_preonic_grid(
141 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PSCR, \
142 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
143 _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
144 _______, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______, \
145 _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_VOLD, KC_VOLU, KC_MUTE \
146),
147
148/* Adjust (Lower + Raise)
149 * ,-----------------------------------------------------------------------------------.
150 * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
151 * |------+------+------+------+------+------+------+------+------+------+------+------|
152 * | LOCK | Reset|Clicky|AudMod|Qwerty|Colemk|Dvorak| WHL_D| MS_U | WHL_U| | Del |
153 * |------+------+------+------+------+-------------+------+------+------+------+------|
154 * | |Aud on|AudOff|Rclick|Lclick|AGnorm|AGswap| MS_L | MS_D | MS_R | | |
155 * |------+------+------+------+------+------|------+------+------+------+------+------|
156 * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | |
157 * |------+------+------+------+------+------+------+------+------+------+------+------|
158 * | | | | | | | | | | | |
159 * `-----------------------------------------------------------------------------------'
160 */
161[_ADJUST] = LAYOUT_preonic_grid(
162 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
163 KC_LOCK, RESET, CK_TOGG, MU_MOD, QWERTY, PURE, BLANK, KC_WH_D, KC_MS_U, KC_WH_U, _______, KC_DEL, \
164 _______, AU_ON, AU_OFF, KC_BTN2, KC_BTN1, AG_NORM, AG_SWAP, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_ACL0, \
165 _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, KC_ACL1, \
166 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ACL2 \
167),
168
169/* Mouse
170 * ,-----------------------------------------------------------------------------------.
171 * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
172 * |------+------+------+------+------+------+------+------+------+------+------+------|
173 * | | | WHL_U|Mclick| | | | LCTL | MS_U | WHL_U| | Del |
174 * |------+------+------+------+------+-------------+------+------+------+------+------|
175 * | | | WHL_D|Rclick|Lclick| | | MS_L | MS_D | MS_R | | ACL0 |
176 * |------+------+------+------+------+------|------+------+------+------+------+------|
177 * | | | | | | | | WHL_D| WHL_L| WHL_R| | ACL1 |
178 * |------+------+------+------+------+------+------+------+------+------+------+------|
179 * | | | | | | | | | | | ACL2 |
180 * `-----------------------------------------------------------------------------------'
181 */
182[_MOUSE] = LAYOUT_preonic_grid(
183 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
184 _______, _______, KC_WH_U, KC_BTN3, _______, _______, _______, KC_LCTL, KC_MS_U, KC_WH_U, _______, KC_DEL, \
185 _______, _______, KC_WH_D, KC_BTN2, KC_BTN1, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_ACL0, \
186 _______, _______, _______, _______, _______, _______, _______, KC_WH_D, KC_WH_L, KC_WH_R, _______, KC_ACL1, \
187 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ACL2 \
188 )
189
190
191};
192
193static bool cntl_interrupted = 0;
194static uint16_t cntl_timer = 0;
195
196static bool mouse_interrupted = 0;
197static uint16_t mouse_timer = 0;
198
199bool process_record_user(uint16_t keycode, keyrecord_t *record) {
200 switch (keycode) {
201 case QWERTY:
202 if (record->event.pressed) {
203 set_single_persistent_default_layer(_QWERTY);
204 }
205 return false;
206 break;
207 case PURE:
208 if (record->event.pressed) {
209 set_single_persistent_default_layer(_PURE);
210 }
211 return false;
212 break;
213 case BLANK:
214 if (record->event.pressed) {
215 set_single_persistent_default_layer(_BLANK);
216 }
217 return false;
218 break;
219 case LOWER:
220 if (record->event.pressed) {
221 layer_on(_LOWER);
222 update_tri_layer(_LOWER, _RAISE, _ADJUST);
223 } else {
224 layer_off(_LOWER);
225 update_tri_layer(_LOWER, _RAISE, _ADJUST);
226 }
227 return false;
228 break;
229 case RAISE:
230 if (record->event.pressed) {
231 layer_on(_RAISE);
232 update_tri_layer(_LOWER, _RAISE, _ADJUST);
233 } else {
234 layer_off(_RAISE);
235 update_tri_layer(_LOWER, _RAISE, _ADJUST);
236 }
237 return false;
238 break;
239
240 // BACKLIT is not used. If you want to use, uncomment below
241 /*
242 case BACKLIT:
243 if (record->event.pressed) {
244 register_code(KC_RSFT);
245 #ifdef BACKLIGHT_ENABLE
246 backlight_step();
247 #endif
248 #ifdef __AVR__
249 PORTE &= ~(1<<6);
250 #endif
251 } else {
252 unregister_code(KC_RSFT);
253 #ifdef __AVR__
254 PORTE |= (1<<6);
255 #endif
256 }
257 return false;
258 break;
259 */
260
261 case KC_CESC:
262 if (record->event.pressed) {
263 cntl_interrupted = false;
264 cntl_timer = timer_read();
265 register_mods(MOD_BIT(KC_LCTL));
266 } else if (!cntl_interrupted && timer_elapsed(cntl_timer) < TAPPING_TERM) {
267 unregister_mods(MOD_BIT(KC_LCTL));
268 tap_code(KC_ESC);
269 } else {
270 unregister_mods(MOD_BIT(KC_LCTL));
271 }
272 return false;
273 break;
274
275 case SPC_MOU:
276 if (record->event.pressed) {
277 mouse_interrupted = false;
278 mouse_timer = timer_read();
279
280 cntl_interrupted = true;
281 layer_on(_MOUSE);
282 } else if (!mouse_interrupted && timer_elapsed(mouse_timer) < TAPPING_TERM) {
283 layer_off(_MOUSE);
284 tap_code(KC_SPC);
285 } else {
286 layer_off(_MOUSE);
287 }
288 return false;
289 break;
290
291 default:
292 cntl_interrupted = true;
293 mouse_interrupted = true;
294 break;
295 }
296 return true;
297};
298
299bool muse_mode = false;
300uint8_t last_muse_note = 0;
301uint16_t muse_counter = 0;
302uint8_t muse_offset = 70;
303uint16_t muse_tempo = 50;
304
305void encoder_update_user(uint8_t index, bool clockwise) {
306 if (muse_mode) {
307 if (IS_LAYER_ON(_RAISE)) {
308 if (clockwise) {
309 muse_offset++;
310 } else {
311 muse_offset--;
312 }
313 } else {
314 if (clockwise) {
315 muse_tempo+=1;
316 } else {
317 muse_tempo-=1;
318 }
319 }
320 } else {
321 if (clockwise) {
322 tap_code(KC_PGDN);
323 } else {
324 tap_code(KC_PGUP);
325 }
326 }
327}
328
329void dip_switch_update_user(uint8_t index, bool active) {
330 switch (index) {
331 case 0:
332 if (active) {
333 layer_on(_ADJUST);
334 } else {
335 layer_off(_ADJUST);
336 }
337 break;
338 case 1:
339 if (active) {
340 muse_mode = true;
341 } else {
342 muse_mode = false;
343 }
344 }
345}
346
347void matrix_scan_user(void) {
348#ifdef AUDIO_ENABLE
349 if (muse_mode) {
350 if (muse_counter == 0) {
351 uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
352 if (muse_note != last_muse_note) {
353 stop_note(compute_freq_for_midi_note(last_muse_note));
354 play_note(compute_freq_for_midi_note(muse_note), 0xF);
355 last_muse_note = muse_note;
356 }
357 }
358 muse_counter = (muse_counter + 1) % muse_tempo;
359 } else {
360 if (muse_counter) {
361 stop_all_notes();
362 muse_counter = 0;
363 }
364 }
365#endif
366}
367
368bool music_mask_user(uint16_t keycode) {
369 switch (keycode) {
370 case RAISE:
371 case LOWER:
372 return false;
373 default:
374 return true;
375 }
376}
diff --git a/keyboards/preonic/keymaps/kjwon15/readme.md b/keyboards/preonic/keymaps/kjwon15/readme.md
new file mode 100644
index 000000000..5d03a1a0b
--- /dev/null
+++ b/keyboards/preonic/keymaps/kjwon15/readme.md
@@ -0,0 +1,27 @@
1# Kjwon15's Preonic layout
2
3
4## It provides almost full functionality for linux
5
6It has screen capture key which is also used on sysq
7
8
9## Mouse layer
10
11Press left spacebar to activate mouse mode.
12Right hand to move cursor/scroll, Left hand to click
13
14
15## Dual function keys
16
17Right shift is also Enter key. If you press and hold, that key act as shift. But if you tap that key, It is enter key.
18If you want to press and hold enter key, Use left-bottom key. That is pure enter.
19
20## Blank layout
21
22If you want to lock your keyboard, switch to this layout. It also useful when you want to clean your keyboard without disconnecting USB.
23
24
25## Pure mode
26
27Dual function keys are so annoying when you playing game. Then use this layout
diff --git a/keyboards/preonic/keymaps/kjwon15/rules.mk b/keyboards/preonic/keymaps/kjwon15/rules.mk
new file mode 100644
index 000000000..5ffe1ff32
--- /dev/null
+++ b/keyboards/preonic/keymaps/kjwon15/rules.mk
@@ -0,0 +1,2 @@
1SRC += muse.c
2KEY_LOCK_ENABLE = yes
diff --git a/keyboards/preonic/preonic.c b/keyboards/preonic/preonic.c
index ff07f961f..8d052ea81 100644
--- a/keyboards/preonic/preonic.c
+++ b/keyboards/preonic/preonic.c
@@ -12,7 +12,7 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
12#endif 12#endif
13 13
14const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_preonic_grid( 14const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_preonic_grid(
15 48, 49, 50, 51, 52, 53, 53, 55, 56, 57, 58, 59, 15 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
16 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 16 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
17 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 17 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
18 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 18 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,