diff --git a/web/src/test/manual/web/commonHeader.js b/web/src/test/manual/web/commonHeader.js
index 2c644d37d1c..74cb22e1cdb 100644
--- a/web/src/test/manual/web/commonHeader.js
+++ b/web/src/test/manual/web/commonHeader.js
@@ -101,6 +101,15 @@
doAddKeyboards({id:'obolo_chwerty_6351',name:'obolo_chwerty_6351',languages:{id:'en',name:'English'},
filename:(prefix + 'obolo_chwerty_6351.js')});
+ doAddKeyboards({id:'gesture_prototyping',name:'Gesture Prototyping',languages:{id:'en',name:'English'},
+ filename:(prefix + 'keyboards/gesture_prototyping/build/gesture_prototyping.js')});
+
+ doAddKeyboards({id:'diacritic_rota',name:'Diacritic 10-key Rota',languages:{id:'en',name:'English'},
+ filename:(prefix + 'keyboards/diacritic_rota/build/diacritic_rota.js')});
+
+ doAddKeyboards({id:'ye_old_ten_key',name:'Classic 10-key',languages:{id:'en',name:'English'},
+ filename:(prefix + 'keyboards/ye_old_ten_key/build/ye_old_ten_key.js')});
+
// Add more keyboards to the language menu, by keyboard name,
// keyboard name and language code, or just the BCP-47 language code.
// We use a different loading pattern here than in the samples version to provide a slightly different set of test cases.
diff --git a/web/src/test/manual/web/keyboards/.gitignore b/web/src/test/manual/web/keyboards/.gitignore
new file mode 100644
index 00000000000..af5c6be71c1
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/.gitignore
@@ -0,0 +1,10 @@
+# Reference: https://stackoverflow.com/a/69970899
+
+# Don't exclude the keyboards' build directories...
+!**/build/
+
+# ... just everything in them.
+**/build/*
+
+# EXCEPT the compiled keyboard.
+!**/build/*.js
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/HISTORY.md b/web/src/test/manual/web/keyboards/diacritic_rota/HISTORY.md
new file mode 100644
index 00000000000..e60b8e16095
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/HISTORY.md
@@ -0,0 +1,6 @@
+Diacritic Rota Change History
+====================
+
+1.0 (2023-10-25)
+----------------
+* Created by SIL International
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/LICENSE.md b/web/src/test/manual/web/keyboards/diacritic_rota/LICENSE.md
new file mode 100644
index 00000000000..b582b3f9086
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+© 2023 SIL International
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/README.md b/web/src/test/manual/web/keyboards/diacritic_rota/README.md
new file mode 100644
index 00000000000..87ab030fa6d
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/README.md
@@ -0,0 +1,30 @@
+Diacritic Rota keyboard
+==============
+
+Version 1.0
+
+Description
+-----------
+Diacritic Rota generated from template
+
+Links
+-----
+
+Copyright
+---------
+See [LICENSE.md](LICENSE.md)
+
+Supported Platforms
+-------------------
+ * Windows
+ * macOS
+ * Linux
+ * Web
+ * iPhone
+ * iPad
+ * Android phone
+ * Android tablet
+ * Mobile devices
+ * Desktop devices
+ * Tablet devices
+
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/build/diacritic_rota.js b/web/src/test/manual/web/keyboards/diacritic_rota/build/diacritic_rota.js
new file mode 100644
index 00000000000..84ed997eb6c
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/build/diacritic_rota.js
@@ -0,0 +1 @@
+if(typeof keyman === 'undefined') {console.log('Keyboard requires KeymanWeb 10.0 or later');if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");} else {KeymanWeb.KR(new Keyboard_diacritic_rota());}function Keyboard_diacritic_rota(){this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;this.KI="Keyboard_diacritic_rota";this.KN="Diacritic 10-key Rota";this.KMINVER="14.0";this.KV={F:' 1em "Arial"',K102:0};this.KV.KLS={};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KV.KLS);this.KDU=0;this.KH='';this.KM=0;this.KBVER="1.0";this.KMBM=0x0010;this.KVKD="T_DK_DIA_GRAVE T_DK_DIA_ACUTE T_DK_DIA_CIRCUM";this.KVKL={"phone":{"font":"Tahoma","displayUnderlying":false,"layer":[{"id":"default","row":[{"id":"1","key":[{"id":"K_7","text":"7"},{"id":"K_8","text":"8","hint":"abc","multitap":[{"id":"K_A","text":"a"},{"id":"K_B","text":"b"},{"id":"K_C","text":"c"},{"nextlayer":"shift","layer":"shift","id":"K_A","text":"A"},{"nextlayer":"shift","layer":"shift","id":"K_B","text":"B"},{"nextlayer":"shift","layer":"shift","id":"K_C","text":"C"}]},{"id":"K_9","text":"9","hint":"def","multitap":[{"id":"K_D","text":"d"},{"id":"K_E","text":"e"},{"id":"K_F","text":"f"},{"nextlayer":"shift","layer":"shift","id":"K_D","text":"D"},{"nextlayer":"shift","layer":"shift","id":"K_E","text":"E"},{"nextlayer":"shift","layer":"shift","id":"K_F","text":"F"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"2","key":[{"id":"K_4","text":"4","hint":"ghi","multitap":[{"id":"K_G","text":"g"},{"id":"K_H","text":"h"},{"id":"K_I","text":"i"},{"nextlayer":"shift","layer":"shift","id":"K_G","text":"G"},{"nextlayer":"shift","layer":"shift","id":"K_H","text":"H"},{"nextlayer":"shift","layer":"shift","id":"K_I","text":"I"}]},{"id":"K_5","text":"5","hint":"jkl","multitap":[{"id":"K_J","text":"j"},{"id":"K_K","text":"k"},{"id":"K_L","text":"l"},{"nextlayer":"shift","layer":"shift","id":"K_J","text":"J"},{"nextlayer":"shift","layer":"shift","id":"K_K","text":"K"},{"nextlayer":"shift","layer":"shift","id":"K_L","text":"L"}]},{"id":"K_6","text":"6","hint":"mno","multitap":[{"id":"K_M","text":"m"},{"id":"K_N","text":"n"},{"id":"K_O","text":"o"},{"nextlayer":"shift","layer":"shift","id":"K_M","text":"M"},{"nextlayer":"shift","layer":"shift","id":"K_N","text":"N"},{"nextlayer":"shift","layer":"shift","id":"K_O","text":"O"}]},{"id":"T_DK_DIA_GRAVE","text":"\u25CC\u0300","hint":"\u25CC\u0301\u25CC\u0302","multitap":[{"id":"T_DK_DIA_ACUTE","text":"\u25CC\u0301"},{"id":"T_DK_DIA_CIRCUM","text":"\u25CC\u0302"}]}]},{"id":"3","key":[{"id":"K_1","text":"1","hint":"pqrs","multitap":[{"id":"K_P","text":"p"},{"id":"K_Q","text":"q"},{"id":"K_R","text":"r"},{"id":"K_S","text":"s"},{"nextlayer":"shift","layer":"shift","id":"K_P","text":"P"},{"nextlayer":"shift","layer":"shift","id":"K_Q","text":"Q"},{"nextlayer":"shift","layer":"shift","id":"K_R","text":"R"},{"nextlayer":"shift","layer":"shift","id":"K_S","text":"S"}]},{"id":"K_2","text":"2","hint":"tuv","multitap":[{"id":"K_T","text":"t"},{"id":"K_U","text":"u"},{"id":"K_V","text":"v"},{"nextlayer":"shift","layer":"shift","id":"K_T","text":"T"},{"nextlayer":"shift","layer":"shift","id":"K_U","text":"U"},{"nextlayer":"shift","layer":"shift","id":"K_V","text":"V"}]},{"id":"K_3","text":"3","hint":"wxyz","multitap":[{"id":"K_W","text":"w"},{"id":"K_X","text":"x"},{"id":"K_Y","text":"y"},{"id":"K_Z","text":"z"},{"nextlayer":"shift","layer":"shift","id":"K_W","text":"W"},{"nextlayer":"shift","layer":"shift","id":"K_X","text":"X"},{"nextlayer":"shift","layer":"shift","id":"K_Y","text":"Y"},{"nextlayer":"shift","layer":"shift","id":"K_Z","text":"Z"}]},{"width":"100","id":"K_ENTER","sp":"1","text":"*Enter*"}]},{"id":"4","key":[{"nextlayer":"shift","width":"100","id":"K_SHIFT","sp":"1","text":"*Shift*"},{"id":"K_0","text":"0"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"id":"U_0021"},{"id":"U_003F"},{"id":"U_0027"},{"id":"U_0022"},{"id":"U_005C"},{"id":"U_003A"},{"id":"U_003B"}]},{"id":"T_BLANK","sp":"10"}]},{"id":"5","key":[{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"250","id":"K_SPACE"}]}]},{"id":"shift","row":[{"id":"1","key":[{"layer":"default","id":"K_7","text":"7"},{"layer":"default","id":"K_8","text":"8","hint":"ABC","multitap":[{"id":"K_A","text":"A"},{"id":"K_B","text":"B"},{"id":"K_C","text":"C"},{"nextlayer":"default","layer":"default","id":"K_A","text":"a"},{"nextlayer":"default","layer":"default","id":"K_B","text":"b"},{"nextlayer":"default","layer":"default","id":"K_C","text":"c"}]},{"layer":"default","id":"K_9","text":"9","hint":"DEF","multitap":[{"id":"K_D","text":"D"},{"id":"K_E","text":"E"},{"id":"K_F","text":"F"},{"nextlayer":"default","layer":"default","id":"K_D","text":"d"},{"nextlayer":"default","layer":"default","id":"K_E","text":"e"},{"nextlayer":"default","layer":"default","id":"K_F","text":"f"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"2","key":[{"layer":"default","id":"K_4","text":"4","hint":"GHI","multitap":[{"id":"K_G","text":"G"},{"id":"K_H","text":"H"},{"id":"K_I","text":"I"},{"nextlayer":"default","layer":"default","id":"K_G","text":"g"},{"nextlayer":"default","layer":"default","id":"K_H","text":"h"},{"nextlayer":"default","layer":"default","id":"K_I","text":"i"}]},{"layer":"default","id":"K_5","text":"5","hint":"JKL","multitap":[{"id":"K_J","text":"J"},{"id":"K_K","text":"K"},{"id":"K_L","text":"L"},{"nextlayer":"default","layer":"default","id":"K_J","text":"j"},{"nextlayer":"default","layer":"default","id":"K_K","text":"k"},{"nextlayer":"default","layer":"default","id":"K_L","text":"l"}]},{"layer":"default","id":"K_6","text":"6","hint":"MNO","multitap":[{"id":"K_M","text":"M"},{"id":"K_N","text":"N"},{"id":"K_O","text":"O"},{"nextlayer":"default","layer":"default","id":"K_M","text":"m"},{"nextlayer":"default","layer":"default","id":"K_N","text":"n"},{"nextlayer":"default","layer":"default","id":"K_O","text":"o"}]},{"id":"T_DK_DIA_GRAVE","text":"\u25CC\u0300","hint":"\u25CC\u0301\u25CC\u0302","multitap":[{"id":"T_DK_DIA_ACUTE","text":"\u25CC\u0301"},{"id":"T_DK_DIA_CIRCUM","text":"\u25CC\u0302"}]}]},{"id":"3","key":[{"layer":"default","id":"K_1","text":"1","hint":"PQRS","multitap":[{"id":"K_P","text":"P"},{"id":"K_Q","text":"Q"},{"id":"K_R","text":"R"},{"id":"K_S","text":"S"},{"nextlayer":"default","layer":"default","id":"K_P","text":"p"},{"nextlayer":"default","layer":"default","id":"K_Q","text":"q"},{"nextlayer":"default","layer":"default","id":"K_R","text":"r"},{"nextlayer":"default","layer":"default","id":"K_S","text":"s"}]},{"layer":"default","id":"K_2","text":"2","hint":"TUV","multitap":[{"id":"K_T","text":"T"},{"id":"K_U","text":"U"},{"id":"K_V","text":"V"},{"nextlayer":"default","layer":"default","id":"K_T","text":"t"},{"nextlayer":"default","layer":"default","id":"K_U","text":"u"},{"nextlayer":"default","layer":"default","id":"K_V","text":"v"}]},{"layer":"default","id":"K_3","text":"3","hint":"WXYZ","multitap":[{"id":"K_W","text":"W"},{"id":"K_X","text":"X"},{"id":"K_Y","text":"Y"},{"id":"K_Z","text":"Z"},{"nextlayer":"default","layer":"default","id":"K_W","text":"w"},{"nextlayer":"default","layer":"default","id":"K_X","text":"x"},{"nextlayer":"default","layer":"default","id":"K_Y","text":"y"},{"nextlayer":"default","layer":"default","id":"K_Z","text":"z"}]},{"width":"100","id":"K_ENTER","sp":"1","text":"*Enter*"}]},{"id":"4","key":[{"nextlayer":"default","width":"100","id":"K_SHIFT","sp":"1","text":"*Shift*"},{"id":"K_0","text":"0"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"id":"U_0021"},{"id":"U_003F"},{"id":"U_0027"},{"id":"U_0022"},{"id":"U_005C"},{"id":"U_003A"},{"id":"U_003B"}]},{"id":"T_BLANK","sp":"10"}]},{"id":"5","key":[{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"250","id":"K_SPACE"}]}]}]}};this.s11=['','','','','','','','','','','','','','','','','','','','','','','','','',''];this.s12=['','','','','','','','','','','','','','','','','','','','','','','','','',''];this.s13="abcdefghijklmnopqrstuvwxyz";this.s14="ABCDEFGHIJKLMNOPQRSTUVWXYZ";this.s15="àbcdèfghìjklmǹòpqrstùvẁxỳz";this.s16="ÀBCDÈFGHÌJKLMǸÒPQRSTÙVẀXỲZ";this.s17="ábćdéfǵhíjḱĺḿńóṕqŕśtúvẃxýź";this.s18="ÁBĆDÉFǴHÍJḰĹḾŃÓṔQŔŚTÚVẂXÝŹ";this.s19="âbĉdêfĝĥîĵklmnôpqrŝtûvŵxŷẑ";this.s20="ÂBĈDÊFĜĤÎĴKLMNÔPQRŜTÛVŴXŶẐ";this.s21="̀́̂";this.s22=[{t:'d',d:0},{t:'d',d:1},{t:'d',d:2}];this.KVER="17.0.185.0";this.KVS=[];this.gs=function(t,e) {return this.g0(t,e);};this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;if(k.KKM(e,16384,256)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"̀");k.KDO(-1,t,0);}}else if(k.KKM(e,16384,257)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"́");k.KDO(-1,t,1);}}else if(k.KKM(e,16384,258)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"̂");k.KDO(-1,t,2);}}else if(k.KKM(e,16400,256)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"̀");k.KDO(-1,t,0);}}else if(k.KKM(e,16400,257)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"́");k.KDO(-1,t,1);}}else if(k.KKM(e,16400,258)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"̂");k.KDO(-1,t,2);}}else if(k.KKM(e,16384,32)) {if(k.KFCM(2,t,[{t:'a',a:this.s21},{t:'a',a:this.s22}])){r=m=1;k.KDC(2,t);k.KO(-1,t," ");}}else if(k.KKM(e,16400,32)) {if(k.KFCM(2,t,[{t:'a',a:this.s21},{t:'a',a:this.s22}])){r=m=1;k.KDC(2,t);k.KO(-1,t," ");}}else if(k.KKM(e,16400,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"A");}}else if(k.KKM(e,16400,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"B");}}else if(k.KKM(e,16400,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"C");}}else if(k.KKM(e,16400,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"D");}}else if(k.KKM(e,16400,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"E");}}else if(k.KKM(e,16400,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"F");}}else if(k.KKM(e,16400,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"G");}}else if(k.KKM(e,16400,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"H");}}else if(k.KKM(e,16400,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"I");}}else if(k.KKM(e,16400,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"J");}}else if(k.KKM(e,16400,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"K");}}else if(k.KKM(e,16400,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"L");}}else if(k.KKM(e,16400,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"M");}}else if(k.KKM(e,16400,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"N");}}else if(k.KKM(e,16400,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"O");}}else if(k.KKM(e,16400,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"P");}}else if(k.KKM(e,16400,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Q");}}else if(k.KKM(e,16400,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"R");}}else if(k.KKM(e,16400,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"S");}}else if(k.KKM(e,16400,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"T");}}else if(k.KKM(e,16400,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"U");}}else if(k.KKM(e,16400,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"V");}}else if(k.KKM(e,16400,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"W");}}else if(k.KKM(e,16400,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"X");}}else if(k.KKM(e,16400,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Y");}}else if(k.KKM(e,16400,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Z");}}else if(k.KKM(e,16384,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"a");}}else if(k.KKM(e,16384,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"b");}}else if(k.KKM(e,16384,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"c");}}else if(k.KKM(e,16384,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"d");}}else if(k.KKM(e,16384,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"e");}}else if(k.KKM(e,16384,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"f");}}else if(k.KKM(e,16384,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"g");}}else if(k.KKM(e,16384,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"h");}}else if(k.KKM(e,16384,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"i");}}else if(k.KKM(e,16384,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"j");}}else if(k.KKM(e,16384,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"k");}}else if(k.KKM(e,16384,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"l");}}else if(k.KKM(e,16384,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"m");}}else if(k.KKM(e,16384,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"n");}}else if(k.KKM(e,16384,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"o");}}else if(k.KKM(e,16384,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"p");}}else if(k.KKM(e,16384,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"q");}}else if(k.KKM(e,16384,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"r");}}else if(k.KKM(e,16384,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"s");}}else if(k.KKM(e,16384,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"t");}}else if(k.KKM(e,16384,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"u");}}else if(k.KKM(e,16384,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"v");}}else if(k.KKM(e,16384,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"w");}}else if(k.KKM(e,16384,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"x");}}else if(k.KKM(e,16384,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"y");}}else if(k.KKM(e,16384,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"z");}}if(m==1) {k.KDC(-1,t);r=this.g1(t,e);m=2;}return r;};this.g1=function(t,e) {var k=KeymanWeb,r=1,m=0;if(k.KFCM(3,t,['̀',{t:'d',d:0},{t:'a',a:this.s13}])){m=1;k.KDC(3,t);k.KIO(-1,this.s15,3,t);}else if(k.KFCM(3,t,['́',{t:'d',d:1},{t:'a',a:this.s13}])){m=1;k.KDC(3,t);k.KIO(-1,this.s17,3,t);}else if(k.KFCM(3,t,['̂',{t:'d',d:2},{t:'a',a:this.s13}])){m=1;k.KDC(3,t);k.KIO(-1,this.s19,3,t);}else if(k.KFCM(3,t,['̀',{t:'d',d:0},{t:'a',a:this.s14}])){m=1;k.KDC(3,t);k.KIO(-1,this.s16,3,t);}else if(k.KFCM(3,t,['́',{t:'d',d:1},{t:'a',a:this.s14}])){m=1;k.KDC(3,t);k.KIO(-1,this.s18,3,t);}else if(k.KFCM(3,t,['̂',{t:'d',d:2},{t:'a',a:this.s14}])){m=1;k.KDC(3,t);k.KIO(-1,this.s20,3,t);}return r;};}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.keyboard_info b/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.keyboard_info
new file mode 100644
index 00000000000..70b682ab2c3
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.keyboard_info
@@ -0,0 +1,7 @@
+{
+ "license": "mit",
+ "languages": [
+
+ ],
+ "description": "Diacritic Rota generated from template"
+}
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.kpj b/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.kpj
new file mode 100644
index 00000000000..041493da886
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/diacritic_rota.kpj
@@ -0,0 +1,110 @@
+
+
+
+ $PROJECTPATH\build
+ True
+ True
+ True
+ keyboard
+
+
+
+ id_85f15e8781135a61e942537e889f86d5
+ diacritic_rota.kmn
+ source\diacritic_rota.kmn
+ 1.0
+ .kmn
+
+ Diacritic 10-key Rota
+ © SIL International
+
+
+
+ id_7292a020a8da8934369953d0ebddf263
+ diacritic_rota.kps
+ source\diacritic_rota.kps
+
+ .kps
+
+ Diacritic Rota
+ © SIL International
+
+
+
+ id_ede98e4633e239f933cbfd1f4e1b766c
+ HISTORY.md
+ HISTORY.md
+
+ .md
+
+
+ id_53e892b8b41cc4caece1cfd5ef21d6e7
+ LICENSE.md
+ LICENSE.md
+
+ .md
+
+
+ id_0730bb7c2e8f9ea2438b52e419dd86c9
+ README.md
+ README.md
+
+ .md
+
+
+ id_a197bb37458f532f655b4d319f8aa412
+ diacritic_rota.keyboard_info
+ diacritic_rota.keyboard_info
+
+ .keyboard_info
+
+
+ id_d2f63226cea395ca25e084d9d03672d0
+ diacritic_rota.ico
+ source\diacritic_rota.ico
+
+ .ico
+ id_85f15e8781135a61e942537e889f86d5
+
+
+ id_f8f493ea21b1b91d0f6cf759b44b2ca4
+ diacritic_rota.kmx
+ source\..\build\diacritic_rota.kmx
+
+ .kmx
+ id_7292a020a8da8934369953d0ebddf263
+
+
+ id_0214b6194bc2616c1386e16bddcaafe5
+ diacritic_rota.js
+ source\..\build\diacritic_rota.js
+
+ .js
+ id_7292a020a8da8934369953d0ebddf263
+
+
+ id_1e7faf118f61879d05872df07cbf6bde
+ diacritic_rota.kvk
+ source\..\build\diacritic_rota.kvk
+
+ .kvk
+ id_7292a020a8da8934369953d0ebddf263
+
+
+ id_356e5d149c1e539356d72698c1e401a6
+ welcome.htm
+ source\welcome.htm
+
+ .htm
+ id_7292a020a8da8934369953d0ebddf263
+
+
+ id_8da344c4cea6f467013357fe099006f5
+ readme.htm
+ source\readme.htm
+
+ .htm
+ id_7292a020a8da8934369953d0ebddf263
+
+
+
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.ico b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.ico
new file mode 100644
index 00000000000..0d8b679c13f
Binary files /dev/null and b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.ico differ
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.keyman-touch-layout b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.keyman-touch-layout
new file mode 100644
index 00000000000..66912da4b96
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.keyman-touch-layout
@@ -0,0 +1,888 @@
+{
+ "phone": {
+ "font": "Tahoma",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_7",
+ "text": "7",
+ "hint": ""
+ },
+ {
+ "id": "K_8",
+ "text": "8",
+ "hint": "abc",
+ "multitap": [
+ {
+ "text": "a",
+ "id": "K_A"
+ },
+ {
+ "text": "b",
+ "id": "K_B"
+ },
+ {
+ "text": "c",
+ "id": "K_C"
+ },
+ {
+ "text": "A",
+ "id": "K_A",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "B",
+ "id": "K_B",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "C",
+ "id": "K_C",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "9",
+ "hint": "def",
+ "multitap": [
+ {
+ "text": "d",
+ "id": "K_D"
+ },
+ {
+ "text": "e",
+ "id": "K_E"
+ },
+ {
+ "text": "f",
+ "id": "K_F"
+ },
+ {
+ "text": "D",
+ "id": "K_D",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "E",
+ "id": "K_E",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "F",
+ "id": "K_F",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "4",
+ "hint": "ghi",
+ "multitap": [
+ {
+ "text": "g",
+ "id": "K_G"
+ },
+ {
+ "text": "h",
+ "id": "K_H"
+ },
+ {
+ "text": "i",
+ "id": "K_I"
+ },
+ {
+ "text": "G",
+ "id": "K_G",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "H",
+ "id": "K_H",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "I",
+ "id": "K_I",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_5",
+ "text": "5",
+ "hint": "jkl",
+ "multitap": [
+ {
+ "text": "j",
+ "id": "K_J"
+ },
+ {
+ "text": "k",
+ "id": "K_K"
+ },
+ {
+ "text": "l",
+ "id": "K_L"
+ },
+ {
+ "text": "J",
+ "id": "K_J",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "K",
+ "id": "K_K",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "L",
+ "id": "K_L",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_6",
+ "text": "6",
+ "hint": "mno",
+ "multitap": [
+ {
+ "text": "m",
+ "id": "K_M"
+ },
+ {
+ "text": "n",
+ "id": "K_N"
+ },
+ {
+ "text": "o",
+ "id": "K_O"
+ },
+ {
+ "text": "M",
+ "id": "K_M",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "N",
+ "id": "K_N",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "O",
+ "id": "K_O",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "T_DK_DIA_GRAVE",
+ "text": "◌̀",
+ "hint": "◌́◌̂",
+ "multitap": [
+ {
+ "text": "◌́",
+ "id": "T_DK_DIA_ACUTE"
+ },
+ {
+ "text": "◌̂",
+ "id": "T_DK_DIA_CIRCUM"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1",
+ "hint": "pqrs",
+ "multitap": [
+ {
+ "text": "p",
+ "id": "K_P"
+ },
+ {
+ "text": "q",
+ "id": "K_Q"
+ },
+ {
+ "text": "r",
+ "id": "K_R"
+ },
+ {
+ "text": "s",
+ "id": "K_S"
+ },
+ {
+ "text": "P",
+ "id": "K_P",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Q",
+ "id": "K_Q",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "R",
+ "id": "K_R",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "S",
+ "id": "K_S",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_2",
+ "text": "2",
+ "hint": "tuv",
+ "multitap": [
+ {
+ "text": "t",
+ "id": "K_T"
+ },
+ {
+ "text": "u",
+ "id": "K_U"
+ },
+ {
+ "text": "v",
+ "id": "K_V"
+ },
+ {
+ "text": "T",
+ "id": "K_T",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "U",
+ "id": "K_U",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "V",
+ "id": "K_V",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_3",
+ "text": "3",
+ "hint": "wxyz",
+ "multitap": [
+ {
+ "text": "w",
+ "id": "K_W"
+ },
+ {
+ "text": "x",
+ "id": "K_X"
+ },
+ {
+ "text": "y",
+ "id": "K_Y"
+ },
+ {
+ "text": "z",
+ "id": "K_Z"
+ },
+ {
+ "text": "W",
+ "id": "K_W",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "X",
+ "id": "K_X",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Y",
+ "id": "K_Y",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Z",
+ "id": "K_Z",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": 100,
+ "sp": 1,
+ "nextlayer": "shift"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "id": "K_COMMA",
+ "text": ","
+ },
+ {
+ "id": "U_0021"
+ },
+ {
+ "id": "U_003F"
+ },
+ {
+ "id": "U_0027"
+ },
+ {
+ "id": "U_0022"
+ },
+ {
+ "id": "U_005C"
+ },
+ {
+ "id": "U_003A"
+ },
+ {
+ "id": "U_003B"
+ }
+ ]
+ },
+ {
+ "id": "T_BLANK",
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "key": [
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 250,
+ "sp": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "shift",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_7",
+ "text": "7",
+ "layer": "default",
+ "hint": ""
+ },
+ {
+ "id": "K_8",
+ "text": "8",
+ "layer": "default",
+ "hint": "ABC",
+ "multitap": [
+ {
+ "text": "A",
+ "id": "K_A"
+ },
+ {
+ "text": "B",
+ "id": "K_B"
+ },
+ {
+ "text": "C",
+ "id": "K_C"
+ },
+ {
+ "text": "a",
+ "id": "K_A",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "b",
+ "id": "K_B",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "c",
+ "id": "K_C",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "9",
+ "layer": "default",
+ "hint": "DEF",
+ "multitap": [
+ {
+ "text": "D",
+ "id": "K_D"
+ },
+ {
+ "text": "E",
+ "id": "K_E"
+ },
+ {
+ "text": "F",
+ "id": "K_F"
+ },
+ {
+ "text": "d",
+ "id": "K_D",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "e",
+ "id": "K_E",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "f",
+ "id": "K_F",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "4",
+ "layer": "default",
+ "hint": "GHI",
+ "multitap": [
+ {
+ "text": "G",
+ "id": "K_G"
+ },
+ {
+ "text": "H",
+ "id": "K_H"
+ },
+ {
+ "text": "I",
+ "id": "K_I"
+ },
+ {
+ "text": "g",
+ "id": "K_G",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "h",
+ "id": "K_H",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "i",
+ "id": "K_I",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_5",
+ "text": "5",
+ "layer": "default",
+ "hint": "JKL",
+ "multitap": [
+ {
+ "text": "J",
+ "id": "K_J"
+ },
+ {
+ "text": "K",
+ "id": "K_K"
+ },
+ {
+ "text": "L",
+ "id": "K_L"
+ },
+ {
+ "text": "j",
+ "id": "K_J",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "k",
+ "id": "K_K",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "l",
+ "id": "K_L",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_6",
+ "text": "6",
+ "layer": "default",
+ "hint": "MNO",
+ "multitap": [
+ {
+ "text": "M",
+ "id": "K_M"
+ },
+ {
+ "text": "N",
+ "id": "K_N"
+ },
+ {
+ "text": "O",
+ "id": "K_O"
+ },
+ {
+ "text": "m",
+ "id": "K_M",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "n",
+ "id": "K_N",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "o",
+ "id": "K_O",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "T_DK_DIA_GRAVE",
+ "text": "◌̀",
+ "hint": "◌́◌̂",
+ "multitap": [
+ {
+ "text": "◌́",
+ "id": "T_DK_DIA_ACUTE"
+ },
+ {
+ "text": "◌̂",
+ "id": "T_DK_DIA_CIRCUM"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1",
+ "layer": "default",
+ "hint": "PQRS",
+ "multitap": [
+ {
+ "text": "P",
+ "id": "K_P"
+ },
+ {
+ "text": "Q",
+ "id": "K_Q"
+ },
+ {
+ "text": "R",
+ "id": "K_R"
+ },
+ {
+ "text": "S",
+ "id": "K_S"
+ },
+ {
+ "text": "p",
+ "id": "K_P",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "q",
+ "id": "K_Q",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "r",
+ "id": "K_R",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "s",
+ "id": "K_S",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_2",
+ "text": "2",
+ "layer": "default",
+ "hint": "TUV",
+ "multitap": [
+ {
+ "text": "T",
+ "id": "K_T"
+ },
+ {
+ "text": "U",
+ "id": "K_U"
+ },
+ {
+ "text": "V",
+ "id": "K_V"
+ },
+ {
+ "text": "t",
+ "id": "K_T",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "u",
+ "id": "K_U",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "v",
+ "id": "K_V",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_3",
+ "text": "3",
+ "layer": "default",
+ "hint": "WXYZ",
+ "multitap": [
+ {
+ "text": "W",
+ "id": "K_W"
+ },
+ {
+ "text": "X",
+ "id": "K_X"
+ },
+ {
+ "text": "Y",
+ "id": "K_Y"
+ },
+ {
+ "text": "Z",
+ "id": "K_Z"
+ },
+ {
+ "text": "w",
+ "id": "K_W",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "x",
+ "id": "K_X",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "y",
+ "id": "K_Y",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "z",
+ "id": "K_Z",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": 100,
+ "sp": 1,
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "id": "K_COMMA",
+ "text": ","
+ },
+ {
+ "id": "U_0021"
+ },
+ {
+ "id": "U_003F"
+ },
+ {
+ "id": "U_0027"
+ },
+ {
+ "id": "U_0022"
+ },
+ {
+ "id": "U_005C"
+ },
+ {
+ "id": "U_003A"
+ },
+ {
+ "id": "U_003B"
+ }
+ ]
+ },
+ {
+ "id": "T_BLANK",
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 5,
+ "key": [
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 250,
+ "sp": 0
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kmn b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kmn
new file mode 100644
index 00000000000..d92eb3cadab
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kmn
@@ -0,0 +1,60 @@
+c diacritic_rota generated from template at 2023-10-25 10:16:56
+c with name "Diacritic Rota"
+store(&VERSION) '14.0'
+store(&NAME) 'Diacritic 10-key Rota'
+store(©RIGHT) '© SIL International'
+store(&KEYBOARDVERSION) '1.0'
+store(&BITMAP) 'diacritic_rota.ico'
+store(&VISUALKEYBOARD) 'diacritic_rota.kvks'
+store(&LAYOUTFILE) 'diacritic_rota.keyman-touch-layout'
+store(&TARGETS) 'web iphone ipad androidphone androidtablet mobile desktop'
+
+store(basekeys) [K_A] .. [K_Z]
+store(bigkeys) [SHIFT K_A] .. [SHIFT K_Z]
+
+store(basealpha) 'abcdefghijklmnopqrstuvwxyz'
+store(bigalpha) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
+store(alphagrave) 'àbcdèfghìjklmǹòpqrstùvẁxỳz'
+store(biggrave) 'ÀBCDÈFGHÌJKLMǸÒPQRSTÙVẀXỲZ'
+
+store(alphaacute) 'ábćdéfǵhíjḱĺḿńóṕqŕśtúvẃxýź'
+store(bigacute) 'ÁBĆDÉFǴHÍJḰĹḾŃÓṔQŔŚTÚVẂXÝŹ'
+
+store(alphacircum) 'âbĉdêfĝĥîĵklmnôpqrŝtûvŵxŷẑ'
+store(bigcircum) 'ÂBĈDÊFĜĤÎĴKLMNÔPQRŜTÛVŴXŶẐ'
+
+store(dias) U+0300 U+0301 U+0302
+store(all_dks) dk(1) dk(2) dk(3)
+
+begin Unicode > use(main)
+
+group(main) using keys
+
++ [ T_DK_DIA_GRAVE ] > U+0300 dk(1)
++ [ T_DK_DIA_ACUTE ] > U+0301 dk(2)
++ [ T_DK_DIA_CIRCUM ] > U+0302 dk(3)
+
++ [ SHIFT T_DK_DIA_GRAVE ] > U+0300 dk(1)
++ [ SHIFT T_DK_DIA_ACUTE ] > U+0301 dk(2)
++ [ SHIFT T_DK_DIA_CIRCUM ] > U+0302 dk(3)
+
++ any(basekeys) > index(basealpha, 1)
++ any(bigkeys) > index(bigalpha, 1)
+
+any(dias) any(all_dks) + [K_SPACE] > ' '
+any(dias) any(all_dks) + [SHIFT K_SPACE] > ' '
+
+match > use(combine)
+
+c ========
+
+group(combine)
+
+U+0300 dk(1) any(basealpha) > index(alphagrave, 3)
+U+0301 dk(2) any(basealpha) > index(alphaacute, 3)
+U+0302 dk(3) any(basealpha) > index(alphacircum, 3)
+
+U+0300 dk(1) any(bigalpha) > index(biggrave, 3)
+U+0301 dk(2) any(bigalpha) > index(bigacute, 3)
+U+0302 dk(3) any(bigalpha) > index(bigcircum, 3)
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kps b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kps
new file mode 100644
index 00000000000..731ab10b943
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kps
@@ -0,0 +1,65 @@
+
+
+
+ 17.0.185.0
+ 7.0
+
+
+
+ readme.htm
+
+
+
+
+
+
+
+
+
+ Diacritic Rota
+ © SIL International
+ SIL International
+
+
+
+
+ ..\build\diacritic_rota.kmx
+
+ 0
+ .kmx
+
+
+ ..\build\diacritic_rota.js
+
+ 0
+ .js
+
+
+ ..\build\diacritic_rota.kvk
+
+ 0
+ .kvk
+
+
+ welcome.htm
+
+ 0
+ .htm
+
+
+ readme.htm
+
+ 0
+ .htm
+
+
+
+
+ Diacritic Rota
+ diacritic_rota
+ 1.0
+
+
+
+
+
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kvks b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kvks
new file mode 100644
index 00000000000..5f9fffc5620
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/diacritic_rota.kvks
@@ -0,0 +1,8 @@
+
+
+
+ 10.0
+ diacritic_rota
+
+
+
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/readme.htm b/web/src/test/manual/web/keyboards/diacritic_rota/source/readme.htm
new file mode 100644
index 00000000000..5c473423922
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/readme.htm
@@ -0,0 +1,24 @@
+
+
+
+
+
+ Diacritic Rota
+
+
+
+
+Diacritic Rota
+
+
+ Diacritic Rota 1.0 generated from template.
+
+
+© SIL International
+
+
+
diff --git a/web/src/test/manual/web/keyboards/diacritic_rota/source/welcome.htm b/web/src/test/manual/web/keyboards/diacritic_rota/source/welcome.htm
new file mode 100644
index 00000000000..74847a463a0
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/diacritic_rota/source/welcome.htm
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Start Using Diacritic Rota
+
+
+
+
+Start Using Diacritic Rota
+
+
+ Diacritic Rota 1.0 generated from template.
+
+
+Keyboard Layout
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/HISTORY.md b/web/src/test/manual/web/keyboards/gesture_prototyping/HISTORY.md
new file mode 100644
index 00000000000..b6327f71029
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/HISTORY.md
@@ -0,0 +1,6 @@
+gesture_prototyping Change History
+====================
+
+1.0 (2023-10-11)
+----------------
+* Created by SIL International
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/LICENSE.md b/web/src/test/manual/web/keyboards/gesture_prototyping/LICENSE.md
new file mode 100644
index 00000000000..b582b3f9086
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+© 2023 SIL International
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/README.md b/web/src/test/manual/web/keyboards/gesture_prototyping/README.md
new file mode 100644
index 00000000000..9f872b1b21c
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/README.md
@@ -0,0 +1,24 @@
+gesture_prototyping keyboard
+==============
+
+Version 1.0
+
+Description
+-----------
+gesture_prototyping generated from template
+
+Links
+-----
+
+Copyright
+---------
+See [LICENSE.md](LICENSE.md)
+
+Supported Platforms
+-------------------
+ * Web
+ * iPhone
+ * iPad
+ * Android phone
+ * Android tablet
+
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/build/gesture_prototyping.js b/web/src/test/manual/web/keyboards/gesture_prototyping/build/gesture_prototyping.js
new file mode 100644
index 00000000000..b81f5676f61
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/build/gesture_prototyping.js
@@ -0,0 +1 @@
+if(typeof keyman === 'undefined') {console.log('Keyboard requires KeymanWeb 10.0 or later');if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");} else {KeymanWeb.KR(new Keyboard_gesture_prototyping());}function Keyboard_gesture_prototyping(){this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;this.KI="Keyboard_gesture_prototyping";this.KN="gesture_prototyping";this.KMINVER="14.0";this.KV={F:' 1em "Arial"',K102:0};this.KV.KLS={};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KV.KLS);this.KDU=0;this.KH='';this.KM=0;this.KBVER="1.0";this.KMBM=0x0310;this.KVKL={"phone":{"font":"Tahoma","displayUnderlying":false,"defaultHint":"flick","layer":[{"id":"default","row":[{"id":"1","key":[{"id":"K_Q","text":"q"},{"id":"K_W","text":"w"},{"id":"K_E","text":"e","flick":{"n":{"id":"U_00EA","text":"\u00EA"},"nw":{"id":"U_00E8","text":"\u00E8"},"ne":{"id":"U_00E9","text":"\u00E9"}}},{"id":"K_R","text":"r"},{"id":"K_T","text":"t"},{"id":"K_Y","text":"y","flick":{"n":{"id":"U_0177","text":"\u0177"},"ne":{"id":"U_00FD","text":"\u00FD"}}},{"id":"K_U","text":"u","flick":{"n":{"id":"U_00FB","text":"\u00FB"},"nw":{"id":"U_00F9","text":"\u00F9"},"ne":{"id":"U_00FA","text":"\u00FA"}}},{"id":"K_I","text":"i","flick":{"n":{"id":"U_00EE","text":"\u00EE"},"nw":{"id":"U_00EC","text":"\u00EC"},"ne":{"id":"U_00ED","text":"\u00ED"}}},{"id":"K_O","text":"o","flick":{"n":{"id":"U_00F4","text":"\u00F4"},"nw":{"id":"U_00F2","text":"\u00F2"},"ne":{"id":"U_00F3","text":"\u00F3"}}},{"id":"K_P","text":"p"}]},{"id":"2","key":[{"id":"K_A","pad":"50","text":"a","flick":{"n":{"id":"U_00E2","text":"\u00E2"},"nw":{"id":"U_00E0","text":"\u00E0"},"ne":{"id":"U_00E1","text":"\u00E1"}}},{"id":"K_S","text":"s"},{"id":"K_D","text":"d"},{"id":"K_F","text":"f"},{"id":"K_G","text":"g"},{"id":"K_H","text":"h"},{"id":"K_J","text":"j"},{"id":"K_K","text":"k"},{"id":"K_L","text":"l"},{"width":"10","id":"T_new_414","sp":"10"}]},{"id":"3","key":[{"nextlayer":"shift","id":"K_SHIFT","sp":"1","text":"*Shift*","multitap":[{"nextlayer":"caps","id":"T_new_991","text":"*ShiftLock*"}]},{"id":"K_Z","text":"z"},{"id":"K_X","text":"x"},{"id":"K_C","text":"c"},{"id":"K_V","text":"v"},{"id":"K_B","text":"b"},{"id":"K_N","text":"n"},{"id":"K_M","text":"m"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"id":"K_COLON","text":";"}],"multitap":[{"id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"460","id":"K_SPACE"},{"nextlayer":"accent-acute","id":"T_ACUTE","sp":"1","text":"\u25CC\u0301","hint":"\u25CC\u0300\u25CC\u0302","multitap":[{"nextlayer":"accent-grave","id":"T_GRAVE","sp":"1","text":"\u0300"},{"nextlayer":"circumflex","id":"T_CIRCUMFLEX","sp":"1","text":"\u0302"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"shift","row":[{"id":"1","key":[{"id":"K_Q","text":"Q"},{"id":"K_W","text":"W"},{"id":"K_E","text":"E","flick":{"n":{"id":"U_00CA","text":"\u00CA"},"nw":{"id":"U_00C8","text":"\u00C8"},"ne":{"id":"U_00C9","text":"\u00C9"}}},{"id":"K_R","text":"R"},{"id":"K_T","text":"T"},{"id":"K_Y","text":"Y","flick":{"n":{"id":"U_0176","text":"\u0176"},"ne":{"id":"U_00DD","text":"\u00DD"}}},{"id":"K_U","text":"U","flick":{"n":{"id":"U_00DB","text":"\u00DB"},"nw":{"id":"U_00D9","text":"\u00D9"},"ne":{"id":"U_00DA","text":"\u00DA"}}},{"id":"K_I","text":"I","flick":{"n":{"id":"U_00CE","text":"\u00CE"},"nw":{"id":"U_00CC","text":"\u00CC"},"ne":{"id":"U_00CD","text":"\u00CD"}}},{"id":"K_O","text":"O","flick":{"n":{"id":"U_00D4","text":"\u00D4"},"nw":{"id":"U_00D2","text":"\u00D2"},"ne":{"id":"U_00D3","text":"\u00D3"}}},{"id":"K_P","text":"P"}]},{"id":"2","key":[{"id":"K_A","pad":"50","text":"A","flick":{"n":{"id":"U_00C2","text":"\u00C2"},"nw":{"id":"U_00C0","text":"\u00C0"},"ne":{"id":"U_00C1","text":"\u00C1"}}},{"id":"K_S","text":"S"},{"id":"K_D","text":"D"},{"id":"K_F","text":"F"},{"id":"K_G","text":"G"},{"id":"K_H","text":"H"},{"id":"K_J","text":"J"},{"id":"K_K","text":"K"},{"id":"K_L","text":"L"},{"width":"10","id":"T_new_155","sp":"10"}]},{"id":"3","key":[{"nextlayer":"default","id":"K_SHIFT","sp":"2","text":"*Shift*"},{"id":"K_Z","text":"Z"},{"id":"K_X","text":"X"},{"id":"K_C","text":"C"},{"id":"K_V","text":"V"},{"id":"K_B","text":"B"},{"id":"K_N","text":"N"},{"id":"K_M","text":"M"},{"layer":"default","id":"K_PERIOD","text":".","sk":[{"layer":"default","id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"layer":"default","id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"layer":"default","id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"layer":"default","id":"K_COLON","text":";"}]},{"id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"610","id":"K_SPACE"},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"numeric","row":[{"id":"1","key":[{"id":"K_1","text":"1"},{"id":"K_2","text":"2"},{"id":"K_3","text":"3"},{"id":"K_4","text":"4"},{"id":"K_5","text":"5"},{"id":"K_6","text":"6"},{"id":"K_7","text":"7"},{"id":"K_8","text":"8"},{"id":"K_9","text":"9"},{"id":"K_0","text":"0"}]},{"id":"2","key":[{"layer":"shift","id":"K_4","pad":"50","text":"$"},{"layer":"shift","id":"K_2","text":"@"},{"layer":"shift","id":"K_3","text":"#"},{"layer":"shift","id":"K_5","text":"%"},{"layer":"shift","id":"K_7","text":"&"},{"layer":"shift","id":"K_HYPHEN","text":"_"},{"layer":"default","id":"K_EQUAL","text":"="},{"layer":"shift","id":"K_BKSLASH","text":"|"},{"layer":"default","id":"K_BKSLASH","text":"\\"},{"width":"10","id":"T_new_122","sp":"10"}]},{"id":"3","key":[{"id":"K_LBRKT","pad":"110","text":"[","sk":[{"id":"U_00AB","text":"\u00AB"},{"layer":"shift","id":"K_COMMA","text":"<"},{"layer":"shift","id":"K_LBRKT","text":"{"}]},{"layer":"shift","id":"K_9","text":"("},{"layer":"shift","id":"K_0","text":")"},{"id":"K_RBRKT","text":"]","sk":[{"id":"U_00BB","text":"\u00BB"},{"layer":"shift","id":"K_PERIOD","text":">"},{"layer":"shift","id":"K_RBRKT","text":"}"}]},{"layer":"shift","id":"K_EQUAL","text":"+"},{"id":"K_HYPHEN","text":"-"},{"layer":"shift","id":"K_8","text":"*"},{"id":"K_SLASH","text":"\/"},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"default","width":"150","id":"K_LOWER","sp":"1","text":"*abc*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"610","id":"K_SPACE"},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"caps","row":[{"id":"1","key":[{"id":"K_Q","text":"Q"},{"id":"K_W","text":"W"},{"id":"K_E","text":"E","flick":{"n":{"id":"U_00CA","text":"\u00CA"},"nw":{"id":"U_00C8","text":"\u00C8"},"ne":{"id":"U_00C9","text":"\u00C9"}}},{"id":"K_R","text":"R"},{"id":"K_T","text":"T"},{"id":"K_Y","text":"Y","flick":{"n":{"id":"U_0176","text":"\u0176"},"ne":{"id":"U_00DD","text":"\u00DD"}}},{"id":"K_U","text":"U","flick":{"n":{"id":"U_00DB","text":"\u00DB"},"nw":{"id":"U_00D9","text":"\u00D9"},"ne":{"id":"U_00DA","text":"\u00DA"}}},{"id":"K_I","text":"I","flick":{"n":{"id":"U_00CE","text":"\u00CE"},"nw":{"id":"U_00CC","text":"\u00CC"},"ne":{"id":"U_00CD","text":"\u00CD"}}},{"id":"K_O","text":"O","flick":{"n":{"id":"U_00D4","text":"\u00D4"},"nw":{"id":"U_00D2","text":"\u00D2"},"ne":{"id":"U_00D3","text":"\u00D3"}}},{"id":"K_P","text":"P"}]},{"id":"2","key":[{"id":"K_A","pad":"50","text":"A","flick":{"n":{"id":"U_00C2","text":"\u00C2"},"nw":{"id":"U_00C0","text":"\u00C0"},"ne":{"id":"U_00C1","text":"\u00C1"}}},{"id":"K_S","text":"S"},{"id":"K_D","text":"D"},{"id":"K_F","text":"F"},{"id":"K_G","text":"G"},{"id":"K_H","text":"H"},{"id":"K_J","text":"J"},{"id":"K_K","text":"K"},{"id":"K_L","text":"L"},{"width":"10","id":"T_new_155","sp":"10"}]},{"id":"3","key":[{"nextlayer":"default","id":"K_SHIFT","sp":"2","text":"*ShiftLock*"},{"id":"K_Z","text":"Z"},{"id":"K_X","text":"X"},{"id":"K_C","text":"C"},{"id":"K_V","text":"V"},{"id":"K_B","text":"B"},{"id":"K_N","text":"N"},{"id":"K_M","text":"M"},{"layer":"default","id":"K_PERIOD","text":".","sk":[{"layer":"default","id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"layer":"default","id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"layer":"default","id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"layer":"default","id":"K_COLON","text":";"}]},{"id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"610","id":"K_SPACE"},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"accent-acute","row":[{"id":"1","key":[{"id":"K_Q","text":"q"},{"id":"K_W","text":"w"},{"id":"U_00E9","text":"\u00E9"},{"id":"U_0155","text":"\u0155"},{"id":"K_T","text":"t"},{"id":"U_00FD","text":"\u00FD"},{"id":"U_00FA","text":"\u00FA"},{"id":"U_00ED","text":"\u00ED"},{"id":"U_00F3","text":"\u00F3"},{"id":"K_P","text":"p"}]},{"id":"2","key":[{"id":"U_00E1","pad":"50","text":"\u00E1"},{"id":"U_015B","text":"\u015B"},{"id":"K_D","text":"d"},{"id":"K_F","text":"f"},{"id":"U_01F5","text":"\u01F5"},{"id":"K_H","text":"h"},{"id":"K_J","text":"j"},{"id":"K_K","text":"k"},{"id":"U_013A","text":"\u013A"},{"width":"10","id":"T_new_828","sp":"10"}]},{"id":"3","key":[{"nextlayer":"shift","id":"K_SHIFT","sp":"1","text":"*Shift*","multitap":[{"nextlayer":"caps","id":"T_new_991","text":"*ShiftLock*"}]},{"id":"U_017A","text":"\u017A"},{"id":"K_X","text":"x"},{"id":"U_0107","text":"\u0107"},{"id":"K_V","text":"v"},{"id":"K_B","text":"b"},{"id":"U_0144","text":"\u0144"},{"id":"K_M","text":"m"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"id":"K_COLON","text":";"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"460","id":"K_SPACE"},{"nextlayer":"default","id":"T_DEFAULT","sp":"1","text":"*abc*","multitap":[{"nextlayer":"accent-grave","id":"T_GRAVE","sp":"1","text":"\u0300"},{"nextlayer":"circumflex","id":"T_CIRCUMFLEX","sp":"1","text":"\u0302"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"accent-grave","row":[{"id":"1","key":[{"id":"K_Q","text":"q"},{"id":"K_W","text":"w"},{"id":"U_00E8","text":"\u00E8"},{"id":"K_R","text":"r"},{"id":"K_T","text":"t"},{"id":"K_Y","text":"y"},{"id":"U_00F9","text":"\u00F9"},{"id":"U_00EC","text":"\u00EC"},{"id":"U_00F2","text":"\u00F2"},{"id":"K_P","text":"p"}]},{"id":"2","key":[{"id":"U_00E0","pad":"50","text":"\u00E0"},{"id":"K_S","text":"s"},{"id":"K_D","text":"d"},{"id":"K_F","text":"f"},{"id":"K_G","text":"g"},{"id":"K_H","text":"h"},{"id":"K_J","text":"j"},{"id":"K_K","text":"k"},{"id":"K_L","text":"l"},{"width":"10","id":"T_new_1003","sp":"10"}]},{"id":"3","key":[{"nextlayer":"shift","id":"K_SHIFT","sp":"1","text":"*Shift*","multitap":[{"nextlayer":"caps","id":"T_new_991","text":"*ShiftLock*"}]},{"id":"K_Z","text":"z"},{"id":"K_X","text":"x"},{"id":"K_C","text":"c"},{"id":"K_V","text":"v"},{"id":"K_B","text":"b"},{"id":"U_01F9","text":"\u01F9"},{"id":"K_M","text":"m"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"id":"K_COLON","text":";"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"460","id":"K_SPACE"},{"nextlayer":"default","id":"T_DEFAULT","sp":"1","text":"*abc*","multitap":[{"nextlayer":"accent-acute","id":"T_ACUTE","sp":"1","text":"\u0301"},{"nextlayer":"circumflex","id":"T_CIRCUMFLEX","sp":"1","text":"\u0302"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]},{"id":"circumflex","row":[{"id":"1","key":[{"id":"K_Q","text":"q"},{"id":"U_0175","text":"\u0175"},{"id":"U_00EA","text":"\u00EA"},{"id":"K_R","text":"r"},{"id":"K_T","text":"t"},{"id":"U_0177","text":"\u0177"},{"id":"U_00FB","text":"\u00FB"},{"id":"U_00EE","text":"\u00EE"},{"id":"U_00F4","text":"\u00F4"},{"id":"K_P","text":"p"}]},{"id":"2","key":[{"id":"U_00E2","pad":"50","text":"\u00E2"},{"id":"U_015D","text":"\u015D"},{"id":"K_D","text":"d"},{"id":"K_F","text":"f"},{"id":"K_G","text":"g"},{"id":"U_0125","text":"\u0125"},{"id":"U_0135","text":"\u0135"},{"id":"K_K","text":"k"},{"id":"K_L","text":"l"},{"width":"10","id":"T_new_1178","sp":"10"}]},{"id":"3","key":[{"nextlayer":"shift","id":"K_SHIFT","sp":"1","text":"*Shift*","multitap":[{"nextlayer":"caps","id":"T_new_991","text":"*ShiftLock*"}]},{"id":"K_Z","text":"z"},{"id":"K_X","text":"x"},{"id":"U_0109","text":"\u0109"},{"id":"K_V","text":"v"},{"id":"K_B","text":"b"},{"id":"K_N","text":"n"},{"id":"K_M","text":"m"},{"id":"K_PERIOD","text":".","sk":[{"id":"K_COMMA","text":","},{"layer":"shift","id":"K_1","text":"!"},{"layer":"shift","id":"K_SLASH","text":"?"},{"id":"K_QUOTE","text":"'"},{"layer":"shift","id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"\\"},{"layer":"shift","id":"K_COLON","text":":"},{"id":"K_COLON","text":";"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"4","key":[{"nextlayer":"numeric","width":"150","id":"K_NUMLOCK","sp":"1","text":"*123*"},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"},{"width":"460","id":"K_SPACE"},{"nextlayer":"default","id":"T_DEFAULT","sp":"1","text":"*abc*","multitap":[{"nextlayer":"accent-acute","id":"T_ACUTE","sp":"1","text":"\u0301"},{"nextlayer":"accent-grave","id":"T_GRAVE","sp":"1","text":"\u0300"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]}]}]}};this.s11="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";this.KVER="17.0.185.0";this.KVS=[];this.gs=function(t,e) {return this.g0(t,e);};this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;if(k.KKM(e,16640,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"A");}}else if(k.KKM(e,16912,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"A");}}else if(k.KKM(e,16640,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"B");}}else if(k.KKM(e,16912,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"B");}}else if(k.KKM(e,16640,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"C");}}else if(k.KKM(e,16912,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"C");}}else if(k.KKM(e,16640,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"D");}}else if(k.KKM(e,16912,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"D");}}else if(k.KKM(e,16640,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"E");}}else if(k.KKM(e,16912,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"E");}}else if(k.KKM(e,16640,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"F");}}else if(k.KKM(e,16912,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"F");}}else if(k.KKM(e,16640,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"G");}}else if(k.KKM(e,16912,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"G");}}else if(k.KKM(e,16640,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"H");}}else if(k.KKM(e,16912,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"H");}}else if(k.KKM(e,16640,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"I");}}else if(k.KKM(e,16912,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"I");}}else if(k.KKM(e,16640,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"J");}}else if(k.KKM(e,16912,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"J");}}else if(k.KKM(e,16640,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"K");}}else if(k.KKM(e,16912,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"K");}}else if(k.KKM(e,16640,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"L");}}else if(k.KKM(e,16912,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"L");}}else if(k.KKM(e,16640,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"M");}}else if(k.KKM(e,16912,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"M");}}else if(k.KKM(e,16640,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"N");}}else if(k.KKM(e,16912,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"N");}}else if(k.KKM(e,16640,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"O");}}else if(k.KKM(e,16912,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"O");}}else if(k.KKM(e,16640,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"P");}}else if(k.KKM(e,16912,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"P");}}else if(k.KKM(e,16640,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Q");}}else if(k.KKM(e,16912,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Q");}}else if(k.KKM(e,16640,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"R");}}else if(k.KKM(e,16912,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"R");}}else if(k.KKM(e,16640,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"S");}}else if(k.KKM(e,16912,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"S");}}else if(k.KKM(e,16640,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"T");}}else if(k.KKM(e,16912,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"T");}}else if(k.KKM(e,16640,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"U");}}else if(k.KKM(e,16912,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"U");}}else if(k.KKM(e,16640,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"V");}}else if(k.KKM(e,16912,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"V");}}else if(k.KKM(e,16640,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"W");}}else if(k.KKM(e,16912,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"W");}}else if(k.KKM(e,16640,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"X");}}else if(k.KKM(e,16912,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"X");}}else if(k.KKM(e,16640,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Y");}}else if(k.KKM(e,16912,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Y");}}else if(k.KKM(e,16640,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Z");}}else if(k.KKM(e,16912,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"Z");}}else if(k.KKM(e,16656,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"a");}}else if(k.KKM(e,16896,65)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"a");}}else if(k.KKM(e,16656,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"b");}}else if(k.KKM(e,16896,66)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"b");}}else if(k.KKM(e,16656,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"c");}}else if(k.KKM(e,16896,67)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"c");}}else if(k.KKM(e,16656,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"d");}}else if(k.KKM(e,16896,68)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"d");}}else if(k.KKM(e,16656,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"e");}}else if(k.KKM(e,16896,69)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"e");}}else if(k.KKM(e,16656,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"f");}}else if(k.KKM(e,16896,70)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"f");}}else if(k.KKM(e,16656,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"g");}}else if(k.KKM(e,16896,71)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"g");}}else if(k.KKM(e,16656,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"h");}}else if(k.KKM(e,16896,72)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"h");}}else if(k.KKM(e,16656,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"i");}}else if(k.KKM(e,16896,73)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"i");}}else if(k.KKM(e,16656,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"j");}}else if(k.KKM(e,16896,74)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"j");}}else if(k.KKM(e,16656,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"k");}}else if(k.KKM(e,16896,75)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"k");}}else if(k.KKM(e,16656,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"l");}}else if(k.KKM(e,16896,76)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"l");}}else if(k.KKM(e,16656,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"m");}}else if(k.KKM(e,16896,77)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"m");}}else if(k.KKM(e,16656,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"n");}}else if(k.KKM(e,16896,78)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"n");}}else if(k.KKM(e,16656,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"o");}}else if(k.KKM(e,16896,79)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"o");}}else if(k.KKM(e,16656,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"p");}}else if(k.KKM(e,16896,80)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"p");}}else if(k.KKM(e,16656,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"q");}}else if(k.KKM(e,16896,81)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"q");}}else if(k.KKM(e,16656,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"r");}}else if(k.KKM(e,16896,82)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"r");}}else if(k.KKM(e,16656,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"s");}}else if(k.KKM(e,16896,83)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"s");}}else if(k.KKM(e,16656,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"t");}}else if(k.KKM(e,16896,84)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"t");}}else if(k.KKM(e,16656,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"u");}}else if(k.KKM(e,16896,85)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"u");}}else if(k.KKM(e,16656,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"v");}}else if(k.KKM(e,16896,86)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"v");}}else if(k.KKM(e,16656,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"w");}}else if(k.KKM(e,16896,87)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"w");}}else if(k.KKM(e,16656,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"x");}}else if(k.KKM(e,16896,88)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"x");}}if(m) {}else if(k.KKM(e,16656,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"y");}}else if(k.KKM(e,16896,89)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"y");}}else if(k.KKM(e,16656,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"z");}}else if(k.KKM(e,16896,90)) {if(1){r=m=1;k.KDC(0,t);k.KO(-1,t,"z");}}return r;};}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.keyboard_info b/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.keyboard_info
new file mode 100644
index 00000000000..beb6f4634d2
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.keyboard_info
@@ -0,0 +1,7 @@
+{
+ "license": "mit",
+ "languages": [
+
+ ],
+ "description": "gesture_prototyping generated from template"
+}
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.kpj b/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.kpj
new file mode 100644
index 00000000000..a270dd04fa3
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/gesture_prototyping.kpj
@@ -0,0 +1,94 @@
+
+
+
+ $PROJECTPATH\build
+ True
+ True
+ True
+ keyboard
+
+
+
+ id_2dd8a0269b5f9b699697b6842fc56da2
+ gesture_prototyping.kmn
+ source\gesture_prototyping.kmn
+ 1.0
+ .kmn
+
+ gesture_prototyping
+ © SIL International
+
+
+
+ id_356fe7d07a770525e3af90b5379a1e18
+ gesture_prototyping.kps
+ source\gesture_prototyping.kps
+
+ .kps
+
+ gesture_prototyping
+ © SIL International
+
+
+
+ id_ede98e4633e239f933cbfd1f4e1b766c
+ HISTORY.md
+ HISTORY.md
+
+ .md
+
+
+ id_53e892b8b41cc4caece1cfd5ef21d6e7
+ LICENSE.md
+ LICENSE.md
+
+ .md
+
+
+ id_0730bb7c2e8f9ea2438b52e419dd86c9
+ README.md
+ README.md
+
+ .md
+
+
+ id_b2f700298d714f69b2563e3f403017b8
+ gesture_prototyping.keyboard_info
+ gesture_prototyping.keyboard_info
+
+ .keyboard_info
+
+
+ id_14f6e104f93ac93d8aecf6bebcc19e34
+ gesture_prototyping.js
+ source\..\build\gesture_prototyping.js
+
+ .js
+ id_356fe7d07a770525e3af90b5379a1e18
+
+
+ id_2065b999f8a8567a280a0155e85e547d
+ gesture_prototyping.kvk
+ source\..\build\gesture_prototyping.kvk
+
+ .kvk
+ id_356fe7d07a770525e3af90b5379a1e18
+
+
+ id_356e5d149c1e539356d72698c1e401a6
+ welcome.htm
+ source\welcome.htm
+
+ .htm
+ id_356fe7d07a770525e3af90b5379a1e18
+
+
+ id_8da344c4cea6f467013357fe099006f5
+ readme.htm
+ source\readme.htm
+
+ .htm
+ id_356fe7d07a770525e3af90b5379a1e18
+
+
+
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.keyman-touch-layout b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.keyman-touch-layout
new file mode 100644
index 00000000000..a6024bdd893
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.keyman-touch-layout
@@ -0,0 +1,1884 @@
+{
+ "phone": {
+ "font": "Tahoma",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "K_W",
+ "text": "w"
+ },
+ {
+ "id": "K_E",
+ "text": "e",
+ "flick": {
+ "ne": {
+ "text": "é",
+ "id": "U_00E9"
+ },
+ "nw": {
+ "text": "è",
+ "id": "U_00E8"
+ },
+ "n": {
+ "text": "ê",
+ "id": "U_00EA"
+ }
+ }
+ },
+ {
+ "id": "K_R",
+ "text": "r"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "K_Y",
+ "text": "y",
+ "flick": {
+ "ne": {
+ "text": "ý",
+ "id": "U_00FD"
+ },
+ "n": {
+ "text": "ŷ",
+ "id": "U_0177"
+ }
+ }
+ },
+ {
+ "id": "K_U",
+ "text": "u",
+ "flick": {
+ "nw": {
+ "text": "ù",
+ "id": "U_00F9"
+ },
+ "ne": {
+ "text": "ú",
+ "id": "U_00FA"
+ },
+ "n": {
+ "text": "û",
+ "id": "U_00FB"
+ }
+ }
+ },
+ {
+ "id": "K_I",
+ "text": "i",
+ "flick": {
+ "nw": {
+ "text": "ì",
+ "id": "U_00EC"
+ },
+ "ne": {
+ "text": "í",
+ "id": "U_00ED"
+ },
+ "n": {
+ "text": "î",
+ "id": "U_00EE"
+ }
+ }
+ },
+ {
+ "id": "K_O",
+ "text": "o",
+ "flick": {
+ "nw": {
+ "text": "ò",
+ "id": "U_00F2"
+ },
+ "ne": {
+ "text": "ó",
+ "id": "U_00F3"
+ },
+ "n": {
+ "text": "ô",
+ "id": "U_00F4"
+ }
+ }
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "a",
+ "pad": 50,
+ "flick": {
+ "nw": {
+ "text": "à",
+ "id": "U_00E0"
+ },
+ "ne": {
+ "text": "á",
+ "id": "U_00E1"
+ },
+ "n": {
+ "text": "â",
+ "id": "U_00E2"
+ }
+ }
+ },
+ {
+ "id": "K_S",
+ "text": "s"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "K_G",
+ "text": "g"
+ },
+ {
+ "id": "K_H",
+ "text": "h"
+ },
+ {
+ "id": "K_J",
+ "text": "j"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "K_L",
+ "text": "l"
+ },
+ {
+ "id": "T_new_414",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": 1,
+ "nextlayer": "shift",
+ "multitap": [
+ {
+ "text": "*ShiftLock*",
+ "id": "T_new_991",
+ "nextlayer": "caps"
+ }
+ ]
+ },
+ {
+ "id": "K_Z",
+ "text": "z"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "K_C",
+ "text": "c"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "K_N",
+ "text": "n"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ],
+ "multitap": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 460,
+ "sp": 0
+ },
+ {
+ "id": "T_ACUTE",
+ "text": "◌́",
+ "sp": 1,
+ "nextlayer": "accent-acute",
+ "hint": "◌̀◌̂",
+ "multitap": [
+ {
+ "text": "̀",
+ "id": "T_GRAVE",
+ "sp": "1",
+ "nextlayer": "accent-grave"
+ },
+ {
+ "text": "̂",
+ "id": "T_CIRCUMFLEX",
+ "sp": "1",
+ "nextlayer": "circumflex"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "shift",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "Q"
+ },
+ {
+ "id": "K_W",
+ "text": "W"
+ },
+ {
+ "id": "K_E",
+ "text": "E",
+ "flick": {
+ "n": {
+ "text": "Ê",
+ "id": "U_00CA"
+ },
+ "ne": {
+ "text": "É",
+ "id": "U_00C9"
+ },
+ "nw": {
+ "text": "È",
+ "id": "U_00C8"
+ }
+ }
+ },
+ {
+ "id": "K_R",
+ "text": "R"
+ },
+ {
+ "id": "K_T",
+ "text": "T"
+ },
+ {
+ "id": "K_Y",
+ "text": "Y",
+ "flick": {
+ "n": {
+ "text": "Ŷ",
+ "id": "U_0176"
+ },
+ "ne": {
+ "text": "Ý",
+ "id": "U_00DD"
+ }
+ }
+ },
+ {
+ "id": "K_U",
+ "text": "U",
+ "flick": {
+ "nw": {
+ "text": "Ù",
+ "id": "U_00D9"
+ },
+ "ne": {
+ "text": "Ú",
+ "id": "U_00DA"
+ },
+ "n": {
+ "text": "Û",
+ "id": "U_00DB"
+ }
+ }
+ },
+ {
+ "id": "K_I",
+ "text": "I",
+ "flick": {
+ "nw": {
+ "text": "Ì",
+ "id": "U_00CC"
+ },
+ "ne": {
+ "text": "Í",
+ "id": "U_00CD"
+ },
+ "n": {
+ "text": "Î",
+ "id": "U_00CE"
+ }
+ }
+ },
+ {
+ "id": "K_O",
+ "text": "O",
+ "flick": {
+ "nw": {
+ "text": "Ò",
+ "id": "U_00D2"
+ },
+ "ne": {
+ "text": "Ó",
+ "id": "U_00D3"
+ },
+ "n": {
+ "text": "Ô",
+ "id": "U_00D4"
+ }
+ }
+ },
+ {
+ "id": "K_P",
+ "text": "P"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "A",
+ "pad": 50,
+ "flick": {
+ "n": {
+ "text": "Â",
+ "id": "U_00C2"
+ },
+ "nw": {
+ "text": "À",
+ "id": "U_00C0"
+ },
+ "ne": {
+ "text": "Á",
+ "id": "U_00C1"
+ }
+ }
+ },
+ {
+ "id": "K_S",
+ "text": "S"
+ },
+ {
+ "id": "K_D",
+ "text": "D"
+ },
+ {
+ "id": "K_F",
+ "text": "F"
+ },
+ {
+ "id": "K_G",
+ "text": "G"
+ },
+ {
+ "id": "K_H",
+ "text": "H"
+ },
+ {
+ "id": "K_J",
+ "text": "J"
+ },
+ {
+ "id": "K_K",
+ "text": "K"
+ },
+ {
+ "id": "K_L",
+ "text": "L"
+ },
+ {
+ "id": "T_new_155",
+ "text": "",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": 2,
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_Z",
+ "text": "Z"
+ },
+ {
+ "id": "K_X",
+ "text": "X"
+ },
+ {
+ "id": "K_C",
+ "text": "C"
+ },
+ {
+ "id": "K_V",
+ "text": "V"
+ },
+ {
+ "id": "K_B",
+ "text": "B"
+ },
+ {
+ "id": "K_N",
+ "text": "N"
+ },
+ {
+ "id": "K_M",
+ "text": "M"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "layer": "default",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 610,
+ "sp": 0
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "numeric",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1"
+ },
+ {
+ "id": "K_2",
+ "text": "2"
+ },
+ {
+ "id": "K_3",
+ "text": "3"
+ },
+ {
+ "id": "K_4",
+ "text": "4"
+ },
+ {
+ "id": "K_5",
+ "text": "5"
+ },
+ {
+ "id": "K_6",
+ "text": "6"
+ },
+ {
+ "id": "K_7",
+ "text": "7"
+ },
+ {
+ "id": "K_8",
+ "text": "8"
+ },
+ {
+ "id": "K_9",
+ "text": "9"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "$",
+ "pad": 50,
+ "layer": "shift"
+ },
+ {
+ "id": "K_2",
+ "text": "@",
+ "layer": "shift"
+ },
+ {
+ "id": "K_3",
+ "text": "#",
+ "layer": "shift"
+ },
+ {
+ "id": "K_5",
+ "text": "%",
+ "layer": "shift"
+ },
+ {
+ "id": "K_7",
+ "text": "&",
+ "layer": "shift"
+ },
+ {
+ "id": "K_HYPHEN",
+ "text": "_",
+ "layer": "shift"
+ },
+ {
+ "id": "K_EQUAL",
+ "text": "=",
+ "layer": "default"
+ },
+ {
+ "id": "K_BKSLASH",
+ "text": "|",
+ "layer": "shift"
+ },
+ {
+ "id": "K_BKSLASH",
+ "text": "\\",
+ "layer": "default"
+ },
+ {
+ "id": "T_new_122",
+ "text": "",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_LBRKT",
+ "text": "[",
+ "pad": 110,
+ "sk": [
+ {
+ "id": "U_00AB",
+ "text": "«"
+ },
+ {
+ "id": "K_COMMA",
+ "text": "<",
+ "layer": "shift"
+ },
+ {
+ "id": "K_LBRKT",
+ "text": "{",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "(",
+ "layer": "shift"
+ },
+ {
+ "id": "K_0",
+ "text": ")",
+ "layer": "shift"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "]",
+ "sk": [
+ {
+ "id": "U_00BB",
+ "text": "»"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ">",
+ "layer": "shift"
+ },
+ {
+ "id": "K_RBRKT",
+ "text": "}",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_EQUAL",
+ "text": "+",
+ "layer": "shift"
+ },
+ {
+ "id": "K_HYPHEN",
+ "text": "-"
+ },
+ {
+ "id": "K_8",
+ "text": "*",
+ "layer": "shift"
+ },
+ {
+ "id": "K_SLASH",
+ "text": "/"
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_LOWER",
+ "text": "*abc*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 610,
+ "sp": 0
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "caps",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "Q"
+ },
+ {
+ "id": "K_W",
+ "text": "W"
+ },
+ {
+ "id": "K_E",
+ "text": "E",
+ "flick": {
+ "n": {
+ "text": "Ê",
+ "id": "U_00CA"
+ },
+ "ne": {
+ "text": "É",
+ "id": "U_00C9"
+ },
+ "nw": {
+ "text": "È",
+ "id": "U_00C8"
+ }
+ }
+ },
+ {
+ "id": "K_R",
+ "text": "R"
+ },
+ {
+ "id": "K_T",
+ "text": "T"
+ },
+ {
+ "id": "K_Y",
+ "text": "Y",
+ "flick": {
+ "n": {
+ "text": "Ŷ",
+ "id": "U_0176"
+ },
+ "ne": {
+ "text": "Ý",
+ "id": "U_00DD"
+ }
+ }
+ },
+ {
+ "id": "K_U",
+ "text": "U",
+ "flick": {
+ "nw": {
+ "text": "Ù",
+ "id": "U_00D9"
+ },
+ "ne": {
+ "text": "Ú",
+ "id": "U_00DA"
+ },
+ "n": {
+ "text": "Û",
+ "id": "U_00DB"
+ }
+ }
+ },
+ {
+ "id": "K_I",
+ "text": "I",
+ "flick": {
+ "nw": {
+ "text": "Ì",
+ "id": "U_00CC"
+ },
+ "ne": {
+ "text": "Í",
+ "id": "U_00CD"
+ },
+ "n": {
+ "text": "Î",
+ "id": "U_00CE"
+ }
+ }
+ },
+ {
+ "id": "K_O",
+ "text": "O",
+ "flick": {
+ "nw": {
+ "text": "Ò",
+ "id": "U_00D2"
+ },
+ "ne": {
+ "text": "Ó",
+ "id": "U_00D3"
+ },
+ "n": {
+ "text": "Ô",
+ "id": "U_00D4"
+ }
+ }
+ },
+ {
+ "id": "K_P",
+ "text": "P"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_A",
+ "text": "A",
+ "pad": 50,
+ "flick": {
+ "n": {
+ "text": "Â",
+ "id": "U_00C2"
+ },
+ "nw": {
+ "text": "À",
+ "id": "U_00C0"
+ },
+ "ne": {
+ "text": "Á",
+ "id": "U_00C1"
+ }
+ }
+ },
+ {
+ "id": "K_S",
+ "text": "S"
+ },
+ {
+ "id": "K_D",
+ "text": "D"
+ },
+ {
+ "id": "K_F",
+ "text": "F"
+ },
+ {
+ "id": "K_G",
+ "text": "G"
+ },
+ {
+ "id": "K_H",
+ "text": "H"
+ },
+ {
+ "id": "K_J",
+ "text": "J"
+ },
+ {
+ "id": "K_K",
+ "text": "K"
+ },
+ {
+ "id": "K_L",
+ "text": "L"
+ },
+ {
+ "id": "T_new_155",
+ "text": "",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*ShiftLock*",
+ "sp": 2,
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_Z",
+ "text": "Z"
+ },
+ {
+ "id": "K_X",
+ "text": "X"
+ },
+ {
+ "id": "K_C",
+ "text": "C"
+ },
+ {
+ "id": "K_V",
+ "text": "V"
+ },
+ {
+ "id": "K_B",
+ "text": "B"
+ },
+ {
+ "id": "K_N",
+ "text": "N"
+ },
+ {
+ "id": "K_M",
+ "text": "M"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "layer": "default",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA",
+ "layer": "default"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE",
+ "layer": "default"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH",
+ "layer": "default"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 610,
+ "sp": 0
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "accent-acute",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "K_W",
+ "text": "w"
+ },
+ {
+ "id": "U_00E9",
+ "text": "é"
+ },
+ {
+ "id": "U_0155",
+ "text": "ŕ"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "U_00FD",
+ "text": "ý"
+ },
+ {
+ "id": "U_00FA",
+ "text": "ú"
+ },
+ {
+ "id": "U_00ED",
+ "text": "í"
+ },
+ {
+ "id": "U_00F3",
+ "text": "ó"
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "U_00E1",
+ "text": "á",
+ "pad": 50
+ },
+ {
+ "id": "U_015B",
+ "text": "ś"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "U_01F5",
+ "text": "ǵ"
+ },
+ {
+ "id": "K_H",
+ "text": "h"
+ },
+ {
+ "id": "K_J",
+ "text": "j"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "U_013A",
+ "text": "ĺ"
+ },
+ {
+ "id": "T_new_828",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": 1,
+ "nextlayer": "shift",
+ "multitap": [
+ {
+ "text": "*ShiftLock*",
+ "id": "T_new_991",
+ "nextlayer": "caps"
+ }
+ ]
+ },
+ {
+ "id": "U_017A",
+ "text": "ź"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "U_0107",
+ "text": "ć"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "U_0144",
+ "text": "ń"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 460,
+ "sp": 0
+ },
+ {
+ "id": "T_DEFAULT",
+ "text": "*abc*",
+ "sp": 1,
+ "nextlayer": "default",
+ "multitap": [
+ {
+ "text": "̀",
+ "id": "T_GRAVE",
+ "sp": "1",
+ "nextlayer": "accent-grave"
+ },
+ {
+ "text": "̂",
+ "id": "T_CIRCUMFLEX",
+ "sp": "1",
+ "nextlayer": "circumflex"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "accent-grave",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "K_W",
+ "text": "w"
+ },
+ {
+ "id": "U_00E8",
+ "text": "è"
+ },
+ {
+ "id": "K_R",
+ "text": "r"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "K_Y",
+ "text": "y"
+ },
+ {
+ "id": "U_00F9",
+ "text": "ù"
+ },
+ {
+ "id": "U_00EC",
+ "text": "ì"
+ },
+ {
+ "id": "U_00F2",
+ "text": "ò"
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "U_00E0",
+ "text": "à",
+ "pad": 50
+ },
+ {
+ "id": "K_S",
+ "text": "s"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "K_G",
+ "text": "g"
+ },
+ {
+ "id": "K_H",
+ "text": "h"
+ },
+ {
+ "id": "K_J",
+ "text": "j"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "K_L",
+ "text": "l"
+ },
+ {
+ "id": "T_new_1003",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": 1,
+ "nextlayer": "shift",
+ "multitap": [
+ {
+ "text": "*ShiftLock*",
+ "id": "T_new_991",
+ "nextlayer": "caps"
+ }
+ ]
+ },
+ {
+ "id": "K_Z",
+ "text": "z"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "K_C",
+ "text": "c"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "U_01F9",
+ "text": "ǹ"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 460,
+ "sp": 0
+ },
+ {
+ "id": "T_DEFAULT",
+ "text": "*abc*",
+ "sp": 1,
+ "nextlayer": "default",
+ "multitap": [
+ {
+ "text": "́",
+ "id": "T_ACUTE",
+ "sp": "1",
+ "nextlayer": "accent-acute"
+ },
+ {
+ "text": "̂",
+ "id": "T_CIRCUMFLEX",
+ "sp": "1",
+ "nextlayer": "circumflex"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "circumflex",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_Q",
+ "text": "q"
+ },
+ {
+ "id": "U_0175",
+ "text": "ŵ"
+ },
+ {
+ "id": "U_00EA",
+ "text": "ê"
+ },
+ {
+ "id": "K_R",
+ "text": "r"
+ },
+ {
+ "id": "K_T",
+ "text": "t"
+ },
+ {
+ "id": "U_0177",
+ "text": "ŷ"
+ },
+ {
+ "id": "U_00FB",
+ "text": "û"
+ },
+ {
+ "id": "U_00EE",
+ "text": "î"
+ },
+ {
+ "id": "U_00F4",
+ "text": "ô"
+ },
+ {
+ "id": "K_P",
+ "text": "p"
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "U_00E2",
+ "text": "â",
+ "pad": 50
+ },
+ {
+ "id": "U_015D",
+ "text": "ŝ"
+ },
+ {
+ "id": "K_D",
+ "text": "d"
+ },
+ {
+ "id": "K_F",
+ "text": "f"
+ },
+ {
+ "id": "K_G",
+ "text": "g"
+ },
+ {
+ "id": "U_0125",
+ "text": "ĥ"
+ },
+ {
+ "id": "U_0135",
+ "text": "ĵ"
+ },
+ {
+ "id": "K_K",
+ "text": "k"
+ },
+ {
+ "id": "K_L",
+ "text": "l"
+ },
+ {
+ "id": "T_new_1178",
+ "width": 10,
+ "sp": 10
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "sp": 1,
+ "nextlayer": "shift",
+ "multitap": [
+ {
+ "text": "*ShiftLock*",
+ "id": "T_new_991",
+ "nextlayer": "caps"
+ }
+ ]
+ },
+ {
+ "id": "K_Z",
+ "text": "z"
+ },
+ {
+ "id": "K_X",
+ "text": "x"
+ },
+ {
+ "id": "U_0109",
+ "text": "ĉ"
+ },
+ {
+ "id": "K_V",
+ "text": "v"
+ },
+ {
+ "id": "K_B",
+ "text": "b"
+ },
+ {
+ "id": "K_N",
+ "text": "n"
+ },
+ {
+ "id": "K_M",
+ "text": "m"
+ },
+ {
+ "id": "K_PERIOD",
+ "text": ".",
+ "sk": [
+ {
+ "text": ",",
+ "id": "K_COMMA"
+ },
+ {
+ "text": "!",
+ "id": "K_1",
+ "layer": "shift"
+ },
+ {
+ "text": "?",
+ "id": "K_SLASH",
+ "layer": "shift"
+ },
+ {
+ "text": "'",
+ "id": "K_QUOTE"
+ },
+ {
+ "text": "\"",
+ "id": "K_QUOTE",
+ "layer": "shift"
+ },
+ {
+ "text": "\\",
+ "id": "K_BKSLASH"
+ },
+ {
+ "text": ":",
+ "id": "K_COLON",
+ "layer": "shift"
+ },
+ {
+ "text": ";",
+ "id": "K_COLON"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_NUMLOCK",
+ "text": "*123*",
+ "width": 150,
+ "sp": 1,
+ "nextlayer": "numeric"
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 460,
+ "sp": 0
+ },
+ {
+ "id": "T_DEFAULT",
+ "text": "*abc*",
+ "sp": 1,
+ "nextlayer": "default",
+ "multitap": [
+ {
+ "text": "́",
+ "id": "T_ACUTE",
+ "sp": "1",
+ "nextlayer": "accent-acute"
+ },
+ {
+ "text": "̀",
+ "id": "T_GRAVE",
+ "sp": "1",
+ "nextlayer": "accent-grave"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "defaultHint": "flick"
+ }
+}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kmn b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kmn
new file mode 100644
index 00000000000..8ffa5e3551c
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kmn
@@ -0,0 +1,21 @@
+c gesture_prototyping generated from template at 2023-10-11 12:19:43
+c with name "gesture_prototyping"
+store(&VERSION) '14.0'
+store(&NAME) 'gesture_prototyping'
+store(©RIGHT) '© SIL International'
+store(&KEYBOARDVERSION) '1.0'
+store(&TARGETS) 'web iphone ipad androidphone androidtablet'
+store(&VISUALKEYBOARD) 'gesture_prototyping.kvks'
+store(&LAYOUTFILE) 'gesture_prototyping.keyman-touch-layout'
+
+begin Unicode > use(main)
+
+c This tells Keyman which keys should have casing behavior applied
+$keymanweb: store(&CasedKeys) [K_A] .. [K_Z]
+
+c Match our alphabet keys so we get casing behavior applied
+store(default-alpha) 'a' .. 'z' 'A' .. 'Z'
+
+group(main) using keys
+
+$keymanweb: + any(default-alpha) > index(default-alpha, 1)
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kps b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kps
new file mode 100644
index 00000000000..590626ab615
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kps
@@ -0,0 +1,59 @@
+
+
+
+ 17.0.185.0
+ 7.0
+
+
+
+ readme.htm
+
+
+
+
+
+
+
+
+
+ gesture_prototyping
+ © SIL International
+ SIL International
+
+
+
+
+ ..\build\gesture_prototyping.js
+
+ 0
+ .js
+
+
+ ..\build\gesture_prototyping.kvk
+
+ 0
+ .kvk
+
+
+ welcome.htm
+
+ 0
+ .htm
+
+
+ readme.htm
+
+ 0
+ .htm
+
+
+
+
+ gesture_prototyping
+ gesture_prototyping
+ 1.0
+
+
+
+
+
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kvks b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kvks
new file mode 100644
index 00000000000..6f09cc51828
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/gesture_prototyping.kvks
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/readme.htm b/web/src/test/manual/web/keyboards/gesture_prototyping/source/readme.htm
new file mode 100644
index 00000000000..237ae4911a8
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/readme.htm
@@ -0,0 +1,24 @@
+
+
+
+
+
+ gesture_prototyping
+
+
+
+
+gesture_prototyping
+
+
+ gesture_prototyping 1.0 generated from template.
+
+
+© SIL International
+
+
+
diff --git a/web/src/test/manual/web/keyboards/gesture_prototyping/source/welcome.htm b/web/src/test/manual/web/keyboards/gesture_prototyping/source/welcome.htm
new file mode 100644
index 00000000000..abd5f389668
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/gesture_prototyping/source/welcome.htm
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Start Using gesture_prototyping
+
+
+
+
+Start Using gesture_prototyping
+
+
+ gesture_prototyping 1.0 generated from template.
+
+
+Keyboard Layout
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/HISTORY.md b/web/src/test/manual/web/keyboards/ye_old_ten_key/HISTORY.md
new file mode 100644
index 00000000000..80335249048
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/HISTORY.md
@@ -0,0 +1,6 @@
+ye_old_ten_key Change History
+====================
+
+1.0 (2023-10-23)
+----------------
+* Created by SIL Intl
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/LICENSE.md b/web/src/test/manual/web/keyboards/ye_old_ten_key/LICENSE.md
new file mode 100644
index 00000000000..9bc582b58c9
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+© 2023 SIL Intl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/README.md b/web/src/test/manual/web/keyboards/ye_old_ten_key/README.md
new file mode 100644
index 00000000000..0a5053825bc
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/README.md
@@ -0,0 +1,26 @@
+ye_old_ten_key keyboard
+==============
+
+Version 1.0
+
+Description
+-----------
+ye_old_ten_key generated from template
+
+Links
+-----
+
+Copyright
+---------
+See [LICENSE.md](LICENSE.md)
+
+Supported Platforms
+-------------------
+ * Web
+ * iPhone
+ * iPad
+ * Android phone
+ * Android tablet
+ * Mobile devices
+ * Tablet devices
+
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/build/ye_old_ten_key.js b/web/src/test/manual/web/keyboards/ye_old_ten_key/build/ye_old_ten_key.js
new file mode 100644
index 00000000000..7624e771fc5
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/build/ye_old_ten_key.js
@@ -0,0 +1 @@
+if(typeof keyman === 'undefined') {console.log('Keyboard requires KeymanWeb 10.0 or later');if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");} else {KeymanWeb.KR(new Keyboard_ye_old_ten_key());}function Keyboard_ye_old_ten_key(){this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;this.KI="Keyboard_ye_old_ten_key";this.KN="ye_old_ten_key";this.KMINVER="10.0";this.KV={F:' 1em "Arial"',K102:0};this.KV.KLS={};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KV.KLS);this.KDU=0;this.KH='';this.KM=0;this.KBVER="1.0";this.KMBM=0x0000;this.KVKL={"phone":{"font":"Tahoma","displayUnderlying":false,"layer":[{"id":"default","row":[{"id":"1","key":[{"id":"K_7","text":"7"},{"id":"K_8","text":"8","hint":"abc","multitap":[{"id":"K_A","text":"a"},{"id":"K_B","text":"b"},{"id":"K_C","text":"c"},{"nextlayer":"shift","layer":"shift","id":"K_A","text":"A"},{"nextlayer":"shift","layer":"shift","id":"K_B","text":"B"},{"nextlayer":"shift","layer":"shift","id":"K_C","text":"C"}]},{"id":"K_9","text":"9","hint":"def","multitap":[{"id":"K_D","text":"d"},{"id":"K_E","text":"e"},{"id":"K_F","text":"f"},{"nextlayer":"shift","layer":"shift","id":"K_D","text":"D"},{"nextlayer":"shift","layer":"shift","id":"K_E","text":"E"},{"nextlayer":"shift","layer":"shift","id":"K_F","text":"F"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"2","key":[{"id":"K_4","text":"4","hint":"ghi","multitap":[{"id":"K_G","text":"g"},{"id":"K_H","text":"h"},{"id":"K_I","text":"i"},{"nextlayer":"shift","layer":"shift","id":"K_G","text":"G"},{"nextlayer":"shift","layer":"shift","id":"K_H","text":"H"},{"nextlayer":"shift","layer":"shift","id":"K_I","text":"I"}]},{"id":"K_5","text":"5","hint":"jkl","multitap":[{"id":"K_J","text":"j"},{"id":"K_K","text":"k"},{"id":"K_L","text":"l"},{"nextlayer":"shift","layer":"shift","id":"K_J","text":"J"},{"nextlayer":"shift","layer":"shift","id":"K_K","text":"K"},{"nextlayer":"shift","layer":"shift","id":"K_L","text":"L"}]},{"id":"K_6","text":"6","hint":"mno","multitap":[{"id":"K_M","text":"m"},{"id":"K_N","text":"n"},{"id":"K_O","text":"o"},{"nextlayer":"shift","layer":"shift","id":"K_M","text":"M"},{"nextlayer":"shift","layer":"shift","id":"K_N","text":"N"},{"nextlayer":"shift","layer":"shift","id":"K_O","text":"O"}]},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"}]},{"id":"3","key":[{"id":"K_1","text":"1","hint":"pqrs","multitap":[{"id":"K_P","text":"p"},{"id":"K_Q","text":"q"},{"id":"K_R","text":"r"},{"id":"K_S","text":"s"},{"nextlayer":"shift","layer":"shift","id":"K_P","text":"P"},{"nextlayer":"shift","layer":"shift","id":"K_Q","text":"Q"},{"nextlayer":"shift","layer":"shift","id":"K_R","text":"R"},{"nextlayer":"shift","layer":"shift","id":"K_S","text":"S"}]},{"id":"K_2","text":"2","hint":"tuv","multitap":[{"id":"K_T","text":"t"},{"id":"K_U","text":"u"},{"id":"K_V","text":"v"},{"nextlayer":"shift","layer":"shift","id":"K_T","text":"T"},{"nextlayer":"shift","layer":"shift","id":"K_U","text":"U"},{"nextlayer":"shift","layer":"shift","id":"K_V","text":"V"}]},{"id":"K_3","text":"3","hint":"wxyz","multitap":[{"id":"K_W","text":"w"},{"id":"K_X","text":"x"},{"id":"K_Y","text":"y"},{"id":"K_Z","text":"z"},{"nextlayer":"shift","layer":"shift","id":"K_W","text":"W"},{"nextlayer":"shift","layer":"shift","id":"K_X","text":"X"},{"nextlayer":"shift","layer":"shift","id":"K_Y","text":"Y"},{"nextlayer":"shift","layer":"shift","id":"K_Z","text":"Z"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]},{"id":"4","key":[{"nextlayer":"shift","width":"100","id":"K_SHIFT","sp":"1","text":"*Shift*"},{"id":"K_0","text":"0"},{"width":"250","id":"K_SPACE"}]}]},{"id":"shift","row":[{"id":"1","key":[{"layer":"default","id":"K_7","text":"7"},{"layer":"default","id":"K_8","text":"8","hint":"ABC","multitap":[{"id":"K_A","text":"A"},{"id":"K_B","text":"B"},{"id":"K_C","text":"C"},{"nextlayer":"default","layer":"default","id":"K_A","text":"a"},{"nextlayer":"default","layer":"default","id":"K_B","text":"b"},{"nextlayer":"default","layer":"default","id":"K_C","text":"c"}]},{"layer":"default","id":"K_9","text":"9","hint":"DEF","multitap":[{"id":"K_D","text":"D"},{"id":"K_E","text":"E"},{"id":"K_F","text":"F"},{"nextlayer":"default","layer":"default","id":"K_D","text":"d"},{"nextlayer":"default","layer":"default","id":"K_E","text":"e"},{"nextlayer":"default","layer":"default","id":"K_F","text":"f"}]},{"width":"100","id":"K_BKSP","sp":"1","text":"*BkSp*"}]},{"id":"2","key":[{"layer":"default","id":"K_4","text":"4","hint":"GHI","multitap":[{"id":"K_G","text":"G"},{"id":"K_H","text":"H"},{"id":"K_I","text":"I"},{"nextlayer":"default","layer":"default","id":"K_G","text":"g"},{"nextlayer":"default","layer":"default","id":"K_H","text":"h"},{"nextlayer":"default","layer":"default","id":"K_I","text":"i"}]},{"layer":"default","id":"K_5","text":"5","hint":"JKL","multitap":[{"id":"K_J","text":"J"},{"id":"K_K","text":"K"},{"id":"K_L","text":"L"},{"nextlayer":"default","layer":"default","id":"K_J","text":"j"},{"nextlayer":"default","layer":"default","id":"K_K","text":"k"},{"nextlayer":"default","layer":"default","id":"K_L","text":"l"}]},{"layer":"default","id":"K_6","text":"6","hint":"MNO","multitap":[{"id":"K_M","text":"M"},{"id":"K_N","text":"N"},{"id":"K_O","text":"O"},{"nextlayer":"default","layer":"default","id":"K_M","text":"m"},{"nextlayer":"default","layer":"default","id":"K_N","text":"n"},{"nextlayer":"default","layer":"default","id":"K_O","text":"o"}]},{"width":"120","id":"K_LOPT","sp":"1","text":"*Menu*"}]},{"id":"3","key":[{"layer":"default","id":"K_1","text":"1","hint":"PQRS","multitap":[{"id":"K_P","text":"P"},{"id":"K_Q","text":"Q"},{"id":"K_R","text":"R"},{"id":"K_S","text":"S"},{"nextlayer":"default","layer":"default","id":"K_P","text":"p"},{"nextlayer":"default","layer":"default","id":"K_Q","text":"q"},{"nextlayer":"default","layer":"default","id":"K_R","text":"r"},{"nextlayer":"default","layer":"default","id":"K_S","text":"s"}]},{"layer":"default","id":"K_2","text":"2","hint":"TUV","multitap":[{"id":"K_T","text":"T"},{"id":"K_U","text":"U"},{"id":"K_V","text":"V"},{"nextlayer":"default","layer":"default","id":"K_T","text":"t"},{"nextlayer":"default","layer":"default","id":"K_U","text":"u"},{"nextlayer":"default","layer":"default","id":"K_V","text":"v"}]},{"layer":"default","id":"K_3","text":"3","hint":"WXYZ","multitap":[{"id":"K_W","text":"W"},{"id":"K_X","text":"X"},{"id":"K_Y","text":"Y"},{"id":"K_Z","text":"Z"},{"nextlayer":"default","layer":"default","id":"K_W","text":"w"},{"nextlayer":"default","layer":"default","id":"K_X","text":"x"},{"nextlayer":"default","layer":"default","id":"K_Y","text":"y"},{"nextlayer":"default","layer":"default","id":"K_Z","text":"z"}]},{"width":"150","id":"K_ENTER","sp":"1","text":"*Enter*"}]},{"id":"4","key":[{"nextlayer":"default","width":"100","id":"K_SHIFT","sp":"1","text":"*Shifted*"},{"id":"K_0","text":"0"},{"width":"250","id":"K_SPACE"}]}]}]}};this.KVER="17.0.185.0";this.KVS=[];this.gs=function(t,e) {return this.g0(t,e);};this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;return r;};}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/readme.htm b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/readme.htm
new file mode 100644
index 00000000000..6ad6eb28c30
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/readme.htm
@@ -0,0 +1,24 @@
+
+
+
+
+
+ ye_old_ten_key
+
+
+
+
+ye_old_ten_key
+
+
+ ye_old_ten_key 1.0 generated from template.
+
+
+© SIL Intl
+
+
+
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/welcome.htm b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/welcome.htm
new file mode 100644
index 00000000000..3723c476f52
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/welcome.htm
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Start Using ye_old_ten_key
+
+
+
+
+Start Using ye_old_ten_key
+
+
+ ye_old_ten_key 1.0 generated from template.
+
+
+Keyboard Layout
+
+
+
+
+
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.keyman-touch-layout b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.keyman-touch-layout
new file mode 100644
index 00000000000..914ee218279
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.keyman-touch-layout
@@ -0,0 +1,778 @@
+{
+ "phone": {
+ "font": "Tahoma",
+ "layer": [
+ {
+ "id": "default",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_7",
+ "text": "7",
+ "hint": ""
+ },
+ {
+ "id": "K_8",
+ "text": "8",
+ "hint": "abc",
+ "multitap": [
+ {
+ "text": "a",
+ "id": "K_A"
+ },
+ {
+ "text": "b",
+ "id": "K_B"
+ },
+ {
+ "text": "c",
+ "id": "K_C"
+ },
+ {
+ "text": "A",
+ "id": "K_A",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "B",
+ "id": "K_B",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "C",
+ "id": "K_C",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "9",
+ "hint": "def",
+ "multitap": [
+ {
+ "text": "d",
+ "id": "K_D"
+ },
+ {
+ "text": "e",
+ "id": "K_E"
+ },
+ {
+ "text": "f",
+ "id": "K_F"
+ },
+ {
+ "text": "D",
+ "id": "K_D",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "E",
+ "id": "K_E",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "F",
+ "id": "K_F",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "4",
+ "hint": "ghi",
+ "multitap": [
+ {
+ "text": "g",
+ "id": "K_G"
+ },
+ {
+ "text": "h",
+ "id": "K_H"
+ },
+ {
+ "text": "i",
+ "id": "K_I"
+ },
+ {
+ "text": "G",
+ "id": "K_G",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "H",
+ "id": "K_H",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "I",
+ "id": "K_I",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_5",
+ "text": "5",
+ "hint": "jkl",
+ "multitap": [
+ {
+ "text": "j",
+ "id": "K_J"
+ },
+ {
+ "text": "k",
+ "id": "K_K"
+ },
+ {
+ "text": "l",
+ "id": "K_L"
+ },
+ {
+ "text": "J",
+ "id": "K_J",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "K",
+ "id": "K_K",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "L",
+ "id": "K_L",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_6",
+ "text": "6",
+ "hint": "mno",
+ "multitap": [
+ {
+ "text": "m",
+ "id": "K_M"
+ },
+ {
+ "text": "n",
+ "id": "K_N"
+ },
+ {
+ "text": "o",
+ "id": "K_O"
+ },
+ {
+ "text": "M",
+ "id": "K_M",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "N",
+ "id": "K_N",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "O",
+ "id": "K_O",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1",
+ "hint": "pqrs",
+ "multitap": [
+ {
+ "text": "p",
+ "id": "K_P"
+ },
+ {
+ "text": "q",
+ "id": "K_Q"
+ },
+ {
+ "text": "r",
+ "id": "K_R"
+ },
+ {
+ "text": "s",
+ "id": "K_S"
+ },
+ {
+ "text": "P",
+ "id": "K_P",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Q",
+ "id": "K_Q",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "R",
+ "id": "K_R",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "S",
+ "id": "K_S",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_2",
+ "text": "2",
+ "hint": "tuv",
+ "multitap": [
+ {
+ "text": "t",
+ "id": "K_T"
+ },
+ {
+ "text": "u",
+ "id": "K_U"
+ },
+ {
+ "text": "v",
+ "id": "K_V"
+ },
+ {
+ "text": "T",
+ "id": "K_T",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "U",
+ "id": "K_U",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "V",
+ "id": "K_V",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_3",
+ "text": "3",
+ "hint": "wxyz",
+ "multitap": [
+ {
+ "text": "w",
+ "id": "K_W"
+ },
+ {
+ "text": "x",
+ "id": "K_X"
+ },
+ {
+ "text": "y",
+ "id": "K_Y"
+ },
+ {
+ "text": "z",
+ "id": "K_Z"
+ },
+ {
+ "text": "W",
+ "id": "K_W",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "X",
+ "id": "K_X",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Y",
+ "id": "K_Y",
+ "nextlayer": "shift",
+ "layer": "shift"
+ },
+ {
+ "text": "Z",
+ "id": "K_Z",
+ "nextlayer": "shift",
+ "layer": "shift"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shift*",
+ "width": 100,
+ "sp": 1,
+ "nextlayer": "shift"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 250,
+ "sp": 0
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id": "shift",
+ "row": [
+ {
+ "id": 1,
+ "key": [
+ {
+ "id": "K_7",
+ "text": "7",
+ "layer": "default",
+ "hint": ""
+ },
+ {
+ "id": "K_8",
+ "text": "8",
+ "layer": "default",
+ "hint": "ABC",
+ "multitap": [
+ {
+ "text": "A",
+ "id": "K_A"
+ },
+ {
+ "text": "B",
+ "id": "K_B"
+ },
+ {
+ "text": "C",
+ "id": "K_C"
+ },
+ {
+ "text": "a",
+ "id": "K_A",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "b",
+ "id": "K_B",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "c",
+ "id": "K_C",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_9",
+ "text": "9",
+ "layer": "default",
+ "hint": "DEF",
+ "multitap": [
+ {
+ "text": "D",
+ "id": "K_D"
+ },
+ {
+ "text": "E",
+ "id": "K_E"
+ },
+ {
+ "text": "F",
+ "id": "K_F"
+ },
+ {
+ "text": "d",
+ "id": "K_D",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "e",
+ "id": "K_E",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "f",
+ "id": "K_F",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_BKSP",
+ "text": "*BkSp*",
+ "width": 100,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "key": [
+ {
+ "id": "K_4",
+ "text": "4",
+ "layer": "default",
+ "hint": "GHI",
+ "multitap": [
+ {
+ "text": "G",
+ "id": "K_G"
+ },
+ {
+ "text": "H",
+ "id": "K_H"
+ },
+ {
+ "text": "I",
+ "id": "K_I"
+ },
+ {
+ "text": "g",
+ "id": "K_G",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "h",
+ "id": "K_H",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "i",
+ "id": "K_I",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_5",
+ "text": "5",
+ "layer": "default",
+ "hint": "JKL",
+ "multitap": [
+ {
+ "text": "J",
+ "id": "K_J"
+ },
+ {
+ "text": "K",
+ "id": "K_K"
+ },
+ {
+ "text": "L",
+ "id": "K_L"
+ },
+ {
+ "text": "j",
+ "id": "K_J",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "k",
+ "id": "K_K",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "l",
+ "id": "K_L",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_6",
+ "text": "6",
+ "layer": "default",
+ "hint": "MNO",
+ "multitap": [
+ {
+ "text": "M",
+ "id": "K_M"
+ },
+ {
+ "text": "N",
+ "id": "K_N"
+ },
+ {
+ "text": "O",
+ "id": "K_O"
+ },
+ {
+ "text": "m",
+ "id": "K_M",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "n",
+ "id": "K_N",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "o",
+ "id": "K_O",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_LOPT",
+ "text": "*Menu*",
+ "width": 120,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 3,
+ "key": [
+ {
+ "id": "K_1",
+ "text": "1",
+ "layer": "default",
+ "hint": "PQRS",
+ "multitap": [
+ {
+ "text": "P",
+ "id": "K_P"
+ },
+ {
+ "text": "Q",
+ "id": "K_Q"
+ },
+ {
+ "text": "R",
+ "id": "K_R"
+ },
+ {
+ "text": "S",
+ "id": "K_S"
+ },
+ {
+ "text": "p",
+ "id": "K_P",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "q",
+ "id": "K_Q",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "r",
+ "id": "K_R",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "s",
+ "id": "K_S",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_2",
+ "text": "2",
+ "layer": "default",
+ "hint": "TUV",
+ "multitap": [
+ {
+ "text": "T",
+ "id": "K_T"
+ },
+ {
+ "text": "U",
+ "id": "K_U"
+ },
+ {
+ "text": "V",
+ "id": "K_V"
+ },
+ {
+ "text": "t",
+ "id": "K_T",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "u",
+ "id": "K_U",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "v",
+ "id": "K_V",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_3",
+ "text": "3",
+ "layer": "default",
+ "hint": "WXYZ",
+ "multitap": [
+ {
+ "text": "W",
+ "id": "K_W"
+ },
+ {
+ "text": "X",
+ "id": "K_X"
+ },
+ {
+ "text": "Y",
+ "id": "K_Y"
+ },
+ {
+ "text": "Z",
+ "id": "K_Z"
+ },
+ {
+ "text": "w",
+ "id": "K_W",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "x",
+ "id": "K_X",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "y",
+ "id": "K_Y",
+ "nextlayer": "default",
+ "layer": "default"
+ },
+ {
+ "text": "z",
+ "id": "K_Z",
+ "nextlayer": "default",
+ "layer": "default"
+ }
+ ]
+ },
+ {
+ "id": "K_ENTER",
+ "text": "*Enter*",
+ "width": 150,
+ "sp": 1
+ }
+ ]
+ },
+ {
+ "id": 4,
+ "key": [
+ {
+ "id": "K_SHIFT",
+ "text": "*Shifted*",
+ "width": 100,
+ "sp": 1,
+ "nextlayer": "default"
+ },
+ {
+ "id": "K_0",
+ "text": "0"
+ },
+ {
+ "id": "K_SPACE",
+ "text": "",
+ "width": 250,
+ "sp": 0
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kmn b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kmn
new file mode 100644
index 00000000000..1bc21175beb
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kmn
@@ -0,0 +1,13 @@
+c ye_old_ten_key generated from template at 2023-10-23 12:48:10
+c with name "ye_old_ten_key"
+store(&VERSION) '10.0'
+store(&NAME) 'ye_old_ten_key'
+store(©RIGHT) '© SIL Intl'
+store(&KEYBOARDVERSION) '1.0'
+store(&TARGETS) 'web iphone ipad androidphone androidtablet mobile tablet'
+store(&VISUALKEYBOARD) 'ye_old_ten_key.kvks'
+store(&LAYOUTFILE) 'ye_old_ten_key.keyman-touch-layout'
+
+begin Unicode > use(main)
+
+group(main) using keys
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kps b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kps
new file mode 100644
index 00000000000..c95b8239709
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kps
@@ -0,0 +1,59 @@
+
+
+
+ 17.0.185.0
+ 7.0
+
+
+
+ readme.htm
+
+
+
+
+
+
+
+
+
+ ye_old_ten_key
+ © SIL Intl
+ SIL Intl
+
+
+
+
+ ..\build\ye_old_ten_key.js
+
+ 0
+ .js
+
+
+ ..\build\ye_old_ten_key.kvk
+
+ 0
+ .kvk
+
+
+ welcome.htm
+
+ 0
+ .htm
+
+
+ readme.htm
+
+ 0
+ .htm
+
+
+
+
+ ye_old_ten_key
+ ye_old_ten_key
+ 1.0
+
+
+
+
+
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kvks b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kvks
new file mode 100644
index 00000000000..6f09cc51828
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/source/ye_old_ten_key.kvks
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.keyboard_info b/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.keyboard_info
new file mode 100644
index 00000000000..8402918fea8
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.keyboard_info
@@ -0,0 +1,7 @@
+{
+ "license": "mit",
+ "languages": [
+
+ ],
+ "description": "ye_old_ten_key generated from template"
+}
diff --git a/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.kpj b/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.kpj
new file mode 100644
index 00000000000..76300140006
--- /dev/null
+++ b/web/src/test/manual/web/keyboards/ye_old_ten_key/ye_old_ten_key.kpj
@@ -0,0 +1,94 @@
+
+
+
+ $PROJECTPATH\build
+ True
+ True
+ True
+ keyboard
+
+
+
+ id_d82fe8d9b279c62f7eb4ee06a5b5df46
+ ye_old_ten_key.kmn
+ source\ye_old_ten_key.kmn
+ 1.0
+ .kmn
+
+ ye_old_ten_key
+ © SIL Intl
+
+
+
+ id_bb4b08bc3ce607cd34640d441e5322e8
+ ye_old_ten_key.kps
+ source\ye_old_ten_key.kps
+
+ .kps
+
+ ye_old_ten_key
+ © SIL Intl
+
+
+
+ id_ede98e4633e239f933cbfd1f4e1b766c
+ HISTORY.md
+ HISTORY.md
+
+ .md
+
+
+ id_53e892b8b41cc4caece1cfd5ef21d6e7
+ LICENSE.md
+ LICENSE.md
+
+ .md
+
+
+ id_0730bb7c2e8f9ea2438b52e419dd86c9
+ README.md
+ README.md
+
+ .md
+
+
+ id_121feebff2af0ee3aae380f4f98e1a7b
+ ye_old_ten_key.keyboard_info
+ ye_old_ten_key.keyboard_info
+
+ .keyboard_info
+
+
+ id_9d90f9319566842258798763585730cd
+ ye_old_ten_key.js
+ source\..\build\ye_old_ten_key.js
+
+ .js
+ id_bb4b08bc3ce607cd34640d441e5322e8
+
+
+ id_ba0beca0c49cabefd5b004e4605a3fa9
+ ye_old_ten_key.kvk
+ source\..\build\ye_old_ten_key.kvk
+
+ .kvk
+ id_bb4b08bc3ce607cd34640d441e5322e8
+
+
+ id_356e5d149c1e539356d72698c1e401a6
+ welcome.htm
+ source\welcome.htm
+
+ .htm
+ id_bb4b08bc3ce607cd34640d441e5322e8
+
+
+ id_8da344c4cea6f467013357fe099006f5
+ readme.htm
+ source\readme.htm
+
+ .htm
+ id_bb4b08bc3ce607cd34640d441e5322e8
+
+
+