Skip to content

Instantly share code, notes, and snippets.

@ylacancellera
Created September 6, 2022 19:37
Show Gist options
  • Save ylacancellera/5eaf4e11fdf44b6d5a6e6e6f16945cfb to your computer and use it in GitHub Desktop.
Save ylacancellera/5eaf4e11fdf44b6d5a6e6e6f16945cfb to your computer and use it in GitHub Desktop.
lily vial
#pragma once
/* VIAL UID for Lily58*/
#define VIAL_KEYBOARD_UID {0x7E, 0xFD, 0xFC, 0x5B, 0x7D, 0x39, 0x48, 0x06}
/* VIAL secure unlock keystroke - currently both big keys (typ. SPACE/ENTER) */
#define VIAL_UNLOCK_COMBO_ROWS {4, 9}
#define VIAL_UNLOCK_COMBO_COLS {4, 4}
/* Space reduction */
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define VIAL_TAP_DANCE_ENTRIES 4
#undef LOCKING_SUPPORT_ENABLE
#undef LOCKING_RESYNC_ENABLE
#define NO_ACTION_ONESHOT
/* Select hand configuration */
#define MASTER_LEFT
// #define MASTER_RIGHT
// #define EE_HANDS
#define USE_SERIAL_PD2
#define TAPPING_FORCE_HOLD
#define TAPPING_TERM 100
#undef RGBLED_NUM
#define RGBLED_NUM 35
#define RGBLIGHT_LIMIT_VAL 150
#define RGBLIGHT_HUE_STEP 1
#define RGBLIGHT_SAT_STEP 1
#define RGBLIGHT_VAL_STEP 1
#define RGBLIGHT_SPLIT
#define RGBLIGHT_SLEEP //Turn off LEDs when computer sleepin
#define SPLIT_WPM_ENABLE
#define SPLIT_LED_STATE_ENABLE
#define SPLIT_MODS_ENABLE
#include QMK_KEYBOARD_H
#include <stdio.h>
#include <string.h>
#include "keymap_french.h"
char wpm[16];
char hue[10];
char sat[10];
char val[10];
enum custom_keycodes {
CK_NOTEQUAL = SAFE_RANGE,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY
* ,-----------------------------------------. ,-----------------------------------------.
* | ESC | & | é | " | ' | ( | | - | è | _ | ç | à | ) |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Tab | A | Z | E | R | T | | Y | U | I | O | P | ^ |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* |LShift| Q | S | D | F | G |-------. ,-------| H | J | K | L | M | ù |
* |------+------+------+------+------+------| GUI | | ADJUST|------+------+------+------+------+------|
* |LCtrl | W | X | C | V | B |-------| |-------| N | , | ; | : | ! | * |
* `-----------------------------------------/ / \ \-----------------------------------------'
* | GUI | ALT | LOWER| /Space / \Enter \ |BackSP| ALTGR| < |
* | | | |/ / \ \ | | | |
* `--------------------'-------' '------''--------------------'
*/
[0] = LAYOUT(
KC_ESC, FR_AMPR, FR_EACU, FR_DQUO, FR_QUOT, FR_LPRN, FR_MINS,FR_EGRV, FR_UNDS, FR_CCED,FR_AGRV, FR_RPRN,
KC_TAB, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC,
KC_LSFT, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV,
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, MO(2), KC_N, FR_COMM, FR_SCLN, FR_COLN,FR_EXLM, FR_ASTR,
KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_ENT, KC_BSPC, KC_ALGR, FR_LABK
),
/* LOWER
* ,-----------------------------------------. ,-----------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | up | | Pg up| VOL U| | - | 7 | 8 | 9 |numlck| = |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | left | down | right|PgDown| VOL D|-------. ,-------| + | 4 | 5 | 6 | * | =/ |
* |------+------+------+------+------+------| | | |------+------+------+------+------+------|
* | | | end | del | | MUTE |-------| |-------| | 1 | 2 | 3 | . | |
* `-----------------------------------------/ / \ \-----------------------------------------'
* | | | | / / \ \ | | 0 | . |
* | | | |/ / \ \ | | | |
* `--------------------'-------' '------''--------------------'
*/
[1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
_______, _______, KC_UP, _______, KC_PGUP, KC_VOLU, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_NLCK, FR_EQL,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_VOLD, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PAST, CK_NOTEQUAL,
_______, _______, KC_END, KC_DEL, _______, KC_MUTE, _______, _______, _______, KC_P1, KC_P2, KC_P3, C_S_T(KC_PDOT), KC_RSFT,
_______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT
),
/* ADJUST
* ,-----------------------------------------. ,-----------------------------------------.
* | | | | | | | | | | | | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | |ORANGE| Hue+ | Hue- | | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | |-------. ,-------|PURPLE| Satu+| Satu-| | | |
* |------+------+------+------+------+------| | | |------+------+------+------+------+------|
* | | | | | | |-------| |-------|LedOFF| Brig+| Brig-| | | |
* `-----------------------------------------/ / \ \-----------------------------------------'
* | | | | / / \ \ | | | |
* | | | |/ / \ \ | | | |
* `--------------------'-------' '------''--------------------'
*/
[2] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_HUD, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, RGB_SAI, RGB_SAD, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, RGB_VAD, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};
#ifdef OLED_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (is_keyboard_master()) return OLED_ROTATION_270;
else return rotation;
}
/* settings */
# define MIN_WALK_SPEED 10
# define MIN_RUN_SPEED 40
/* advanced settings */
# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
# define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
/* timers */
uint32_t anim_timer = 0;
uint32_t anim_sleep = 0;
/* current frame */
uint8_t current_frame = 0;
/* status variables */
int current_wpm = 0;
led_t led_usb_state;
bool isSneaking = false;
bool isBarking = false;
bool isJumping = false;
bool showedJump = true;
/* logic */
static void render_luna(int LUNA_X, int LUNA_Y) {
/* Sit */
static const char PROGMEM sit[2][ANIM_SIZE] = {/* 'sit1', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
/* 'sit2', 32x22px */
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
/* Walk */
static const char PROGMEM walk[2][ANIM_SIZE] = {/* 'walk1', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80, 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03, 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
/* 'walk2', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}};
/* Run */
static const char PROGMEM run[2][ANIM_SIZE] = {/* 'run1', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
},
/* 'run2', 32x22px */
{
0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}};
/* Bark */
static const char PROGMEM bark[2][ANIM_SIZE] = {/* 'bark1', 32x22px */
{
0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
/* 'bark2', 32x22px */
{
0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}};
/* Sneak */
static const char PROGMEM sneak[2][ANIM_SIZE] = {/* 'sneak1', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06, 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
},
/* 'sneak2', 32x22px */
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04, 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
}};
/* animation */
void animate_luna(void) {
/* jump */
if (isJumping || !showedJump) {
/* clear */
oled_set_cursor(LUNA_X, LUNA_Y + 2);
oled_write(" ", false);
oled_set_cursor(LUNA_X, LUNA_Y - 1);
showedJump = true;
} else {
/* clear */
oled_set_cursor(LUNA_X, LUNA_Y - 1);
oled_write(" ", false);
oled_set_cursor(LUNA_X, LUNA_Y);
}
/* switch frame */
current_frame = (current_frame + 1) % 2;
/* current status */
if (isBarking) {
oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE);
} else if (isSneaking) {
oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE);
} else if (current_wpm <= 10) {
oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE);
} else if (current_wpm <= 40) {
oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE);
} else {
oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE);
}
}
/* animation timer */
if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
anim_timer = timer_read32();
animate_luna();
}
/* this fixes the screen on and off bug */
/*
if (current_wpm > 0) {
oled_on();
anim_sleep = timer_read32();
} else if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
oled_off();
}
*/
}
bool oled_task_user(void) {
current_wpm = get_current_wpm();
led_usb_state = host_keyboard_led_state();
if (!is_keyboard_master()) {
oled_write_P(PSTR("\n\n"), false);
sprintf(wpm, "%03d", current_wpm);
oled_write(wpm, false);
oled_write_P(PSTR(" wpm\n"), false);
if (!led_usb_state.num_lock) {
oled_write_P(PSTR("NUMPAD OFF!"), false);
} else {
oled_write_P(PSTR(" "), false);
}
} else {
render_luna(0, 13);
}
return false;
}
#endif
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case CK_NOTEQUAL:
if (record->event.pressed) {
SEND_STRING("≠");
}
break;
case KC_LSFT:
if (record->event.pressed) {
isBarking = true;
} else {
isBarking = false;
}
break;
case KC_LCTL:
if (record->event.pressed) {
isSneaking = true;
} else {
isSneaking = false;
}
break;
case KC_SPC:
if (record->event.pressed) {
isJumping = true;
showedJump = false;
} else {
isJumping = false;
}
break;
}
return true;
};
VIA_ENABLE = yes
VIAL_ENABLE = yes
RGBLIGHT_ENABLE = yes
OLED_ENABLE = yes
OLED_DRIVER = SSD1306
EXTRAKEY_ENABLE = yes
WPM_ENABLE = yes
QMK_SETTINGS = no
LTO_ENABLE = yes
KEY_OVERRIDE_ENABLE = no
COMBO_ENABLE = no
UNICODEMAP_ENABLE = no
MOUSEKEY_ENABLE = no
TAP_DANCE_ENABLE = no
COMMAND_ENABLE = no
STENO_ENABLE = no
BOOTMAGIC_ENABLE =no
TERMINAL_ENABLE = no
GRAVE_ESC_ENABLE = no
MAGIC_ENABLE = no
SPACE_CADET_ENABLE = no
KEY_LOCK_ENABLE = no
AUDIO_ENABLE = no
CONSOLE_ENABLE = no
VELOCIKEY_ENABLE = no
{
"name": "Lily58",
"vendorId": "0x04D8",
"productId": "0xEB2D",
"lighting": "qmk_rgblight",
"matrix": { "rows": 10, "cols": 6 },
"layouts": {
"labels": [],
"keymap": [
[{"x":3.5},"0,3",{"x":8.5},"5,3"],
[{"y":-0.875,"x":2.5},"0,2",{"x":1},"0,4",{"x":6.5},"5,4",{"x":1},"5,2"],
[{"y":-0.875,"x":5.5},"0,5",{"x":4.5},"5,5"],
[{"y":-0.875,"x":1.5},"0,1",{"x":12.5},"5,1"],
[{"y":-0.875,"x":0.5,"c":"#777777"},"0,0",{"x":14.5,"c":"#cccccc"},"5,0"],
[{"y":-0.5,"x":3.5},"1,3",{"x":8.5},"6,3"],
[{"y":-0.875,"x":2.5},"1,2",{"x":1},"1,4",{"x":6.5},"6,4",{"x":1},"6,2"],
[{"y":-0.875,"x":5.5},"1,5",{"x":4.5},"6,5"],
[{"y":-0.875,"x":1.5},"1,1",{"x":12.5},"6,1"],
[{"y":-0.875,"x":0.5,"c":"#aaaaaa"},"1,0",{"x":14.5,"c":"#cccccc"},"6,0"],
[{"y":-0.5,"x":3.5},"2,3",{"x":8.5},"7,3"],
[{"y":-0.875,"x":2.5},"2,2",{"x":1},"2,4",{"x":6.5},"7,4",{"x":1},"7,2"],
[{"y":-0.875,"x":5.5},"2,5",{"x":4.5},"7,5"],
[{"y":-0.875,"x":1.5},"2,1",{"x":12.5},"7,1"],
[{"y":-0.875,"x":0.5,"c":"#aaaaaa"},"2,0",{"x":14.5,"c":"#cccccc"},"7,0"],
[{"y":-0.75,"x":6.5},"4,5",{"x":2.5},"9,5"],
[{"y":-0.75,"x":3.5},"3,3",{"x":8.5},"8,3"],
[{"y":-0.875,"x":2.5},"3,2",{"x":1},"3,4",{"x":6.5},"8,4",{"x":1},"8,2"],
[{"y":-0.875,"x":5.5},"3,5",{"x":4.5},"8,5"],
[{"y":-0.875,"x":1.5},"3,1",{"x":12.5},"8,1"],
[{"y":-0.875,"x":0.5,"c":"#aaaaaa"},"3,0",{"x":14.5},"8,0"],
[{"y":-0.375,"x":3},"4,1"],
[{"y":-0.975,"x":4},"4,2",{"x":7.5},"9,2","9,1"],
[{"y":-0.9,"x":5},"4,3",{"x":0.5,"c":"#777777","h":1.5},"4,4",{"x":2.5,"h":1.5},"9,4",{"x":0.5,"c":"#aaaaaa"},"9,3"]
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment