#pragma once

#include "quantum.h" 

enum keycodes {
	QWERTY = SAFE_RANGE,
	DYNAMIC_MACRO_RANGE
};

#include "dynamic_macro.h"

#define ____ KC_NO

/* Every possible switch positions on the PCB. Depending on plate and keycap choice, some of these positions will be blocked by other keys. */
#define LAYOUT_all( \
	K101, K102,   K103,       K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   K120, K121, K122, K123, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316,   K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416,   K417, K418, K419,   K420, K421, K422, K423, \
	K501, K502,   K503, K504, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614, K615, K616,   K617, K618, K619,   K620,       K622        \
) { \
 	{ K101, K102,   K103, ____, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   K120, K121, K122, K123 }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416,   K417, K418, K419,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, K504, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, K615, K616,   K617, K618, K619,   K620, ____, K622, ____ } \
}

/* Northgate Factory Plates. Most are based on internet research, user beware. */ 
#define LAYOUT_101( \
					K103,       K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119, \
					K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
					K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316,   K317, K318, K319,   K320, K321, K322, K323, \
					K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,                          K420, K421, K422,       \
					K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514,    K515,            K518,         K520, K521, K522, K523, \
					K603,       K605,                               K610,       K613,             K616,   K617, K618, K619,   K620,       K622  \
) { \
	{ ____, ____,   K103, ____, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ ____, ____,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ ____, ____,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ ____, ____,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   ____, ____, ____,   K420, K421, K422, ____ }, \
	{ ____, ____,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, ____,   ____, K518, ____,   K520, K521, K522, K523 }, \
	{ ____, ____,   K603, ____, K605, ____, ____, ____, ____, K610, ____, ____, K613, ____, ____, K616,   K617, K618, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_102_rev1( \
	K101, K102,              																			K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,                          K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,         K518,         K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,   K617, K618, K619,   K620,       K622  \
) { \
 	{ K101, K102,   ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   ____, ____, ____,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   ____, K518, ____,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, K618, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_102_rev3( \
	K101, K102,   K103,       																			K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,                          K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,         K518,         K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,   K617, K618, K619,   K620,       K622  \
) { \
 	{ K101, K102,   K103, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   ____, ____, ____,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   ____, K518, ____,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, K618, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_plus_rev1( \
	K101, K102,              																			K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,      K417, K418, K419,   K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,      K617, K619,      K620,       K622  \
) { \
 	{ K101, K102,   ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   K417, K418, K419,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, ____, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_plus_rev3( \
	K101, K102,   K103,       																			K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,      K417, K418, K419,   K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,      K617, K619,      K620,       K622  \
) { \
 	{ K101, K102,   K103, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   K417, K418, K419,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, ____, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_ultra_rev1( \
	K101, K102,               K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,	K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,      K417, K418, K419,   K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,      K617, K619,      K620,       K622  \
) { \
 	{ K101, K102,   ____, ____, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   K417, K418, K419,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, ____, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_ultra_rev3( \
	K101, K102,   K103,       K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,	K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,      K417, K418, K419,   K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,      K617, K619,      K620,       K622  \
) { \
 	{ K101, K102,   K103, ____, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   K417, K418, K419,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   K517, K518, K519,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, ____, K619,   K620, ____, K622, ____ } \
}

#define LAYOUT_ultra_t( \
	K101, K102,   K103,       K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119, \
	K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223, \
	K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315,         K317, K318, K319,   K320, K321, K322, K323, \
	K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414,    K416,                          K420, K421, K422, K423, \
	K501, K502,   K503,       K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,         K518,         K520, K521, K522, K523, \
	K601, K602,   K603, K604, K605,                         K610,             K613, K614,       K616,   K617, K618, K619,   K620,       K622  \
) { \
 	{ K101, K102,   K103, ____, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116,   K117, K118, K119,   ____, ____, ____, ____ }, \
	{ K201, K202,   K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216,   K217, K218, K219,   K220, K221, K222, K223 }, \
	{ K301, K302,   K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, ____,   K317, K318, K319,   K320, K321, K322, K323 }, \
	{ K401, K402,   K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, ____, K416,   ____, ____, ____,   K420, K421, K422, K423 }, \
	{ K501, K502,   K503, ____, K505, K506, K507, K508, K509, K510, K511, K512, K513, K514, K515, K516,   ____, K518, ____,   K520, K521, K522, K523 }, \
	{ K601, K602,   K603, K604, K605, ____, ____, ____, ____, K610, ____, ____, K613, K614, ____, K616,   K617, K618, K619,   K620, ____, K622, ____ } \
}