1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-03 01:23:27 +00:00
ESPUI/src/dataControlsJS.h
Ian Gray 896dc97c75 Support dynamic enabling and disabling of controls
See documentation in README for how this works. This commit
handles all the main controls. Pads are not yet supported.
2022-01-31 21:43:09 +00:00

106 lines
30 KiB
C

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 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];}
return[];}
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);if(window.location.port!=""||window.location.port!=80||window.location.port!=443){websock=new WebSocket("ws://"+window.location.hostname+":"+window.location.port+"/ws");}else{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){console.log(evt);var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:$("#row").html("");$("#tabsnav").html("");$("#tabscontent").html("");if(data.sliderContinuous){sliderContinuous=data.sliderContinuous;}
data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>(data.controls.length-1)){websock.send("uiok:"+(data.controls.length-1));}
break;case UI_EXTEND_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>data.startindex+(data.controls.length-1)){websock.send("uiok:"+(data.startindex+(data.controls.length-1)));}
break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:if(data.visible)addToHTML(data);break;case UI_BUTTON:if(data.visible){addToHTML(data);$("#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:if(data.visible){addToHTML(data);switcher(data.id,data.value);}
break;case UI_CPAD:case UI_PAD:if(data.visible){addToHTML(data);$("#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:if(data.visible){addToHTML(data);rangeSlider(!sliderContinuous);}
break;case UI_TAB:if(data.visible){$("#tabsnav").append("<li><a onmouseup='tabclick("+data.id+")' 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_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()){parent.attr("min",data.value);}}
break;case UI_MAX:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){if(!parent.attr("type")){parent.attr("maxlength",data.value);}else{parent.attr("max",data.value);}}}
break;case UI_STEP:if(data.parentControl){var parent=$("#id"+data.parentControl+" input");if(parent.size()){parent.attr("step",data.value);}}
break;case UI_GRAPH:if(data.visible){addToHTML(data);graphData[data.id]=restoreGraphData(data.id);renderGraphSvg(graphData[data.id],"graph"+data.id);}
break;case ADD_GRAPH_POINT:var ts=Math.round(new Date().getTime()/1000);graphData[data.id].push({x:ts,y:data.value});saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case CLEAR_GRAPH:graphData[data.id]=[];saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=true;if(data.visible){addToHTML(data);requestOrientationPermission();}
break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);if(data.hasOwnProperty('elementStyle')){$("#l"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SWITCHER:switcher(data.id,data.value=="0"?0:1);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
break;case UPDATE_SLIDER:$("#sl"+data.id).attr("value",data.value)
slider_move($("#id"+data.id),data.value,"100",false);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);}
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);$("#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;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>=UI_TITEL&&data.type<UPDATE_OFFSET){processEnabled(data);}
if(data.type>=UPDATE_OFFSET&&data.type<UI_INITIAL_GUI){var element=$("#id"+data.id);if(data.hasOwnProperty('panelStyle')){$("#id"+data.id).attr("style",data.panelStyle);}
if(data.hasOwnProperty('visible')){if(data['visible'])
$("#id"+data.id).show();else
$("#id"+data.id).hide();}
if(data.type==UPDATE_SLIDER){element.removeClass("slider-turquoise slider-emerald slider-peterriver slider-wetasphalt slider-sunflower slider-carrot slider-alizarin");element.addClass("slider-"+colorClass(data.color));}else{element.removeClass("turquoise emerald peterriver wetasphalt sunflower carrot alizarin");element.addClass(colorClass(data.color));}
processEnabled(data);}
$(".range-slider__range").each(function(){$(this)[0].value=$(this).attr("value");$(this).next().html($(this).attr("value"));});};websock.onmessage=handleEvent;}
function sliderchange(number){var val=$("#sl"+number).val();websock.send("slvalue:"+val+":"+number);$(".range-slider__range").each(function(){$(this).attr("value",$(this)[0].value);});}
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 tabclick(number){var val=$("#tab"+number).val();websock.send("tabvalue:"+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(!$("#sl"+number).hasClass("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(isDiscrete){var range=$(".range-slider__range");var slidercb=function(){sliderchange($(this).attr("id").replace(/^\D+/g,""));};range.on({input:function(){$(this).next().html(this.value)}});range.each(function(){$(this).next().html(this.value);if($(this).attr("callbackSet")!="true"){if(!isDiscrete){$(this).on({input:slidercb});}else{$(this).on({change:slidercb});}
$(this).attr("callbackSet","true");}});};var addToHTML=function(data){panelStyle=data.hasOwnProperty('panelStyle')?" style='"+data.panelStyle+"' ":"";panelwide=data.hasOwnProperty('wide')?"wide":"";if(!data.hasOwnProperty('parentControl')||$("#tab"+data.parentControl).length>0){var parent=data.hasOwnProperty('parentControl')?$("#tab"+data.parentControl):$("#row");var html="";switch(data.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:html="<div id='id"+data.id+"' "+panelStyle+" class='two columns "+panelwide+" card tcenter "+
colorClass(data.color)+"'><h5>"+data.label+"</h5><hr/>"+
elementHTML(data)+
"</div>";break;case UI_SEPARATOR:html="<div id='id"+data.id+"' "+panelStyle+" class='sectionbreak columns'>"+
"<h5>"+data.label+"</h5><hr/></div>";break;case UI_TIME:break;}
parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data));}}
var elementHTML=function(data){var id=data.id
var elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";switch(data.type){case UI_LABEL:return"<span id='l"+id+"' "+elementStyle+
" class='label label-wrap'>"+data.value+"</span>";case UI_BUTTON:return"<button id='btn"+id+"' "+elementStyle+
" onmousedown='buttonclick("+id+", true)'"+
" onmouseup='buttonclick("+id+", false)'>"+
data.value+"</button>";case UI_SWITCHER:return"<label id='sl"+id+"' "+elementStyle+
" class='switch "+(data.value=="1"?"checked":"")+
(data.hasOwnProperty('vertical')?" vert-switcher ":"")+
"'>"+
"<div class='in'>"+
"<input type='checkbox' id='s"+id+"' onClick='switcher("+id+",null)' "+
(data.value=="1"?"checked":"")+"/></div></label>";case UI_CPAD:case UI_PAD:return"<nav class='control'><ul>"+
"<li><a onmousedown='padclick(UP, "+id+", true)' "+
"onmouseup='padclick(UP, "+id+", false)' id='pf"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(RIGHT, "+id+", true)' "+
"onmouseup='padclick(RIGHT, "+id+", false)' id='pr"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(LEFT, "+id+", true)' "+
"onmouseup='padclick(LEFT, "+id+", false)' id='pl"+id+"'>&#9650;</a></li>"+
"<li><a onmousedown='padclick(DOWN, "+id+", true)' "+
"onmouseup='padclick(DOWN, "+id+", false)' id='pb"+id+"'>&#9650;</a></li>"+
"</ul>"+
(data.type==UI_CPAD?"<a class='confirm' onmousedown='padclick(CENTER,"+id+", true)' "+
"onmouseup='padclick(CENTER, "+id+", false)' id='pc"+id+"'>OK</a>":"")+
"</nav>";case UI_SLIDER:return"<div class='range-slider "+
(data.hasOwnProperty('vertical')?" vert-slider ":"")+
"'>"+
"<input id='sl"+id+"' type='range' min='0' max='100' value='"+data.value+"' "+
elementStyle+" class='range-slider__range'><span class='range-slider__value'>"+
data.value+"</span></div>";case UI_NUMBER:return"<input style='color:black;' "+elementStyle+" id='num"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_TEXT_INPUT:return"<input style='color:black;' "+elementStyle+" id='text"+id+
"' value='"+data.value+"' onchange='textchange("+id+")' />";case UI_SELECT:return"<select style='color:black;' "+elementStyle+" id='select"+id+
"' onchange='selectchange("+id+")' />";case UI_GRAPH:return"<figure id='graph"+id+"'><figcaption>"+data.label+"</figcaption></figure>";case UI_GAUGE:return"WILL BE A GAUGE <input style='color:black;' id='gauge"+id+
"' type='number' value='"+data.value+"' onchange='numberchange("+id+")' />";case UI_ACCEL:return"ACCEL // Not implemented fully!<div class='accelerometer' id='accel"+id+
"' ><div class='ball"+id+"'></div><pre class='accelerometeroutput"+id+"'></pre>";default:return"";}}
var processEnabled=function(data){switch(data.type){case UI_SWITCHER:case UPDATE_SWITCHER:if(data.enabled){$("#sl"+data.id).removeClass('disabled');$("#s"+data.id).prop("disabled",false);}else{$("#sl"+data.id).addClass('disabled');$("#s"+data.id).prop("disabled",true);}
break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+data.id).prop("disabled",!data.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+data.id).prop("disabled",!data.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+data.id).prop("disabled",!data.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+data.id).prop("disabled",!data.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+data.id).prop("disabled",!data.enabled);break;}}
)=====";
const uint8_t JS_CONTROLS_GZIP[4099] PROGMEM = { 31,139,8,0,66,80,248,97,2,255,197,91,91,119,218,72,18,126,247,175,144,149,57,65,172,177,129,220,38,1,203,57,4,147,132,29,108,188,6,79,230,108,38,235,35,68,99,116,44,36,141,36,140,61,14,255,125,171,171,187,165,110,73,92,130,103,118,95,98,84,42,85,127,93,213,221,117,235,216,190,23,197,218,85,247,186,123,222,29,118,91,189,235,79,87,93,243,69,173,214,180,197,139,203,78,175,223,58,5,90,93,208,46,78,91,195,206,117,255,227,199,65,103,104,214,101,222,206,111,195,206,249,41,147,81,151,232,195,238,176,211,51,37,194,5,72,204,200,67,82,58,72,247,186,77,41,47,84,166,54,227,122,145,114,125,184,26,14,251,231,230,75,149,143,83,235,181,151,41,103,175,245,1,64,188,82,25,25,177,94,123,149,242,13,190,116,135,237,207,157,75,243,181,202,154,208,235,181,215,18,119,175,123,10,180,55,25,94,70,173,215,222,164,156,231,87,103,31,128,246,179,202,201,169,245,218,207,146,186,64,143,96,144,139,171,161,249,86,229,150,222,212,107,111,211,47,62,93,182,46,62,155,239,56,161,117,122,202,40,215,23,253,238,57,101,229,47,218,189,78,235,146,51,215,107,239,164,17,91,31,204,122,198,32,140,38,25,100,208,233,117,218,32,45,99,19,65,174,75,86,233,95,12,187,84,255,25,179,8,114,93,50,203,89,23,8,25,171,32,173,46,217,228,172,245,155,89,207,216,3,105,117,217,20,195,206,133,89,207,90,2,137,117,201,14,159,90,87,159,58,102,61,99,7,78,173,75,102,104,181,219,116,109,100,76,192,169,245,183,178,98,46,90,151,173,97,31,204,248,46,171,155,228,77,93,86,119,247,172,3,59,42,163,111,74,172,75,212,100,195,156,246,191,156,39,219,165,215,249,56,76,182,197,101,247,211,231,97,178,248,219,157,243,33,172,37,161,183,246,245,240,234,242,95,87,253,238,160,147,136,106,95,119,206,58,151,173,94,186,253,218,215,23,29,248,234,178,251,43,124,250,34,33,126,233,12,91,131,139,207,173,158,36,254,122,112,117,254,177,215,255,162,140,209,110,93,94,246,135,201,102,105,95,183,122,221,127,183,46,193,130,111,18,210,105,235,242,151,100,225,183,175,207,251,231,48,253,215,175,155,119,86,168,221,132,86,48,61,181,98,203,244,200,66,107,133,161,245,96,148,241,205,212,138,90,182,77,92,115,98,185,17,65,82,228,58,99,18,182,125,47,118,188,185,63,143,248,171,201,220,179,99,199,247,52,219,119,253,176,237,90,81,100,224,207,238,184,252,200,127,152,231,243,217,136,132,9,189,25,45,156,216,158,74,124,86,68,100,157,53,66,18,207,67,79,135,127,254,152,251,78,68,244,38,103,225,42,20,12,100,70,66,203,29,39,175,83,125,10,142,128,196,36,12,157,59,18,38,76,169,126,5,211,130,196,86,20,76,45,55,78,152,18,125,11,158,104,238,77,92,127,33,201,97,234,23,239,109,43,12,253,244,123,97,10,241,218,114,157,63,173,208,241,18,6,106,152,6,255,77,173,34,24,199,86,120,171,55,199,100,98,205,221,88,16,245,230,114,185,71,173,176,32,163,200,183,111,155,210,111,48,137,71,236,152,140,179,22,9,201,31,115,18,197,253,208,33,94,108,81,210,5,9,103,78,20,193,47,163,252,184,220,75,56,35,235,142,124,18,139,1,94,185,190,109,185,131,216,15,173,27,114,20,145,184,27,147,153,161,147,40,152,59,184,102,34,189,242,207,65,255,252,40,138,97,70,55,206,228,193,72,150,82,185,220,148,4,135,48,190,31,74,178,29,176,54,174,38,24,113,140,75,79,25,235,166,112,172,84,120,211,153,24,201,167,251,166,55,119,221,242,99,42,11,65,5,86,24,145,148,171,220,100,58,76,135,252,234,140,191,1,72,70,254,250,45,139,215,10,99,80,193,79,198,216,183,231,51,208,92,249,200,26,143,13,253,31,122,249,200,159,76,96,131,252,100,232,207,66,127,1,207,211,120,230,26,186,94,110,114,83,28,217,174,15,99,195,2,103,82,100,209,176,3,7,96,133,121,212,129,117,18,194,8,43,204,71,165,39,188,48,70,72,102,254,29,97,27,75,199,29,115,120,19,18,226,233,229,28,43,224,84,248,66,50,46,224,98,160,17,133,86,213,206,125,141,35,160,32,159,63,123,251,230,229,235,102,193,87,233,212,21,170,103,60,218,174,99,223,54,184,230,42,75,101,210,83,203,27,187,228,87,39,114,70,142,235,196,15,109,32,220,128,130,30,193,142,251,89,5,60,127,190,47,116,126,52,117,198,99,226,149,31,19,131,208,13,144,174,87,110,164,132,29,102,222,185,131,31,61,39,138,137,7,71,141,126,151,140,105,227,152,122,165,24,75,5,181,142,11,107,225,120,99,127,113,68,23,36,29,229,40,240,195,120,223,212,245,239,223,139,223,188,173,173,122,243,234,213,203,196,190,120,182,126,33,163,1,252,38,177,161,47,162,70,181,170,31,100,63,156,250,81,236,89,51,114,160,55,242,47,169,212,3,189,186,0,149,55,151,4,240,238,44,156,203,216,19,11,214,247,252,128,120,166,208,172,65,238,98,122,108,123,145,239,18,248,254,6,68,50,78,141,242,109,177,230,86,173,205,152,220,3,190,196,214,233,158,73,215,127,28,206,73,115,217,76,161,225,110,218,6,27,50,130,200,236,30,83,164,17,74,91,35,141,18,138,36,48,127,72,215,14,46,177,77,18,40,251,56,115,24,193,139,163,49,158,69,244,45,49,147,117,59,242,199,15,72,179,225,137,132,176,216,132,111,164,236,71,241,67,64,184,119,84,243,132,70,193,25,68,73,177,53,138,60,235,174,136,12,64,97,107,196,242,43,88,243,56,76,214,181,195,145,154,117,246,133,124,176,142,144,78,69,135,190,27,29,77,252,176,99,1,120,226,18,58,61,243,4,207,122,240,100,247,76,117,143,148,189,145,113,29,156,185,92,89,54,37,53,27,201,87,96,131,20,106,236,199,150,43,198,59,49,212,225,93,226,221,196,211,195,122,57,217,124,224,188,60,56,187,231,142,127,11,219,106,37,59,76,100,20,18,235,182,41,84,157,102,83,141,255,239,12,153,222,233,113,7,91,154,220,31,236,52,227,109,190,207,235,128,101,159,141,236,89,18,18,215,183,198,176,51,84,110,204,51,27,201,194,142,157,216,37,108,213,184,214,136,184,184,12,103,150,227,125,38,22,172,33,177,10,83,134,172,60,204,14,27,226,137,165,106,201,99,154,139,37,36,150,10,37,143,152,83,72,47,121,46,208,16,90,70,247,224,146,50,28,95,67,255,243,240,172,103,176,253,169,130,96,185,108,238,163,199,236,87,116,114,163,216,211,15,144,13,98,28,116,140,177,63,183,167,168,251,70,122,102,148,31,201,81,16,18,106,246,83,22,227,81,85,206,227,152,30,119,224,72,13,46,162,66,79,67,48,74,5,165,128,77,119,145,193,125,219,146,121,101,117,110,34,167,222,60,59,118,34,129,83,21,98,25,187,229,34,192,140,88,90,38,72,244,78,127,111,165,188,96,178,179,238,2,107,204,38,125,117,81,217,85,119,69,50,100,221,33,68,247,233,16,105,2,249,116,144,138,148,28,204,240,233,48,49,181,125,58,78,85,76,14,232,232,233,64,105,118,254,116,156,138,148,28,76,251,233,48,89,113,224,233,64,51,114,214,238,110,172,130,109,222,124,33,141,129,7,232,215,141,253,92,28,144,19,59,108,125,200,203,84,3,15,43,8,208,3,29,187,206,201,177,165,249,222,12,36,145,121,96,150,128,135,205,35,209,232,129,94,46,105,211,144,76,204,18,149,32,209,75,39,252,1,143,153,3,253,184,106,157,28,87,65,100,97,68,147,140,57,118,238,52,103,140,67,41,194,142,171,240,134,126,75,191,51,65,192,145,42,0,158,70,100,220,102,207,6,228,191,126,208,160,102,90,150,49,110,51,116,43,112,216,200,22,112,79,28,23,130,53,35,49,27,77,83,48,197,252,201,136,167,78,4,120,226,24,82,16,58,49,189,108,154,38,68,194,116,222,135,177,127,200,206,82,72,231,113,49,233,72,215,43,242,2,160,241,4,192,49,131,208,159,5,16,50,15,173,145,22,251,26,251,144,254,50,60,172,166,104,144,190,193,154,124,207,226,184,125,58,159,35,198,4,95,24,240,8,49,129,229,146,144,138,152,90,49,149,169,141,125,18,105,158,31,107,228,30,18,37,173,241,251,239,152,12,20,172,185,130,37,197,42,136,137,249,33,178,133,47,218,44,146,96,176,25,137,170,247,89,4,49,143,29,115,27,168,172,77,246,152,26,205,15,48,169,163,118,99,63,245,131,61,97,187,61,189,164,225,18,48,75,130,202,86,4,125,33,40,108,48,66,185,79,4,13,131,10,32,28,87,153,204,19,61,63,163,179,238,182,211,113,198,69,83,57,208,53,199,11,230,49,51,1,159,86,228,252,9,9,110,249,81,204,18,151,194,204,241,116,213,109,230,176,180,126,251,251,176,208,5,162,224,161,137,133,158,3,105,221,179,120,48,3,21,19,206,44,103,118,58,185,3,104,216,185,248,31,41,23,82,254,96,131,118,177,238,190,249,52,76,10,77,95,249,250,251,102,230,42,88,194,25,52,1,1,156,150,248,98,112,119,99,228,191,173,232,72,75,253,135,186,0,51,173,130,6,110,252,200,60,179,226,233,81,232,207,97,107,208,228,30,36,194,140,105,97,108,232,204,224,87,181,94,171,213,138,144,30,5,243,104,106,60,222,55,226,168,242,208,72,181,1,59,57,83,222,219,5,185,132,91,234,100,52,10,20,246,245,219,95,60,158,104,7,80,243,137,186,116,153,189,79,202,212,88,58,216,236,236,214,22,68,51,199,131,212,164,194,108,91,14,255,210,220,133,47,56,49,52,0,234,47,188,139,208,15,224,224,125,48,74,60,243,27,196,15,46,41,149,153,171,148,5,137,5,12,175,249,10,150,191,40,134,148,4,238,107,226,114,240,57,53,253,125,173,81,255,49,104,209,147,177,177,176,99,133,44,132,166,236,212,61,22,114,92,211,18,167,161,156,5,240,149,196,88,209,97,217,235,82,173,238,127,55,37,158,122,82,89,224,120,37,97,0,108,231,53,160,74,218,5,150,148,2,99,60,68,238,227,191,8,91,70,212,78,203,128,37,227,185,64,224,169,208,114,194,118,1,199,147,250,124,206,158,69,150,231,192,34,230,174,224,85,81,187,32,79,83,235,180,37,223,200,179,177,218,7,29,242,198,154,223,144,191,72,247,89,89,187,76,128,157,227,5,139,185,123,214,65,255,23,222,153,146,211,139,253,238,160,63,192,50,154,145,246,88,88,129,43,6,111,216,208,15,194,59,44,152,103,252,134,232,158,137,226,44,150,126,13,253,202,187,245,252,133,167,209,232,135,134,207,24,243,234,226,163,229,94,82,130,131,247,39,166,40,106,61,127,158,16,143,149,11,24,16,134,132,190,77,162,168,227,89,224,111,198,220,203,228,228,200,223,40,194,148,146,46,11,139,68,93,49,123,22,174,52,85,96,121,196,85,12,37,127,86,96,165,244,3,25,106,86,44,247,161,37,22,60,82,150,175,9,237,91,121,47,55,78,52,245,23,96,35,26,42,230,95,78,225,140,55,178,138,49,77,197,103,64,230,203,166,174,54,188,152,127,56,76,26,193,188,13,125,200,27,191,226,49,237,242,10,74,218,210,21,148,164,129,43,8,172,99,43,158,146,6,45,157,5,17,93,37,21,134,126,32,117,185,121,37,21,158,203,34,72,46,156,66,138,93,128,150,208,202,48,19,124,28,216,58,68,43,113,236,173,88,147,52,231,197,100,255,144,187,220,107,124,130,108,150,208,122,182,148,203,242,36,246,107,237,27,143,37,212,172,150,57,113,122,58,50,170,71,207,68,30,18,21,114,178,100,82,106,196,204,0,158,117,67,76,169,22,46,247,12,25,62,214,181,227,185,46,219,27,32,207,20,46,157,211,241,68,203,30,13,145,139,35,195,177,0,127,241,120,224,220,205,31,86,130,26,184,100,53,195,211,228,4,57,27,102,13,114,116,251,235,160,123,171,144,75,163,80,39,180,102,12,230,190,215,13,18,111,51,136,168,213,20,14,65,171,43,107,71,176,70,91,140,193,188,249,58,67,115,119,191,214,216,91,12,36,151,198,217,235,138,19,141,193,19,224,225,198,127,170,98,71,148,38,73,163,219,91,203,176,204,131,226,225,146,122,29,61,230,42,153,1,121,123,79,234,236,177,170,94,99,21,146,192,222,12,37,176,21,44,138,131,93,45,120,178,133,224,201,42,193,180,104,186,90,244,22,234,11,70,171,68,211,250,246,106,209,238,22,162,221,85,162,177,36,189,90,118,184,133,236,176,64,182,114,55,65,100,101,220,240,17,100,154,4,23,26,254,50,249,165,21,90,146,201,30,102,224,132,69,47,125,74,236,91,218,37,207,246,245,34,11,70,185,35,234,153,166,8,145,26,242,66,136,122,103,64,72,114,188,141,178,212,187,39,169,56,148,167,165,83,170,167,185,214,58,24,89,30,112,85,65,250,94,212,197,51,178,107,121,217,43,96,109,16,47,202,229,236,34,149,84,248,78,59,250,78,116,234,68,118,72,98,94,135,69,38,115,165,215,144,238,197,217,35,83,242,30,138,11,83,93,9,4,70,116,2,129,107,217,196,168,254,231,247,211,131,234,77,69,71,47,201,138,241,216,100,192,202,87,163,192,31,201,222,150,82,184,35,90,46,121,41,127,165,35,91,241,33,141,43,85,128,182,229,186,35,203,190,29,16,8,141,247,77,157,90,69,103,235,85,86,143,248,40,69,43,20,177,20,235,77,102,97,186,80,120,246,86,143,91,225,163,54,151,75,113,3,35,169,229,164,122,198,208,230,49,141,103,205,141,1,242,123,93,195,80,152,22,147,51,193,240,1,173,39,55,116,189,137,164,5,192,44,22,71,223,80,65,244,47,242,83,197,172,24,88,170,102,150,202,223,191,39,174,179,160,38,202,59,241,39,53,165,58,186,141,220,247,235,196,166,247,68,216,53,22,176,254,250,59,38,106,219,157,167,202,185,150,241,202,102,111,166,253,180,123,251,30,171,139,197,205,124,150,68,178,169,36,13,31,41,223,64,75,30,200,150,213,108,122,84,152,165,120,225,211,107,170,243,153,23,9,14,106,70,202,96,133,99,45,102,151,112,104,91,161,56,188,198,78,210,244,181,104,77,177,22,131,126,92,5,210,241,52,172,210,222,3,15,212,211,162,35,182,32,176,249,148,169,105,166,119,18,118,153,74,196,46,236,161,72,49,39,218,51,131,209,214,0,44,70,130,217,183,200,129,213,230,12,133,38,182,243,86,85,251,108,119,39,167,143,228,0,150,222,100,183,52,125,13,154,224,74,144,185,215,236,115,181,102,145,219,233,242,235,100,175,111,218,7,252,246,237,113,4,38,64,219,128,119,17,86,81,4,238,37,134,65,157,107,248,239,225,34,180,130,124,35,147,10,59,209,179,119,76,196,80,44,86,197,193,176,96,180,106,56,222,87,165,1,11,112,74,1,46,251,164,162,161,55,165,77,51,93,238,193,22,113,50,199,88,58,81,27,108,128,148,49,75,88,147,3,64,160,101,179,165,96,163,205,170,225,45,76,113,43,73,20,170,235,250,251,196,73,131,81,96,199,172,40,73,192,31,7,188,4,26,151,62,28,138,80,75,227,223,233,124,7,208,157,196,199,116,60,78,67,31,133,149,31,179,132,163,141,252,251,18,67,46,128,251,94,155,234,69,0,165,183,72,153,134,48,98,195,118,227,6,228,186,216,98,199,85,212,140,164,186,220,81,41,84,232,89,9,88,126,45,11,14,153,185,203,80,43,61,116,102,107,249,174,138,166,26,155,34,212,37,99,23,178,114,107,227,212,233,181,27,214,32,127,254,236,221,155,215,181,102,218,102,223,52,58,187,220,177,45,128,12,183,130,33,220,25,3,94,132,217,22,130,202,172,32,112,119,70,128,87,71,182,69,160,50,43,8,70,107,17,84,217,114,80,106,103,108,69,189,215,1,90,186,122,38,78,56,43,173,128,202,47,143,108,137,149,115,23,163,181,5,218,254,47,20,168,216,125,199,85,88,203,242,105,193,130,0,177,208,165,93,41,71,211,233,182,218,98,195,243,47,212,237,206,182,182,122,8,177,141,142,227,148,180,153,3,138,168,193,95,235,222,44,213,107,53,233,74,129,124,224,161,54,84,63,81,4,152,135,255,176,75,209,45,20,114,160,196,130,19,21,207,126,225,133,51,209,145,208,19,155,14,247,94,24,120,52,70,144,45,220,54,115,71,171,142,147,198,162,18,191,42,193,166,205,18,160,149,179,132,243,31,163,113,193,200,243,20,166,58,176,113,85,194,38,133,106,187,226,99,5,169,236,93,142,85,144,164,234,86,33,32,30,40,38,158,25,75,68,63,128,70,212,148,56,158,116,96,165,26,85,56,52,11,74,197,200,19,231,102,30,18,148,201,155,215,252,170,17,188,176,45,126,231,36,19,135,73,175,240,1,4,200,242,49,204,229,242,191,116,123,61,237,67,71,107,105,72,214,214,169,29,49,176,246,204,223,181,14,88,208,205,177,225,131,86,165,255,121,4,246,221,44,96,90,38,99,109,2,142,242,97,95,222,233,22,109,207,147,208,159,209,146,55,67,138,164,4,233,137,204,61,130,28,48,209,35,115,164,1,232,184,72,150,63,143,233,229,144,132,57,64,85,174,250,111,83,106,81,60,27,111,174,14,3,51,25,79,166,1,47,218,25,132,137,45,104,56,203,149,138,210,216,137,144,175,196,75,21,18,31,43,85,8,134,180,86,193,243,232,108,27,91,212,86,126,68,36,175,174,20,223,19,220,166,135,159,21,184,175,204,61,147,83,40,25,223,134,70,250,15,9,206,229,142,219,180,195,127,104,4,37,21,221,220,207,254,33,217,74,66,189,161,29,189,149,224,229,242,191,215,242,208,35,71,62,0,0 };