1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-26 14:44:13 +00:00
ESPUI/src/dataControlsJS.h
Christian Riggenbach 6873052b6e Added new features, removed dependency on unique labels
- added Min/Max/Step for numbers and sliders
- labels don't have to be unique anymore; controls can't be updated by labels
- new Slider: JS + CSS
2019-03-19 09:34:16 +01:00

72 lines
21 KiB
C

const char JS_CONTROLS[] PROGMEM = R"=====(
const UI_INITIAL_GUI=200;const UPDATE_OFFSET=100;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 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;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_NONE:return"dark";default:return"";}}
var websock;var websockConnected=false;function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();}
function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart});}
function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}}
function start(){document.addEventListener("visibilitychange",handleVisibilityChange,false);websock=new WebSocket("ws://"+window.location.hostname+"/ws");websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};var handleEvent=function(evt){var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element)};handleEvent(fauxEvent);});break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<span id='l"+data.id+"' class='label label-wrap'>"+data.value+"</span>"+
"</div>");break;case UI_BUTTON:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='one columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<button id='btn"+data.id+"' "+
"onmousedown='buttonclick("+data.id+", true)' "+
"onmouseup='buttonclick("+data.id+", false)'>"+
data.value+
"</button></div>");$("#btn"+data.id).on({touchstart:function(e){e.preventDefault();buttonclick(data.id,true);},touchend:function(e){e.preventDefault();buttonclick(data.id,false);}});break;case UI_SWITCHER:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='one columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<label id='sl"+data.id+"' class='switch "+((data.value=="1")?"checked":"")+"'>"+
"<div class='in'><input type='checkbox' id='s"+data.id+"' onClick='switcher("+data.id+",null)' "+((data.value=="1")?"checked":"")+"/></div>"+
"</label>"+
"</div>");switcher(data.id,data.value);break;case UI_CPAD:case UI_PAD:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<nav class='control'>"+
"<ul>"+
"<li><a onmousedown='padclick(UP, "+data.id+", true)' onmouseup='padclick(UP, "+data.id+", false)' id='pf"+data.id+"'>▲</a></li>"+
"<li><a onmousedown='padclick(RIGHT, "+data.id+", true)' onmouseup='padclick(RIGHT, "+data.id+", false)' id='pr"+data.id+"'>▲</a></li>"+
"<li><a onmousedown='padclick(LEFT, "+data.id+", true)' onmouseup='padclick(LEFT, "+data.id+", false)' id='pl"+data.id+"'>▲</a></li>"+
"<li><a onmousedown='padclick(DOWN, "+data.id+", true)' onmouseup='padclick(DOWN, "+data.id+", false)' id='pb"+data.id+"'>▲</a></li>"+
"</ul>"+
((data.type==UI_CPAD)?"<a class='confirm' onmousedown='padclick(CENTER,"+data.id+", true)' onmouseup='padclick(CENTER, "+data.id+", false)' id='pc"+data.id+"'>OK</a>":"")+
"</nav>"+
"</div>");$("#pf"+data.id).on({touchstart:function(e){e.preventDefault();padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();padclick(UP,data.id,false);}});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();padclick(LEFT,data.id,false);}});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();padclick(RIGHT,data.id,false);}});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();padclick(DOWN,data.id,false);}});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();padclick(CENTER,data.id,false);}});break;case UI_SLIDER:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter card-slider "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<div class='range-slider'>"+
"<input id='sl"+data.id+"' type='range' min='0' max='100' value='"+data.value+"' class='range-slider__range'>"+
"<span class='range-slider__value'>"+data.value+"</span>"+
"</div>"+
"</div>");rangeSlider();break;case UI_NUMBER:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<input style='color:black;' id='num"+data.id+"' type='number' value='"+data.value+"' onchange='numberchange("+data.id+")' />"+
"</div>");break;case UI_TEXT_INPUT:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<input style='color:black;' id='text"+data.id+"' value='"+data.value+"' onchange='textchange("+data.id+")' />"+
"</div>");break;case UI_TAB:$("#tabsnav").append("<li><a href='#tab"+data.id+"'>"+data.value+"</a></li>");$("#tabscontent").append("<div id='tab"+data.id+"'></div>");tabs=$('.tabscontent').tabbedContent({loop:true}).data('api');$('a').filter(function(){return $(this).attr('href')==='#click-to-switch';}).on('click',function(e){var tab=prompt('Tab to switch to (number or id)?');if(!tabs.switchTab(tab)){alert('That tab does not exist :\\');}
e.preventDefault();});break;case UI_SELECT:var parent;if(data.parentControl){parent=$("#tab"+data.parentControl);}else{parent=$("#row")}
parent.append("<div id='id"+data.id+"' class='two columns card tcenter "+colorClass(data.color)+"'>"+
"<h5>"+data.label+"</h5><hr/>"+
"<select style='color:black;' id='select"+data.id+"' onchange='selectchange("+data.id+")' />"+
"</div>");break;case UI_OPTION:if(data.parentControl){var parent=$("#select"+data.parentControl);parent.append("<option id='option"+data.id+"' value='"+data.value+"' "+data.selected+">"+data.label+"</option>");}
break;case UI_MIN:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){console.log("MIN"+data.value);parent.attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){console.log("MAX"+data.value);parent.attr("max",data.value);}}
break;case UI_STEP:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){console.log("STEP"+data.value);parent.attr("step",data.value);}}
break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);break;case UPDATE_SWITCHER:switcher(data.id,(data.value=="0")?0:1);break;case UPDATE_SLIDER:slider_move($("#sl"+data.id),data.value,"100",false);break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);break;case UPDATE_BUTTON:case UPDATE_PAD:case UPDATE_CPAD:break;default:console.error("Unknown type or event");break;}
if(data.type>=UPDATE_OFFSET&&data.type<UI_INITIAL_GUI){var element=$('#id'+data.id);element.removeClass("turquoise emerald peterriver wetasphalt sunflower carrot alizarin");element.addClass(colorClass(data.color));}};websock.onmessage=handleEvent;}
function sliderchange(number){var val=$("#sl"+number).val();console.log("slvalue:"+val+":"+number);websock.send("slvalue:"+val+":"+number);}
function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);}
function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);}
function selectchange(number){var val=$("#select"+number).val();websock.send("svalue:"+val+":"+number);}
function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);}
function padclick(type,number,isdown){switch(type){case CENTER:if(isdown)websock.send("pcdown:"+number);else websock.send("pcup:"+number);break;case UP:if(isdown)websock.send("pfdown:"+number);else websock.send("pfup:"+number);break;case DOWN:if(isdown)websock.send("pbdown:"+number);else websock.send("pbup:"+number);break;case LEFT:if(isdown)websock.send("pldown:"+number);else websock.send("plup:"+number);break;case RIGHT:if(isdown)websock.send("prdown:"+number);else websock.send("prup:"+number);break;}}
function switcher(number,state){if(state==null){if($("#s"+number).is(":checked")){websock.send("sactive:"+number);$("#sl"+number).addClass("checked");}else{websock.send("sinactive:"+number);$("#sl"+number).removeClass("checked");}}else if(state==1){$("#sl"+number).addClass("checked");$("#sl"+number).prop("checked",true);}else if(state==0){$("#sl"+number).removeClass("checked");$("#sl"+number).prop("checked",false);}}
var rangeSlider=function(){var slider=$('.range-slider'),range=$('.range-slider__range'),value=$('.range-slider__value');slider.each(function(){value.each(function(){var value=$(this).prev().attr('value');$(this).html(value);});range.on({'input':function(){$(this).next().html(this.value);},'change':function(){sliderchange($(this).attr('id').replace(/^\D+/g,''));}});});};
)=====";
const uint8_t JS_CONTROLS_GZIP[2784] PROGMEM = { 31,139,8,0,78,66,142,92,2,255,237,90,253,114,219,184,17,255,223,79,193,227,101,66,178,86,244,145,156,115,57,210,116,70,145,149,68,61,69,118,109,249,146,233,100,170,161,68,200,226,152,34,121,36,100,57,231,209,107,244,65,250,72,125,146,46,62,9,208,148,173,139,219,155,118,210,25,143,76,46,22,139,31,118,23,139,197,130,179,52,41,176,113,49,152,12,70,131,241,160,59,156,188,187,24,248,207,219,109,111,198,26,78,143,187,227,254,228,228,237,219,243,254,216,239,148,244,193,100,60,24,247,135,190,66,56,237,30,251,29,189,31,37,181,59,37,79,143,80,158,235,76,61,198,245,188,228,122,115,49,30,159,140,252,23,58,31,167,118,218,47,74,206,97,247,13,128,248,65,103,100,196,78,251,135,146,239,252,227,96,220,123,223,63,243,15,116,86,73,239,180,15,20,238,225,224,24,104,47,43,188,140,218,105,191,44,57,71,23,31,222,0,237,71,157,147,83,59,237,31,21,117,245,63,141,65,201,167,23,99,255,149,206,173,180,116,218,175,202,30,239,206,186,167,239,253,159,56,161,123,124,204,40,147,211,147,193,136,176,242,134,222,176,223,61,227,204,157,246,79,202,136,221,55,126,167,98,16,70,83,12,114,222,31,246,123,32,173,98,19,65,238,40,86,57,57,29,15,136,254,43,102,17,228,142,98,150,15,3,32,84,172,66,105,29,197,38,31,186,159,252,78,197,30,148,214,81,77,49,238,159,250,157,170,37,40,81,161,74,55,60,62,249,56,146,78,56,236,191,29,75,103,59,27,188,123,63,150,46,213,235,143,198,96,33,129,166,55,25,95,156,253,229,226,100,112,222,151,162,122,147,254,135,254,89,119,88,58,117,111,114,218,135,94,103,131,95,160,235,115,73,252,216,31,119,207,79,223,119,135,138,248,201,249,197,232,237,240,228,163,54,70,175,123,118,118,50,150,46,216,155,116,135,131,191,118,207,64,47,47,37,233,184,123,246,179,116,167,222,100,116,50,234,251,207,15,14,188,249,42,153,225,40,77,140,89,26,167,121,47,14,138,194,166,143,131,208,185,229,15,254,104,181,156,162,92,210,189,98,29,225,217,66,225,11,10,164,206,213,205,17,94,229,137,9,63,191,174,210,168,64,166,199,89,248,212,5,3,90,162,60,136,67,217,92,234,65,112,100,8,163,60,143,174,81,46,153,74,189,8,166,53,194,65,145,45,130,24,75,38,169,39,193,83,172,146,121,156,174,21,57,76,109,162,125,22,228,121,90,246,23,42,20,205,65,28,253,22,228,81,34,25,136,6,69,99,24,228,87,166,23,162,121,176,138,177,32,154,222,102,179,119,29,228,198,26,77,139,116,118,229,41,207,189,52,73,208,12,163,208,159,7,113,129,74,43,228,168,192,65,142,109,231,246,137,29,166,179,213,18,37,216,105,6,97,104,155,127,50,157,102,58,159,219,142,247,196,54,191,207,211,53,188,47,240,50,182,77,211,241,184,220,230,44,78,11,4,44,92,138,183,217,83,12,156,156,227,0,175,138,62,76,52,135,17,182,96,33,210,37,47,140,145,163,101,122,141,152,103,152,212,228,207,46,115,132,18,211,185,195,10,56,53,190,28,133,53,92,12,52,69,97,180,140,81,106,112,4,4,228,211,239,95,189,124,113,224,213,244,42,167,174,81,19,251,118,22,71,179,43,151,107,110,163,205,121,17,36,97,140,126,137,138,104,26,197,17,254,210,3,194,37,232,231,54,154,219,223,85,231,255,244,233,119,66,229,205,69,20,134,40,113,110,165,61,136,49,165,88,97,35,201,14,19,239,95,195,195,48,42,48,74,96,169,152,215,114,204,25,29,211,108,212,99,105,80,165,75,3,250,9,90,27,31,209,244,28,158,17,182,205,117,225,182,90,230,254,58,74,194,116,221,140,211,89,64,0,52,23,105,129,147,96,137,246,205,214,186,80,204,159,38,105,134,18,95,0,181,209,53,38,171,56,41,210,24,65,239,75,16,200,56,13,194,183,131,5,183,89,26,163,27,64,39,85,87,66,40,189,9,231,43,228,109,20,104,212,55,119,193,70,25,65,100,213,99,53,105,136,208,238,145,70,8,117,18,200,42,100,166,160,22,171,72,32,173,97,128,3,255,207,231,39,163,102,22,228,176,154,160,161,73,104,14,237,139,124,105,245,105,26,126,161,180,25,188,161,220,135,37,207,35,35,97,111,226,47,25,226,177,81,207,131,92,218,12,216,112,158,198,69,115,158,230,253,0,58,161,24,17,177,254,17,69,1,177,228,134,33,188,37,236,46,5,84,96,8,65,151,209,252,139,96,118,54,158,50,25,91,118,130,153,58,222,52,71,193,149,39,0,208,188,202,149,224,113,132,99,152,11,65,18,7,83,20,83,19,47,131,40,121,143,130,16,162,36,95,167,37,67,85,30,205,134,92,2,21,212,4,18,61,88,83,148,155,189,246,216,244,156,91,246,234,19,241,56,152,154,251,53,60,222,6,193,34,80,57,105,120,219,236,49,74,51,200,192,91,33,4,30,134,209,181,17,133,190,21,133,92,78,20,238,155,22,56,12,184,172,111,225,117,74,182,177,213,50,41,12,8,231,161,129,153,97,12,115,95,217,221,184,242,225,221,129,190,71,230,254,158,121,184,56,56,226,2,233,84,247,205,195,22,144,14,23,121,139,181,23,89,144,208,129,227,186,113,105,31,131,254,62,91,231,65,102,9,97,215,65,188,66,68,24,233,207,36,181,96,10,71,102,85,151,44,5,253,175,82,38,172,176,255,144,50,167,43,140,83,166,206,41,78,180,177,73,123,154,44,211,85,129,32,222,37,192,64,121,105,132,183,21,206,134,65,162,139,163,117,88,101,247,176,179,40,75,1,42,150,33,246,96,93,142,164,97,136,194,84,88,108,143,193,233,106,182,160,97,223,45,3,134,115,139,154,89,142,200,122,59,102,123,63,68,24,21,2,23,209,160,96,189,77,131,74,1,229,127,141,12,190,79,108,238,172,107,113,212,248,70,188,135,45,54,50,114,81,187,24,89,4,134,113,108,187,180,180,239,155,29,211,121,109,130,246,97,95,13,77,23,114,38,57,34,153,9,239,28,37,214,209,97,148,100,43,108,144,232,237,91,180,195,52,189,177,216,136,218,128,105,210,35,22,18,67,146,93,95,113,185,100,21,199,212,65,31,198,209,18,222,71,29,146,78,80,15,22,114,0,225,12,165,196,170,55,144,67,175,43,94,200,243,183,17,160,147,64,218,144,239,171,188,227,138,171,50,142,142,14,3,67,139,45,89,16,178,37,118,113,218,48,234,130,139,18,88,182,243,242,200,66,103,157,205,213,89,31,253,243,239,255,56,108,5,96,92,24,252,65,16,244,28,185,59,142,58,118,13,74,254,245,80,200,249,118,119,36,53,220,26,144,248,235,129,144,83,247,238,64,106,184,53,32,211,251,129,180,152,171,216,101,242,230,251,124,65,193,138,5,140,165,127,205,163,124,105,109,193,204,42,0,141,93,65,115,246,123,96,207,52,216,39,63,19,212,44,112,16,208,224,248,122,172,32,139,83,241,195,223,187,125,169,142,254,181,219,87,157,12,101,251,162,8,227,199,35,164,142,247,104,140,154,148,42,202,252,241,40,217,66,125,52,76,93,76,21,231,244,241,56,233,234,121,52,76,77,74,21,229,236,241,40,249,114,121,52,206,138,156,237,201,21,173,205,254,111,108,162,228,229,89,17,71,225,191,99,67,85,146,162,156,212,41,184,96,222,155,165,72,53,73,24,203,154,104,15,203,88,70,16,24,219,240,63,184,241,173,78,27,158,88,18,100,233,199,35,171,110,160,201,132,9,81,206,95,181,92,84,198,195,7,46,53,66,82,1,231,180,191,93,181,55,171,176,127,35,73,19,179,98,129,191,196,36,211,37,125,221,105,28,204,174,60,182,243,36,171,101,141,109,19,90,11,222,106,74,56,182,208,186,150,96,100,111,106,102,12,251,90,235,190,179,112,121,109,241,127,51,16,56,164,212,166,1,122,80,243,164,199,87,232,189,251,198,229,122,44,32,171,32,197,64,161,25,150,163,45,114,52,247,45,69,207,44,35,169,46,61,145,83,177,160,79,164,145,140,28,116,165,74,20,186,174,10,147,216,72,63,48,150,213,84,4,88,14,121,155,162,176,199,222,237,219,56,77,51,151,108,2,27,135,150,232,108,43,200,34,139,140,108,5,192,61,143,98,176,144,45,55,5,82,207,37,181,121,227,137,141,23,81,1,120,48,206,109,139,76,204,114,124,31,38,71,119,135,103,56,125,198,142,92,150,183,161,91,149,69,233,86,67,221,94,136,115,2,28,63,203,211,101,134,109,107,28,76,13,156,26,252,252,9,79,54,91,1,70,154,195,84,157,215,0,139,84,157,201,124,154,140,9,122,216,240,234,56,183,65,140,114,34,98,17,96,34,211,8,83,84,24,73,138,13,116,19,21,216,112,63,127,182,72,93,187,102,71,187,187,99,209,27,182,111,165,46,135,98,52,187,103,237,176,246,202,169,93,44,19,214,248,251,23,10,187,152,116,183,168,181,84,60,85,152,134,160,162,221,170,22,211,140,222,46,16,224,236,113,151,101,207,223,217,56,8,56,239,104,140,201,34,243,216,236,233,51,249,48,216,117,26,210,176,26,219,190,105,208,224,101,82,215,230,211,41,162,223,144,237,84,74,251,48,146,10,188,156,59,89,128,38,36,10,166,86,211,216,220,65,218,253,244,71,33,237,126,186,15,105,112,243,0,82,114,135,252,7,65,37,67,221,131,181,192,40,187,23,172,242,85,3,141,252,234,153,172,44,254,215,148,153,244,111,28,220,59,229,41,189,226,213,54,157,215,109,183,83,43,130,165,215,60,153,35,247,140,54,93,52,10,18,101,2,13,19,146,72,83,36,235,119,165,241,228,141,72,80,115,23,135,244,126,96,46,74,210,65,3,162,186,231,238,210,159,71,221,59,43,126,183,222,188,252,175,146,202,50,94,249,49,139,203,122,138,123,102,225,11,244,38,204,54,47,146,171,36,93,39,52,77,35,123,14,221,40,100,240,218,236,9,159,36,237,71,190,246,1,206,211,167,178,229,80,191,170,98,62,43,110,166,96,91,5,167,181,228,212,60,222,160,223,17,203,91,127,131,95,239,27,229,37,190,81,94,213,27,242,70,222,96,119,239,134,188,99,47,5,203,251,200,250,141,130,184,180,114,39,184,68,69,17,64,104,87,174,196,212,219,96,230,102,60,224,179,205,153,205,15,12,227,11,191,227,116,106,53,122,129,88,174,183,34,166,22,116,205,125,248,191,111,186,146,89,66,40,104,32,223,206,167,128,209,210,227,58,48,212,133,117,52,250,48,201,14,163,40,169,96,221,24,204,207,239,27,4,239,48,136,182,145,214,234,149,47,137,251,6,42,118,24,72,189,23,97,205,141,168,32,245,55,122,161,207,31,117,177,83,66,83,164,145,132,198,168,176,172,178,250,225,100,181,128,44,140,70,101,64,126,211,171,92,242,178,154,130,187,13,73,54,123,24,74,54,211,176,104,145,98,187,224,249,14,130,231,219,4,147,138,205,118,209,59,168,47,155,110,19,77,74,107,219,69,199,59,136,142,183,137,166,229,176,237,178,243,29,100,231,53,178,181,143,60,196,174,198,13,95,224,0,35,234,104,244,201,247,233,13,15,121,167,46,94,122,119,4,49,208,21,55,60,142,252,206,70,248,121,0,226,175,145,50,116,53,242,40,223,96,8,33,60,17,175,72,138,146,7,101,233,31,239,148,226,168,60,163,156,75,135,124,112,244,48,140,42,15,156,125,178,178,93,148,227,42,178,219,119,101,111,129,245,128,120,89,165,163,159,85,41,101,28,95,57,225,145,38,22,232,233,241,81,43,94,57,13,250,122,167,65,20,155,156,6,203,89,238,182,179,50,147,227,177,247,38,34,223,107,104,131,66,115,13,53,55,132,64,118,222,36,199,55,91,28,59,133,76,209,72,83,46,145,169,241,50,21,173,147,90,52,31,180,92,69,180,232,147,144,239,112,120,87,66,145,153,94,195,98,241,88,235,165,109,128,250,25,24,182,117,98,150,12,14,79,200,110,253,237,243,241,126,235,178,97,89,14,43,138,146,63,239,95,145,14,18,139,211,43,0,0 };