diff --git a/README.md b/README.md
index ee04e88..98bf7f0 100644
--- a/README.md
+++ b/README.md
@@ -466,6 +466,35 @@ This can be applied to every element to force a single column layout, or to indi
Note that this will have no effect on small screens.
+### Advanced: Getting the Time
+
+ESPUI can create an invisible control that can be used to fetch the current time from the client when they are connected to the UI. This could be used to intermittently provide an accurate time source to your ESP. Remember that clients cannot be relied upon to be correct or truthful. If this is not a concern, you can do the following:
+
+```
+//Add the invisible "Time" control
+auto timeId = ESPUI.addControl(Time, "", "", None, 0, timeCallback);
+```
+
+After creating the UI, sending an update to the Time control will cause it to fetch the current time from the client and then fire its callback with the result.
+
+```
+//Request an update to the time
+ESPUI.updateTime(timeId);
+//Will trigger timeCallback
+```
+
+In `timeCallback` you can then print the control's value as normal:
+
+```
+void timeCallback(Control *sender, int type) {
+ if(type == TM_VALUE) {
+ Serial.println(sender->value);
+ }
+}
+```
+
+The returned string will be an [ISO string](https://www.w3schools.com/jsref/jsref_toisostring.asp) as returned by the Javascript `new Date().toISOString()`. The format is `YYYY-MM-DDTHH:mm:ss.sssZ` so for example: `2022-01-20T21:44:22.913Z`.
+
# Notes for Development
If you want to work on the HTML/CSS/JS files, do make changes in the _data_
diff --git a/data/js/controls.js b/data/js/controls.js
index 9339c08..2b5ff1c 100644
--- a/data/js/controls.js
+++ b/data/js/controls.js
@@ -57,6 +57,9 @@ const UPDATE_ACCEL = 118;
const UI_SEPARATOR = 19;
const UPDATE_SEPARATOR = 119;
+const UI_TIME = 20;
+const UPDATE_TIME = 120;
+
const UP = 0;
const DOWN = 1;
const LEFT = 2;
@@ -537,6 +540,7 @@ function start() {
case UPDATE_BUTTON:
$("#btn" + data.id).val(data.value);
+ $("#btn" + data.id).text(data.value);
if(data.hasOwnProperty('elementStyle')) {
$("#btn" + data.id).attr("style", data.elementStyle);
}
@@ -554,6 +558,11 @@ function start() {
case UPDATE_ACCEL:
break;
+ case UPDATE_TIME:
+ var rv = new Date().toISOString();
+ websock.send("time:" + rv + ":" + data.id);
+ break;
+
default:
console.error("Unknown type or event");
break;
@@ -723,6 +732,9 @@ var addToHTML = function(data) {
html = "
" +
"
" + data.label + " ";
break;
+ case UI_TIME:
+ //Invisible element
+ break;
}
parent.append(html);
diff --git a/data/js/controls.min.js b/data/js/controls.min.js
index 38b95e3..60ee074 100644
--- a/data/js/controls.min.js
+++ b/data/js/controls.min.js
@@ -1,4 +1,4 @@
-const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
+const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UI_TIME=20;const UPDATE_TIME=120;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
var websock;var websockConnected=false;function requestOrientationPermission(){}
function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));}
function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);return savedData[id];}
@@ -37,9 +37,9 @@ slider_move($("#id"+data.id),data.value,"100",false);if(data.hasOwnProperty('ele
break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);}
-break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
+break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);$("#btn"+data.id).text(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);}
-break;case UPDATE_ACCEL:break;default:console.error("Unknown type or event");break;}
+break;case UPDATE_ACCEL:break;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;default:console.error("Unknown type or event");break;}
if(data.type>=UPDATE_OFFSET&&data.type"+data.label+" "+
elementHTML(data.type,data.id,data.value,data.label,elementStyle)+
"";break;case UI_SEPARATOR:html=""+
-"
"+data.label+" ";break;}
+""+data.label+" ";break;case UI_TIME:break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data.type,data.id,data.value,data.label,elementStyle));}}
var elementHTML=function(type,id,value,label,elementStyle){switch(type){case UI_LABEL:return""+value+" ";case UI_BUTTON:return"id());
c->callback(c, S_VALUE);
}
+ else if (msg.startsWith(F("time:")))
+ {
+ c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
+ ESPUI.updateControl(c, client->id());
+ c->callback(c, TM_VALUE);
+ }
else
{
#if defined(DEBUG_ESPUI)
@@ -906,6 +912,10 @@ void ESPUIClass::updateLabel(uint16_t id, const String& value)
updateControlValue(id, value);
}
+void ESPUIClass::updateButton(uint16_t id, const String& value) {
+ updateControlValue(id, value);
+}
+
void ESPUIClass::updateSlider(uint16_t id, int nValue, int clientId)
{
updateControlValue(id, String(nValue), clientId);
@@ -936,6 +946,11 @@ void ESPUIClass::updateGauge(uint16_t id, int number, int clientId)
updateControlValue(id, String(number), clientId);
}
+void ESPUIClass::updateTime(uint16_t id, int clientId)
+{
+ updateControl(id, clientId);
+}
+
void ESPUIClass::clearGraph(uint16_t id, int clientId) { }
void ESPUIClass::addGraphPoint(uint16_t id, int nValue, int clientId)
diff --git a/src/ESPUI.h b/src/ESPUI.h
index 86634d3..a850097 100644
--- a/src/ESPUI.h
+++ b/src/ESPUI.h
@@ -56,6 +56,7 @@ enum ControlType : uint8_t
Gauge,
Accel,
Separator,
+ Time,
UpdateOffset = 100,
UpdatePad = 101,
@@ -76,6 +77,7 @@ enum ControlType : uint8_t
UpdateGauge,
UpdateAccel,
UpdateSeparator,
+ UpdateTime,
InitialGui = 200,
Reload = 201,
@@ -199,6 +201,7 @@ private:
#define N_VALUE 9
#define T_VALUE 10
#define S_VALUE 11
+#define TM_VALUE 12
enum Verbosity : uint8_t
{
@@ -279,12 +282,14 @@ public:
void print(uint16_t id, const String& value);
void updateLabel(uint16_t id, const String& value);
+ void updateButton(uint16_t id, const String& value);
void updateSwitcher(uint16_t id, bool nValue, int clientId = -1);
void updateSlider(uint16_t id, int nValue, int clientId = -1);
void updateNumber(uint16_t id, int nValue, int clientId = -1);
void updateText(uint16_t id, const String& nValue, int clientId = -1);
void updateSelect(uint16_t id, const String& nValue, int clientId = -1);
void updateGauge(uint16_t id, int number, int clientId);
+ void updateTime(uint16_t id, int clientId = -1);
void clearGraph(uint16_t id, int clientId = -1);
void addGraphPoint(uint16_t id, int nValue, int clientId = -1);
diff --git a/src/dataControlsJS.h b/src/dataControlsJS.h
index fbf3c61..06c02cc 100644
--- a/src/dataControlsJS.h
+++ b/src/dataControlsJS.h
@@ -1,5 +1,5 @@
const char JS_CONTROLS[] PROGMEM = R"=====(
-const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
+const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UI_TIME=20;const UPDATE_TIME=120;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}}
var websock;var websockConnected=false;function requestOrientationPermission(){}
function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));}
function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);return savedData[id];}
@@ -38,9 +38,9 @@ slider_move($("#id"+data.id),data.value,"100",false);if(data.hasOwnProperty('ele
break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);}
-break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
+break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);$("#btn"+data.id).text(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);}
-break;case UPDATE_ACCEL:break;default:console.error("Unknown type or event");break;}
+break;case UPDATE_ACCEL:break;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;default:console.error("Unknown type or event");break;}
if(data.type>=UPDATE_OFFSET&&data.type"+data.label+" "+
elementHTML(data.type,data.id,data.value,data.label,elementStyle)+
"";break;case UI_SEPARATOR:html=""+
-"
"+data.label+" ";break;}
+""+data.label+" ";break;case UI_TIME:break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data.type,data.id,data.value,data.label,elementStyle));}}
var elementHTML=function(type,id,value,label,elementStyle){switch(type){case UI_LABEL:return""+value+" ";case UI_BUTTON:return"";case UI_NUMBER:return"
";default:return"";}}
)=====";
-const uint8_t JS_CONTROLS_GZIP[3872] PROGMEM = { 31,139,8,0,160,63,227,97,2,255,197,27,107,115,218,72,242,187,127,133,172,108,5,113,96,30,121,109,22,44,167,8,38,9,183,196,246,217,120,179,117,217,156,75,136,193,168,44,36,173,36,140,189,14,255,253,122,122,30,154,17,2,179,120,247,238,75,140,122,122,122,122,186,123,166,95,19,55,12,146,212,184,236,95,245,79,250,195,126,103,112,245,241,178,111,191,104,52,218,174,24,56,239,13,78,59,199,0,107,10,216,217,113,103,216,187,58,253,240,225,162,55,180,155,42,110,239,215,97,239,228,152,209,104,42,240,97,127,216,27,216,10,224,12,40,230,232,33,40,91,164,127,213,165,144,23,58,82,151,97,189,200,176,222,95,14,135,167,39,246,75,29,143,67,155,141,151,25,230,160,243,30,152,120,165,35,50,96,179,241,42,195,187,248,210,31,118,63,245,206,237,215,58,170,132,55,27,175,21,236,65,255,24,96,111,114,184,12,218,108,188,201,48,79,46,63,191,7,216,143,58,38,135,54,27,63,42,226,2,57,130,66,206,46,135,246,91,29,91,25,105,54,222,102,51,62,158,119,206,62,217,63,113,64,231,248,152,65,174,206,78,251,39,20,149,15,116,7,189,206,57,71,110,54,126,82,86,236,188,183,155,57,133,48,152,162,144,139,222,160,215,5,106,57,157,8,112,83,209,202,233,217,176,79,229,159,83,139,0,55,21,181,124,238,3,32,167,21,132,53,21,157,124,238,252,106,55,115,250,64,88,83,85,197,176,119,102,55,243,154,64,96,83,209,195,199,206,229,199,158,221,204,233,129,67,155,138,26,58,221,46,181,141,156,10,56,180,249,86,21,204,89,231,188,51,60,5,53,254,148,151,141,28,81,134,228,73,56,62,253,114,34,207,193,160,247,97,40,237,253,188,255,241,211,80,90,117,183,119,50,4,35,17,2,233,94,13,47,207,255,117,121,218,191,232,73,82,221,171,222,231,222,121,103,144,157,171,238,213,89,15,102,157,247,127,129,169,47,36,240,75,111,216,185,56,251,212,25,40,228,175,46,46,79,62,12,78,191,104,107,116,59,231,231,167,67,121,10,186,87,157,65,255,223,157,115,80,205,27,9,58,238,156,255,44,45,186,123,117,114,122,210,179,95,188,126,221,190,117,98,227,58,118,162,233,177,147,58,118,64,22,70,39,142,157,123,171,140,35,83,39,233,184,46,241,237,137,227,39,4,65,137,239,141,73,220,13,131,212,11,230,225,60,225,67,147,121,224,166,94,24,24,110,232,135,113,215,119,146,196,194,159,253,113,249,129,255,176,79,230,179,17,137,37,188,157,44,188,212,157,42,120,78,66,84,153,181,98,146,206,227,192,132,127,126,159,135,94,66,204,54,71,225,34,20,8,100,70,98,199,31,203,225,76,158,2,35,34,41,137,99,239,150,196,18,41,147,175,64,90,144,212,73,162,169,227,167,18,73,202,91,224,36,243,96,226,135,11,133,14,19,191,24,119,157,56,14,179,249,66,21,98,216,241,189,63,156,216,11,36,2,85,76,139,255,166,90,17,136,99,39,190,49,219,99,50,113,230,126,42,128,102,123,185,220,163,90,88,144,81,18,186,55,109,229,55,168,36,32,110,74,198,121,141,196,228,247,57,73,210,211,216,35,65,234,80,208,25,137,103,94,146,192,47,171,252,176,220,147,152,137,115,75,62,10,99,128,33,63,116,29,255,34,13,99,231,154,212,18,146,246,83,50,179,76,146,68,115,15,109,38,49,171,255,188,56,61,169,37,41,236,232,218,155,220,91,210,148,202,229,182,66,56,134,245,195,88,161,237,129,182,209,154,96,197,49,154,158,182,214,117,225,90,25,241,182,55,177,228,212,125,59,152,251,126,249,33,163,133,76,69,78,156,144,12,171,220,102,50,204,150,252,234,141,191,1,147,12,252,245,91,158,95,39,78,65,4,63,88,227,208,157,207,64,114,229,154,51,30,91,230,63,204,114,45,156,76,224,128,252,96,153,207,226,112,1,223,211,116,230,91,166,89,110,115,85,212,92,63,132,181,193,192,25,21,149,52,156,192,11,208,194,60,233,129,157,196,176,194,26,245,81,234,18,23,214,136,201,44,188,37,236,96,153,120,98,14,174,99,66,2,179,188,130,10,124,106,120,49,25,23,96,49,166,145,11,163,110,156,132,6,231,128,50,249,252,217,219,55,47,95,183,11,102,101,91,215,160,129,245,224,250,158,123,211,226,146,171,46,181,77,79,157,96,236,147,95,188,196,27,121,190,151,222,119,1,112,13,2,122,0,61,238,231,5,240,252,249,190,144,121,109,234,141,199,36,40,63,72,133,208,3,144,217,43,87,146,68,135,157,247,110,225,199,192,75,82,18,192,85,99,222,202,53,93,92,211,172,22,243,82,69,169,163,97,45,188,96,28,46,106,212,32,233,42,181,40,140,211,125,219,52,191,127,47,30,121,219,88,55,242,234,213,75,169,95,188,91,191,144,209,5,252,38,169,101,46,146,86,189,110,86,242,19,167,97,146,6,206,140,84,204,214,234,32,165,90,49,235,11,16,121,123,73,128,223,157,137,115,26,123,194,96,195,32,140,72,96,11,201,90,228,54,165,215,118,144,132,62,129,249,215,64,146,97,26,20,111,11,155,91,103,155,41,185,3,254,164,174,179,51,147,217,127,26,207,73,123,217,206,88,195,211,180,13,111,136,8,36,243,103,76,163,70,40,108,3,53,10,40,162,192,252,33,181,29,52,177,199,40,80,244,113,238,50,130,129,218,24,239,34,58,74,108,105,183,163,112,124,143,48,23,190,72,12,198,38,124,35,69,175,165,247,17,225,222,81,79,0,90,5,119,16,5,165,206,40,9,156,219,34,48,48,10,71,35,85,135,192,230,113,153,188,107,135,43,53,239,236,11,241,192,142,16,78,73,199,161,159,212,38,97,220,115,128,121,226,19,186,61,251,8,239,122,240,100,119,76,116,15,20,189,149,115,29,28,185,92,93,182,21,49,91,114,22,232,32,99,53,13,83,199,23,235,29,89,250,242,62,9,174,211,233,65,179,44,15,31,56,175,0,238,238,185,23,222,192,177,90,139,14,27,25,197,196,185,105,11,81,103,105,82,235,255,187,67,38,119,122,221,193,145,38,119,149,157,118,188,205,252,85,25,176,180,178,149,191,75,98,226,135,206,24,78,134,142,141,9,100,75,26,118,234,165,62,97,86,227,59,35,226,163,25,206,28,47,248,68,28,176,33,97,133,25,66,158,30,166,125,45,241,197,114,48,249,153,37,89,18,196,114,28,249,137,201,130,50,200,131,252,150,144,50,186,7,159,148,225,250,26,134,159,134,159,7,22,59,159,58,19,44,73,93,153,244,144,159,69,55,55,74,3,179,130,104,16,227,160,99,76,195,185,59,69,217,183,178,59,163,252,64,106,81,76,168,218,143,89,140,71,69,57,79,83,122,221,129,35,181,56,137,42,189,13,65,41,85,164,2,58,221,133,6,247,109,75,230,149,245,189,137,100,249,241,221,177,27,9,156,170,32,203,208,29,31,25,204,145,165,249,191,148,59,253,189,149,240,162,201,206,178,139,156,49,219,244,229,89,117,87,217,21,209,80,101,135,44,250,79,103,145,38,144,79,103,82,163,178,194,102,252,116,54,49,181,125,58,159,58,153,21,70,71,79,103,148,102,231,79,231,83,163,178,194,166,251,116,54,89,113,224,233,140,230,232,108,60,221,88,222,122,252,240,197,52,6,190,64,191,110,237,175,196,1,43,100,135,157,247,171,52,245,192,195,137,34,244,64,135,190,119,116,232,24,97,48,3,74,100,30,217,37,192,97,251,144,18,173,152,229,146,49,141,201,196,46,81,10,10,188,116,196,63,240,154,169,152,135,117,231,232,176,14,36,11,35,26,185,230,216,187,53,188,49,46,165,17,59,172,195,8,157,75,231,217,64,160,166,19,128,175,17,25,119,217,183,5,249,111,24,181,168,154,150,101,140,219,44,211,137,60,182,178,3,216,19,207,135,96,205,146,106,163,105,10,166,152,63,88,233,212,75,128,159,52,133,20,132,110,204,44,219,182,13,145,48,221,247,65,26,30,176,187,20,210,121,52,38,19,225,102,85,53,0,26,79,0,59,118,20,135,179,8,66,230,161,51,50,210,208,96,19,233,47,43,192,106,138,1,233,27,216,228,59,22,199,237,211,253,212,24,18,204,176,224,19,98,2,199,39,49,37,49,117,82,74,211,24,135,36,49,130,48,53,200,29,36,74,70,235,183,223,48,25,40,176,185,2,147,98,165,65,169,126,136,108,97,70,151,69,18,140,109,6,162,226,125,150,64,204,227,166,92,7,58,106,155,125,102,74,11,35,76,234,168,222,216,79,179,178,39,116,183,103,150,12,52,1,187,36,160,204,34,232,128,128,176,197,8,197,62,18,48,12,42,0,112,88,103,52,143,204,213,29,125,238,111,187,29,111,92,180,149,138,105,120,65,52,79,153,10,248,182,18,239,15,72,112,203,15,98,151,104,10,51,47,48,117,183,185,194,75,231,215,191,143,23,106,32,26,63,52,177,48,87,152,116,238,88,60,152,99,21,19,206,60,102,126,59,43,23,208,176,119,246,63,18,46,164,252,209,35,210,197,130,250,227,183,161,44,52,125,229,246,247,205,94,169,96,9,103,208,6,14,224,182,196,129,139,219,107,107,117,110,213,68,88,230,63,116,3,204,245,0,90,120,240,19,251,179,147,78,107,113,56,135,163,65,147,123,160,8,59,166,133,177,161,55,131,95,245,102,163,209,40,226,180,22,205,147,169,245,112,215,74,147,234,125,43,147,6,156,228,92,121,111,23,206,21,190,149,22,69,171,64,96,95,191,253,197,235,137,58,63,85,159,168,75,151,217,184,44,83,99,233,224,113,103,183,177,32,154,187,30,148,238,19,102,219,106,248,151,229,46,220,224,196,210,192,208,233,34,56,139,195,8,46,222,123,171,196,51,191,139,244,222,39,165,50,115,149,42,33,97,192,48,204,45,88,157,81,204,146,12,220,55,196,229,224,115,26,230,187,70,171,249,231,88,75,158,204,27,11,59,214,208,66,214,180,147,186,199,66,142,43,90,226,180,180,187,0,102,41,136,85,19,204,222,84,106,117,255,187,45,241,212,147,210,2,199,171,16,3,198,118,182,1,157,210,46,108,41,41,48,198,67,228,46,253,139,120,203,145,218,201,12,88,50,190,18,8,60,149,181,21,98,187,48,199,147,250,213,156,253,41,156,233,148,118,97,43,203,155,179,70,122,107,21,141,21,54,232,146,215,206,252,154,252,69,236,231,105,237,178,1,118,73,51,184,104,95,137,234,40,214,94,45,243,50,184,9,194,69,96,208,240,131,198,175,24,116,154,226,182,95,238,201,26,24,140,31,217,218,51,134,231,207,229,200,161,94,11,101,241,132,40,200,229,47,145,181,98,136,156,128,248,154,16,212,105,5,18,200,38,148,115,172,218,182,118,253,65,18,199,152,209,123,55,236,170,59,144,61,77,222,81,61,224,61,76,241,153,53,44,5,36,235,78,10,136,236,69,10,0,107,62,138,47,217,107,44,183,5,39,89,153,158,227,152,21,165,97,203,139,130,240,93,22,241,94,225,22,50,222,5,211,10,183,42,155,146,63,206,216,38,142,214,242,177,220,163,137,26,102,168,7,220,79,92,225,23,164,96,132,22,97,149,4,140,103,94,95,27,223,184,3,212,83,49,230,121,104,2,199,160,1,237,70,112,63,94,136,201,50,32,165,123,48,35,73,226,92,19,91,41,224,170,141,46,198,31,107,53,241,4,141,217,37,208,179,133,31,226,112,60,169,89,207,144,21,108,19,31,87,110,153,21,248,139,77,32,142,221,254,211,66,208,189,109,94,50,60,183,147,156,179,101,54,112,142,190,106,19,235,193,58,206,149,85,168,83,217,176,6,243,57,155,22,73,183,89,68,20,24,10,151,160,37,129,141,43,56,163,45,214,96,46,104,147,162,185,143,218,168,236,45,22,82,235,185,108,184,234,37,99,184,61,49,157,227,63,117,178,35,10,83,168,209,131,108,228,80,230,81,241,114,178,200,68,47,180,106,110,65,222,147,82,218,81,172,20,213,90,199,73,228,62,206,74,228,106,188,104,14,101,61,225,201,22,132,39,235,8,211,74,223,122,210,91,136,47,26,173,35,77,139,178,235,73,251,91,144,246,215,145,198,58,234,122,218,241,22,180,227,2,218,90,67,93,164,18,92,241,9,164,71,4,13,13,127,217,252,165,5,173,35,228,47,51,240,171,162,1,60,37,238,13,109,237,230,155,81,137,3,171,220,18,253,78,211,136,40,93,100,65,68,111,116,11,74,94,240,40,45,253,193,68,70,14,233,25,217,150,154,89,130,176,137,141,60,78,4,17,68,54,46,138,185,57,218,141,85,218,107,216,122,132,188,168,241,178,215,63,74,181,54,107,67,123,201,177,151,184,49,73,121,241,16,145,236,181,94,67,121,204,229,142,108,197,123,104,46,76,119,37,16,25,209,13,68,190,227,18,171,254,159,223,142,43,245,235,170,137,94,146,85,144,177,50,142,229,154,86,129,63,82,189,45,133,112,71,180,92,242,250,243,90,71,182,102,34,141,233,116,6,93,199,247,71,142,123,115,65,32,156,220,183,77,170,21,147,217,171,42,30,49,41,227,86,8,98,41,236,77,69,97,178,208,112,246,214,175,91,229,171,182,151,75,241,108,64,22,32,50,57,99,37,226,33,139,37,237,71,131,211,119,166,129,97,40,173,128,230,2,209,10,45,130,182,76,179,173,70,231,246,22,81,255,10,77,117,88,82,197,133,22,176,249,98,146,116,132,146,162,127,17,159,138,123,205,118,148,194,94,169,252,253,187,116,200,5,229,65,222,148,62,106,104,133,194,109,232,190,219,68,54,123,50,193,94,116,128,77,109,126,110,161,119,160,121,214,184,210,61,93,219,247,204,117,98,118,239,100,99,161,173,184,175,205,82,46,182,21,217,251,80,210,24,212,100,69,181,23,195,165,23,144,93,74,23,33,125,177,57,159,5,137,192,160,106,164,8,78,60,54,82,246,30,133,86,216,139,195,115,108,170,76,95,139,46,13,171,182,155,135,117,0,29,78,227,58,45,195,115,147,146,245,55,20,111,117,181,86,85,205,40,84,181,44,19,171,247,216,183,201,149,3,179,118,254,46,91,79,216,91,55,36,41,100,64,219,77,176,218,134,13,233,156,44,247,244,38,6,229,67,220,32,91,85,183,243,93,144,39,11,75,250,8,133,82,118,235,32,53,32,196,104,20,76,47,8,241,228,17,224,111,80,15,19,144,38,138,25,220,149,16,176,118,111,236,73,25,227,10,6,254,123,176,136,157,136,202,87,118,242,40,157,35,51,255,200,66,172,194,226,94,92,7,139,42,235,86,226,141,69,26,252,0,166,18,44,179,41,85,3,61,51,237,26,153,106,19,178,8,147,57,89,180,1,201,36,195,83,216,148,39,94,48,202,246,72,249,76,30,23,8,111,223,153,21,75,212,103,155,230,59,233,230,225,242,44,179,158,231,30,51,102,62,203,11,56,12,157,21,150,77,236,18,78,26,133,119,37,182,182,88,58,12,186,116,83,98,41,250,6,146,109,15,67,55,108,150,109,88,91,24,248,97,29,183,165,236,123,229,98,19,251,15,28,201,39,127,79,4,87,194,220,103,12,107,205,95,166,35,245,145,133,161,43,137,50,103,42,74,42,68,229,90,194,93,211,247,34,172,179,251,252,217,79,111,94,55,218,89,127,248,177,213,217,171,132,109,25,200,97,107,60,196,59,243,128,47,56,182,101,65,71,214,56,240,119,230,0,223,60,108,203,129,142,172,113,48,218,200,65,157,153,131,197,139,100,204,152,222,153,192,85,102,56,19,47,158,149,214,112,201,31,60,108,201,38,199,46,102,212,21,140,158,254,76,121,100,102,79,89,4,51,86,79,57,243,214,194,198,149,179,168,6,211,218,169,212,111,0,118,70,17,185,100,204,60,216,77,3,254,58,119,118,169,217,104,40,189,108,126,209,224,110,244,224,171,104,65,30,189,195,1,195,75,184,16,3,41,234,151,24,222,180,194,115,229,34,16,177,69,182,9,30,13,162,115,111,141,32,206,191,105,175,220,102,38,110,21,203,65,188,51,207,54,203,82,151,162,189,193,69,139,33,180,192,225,201,5,147,21,104,166,174,176,165,68,66,187,178,198,170,72,249,87,3,5,220,40,213,168,66,94,120,8,38,29,31,150,116,254,4,35,162,6,196,89,201,22,214,170,71,133,75,179,112,79,172,60,241,174,231,49,65,154,188,67,202,223,179,192,128,235,240,135,13,21,25,172,40,80,252,128,185,42,105,140,29,57,233,47,253,193,192,120,223,51,58,6,130,141,77,194,198,229,89,135,224,111,80,60,11,98,57,91,248,97,212,233,255,75,128,147,53,139,152,108,201,216,152,128,23,187,223,87,15,164,67,59,191,36,14,103,180,4,205,152,68,144,100,242,72,197,30,65,166,38,165,199,92,93,4,146,45,162,21,206,83,250,238,64,34,71,40,197,130,255,145,243,95,24,192,100,47,155,57,0,0 };
+const uint8_t JS_CONTROLS_GZIP[3927] PROGMEM = { 31,139,8,0,20,216,233,97,2,255,197,27,105,119,218,72,242,187,127,133,172,204,139,197,66,56,114,77,6,44,231,17,76,18,118,176,241,26,60,153,183,153,172,159,16,141,209,179,144,52,146,240,49,14,255,125,171,171,15,117,11,129,25,60,179,251,37,70,213,213,213,213,85,213,93,87,199,13,131,36,53,46,122,151,189,211,222,168,215,238,95,126,186,232,217,47,235,245,150,43,6,206,187,253,65,251,24,96,13,1,59,59,110,143,186,151,131,143,31,135,221,145,221,80,113,187,191,142,186,167,199,140,70,67,129,143,122,163,110,223,86,0,103,64,49,71,15,65,217,34,189,203,14,133,188,212,145,58,12,235,101,134,245,225,98,52,26,156,218,175,116,60,14,109,212,95,101,152,253,246,7,96,226,181,142,200,128,141,250,235,12,111,248,165,55,234,124,238,158,219,111,116,84,9,111,212,223,40,216,253,222,49,192,222,230,112,25,180,81,127,155,97,158,94,156,124,0,216,143,58,38,135,54,234,63,42,226,2,57,130,66,206,46,70,246,59,29,91,25,105,212,223,101,51,62,157,183,207,62,219,63,113,64,251,248,152,65,46,207,6,189,83,138,202,7,58,253,110,251,156,35,55,234,63,41,43,182,63,216,141,156,66,24,76,81,200,176,219,239,118,128,90,78,39,2,220,80,180,50,56,27,245,168,252,115,106,17,224,134,162,150,147,30,0,114,90,65,88,67,209,201,73,251,87,187,145,211,7,194,26,170,42,70,221,51,187,145,215,4,2,27,138,30,62,181,47,62,117,237,70,78,15,28,218,80,212,208,238,116,168,109,228,84,192,161,141,119,170,96,206,218,231,237,209,0,212,248,83,94,54,114,164,161,138,187,119,210,133,19,149,147,55,5,54,20,168,60,48,199,131,47,167,242,184,244,187,31,71,242,88,156,247,62,125,30,73,227,239,116,79,71,96,75,66,110,157,203,209,197,249,191,46,6,189,97,87,146,234,92,118,79,186,231,237,126,118,252,58,151,103,93,152,117,222,251,5,166,190,148,192,47,221,81,123,120,246,185,221,87,200,95,14,47,78,63,246,7,95,180,53,58,237,243,243,193,72,30,150,206,101,187,223,251,119,251,28,52,248,86,130,142,219,231,63,75,195,239,92,158,14,78,97,251,111,222,180,110,156,216,184,138,157,104,118,236,164,142,29,144,91,163,29,199,206,189,85,194,145,153,147,180,93,151,248,246,212,241,19,130,160,196,247,38,36,238,132,65,234,5,139,112,145,240,161,233,34,112,83,47,12,12,55,244,195,184,227,59,73,98,225,207,222,164,244,192,127,216,167,139,249,152,196,18,222,74,110,189,212,157,41,120,78,66,84,153,53,99,146,46,226,192,132,127,126,95,132,94,66,204,22,71,225,34,20,8,100,78,98,199,159,200,225,76,158,2,35,34,41,137,99,239,134,196,18,41,147,175,64,186,37,169,147,68,51,199,79,37,146,148,183,192,73,22,193,212,15,111,21,58,76,252,98,220,117,226,56,204,230,11,85,136,97,199,247,254,112,98,47,144,8,84,49,77,254,155,106,69,32,78,156,248,218,108,77,200,212,89,248,169,0,154,173,229,114,143,106,225,150,140,147,208,189,110,41,191,65,37,1,113,83,50,201,107,36,38,191,47,72,146,14,98,143,4,169,67,65,103,36,158,123,73,2,191,172,210,195,114,79,98,38,206,13,249,36,140,1,134,252,208,117,252,97,26,198,206,21,169,38,36,237,165,100,110,153,36,137,22,30,218,76,98,86,254,57,28,156,86,147,20,118,116,229,77,239,45,105,74,165,82,75,33,28,195,250,97,172,208,246,64,219,104,77,176,226,4,77,79,91,235,170,112,173,140,120,203,155,90,114,234,190,29,44,124,191,244,144,209,66,166,34,39,78,72,134,85,106,49,25,102,75,126,245,38,223,128,73,6,254,250,45,207,175,19,167,32,130,31,172,73,232,46,230,32,185,82,213,153,76,44,243,31,102,169,26,78,167,112,64,126,176,204,103,113,120,11,223,179,116,238,91,166,89,106,113,85,84,93,63,132,181,193,192,25,21,149,52,156,192,33,104,97,145,116,193,78,98,88,97,141,250,40,117,137,11,107,196,100,30,222,16,118,176,76,60,49,47,174,98,66,2,179,180,130,10,124,106,120,49,153,20,96,49,166,145,11,163,102,156,134,6,231,128,50,249,252,217,187,183,175,222,180,10,102,101,91,215,160,129,245,224,250,158,123,221,228,146,171,44,181,77,207,156,96,226,147,95,188,196,27,123,190,151,222,119,0,112,5,2,122,0,61,238,231,5,240,252,249,190,144,121,117,230,77,38,36,40,61,72,133,208,3,144,217,43,87,146,68,135,157,119,111,224,71,223,75,82,18,192,85,99,222,200,53,93,92,211,172,20,243,82,65,169,163,97,221,122,193,36,188,173,82,131,164,171,84,163,48,78,247,109,211,252,254,189,120,228,93,125,221,200,235,215,175,164,126,241,110,253,66,198,67,248,77,82,203,188,77,154,181,154,89,206,79,156,133,73,26,56,115,82,54,155,171,131,148,106,217,172,221,130,200,91,75,2,252,238,76,156,211,216,19,6,27,6,97,68,2,91,72,214,34,55,41,189,182,131,36,244,9,204,191,2,146,12,211,160,120,91,216,220,58,219,76,201,29,240,39,117,157,157,153,204,254,211,120,65,90,203,86,198,26,158,166,109,120,67,68,32,153,63,99,26,53,66,97,27,168,81,64,17,5,230,15,169,237,160,137,61,70,129,162,79,114,151,17,12,84,39,120,23,209,81,98,75,187,29,135,147,123,132,185,240,69,98,48,54,225,27,41,122,53,189,143,8,247,142,122,158,208,44,184,131,40,40,117,198,73,224,220,20,129,129,81,56,26,169,58,4,54,143,203,228,93,59,92,169,121,103,95,136,7,118,132,112,74,58,14,253,164,58,13,227,174,3,204,19,159,208,237,217,71,120,215,131,39,187,99,162,123,160,232,205,156,235,224,200,165,202,178,165,136,217,146,179,64,7,25,171,105,152,58,190,88,239,200,210,151,247,73,112,149,206,94,52,74,242,240,129,243,10,224,238,94,120,225,53,28,171,181,232,176,145,113,76,156,235,150,16,117,150,77,53,255,191,59,100,114,167,215,29,28,105,114,87,222,105,199,219,204,95,149,1,203,62,155,249,187,36,38,126,232,76,224,100,232,216,152,103,54,165,97,167,94,234,19,102,53,190,51,38,62,154,225,220,241,130,207,196,1,27,18,86,152,33,228,233,97,118,216,20,95,44,85,147,159,89,46,38,65,44,21,146,159,152,83,40,131,60,23,104,10,41,163,123,240,73,9,174,175,81,248,121,116,210,183,216,249,212,153,96,185,236,202,164,135,252,44,186,185,113,26,152,101,68,131,24,7,29,99,26,46,220,25,202,190,153,221,25,165,7,82,141,98,66,213,126,204,98,60,42,202,69,154,210,235,14,28,169,197,73,84,232,109,8,74,169,32,21,208,233,46,52,184,111,91,50,175,172,239,77,228,212,143,239,142,221,72,224,84,5,89,134,238,248,200,96,142,44,45,19,72,185,211,223,91,9,47,154,238,44,187,200,153,176,77,95,156,85,118,149,93,17,13,85,118,200,162,255,116,22,105,2,249,116,38,53,42,43,108,198,79,103,19,83,219,167,243,169,147,89,97,116,252,116,70,105,118,254,116,62,53,42,43,108,186,79,103,147,21,7,158,206,104,142,206,198,211,141,85,176,199,15,95,76,99,224,33,250,117,107,127,37,14,88,33,59,106,127,88,165,169,7,30,78,20,161,7,58,244,189,163,67,199,8,131,57,80,34,139,200,62,0,28,182,15,41,209,178,89,58,48,102,49,153,218,7,148,130,2,63,56,226,31,120,205,148,205,195,154,115,116,88,3,146,133,17,141,92,115,226,221,24,222,4,151,210,136,29,214,96,132,206,165,243,108,32,80,213,9,192,215,152,76,58,236,219,130,252,55,140,154,84,77,203,18,198,109,150,233,68,30,91,217,1,236,169,231,67,176,102,73,181,209,52,5,83,204,31,172,116,230,37,192,79,154,66,10,66,55,102,150,108,219,134,72,152,238,251,69,26,190,96,119,41,164,243,104,76,38,194,205,138,106,0,52,158,0,118,236,40,14,231,17,132,204,35,103,108,164,161,193,38,210,95,86,128,213,20,3,210,55,176,201,247,44,142,219,167,251,169,50,36,152,97,193,39,196,4,142,79,98,74,98,230,164,148,166,49,9,73,98,4,97,106,144,59,72,148,140,230,111,191,97,50,80,96,115,5,38,197,42,136,82,253,16,217,194,140,14,139,36,24,219,12,68,197,251,44,129,152,199,77,185,14,116,212,22,251,204,148,22,70,152,212,81,189,177,159,102,121,79,232,110,207,60,48,208,4,236,3,1,101,22,65,7,4,132,45,70,40,246,145,128,97,80,1,128,195,26,163,121,100,174,238,232,164,183,237,118,188,73,209,86,202,166,225,5,209,34,101,42,224,219,74,188,63,32,193,45,61,136,93,162,41,204,189,192,212,221,230,10,47,237,95,255,62,94,168,129,104,252,208,196,194,92,97,210,185,99,241,96,142,85,76,56,243,152,249,237,172,92,64,163,238,217,255,72,184,144,242,71,143,72,23,235,238,143,223,134,178,208,244,149,219,223,55,123,165,130,37,156,65,11,56,128,219,18,7,134,55,87,214,234,220,138,137,176,204,127,232,6,152,107,21,52,241,224,39,246,137,147,206,170,113,184,128,163,65,147,123,160,8,59,166,133,177,145,55,135,95,181,70,189,94,47,226,180,26,45,146,153,245,112,215,76,147,202,125,51,147,6,156,228,92,121,111,23,206,21,190,149,78,70,179,64,96,95,191,253,197,235,137,118,0,85,159,168,75,151,216,184,44,83,99,233,224,113,103,183,177,32,154,187,30,148,38,21,102,219,106,248,151,229,46,220,224,196,210,192,208,224,54,56,139,195,8,46,222,123,235,128,103,126,195,244,222,39,7,37,230,42,85,66,194,128,97,152,91,176,58,163,152,37,25,184,111,136,203,193,231,212,205,247,245,102,227,207,177,150,60,153,55,22,118,172,161,133,172,105,39,117,143,133,28,151,180,196,105,105,119,1,204,82,16,43,38,152,189,169,212,234,254,119,91,226,169,39,165,5,142,87,33,6,140,237,108,3,58,165,93,216,82,82,96,140,135,200,93,250,23,241,150,35,181,147,25,176,100,124,37,16,120,42,107,43,196,118,97,142,39,245,171,57,123,158,179,85,12,44,98,238,202,188,78,106,23,206,179,212,58,107,201,55,87,209,88,237,131,46,121,229,44,174,200,95,36,251,60,173,93,54,192,238,241,2,99,238,157,116,209,255,197,55,182,226,244,210,176,55,28,12,177,140,102,101,61,22,86,224,74,193,27,54,205,114,124,131,5,243,156,223,16,221,51,81,156,197,210,175,101,94,4,215,65,120,27,24,52,250,161,225,51,198,188,166,152,180,220,147,37,56,24,63,178,181,199,22,207,159,203,145,67,189,20,203,194,25,81,15,204,223,97,107,69,28,57,1,241,53,1,171,211,10,164,155,77,40,229,88,181,109,237,246,133,28,146,49,163,183,142,216,77,251,66,182,84,121,67,247,5,111,161,138,207,172,95,42,32,89,115,84,64,100,43,84,0,88,239,83,124,201,86,103,169,37,56,201,186,4,28,199,44,43,253,98,94,147,132,239,146,8,55,11,183,144,241,46,152,86,184,85,217,148,252,113,198,54,113,180,150,143,229,30,205,19,49,65,126,193,221,212,37,126,65,6,72,104,13,88,201,255,120,226,247,181,254,141,251,95,61,19,100,142,143,222,40,12,26,208,123,132,135,17,133,152,44,1,83,154,23,115,146,36,206,21,177,149,250,177,218,103,99,252,177,78,23,207,15,153,93,2,61,91,184,65,14,199,91,32,127,156,18,31,87,134,163,4,127,241,72,113,236,214,159,22,130,238,236,243,146,225,169,165,228,156,45,179,129,115,116,149,155,88,15,214,113,174,172,66,47,238,13,107,48,151,183,105,145,116,155,69,68,125,163,112,9,90,145,216,184,130,51,222,98,13,230,1,55,41,154,187,200,141,202,222,98,33,181,156,204,134,43,94,50,129,219,19,179,73,254,83,39,59,166,48,133,26,61,200,70,14,101,17,21,47,39,107,92,244,66,171,228,22,228,45,49,165,27,198,42,97,205,117,156,68,238,227,172,68,174,198,139,230,148,214,19,158,110,65,120,186,142,48,45,52,174,39,189,133,248,162,241,58,210,180,38,188,158,180,191,5,105,127,29,105,44,227,174,167,29,111,65,59,46,160,173,245,243,69,38,195,21,159,64,118,70,208,208,240,151,205,31,122,208,50,70,254,50,3,191,42,250,207,51,226,94,211,206,114,190,23,150,56,176,202,13,209,239,52,141,136,210,196,22,68,244,62,187,160,228,5,143,210,210,223,107,100,228,144,158,145,109,169,145,229,39,155,216,200,227,68,16,65,100,227,162,150,156,163,93,95,165,189,134,173,71,200,139,18,51,123,124,164,20,139,179,46,184,151,28,123,137,27,147,148,215,46,17,201,94,235,53,148,183,100,238,216,86,188,135,230,194,116,87,2,145,17,221,64,228,59,46,177,106,255,249,237,184,92,187,170,152,232,37,89,1,27,11,243,88,45,106,22,248,35,213,219,82,8,119,68,203,37,47,127,175,117,100,107,38,210,152,78,103,208,117,124,127,236,184,215,67,2,225,228,190,109,82,173,152,204,94,85,241,136,73,25,183,66,16,75,97,111,42,10,147,133,134,179,183,126,221,10,95,181,181,92,138,87,11,178,254,145,201,25,11,33,15,89,44,105,63,26,156,190,55,13,12,67,105,1,54,23,136,150,105,13,182,105,154,45,53,242,183,183,200,40,86,104,170,195,146,42,46,116,11,155,47,38,73,71,40,41,250,23,241,169,184,215,108,71,169,43,30,148,190,127,151,14,185,160,58,201,123,226,71,117,173,78,185,13,221,247,155,200,102,47,54,216,131,18,176,169,205,175,61,244,6,56,79,90,87,154,183,107,219,174,185,70,208,238,141,116,172,243,21,183,213,89,58,199,182,34,91,47,74,26,131,154,44,171,246,98,184,244,2,178,15,210,219,144,62,24,93,204,131,68,96,80,53,82,4,39,158,24,41,123,14,67,11,252,197,225,57,246,116,102,111,68,147,136,21,251,205,195,26,128,14,103,113,141,118,1,184,73,201,242,31,138,183,178,90,42,171,100,20,42,90,6,139,205,3,108,27,229,170,145,217,107,130,93,182,158,176,167,118,72,82,200,128,118,187,96,181,13,27,42,230,4,243,102,145,189,234,109,21,202,154,184,84,182,170,183,231,251,50,79,150,159,116,27,10,165,236,34,66,106,64,136,209,40,152,94,16,245,201,83,193,95,197,30,38,32,96,148,60,120,48,33,115,237,42,217,147,98,199,21,12,252,247,197,109,236,68,84,228,178,183,72,233,28,153,249,103,31,98,21,22,10,227,58,88,195,89,183,18,111,117,210,120,8,48,149,248,153,77,169,24,232,172,105,31,203,84,219,162,69,152,204,239,162,89,72,38,25,158,194,166,188,4,4,163,108,143,148,207,228,113,129,240,134,162,89,182,68,197,184,97,190,151,158,31,238,211,18,235,194,238,49,251,230,179,188,128,195,208,127,97,37,197,62,192,73,227,240,238,128,173,45,150,14,131,14,221,148,88,138,190,202,100,219,195,104,14,219,119,27,214,22,54,127,88,195,109,41,251,94,185,235,196,254,3,71,242,201,95,56,193,45,177,240,25,195,90,59,154,233,72,125,246,97,232,74,162,204,153,138,146,10,81,185,150,112,215,244,5,11,235,53,63,127,246,211,219,55,245,86,214,177,126,108,117,246,78,98,91,6,114,216,26,15,241,206,60,224,155,146,109,89,208,145,53,14,252,157,57,192,87,24,219,114,160,35,107,28,140,55,114,80,99,230,96,241,186,25,51,166,247,38,112,149,25,206,212,139,231,7,107,184,228,79,48,182,100,147,99,23,51,234,10,70,7,63,83,30,153,217,83,22,193,140,213,83,206,28,184,176,113,229,44,170,241,181,118,42,245,27,128,157,81,68,62,48,230,30,236,166,14,127,157,59,251,160,81,175,43,221,117,126,209,224,110,244,120,172,104,65,30,208,195,1,195,75,184,16,3,41,234,151,24,222,180,194,153,229,130,18,177,69,182,9,30,32,162,191,111,142,33,244,191,110,173,220,102,38,110,21,43,68,252,173,0,219,44,203,102,138,246,6,23,45,70,213,2,135,231,27,76,86,160,153,154,194,150,18,28,237,202,26,43,44,229,223,49,20,112,163,20,168,10,121,225,81,153,116,124,88,229,249,19,140,136,178,16,103,37,91,88,43,40,21,46,205,34,64,177,242,212,187,90,196,4,105,242,158,45,127,97,3,3,174,195,159,90,148,101,252,162,64,241,3,230,170,164,49,156,228,164,191,244,250,125,227,67,215,104,27,8,54,54,9,27,151,103,13,137,191,65,241,44,174,229,108,225,135,81,163,255,83,2,78,214,60,98,178,37,19,99,10,94,236,126,95,61,144,14,237,69,147,56,156,211,170,52,99,18,65,146,201,35,21,123,12,201,155,148,30,115,117,17,72,182,136,86,184,72,233,75,8,137,28,161,20,11,254,143,208,127,1,0,108,136,56,84,58,0,0 };