1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-06-14 14:33:34 +00:00
ESPUI/src/dataControlsJS.h
Ian Gray 576890e033 Dynamic visibility support
The ability to make controls visible and invisible
was basically already supported, we just need to add
some minor handling in controls.js.
2022-01-28 20:31:25 +00:00

102 lines
29 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>=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));}}
$(".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"";}}
)=====";
const uint8_t JS_CONTROLS_GZIP[3973] PROGMEM = { 31,139,8,0,94,78,244,97,2,255,197,91,235,119,218,198,18,255,238,191,66,86,122,130,184,198,60,242,106,2,150,115,8,38,9,45,54,190,6,55,61,55,205,245,17,176,24,29,11,73,149,132,177,235,240,191,223,217,217,135,118,133,192,20,183,189,95,98,52,59,154,253,237,204,238,206,75,25,5,126,156,24,151,157,171,206,89,103,208,105,118,175,62,93,118,236,23,213,106,99,36,6,46,218,221,94,243,4,104,53,65,59,63,105,14,218,87,189,143,31,251,237,129,93,83,121,219,191,14,218,103,39,76,70,77,161,15,58,131,118,215,86,8,231,32,49,35,15,73,233,36,157,171,22,165,188,208,153,90,140,235,69,202,245,225,114,48,232,157,217,47,117,62,78,173,85,95,166,156,221,230,7,0,241,74,103,100,196,90,245,85,202,215,255,210,25,180,62,183,47,236,215,58,171,164,215,170,175,21,238,110,231,4,104,111,50,188,140,90,171,190,73,57,207,46,79,63,0,237,71,157,147,83,107,213,31,21,117,129,30,193,32,231,151,3,251,173,206,173,140,212,170,111,211,55,62,93,52,207,63,219,239,56,161,121,114,194,40,87,231,189,206,25,101,229,3,173,110,187,121,193,153,107,213,119,202,140,205,15,118,45,99,16,70,83,12,210,111,119,219,45,144,150,177,137,32,215,20,171,244,206,7,29,170,255,140,89,4,185,166,152,229,180,3,132,140,85,144,86,83,108,114,218,252,213,174,101,236,129,180,154,106,138,65,251,220,174,101,45,129,196,154,98,135,79,205,203,79,109,187,150,177,3,167,214,20,51,52,91,45,186,55,50,38,224,212,218,91,85,49,231,205,139,230,160,7,102,124,151,213,141,28,169,169,234,238,156,182,225,68,101,244,77,137,53,133,42,15,204,73,239,203,153,60,46,221,246,199,129,60,22,23,157,79,159,7,114,243,183,218,103,3,216,75,66,111,173,171,193,229,197,191,47,123,157,126,91,138,106,93,181,79,219,23,205,110,122,252,90,87,231,109,120,235,162,243,11,188,250,66,18,191,180,7,205,254,249,231,102,87,17,127,213,191,60,251,216,237,125,209,230,104,53,47,46,122,3,121,88,90,87,205,110,231,63,205,11,176,224,27,73,58,105,94,252,44,55,126,235,234,172,119,6,203,127,253,186,113,235,68,198,117,228,132,211,19,39,113,108,159,44,140,102,20,57,247,86,17,71,166,78,220,28,141,136,103,79,28,47,38,72,138,61,119,76,162,86,224,39,174,63,15,230,49,31,154,204,253,81,226,6,190,49,10,188,32,106,121,78,28,91,248,179,51,46,62,240,31,246,217,124,54,36,145,164,55,226,133,155,140,166,10,159,19,19,85,103,245,136,36,243,200,55,225,159,223,231,129,27,19,179,193,89,184,10,5,3,153,145,200,241,198,114,56,213,167,224,8,73,66,162,200,189,37,145,100,74,245,43,152,22,36,113,226,112,234,120,137,100,146,250,22,60,241,220,159,120,193,66,145,195,212,47,198,71,78,20,5,233,251,194,20,98,216,241,220,63,156,200,245,37,3,53,76,157,255,166,86,17,140,99,39,186,49,27,99,50,113,230,94,34,136,102,99,185,220,163,86,88,144,97,28,140,110,26,202,111,48,137,79,70,9,25,103,45,18,145,223,231,36,78,122,145,75,252,196,161,164,115,18,205,220,56,134,95,86,241,97,185,39,57,99,231,150,124,18,155,1,134,188,96,228,120,253,36,136,156,107,82,142,73,210,73,200,204,50,73,28,206,93,220,51,177,89,250,169,223,59,43,199,9,172,232,218,157,220,91,114,43,21,139,13,69,112,4,243,7,145,34,219,5,107,227,110,130,25,199,184,245,180,185,174,115,231,74,133,55,220,137,37,95,221,183,253,185,231,21,31,82,89,8,42,116,162,152,164,92,197,6,211,97,58,229,87,119,252,13,64,50,242,215,111,89,188,78,148,128,10,126,176,198,193,104,62,3,205,21,203,206,120,108,153,255,50,139,229,96,50,129,3,242,131,101,62,139,130,5,60,79,147,153,103,153,102,177,193,77,81,30,121,1,204,13,27,156,73,81,69,195,9,236,131,21,230,113,27,246,73,4,51,172,49,31,149,46,121,97,142,136,204,130,91,194,14,150,137,39,230,240,58,34,196,55,139,43,172,128,83,227,139,200,56,135,139,129,70,20,70,197,56,11,12,142,128,130,124,254,236,237,155,151,175,27,57,111,165,75,215,168,190,245,48,242,220,209,77,157,107,174,180,212,22,61,117,252,177,71,126,113,99,119,232,122,110,114,223,2,194,53,40,232,1,236,184,159,85,192,243,231,251,66,231,229,169,59,30,19,191,248,32,13,66,15,64,186,95,185,145,36,59,172,188,125,11,63,186,110,156,16,31,174,26,243,86,206,57,194,57,205,82,62,150,18,106,29,55,214,194,245,199,193,162,76,55,36,157,165,28,6,81,178,111,155,230,247,239,249,35,111,171,235,70,94,189,122,41,237,139,119,235,23,50,236,195,111,146,88,230,34,174,87,42,230,65,246,197,105,16,39,190,51,35,7,102,125,117,144,74,61,48,43,11,80,121,99,73,0,239,206,194,185,140,61,177,97,3,63,8,137,111,11,205,90,228,54,161,215,182,31,7,30,129,247,175,65,36,227,52,40,223,22,123,110,221,222,76,200,29,224,147,182,78,207,76,186,255,147,104,78,26,203,70,10,13,79,211,54,216,144,17,68,102,207,152,38,141,80,218,6,105,148,144,39,129,249,67,186,119,112,139,61,38,129,178,143,51,151,17,12,148,199,120,23,209,81,98,203,125,59,12,198,247,72,27,193,19,137,96,179,9,223,72,217,203,201,125,72,184,119,212,243,132,122,206,29,68,73,137,51,140,125,231,54,143,12,64,225,104,36,234,16,236,121,156,38,235,218,225,74,205,58,251,92,62,216,71,72,167,162,163,192,139,203,147,32,106,59,0,158,120,132,46,207,62,198,187,30,60,217,29,83,221,3,101,175,103,92,7,103,46,150,150,13,69,205,150,124,11,108,144,66,77,130,196,241,196,124,199,150,62,189,71,252,235,100,122,88,43,202,195,7,206,203,135,187,123,238,6,55,112,172,214,178,195,66,134,17,113,110,26,66,213,105,54,85,255,255,174,144,233,157,94,119,112,164,201,221,193,78,43,222,230,253,85,29,176,236,179,158,189,75,34,226,5,206,24,78,134,206,141,121,102,93,110,236,196,77,60,194,118,141,231,12,137,135,219,112,230,184,254,103,226,192,30,18,187,48,101,200,202,195,236,176,46,158,88,170,38,31,211,92,76,146,88,42,36,31,49,167,80,6,121,46,80,23,90,70,247,224,145,34,92,95,131,224,243,224,180,107,177,243,169,131,96,185,236,202,75,15,217,183,232,226,134,137,111,30,32,27,196,56,232,24,147,96,62,154,162,238,235,233,157,81,124,32,229,48,34,212,236,39,44,198,163,170,156,39,9,189,238,192,145,90,92,68,137,222,134,96,148,18,74,1,155,238,34,131,251,182,37,243,202,250,218,68,78,253,248,234,216,141,4,78,85,136,101,236,142,135,0,51,98,105,153,64,234,157,254,222,74,121,225,100,103,221,133,206,152,45,250,242,188,180,171,238,242,100,168,186,67,136,222,211,33,210,4,242,233,32,53,41,43,48,163,167,195,196,212,246,233,56,117,49,43,64,135,79,7,74,179,243,167,227,212,164,172,192,28,61,29,38,43,14,60,29,104,70,206,198,211,141,85,176,199,15,95,68,99,224,62,250,117,107,127,37,14,88,17,59,104,126,88,149,169,7,30,78,24,162,7,58,242,220,227,35,199,8,252,25,72,34,243,208,46,0,15,91,135,212,232,129,89,44,24,211,136,76,236,2,149,160,208,11,199,252,1,175,153,3,243,168,226,28,31,85,64,100,110,68,35,231,28,187,183,134,59,198,169,52,97,71,21,24,161,239,210,247,108,16,80,214,5,192,211,144,140,91,236,217,130,252,55,8,235,212,76,203,34,198,109,150,233,132,46,155,217,1,238,137,235,65,176,102,73,179,209,52,5,83,204,31,172,100,234,198,128,39,73,32,5,161,11,51,139,182,109,67,36,76,215,125,152,4,135,236,46,133,116,30,55,147,137,116,179,164,110,0,26,79,0,28,59,140,130,89,8,33,243,192,25,26,73,96,176,23,233,47,203,199,106,138,1,233,27,236,201,247,44,142,219,167,235,41,51,38,120,195,130,71,136,9,28,143,68,84,196,212,73,168,76,99,28,144,216,240,131,196,32,119,144,40,25,245,223,126,195,100,32,103,207,229,108,41,86,65,148,230,135,200,22,222,104,177,72,130,193,102,36,170,222,103,49,196,60,163,132,219,64,103,109,176,199,212,104,65,136,73,29,181,27,251,105,30,236,9,219,237,153,5,3,183,128,93,16,84,182,35,232,128,160,176,201,8,229,62,22,52,12,42,128,112,84,97,50,143,205,213,21,157,118,182,93,142,59,206,91,202,129,105,184,126,56,79,152,9,248,178,98,247,15,72,112,139,15,98,149,184,21,102,174,111,234,110,115,5,75,243,215,191,15,11,221,32,26,30,154,88,152,43,32,157,59,22,15,102,160,98,194,153,229,204,46,103,229,2,26,180,207,255,33,229,66,202,31,62,162,93,172,187,63,126,27,202,66,211,87,190,255,190,217,43,21,44,225,12,26,128,0,110,75,28,232,223,94,91,171,239,150,76,164,165,254,67,223,128,153,86,65,29,15,126,108,159,58,201,180,28,5,115,56,26,52,185,7,137,176,98,90,24,27,184,51,248,85,169,85,171,213,60,164,229,112,30,79,173,135,187,122,18,151,238,235,169,54,224,36,103,202,123,187,32,87,112,43,157,140,122,142,194,190,126,251,139,231,19,237,0,106,62,81,151,46,178,113,89,166,198,210,193,227,206,110,99,65,52,115,61,40,77,42,204,182,213,240,47,205,93,248,134,19,83,3,160,222,194,63,143,130,16,46,222,123,171,192,51,191,126,114,239,145,66,145,185,74,85,144,216,192,48,204,119,176,250,70,62,36,25,184,111,136,203,193,231,84,205,247,213,122,237,207,65,139,159,140,141,133,29,107,100,33,52,237,164,238,177,144,227,138,150,56,45,237,46,128,183,20,198,146,9,219,222,84,106,117,255,220,146,120,234,73,101,129,227,85,132,1,176,157,247,128,46,105,23,88,74,10,140,241,16,185,75,254,34,108,25,81,59,109,3,150,140,175,4,2,79,133,182,34,108,23,112,60,169,95,205,217,179,200,86,57,176,136,185,43,120,93,212,46,200,211,212,58,109,201,215,87,217,88,237,131,78,121,237,204,175,201,95,164,251,172,172,93,22,192,238,241,156,205,220,57,109,163,255,139,110,109,197,233,37,65,167,223,235,99,25,205,74,123,44,172,192,149,128,55,172,155,7,209,45,22,204,51,126,67,116,207,68,113,22,75,191,150,121,233,223,248,193,194,55,104,244,67,195,103,140,121,77,241,210,114,79,150,224,96,252,216,214,62,182,120,254,92,142,28,233,165,88,22,206,136,122,96,246,14,91,171,226,208,241,137,167,41,88,125,45,71,187,233,11,69,5,106,86,44,247,125,5,22,244,81,150,175,146,246,173,184,183,50,79,60,13,22,160,91,26,226,173,14,78,225,110,182,138,25,197,216,182,118,215,67,198,202,150,174,55,170,216,189,126,40,27,184,188,125,124,200,27,182,226,49,237,206,10,74,218,138,21,20,217,120,21,4,214,105,21,79,178,177,74,87,65,68,55,72,135,97,30,40,221,105,94,1,133,231,162,8,110,115,151,144,98,23,160,21,180,42,76,137,143,3,219,132,104,45,142,37,85,127,25,211,241,67,238,20,175,240,9,242,77,66,43,206,74,182,201,211,204,175,213,111,220,219,235,121,39,115,179,244,254,98,84,159,222,90,60,104,201,229,100,233,158,210,42,153,145,56,118,174,137,173,84,171,213,174,30,195,199,250,106,60,27,101,167,0,228,217,194,233,114,58,222,57,217,195,27,123,56,51,28,92,248,139,7,152,115,55,254,180,18,244,208,34,171,25,158,200,74,228,108,154,13,200,209,49,111,130,238,175,67,174,204,66,221,196,134,57,152,131,221,52,73,178,205,36,162,154,146,59,5,173,127,108,156,193,25,110,49,7,243,183,155,12,205,29,242,70,99,111,49,145,90,188,102,195,37,55,30,195,93,141,215,24,255,169,139,29,82,154,34,141,30,100,35,195,50,15,243,167,147,21,53,122,161,149,50,19,242,6,156,210,123,99,117,183,250,58,36,225,232,113,40,225,72,195,162,185,192,245,130,39,91,8,158,172,19,76,203,154,235,69,111,161,190,112,184,78,52,173,64,175,23,237,109,33,218,91,39,26,139,198,235,101,71,91,200,142,114,100,107,95,15,136,188,137,27,62,134,92,144,224,70,195,95,54,255,172,132,22,77,178,151,25,184,91,209,237,158,146,209,13,237,99,103,59,111,177,3,179,220,18,253,78,211,132,40,45,115,33,68,239,234,11,73,174,255,168,44,253,235,144,84,28,202,51,210,37,213,210,108,104,19,140,44,79,8,129,69,58,46,42,215,25,217,213,85,217,107,96,61,34,94,20,180,217,167,78,74,105,58,237,185,187,241,137,27,143,34,146,240,74,41,50,217,107,189,134,242,229,218,104,104,43,222,67,115,97,186,43,129,16,136,46,32,244,156,17,177,42,255,253,237,228,160,114,93,50,209,75,178,114,57,182,1,176,54,85,207,241,71,170,183,165,20,238,136,150,75,94,108,95,235,200,214,188,72,35,72,29,224,200,241,188,161,51,186,233,19,8,94,247,109,147,90,197,100,251,85,85,143,120,41,69,43,20,177,20,251,77,101,97,186,208,120,246,214,207,91,226,179,54,150,75,241,141,132,172,182,164,122,198,178,203,67,26,185,218,143,134,194,239,77,3,131,94,90,238,205,132,189,7,180,226,91,55,205,6,146,22,0,51,95,28,29,161,130,232,95,228,167,138,89,51,177,82,111,44,20,191,127,151,174,51,167,106,201,123,229,199,85,173,126,185,141,220,247,155,196,166,95,114,176,15,77,192,250,155,191,2,209,27,227,60,153,93,105,234,174,109,199,102,26,68,187,55,216,177,254,151,223,110,103,105,30,91,138,108,201,40,153,5,90,242,64,181,172,49,162,87,133,93,72,22,1,253,144,116,62,243,99,193,65,205,72,25,156,104,108,36,236,51,25,90,248,207,15,164,177,215,51,125,45,154,71,172,9,96,30,85,128,116,52,141,42,180,59,192,67,242,180,44,136,77,2,108,15,101,170,142,233,87,3,187,44,37,102,159,212,161,72,177,38,218,213,130,217,54,0,204,71,130,249,177,200,82,245,246,9,133,38,142,243,86,117,245,108,255,101,69,31,242,2,86,70,178,71,154,14,131,38,184,18,84,238,13,231,92,175,42,172,156,116,117,88,158,245,199,206,1,255,62,246,40,6,19,160,109,192,187,8,171,104,2,247,164,97,80,231,6,254,123,184,136,156,112,181,213,72,133,29,155,217,175,64,196,84,44,86,197,201,176,164,179,110,58,222,249,164,1,11,112,42,1,46,123,165,100,160,55,165,109,45,83,237,146,230,113,50,199,88,56,214,91,96,128,148,49,43,88,229,5,32,208,178,213,82,176,241,227,170,225,77,70,241,221,144,40,37,215,204,247,210,73,131,81,224,196,172,41,62,192,31,23,188,4,26,151,62,28,138,80,203,224,239,153,252,4,208,147,196,231,116,125,78,67,31,133,181,25,187,128,179,13,131,187,2,67,46,128,7,126,139,234,69,0,165,223,121,50,13,97,196,134,13,193,71,144,155,226,136,29,85,80,51,138,234,86,174,74,161,66,223,145,96,249,135,83,112,201,204,61,134,90,235,114,51,91,171,95,147,24,186,177,41,66,83,49,118,46,43,183,54,46,157,126,24,195,90,216,207,159,189,123,243,186,218,72,27,225,143,205,206,62,191,216,22,64,134,91,195,16,237,140,1,63,85,217,22,130,206,172,33,240,118,70,128,31,119,108,139,64,103,214,16,12,55,34,168,176,237,160,85,201,216,142,122,111,2,180,116,247,76,220,104,86,88,3,149,127,222,177,37,86,206,157,143,118,36,208,246,126,166,64,197,233,59,170,192,94,86,111,11,22,4,136,141,174,156,74,53,154,78,143,213,22,7,158,191,161,31,119,118,180,245,75,136,29,116,156,167,96,204,92,80,68,21,254,58,119,118,161,86,173,42,77,127,245,194,67,109,232,126,34,15,48,15,255,225,148,162,91,200,229,64,137,57,55,42,222,253,194,11,103,162,35,161,39,182,28,238,189,48,240,168,15,33,91,184,105,172,92,173,38,46,26,139,74,252,99,6,182,108,150,0,173,93,37,220,255,24,141,11,70,158,167,48,213,129,141,43,10,54,37,84,219,21,31,43,72,101,191,182,88,7,73,169,110,229,2,226,129,162,244,204,88,34,250,19,104,68,77,137,227,73,39,214,170,81,185,83,179,160,84,204,60,113,175,231,17,65,153,188,189,204,63,6,130,129,145,195,191,10,201,196,97,202,16,62,128,0,85,62,134,185,92,254,151,78,183,107,124,104,27,77,3,201,198,38,181,35,6,214,64,249,187,246,1,11,186,57,54,124,48,42,244,191,119,192,185,155,133,76,203,100,108,76,192,81,222,239,171,39,221,161,13,116,18,5,51,90,220,102,72,145,36,145,30,171,220,67,200,1,165,30,153,35,13,65,199,121,178,130,121,66,63,223,144,204,33,170,50,231,63,54,253,15,18,205,77,92,9,59,0,0 };