Skip to content

Instantly share code, notes, and snippets.

@nbremer
Last active January 1, 2020 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nbremer/1acc6c95e3bb374dc78329e94f85a9b0 to your computer and use it in GitHub Desktop.
Save nbremer/1acc6c95e3bb374dc78329e94f85a9b0 to your computer and use it in GitHub Desktop.
Minimal Regl version of "A Breathing Earth"
license: mit
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- <meta name="viewport" content="user-scalable = yes"> -->
<title>A Breathing Earth - Minimal Regl version</title>
<meta name="author" content="Nadieh Bremer">
<!-- JavaScript files -->
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="regl.min.js"></script>
<!-- Styling -->
<style>
body {
text-align: center;
font-family: 'Source Code Pro', monospace;
}
#container {
width: 1000px;
margin-left: auto;
margin-right: auto;
text-align: center;
padding-left: 20px;
padding-right: 20px;
}
#chart {
text-align: center;
margin-left: auto;
margin-right: auto;
box-shadow: 0px 0px 5px #c1c1c1;
}
#week {
text-align: left;
font-size: 18px;
margin-top: 15px;
margin-bottom: 10px;
}
</style>
<!-- Google fonts -->
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:200,300,400" rel="stylesheet">
</head>
<body>
<div id="container">
<div id="week"></div>
<div id="chart">
<canvas id="canvas"></canvas>
</div>
</div>
<script src="main.js"></script>
</body>
</html>
createReglMap();
//Function to draw the regl based map
function createReglMap() {
///////////////////////////////////////////////////////////////////////////
//////////////////////////// Set up the canvas ////////////////////////////
///////////////////////////////////////////////////////////////////////////
var width = 2000;
//Mercator map ratio
var mapRatio = 0.5078871;
var height = Math.round(mapRatio * width);
var canvas = document.getElementById("canvas");
canvas.width = width;
canvas.height = height;
//Get the visible size back to 1000 px
canvas.style.width = (width*0.5) + 'px';
canvas.style.height = (height*0.5) + 'px';
//canvas.getContext("2d").scale(0.5, 0.5);
var regl = createREGL({
extensions: ['OES_standard_derivatives'],
canvas: canvas,
attributes: {
alpha: false,
depth: false,
antialias: true
}
});
regl.clear({color: [1, 1, 1, 1]});
///////////////////////////////////////////////////////////////////////////
///////////////////////// Create global variables /////////////////////////
///////////////////////////////////////////////////////////////////////////
const nWeeks = 52; //Number of weeks in the year
var mapPoints; //Will save the coordinate mapping
//The minimum and maximum values of the layer variable
const maxL = 0.8,
minL = 0; //-0.06;
///////////////////////////////////////////////////////////////////////////
/////////////////////////////// Create scales /////////////////////////////
///////////////////////////////////////////////////////////////////////////
var xScale = d3.scaleLinear()
.domain([1, 500])
.range([-1, 1]);
var yScale = d3.scaleLinear()
.domain([1, 250])
.range([-1,1]);
var radiusScale = d3.scaleSqrt()
.domain([minL, maxL])
.range([0, 5])
.clamp(true);
var opacityScale = d3.scaleLinear()
.domain([minL, maxL])
.range([1, 0.5]);
var greenColor = d3.scaleLinear()
.domain([-0.08, 0.1, maxL])
//.range(["#FFBE1F", "#d9e537", "#054501"])
.range(["#FAECAB", "#f2ec82", "#0c750c"])
//.clamp(true);
//Wrap d3 color scales so they produce vec3s with values 0-1
function wrapColorScale(scale) {
return function(t) {
const rgb = d3.rgb(scale(t));
return [rgb.r / 255, rgb.g / 255, rgb.b / 255];
};
}//wrapColorScale
var greenColorRGB = wrapColorScale(greenColor);
///////////////////////////////////////////////////////////////////////////
/////////////////////////// Map drawing settings //////////////////////////
///////////////////////////////////////////////////////////////////////////
function createMapMaker() {
var drawMap = regl({
vert: `
precision highp float;
//The progess along the transition
uniform float progress;
//Needed to calculate fopacity
attribute float currOpacity;
attribute float nextOpacity;
//Needed to set gl_Pointsize
attribute float currSize;
attribute float nextSize;
//Needed to set gl_Position
attribute vec2 position;
//Needed to set fcolor
attribute vec3 currColor;
attribute vec3 nextColor;
//Will get values used in the fragment shader
varying float fopacity;
//varying float fsize;
varying vec3 fcolor;
void main () {
fcolor = mix(currColor, nextColor, progress);
fopacity = mix(currOpacity, nextOpacity, progress);
//fsize = size/7.5;
gl_PointSize = mix(currSize, nextSize, progress);
gl_Position = vec4(position, 0, 1);
}
`,
frag: `
precision highp float;
#ifdef GL_OES_standard_derivatives
#extension GL_OES_standard_derivatives : enable
#endif
varying float fopacity;
//varying float fsize;
varying vec3 fcolor;
void main (){
//Creating a circle out of a square:
//Determine normalized distance from center of point
float point_dist = length(gl_PointCoord * 2. - 1.);
//Based in part on:
//http://bl.ocks.org/monfera/85aa9627de1ae521d3ac5b26c9cd1c49
//http://www.numb3r23.net/2015/08/17/using-fwidth-for-distance-based-anti-aliasing
//https://www.desultoryquest.com/blog/drawing-anti-aliased-circular-points-using-opengl-slash-webgl
#ifdef GL_OES_standard_derivatives
//Anti-aliasing-factor
float aaf = fwidth(point_dist)/2.0;
//if(point_dist + aaf > 1.0) discard; //strangley this doesn't work as inteded at all
float alpha = fopacity*(1.0 - smoothstep(1.0 - aaf, 1.0 + aaf, point_dist));
#else
if(point_dist > 1.0) discard;
float alpha = fopacity;
#endif
//From:https://gist.github.com/rflow/39692bd181fb1eb0b077a4caf886b077
//But seems to discard too much for smaller circles
//Calc scale at which to start fading out the circle
//float min_dist = fsize * 0.7;
//Calc scale at which we find the edge of the circle
//float max_dist = fsize;
//From https://thebookofshaders.com/glossary/?search=smoothstep
//float alpha = fopacity * (1.0 - smoothstep(min_dist, max_dist, point_dist));
//The most basic way to get a (pixelated) circle
//if (point_dist > 1.0) discard;
//gl_FragColor = vec4(alpha*fcolor, alpha*fopacity);// - correct for no multiply but with pre-opacity multiplication (& the //2 func below)
//gl_FragColor = vec4(fcolor, alpha*fopacity); // correct for nu multiply and without pre-opacity multiplication (& the //1 func below)
// premultiplying the alpha like this means we can use *just* the multiplicative
// part of the blending function (src * dst). But alpha = 0 corresponds to
// multiplying by one, so we have to do this little 'one minus' trick:
gl_FragColor = vec4(1.0 - alpha * (1.0 - fcolor), 1);
}//void main
`,
depth: {enable: false, mask: false},
blend: {
enable: true,
//func: { srcRGB: 'src alpha', dstRGB: 'one minus src alpha', srcAlpha: 1, dstAlpha: 'one minus src alpha' }, //1
//func: {src: 1, dst: 'one minus src alpha'}, //2
func: { srcRGB: 'dst color', dstRGB: 0, srcAlpha: 1, dstAlpha: 1 },
//func: {src: 'one minus dst alpha', dst: 'src color'}, //never got this working correctly with opacities, but it does look like a multiply blend
//func: {src: 'dst color', dst: 'one minus src alpha'}, //seems to work for Pixi, but I just get a white screen...
equation: { rgb: 'add', alpha: 'add' },
},
attributes: {
position: mapPoints,
currColor: regl.prop('currColor'),
nextColor: regl.prop('nextColor'),
currOpacity: regl.prop('currOpacity'),
nextOpacity: regl.prop('nextOpacity'),
currSize: regl.prop('currSize'),
nextSize: regl.prop('nextSize'),
},
uniforms: {
progress: regl.prop('progress'),
},//uniforms
count: mapPoints.length,
primitive: 'points',
});//drawTriangle
return drawMap;
}//function createMapMaker
///////////////////////////////////////////////////////////////////////////
//////////////////////////// Read in the data /////////////////////////////
///////////////////////////////////////////////////////////////////////////
d3.queue()
.defer(d3.csv, "worldMap_coordinates.csv")
.defer(d3.csv, "mapData-week-22.csv")
.defer(d3.csv, "mapData-week-23.csv")
.await(drawFirstMap);
function drawFirstMap(error, coordRaw, data, data2) {
///////////////////////////////////////////////////////////////////////////
///////////////////////////// Final data prep /////////////////////////////
///////////////////////////////////////////////////////////////////////////
if (error) throw error;
//The locations of every map are the same, so save the in a variable
mapPoints = coordRaw.map(function(d) { return [xScale(+d.x), yScale(+d.y)]; });
//Prepare the map data
data.forEach(function(d) {
d.layer = +d.layer;
d.opacity = opacityScale(d.layer);
d.color = greenColorRGB(d.layer);
//Premultiply the colors by the alpha
// d.color[0] = d.color[0] * d.opacity;
// d.color[1] = d.color[1] * d.opacity;
// d.color[2] = d.color[2] * d.opacity;
d.size = radiusScale(d.layer);
});
//Create a new array that shuffles the data a bit
var currMap = {
colors: data.map(function(d) { return d.color; }),
opacities: data.map(function(d) { return d.opacity; }),
sizes: data.map(function(d) { return 2*d.size; }),
};
//Prepare the map data
data2.forEach(function(d) {
d.layer = +d.layer;
d.opacity = opacityScale(d.layer);
d.color = greenColorRGB(d.layer);
//Premultiply the colors by the alpha
// d.color[0] = d.color[0] * d.opacity;
// d.color[1] = d.color[1] * d.opacity;
// d.color[2] = d.color[2] * d.opacity;
d.size = radiusScale(d.layer);
});
//Create a new array that shuffles the data a bit
var nextMap = {
colors: data2.map(function(d) { return d.color; }),
opacities: data2.map(function(d) { return d.opacity; }),
sizes: data2.map(function(d) { return 2*d.size; }),
};
///////////////////////////////////////////////////////////////////////////
//////////////////////////// Draw the first map ///////////////////////////
///////////////////////////////////////////////////////////////////////////
//Create the regl function
var drawMap = createMapMaker();
//Adjust the title
d3.select("#week").text("Week " + 22 + ", " + "May"+ ", 2016");
regl.clear({color: [1, 1, 1, 1]});
//Draw the current map
drawMap({
currColor: currMap.colors,
nextColor: nextMap.colors,
currOpacity: currMap.opacities,
nextOpacity: nextMap.opacities,
currSize: currMap.sizes,
nextSize: nextMap.sizes,
progress: 0.0
});
}//function drawFirstMap
}//function createReglMap
We can make this file beautiful and searchable if this error is corrected: No commas found in this CSV file in line 0.
"layer"
0.23
0.25
0.27
0.24
0.16
0.15
0.18
0.24
0.11
0.22
0.22
0.11
0.05
0.09
0.1
0.13
0.14
0.18
0.16
0.17
0.08
0.2
0.32
0.2
0.14
0.11
0.21
0.19
0.23
0.12
0.08
0.08
0.1
0.1
0.15
0.1
0.16
0.15
0.17
0.06
0.26
0.32
0.31
0.24
0.11
0.11
0.19
0.16
0.13
0.12
0.12
0.11
0.13
0.09
0.14
0.13
0.24
0.1
0.25
0.17
0.23
0.19
0.08
0.06
0.15
0.17
0.16
0.12
0.1
0.11
0.1
0.11
0.2
0.18
0.15
0.14
0.18
0.16
0.09
0.12
0.14
0.16
0.14
0.1
0.16
0.16
0.19
0.12
0.16
0.2
0.12
0.09
0.1
0.16
0.15
0.13
0.16
0.18
0.16
0.15
0.22
0.18
0.16
0.15
0.12
0.13
0.13
0.12
0.08
0.16
0.23
0.18
0.15
0.21
0.23
0.22
0.16
0.19
0.16
0.13
0.09
0.21
0.11
0.17
0.2
0.2
0.15
0.23
0.21
0.21
0.21
0.21
0.17
0.23
0.17
0.11
0.08
0.07
0.12
0.21
0.26
0.26
0.25
0.2
0.16
0.11
0.18
0.2
0.18
0.12
0.09
0.16
0.22
0.26
0.29
0.26
0.18
0.17
0.18
0.11
0.14
0.22
0.23
0.2
0.22
0.31
0.17
0.18
0.18
0.12
0.19
0.13
0.21
0.24
0.21
0.17
0.11
0.15
0.11
0.16
0.06
0.32
0.24
0.14
0.23
0.17
0.19
0.15
0.17
0.12
0.46
0.39
0.19
0.22
0.18
0.15
0.21
0.15
0.14
0.21
0.07
0.14
0.14
0.18
0.05
0.22
0.37
0.08
0.2
0.26
0.15
0.15
0.39
0.34
0.37
0.29
0.22
0.32
0.28
0.33
0.3
0.24
0.34
0.29
0.06
0.31
0.35
0.31
0.39
0.32
0.37
0.27
0.33
0.3
0.17
0.3
0.34
0.24
0.2
0.35
0.31
0.41
0.3
0.37
0.2
0.28
0.36
0.34
0.33
0.31
0.44
0.41
0.24
0.38
0.34
0.35
0.32
0.3
0.37
0.33
0.3
0.25
0.29
0.36
0.22
0.22
0.33
0.37
0.29
0.35
0.4
0.44
0.41
0.39
0.37
0.28
0.44
0.39
0.3
0.38
0.36
0.37
0.35
0.32
0.3
0.36
0.35
0.34
0.32
0.33
0.24
0.52
0.37
0.35
0.35
0.32
0.44
0.44
0.47
0.47
0.45
0.41
0.31
0.42
0.39
0.31
0.38
0.37
0.34
0.28
0.25
0.38
0.43
0.39
0.37
0.37
0.34
0.34
0.32
0.34
0.41
0.25
0.34
0.42
0.44
0.42
0.45
0.46
0.49
0.53
0.47
0.41
0.45
0.45
0.44
0.32
0.32
0.38
0.38
0.39
0.37
0.42
0.41
0.36
0.34
0.34
0.33
0.36
0.31
0.33
0.43
0.39
0.33
0.39
0.38
0.43
0.42
0.38
0.44
0.5
0.49
0.53
0.54
0.51
0.42
0.43
0.34
0.41
0.35
0.35
0.4
0.39
0.35
0.35
0.36
0.36
0.4
0.43
0.35
0.27
0.31
0.35
0.36
0.36
0.3
0.31
0.19
0.26
0.29
0.43
0.47
0.5
0.5
0.49
0.48
0.44
0.44
0.42
0.51
0.49
0.5
0.52
0.48
0.46
0.46
0.39
0.42
0.4
0.43
0.42
0.38
0.35
0.29
0.4
0.34
0.34
0.39
0.35
0.28
0.32
0.3
0.34
0.36
0.33
0.31
0.25
0.37
0.35
0.39
0.48
0.54
0.49
0.52
0.52
0.51
0.48
0.44
0.44
0.5
0.49
0.52
0.44
0.46
0.52
0.54
0.47
0.47
0.42
0.44
0.39
0.42
0.4
0.35
0.37
0.42
0.38
0.2
0.34
0.37
0.33
0.32
0.3
0.3
0.37
0.34
0.35
0.32
0.3
0.22
0.37
0.31
0.37
0.49
0.43
0.53
0.49
0.41
0.49
0.53
0.51
0.46
0.47
0.51
0.54
0.51
0.52
0.51
0.51
0.51
0.48
0.51
0.5
0.48
0.43
0.44
0.44
0.39
0.4
0.43
0.36
0.3
0.39
0.34
0.24
0.22
0.27
0.31
0.34
0.36
0.36
0.31
0.27
0.16
0.29
0.26
0.35
0.28
0.41
0.54
0.54
0.54
0.49
0.28
0.26
0.39
0.49
0.51
0.51
0.43
0.49
0.51
0.51
0.48
0.46
0.46
0.44
0.41
0.46
0.46
0.45
0.44
0.44
0.4
0.39
0.43
0.36
0.32
0.34
0.35
0.35
0.2
0.28
0.31
0.36
0.37
0.37
0.32
0.25
0.24
0.17
0.42
0.32
0.06
0.31
0.42
0.54
0.57
0.47
0.5
0.54
0.5
0.35
0.3
0.31
0.51
0.53
0.54
0.54
0.55
0.56
0.52
0.53
0.49
0.47
0.45
0.43
0.45
0.47
0.48
0.48
0.47
0.45
0.43
0.43
0.38
0.22
0.3
0.34
0.26
0.19
0.27
0.3
0.33
0.36
0.34
0.3
0.25
0.26
0.11
0.27
0.29
0.39
0.43
0.43
0.45
0.53
0.53
0.54
0.52
0.49
0.47
0.5
0.48
0.54
0.54
0.52
0.51
0.5
0.51
0.5
0.5
0.48
0.47
0.47
0.5
0.52
0.5
0.47
0.47
0.46
0.43
0.4
0.25
0.31
0.32
0.18
0.23
0.28
0.28
0.31
0.34
0.33
0.31
0.25
0.21
0.27
0.31
0.38
0.44
0.43
0.51
0.54
0.53
0.49
0.53
0.55
0.53
0.54
0.5
0.51
0.52
0.55
0.56
0.53
0.48
0.53
0.51
0.49
0.5
0.47
0.49
0.49
0.46
0.44
0.43
0.46
0.43
0.49
0.47
0.41
0.27
0.27
0.3
0.18
0.22
0.28
0.28
0.31
0.35
0.31
0.28
0.22
0.23
0.21
0.22
0.29
0.46
0.33
0.53
0.52
0.54
0.53
0.53
0.55
0.54
0.53
0.54
0.55
0.55
0.55
0.57
0.51
0.48
0.46
0.52
0.53
0.5
0.48
0.51
0.52
0.47
0.45
0.47
0.44
0.43
0.47
0.46
0.38
0.23
0.29
0.3
0.25
0.25
0.28
0.26
0.32
0.32
0.29
0.22
0.21
0.18
0.17
0.14
0.16
0.55
0.39
0.47
0.49
0.51
0.54
0.57
0.53
0.54
0.53
0.51
0.55
0.54
0.52
0.55
0.54
0.53
0.51
0.5
0.52
0.51
0.5
0.52
0.52
0.46
0.4
0.45
0.39
0.38
0.47
0.41
0.29
0.22
0.31
0.31
0.24
0.29
0.28
0.29
0.33
0.29
0.23
0.18
0.21
0.17
0.13
0.14
0.08
0.38
0.44
0.36
0.48
0.25
0.44
0.45
0.56
0.51
0.5
0.48
0.5
0.51
0.5
0.53
0.5
0.51
0.48
0.49
0.49
0.52
0.49
0.48
0.47
0.48
0.52
0.48
0.46
0.47
0.46
0.36
0.25
0.22
0.23
0.21
0.26
0.29
0.29
0.31
0.32
0.26
0.2
0.15
0.17
0.14
0.13
0.1
0.44
0.56
0.59
0.64
0.39
0.17
0.22
0.25
0.52
0.53
0.44
0.4
0.45
0.45
0.43
0.38
0.42
0.5
0.51
0.5
0.48
0.5
0.45
0.37
0.4
0.4
0.49
0.45
0.38
0.48
0.44
0.38
0.22
0.23
0.19
0.21
0.22
0.31
0.31
0.31
0.32
0.26
0.19
0.17
0.15
0.14
0.11
0.11
0.43
0.52
0.45
0.5
0.62
0.52
0.22
0.44
0.43
0.3
0.26
0.28
0.3
0.25
0.09
0.14
0.26
0.5
0.51
0.47
0.42
0.43
0.5
0.45
0.42
0.37
0.49
0.43
0.39
0.48
0.44
0.38
0.25
0.35
0.21
0.24
0.25
0.31
0.31
0.32
0.31
0.24
0.2
0.17
0.15
0.11
0.12
0.48
0.32
0.58
0.64
0.31
0.28
0.32
0.35
0.11
0.15
0.06
0.12
0.11
0.19
0.2
0.34
0.51
0.48
0.42
0.46
0.44
0.39
0.42
0.41
0.46
0.38
0.43
0.49
0.47
0.41
0.31
0.26
0.27
0.17
0.23
0.32
0.31
0.31
0.31
0.25
0.22
0.18
0.16
0.12
0.13
0.46
0.51
0.51
0.56
0.41
0.25
0.47
0.42
0.26
0.18
0.1
0.04
0.24
0.18
0.15
0.45
0.46
0.43
0.48
0.47
0.39
0.43
0.42
0.41
0.44
0.47
0.5
0.48
0.43
0.3
0.33
0.35
0.17
0.27
0.32
0.32
0.32
0.31
0.27
0.23
0.21
0.17
0.12
0.11
0.47
0.35
0.56
0.47
0.51
0.51
0.39
0.57
0.42
0.3
0.5
0.46
0.12
0.15
0.41
0.45
0.47
0.49
0.42
0.45
0.42
0.46
0.38
0.45
0.47
0.45
0.46
0.39
0.38
0.28
0.17
0.28
0.32
0.32
0.31
0.29
0.27
0.21
0.2
0.15
0.45
0.24
0.41
0.48
0.53
0.56
0.58
0.56
0.57
0.51
0.2
0.03
0.27
0.46
0.49
0.49
0.45
0.51
0.49
0.43
0.31
0.43
0.49
0.48
0.47
0.4
0.4
0.27
0.13
0.23
0.31
0.3
0.27
0.25
0.24
0.2
0.18
0.15
0.28
0.08
0.24
0.5
0.55
0.47
0.58
0.57
0.59
0.47
0.12
0.11
0.36
0.47
0.5
0.48
0.52
0.47
0.46
0.44
0.44
0.4
0.43
0.44
0.39
0.4
0.26
0.14
0.2
0.31
0.31
0.26
0.25
0.23
0.22
0.2
0.18
0.12
0.17
0.2
0.3
0.38
0.45
0.52
0.39
0.44
0.37
0.3
0.16
0.31
0.46
0.47
0.44
0.46
0.48
0.47
0.47
0.46
0.42
0.4
0.37
0.37
0.36
0.27
0.17
0.18
0.31
0.33
0.28
0.23
0.21
0.18
0.16
0.14
0.31
0.08
0.1
0.22
0.2
0.43
0.13
0.2
0.36
0.23
0.21
0.29
0.43
0.45
0.5
0.52
0.51
0.48
0.45
0.45
0.51
0.48
0.34
0.41
0.27
0.26
0.18
0.16
0.29
0.33
0.3
0.23
0.18
0.16
0.13
0.12
0.48
0.28
0.35
0.25
0.07
0.16
0.22
0.16
0.33
0.31
0.25
0.2
0.31
0.48
0.48
0.52
0.49
0.48
0.49
0.48
0.48
0.47
0.41
0.43
0.33
0.32
0.23
0.12
0.21
0.29
0.29
0.26
0.23
0.19
0.12
0.08
0.5
0.51
0.45
0.28
0.06
0.08
0.36
0.39
0.43
0.33
0.24
0.07
0.34
0.49
0.48
0.5
0.46
0.4
0.43
0.5
0.45
0.48
0.44
0.39
0.38
0.34
0.27
0.15
0.11
0.15
0.2
0.28
0.25
0.16
0.15
0.36
0.5
0.49
0.35
0.05
0.08
0.42
0.44
0.44
0.36
0.1
0.14
0.45
0.49
0.54
0.52
0.42
0.33
0.43
0.43
0.43
0.44
0.42
0.4
0.39
0.31
0.27
0.2
0.16
0.13
0.2
0.3
0.25
0.15
0.16
0.21
0.56
0.46
0.25
0.1
0.3
0.47
0.44
0.46
0.36
0.15
0.34
0.45
0.48
0.51
0.48
0.4
0.37
0.46
0.46
0.44
0.42
0.44
0.43
0.38
0.36
0.3
0.25
0.12
0.2
0.18
0.19
0.22
0.2
0.16
0.48
0.3
0.12
0.18
0.4
0.49
0.47
0.47
0.35
0.06
0.3
0.46
0.52
0.43
0.39
0.4
0.39
0.43
0.47
0.43
0.46
0.42
0.44
0.41
0.35
0.3
0.27
0.17
0.11
0.09
0.14
0.2
0.23
0.16
0.48
0.55
0.28
0.25
0.2
0.42
0.26
0.33
0.47
0.3
0.15
0.44
0.51
0.43
0.38
0.31
0.37
0.42
0.44
0.43
0.46
0.46
0.43
0.42
0.42
0.35
0.31
0.24
0.17
0.11
0.13
0.19
0.18
0.21
0.49
0.42
0.09
0.16
0.3
0.26
0.04
0.22
0.46
0.35
0.33
0.5
0.43
0.3
0.33
0.32
0.39
0.44
0.46
0.46
0.49
0.48
0.44
0.45
0.41
0.35
0.3
0.24
0.18
0.1
0.07
0.12
0.17
0.21
0.2
0.35
0.02
0.13
0.4
0.11
0.07
0.31
0.33
0.49
0.5
0.47
0.42
0.36
0.33
0.38
0.46
0.44
0.5
0.48
0.5
0.48
0.47
0.42
0.39
0.36
0.32
0.26
0.16
0.16
0.11
0.16
0.15
0.19
0.2
0.64
0.28
0.03
0.19
0.24
0.14
0.12
0.23
0.47
0.47
0.49
0.48
0.47
0.37
0.38
0.39
0.54
0.46
0.48
0.49
0.47
0.46
0.44
0.42
0.42
0.36
0.32
0.28
0.23
0.19
0.16
0.15
0.15
0.16
0.46
0.07
0.02
0.1
0.05
0.15
0.3
0.35
0.46
0.46
0.49
0.47
0.49
0.46
0.37
0.45
0.47
0.44
0.46
0.49
0.46
0.43
0.38
0.43
0.37
0.31
0.31
0.33
0.3
0.21
0.19
0.21
0.16
0.23
0.08
0.02
0.05
0.03
0.3
0.41
0.47
0.52
0.51
0.5
0.47
0.44
0.45
0.43
0.42
0.34
0.37
0.39
0.38
0.41
0.37
0.34
0.39
0.38
0.28
0.29
0.37
0.28
0.26
0.19
0.18
0.2
0.23
0.03
0.02
0.02
0.09
0.4
0.45
0.45
0.52
0.51
0.49
0.46
0.44
0.45
0.36
0.33
0.3
0.24
0.29
0.28
0.29
0.38
0.39
0.4
0.37
0.32
0.29
0.28
0.32
0.25
0.23
0.22
0.24
0.57
0.22
0.02
0.02
0.05
0.25
0.44
0.48
0.49
0.49
0.49
0.5
0.46
0.47
0.45
0.29
0.26
0.35
0.29
0.3
0.25
0.35
0.4
0.36
0.42
0.42
0.33
0.31
0.29
0.2
0.18
0.18
0.22
0.16
0.55
0.22
0.04
0.02
0.04
0.12
0.34
0.42
0.48
0.48
0.46
0.47
0.48
0.47
0.45
0.32
0.23
0.31
0.32
0.34
0.42
0.43
0.45
0.4
0.41
0.43
0.42
0.4
0.36
0.3
0.17
0.26
0.27
0.2
0.14
0.4
0.23
0.19
0.11
0.13
0.22
0.35
0.33
0.36
0.48
0.43
0.47
0.51
0.51
0.46
0.45
0.24
0.24
0.25
0.34
0.34
0.46
0.45
0.47
0.45
0.43
0.42
0.45
0.44
0.33
0.21
0.18
0.24
0.22
0.29
0.1
0.03
0.23
0.26
0.31
0.29
0.41
0.41
0.45
0.44
0.45
0.48
0.5
0.49
0.48
0.37
0.23
0.3
0.32
0.31
0.28
0.43
0.48
0.47
0.46
0.44
0.44
0.38
0.24
0.21
0.21
0.27
0.25
0.18
0.49
0.39
0.17
0.08
0.11
0.2
0.27
0.4
0.46
0.42
0.43
0.47
0.5
0.5
0.49
0.5
0.46
0.35
0.24
0.23
0.27
0.29
0.38
0.45
0.44
0.45
0.43
0.42
0.35
0.3
0.28
0.2
0.28
0.3
0.17
0.5
0.49
0.46
0.51
0.37
0.19
0.27
0.11
0.28
0.35
0.47
0.48
0.5
0.48
0.48
0.5
0.42
0.4
0.45
0.41
0.27
0.19
0.22
0.27
0.41
0.45
0.31
0.21
0.22
0.28
0.24
0.28
0.29
0.26
0.3
0.18
0.11
0.11
0.08
0.43
0.38
0.35
0.57
0.59
0.42
0.37
0.23
0.18
0.21
0.32
0.43
0.5
0.5
0.49
0.48
0.46
0.49
0.46
0.43
0.43
0.34
0.29
0.15
0.18
0.34
0.4
0.41
0.38
0.37
0.39
0.41
0.4
0.35
0.29
0.24
0.18
0.11
0.12
0.14
0.11
0.06
0.47
0.5
0.47
0.43
0.52
0.47
0.33
0.08
0.07
0.21
0.34
0.4
0.46
0.44
0.47
0.51
0.46
0.34
0.46
0.46
0.44
0.39
0.34
0.3
0.16
0.21
0.34
0.38
0.41
0.4
0.4
0.41
0.37
0.39
0.36
0.24
0.21
0.17
0.17
0.26
0.26
0.18
0.11
0.06
0.45
0.49
0.54
0.55
0.56
0.6
0.53
0.35
0.21
0.2
0.24
0.36
0.42
0.48
0.47
0.4
0.31
0.34
0.35
0.47
0.44
0.45
0.43
0.46
0.4
0.24
0.17
0.18
0.2
0.35
0.43
0.43
0.41
0.37
0.37
0.38
0.38
0.4
0.33
0.33
0.39
0.34
0.27
0.19
0.1
0.44
0.5
0.5
0.53
0.53
0.56
0.56
0.52
0.52
0.31
0.21
0.1
0.17
0.36
0.4
0.3
0.37
0.45
0.42
0.43
0.37
0.26
0.41
0.4
0.41
0.46
0.4
0.41
0.4
0.27
0.14
0.17
0.25
0.3
0.43
0.41
0.41
0.41
0.42
0.43
0.4
0.4
0.4
0.43
0.4
0.29
0.28
0.25
0.24
0.49
0.58
0.58
0.57
0.58
0.52
0.52
0.58
0.52
0.49
0.25
0.06
0.14
0.12
0.29
0.42
0.4
0.36
0.38
0.37
0.39
0.43
0.34
0.36
0.48
0.39
0.43
0.4
0.42
0.37
0.31
0.2
0.14
0.16
0.17
0.35
0.44
0.4
0.39
0.4
0.43
0.41
0.43
0.41
0.38
0.4
0.43
0.38
0.28
0.22
0.15
0.48
0.47
0.61
0.26
0.47
0.4
0.56
0.53
0.55
0.45
0.29
0.26
0.24
0.29
0.43
0.33
0.39
0.36
0.32
0.34
0.28
0.33
0.38
0.29
0.43
0.47
0.43
0.41
0.37
0.34
0.26
0.2
0.14
0.16
0.23
0.23
0.38
0.43
0.4
0.39
0.42
0.42
0.42
0.44
0.41
0.42
0.41
0.43
0.42
0.35
0.25
0.21
0.19
0.46
0.58
0.5
0.55
0.54
0.51
0.44
0.36
0.22
0.22
0.13
0.25
0.48
0.39
0.35
0.21
0.25
0.27
0.31
0.3
0.34
0.28
0.44
0.44
0.4
0.4
0.32
0.3
0.21
0.16
0.12
0.15
0.15
0.26
0.41
0.43
0.46
0.42
0.43
0.44
0.46
0.44
0.44
0.41
0.42
0.44
0.42
0.38
0.26
0.17
0.15
0.1
0.5
0.54
0.52
0.49
0.42
0.38
0.29
0.2
0.13
0.25
0.27
0.32
0.41
0.38
0.37
0.27
0.22
0.37
0.43
0.4
0.34
0.34
0.4
0.37
0.36
0.29
0.18
0.14
0.22
0.18
0.15
0.14
0.17
0.24
0.39
0.43
0.46
0.44
0.41
0.41
0.44
0.42
0.44
0.43
0.42
0.42
0.43
0.4
0.34
0.22
0.13
0.11
0.53
0.48
0.47
0.35
0.34
0.21
0.36
0.36
0.35
0.3
0.21
0.18
0.3
0.39
0.26
0.28
0.37
0.41
0.41
0.44
0.44
0.42
0.42
0.35
0.25
0.2
0.21
0.15
0.2
0.15
0.19
0.2
0.25
0.21
0.28
0.41
0.41
0.4
0.44
0.39
0.41
0.44
0.4
0.39
0.4
0.41
0.38
0.41
0.4
0.38
0.24
0.13
0.11
0.37
0.3
0.49
0.45
0.39
0.38
0.46
0.41
0.36
0.54
0.43
0.36
0.26
0.23
0.27
0.39
0.27
0.27
0.38
0.4
0.47
0.46
0.43
0.36
0.23
0.2
0.2
0.24
0.2
0.12
0.15
0.15
0.2
0.22
0.19
0.22
0.31
0.4
0.45
0.4
0.41
0.38
0.37
0.37
0.38
0.38
0.39
0.4
0.39
0.39
0.4
0.38
0.33
0.24
0.23
0.54
0.49
0.46
0.47
0.47
0.41
0.24
0.23
0.19
0.33
0.35
0.52
0.55
0.36
0.34
0.29
0.25
0.33
0.33
0.22
0.33
0.44
0.45
0.51
0.5
0.43
0.34
0.25
0.2
0.12
0.21
0.16
0.14
0.15
0.21
0.23
0.2
0.16
0.18
0.37
0.46
0.43
0.38
0.4
0.41
0.37
0.37
0.38
0.39
0.4
0.36
0.36
0.36
0.38
0.39
0.33
0.26
0.19
0.12
0.15
0.61
0.54
0.58
0.48
0.39
0.35
0.3
0.22
0.21
0.34
0.38
0.49
0.45
0.43
0.23
0.36
0.23
0.28
0.27
0.21
0.34
0.42
0.52
0.55
0.5
0.43
0.44
0.38
0.3
0.23
0.28
0.16
0.11
0.18
0.15
0.21
0.16
0.23
0.25
0.33
0.45
0.38
0.39
0.36
0.4
0.4
0.35
0.36
0.36
0.37
0.38
0.37
0.34
0.32
0.31
0.32
0.3
0.24
0.17
0.16
0.56
0.54
0.52
0.53
0.34
0.29
0.25
0.32
0.31
0.34
0.42
0.51
0.5
0.5
0.43
0.36
0.29
0.27
0.28
0.29
0.3
0.37
0.33
0.4
0.51
0.5
0.48
0.44
0.42
0.37
0.36
0.25
0.13
0.19
0.21
0.27
0.3
0.28
0.33
0.42
0.45
0.41
0.39
0.37
0.38
0.39
0.38
0.35
0.3
0.33
0.37
0.35
0.35
0.33
0.3
0.26
0.21
0.18
0.09
0.56
0.44
0.45
0.58
0.44
0.25
0.18
0.23
0.33
0.39
0.37
0.46
0.5
0.5
0.45
0.44
0.3
0.26
0.29
0.33
0.4
0.33
0.26
0.3
0.37
0.56
0.46
0.47
0.45
0.44
0.41
0.38
0.25
0.19
0.16
0.19
0.31
0.37
0.41
0.44
0.44
0.45
0.4
0.4
0.37
0.34
0.36
0.34
0.41
0.34
0.32
0.32
0.32
0.29
0.3
0.28
0.21
0.16
0.07
0.08
0.09
0.58
0.53
0.55
0.48
0.32
0.19
0.21
0.37
0.36
0.4
0.45
0.46
0.48
0.52
0.45
0.39
0.41
0.35
0.44
0.44
0.36
0.17
0.15
0.36
0.51
0.58
0.51
0.47
0.44
0.43
0.42
0.32
0.22
0.26
0.27
0.38
0.41
0.47
0.47
0.46
0.45
0.42
0.43
0.39
0.32
0.26
0.37
0.33
0.38
0.36
0.33
0.32
0.3
0.29
0.28
0.22
0.18
0.16
0.12
0.07
0.07
0.1
0.09
0.09
0.08
0.07
0.08
0.07
0.07
0.07
0.71
0.71
0.7
0.7
0.7
0.72
0.71
0.7
0.7
0.67
0.6
0.57
0.67
0.65
0.66
0.61
0.58
0.52
0.33
0.22
0.16
0.39
0.43
0.43
0.4
0.46
0.48
0.52
0.53
0.43
0.41
0.45
0.42
0.37
0.3
0.2
0.25
0.33
0.49
0.52
0.56
0.6
0.54
0.46
0.39
0.41
0.32
0.37
0.44
0.47
0.49
0.48
0.49
0.5
0.47
0.46
0.41
0.38
0.39
0.38
0.31
0.34
0.34
0.35
0.37
0.33
0.33
0.31
0.25
0.25
0.21
0.18
0.15
0.1
0.07
0.06
0.11
0.11
0.1
0.09
0.08
0.07
0.08
0.09
0.09
0.07
0.07
0.07
0.07
0.07
0.59
0.69
0.69
0.68
0.67
0.68
0.65
0.63
0.67
0.7
0.72
0.71
0.71
0.69
0.69
0.67
0.71
0.63
0.46
0.61
0.6
0.56
0.38
0.2
0.13
0.24
0.42
0.42
0.44
0.46
0.49
0.5
0.5
0.5
0.46
0.48
0.35
0.31
0.33
0.39
0.39
0.5
0.53
0.57
0.58
0.57
0.57
0.58
0.55
0.54
0.53
0.46
0.44
0.46
0.48
0.46
0.46
0.46
0.43
0.4
0.39
0.37
0.36
0.38
0.39
0.37
0.3
0.35
0.33
0.37
0.3
0.27
0.25
0.22
0.23
0.22
0.22
0.24
0.03
0.07
0.08
0.11
0.1
0.1
0.1
0.08
0.07
0.08
0.07
0.08
0.08
0.07
0.07
0.07
0.07
0.64
0.61
0.59
0.6
0.57
0.6
0.55
0.55
0.63
0.66
0.69
0.7
0.7
0.69
0.62
0.68
0.69
0.67
0.59
0.54
0.53
0.6
0.45
0.28
0.31
0.26
0.35
0.43
0.47
0.47
0.52
0.56
0.56
0.53
0.56
0.5
0.38
0.44
0.46
0.49
0.47
0.47
0.54
0.56
0.58
0.59
0.56
0.55
0.55
0.51
0.53
0.53
0.48
0.47
0.48
0.47
0.43
0.41
0.42
0.38
0.42
0.37
0.35
0.29
0.33
0.35
0.35
0.24
0.29
0.28
0.29
0.27
0.2
0.14
0.13
0.11
0.13
0.21
0.19
0.15
0.05
0.06
0.08
0.09
0.08
0.08
0.08
0.07
0.07
0.07
0.07
0.07
0.07
0.07
0.07
0.07
0.56
0.58
0.42
0.49
0.46
0.46
0.45
0.54
0.63
0.47
0.55
0.52
0.53
0.62
0.64
0.68
0.68
0.68
0.66
0.63
0.57
0.6
0.62
0.58
0.52
0.33
0.24
0.4
0.42
0.47
0.54
0.58
0.55
0.52
0.57
0.53
0.47
0.4
0.49
0.54
0.53
0.54
0.48
0.51
0.53
0.55
0.56
0.55
0.53
0.53
0.49
0.47
0.47
0.51
0.51
0.47
0.47
0.46
0.42
0.42
0.42
0.4
0.38
0.37
0.37
0.22
0.25