diff --git a/CPU-20161109T234632.cpuprofile b/CPU-20161109T234632.cpuprofile new file mode 100644 index 0000000..fc016a3 --- /dev/null +++ b/CPU-20161109T234632.cpuprofile @@ -0,0 +1 @@ +{"nodes":[{"id":1,"callFrame":{"functionName":"(root)","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[2,3,11,32,58,96,102,157,185]},{"id":2,"callFrame":{"functionName":"(program)","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3087},{"id":3,"callFrame":{"functionName":"update","scriptId":"76","url":"http://localhost:10565/js/framework.js","lineNumber":33,"columnNumber":25},"hitCount":1,"children":[4,6,14,19,22],"positionTicks":[{"line":36,"ticks":1}]},{"id":4,"callFrame":{"functionName":"end","scriptId":"70","url":"http://localhost:10565/lib/stats.min.js","lineNumber":3,"columnNumber":370},"hitCount":54,"children":[5],"positionTicks":[{"line":4,"ticks":3},{"line":5,"ticks":51}]},{"id":5,"callFrame":{"functionName":"p","scriptId":"70","url":"http://localhost:10565/lib/stats.min.js","lineNumber":-1,"columnNumber":-1},"hitCount":21,"children":[15],"positionTicks":[{"line":5,"ticks":21}]},{"id":15,"callFrame":{"functionName":"appendChild","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":21,"positionTicks":[{"line":5,"ticks":21}]},{"id":6,"callFrame":{"functionName":"render","scriptId":"76","url":"http://localhost:10565/js/framework.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[7,175]},{"id":7,"callFrame":{"functionName":"R.deferredRender","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":4,"columnNumber":31},"hitCount":6,"children":[8,34,42],"positionTicks":[{"line":33,"ticks":1},{"line":19,"ticks":1},{"line":23,"ticks":4}]},{"id":8,"callFrame":{"functionName":"R.pass_deferred.render","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":112,"columnNumber":37},"hitCount":30,"children":[9,10,13,17,21,30,41,51,57,167,168,174,190],"positionTicks":[{"line":152,"ticks":1},{"line":193,"ticks":2},{"line":115,"ticks":17},{"line":156,"ticks":3},{"line":157,"ticks":5},{"line":150,"ticks":2}]},{"id":9,"callFrame":{"functionName":"bindTexturesForLightPass","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":-1,"columnNumber":-1},"hitCount":22,"children":[12,16,18,183],"positionTicks":[{"line":115,"ticks":16},{"line":134,"ticks":6}]},{"id":12,"callFrame":{"functionName":"activeTexture","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":7,"positionTicks":[{"line":134,"ticks":7}]},{"id":16,"callFrame":{"functionName":"bindTexture","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":5,"positionTicks":[{"line":134,"ticks":5}]},{"id":18,"callFrame":{"functionName":"uniform1i","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":134,"ticks":3}]},{"id":183,"callFrame":{"functionName":"useProgram","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":146,"ticks":1}]},{"id":10,"callFrame":{"functionName":"toArray","scriptId":"87","url":"http://localhost:10565/js/deferredRender.js","lineNumber":-1,"columnNumber":-1},"hitCount":15,"positionTicks":[{"line":115,"ticks":15}]},{"id":13,"callFrame":{"functionName":"","scriptId":"72","url":"http://localhost:10565/js/util.js","lineNumber":127,"columnNumber":19},"hitCount":54,"children":[20,29,33],"positionTicks":[{"line":149,"ticks":13},{"line":167,"ticks":1},{"line":152,"ticks":8},{"line":153,"ticks":1},{"line":154,"ticks":4},{"line":151,"ticks":15},{"line":140,"ticks":11},{"line":156,"ticks":1}]},{"id":20,"callFrame":{"functionName":"clamp","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":1695,"columnNumber":17},"hitCount":8,"positionTicks":[{"line":1700,"ticks":3},{"line":1701,"ticks":5}]},{"id":29,"callFrame":{"functionName":"divideScalar","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":2933,"columnNumber":24},"hitCount":2,"positionTicks":[{"line":2936,"ticks":2}]},{"id":33,"callFrame":{"functionName":"multiplyScalar","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":1644,"columnNumber":26},"hitCount":2,"positionTicks":[{"line":1647,"ticks":2}]},{"id":17,"callFrame":{"functionName":"uniform3fv","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":26,"positionTicks":[{"line":115,"ticks":10},{"line":156,"ticks":9},{"line":157,"ticks":7}]},{"id":21,"callFrame":{"functionName":"uniform1f","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":158,"ticks":1}]},{"id":30,"callFrame":{"functionName":"","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":283,"columnNumber":23},"hitCount":8,"children":[31,47,54,178,182],"positionTicks":[{"line":287,"ticks":1},{"line":291,"ticks":4},{"line":309,"ticks":1},{"line":295,"ticks":2}]},{"id":31,"callFrame":{"functionName":"bindBuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":10,"positionTicks":[{"line":309,"ticks":3},{"line":295,"ticks":7}]},{"id":47,"callFrame":{"functionName":"enableVertexAttribArray","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":291,"ticks":2}]},{"id":54,"callFrame":{"functionName":"vertexAttribPointer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":291,"ticks":3}]},{"id":178,"callFrame":{"functionName":"drawArrays","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":305,"ticks":3}]},{"id":182,"callFrame":{"functionName":"useProgram","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":295,"ticks":3}]},{"id":41,"callFrame":{"functionName":"bindFramebuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":118,"ticks":1}]},{"id":51,"callFrame":{"functionName":"clearDepth","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":115,"ticks":1}]},{"id":57,"callFrame":{"functionName":"uniform1i","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":115,"ticks":2}]},{"id":167,"callFrame":{"functionName":"scissor","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":115,"ticks":2}]},{"id":168,"callFrame":{"functionName":"blendFunc","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":130,"ticks":2}]},{"id":174,"callFrame":{"functionName":"clear","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":115,"ticks":2}]},{"id":190,"callFrame":{"functionName":"enable","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":143,"ticks":1}]},{"id":34,"callFrame":{"functionName":"R.pass_copy.render","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":49,"columnNumber":33},"hitCount":0,"children":[35,44,48,52]},{"id":35,"callFrame":{"functionName":"","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":283,"columnNumber":23},"hitCount":3,"children":[156,169,173,179,181],"positionTicks":[{"line":287,"ticks":3}]},{"id":156,"callFrame":{"functionName":"useProgram","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":295,"ticks":2}]},{"id":169,"callFrame":{"functionName":"vertexAttribPointer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":291,"ticks":2}]},{"id":173,"callFrame":{"functionName":"enableVertexAttribArray","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":291,"ticks":1}]},{"id":179,"callFrame":{"functionName":"bindBuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":309,"ticks":1},{"line":295,"ticks":1}]},{"id":181,"callFrame":{"functionName":"drawArrays","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":305,"ticks":3}]},{"id":44,"callFrame":{"functionName":"drawScene","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[45,171]},{"id":45,"callFrame":{"functionName":"window.readyModelForDraw","scriptId":"72","url":"http://localhost:10565/js/util.js","lineNumber":79,"columnNumber":35},"hitCount":2,"children":[46,53,170,177,180],"positionTicks":[{"line":97,"ticks":1},{"line":90,"ticks":1}]},{"id":46,"callFrame":{"functionName":"enableVertexAttribArray","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":81,"ticks":1}]},{"id":53,"callFrame":{"functionName":"vertexAttribPointer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":81,"ticks":1}]},{"id":170,"callFrame":{"functionName":"activeTexture","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":90,"ticks":2},{"line":84,"ticks":1}]},{"id":177,"callFrame":{"functionName":"bindBuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":104,"ticks":1},{"line":92,"ticks":1}]},{"id":180,"callFrame":{"functionName":"bindTexture","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":84,"ticks":1}]},{"id":171,"callFrame":{"functionName":"window.drawReadyModel","scriptId":"72","url":"http://localhost:10565/js/deferredRender.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[172]},{"id":172,"callFrame":{"functionName":"drawElements","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":53,"ticks":1}]},{"id":48,"callFrame":{"functionName":"uniformMatrix4fv","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":74,"ticks":2}]},{"id":52,"callFrame":{"functionName":"bindFramebuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":57,"ticks":2}]},{"id":42,"callFrame":{"functionName":"R.pass_post1.render","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":219,"columnNumber":34},"hitCount":2,"children":[43,49,55,188],"positionTicks":[{"line":225,"ticks":1},{"line":242,"ticks":1}]},{"id":43,"callFrame":{"functionName":"bindFramebuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":222,"ticks":1}]},{"id":49,"callFrame":{"functionName":"","scriptId":"88","url":"http://localhost:10565/js/deferredRender.js","lineNumber":283,"columnNumber":23},"hitCount":0,"children":[50,155,189]},{"id":50,"callFrame":{"functionName":"useProgram","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":295,"ticks":1}]},{"id":155,"callFrame":{"functionName":"bindBuffer","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":309,"ticks":1},{"line":295,"ticks":1}]},{"id":189,"callFrame":{"functionName":"drawArrays","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":305,"ticks":1}]},{"id":55,"callFrame":{"functionName":"clear","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":3,"positionTicks":[{"line":222,"ticks":3}]},{"id":188,"callFrame":{"functionName":"bindTexture","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":242,"ticks":2}]},{"id":175,"callFrame":{"functionName":"multiplyMatrices","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":5169,"columnNumber":28},"hitCount":1,"positionTicks":[{"line":5186,"ticks":1}]},{"id":14,"callFrame":{"functionName":"requestAnimationFrame","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":25,"positionTicks":[{"line":40,"ticks":25}]},{"id":19,"callFrame":{"functionName":"begin","scriptId":"70","url":"http://localhost:10565/lib/stats.min.js","lineNumber":3,"columnNumber":348},"hitCount":4,"positionTicks":[{"line":4,"ticks":4}]},{"id":22,"callFrame":{"functionName":"update","scriptId":"66","url":"http://localhost:10565/js/framework.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[23]},{"id":23,"callFrame":{"functionName":"","scriptId":"66","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":208,"columnNumber":19},"hitCount":2,"children":[24],"positionTicks":[{"line":213,"ticks":2}]},{"id":24,"callFrame":{"functionName":"lookAt","scriptId":"87","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[25,36]},{"id":25,"callFrame":{"functionName":"setFromRotationMatrix","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":1047,"columnNumber":33},"hitCount":1,"children":[26],"positionTicks":[{"line":1060,"ticks":1}]},{"id":26,"callFrame":{"functionName":"onQuaternionChange","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":8529,"columnNumber":28},"hitCount":2,"children":[27],"positionTicks":[{"line":8532,"ticks":2}]},{"id":27,"callFrame":{"functionName":"setFromQuaternion","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[28]},{"id":28,"callFrame":{"functionName":"setFromRotationMatrix","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":3421,"columnNumber":33},"hitCount":6,"children":[56,176],"positionTicks":[{"line":3422,"ticks":6}]},{"id":56,"callFrame":{"functionName":"atan2","scriptId":"0","url":"atan2","lineNumber":-1,"columnNumber":-1},"hitCount":1},{"id":176,"callFrame":{"functionName":"asin","scriptId":"0","url":"asin","lineNumber":-1,"columnNumber":-1},"hitCount":2},{"id":36,"callFrame":{"functionName":"lookAt","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":5108,"columnNumber":24},"hitCount":0,"children":[37]},{"id":37,"callFrame":{"functionName":"normalize","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[38]},{"id":38,"callFrame":{"functionName":"divideScalar","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[39]},{"id":39,"callFrame":{"functionName":"multiplyScalar","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[40]},{"id":40,"callFrame":{"functionName":"isFinite","scriptId":"5","url":"native v8natives.js","lineNumber":12,"columnNumber":23},"hitCount":3,"positionTicks":[{"line":13,"ticks":3}]},{"id":11,"callFrame":{"functionName":"(idle)","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":36397},{"id":32,"callFrame":{"functionName":"(garbage collector)","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":15},{"id":58,"callFrame":{"functionName":"onFocus","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":303,"columnNumber":20},"hitCount":0,"children":[59,95]},{"id":59,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":405,"columnNumber":55},"hitCount":0,"children":[60,62]},{"id":60,"callFrame":{"functionName":"normalizeArgumentsAndValidate","scriptId":"41","url":"extensions::schemaUtils","lineNumber":103,"columnNumber":38},"hitCount":0,"children":[61]},{"id":61,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":1,"deoptReason":"Bad value context for arguments value","positionTicks":[{"line":11,"ticks":1}]},{"id":62,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[63],"deoptReason":"Bad value context for arguments value"},{"id":63,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[64]},{"id":64,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":61,"columnNumber":12},"hitCount":0,"children":[65]},{"id":65,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[66],"deoptReason":"Bad value context for arguments value"},{"id":66,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[67]},{"id":67,"callFrame":{"functionName":"","scriptId":"48","url":"extensions::runtime","lineNumber":122,"columnNumber":14},"hitCount":0,"children":[68,83]},{"id":68,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":405,"columnNumber":55},"hitCount":0,"children":[69]},{"id":69,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[70],"deoptReason":"Bad value context for arguments value"},{"id":70,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[71]},{"id":71,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":61,"columnNumber":12},"hitCount":0,"children":[72]},{"id":72,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[73],"deoptReason":"Bad value context for arguments value"},{"id":73,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[74]},{"id":74,"callFrame":{"functionName":"","scriptId":"48","url":"extensions::runtime","lineNumber":137,"columnNumber":51},"hitCount":0,"children":[75,76]},{"id":75,"callFrame":{"functionName":"PostMessage","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":157,"ticks":2}]},{"id":76,"callFrame":{"functionName":"createPort","scriptId":"46","url":"extensions::messaging","lineNumber":115,"columnNumber":21},"hitCount":0,"children":[77]},{"id":77,"callFrame":{"functionName":"Port","scriptId":"46","url":"extensions::messaging","lineNumber":412,"columnNumber":15},"hitCount":0,"children":[78]},{"id":78,"callFrame":{"functionName":"privates.constructPrivate","scriptId":"43","url":"extensions::utils","lineNumber":114,"columnNumber":51},"hitCount":0,"children":[79]},{"id":79,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[80],"deoptReason":"Bad value context for arguments value"},{"id":80,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[81]},{"id":81,"callFrame":{"functionName":"PortImpl","scriptId":"46","url":"extensions::messaging","lineNumber":34,"columnNumber":19},"hitCount":0,"children":[82]},{"id":82,"callFrame":{"functionName":"Event","scriptId":"37","url":"extensions::event_bindings","lineNumber":497,"columnNumber":16},"hitCount":1,"positionTicks":[{"line":498,"ticks":1}]},{"id":83,"callFrame":{"functionName":"sendMessageImpl","scriptId":"46","url":"extensions::messaging","lineNumber":338,"columnNumber":26},"hitCount":0,"children":[84]},{"id":84,"callFrame":{"functionName":"publicClassPrototype.(anonymous function)","scriptId":"43","url":"extensions::utils","lineNumber":148,"columnNumber":43},"hitCount":0,"children":[85]},{"id":85,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[86],"deoptReason":"Bad value context for arguments value"},{"id":86,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[87,89]},{"id":87,"callFrame":{"functionName":"PortImpl.postMessage","scriptId":"46","url":"extensions::messaging","lineNumber":61,"columnNumber":43},"hitCount":0,"children":[88]},{"id":88,"callFrame":{"functionName":"PostMessage","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":81,"ticks":1}]},{"id":89,"callFrame":{"functionName":"PortImpl.disconnect","scriptId":"46","url":"extensions::messaging","lineNumber":84,"columnNumber":42},"hitCount":0,"children":[90]},{"id":90,"callFrame":{"functionName":"PortImpl.destroy_","scriptId":"46","url":"extensions::messaging","lineNumber":100,"columnNumber":40},"hitCount":0,"children":[91]},{"id":91,"callFrame":{"functionName":"EventImpl.destroy_","scriptId":"37","url":"extensions::event_bindings","lineNumber":401,"columnNumber":41},"hitCount":0,"children":[92]},{"id":92,"callFrame":{"functionName":"getStackTrace","scriptId":"38","url":"extensions::uncaught_exception_handler","lineNumber":61,"columnNumber":22},"hitCount":0,"children":[93]},{"id":93,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":1,"children":[94],"deoptReason":"Bad value context for arguments value","positionTicks":[{"line":19,"ticks":1}]},{"id":94,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1},{"id":95,"callFrame":{"functionName":"","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":691,"columnNumber":19},"hitCount":1,"positionTicks":[{"line":697,"ticks":1}]},{"id":96,"callFrame":{"functionName":"","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":277,"columnNumber":51},"hitCount":0,"children":[97]},{"id":97,"callFrame":{"functionName":"","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":290,"columnNumber":51},"hitCount":0,"children":[98]},{"id":98,"callFrame":{"functionName":"HandlerStack.bubbleEvent","scriptId":"34","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/lib/handler_stack.js","lineNumber":32,"columnNumber":49},"hitCount":1,"children":[99,184],"positionTicks":[{"line":63,"ticks":1}]},{"id":99,"callFrame":{"functionName":"InsertMode.push.focus","scriptId":"56","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/mode_insert.js","lineNumber":64,"columnNumber":25},"hitCount":0,"children":[100]},{"id":100,"callFrame":{"functionName":"HandlerStack.alwaysContinueBubbling","scriptId":"34","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/lib/handler_stack.js","lineNumber":92,"columnNumber":60},"hitCount":0,"children":[101]},{"id":101,"callFrame":{"functionName":"","scriptId":"56","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/mode_insert.js","lineNumber":65,"columnNumber":56},"hitCount":1,"positionTicks":[{"line":100,"ticks":1}]},{"id":184,"callFrame":{"functionName":"click","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":126,"columnNumber":19},"hitCount":1,"positionTicks":[{"line":127,"ticks":1}]},{"id":102,"callFrame":{"functionName":"dispatchOnMessage","scriptId":"46","url":"extensions::messaging","lineNumber":328,"columnNumber":28},"hitCount":1,"children":[103],"positionTicks":[{"line":332,"ticks":1}]},{"id":103,"callFrame":{"functionName":"publicClassPrototype.(anonymous function)","scriptId":"43","url":"extensions::utils","lineNumber":148,"columnNumber":43},"hitCount":0,"children":[104]},{"id":104,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[105],"deoptReason":"Bad value context for arguments value"},{"id":105,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[106]},{"id":106,"callFrame":{"functionName":"EventImpl.dispatch","scriptId":"37","url":"extensions::event_bindings","lineNumber":392,"columnNumber":41},"hitCount":0,"children":[107]},{"id":107,"callFrame":{"functionName":"EventImpl.dispatch_","scriptId":"37","url":"extensions::event_bindings","lineNumber":346,"columnNumber":42},"hitCount":0,"children":[108]},{"id":108,"callFrame":{"functionName":"publicClassPrototype.(anonymous function)","scriptId":"43","url":"extensions::utils","lineNumber":148,"columnNumber":43},"hitCount":0,"children":[109]},{"id":109,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[110],"deoptReason":"Bad value context for arguments value"},{"id":110,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[111]},{"id":111,"callFrame":{"functionName":"EventImpl.dispatchToListener","scriptId":"37","url":"extensions::event_bindings","lineNumber":386,"columnNumber":51},"hitCount":0,"children":[112]},{"id":112,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[113],"deoptReason":"Bad value context for arguments value"},{"id":113,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[114,121]},{"id":114,"callFrame":{"functionName":"messageListener","scriptId":"46","url":"extensions::messaging","lineNumber":172,"columnNumber":28},"hitCount":0,"children":[115]},{"id":115,"callFrame":{"functionName":"PortImpl.disconnectSoftly","scriptId":"46","url":"extensions::messaging","lineNumber":93,"columnNumber":48},"hitCount":0,"children":[116]},{"id":116,"callFrame":{"functionName":"PortImpl.destroy_","scriptId":"46","url":"extensions::messaging","lineNumber":100,"columnNumber":40},"hitCount":0,"children":[117]},{"id":117,"callFrame":{"functionName":"EventImpl.destroy_","scriptId":"37","url":"extensions::event_bindings","lineNumber":401,"columnNumber":41},"hitCount":0,"children":[118]},{"id":118,"callFrame":{"functionName":"getStackTrace","scriptId":"38","url":"extensions::uncaught_exception_handler","lineNumber":61,"columnNumber":22},"hitCount":0,"children":[119]},{"id":119,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[120],"deoptReason":"Bad value context for arguments value"},{"id":120,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2},{"id":121,"callFrame":{"functionName":"","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":367,"columnNumber":23},"hitCount":0,"children":[122]},{"id":122,"callFrame":{"functionName":"","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":682,"columnNumber":54},"hitCount":0,"children":[123]},{"id":123,"callFrame":{"functionName":"KeyHandlerMode.setPassKeys","scriptId":"58","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/mode_key_handler.js","lineNumber":18,"columnNumber":51},"hitCount":0,"children":[124]},{"id":124,"callFrame":{"functionName":"KeyHandlerMode.reset","scriptId":"58","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/mode_key_handler.js","lineNumber":27,"columnNumber":45},"hitCount":0,"children":[125]},{"id":125,"callFrame":{"functionName":"bgLog","scriptId":"61","url":"chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium_frontend.js","lineNumber":49,"columnNumber":18},"hitCount":0,"children":[126]},{"id":126,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":405,"columnNumber":55},"hitCount":1,"children":[127],"positionTicks":[{"line":406,"ticks":1}]},{"id":127,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[128],"deoptReason":"Bad value context for arguments value"},{"id":128,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[129]},{"id":129,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":61,"columnNumber":12},"hitCount":0,"children":[130]},{"id":130,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[131],"deoptReason":"Bad value context for arguments value"},{"id":131,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"children":[132],"positionTicks":[{"line":19,"ticks":1}]},{"id":132,"callFrame":{"functionName":"","scriptId":"48","url":"extensions::runtime","lineNumber":122,"columnNumber":14},"hitCount":0,"children":[133,145]},{"id":133,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":405,"columnNumber":55},"hitCount":0,"children":[134]},{"id":134,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[135],"deoptReason":"Bad value context for arguments value"},{"id":135,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[136]},{"id":136,"callFrame":{"functionName":"","scriptId":"36","url":"extensions::binding","lineNumber":61,"columnNumber":12},"hitCount":0,"children":[137]},{"id":137,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[138],"deoptReason":"Bad value context for arguments value"},{"id":138,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[139]},{"id":139,"callFrame":{"functionName":"","scriptId":"48","url":"extensions::runtime","lineNumber":137,"columnNumber":51},"hitCount":0,"children":[140,141]},{"id":140,"callFrame":{"functionName":"PostMessage","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2,"positionTicks":[{"line":157,"ticks":2}]},{"id":141,"callFrame":{"functionName":"createPort","scriptId":"46","url":"extensions::messaging","lineNumber":115,"columnNumber":21},"hitCount":0,"children":[142]},{"id":142,"callFrame":{"functionName":"Port","scriptId":"46","url":"extensions::messaging","lineNumber":412,"columnNumber":15},"hitCount":0,"children":[143]},{"id":143,"callFrame":{"functionName":"privates.constructPrivate","scriptId":"43","url":"extensions::utils","lineNumber":114,"columnNumber":51},"hitCount":0,"children":[144]},{"id":144,"callFrame":{"functionName":"PostMessage","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":1,"positionTicks":[{"line":121,"ticks":1}]},{"id":145,"callFrame":{"functionName":"sendMessageImpl","scriptId":"46","url":"extensions::messaging","lineNumber":338,"columnNumber":26},"hitCount":0,"children":[146]},{"id":146,"callFrame":{"functionName":"publicClassPrototype.(anonymous function)","scriptId":"43","url":"extensions::utils","lineNumber":148,"columnNumber":43},"hitCount":0,"children":[147]},{"id":147,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[148],"deoptReason":"Bad value context for arguments value"},{"id":148,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[149]},{"id":149,"callFrame":{"functionName":"PortImpl.disconnect","scriptId":"46","url":"extensions::messaging","lineNumber":84,"columnNumber":42},"hitCount":0,"children":[150]},{"id":150,"callFrame":{"functionName":"PortImpl.destroy_","scriptId":"46","url":"extensions::messaging","lineNumber":100,"columnNumber":40},"hitCount":0,"children":[151]},{"id":151,"callFrame":{"functionName":"EventImpl.destroy_","scriptId":"37","url":"extensions::event_bindings","lineNumber":401,"columnNumber":41},"hitCount":0,"children":[152]},{"id":152,"callFrame":{"functionName":"getStackTrace","scriptId":"38","url":"extensions::uncaught_exception_handler","lineNumber":61,"columnNumber":22},"hitCount":0,"children":[153]},{"id":153,"callFrame":{"functionName":"target.(anonymous function)","scriptId":"28","url":"extensions::SafeBuiltins","lineNumber":9,"columnNumber":35},"hitCount":0,"children":[154],"deoptReason":"Bad value context for arguments value"},{"id":154,"callFrame":{"functionName":"Apply","scriptId":"0","url":"","lineNumber":-1,"columnNumber":-1},"hitCount":2},{"id":157,"callFrame":{"functionName":"onMouseMove","scriptId":"66","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":496,"columnNumber":22},"hitCount":3,"children":[158],"positionTicks":[{"line":513,"ticks":2},{"line":516,"ticks":1}]},{"id":158,"callFrame":{"functionName":"update","scriptId":"66","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[159]},{"id":159,"callFrame":{"functionName":"","scriptId":"66","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":208,"columnNumber":19},"hitCount":1,"children":[160],"positionTicks":[{"line":233,"ticks":1}]},{"id":160,"callFrame":{"functionName":"lookAt","scriptId":"87","url":"http://localhost:10565/lib/OrbitControls.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[161,165]},{"id":161,"callFrame":{"functionName":"setFromRotationMatrix","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":1047,"columnNumber":33},"hitCount":0,"children":[162]},{"id":162,"callFrame":{"functionName":"onQuaternionChange","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":8529,"columnNumber":28},"hitCount":1,"children":[163],"positionTicks":[{"line":8532,"ticks":1}]},{"id":163,"callFrame":{"functionName":"setFromQuaternion","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":-1,"columnNumber":-1},"hitCount":0,"children":[164]},{"id":164,"callFrame":{"functionName":"setFromRotationMatrix","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":3421,"columnNumber":33},"hitCount":6,"positionTicks":[{"line":3422,"ticks":4},{"line":3543,"ticks":2}]},{"id":165,"callFrame":{"functionName":"lookAt","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":5108,"columnNumber":24},"hitCount":1,"children":[166],"positionTicks":[{"line":5121,"ticks":1}]},{"id":166,"callFrame":{"functionName":"crossVectors","scriptId":"87","url":"http://localhost:10565/lib/three.js","lineNumber":2506,"columnNumber":24},"hitCount":1,"positionTicks":[{"line":2512,"ticks":1}]},{"id":185,"callFrame":{"functionName":"pb","scriptId":"80","url":"chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/data/src/end.min.js","lineNumber":50,"columnNumber":11},"hitCount":0,"children":[186]},{"id":186,"callFrame":{"functionName":"","scriptId":"80","url":"chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/data/src/end.min.js","lineNumber":50,"columnNumber":268},"hitCount":1,"children":[187],"positionTicks":[{"line":51,"ticks":1}]},{"id":187,"callFrame":{"functionName":"H","scriptId":"80","url":"chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/data/src/end.min.js","lineNumber":6,"columnNumber":318},"hitCount":1,"positionTicks":[{"line":7,"ticks":1}]}],"startTime":202032205730,"endTime":202037648341,"samples":[2,2,4,4,5,9,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,12,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,5,13,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,16,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,18,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,19,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,7,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,20,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,21,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,17,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,16,7,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,4,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,12,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,29,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,17,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,16,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,32,32,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,19,20,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,15,10,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,31,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,33,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,35,8,2,2,2,2,2,2,2,2,2,2,2,2,11,11,2,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,10,14,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,40,41,43,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,23,46,30,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,47,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,15,18,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,26,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,48,13,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,15,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,51,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,30,42,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,52,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,53,54,2,2,2,2,2,2,2,2,2,2,2,2,2,11,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,45,30,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,10,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,10,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,12,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,56,8,57,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,25,17,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,75,75,82,88,94,93,95,101,2,2,2,11,2,2,2,120,120,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,102,126,140,140,144,154,154,131,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,155,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,156,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,157,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,4,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,5,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,157,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,17,14,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,9,47,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,166,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,30,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,167,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,168,17,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,169,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,170,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,13,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,52,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,35,8,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,54,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,172,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,2,157,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,17,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,2,174,13,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,175,8,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,4,16,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,159,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,45,20,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,19,54,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,15,8,42,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,12,155,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,13,14,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,28,177,178,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,12,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,48,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,4,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,162,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,20,14,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,10,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,179,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,10,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,7,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,13,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,2,15,9,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,165,11,11,11,11,11,11,11,11,11,9,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,8,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,180,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,17,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,8,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,181,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,170,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,29,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,2,20,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,4,20,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,177,20,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,182,55,2,2,2,2,2,2,2,2,2,2,2,2,32,2,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,35,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,4,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,164,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,178,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,183,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,20,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,184,186,187,11,11,11,11,5,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,40,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,181,30,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,18,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,5,178,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,4,168,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,5,9,8,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,182,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,33,188,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,181,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,14,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,174,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,14,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,30,2,2,2,2,2,2,2,2,2,2,2,2,11,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,4,8,13,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,16,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,40,169,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,9,189,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,17,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,19,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,26,170,31,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,31,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,23,156,31,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,9,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,188,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,9,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,8,31,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,7,13,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,4,182,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,13,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,98,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,15,190,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,7,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,2,2],"timeDeltas":[45281,205,103,101,105,100,102,202,103,101,100,103,101,146,72,102,103,103,103,102,107,105,137,131,117,132,124,131,141,129,161,226,164,243,148,140,144,142,132,141,138,128,137,153,138,140,156,135,147,109,134,167,121,162,155,142,177,133,142,145,149,153,160,152,170,139,197,189,156,156,147,136,155,147,167,148,156,156,158,190,164,158,144,212,128,151,147,151,151,109,129,128,128,165,122,129,127,132,128,127,128,131,128,129,143,114,126,119,129,145,121,124,130,126,129,129,128,129,127,146,115,126,128,128,155,106,127,128,153,134,131,137,142,136,132,109,123,128,202,145,147,147,140,171,141,143,116,262,125,126,180,134,131,112,129,132,128,150,120,153,155,117,142,143,153,126,179,155,175,163,147,149,150,140,168,139,140,140,139,173,139,140,138,138,140,127,129,128,164,103,128,128,129,158,106,129,127,129,158,107,128,128,129,156,109,127,130,127,129,129,129,127,157,108,128,127,129,156,109,129,128,128,155,110,129,128,129,154,110,129,135,126,153,129,128,129,128,154,116,129,127,129,154,130,128,128,129,155,111,130,129,130,155,128,131,128,132,132,127,128,129,126,154,109,141,117,128,129,129,154,111,129,129,130,159,152,135,147,124,150,149,144,147,147,147,146,146,147,135,113,131,131,127,128,138,141,114,129,126,128,154,110,128,128,128,153,112,127,151,123,129,129,128,140,129,137,110,130,130,129,109,131,131,132,133,157,128,130,131,129,155,117,107,104,130,130,154,137,123,129,130,159,104,129,128,144,138,131,130,131,118,148,145,149,135,133,119,128,128,160,104,130,128,129,159,105,132,129,128,157,110,129,130,129,158,106,128,130,128,130,130,129,129,129,129,160,105,132,129,129,156,110,128,129,145,129,130,262,126,146,158,156,157,148,152,119,128,129,148,111,146,112,139,131,128,163,159,163,156,163,159,160,151,153,154,152,182,171,151,153,151,128,158,107,130,128,129,129,129,129,129,158,107,128,127,129,156,109,128,129,129,154,112,129,128,129,158,108,129,130,130,129,129,131,128,156,129,128,129,130,154,112,129,129,129,153,112,129,128,128,154,112,128,129,129,130,128,129,129,153,111,130,128,130,154,110,129,129,129,153,112,128,128,129,154,112,128,129,129,129,129,128,129,152,111,128,129,129,153,112,128,129,128,154,123,127,144,122,127,154,113,128,130,129,145,116,132,129,129,141,112,129,136,123,156,130,147,116,127,129,129,164,162,158,154,162,163,147,160,128,172,115,172,153,114,129,108,111,128,130,149,114,124,129,130,160,129,127,128,128,157,108,128,129,153,99,126,127,129,158,106,129,129,128,157,107,129,128,129,155,107,130,129,127,159,105,129,128,129,128,129,128,129,155,109,128,128,129,156,143,103,127,127,126,156,107,128,128,128,129,127,166,94,128,128,129,155,104,128,129,126,162,100,152,127,131,131,124,133,115,133,129,132,131,124,132,144,125,163,147,132,117,134,129,127,128,129,156,109,127,129,129,155,109,129,127,130,153,112,145,109,127,157,110,129,129,130,155,130,130,129,128,154,129,129,129,129,155,129,128,149,123,128,128,128,154,110,129,129,128,154,110,129,128,129,153,111,129,128,129,152,111,129,127,130,154,111,128,129,128,154,110,129,127,128,152,111,129,127,129,160,126,127,129,129,153,110,129,129,128,154,111,129,129,127,154,113,131,138,134,158,130,141,131,163,124,131,127,131,128,218,154,165,139,97,154,146,146,110,140,144,126,166,119,158,140,134,157,178,138,155,158,178,152,136,164,148,110,148,126,129,127,128,159,105,128,128,128,156,108,128,132,128,162,129,129,129,129,156,109,127,129,129,131,127,129,129,129,158,106,129,129,129,132,127,128,128,130,158,106,129,129,129,132,127,128,129,129,157,107,128,129,129,156,109,128,128,128,159,105,128,129,133,128,129,129,128,159,106,128,128,129,132,127,128,129,127,158,108,128,128,128,132,127,128,128,130,156,108,129,128,105,128,156,122,116,129,129,128,156,129,198,134,191,281,255,132,125,130,129,129,129,129,134,154,144,156,167,133,147,145,146,140,131,150,188,153,152,149,146,156,108,126,128,128,153,109,128,128,118,149,110,128,128,128,153,109,128,128,128,152,111,128,131,125,154,112,129,127,129,153,111,129,129,128,153,112,128,129,129,154,113,128,128,129,154,111,129,127,137,131,122,113,129,129,144,132,111,129,143,110,156,124,112,128,128,148,143,114,128,128,208,158,148,157,145,151,146,112,128,119,176,150,153,152,154,141,98,142,110,123,149,148,150,148,154,151,151,151,152,172,168,141,142,140,139,140,140,170,142,128,129,131,128,129,128,130,156,109,129,129,130,128,128,129,133,155,105,127,129,126,131,127,129,128,129,157,108,128,129,129,159,143,163,148,142,148,141,163,140,148,143,148,121,141,140,141,140,141,129,130,129,129,129,129,129,130,129,129,129,130,129,129,129,129,129,130,129,129,130,128,129,130,129,130,129,130,129,129,130,130,129,130,128,130,128,131,129,154,128,131,129,131,129,131,128,130,130,130,131,128,131,129,131,129,150,141,120,588,156,150,147,145,146,145,151,123,130,128,136,142,117,130,156,194,156,156,154,156,191,157,155,148,151,155,110,129,154,157,128,128,153,165,164,144,143,157,203,146,157,156,139,147,146,140,167,129,129,129,128,195,128,126,128,115,143,162,154,130,125,130,129,157,106,132,126,146,153,111,128,154,94,128,132,130,167,120,135,133,140,138,135,137,131,128,125,128,128,158,107,129,129,129,128,156,110,129,129,128,130,127,127,129,157,107,165,310,128,125,127,127,128,128,126,128,157,110,144,110,130,173,80,132,158,107,129,128,129,127,128,127,129,134,127,129,129,128,132,128,128,149,134,107,130,127,129,156,108,140,157,140,143,129,130,128,130,129,130,130,128,130,130,130,128,130,130,128,129,129,130,130,129,130,128,130,128,130,128,130,128,130,130,128,130,128,129,130,129,129,135,128,129,129,130,130,128,131,128,130,129,128,129,129,153,130,130,128,167,137,110,128,129,129,155,124,116,127,127,131,150,129,129,127,129,155,111,129,128,131,128,128,129,127,154,111,130,127,123,113,154,109,129,128,129,154,113,128,129,127,155,111,127,129,129,154,129,128,129,129,154,110,129,127,147,138,109,129,127,129,154,111,129,129,130,152,112,134,130,144,130,128,145,115,130,129,159,106,128,120,129,158,105,129,130,128,140,142,135,147,149,115,173,143,136,154,154,195,156,155,154,150,171,141,138,160,152,123,141,126,159,103,128,128,128,152,127,127,129,128,157,105,128,128,143,138,128,128,127,129,155,108,128,128,132,154,105,128,128,128,156,105,163,137,112,175,176,175,132,150,150,126,152,130,142,110,128,128,127,129,127,151,155,136,124,150,146,140,194,106,148,146,145,197,140,140,140,127,117,139,139,140,169,139,145,151,115,128,130,128,128,129,131,130,131,129,154,111,128,129,128,154,113,130,128,130,155,112,129,130,128,158,130,128,130,129,152,92,128,133,126,128,129,152,112,129,129,129,153,112,130,128,129,155,110,128,129,128,154,129,129,129,127,153,112,129,129,130,153,111,129,128,128,154,113,130,128,128,154,110,127,129,129,155,128,129,129,127,154,110,129,127,132,141,136,141,109,129,129,147,154,143,111,129,129,128,162,105,127,129,129,154,122,129,129,171,148,153,180,98,136,168,167,151,150,151,130,172,150,149,140,138,156,109,113,129,129,128,127,158,107,129,133,127,157,107,129,143,112,155,104,128,128,131,127,127,129,127,156,109,128,129,128,155,109,129,129,127,157,107,130,126,129,155,108,127,129,127,155,111,128,129,127,157,108,129,127,129,130,126,129,127,157,107,129,129,127,130,128,127,129,154,109,127,129,129,128,128,127,129,156,108,128,129,127,132,134,133,130,151,98,126,128,154,168,147,145,148,129,117,157,145,128,130,156,141,155,131,147,146,148,150,144,147,129,129,154,112,130,130,148,125,132,128,127,129,129,152,113,130,130,127,155,112,129,129,140,141,157,132,152,153,152,155,153,170,138,154,154,147,148,167,147,148,148,146,153,112,133,126,129,154,112,149,115,128,127,129,154,112,128,129,129,160,125,128,126,129,151,122,145,128,132,128,144,159,173,175,173,175,144,153,152,155,149,163,135,150,149,150,171,148,150,129,136,159,143,151,127,133,269,157,152,157,154,155,155,159,172,128,139,155,158,147,128,163,102,127,128,128,158,159,150,151,150,152,149,150,151,129,150,148,152,150,148,151,152,128,130,128,128,128,129,130,128,130,126,130,129,129,130,156,108,128,130,129,158,104,129,127,129,156,111,128,129,129,159,105,107,129,127,162,105,129,129,128,157,106,129,128,133,153,110,129,127,128,159,104,132,129,127,156,108,129,129,128,156,109,129,130,128,155,112,130,133,127,155,130,130,130,129,153,123,128,130,130,131,130,130,143,131,143,135,129,128,129,113,149,124,116,129,128,138,133,125,126,130,127,135,166,132,109,127,127,132,151,110,130,130,128,154,111,129,128,129,154,111,128,135,127,129,129,128,153,109,128,128,129,130,128,124,129,129,154,110,129,128,129,153,112,128,129,128,155,110,128,124,159,149,147,181,102,130,144,131,127,132,190,166,153,170,108,155,143,140,130,151,105,141,119,140,171,140,129,128,129,158,110,126,130,128,159,107,129,129,129,161,104,132,126,128,130,156,104,127,129,129,156,124,153,148,134,395,127,125,127,129,128,128,127,131,139,152,141,126,139,145,136,220,145,145,150,145,195,146,146,147,148,157,129,128,128,129,155,111,128,128,129,157,108,129,129,127,159,108,128,130,128,161,104,129,129,129,130,128,129,129,158,105,130,128,131,156,110,129,129,127,156,110,159,131,131,128,125,129,127,129,129,155,110,126,124,129,155,115,123,128,128,161,128,129,129,130,154,111,108,121,133,127,128,128,127,153,110,126,128,151,150,111,128,128,128,153,109,128,128,128,132,127,129,129,129,154,112,129,129,123,139,129,126,155,111,129,129,129,128,128,129,128,153,113,129,127,129,130,129,127,129,154,112,128,129,130,155,129,129,140,131,157,130,147,130,146,110,128,127,131,156,108,128,129,129,159,128,112,155,128,116,135,128,191,154,195,159,173,150,191,155,158,128,189,148,137,141,140,140,169,140,140,140,129,132,126,130,131,126,154,108,127,128,128,156,128,125,128,128,154,106,129,127,179,151,136,139,138,168,126,127,136,129,158,107,129,128,128,155,108,135,127,129,153,110,129,129,129,174,152,153,144,277,140,140,134,141,138,139,140,128,135,132,141,130,129,180,108,128,129,128,163,127,128,129,128,129,153,111,129,135,130,130,129,130,131,130,131,131,131,147,113,130,130,148,190,148,150,148,176,117,126,128,128,153,112,128,128,130,152,112,128,129,128,153,130,129,129,129,154,112,128,129,129,128,128,129,128,154,113,128,128,129,129,127,128,129,154,113,129,129,128,130,128,128,129,153,112,129,129,128,130,127,129,129,153,112,129,128,131,124,129,130,130,130,158,133,123,132,120,115,129,127,129,127,155,128,184,124,132,137,127,160,141,153,144,157,162,155,196,159,159,153,171,152,151,151,154,153,129,128,158,107,130,128,128,132,130,127,127,129,153,108,129,126,128,154,127,127,129,128,156,108,129,128,130,155,109,129,127,129,155,108,130,128,128,158,105,128,128,129,158,104,127,129,127,158,107,128,129,130,156,107,129,129,128,156,109,129,128,128,155,109,128,161,123,128,127,127,128,155,108,128,128,128,156,122,127,126,129,129,155,109,128,129,129,153,113,129,128,129,153,130,149,109,128,154,110,128,128,158,150,158,102,127,130,123,156,158,154,180,115,128,134,128,132,132,146,134,137,170,148,107,137,163,90,128,128,128,169,130,126,127,129,154,112,127,129,127,131,128,128,129,127,154,112,128,144,116,154,111,128,128,128,164,102,146,111,129,153,112,129,128,128,154,111,128,127,129,154,110,129,128,129,156,130,129,129,129,154,133,132,114,129,140,134,152,98,127,129,129,155,109,132,126,139,165,143,150,179,149,145,148,150,171,147,149,148,149,168,142,139,153,138,140,139,111,124,130,128,128,129,128,146,146,292,150,139,151,151,156,152,149,149,158,122,133,134,137,131,109,139,129,128,153,154,109,128,128,129,156,107,129,132,128,128,131,166,106,129,128,129,162,107,128,129,128,159,104,129,129,133,129,130,128,129,130,129,130,129,130,169,127,129,129,138,129,160,105,128,128,129,156,109,130,129,128,157,108,130,132,131,129,111,148,107,129,130,130,157,131,129,130,129,154,113,130,130,129,154,133,127,127,129,128,129,129,129,129,129,128,130,127,156,111,127,130,136,128,122,129,130,129,146,114,139,163,195,156,144,149,143,142,161,144,148,123,142,142,142,143,142,142,141,129,130,154,111,134,127,129,131,130,130,130,130,130,131,129,130,129,129,132,165,131,128,130,153,146,197,150,154,140,144,142,149,111,139,144,136,139,131,130,159,106,129,129,128,158,107,130,128,129,157,107,129,128,129,162,102,132,128,127,128,128,158,106,127,130,129,138,126,128,129,127,159,103,127,129,127,152,130,127,129,128,155,107,127,129,132,153,106,127,129,127,153,109,134,130,127,156,103,129,127,129,168,128,129,127,117,127,129,127,129,153,108,133,129,133,134,127,127,130,127,131,106,128,158,146,173,147,159,123,148,166,156,115,154,108,128,128,130,128,128,128,155,113,129,129,128,119,130,129,129,156,111,130,129,148,139,111,129,130,129,155,112,144,114,129,142,113,140,108,128,128,128,154,109,128,130,126,129,126,140,153,113,124,129,128,131,127,130,129,129,154,111,130,129,128,157,117,131,129,131,129,131,129,131,129,131,131,130,147,163,150,154,149,156,128,149,150,138,146,148,148,149,147,157,134,147,140,130,128,130,159,140,132,135,115,130,138,129,130,123,129,128,130,128,134,128,164,126,128,149,103,130,156,128,129,129,128,156,108,143,129,128,129,128,155,110,131,127,127,157,112,127,127,128,129,157,108,129,128,128,130,128,155,110,128,129,128,132,125,128,129,129,157,108,128,128,129,131,126,129,129,129,155,108,128,129,129,134,127,129,128,129,156,109,129,129,129,149,128,128,129,128,156,110,128,129,128,150,126,129,130,128,130,128,130,129,129,130,128,128,128,129,130,128,128,131,129,129,128,129,128,153,107,128,132,132,157,108,129,130,129,155,131,130,159,112,132,135,292,147,148,146,148,153,152,154,137,134,127,133,136,133,198,153,156,155,156,156,149,147,153,164,140,139,125,147,113,128,129,129,154,112,128,127,131,150,111,128,129,128,150,111,132,127,126,154,108,128,128,128,168,128,129,127,127,151,111,132,124,129,130,129,128,129,154,112,129,128,158,148,87,130,127,128,180,147,146,149,172,160,134,119,133,164,131,160,130,172,168,140,140,127,129,162,124,109,129,127,157,108,129,127,135,127,156,106,127,129,140,141,226,127,130,129,128,128,130,132,129,136,128,150,132,108,146,131,152,147,140,126,128,155,109,127,130,128,129,129,158,108,129,128,128,130,128,129,129,130,129,126,129,157,107,131,126,127,129,129,156,109,129,129,130,157,107,129,128,129,158,108,130,127,129,157,108,129,129,129,129,129,129,129,157,108,127,129,129,130,128,129,128,153,130,128,128,130,130,127,128,130,155,129,129,129,141,104,128,128,129,155,113,129,132,106,153,111,129,127,129,153,112,129,128,129,153,111,129,127,129,152,113,130,128,127,154,111,129,127,129,160,130,129,153,205,153,154,154,154,192,154,152,153,151,169,148,147,146,147,167,129,128,129,129,130,128,129,127,155,113,128,129,129,128,129,126,128,156,111,127,129,127,145,114,119,128,127,128,128,128,157,104,128,128,130,127,147,113,141,137,98,150,193,136,154,156,156,174,150,151,151,148,170,129,128,128,129,146,127,128,130,128,157,109,129,128,110,157,106,129,129,127,147,144,156,124,158,106,129,127,129,155,107,154,106,127,158,127,129,128,130,128,127,150,129,150,111,175,132,159,126,128,140,127,128,131,130,130,128,133,131,127,124,129,127,128,128,131,125,128,146,144,131,128,129,104,176,125,159,130,129,150,158,192,161,153,155,194,159,155,155,194,153,154,147,145,168,140,141,139,139,153,130,129,129,128,130,127,130,128,153,129,129,130,128,178,141,155,154,194,161,145,154,169,171,146,146,156,125,148,147,143,146,147,130,129,130,128,128,129,144,119,130,135,137,136,136,143,136,172,102,147,138,137,138,135,136,136,135,128,127,129,131,129,156,157,130,131,137,127,156,107,129,128,128,152,117,140,121,128,154,121,117,128,128,186,142,131,128,129,191,142,135,133,127,135,131,131,130,129,131,132,131,128,128,129,132,130,129,128,129,128,130,130,130,130,130,156,122,149,147,149,148,149,124,134,158,142,140,142,139,130,128,127,131,138,143,129,135,134,134,135,163,108,137,133,132,133,133,132,131,139,133,133,135,131,134,144,130,120,133,130,142,154,112,126,136,109,149,137,131,137,128,135,138,114,142,134,140,128,129,167,147,196,129,182,194,133,133,113,153,142,142,267,118,129,137,134,132,141,132,135,135,127,154,129,142,134,141,141,126,137,140,143,147,147,150,140,148,137,173,160,158,149,146,145,146,153,146,135,136,142,115,129,150,139,115,129,133,118,157,154,155,157,142,132,129,129,105,116,154,141,139,151,161,156,145,144,136,153,154,113,129,128,130,129,127,136,127,128,131,129,130,130,130,130,120,150,129,130,129,130,130,130,123,132,144,155,195,130,127,184,163,160,139,128,156,103,131,133,137,134,126,141,136,144,127,124,145,172,135,254,127,127,121,134,135,106,135,138,121,146,133,157,133,140,133,139,161,129,150,121,161,136,120,115,160,157,113,161,115,136,135,168,118,123,134,94,147,162,147,149,139,159,126,149,109,129,155,104,129,134,136,137,113,127,149,118,125,131,136,126,128,128,132,127,130,130,132,132,131,131,128,129,129,128,128,134,133,157,158,161,177,154,151,152,149,152,152,154,153,150,152,150,150,130,127,132,127,130,130,128,131,128,133,131,132,130,133,128,149,141,141,142,115,127,149,132,140,152,158,121,146,145,112,139,127,129,106,123,144,164,155,162,149,151,148,135,139,144,143,129,157,156,156,159,148,145,109,149,113,147,126,120,134,135,147,115,154,138,158,155,150,122,147,109,162,132,156,125,147,119,134,108,169,130,125,134,118,129,133,132,106,126,127,132,165,126,126,157,167,141,142,142,142,157,141,165,140,109,129,128,156,108,128,130,128,155,111,128,132,134,141,139,140,131,137,138,128,125,127,127,163,103,128,127,126,163,100,130,129,129,158,107,130,127,129,128,128,133,127,131,134,129,128,129,124,127,129,127,128,128,128,132,142,151,135,158,110,133,148,161,135,128,127,158,108,127,129,129,154,128,130,129,128,156,110,128,129,128,169,95,127,127,129,129,154,110,129,129,131,129,129,128,129,158,107,128,130,128,160,104,128,129,127,161,106,128,128,129,163,101,128,129,129,128,128,127,129,155,112,129,129,128,129,129,129,129,155,130,129,129,129,118,128,128,129,129,155,129,129,131,156,131,129,128,127,153,113,129,127,130,154,111,129,127,129,153,110,131,126,129,154,110,129,129,129,154,113,170,114,128,153,112,127,129,127,130,128,127,129,154,112,128,129,129,128,129,128,129,165,104,128,129,129,155,128,129,127,129,152,112,131,129,131,156,108,129,130,129,145,136,109,129,143,144,108,127,129,127,158,107,128,129,177,140,122,170,136,128,138,164,130,128,159,106,129,128,127,159,106,128,129,132,135,119,127,129,127,155,110,130,129,130,159,106,127,129,127,179,90,132,108,127,157,108,128,129,127,156,110,130,128,128,156,109,127,129,128,157,91,128,129,129,157,106,127,129,128,158,128,129,128,128,159,105,124,148,128,131,127,124,128,127,128,130,141,128,127,119,167,139,149,135,197,120,184,132,133,139,155,146,112,129,129,128,156,111,151,146,142,127,145,147,147,191,147,146,148,160,142,138,142,140,153,111,129,129,131,127,129,132,127,152,110,120,127,127,153,111,127,128,128,153,112,129,129,128,129,127,128,129,153,112,129,129,132,127,130,129,129,129,129,129,130,129,128,130,128,128,128,128,128,130,127,129,129,154,112,128,128,129,128,129,128,129,154,113,129,130,129,130,127,130,129,154,113,131,130,131,214,146,112,131,150,154,121,189,115,153,150,133,128,178,131,166,134,133,130,157,129,129,128,129,158,106,129,129,128,159,105,129,131,151,185,149,146,152,171,152,154,160,114,130,145,112,149,125,132,110,127,159,108,133,125,127,150,108,128,128,146,148,109,128,128,130,109,126,129,151,134,106,128,130,130,153,145,130,160,126,106,130,128,130,151,112,122,165,164,174,128,144,145,147,194,147,154,122,140,140,140,157,108,129,129,129,159,111,128,128,129,157,105,127,129,130,140,136,152,109,129,129,129,154,113,166,110,119,153,152,159,153,159,148,149,147,147,141,149,111,132,158,94,168,133,111,125,155,130,154,111,130,129,126,126,128,154,108,128,128,135,154,128,129,127,129,154,111,128,135,127,151,128,127,130,128,155,111,130,128,129,153,112,129,129,128,108,128,128,128,129,154,112,128,134,128,152,112,129,128,129,152,116,128,128,129,154,112,129,128,129,132,127,131,133,149,128,128,128,140,142,131,129,181,122,139,153,124,170,134,193,157,153,156,194,156,149,151,138,171,144,125,131,130,156,114,155,131,299,152,148,152,151,153,149,149,146,147,147,134,132,154,146,134,158,138,138,166,154,154,156,193,154,160,149,152,153,149,148,148,158,108,128,128,129,158,106,129,129,129,130,128,129,129,159,107,128,127,130,132,127,128,129,129,157,108,129,129,129,133,127,127,128,129,213,38,128,128,129,157,108,128,129,129,157,108,130,128,128,157,108,129,128,129,129,127,129,128,155,112,129,129,130,153,114,130,130,128,154,112,130,127,129,155,130,128,128,166,129,128,130,128,155,111,129,129,129,144,139,155,152,190,154,153,152,179,127,130,129,130,128,128,128,129,130,131,129,129,130,128,128,128,128,146,127,127,129,129,130,128,128,130,131,129,128,129,127,127,154,109,128,132,129,154,111,129,129,128,154,113,130,129,130,157,115,128,130,129,136,154,147,152,135,153,149,142,198,146,148,141,139,173,161,141,143,129,157,131,129,143,129,141,128,127,129,129,155,111,129,129,129,127,130,129,157,108,130,129,128,137,127,126,128,154,108,127,129,127,131,127,129,129,129,158,109,129,128,131,159,125,148,158,120,154,161,148,160,130,138,129,129,140,123,148,117,140,143,142,144,134,155,134,107,128,128,129,155,106,126,128,128,155,110,126,128,129,129,158,106,129,129,129,130,127,129,128,157,109,128,129,129,130,128,128,130,154,128,128,128,130,130,127,130,128,154,129,129,129,128,129,128,128,130,155,130,129,130,129,134,129,128,129,153,110,128,128,132,156,128,129,128,129,154,112,130,130,129,153,111,129,129,129,156,112,128,129,129,153,112,129,128,170,116,109,128,128,128,164,123,145,114,127,152,112,128,129,127,155,115,130,129,126,153,112,129,127,129,156,110,150,110,168,110,128,143,113,131,112,128,127,129,107,128,127,126,127,168,93,156,116,139,128,136,157,127,128,127,129,158,107,129,129,129,156,108,128,129,129,158,107,163,111,127,129,128,157,106,129,128,133,157,109,126,128,128,155,107,131,118,129,128,129,155,107,129,127,130,159,128,129,128,129,155,108,154,123,127,153,106,128,128,128,169,96,140,128,127,127,129,155,108,128,129,129,155,109,129,128,129,156,111,128,129,128,159,105,128,129,129,156,131,129,131,129,157,107,128,129,129,174,107,253,148,127,131,129,127,128,113,127,133,151,169,152,148,173,116,173,174,152,154,154,152,194,146,142,146,148,147,167,147,106,129,136,124,108,129,128,129,155,111,127,132,127,154,111,129,129,128,154,112,130,128,129,152,112,128,129,127,173,127,125,128,129,153,110,127,131,107,155,110,128,129,128,155,109,128,130,129,153,111,129,128,129,155,128,128,129,127,155,110,129,130,157,127,128,144,146,101,128,128,129,181,133,131,126,172,135,149,168,210,135,140,192,141,116,132,120,255,130,126,128,129,128,107,129,114,128,131,149,116,120,142,133,113,127,127,155,106,126,129,127,158,105,127,126,129,127,153,108,129,127,126,153,140,141,140,130,131,158,129,130,131,130,129,131,130,129,129,129,129,130,130,128,129,129,129,129,129,129,129,130,128,129,129,129,129,129,129,129,130,130,125,128,130,129,129,129,129,152,108,128,128,128,167,98,127,133,129,156,108,130,127,128,156,110,130,128,129,154,111,130,128,134,153,109,129,129,129,154,113,130,131,129,130,128,130,129,155,136,133,146,164,147,147,149,154,129,126,131,125,152,110,127,132,124,152,115,131,131,130,130,132,133,146,113,131,127,129,153,111,129,129,128,198,157,145,145,152,151,143,146,191,142,123,140,140,140,140,134,126,129,130,128,153,112,129,129,129,153,112,128,132,128,129,129,129,129,130,139,131,127,128,154,113,129,132,127,159,106,129,129,137,128,179,148,166,155,136,135,158,105,127,127,127,158,100,131,125,128,128,158,109,130,129,129,128,158,106,129,128,128,160,131,129,130,130,129,130,130,129,131,130,129,140,132,258,128,127,127,128,132,128,129,129,145,128,130,129,151,128,164,155,160,162,161,158,158,170,156,155,169,152,153,151,152,171,128,129,130,128,122,129,129,128,158,105,129,128,133,128,132,128,113,156,157,158,159,155,169,161,158,157,157,159,155,157,149,161,140,142,139,140,139,129,129,129,129,130,130,129,157,127,130,128,129,155,112,129,130,131,152,111,129,130,128,154,129,132,128,129,154,111,129,129,127,169,104,129,129,128,165,104,128,128,159,132,111,128,128,128,153,111,126,129,163,126,123,129,139,139,140,167,133,127,125,129,152,113,124,128,129,157,129,129,129,129,154,112,129,129,129,154,131,146,116,130,128,142,129,129,129,144,126,129,129,152,122,132,142,117,127,127,128,157,108,129,128,129,158,106,129,128,128,164,130,129,129,128,159,105,129,129,132,156,128,128,130,129,157,106,139,126,127,157,109,129,129,128,162,106,128,129,129,156,110,128,129,131,157,108,130,130,128,129,129,127,129,158,107,129,130,129,155,109,129,127,129,168,94,129,129,129,128,129,128,170,98,129,129,129,120,113,238,109,127,128,127,131,155,163,164,140,153,118,144,110,129,151,115,155,132,111,129,128,129,155,114,129,128,128,129,128,128,128,130,154,131,127,129,129,154,128,129,130,143,88,129,129,128,154,121,129,132,163,109,127,129,129,152,113,128,129,130,153,111,129,127,129,155,111,130,127,129,153,111,128,129,127,163,125,127,129,128,153,113,129,127,130,154,112,129,128,128,153,112,133,127,126,155,111,129,129,127,154,112,128,127,129,154,111,127,130,129,158,159,162,172,149,149,148,136,130,167,154,110,170,136,128,149,96,139,123,141,132,174,148,152,150,129,156,108,128,128,129,177,94,127,128,126,157,105,128,128,128,178,87,130,128,127,129,129,154,111,128,129,129,144,128,128,128,129,156,130,128,127,159,128,129,127,129,154,109,128,130,128,159,105,128,129,128,162,129,128,129,127,155,111,129,128,136,155,107,129,128,129,159,106,129,130,129,155,108,128,129,127,172,77,129,128,129,160,104,128,128,133,156,106,129,127,129,157,108,128,130,128,157,106,129,128,129,156,129,128,128,129,154,111,129,129,130,161,156,135,258,127,125,131,131,128,128,128,119,133,144,154,161,127,136,136,116,142,167,144,149,146,147,146,147,166,147,147,154,150,112,128,128,128,153,109,131,128,129,128,129,130,128,129,130,128,130,128,129,129,129,129,129,129,129,130,128,129,130,129,130,129,130,128,130,128,129,128,129,130,129,129,129,130,128,130,128,130,135,114,130,131,129,128,141,116,130,123,128,129,129,128,160,127,164,142,158,141,150,119,150,160,127,128,128,129,157,107,129,129,129,160,105,128,130,127,159,106,129,127,129,162,145,124,159,159,179,157,155,134,156,147,146,149,177,181,115,165,159,136,125,154,154,118,112,126,129,159,105,129,128,142,129,156,112,148,152,154,149,152,151,151,150,149,141,140,144,140,141,140,140,141,140,129,128,129,158,143,120,130,131,128,130,129,130,129,130,129,130,130,131,128,130,129,130,128,129,129,128,130,129,130,129,130,129,130,128,130,129,129,129,131,127,128,128,130,131,129,130,129,118,129,129,129,155,111,130,128,158,136,132,110,126,129,126,167,100,127,127,130,151,109,128,126,128,154,108,172,133,196,161,155,132,148,148,148,144,145,147,144,143,144,168,128,130,133,130,127,129,128,156,111,128,130,130,153,112,128,130,129,156,111,130,131,130,154,112,129,128,130,156,131,153,111,130,138,125,152,110,133,131,128,126,154,131,128,127,124,129,128,155,110,129,129,127,154,110,129,128,130,161,103,134,127,128,159,104,128,127,127,155,110,130,129,128,128,156,109,128,129,130,156,108,128,128,129,157,107,129,130,129,156,110,128,129,129,158,132,106,133,126,153,109,127,127,129,155,109,121,149,130,381,127,126,152,113,129,126,127,142,173,160,161,92,163,137,142,131,173,134,109,127,129,130,132,129,127,128,157,108,127,128,134,159,125,129,126,128,154,108,128,132,129,151,110,127,128,130,153,111,133,154,109,128,128,129,152,110,127,134,132,149,110,127,131,127,151,101,130,131,126,128,153,109,128,128,128,169,168,186,108,180,112,180,111,131,123,129,127,129,128,154,112,128,129,130,152,112,130,129,130,155,129,131,128,130,154,130,130,129,130,130,128,129,129,153,112,130,129,128,131,127,129,129,155,112,130,130,156,137,135,125,154,127,128,131,162,129,129,129,130,143,128,134,126,135,163,125,127,128,131,154,108,130,129,131,129,127,129,156,111,115,129,129,129,156,109,129,128,129,131,123,129,130,129,157,130,129,129,130,133,132,128,128,129,156,110,128,129,130,129,130,129,130,130,128,130,130,131,127,130,130,128,130,128,130,130,150,113,130,128,130,130,128,130,128,130,129,127,128,129,129,158,109,128,129,129,155,107,129,130,129,159,106,130,128,129,156,109,129,129,129,130,129,129,129,154,112,129,129,140,107,129,128,126,128,128,129,156,110,127,129,131,169,131,109,129,158,96,142,153,154,193,153,153,153,161,119,141,132,129,153,109,128,128,128,153,113,127,128,128,128,153,109,128,128,127,147,112,128,129,127,155,111,129,128,128,160,140,112,128,128,154,108,126,128,130,132,127,129,129,128,155,112,127,130,128,132,127,129,128,127,154,112,129,139,128,130,129,126,129,129,152,113,129,143,157,158,141,205,141,141,141,132,126,127,128,129,130,152,141,155,141,151,131,146,143,112,128,131,127,129,128,129,169,95,137,152,137,163,138,139,141,142,136,139,184,154,163,144,143,149,130,125,126,129,131,127,127,129,129,158,107,128,130,167,177,137,148,154,149,152,153,150,156,151,140,140,142,141,129,129,129,129,129,129,130,129,129,129,129,130,129,129,128,131,125,128,155,112,124,129,130,129,128,129,129,128,155,110,129,129,129,164,112,130,130,130,132,130,162,146,152,113,165,141,151,143,151,145,148,145,120,128,130,130,131,129,130,130,130,129,131,130,132,127,129,127,153,111,129,144,119,126,130,129,154,115,133,129,129,129,127,152,111,130,128,128,169,146,141,140,141,169,141,141,145,157,140,140,142,140,168,129,129,138,189,149,147,151,147,194,147,149,140,141,171,139,142,140,140,154,111,129,128,130,158,111,129,129,128,155,113,128,130,120,151,129,116,133,125,128,153,110,142,114,129,134,128,140,128,113,130,138,133,104,158,104,129,127,129,157,104,128,129,127,157,105,127,129,148,110,130,129,130,155,110,129,130,131,156,130,129,131,130,158,105,130,127,130,128,130,155,110,130,128,129,130,128,126,130,129,132,147,143,144,145,146,147,146,145,112,129,142,157,135,112,150,113,127,127,128,157,108,130,128,130,130,128,130,128,130,133,130,129,127,130,130,131,143,117,130,143,117,128,129,129,157,108,129,128,129,154,111,129,129,128,156,110,129,128,130,154,128,128,129,128,131,127,129,129,155,130,129,128,129,130,126,130,128,154,131,129,128,145,215,154,149,155,150,156,151,155,123,132,125,127,129,154,111,129,129,128,154,115,128,129,129,153,113,129,139,129,152,112,128,129,129,153,113,128,130,128,153,112,129,127,129,153,114,152,125,128,152,109,128,128,128,160,100,128,128,129,153,111,128,129,129,154,133,129,128,129,140,151,114,152,152,141,146,149,149,151,151,150,150,153,167,102,167,118,87,163,131,153,150,173,151,150,150,151,171,150,151,150,153,151,149,174,129,128,130,128,161,101,129,129,128,157,106,129,141,151,106,128,128,128,128,128,126,147,128,128,128,158,104,128,132,125,157,109,128,127,129,158,107,127,129,132,129,128,127,130,155,111,129,128,128,158,109,127,126,129,126,158,104,129,126,128,158,156,143,128,127,127,129,127,129,127,135,135,165,182,152,128,107,120,144,139,141,137,139,167,141,139,141,170,139,139,127,130,154,113,129,130,127,155,128,128,130,130,155,141,123,128,127,129,126,129,128,153,115,128,127,129,154,111,129,128,130,154,129,129,128,128,155,129,113,129,128,129,152,111,129,127,129,154,113,128,129,128,153,111,129,128,130,156,112,129,127,129,152,112,129,130,128,153,110,127,129,129,155,130,128,127,129,154,111,117,129,180,94,115,127,128,154,109,128,135,149,164,157,156,137,121,123,119,132,161,126,108,121,186,130,127,128,128,157,106,127,127,127,155,105,126,128,145,113,128,132,125,155,109,129,128,130,126,132,131,127,128,128,129,173,107,111,126,128,154,108,128,128,147,109,106,128,129,128,186,82,129,153,147,105,128,130,127,155,109,129,129,129,129,127,129,129,127,160,104,130,128,133,127,129,128,129,178,91,129,128,129,156,110,129,128,129,177,99,125,126,133,157,105,129,127,129,192,109,126,128,128,156,106,128,128,126,152,128,128,127,129,155,111,129,129,129,153,112,128,128,131,161,126,140,139,111,147,142,300,140,155,122,140,106,128,128,129,155,154,135,148,151,107,153,121,128,129,129,154,115,125,129,129,155,111,129,129,129,174,94,129,129,129,155,111,129,128,128,154,113,128,129,128,153,110,128,129,131,154,112,126,127,126,165,96,128,132,124,130,127,129,128,128,156,110,127,129,130,154,111,129,157,109,129,130,163,111,129,128,124,150,126,129,129,129,155,109,148,130,158,133,110,183,145,160,157,194,145,148,144,146,194,147,147,147,161,128,130,126,130,160,129,128,108,131,260,128,126,161,145,173,136,173,112,164,163,178,159,166,147,144,152,148,151,145,193,134,146,148,147,194,175,125,156,188,131,165,143,125,136,141,174,140,141,142,140,171,140,140,139,140,172,131,130,129,130,157,107,130,127,130,158,128,130,130,140,139,141,139,139,143,140,139,140,140,157,140,156,157,154,156,147,145,148,146,169,131,135,126,152,138,137,145,134,124,128,130,130,129,129,116,128,129,121,138,149,180,153,130,149,142,130,145,131,132,130,116,143,154,144,202,143,132,132,132,132,131,132,131,139,134,124,147,173,140,148,130,136,135,109,126,123,121,139,132,158,132,139,135,135,133,137,137,137,134,134,133,133,146,119,131,159,168,132,152,174,139,162,151,180,177,151,108,140,148,168,136,125,141,149,124,139,120,166,135,134,177,154,168,104,155,165,147,135,139,155,163,149,146,98,159,122,140,155,179,121,161,151,143,148,146,144,162,104,134,159,115,125,130,127,129,129,129,129,152,143,112,131,128,129,133,129,132,129,132,151,118,127,106,154,157,164,126,137,143,165,288,125,132,136,133,146,132,133,132,139,121,162,136,167,135,127,130,117,159,139,161,143,148,150,148,159,135,138,112,111,163,148,147,115,165,137,120,153,129,128,131,132,152,152,136,129,130,159,113,130,147,143,154,127,128,133,186,123,124,139,158,137,130,178,132,130,131,111,132,136,140,129,131,152,135,129,125,127,150,126,149,130,148,148,151,132,140,133,130,129,140,133,128,134,129,131,131,133,132,130,132,139,127,125,128,128,130,128,131,127,130,130,140,127,147,135,127,128,150,154,153,133,133,127,117,135,128,130,128,129,137,135,134,126,191,130,123,155,120,119,143,140,133,114,169,152,138,132,163,132,145,128,159,135,119,163,128,129,133,132,133,132,131,131,147,119,135,133,168,118,104,183,118,132,121,135,132,163,160,159,168,152,167,153,127,122,132,131,134,113,129,140,117,139,112,145,200,153,137,159,175,111,105,170,140,159,106,178,154,151,166,159,152,115,144,162,146,141,226,152,151,131,151,156,134,139,143,141,133,154,150,137,135,153,165,422,134,151,165,143,137,134,138,129,180,134,136,149,126,128,160,156,135,132,184,190,157,155,157,189,147,136,152,134,139,139,139,155,150,150,135,121,152,109,129,127,128,154,112,154,120,144,147,173,146,155,178,148,145,147,144,193,146,139,142,141,139,138,140,154,112,129,139,128,152,129,129,128,129,155,110,129,130,128,154,110,129,128,128,157,112,129,129,128,154,111,129,128,132,153,110,129,128,129,154,129,129,130,127,130,177,143,143,160,145,154,152,135,133,142,141,180,146,126,158,105,129,129,131,129,148,136,128,127,160,107,129,129,128,157,108,129,128,129,156,110,129,128,128,157,108,146,112,127,156,107,130,128,129,129,159,106,131,128,128,129,129,156,126,142,150,132,133,200,154,156,155,157,195,154,156,157,170,149,151,170,156,110,128,129,128,155,108,129,129,141,157,128,127,129,128,177,83,147,109,127,158,107,129,127,129,155,108,129,129,128,155,111,129,128,146,141,109,128,128,128,173,123,158,156,151,175,153,156,156,157,192,186,163,149,145,148,193,124,147,425,150,140,138,128,128,128,129,129,137,171,127,144,116,157,131,130,130,179,143,147,145,147,190,147,147,134,145,147,144,192,140,140,154,136,138,148,145,166,140,139,141,157,140,138,140,141,165,139,142,127,128,154,110,129,128,128,154,121,125,127,129,154,112,129,128,129,130,130,128,129,153,111,129,129,162,103,128,130,162,104,127,132,127,152,113,131,130,128,134,147,118,122,141,125,152,128,172,134,149,175,139,139,142,126,157,106,128,130,126,158,155,316,148,147,156,152,151,139,129,128,127,168,112,148,131,134,132,133,130,155,108,129,129,128,128,128,128,129,157,107,128,129,127,132,128,147,112,128,165,100,139,146,106,116,163,159,137,129,158,162,194,160,158,158,196,159,160,152,154,149,153,150,170,156,152,128,159,108,130,128,129,158,108,129,130,127,157,107,129,129,129,156,110,129,129,129,157,109,129,129,130,155,129,127,129,146,141,137,191,123,136,150,155,117,126,140,153,110,129,131,128,127,130,135,129,130,128,129,113,152,125,128,153,111,129,129,129,154,111,129,128,129,155,111,127,129,129,155,111,128,129,128,155,111,129,129,133,158,130,117,166,151,153,150,155,160,187,115,135,133,145,170,141,119,152,152,128,152,110,126,128,128,154,112,126,128,129,129,153,114,144,118,152,121,113,128,129,128,126,128,134,144,141,149,150,142,151,141,141,160,123,130,138,128,157,105,127,129,128,157,107,128,128,129,140,147,141,151,129,127,142,128,151,172,150,152,150,150,170,152,152,154,168,154,152,153,152,172,156,142,143,263,145,144,147,158,93,145,147,154,106,151,127,152,132,133,149,132,126,159,106,129,128,144,152,111,128,129,128,131,175,92,112,134,152,163,165,132,142,116,156,104,129,129,128,155,110,128,131,128,155,110,129,129,128,158,118,123,127,127,154,109,128,129,129,153,121,128,128,129,130,155,129,130,129,129,141,125,128,130,129,153,113,130,130,128,159,128,139,145,125,141,142,138,158,136,131,131,139,149,139,139,136,134,151,127,129,128,129,128,129,128,133,129,125,132,144,119,151,149,132,149,139,112,157,134,129,130,151,139,116,146,139,128,128,129,128,129,154,113,129,129,128,154,112,129,129,149,113,123,153,138,143,132,177,219,116,139,143,124,129,131,159,145,144,181,129,127,127,128,149,110,136,128,129,129,129,130,129,129,129,164,127,136,123,132,132,127,159,129,130,130,129,159,108,131,129,145,193,173,125,127,127,154,107,128,128,129,153,108,130,127,127,127,127,135,166,143,113,108,174,146,165,114,149,151,171,156,148,153,152,128,160,104,128,128,129,157,106,128,129,129,160,104,128,156,125,130,128,124,127,131,129,143,129,130,130,161,134,141,125,132,159,114,135,129,126,128,129,160,93,127,129,127,144,176,126,129,176,170,160,142,144,113,154,111,127,128,159,123,138,140,140,140,140,140,161,123,140,140,128,130,130,129,128,132,131,130,128,129,128,152,110,129,127,129,132,126,127,129,127,156,108,129,128,129,163,102,126,130,128,153,113,139,147,135,150,159,156,119,138,127,188,149,148,146,148,165,138,139,140,164,139,140,129,129,155,111,129,129,129,141,129,128,128,128,160,108,143,125,139,134,128,129,132,128,143,126,131,127,129,137,126,132,136,124,153,113,132,127,130,158,111,139,130,115,139,128,138,150,92,112,119,127,129,127,152,127,156,136,103,127,127,127,154,107,130,130,121,162,105,129,131,129,159,110,130,128,130,160,108,129,157,175,144,158,160,159,196,159,176,127,148,145,148,168,140,140,162,159,166,126,166,147,142,134,130,142,170,110,122,105,172,151,149,142,128,128,128,128,159,108,129,128,132,159,129,130,127,129,158,106,131,129,129,128,128,160,104,129,127,148,128,259,129,127,128,136,131,129,127,129,150,123,146,141,140,138,130,140,117,139,113,155,152,133,133,168,137,139,139,141,171,141,128,127,126,154,112,127,129,129,116,129,129,128,128,157,108,129,130,129,154,112,128,129,129,154,109,130,128,129,153,112,128,128,129,155,130,129,128,128,153,111,127,129,130,156,147,163,115,152,147,160,153,134,129,127,151,151,153,191,155,155,153,152,192,153,152,153,163,125,147,142,144,142,144,143,161,127,129,127,129,130,149,128,119,168,151,146,122,128,290,128,126,129,127,127,128,127,156,126,169,170,139,158,127,131,158,131,146,139,153,155,107,128,129,127,156,104,128,179,171,123,129,128,130,128,130,128,130,129,129,128,129,130,129,130,130,128,113,129,128,129,155,108,127,129,130,162,128,129,128,128,156,109,136,128,126,158,109,128,129,168,136,146,120,154,135,170,128,162,77,131,125,128,154,109,129,128,129,164,106,129,129,128,155,108,129,129,129,156,109,129,130,129,155,111,129,129,132,152,112,129,130,130,156,130,129,130,141,126,129,129,157,115,118,129,128,129,150,128,129,111,142,124,139,133,140,149,128,130,160,156,111,129,129,128,137,126,128,128,130,155,111,130,131,129,154,109,128,130,129,154,111,129,128,128,128,154,111,129,129,129,130,128,129,130,154,110,129,142,117,129,128,129,129,154,112,128,129,130,152,115,189,151,175,119,175,157,146,149,164,132,149,130,158,139,159,225,143,158,160,129,130,139,157,155,103,128,127,128,160,105,128,128,128,155,110,128,128,128,158,94,129,126,129,160,104,128,129,131,156,109,128,128,131,191,100,110,160,107,146,127,154,146,145,148,139,139,139,151,132,152,149,172,116,139,133,150,131,140,139,169,138,140,141,127,158,108,129,129,129,156,110,127,129,128,158,107,127,129,129,161,110,125,129,157,108,129,129,159,137,104,128,129,128,156,109,129,117,173,133,170,107,135,127,135,106,134,153,107,129,128,128,153,112,135,126,128,153,112,128,129,129,155,115,131,128,129,153,112,130,128,130,159,129,151,157,129,154,109,128,128,128,139,130,127,129,128,154,113,128,129,130,155,110,129,129,129,162,146,115,139,139,120,147,151,138,116,141,141,131,125,139,139,167,141,139,139,139,129,127,129,128,128,155,111,146,127,128,128,129,154,110,122,113,127,127,162,104,128,128,131,160,130,132,129,161,152,136,202,154,148,170,113,124,129,127,163,143,120,138,134,134,149,130,125,129,161,132,159,106,129,128,129,160,105,129,128,128,163,126,127,129,128,159,105,128,129,129,129,128,128,129,156,110,128,128,129,108,128,129,129,128,158,108,128,130,129,157,109,129,128,128,155,108,128,130,129,158,113,118,148,147,131,144,110,131,150,147,137,139,128,128,126,137,151,155,130,154,148,131,112,123,129,143,151,131,129,129,158,129,129,130,128,128,130,130,195,145,148,148,147,191,148,146,147,145,149,145,146,139,168,138,129,128,155,104,138,135,112,144,164,152,141,140,170,155,109,127,127,128,154,114,125,127,127,129,127,155,111,129,128,143,129,129,129,129,154,112,129,129,129,142,127,129,129,129,155,112,129,129,129,141,128,128,129,129,153,112,129,129,129,160,111,126,128,137,151,137,166,148,131,143,144,147,142,153,151,127,130,127,128,154,114,106,129,133,158,130,130,130,131,155,129,128,128,133,129,136,136,125,128,129,128,129,132,133,158,135,127,132,143,129,128,162,128,129,128,129,158,107,128,129,129,159,115,119,131,154,188,150,151,152,155,170,152,150,148,153,154,172,152,153,154,144,128,129,128,129,157,108,128,129,128,142,127,127,129,129,159,105,129,128,129,157,107,129,129,128,157,108,128,128,129,158,108,128,128,129,130,127,128,129,161,112,128,128,130,134,160,102,129,129,128,157,110,128,128,129,157,108,128,128,129,137,152,146,168,291,147,149,170,146,147,169,131,142,147,114,125,140,120,139,158,129,127,130,130,154,130,130,140,147,146,178,130,129,130,137,127,147,135,148,144,110,165,108,147,124,128,153,109,130,127,128,154,116,126,129,128,153,110,129,128,129,158,110,128,126,134,148,110,129,128,132,155,128,127,129,128,154,110,133,129,129,154,111,129,128,129,154,112,130,130,128,129,128,156,109,128,155,146,157,124,111,130,120,129,155,128,123,148,113,128,142,129,132,138,135,148,136,135,159,129,128,125,129,127,129,131,129,128,128,127,153,123,160,156,182,139,132,147,133,113,127,158,129,127,129,127,156,109,128,153,125,158,104,128,128,128,130,151,139,148,152,150,150,150,149,150,130,128,130,129,129,130,128,132,129,129,126,128,127,155,107,127,140,126,158,106,128,130,128,159,106,129,128,130,129,156,129,128,130,129,106,129,129,129,128,155,111,129,136,139,153,125,127,129,127,156,116,126,127,129,157,108,128,130,129,130,128,129,129,154,129,130,129,131,155,112,129,130,129,154,134,129,128,129,154,112,129,129,173,152,150,145,192,146,148,147,149,134,132,126,129,129,154,111,129,130,129,152,112,129,129,130,153,114,129,127,130,153,113,130,129,132,153,110,129,129,128,155,111,129,130,128,153,114,128,130,129,154,114,127,129,129,154,111,128,130,129,130,128,129,130,158,132,128,129,138,122,157,130,128,128,127,154,106,128,128,149,142,178,141,121,138,168,170,138,130,127,128,156,109,128,129,129,157,107,128,154,114,129,129,129,157,108,129,129,130,156,127,130,129,128,161,105,129,129,129,144,127,128,129,128,159,109,157,437,131,147,148,144,145,145,149,128,171,155,168,117,149,115,151,164,99,128,128,143,155,107,141,125,128,154,107,130,127,128,156,109,129,131,128,129,128,128,158,106,129,130,130,158,129,127,129,129,154,109,131,129,129,155,109,128,128,129,156,129,133,129,129,129,129,155,130,129,129,129,133,128,128,129,129,157,112,129,153,209,109,140,133,155,162,135,151,135,147,140,126,137,141,140,132,128,130,129,130,128,129,130,129,129,128,129,130,128,128,128,129,147,111,128,129,129,113,129,127,155,110,128,128,129,153,111,129,127,129,130,126,129,129,152,112,128,128,127,153,127,127,129,127,156,139,145,133,125,114,141,125,132,130,128,109,145,115,128,148,167,155,123,144,132,104,127,157,103,128,128,128,156,105,128,128,144,163,146,102,152,149,173,153,152,151,151,173,158,152,150,151,171,149,153,149,146,150,129,157,107,128,131,126,155,106,128,132,124,156,108,131,128,128,130,127,156,108,128,132,127,159,104,128,129,128,157,108,130,130,129,129,128,158,104,129,128,151,161,120,129,128,129,129,129,130,126,109,144,164,125,129,127,127,132,125,148,161,115,128,149,113,149,89,136,132,110,128,128,156,109,129,131,128,129,129,129,154,111,136,127,129,158,127,130,129,129,155,112,130,130,130,156,130,128,129,141,126,128,129,126,155,108,130,127,129,153,113,128,128,127,155,112,128,128,129,156,108,128,128,131,154,112,128,129,129,154,110,128,129,129,129,127,129,129,129,154,111,129,129,129,152,112,128,130,129,155,112,128,126,130,156,108,128,129,129,111,126,129,129,150,155,136,142,164,131,126,143,158,168,146,136,144,139,141,139,155,152,132,144,140,127,136,164,128,128,128,129,157,108,129,127,129,156,107,129,129,133,153,108,128,134,126,156,108,128,127,128,156,108,129,128,129,155,109,129,130,128,128,128,129,158,106,129,129,128,130,128,127,129,129,156,110,129,128,129,161,105,127,130,128,129,129,128,128,157,110,128,127,130,154,111,128,129,133,154,107,128,128,129,158,108,128,131,126,127,155,106,130,128,129,159,107,128,129,129,154,111,128,129,133,152,108,129,127,129,153,116,143,114,128,155,110,140,129,129,128,145,122,136,257,246,128,128,146,128,129,128,121,167,154,155,153,94,155,111,164,153,153,195,152,153,152,153,155,149,141,140,141,159,121,138,127,130,128,128,155,110,131,129,127,126,128,153,109,128,130,127,145,111,127,129,129,153,111,129,127,130,153,111,129,127,129,154,111,130,129,129,153,110,128,129,129,159,122,157,183,151,135,167,153,143,201,113,98,129,127,129,128,128,128,129,127,159,101,149,110,120,144,119,197,154,158,160,195,158,156,155,192,156,153,186,140,159,153,149,106,130,127,130,129,162,159,159,137,130,152,153,155,152,158,133,191,156,155,155,157,134,146,108,129,128,128,128,128,130,168,136,151,150,152,143,154,152,152,181,139,141,139,138,140,129,129,130,130,128,130,128,129,130,130,128,129,129,130,132,129,130,128,130,128,130,129,129,130,132,128,130,129,130,128,128,130,128,130,145,115,129,129,130,130,128,130,128,131,132,129,130,129,129,129,130,130,129,129,133,126,129,130,130,129,156,130,131,129,162,111,114,129,130,154,111,129,130,133,154,128,129,129,129,164,105,129,129,129,156,109,130,128,130,153,114,129,129,129,129,154,112,130,129,129,134,128,129,129,129,155,110,130,129,130,138,128,129,129,129,155,112,129,129,128,140,127,130,130,137,148,109,129,127,128,128,156,107,130,130,129,129,128,130,131,151,128,130,116,110,158,105,129,129,128,159,106,128,129,129,158,106,130,129,128,128,156,110,141,129,130,129,157,107,129,129,129,161,105,128,128,132,127,155,107,129,127,127,136,129,128,129,129,156,109,130,129,128,156,108,129,128,130,158,106,136,130,148,148,287,145,151,129,127,129,128,110,138,132,151,147,147,108,135,139,139,132,110,129,131,145,101,127,129,129,155,109,129,154,124,156,107,128,128,128,154,111,119,129,128,129,155,109,128,129,130,155,128,129,129,129,154,112,131,136,110,141,111,128,128,128,154,115,130,128,128,156,129,128,129,126,148,130,147,142,141,140,142,140,142,140,139,141,153,143,141,129,130,129,130,149,102,130,131,145,135,136,137,136,147,113,130,129,131,153,137,113,149,121,129,153,111,130,128,130,159,112,130,129,131,155,111,129,129,136,131,166,107,129,129,129,153,138,117,129,155,110,135,128,129,158,109,129,131,130,130,132,174,127,137,148,115,148,180,140,142,141,141,170,141,141,142,129,156,110,131,131,129,135,126,128,129,158,110,129,130,130,130,131,128,129,129,129,132,128,130,130,130,156,109,130,129,132,157,108,130,130,130,158,106,137,126,128,155,110,138,130,130,155,112,129,128,129,157,109,130,130,130,131,129,130,130,154,109,130,129,129,109,129,129,130,130,157,109,129,131,130,154,111,129,130,130,156,130,131,133,136,129,127,129,127,128,129,157,149,148,147,152,135,145,159,135,135,128,132,145,167,139,141,143,139,125,132,125,130,130,129,129,129,128,133,129,129,128,154,111,129,128,130,157,110,129,129,128,153,112,129,127,131,128,129,128,130,154,111,128,130,128,154,113,128,130,128,154,111,129,129,130,157,129,128,128,130,154,111,129,131,129,154,112,129,129,129,205,122,129,134,123,130,128,129,130,128,128,128,128,147,133,150,146,124,139,139,140,170,141,140,128,128,158,106,129,129,128,156,108,130,131,127,132,118,138,128,244,138,127,129,129,126,128,128,156,123,136,140,121,141,152,118,132,157,106,152,126,126,157,105,128,128,128,155,108,128,151,130,126,129,158,106,128,127,131,156,128,129,127,129,158,105,132,128,128,155,109,127,129,129,156,108,128,129,129,156,108,128,129,127,130,128,127,129,157,109,129,129,129,128,128,127,129,156,109,127,129,129,130,126,129,129,155,112,128,128,129,129,127,129,129,154,129,129,129,129,131,127,128,129,155,129,128,147,138,155,128,128,129,127,155,111,128,132,128,152,113,127,129,127,156,112,114,140,141,126,127,127,126,128,145,151,148,146,147,129,129,130,129,146,114,128,136,140,115,128,164,106,113,128,132,125,129,174,123,127,129,156,175,155,156,157,156,157,134,137,224,147,127,127,125,130,127,145,134,119,139,142,135,134,150,185,155,156,137,133,135,137,134,134,134,135,139,130,132,149,156,158,152,143,123,135,135,137,134,135,137,129,161,167,109,133,112,135,138,113,133,139,132,142,132,166,140,149,149,123,137,144,171,136,162,139,179,135,132,151,159,158,158,143,157,166,205,150,134,135,133,134,131,133,135,133,155,163,157,137,160,114,153,136,178,132,176,161,139,156,159,168,193,131,132,138,157,159,156,159,161,161,154,118,166,146,135,125,142,142,168,133,140,172,139,146,140,128,145,165,157,157,167,123,129,140,109,159,161,159,148,145,146,147,154,163,165,148,125,138,128,142,148,123,146,125,153,115,128,130,126,133,158,150,154,139,154,156,116,133,135,118,133,129,130,108,160,149,168,143,148,123,130,147,149,121,129,116,141,133,128,132,144,121,108,134,142,129,138,137,134,150,148,149,133,139,149,148,132,156,122,134,132,131,111,128,127,130,113,121,130,139,155,154,134,160,135,137,135,142,129,134,147,114,127,130,128,131,135,135,130,133,127,134,129,131,129,130,139,127,128,127,127,127,147,157,154,150,151,153,128,131,132,135,130,127,129,128,128,130,128,132,180,158,156,158,158,112,160,121,152,156,144,164,124,155,125,144,134,134,128,131,127,130,133,134,131,127,131,132,129,130,132,153,113,145,149,143,111,128,135,103,119,125,136,238,131,129,135,118,137,135,132,139,135,138,128,130,160,146,138,134,114,128,130,148,110,152,122,142,150,146,119,145,96,128,156,146,134,131,142,140,137,142,144,163,149,120,125,142,115,163,123,156,144,141,139,145,115,125,128,160,148,147,177,122,147,145,149,145,145,146,192,144,163,124,141,137,129,153,111,128,129,128,146,125,111,128,149,153,139,140,140,168,138,140,139,138,170,140,158,127,128,153,112,128,129,128,154,128,143,146,193,157,140,150,126,130,130,128,140,120,136,155,160,195,158,158,149,158,132,113,139,140,130,130,127,130,128,129,150,131,117,129,128,157,107,128,128,128,158,107,129,129,130,155,129,130,128,128,160,103,131,130,128,129,128,158,106,129,128,129,134,125,129,128,129,158,105,128,128,129,109,127,129,129,128,159,104,129,131,128,156,108,129,129,128,158,107,128,129,128,162,126,126,129,129,130,127,129,128,158,107,129,129,128,130,128,127,129,129,159,107,128,128,129,156,108,128,129,128,156,109,129,129,127,158,105,130,128,128,156,113,128,128,129,155,131,130,130,138,96,126,261,259,128,129,130,130,127,146,110,128,118,127,131,135,152,110,145,150,138,138,140,167,138,140,143,126,129,130,129,153,111,129,132,127,153,113,126,127,128,165,95,130,127,129,128,129,153,110,128,128,134,160,129,130,128,129,130,129,129,129,131,128,130,128,130,128,130,128,129,133,139,185,164,158,169,196,156,143,156,164,147,134,158,150,129,128,156,108,144,127,127,152,144,132,111,196,156,163,156,196,159,160,156,198,159,155,148,157,154,156,137,138,148,167,134,132,115,130,125,126,129,127,130,125,132,150,147,115,168,114,159,158,162,152,126,128,129,129,158,108,129,128,145,125,128,129,129,157,109,128,129,129,129,156,109,129,129,129,160,105,129,128,129,159,105,129,128,129,131,127,128,129,129,158,106,129,130,131,155,103,134,126,128,129,146,126,121,130,161,144,148,144,148,189,164,132,146,147,147,191,148,139,140,158,125,143,127,129,154,113,129,129,130,135,125,128,127,140,128,126,129,127,151,110,130,126,128,129,154,112,128,128,130,153,112,128,129,129,153,112,129,136,155,143,143,146,159,147,146,148,147,141,138,167,139,140,139,155,110,127,129,129,155,111,129,128,130,153,112,128,128,129,177,91,130,128,129,131,129,129,130,130,134,125,114,130,125,130,128,129,129,128,178,91,127,138,164,122,125,133,161,156,138,131,150,111,157,105,128,129,129,180,88,129,127,129,156,116,128,127,128,169,99,129,128,129,157,109,128,128,129,168,101,129,128,129,136,111,128,128,157,107,128,128,130,158,129,128,129,129,156,107,129,129,129,157,107,128,129,129,128,131,173,142,156,276,143,137,138,157,127,129,137,129,160,130,130,163,107,149,156,150,172,153,154,153,176,150,153,150,152,171,128,129,129,130,154,109,128,128,128,128,128,130,129,157,109,129,129,128,135,125,130,129,156,129,129,128,128,147,124,131,142,190,145,146,111,156,110,128,130,129,130,129,130,128,128,130,129,130,129,129,130,129,131,128,130,129,129,129,130,129,131,128,130,128,130,129,129,130,128,130,129,130,129,128,129,130,129,130,130,129,128,130,129,129,130,129,130,131,153,138,118,129,125,129,156,117,127,127,128,154,111,127,128,176,87,127,154,129,130,137,130,129,129,130,129,131,128,129,151,132,121,137,166,130,155,175,138,152,156,151,151,153,153,150,153,169,138,153,150,131,129,126,133,131,131,130,147,133,131,127,133,129,129,129,156,110,129,129,129,157,110,129,128,129,155,110,128,128,135,157,105,129,128,130,158,106,129,109,128,155,111,128,129,124,127,156,107,129,128,129,157,107,128,129,130,157,128,128,129,129,157,107,128,129,129,156,107,106,144,132,143,147,147,145,174,138,141,141,129,169,123,156,158,130,156,153,156,155,128,138,142,143,149,145,136,129,116,152,114,132,154,111,128,129,130,159,111,134,124,112,128,133,154,112,130,129,128,130,129,130,129,129,128,129,129,156,115,128,127,131,157,115,128,128,130,155,110,128,128,128,154,110,129,128,133,159,129,130,130,130,130,129,130,130,130,130,167,153,155,155,158,153,156,153,146,144,147,143,147,127,134,140,146,179,128,129,129,130,140,127,129,129,130,141,142,146,133,127,181,128,130,146,140,169,142,138,141,141,138,108,259,122,109,128,133,127,129,130,128,145,160,132,143,155,120,198,143,196,144,113,148,146,193,146,146,140,140,170,144,137,128,128,129,133,127,130,127,130,144,115,128,135,134,143,140,110,156,109,129,129,129,157,106,127,129,151,156,109,128,128,128,156,107,127,126,132,128,127,128,128,157,108,128,128,130,153,111,128,129,129,156,108,129,129,128,155,110,127,129,128,159,109,129,128,129,155,111,128,129,131,156,129,131,149,147,108,141,139,130,128,129,128,154,114,130,128,164,128,127,130,128,154,112,129,128,129,117,126,128,127,129,154,122,128,129,130,154,110,127,129,127,153,113,131,129,128,153,113,129,127,129,154,130,113,127,129,153,110,129,128,129,128,128,173,155,151,174,130,155,165,127,148,147,147,148,147,149,148,121,142,130,128,131,137,129,130,129,129,153,148,168,145,133,130,150,156,127,129,129,129,135,125,129,128,127,157,107,128,130,143,137,129,150,128,127,130,129,156,109,128,134,161,128,144,192,145,147,146,147,191,163,121,140,140,140,172,129,128,129,128,158,106,129,129,129,129,128,146,153,135,256,127,127,129,113,128,131,128,126,170,132,128,159,111,158,131,115,127,129,157,108,128,129,130,158,128,129,128,129,122,141,138,169,158,163,154,175,157,288,173,149,104,139,151,121,107,114,128,135,162,197,115,135,121,405,131,121,158,154,161,142,176,120,171,121,154,160,153,127,160,131,150,125,169,125,153,129,132,111,109,119,143,155,173,161,121,121,170,149,138,139,135,146,146,139,140,140,136,124,152,122,134,150,112,129,126,128,128,159,113,145,116,127,127,128,128,155,154,147,140,139,142,140,168,141,141,108,139,142,139,140,140,142,151,113,129,141,149,144,150,153,127,129,129,135,131,145,132,129,129,130,130,129,130,129,119,129,130,129,128,130,131,129,130,129,129,128,137,148,130,152,130,156,132,107,127,126,133,153,107,128,129,128,155,108,131,129,126,159,104,128,131,128,158,107,130,128,128,129,129,152,164,180,151,127,142,126,156,105,128,129,128,157,111,127,128,127,156,109,129,128,128,176,126,129,128,130,128,129,128,130,158,104,129,150,122,146,148,147,149,153,98,321,267,161,160,152,149,149,149,152,117,155,122,157,159,134,124,166,142,175,130,126,139,140,126,128,128,130,143,119,125,148,114,153,138,138,168,128,129,128,128,129,129,129,128,129,156,94,127,129,128,154,110,128,129,134,153,112,127,128,127,157,106,129,128,129,129,128,128,129,128,155,111,128,129,128,108,127,130,131,154,110,128,132,126,154,110,129,128,129,154,110,132,130,157,110,129,128,129,153,110,144,115,131,140,134,140,118,163,97,137,112,130,130,149,113,136,123,151,108,127,129,122,136,125,127,128,125,130,130,132,129,127,155,110,131,129,115,131,147,130,141,137,123,137,131,141,122,127,158,105,129,129,128,158,105,129,129,127,129,159,104,131,129,129,128,129,158,104,129,129,132,160,128,128,128,128,156,108,134,130,179,148,158,151,159,153,158,131,159,123,190,165,159,119,139,131,127,130,129,154,109,127,158,108,131,129,127,128,128,157,109,129,130,129,157,108,128,129,128,154,110,132,135,125,155,129,129,130,128,156,110,128,129,129,154,109,129,129,133,157,138,162,310,157,154,160,122,160,155,151,147,132,106,154,105,132,154,117,162,131,134,138,155,149,150,129,150,169,149,150,148,150,157,132,154,143,148,142,150,132,159,143,147,144,131,138,140,144,150,129,125,127,129,157,105,141,127,127,153,109,127,128,128,152,111,130,128,128,127,129,151,112,133,125,128,152,128,129,150,125,135,132,124,156,109,130,129,130,152,112,129,130,129,133,130,130,109,130,132,127,131,154,111,129,130,128,164,119,126,136,131,156,107,128,133,125,147,150,110,144,126,130,162,129,128,132,128,128,129,129,128,129,129,129,132,129,133,159,106,155,133,136,129,129,157,115,126,128,127,157,108,129,129,128,157,107,129,128,128,159,106,129,129,128,129,128,129,129,156,109,129,128,129,130,128,128,129,157,106,129,129,130,160,104,127,127,127,153,108,127,126,129,127,128,132,124,156,108,129,129,139,136,160,129,157,105,129,129,128,155,110,128,128,129,158,106,128,129,129,129,126,131,128,130,128,130,154,112,130,127,130,154,112,130,130,129,130,128,128,128,155,113,128,129,130,158,153,167,150,152,198,143,123,134,284,144,148,140,141,149,159,111,129,112,108,136,134,129,143,132,130,124,162,104,129,129,129,154,113,129,127,129,155,110,129,128,132,149,129,129,128,141,139,111,128,128,155,114,128,129,128,155,110,129,128,130,142,131,129,130,166,148,134,139,128,129,160,159,148,179,174,190,152,159,146,174,179,92,156,107,131,128,133,126,128,126,128,144,109,144,161,144,125,134,172,127,129,129,129,159,104,129,129,129,158,105,128,129,128,158,106,129,140,127,127,129,128,158,107,132,130,115,146,92,156,159,158,129,136,161,140,158,161,139,97,133,136,131,131,150,135,132,180,140,139,140,129,129,129,129,128,155,108,129,128,131,128,158,105,129,127,129,155,109,130,129,129,157,107,128,129,129,157,128,129,129,128,156,107,129,128,129,165,176,130,128,160,130,130,145,138,153,158,106,129,129,129,154,114,129,128,130,153,127,129,134,159,110,129,130,130,155,129,130,130,130,153,112,130,130,128,155,112,129,128,129,129,155,111,128,129,129,130,127,129,129,154,111,128,129,130,155,128,131,127,147,109,132,108,156,149,174,192,144,145,141,146,168,153,145,146,129,128,155,111,128,129,130,155,110,129,129,129,152,110,129,130,128,165,98,129,129,129,156,147,137,132,113,131,149,165,98,132,132,147,141,130,129,149,113,150,132,129,128,128,136,178,128,134,149,118,141,106,117,152,131,154,134,166,188,147,150,151,151,172,150,147,151,151,170,145,127,129,129,128,158,107,128,129,129,131,127,127,129,129,156,108,129,128,131,158,107,129,128,129,156,107,130,129,129,158,106,129,164,97,144,124,131,148,147,160,124,146,153,150,150,146,131,128,131,120,148,146,112,130,135,134,155,155,192,147,148,147,145,162,147,112,127,128,129,157,103,127,129,126,155,108,129,128,129,157,109,129,144,114,127,129,129,154,112,128,129,149,163,146,128,127,159,120,148,148,149,146,138,140,140,129,154,106,128,129,128,155,112,130,129,155,124,127,152,110,127,127,127,151,109,130,141,126,153,112,127,129,129,154,113,128,128,129,154,112,128,129,129,133,125,127,128,156,107,128,129,166,152,140,130,126,124,153,136,138,116,148,141,143,148,116,128,130,127,129,129,129,129,155,113,108,132,130,161,147,123,134,136,129,130,130,161,108,131,130,128,156,111,130,106,132,155,109,127,129,128,157,107,130,132,164,156,136,135,147,176,147,151,157,130,130,131,130,126,167,107,128,128,132,130,128,127,128,159,105,134,126,130,131,128,129,128,141,158,109,128,129,128,158,105,127,129,129,156,109,129,142,128,127,129,128,158,108,127,129,130,157,107,129,128,129,161,103,130,126,129,113,156,156,115,128,135,128,172,185,146,146,180,152,104,270,128,128,126,127,129,126,128,148,163,143,163,173,150,117,149,146,151,170,153,148,146,141,140,131,130,129,128,130,127,168,159,106,159,107,128,128,145,126,128,129,129,149,151,137,145,134,119,133,128,129,128,149,140,112,129,129,129,157,110,128,129,129,155,129,117,129,129,129,176,92,129,128,130,153,126,128,129,129,155,110,129,129,129,161,128,130,129,130,129,130,128,130,129,130,128,130,129,130,128,130,128,129,139,138,151,167,121,128,121,124,148,133,125,152,109,143,118,155,111,154,130,103,131,129,128,128,145,146,115,147,137,164,157,157,107,128,130,127,156,107,127,129,128,159,105,128,129,153,157,108,128,129,130,130,128,129,127,154,128,129,130,163,136,131,177,130,158,133,149,126,147,160,128,128,148,128,129,128,129,156,108,129,128,128,170,113,128,129,128,156,108,128,127,129,161,103,127,129,128,155,109,127,129,129,155,108,129,129,128,158,107,128,129,128,156,127,130,128,130,159,108,127,172,121,148,173,131,153,154,132,167,156,136,138,128,155,112,129,128,132,135,126,128,120,131,131,132,122,137,144,156,157,149,149,150,148,153,124,121,179,111,134,141,158,146,133,123,129,155,110,129,129,127,155,112,128,130,128,129,129,148,131,146,112,130,146,114,130,127,131,128,154,115,130,129,128,155,110,128,128,129,159,128,129,129,129,155,110,129,128,149,107,126,127,127,152,109,128,144,112,105,128,128,129,128,154,111,132,166,120,127,129,120,136,128,130,128,153,114,129,128,109,141,139,141,160,151,132,132,136,130,129,131,169,107,129,130,128,161,105,128,129,129,156,128,129,131,127,128,113,256,129,127,128,129,121,132,129,164,150,125,131,150,113,141,132,142,125,130,158,104,127,129,129,159,107,129,128,128,129,172,134,127,131,132,109,151,147,154,164,128,128,127,130,156,109,128,128,129,159,105,129,155,111,129,128,130,157,106,130,129,128,152,128,129,129,129,158,106,130,129,128,126,157,103,129,128,129,132,128,130,127,129,155,110,129,130,130,160,129,128,146,135,131,128,151,148,129,151,149,131,156,110,129,130,129,154,110,112,148,148,148,128,131,130,128,130,130,130,129,129,130,129,142,187,146,150,147,149,191,149,147,130,128,156,111,132,128,129,129,128,154,110,129,134,135,127,126,129,162,111,111,146,132,140,124,120,129,152,207,190,135,122,137,141,168,130,130,130,128,135,132,128,128,154,112,128,129,130,156,110,130,130,145,144,113,142,151,197,101,151,157,146,173,129,128,128,128,158,107,132,129,131,128,128,159,104,130,133,116,129,153,131,129,130,128,150,141,157,127,127,129,129,156,107,129,129,130,128,129,128,129,156,109,129,129,131,155,109,128,129,129,156,108,128,132,184,159,154,126,127,128,127,128,127,128,136,162,163,132,155,121,116,118,126,126,128,155,111,129,114,126,129,128,131,130,127,129,152,108,171,127,153,115,165,99,146,129,171,139,139,140,139,168,140,130,128,129,155,112,128,130,129,134,125,134,127,128,153,112,128,130,130,130,131,127,129,128,127,126,153,111,128,132,128,126,129,129,153,128,135,157,145,132,127,130,129,133,152,109,127,129,130,128,127,128,129,154,112,128,128,130,153,111,129,127,129,155,111,130,129,129,153,112,129,128,128,167,128,126,136,158,200,152,107,135,128,129,107,172,141,142,106,129,127,128,129,129,136,132,140,138,131,135,121,140,145,128,165,151,133,161,155,152,152,128,159,105,129,128,129,128,119,119,127,128,128,158,106,129,129,129,131,126,129,129,129,157,107,128,129,129,130,127,129,128,129,157,108,129,129,129,160,105,128,156,108,128,141,142,133,145,128,105,149,151,111,172,151,152,151,150,169,153,147,151,129,158,107,129,128,131,129,129,132,132,130,129,130,129,129,137,132,129,129,129,130,129,131,129,130,129,110,129,130,148,112,129,127,126,129,126,128,128,155,155,157,172,130,150,125,141,150,133,158,156,140,130,109,153,112,128,131,129,130,129,146,137,117,128,129,130,129,128,132,128,150,112,129,128,129,154,112,129,129,127,165,104,127,129,129,152,114,128,128,128,155,110,128,128,129,130,128,128,128,154,111,130,158,119,131,152,113,134,113,129,131,131,135,154,108,128,128,132,151,108,123,132,126,132,129,129,130,130,136,132,126,129,161,137,126,128,128,129,162,105,128,130,128,152,122,137,115,134,144,101,129,128,157,108,127,137,134,129,129,125,128,128,131,121,116,137,131,127,129,166,124,131,133,155,152,150,121,140,107,127,131,134,125,126,156,109,125,134,129,127,147,114,128,130,127,159,104,128,129,128,158,106,128,128,129,165,101,150,127,127,155,112,128,128,128,156,105,142,128,127,129,129,157,108,168,135,132,127,137,147,140,135,196,161,146,139,141,140,141,142,170,140,140,131,127,167,103,129,129,129,155,112,129,130,129,129,130,129,155,114,129,129,129,132,128,129,129,130,154,130,132,129,130,143,129,130,129,129,155,111,130,128,130,150,155,119,126,131,139,133,147,146,139,132,153,111,129,129,129,154,118,126,129,129,154,111,128,128,131,155,130,130,130,127,154,110,131,130,146,123,147,91,130,129,127,155,111,128,129,128,154,112,129,131,129,159,102,114,121,128,128,127,128,137,139,116,139,133,134,130,130,124,130,129,130,133,151,108,126,128,129,129,128,129,129,153,110,127,127,173,160,156,158,158,162,158,151,134,155,135,127,127,127,163,139,125,134,139,134,138,131,163,132,132,131,132,136,135,135,135,133,139,168,138,138,134,396,134,116,115,146,134,117,137,132,134,156,132,136,152,130,202,74,138,135,136,156,147,98,136,149,131,165,145,145,157,114,179,120,129,175,137,189,163,152,150,147,150,164,150,164,163,146,149,156,141,137,147,131,146,134,131,177,132,143,156,117,145,156,136,154,138,116,128,129,151,147,145,141,160,158,144,148,139,126,158,140,143,139,140,139,140,140,141,120,138,150,148,148,142,141,130,110,131,134,129,130,137,141,155,133,145,113,129,160,129,146,169,140,117,151,137,145,115,127,155,156,135,134,129,129,118,146,115,128,128,143,133,128,146,151,158,128,146,146,126,134,130,130,117,113,138,128,134,130,131,126,159,180,142,127,122,113,113,134,171,138,132,122,152,166,140,133,144,119,155,154,138,146,114,148,159,150,138,174,94,118,141,116,153,134,156,134,170,108,121,123,132,129,113,128,133,136,132,134,131,132,131,129,123,137,131,130,119,138,134,131,150,148,111,128,127,144,125,128,129,127,127,127,130,150,89,135,156,137,124,128,144,133,142,153,142,148,134,110,130,128,128,129,137,133,141,134,131,131,129,135,131,136,132,126,115,134,115,103,153,155,137,140,149,118,158,143,159,149,125,158,145,125,142,154,140,142,138,147,105,133,135,159,147,139,136,121,133,119,146,143,111,138,163,145,126,159,155,161,151,125,138,147,129,124,137,130,119,129,129,118,164,140,148,149,149,150,151,149,137,145,145,142,137,132,148,123,136,246,121,147,156,127,128,162,163,153,146,145,129,127,144,148,118,138,130,137,154,151,156,132,147,112,141,142,168,126,144,142,142,172,138,133,126,128,171,141,140,140,139,171,140,142,140,161,146,128,128,149,115,128,127,156,108,129,131,126,154,107,129,129,129,157,111,130,130,139,124,128,128,129,128,129,128,130,127,128,135,131,114,128,121,138,139,127,128,129,129,158,105,130,128,129,130,128,129,128,157,107,128,129,129,128,129,128,129,157,109,128,128,129,131,128,128,130,158,107,129,128,127,130,129,129,128,156,110,129,129,129,130,127,129,128,158,108,128,129,128,123,130,113,126,128,158,105,128,132,130,127,126,128,156,107,129,129,132,134,116,168,279,127,127,127,162,135,147,144,145,147,155,150,161,132,150,129,140,124,131,129,126,128,130,131,128,129,173,192,156,155,156,166,132,125,129,127,155,129,97,138,149,144,167,179,151,154,154,154,194,152,155,146,148,171,148,147,147,162,115,129,129,128,154,111,128,129,128,153,96,129,128,128,155,112,128,129,129,156,110,127,121,131,160,132,133,143,134,113,126,132,155,118,131,128,128,148,123,132,126,144,136,166,126,141,146,196,154,158,156,195,159,158,160,134,129,277,159,154,150,151,150,151,149,113,139,164,130,130,129,139,128,130,128,128,129,156,109,127,129,131,161,129,128,128,129,164,131,127,128,127,129,142,105,144,112,119,158,108,129,128,128,156,108,129,128,128,159,106,129,129,129,156,106,129,128,128,160,110,128,128,129,129,155,109,128,129,129,158,110,125,128,129,155,107,128,128,133,155,107,127,129,129,154,109,127,129,130,155,111,128,128,129,156,168,88,147,139,125,109,128,128,152,109,141,130,129,126,128,131,153,140,97,132,128,152,113,127,129,129,153,111,136,128,126,154,112,128,129,129,156,105,127,129,128,154,111,129,127,148,139,110,129,127,129,154,111,129,129,128,154,111,129,129,127,140,151,113,126,141,151,151,155,152,192,155,146,139,141,167,139,140,154,130,129,129,128,136,132,124,129,167,127,130,128,142,139,154,149,140,196,156,155,170,157,157,153,154,193,156,175,135,149,170,148,149,150,127,161,103,127,129,129,131,156,109,127,127,128,148,142,126,129,127,129,156,108,127,129,112,157,107,129,128,129,160,104,128,130,133,147,142,293,143,111,126,129,128,127,128,171,137,160,156,168,147,132,128,148,146,150,169,152,146,152,157,149,140,135,134,133,130,127,129,129,131,225,40,104,122,150,147,137,109,129,129,127,162,127,128,129,129,157,107,128,128,129,128,129,129,129,154,129,130,145,133,88,129,129,129,153,112,129,132,129,153,111,130,129,128,130,126,160,106,128,153,108,127,157,122,166,108,136,132,114,155,108,129,128,128,154,112,119,129,128,130,128,155,110,129,130,127,154,111,127,129,129,163,104,128,130,128,154,112,128,130,128,158,152,113,138,140,166,140,138,142,168,142,138,140,114,127,139,130,184,153,193,158,162,157,137,166,127,143,129,136,106,117,107,141,91,128,127,128,157,108,130,128,130,157,108,128,129,128,158,108,129,129,140,127,128,129,128,158,107,128,131,130,158,113,127,129,128,130,156,119,127,126,129,158,108,129,129,129,130,128,129,129,163,116,128,127,174,129,129,129,129,133,157,128,129,129,128,155,111,128,129,130,159,107,128,128,128,157,109,129,128,129,130,128,129,128,155,111,128,128,129,130,128,155,138,161,153,133,154,159,157,157,156,160,187,150,131,159,111,150,143,141,147,126,150,129,148,152,141,126,129,154,129,128,129,129,165,102,127,129,128,152,113,143,119,134,162,109,129,129,128,154,111,129,129,130,154,111,129,128,129,153,114,128,129,128,154,112,129,128,128,156,129,129,128,128,154,111,129,130,129,155,140,127,129,123,171,101,128,129,129,154,110,129,127,130,157,128,129,129,128,174,94,128,131,128,179,135,131,128,128,129,145,139,143,158,115,129,125,129,129,162,127,137,153,128,126,138,128,130,147,108,125,126,129,130,130,125,129,139,153,131,125,122,144,128,144,108,129,127,129,147,109,128,129,156,109,129,129,131,157,129,128,129,129,157,108,128,128,148,112,130,127,126,158,104,129,126,127,158,88,129,127,129,159,105,128,128,131,159,128,129,127,129,155,110,130,128,128,156,108,129,129,132,154,170,196,145,148,147,129,132,162,97,128,129,130,129,128,129,130,130,129,130,128,128,130,128,128,127,132,129,128,128,130,129,130,128,130,130,130,130,129,130,130,129,129,129,142,119,129,129,130,130,131,130,135,109,127,133,133,150,127,162,137,162,128,171,140,139,139,140,167,132,128,129,129,129,154,112,129,129,129,159,109,129,126,128,165,122,128,130,129,154,112,129,128,129,154,112,128,129,129,156,111,129,128,129,154,112,130,127,129,129,129,154,112,129,129,130,153,111,157,163,151,139,165,141,142,113,152,111,127,131,127,127,129,129,159,105,131,130,162,130,134,134,142,159,141,125,140,139,140,141,139,141,142,140,140,142,141,141,128,131,129,129,155,109,130,130,128,161,128,130,126,129,117,128,129,135,129,145,144,161,139,162,158,155,127,128,127,148,109,146,128,156,147,145,114,176,143,129,127,128,117,128,129,128,127,158,107,129,129,130,156,108,129,128,128,158,106,130,128,129,155,111,129,129,129,163,102,128,127,129,157,108,129,128,128,160,133,131,143,106,152,179,145,149,144,147,161,141,148,139,140,167,142,137,140,141,127,155,112,128,128,128,132,126,131,128,129,146,114,129,128,128,155,128,128,128,129,155,112,129,129,129,154,112,128,129,127,165,105,130,129,129,153,125,129,134,136,133,134,125,128,151,138,114,127,129,155,112,129,128,128,110,129,129,127,129,155,111,128,131,128,154,110,128,129,129,155,112,128,129,129,128,129,177,99,129,130,142,118,127,128,153,117,139,128,129,129,131,126,128,134,114,164,106,131,171,142,157,133,129,128,113,160,105,129,129,127,157,108,128,130,129,129,129,129,127,129,156,107,128,128,129,153,109,129,127,129,157,108,127,130,128,157,105,127,129,129,158,108,128,127,129,157,108,127,129,129,128,128,127,129,158,107,129,128,128,129,128,169,94,105,129,128,161,130,134,154,148,148,147,129,141,128,128,131,127,128,131,131,135,125,129,130,130,128,127,129,155,109,129,129,129,157,108,129,130,127,157,106,129,129,128,154,112,128,129,129,156,111,131,130,130,151,130,129,129,129,156,109,120,122,130,132,103,159,109,129,129,129,154,112,128,129,130,128,127,128,129,153,111,129,129,130,154,111,129,129,133,128,130,127,128,155,111,129,129,128,153,113,128,129,127,155,111,129,129,128,129,128,129,129,152,113,127,129,131,153,110,129,129,129,150,121,153,147,176,180,139,152,121,113,128,174,146,160,115,130,128,129,129,160,105,129,128,129,130,130,152,121,133,150,106,180,129,126,126,129,157,103,129,126,129,154,108,130,128,130,128,130,129,129,132,126,128,129,127,156,109,129,127,162,131,132,145,109,167,149,148,151,148,171,148,152,128,149,142,152,149,147,149,150,153,154,109,129,127,129,157,108,127,129,144,142,106,129,129,127,154,108,126,132,126,155,104,126,128,128,155,110,131,126,128,154,108,128,126,128,187,121,181,133,157,186,197,170,132,127,124,128,157,109,129,132,142,260,127,127,128,129,127,129,128,133,136,137,140,130,132,132,152,137,130,138,116,127,131,144,149,161,148,123,168,140,140,139,128,153,112,128,130,129,128,128,129,129,154,119,138,146,153,138,168,142,140,139,140,161,109,128,129,128,155,110,127,129,145,139,112,128,129,129,154,112,127,129,141,128,129,128,129,136,118,129,129,129,127,128,132,127,129,131,128,127,133,126,132,128,128,129,128,129,157,107,127,146,128,162,118,138,108,140,120,126,117,127,131,154,108,128,128,129,157,108,129,128,129,159,116,134,146,115,125,130,129,127,128,134,129,128,129,149,111,132,126,161,128,155,130,127,128,157,107,133,126,128,156,108,129,128,131,156,109,129,128,129,156,110,145,158,118,130,143,94,128,107,126,153,194,159,160,155,196,161,159,151,170,152,155,128,129,155,109,129,127,129,158,107,145,127,129,127,129,156,108,129,128,129,147,128,127,129,128,156,111,129,129,130,153,111,129,131,128,154,111,108,128,135,153,174,162,109,146,162,149,138,172,138,130,128,130,154,112,130,129,159,128,131,129,129,130,130,113,137,126,132,127,129,129,128,166,112,173,156,154,193,157,154,156,208,145,149,147,148,169,148,154,146,148,149,129,154,107,149,130,192,158,131,140,131,130,126,167,129,147,115,131,131,127,129,130,155,154,200,102,151,149,153,150,154,130,129,129,142,152,131,137,133,135,104,128,129,128,158,104,128,128,129,159,106,128,128,155,155,108,128,128,129,157,111,126,161,106,148,110,136,133,130,130,149,163,160,105,129,128,129,156,106,133,127,127,157,108,128,129,128,159,105,129,131,129,128,158,134,131,128,127,129,128,128,128,126,129,135,131,145,133,113,128,128,132,128,127,129,130,130,130,130,131,130,128,128,145,135,129,132,126,144,111,152,134,133,173,170,150,149,153,151,169,149,147,130,129,155,110,129,130,109,155,111,131,129,129,156,111,139,129,130,130,132,131,140,130,129,158,164,140,150,149,151,191,149,150,113,143,190,149,145,143,160,139,159,148,110,125,157,157,127,129,137,153,187,146,150,151,149,211,146,149,152,150,193,150,142,144,154,128,130,130,129,153,153,149,145,191,150,156,152,158,149,137,130,142,137,140,140,137,145,143,141,114,127,158,106,142,146,135,126,131,127,133,129,109,131,129,155,131,127,132,128,129,129,129,156,110,129,130,130,140,126,129,129,129,156,112,129,128,129,158,111,130,130,129,131,130,130,130,133,129,128,130,128,159,130,129,130,129,147,128,131,128,130,155,109,130,134,131,129,128,148,147,136,193,159,137,141,126,140,141,144,156,125,157,141,116,130,129,131,130,131,132,129,129,131,131,130,129,131,130,130,131,130,130,144,115,130,130,131,133,147,148,130,129,127,127,128,129,127,136,148,206,156,147,133,137,139,133,147,146,150,151,147,147,192,100,128,133,128,137,144,150,154,154,133,154,112,129,128,129,155,111,129,128,132,127,129,128,129,156,109,128,129,129,141,114,129,128,129,155,112,129,129,129,142,127,128,129,130,154,111,128,131,154,133,129,129,130,128,113,128,127,135,154,129,129,145,127,130,129,139,125,130,130,129,130,118,118,129,128,130,129,130,128,156,130,143,130,147,139,128,128,128,130,129,129,129,127,129,158,260,126,126,128,129,127,133,128,127,128,135,126,134,135,128,137,139,127,153,129,160,163,105,192,157,156,159,173,152,150,140,150,129,128,129,129,129,127,158,107,129,129,128,157,109,128,129,129,157,114,128,129,128,129,159,105,127,129,129,162,131,109,128,128,154,108,128,128,152,156,120,127,126,129,154,107,132,126,129,154,148,117,128,127,137,151,156,160,193,155,158,148,152,168,149,148,148,148,155,109,136,128,130,155,112,130,128,130,156,111,131,134,129,129,135,124,127,127,128,127,153,121,139,140,140,168,138,138,144,166,138,139,140,139,167,129,142,153,145,129,125,152,112,130,151,149,126,155,110,128,131,130,158,129,128,128,130,153,109,128,128,133,131,131,130,130,130,130,133,167,146,157,151,158,147,149,149,162,117,131,129,129,129,145,113,128,129,129,156,109,155,126,141,143,133,170,135,136,153,128,136,131,129,145,139,170,170,140,130,127,128,156,109,129,129,129,157,110,128,129,129,158,106,129,129,128,129,128,129,129,156,108,130,129,129,128,128,129,128,158,107,128,128,181,131,147,268,159,160,163,149,154,152,123,122,134,135,135,134,136,131,149,118,132,156,138,105,131,126,129,128,129,158,109,128,128,129,138,127,129,129,128,157,109,128,129,128,156,108,128,129,129,157,108,129,142,117,129,129,128,155,110,129,129,129,162,114,130,130,129,131,129,131,130,145,117,163,111,144,131,140,104,127,143,140,109,129,129,129,154,111,128,129,130,155,109,129,128,129,153,111,131,129,129,129,129,157,108,129,129,130,156,128,128,128,130,127,128,155,109,130,129,129,154,111,130,129,129,154,112,176,146,148,149,151,144,135,150,144,118,122,144,115,298,163,106,128,134,105,131,129,131,130,129,129,129,129,129,130,129,108,141,122,134,110,143,144,130,129,158,106,128,130,129,128,157,108,129,129,129,158,106,152,110,130,130,128,158,102,129,128,127,155,107,133,134,151,139,161,155,123,138,158,110,160,105,128,129,129,162,108,125,128,128,128,128,158,128,129,128,129,157,108,129,129,128,128,128,129,130,128,127,129,131,129,128,129,129,156,111,128,129,128,129,160,104,129,129,128,129,128,129,129,130,129,269,120,126,135,132,128,128,127,151,150,132,134,134,165,133,146,133,132,164,158,156,155,165,110,125,129,127,164,100,125,128,128,147,115,129,128,169,89,111,126,126,128,128,128,154,112,128,128,129,152,109,132,125,129,154,113,127,129,129,132,130,139,150,154,130,152,168,142,161,184,140,140,139,139,168,129,129,128,129,154,138,129,172,141,155,156,155,192,130,150,149,147,170,162,141,131,130,135,125,131,127,127,114,129,126,128,128,156,114,159,132,145,143,172,151,131,145,175,168,149,126,141,150,145,147,147,147,146,134,129,156,133,141,137,128,122,139,140,130,172,140,138,138,139,172,139,139,141,140,127,128,129,157,110,129,129,130,157,106,129,129,129,159,105,131,128,128,157,109,128,129,129,161,157,111,154,158,129,128,127,135,151,176,139,138,140,140,171,144,135,129,128,129,159,106,129,128,129,143,128,130,130,130,143,128,130,129,130,129,129,129,136,128,128,130,129,155,114,128,130,128,155,112,129,131,135,153,129,129,129,130,156,115,156,110,133,141,140,95,152,114,155,178,153,148,148,168,149,149,148,129,131,127,129,129,128,155,110,129,129,128,157,113,129,129,129,129,131,129,130,132,124,130,127,129,129,154,112,129,128,130,131,128,128,129,129,154,111,129,127,142,127,154,109,149,130,129,130,135,122,128,128,129,140,153,113,128,108,131,127,130,129,130,164,146,128,156,132,146,109,155,106,129,128,128,159,105,127,129,129,159,105,127,134,127,159,105,127,129,129,161,100,134,129,128,129,130,128,128,128,129,130,129,121,143,102,122,159,158,166,131,162,160,106,127,129,130,132,129,125,126,128,127,131,128,129,155,112,164,163,157,134,132,146,163,171,151,152,152,151,172,153,152,127,128,156,108,130,129,128,130,128,129,149,138,107,128,128,129,157,98,130,154,128,175,140,151,156,126,149,151,157,106,128,128,134,128,128,129,128,156,111,128,129,130,161,127,126,129,135,151,110,128,129,130,156,114,125,131,105,128,154,110,127,129,130,126,129,127,154,112,127,129,129,120,128,128,128,129,155,110,128,158,133,140,132,139,146,164,127,115,134,147,142,110,130,129,129,128,146,147,128,128,129,129,128,129,127,129,129,153,113,127,129,129,160,107,131,129,151,109,128,152,112,128,130,129,128,128,129,158,129,137,115,144,155,180,105,193,144,149,142,106,169,129,157,110,121,129,137,166,99,129,126,129,158,102,128,129,129,129,129,129,129,128,158,108,127,130,129,156,113,130,130,130,129,129,130,129,130,130,130,161,143,147,147,145,143,148,129,163,142,147,146,125,135,142,141,140,140,125,165,125,129,174,102,124,144,131,164,103,129,128,130,157,107,129,127,131,158,129,128,129,173,158,156,142,255,127,128,128,127,128,132,151,168,105,134,136,143,152,146,113,144,140,117,127,131,131,127,129,147,131,128,130,157,107,128,128,110,130,132,128,142,130,150,145,151,97,129,157,127,129,129,128,154,110,133,128,128,155,112,129,128,129,129,156,112,129,129,130,152,112,129,128,129,129,129,129,129,154,112,129,129,128,155,112,129,127,129,155,110,129,127,131,153,111,129,129,128,131,143,134,166,125,133,124,130,144,136,153,152,139,161,139,156,139,131,152,126,130,160,128,129,133,127,158,87,132,147,108,126,130,125,130,110,129,131,142,147,109,149,132,116,154,152,103,139,174,139,140,139,141,129,128,129,157,109,129,149,141,131,128,128,130,128,131,153,113,127,128,129,158,107,127,129,129,156,109,129,129,127,161,103,128,129,128,159,109,128,128,129,129,157,107,129,129,129,150,127,128,128,126,161,101,128,128,132,146,129,129,128,128,159,105,129,129,128,173,109,133,132,147,157,156,125,158,133,191,155,155,157,168,150,149,161,145,149,147,155,112,146,126,129,130,127,129,130,129,129,129,141,138,137,154,155,133,127,128,131,127,129,131,128,129,130,130,130,151,113,127,128,134,151,157,156,156,124,142,139,137,139,127,119,131,164,124,144,140,142,168,115,134,140,134,139,132,126,122,147,136,136,135,132,137,132,134,136,139,131,132,142,119,182,142,141,132,133,149,134,137,138,141,133,134,112,142,126,140,130,137,142,138,136,175,141,130,122,168,216,151,146,136,157,137,138,159,145,107,160,161,189,139,142,149,91,148,138,156,149,161,156,136,140,158,154,164,147,147,122,135,137,105,300,156,164,131,129,132,135,132,144,127,166,135,138,137,138,133,137,123,130,112,157,129,158,170,172,154,155,136,163,160,144,161,137,152,135,123,152,140,156,123,166,157,157,161,117,131,152,150,152,136,151,149,150,155,162,123,128,129,129,130,128,133,125,132,170,162,151,156,156,161,158,157,151,141,143,140,110,134,140,133,130,129,131,160,153,161,117,125,134,131,129,127,133,166,151,154,145,122,163,136,126,158,147,116,144,128,130,176,138,114,133,134,130,126,120,113,146,115,127,129,125,117,132,133,135,112,135,108,130,130,131,133,138,134,134,113,161,134,140,136,121,137,124,141,133,129,110,128,128,128,131,127,128,128,129,129,141,139,127,135,162,138,158,159,160,137,157,127,126,145,106,133,140,117,115,114,164,145,145,146,146,145,142,154,158,161,156,168,148,106,155,131,120,115,141,121,124,129,132,131,129,129,127,130,129,133,126,129,129,180,133,123,133,125,135,136,110,138,130,130,129,132,147,146,148,120,166,137,134,127,127,130,130,161,147,155,136,171,129,134,141,112,132,132,132,136,135,112,135,113,147,144,133,138,143,136,113,121,152,102,114,104,161,183,148,165,174,218,137,136,169,133,142,254,198,148,148,123,133,156,144,153,150,127,143,150,146,159,158,134,147,158,121,189,159,155,156,191,163,146,156,190,220,112,134,170,163,142,114,112,138,138,145,166,139,130,128,129,153,110,129,128,128,157,129,129,129,128,152,112,128,129,156,133,126,128,128,128,153,109,132,129,129,153,110,129,127,129,153,111,130,129,129,153,111,129,129,133,161,154,127,128,154,153,143,116,162,137,154,194,144,127,127,131,166,127,144,144,137,130,158,113,152,157,116,154,129,158,128,128,127,129,176,92,128,129,129,158,106,128,129,128,158,106,131,128,127,129,128,156,108,128,132,128,129,128,128,157,106,129,128,136,116,155,145,142,145,127,129,163,190,144,146,146,145,195,145,141,140,143,139,139,138,140,170,129,129,129,145,128,129,129,127,157,109,129,129,152,107,129,129,127,158,107,129,129,130,155,108,129,129,129,158,107,129,128,129,171,273,261,132,156,159,161,159,155,156,160,157,149,149,143,133,161,104,110,147,141,139,157,167,130,108,127,127,130,152,113,128,130,130,130,154,111,128,129,129,154,112,129,129,129,154,113,129,128,130,153,114,127,129,128,155,111,130,129,150,116,128,129,149,129,165,151,129,130,129,162,123,129,127,126,154,109,132,127,129,129,128,156,112,128,129,130,153,112,128,128,129,155,112,129,128,129,154,111,128,128,133,141,128,131,128,158,110,128,128,130,107,110,129,128,128,164,156,134,134,114,125,132,155,135,155,140,139,139,138,140,139,139,131,121,123,135,130,127,129,114,152,214,160,159,158,198,151,150,151,129,168,150,163,155,130,120,128,157,110,129,129,128,128,157,108,129,131,129,164,113,130,128,128,130,128,128,148,139,119,161,133,134,159,155,155,161,128,130,128,129,157,107,129,128,129,130,127,129,128,129,159,105,130,128,133,127,129,129,128,159,106,128,129,128,132,129,128,129,128,158,107,128,129,128,132,128,129,128,128,156,113,130,129,131,130,128,157,117,130,129,132,133,128,109,137,127,157,191,158,148,142,132,146,148,148,170,129,128,128,128,157,118,129,130,129,130,130,130,130,130,130,131,129,129,128,131,129,131,129,129,131,127,130,129,130,128,130,128,128,132,129,130,129,130,129,130,142,141,113,155,123,139,130,145,128,149,146,162,148,149,149,129,156,110,134,129,125,156,108,128,132,136,119,132,128,155,111,129,130,128,159,106,129,130,128,129,129,151,130,110,109,158,107,128,128,130,162,101,128,128,128,159,106,129,129,132,150,133,143,122,131,127,128,129,128,111,156,108,132,147,127,263,126,126,138,160,128,139,128,129,111,128,131,133,130,133,142,136,112,127,128,180,126,126,129,128,156,109,129,128,153,136,107,128,129,129,155,111,129,129,128,131,129,128,129,130,159,105,129,129,146,129,129,129,132,133,124,116,105,127,127,126,165,141,106,129,129,129,155,110,140,126,128,128,128,154,111,130,130,130,152,107,127,130,154,111,128,129,150,150,111,129,127,129,155,123,130,154,136,131,129,130,130,129,130,130,131,129,130,130,130,157,143,147,116,183,136,136,148,152,130,173,140,145,137,125,168,142,139,122,138,153,112,129,129,128,155,111,129,136,127,127,129,129,158,109,129,128,129,130,127,129,128,130,153,111,128,129,112,127,130,129,130,158,118,111,130,133,170,134,122,129,127,129,141,156,114,160,114,147,148,132,126,140,161,157,129,174,153,151,149,150,174,151,127,130,128,128,127,130,159,106,129,129,131,128,129,128,128,128,161,103,128,129,109,157,107,127,129,128,159,105,137,128,126,157,108,129,129,128,158,107,129,129,159,130,170,168,125,143,139,156,169,137,140,139,140,158,111,260,129,125,128,126,128,130,125,146,101,126,128,155,146,131,130,127,129,156,111,127,129,129,132,127,128,128,129,128,149,122,129,129,128,131,128,129,128,130,130,129,129,130,147,102,141,137,139,119,163,155,147,143,145,182,137,141,139,122,155,166,158,153,140,147,149,149,170,130,128,141,139,139,152,110,128,129,129,153,111,128,130,129,154,112,129,128,143,128,127,130,128,154,113,128,129,130,152,113,128,130,130,137,122,143,131,129,136,133,128,132,147,89,129,129,130,158,130,132,129,128,130,132,139,129,121,132,128,130,129,159,134,108,129,130,139,127,132,128,120,200,160,157,159,169,155,152,154,153,167,155,151,132,149,151,151,172,150,152,131,120,144,116,158,141,144,133,136,168,124,146,146,193,147,146,146,172,138,138,142,138,160,106,127,131,128,158,106,129,128,129,155,132,106,127,128,156,105,128,128,128,154,109,129,127,126,157,108,124,128,129,161,109,128,127,128,160,102,150,154,134,154,156,161,126,164,127,129,129,130,126,126,128,128,157,104,128,150,130,130,130,128,131,153,132,149,106,128,127,130,134,131,127,128,154,115,150,155,142,128,123,136,165,109,129,167,140,139,139,127,155,110,131,129,129,129,128,131,129,147,149,119,116,127,127,144,146,152,173,157,146,144,133,149,141,141,139,141,139,129,129,129,129,129,129,130,129,129,129,130,130,128,130,128,130,129,129,129,130,130,128,129,129,130,135,124,130,148,126,117,130,128,129,132,131,128,158,137,140,133,154,128,130,132,128,135,158,103,128,128,130,128,129,129,129,157,129,129,133,161,132,160,146,146,146,127,160,149,114,287,142,139,146,175,146,137,140,160,150,151,135,142,134,151,150,145,116,127,130,129,144,107,126,129,128,191,107,145,145,169,151,154,139,142,137,138,112,131,153,107,129,128,128,147,127,128,128,128,159,105,129,129,128,129,128,128,127,129,155,109,129,128,129,157,106,127,129,127,157,108,129,128,129,155,110,128,128,129,165,99,157,110,126,154,125,150,150,136,141,193,156,151,147,148,168,150,148,147,129,157,109,131,128,128,128,127,127,130,154,111,129,129,128,133,125,128,129,129,156,106,128,128,128,151,137,141,117,128,128,128,128,134,130,129,129,129,130,129,130,128,130,106,128,128,164,138,153,161,128,158,141,140,140,138,167,143,166,120,129,128,155,110,128,128,125,156,106,128,128,130,128,189,144,158,132,109,130,129,157,108,129,128,128,156,109,128,128,129,157,112,126,128,128,164,105,156,127,145,130,130,121,160,129,134,165,129,189,152,151,152,154,172,152,129,129,139,129,129,128,129,157,108,130,129,129,139,128,130,129,130,162,102,129,129,129,166,110,130,127,127,154,107,130,127,126,127,153,162,155,156,107,159,161,158,119,152,151,150,131,164,119,139,119,149,156,114,179,121,128,155,107,130,129,128,129,128,129,157,109,129,128,131,129,128,128,129,154,117,120,129,130,156,113,129,129,129,159,124,129,130,129,156,129,129,128,131,131,128,153,111,128,129,127,154,113,131,128,129,154,111,136,127,126,124,126,131,164,187,155,128,139,140,141,126,130,130,129,130,154,110,130,130,129,151,113,129,129,129,155,111,128,129,131,130,130,130,130,162,131,126,129,129,131,113,147,114,147,141,133,133,144,114,147,307,140,169,133,140,160,140,163,147,157,134,161,150,133,135,162,103,121,138,144,192,194,145,148,152,140,129,127,127,127,152,110,128,132,126,157,108,129,129,127,156,109,129,130,128,156,109,149,114,127,129,130,157,107,128,129,128,156,112,127,127,129,160,106,144,152,128,133,194,145,148,145,141,170,142,141,139,140,170,140,139,140,144,168,140,139,127,129,155,108,129,122,113,126,129,130,127,127,128,154,140,128,128,130,129,157,129,130,131,142,118,131,130,141,147,145,192,132,142,150,141,184,117,114,155,138,160,103,155,137,140,139,139,129,129,128,129,155,111,128,129,129,155,110,128,128,129,155,113,128,128,129,165,101,127,129,127,130,128,127,129,155,112,127,129,128,154,111,129,127,130,157,128,129,147,112,156,131,134,131,127,155,99,164,127,165,129,102,158,108,127,154,138,117,134,122,132,195,144,153,147,149,172,148,149,139,139,170,128,131,128,128,162,102,129,129,128,161,131,124,127,128,160,100,128,157,109,105,127,129,127,129,155,108,139,129,134,141,131,309,147,237,128,151,131,127,128,127,129,151,117,130,129,139,147,140,153,102,128,130,129,128,132,128,128,129,130,129,129,131,155,106,129,128,129,157,111,142,111,128,206,46,128,128,129,158,108,129,128,129,129,129,154,111,129,129,131,158,127,139,143,117,126,145,157,158,144,149,128,142,139,139,142,128,131,127,128,130,154,131,131,129,129,151,134,162,144,150,144,150,147,149,131,141,137,142,146,126,129,129,145,116,128,129,130,156,107,128,129,128,132,128,129,130,130,151,112,129,151,149,141,133,141,145,195,149,150,150,153,107,128,129,136,155,131,132,150,150,198,146,127,130,130,155,110,129,132,150,158,140,124,130,129,133,158,129,132,130,130,158,107,129,130,130,159,107,130,130,147,130,116,129,148,129,130,131,117,158,139,149,123,189,140,141,140,141,170,142,139,129,130,158,131,128,129,130,155,130,130,130,129,155,130,134,133,148,195,148,143,145,141,141,140,142,169,140,141,130,131,157,108,130,130,130,157,107,129,129,130,159,105,129,130,140,150,158,148,194,149,148,156,129,135,129,258,130,131,129,144,129,127,128,142,176,139,142,150,136,139,136,153,109,130,130,129,164,128,128,132,130,155,127,126,130,127,162,101,127,127,129,151,112,128,129,128,113,132,122,128,129,154,112,130,133,147,147,209,146,149,146,152,191,141,139,140,139,167,145,127,128,128,153,113,128,128,131,153,112,129,129,131,158,129,141,128,128,129,130,136,130,129,129,128,155,111,127,129,132,158,140,142,133,154,112,107,128,129,160,104,128,157,125,139,130,132,131,131,131,129,160,126,154,129,127,128,128,135,135,127,127,128,123,125,122,128,133,170,129,158,106,128,128,130,157,109,128,128,128,130,130,158,105,128,128,130,131,128,128,129,129,157,106,129,129,128,143,114,129,128,130,163,138,146,153,154,137,134,126,158,142,128,128,129,157,170,165,158,136,150,152,155,151,153,151,152,152,129,130,132,129,129,129,128,127,152,110,128,133,166,145,150,146,148,145,150,147,141,145,147,148,166,142,140,129,130,153,120,142,133,117,153,142,144,148,138,145,142,146,141,166,139,132,126,128,157,130,127,130,128,153,113,129,128,133,153,109,128,127,129,152,110,131,128,128,154,110,128,129,128,158,127,129,132,127,153,110,130,139,132,149,113,128,128,130,154,112,137,150,130,132,137,124,112,120,132,131,130,128,124,128,121,160,104,129,129,129,159,104,132,128,131,156,108,128,128,129,158,105,129,130,130,129,128,155,110,125,129,128,161,127,128,129,131,128,128,128,130,152,110,127,127,157,128,129,131,128,156,133,139,133,135,129,130,126,136,156,110,125,128,128,158,107,128,128,129,157,108,130,128,130,132,130,125,128,129,148,109,127,129,130,154,108,174,162,167,118,136,172,104,129,129,129,157,119,129,127,129,129,155,109,127,134,125,154,110,129,129,129,143,116,126,129,137,113,154,140,155,134,130,154,112,130,130,131,156,127,130,163,167,157,154,138,146,150,149,153,147,140,141,142,140,168,129,129,129,129,155,111,130,129,128,155,110,128,140,129,128,129,128,166,104,129,128,129,168,109,159,111,114,139,122,131,128,147,141,133,164,111,129,129,125,152,129,131,126,143,128,137,129,105,135,127,129,129,124,125,129,126,128,127,128,131,129,132,120,135,130,153,166,89,167,104,129,129,133,159,128,128,128,128,158,105,130,129,129,158,105,127,133,128,131,121,132,128,130,156,106,129,128,131,129,129,129,129,158,105,129,133,127,159,103,128,129,127,158,127,126,127,128,161,102,129,129,129,162,130,127,128,128,157,106,129,129,135,160,108,129,130,129,140,129,129,130,130,128,129,130,129,152,103,138,154,157,142,126,133,127,155,110,129,130,129,153,112,130,129,130,154,100,127,129,129,158,112,128,128,136,153,128,149,140,155,110,128,134,154,129,128,129,128,129,153,111,129,128,107,155,111,129,129,128,154,110,128,130,128,154,111,129,157,137,143,176,165,138,159,167,155,155,134,109,154,108,129,127,129,155,109,131,129,129,153,111,127,129,127,154,133,185,178,150,151,122,152,168,147,130,129,131,129,130,127,129,148,148,122,133,126,156,107,127,129,129,159,126,127,128,129,156,109,128,132,126,155,113,154,115,128,131,143,130,128,137,157,105,128,128,130,163,128,127,129,129,160,106,129,129,129,158,108,127,129,129,142,129,155,138,311,166,159,154,156,154,156,145,139,149,111,149,111,137,133,146,111,123,151,128,108,131,128,129,131,131,128,129,129,129,147,135,150,136,106,159,105,128,129,129,158,107,128,131,130,154,108,128,129,129,156,110,128,129,129,154,112,128,128,129,155,125,114,129,130,130,157,112,131,129,128,154,129,128,129,130,155,112,140,151,140,105,118,112,127,135,127,128,164,108,129,128,129,153,110,129,128,132,155,128,128,129,128,154,111,128,129,129,153,112,129,129,128,153,130,128,129,128,155,111,151,112,128,129,129,155,110,128,128,129,155,112,128,129,129,157,106,129,129,129,140,130,149,128,160,104,140,152,110,134,153,111,129,133,162,102,128,128,128,159,104,132,128,128,166,121,127,128,159,105,129,127,129,160,112,127,128,128,128,159,105,129,128,128,130,128,129,129,156,108,129,128,128,130,128,129,129,159,105,129,129,131,131,127,147,154,130,152,193,145,145,135,148,138,141,139,170,140,140,139,148,126,128,129,128,156,111,128,129,129,128,129,129,158,107,129,129,130,155,107,128,129,129,157,108,127,152,137,147,112,145,147,144,154,113,145,149,128,115,129,142,151,148,162,126,168,182,140,118,126,140,152,126,147,134,128,144,142,108,134,105,130,156,129,129,129,128,154,112,128,130,128,128,128,130,152,110,128,132,129,153,110,126,128,128,158,105,130,128,129,154,112,129,128,128,158,111,129,129,127,154,112,128,129,132,157,112,129,136,130,130,172,140,129,159,127,154,126,115,169,142,171,152,153,140,143,128,139,128,128,179,138,128,158,160,155,176,149,151,152,151,169,153,141,152,152,128,129,131,117,254,129,145,130,128,131,128,135,127,135,125,139,122,117,123,130,120,127,129,130,131,160,103,128,130,129,157,107,128,120,129,127,130,129,157,107,129,134,129,130,131,131,131,129,129,131,129,131,132,130,164,142,151,128,164,146,148,147,148,144,144,127,128,129,128,183,77,129,129,130,163,104,129,110,133,136,147,139,133,145,180,90,128,129,130,153,111,136,130,124,154,110,128,132,126,154,116,130,127,130,155,111,129,129,131,173,128,130,142,127,127,129,128,154,111,127,130,128,154,111,130,129,128,136,138,128,129,152,111,129,128,136,153,107,148,113,144,162,122,163,162,139,132,160,134,111,129,145,117,153,111,127,129,131,152,109,129,129,130,147,131,128,130,130,154,111,147,115,164,126,127,128,129,155,104,129,129,127,132,138,123,114,128,128,127,156,109,129,128,128,158,107,129,129,130,144,130,137,150,150,131,128,144,142,107,127,129,129,128,129,128,129,159,104,129,129,131,127,129,128,129,158,105,127,129,129,130,128,128,129,127,159,105,129,143,128,129,128,128,159,106,127,129,129,161,108,127,129,128,166,118,128,128,111,126,108,136,134,162,156,161,162,134,110,137,157,136,132,111,135,145,135,129,106,127,135,145,141,104,107,128,129,129,158,105,127,129,129,156,127,129,128,128,155,113,132,121,129,156,129,130,129,128,156,114,152,135,128,142,122,118,127,134,130,124,128,114,151,174,163,129,126,146,155,158,129,172,127,127,129,129,130,126,128,128,129,158,133,127,133,152,112,129,128,129,155,111,129,129,130,129,129,129,128,155,111,128,129,129,133,127,129,129,130,154,111,130,119,158,135,130,129,127,129,154,138,123,132,131,130,134,144,130,138,124,139,131,131,153,109,127,131,126,128,128,129,157,106,129,128,128,172,129,130,128,128,169,129,128,129,147,161,100,129,127,129,154,110,128,148,127,154,109,128,129,127,157,108,129,129,128,157,108,128,127,129,136,124,127,121,130,170,149,169,310,127,139,133,109,126,128,128,168,98,128,132,127,128,129,129,156,110,129,129,129,157,108,130,128,129,156,108,128,128,129,160,104,129,127,129,159,106,128,129,127,157,108,129,129,128,131,128,129,128,153,129,110,133,157,141,119,260,147,132,127,127,131,123,127,128,173,119,150,124,114,149,133,135,140,152,146,156,193,148,156,147,144,192,146,147,145,147,170,140,138,139,139,167,140,139,127,129,154,116,127,129,129,128,131,128,128,140,137,113,154,104,138,152,157,134,123,128,139,130,167,128,145,147,145,162,111,128,149,160,155,145,144,114,130,129,130,139,129,163,131,166,142,133,123,132,127,132,140,144,131,129,137,135,149,132,131,131,163,144,140,151,140,131,139,121,143,135,144,137,128,133,134,129,134,140,136,121,125,132,133,133,134,134,159,164,158,137,132,137,133,154,146,141,156,134,160,140,132,136,131,135,134,149,133,135,184,130,135,134,182,120,155,149,114,146,140,162,135,146,139,140,134,136,131,135,135,143,182,136,157,177,146,150,154,136,159,147,148,146,144,147,153,135,162,143,138,155,139,145,136,157,139,139,139,169,147,160,156,140,125,139,139,129,129,132,148,156,150,147,150,148,149,155,130,133,129,130,152,140,140,157,120,134,161,120,134,117,109,151,125,149,129,132,129,130,129,130,130,131,140,125,131,128,130,131,131,129,131,136,161,155,157,156,155,163,159,150,149,117,109,140,126,135,143,110,123,113,155,136,127,128,144,127,144,132,139,109,137,153,113,138,161,116,132,129,135,132,136,137,166,135,189,113,140,137,128,130,120,158,138,143,133,136,136,134,134,128,137,136,128,150,111,138,133,152,110,134,131,127,131,130,136,130,131,132,173,103,114,129,129,129,136,155,155,152,142,132,141,149,116,151,138,159,125,115,118,155,157,159,157,158,159,144,299,119,131,155,149,150,151,156,129,135,117,121,160,127,133,140,138,152,117,132,162,156,146,137,148,168,139,126,161,146,146,147,145,172,156,100,178,83,157,113,132,160,169,141,115,159,135,170,160,131,163,149,144,145,148,153,147,118,141,154,141,143,148,145,144,155,160,157,147,147,147,160,142,141,129,145,156,131,145,111,136,139,179,160,128,139,159,143,149,144,138,154,175,134,138,138,131,135,123,143,134,125,147,137,157,147,144,182,130,169,144,142,140,155,130,133,131,138,151,143,142,172,128,173,121,127,128,128,153,111,126,129,126,126,126,128,129,129,153,110,128,134,128,152,111,151,115,126,129,160,136,129,141,168,173,154,157,108,131,145,159,129,130,151,139,154,118,131,200,158,163,158,195,159,152,150,150,177,151,151,151,153,172,153,153,130,128,130,130,130,130,129,133,128,130,129,129,130,144,115,129,131,107,127,130,129,131,120,140,111,152,151,131,138,154,210,127,146,160,134,145,146,147,194,167,139,141,140,141,171,140,140,125,147,132,148,255,127,127,132,125,128,129,154,131,130,129,176,172,136,125,128,128,159,120,129,129,118,128,132,130,128,135,126,131,130,151,122,159,146,132,130,130,130,149,147,148,149,148,170,147,147,151,151,148,148,147,169,148,151,125,108,129,129,129,128,154,111,127,127,129,129,128,127,127,153,109,128,127,130,128,129,129,155,112,128,127,130,129,128,129,153,117,153,154,154,137,128,139,132,125,126,145,147,157,143,140,155,127,140,139,141,168,141,139,134,126,128,154,112,130,129,128,155,113,142,131,124,129,131,154,110,130,128,133,127,148,124,118,131,138,130,128,162,123,130,129,128,156,109,135,108,136,112,131,127,131,129,119,157,135,106,129,128,129,157,108,129,128,128,157,106,128,129,128,157,108,128,128,128,157,107,128,131,128,158,106,127,129,127,163,101,129,128,129,159,104,128,129,127,159,130,128,129,128,154,112,128,129,129,157,128,160,117,164,144,141,123,142,157,169,147,194,153,157,157,151,148,149,150,171,178,149,150,156,106,129,129,129,156,109,130,128,128,156,109,129,129,158,148,130,151,135,157,148,147,158,155,155,155,140,124,165,139,130,127,146,151,153,126,127,113,108,118,115,127,269,190,154,157,155,169,152,155,149,147,171,149,149,147,151,146,148,148,155,110,129,129,130,156,110,130,127,128,154,112,129,128,129,157,127,128,128,129,155,110,128,129,129,159,129,128,130,130,132,136,140,117,131,126,136,126,144,129,128,129,130,156,112,144,115,129,154,114,159,99,129,158,107,128,131,129,136,133,130,128,159,169,154,161,155,161,155,142,148,153,151,130,110,156,290,152,163,151,127,129,127,127,129,135,132,140,117,132,159,144,150,134,128,156,134,157,107,129,129,133,156,109,127,128,127,159,107,129,128,137,128,129,128,128,158,106,128,130,129,160,132,131,172,155,158,156,160,152,146,141,145,111,130,130,130,127,129,130,128,130,128,128,129,131,108,128,131,138,163,156,113,128,164,155,106,128,130,128,156,108,129,129,130,129,129,129,129,154,112,130,129,128,132,129,130,131,128,156,112,130,128,129,132,125,128,130,127,153,111,129,126,128,141,136,189,146,152,193,153,153,154,153,191,163,131,163,136,140,174,132,129,136,129,155,111,132,127,128,154,111,129,127,130,154,111,131,130,127,153,110,127,129,128,157,128,129,130,127,155,110,129,129,128,154,113,155,180,152,155,162,127,127,129,128,131,127,130,153,140,128,131,160,137,133,130,130,127,129,129,135,127,129,156,138,105,128,129,129,156,125,127,129,129,155,109,128,128,130,129,128,128,128,129,155,109,128,129,131,156,109,129,129,129,154,111,137,127,127,156,108,128,129,128,159,112,129,163,128,133,256,129,126,134,129,130,126,130,130,153,125,156,146,135,144,109,146,136,159,109,102,158,131,168,156,109,129,128,131,130,128,129,129,156,108,129,128,129,160,110,124,126,128,159,104,129,128,131,156,129,129,129,129,156,111,134,130,130,129,129,131,130,130,104,154,143,99,131,158,110,129,128,128,134,127,127,129,129,153,111,129,130,128,129,128,128,129,154,112,127,130,129,110,128,129,128,129,153,111,135,131,129,153,129,129,129,128,154,112,130,130,128,131,131,129,153,120,128,128,130,152,112,128,128,130,136,134,169,175,112,146,180,145,179,145,145,122,180,136,111,118,159,121,148,127,128,156,108,128,129,129,157,105,133,129,127,132,129,129,129,129,159,104,129,127,130,129,128,128,129,156,107,128,129,131,159,128,128,129,127,157,109,128,138,146,117,141,119,129,168,109,126,134,129,158,108,129,129,129,158,106,129,130,129,129,129,128,157,106,130,128,128,132,127,129,129,129,156,108,129,129,129,142,126,127,126,129,157,107,125,129,129,151,129,129,130,129,130,128,130,128,129,171,189,197,146,187,115,141,159,103,130,138,134,242,134,127,130,125,134,141,166,137,136,160,134,165,138,153,110,132,147,138,191,152,153,154,147,167,148,149,146,146,166,129,129,129,129,130,127,128,129,165,105,129,129,129,129,128,129,128,133,118,127,147,143,141,153,109,128,128,128,154,107,131,129,127,153,129,129,129,129,154,113,127,129,128,154,112,129,129,150,152,168,141,127,139,141,140,136,143,126,139,140,131,154,124,119,110,132,148,124,127,127,159,106,129,128,129,158,108,124,130,154,143,95,160,103,128,129,152,290,127,127,128,131,114,128,127,129,129,165,105,134,140,131,124,136,138,144,103,128,128,129,160,105,129,126,129,129,156,108,128,130,129,128,127,129,128,157,109,128,130,127,129,129,159,106,129,129,128,141,146,111,134,124,159,105,128,131,128,158,106,129,127,129,129,129,166,128,129,128,128,159,106,137,126,127,155,109,129,128,129,159,108,128,129,129,154,112,129,129,128,114,129,130,128,129,154,112,129,143,150,88,129,129,129,154,111,175,113,128,140,127,133,156,124,139,154,112,129,150,116,132,128,129,156,109,129,129,129,161,103,115,129,129,154,111,129,128,129,155,110,128,129,128,129,156,111,127,129,130,152,111,129,129,129,154,112,130,129,127,154,112,129,129,132,134,128,129,131,118,115,149,136,125,93,131,129,129,156,155,110,127,157,175,150,153,150,150,159,106,128,130,129,159,105,129,129,128,159,104,131,127,127,128,129,156,110,128,129,129,155,110,128,129,128,157,106,129,128,128,157,107,129,129,128,158,107,128,129,127,156,124,161,129,157,180,157,163,128,146,145,150,137,140,138,140,170,139,129,130,129,110,127,128,126,128,127,128,131,124,128,177,130,131,127,128,119,147,125,127,128,160,110,125,129,127,127,122,155,146,136,123,131,164,131,123,149,149,149,128,129,135,144,178,128,131,128,127,129,128,129,128,130,146,124,128,128,128,128,129,130,147,120,134,125,129,129,127,132,128,129,128,131,130,127,129,129,128,131,127,129,130,129,131,128,129,127,129,132,146,115,125,128,131,127,127,129,166,116,130,130,129,128,133,126,130,147,137,103,160,152,160,139,155,139,144,163,155,156,156,160,154,152,153,115,115,130,129,129,111,127,128,129,129,129,129,137,129,152,175,128,146,136,139,138,137,140,127,130,131,112,126,128,128,128,149,127,130,127,129,128,130,128,129,129,128,129,140,136,159,150,162,114,127,128,128,123,112,110,159,165,167,106,127,128,128,131,127,128,128,129,127,129,129,129,129,135,143,112,126,128,156,151,152,150,152,169,158,157,158,148,159,159,160,157,159,157,160,156,154,149,151,151,151,162,149,152,155,128,175,156,130,126,128,129,129,129,128,134,168,152,142,136,117,113,129,128,129,138,119,265,128,125,129,128,147,107,127,128,127,162,121,153,126,127,149,130,142,157,127,121,124,129,126,162,123,139,140,139,140,140,128,144,122,160,157,155,128,149,131,127,153,129,128,130,128,156,129,128,129,128,129,128,129,128,129,129,129,128,129,129,130,127,128,130,128,128,134,127,129,129,130,131,130,129,130,130,107,131,129,130,137,120,137,128,129,130,130,131,129,138,138,152,133,135,110,131,117,154,108,129,128,128,157,107,128,129,129,156,108,130,129,129,154,110,128,129,128,163,105,129,122,130,268,157,159,162,122,159,158,154,137,151,155,134,132,154,193,144,111,128,128,157,132,109,127,128,157,108,129,129,131,131,179,158,136,174,158,154,153,127,131,129,129,129,128,157,109,128,129,129,131,127,129,127,129,156,108,130,128,129,142,114,129,128,129,158,107,130,127,129,143,129,129,128,129,154,112,128,129,130,141,127,130,129,128,157,111,130,129,142,147,154,161,143,150,142,148,159,146,113,128,128,129,151,110,126,128,161,89,128,128,128,153,109,128,131,130,154,110,129,127,129,153,113,161,164,138,139,165,139,138,139,162,106,128,128,128,153,110,126,133,125,152,112,127,129,129,155,112,111,152,187,106,131,158,196,149,143,147,148,158,114,131,130,128,128,128,143,113,173,137,151,160,186,152,130,145,172,150,149,150,152,171,150,149,127,129,130,127,128,130,128,158,106,129,129,129,155,108,128,129,129,157,106,131,128,131,156,105,129,128,128,158,107,129,129,128,129,158,107,128,129,129,131,127,129,129,128,155,104,128,128,128,131,128,129,128,129,161,126,128,132,125,151,126,128,128,130,138,176,294,159,123,153,150,128,127,128,128,129,136,158,147,115,129,152,136,137,129,129,159,105,130,128,127,158,108,128,126,129,127,153,108,129,149,110,130,128,130,130,129,155,112,130,128,131,132,125,129,131,129,125,128,128,128,153,110,128,127,128,153,112,128,128,129,155,92,128,128,129,154,112,128,129,136,153,139,111,129,126,129,153,129,131,127,129,154,112,129,128,129,154,112,128,129,129,153,111,129,129,129,129,127,128,129,159,109,131,129,131,184,153,170,142,154,148,170,148,146,155,165,140,132,126,147,152,150,169,134,151,152,141,153,151,130,137,146,113,128,128,158,108,129,127,129,157,109,129,127,129,157,102,129,128,128,131,129,126,127,165,128,128,127,129,155,108,129,128,130,157,128,129,127,129,158,106,129,129,129,156,108,127,129,127,160,109,128,128,128,158,106,129,127,130,157,132,128,127,126,128,155,115,127,127,130,129,129,129,130,129,130,131,129,129,129,130,128,128,130,129,130,129,128,130,129,128,128,129,129,131,130,128,128,130,129,130,129,144,119,127,130,129,129,154,129,129,152,144,198,146,255,128,132,126,130,145,130,117,148,125,179,148,129,154,172,131,130,128,128,154,130,113,129,128,147,115,128,129,128,154,130,113,129,147,114,129,129,128,154,112,147,114,129,129,127,154,113,127,129,127,149,126,129,128,128,154,111,128,129,128,158,124,114,128,127,117,147,97,150,160,87,154,151,153,152,131,130,128,148,115,126,128,129,135,135,128,142,129,160,129,128,128,129,129,128,129,129,156,108,128,129,130,157,109,142,127,127,155,106,128,132,124,158,107,130,128,127,129,129,148,128,288,154,124,111,134,133,130,115,130,127,131,127,131,164,136,131,149,111,162,129,129,128,128,128,128,129,130,128,128,128,157,109,142,128,129,128,134,140,140,139,172,139,139,139,140,139,140,139,170,140,139,140,187,139,129,129,129,158,107,129,129,129,159,154,130,179,158,133,149,163,156,194,156,155,156,168,149,149,148,149,170,129,129,127,129,130,128,129,130,130,155,111,128,129,129,127,129,155,111,129,129,129,155,111,131,127,129,129,130,154,112,128,127,130,153,112,136,124,128,152,135,122,126,128,129,136,191,147,139,141,181,139,129,128,129,155,111,128,128,128,155,110,129,129,129,130,128,128,130,157,128,129,129,145,117,133,125,178,158,160,124,144,139,158,127,126,128,128,167,98,128,128,128,155,108,126,132,127,157,110,144,135,147,107,131,147,130,155,109,129,128,129,159,107,126,128,129,158,106,128,129,129,159,108,128,129,128,157,107,128,128,133,128,129,129,129,129,129,129,130,130,138,128,129,129,129,130,157,107,129,129,129,157,108,128,129,129,156,107,128,121,134,129,135,142,294,147,150,149,145,134,131,174,135,127,130,172,153,132,126,128,156,136,109,129,129,128,154,111,128,129,129,154,112,130,128,129,130,156,113,128,129,138,130,127,129,129,155,128,128,146,115,117,128,129,152,112,129,129,125,123,141,177,118,120,140,157,153,150,197,208,145,147,145,145,189,130,141,139,140,167,140,139,139,141,155,113,130,129,128,154,111,129,128,148,152,110,128,128,129,155,112,142,116,129,128,131,129,129,160,128,129,128,133,127,138,158,129,149,142,128,120,144,135,129,137,134,150,130,160,149,146,145,173,140,164,128,128,128,128,156,105,130,131,125,157,106,128,128,128,157,125,90,151,131,157,129,130,130,130,159,147,145,146,146,196,146,146,147,145,195,147,146,132,144,143,128,198,139,135,144,143,128,126,129,128,129,158,108,128,128,130,158,107,128,129,129,157,108,132,126,127,127,168,98,130,127,130,157,106,129,129,127,159,106,130,130,129,156,109,129,129,129,154,110,130,128,129,153,110,129,130,128,197,140,111,139,131,157,107,147,147,129,175,125,112,262,128,125,129,108,148,127,129,130,147,146,114,127,146,132,172,131,161,133,145,168,147,147,147,157,144,147,146,149,148,129,128,129,155,111,129,129,130,129,129,129,129,154,111,130,125,167,129,149,148,117,133,127,129,128,128,127,129,129,159,109,129,128,132,156,112,134,130,132,129,148,124,133,128,132,126,129,129,128,158,107,128,142,128,145,131,153,148,149,172,151,151,150,150,172,150,150,152,150,170,130,129,130,127,120,154,113,142,111,143,127,129,151,126,128,128,129,156,106,129,115,142,117,140,149,153,151,149,128,127,129,127,171,130,131,130,112,118,132,132,127,129,129,133,128,129,129,134,140,163,124,130,127,132,160,104,128,130,128,127,130,128,156,116,151,114,186,141,128,158,143,163,128,130,126,129,155,108,129,127,129,161,108,128,128,130,156,110,129,129,129,156,112,127,128,130,130,157,129,129,129,131,152,111,129,130,130,153,161,123,127,127,129,156,109,128,129,129,153,109,129,128,129,162,138,125,142,133,136,139,144,129,161,159,111,143,127,126,127,129,153,112,129,128,129,158,141,129,128,129,154,111,128,128,129,150,111,128,126,128,153,111,128,128,128,155,131,133,120,130,128,154,119,128,128,128,151,129,129,148,130,133,139,110,140,108,128,139,126,144,140,154,153,169,129,129,127,128,129,130,129,128,130,159,106,129,128,131,128,129,128,159,105,129,129,128,116,128,130,129,128,158,129,108,129,128,129,129,128,128,130,156,108,130,129,129,130,128,130,127,130,167,101,129,175,124,137,141,132,147,110,131,156,109,128,133,127,128,128,129,157,108,128,128,129,155,109,129,127,129,156,122,149,153,141,130,129,129,127,128,127,127,119,145,130,149,113,129,144,155,132,128,129,129,155,110,128,127,127,154,110,142,115,128,129,146,139,155,169,128,114,133,129,146,126,128,132,130,117,128,128,129,130,128,128,129,131,130,129,130,129,130,129,129,130,129,131,128,128,129,130,128,130,130,128,130,141,111,130,128,129,130,128,130,129,131,128,129,129,128,128,152,110,127,131,130,157,134,137,122,137,122,141,121,127,134,118,151,107,130,109,128,145,155,129,158,123,140,143,140,171,128,131,156,117,136,165,116,260,128,125,130,127,143,129,128,129,127,142,149,120,161,137,149,128,175,106,128,129,128,129,130,128,130,139,141,138,148,128,116,127,129,131,169,128,129,129,130,156,108,129,129,128,156,110,128,128,129,129,157,107,128,129,129,131,127,128,129,129,157,109,129,128,129,132,127,128,128,129,156,109,129,128,144,111,129,129,129,159,107,129,129,129,132,127,127,171,127,128,127,132,136,149,119,170,150,151,151,151,173,149,146,148,129,155,110,129,136,128,155,112,129,128,129,156,111,131,142,127,128,128,135,149,193,155,142,148,119,169,129,128,130,129,129,129,129,129,129,126,157,158,154,108,142,169,145,134,138,154,141,139,272,144,110,144,128,128,129,129,153,112,128,129,129,155,126,129,129,128,155,111,128,129,129,156,111,129,129,129,157,111,127,129,130,130,122,130,127,129,129,129,158,106,128,129,129,128,146,149,131,128,103,165,114,115,135,133,130,139,131,129,150,131,152,126,129,149,157,105,129,129,127,160,104,129,128,131,129,129,129,128,158,105,128,128,130,156,110,129,129,128,158,105,128,128,122,143,112,144,121,129,127,128,129,129,150,127,147,109,152,119,134,135,160,145,151,132,131,106,166,126,131,157,160,107,129,127,129,157,108,132,129,130,128,129,157,108,129,129,128,157,106,129,129,128,158,106,129,129,128,156,110,128,128,128,155,128,129,129,130,157,132,128,130,127,153,113,129,129,159,136,111,127,127,127,135,127,128,133,139,143,146,133,160,129,129,157,154,146,141,151,130,153,129,128,128,131,127,129,128,129,157,110,129,128,127,137,128,128,129,129,154,110,128,129,128,163,115,126,128,128,130,128,146,92,126,129,116,127,127,129,129,128,171,113,169,111,120,146,111,145,126,118,138,127,155,90,126,129,129,128,148,126,138,141,135,119,143,133,125,127,129,127,126,128,129,127,128,127,155,160,130,129,131,139,136,139,130,139,135,133,133,134,132,133,134,135,134,136,137,130,136,135,134,151,138,122,146,113,134,131,131,132,122,136,154,132,136,138,137,141,140,133,136,135,133,138,136,135,188,145,148,169,139,139,146,132,137,137,147,137,153,109,140,164,150,108,171,204,105,154,150,157,137,167,160,155,119,144,140,136,134,135,133,133,121,139,134,135,115,140,136,136,134,135,128,118,165,138,144,140,166,146,164,161,146,148,146,123,129,161,161,149,144,145,147,145,145,128,152,136,138,140,143,113,145,163,154,134,144,156,124,133,156,157,157,157,159,155,150,150,149,148,149,121,141,111,113,137,122,107,152,131,146,133,166,141,125,143,136,143,128,129,129,136,131,111,139,134,144,113,148,113,144,132,152,148,137,134,143,145,126,112,146,123,144,111,128,187,130,135,174,144,153,139,131,133,136,134,161,129,157,105,121,138,147,139,131,150,118,133,138,130,151,138,158,138,129,150,134,164,153,159,137,139,168,135,171,107,149,129,146,131,157,144,120,125,167,162,141,148,145,139,161,159,132,150,135,157,153,145,145,144,149,150,156,129,127,132,162,129,138,134,153,123,129,122,134,133,152,127,131,131,127,129,128,130,128,129,130,128,127,128,130,129,128,134,127,131,131,129,149,130,147,129,133,142,127,134,118,131,129,131,129,120,129,132,135,159,127,170,143,141,132,135,297,162,113,159,138,132,139,137,111,130,130,145,138,131,138,129,137,138,115,119,135,193,172,147,136,156,155,156,159,149,158,133,137,135,117,131,145,129,159,134,112,166,147,136,153,161,153,121,128,129,130,133,161,143,128,121,134,156,125,127,146,145,133,133,161,159,159,163,121,158,142,147,144,169,142,145,148,148,163,130,147,125,132,176,157,127,128,129,129,158,107,128,129,129,158,106,130,128,128,158,109,128,132,127,129,129,128,156,107,127,127,126,132,127,129,129,129,131,172,137,261,129,125,129,132,128,126,128,129,162,121,152,129,148,120,148,143,174,171,145,149,146,148,192,147,146,166,121,141,141,138,169,139,139,144,147,139,108,126,128,127,157,106,130,128,127,129,129,158,106,130,127,128,132,127,140,131,142,159,131,154,129,131,156,108,129,129,128,154,112,130,130,133,125,130,129,130,156,113,129,128,129,131,126,129,131,129,154,112,143,125,128,142,117,127,129,128,153,113,131,129,128,130,129,155,113,129,128,127,129,171,127,127,129,129,155,109,143,153,145,155,171,110,145,286,160,131,163,156,150,154,133,149,146,148,147,146,147,148,146,129,128,130,130,129,130,128,128,133,132,129,131,138,131,128,156,152,193,117,164,130,148,144,147,163,158,168,130,138,140,160,128,117,130,147,128,125,129,130,159,170,150,151,128,141,104,128,128,129,157,107,129,132,129,129,129,130,160,104,129,129,127,157,110,129,128,128,157,108,129,128,131,159,128,127,129,129,157,108,133,128,127,156,109,129,129,129,157,108,129,128,143,131,132,154,134,128,127,131,139,137,294,146,128,128,130,131,129,126,129,134,129,156,128,164,129,148,130,129,129,129,163,128,128,129,129,155,111,128,129,129,154,112,128,128,129,155,111,129,131,129,153,129,129,129,129,155,112,128,129,143,152,152,132,130,130,127,117,129,113,152,110,128,128,128,155,111,129,130,128,155,111,129,129,129,155,112,127,129,129,154,112,127,129,131,154,112,129,129,128,155,111,129,129,129,130,127,128,129,129,153,111,129,129,128,154,111,129,128,128,154,148,141,139,141,127,128,130,159,144,130,165,108,146,177,143,158,150,118,140,154,110,128,131,127,128,129,129,159,105,131,164,137,153,129,127,113,113,131,159,107,127,126,133,125,133,128,129,157,107,128,128,129,128,128,128,128,157,107,128,133,137,161,162,157,160,157,132,160,165,158,156,197,156,159,156,202,135,159,159,160,150,174,139,139,160,141,139,127,129,169,90,128,128,167,81,128,128,127,156,106,128,133,131,156,108,128,129,129,157,108,134,128,128,156,108,139,139,115,150,135,133,146,144,150,145,113,128,132,126,156,107,128,129,130,151,154,534,141,136,144,156,144,162,133,156,116,124,140,142,136,142,169,138,139,139,163,146,145,137,140,128,153,112,130,131,127,130,129,128,154,113,130,120,145,154,139,124,139,261,167,171,139,140,140,141,167,139,140,169,146,147,149,148,157,110,128,128,136,129,128,129,129,129,154,111,129,129,129,132,127,128,129,129,154,113,129,145,114,129,147,146,85,130,130,129,130,129,150,128,139,112,130,115,133,164,133,150,132,157,113,194,156,160,152,173,152,152,152,152,149,151,124,136,131,253,127,129,127,129,127,131,129,147,126,128,121,128,130,126,144,131,107,128,131,129,129,128,128,168,99,128,128,133,130,127,128,128,120,121,162,151,123,127,132,128,130,158,107,129,127,129,159,103,128,128,128,160,103,129,130,129,158,105,128,128,128,164,127,129,129,129,156,109,128,129,130,128,129,129,129,157,106,129,129,128,155,110,128,129,127,156,110,129,129,128,154,112,130,134,173,152,133,186,144,111,117,150,137,145,126,127,128,129,155,130,129,128,155,153,112,128,129,128,154,110,130,167,150,189,166,151,137,143,148,148,146,148,148,148,129,129,130,128,129,128,129,130,128,129,130,128,129,130,128,128,129,183,130,142,147,125,132,108,174,152,170,142,140,111,127,129,128,154,110,133,127,127,154,111,129,129,129,154,111,129,127,130,155,131,131,130,127,147,159,145,130,127,127,129,129,155,112,127,121,115,158,136,145,214,166,144,147,144,196,127,152,149,114,128,163,111,156,173,138,150,148,148,171,159,150,150,151,128,159,106,129,133,126,157,109,129,130,129,165,108,129,120,252,135,128,128,131,126,131,128,128,138,110,132,127,137,126,137,139,133,125,128,156,105,128,128,133,108,137,145,146,123,157,156,158,129,132,156,110,129,128,129,156,108,127,129,146,110,128,129,128,157,109,129,128,130,155,107,129,129,128,156,110,129,129,129,155,112,129,129,129,154,131,130,129,129,154,129,129,128,129,130,127,129,130,154,111,173,156,127,160,166,138,157,150,126,170,140,157,145,148,168,128,128,133,140,152,111,128,129,129,155,111,128,128,129,154,109,129,129,128,157,109,129,132,131,128,129,129,154,111,143,116,129,129,129,154,112,129,129,129,160,129,130,128,130,137,148,133,135,127,156,189,124,136,134,153,114,129,130,127,125,168,139,157,152,153,153,130,130,131,129,136,145,130,107,150,130,128,130,129,157,108,130,128,128,156,110,130,129,130,157,109,128,129,129,158,106,129,128,129,156,110,129,128,152,130,128,133,157,105,128,128,129,156,109,128,130,129,157,107,129,128,131,157,105,128,127,129,165,103,124,127,130,109,157,128,129,129,129,156,108,130,162,112,128,132,128,155,110,129,129,129,147,148,287,157,133,160,160,126,159,157,157,114,108,134,142,133,117,136,131,152,152,169,151,149,130,128,155,110,128,129,129,157,118,124,129,130,154,110,129,128,130,162,109,129,129,129,154,110,128,129,130,154,111,129,128,128,155,110,128,132,129,128,129,129,155,110,128,128,159,120,128,163,142,129,129,128,154,111,130,126,129,129,127,155,110,127,133,153,126,128,132,128,154,111,130,128,137,130,130,128,130,128,128,130,131,129,130,130,128,130,129,130,146,130,138,116,120,141,174,141,132,114,145,129,158,106,128,148,122,116,115,141,139,112,136,132,161,160,105,129,128,128,156,109,130,129,135,126,129,129,128,155,110,129,128,128,159,106,129,128,128,129,157,107,130,129,128,165,127,129,129,131,161,107,130,129,131,136,143,147,147,147,193,144,148,146,167,120,148,145,142,165,107,152,147,215,159,157,159,193,159,162,154,151,150,151,171,138,140,126,129,150,108,129,129,129,158,106,129,128,128,146,128,129,129,128,155,110,130,129,132,128,129,129,129,152,113,128,129,128,149,112,157,147,135,150,149,127,121,159,155,146,144,147,149,145,145,149,137,164,106,144,126,140,113,158,179,130,138,138,140,167,168,139,142,108,139,166,140,140,139,139,172,137,128,127,129,155,111,128,128,133,156,129,129,129,129,154,112,135,127,128,154,111,129,130,130,108,175,129,131,167,140,141,139,140,140,139,140,139,155,112,130,130,134,126,128,129,153,106,129,129,127,157,109,130,128,175,144,127,143,134,157,127,127,127,127,165,122,128,128,128,168,113,128,134,128,129,129,129,162,101,129,129,128,140,125,266,158,158,161,156,159,130,129,128,131,151,123,134,145,95,144,153,106,129,129,130,157,117,128,139,126,128,129,129,155,110,128,127,129,159,106,128,129,129,155,111,130,149,107,130,130,129,156,120,129,129,128,149,129,130,128,130,157,114,125,138,111,155,129,128,129,129,156,109,128,128,129,155,111,127,129,129,130,128,129,130,154,112,130,129,129,130,128,129,129,156,130,128,129,129,139,123,128,129,154,113,129,130,119,155,110,128,129,128,154,112,128,131,130,153,112,129,128,123,164,174,172,158,155,190,153,154,154,153,132,146,147,147,147,166,129,129,142,126,131,127,127,129,129,155,109,128,128,127,154,112,128,128,129,153,114,126,129,129,154,112,128,129,130,141,127,129,130,154,130,128,129,130,160,148,180,133,131,132,150,127,193,134,156,158,157,196,153,149,150,149,170,149,150,150,150,128,128,129,128,159,105,129,128,130,128,128,128,128,156,109,127,129,159,171,159,155,161,150,155,154,166,169,147,149,120,143,140,154,140,139,149,130,145,130,133,126,138,129,131,127,125,124,148,129,128,133,110,125,132,127,126,129,127,129,127,138,125,129,130,122,140,203,115,149,137,157,137,139,140,137,131,129,130,129,129,141,129,130,128,130,128,129,130,130,128,145,129,129,130,129,137,131,132,148,145,147,150,149,147,156,111,129,130,128,129,129,157,130,131,129,127,135,130,130,130,156,130,129,130,130,159,148,147,150,147,193,148,150,146,149,147,148,147,191,140,141,140,152,130,128,130,128,130,130,130,129,129,136,126,147,143,145,189,148,146,112,145,189,148,145,149,146,210,114,146,146,147,191,149,143,143,156,155,193,139,153,115,126,127,127,163,102,132,129,130,143,140,104,110,129,127,127,157,105,129,129,128,157,107,129,129,146,141,109,129,126,129,128,160,105,127,132,130,155,109,129,129,129,156,108,131,128,128,155,108,129,129,129,156,109,130,129,129,156,109,129,129,129,173,127,128,129,129,158,107,129,129,130,155,110,129,129,128,156,109,129,129,129,155,108,128,129,129,159,130,129,129,129,156,108,129,134,147,105,130,129,128,128,129,130,128,154,137,123,113,153,154,194,153,156,136,155,157,140,284,158,155,156,117,146,152,160,140,140,127,144,134,115,128,179,108,157,165,150,139,132,158,151,143,147,144,131,135,141,142,129,128,130,128,128,128,128,128,120,130,129,128,128,128,128,128,149,125,128,128,128,152,111,127,126,127,151,151,125,115,128,128,156,108,128,130,131,130,128,129,129,130,128,129,130,130,128,130,128,130,129,130,130,129,130,132,127,130,131,130,131,142,131,130,127,126,129,132,127,131,131,127,129,129,129,160,106,133,160,175,141,133,124,271,128,124,133,126,128,130,129,128,138,150,135,113,118,136,117,127,131,126,128,157,107,127,129,129,156,109,129,130,129,129,129,129,129,157,109,129,129,129,132,129,127,128,158,105,128,128,137,156,105,129,129,129,158,107,129,130,128,157,109,128,129,127,156,111,128,129,129,156,129,129,129,131,157,107,129,129,128,156,110,130,129,129,156,108,129,128,129,160,108,128,129,129,156,109,128,128,130,158,130,127,130,128,155,112,131,130,129,153,113,129,128,130,155,114,115,128,129,154,112,129,130,130,155,122,155,135,141,151,111,128,128,128,157,126,129,128,129,154,112,127,129,132,154,128,127,129,129,153,110,147,114,126,154,111,129,127,129,154,112,129,129,128,154,111,129,127,130,155,111,130,128,129,153,111,129,127,130,156,128,129,128,127,154,111,128,130,130,154,104,132,129,130,152,130,128,131,153,133,180,147,143,187,138,169,124,149,155,128,134,139,156,150,148,151,149,150,150,168,150,150,128,129,161,104,129,130,126,129,129,154,110,129,129,127,130,126,129,129,127,156,109,129,127,111,157,127,129,129,127,137,129,132,150,490,149,145,147,171,162,130,168,155,176,150,171,152,164,106,131,128,129,159,105,129,128,129,149,128,144,127,129,132,126,128,127,130,127,135,128,179,122,127,137,127,128,128,128,156,106,128,135,140,142,155,138,128,141,175,154,127,141,141,141,167,141,141,153,124,138,129,129,155,111,129,130,132,153,112,129,130,129,153,138,111,130,129,128,154,111,128,129,129,155,130,130,128,129,154,111,128,135,126,152,129,129,130,128,153,111,131,129,129,153,111,129,128,129,156,132,128,127,128,154,129,130,128,130,172,89,128,128,128,153,112,129,128,132,153,129,129,129,129,154,113,133,154,147,196,154,149,115,185,153,126,135,128,130,152,127,129,137,102,133,125,128,156,109,126,127,127,128,158,104,128,129,128,155,105,132,124,128,133,128,127,129,129,159,106,129,129,129,116,128,129,129,129,155,111,128,130,130,155,109,129,129,129,156,115,126,128,128,157,108,129,128,141,162,123,129,127,127,154,107,127,128,128,151,129,128,129,129,160,103,128,128,130,155,109,128,128,129,156,110,121,127,145,130,127,127,126,128,130,116,153,168,130,148,174,198,142,127,149,108,165,115,151,168,169,149,144,147,127,156,110,130,130,114,154,112,128,130,127,153,113,158,112,129,153,111,128,128,175,145,125,126,128,154,108,126,128,128,170,125,128,128,128,153,109,128,128,131,153,110,131,124,129,153,110,132,132,126,152,111,129,129,128,152,115,129,129,128,154,111,129,127,129,156,113,128,129,128,153,111,129,128,129,155,128,127,129,129,154,150,99,136,125,131,159,108,127,129,128,139,128,127,129,127,191,143,166,108,111,141,140,141,128,125,127,128,128,130,128,126,154,168,159,123,155,132,166,110,160,79,128,128,129,157,109,128,128,129,153,158,112,128,132,126,159,104,128,129,128,158,107,131,127,107,158,128,128,129,128,158,106,128,128,129,128,128,156,108,129,129,128,130,128,129,128,157,106,129,127,130,159,107,130,128,128,159,106,127,130,128,130,128,128,127,129,197,57,127,129,128,155,111,128,129,129,157,107,130,128,127,156,109,131,127,128,153,129,123,128,128,129,153,110,128,128,128,162,113,130,129,130,129,129,131,129,164,176,165,135,153,151,113,151,164,147,149,141,138,168,140,140,140,143,129,128,130,130,152,113,130,128,130,140,128,130,128,129,154,112,130,130,128,140,128,130,129,129,154,113,129,128,130,154,131,129,129,128,154,112,129,129,140,150,110,128,128,129,152,110,128,131,139,147,151,204,144,149,158,149,125,154,147,125,141,151,140,132,132,135,174,140,141,141,141,170,141,142,130,130,157,108,129,129,131,155,115,127,127,129,128,156,107,128,145,127,154,107,129,128,130,155,106,134,124,149,311,161,117,141,139,118,142,153,121,141,135,137,146,125,148,129,132,177,113,130,150,149,151,152,131,148,150,148,198,150,172,147,131,128,129,157,109,129,134,130,158,131,130,130,130,163,149,148,167,150,150,148,150,192,150,148,169,128,151,141,142,167,142,141,141,143,118,130,129,130,155,130,132,129,143,118,131,130,130,155,131,131,128,149,190,182,171,182,181,182,183,103,150,147,150,193,191,152,143,140,140,168,141,144,141,142,142,128,130,129,154,113,130,129,130,125,154,129,128,129,128,164,107,128,129,131,153,130,129,129,132,156,129,131,129,129,154,113,132,147,115,130,130,143,159,164,159,138,129,141,141,155,137,129,137,132,140,130,127,127,154,110,128,130,129,132,127,129,130,129,168,98,130,129,129,155,111,131,129,131,148,150,151,151,195,149,152,150,152,196,144,141,143,141,171,142,141,129,131,156,130,130,129,130,155,111,129,133,150,193,153,150,153,152,197,150,151,150,152,194,152,147,129,134,157,130,131,131,131,160,132,129,131,154,175,166,105,157,96,175,146,307,147,147,149,154,149,147,147,151,143,144,141,176,132,144,138,127,128,130,156,130,130,134,127,127,131,130,154,130,129,132,143,155,128,136,128,131,128,128,158,131,129,129,130,152,112,129,128,128,157,128,129,129,129,153,112,144,122,128,153,110,129,127,129,152,110,148,111,127,129,127,153,112,127,128,129,157,114,129,128,129,152,110,127,134,125,153,112,128,129,128,156,110,130,129,172,131,130,131,131,150,109,128,127,131,156,105,127,128,169,119,134,133,130,120,107,118,139,135,143,128,133,128,127,130,127,131,134,131,144,127,141,122,172,87,129,129,132,158,128,130,127,129,155,109,131,129,128,128,129,129,157,108,133,128,131,129,130,128,129,130,129,130,130,128,130,130,128,130,129,130,129,130,130,128,129,132,128,130,128,130,128,130,128,129,130,132,129,130,128,129,130,130,128,129,130,130,128,127,130,128,129,130,129,130,129,129,129,128,158,106,129,129,138,156,107,129,128,128,155,109,134,129,127,154,112,129,129,128,168,173,164,130,192,147,147,145,147,210,83,141,121,125,152,111,170,93,129,127,152,113,128,128,128,163,103,140,128,128,154,157,151,149,150,148,149,150,124,147,146,147,154,112,128,129,129,130,128,129,129,154,111,129,129,129,155,112,128,129,129,154,112,129,129,128,163,106,129,128,129,154,113,129,128,129,155,127,114,127,130,155,129,129,128,129,147,108,132,114,148,128,129,129,129,158,107,130,142,161,194,93,167,155,198,168,154,153,194,160,153,133,147,169,150,152,151,129,157,107,128,129,130,149,125,126,128,161,117,112,130,143,141,159,168,153,147,128,125,149,110,131,130,125,128,138,173,160,167,139,139,138,176,147,130,127,128,155,111,132,132,127,128,129,129,156,109,128,129,127,159,105,130,127,128,157,108,128,128,129,146,145,147,145,147,146,147,147,139,138,139,139,148,112,129,111,127,128,126,128,132,126,127,132,176,148,137,130,140,139,140,166,131,162,134,139,140,132,144,159,131,127,129,133,153,150,138,133,137,128,119,338,154,117,138,135,133,133,137,135,132,136,136,133,137,153,137,136,136,134,134,154,135,116,110,141,155,135,136,139,134,135,118,134,139,139,133,132,135,137,133,131,153,125,125,138,179,171,96,174,148,123,139,154,106,138,156,179,127,133,149,146,136,112,147,128,114,182,139,170,160,154,121,144,98,150,152,153,153,132,144,140,133,140,148,154,159,165,157,123,140,140,139,139,155,139,137,166,144,159,142,149,147,145,145,146,122,138,139,157,123,139,172,147,191,92,154,140,146,141,154,192,123,151,154,135,150,152,152,153,131,128,129,146,94,126,130,131,132,132,128,115,154,158,162,157,164,138,130,137,115,135,109,131,134,137,133,130,133,139,161,127,137,139,133,124,133,143,182,123,159,124,132,162,132,151,154,164,141,144,163,145,152,90,130,152,271,151,120,138,115,132,148,134,113,139,141,128,116,110,154,150,149,131,149,120,131,145,116,149,118,136,126,123,129,164,137,161,132,128,111,140,133,130,135,115,149,137,149,148,149,149,147,146,127,129,126,129,128,130,127,143,157,150,147,148,152,131,171,156,159,142,113,128,129,128,130,127,129,128,157,150,106,141,143,152,126,140,141,140,111,109,150,109,135,128,131,132,133,129,126,135,134,168,188,155,159,172,113,148,130,135,112,137,134,139,133,132,135,136,133,148,112,129,128,130,128,127,125,145,155,110,139,142,131,155,161,130,133,136,129,147,112,129,129,129,130,129,129,119,124,137,117,167,131,139,128,134,159,141,162,124,128,128,131,130,130,112,127,119,155,137,129,129,130,128,114,150,130,156,106,129,128,128,160,103,132,131,130,129,128,129,130,129,130,129,129,128,130,128,130,145,114,128,128,130,158,135,139,198,130,125,131,128,115,127,128,126,134,138,140,152,132,126,132,160,130,137,139,139,139,169,141,165,114,128,128,130,156,113,129,128,133,144,112,129,129,156,112,129,130,135,161,127,161,143,147,143,148,142,147,134,156,146,144,130,135,141,130,128,130,128,129,129,129,130,130,129,128,129,130,128,129,129,129,129,130,129,128,130,128,130,129,130,130,129,128,129,130,129,130,130,128,130,129,130,129,129,129,130,129,130,154,108,129,126,129,152,110,130,130,131,133,131,160,116,128,129,126,128,153,158,147,121,109,160,147,98,127,129,128,153,129,139,115,142,114,134,130,170,109,127,129,129,159,105,127,129,129,157,111,158,174,122,173,147,179,164,103,181,159,151,152,145,152,151,151,152,152,150,151,149,149,129,129,128,129,130,128,128,128,129,130,128,129,130,128,132,127,129,128,129,157,106,129,169,109,157,107,129,128,129,157,108,130,128,129,156,110,128,129,129,159,130,128,127,130,156,108,128,128,129,157,129,128,129,128,155,109,129,130,128,157,108,129,127,129,155,131,128,128,129,154,113,148,132,130,129,131,130,136,128,128,127,134,125,128,129,154,137,127,144,117,133,135,147,113,130,128,127,129,127,127,131,127,135,159,129,126,128,128,153,109,131,131,125,129,127,154,111,129,127,128,138,114,128,128,153,109,128,126,132,157,126,128,128,126,153,114,123,131,126,152,110,128,128,128,152,113,128,127,126,153,109,128,126,128,181,114,126,127,147,113,129,129,129,208,138,133,127,138,187,176,120,142,140,140,139,141,150,161,129,127,122,153,172,104,128,129,154,110,126,128,128,155,107,126,129,127,174,124,146,161,119,139,145,140,140,169,134,155,110,154,121,150,135,150,152,148,186,148,148,147,148,172,152,148,150,149,170,148,161,136,112,127,129,127,129,156,109,129,127,130,156,109,129,129,127,158,107,130,127,128,160,105,129,129,129,130,128,129,129,156,109,129,129,129,130,127,129,129,159,105,129,129,129,128,129,128,129,157,109,130,129,128,131,128,128,129,153,131,129,130,131,151,113,131,129,130,153,113,113,129,129,155,112,129,129,128,180,122,127,127,128,154,110,128,128,129,152,144,99,128,128,129,153,109,128,128,133,129,117,126,129,129,154,111,128,132,129,154,111,130,129,128,155,112,128,131,128,129,128,129,155,110,129,129,130,132,127,129,128,129,154,111,129,128,129,144,128,129,130,129,129,132,130,130,174,157,200,157,161,145,168,140,170,127,145,140,145,141,112,131,171,129,128,129,130,157,107,128,129,129,160,103,128,130,128,134,129,128,130,129,126,130,108,128,148,110,128,155,107,128,127,128,157,112,126,133,128,156,108,128,129,135,157,108,129,129,129,157,109,129,135,128,128,129,129,131,153,129,130,129,162,313,131,155,160,155,163,156,157,115,149,133,153,133,147,139,113,145,148,112,160,106,135,126,128,159,108,147,145,148,195,144,146,147,147,194,144,151,145,145,168,139,140,140,139,177,125,129,129,129,155,112,128,129,132,153,111,129,129,130,155,110,146,113,129,129,128,127,155,112,129,129,128,138,128,129,129,128,153,112,128,129,128,154,112,129,127,129,154,112,128,129,131,153,112,129,128,129,154,112,130,129,130,128,127,130,128,155,112,129,129,129,132,129,127,129,110,153,112,129,129,129,139,168,131,151,130,157,129,129,154,150,199,163,162,169,156,153,161,151,138,152,110,146,135,182,126,133,133,131,161,153,169,135,130,128,130,128,130,128,130,128,150,112,128,128,129,155,106,126,134,126,128,130,126,160,104,128,129,136,154,108,129,128,129,158,106,129,130,128,158,109,128,128,129,160,105,128,126,129,156,106,129,127,131,157,128,129,129,127,157,108,128,130,128,156,109,129,127,129,155,114,127,127,129,154,110,129,128,128,157,109,129,128,128,157,107,128,128,136,164,148,292,145,159,154,168,155,146,148,181,119,170,154,111,139,127,119,115,142,114,152,111,130,136,113,154,126,112,129,130,128,161,128,128,173,146,167,139,139,139,140,168,125,129,128,128,154,112,128,128,130,131,129,128,129,128,165,99,129,129,128,152,113,128,129,129,153,112,127,128,129,154,111,128,129,128,130,129,128,128,153,113,128,128,129,130,128,129,127,129,153,111,128,130,131,155,132,130,130,130,157,127,131,127,128,115,149,109,129,127,129,157,106,152,149,130,130,146,118,201,155,195,129,113,320,161,154,162,149,153,177,149,130,150,110,184,161,133,166,132,136,184,166,136,170,156,111,152,134,122,128,129,172,97,129,128,128,157,107,129,129,128,156,109,129,129,127,167,102,129,128,130,164,129,128,129,129,157,107,129,130,128,154,109,127,129,129,159,106,130,128,129,155,108,129,128,128,160,110,144,129,117,159,105,129,128,130,158,128,129,128,128,157,108,128,130,128,154,109,129,128,128,156,129,129,128,128,155,129,130,130,155,129,129,128,130,155,128,131,114,128,154,112,130,128,127,129,132,150,115,152,111,128,127,129,152,114,127,144,130,146,146,146,160,149,151,104,129,128,128,128,127,129,129,128,131,128,128,130,128,129,129,130,128,131,129,129,130,128,128,127,130,128,130,129,129,130,128,128,129,129,149,127,127,128,128,175,86,129,130,155,118,113,154,109,129,128,129,138,139,158,161,139,131,136,118,157,157,174,148,150,146,152,147,149,149,173,127,129,127,132,129,129,129,128,156,108,128,129,135,128,131,129,131,130,170,151,158,153,157,152,160,150,157,151,160,120,154,243,128,127,130,129,147,95,128,135,136,128,134,162,170,119,154,138,161,202,122,140,169,140,140,140,140,139,172,128,129,128,131,127,128,128,129,158,107,129,129,129,133,128,128,128,128,158,108,128,130,136,125,129,129,129,157,108,127,129,129,129,127,128,129,129,154,124,155,167,142,177,137,139,138,138,166,163,124,127,128,152,113,124,129,127,157,133,148,150,148,113,127,128,128,129,157,128,130,128,129,129,126,155,111,130,128,129,154,111,128,129,129,164,140,129,130,128,128,129,130,129,145,117,129,127,112,155,134,132,153,152,168,150,148,148,128,155,110,129,146,115,130,129,128,155,111,128,130,128,153,128,130,130,151,113,130,133,127,154,114,129,139,129,127,130,129,158,107,129,128,128,131,128,152,114,128,133,163,106,129,129,160,193,163,135,118,143,147,148,106,129,130,128,128,129,168,100,128,129,128,106,129,129,127,129,167,102,129,129,129,156,109,128,128,129,159,105,128,129,130,128,128,129,129,158,107,128,129,143,111,130,129,128,157,108,129,129,129,161,127,129,129,130,156,109,131,147,154,95,155,292,127,126,128,129,103,128,151,110,159,164,159,149,131,136,139,167,105,130,128,129,155,110,129,131,127,127,129,129,155,112,130,130,131,154,111,131,130,130,155,111,137,125,129,153,111,129,127,128,153,127,130,129,129,153,102,153,114,121,131,145,145,147,139,168,140,139,140,140,144,137,140,129,128,155,111,129,132,128,129,128,129,153,110,129,128,132,128,128,129,130,151,109,128,128,140,152,110,127,127,126,154,110,127,126,129,130,126,129,129,129,129,130,132,137,155,127,123,134,145,164,123,165,108,145,144,170,141,161,155,128,114,133,157,107,128,129,129,158,106,129,129,128,158,111,129,128,134,156,129,129,127,131,157,110,128,166,127,114,128,127,129,156,106,133,129,127,158,105,129,127,129,159,128,117,129,144,172,135,133,149,146,155,162,128,128,128,130,155,110,128,127,129,145,127,127,128,128,158,109,128,129,129,155,108,129,129,129,158,129,128,129,129,157,107,129,130,130,129,157,107,127,129,130,158,134,127,127,127,155,105,128,128,130,166,92,148,159,161,114,160,150,152,148,131,261,125,129,129,129,128,128,128,132,150,135,129,144,122,138,110,131,126,133,129,129,131,129,129,130,127,129,128,135,177,148,148,148,152,126,128,128,130,155,111,130,127,130,136,128,129,128,128,134,143,115,134,153,144,150,130,120,127,131,156,110,139,126,128,153,109,128,130,127,155,110,134,129,131,130,130,130,129,129,129,145,133,131,130,117,130,130,129,129,113,130,131,126,122,149,148,152,117,118,133,156,108,128,129,129,155,109,128,129,111,124,137,125,154,117,128,137,131,153,128,128,128,131,155,130,129,127,127,126,127,129,154,154,154,151,141,134,153,152,131,142,149,95,125,158,104,128,128,129,158,128,113,128,130,129,156,109,128,129,129,128,156,109,128,128,129,155,112,128,158,117,129,139,136,150,123,130,156,151,96,145,147,146,148,146,148,145,173,139,139,140,142,167,140,140,129,129,156,109,130,128,128,156,109,129,129,129,131,128,129,129,155,129,130,130,130,154,129,129,128,130,156,130,110,129,129,154,112,149,131,114,138,150,175,132,139,144,129,146,172,139,139,140,139,154,112,135,139,165,155,156,194,147,150,147,171,148,149,148,147,168,149,148,148,148,128,155,110,129,128,129,154,112,129,128,129,153,112,131,128,129,153,111,130,129,132,124,132,155,147,112,129,128,154,167,104,140,165,139,123,127,129,128,130,128,129,129,131,144,145,126,148,126,120,126,129,155,106,129,125,129,157,108,128,128,129,160,129,128,128,129,156,107,128,128,128,156,107,126,128,129,160,99,129,129,154,134,161,164,181,162,134,141,160,98,146,164,140,175,142,139,138,140,130,121,130,130,159,105,133,130,126,129,129,126,129,132,128,128,127,132,132,122,158,126,156,112,153,119,155,149,129,163,131,107,129,129,128,157,111,127,130,130,133,133,136,126,165,142,108,134,155,159,193,157,159,153,167,151,148,149,153,147,154,112,156,109,129,130,132,128,129,130,128,155,111,130,128,132,167,146,137,149,150,150,191,149,129,143,145,147,149,167,141,140,142,139,140,139,135,131,152,146,125,130,132,150,148,144,189,149,148,147,148,195,149,146,143,139,169,139,144,140,130,153,113,129,141,129,152,108,127,129,143,127,151,116,124,129,142,140,115,147,149,162,146,148,140,141,169,139,141,142,155,135,153,153,147,112,144,134,163,142,129,147,86,129,128,128,155,109,133,126,129,155,109,128,129,129,156,113,131,130,130,128,130,130,130,128,130,156,112,128,129,129,155,111,128,129,129,156,127,129,129,128,157,108,129,129,128,154,127,129,129,129,155,123,120,152,164,140,126,138,126,149,144,102,129,130,127,156,109,129,129,129,156,112,127,129,129,129,130,129,130,129,151,110,129,129,129,154,112,121,156,141,125,142,138,140,138,137,152,134,117,142,153,144,157,154,110,128,141,144,139,109,128,128,119,122,132,138,141,154,116,154,124,128,128,129,131,156,112,130,130,129,128,131,134,130,130,130,131,159,112,129,130,129,183,144,146,149,146,193,147,152,147,150,138,141,140,168,144,139,141,141,139,130,128,154,111,128,130,129,152,109,117,141,148,113,131,133,148,150,172,150,152,157,152,158,123,140,140,139,141,127,128,129,130,165,126,140,139,136,162,130,145,152,141,175,139,140,142,132,261,128,126,130,108,128,128,131,128,127,125,164,150,162,131,150,114,128,108,142,131,152,133,143,133,128,156,106,128,128,131,132,127,129,129,128,131,130,130,130,130,129,129,129,129,129,155,110,130,127,130,155,109,129,128,129,157,107,128,129,131,128,129,129,129,155,110,129,128,130,131,127,130,128,128,155,111,128,128,135,128,144,115,133,134,127,126,128,132,110,127,156,136,108,128,129,128,169,119,129,129,129,156,131,130,128,129,152,128,128,129,129,155,113,130,130,129,161,128,130,128,128,154,112,129,128,148,119,138,153,109,128,128,129,151,118,128,126,128,153,128,115,149,170,144,129,125,127,129,129,127,132,163,152,113,128,127,129,128,155,112,127,129,130,154,111,130,128,129,155,110,129,128,128,154,112,129,128,129,158,130,129,114,125,154,113,129,127,136,127,127,112,127,128,128,128,159,105,127,130,141,135,113,113,110,155,163,113,129,128,157,106,127,130,126,129,128,128,155,111,132,127,128,158,102,128,128,130,154,109,128,129,127,160,104,129,128,129,160,107,127,129,129,156,106,127,128,137,155,108,128,130,136,123,241,121,125,128,128,129,138,151,157,160,145,136,157,155,159,132,137,136,147,194,145,147,146,141,176,139,137,139,140,172,141,140,138,141,170,128,129,129,129,158,106,117,128,129,155,111,128,129,128,161,129,129,129,129,154,111,129,157,108,153,110,128,129,128,152,150,142,157,156,146,127,149,146,149,125,127,129,128,129,154,112,129,129,129,154,112,129,129,129,154,112,128,129,129,156,126,129,129,128,154,112,129,129,129,158,128,128,129,128,155,110,129,132,130,127,128,132,150,110,129,129,130,148,113,127,146,169,148,148,149,168,150,150,150,152,192,143,124,132,128,130,130,129,154,122,128,129,130,131,129,135,120,130,161,131,129,129,128,156,136,107,128,129,129,158,106,128,128,139,157,107,127,140,127,161,101,133,128,128,157,108,129,128,129,169,130,129,128,127,159,103,129,129,129,156,108,129,129,129,159,105,130,129,129,158,109,127,128,129,129,156,110,128,129,129,146,127,127,127,127,155,105,128,128,127,154,127,129,128,128,157,108,129,129,139,154,127,139,128,127,128,128,155,108,155,115,129,162,108,127,128,128,128,135,136,130,132,118,152,155,155,145,166,186,135,133,157,126,129,135,146,106,129,130,129,153,130,129,129,157,106,128,129,136,128,129,129,131,154,128,128,128,129,154,111,129,129,130,154,110,127,129,127,154,111,130,130,129,154,111,128,128,128,156,130,128,127,129,154,112,129,128,130,153,112,129,128,128,154,111,129,129,128,154,112,129,127,129,156,111,129,127,129,156,112,157,111,131,155,173,160,124,128,167,144,102,128,128,128,160,142,112,149,167,153,130,119,157,135,133,130,131,138,126,128,132,126,130,126,129,128,147,145,132,127,143,127,138,157,140,156,125,169,140,139,139,140,173,125,128,131,129,127,129,128,160,107,129,130,128,129,130,128,129,132,128,130,129,129,129,158,108,129,129,129,157,108,129,128,129,164,101,129,128,131,129,130,128,129,158,107,127,129,129,140,128,130,128,130,167,126,128,129,130,152,129,128,129,128,168,101,130,130,128,161,103,127,130,129,154,112,129,130,128,131,129,129,129,156,148,127,130,131,127,153,113,129,129,130,157,131,127,129,156,124,130,128,129,152,123,146,156,143,148,144,131,137,141,128,128,130,128,130,128,130,128,130,129,130,129,130,129,130,128,129,131,129,129,129,130,129,129,129,130,130,128,128,130,128,129,130,130,128,130,129,129,130,137,122,128,130,158,129,128,128,129,130,131,128,131,156,132,125,130,126,154,112,162,101,130,129,128,129,162,141,163,152,145,145,107,126,122,126,156,106,128,126,128,157,106,129,128,131,126,119,129,129,128,158,106,129,132,129,129,129,130,158,106,129,129,132,159,107,128,128,128,154,106,128,154,122,180,144,158,131,135,131,150,126,128,126,128,158,191,115,171,133,135,155,131,165,125,138,140,170,113,140,139,138,170,139,159,123,128,154,110,129,127,129,169,100,127,146,113,156,108,127,128,129,128,128,128,129,156,109,129,129,127,130,128,129,127,155,111,129,141,129,129,127,128,128,156,130,129,129,131,153,112,129,129,129,154,131,129,128,128,161,105,128,128,128,153,113,125,130,129,128,128,128,128,128,145,114,127,129,128,154,111,129,129,136,130,126,129,129,154,112,127,129,129,128,128,129,129,153,113,129,128,130,154,148,145,146,192,154,152,154,159,154,152,155,152,170,147,147,145,144,145,148,136,130,157,130,128,130,162,130,108,132,129,130,129,129,130,128,116,128,160,125,173,165,189,177,177,157,154,158,193,159,149,154,148,169,151,150,151,121,147,127,130,128,158,106,129,129,127,151,110,127,129,128,157,107,128,128,128,157,97,128,129,128,158,106,129,129,130,130,128,128,128,159,105,129,128,128,156,129,129,129,128,158,103,128,128,132,131,126,129,128,128,160,105,129,129,130,156,112,133,128,127,126,128,146,110,135,127,133,156,150,141,164,135,149,146,181,176,137,142,139,144,171,139,139,140,129,127,130,131,160,111,132,128,131,130,130,128,134,153,129,130,131,129,154,111,131,114,124,154,111,129,128,129,152,113,128,129,128,155,110,128,129,128,156,112,128,127,129,152,111,129,129,129,156,129,128,129,127,154,112,129,130,128,152,111,129,129,128,157,134,120,115,127,129,127,128,129,127,129,182,154,166,163,170,134,127,130,130,140,144,129,138,161,163,161,158,128,144,156,141,138,132,167,154,132,127,130,131,133,177,113,142,138,134,126,148,137,128,132,153,167,133,150,168,159,133,131,136,134,118,141,137,137,151,197,140,137,133,136,138,131,133,134,134,163,158,172,157,134,134,212,200,118,133,134,132,110,136,113,134,136,136,137,136,133,136,131,132,131,134,154,136,165,160,155,103,157,103,148,147,147,112,134,150,146,138,158,147,141,143,140,140,160,129,156,157,164,146,144,131,142,141,149,145,145,90,156,139,126,159,154,159,155,158,119,121,155,130,144,123,281,152,130,133,370,211,127,138,136,155,132,158,141,149,123,131,117,160,130,162,164,159,125,140,144,152,138,110,245,148,147,147,146,145,148,163,153,125,139,140,141,140,134,118,159,143,138,165,156,127,151,151,147,150,148,149,153,149,121,152,125,124,155,158,165,164,147,127,167,145,110,124,113,109,154,135,120,112,121,139,134,155,138,167,116,147,132,134,136,131,122,149,151,124,138,119,153,152,120,135,136,139,130,132,153,151,153,114,141,130,106,133,139,140,145,400,123,133,133,124,133,108,134,150,134,160,112,150,137,135,137,136,156,158,139,141,149,117,151,172,146,135,163,150,130,125,127,128,129,131,157,130,127,127,128,128,128,128,151,110,126,132,140,125,113,131,126,127,128,139,134,124,140,132,128,127,128,128,128,136,128,132,128,130,132,131,134,146,133,132,132,129,106,134,130,129,131,140,168,129,127,156,134,127,137,133,146,159,129,130,130,126,148,122,156,157,158,158,147,131,138,159,114,131,140,147,115,112,129,144,138,133,151,149,122,128,109,141,118,131,138,121,131,114,137,128,118,128,125,129,116,132,106,131,129,131,108,140,145,126,127,135,141,128,126,129,115,129,122,155,109,128,128,128,162,126,129,128,130,153,110,129,132,132,131,130,130,130,130,130,167,151,137,168,157,153,158,153,158,152,105,162,155,153,146,112,129,130,129,158,127,128,128,129,132,146,156,113,134,127,135,135,146,156,141,111,145,152,107,126,128,128,170,122,128,128,128,154,108,136,151,146,170,129,128,129,129,165,97,128,128,129,159,105,128,129,131,154,112,130,132,128,126,126,126,131,126,130,127,129,128,134,128,163,159,136,124,121,133,164,128,128,128,143,157,162,175,157,160,155,172,155,149,152,153,171,151,152,128,129,141,128,128,128,130,158,108,128,129,128,137,128,129,128,129,157,108,129,128,129,151,127,128,129,129,154,113,128,128,130,149,129,129,141,129,139,119,132,116,137,129,129,130,126,149,172,149,128,131,129,131,130,130,131,130,130,130,131,131,130,129,130,130,145,116,139,130,130,129,153,112,130,128,129,159,111,129,129,129,155,110,129,128,138,136,133,125,127,128,128,154,133,114,127,154,136,131,139,131,129,147,143,144,114,195,146,142,139,151,149,146,148,149,155,152,153,129,131,129,131,126,164,111,111,130,128,156,108,132,127,128,129,129,113,131,148,156,127,129,131,128,129,161,106,130,130,146,194,147,145,164,128,137,122,159,133,111,147,163,133,167,100,191,145,148,147,146,211,135,135,139,139,172,139,139,142,138,127,128,129,129,158,106,129,130,128,157,128,128,128,129,158,107,129,129,129,149,128,129,129,128,159,106,150,131,137,170,116,157,163,155,120,126,128,127,106,138,176,133,131,117,178,160,155,165,139,128,132,149,148,151,157,110,130,129,128,130,129,156,110,129,130,129,137,130,124,128,128,155,112,142,115,129,130,133,125,130,129,158,110,129,127,131,126,129,130,130,131,154,148,132,143,111,146,129,130,137,124,134,153,128,129,129,128,153,112,133,125,129,153,111,129,129,127,154,116,129,129,130,129,154,110,129,133,130,131,130,130,129,130,129,129,130,130,130,129,129,129,130,130,130,130,130,131,129,128,130,134,122,153,123,121,147,130,132,145,141,130,136,141,142,165,159,129,132,142,133,150,128,117,166,155,104,128,132,126,158,106,128,128,128,158,107,133,133,130,159,103,126,128,143,127,126,131,132,130,130,129,158,110,131,129,131,159,130,128,147,146,193,129,145,135,117,123,152,165,136,133,131,160,193,161,157,156,195,150,154,149,151,151,152,173,150,153,151,129,128,128,159,105,128,155,129,161,130,129,128,130,163,130,130,130,147,145,147,193,146,145,146,165,131,126,127,130,187,110,161,141,135,153,141,150,122,143,281,119,126,129,127,128,128,130,129,136,111,163,154,164,117,115,143,167,148,140,102,142,138,138,140,176,109,129,128,128,154,111,130,129,128,155,113,127,146,145,191,145,147,146,148,164,114,152,121,132,131,155,150,148,125,155,109,127,129,158,127,127,126,129,110,125,128,128,128,156,107,128,132,128,154,111,128,129,129,153,111,128,129,129,138,115,128,130,132,144,140,124,126,149,111,127,127,129,156,108,128,130,140,140,149,140,117,140,142,126,151,132,150,152,132,124,122,134,129,130,128,126,137,132,137,133,133,137,144,130,132,140,136,132,136,151,120,149,108,131,106,128,127,128,129,130,128,128,132,131,127,134,131,109,128,129,127,130,129,129,129,129,129,129,129,129,128,128,128,122,120,147,119,111,138,136,145,118,117,162,128,129,129,128,156,109,128,129,129,160,103,129,128,128,158,107,128,129,129,157,108,128,129,129,130,127,129,128,163,124,129,129,128,153,114,129,129,129,157,129,131,128,130,154,112,128,128,129,160,107,181,159,165,165,149,157,155,140,150,169,111,142,140,146,169,141,148,130,129,129,154,111,128,128,137,128,129,129,129,156,122,129,129,128,133,139,127,129,129,132,131,127,130,128,129,127,129,129,153,111,127,129,129,128,128,127,129,154,117,144,145,116,113,139,112,125,148,147,172,111,142,142,173,140,130,127,130,153,114,132,128,142,128,130,130,129,130,128,130,128,128,130,127,128,129,130,130,128,128,136,136,143,135,168,134,197,144,147,146,147,194,159,154,149,147,163,178,133,149,139,183,143,174,140,156,152,149,171,154,150,151,185,119,130,132,128,129,127,128,129,127,128,135,130,128,143,127,149,131,111,189,130,173,152,130,155,129,129,129,129,166,102,128,127,129,168,100,127,129,129,125,110,128,144,130,120,144,117,125,152,116,104,141,147,157,105,128,130,128,156,109,129,129,129,154,112,130,127,126,156,109,128,131,131,162,110,129,129,130,156,111,129,129,129,131,128,126,169,89,127,127,126,129,152,122,128,128,129,129,154,111,130,129,129,156,120,127,115,150,121,103,133,130,153,142,129,129,129,126,136,129,153,111,128,128,129,153,114,152,130,146,190,146,147,140,142,172,138,140,139,140,165,140,140,139,140,139,139,128,129,156,114,133,131,130,142,127,113,131,125,152,109,133,133,125,145,138,140,127,129,135,139,103,142,129,127,133,157,125,131,128,129,164,104,129,152,135,129,133,122,125,132,162,101,128,129,129,159,105,129,130,128,155,109,128,130,127,128,127,159,104,129,128,128,131,128,129,128,128,157,106,129,129,128,142,131,136,129,132,142,133,129,151,156,127,170,150,150,152,129,157,107,129,130,128,128,130,129,158,106,130,128,132,291,129,126,128,128,128,127,128,129,134,104,135,131,133,106,123,133,126,129,129,130,130,128,127,129,128,130,127,128,129,155,110,131,127,128,129,130,126,128,133,156,115,152,140,168,154,114,125,130,131,153,112,129,130,161,155,165,134,148,148,148,186,107,129,129,127,167,129,130,148,146,187,113,127,129,129,155,110,129,128,127,131,128,127,129,175,86,128,129,148,151,111,126,128,128,153,111,138,120,138,142,140,129,164,133,128,147,113,132,128,155,112,129,129,128,154,112,128,128,127,129,155,110,145,128,127,154,114,127,129,128,155,112,137,134,128,134,160,87,136,126,128,130,138,131,128,130,143,145,114,159,156,136,159,132,179,141,124,154,120,135,156,140,121,149,152,160,129,128,129,129,157,107,128,129,144,113,130,128,128,158,107,127,129,129,158,126,128,129,129,155,110,129,129,146,169,154,152,151,151,149,154,154,152,150,150,149,152,152,153,152,128,131,128,130,111,133,139,131,133,164,133,129,164,96,130,129,132,157,105,127,127,127,154,107,145,112,129,128,129,160,106,129,127,131,156,138,154,150,143,145,147,138,144,146,168,128,135,133,161,128,138,152,164,112,135,127,138,120,130,154,118,114,128,173,140,136,150,148,112,161,112,115,136,129,130,127,156,109,131,125,128,154,110,129,128,128,155,111,141,127,129,128,129,155,109,127,129,129,160,128,130,130,128,128,130,128,129,130,146,114,128,130,128,129,130,128,129,128,130,129,129,128,129,128,144,130,133,157,117,143,153,128,132,127,168,126,129,129,127,154,112,128,148,115,132,130,133,132,161,115,132,130,134,162,127,131,128,135,150,142,104,122,127,156,108,127,130,140,129,161,121,115,126,130,125,129,127,127,129,127,128,127,113,157,113,129,137,126,128,161,130,129,131,126,160,131,127,130,130,159,146,147,147,175,146,144,147,146,193,149,146,144,147,171,143,140,140,141,169,127,129,129,129,158,107,129,128,129,166,97,128,129,129,130,126,129,129,158,106,129,128,128,137,134,148,151,159,130,88,152,150,157,158,148,158,152,150,170,130,126,128,128,128,158,108,129,129,128,130,127,129,128,129,155,113,129,129,128,142,127,133,128,143,117,131,123,120,147,129,139,129,126,129,150,114,130,129,136,152,133,148,128,153,140,131,131,121,152,141,128,128,130,128,128,133,129,128,155,111,128,129,129,132,127,129,129,129,154,112,128,129,129,153,112,128,128,129,154,112,128,129,128,160,130,129,130,129,130,130,130,130,130,145,116,130,130,117,157,143,149,143,148,125,131,144,164,109,168,163,147,150,179,137,140,157,104,129,142,137,129,130,129,146,113,153,131,113,136,132,136,126,158,128,129,128,130,158,108,129,129,129,158,106,129,130,130,156,159,141,131,130,126,126,128,127,128,134,155,169,154,107,144,151,166,130,134,150,134,132,153,146,166,141,158,161,141,150,130,130,150,144,145,131,150,180,136,128,144,123,117,141,114,128,128,132,149,122,146,146,111,126,107,128,130,129,130,129,132,130,130,129,131,129,130,118,150,109,128,131,157,122,118,134,146,128,131,151,152,153,148,152,152,133,150,127,129,131,127,129,130,123,157,128,129,132,127,129,134,125,129,129,130,128,134,129,130,129,130,136,125,129,129,123,122,128,129,129,120,128,130,134,127,128,1555,99,127,134,146,113,128,128,128,128,129,132,143,109,127,128,130,127,128,128,132,131,129,132,126,129,129,132,128,130,134,123,133,127,129,129,128,128,128,129,121,124,129,129,129,134,132,129,130,130,136,128,114,130,140,125,131,139,122,123,131,128,145,119,194,136,106,127,131,130,128,128,128,128,128,130,128,128,128,134,130,126,134,127,129,127,127,131,130,128,129,132,127,128,128,128,115,127,131,127,133,128,129,128,128,128,128,128,130,135,160,153,130,129,129,123,114,152,156,150,248,127,130,132,154,123,130,159,157,135,119,144,139,140,153,136,108,110,121,138,133,116,142,111,128,128,129,108,127,126,149,162,113,173,156,133,148,149,151,166,150,151,149,158,128,126,134,131,148,111,132,124,149,106,128,129,126,161,130,135,134,131,134,135,130,127,137,129,113,132,162,155,158,131,162,129,139,129,162,129,136,141,158,139,166,147,137,146,153,125,142,136,127,128,129,127,129,128,129,141,131,151,133,124,141,130,127,129,130,130,125,128,128,128,128,131,141,132,155,164,102,153,135,151,123,128,134,142,138,129,129,128,128,130,127,128,130,129,129,145,122,130,128,131,140,165,155,134,133,142,134,135,131,142,126,140,149,194,130,132,147,115,129,129,131,149,113,125,127,128,128,129,128,146,127,137,131,151,110,127,127,127,127,127,129,128,134,134,132,154,131,115,123,149,130,110,128,165,147,131,132,129,132,143,158,135,159,161,165,138,152,132,139,128,146,145,151,114,127,127,128,128,128,131,147,111,129,128,149,107,130,130,128,124,135,142,140,140,143,136,133,304,140,155,132,130,135,133,122,134,133,131,134,137,138,146,131,135,135,120,153,131,185,141,133,135,134,149,146,148,147,155,159,145,146,158,156,146,144,136,112,173,157,132,132,127,128,145,114,129,135,133,134,146,121,160,130,163,152,140,146,150,137,138,129,128,130,128,129,129,128,133,127,130,129,128,129,127,129,145,134,157,151,145,145,145,145,146,155,137,138,127,128,127,127,126,129,130,128,132,130,126,152,142,131,148,148,130,128,131,124,172,123,153,155,153,157,180,154,138,129,127,129,130,138,134,130,129,127,128,129,128,131,150,125,114,130,153,136,114,136,123,129,128,147,139,145,114,127,129,141,130,130,131,135,117,128,147,145,146,148,154,136,124,137,124,134,171,127,118,134,131,154,154,125,123,131,127,132,133,134,110,126,107,127,129,127,129,128,134,126,130,128,128,130,128,131,128,132,139,135,133,140,142,128,137,142,132,177,146,155,126,129,129,129,128,128,129,143,155,126,130,127,127,128,129,129,123,116,139,128,131,129,151,113,127,128,130,129,129,128,130,127,128,129,111,132,126,128,136,269,129,126,132,131,130,129,122,130,132,130,139,129,135,146,121,130,152,130,125,127,129,118,126,128,128,127,129,127,134,122,129,126,129,130,141,133,132,130,133,138,169,156,130,168,136,135,129,111,132,127,134,129,131,146,131,133,130,132,126,133,126,129,113,130,129,129,129,133,128,158,135,111,129,129,128,131,125,128,128,128,128,130,129,133,125,128,128,127,130,129,135,132,127,130,126,130,132,127,129,131,133,146,115,139,131,157,160,155,156,150,130,130,127,131,126,129,128,127,127,111,131,126,146,114,131,128,128,128,124,130,128,129,128,128,128,129,131,137,131,135,126,135,131,134,132,139,135,130,133,127,149,113,130,129,135,134,128,128,130,118,135,123,115,129,130,129,141,129,124,131,139,137,128,159,137,131,144,172,178,159,120,169,150,139,155,121,274,144]} \ No newline at end of file diff --git a/INSTRUCTION.md b/INSTRUCTION.md index a7a4b2d..175a3df 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -290,7 +290,7 @@ UI is accessible anywhere as `cfg.enableEffect0`, etc. **Pass 1:** Renders the scene geometry and its properties to the g-buffers. * `copy.vert.glsl`, `copy.frag.glsl` -* The framebuffer object `pass_copy.fbo` must be bound during this pass. +* The framebuffer object `pass_copy.fbo1` must be bound during this pass. * Renders into `pass_copy.depthTex` and `pass_copy.gbufs[i]`, which need to be attached to the framebuffer. @@ -298,12 +298,12 @@ UI is accessible anywhere as `cfg.enableEffect0`, etc. * `quad.vert.glsl`, `deferred/blinnphong-pointlight.frag.glsl` * Takes the g-buffers `pass_copy.gbufs`/`depthTex` as texture inputs to the fragment shader, on uniforms `u_gbufs` and `u_depth`. -* `pass_deferred.fbo` must be bound. -* Renders into `pass_deferred.colorTex`. +* `pass_deferred.fbo1` must be bound. +* Renders into `pass_deferred.colorTex1`. **Pass 3:** Performs post-processing. * `quad.vert.glsl`, `post/one.frag.glsl` -* Takes `pass_deferred.colorTex` as a texture input `u_color`. +* Takes `pass_deferred.colorTex1` as a texture input `u_color`. * Renders directly to the screen if there are no additional passes. More passes may be added for additional effects (e.g. combining bloom with diff --git a/INSTRUCTION.md.orig b/INSTRUCTION.md.orig new file mode 100644 index 0000000..831e5de --- /dev/null +++ b/INSTRUCTION.md.orig @@ -0,0 +1,436 @@ +Proj 5 WebGL Deferred Shader - Instructions +======================== + +This is due at midnight on the midnight of **Tue Nov 8 2016**. + +**Summary:** In this project, you'll be introduced to the basics of deferred +shading and WebGL. You'll use GLSL and WebGL to implement a deferred shading +pipeline and various lighting and visual effects. + +**Recommendations:** +Take screenshots as you go. Use them to document your progress in your README! + +Read (or at least skim) the full README before you begin, so that you know what +to expect and what to prepare for. + +### Running the code + +If you have Python, you should be able to run `server.py` to start a server. +Then, open [`http://localhost:10565/`](http://localhost:10565/) in your browser. + +This project requires a WebGL-capable web browser with support for +`WEBGL_draw_buffers`. You can check for support on +[WebGL Report](http://webglreport.com/). + +Google Chrome seems to work best on all platforms. If you have problems running +the starter code, use Chrome or Chromium, and make sure you have updated your +browser and video drivers. Firefox's shader editor may require that you disable +WebGL debugging in `framework.js` (see below). + +Use the screenshot button to save a screenshot. + +## Requirements + +**Ask on the mailing list for any clarifications.** + +In this project, you are given code for: + +* Loading glTF models +* Camera control +* Partial implementation of deferred shading including many helper functions + +### Required Tasks + +**Before doing performance analysis,** you must disable debug mode by changing +`debugMode` to `false` in `framework.js`. Keep it enabled when developing - it +helps find WebGL errors *much* more easily. + +You will need to perform the following tasks: + +* Complete the deferred shading pipeline so that the Blinn-Phong and Post1 + shaders recieve the correct input. Go through the Starter Code Tour **before + continuing!** + +**Effects:** + +* Implement deferred Blinn-Phong shading (diffuse + specular) for point lights + * With normal mapping (code provided) + * For deferred shading, you want to use a lighting model for the point lights + which has a limited radius - so that adding a scissor or proxy geometry + will not cause parts of the lighting to disappear. It should look very + similar both with and without scissor/proxy optimization. Here is a + convenient lighting model, but you can also use others: + * `float attenuation = max(0.0, u_lightRad - dist_from_surface_to_light);` + +* Implement one of the following effects: + * Bloom using post-process blur (box or Gaussian) [1] + * Toon shading (with ramp shading + simple depth-edge detection for outlines) + +**Optimizations:** + +* Scissor test optimization: when accumulating shading from each point + light source, only render in a rectangle around the light. + * Show a debug view for this (showing scissor masks clearly), e.g. by + modifying and using `red.frag.glsl` with additive blending and alpha = 0.1. + * Code is provided to compute this rectangle for you, and there are + comments at the relevant place in `deferredRender.js` with more guidance. + * **NOTE:** The provided scissor function is not very accurate - it is a + quick hack which results in some errors (as can be seen in the live + demo). + +* Optimized g-buffer format - reduce the number and size of g-buffers: + * Ideas: + * Pack values together into vec4s + * Use 2-component normals + * Quantize values by using smaller texture types instead of gl.FLOAT + * Reduce number of properties passed via g-buffer, e.g. by: + * Applying the normal map in the `copy` shader pass instead of + copying both geometry normals and normal maps + * Reconstructing world space position using camera matrices and X/Y/depth + * For credit, you must show a good optimization effort and record the + performance of each version you test, in a simple table. + * It is expected that you won't need all 4 provided g-buffers for a basic + pipeline - make sure you disable the unused ones. + * See mainly: `copy.frag.glsl`, `deferred/*.glsl`, `deferredSetup.js` + +### Extra Tasks + +You must do at least **4 points** worth of extra features (effects or +optimizations/analysis). + +**Effects:** + +* (3pts) The effect you didn't choose above (bloom or toon shading) + +* (3pts) Screen-space motion blur (blur along velocity direction) [3] + +* (2pts) Allow variability in additional material properties + * Include other properties (e.g. specular coeff/exponent) in g-buffers + * Use this to render objects with different material properties + * These may be uniform across one model draw call, but you'll have to show + multiple models + +**Optimizations/Analysis:** + +* (2pts) Improved screen-space AABB for scissor test + (smaller/more accurate than provided - but beware of CPU/GPU tradeoffs) + +* (3pts) Two-pass **Gaussian** blur using separable convolution (using a second + postprocess render pass) to improve bloom or other 2D blur performance + +* (4pts) Light proxies + * (4pts) Instead of rendering a scissored full-screen quad for every light, + render some proxy geometry which covers the part of the screen affected by + the light (e.g. a sphere, for an attenuated point light). + * A model called `sphereModel` is provided which can be drawn in the same + way as the code in `drawScene`. (Must be drawn with a vertex shader which + scales it to the light radius and translates it to the light position.) + * (+ extra 2pts) To avoid lighting geometry far behind the light, render the proxy + geometry (e.g. sphere) using an inverted depth test + (`gl.depthFunc(gl.GREATER)`) with depth writing disabled (`gl.depthMask`). + This test will pass only for parts of the screen for which the backside of + the sphere appears behind parts of the scene. + * Note that the copy pass's depth buffer must be bound to the FBO during + this operation! + * Show a debug view for this (showing light proxies) + * Compare performance of this, naive, and scissoring. + +* (6pts) Tile-based deferred shading with detailed performance comparison + * On the CPU, check which lights overlap which tiles. Then, render each tile + just once for all lights (instead of once for each light), applying only + the overlapping lights. + * The method is described very well in + [Yuqin & Sijie's README](https://github.com/YuqinShao/Tile_Based_WebGL_DeferredShader/blob/master/README.md#algorithm-details). + * This feature requires allocating the global light list and tile light + index lists as shown at this link. These can be implemented as textures. + * Show a debug view for this (number of lights per tile) + * (+ extra 4pts) Do the light tile overlapping test on GPU (using shader). + This might be a little hacky, the idea is similar to + the light culling stage that you need to implemnt in [Project5A-Forward-Plus-Renderer](https://github.com/CIS565-Fall-2016/Project5A-WebGL-Forward-Plus-Shading-with-glTF). + Show performance comparison to deferred and tile-based deferred with light tile test on CPU. + +* (3pts) Compare performance to equivalently-lit forward-rendering and forward-plus-rendering: + * You can pair with a classmate choosing to do forward-plus-renderer. + +This extra feature list is not comprehensive. If you have a particular idea +that you would like to implement, please **contact us first** (preferably on +the mailing list). + +**Where possible, all features should be switchable using the GUI panel in +`ui.js`.** + +### Performance & Analysis + +**Before doing performance analysis,** you must disable debug mode by changing +`debugMode` to `false` in `framework.js`. Keep it enabled when developing - it +helps find WebGL errors *much* more easily. + +Optimize your JavaScript and/or GLSL code. Chrome/Firefox's profiling tools +(see Resources section) will be useful for this. For each change +that improves performance, show the before and after render times. + +For each new *effect* feature (required or extra), please +provide the following analysis: + +* Concise overview write-up of the feature. +* Performance change due to adding the feature. + * If applicable, how do parameters (such as number of lights, etc.) + affect performance? Show data with simple graphs. + * Show timing in milliseconds, not FPS. +* If you did something to accelerate the feature, what did you do and why? +* How might this feature be optimized beyond your current implementation? + +For each *performance* feature (required or extra), please provide: + +* Concise overview write-up of the feature. +* Detailed performance improvement analysis of adding the feature + * What is the best case scenario for your performance improvement? What is + the worst? Explain briefly. + * Are there tradeoffs to this performance feature? Explain briefly. + * How do parameters (such as number of lights, tile size, etc.) affect + performance? Show data with graphs. + * Show timing in milliseconds, not FPS. + * Show debug views when possible. + * If the debug view correlates with performance, explain how. + +### Starter Code Tour + +You'll be working mainly in `deferredRender.js` and shaders in `glsl/` folder using raw WebGL. +Three.js is included in the project for various reasons. You won't use it for much, but its +matrix/vector types may come in handy. You don't need to learn Three.js for this project. + +For editing JavaScript, you can use a simple editor with syntax highlighting +such as Atom, VS-Code, Sublime, Vim, Emacs, etc., or the editor built into Chrome. + +It's highly recommended that you use the browser debugger (F12 on Windows) to inspect variables +to get familiar with the code. At any point, you can also +`console.log(some_var);` to show it in the console and inspect it. + +The setup in `deferredSetup` is already done for you, for many of the features. +If you want to add uniforms (textures or values), you'll change them here. +Therefore, it is recommended that you review the comments to understand the +process, BEFORE starting work in `deferredRender`. + +Test incrementally (after implementing each part, instead of testing +all at once). + +Here's a guide to get you started: + +* Your first goal is to render a red fullscreen quad. +<<<<<<< HEAD + - `js/deferredRender.js`: walk through the code and implement by uncommenting those labeled with `TODO: uncomment` +======= + - `js/deferredRender.js`: walk through the code and implment by uncommenting those labeled with `TODO: uncomment` +>>>>>>> ad3655ceb61e049041cbeb6d40f2858a873e2619 + - implement function `renderFullScreenQuad` + +* Your _next_ first goal should be to get the debug views working. +Add code in `debug.frag.glsl` to examine your g-buffers before trying to +render them. (Set the debugView in the UI to show them.) + - `js/deferredRender.js` + - implement `R.pass_debug.render` + - implement `R.pass_copy.render` + - implement `R.pass_debug.render` + - `glsl/copy.frag.glsl` + - `glsl/deferred/debug.frag.glsl` + +* At this point you should have some understanding of how WebGL works. +Those bind buffer, bind texture, vertex pointer is copying data from cpu to gpu and tell +the gpu how to access them. It is very similar to what you've done in your Proj4 rasterizer. +glsl Shaders are code running on gpu. You can treat them as cuda kernel functions in your Proj4. + +* Now go ahead and implement the deferred shading + - `js/deferredRender.js`: finish implementing this file. This time you need to write some code. + - `glsl/deferred/ambient.frag.glsl` + - `glsl/deferred/blinnphong-pointlight.frag.glsl` + - everything... you are on your own now. + + +Full files guidance: + +* `js/`: JavaScript files for this project. + * `main.js`: Handles initialization of other parts of the program. + * `framework.js`: Loads the scene, camera, etc., and calls your setup/render + functions. Hopefully, you won't need to change anything here. + * `deferredSetup.js`: Deferred shading pipeline setup code. + * `createAndBind(Depth/Color)TargetTexture`: Creates empty textures for + binding to frame buffer objects as render targets. + * `deferredRender.js`: Your deferred shading pipeline execution code. + * `renderFullScreenQuad`: Renders a full-screen quad with the given shader + program. + * `ui.js`: Defines the UI using + [dat.GUI](https://workshop.chromeexperiments.com/examples/gui/). + * The global variable `cfg` can be accessed anywhere in the code to read + configuration values. + * `utils.js`: Utilities for JavaScript and WebGL. + * `abort`: Aborts the program and shows an error. + * `loadTexture`: Loads a texture from a URL into WebGL. + * `loadShaderProgram`: Loads shaders from URLs into a WebGL shader program. + * `loadModel`: Loads a model into WebGL buffers. + * `readyModelForDraw`: Configures the WebGL state to draw a model. + * `drawReadyModel`: Draws a model which has been readied. + * `getScissorForLight`: Computes an approximate scissor rectangle for a + light in world space. +* `glsl/`: GLSL code for each part of the pipeline: + * `clear.*.glsl`: Clears each of the `NUM_GBUFFERS` g-buffers. + * `copy.*.glsl`: Performs standard rendering without any fragment shading, + storing all of the resulting values into the `NUM_GBUFFERS` g-buffers. + * `quad.vert.glsl`: Minimal vertex shader for rendering a single quad. + * `deferred.frag.glsl`: Deferred shading pass (for lighting calculations). + Reads from each of the `NUM_GBUFFERS` g-buffers. + * `post1.frag.glsl`: First post-processing pass. +* `lib/`: JavaScript libraries. +* `models/`: glTF models for testing. Sponza is the default (And the only tested supported one for now. Due to time limitation T_T. ) +* `index.html`: Main HTML page. +* `server.bat` (Windows) or `server.py` (OS X/Linux): + Runs a web server at `localhost:10565`. + +### The Deferred Shading Pipeline + +See the comments in `deferredSetup.js`/`deferredRender.js` for low-level guidance. + +In order to enable and disable effects using the GUI, upload a vec4 uniform +where each component is an enable/disable flag. In JavaScript, the state of the +UI is accessible anywhere as `cfg.enableEffect0`, etc. + +**Pass 1:** Renders the scene geometry and its properties to the g-buffers. +* `copy.vert.glsl`, `copy.frag.glsl` +* The framebuffer object `pass_copy.fbo` must be bound during this pass. +* Renders into `pass_copy.depthTex` and `pass_copy.gbufs[i]`, which need to be + attached to the framebuffer. + +**Pass 2:** Performs lighting and shading into the color buffer. +* `quad.vert.glsl`, `deferred/blinnphong-pointlight.frag.glsl` +* Takes the g-buffers `pass_copy.gbufs`/`depthTex` as texture inputs to the + fragment shader, on uniforms `u_gbufs` and `u_depth`. +* `pass_deferred.fbo` must be bound. +* Renders into `pass_deferred.colorTex`. + +**Pass 3:** Performs post-processing. +* `quad.vert.glsl`, `post/one.frag.glsl` +* Takes `pass_BlinnPhong_PointLight.colorTex` as a texture input `u_color`. +* Renders directly to the screen if there are no additional passes. + +More passes may be added for additional effects (e.g. combining bloom with +motion blur) or optimizations (e.g. two-pass Gaussian blur for bloom) + +#### Debugging + +If there is a WebGL error, it will be displayed on the developer console and +the renderer will be aborted. To find out where the error came from, look at +the backtrace of the error (you may need to click the triangle to expand the +message). The line right below `wrapper @ webgl-debug.js` will point to the +WebGL call that failed. + +When working in the early pipeline (before you have a lit render), it can be +useful to render WITHOUT post-processing. To do this, you have to make sure +that there is NO framebuffer bound while rendering to the screen (that is, bind +null) so that the output will display to the screen instead of saving into a +texture. Writing to gl_FragData[0] is the same as writing to gl_FragColor, so +you'll see whatever you were storing into the first g-buffer. + +#### Changing the number of g-buffers + +Note that the g-buffers are just `vec4`s - you can put any values you want into +them. However, if you want to change the total number of g-buffers (add more +for additional effects or remove some for performance), you will need to make +changes in a number of places: + +* `deferredSetup.js`/`deferredRender.js`: search for `NUM_GBUFFERS` +* `copy.frag.glsl` +* `deferred.frag.glsl` +* `clear.frag.glsl` + + +## Resources + +* [1] Bloom: + [GPU Gems, Ch. 21](http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html) +* [2] Screen-Space Ambient Occlusion: + [Floored Article](http://www.floored.com/blog/2015ssao-screen-space-ambient-occlusion/) +* [3] Post-Process Motion Blur: + [GPU Gems 3, Ch. 27](http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html) + +**Also see:** The articles linked in the course schedule. + +### Profiling and debugging tools + +Built into Firefox: +* Canvas inspector +* Shader Editor +* JavaScript debugger and profiler + +Built into Chrome: +* JavaScript debugger and profiler + +Plug-ins: +* Web Tracing Framework + **Does not currently work with multiple render targets**, + which are used in the starter code. +* (Chrome) [Shader Editor](https://chrome.google.com/webstore/detail/shader-editor/ggeaidddejpbakgafapihjbgdlbbbpob) + +Libraries: +* Stats.js (already included) + +Firefox can also be useful - it has a canvas inspector, WebGL profiling and a +shader editor built in. + +## README + +Replace the contents of the README.md in a clear manner with the following: + +* A brief description of the project and the specific features you implemented. +* At least one screenshot of your project running. +* A 30+ second video/gif of your project running showing all features. + (Even though your demo can be seen online, using multiple render targets + means it won't run on many computers. A video will work everywhere.) +* A performance analysis (described below). + +### Performance Analysis + +See above. + +### GitHub Pages + +Since this assignment is in WebGL, you can make your project easily viewable by +taking advantage of GitHub's project pages feature. + +Once you are done with the assignment, create a new branch: + +`git branch gh-pages` + +Push the branch to GitHub: + +`git push origin gh-pages` + +Now, you can go to `.github.io/` to see your +renderer online from anywhere. Add this link to your README. + +## Submit + +Beware of any build issues discussed on the Google Group. + +Open a GitHub pull request so that we can see that you have finished. +The title should be "Project 5B: YOUR NAME". +The template of the comment section of your pull request is attached below, you can do some copy and paste: + +* [Repo Link](https://link-to-your-repo) +* `Your PENNKEY` +* (Briefly) Mentions features that you've completed. Especially those bells and whistles you want to highlight + * Feature 0 + * Feature 1 + * ... +* Feedback on the project itself, if any. + +### Third-Party Code Policy + +* Use of any third-party code must be approved by asking on our mailing list. +* If it is approved, all students are welcome to use it. Generally, we approve + use of third-party code that is not a core part of the project. For example, + for the path tracer, we would approve using a third-party library for loading + models, but would not approve copying and pasting a CUDA function for doing + refraction. +* Third-party code **MUST** be credited in README.md. +* Using third-party code without its approval, including using another + student's code, is an academic integrity violation, and will, at minimum, + result in you receiving an F for the semester. diff --git a/README.md b/README.md index 25002db..3dd3b22 100644 --- a/README.md +++ b/README.md @@ -3,26 +3,35 @@ WebGL Deferred Shading **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 5** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) **Google Chrome 222.2** on - Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Ethan Brooks +* Tested on: Google Chrome Version 54.0.2840.71 (64-bit) + OS X Sierra, Intel Iris Pro 1536 MB -### Live Online +![](https://github.com/lobachevzky/Project5-WebGL-Deferred-Shading-with-glTF/blob/master/vid2.gif) -[![](img/thumb.png)](http://TODO.github.io/Project5B-WebGL-Deferred-Shading) +### Summary +For this project I implemented part of a deferred in WebGL. A deferred shader is a way to optimize shading in scenes with many lights. All geometries relevant to the fragment shading are calculated in a single pass and stored in a buffer (the g-buffer). Subsequently the fragment shader iterates through the lights in the scene and accesses the geometries in the buffer to color fragments lit by the light. In this project, I implemented the fragment shader, using the Blinn-Phong shading method, and two additional feature: toon shading and motion blur. I also made some additional adjustments to the scissor frame to ensure more accurate scissor clipping. -### Demo Video/GIF +## Fragment shader +This shader uses the Blinn-Phong method. The brightness of an object is proportional to the angle between the surface normal and another angle, calculated as the sum of the vector from surface to eye and from surface to light. -[![](img/video.png)](TODO) +## Toon shading +Toon shading discretizes light shading by bucketing shade levels into discrete buckets. In the simplest case -- two shade levels -- all cells lit above a certain threshold are shaded with the same amount of brightness and similarly for all cells lit below that threshold. My implementation of toon shading also uses an edge detector to outline edges. The edge detector applies a convolution over the depth associated with each pixel, picking out pixels adjacent to significant depth change and coloring these black. -### (TODO: Your README) +![](https://github.com/lobachevzky/Project5-WebGL-Deferred-Shading-with-glTF/blob/master/duck.gif) -*DO NOT* leave the README to the last minute! It is a crucial part of the -project, and we will not be able to grade you without a good README. +## Motion blur +Motion blur subsamples pixels over time in the direction of their velocity. In order to get the previous position of a pixel, I stored the screen-to-world transformation matrices for the previous turn. This transformation sends a point from screen space to world space. Using the previous turn's transformation matrix, I was able to calculate the points position in world space for the current and the previous turn and then calculate the difference between the two, yielding a velocity vector. I then subdivided this vector and subsampled pixels between the current and previous position. I noticed that the camera blur seemed to be a little jittery. In order to mitigate this, instead of storing a moving average of the previous frame's transformation matrix. This helped slightly, but I speculate that one flaw with this approach is that the inverse transformations from screen to world position tend to produce a lot of rounding errors. I suspect that a better looking, but less performant method would simply store the previous world position of each pixel from turn to turn. This would require storing a `vec4` for every pixel instead of simply storing a `mat4` as the current method does. That said, it might run faster since the blur mechanism would be spared some matrix inversions. -This assignment has a considerable amount of performance analysis compared -to implementation work. Complete the implementation early to leave time! +![](https://github.com/lobachevzky/Project5-WebGL-Deferred-Shading-with-glTF/blob/master/blur.gif) +## Scissor optimization +Since light attenuates with distance in our model, at a certain distance, light ceases to have any effect on an area. Consequently our shader only scans pixels within the light radius of any given light, establishing a rectangle around the edges of the circle cast by the light radius. The original implementation simply took the cube circumscribing the light sphere and rendered pixels lying between the upper left corner of this cube and the lower right. In a few edge cases, however, the resulting rectangle failed to fully enclose the light halo. To correct the error, I iterated through all eight corners of the circumscribing cube to calculate the actual minima and maxima along the x and y axes. + +![](https://github.com/lobachevzky/Project5-WebGL-Deferred-Shading-with-glTF/blob/master/scissor.gif) + +## G-buffer optimization +In order to optimize memory usage in the g-buffer, I pre-calculated surface normals, combining texture normals with surface normals before adding them to the g-buffer. The naive method stores texture normals and surface normals separately and combines them in the fragment shader. My optimization combines them first and stores the result in the g-buffer. As a result the total time of the deferred render pass dropped from 36.6 ms to 29.4 ms. ### Credits diff --git a/blur.gif b/blur.gif new file mode 100644 index 0000000..4881cce Binary files /dev/null and b/blur.gif differ diff --git a/blur.mov b/blur.mov new file mode 100644 index 0000000..ef8c15b Binary files /dev/null and b/blur.mov differ diff --git a/duck.gif b/duck.gif new file mode 100644 index 0000000..713648c Binary files /dev/null and b/duck.gif differ diff --git a/duck.mov b/duck.mov new file mode 100644 index 0000000..7d92765 Binary files /dev/null and b/duck.mov differ diff --git a/glsl/copy.frag.glsl b/glsl/copy.frag.glsl index 823ebcd..e12d1f5 100644 --- a/glsl/copy.frag.glsl +++ b/glsl/copy.frag.glsl @@ -10,11 +10,23 @@ varying vec3 v_position; varying vec3 v_normal; varying vec2 v_uv; +vec3 applyNormalMap(vec3 geomnor, vec3 normap) { + normap = normap * 2.0 - 1.0; + vec3 up = normalize(vec3(0.001, 1, 0.001)); + vec3 surftan = normalize(cross(geomnor, up)); + vec3 surfbinor = cross(geomnor, surftan); + return normap.y * surftan + normap.x * surfbinor + normap.z * geomnor; +} + void main() { + vec3 texnor = texture2D( u_normap, vec2(v_uv) ).xyz; + vec3 nor = applyNormalMap(v_normal, texnor); // TODO: copy values into gl_FragData[0], [1], etc. // You can use the GLSL texture2D function to access the textures using // the UV in v_uv. // this gives you the idea - // gl_FragData[0] = vec4( v_position, 1.0 ); + gl_FragData[0] = vec4( v_position, 1.0 ); + gl_FragData[1] = vec4( nor, 1.0 ); + gl_FragData[2] = texture2D( u_colmap, vec2(v_uv) ); } diff --git a/glsl/deferred/ambient.frag.glsl b/glsl/deferred/ambient.frag.glsl index 1fd4647..7d6f523 100644 --- a/glsl/deferred/ambient.frag.glsl +++ b/glsl/deferred/ambient.frag.glsl @@ -16,12 +16,14 @@ void main() { vec4 gb2 = texture2D(u_gbufs[2], v_uv); vec4 gb3 = texture2D(u_gbufs[3], v_uv); float depth = texture2D(u_depth, v_uv).x; + // TODO: Extract needed properties from the g-buffers into local variables + vec3 colmap = gb2.rgb; // The color map - unlit "albedo" (surface color) if (depth == 1.0) { gl_FragColor = vec4(0, 0, 0, 0); // set alpha to 0 return; } - gl_FragColor = vec4(0.1, 0.1, 0.1, 1); // TODO: replace this + gl_FragColor = vec4(colmap * 0.1, 1); // TODO: replace this } diff --git a/glsl/deferred/blinnphong-pointlight.frag.glsl b/glsl/deferred/blinnphong-pointlight.frag.glsl index b24a54a..cfc5f65 100644 --- a/glsl/deferred/blinnphong-pointlight.frag.glsl +++ b/glsl/deferred/blinnphong-pointlight.frag.glsl @@ -2,38 +2,53 @@ precision highp float; precision highp int; -#define NUM_GBUFFERS 4 +#define NUM_GBUFFERS 3 +#define NUM_CEL_CUTS 7 +#define GB(i) (texture2D(u_gbufs[i], v_uv).xyz) +#define ROUND(n) (floor((n) + 0.5)) uniform vec3 u_lightCol; uniform vec3 u_lightPos; -uniform float u_lightRad; +uniform vec3 u_camPos; + uniform sampler2D u_gbufs[NUM_GBUFFERS]; uniform sampler2D u_depth; +uniform float u_lightRad; +uniform int u_toon; + varying vec2 v_uv; -vec3 applyNormalMap(vec3 geomnor, vec3 normap) { - normap = normap * 2.0 - 1.0; - vec3 up = normalize(vec3(0.001, 1, 0.001)); - vec3 surftan = normalize(cross(geomnor, up)); - vec3 surfbinor = cross(geomnor, surftan); - return normap.y * surftan + normap.x * surfbinor + normap.z * geomnor; -} +const vec4 SKY_COLOR = vec4(0.01, 0.14, 0.42, 1.0); void main() { - vec4 gb0 = texture2D(u_gbufs[0], v_uv); - vec4 gb1 = texture2D(u_gbufs[1], v_uv); - vec4 gb2 = texture2D(u_gbufs[2], v_uv); - vec4 gb3 = texture2D(u_gbufs[3], v_uv); float depth = texture2D(u_depth, v_uv).x; + // TODO: Extract needed properties from the g-buffers into local variables + // These definitions are suggested for starting out, but you will probably want to change them. + vec3 viewPos = GB(0); // World-space position + vec3 nor = GB(1); // Normals of the geometry as defined, without normal mapping + vec3 colmap = GB(2); // The color map - unlit "albedo" (surface color) // If nothing was rendered to this pixel, set alpha to 0 so that the // postprocessing step can render the sky color. if (depth == 1.0) { - gl_FragColor = vec4(0, 0, 0, 0); + gl_FragColor = SKY_COLOR; return; } - gl_FragColor = vec4(0, 0, 1, 1); // TODO: perform lighting calculations + vec3 posRelLight = u_lightPos - viewPos; + vec3 V = normalize(viewPos); + vec3 L = normalize(posRelLight); + vec3 H = normalize(L + V); // mid angle beteen light and viewer + float intensity = dot(nor, H); + float attenuation = max(0.0, 1.0 - (length(posRelLight) / u_lightRad)); + float shading = attenuation * intensity; + + if (u_toon == 1) { + float cuts = float(NUM_CEL_CUTS); + shading = ROUND(shading * cuts) / cuts; + } + + gl_FragColor = shading * vec4(colmap * u_lightCol, 1.0); } diff --git a/glsl/deferred/blur.frag.glsl b/glsl/deferred/blur.frag.glsl new file mode 100644 index 0000000..37489c1 --- /dev/null +++ b/glsl/deferred/blur.frag.glsl @@ -0,0 +1,61 @@ +#version 100 + +precision highp float; +precision highp int; + +#define NUM_GBUFFERS 3 +#define NUM_SAMPLES 13 + +varying vec2 v_uv; + +uniform mat4 prevScreen2World; +uniform mat4 newScreen2World; +uniform mat4 world2Screen; + +uniform sampler2D u_depth; +uniform sampler2D u_color; + + +vec4 getWorldPos(vec4 H, mat4 transform) { + + // Transform by the view-projection inverse. + vec4 D = transform * H; + + // Divide by w to get the view position. + return D / D.w; +} + +void main() { + + // Get the depth buffer value at this pixel. + float zOverW = texture2D(u_depth, v_uv).x; // why .x ? + + // H is the viewport position at this pixel in the range -1 to 1. + vec2 rescaled_uv = vec2(v_uv * 2.0 - 1.0); + + // Screen pos + vec4 H = vec4(rescaled_uv, zOverW, 1); + + vec4 prevPos = getWorldPos(H, prevScreen2World); + vec4 newPos = getWorldPos(H, newScreen2World); + + // Use this frame's position and last frame's to compute the pixel velocity. + vec2 velocity = (world2Screen * (newPos - prevPos)).xy; + velocity *= velocity; + + // Get the initial color at this pixel. + vec4 color = texture2D(u_color, v_uv); // TODO: not the color, but the output of blinnphong + + vec2 v_uv_shifted = v_uv; + for(int i = 1; i < NUM_SAMPLES; ++i) { + v_uv_shifted += velocity / float(NUM_SAMPLES) / 10.0; + + // Sample the color buffer along the velocity vector. + vec4 currentColor = texture2D(u_color, v_uv_shifted); // TODO: sample from somewhere else. + + // Add the current color to our color sum. + color += currentColor; + } + // Average all of the samples to get the final blur color. + gl_FragColor = color / float(NUM_SAMPLES); +} diff --git a/glsl/deferred/debug.frag.glsl b/glsl/deferred/debug.frag.glsl index 007466f..8af2233 100644 --- a/glsl/deferred/debug.frag.glsl +++ b/glsl/deferred/debug.frag.glsl @@ -38,15 +38,15 @@ void main() { if (u_debug == 0) { gl_FragColor = vec4(vec3(depth), 1.0); } else if (u_debug == 1) { - // gl_FragColor = vec4(abs(pos) * 0.1, 1.0); + gl_FragColor = vec4(abs(pos) * 0.1, 1.0); } else if (u_debug == 2) { - // gl_FragColor = vec4(abs(geomnor), 1.0); + gl_FragColor = vec4(abs(geomnor), 1.0); } else if (u_debug == 3) { - // gl_FragColor = vec4(colmap, 1.0); + gl_FragColor = vec4(colmap, 1.0); } else if (u_debug == 4) { - // gl_FragColor = vec4(normap, 1.0); + gl_FragColor = vec4(normap, 1.0); } else if (u_debug == 5) { - // gl_FragColor = vec4(abs(nor), 1.0); + gl_FragColor = vec4(abs(nor), 1.0); } else { gl_FragColor = vec4(1, 0, 1, 1); } diff --git a/glsl/deferred/edges.frag.glsl b/glsl/deferred/edges.frag.glsl new file mode 100644 index 0000000..06ee43e --- /dev/null +++ b/glsl/deferred/edges.frag.glsl @@ -0,0 +1,39 @@ +#version 100 +precision highp float; +precision highp int; + +#define NUM_GBUFFERS 3 +#define NUM_CEL_CUTS 7 + +uniform sampler2D u_gbufs[NUM_GBUFFERS]; +uniform sampler2D u_depth; + +varying vec2 v_uv; + +void main() { + int width = 800; + int height = 600; + + mat3 kernel = mat3( + 1, 1, 1, + 1, -8, 1, + 1, 1, 1 + ); + + float conv = 0.0; + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + vec2 offset = vec2(i, j) / vec2(width, height); + vec4 depth_at_offset = texture2D(u_depth, v_uv + offset); + vec4 product_at_offset = depth_at_offset * float(kernel[i + 1][j + 1]); + float reduce_sum = dot(vec4(1), product_at_offset); + conv += reduce_sum; + } + } + + float depth = texture2D(u_depth, v_uv).x; + if (abs(conv) > 1.0 && depth < 1.0) { + gl_FragColor = vec4(1) * .065; + gl_FragColor.w = 1.0; + } +} diff --git a/glsl/deferred/edges.frag.glsl.orig b/glsl/deferred/edges.frag.glsl.orig new file mode 100644 index 0000000..fbc9c41 --- /dev/null +++ b/glsl/deferred/edges.frag.glsl.orig @@ -0,0 +1,61 @@ +#version 100 +precision highp float; +precision highp int; + +#define NUM_GBUFFERS 3 +#define NUM_CEL_CUTS 7 +#define gb(i) (texture2D(u_gbufs[i], v_uv).xyz) +#define round(n) (floor((n) + 0.5)) +<<<<<<< HEAD +#define color_at_offset(i, j) (texture2D(u_gbufs[2], v_uv + vec2(i, j))) +#define PRODUCT_AT_OFFSET(i, j, kernel) (dot(vec4(1), color_at_offset(i, j) * float(kernel[i][j]))) + +uniform sampler2D u_gbufs[NUM_GBUFFERS]; +======= +#define color_at_offset(i, j) (texture2D(u_depth, v_uv + vec2(i, j) / vec2(width, height))) +#define PRODUCT_AT_OFFSET(i, j, kernel) (dot(vec4(1), color_at_offset(i, j) * float(kernel[i][j]))) + +uniform sampler2D u_gbufs[NUM_GBUFFERS]; +uniform sampler2D u_depth; +>>>>>>> edges + +varying vec2 v_uv; + +void main() { + int width = 800; + int height = 600; + + mat2 gx = mat2( + 1, 0, + 0, -1 + ); + + mat2 gy = mat2( + 0, -1, + 1, 0 + ); + + float gx_conv = PRODUCT_AT_OFFSET(0, 0, gx) + + PRODUCT_AT_OFFSET(0, 1, gx) + + + PRODUCT_AT_OFFSET(1, 0, gx) + + PRODUCT_AT_OFFSET(1, 1, gx) ; + + float gy_conv = PRODUCT_AT_OFFSET(0, 0, gy) + + PRODUCT_AT_OFFSET(0, 1, gy) + + + PRODUCT_AT_OFFSET(1, 0, gy) + + PRODUCT_AT_OFFSET(1, 1, gy) ; + +<<<<<<< HEAD + if (gx_conv + gy_conv > -1000.0) { + gl_FragColor = vec4(1, 0, 0, 0); + } + + gl_FragColor = vec4(1, 0, 0, 0); +======= + if (gx_conv + gy_conv > 0.5) { + gl_FragColor = vec4(0, 0, 0, 1); + } +>>>>>>> edges +} diff --git a/glsl/red.frag.glsl b/glsl/red.frag.glsl index f8ef1ec..e41993b 100644 --- a/glsl/red.frag.glsl +++ b/glsl/red.frag.glsl @@ -3,5 +3,5 @@ precision highp float; precision highp int; void main() { - gl_FragColor = vec4(1, 0, 0, 1); + gl_FragColor = vec4(1, 0, 0, 0.1); } diff --git a/js/deferredRender.js b/js/deferredRender.js index bb3edd4..7f4441f 100644 --- a/js/deferredRender.js +++ b/js/deferredRender.js @@ -28,13 +28,6 @@ // CHECKITOUT: START HERE! You can even uncomment this: //debugger; - { // TODO: this block should be removed after testing renderFullScreenQuad - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - // TODO: Implement/test renderFullScreenQuad first - renderFullScreenQuad(R.progRed); - return; - } - R.pass_copy.render(state); if (cfg && cfg.debugView >= 0) { @@ -44,8 +37,8 @@ } else { // * Deferred pass and postprocessing pass(es) // TODO: uncomment these - // R.pass_deferred.render(state); - // R.pass_post1.render(state); + R.pass_deferred.render(state); + R.pass_post1.render(state); // OPTIONAL TODO: call more postprocessing passes, if any } @@ -57,21 +50,20 @@ R.pass_copy.render = function(state) { // * Bind the framebuffer R.pass_copy.fbo // TODO: uncomment - // gl.bindFramebuffer(gl.FRAMEBUFFER,R.pass_copy.fbo); - + gl.bindFramebuffer(gl.FRAMEBUFFER, R.pass_copy.fbo); // * Clear screen using R.progClear // TODO: uncomment - // renderFullScreenQuad(R.progClear); + renderFullScreenQuad(R.progClear); // * Clear depth buffer to value 1.0 using gl.clearDepth and gl.clear // TODO: uncomment - // gl.clearDepth(1.0); - // gl.clear(gl.DEPTH_BUFFER_BIT); + gl.clearDepth(1.0); + gl.clear(gl.DEPTH_BUFFER_BIT); // * "Use" the program R.progCopy.prog // TODO: uncomment - // gl.useProgram(R.progCopy.prog); + gl.useProgram(R.progCopy.prog); // TODO: Go write code in glsl/copy.frag.glsl @@ -79,18 +71,18 @@ // * Upload the camera matrix m to the uniform R.progCopy.u_cameraMat // using gl.uniformMatrix4fv // TODO: uncomment - // gl.uniformMatrix4fv(R.progCopy.u_cameraMat, false, m); + gl.uniformMatrix4fv(R.progCopy.u_cameraMat, false, m); // * Draw the scene // TODO: uncomment - // drawScene(state); + drawScene(state); }; var drawScene = function(state) { for (var i = 0; i < state.models.length; i++) { var m = state.models[i]; - // If you want to render one model many times, note: + // If you want to render // readyModelForDraw only needs to be called once. readyModelForDraw(R.progCopy, m); @@ -101,25 +93,26 @@ R.pass_debug.render = function(state) { // * Unbind any framebuffer, so we can write to the screen // TODO: uncomment - // gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); // * Bind/setup the debug "lighting" pass // * Tell shader which debug view to use // TODO: uncomment - // bindTexturesForLightPass(R.prog_Debug); - // gl.uniform1i(R.prog_Debug.u_debug, cfg.debugView); + bindTexturesForLightPass(R.prog_Debug); + gl.uniform1i(R.prog_Debug.u_debug, cfg.debugView); // * Render a fullscreen quad to perform shading on // TODO: uncomment - // renderFullScreenQuad(R.prog_Debug); + renderFullScreenQuad(R.prog_Debug); }; /** * 'deferred' pass: Add lighting results for each individual light */ + R.pass_deferred.render = function(state) { - // * Bind R.pass_deferred.fbo to write into for later postprocessing - gl.bindFramebuffer(gl.FRAMEBUFFER, R.pass_deferred.fbo); + // * Bind R.pass_deferred.fbo1 to write into for later postprocessing + gl.bindFramebuffer(gl.FRAMEBUFFER, R.pass_deferred.fbo1); // * Clear depth to 1.0 and color to black gl.clearColor(0.0, 0.0, 0.0, 0.0); @@ -130,34 +123,80 @@ // Enable blending and use gl.blendFunc to blend with: // color = 1 * src_color + 1 * dst_color - // Here is a wonderful demo of showing how blend function works: + // Here is a wonderful demo of showing how blend function works: // http://mrdoob.github.io/webgl-blendfunctions/blendfunc.html // TODO: uncomment - // gl.enable(gl.BLEND); - // gl.blendEquation( gl.FUNC_ADD ); - // gl.blendFunc(gl.ONE,gl.ONE); + gl.enable(gl.BLEND); + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); // * Bind/setup the ambient pass, and render using fullscreen quad bindTexturesForLightPass(R.prog_Ambient); renderFullScreenQuad(R.prog_Ambient); // * Bind/setup the Blinn-Phong pass, and render using fullscreen quad - bindTexturesForLightPass(R.prog_BlinnPhong_PointLight); // TODO: add a loop here, over the values in R.lights, which sets the // uniforms R.prog_BlinnPhong_PointLight.u_lightPos/Col/Rad etc., // then does renderFullScreenQuad(R.prog_BlinnPhong_PointLight). - // TODO: In the lighting loop, use the scissor test optimization - // Enable gl.SCISSOR_TEST, render all lights, then disable it. - // - // getScissorForLight returns null if the scissor is off the screen. - // Otherwise, it returns an array [xmin, ymin, width, height]. - // - // var sc = getScissorForLight(state.viewMat, state.projMat, light); + gl.enable(gl.SCISSOR_TEST); + + var prog = R.prog_BlinnPhong_PointLight; + bindTexturesForLightPass(prog); + for (var i in R.lights) { + var light = R.lights[i]; + + var sc = getScissorForLight(state.viewMat, state.projMat, light); + if (sc) { + gl.scissor(sc[0], sc[1], sc[2], sc[3]); + } + + gl.uniform1i(prog.u_toon, cfg.toon|0); + gl.uniform3fv(prog.u_camPos, state.cameraPos.toArray()); + gl.uniform3fv(prog.u_lightPos, light.pos); + gl.uniform3fv(prog.u_lightCol, light.col); + gl.uniform1f(prog.u_lightRad, light.rad); + + if (cfg.debugScissor) { + renderFullScreenQuad(R.progRed); + } + renderFullScreenQuad(prog); + } + + gl.disable(gl.SCISSOR_TEST); + + if (cfg.toon) { + renderFullScreenQuad(R.progEdges); + } + + + if (cfg.blur) { + gl.bindFramebuffer(gl.FRAMEBUFFER, R.pass_deferred.fbo2); + + prog = R.progBlur; + gl.useProgram(prog.prog); + + // set uniforms + gl.uniform1i(prog.u_color, 0); // TEXTURE0 accesses shades buffer + gl.uniformMatrix4fv(prog.u_prevScreen2World, false, R.screen2world.toArray()); + var newScreen2World = new THREE.Matrix4().getInverse(state.cameraMat).toArray(); + for (var i in R.screen2world.elements) { + R.screen2world.elements[i] += (newScreen2World[i] - R.screen2world.elements[i]) / 4000; + R.screen2world.elements[i] /= 2.0; + } + gl.uniformMatrix4fv(prog.u_newScreen2World, false, newScreen2World); + gl.uniformMatrix4fv(prog.u_world2Screen, false, state.cameraMat.toArray()); + + // bind textures + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, R.pass_deferred.colorTex1); + + renderFullScreenQuad(prog); + } - // Disable blending so that it doesn't affect other code gl.disable(gl.BLEND); + }; var bindTexturesForLightPass = function(prog) { @@ -187,19 +226,23 @@ gl.clear(gl.DEPTH_BUFFER_BIT); // * Bind the postprocessing shader program - gl.useProgram(R.progPost1.prog); + // gl.useProgram(R.progPost1.prog); // * Bind the deferred pass's color output as a texture input // Set gl.TEXTURE0 as the gl.activeTexture unit - // TODO: uncomment - // gl.activeTexture(gl.TEXTURE0); + gl.activeTexture(gl.TEXTURE0); - // Bind the TEXTURE_2D, R.pass_deferred.colorTex to the active texture unit - // TODO: uncomment - // gl.bindTexture(gl.TEXTURE_2D, R.pass_deferred.colorTex); + // Bind the TEXTURE_2D, R.pass_deferred.colorTex1 to the active texture unit + var buffer; + if (cfg.blur) { + buffer = R.pass_deferred.colorTex2; + } else { + buffer = R.pass_deferred.colorTex1; + } + gl.bindTexture(gl.TEXTURE_2D, buffer); // Configure the R.progPost1.u_color uniform to point at texture unit 0 - gl.uniform1i(R.progPost1.u_color, 0); + // gl.uniform1i(R.progPost1.u_color, 0); // * Render a fullscreen quad to perform shading on renderFullScreenQuad(R.progPost1); @@ -230,12 +273,12 @@ // Bind the VBO as the gl.ARRAY_BUFFER // TODO: uncomment - // gl.bindBuffer(gl.ARRAY_BUFFER,vbo); + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); // Upload the positions array to the currently-bound array buffer // using gl.bufferData in static draw mode. // TODO: uncomment - // gl.bufferData(gl.ARRAY_BUFFER,positions,gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW); }; return function(prog) { @@ -249,21 +292,21 @@ // Bind the VBO as the gl.ARRAY_BUFFER // TODO: uncomment - // gl.bindBuffer(gl.ARRAY_BUFFER, vbo); + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); // Enable the bound buffer as the vertex attrib array for // prog.a_position, using gl.enableVertexAttribArray // TODO: uncomment - // gl.enableVertexAttribArray(prog.a_position); + gl.enableVertexAttribArray(prog.a_position); // Use gl.vertexAttribPointer to tell WebGL the type/layout for // prog.a_position's access pattern. // TODO: uncomment - // gl.vertexAttribPointer(prog.a_position, 3, gl.FLOAT, gl.FALSE, 0, 0); + gl.vertexAttribPointer(prog.a_position, 3, gl.FLOAT, gl.FALSE, 0, 0); // Use gl.drawArrays (or gl.drawElements) to draw your quad. // TODO: uncomment - // gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); // Unbind the array buffer. gl.bindBuffer(gl.ARRAY_BUFFER, null); diff --git a/js/deferredSetup.js b/js/deferredSetup.js index 65136e0..fb51dfc 100644 --- a/js/deferredSetup.js +++ b/js/deferredSetup.js @@ -7,6 +7,7 @@ R.pass_deferred = {}; R.pass_post1 = {}; R.lights = []; + R.screen2world = new THREE.Matrix4(); R.NUM_GBUFFERS = 4; @@ -25,7 +26,7 @@ R.light_max = [14, 18, 6]; R.light_dt = -0.03; R.LIGHT_RADIUS = 4.0; - R.NUM_LIGHTS = 20; // TODO: test with MORE lights! + R.NUM_LIGHTS = 4; // TODO: test with MORE lights! var setupLights = function() { Math.seedrandom(0); @@ -84,13 +85,22 @@ */ R.pass_deferred.setup = function() { // * Create the FBO - R.pass_deferred.fbo = gl.createFramebuffer(); + R.pass_deferred.fbo1 = gl.createFramebuffer(); // * Create, bind, and store a single color target texture for the FBO - R.pass_deferred.colorTex = createAndBindColorTargetTexture( - R.pass_deferred.fbo, gl_draw_buffers.COLOR_ATTACHMENT0_WEBGL); + R.pass_deferred.colorTex1 = createAndBindColorTargetTexture( + R.pass_deferred.fbo1, gl_draw_buffers.COLOR_ATTACHMENT0_WEBGL); // * Check for framebuffer errors - abortIfFramebufferIncomplete(R.pass_deferred.fbo); + abortIfFramebufferIncomplete(R.pass_deferred.fbo1); + + R.pass_deferred.fbo2 = gl.createFramebuffer(); + // * Create, bind, and store a single color target texture for the FBO + R.pass_deferred.colorTex2 = createAndBindColorTargetTexture( + R.pass_deferred.fbo2, gl_draw_buffers.COLOR_ATTACHMENT0_WEBGL); + + // * Check for framebuffer errors + abortIfFramebufferIncomplete(R.pass_deferred.fbo2); + // * Tell the WEBGL_draw_buffers extension which FBO attachments are // being used. (This extension allows for multiple render targets.) gl_draw_buffers.drawBuffersWEBGL([gl_draw_buffers.COLOR_ATTACHMENT0_WEBGL]); @@ -138,7 +148,9 @@ loadDeferredProgram('blinnphong-pointlight', function(p) { // Save the object into this variable for access later + p.u_toon = gl.getUniformLocation(p.prog, 'u_toon'); p.u_lightPos = gl.getUniformLocation(p.prog, 'u_lightPos'); + p.u_camPos = gl.getUniformLocation(p.prog, 'u_camPos'); p.u_lightCol = gl.getUniformLocation(p.prog, 'u_lightCol'); p.u_lightRad = gl.getUniformLocation(p.prog, 'u_lightRad'); R.prog_BlinnPhong_PointLight = p; @@ -157,6 +169,17 @@ }); // TODO: If you add more passes, load and set up their shader programs. + loadDeferredProgram('edges', function (p) { + R.progEdges = p; + }); + + loadDeferredProgram('blur', function (p) { + p.u_prevScreen2World = gl.getUniformLocation(p.prog, 'prevScreen2World'); + p.u_newScreen2World = gl.getUniformLocation(p.prog, 'newScreen2World'); + p.u_world2Screen = gl.getUniformLocation(p.prog, 'world2Screen'); + p.u_color = gl.getUniformLocation(p.prog, 'u_color'); + R.progBlur = p; + }) }; var loadDeferredProgram = function(name, callback) { @@ -171,6 +194,7 @@ for (var i = 0; i < R.NUM_GBUFFERS; i++) { p.u_gbufs[i] = gl.getUniformLocation(prog, 'u_gbufs[' + i + ']'); } + p.u_depth = gl.getUniformLocation(prog, 'u_depth'); p.a_position = gl.getAttribLocation(prog, 'a_position'); diff --git a/js/framework.js b/js/framework.js index 435bd43..2986405 100644 --- a/js/framework.js +++ b/js/framework.js @@ -8,17 +8,26 @@ var width, height; var models = []; var cameraMat = new THREE.Matrix4(); + var prevScreen2View = new THREE.Matrix4(); + var screen2View = new THREE.Matrix4(); var render = function() { + + // view pos -> world pos camera.updateMatrixWorld(); + + // world pos -> view pos camera.matrixWorldInverse.getInverse(camera.matrixWorld); + + // world pos -> view pos -> screen pos cameraMat.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + R.deferredRender({ cameraMat: cameraMat, projMat: camera.projectionMatrix, viewMat: camera.matrixWorldInverse, cameraPos: camera.position, - models: models + models: models, }); }; @@ -67,7 +76,7 @@ var width, height; var init = function() { // TODO: For performance measurements, disable debug mode! - var debugMode = true; + var debugMode = false; canvas = document.getElementById('canvas'); renderer = new THREE.WebGLRenderer({ @@ -191,8 +200,8 @@ var width, height; gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter); gl.texParameteri(target, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(target, gl.TEXTURE_WRAP_T, wrapT); - if (minFilter == gl.NEAREST_MIPMAP_NEAREST || - minFilter == gl.NEAREST_MIPMAP_LINEAR || + if (minFilter == gl.NEAREST_MIPMAP_NEAREST || + minFilter == gl.NEAREST_MIPMAP_LINEAR || minFilter == gl.LINEAR_MIPMAP_NEAREST || minFilter == gl.LINEAR_MIPMAP_LINEAR ) { gl.generateMipmap(target); @@ -264,58 +273,58 @@ var width, height; } - + }); resize(); - // renderer.render(scene, camera); + renderer.render(scene, camera); - gl.clearColor(0.5, 0.5, 0.5, 0.5); - gl.clearDepth(1.0); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + // gl.clearColor(0.5, 0.5, 0.5, 0.5); + // gl.clearDepth(1.0); + // gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); R.deferredSetup(); requestAnimationFrame(update); }; - var uploadModel = function(o, callback) { - for (var i = -1; i < o.children.length; i++) { - var c, g, idx; + var uploadModel = function(obj, callback) { + for (var i = -1; i < obj.children.length; i++) { + var child, geom, idx; if (i < 0) { - c = o; - if (!c.geometry) { + child = obj; + if (!child.geometry) { continue; } - g = c.geometry._bufferGeometry.attributes; - idx = c.geometry._bufferGeometry.index; + geom = child.geometry._bufferGeometry.attributes; + idx = child.geometry._bufferGeometry.index; } else { - c = o.children[i]; - g = c.geometry.attributes; - idx = c.geometry.index; + child = obj.children[i]; + geom = child.geometry.attributes; + idx = child.geometry.index; } var gposition = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, gposition); - gl.bufferData(gl.ARRAY_BUFFER, g.position.array, gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, geom.position.array, gl.STATIC_DRAW); var gnormal; - if (g.normal && g.normal.array) { + if (geom.normal && geom.normal.array) { gnormal = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, gnormal); - gl.bufferData(gl.ARRAY_BUFFER, g.normal.array, gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, geom.normal.array, gl.STATIC_DRAW); } var guv; - if (g.uv && g.uv.array) { + if (geom.uv && geom.uv.array) { guv = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, guv); - gl.bufferData(gl.ARRAY_BUFFER, g.uv.array, gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, geom.uv.array, gl.STATIC_DRAW); } if (!idx) { - idx = new Uint32Array(g.position.array.length / 3); + idx = new Uint32Array(geom.position.array.length / 3); for (var j = 0; j < idx.length; j++) { idx[j] = j; } @@ -325,7 +334,7 @@ var width, height; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gidx); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, idx, gl.STATIC_DRAW); - var m = { + var mesh = { idx: gidx, elemCount: idx.length, position: gposition, @@ -334,7 +343,7 @@ var width, height; }; if (callback) { - callback(m); + callback(mesh); } } }; diff --git a/js/framework.js.orig b/js/framework.js.orig new file mode 100644 index 0000000..237f0be --- /dev/null +++ b/js/framework.js.orig @@ -0,0 +1,348 @@ +var gl, gl_draw_buffers; +var width, height; + +(function() { + 'use strict'; + + var canvas, renderer, scene, camera, controls, stats; + var models = []; + + var cameraMat = new THREE.Matrix4(); + + var render = function() { + camera.updateMatrixWorld(); + camera.matrixWorldInverse.getInverse(camera.matrixWorld); + cameraMat.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + R.deferredRender({ + cameraMat: cameraMat, + projMat: camera.projectionMatrix, + viewMat: camera.matrixWorldInverse, + cameraPos: camera.position, + models: models + }); + }; + + var update = function() { + controls.update(); + stats.end(); + stats.begin(); + render(); + if (!aborted) { + requestAnimationFrame(update); + } + }; + + var resize = function() { + camera.aspect = width / height; + camera.updateProjectionMatrix(); + renderer.setSize(width, height); + render(); + }; + + var initExtensions = function() { + var extensions = gl.getSupportedExtensions(); + console.log(extensions); + + var reqd = [ + 'OES_texture_float', + 'OES_texture_float_linear', + 'WEBGL_depth_texture', + 'WEBGL_draw_buffers' + ]; + for (var i = 0; i < reqd.length; i++) { + var e = reqd[i]; + if (extensions.indexOf(e) < 0) { + abort('unable to load extension: ' + e); + } + } + + gl.getExtension('OES_texture_float'); + gl.getExtension('OES_texture_float_linear'); + gl.getExtension('WEBGL_depth_texture'); + + gl_draw_buffers = gl.getExtension('WEBGL_draw_buffers'); + var maxdb = gl.getParameter(gl_draw_buffers.MAX_DRAW_BUFFERS_WEBGL); + console.log('MAX_DRAW_BUFFERS_WEBGL: ' + maxdb); + }; + + var init = function() { + // TODO: For performance measurements, disable debug mode! + var debugMode = false; + + canvas = document.getElementById('canvas'); + renderer = new THREE.WebGLRenderer({ + canvas: canvas, + preserveDrawingBuffer: debugMode + }); + gl = renderer.context; + + if (debugMode) { + $('#debugmodewarning').css('display', 'block'); + var throwOnGLError = function(err, funcName, args) { + abort(WebGLDebugUtils.glEnumToString(err) + + " was caused by call to: " + funcName); + }; + gl = WebGLDebugUtils.makeDebugContext(gl, throwOnGLError); + } + + initExtensions(); + + stats = new Stats(); + stats.setMode(1); // 0: fps, 1: ms, 2: mb + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + scene = new THREE.Scene(); + + width = canvas.width; + height = canvas.height; + camera = new THREE.PerspectiveCamera( + 45, // Field of view + width / height, // Aspect ratio + 1.0, // Near plane + 100 // Far plane + ); + camera.position.set(-15.5, 1, -1); + + controls = new THREE.OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.enableZoom = true; + controls.target.set(0, 4, 0); + controls.rotateSpeed = 0.3; + controls.zoomSpeed = 1.0; + controls.panSpeed = 2.0; + + // Add sphere geometry to the scene so it gets initialized + var sph = new THREE.Mesh(new THREE.SphereGeometry(1, 8, 6)); + scene.add(sph); + renderer.render(scene, camera); + uploadModel(sph, function(m) { + R.sphereModel = m; + }); + + // var glTFURL = 'models/glTF-duck/duck.gltf'; + var glTFURL = 'models/glTF-sponza-kai-fix/sponza.gltf'; + var glTFLoader = new MinimalGLTFLoader.glTFLoader(gl); + glTFLoader.loadGLTF(glTFURL, function (glTF) { + var curScene = glTF.scenes[glTF.defaultScene]; + + var webGLTextures = {}; + + // temp var + var i,len; + var primitiveOrderID; + + var mesh; + var primitive; + var vertexBuffer; + var indicesBuffer; + + + // textures setting + var textureID = 0; + var textureInfo; + var samplerInfo; + var target, format, internalFormat, type; // texture info + var magFilter, minFilter, wrapS, wrapT; + var image; + var texture; + + + // temp for sponza + var colorTextureName = 'texture_color'; // for sponza + if (!glTF.json.textures[colorTextureName]) { + colorTextureName = (Object.keys(glTF.json.textures))[0]; + console.log(colorTextureName); + } + var normalTextureName = 'texture_normal'; + + // textures + for (var tid in glTF.json.textures) { + + textureInfo = glTF.json.textures[tid]; + target = textureInfo.target || gl.TEXTURE_2D; + format = textureInfo.format || gl.RGBA; + internalFormat = textureInfo.format || gl.RGBA; + type = textureInfo.type || gl.UNSIGNED_BYTE; + + image = glTF.images[textureInfo.source]; + + texture = gl.createTexture(); + gl.activeTexture(gl.TEXTURE0 + textureID); + gl.bindTexture(target, texture); + + switch(target) { + case 3553: // gl.TEXTURE_2D + gl.texImage2D(target, 0, internalFormat, format, type, image); + break; + // TODO for TA + } + + // !! Sampler + // raw WebGL 1, no sampler object, set magfilter, wrapS, etc + samplerInfo = glTF.json.samplers[textureInfo.sampler]; + minFilter = samplerInfo.minFilter || gl.NEAREST_MIPMAP_LINEAR; + magFilter = samplerInfo.magFilter || gl.LINEAR; + wrapS = samplerInfo.wrapS || gl.REPEAT; + wrapT = samplerInfo.wrapT || gl.REPEAT; + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, wrapS); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, wrapT); + if (minFilter == gl.NEAREST_MIPMAP_NEAREST || + minFilter == gl.NEAREST_MIPMAP_LINEAR || + minFilter == gl.LINEAR_MIPMAP_NEAREST || + minFilter == gl.LINEAR_MIPMAP_LINEAR ) { + gl.generateMipmap(target); + } + + + gl.bindTexture(target, null); + + webGLTextures[tid] = { + texture: texture, + target: target, + id: textureID + }; + + textureID++; + } + + + // vertex attributes + for (var mid in curScene.meshes) { + mesh = curScene.meshes[mid]; + + for (i = 0, len = mesh.primitives.length; i < len; ++i) { + primitive = mesh.primitives[i]; + + + vertexBuffer = gl.createBuffer(); + indicesBuffer = gl.createBuffer(); + + // initialize buffer + var vertices = primitive.vertexBuffer; + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, null); + + var indices = primitive.indices; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indicesBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); + + + var posInfo = primitive.attributes[primitive.technique.parameters['position'].semantic]; + var norInfo = primitive.attributes[primitive.technique.parameters['normal'].semantic]; +<<<<<<< HEAD + var uvInfo = primitive.attributes[primitive.technique.parameters['texcoord0'].semantic]; +======= + var uvInfo; + if (primitive.technique.parameters['texcoord_0']) { + uvInfo = primitive.attributes[primitive.technique.parameters['texcoord_0'].semantic]; + } else if (primitive.technique.parameters['texcoord0']) { + uvInfo = primitive.attributes[primitive.technique.parameters['texcoord0'].semantic]; + } + +>>>>>>> master + + var x = webGLTextures[colorTextureName]; + models.push({ + gltf: primitive, + + idx: indicesBuffer, + + attributes: vertexBuffer, + posInfo: {size: posInfo.size, type: posInfo.type, stride: posInfo.stride, offset: posInfo.offset}, + norInfo: {size: norInfo.size, type: norInfo.type, stride: norInfo.stride, offset: norInfo.offset}, + uvInfo: {size: uvInfo.size, type: uvInfo.type, stride: uvInfo.stride, offset: uvInfo.offset}, + + // specific textures temp test + colmap: webGLTextures[colorTextureName].texture, + normap: webGLTextures[normalTextureName] ? webGLTextures[normalTextureName].texture : null + }); + + } + + } + + + + }); + + + resize(); + renderer.render(scene, camera); + + // gl.clearColor(0.5, 0.5, 0.5, 0.5); + // gl.clearDepth(1.0); + // gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + R.deferredSetup(); + + requestAnimationFrame(update); + }; + + var uploadModel = function(obj, callback) { + for (var i = -1; i < obj.children.length; i++) { + var child, geom, idx; + if (i < 0) { + child = obj; + if (!child.geometry) { + continue; + } + geom = child.geometry._bufferGeometry.attributes; + idx = child.geometry._bufferGeometry.index; + } else { + child = obj.children[i]; + geom = child.geometry.attributes; + idx = child.geometry.index; + } + + var gposition = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, gposition); + gl.bufferData(gl.ARRAY_BUFFER, geom.position.array, gl.STATIC_DRAW); + + var gnormal; + if (geom.normal && geom.normal.array) { + gnormal = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, gnormal); + gl.bufferData(gl.ARRAY_BUFFER, geom.normal.array, gl.STATIC_DRAW); + } + + var guv; + if (geom.uv && geom.uv.array) { + guv = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, guv); + gl.bufferData(gl.ARRAY_BUFFER, geom.uv.array, gl.STATIC_DRAW); + } + + if (!idx) { + idx = new Uint32Array(geom.position.array.length / 3); + for (var j = 0; j < idx.length; j++) { + idx[j] = j; + } + } + + var gidx = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gidx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, idx, gl.STATIC_DRAW); + + var mesh = { + idx: gidx, + elemCount: idx.length, + position: gposition, + normal: gnormal, + uv: guv + }; + + if (callback) { + callback(mesh); + } + } + }; + + window.handle_load.push(init); +})(); diff --git a/js/main.js b/js/main.js index bf01b17..8b87ad9 100644 --- a/js/main.js +++ b/js/main.js @@ -1,4 +1,5 @@ var handle_load = []; +// :( (function() { 'use strict'; diff --git a/js/ui.js b/js/ui.js index abd6119..d79f15f 100644 --- a/js/ui.js +++ b/js/ui.js @@ -7,6 +7,9 @@ var cfg; // TODO: Define config fields and defaults here this.debugView = -1; this.debugScissor = false; + this.toon = true; + this.blur = false; + this.bloom = true; this.enableEffect0 = false; }; @@ -28,7 +31,8 @@ var cfg; var eff0 = gui.addFolder('EFFECT NAME HERE'); eff0.open(); - eff0.add(cfg, 'enableEffect0'); + eff0.add(cfg, 'toon'); + eff0.add(cfg, 'blur'); // TODO: add more effects toggles and parameters here }; diff --git a/js/util.js b/js/util.js index 8f43d38..b61eda8 100644 --- a/js/util.js +++ b/js/util.js @@ -117,33 +117,44 @@ window.getScissorForLight = (function() { // Pre-allocate for performance - avoids additional allocation var a = new THREE.Vector4(0, 0, 0, 0); var b = new THREE.Vector4(0, 0, 0, 0); - var minpt = new THREE.Vector2(0, 0); - var maxpt = new THREE.Vector2(0, 0); + const neg_one = new THREE.Vector2(-1, -1); + const pos_one = new THREE.Vector2(1, 1); var ret = [0, 0, 0, 0]; - return function(view, proj, l) { - // front bottom-left corner of sphere's bounding cube - a.fromArray(l.pos); - a.w = 1; - a.applyMatrix4(view); - a.x -= l.rad; - a.y -= l.rad; - a.z += l.rad; - a.applyMatrix4(proj); - a.divideScalar(a.w); + const n_cube_vertices = 8; + var offsets = Array(n_cube_vertices); + var pos = new THREE.Vector4(0, 0, 0, 0); + return function(view, proj, light) { // front bottom-left corner of sphere's bounding cube - b.fromArray(l.pos); - b.w = 1; - b.applyMatrix4(view); - b.x += l.rad; - b.y += l.rad; - b.z += l.rad; - b.applyMatrix4(proj); - b.divideScalar(b.w); - - minpt.set(Math.max(-1, a.x), Math.max(-1, a.y)); - maxpt.set(Math.min( 1, b.x), Math.min( 1, b.y)); + + // The following results in: + // [ -1, -1, -1, 0 ] <== back upper left corner of cube + // [ -1, -1, 1, 0 ] <== front upper left corner ... + // [ -1, 1, -1, 0 ] + // ... + var index = 0; + for (var i = -1; i <= 1; i += 2) { + for (var j = -1; j <= 1; j += 2) { + for (var k = -1; k <= 1; k += 2) { + offsets[index] = new THREE.Vector4(i, j, k, 0); + index += 1; + } + } + } + + var minpt = new THREE.Vector2(1, 1); + var maxpt = new THREE.Vector2(-1, -1); + for (var i in offsets) { + pos.fromArray(light.pos); + pos.w = 1; + pos.applyMatrix4(view); // project light into view space + pos.addScaledVector(offsets[i], light.rad); // offset from light + pos.applyMatrix4(proj); // project onto screen + pos.divideScalar(pos.w); + minpt.clamp(neg_one, pos); // update min point with pos + maxpt.clamp(pos, pos_one); // update max point with pos + } if (maxpt.x < -1 || 1 < minpt.x || maxpt.y < -1 || 1 < minpt.y) { diff --git a/models/glTF-duck/Duck.gltf b/models/glTF-duck/Duck.gltf index 051777f..0e2a443 100644 --- a/models/glTF-duck/Duck.gltf +++ b/models/glTF-duck/Duck.gltf @@ -146,7 +146,7 @@ "attributes": { "NORMAL": "accessor_25", "POSITION": "accessor_23", - "TEXCOORD_0": "accessor_27" + "TEXCOORD0": "accessor_27" }, "indices": "accessor_21", "material": "blinn3-fx", @@ -324,7 +324,7 @@ "type": 35666 }, "texcoord0": { - "semantic": "TEXCOORD_0", + "semantic": "TEXCOORD0", "type": 35664 } }, diff --git a/models/gltf-sponza-kai-fix/fragmentShader0.glsl b/models/gltf-sponza-kai-fix/fragmentShader0.glsl index ad5d407..0b6d657 100644 --- a/models/gltf-sponza-kai-fix/fragmentShader0.glsl +++ b/models/gltf-sponza-kai-fix/fragmentShader0.glsl @@ -8,7 +8,7 @@ uniform float u_shininess; uniform float u_transparency; varying vec3 v_positionEC; varying vec3 v_normal; -varying vec2 v_texcoord_0; +varying vec2 v_texcoord0; vec3 applyNormalMap(vec3 geomnor, vec3 normap) { normap = normap * 2.0 - 1.0; @@ -19,8 +19,8 @@ vec3 applyNormalMap(vec3 geomnor, vec3 normap) { } void main(void) { - vec3 normal = applyNormalMap(normalize(v_normal), texture2D(u_normal, v_texcoord_0).rgb); - vec4 diffuse = texture2D(u_diffuse, v_texcoord_0); + vec3 normal = applyNormalMap(normalize(v_normal), texture2D(u_normal, v_texcoord0).rgb); + vec4 diffuse = texture2D(u_diffuse, v_texcoord0); vec3 diffuseLight = vec3(0.0, 0.0, 0.0); vec3 specular = u_specular.rgb; vec3 specularLight = vec3(0.0, 0.0, 0.0); diff --git a/models/gltf-sponza-kai-fix/sponza.gltf b/models/gltf-sponza-kai-fix/sponza.gltf index e21c7eb..5005a41 100644 --- a/models/gltf-sponza-kai-fix/sponza.gltf +++ b/models/gltf-sponza-kai-fix/sponza.gltf @@ -144,7 +144,7 @@ "attributes": { "POSITION": "accessor_position", "NORMAL": "accessor_normal", - "TEXCOORD_0": "accessor_uv" + "TEXCOORD0": "accessor_uv" }, "indices": "accessor_index_0", "material": "material_lambert2SG", @@ -221,7 +221,7 @@ "attributes": { "a_position": "position", "a_normal": "normal", - "a_texcoord_0": "texcoord_0" + "a_texcoord0": "texcoord0" }, "parameters": { "modelViewMatrix": { @@ -265,8 +265,8 @@ "semantic": "NORMAL", "type": 35665 }, - "texcoord_0": { - "semantic": "TEXCOORD_0", + "texcoord0": { + "semantic": "TEXCOORD0", "type": 35664 } }, @@ -296,7 +296,7 @@ "attributes": [ "a_position", "a_normal", - "a_texcoord_0" + "a_texcoord0" ], "fragmentShader": "fragmentShader0", "vertexShader": "vertexShader0" diff --git a/models/gltf-sponza-kai-fix/vertexShader0.glsl b/models/gltf-sponza-kai-fix/vertexShader0.glsl index c489a55..4818bac 100644 --- a/models/gltf-sponza-kai-fix/vertexShader0.glsl +++ b/models/gltf-sponza-kai-fix/vertexShader0.glsl @@ -2,12 +2,15 @@ precision highp float; uniform mat4 u_modelViewMatrix; uniform mat4 u_projectionMatrix; uniform mat3 u_normalMatrix; + attribute vec3 a_position; -varying vec3 v_positionEC; attribute vec3 a_normal; -varying vec3 v_normal; attribute vec2 a_texcoord_0; + +varying vec3 v_positionEC; +varying vec3 v_normal; varying vec2 v_texcoord_0; + void main(void) { vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); v_positionEC = pos.xyz; diff --git a/models/gltf-sponza-kai-fix/vertexShader0.glsl.orig b/models/gltf-sponza-kai-fix/vertexShader0.glsl.orig new file mode 100644 index 0000000..4c8d933 --- /dev/null +++ b/models/gltf-sponza-kai-fix/vertexShader0.glsl.orig @@ -0,0 +1,26 @@ +precision highp float; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +uniform mat3 u_normalMatrix; + +attribute vec3 a_position; +attribute vec3 a_normal; +<<<<<<< HEAD +varying vec3 v_normal; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +======= +attribute vec2 a_texcoord_0; + +varying vec3 v_positionEC; +varying vec3 v_normal; +varying vec2 v_texcoord_0; + +>>>>>>> master +void main(void) { + vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); + v_positionEC = pos.xyz; + gl_Position = u_projectionMatrix * pos; + v_normal = u_normalMatrix * a_normal; + v_texcoord0 = a_texcoord0; +} diff --git a/scissor.gif b/scissor.gif new file mode 100644 index 0000000..1d1bae8 Binary files /dev/null and b/scissor.gif differ diff --git a/scissor.mov b/scissor.mov new file mode 100644 index 0000000..95efecf Binary files /dev/null and b/scissor.mov differ diff --git a/server.bat b/server.bat old mode 100644 new mode 100755 diff --git a/vid1.mov b/vid1.mov new file mode 100644 index 0000000..5bb1a0e Binary files /dev/null and b/vid1.mov differ diff --git a/vid2.gif b/vid2.gif new file mode 100644 index 0000000..13ee73e Binary files /dev/null and b/vid2.gif differ diff --git a/vid2.mov b/vid2.mov new file mode 100644 index 0000000..d8815e0 Binary files /dev/null and b/vid2.mov differ