Skip to content

Instantly share code, notes, and snippets.

@jmahabal
Last active April 27, 2017 07:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmahabal/cbc14c78e392cdccc96bb222697a3716 to your computer and use it in GitHub Desktop.
Save jmahabal/cbc14c78e392cdccc96bb222697a3716 to your computer and use it in GitHub Desktop.
NBA Margin of Victory
// colors for teams
d3.json("teamcolors.json", function(teamcolors) {
// console.log(teamcolors);
teamcolors = _.filter(teamcolors, function(obj) { return obj.league == 'nba'})
// console.log(teamcolors);
// our input dataset, cleaned slightly
d3.csv("all_mov.csv", function(dataset) {
// var gsw = _.filter(dataset, function(obj) { return obj["Team1"] == "Golden State Warriors"})
// // //
// SVG attributes
var margin = {left: 50, right: 50, top: 60, bottom: 20};
var totalWidth = (d3.select("#chart").node().getBoundingClientRect().width);
var height = (d3.select("#chart").node().getBoundingClientRect().width)/3;
var width = totalWidth - margin.left - margin.right;
// Build our nested dataset to be used to construct small multiples
var grouped = [];
var teams = _.uniq(_.pluck(dataset, 'Team1'));
for (var i = 0; i < teams.length; i++) {
nest = _.sortBy(_.filter(dataset, function(obj) { return obj["Team1"] == teams[i]; }),
function(game) { return new Date(game.date); });
for (var j = 0; j < nest.length; j++) {
nest[j].order = j;
}
grouped.push({teamname: teams[i], data: nest});
}
// Sort by winning percentage
grouped = _.sortBy(grouped, function(obj) {
return (_.filter(obj.data, function(game) { return game.MOV > 0; })).length / obj.data.length;
}).reverse()
// Create our main SVG
var svg = d3.select("#chart").selectAll("svg")
.data(grouped)
.enter()
.append("div")
.attr("class", function(d) { return "team" })
.attr("id", function(d) { return d.teamname.replace(/ /g, ""); })
.append("svg:svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
// Create scale
var num_games = _.max(_.map(grouped, function(obj) { return obj.data.length; }));
var largest_mov = _.max(_.map(dataset, function(obj) { return parseInt(obj["MOV"]); }));
// http://stackoverflow.com/questions/3746725/create-a-javascript-array-containing-1-n
var xScale = d3.scaleBand().range([0, width]).paddingInner(0.2)
.domain(Array.apply(null, {length: num_games}).map(Number.call, Number))
var yScale = d3.scaleLinear().domain([0, largest_mov]).range([0, height/2])
// Functions for handling mouse events
function mouseover(d) {
tooltip.style("display", "inline");
}
function mousemove(d) {
tooltip
.text(function() { return d.Team2.toUpperCase() + " // " + d.PTS1 + "-" + d.PTS2; })
.style("left", (d3.event.pageX - 34) + "px")
.style("top", (d3.event.pageY - 12) + "px");
}
function mouseout(d) {
tooltip.style("display", "none");
}
// Create and render axes
var yAxis = d3.axisLeft(yScale.range([height/2, 0])).ticks(3)
svg.append("g")
.call(yAxis)
.attr("transform", "translate(" + (margin.left - 5) + "," + margin.top + ")")
.attr("class", "axis yaxis");
var negativeFormat = function(d) { if(d != 0) { return "-" + d; } };
var yAxis = d3.axisLeft(yScale.range([0, height/2])).ticks(3).tickFormat(negativeFormat)
svg.append("g")
.call(yAxis)
.attr("transform", "translate(" + (margin.left - 5) + "," + (height/2 + margin.top) + ")")
.attr("class", "axis yaxis");
// Reset Scale from Axis
yScale.range([0, height/2])
var toRGB = function(rgbstring) {
return "rgba("+rgbstring.replace(" ", ",").replace(" ", ",")+", 1)"
}
// Actually create SVGs for each team
// PLayoffs
svg.selectAll(".playoffs")
.data(function(d) { return d.data; })
.enter().append("rect")
.attr("x", function(d) { return xScale(82) + margin.left; })
.attr("y", function(d) { return height/2 + margin.top; })
.attr("width", function(d) { return xScale(num_games - 82); })
.attr("class", d => "playoffs"+d.Team1.replace(/ /g, ""))
.attr("height", function(d) { return 0; })
.attr("fill", "white")
.attr("display", function(d) { if (d.order != 1) { return "none"; } })
.attr("stroke-dasharray", 0 + " " + (xScale(num_games - 82) + height) + " " + xScale(num_games - 82) + " " + 0)
// .attr("stroke-dasharray", xScale(num_games - 82) + " " + (2*height + xScale(num_games - 82)))
.attr("stroke-width", 2)
.attr("stroke-opacity", 1)
.attr("stroke", "white")
.attr("fill-opacity", 0.2);
svg.selectAll(".playoff-text")
.data(function(d) { return d.data; })
.enter().append("text")
.attr("x", function(d) { return 0; })
.attr("y", function(d) { return 0; })
.text(function(d) { if (d.order == 1) { return "playoffs"; } })
.attr("display", function(d) { if (d.order != 1) { return "none"; } })
.attr("transform", "translate(" + (margin.left + xScale(82)) + "," + (margin.top + height + 16) + ")")
.attr("text-anchor", "left")
.attr("class", d => "playoff-text playoff-text"+d.Team1.replace(/ /g, ""));
svg.selectAll(".team")
.data(function(d) {
return d.data;
})
.enter().append("rect")
.attr("class", function(d) {
if (d.MOV > 0) {
return d.Team1.replace(/ /g, "") + "Game" + " 1positive-gradient";
} else {
return d.Team1.replace(/ /g, "") + "Game" + " 1negative-gradient";
}
})
.attr("x", function(d) { return xScale(d.order); })
.attr("width", function(d) { return xScale.bandwidth(); })
.attr("height", function(d) { return 0; })
.attr("stroke", "white")
.attr("fill", function(d) {
// console.log(d.Team1)
// console.log(_.find(teamcolors, function(obj) { return obj.name == d.Team1})["colors"])
// console.log(toRGB(_.find(teamcolors, function(obj) { return obj.name == d.Team1})["colors"]["rgb"][0]))
if (d.MOV > 0) {
return toRGB(_.find(teamcolors, function(obj) { return obj.name == d.Team1})["colors"]["rgb"][0])
} else {
return "black";
// return toRGB(_.find(teamcolors, function(obj) { return obj.name == d.Team1})["colors"]["rgb"][1])
}
})
.attr("stroke-width", 0)
.attr("transform", function(d) {
if (d.MOV > 0) {
return "translate(" + margin.left + "," + (height + margin.top) + ") scale(1, -1)"
} else {
return "translate(" + margin.left + "," + margin.top + ")"
}
})
.attr("y", height/2)
.on("mouseover", function(d) {
d3.select(this).attr("stroke-width", "2");
return mouseover(d);
})
.on("mousemove", function(d) { return mousemove(d); })
.on("mouseout", function(d) {
d3.select(this).attr("stroke-width", "0");
return mouseout(d);
})
// Label with the team name
svg.selectAll(".teamname")
.data(function(d) { return d.data; })
.enter().append("text")
.attr("x", function(d) { return 0; })
.attr("y", function(d) { return 0; })
.text(function(d) { if (d.order == 1) { return d.Team1.toUpperCase(); } })
.attr("display", function(d) { if (d.order != 1) { return "none"; } })
.attr("transform", "translate(" + (margin.left + width/2) + "," + (margin.top*0.75) + ")")
.attr("text-anchor", "middle")
.attr("class", "teamname");
// X-Axis, if needed
var xAxis = d3.axisBottom(xScale).tickFormat('').tickSize(0);
// svg.append("g")
// .call(xAxis)
// .attr("transform", "translate(" + (margin.left) + "," + (margin.top + height/2) + ")")
// .attr("class", "xaxis");
// Construct tooltip for mouse events
var tooltip = d3.select("body").append("div")
.style("display", "none")
.attr("class", "bar-tooltip")
// Annotation
const type = d3.annotationCalloutCircle
// console.log(dataset);
// console.log(xScale("80"))
const annotations = [{
note: { label: "Start of the Toaster Era"},
x: xScale(73) - xScale.bandwidth()/2, y: height/2 + margin.top,
dy: height/3, dx: -margin.left/2,
subject: { radius: 2 * xScale.bandwidth(), radiusPadding: 0 }
}]
const makeAnnotations = d3.annotation()
.editMode(false)
.type(type)
//accessors & accessorsInverse not needed
//if using x, y in annotations JSON
// .accessors({
// x: d => x(parseTime(d.date)),
// y: d => y(d.close)
// })
// .accessorsInverse({
// date: d => timeFormat(x.invert(d.x)),
// close: d => y.invert(d.y)
// })
.annotations(annotations)
d3.select("svg")
.append("g")
.attr("class", "annotation-group")
.call(makeAnnotations)
document.documentElement.style.setProperty('--annotation-color', '#ecf0f1');
d3.selectAll(".annotation-group")
.transition().delay(1500)
.style("visibility", function() { return "visible"; });
// Waypoints for transition
$.each(teams, function(i, team){
var team = team.replace(/ /g, "")
var waypoint = new Waypoint({
element: document.getElementById(team),
handler: function(direction) {
d3.selectAll("."+ team + "Game")
.transition()
.delay(function(d) { return d.order * 5; })
.duration(500)
.ease(d3.easeQuadInOut)
.attr("height", function(d) {
return yScale(Math.abs(d.MOV));
});
d3.selectAll(".playoffs"+team)
.transition().duration(500).delay(82*5)
.ease(d3.easeQuadInOut)
.attr("height", function() {
return height;
})
.attr("y", function() {
return margin.top;
});
d3.selectAll(".playoff-text"+team)
.transition().delay(500 + 82*5).duration(500)
.style("visibility", function() { return "visible"; });
},
offset: 'bottom-in-view'
})
})
// jump to a specific team
teams = teams.sort()
$.each(teams, function(i, team){
$(".selectpicker").append("<option>" + team + "</option>")
})
$('.selectpicker').selectpicker('val', grouped[0].teamname);
$('.selectpicker').selectpicker('refresh');
$('#nbateams').on('hidden.bs.select', function (e) {
var team = $(".selectpicker").val().replace(/ /g, "");
$('html, body').animate({
scrollTop: $("#"+team).offset().top - 100
}, 2000);
d3.selectAll("#"+team).selectAll("svg")
.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
// .attr("rx", 5)
// .attr("ry", 5)
.attr("stroke", "white")
.attr("stroke-width", "0")
.attr("fill", "none")
.transition().duration(1500)
.attr("stroke-width", "7")
.transition().duration(1500)
.attr("stroke-width", "0");
});
});
});
// // Let's use d3.annotations
// const type = d3.annotationCalloutCircle
// const annotations = [{
// note: {
// label: "Toaster Era Begins",
// // title: "Annotations :)"
// },
// //can use x, y directly instead of data
// data: { order: 100, MOV: 20 },
// dy: 50,
// dx: 0,
// subject: {
// radius: 50,
// radiusPadding: 5
// }
// }]
// const makeAnnotations = d3.annotation()
// .editMode(true)
// .type(type)
// //accessors & accessorsInverse not needed
// //if using x, y in annotations JSON
// // .accessors({
// // x: d => xScale(d.order),
// // y: d => yScale(d.MOV)
// // })
// // .accessorsInverse({
// // order: d => xScale.invert(d.x),
// // MOV: d => yScale.invert(d.y)
// // })
// .annotations(annotations)
// d3.selectAll("#GoldenStateWarriors").selectAll("svg")
// .append("g")
// .attr("class", "annotation-group")
// .call(makeAnnotations)
index Date Team1 PTS1 Team2 PTS2 MOV
0 0 Tue Oct 25 2016 New York Knicks 88 Cleveland Cavaliers 117 -29
1263 0 Tue Oct 25 2016 Cleveland Cavaliers 117 New York Knicks 88 29
1264 1 Tue Oct 25 2016 Golden State Warriors 100 San Antonio Spurs 129 -29
1 1 Tue Oct 25 2016 San Antonio Spurs 129 Golden State Warriors 100 29
2 2 Tue Oct 25 2016 Utah Jazz 104 Portland Trail Blazers 113 -9
1265 2 Tue Oct 25 2016 Portland Trail Blazers 113 Utah Jazz 104 9
3 3 Wed Oct 26 2016 Brooklyn Nets 117 Boston Celtics 122 -5
1266 3 Wed Oct 26 2016 Boston Celtics 122 Brooklyn Nets 117 5
4 4 Wed Oct 26 2016 Dallas Mavericks 121 Indiana Pacers 130 -9
1267 4 Wed Oct 26 2016 Indiana Pacers 130 Dallas Mavericks 121 9
1268 5 Wed Oct 26 2016 Los Angeles Lakers 120 Houston Rockets 114 6
5 5 Wed Oct 26 2016 Houston Rockets 114 Los Angeles Lakers 120 -6
1269 6 Wed Oct 26 2016 Memphis Grizzlies 102 Minnesota Timberwolves 98 4
6 6 Wed Oct 26 2016 Minnesota Timberwolves 98 Memphis Grizzlies 102 -4
1270 7 Wed Oct 26 2016 Milwaukee Bucks 96 Charlotte Hornets 107 -11
7 7 Wed Oct 26 2016 Charlotte Hornets 107 Milwaukee Bucks 96 11
1271 8 Wed Oct 26 2016 New Orleans Pelicans 102 Denver Nuggets 107 -5
8 8 Wed Oct 26 2016 Denver Nuggets 107 New Orleans Pelicans 102 5
1272 9 Wed Oct 26 2016 Orlando Magic 96 Miami Heat 108 -12
9 9 Wed Oct 26 2016 Miami Heat 108 Orlando Magic 96 12
1273 10 Wed Oct 26 2016 Philadelphia 76ers 97 Oklahoma City Thunder 103 -6
10 10 Wed Oct 26 2016 Oklahoma City Thunder 103 Philadelphia 76ers 97 6
1274 11 Wed Oct 26 2016 Phoenix Suns 94 Sacramento Kings 113 -19
11 11 Wed Oct 26 2016 Sacramento Kings 113 Phoenix Suns 94 19
12 12 Wed Oct 26 2016 Detroit Pistons 91 Toronto Raptors 109 -18
1275 12 Wed Oct 26 2016 Toronto Raptors 109 Detroit Pistons 91 18
13 13 Thu Oct 27 2016 Washington Wizards 99 Atlanta Hawks 114 -15
1276 13 Thu Oct 27 2016 Atlanta Hawks 114 Washington Wizards 99 15
14 14 Thu Oct 27 2016 Boston Celtics 99 Chicago Bulls 105 -6
1277 14 Thu Oct 27 2016 Chicago Bulls 105 Boston Celtics 99 6
1278 15 Thu Oct 27 2016 Portland Trail Blazers 106 Los Angeles Clippers 114 -8
15 15 Thu Oct 27 2016 Los Angeles Clippers 114 Portland Trail Blazers 106 8
16 16 Thu Oct 27 2016 San Antonio Spurs 102 Sacramento Kings 94 8
1279 16 Thu Oct 27 2016 Sacramento Kings 94 San Antonio Spurs 102 -8
17 17 Fri Oct 28 2016 Indiana Pacers 94 Brooklyn Nets 103 -9
1280 17 Fri Oct 28 2016 Brooklyn Nets 103 Indiana Pacers 94 9
18 18 Fri Oct 28 2016 Houston Rockets 106 Dallas Mavericks 98 8
1281 18 Fri Oct 28 2016 Dallas Mavericks 98 Houston Rockets 106 -8
19 19 Fri Oct 28 2016 Orlando Magic 82 Detroit Pistons 108 -26
1282 19 Fri Oct 28 2016 Detroit Pistons 108 Orlando Magic 82 26
20 20 Fri Oct 28 2016 Charlotte Hornets 97 Miami Heat 91 6
1283 20 Fri Oct 28 2016 Miami Heat 91 Charlotte Hornets 97 -6
1284 21 Fri Oct 28 2016 New Orleans Pelicans 114 Golden State Warriors 122 -8
21 21 Fri Oct 28 2016 Golden State Warriors 122 New Orleans Pelicans 114 8
22 22 Fri Oct 28 2016 Phoenix Suns 110 Oklahoma City Thunder 113 -3
1285 22 Fri Oct 28 2016 Oklahoma City Thunder 113 Phoenix Suns 110 3
1286 23 Fri Oct 28 2016 Toronto Raptors 91 Cleveland Cavaliers 94 -3
23 23 Fri Oct 28 2016 Cleveland Cavaliers 94 Toronto Raptors 91 3
24 24 Fri Oct 28 2016 Los Angeles Lakers 89 Utah Jazz 96 -7
1287 24 Fri Oct 28 2016 Utah Jazz 96 Los Angeles Lakers 89 7
25 25 Sat Oct 29 2016 Indiana Pacers 101 Chicago Bulls 118 -17
1288 25 Sat Oct 29 2016 Chicago Bulls 118 Indiana Pacers 101 17
26 26 Sat Oct 29 2016 Boston Celtics 104 Charlotte Hornets 98 6
1289 26 Sat Oct 29 2016 Charlotte Hornets 98 Boston Celtics 104 -6
1290 27 Sat Oct 29 2016 Cleveland Cavaliers 105 Orlando Magic 99 6
27 27 Sat Oct 29 2016 Orlando Magic 99 Cleveland Cavaliers 105 -6
1291 28 Sat Oct 29 2016 Denver Nuggets 113 Portland Trail Blazers 115 -2
28 28 Sat Oct 29 2016 Portland Trail Blazers 115 Denver Nuggets 113 2
29 29 Sat Oct 29 2016 Brooklyn Nets 108 Milwaukee Bucks 110 -2
1292 29 Sat Oct 29 2016 Milwaukee Bucks 110 Brooklyn Nets 108 2
1293 30 Sat Oct 29 2016 New York Knicks 111 Memphis Grizzlies 104 7
30 30 Sat Oct 29 2016 Memphis Grizzlies 104 New York Knicks 111 -7
1294 31 Sat Oct 29 2016 Philadelphia 76ers 72 Atlanta Hawks 104 -32
31 31 Sat Oct 29 2016 Atlanta Hawks 104 Philadelphia 76ers 72 32
1295 32 Sat Oct 29 2016 Sacramento Kings 106 Minnesota Timberwolves 103 3
32 32 Sat Oct 29 2016 Minnesota Timberwolves 103 Sacramento Kings 106 -3
33 33 Sat Oct 29 2016 New Orleans Pelicans 79 San Antonio Spurs 98 -19
1296 33 Sat Oct 29 2016 San Antonio Spurs 98 New Orleans Pelicans 79 19
1297 34 Sun Oct 30 2016 Detroit Pistons 98 Milwaukee Bucks 83 15
34 34 Sun Oct 30 2016 Milwaukee Bucks 83 Detroit Pistons 98 -15
1298 35 Sun Oct 30 2016 Houston Rockets 93 Dallas Mavericks 92 1
35 35 Sun Oct 30 2016 Dallas Mavericks 92 Houston Rockets 93 -1
36 36 Sun Oct 30 2016 Utah Jazz 75 Los Angeles Clippers 88 -13
1299 36 Sun Oct 30 2016 Los Angeles Clippers 88 Utah Jazz 75 13
37 37 Sun Oct 30 2016 Washington Wizards 103 Memphis Grizzlies 112 -9
1300 37 Sun Oct 30 2016 Memphis Grizzlies 112 Washington Wizards 103 9
1301 38 Sun Oct 30 2016 Miami Heat 99 San Antonio Spurs 106 -7
38 38 Sun Oct 30 2016 San Antonio Spurs 106 Miami Heat 99 7
39 39 Sun Oct 30 2016 Los Angeles Lakers 96 Oklahoma City Thunder 113 -17
1302 39 Sun Oct 30 2016 Oklahoma City Thunder 113 Los Angeles Lakers 96 17
1303 40 Sun Oct 30 2016 Phoenix Suns 100 Golden State Warriors 106 -6
40 40 Sun Oct 30 2016 Golden State Warriors 106 Phoenix Suns 100 6
41 41 Mon Oct 31 2016 Sacramento Kings 95 Atlanta Hawks 106 -11
1304 41 Mon Oct 31 2016 Atlanta Hawks 106 Sacramento Kings 95 11
42 42 Mon Oct 31 2016 Chicago Bulls 118 Brooklyn Nets 88 30
1305 42 Mon Oct 31 2016 Brooklyn Nets 88 Chicago Bulls 118 -30
43 43 Mon Oct 31 2016 Phoenix Suns 98 Los Angeles Clippers 116 -18
1306 43 Mon Oct 31 2016 Los Angeles Clippers 116 Phoenix Suns 98 18
44 44 Mon Oct 31 2016 Denver Nuggets 102 Toronto Raptors 105 -3
1307 44 Mon Oct 31 2016 Toronto Raptors 105 Denver Nuggets 102 3
45 45 Tue Nov 1 2016 Houston Rockets 120 Cleveland Cavaliers 128 -8
1308 45 Tue Nov 1 2016 Cleveland Cavaliers 128 Houston Rockets 120 8
46 46 Tue Nov 1 2016 New York Knicks 89 Detroit Pistons 102 -13
1309 46 Tue Nov 1 2016 Detroit Pistons 102 New York Knicks 89 13
47 47 Tue Nov 1 2016 Los Angeles Lakers 108 Indiana Pacers 115 -7
1310 47 Tue Nov 1 2016 Indiana Pacers 115 Los Angeles Lakers 108 7
48 48 Tue Nov 1 2016 Sacramento Kings 96 Miami Heat 108 -12
1311 48 Tue Nov 1 2016 Miami Heat 108 Sacramento Kings 96 12
1312 49 Tue Nov 1 2016 Minnesota Timberwolves 116 Memphis Grizzlies 80 36
49 49 Tue Nov 1 2016 Memphis Grizzlies 80 Minnesota Timberwolves 116 -36
1313 50 Tue Nov 1 2016 New Orleans Pelicans 113 Milwaukee Bucks 117 -4
50 50 Tue Nov 1 2016 Milwaukee Bucks 117 New Orleans Pelicans 113 4
1314 51 Tue Nov 1 2016 Philadelphia 76ers 101 Orlando Magic 103 -2
51 51 Tue Nov 1 2016 Orlando Magic 103 Philadelphia 76ers 101 2
52 52 Tue Nov 1 2016 Golden State Warriors 127 Portland Trail Blazers 104 23
1315 52 Tue Nov 1 2016 Portland Trail Blazers 104 Golden State Warriors 127 -23
53 53 Tue Nov 1 2016 Utah Jazz 106 San Antonio Spurs 91 15
1316 53 Tue Nov 1 2016 San Antonio Spurs 91 Utah Jazz 106 -15
1317 54 Wed Nov 2 2016 Atlanta Hawks 116 Los Angeles Lakers 123 -7
54 54 Wed Nov 2 2016 Los Angeles Lakers 123 Atlanta Hawks 116 7
1318 55 Wed Nov 2 2016 Boston Celtics 107 Chicago Bulls 100 7
55 55 Wed Nov 2 2016 Chicago Bulls 100 Boston Celtics 107 -7
1319 56 Wed Nov 2 2016 Brooklyn Nets 109 Detroit Pistons 101 8
56 56 Wed Nov 2 2016 Detroit Pistons 101 Brooklyn Nets 109 -8
1320 57 Wed Nov 2 2016 Charlotte Hornets 109 Philadelphia 76ers 93 16
57 57 Wed Nov 2 2016 Philadelphia 76ers 93 Charlotte Hornets 109 -16
1321 58 Wed Nov 2 2016 Los Angeles Clippers 83 Oklahoma City Thunder 85 -2
58 58 Wed Nov 2 2016 Oklahoma City Thunder 85 Los Angeles Clippers 83 2
59 59 Wed Nov 2 2016 New Orleans Pelicans 83 Memphis Grizzlies 89 -6
1322 59 Wed Nov 2 2016 Memphis Grizzlies 89 New Orleans Pelicans 83 6
60 60 Wed Nov 2 2016 Houston Rockets 118 New York Knicks 99 19
1323 60 Wed Nov 2 2016 New York Knicks 99 Houston Rockets 118 -19
61 61 Wed Nov 2 2016 Portland Trail Blazers 115 Phoenix Suns 118 -3
1324 61 Wed Nov 2 2016 Phoenix Suns 118 Portland Trail Blazers 115 3
62 62 Wed Nov 2 2016 Dallas Mavericks 81 Utah Jazz 97 -16
1325 62 Wed Nov 2 2016 Utah Jazz 97 Dallas Mavericks 81 16
63 63 Wed Nov 2 2016 Toronto Raptors 113 Washington Wizards 103 10
1326 63 Wed Nov 2 2016 Washington Wizards 103 Toronto Raptors 113 -10
64 64 Thu Nov 3 2016 Boston Celtics 122 Cleveland Cavaliers 128 -6
1327 64 Thu Nov 3 2016 Cleveland Cavaliers 128 Boston Celtics 122 6
65 65 Thu Nov 3 2016 Oklahoma City Thunder 96 Golden State Warriors 122 -26
1328 65 Thu Nov 3 2016 Golden State Warriors 122 Oklahoma City Thunder 96 26
66 66 Thu Nov 3 2016 Indiana Pacers 107 Milwaukee Bucks 125 -18
1329 66 Thu Nov 3 2016 Milwaukee Bucks 125 Indiana Pacers 107 18
67 67 Thu Nov 3 2016 Denver Nuggets 102 Minnesota Timberwolves 99 3
1330 67 Thu Nov 3 2016 Minnesota Timberwolves 99 Denver Nuggets 102 -3
68 68 Thu Nov 3 2016 Sacramento Kings 94 Orlando Magic 102 -8
1331 68 Thu Nov 3 2016 Orlando Magic 102 Sacramento Kings 94 8
69 69 Fri Nov 4 2016 Charlotte Hornets 99 Brooklyn Nets 95 4
1332 69 Fri Nov 4 2016 Brooklyn Nets 95 Charlotte Hornets 99 -4
70 70 Fri Nov 4 2016 New York Knicks 117 Chicago Bulls 104 13
1333 70 Fri Nov 4 2016 Chicago Bulls 104 New York Knicks 117 -13
71 71 Fri Nov 4 2016 Portland Trail Blazers 105 Dallas Mavericks 95 10
1334 71 Fri Nov 4 2016 Dallas Mavericks 95 Portland Trail Blazers 105 -10
72 72 Fri Nov 4 2016 Golden State Warriors 97 Los Angeles Lakers 117 -20
1335 72 Fri Nov 4 2016 Los Angeles Lakers 117 Golden State Warriors 97 20
1336 73 Fri Nov 4 2016 Memphis Grizzlies 88 Los Angeles Clippers 99 -11
73 73 Fri Nov 4 2016 Los Angeles Clippers 99 Memphis Grizzlies 88 11
1337 74 Fri Nov 4 2016 New Orleans Pelicans 111 Phoenix Suns 112 -1
74 74 Fri Nov 4 2016 Phoenix Suns 112 New Orleans Pelicans 111 1
1338 75 Fri Nov 4 2016 Toronto Raptors 96 Miami Heat 87 9
75 75 Fri Nov 4 2016 Miami Heat 87 Toronto Raptors 96 -9
1339 76 Fri Nov 4 2016 Utah Jazz 86 San Antonio Spurs 100 -14
76 76 Fri Nov 4 2016 San Antonio Spurs 100 Utah Jazz 86 14
77 77 Fri Nov 4 2016 Atlanta Hawks 92 Washington Wizards 95 -3
1340 77 Fri Nov 4 2016 Washington Wizards 95 Atlanta Hawks 92 3
78 78 Sat Nov 5 2016 Houston Rockets 97 Atlanta Hawks 112 -15
1341 78 Sat Nov 5 2016 Atlanta Hawks 112 Houston Rockets 97 15
79 79 Sat Nov 5 2016 Denver Nuggets 86 Detroit Pistons 103 -17
1342 79 Sat Nov 5 2016 Detroit Pistons 103 Denver Nuggets 86 17
80 80 Sat Nov 5 2016 Chicago Bulls 94 Indiana Pacers 111 -17
1343 80 Sat Nov 5 2016 Indiana Pacers 111 Chicago Bulls 94 17
81 81 Sat Nov 5 2016 Sacramento Kings 91 Milwaukee Bucks 117 -26
1344 81 Sat Nov 5 2016 Milwaukee Bucks 117 Sacramento Kings 91 26
82 82 Sat Nov 5 2016 Minnesota Timberwolves 92 Oklahoma City Thunder 112 -20
1345 82 Sat Nov 5 2016 Oklahoma City Thunder 112 Minnesota Timberwolves 92 20
83 83 Sat Nov 5 2016 Washington Wizards 86 Orlando Magic 88 -2
1346 83 Sat Nov 5 2016 Orlando Magic 88 Washington Wizards 86 2
84 84 Sat Nov 5 2016 Cleveland Cavaliers 102 Philadelphia 76ers 101 1
1347 84 Sat Nov 5 2016 Philadelphia 76ers 101 Cleveland Cavaliers 102 -1
85 85 Sat Nov 5 2016 Los Angeles Clippers 116 San Antonio Spurs 92 24
1348 85 Sat Nov 5 2016 San Antonio Spurs 92 Los Angeles Clippers 116 -24
1349 86 Sun Nov 6 2016 Boston Celtics 107 Denver Nuggets 123 -16
86 86 Sun Nov 6 2016 Denver Nuggets 123 Boston Celtics 107 16
87 87 Sun Nov 6 2016 Milwaukee Bucks 75 Dallas Mavericks 86 -11
1350 87 Sun Nov 6 2016 Dallas Mavericks 86 Milwaukee Bucks 75 11
88 88 Sun Nov 6 2016 Phoenix Suns 108 Los Angeles Lakers 119 -11
1351 88 Sun Nov 6 2016 Los Angeles Lakers 119 Phoenix Suns 108 11
89 89 Sun Nov 6 2016 Portland Trail Blazers 100 Memphis Grizzlies 94 6
1352 89 Sun Nov 6 2016 Memphis Grizzlies 94 Portland Trail Blazers 100 -6
90 90 Sun Nov 6 2016 Utah Jazz 114 New York Knicks 109 5
1353 90 Sun Nov 6 2016 New York Knicks 109 Utah Jazz 114 -5
1354 91 Sun Nov 6 2016 Toronto Raptors 91 Sacramento Kings 96 -5
91 91 Sun Nov 6 2016 Sacramento Kings 96 Toronto Raptors 91 5
1355 92 Mon Nov 7 2016 Chicago Bulls 112 Orlando Magic 80 32
92 92 Mon Nov 7 2016 Orlando Magic 80 Chicago Bulls 112 -32
93 93 Mon Nov 7 2016 Indiana Pacers 100 Charlotte Hornets 122 -22
1356 93 Mon Nov 7 2016 Charlotte Hornets 122 Indiana Pacers 100 22
94 94 Mon Nov 7 2016 New Orleans Pelicans 106 Golden State Warriors 116 -10
1357 94 Mon Nov 7 2016 Golden State Warriors 116 New Orleans Pelicans 106 10
1358 95 Mon Nov 7 2016 Los Angeles Clippers 114 Detroit Pistons 82 32
95 95 Mon Nov 7 2016 Detroit Pistons 82 Los Angeles Clippers 114 -32
1359 96 Mon Nov 7 2016 Oklahoma City Thunder 97 Miami Heat 85 12
96 96 Mon Nov 7 2016 Miami Heat 85 Oklahoma City Thunder 97 -12
1360 97 Mon Nov 7 2016 Philadelphia 76ers 84 Utah Jazz 109 -25
97 97 Mon Nov 7 2016 Utah Jazz 109 Philadelphia 76ers 84 25
1361 98 Mon Nov 7 2016 Washington Wizards 106 Houston Rockets 114 -8
98 98 Mon Nov 7 2016 Houston Rockets 114 Washington Wizards 106 8
1362 99 Tue Nov 8 2016 Brooklyn Nets 119 Minnesota Timberwolves 110 9
99 99 Tue Nov 8 2016 Minnesota Timberwolves 110 Brooklyn Nets 119 -9
100 100 Tue Nov 8 2016 Atlanta Hawks 110 Cleveland Cavaliers 106 4
1363 100 Tue Nov 8 2016 Cleveland Cavaliers 106 Atlanta Hawks 110 -4
101 101 Tue Nov 8 2016 Dallas Mavericks 109 Los Angeles Lakers 97 12
1364 101 Tue Nov 8 2016 Los Angeles Lakers 97 Dallas Mavericks 109 -12
1365 102 Tue Nov 8 2016 Memphis Grizzlies 108 Denver Nuggets 107 1
102 102 Tue Nov 8 2016 Denver Nuggets 107 Memphis Grizzlies 108 -1
1366 103 Tue Nov 8 2016 Portland Trail Blazers 124 Phoenix Suns 121 3
103 103 Tue Nov 8 2016 Phoenix Suns 121 Portland Trail Blazers 124 -3
104 104 Tue Nov 8 2016 New Orleans Pelicans 94 Sacramento Kings 102 -8
1367 104 Tue Nov 8 2016 Sacramento Kings 102 New Orleans Pelicans 94 8
1368 105 Wed Nov 9 2016 Atlanta Hawks 115 Chicago Bulls 107 8
105 105 Wed Nov 9 2016 Chicago Bulls 107 Atlanta Hawks 115 -8
106 106 Wed Nov 9 2016 Utah Jazz 98 Charlotte Hornets 104 -6
1369 106 Wed Nov 9 2016 Charlotte Hornets 104 Utah Jazz 98 6
1370 107 Wed Nov 9 2016 Golden State Warriors 116 Dallas Mavericks 95 21
107 107 Wed Nov 9 2016 Dallas Mavericks 95 Golden State Warriors 116 -21
1371 108 Wed Nov 9 2016 Indiana Pacers 122 Philadelphia 76ers 115 7
108 108 Wed Nov 9 2016 Philadelphia 76ers 115 Indiana Pacers 122 -7
109 109 Wed Nov 9 2016 Portland Trail Blazers 80 Los Angeles Clippers 111 -31
1372 109 Wed Nov 9 2016 Los Angeles Clippers 111 Portland Trail Blazers 80 31
110 110 Wed Nov 9 2016 Brooklyn Nets 96 New York Knicks 110 -14
1373 110 Wed Nov 9 2016 New York Knicks 110 Brooklyn Nets 96 14
111 111 Wed Nov 9 2016 Toronto Raptors 112 Oklahoma City Thunder 102 10
1374 111 Wed Nov 9 2016 Oklahoma City Thunder 102 Toronto Raptors 112 -10
112 112 Wed Nov 9 2016 Minnesota Timberwolves 123 Orlando Magic 107 16
1375 112 Wed Nov 9 2016 Orlando Magic 107 Minnesota Timberwolves 123 -16
113 113 Wed Nov 9 2016 Detroit Pistons 100 Phoenix Suns 107 -7
1376 113 Wed Nov 9 2016 Phoenix Suns 107 Detroit Pistons 100 7
114 114 Wed Nov 9 2016 Houston Rockets 101 San Antonio Spurs 99 2
1377 114 Wed Nov 9 2016 San Antonio Spurs 99 Houston Rockets 101 -2
115 115 Wed Nov 9 2016 Boston Celtics 93 Washington Wizards 118 -25
1378 115 Wed Nov 9 2016 Washington Wizards 118 Boston Celtics 93 25
116 116 Thu Nov 10 2016 Golden State Warriors 125 Denver Nuggets 101 24
1379 116 Thu Nov 10 2016 Denver Nuggets 101 Golden State Warriors 125 -24
117 117 Thu Nov 10 2016 Chicago Bulls 98 Miami Heat 95 3
1380 117 Thu Nov 10 2016 Miami Heat 95 Chicago Bulls 98 -3
118 118 Thu Nov 10 2016 New Orleans Pelicans 112 Milwaukee Bucks 106 6
1381 118 Thu Nov 10 2016 Milwaukee Bucks 106 New Orleans Pelicans 112 -6
119 119 Thu Nov 10 2016 Los Angeles Lakers 101 Sacramento Kings 91 10
1382 119 Thu Nov 10 2016 Sacramento Kings 91 Los Angeles Lakers 101 -10
120 120 Fri Nov 11 2016 New York Knicks 87 Boston Celtics 115 -28
1383 120 Fri Nov 11 2016 Boston Celtics 115 New York Knicks 87 28
121 121 Fri Nov 11 2016 Toronto Raptors 113 Charlotte Hornets 111 2
1384 121 Fri Nov 11 2016 Charlotte Hornets 111 Toronto Raptors 113 -2
122 122 Fri Nov 11 2016 Los Angeles Clippers 110 Oklahoma City Thunder 108 2
1385 122 Fri Nov 11 2016 Oklahoma City Thunder 108 Los Angeles Clippers 110 -2
123 123 Fri Nov 11 2016 Utah Jazz 87 Orlando Magic 74 13
1386 123 Fri Nov 11 2016 Orlando Magic 74 Utah Jazz 87 -13
1387 124 Fri Nov 11 2016 Philadelphia 76ers 109 Indiana Pacers 105 4
124 124 Fri Nov 11 2016 Indiana Pacers 105 Philadelphia 76ers 109 -4
125 125 Fri Nov 11 2016 Sacramento Kings 120 Portland Trail Blazers 122 -2
1388 125 Fri Nov 11 2016 Portland Trail Blazers 122 Sacramento Kings 120 2
1389 126 Fri Nov 11 2016 San Antonio Spurs 96 Detroit Pistons 86 10
126 126 Fri Nov 11 2016 Detroit Pistons 86 San Antonio Spurs 96 -10
127 127 Fri Nov 11 2016 Cleveland Cavaliers 105 Washington Wizards 94 11
1390 127 Fri Nov 11 2016 Washington Wizards 94 Cleveland Cavaliers 105 -11
1391 128 Sat Nov 12 2016 Atlanta Hawks 117 Philadelphia 76ers 96 21
128 128 Sat Nov 12 2016 Philadelphia 76ers 96 Atlanta Hawks 117 -21
129 129 Sat Nov 12 2016 Washington Wizards 95 Chicago Bulls 106 -11
1392 129 Sat Nov 12 2016 Chicago Bulls 106 Washington Wizards 95 11
130 130 Sat Nov 12 2016 Detroit Pistons 106 Denver Nuggets 95 11
1393 130 Sat Nov 12 2016 Denver Nuggets 95 Detroit Pistons 106 -11
1394 131 Sat Nov 12 2016 Houston Rockets 100 San Antonio Spurs 106 -6
131 131 Sat Nov 12 2016 San Antonio Spurs 106 Houston Rockets 100 6
1395 132 Sat Nov 12 2016 Indiana Pacers 99 Boston Celtics 105 -6
132 132 Sat Nov 12 2016 Boston Celtics 105 Indiana Pacers 99 6
133 133 Sat Nov 12 2016 Utah Jazz 102 Miami Heat 91 11
1396 133 Sat Nov 12 2016 Miami Heat 91 Utah Jazz 102 -11
134 134 Sat Nov 12 2016 Memphis Grizzlies 96 Milwaukee Bucks 106 -10
1397 134 Sat Nov 12 2016 Milwaukee Bucks 106 Memphis Grizzlies 96 10
1398 135 Sat Nov 12 2016 Minnesota Timberwolves 105 Los Angeles Clippers 119 -14
135 135 Sat Nov 12 2016 Los Angeles Clippers 119 Minnesota Timberwolves 105 14
1399 136 Sat Nov 12 2016 New Orleans Pelicans 99 Los Angeles Lakers 126 -27
136 136 Sat Nov 12 2016 Los Angeles Lakers 126 New Orleans Pelicans 99 27
1400 137 Sat Nov 12 2016 Phoenix Suns 104 Brooklyn Nets 122 -18
137 137 Sat Nov 12 2016 Brooklyn Nets 122 Phoenix Suns 104 18
1401 138 Sat Nov 12 2016 Toronto Raptors 118 New York Knicks 107 11
138 138 Sat Nov 12 2016 New York Knicks 107 Toronto Raptors 118 -11
1402 139 Sun Nov 13 2016 Cleveland Cavaliers 100 Charlotte Hornets 93 7
139 139 Sun Nov 13 2016 Charlotte Hornets 93 Cleveland Cavaliers 100 -7
1403 140 Sun Nov 13 2016 Golden State Warriors 133 Phoenix Suns 120 13
140 140 Sun Nov 13 2016 Phoenix Suns 120 Golden State Warriors 133 -13
141 141 Sun Nov 13 2016 Los Angeles Lakers 99 Minnesota Timberwolves 125 -26
1404 141 Sun Nov 13 2016 Minnesota Timberwolves 125 Los Angeles Lakers 99 26
142 142 Sun Nov 13 2016 Orlando Magic 119 Oklahoma City Thunder 117 2
1405 142 Sun Nov 13 2016 Oklahoma City Thunder 117 Orlando Magic 119 -2
1406 143 Sun Nov 13 2016 Portland Trail Blazers 112 Denver Nuggets 105 7
143 143 Sun Nov 13 2016 Denver Nuggets 105 Portland Trail Blazers 112 -7
1407 144 Mon Nov 14 2016 Detroit Pistons 104 Oklahoma City Thunder 88 16
144 144 Mon Nov 14 2016 Oklahoma City Thunder 88 Detroit Pistons 104 -16
1408 145 Mon Nov 14 2016 Houston Rockets 115 Philadelphia 76ers 88 27
145 145 Mon Nov 14 2016 Philadelphia 76ers 88 Houston Rockets 115 -27
146 146 Mon Nov 14 2016 Orlando Magic 69 Indiana Pacers 88 -19
1409 146 Mon Nov 14 2016 Indiana Pacers 88 Orlando Magic 69 19
1410 147 Mon Nov 14 2016 Los Angeles Clippers 127 Brooklyn Nets 95 32
147 147 Mon Nov 14 2016 Brooklyn Nets 95 Los Angeles Clippers 127 -32
148 148 Mon Nov 14 2016 Boston Celtics 105 New Orleans Pelicans 106 -1
1411 148 Mon Nov 14 2016 New Orleans Pelicans 106 Boston Celtics 105 1
1412 149 Mon Nov 14 2016 New York Knicks 93 Dallas Mavericks 77 16
149 149 Mon Nov 14 2016 Dallas Mavericks 77 New York Knicks 93 -16
1413 150 Mon Nov 14 2016 San Antonio Spurs 94 Miami Heat 90 4
150 150 Mon Nov 14 2016 Miami Heat 90 San Antonio Spurs 94 -4
151 151 Mon Nov 14 2016 Memphis Grizzlies 102 Utah Jazz 96 6
1414 151 Mon Nov 14 2016 Utah Jazz 96 Memphis Grizzlies 102 -6
152 152 Tue Nov 15 2016 Toronto Raptors 117 Cleveland Cavaliers 121 -4
1415 152 Tue Nov 15 2016 Cleveland Cavaliers 121 Toronto Raptors 117 4
153 153 Tue Nov 15 2016 Brooklyn Nets 118 Los Angeles Lakers 125 -7
1416 153 Tue Nov 15 2016 Los Angeles Lakers 125 Brooklyn Nets 118 7
154 154 Tue Nov 15 2016 Atlanta Hawks 93 Miami Heat 90 3
1417 154 Tue Nov 15 2016 Miami Heat 90 Atlanta Hawks 93 -3
1418 155 Tue Nov 15 2016 Minnesota Timberwolves 108 Charlotte Hornets 115 -7
155 155 Tue Nov 15 2016 Charlotte Hornets 115 Minnesota Timberwolves 108 7
156 156 Tue Nov 15 2016 Chicago Bulls 113 Portland Trail Blazers 88 25
1419 156 Tue Nov 15 2016 Portland Trail Blazers 88 Chicago Bulls 113 -25
1420 157 Wed Nov 16 2016 Atlanta Hawks 107 Milwaukee Bucks 100 7
157 157 Wed Nov 16 2016 Milwaukee Bucks 100 Atlanta Hawks 107 -7
1421 158 Wed Nov 16 2016 Boston Celtics 90 Dallas Mavericks 83 7
158 158 Wed Nov 16 2016 Dallas Mavericks 83 Boston Celtics 90 -7
1422 159 Wed Nov 16 2016 Denver Nuggets 120 Phoenix Suns 104 16
159 159 Wed Nov 16 2016 Phoenix Suns 104 Denver Nuggets 120 -16
160 160 Wed Nov 16 2016 Cleveland Cavaliers 93 Indiana Pacers 103 -10
1423 160 Wed Nov 16 2016 Indiana Pacers 103 Cleveland Cavaliers 93 10
1424 161 Wed Nov 16 2016 Los Angeles Clippers 107 Memphis Grizzlies 111 -4
161 161 Wed Nov 16 2016 Memphis Grizzlies 111 Los Angeles Clippers 107 4
162 162 Wed Nov 16 2016 Detroit Pistons 102 New York Knicks 105 -3
1425 162 Wed Nov 16 2016 New York Knicks 105 Detroit Pistons 102 3
163 163 Wed Nov 16 2016 Houston Rockets 103 Oklahoma City Thunder 105 -2
1426 163 Wed Nov 16 2016 Oklahoma City Thunder 105 Houston Rockets 103 2
164 164 Wed Nov 16 2016 New Orleans Pelicans 82 Orlando Magic 89 -7
1427 164 Wed Nov 16 2016 Orlando Magic 89 New Orleans Pelicans 82 7
165 165 Wed Nov 16 2016 Washington Wizards 102 Philadelphia 76ers 109 -7
1428 165 Wed Nov 16 2016 Philadelphia 76ers 109 Washington Wizards 102 7
166 166 Wed Nov 16 2016 San Antonio Spurs 110 Sacramento Kings 105 5
1429 166 Wed Nov 16 2016 Sacramento Kings 105 San Antonio Spurs 110 -5
167 167 Wed Nov 16 2016 Golden State Warriors 127 Toronto Raptors 121 6
1430 167 Wed Nov 16 2016 Toronto Raptors 121 Golden State Warriors 127 -6
168 168 Thu Nov 17 2016 Portland Trail Blazers 109 Houston Rockets 126 -17
1431 168 Thu Nov 17 2016 Houston Rockets 126 Portland Trail Blazers 109 17
1432 169 Thu Nov 17 2016 Miami Heat 96 Milwaukee Bucks 73 23
169 169 Thu Nov 17 2016 Milwaukee Bucks 73 Miami Heat 96 -23
1433 170 Thu Nov 17 2016 Minnesota Timberwolves 110 Philadelphia 76ers 86 24
170 170 Thu Nov 17 2016 Philadelphia 76ers 86 Minnesota Timberwolves 110 -24
1434 171 Thu Nov 17 2016 Utah Jazz 77 Chicago Bulls 85 -8
171 171 Thu Nov 17 2016 Chicago Bulls 85 Utah Jazz 77 8
1435 172 Thu Nov 17 2016 Washington Wizards 119 New York Knicks 112 7
172 172 Thu Nov 17 2016 New York Knicks 112 Washington Wizards 119 -7
1436 173 Fri Nov 18 2016 Boston Celtics 88 Golden State Warriors 104 -16
173 173 Fri Nov 18 2016 Golden State Warriors 104 Boston Celtics 88 16
1437 174 Fri Nov 18 2016 Charlotte Hornets 100 Atlanta Hawks 96 4
174 174 Fri Nov 18 2016 Atlanta Hawks 96 Charlotte Hornets 100 -4
1438 175 Fri Nov 18 2016 Cleveland Cavaliers 104 Detroit Pistons 81 23
175 175 Fri Nov 18 2016 Detroit Pistons 81 Cleveland Cavaliers 104 -23
1439 176 Fri Nov 18 2016 Dallas Mavericks 64 Memphis Grizzlies 80 -16
176 176 Fri Nov 18 2016 Memphis Grizzlies 80 Dallas Mavericks 64 16
1440 177 Fri Nov 18 2016 Denver Nuggets 111 Toronto Raptors 113 -2
177 177 Fri Nov 18 2016 Toronto Raptors 113 Denver Nuggets 111 2
1441 178 Fri Nov 18 2016 Indiana Pacers 96 Phoenix Suns 116 -20
178 178 Fri Nov 18 2016 Phoenix Suns 116 Indiana Pacers 96 20
1442 179 Fri Nov 18 2016 Los Angeles Lakers 107 San Antonio Spurs 116 -9
179 179 Fri Nov 18 2016 San Antonio Spurs 116 Los Angeles Lakers 107 9
180 180 Fri Nov 18 2016 Portland Trail Blazers 101 New Orleans Pelicans 113 -12
1443 180 Fri Nov 18 2016 New Orleans Pelicans 113 Portland Trail Blazers 101 12
181 181 Fri Nov 18 2016 Brooklyn Nets 105 Oklahoma City Thunder 124 -19
1444 181 Fri Nov 18 2016 Oklahoma City Thunder 124 Brooklyn Nets 105 19
182 182 Fri Nov 18 2016 Los Angeles Clippers 121 Sacramento Kings 115 6
1445 182 Fri Nov 18 2016 Sacramento Kings 115 Los Angeles Clippers 121 -6
183 183 Sat Nov 19 2016 Boston Celtics 94 Detroit Pistons 92 2
1446 183 Sat Nov 19 2016 Detroit Pistons 92 Boston Celtics 94 -2
184 184 Sat Nov 19 2016 Utah Jazz 102 Houston Rockets 111 -9
1447 184 Sat Nov 19 2016 Houston Rockets 111 Utah Jazz 102 9
185 185 Sat Nov 19 2016 Chicago Bulls 95 Los Angeles Clippers 102 -7
1448 185 Sat Nov 19 2016 Los Angeles Clippers 102 Chicago Bulls 95 7
186 186 Sat Nov 19 2016 Minnesota Timberwolves 71 Memphis Grizzlies 93 -22
1449 186 Sat Nov 19 2016 Memphis Grizzlies 93 Minnesota Timberwolves 71 22
1450 187 Sat Nov 19 2016 Milwaukee Bucks 121 Golden State Warriors 124 -3
187 187 Sat Nov 19 2016 Golden State Warriors 124 Milwaukee Bucks 121 3
1451 188 Sat Nov 19 2016 New Orleans Pelicans 121 Charlotte Hornets 116 5
188 188 Sat Nov 19 2016 Charlotte Hornets 116 New Orleans Pelicans 121 -5
189 189 Sat Nov 19 2016 Dallas Mavericks 87 Orlando Magic 95 -8
1452 189 Sat Nov 19 2016 Orlando Magic 95 Dallas Mavericks 87 8
1453 190 Sat Nov 19 2016 Philadelphia 76ers 120 Phoenix Suns 105 15
190 190 Sat Nov 19 2016 Phoenix Suns 105 Philadelphia 76ers 120 -15
191 191 Sat Nov 19 2016 Miami Heat 114 Washington Wizards 111 3
1454 191 Sat Nov 19 2016 Washington Wizards 111 Miami Heat 114 -3
192 192 Sun Nov 20 2016 Portland Trail Blazers 129 Brooklyn Nets 109 20
1455 192 Sun Nov 20 2016 Brooklyn Nets 109 Portland Trail Blazers 129 -20
1456 193 Sun Nov 20 2016 Denver Nuggets 105 Utah Jazz 91 14
193 193 Sun Nov 20 2016 Utah Jazz 91 Denver Nuggets 105 -14
194 194 Sun Nov 20 2016 Chicago Bulls 118 Los Angeles Lakers 110 8
1457 194 Sun Nov 20 2016 Los Angeles Lakers 110 Chicago Bulls 118 -8
195 195 Sun Nov 20 2016 Atlanta Hawks 94 New York Knicks 104 -10
1458 195 Sun Nov 20 2016 New York Knicks 104 Atlanta Hawks 94 10
1459 196 Sun Nov 20 2016 Oklahoma City Thunder 111 Indiana Pacers 115 -4
196 196 Sun Nov 20 2016 Indiana Pacers 115 Oklahoma City Thunder 111 4
197 197 Sun Nov 20 2016 Toronto Raptors 99 Sacramento Kings 102 -3
1460 197 Sun Nov 20 2016 Sacramento Kings 102 Toronto Raptors 99 3
1461 198 Mon Nov 21 2016 Charlotte Hornets 90 Memphis Grizzlies 105 -15
198 198 Mon Nov 21 2016 Memphis Grizzlies 105 Charlotte Hornets 90 15
1462 199 Mon Nov 21 2016 Detroit Pistons 96 Houston Rockets 99 -3
199 199 Mon Nov 21 2016 Houston Rockets 99 Detroit Pistons 96 3
1463 200 Mon Nov 21 2016 Indiana Pacers 83 Golden State Warriors 120 -37
200 200 Mon Nov 21 2016 Golden State Warriors 120 Indiana Pacers 83 37
1464 201 Mon Nov 21 2016 Los Angeles Clippers 123 Toronto Raptors 115 8
201 201 Mon Nov 21 2016 Toronto Raptors 115 Los Angeles Clippers 123 -8
202 202 Mon Nov 21 2016 Orlando Magic 89 Milwaukee Bucks 93 -4
1465 202 Mon Nov 21 2016 Milwaukee Bucks 93 Orlando Magic 89 4
203 203 Mon Nov 21 2016 Boston Celtics 99 Minnesota Timberwolves 93 6
1466 203 Mon Nov 21 2016 Minnesota Timberwolves 93 Boston Celtics 99 -6
204 204 Mon Nov 21 2016 Miami Heat 94 Philadelphia 76ers 101 -7
1467 204 Mon Nov 21 2016 Philadelphia 76ers 101 Miami Heat 94 7
205 205 Mon Nov 21 2016 Dallas Mavericks 91 San Antonio Spurs 96 -5
1468 205 Mon Nov 21 2016 San Antonio Spurs 96 Dallas Mavericks 91 5
206 206 Mon Nov 21 2016 Phoenix Suns 101 Washington Wizards 106 -5
1469 206 Mon Nov 21 2016 Washington Wizards 106 Phoenix Suns 101 5
1470 207 Tue Nov 22 2016 Atlanta Hawks 94 New Orleans Pelicans 112 -18
207 207 Tue Nov 22 2016 New Orleans Pelicans 112 Atlanta Hawks 94 18
1471 208 Tue Nov 22 2016 Denver Nuggets 110 Chicago Bulls 107 3
208 208 Tue Nov 22 2016 Chicago Bulls 107 Denver Nuggets 110 -3
1472 209 Tue Nov 22 2016 Los Angeles Lakers 111 Oklahoma City Thunder 109 2
209 209 Tue Nov 22 2016 Oklahoma City Thunder 109 Los Angeles Lakers 111 -2
1473 210 Tue Nov 22 2016 New York Knicks 107 Portland Trail Blazers 103 4
210 210 Tue Nov 22 2016 Portland Trail Blazers 103 New York Knicks 107 -4
1474 211 Wed Nov 23 2016 Brooklyn Nets 92 Boston Celtics 111 -19
211 211 Wed Nov 23 2016 Boston Celtics 111 Brooklyn Nets 92 19
1475 212 Wed Nov 23 2016 Charlotte Hornets 114 San Antonio Spurs 119 -5
212 212 Wed Nov 23 2016 San Antonio Spurs 119 Charlotte Hornets 114 5
1476 213 Wed Nov 23 2016 Cleveland Cavaliers 137 Portland Trail Blazers 125 12
213 213 Wed Nov 23 2016 Portland Trail Blazers 125 Cleveland Cavaliers 137 -12
1477 214 Wed Nov 23 2016 Dallas Mavericks 104 Los Angeles Clippers 124 -20
214 214 Wed Nov 23 2016 Los Angeles Clippers 124 Dallas Mavericks 104 20
215 215 Wed Nov 23 2016 Miami Heat 84 Detroit Pistons 107 -23
1478 215 Wed Nov 23 2016 Detroit Pistons 107 Miami Heat 84 23
216 216 Wed Nov 23 2016 Los Angeles Lakers 106 Golden State Warriors 149 -43
1479 216 Wed Nov 23 2016 Golden State Warriors 149 Los Angeles Lakers 106 43
1480 217 Wed Nov 23 2016 Houston Rockets 102 Toronto Raptors 115 -13
217 217 Wed Nov 23 2016 Toronto Raptors 115 Houston Rockets 102 13
218 218 Wed Nov 23 2016 Atlanta Hawks 96 Indiana Pacers 85 11
1481 218 Wed Nov 23 2016 Indiana Pacers 85 Atlanta Hawks 96 -11
219 219 Wed Nov 23 2016 Minnesota Timberwolves 96 New Orleans Pelicans 117 -21
1482 219 Wed Nov 23 2016 New Orleans Pelicans 117 Minnesota Timberwolves 96 21
220 220 Wed Nov 23 2016 Phoenix Suns 92 Orlando Magic 87 5
1483 220 Wed Nov 23 2016 Orlando Magic 87 Phoenix Suns 92 -5
1484 221 Wed Nov 23 2016 Philadelphia 76ers 99 Memphis Grizzlies 104 -5
221 221 Wed Nov 23 2016 Memphis Grizzlies 104 Philadelphia 76ers 99 5
1485 222 Wed Nov 23 2016 Sacramento Kings 116 Oklahoma City Thunder 101 15
222 222 Wed Nov 23 2016 Oklahoma City Thunder 101 Sacramento Kings 116 -15
1486 223 Wed Nov 23 2016 Utah Jazz 108 Denver Nuggets 83 25
223 223 Wed Nov 23 2016 Denver Nuggets 83 Utah Jazz 108 -25
224 224 Fri Nov 25 2016 San Antonio Spurs 109 Boston Celtics 103 6
1487 224 Fri Nov 25 2016 Boston Celtics 103 San Antonio Spurs 109 -6
1488 225 Fri Nov 25 2016 Cleveland Cavaliers 128 Dallas Mavericks 90 38
225 225 Fri Nov 25 2016 Dallas Mavericks 90 Cleveland Cavaliers 128 -38
1489 226 Fri Nov 25 2016 Denver Nuggets 129 Oklahoma City Thunder 132 -3
226 226 Fri Nov 25 2016 Oklahoma City Thunder 132 Denver Nuggets 129 3
227 227 Fri Nov 25 2016 Los Angeles Clippers 97 Detroit Pistons 108 -11
1490 227 Fri Nov 25 2016 Detroit Pistons 108 Los Angeles Clippers 97 11
1491 228 Fri Nov 25 2016 Indiana Pacers 118 Brooklyn Nets 97 21
228 228 Fri Nov 25 2016 Brooklyn Nets 97 Indiana Pacers 118 -21
1492 229 Fri Nov 25 2016 Los Angeles Lakers 85 Golden State Warriors 109 -24
229 229 Fri Nov 25 2016 Golden State Warriors 109 Los Angeles Lakers 85 24
230 230 Fri Nov 25 2016 Miami Heat 90 Memphis Grizzlies 81 9
1493 230 Fri Nov 25 2016 Memphis Grizzlies 81 Miami Heat 90 -9
1494 231 Fri Nov 25 2016 Milwaukee Bucks 99 Toronto Raptors 105 -6
231 231 Fri Nov 25 2016 Toronto Raptors 105 Milwaukee Bucks 99 6
232 232 Fri Nov 25 2016 Charlotte Hornets 111 New York Knicks 113 -2
1495 232 Fri Nov 25 2016 New York Knicks 113 Charlotte Hornets 111 2
1496 233 Fri Nov 25 2016 Orlando Magic 91 Washington Wizards 94 -3
233 233 Fri Nov 25 2016 Washington Wizards 94 Orlando Magic 91 3
234 234 Fri Nov 25 2016 Chicago Bulls 105 Philadelphia 76ers 89 16
1497 234 Fri Nov 25 2016 Philadelphia 76ers 89 Chicago Bulls 105 -16
1498 235 Fri Nov 25 2016 Phoenix Suns 85 Minnesota Timberwolves 98 -13
235 235 Fri Nov 25 2016 Minnesota Timberwolves 98 Phoenix Suns 85 13
1499 236 Fri Nov 25 2016 Portland Trail Blazers 119 New Orleans Pelicans 104 15
236 236 Fri Nov 25 2016 New Orleans Pelicans 104 Portland Trail Blazers 119 -15
237 237 Fri Nov 25 2016 Houston Rockets 117 Sacramento Kings 104 13
1500 237 Fri Nov 25 2016 Sacramento Kings 104 Houston Rockets 117 -13
1501 238 Fri Nov 25 2016 Utah Jazz 95 Atlanta Hawks 68 27
238 238 Fri Nov 25 2016 Atlanta Hawks 68 Utah Jazz 95 -27
239 239 Sat Nov 26 2016 New York Knicks 102 Charlotte Hornets 107 -5
1502 239 Sat Nov 26 2016 Charlotte Hornets 107 New York Knicks 102 5
1503 240 Sat Nov 26 2016 Golden State Warriors 115 Minnesota Timberwolves 102 13
240 240 Sat Nov 26 2016 Minnesota Timberwolves 102 Golden State Warriors 115 -13
1504 241 Sat Nov 26 2016 Miami Heat 107 Memphis Grizzlies 110 -3
241 241 Sat Nov 26 2016 Memphis Grizzlies 110 Miami Heat 107 3
1505 242 Sat Nov 26 2016 Oklahoma City Thunder 106 Detroit Pistons 88 18
242 242 Sat Nov 26 2016 Detroit Pistons 88 Oklahoma City Thunder 106 -18
1506 243 Sat Nov 26 2016 Washington Wizards 100 San Antonio Spurs 112 -12
243 243 Sat Nov 26 2016 San Antonio Spurs 112 Washington Wizards 100 12
1507 244 Sun Nov 27 2016 Brooklyn Nets 105 Sacramento Kings 122 -17
244 244 Sun Nov 27 2016 Sacramento Kings 122 Brooklyn Nets 105 17
1508 245 Sun Nov 27 2016 Dallas Mavericks 91 New Orleans Pelicans 81 10
245 245 Sun Nov 27 2016 New Orleans Pelicans 81 Dallas Mavericks 91 -10
1509 246 Sun Nov 27 2016 Indiana Pacers 91 Los Angeles Clippers 70 21
246 246 Sun Nov 27 2016 Los Angeles Clippers 70 Indiana Pacers 91 -21
1510 247 Sun Nov 27 2016 Los Angeles Lakers 109 Atlanta Hawks 94 15
247 247 Sun Nov 27 2016 Atlanta Hawks 94 Los Angeles Lakers 109 -15
248 248 Sun Nov 27 2016 Milwaukee Bucks 104 Orlando Magic 96 8
1511 248 Sun Nov 27 2016 Orlando Magic 96 Milwaukee Bucks 104 -8
249 249 Sun Nov 27 2016 Cleveland Cavaliers 112 Philadelphia 76ers 108 4
1512 249 Sun Nov 27 2016 Philadelphia 76ers 108 Cleveland Cavaliers 112 -4
250 250 Sun Nov 27 2016 Denver Nuggets 120 Phoenix Suns 114 6
1513 250 Sun Nov 27 2016 Phoenix Suns 114 Denver Nuggets 120 -6
251 251 Sun Nov 27 2016 Houston Rockets 130 Portland Trail Blazers 114 16
1514 251 Sun Nov 27 2016 Portland Trail Blazers 114 Houston Rockets 130 -16
252 252 Mon Nov 28 2016 Atlanta Hawks 100 Golden State Warriors 105 -5
1515 252 Mon Nov 28 2016 Golden State Warriors 105 Atlanta Hawks 100 5
1516 253 Mon Nov 28 2016 Memphis Grizzlies 85 Charlotte Hornets 104 -19
253 253 Mon Nov 28 2016 Charlotte Hornets 104 Memphis Grizzlies 85 19
254 254 Mon Nov 28 2016 Boston Celtics 112 Miami Heat 104 8
1517 254 Mon Nov 28 2016 Miami Heat 104 Boston Celtics 112 -8
1518 255 Mon Nov 28 2016 Minnesota Timberwolves 103 Utah Jazz 112 -9
255 255 Mon Nov 28 2016 Utah Jazz 112 Minnesota Timberwolves 103 9
256 256 Mon Nov 28 2016 Oklahoma City Thunder 112 New York Knicks 103 9
1519 256 Mon Nov 28 2016 New York Knicks 103 Oklahoma City Thunder 112 -9
257 257 Mon Nov 28 2016 Philadelphia 76ers 95 Toronto Raptors 122 -27
1520 257 Mon Nov 28 2016 Toronto Raptors 122 Philadelphia 76ers 95 27
1521 258 Mon Nov 28 2016 Washington Wizards 101 Sacramento Kings 95 6
258 258 Mon Nov 28 2016 Sacramento Kings 95 Washington Wizards 101 -6
259 259 Tue Nov 29 2016 Los Angeles Clippers 122 Brooklyn Nets 127 -5
1522 259 Tue Nov 29 2016 Brooklyn Nets 127 Los Angeles Clippers 122 5
260 260 Tue Nov 29 2016 Detroit Pistons 112 Charlotte Hornets 89 23
1523 260 Tue Nov 29 2016 Charlotte Hornets 89 Detroit Pistons 112 -23
261 261 Tue Nov 29 2016 Cleveland Cavaliers 101 Milwaukee Bucks 118 -17
1524 261 Tue Nov 29 2016 Milwaukee Bucks 118 Cleveland Cavaliers 101 17
262 262 Tue Nov 29 2016 Los Angeles Lakers 88 New Orleans Pelicans 105 -17
1525 262 Tue Nov 29 2016 New Orleans Pelicans 105 Los Angeles Lakers 88 17
263 263 Tue Nov 29 2016 Orlando Magic 95 San Antonio Spurs 83 12
1526 263 Tue Nov 29 2016 San Antonio Spurs 83 Orlando Magic 95 -12
1527 264 Tue Nov 29 2016 Utah Jazz 120 Houston Rockets 101 19
264 264 Tue Nov 29 2016 Houston Rockets 101 Utah Jazz 120 -19
1528 265 Wed Nov 30 2016 Boston Celtics 114 Detroit Pistons 121 -7
265 265 Wed Nov 30 2016 Detroit Pistons 121 Boston Celtics 114 7
1529 266 Wed Nov 30 2016 Chicago Bulls 90 Los Angeles Lakers 96 -6
266 266 Wed Nov 30 2016 Los Angeles Lakers 96 Chicago Bulls 90 6
1530 267 Wed Nov 30 2016 Dallas Mavericks 87 San Antonio Spurs 94 -7
267 267 Wed Nov 30 2016 San Antonio Spurs 94 Dallas Mavericks 87 7
268 268 Wed Nov 30 2016 Miami Heat 106 Denver Nuggets 98 8
1531 268 Wed Nov 30 2016 Denver Nuggets 98 Miami Heat 106 -8
1532 269 Wed Nov 30 2016 Minnesota Timberwolves 104 New York Knicks 106 -2
269 269 Wed Nov 30 2016 New York Knicks 106 Minnesota Timberwolves 104 2
1533 270 Wed Nov 30 2016 Oklahoma City Thunder 126 Washington Wizards 115 11
270 270 Wed Nov 30 2016 Washington Wizards 115 Oklahoma City Thunder 126 -11
271 271 Wed Nov 30 2016 Atlanta Hawks 107 Phoenix Suns 109 -2
1534 271 Wed Nov 30 2016 Phoenix Suns 109 Atlanta Hawks 107 2
272 272 Wed Nov 30 2016 Indiana Pacers 109 Portland Trail Blazers 131 -22
1535 272 Wed Nov 30 2016 Portland Trail Blazers 131 Indiana Pacers 109 22
273 273 Wed Nov 30 2016 Memphis Grizzlies 105 Toronto Raptors 120 -15
1536 273 Wed Nov 30 2016 Toronto Raptors 120 Memphis Grizzlies 105 15
274 274 Thu Dec 1 2016 Milwaukee Bucks 111 Brooklyn Nets 93 18
1537 274 Thu Dec 1 2016 Brooklyn Nets 93 Milwaukee Bucks 111 -18
275 275 Thu Dec 1 2016 Dallas Mavericks 87 Charlotte Hornets 97 -10
1538 275 Thu Dec 1 2016 Charlotte Hornets 97 Dallas Mavericks 87 10
1539 276 Thu Dec 1 2016 Cleveland Cavaliers 94 Los Angeles Clippers 113 -19
276 276 Thu Dec 1 2016 Los Angeles Clippers 113 Cleveland Cavaliers 94 19
1540 277 Thu Dec 1 2016 Golden State Warriors 127 Houston Rockets 132 -5
277 277 Thu Dec 1 2016 Houston Rockets 132 Golden State Warriors 127 5
1541 278 Thu Dec 1 2016 Memphis Grizzlies 95 Orlando Magic 94 1
278 278 Thu Dec 1 2016 Orlando Magic 94 Memphis Grizzlies 95 -1
1542 279 Thu Dec 1 2016 Utah Jazz 110 Miami Heat 111 -1
279 279 Thu Dec 1 2016 Miami Heat 111 Utah Jazz 110 1
1543 280 Fri Dec 2 2016 Atlanta Hawks 85 Detroit Pistons 121 -36
280 280 Fri Dec 2 2016 Detroit Pistons 121 Atlanta Hawks 85 36
281 281 Fri Dec 2 2016 Sacramento Kings 92 Boston Celtics 97 -5
1544 281 Fri Dec 2 2016 Boston Celtics 97 Sacramento Kings 92 5
282 282 Fri Dec 2 2016 Cleveland Cavaliers 105 Chicago Bulls 111 -6
1545 282 Fri Dec 2 2016 Chicago Bulls 111 Cleveland Cavaliers 105 6
1546 283 Fri Dec 2 2016 Denver Nuggets 110 Houston Rockets 128 -18
283 283 Fri Dec 2 2016 Houston Rockets 128 Denver Nuggets 110 18
1547 284 Fri Dec 2 2016 New Orleans Pelicans 96 Los Angeles Clippers 114 -18
284 284 Fri Dec 2 2016 Los Angeles Clippers 114 New Orleans Pelicans 96 18
285 285 Fri Dec 2 2016 Minnesota Timberwolves 114 New York Knicks 118 -4
1548 285 Fri Dec 2 2016 New York Knicks 118 Minnesota Timberwolves 114 4
286 286 Fri Dec 2 2016 Orlando Magic 105 Philadelphia 76ers 88 17
1549 286 Fri Dec 2 2016 Philadelphia 76ers 88 Orlando Magic 105 -17
1550 287 Fri Dec 2 2016 San Antonio Spurs 107 Washington Wizards 105 2
287 287 Fri Dec 2 2016 Washington Wizards 105 San Antonio Spurs 107 -2
1551 288 Fri Dec 2 2016 Toronto Raptors 113 Los Angeles Lakers 80 33
288 288 Fri Dec 2 2016 Los Angeles Lakers 80 Toronto Raptors 113 -33
1552 289 Sat Dec 3 2016 Charlotte Hornets 120 Minnesota Timberwolves 125 -5
289 289 Sat Dec 3 2016 Minnesota Timberwolves 125 Charlotte Hornets 120 5
1553 290 Sat Dec 3 2016 Dallas Mavericks 107 Chicago Bulls 82 25
290 290 Sat Dec 3 2016 Chicago Bulls 82 Dallas Mavericks 107 -25
291 291 Sat Dec 3 2016 Phoenix Suns 109 Golden State Warriors 138 -29
1554 291 Sat Dec 3 2016 Golden State Warriors 138 Phoenix Suns 109 29
1555 292 Sat Dec 3 2016 Memphis Grizzlies 103 Los Angeles Lakers 100 3
292 292 Sat Dec 3 2016 Los Angeles Lakers 100 Memphis Grizzlies 103 -3
1556 293 Sat Dec 3 2016 Milwaukee Bucks 112 Brooklyn Nets 103 9
293 293 Sat Dec 3 2016 Brooklyn Nets 103 Milwaukee Bucks 112 -9
1557 294 Sat Dec 3 2016 Philadelphia 76ers 106 Boston Celtics 107 -1
294 294 Sat Dec 3 2016 Boston Celtics 107 Philadelphia 76ers 106 1
1558 295 Sat Dec 3 2016 Portland Trail Blazers 99 Miami Heat 92 7
295 295 Sat Dec 3 2016 Miami Heat 92 Portland Trail Blazers 99 -7
296 296 Sat Dec 3 2016 Atlanta Hawks 84 Toronto Raptors 128 -44
1559 296 Sat Dec 3 2016 Toronto Raptors 128 Atlanta Hawks 84 44
297 297 Sat Dec 3 2016 Denver Nuggets 98 Utah Jazz 105 -7
1560 297 Sat Dec 3 2016 Utah Jazz 105 Denver Nuggets 98 7
1561 298 Sun Dec 4 2016 Detroit Pistons 92 Orlando Magic 98 -6
298 298 Sun Dec 4 2016 Orlando Magic 98 Detroit Pistons 92 6
1562 299 Sun Dec 4 2016 Los Angeles Clippers 102 Indiana Pacers 111 -9
299 299 Sun Dec 4 2016 Indiana Pacers 111 Los Angeles Clippers 102 9
300 300 Sun Dec 4 2016 Sacramento Kings 98 New York Knicks 106 -8
1563 300 Sun Dec 4 2016 New York Knicks 106 Sacramento Kings 98 8
301 301 Sun Dec 4 2016 New Orleans Pelicans 92 Oklahoma City Thunder 101 -9
1564 301 Sun Dec 4 2016 Oklahoma City Thunder 101 New Orleans Pelicans 92 9
302 302 Mon Dec 5 2016 Oklahoma City Thunder 102 Atlanta Hawks 99 3
1565 302 Mon Dec 5 2016 Atlanta Hawks 99 Oklahoma City Thunder 102 -3
1566 303 Mon Dec 5 2016 Brooklyn Nets 113 Washington Wizards 118 -5
303 303 Mon Dec 5 2016 Washington Wizards 118 Brooklyn Nets 113 5
1567 304 Mon Dec 5 2016 Chicago Bulls 110 Portland Trail Blazers 112 -2
304 304 Mon Dec 5 2016 Portland Trail Blazers 112 Chicago Bulls 110 2
305 305 Mon Dec 5 2016 Charlotte Hornets 109 Dallas Mavericks 101 8
1568 305 Mon Dec 5 2016 Dallas Mavericks 101 Charlotte Hornets 109 -8
306 306 Mon Dec 5 2016 Indiana Pacers 106 Golden State Warriors 142 -36
1569 306 Mon Dec 5 2016 Golden State Warriors 142 Indiana Pacers 106 36
1570 307 Mon Dec 5 2016 Houston Rockets 107 Boston Celtics 106 1
307 307 Mon Dec 5 2016 Boston Celtics 106 Houston Rockets 107 -1
1571 308 Mon Dec 5 2016 Los Angeles Lakers 101 Utah Jazz 107 -6
308 308 Mon Dec 5 2016 Utah Jazz 107 Los Angeles Lakers 101 6
1572 309 Mon Dec 5 2016 Milwaukee Bucks 96 San Antonio Spurs 97 -1
309 309 Mon Dec 5 2016 San Antonio Spurs 97 Milwaukee Bucks 96 1
310 310 Mon Dec 5 2016 Memphis Grizzlies 110 New Orleans Pelicans 108 2
1573 310 Mon Dec 5 2016 New Orleans Pelicans 108 Memphis Grizzlies 110 -2
311 311 Mon Dec 5 2016 Denver Nuggets 106 Philadelphia 76ers 98 8
1574 311 Mon Dec 5 2016 Philadelphia 76ers 98 Denver Nuggets 106 -8
312 312 Mon Dec 5 2016 Cleveland Cavaliers 116 Toronto Raptors 112 4
1575 312 Mon Dec 5 2016 Toronto Raptors 112 Cleveland Cavaliers 116 -4
1576 313 Tue Dec 6 2016 Detroit Pistons 102 Chicago Bulls 91 11
313 313 Tue Dec 6 2016 Chicago Bulls 91 Detroit Pistons 102 -11
314 314 Tue Dec 6 2016 Philadelphia 76ers 91 Memphis Grizzlies 96 -5
1577 314 Tue Dec 6 2016 Memphis Grizzlies 96 Philadelphia 76ers 91 5
315 315 Tue Dec 6 2016 New York Knicks 114 Miami Heat 103 11
1578 315 Tue Dec 6 2016 Miami Heat 103 New York Knicks 114 -11
316 316 Tue Dec 6 2016 San Antonio Spurs 105 Minnesota Timberwolves 91 14
1579 316 Tue Dec 6 2016 Minnesota Timberwolves 91 San Antonio Spurs 105 -14
317 317 Tue Dec 6 2016 Phoenix Suns 105 Utah Jazz 112 -7
1580 317 Tue Dec 6 2016 Utah Jazz 112 Phoenix Suns 105 7
318 318 Tue Dec 6 2016 Orlando Magic 124 Washington Wizards 116 8
1581 318 Tue Dec 6 2016 Washington Wizards 116 Orlando Magic 124 -8
1582 319 Wed Dec 7 2016 Atlanta Hawks 103 Miami Heat 95 8
319 319 Wed Dec 7 2016 Miami Heat 95 Atlanta Hawks 103 -8
320 320 Wed Dec 7 2016 Denver Nuggets 111 Brooklyn Nets 116 -5
1583 320 Wed Dec 7 2016 Brooklyn Nets 116 Denver Nuggets 111 5
321 321 Wed Dec 7 2016 Detroit Pistons 77 Charlotte Hornets 87 -10
1584 321 Wed Dec 7 2016 Charlotte Hornets 87 Detroit Pistons 77 10
1585 322 Wed Dec 7 2016 Dallas Mavericks 89 Sacramento Kings 120 -31
322 322 Wed Dec 7 2016 Sacramento Kings 120 Dallas Mavericks 89 31
1586 323 Wed Dec 7 2016 Houston Rockets 134 Los Angeles Lakers 95 39
323 323 Wed Dec 7 2016 Los Angeles Lakers 95 Houston Rockets 134 -39
1587 324 Wed Dec 7 2016 Los Angeles Clippers 98 Golden State Warriors 115 -17
324 324 Wed Dec 7 2016 Golden State Warriors 115 Los Angeles Clippers 98 17
325 325 Wed Dec 7 2016 Portland Trail Blazers 107 Milwaukee Bucks 115 -8
1588 325 Wed Dec 7 2016 Milwaukee Bucks 115 Portland Trail Blazers 107 8
326 326 Wed Dec 7 2016 Cleveland Cavaliers 126 New York Knicks 94 32
1589 326 Wed Dec 7 2016 New York Knicks 94 Cleveland Cavaliers 126 -32
1590 327 Wed Dec 7 2016 Orlando Magic 87 Boston Celtics 117 -30
327 327 Wed Dec 7 2016 Boston Celtics 117 Orlando Magic 87 30
1591 328 Wed Dec 7 2016 Phoenix Suns 94 Indiana Pacers 109 -15
328 328 Wed Dec 7 2016 Indiana Pacers 109 Phoenix Suns 94 15
1592 329 Thu Dec 8 2016 Chicago Bulls 95 San Antonio Spurs 91 4
329 329 Thu Dec 8 2016 San Antonio Spurs 91 Chicago Bulls 95 -4
1593 330 Thu Dec 8 2016 Memphis Grizzlies 88 Portland Trail Blazers 86 2
330 330 Thu Dec 8 2016 Portland Trail Blazers 86 Memphis Grizzlies 88 -2
1594 331 Thu Dec 8 2016 New Orleans Pelicans 88 Philadelphia 76ers 99 -11
331 331 Thu Dec 8 2016 Philadelphia 76ers 99 New Orleans Pelicans 88 11
332 332 Thu Dec 8 2016 Minnesota Timberwolves 110 Toronto Raptors 124 -14
1595 332 Thu Dec 8 2016 Toronto Raptors 124 Minnesota Timberwolves 110 14
1596 333 Thu Dec 8 2016 Utah Jazz 99 Golden State Warriors 106 -7
333 333 Thu Dec 8 2016 Golden State Warriors 106 Utah Jazz 99 7
1597 334 Thu Dec 8 2016 Washington Wizards 92 Denver Nuggets 85 7
334 334 Thu Dec 8 2016 Denver Nuggets 85 Washington Wizards 92 -7
1598 335 Fri Dec 9 2016 Boston Celtics 94 Toronto Raptors 101 -7
335 335 Fri Dec 9 2016 Toronto Raptors 101 Boston Celtics 94 7
336 336 Fri Dec 9 2016 Orlando Magic 88 Charlotte Hornets 109 -21
1599 336 Fri Dec 9 2016 Charlotte Hornets 109 Orlando Magic 88 21
337 337 Fri Dec 9 2016 Miami Heat 84 Cleveland Cavaliers 114 -30
1600 337 Fri Dec 9 2016 Cleveland Cavaliers 114 Miami Heat 84 30
1601 338 Fri Dec 9 2016 Dallas Mavericks 111 Indiana Pacers 103 8
338 338 Fri Dec 9 2016 Indiana Pacers 103 Dallas Mavericks 111 -8
1602 339 Fri Dec 9 2016 Los Angeles Lakers 115 Phoenix Suns 119 -4
339 339 Fri Dec 9 2016 Phoenix Suns 119 Los Angeles Lakers 115 4
1603 340 Fri Dec 9 2016 Milwaukee Bucks 110 Atlanta Hawks 114 -4
340 340 Fri Dec 9 2016 Atlanta Hawks 114 Milwaukee Bucks 110 4
341 341 Fri Dec 9 2016 Detroit Pistons 117 Minnesota Timberwolves 90 27
1604 341 Fri Dec 9 2016 Minnesota Timberwolves 90 Detroit Pistons 117 -27
1605 342 Fri Dec 9 2016 Oklahoma City Thunder 99 Houston Rockets 102 -3
342 342 Fri Dec 9 2016 Houston Rockets 102 Oklahoma City Thunder 99 3
1606 343 Fri Dec 9 2016 Sacramento Kings 100 New York Knicks 103 -3
343 343 Fri Dec 9 2016 New York Knicks 103 Sacramento Kings 100 3
1607 344 Sat Dec 10 2016 Chicago Bulls 105 Miami Heat 100 5
344 344 Sat Dec 10 2016 Miami Heat 100 Chicago Bulls 105 -5
1608 345 Sat Dec 10 2016 Cleveland Cavaliers 116 Charlotte Hornets 105 11
345 345 Sat Dec 10 2016 Charlotte Hornets 105 Cleveland Cavaliers 116 -11
1609 346 Sat Dec 10 2016 Houston Rockets 109 Dallas Mavericks 87 22
346 346 Sat Dec 10 2016 Dallas Mavericks 87 Houston Rockets 109 -22
1610 347 Sat Dec 10 2016 Indiana Pacers 118 Portland Trail Blazers 111 7
347 347 Sat Dec 10 2016 Portland Trail Blazers 111 Indiana Pacers 118 -7
1611 348 Sat Dec 10 2016 Los Angeles Clippers 133 New Orleans Pelicans 105 28
348 348 Sat Dec 10 2016 New Orleans Pelicans 105 Los Angeles Clippers 133 -28
349 349 Sat Dec 10 2016 Golden State Warriors 89 Memphis Grizzlies 110 -21
1612 349 Sat Dec 10 2016 Memphis Grizzlies 110 Golden State Warriors 89 21
350 350 Sat Dec 10 2016 Denver Nuggets 121 Orlando Magic 113 8
1613 350 Sat Dec 10 2016 Orlando Magic 113 Denver Nuggets 121 -8
351 351 Sat Dec 10 2016 Brooklyn Nets 101 San Antonio Spurs 130 -29
1614 351 Sat Dec 10 2016 San Antonio Spurs 130 Brooklyn Nets 101 29
352 352 Sat Dec 10 2016 Sacramento Kings 84 Utah Jazz 104 -20
1615 352 Sat Dec 10 2016 Utah Jazz 104 Sacramento Kings 84 20
353 353 Sat Dec 10 2016 Milwaukee Bucks 105 Washington Wizards 110 -5
1616 353 Sat Dec 10 2016 Washington Wizards 110 Milwaukee Bucks 105 5
1617 354 Sun Dec 11 2016 Detroit Pistons 79 Philadelphia 76ers 97 -18
354 354 Sun Dec 11 2016 Philadelphia 76ers 97 Detroit Pistons 79 18
1618 355 Sun Dec 11 2016 Los Angeles Lakers 112 New York Knicks 118 -6
355 355 Sun Dec 11 2016 New York Knicks 118 Los Angeles Lakers 112 6
356 356 Sun Dec 11 2016 Golden State Warriors 116 Minnesota Timberwolves 108 8
1619 356 Sun Dec 11 2016 Minnesota Timberwolves 108 Golden State Warriors 116 -8
1620 357 Sun Dec 11 2016 Oklahoma City Thunder 99 Boston Celtics 96 3
357 357 Sun Dec 11 2016 Boston Celtics 96 Oklahoma City Thunder 99 -3
1621 358 Sun Dec 11 2016 Phoenix Suns 119 New Orleans Pelicans 120 -1
358 358 Sun Dec 11 2016 New Orleans Pelicans 120 Phoenix Suns 119 1
1622 359 Mon Dec 12 2016 Dallas Mavericks 112 Denver Nuggets 92 20
359 359 Mon Dec 12 2016 Denver Nuggets 92 Dallas Mavericks 112 -20
1623 360 Mon Dec 12 2016 Houston Rockets 122 Brooklyn Nets 118 4
360 360 Mon Dec 12 2016 Brooklyn Nets 118 Houston Rockets 122 -4
1624 361 Mon Dec 12 2016 Indiana Pacers 110 Charlotte Hornets 94 16
361 361 Mon Dec 12 2016 Charlotte Hornets 94 Indiana Pacers 110 -16
362 362 Mon Dec 12 2016 Portland Trail Blazers 120 Los Angeles Clippers 121 -1
1625 362 Mon Dec 12 2016 Los Angeles Clippers 121 Portland Trail Blazers 120 1
1626 363 Mon Dec 12 2016 Miami Heat 112 Washington Wizards 101 11
363 363 Mon Dec 12 2016 Washington Wizards 101 Miami Heat 112 -11
1627 364 Mon Dec 12 2016 Sacramento Kings 116 Los Angeles Lakers 92 24
364 364 Mon Dec 12 2016 Los Angeles Lakers 92 Sacramento Kings 116 -24
1628 365 Mon Dec 12 2016 Toronto Raptors 122 Milwaukee Bucks 100 22
365 365 Mon Dec 12 2016 Milwaukee Bucks 100 Toronto Raptors 122 -22
366 366 Tue Dec 13 2016 Orlando Magic 131 Atlanta Hawks 120 11
1629 366 Tue Dec 13 2016 Atlanta Hawks 120 Orlando Magic 131 -11
1630 367 Tue Dec 13 2016 Chicago Bulls 94 Minnesota Timberwolves 99 -5
367 367 Tue Dec 13 2016 Minnesota Timberwolves 99 Chicago Bulls 94 5
1631 368 Tue Dec 13 2016 Cleveland Cavaliers 103 Memphis Grizzlies 86 17
368 368 Tue Dec 13 2016 Memphis Grizzlies 86 Cleveland Cavaliers 103 -17
1632 369 Tue Dec 13 2016 New Orleans Pelicans 109 Golden State Warriors 113 -4
369 369 Tue Dec 13 2016 Golden State Warriors 113 New Orleans Pelicans 109 4
1633 370 Tue Dec 13 2016 Phoenix Suns 113 New York Knicks 111 2
370 370 Tue Dec 13 2016 New York Knicks 111 Phoenix Suns 113 -2
1634 371 Tue Dec 13 2016 Portland Trail Blazers 114 Oklahoma City Thunder 95 19
371 371 Tue Dec 13 2016 Oklahoma City Thunder 95 Portland Trail Blazers 114 -19
1635 372 Wed Dec 14 2016 Brooklyn Nets 107 Los Angeles Lakers 97 10
372 372 Wed Dec 14 2016 Los Angeles Lakers 97 Brooklyn Nets 107 -10
1636 373 Wed Dec 14 2016 Dallas Mavericks 85 Detroit Pistons 95 -10
373 373 Wed Dec 14 2016 Detroit Pistons 95 Dallas Mavericks 85 10
1637 374 Wed Dec 14 2016 Houston Rockets 132 Sacramento Kings 98 34
374 374 Wed Dec 14 2016 Sacramento Kings 98 Houston Rockets 132 -34
1638 375 Wed Dec 14 2016 Memphis Grizzlies 93 Cleveland Cavaliers 85 8
375 375 Wed Dec 14 2016 Cleveland Cavaliers 85 Memphis Grizzlies 93 -8
376 376 Wed Dec 14 2016 Indiana Pacers 89 Miami Heat 95 -6
1639 376 Wed Dec 14 2016 Miami Heat 95 Indiana Pacers 89 6
1640 377 Wed Dec 14 2016 Orlando Magic 108 Los Angeles Clippers 113 -5
377 377 Wed Dec 14 2016 Los Angeles Clippers 113 Orlando Magic 108 5
378 378 Wed Dec 14 2016 Toronto Raptors 123 Philadelphia 76ers 114 9
1641 378 Wed Dec 14 2016 Philadelphia 76ers 114 Toronto Raptors 123 -9
379 379 Wed Dec 14 2016 Boston Celtics 101 San Antonio Spurs 108 -7
1642 379 Wed Dec 14 2016 San Antonio Spurs 108 Boston Celtics 101 7
380 380 Wed Dec 14 2016 Oklahoma City Thunder 89 Utah Jazz 109 -20
1643 380 Wed Dec 14 2016 Utah Jazz 109 Oklahoma City Thunder 89 20
1644 381 Wed Dec 14 2016 Washington Wizards 109 Charlotte Hornets 106 3
381 381 Wed Dec 14 2016 Charlotte Hornets 106 Washington Wizards 109 -3
1645 382 Thu Dec 15 2016 Denver Nuggets 132 Portland Trail Blazers 120 12
382 382 Thu Dec 15 2016 Portland Trail Blazers 120 Denver Nuggets 132 -12
383 383 Thu Dec 15 2016 New York Knicks 90 Golden State Warriors 103 -13
1646 383 Thu Dec 15 2016 Golden State Warriors 103 New York Knicks 90 13
1647 384 Thu Dec 15 2016 Milwaukee Bucks 108 Chicago Bulls 97 11
384 384 Thu Dec 15 2016 Chicago Bulls 97 Milwaukee Bucks 108 -11
1648 385 Thu Dec 15 2016 New Orleans Pelicans 102 Indiana Pacers 95 7
385 385 Thu Dec 15 2016 Indiana Pacers 95 New Orleans Pelicans 102 -7
1649 386 Thu Dec 15 2016 Phoenix Suns 92 San Antonio Spurs 107 -15
386 386 Thu Dec 15 2016 San Antonio Spurs 107 Phoenix Suns 92 15
387 387 Fri Dec 16 2016 Charlotte Hornets 88 Boston Celtics 96 -8
1650 387 Fri Dec 16 2016 Boston Celtics 96 Charlotte Hornets 88 8
1651 388 Fri Dec 16 2016 Chicago Bulls 69 Milwaukee Bucks 95 -26
388 388 Fri Dec 16 2016 Milwaukee Bucks 95 Chicago Bulls 69 26
389 389 Fri Dec 16 2016 New Orleans Pelicans 100 Houston Rockets 122 -22
1652 389 Fri Dec 16 2016 Houston Rockets 122 New Orleans Pelicans 100 22
390 390 Fri Dec 16 2016 Sacramento Kings 96 Memphis Grizzlies 92 4
1653 390 Fri Dec 16 2016 Memphis Grizzlies 92 Sacramento Kings 96 -4
391 391 Fri Dec 16 2016 Los Angeles Clippers 102 Miami Heat 98 4
1654 391 Fri Dec 16 2016 Miami Heat 98 Los Angeles Clippers 102 -4
392 392 Fri Dec 16 2016 Brooklyn Nets 111 Orlando Magic 118 -7
1655 392 Fri Dec 16 2016 Orlando Magic 118 Brooklyn Nets 111 7
1656 393 Fri Dec 16 2016 Philadelphia 76ers 89 Los Angeles Lakers 100 -11
393 393 Fri Dec 16 2016 Los Angeles Lakers 100 Philadelphia 76ers 89 11
394 394 Fri Dec 16 2016 Atlanta Hawks 125 Toronto Raptors 121 4
1657 394 Fri Dec 16 2016 Toronto Raptors 121 Atlanta Hawks 125 -4
395 395 Fri Dec 16 2016 Dallas Mavericks 100 Utah Jazz 103 -3
1658 395 Fri Dec 16 2016 Utah Jazz 103 Dallas Mavericks 100 3
396 396 Fri Dec 16 2016 Detroit Pistons 108 Washington Wizards 122 -14
1659 396 Fri Dec 16 2016 Washington Wizards 122 Detroit Pistons 108 14
397 397 Sat Dec 17 2016 Charlotte Hornets 107 Atlanta Hawks 99 8
1660 397 Sat Dec 17 2016 Atlanta Hawks 99 Charlotte Hornets 107 -8
398 398 Sat Dec 17 2016 Los Angeles Lakers 108 Cleveland Cavaliers 119 -11
1661 398 Sat Dec 17 2016 Cleveland Cavaliers 119 Los Angeles Lakers 108 11
399 399 Sat Dec 17 2016 New York Knicks 114 Denver Nuggets 127 -13
1662 399 Sat Dec 17 2016 Denver Nuggets 127 New York Knicks 114 13
400 400 Sat Dec 17 2016 Indiana Pacers 105 Detroit Pistons 90 15
1663 400 Sat Dec 17 2016 Detroit Pistons 90 Indiana Pacers 105 -15
401 401 Sat Dec 17 2016 Portland Trail Blazers 90 Golden State Warriors 135 -45
1664 401 Sat Dec 17 2016 Golden State Warriors 135 Portland Trail Blazers 90 45
402 402 Sat Dec 17 2016 Houston Rockets 111 Minnesota Timberwolves 109 2
1665 402 Sat Dec 17 2016 Minnesota Timberwolves 109 Houston Rockets 111 -2
403 403 Sat Dec 17 2016 Phoenix Suns 101 Oklahoma City Thunder 114 -13
1666 403 Sat Dec 17 2016 Oklahoma City Thunder 114 Phoenix Suns 101 13
404 404 Sun Dec 18 2016 Sacramento Kings 79 Dallas Mavericks 99 -20
1667 404 Sun Dec 18 2016 Dallas Mavericks 99 Sacramento Kings 79 20
405 405 Sun Dec 18 2016 Utah Jazz 82 Memphis Grizzlies 73 9
1668 405 Sun Dec 18 2016 Memphis Grizzlies 73 Utah Jazz 82 -9
406 406 Sun Dec 18 2016 Boston Celtics 105 Miami Heat 95 10
1669 406 Sun Dec 18 2016 Miami Heat 95 Boston Celtics 105 -10
407 407 Sun Dec 18 2016 Toronto Raptors 109 Orlando Magic 79 30
1670 407 Sun Dec 18 2016 Orlando Magic 79 Toronto Raptors 109 -30
1671 408 Sun Dec 18 2016 Philadelphia 76ers 108 Brooklyn Nets 107 1
408 408 Sun Dec 18 2016 Brooklyn Nets 107 Philadelphia 76ers 108 -1
409 409 Sun Dec 18 2016 New Orleans Pelicans 100 San Antonio Spurs 113 -13
1672 409 Sun Dec 18 2016 San Antonio Spurs 113 New Orleans Pelicans 100 13
410 410 Sun Dec 18 2016 Los Angeles Clippers 110 Washington Wizards 117 -7
1673 410 Sun Dec 18 2016 Washington Wizards 117 Los Angeles Clippers 110 7
411 411 Mon Dec 19 2016 Detroit Pistons 82 Chicago Bulls 113 -31
1674 411 Mon Dec 19 2016 Chicago Bulls 113 Detroit Pistons 82 31
1675 412 Mon Dec 19 2016 Denver Nuggets 117 Dallas Mavericks 107 10
412 412 Mon Dec 19 2016 Dallas Mavericks 107 Denver Nuggets 117 -10
1676 413 Mon Dec 19 2016 Indiana Pacers 107 Washington Wizards 105 2
413 413 Mon Dec 19 2016 Washington Wizards 105 Indiana Pacers 107 -2
1677 414 Mon Dec 19 2016 Minnesota Timberwolves 115 Phoenix Suns 108 7
414 414 Mon Dec 19 2016 Phoenix Suns 108 Minnesota Timberwolves 115 -7
415 415 Mon Dec 19 2016 Atlanta Hawks 110 Oklahoma City Thunder 108 2
1678 415 Mon Dec 19 2016 Oklahoma City Thunder 108 Atlanta Hawks 110 -2
416 416 Tue Dec 20 2016 Los Angeles Lakers 113 Charlotte Hornets 117 -4
1679 416 Tue Dec 20 2016 Charlotte Hornets 117 Los Angeles Lakers 113 4
1680 417 Tue Dec 20 2016 Golden State Warriors 104 Utah Jazz 74 30
417 417 Tue Dec 20 2016 Utah Jazz 74 Golden State Warriors 104 -30
1681 418 Tue Dec 20 2016 Houston Rockets 100 San Antonio Spurs 102 -2
418 418 Tue Dec 20 2016 San Antonio Spurs 102 Houston Rockets 100 2
1682 419 Tue Dec 20 2016 Los Angeles Clippers 119 Denver Nuggets 102 17
419 419 Tue Dec 20 2016 Denver Nuggets 102 Los Angeles Clippers 119 -17
1683 420 Tue Dec 20 2016 Memphis Grizzlies 109 Boston Celtics 112 -3
420 420 Tue Dec 20 2016 Boston Celtics 112 Memphis Grizzlies 109 3
421 421 Tue Dec 20 2016 Orlando Magic 136 Miami Heat 130 6
1684 421 Tue Dec 20 2016 Miami Heat 130 Orlando Magic 136 -6
1685 422 Tue Dec 20 2016 Milwaukee Bucks 108 Cleveland Cavaliers 114 -6
422 422 Tue Dec 20 2016 Cleveland Cavaliers 114 Milwaukee Bucks 108 6
423 423 Tue Dec 20 2016 Indiana Pacers 111 New York Knicks 118 -7
1686 423 Tue Dec 20 2016 New York Knicks 118 Indiana Pacers 111 7
1687 424 Tue Dec 20 2016 Philadelphia 76ers 93 New Orleans Pelicans 108 -15
424 424 Tue Dec 20 2016 New Orleans Pelicans 108 Philadelphia 76ers 93 15
425 425 Tue Dec 20 2016 Portland Trail Blazers 121 Sacramento Kings 126 -5
1688 425 Tue Dec 20 2016 Sacramento Kings 126 Portland Trail Blazers 121 5
1689 426 Tue Dec 20 2016 Toronto Raptors 116 Brooklyn Nets 104 12
426 426 Tue Dec 20 2016 Brooklyn Nets 104 Toronto Raptors 116 -12
427 427 Wed Dec 21 2016 Minnesota Timberwolves 92 Atlanta Hawks 84 8
1690 427 Wed Dec 21 2016 Atlanta Hawks 84 Minnesota Timberwolves 92 -8
428 428 Wed Dec 21 2016 Washington Wizards 107 Chicago Bulls 97 10
1691 428 Wed Dec 21 2016 Chicago Bulls 97 Washington Wizards 107 -10
1692 429 Wed Dec 21 2016 Cleveland Cavaliers 113 Milwaukee Bucks 102 11
429 429 Wed Dec 21 2016 Milwaukee Bucks 102 Cleveland Cavaliers 113 -11
1693 430 Wed Dec 21 2016 Detroit Pistons 86 Memphis Grizzlies 98 -12
430 430 Wed Dec 21 2016 Memphis Grizzlies 98 Detroit Pistons 86 12
1694 431 Wed Dec 21 2016 New Orleans Pelicans 110 Oklahoma City Thunder 121 -11
431 431 Wed Dec 21 2016 Oklahoma City Thunder 121 New Orleans Pelicans 110 11
1695 432 Wed Dec 21 2016 Phoenix Suns 111 Houston Rockets 125 -14
432 432 Wed Dec 21 2016 Houston Rockets 125 Phoenix Suns 111 14
1696 433 Wed Dec 21 2016 Portland Trail Blazers 95 Dallas Mavericks 96 -1
433 433 Wed Dec 21 2016 Dallas Mavericks 96 Portland Trail Blazers 95 1
434 434 Wed Dec 21 2016 Sacramento Kings 94 Utah Jazz 93 1
1697 434 Wed Dec 21 2016 Utah Jazz 93 Sacramento Kings 94 -1
1698 435 Thu Dec 22 2016 Brooklyn Nets 101 Golden State Warriors 117 -16
435 435 Thu Dec 22 2016 Golden State Warriors 117 Brooklyn Nets 101 16
1699 436 Thu Dec 22 2016 Indiana Pacers 102 Boston Celtics 109 -7
436 436 Thu Dec 22 2016 Boston Celtics 109 Indiana Pacers 102 7
1700 437 Thu Dec 22 2016 Los Angeles Clippers 106 San Antonio Spurs 101 5
437 437 Thu Dec 22 2016 San Antonio Spurs 101 Los Angeles Clippers 106 -5
1701 438 Thu Dec 22 2016 Miami Heat 115 Los Angeles Lakers 107 8
438 438 Thu Dec 22 2016 Los Angeles Lakers 107 Miami Heat 115 -8
1702 439 Thu Dec 22 2016 New York Knicks 106 Orlando Magic 95 11
439 439 Thu Dec 22 2016 Orlando Magic 95 New York Knicks 106 -11
440 440 Fri Dec 23 2016 Oklahoma City Thunder 117 Boston Celtics 112 5
1703 440 Fri Dec 23 2016 Boston Celtics 112 Oklahoma City Thunder 117 -5
441 441 Fri Dec 23 2016 Chicago Bulls 91 Charlotte Hornets 103 -12
1704 441 Fri Dec 23 2016 Charlotte Hornets 103 Chicago Bulls 91 12
1705 442 Fri Dec 23 2016 Cleveland Cavaliers 119 Brooklyn Nets 99 20
442 442 Fri Dec 23 2016 Brooklyn Nets 99 Cleveland Cavaliers 119 -20
1706 443 Fri Dec 23 2016 Denver Nuggets 108 Atlanta Hawks 109 -1
443 443 Fri Dec 23 2016 Atlanta Hawks 109 Denver Nuggets 108 1
444 444 Fri Dec 23 2016 Golden State Warriors 119 Detroit Pistons 113 6
1707 444 Fri Dec 23 2016 Detroit Pistons 113 Golden State Warriors 119 -6
445 445 Fri Dec 23 2016 Dallas Mavericks 90 Los Angeles Clippers 88 2
1708 445 Fri Dec 23 2016 Los Angeles Clippers 88 Dallas Mavericks 90 -2
446 446 Fri Dec 23 2016 Houston Rockets 109 Memphis Grizzlies 115 -6
1709 446 Fri Dec 23 2016 Memphis Grizzlies 115 Houston Rockets 109 6
1710 447 Fri Dec 23 2016 Milwaukee Bucks 123 Washington Wizards 96 27
447 447 Fri Dec 23 2016 Washington Wizards 96 Milwaukee Bucks 123 -27
448 448 Fri Dec 23 2016 Sacramento Kings 109 Minnesota Timberwolves 105 4
1711 448 Fri Dec 23 2016 Minnesota Timberwolves 105 Sacramento Kings 109 -4
1712 449 Fri Dec 23 2016 New Orleans Pelicans 91 Miami Heat 87 4
449 449 Fri Dec 23 2016 Miami Heat 87 New Orleans Pelicans 91 -4
450 450 Fri Dec 23 2016 Los Angeles Lakers 90 Orlando Magic 109 -19
1713 450 Fri Dec 23 2016 Orlando Magic 109 Los Angeles Lakers 90 19
1714 451 Fri Dec 23 2016 Phoenix Suns 123 Philadelphia 76ers 116 7
451 451 Fri Dec 23 2016 Philadelphia 76ers 116 Phoenix Suns 123 -7
1715 452 Fri Dec 23 2016 Portland Trail Blazers 90 San Antonio Spurs 110 -20
452 452 Fri Dec 23 2016 San Antonio Spurs 110 Portland Trail Blazers 90 20
1716 453 Fri Dec 23 2016 Utah Jazz 98 Toronto Raptors 104 -6
453 453 Fri Dec 23 2016 Toronto Raptors 104 Utah Jazz 98 6
454 454 Sun Dec 25 2016 Golden State Warriors 108 Cleveland Cavaliers 109 -1
1717 454 Sun Dec 25 2016 Cleveland Cavaliers 109 Golden State Warriors 108 1
1718 455 Sun Dec 25 2016 Los Angeles Lakers 111 Los Angeles Clippers 102 9
455 455 Sun Dec 25 2016 Los Angeles Clippers 102 Los Angeles Lakers 111 -9
1719 456 Sun Dec 25 2016 New York Knicks 114 Boston Celtics 119 -5
456 456 Sun Dec 25 2016 Boston Celtics 119 New York Knicks 114 5
1720 457 Sun Dec 25 2016 Oklahoma City Thunder 112 Minnesota Timberwolves 100 12
457 457 Sun Dec 25 2016 Minnesota Timberwolves 100 Oklahoma City Thunder 112 -12
458 458 Sun Dec 25 2016 Chicago Bulls 100 San Antonio Spurs 119 -19
1721 458 Sun Dec 25 2016 San Antonio Spurs 119 Chicago Bulls 100 19
459 459 Mon Dec 26 2016 Charlotte Hornets 118 Brooklyn Nets 120 -2
1722 459 Mon Dec 26 2016 Brooklyn Nets 120 Charlotte Hornets 118 2
460 460 Mon Dec 26 2016 Indiana Pacers 85 Chicago Bulls 90 -5
1723 460 Mon Dec 26 2016 Chicago Bulls 90 Indiana Pacers 85 5
461 461 Mon Dec 26 2016 Cleveland Cavaliers 90 Detroit Pistons 106 -16
1724 461 Mon Dec 26 2016 Detroit Pistons 106 Cleveland Cavaliers 90 16
1725 462 Mon Dec 26 2016 Houston Rockets 131 Phoenix Suns 115 16
462 462 Mon Dec 26 2016 Phoenix Suns 115 Houston Rockets 131 -16
463 463 Mon Dec 26 2016 Denver Nuggets 106 Los Angeles Clippers 102 4
1726 463 Mon Dec 26 2016 Los Angeles Clippers 102 Denver Nuggets 106 -4
464 464 Mon Dec 26 2016 Atlanta Hawks 90 Minnesota Timberwolves 104 -14
1727 464 Mon Dec 26 2016 Minnesota Timberwolves 104 Atlanta Hawks 90 14
1728 465 Mon Dec 26 2016 New Orleans Pelicans 111 Dallas Mavericks 104 7
465 465 Mon Dec 26 2016 Dallas Mavericks 104 New Orleans Pelicans 111 -7
466 466 Mon Dec 26 2016 Memphis Grizzlies 102 Orlando Magic 112 -10
1729 466 Mon Dec 26 2016 Orlando Magic 112 Memphis Grizzlies 102 10
467 467 Mon Dec 26 2016 Toronto Raptors 95 Portland Trail Blazers 91 4
1730 467 Mon Dec 26 2016 Portland Trail Blazers 91 Toronto Raptors 95 -4
468 468 Mon Dec 26 2016 Philadelphia 76ers 100 Sacramento Kings 102 -2
1731 468 Mon Dec 26 2016 Sacramento Kings 102 Philadelphia 76ers 100 2
1732 469 Mon Dec 26 2016 Washington Wizards 107 Milwaukee Bucks 102 5
469 469 Mon Dec 26 2016 Milwaukee Bucks 102 Washington Wizards 107 -5
1733 470 Tue Dec 27 2016 Boston Celtics 113 Memphis Grizzlies 103 10
470 470 Tue Dec 27 2016 Memphis Grizzlies 103 Boston Celtics 113 -10
471 471 Tue Dec 27 2016 Houston Rockets 123 Dallas Mavericks 107 16
1734 471 Tue Dec 27 2016 Dallas Mavericks 107 Houston Rockets 123 -16
472 472 Tue Dec 27 2016 Utah Jazz 102 Los Angeles Lakers 100 2
1735 472 Tue Dec 27 2016 Los Angeles Lakers 100 Utah Jazz 102 -2
1736 473 Tue Dec 27 2016 Miami Heat 94 Oklahoma City Thunder 106 -12
473 473 Tue Dec 27 2016 Oklahoma City Thunder 106 Miami Heat 94 12
474 474 Wed Dec 28 2016 New York Knicks 98 Atlanta Hawks 102 -4
1737 474 Wed Dec 28 2016 Atlanta Hawks 102 New York Knicks 98 4
475 475 Wed Dec 28 2016 Brooklyn Nets 99 Chicago Bulls 101 -2
1738 475 Wed Dec 28 2016 Chicago Bulls 101 Brooklyn Nets 99 2
476 476 Wed Dec 28 2016 Minnesota Timberwolves 103 Denver Nuggets 105 -2
1739 476 Wed Dec 28 2016 Denver Nuggets 105 Minnesota Timberwolves 103 2
1740 477 Wed Dec 28 2016 Detroit Pistons 94 Milwaukee Bucks 119 -25
477 477 Wed Dec 28 2016 Milwaukee Bucks 119 Detroit Pistons 94 25
1741 478 Wed Dec 28 2016 Golden State Warriors 121 Toronto Raptors 111 10
478 478 Wed Dec 28 2016 Toronto Raptors 111 Golden State Warriors 121 -10
479 479 Wed Dec 28 2016 Los Angeles Clippers 98 New Orleans Pelicans 102 -4
1742 479 Wed Dec 28 2016 New Orleans Pelicans 102 Los Angeles Clippers 98 4
1743 480 Wed Dec 28 2016 Orlando Magic 101 Charlotte Hornets 120 -19
480 480 Wed Dec 28 2016 Charlotte Hornets 120 Orlando Magic 101 19
1744 481 Wed Dec 28 2016 Portland Trail Blazers 102 Sacramento Kings 89 13
481 481 Wed Dec 28 2016 Sacramento Kings 89 Portland Trail Blazers 102 -13
1745 482 Wed Dec 28 2016 San Antonio Spurs 119 Phoenix Suns 98 21
482 482 Wed Dec 28 2016 Phoenix Suns 98 San Antonio Spurs 119 -21
1746 483 Wed Dec 28 2016 Washington Wizards 111 Indiana Pacers 105 6
483 483 Wed Dec 28 2016 Indiana Pacers 105 Washington Wizards 111 -6
484 484 Thu Dec 29 2016 Miami Heat 82 Charlotte Hornets 91 -9
1747 484 Thu Dec 29 2016 Charlotte Hornets 91 Miami Heat 82 9
1748 485 Thu Dec 29 2016 Cleveland Cavaliers 124 Boston Celtics 118 6
485 485 Thu Dec 29 2016 Boston Celtics 118 Cleveland Cavaliers 124 -6
486 486 Thu Dec 29 2016 Dallas Mavericks 101 Los Angeles Lakers 89 12
1749 486 Thu Dec 29 2016 Los Angeles Lakers 89 Dallas Mavericks 101 -12
1750 487 Thu Dec 29 2016 Memphis Grizzlies 114 Oklahoma City Thunder 80 34
487 487 Thu Dec 29 2016 Oklahoma City Thunder 80 Memphis Grizzlies 114 -34
488 488 Thu Dec 29 2016 Toronto Raptors 91 Phoenix Suns 99 -8
1751 488 Thu Dec 29 2016 Phoenix Suns 99 Toronto Raptors 91 8
489 489 Thu Dec 29 2016 Philadelphia 76ers 83 Utah Jazz 100 -17
1752 489 Thu Dec 29 2016 Utah Jazz 100 Philadelphia 76ers 83 17
490 490 Fri Dec 30 2016 Detroit Pistons 98 Atlanta Hawks 105 -7
1753 490 Fri Dec 30 2016 Atlanta Hawks 105 Detroit Pistons 98 7
491 491 Fri Dec 30 2016 Miami Heat 114 Boston Celtics 117 -3
1754 491 Fri Dec 30 2016 Boston Celtics 117 Miami Heat 114 3
492 492 Fri Dec 30 2016 Philadelphia 76ers 124 Denver Nuggets 122 2
1755 492 Fri Dec 30 2016 Denver Nuggets 122 Philadelphia 76ers 124 -2
493 493 Fri Dec 30 2016 Dallas Mavericks 99 Golden State Warriors 108 -9
1756 493 Fri Dec 30 2016 Golden State Warriors 108 Dallas Mavericks 99 9
494 494 Fri Dec 30 2016 Los Angeles Clippers 116 Houston Rockets 140 -24
1757 494 Fri Dec 30 2016 Houston Rockets 140 Los Angeles Clippers 116 24
495 495 Fri Dec 30 2016 Chicago Bulls 101 Indiana Pacers 111 -10
1758 495 Fri Dec 30 2016 Indiana Pacers 111 Chicago Bulls 101 10
1759 496 Fri Dec 30 2016 Minnesota Timberwolves 116 Milwaukee Bucks 99 17
496 496 Fri Dec 30 2016 Milwaukee Bucks 99 Minnesota Timberwolves 116 -17
1760 497 Fri Dec 30 2016 New Orleans Pelicans 104 New York Knicks 92 12
497 497 Fri Dec 30 2016 New York Knicks 92 New Orleans Pelicans 104 -12
1761 498 Fri Dec 30 2016 San Antonio Spurs 110 Portland Trail Blazers 94 16
498 498 Fri Dec 30 2016 Portland Trail Blazers 94 San Antonio Spurs 110 -16
499 499 Fri Dec 30 2016 Brooklyn Nets 95 Washington Wizards 118 -23
1762 499 Fri Dec 30 2016 Washington Wizards 118 Brooklyn Nets 95 23
1763 500 Sat Dec 31 2016 Chicago Bulls 96 Milwaukee Bucks 116 -20
500 500 Sat Dec 31 2016 Milwaukee Bucks 116 Chicago Bulls 96 20
1764 501 Sat Dec 31 2016 Charlotte Hornets 109 Cleveland Cavaliers 121 -12
501 501 Sat Dec 31 2016 Cleveland Cavaliers 121 Charlotte Hornets 109 12
502 502 Sat Dec 31 2016 New York Knicks 122 Houston Rockets 129 -7
1765 502 Sat Dec 31 2016 Houston Rockets 129 New York Knicks 122 7
503 503 Sat Dec 31 2016 Los Angeles Clippers 88 Oklahoma City Thunder 114 -26
1766 503 Sat Dec 31 2016 Oklahoma City Thunder 114 Los Angeles Clippers 88 26
1767 504 Sat Dec 31 2016 Sacramento Kings 98 Memphis Grizzlies 112 -14
504 504 Sat Dec 31 2016 Memphis Grizzlies 112 Sacramento Kings 98 14
1768 505 Sat Dec 31 2016 Utah Jazz 91 Phoenix Suns 86 5
505 505 Sat Dec 31 2016 Phoenix Suns 86 Utah Jazz 91 -5
1769 506 Sun Jan 1 2017 Atlanta Hawks 114 San Antonio Spurs 112 2
506 506 Sun Jan 1 2017 San Antonio Spurs 112 Atlanta Hawks 114 -2
1770 507 Sun Jan 1 2017 Indiana Pacers 117 Orlando Magic 104 13
507 507 Sun Jan 1 2017 Orlando Magic 104 Indiana Pacers 117 -13
1771 508 Sun Jan 1 2017 Los Angeles Lakers 114 Toronto Raptors 123 -9
508 508 Sun Jan 1 2017 Toronto Raptors 123 Los Angeles Lakers 114 9
1772 509 Sun Jan 1 2017 Miami Heat 98 Detroit Pistons 107 -9
509 509 Sun Jan 1 2017 Detroit Pistons 107 Miami Heat 98 9
1773 510 Sun Jan 1 2017 Minnesota Timberwolves 89 Portland Trail Blazers 95 -6
510 510 Sun Jan 1 2017 Portland Trail Blazers 95 Minnesota Timberwolves 89 6
511 511 Mon Jan 2 2017 Utah Jazz 101 Brooklyn Nets 89 12
1774 511 Mon Jan 2 2017 Brooklyn Nets 89 Utah Jazz 101 -12
1775 512 Mon Jan 2 2017 Chicago Bulls 118 Charlotte Hornets 111 7
512 512 Mon Jan 2 2017 Charlotte Hornets 111 Chicago Bulls 118 -7
513 513 Mon Jan 2 2017 New Orleans Pelicans 82 Cleveland Cavaliers 90 -8
1776 513 Mon Jan 2 2017 Cleveland Cavaliers 90 New Orleans Pelicans 82 8
1777 514 Mon Jan 2 2017 Golden State Warriors 127 Denver Nuggets 119 8
514 514 Mon Jan 2 2017 Denver Nuggets 119 Golden State Warriors 127 -8
1778 515 Mon Jan 2 2017 Houston Rockets 101 Washington Wizards 91 10
515 515 Mon Jan 2 2017 Washington Wizards 91 Houston Rockets 101 -10
516 516 Mon Jan 2 2017 Phoenix Suns 98 Los Angeles Clippers 109 -11
1779 516 Mon Jan 2 2017 Los Angeles Clippers 109 Phoenix Suns 98 11
517 517 Mon Jan 2 2017 Oklahoma City Thunder 94 Milwaukee Bucks 98 -4
1780 517 Mon Jan 2 2017 Milwaukee Bucks 98 Oklahoma City Thunder 94 4
518 518 Mon Jan 2 2017 Orlando Magic 115 New York Knicks 103 12
1781 518 Mon Jan 2 2017 New York Knicks 103 Orlando Magic 115 -12
519 519 Tue Jan 3 2017 Utah Jazz 104 Boston Celtics 115 -11
1782 519 Tue Jan 3 2017 Boston Celtics 115 Utah Jazz 104 11
520 520 Tue Jan 3 2017 Washington Wizards 105 Dallas Mavericks 113 -8
1783 520 Tue Jan 3 2017 Dallas Mavericks 113 Washington Wizards 105 8
521 521 Tue Jan 3 2017 Sacramento Kings 120 Denver Nuggets 113 7
1784 521 Tue Jan 3 2017 Denver Nuggets 113 Sacramento Kings 120 -7
522 522 Tue Jan 3 2017 Indiana Pacers 121 Detroit Pistons 116 5
1785 522 Tue Jan 3 2017 Detroit Pistons 116 Indiana Pacers 121 -5
523 523 Tue Jan 3 2017 Memphis Grizzlies 102 Los Angeles Lakers 116 -14
1786 523 Tue Jan 3 2017 Los Angeles Lakers 116 Memphis Grizzlies 102 14
524 524 Tue Jan 3 2017 Minnesota Timberwolves 91 Philadelphia 76ers 93 -2
1787 524 Tue Jan 3 2017 Philadelphia 76ers 93 Minnesota Timberwolves 91 2
1788 525 Tue Jan 3 2017 Phoenix Suns 99 Miami Heat 90 9
525 525 Tue Jan 3 2017 Miami Heat 90 Phoenix Suns 99 -9
1789 526 Tue Jan 3 2017 San Antonio Spurs 110 Toronto Raptors 82 28
526 526 Tue Jan 3 2017 Toronto Raptors 82 San Antonio Spurs 110 -28
527 527 Wed Jan 4 2017 Oklahoma City Thunder 112 Charlotte Hornets 123 -11
1790 527 Wed Jan 4 2017 Charlotte Hornets 123 Oklahoma City Thunder 112 11
528 528 Wed Jan 4 2017 Chicago Bulls 106 Cleveland Cavaliers 94 12
1791 528 Wed Jan 4 2017 Cleveland Cavaliers 94 Chicago Bulls 106 -12
1792 529 Wed Jan 4 2017 Golden State Warriors 125 Portland Trail Blazers 117 8
529 529 Wed Jan 4 2017 Portland Trail Blazers 117 Golden State Warriors 125 -8
1793 530 Wed Jan 4 2017 Los Angeles Clippers 115 Memphis Grizzlies 106 9
530 530 Wed Jan 4 2017 Memphis Grizzlies 106 Los Angeles Clippers 115 -9
1794 531 Wed Jan 4 2017 New York Knicks 104 Milwaukee Bucks 105 -1
531 531 Wed Jan 4 2017 Milwaukee Bucks 105 New York Knicks 104 1
532 532 Wed Jan 4 2017 Atlanta Hawks 111 Orlando Magic 92 19
1795 532 Wed Jan 4 2017 Orlando Magic 92 Atlanta Hawks 111 -19
1796 533 Wed Jan 4 2017 Sacramento Kings 102 Miami Heat 107 -5
533 533 Wed Jan 4 2017 Miami Heat 107 Sacramento Kings 102 5
534 534 Thu Jan 5 2017 Phoenix Suns 102 Dallas Mavericks 95 7
1797 534 Thu Jan 5 2017 Dallas Mavericks 95 Phoenix Suns 102 -7
535 535 Thu Jan 5 2017 San Antonio Spurs 127 Denver Nuggets 99 28
1798 535 Thu Jan 5 2017 Denver Nuggets 99 San Antonio Spurs 127 -28
1799 536 Thu Jan 5 2017 Detroit Pistons 115 Charlotte Hornets 114 1
536 536 Thu Jan 5 2017 Charlotte Hornets 114 Detroit Pistons 115 -1
1800 537 Thu Jan 5 2017 Houston Rockets 118 Oklahoma City Thunder 116 2
537 537 Thu Jan 5 2017 Oklahoma City Thunder 116 Houston Rockets 118 -2
538 538 Thu Jan 5 2017 Brooklyn Nets 109 Indiana Pacers 121 -12
1801 538 Thu Jan 5 2017 Indiana Pacers 121 Brooklyn Nets 109 12
1802 539 Thu Jan 5 2017 New Orleans Pelicans 94 Atlanta Hawks 99 -5
539 539 Thu Jan 5 2017 Atlanta Hawks 99 New Orleans Pelicans 94 5
1803 540 Thu Jan 5 2017 Portland Trail Blazers 118 Los Angeles Lakers 109 9
540 540 Thu Jan 5 2017 Los Angeles Lakers 109 Portland Trail Blazers 118 -9
1804 541 Thu Jan 5 2017 Toronto Raptors 101 Utah Jazz 93 8
541 541 Thu Jan 5 2017 Utah Jazz 93 Toronto Raptors 101 -8
1805 542 Fri Jan 6 2017 Boston Celtics 110 Philadelphia 76ers 106 4
542 542 Fri Jan 6 2017 Philadelphia 76ers 106 Boston Celtics 110 -4
543 543 Fri Jan 6 2017 Cleveland Cavaliers 116 Brooklyn Nets 108 8
1806 543 Fri Jan 6 2017 Brooklyn Nets 108 Cleveland Cavaliers 116 -8
544 544 Fri Jan 6 2017 Memphis Grizzlies 128 Golden State Warriors 119 9
1807 544 Fri Jan 6 2017 Golden State Warriors 119 Memphis Grizzlies 128 -9
1808 545 Fri Jan 6 2017 Los Angeles Lakers 127 Miami Heat 100 27
545 545 Fri Jan 6 2017 Miami Heat 100 Los Angeles Lakers 127 -27
546 546 Fri Jan 6 2017 New York Knicks 116 Milwaukee Bucks 111 5
1809 546 Fri Jan 6 2017 Milwaukee Bucks 111 New York Knicks 116 -5
547 547 Fri Jan 6 2017 Houston Rockets 100 Orlando Magic 93 7
1810 547 Fri Jan 6 2017 Orlando Magic 93 Houston Rockets 100 -7
548 548 Fri Jan 6 2017 Los Angeles Clippers 106 Sacramento Kings 98 8
1811 548 Fri Jan 6 2017 Sacramento Kings 98 Los Angeles Clippers 106 -8
1812 549 Fri Jan 6 2017 Washington Wizards 112 Minnesota Timberwolves 105 7
549 549 Fri Jan 6 2017 Minnesota Timberwolves 105 Washington Wizards 112 -7
550 550 Sat Jan 7 2017 New Orleans Pelicans 108 Boston Celtics 117 -9
1813 550 Sat Jan 7 2017 Boston Celtics 117 New Orleans Pelicans 108 9
1814 551 Sat Jan 7 2017 Chicago Bulls 123 Toronto Raptors 118 5
551 551 Sat Jan 7 2017 Toronto Raptors 118 Chicago Bulls 123 -5
552 552 Sat Jan 7 2017 Atlanta Hawks 97 Dallas Mavericks 82 15
1815 552 Sat Jan 7 2017 Dallas Mavericks 82 Atlanta Hawks 97 -15
553 553 Sat Jan 7 2017 New York Knicks 109 Indiana Pacers 123 -14
1816 553 Sat Jan 7 2017 Indiana Pacers 123 New York Knicks 109 14
554 554 Sat Jan 7 2017 Utah Jazz 94 Minnesota Timberwolves 92 2
1817 554 Sat Jan 7 2017 Minnesota Timberwolves 92 Utah Jazz 94 -2
555 555 Sat Jan 7 2017 Denver Nuggets 106 Oklahoma City Thunder 121 -15
1818 555 Sat Jan 7 2017 Oklahoma City Thunder 121 Denver Nuggets 106 15
1819 556 Sat Jan 7 2017 San Antonio Spurs 102 Charlotte Hornets 85 17
556 556 Sat Jan 7 2017 Charlotte Hornets 85 San Antonio Spurs 102 -17
557 557 Sun Jan 8 2017 Philadelphia 76ers 105 Brooklyn Nets 95 10
1820 557 Sun Jan 8 2017 Brooklyn Nets 95 Philadelphia 76ers 105 -10
1821 558 Sun Jan 8 2017 Los Angeles Clippers 98 Miami Heat 86 12
558 558 Sun Jan 8 2017 Miami Heat 86 Los Angeles Clippers 98 -12
559 559 Sun Jan 8 2017 Orlando Magic 95 Los Angeles Lakers 111 -16
1822 559 Sun Jan 8 2017 Los Angeles Lakers 111 Orlando Magic 95 16
1823 560 Sun Jan 8 2017 Memphis Grizzlies 88 Utah Jazz 79 9
560 560 Sun Jan 8 2017 Utah Jazz 79 Memphis Grizzlies 88 -9
1824 561 Sun Jan 8 2017 Milwaukee Bucks 101 Washington Wizards 107 -6
561 561 Sun Jan 8 2017 Washington Wizards 107 Milwaukee Bucks 101 6
1825 562 Sun Jan 8 2017 Phoenix Suns 116 Cleveland Cavaliers 120 -4
562 562 Sun Jan 8 2017 Cleveland Cavaliers 120 Phoenix Suns 116 4
1826 563 Sun Jan 8 2017 Portland Trail Blazers 124 Detroit Pistons 125 -1
563 563 Sun Jan 8 2017 Detroit Pistons 125 Portland Trail Blazers 124 1
1827 564 Sun Jan 8 2017 Sacramento Kings 106 Golden State Warriors 117 -11
564 564 Sun Jan 8 2017 Golden State Warriors 117 Sacramento Kings 106 11
565 565 Sun Jan 8 2017 Houston Rockets 129 Toronto Raptors 122 7
1828 565 Sun Jan 8 2017 Toronto Raptors 122 Houston Rockets 129 -7
566 566 Mon Jan 9 2017 Oklahoma City Thunder 109 Chicago Bulls 94 15
1829 566 Mon Jan 9 2017 Chicago Bulls 94 Oklahoma City Thunder 109 -15
1830 567 Mon Jan 9 2017 Minnesota Timberwolves 101 Dallas Mavericks 92 9
567 567 Mon Jan 9 2017 Dallas Mavericks 92 Minnesota Timberwolves 101 -9
1831 568 Mon Jan 9 2017 New York Knicks 96 New Orleans Pelicans 110 -14
568 568 Mon Jan 9 2017 New Orleans Pelicans 110 New York Knicks 96 14
1832 569 Tue Jan 10 2017 Brooklyn Nets 97 Atlanta Hawks 117 -20
569 569 Tue Jan 10 2017 Atlanta Hawks 117 Brooklyn Nets 97 20
1833 570 Tue Jan 10 2017 Golden State Warriors 107 Miami Heat 95 12
570 570 Tue Jan 10 2017 Miami Heat 95 Golden State Warriors 107 -12
571 571 Tue Jan 10 2017 Charlotte Hornets 114 Houston Rockets 121 -7
1834 571 Tue Jan 10 2017 Houston Rockets 121 Charlotte Hornets 114 7
1835 572 Tue Jan 10 2017 Los Angeles Lakers 87 Portland Trail Blazers 108 -21
572 572 Tue Jan 10 2017 Portland Trail Blazers 108 Los Angeles Lakers 87 21
1836 573 Tue Jan 10 2017 Sacramento Kings 100 Detroit Pistons 94 6
573 573 Tue Jan 10 2017 Detroit Pistons 94 Sacramento Kings 100 -6
574 574 Tue Jan 10 2017 Milwaukee Bucks 109 San Antonio Spurs 107 2
1837 574 Tue Jan 10 2017 San Antonio Spurs 107 Milwaukee Bucks 109 -2
575 575 Tue Jan 10 2017 Boston Celtics 106 Toronto Raptors 114 -8
1838 575 Tue Jan 10 2017 Toronto Raptors 114 Boston Celtics 106 8
576 576 Tue Jan 10 2017 Cleveland Cavaliers 92 Utah Jazz 100 -8
1839 576 Tue Jan 10 2017 Utah Jazz 100 Cleveland Cavaliers 92 8
577 577 Tue Jan 10 2017 Chicago Bulls 99 Washington Wizards 101 -2
1840 577 Tue Jan 10 2017 Washington Wizards 101 Chicago Bulls 99 2
1841 578 Wed Jan 11 2017 Boston Celtics 117 Washington Wizards 108 9
578 578 Wed Jan 11 2017 Washington Wizards 108 Boston Celtics 117 -9
1842 579 Wed Jan 11 2017 Los Angeles Clippers 105 Orlando Magic 96 9
579 579 Wed Jan 11 2017 Orlando Magic 96 Los Angeles Clippers 105 -9
1843 580 Wed Jan 11 2017 Minnesota Timberwolves 119 Houston Rockets 105 14
580 580 Wed Jan 11 2017 Houston Rockets 105 Minnesota Timberwolves 119 -14
581 581 Wed Jan 11 2017 Memphis Grizzlies 95 Oklahoma City Thunder 103 -8
1844 581 Wed Jan 11 2017 Oklahoma City Thunder 103 Memphis Grizzlies 95 8
1845 582 Wed Jan 11 2017 Philadelphia 76ers 98 New York Knicks 97 1
582 582 Wed Jan 11 2017 New York Knicks 97 Philadelphia 76ers 98 -1
1846 583 Wed Jan 11 2017 Portland Trail Blazers 102 Cleveland Cavaliers 86 16
583 583 Wed Jan 11 2017 Cleveland Cavaliers 86 Portland Trail Blazers 102 -16
1847 584 Thu Jan 12 2017 Brooklyn Nets 95 New Orleans Pelicans 104 -9
584 584 Thu Jan 12 2017 New Orleans Pelicans 104 Brooklyn Nets 95 9
1848 585 Thu Jan 12 2017 Denver Nuggets 140 Indiana Pacers 112 28
585 585 Thu Jan 12 2017 Indiana Pacers 112 Denver Nuggets 140 -28
1849 586 Thu Jan 12 2017 Golden State Warriors 127 Detroit Pistons 107 20
586 586 Thu Jan 12 2017 Detroit Pistons 107 Golden State Warriors 127 -20
587 587 Thu Jan 12 2017 Chicago Bulls 89 New York Knicks 104 -15
1850 587 Thu Jan 12 2017 New York Knicks 104 Chicago Bulls 89 15
588 588 Thu Jan 12 2017 Dallas Mavericks 113 Phoenix Suns 108 5
1851 588 Thu Jan 12 2017 Phoenix Suns 108 Dallas Mavericks 113 -5
589 589 Thu Jan 12 2017 Los Angeles Lakers 94 San Antonio Spurs 134 -40
1852 589 Thu Jan 12 2017 San Antonio Spurs 134 Los Angeles Lakers 94 40
590 590 Fri Jan 13 2017 Boston Celtics 103 Atlanta Hawks 101 2
1853 590 Fri Jan 13 2017 Atlanta Hawks 101 Boston Celtics 103 -2
591 591 Fri Jan 13 2017 Memphis Grizzlies 110 Houston Rockets 105 5
1854 591 Fri Jan 13 2017 Houston Rockets 105 Memphis Grizzlies 110 -5
592 592 Fri Jan 13 2017 Miami Heat 108 Milwaukee Bucks 116 -8
1855 592 Fri Jan 13 2017 Milwaukee Bucks 116 Miami Heat 108 8
593 593 Fri Jan 13 2017 Oklahoma City Thunder 86 Minnesota Timberwolves 96 -10
1856 593 Fri Jan 13 2017 Minnesota Timberwolves 96 Oklahoma City Thunder 86 10
594 594 Fri Jan 13 2017 Charlotte Hornets 93 Philadelphia 76ers 102 -9
1857 594 Fri Jan 13 2017 Philadelphia 76ers 102 Charlotte Hornets 93 9
595 595 Fri Jan 13 2017 Orlando Magic 115 Portland Trail Blazers 109 6
1858 595 Fri Jan 13 2017 Portland Trail Blazers 109 Orlando Magic 115 -6
1859 596 Fri Jan 13 2017 Sacramento Kings 108 Cleveland Cavaliers 120 -12
596 596 Fri Jan 13 2017 Cleveland Cavaliers 120 Sacramento Kings 108 12
1860 597 Fri Jan 13 2017 Toronto Raptors 132 Brooklyn Nets 113 19
597 597 Fri Jan 13 2017 Brooklyn Nets 113 Toronto Raptors 132 -19
1861 598 Fri Jan 13 2017 Utah Jazz 110 Detroit Pistons 77 33
598 598 Fri Jan 13 2017 Detroit Pistons 77 Utah Jazz 110 -33
1862 599 Sat Jan 14 2017 Chicago Bulls 107 New Orleans Pelicans 99 8
599 599 Sat Jan 14 2017 New Orleans Pelicans 99 Chicago Bulls 107 -8
1863 600 Sat Jan 14 2017 Los Angeles Clippers 113 Los Angeles Lakers 97 16
600 600 Sat Jan 14 2017 Los Angeles Lakers 97 Los Angeles Clippers 113 -16
1864 601 Sat Jan 14 2017 Phoenix Suns 108 San Antonio Spurs 105 3
601 601 Sat Jan 14 2017 San Antonio Spurs 105 Phoenix Suns 108 -3
602 602 Sat Jan 14 2017 Orlando Magic 107 Utah Jazz 114 -7
1865 602 Sat Jan 14 2017 Utah Jazz 114 Orlando Magic 107 7
1866 603 Sat Jan 14 2017 Washington Wizards 109 Philadelphia 76ers 93 16
603 603 Sat Jan 14 2017 Philadelphia 76ers 93 Washington Wizards 109 -16
1867 604 Sun Jan 15 2017 Atlanta Hawks 111 Milwaukee Bucks 98 13
604 604 Sun Jan 15 2017 Milwaukee Bucks 98 Atlanta Hawks 111 -13
605 605 Sun Jan 15 2017 Houston Rockets 137 Brooklyn Nets 112 25
1868 605 Sun Jan 15 2017 Brooklyn Nets 112 Houston Rockets 137 -25
606 606 Sun Jan 15 2017 Minnesota Timberwolves 87 Dallas Mavericks 98 -11
1869 606 Sun Jan 15 2017 Dallas Mavericks 98 Minnesota Timberwolves 87 11
607 607 Sun Jan 15 2017 Detroit Pistons 102 Los Angeles Lakers 97 5
1870 607 Sun Jan 15 2017 Los Angeles Lakers 97 Detroit Pistons 102 -5
608 608 Sun Jan 15 2017 Chicago Bulls 108 Memphis Grizzlies 104 4
1871 608 Sun Jan 15 2017 Memphis Grizzlies 104 Chicago Bulls 108 -4
609 609 Sun Jan 15 2017 Oklahoma City Thunder 122 Sacramento Kings 118 4
1872 609 Sun Jan 15 2017 Sacramento Kings 118 Oklahoma City Thunder 122 -4
1873 610 Sun Jan 15 2017 Toronto Raptors 116 New York Knicks 101 15
610 610 Sun Jan 15 2017 New York Knicks 101 Toronto Raptors 116 -15
1874 611 Mon Jan 16 2017 Boston Celtics 108 Charlotte Hornets 98 10
611 611 Mon Jan 16 2017 Charlotte Hornets 98 Boston Celtics 108 -10
1875 612 Mon Jan 16 2017 Denver Nuggets 125 Orlando Magic 112 13
612 612 Mon Jan 16 2017 Orlando Magic 112 Denver Nuggets 125 -13
1876 613 Mon Jan 16 2017 Golden State Warriors 126 Cleveland Cavaliers 91 35
613 613 Mon Jan 16 2017 Cleveland Cavaliers 91 Golden State Warriors 126 -35
614 614 Mon Jan 16 2017 New Orleans Pelicans 95 Indiana Pacers 98 -3
1877 614 Mon Jan 16 2017 Indiana Pacers 98 New Orleans Pelicans 95 3
615 615 Mon Jan 16 2017 Oklahoma City Thunder 98 Los Angeles Clippers 120 -22
1878 615 Mon Jan 16 2017 Los Angeles Clippers 120 Oklahoma City Thunder 98 22
616 616 Mon Jan 16 2017 Philadelphia 76ers 113 Milwaukee Bucks 104 9
1879 616 Mon Jan 16 2017 Milwaukee Bucks 104 Philadelphia 76ers 113 -9
617 617 Mon Jan 16 2017 Atlanta Hawks 108 New York Knicks 107 1
1880 617 Mon Jan 16 2017 New York Knicks 107 Atlanta Hawks 108 -1
618 618 Mon Jan 16 2017 Utah Jazz 106 Phoenix Suns 101 5
1881 618 Mon Jan 16 2017 Phoenix Suns 101 Utah Jazz 106 -5
619 619 Mon Jan 16 2017 Portland Trail Blazers 101 Washington Wizards 120 -19
1882 619 Mon Jan 16 2017 Washington Wizards 120 Portland Trail Blazers 101 19
620 620 Tue Jan 17 2017 Toronto Raptors 119 Brooklyn Nets 109 10
1883 620 Tue Jan 17 2017 Brooklyn Nets 109 Toronto Raptors 119 -10
1884 621 Tue Jan 17 2017 Chicago Bulls 98 Dallas Mavericks 99 -1
621 621 Tue Jan 17 2017 Dallas Mavericks 99 Chicago Bulls 98 1
1885 622 Tue Jan 17 2017 Los Angeles Lakers 121 Denver Nuggets 127 -6
622 622 Tue Jan 17 2017 Denver Nuggets 127 Los Angeles Lakers 121 6
1886 623 Tue Jan 17 2017 Miami Heat 109 Houston Rockets 103 6
623 623 Tue Jan 17 2017 Houston Rockets 103 Miami Heat 109 -6
624 624 Tue Jan 17 2017 Minnesota Timberwolves 114 San Antonio Spurs 122 -8
1887 624 Tue Jan 17 2017 San Antonio Spurs 122 Minnesota Timberwolves 114 8
1888 625 Wed Jan 18 2017 Boston Celtics 106 New York Knicks 117 -11
625 625 Wed Jan 18 2017 New York Knicks 117 Boston Celtics 106 11
626 626 Wed Jan 18 2017 Portland Trail Blazers 85 Charlotte Hornets 107 -22
1889 626 Wed Jan 18 2017 Charlotte Hornets 107 Portland Trail Blazers 85 22
627 627 Wed Jan 18 2017 Atlanta Hawks 95 Detroit Pistons 118 -23
1890 627 Wed Jan 18 2017 Detroit Pistons 118 Atlanta Hawks 95 23
628 628 Wed Jan 18 2017 Oklahoma City Thunder 100 Golden State Warriors 121 -21
1891 628 Wed Jan 18 2017 Golden State Warriors 121 Oklahoma City Thunder 100 21
1892 629 Wed Jan 18 2017 Houston Rockets 111 Milwaukee Bucks 92 19
629 629 Wed Jan 18 2017 Milwaukee Bucks 92 Houston Rockets 111 -19
1893 630 Wed Jan 18 2017 New Orleans Pelicans 118 Orlando Magic 98 20
630 630 Wed Jan 18 2017 Orlando Magic 98 New Orleans Pelicans 118 -20
1894 631 Wed Jan 18 2017 Philadelphia 76ers 94 Toronto Raptors 89 5
631 631 Wed Jan 18 2017 Toronto Raptors 89 Philadelphia 76ers 94 -5
632 632 Wed Jan 18 2017 Indiana Pacers 106 Sacramento Kings 100 6
1895 632 Wed Jan 18 2017 Sacramento Kings 100 Indiana Pacers 106 -6
1896 633 Wed Jan 18 2017 Washington Wizards 104 Memphis Grizzlies 101 3
633 633 Wed Jan 18 2017 Memphis Grizzlies 101 Washington Wizards 104 -3
1897 634 Thu Jan 19 2017 Cleveland Cavaliers 118 Phoenix Suns 103 15
634 634 Thu Jan 19 2017 Phoenix Suns 103 Cleveland Cavaliers 118 -15
1898 635 Thu Jan 19 2017 Los Angeles Clippers 101 Minnesota Timberwolves 104 -3
635 635 Thu Jan 19 2017 Minnesota Timberwolves 104 Los Angeles Clippers 101 3
1899 636 Thu Jan 19 2017 Miami Heat 99 Dallas Mavericks 95 4
636 636 Thu Jan 19 2017 Dallas Mavericks 95 Miami Heat 99 -4
1900 637 Thu Jan 19 2017 New York Knicks 110 Washington Wizards 113 -3
637 637 Thu Jan 19 2017 Washington Wizards 113 New York Knicks 110 3
638 638 Thu Jan 19 2017 Denver Nuggets 104 San Antonio Spurs 118 -14
1901 638 Thu Jan 19 2017 San Antonio Spurs 118 Denver Nuggets 104 14
1902 639 Fri Jan 20 2017 Atlanta Hawks 102 Chicago Bulls 93 9
639 639 Fri Jan 20 2017 Chicago Bulls 93 Atlanta Hawks 102 -9
640 640 Fri Jan 20 2017 Toronto Raptors 78 Charlotte Hornets 113 -35
1903 640 Fri Jan 20 2017 Charlotte Hornets 113 Toronto Raptors 78 35
1904 641 Fri Jan 20 2017 Dallas Mavericks 107 Utah Jazz 112 -5
641 641 Fri Jan 20 2017 Utah Jazz 112 Dallas Mavericks 107 5
642 642 Fri Jan 20 2017 Golden State Warriors 125 Houston Rockets 108 17
1905 642 Fri Jan 20 2017 Houston Rockets 108 Golden State Warriors 125 -17
1906 643 Fri Jan 20 2017 Los Angeles Lakers 108 Indiana Pacers 95 13
643 643 Fri Jan 20 2017 Indiana Pacers 95 Los Angeles Lakers 108 -13
644 644 Fri Jan 20 2017 Sacramento Kings 91 Memphis Grizzlies 107 -16
1907 644 Fri Jan 20 2017 Memphis Grizzlies 107 Sacramento Kings 91 16
645 645 Fri Jan 20 2017 Brooklyn Nets 143 New Orleans Pelicans 114 29
1908 645 Fri Jan 20 2017 New Orleans Pelicans 114 Brooklyn Nets 143 -29
1909 646 Fri Jan 20 2017 Orlando Magic 112 Milwaukee Bucks 96 16
646 646 Fri Jan 20 2017 Milwaukee Bucks 96 Orlando Magic 112 -16
1910 647 Fri Jan 20 2017 Philadelphia 76ers 93 Portland Trail Blazers 92 1
647 647 Fri Jan 20 2017 Portland Trail Blazers 92 Philadelphia 76ers 93 -1
1911 648 Sat Jan 21 2017 Atlanta Hawks 110 Philadelphia 76ers 93 17
648 648 Sat Jan 21 2017 Philadelphia 76ers 93 Atlanta Hawks 110 -17
649 649 Sat Jan 21 2017 Portland Trail Blazers 127 Boston Celtics 123 4
1912 649 Sat Jan 21 2017 Boston Celtics 123 Portland Trail Blazers 127 -4
1913 650 Sat Jan 21 2017 Chicago Bulls 102 Sacramento Kings 99 3
650 650 Sat Jan 21 2017 Sacramento Kings 99 Chicago Bulls 102 -3
1914 651 Sat Jan 21 2017 Charlotte Hornets 112 Brooklyn Nets 105 7
651 651 Sat Jan 21 2017 Brooklyn Nets 105 Charlotte Hornets 112 -7
1915 652 Sat Jan 21 2017 Cleveland Cavaliers 115 San Antonio Spurs 118 -3
652 652 Sat Jan 21 2017 San Antonio Spurs 118 Cleveland Cavaliers 115 3
653 653 Sat Jan 21 2017 Los Angeles Clippers 98 Denver Nuggets 123 -25
1916 653 Sat Jan 21 2017 Denver Nuggets 123 Los Angeles Clippers 98 25
1917 654 Sat Jan 21 2017 Detroit Pistons 113 Washington Wizards 112 1
654 654 Sat Jan 21 2017 Washington Wizards 112 Detroit Pistons 113 -1
1918 655 Sat Jan 21 2017 Memphis Grizzlies 95 Houston Rockets 119 -24
655 655 Sat Jan 21 2017 Houston Rockets 119 Memphis Grizzlies 95 24
1919 656 Sat Jan 21 2017 Miami Heat 109 Milwaukee Bucks 97 12
656 656 Sat Jan 21 2017 Milwaukee Bucks 97 Miami Heat 109 -12
1920 657 Sat Jan 21 2017 New York Knicks 105 Phoenix Suns 107 -2
657 657 Sat Jan 21 2017 Phoenix Suns 107 New York Knicks 105 2
1921 658 Sat Jan 21 2017 Utah Jazz 109 Indiana Pacers 100 9
658 658 Sat Jan 21 2017 Indiana Pacers 100 Utah Jazz 109 -9
1922 659 Sun Jan 22 2017 Dallas Mavericks 122 Los Angeles Lakers 73 49
659 659 Sun Jan 22 2017 Los Angeles Lakers 73 Dallas Mavericks 122 -49
1923 660 Sun Jan 22 2017 Minnesota Timberwolves 111 Denver Nuggets 108 3
660 660 Sun Jan 22 2017 Denver Nuggets 108 Minnesota Timberwolves 111 -3
661 661 Sun Jan 22 2017 Golden State Warriors 118 Orlando Magic 98 20
1924 661 Sun Jan 22 2017 Orlando Magic 98 Golden State Warriors 118 -20
662 662 Sun Jan 22 2017 Phoenix Suns 115 Toronto Raptors 103 12
1925 662 Sun Jan 22 2017 Toronto Raptors 103 Phoenix Suns 115 -12
663 663 Mon Jan 23 2017 Los Angeles Clippers 115 Atlanta Hawks 105 10
1926 663 Mon Jan 23 2017 Atlanta Hawks 105 Los Angeles Clippers 115 -10
664 664 Mon Jan 23 2017 San Antonio Spurs 112 Brooklyn Nets 86 26
1927 664 Mon Jan 23 2017 Brooklyn Nets 86 San Antonio Spurs 112 -26
665 665 Mon Jan 23 2017 Washington Wizards 109 Charlotte Hornets 99 10
1928 665 Mon Jan 23 2017 Charlotte Hornets 99 Washington Wizards 109 -10
666 666 Mon Jan 23 2017 Sacramento Kings 109 Detroit Pistons 104 5
1929 666 Mon Jan 23 2017 Detroit Pistons 104 Sacramento Kings 109 -5
1930 667 Mon Jan 23 2017 Indiana Pacers 103 New York Knicks 109 -6
667 667 Mon Jan 23 2017 New York Knicks 109 Indiana Pacers 103 6
668 668 Mon Jan 23 2017 Golden State Warriors 102 Miami Heat 105 -3
1931 668 Mon Jan 23 2017 Miami Heat 105 Golden State Warriors 102 3
1932 669 Mon Jan 23 2017 Milwaukee Bucks 127 Houston Rockets 114 13
669 669 Mon Jan 23 2017 Houston Rockets 114 Milwaukee Bucks 127 -13
670 670 Mon Jan 23 2017 Cleveland Cavaliers 122 New Orleans Pelicans 124 -2
1933 670 Mon Jan 23 2017 New Orleans Pelicans 124 Cleveland Cavaliers 122 2
671 671 Mon Jan 23 2017 Oklahoma City Thunder 97 Utah Jazz 95 2
1934 671 Mon Jan 23 2017 Utah Jazz 95 Oklahoma City Thunder 97 -2
672 672 Tue Jan 24 2017 Utah Jazz 93 Denver Nuggets 103 -10
1935 672 Tue Jan 24 2017 Denver Nuggets 103 Utah Jazz 93 10
1936 673 Tue Jan 24 2017 Orlando Magic 92 Chicago Bulls 100 -8
673 673 Tue Jan 24 2017 Chicago Bulls 100 Orlando Magic 92 8
1937 674 Tue Jan 24 2017 Philadelphia 76ers 121 Los Angeles Clippers 110 11
674 674 Tue Jan 24 2017 Los Angeles Clippers 110 Philadelphia 76ers 121 -11
1938 675 Tue Jan 24 2017 Phoenix Suns 111 Minnesota Timberwolves 112 -1
675 675 Tue Jan 24 2017 Minnesota Timberwolves 112 Phoenix Suns 111 1
676 676 Tue Jan 24 2017 San Antonio Spurs 108 Toronto Raptors 106 2
1939 676 Tue Jan 24 2017 Toronto Raptors 106 San Antonio Spurs 108 -2
677 677 Tue Jan 24 2017 Boston Celtics 108 Washington Wizards 123 -15
1940 677 Tue Jan 24 2017 Washington Wizards 123 Boston Celtics 108 15
1941 678 Wed Jan 25 2017 Boston Celtics 120 Houston Rockets 109 11
678 678 Wed Jan 25 2017 Houston Rockets 109 Boston Celtics 120 -11
1942 679 Wed Jan 25 2017 Brooklyn Nets 106 Miami Heat 109 -3
679 679 Wed Jan 25 2017 Miami Heat 109 Brooklyn Nets 106 3
1943 680 Wed Jan 25 2017 Chicago Bulls 114 Atlanta Hawks 119 -5
680 680 Wed Jan 25 2017 Atlanta Hawks 119 Chicago Bulls 114 5
1944 681 Wed Jan 25 2017 Charlotte Hornets 103 Golden State Warriors 113 -10
681 681 Wed Jan 25 2017 Golden State Warriors 113 Charlotte Hornets 103 10
682 682 Wed Jan 25 2017 Sacramento Kings 116 Cleveland Cavaliers 112 4
1945 682 Wed Jan 25 2017 Cleveland Cavaliers 112 Sacramento Kings 116 -4
683 683 Wed Jan 25 2017 New York Knicks 95 Dallas Mavericks 103 -8
1946 683 Wed Jan 25 2017 Dallas Mavericks 103 New York Knicks 95 8
684 684 Wed Jan 25 2017 Toronto Raptors 99 Memphis Grizzlies 101 -2
1947 684 Wed Jan 25 2017 Memphis Grizzlies 101 Toronto Raptors 99 2
1948 685 Wed Jan 25 2017 Milwaukee Bucks 109 Philadelphia 76ers 114 -5
685 685 Wed Jan 25 2017 Philadelphia 76ers 114 Milwaukee Bucks 109 5
1949 686 Wed Jan 25 2017 New Orleans Pelicans 105 Oklahoma City Thunder 114 -9
686 686 Wed Jan 25 2017 Oklahoma City Thunder 114 New Orleans Pelicans 105 9
1950 687 Wed Jan 25 2017 Portland Trail Blazers 105 Los Angeles Lakers 98 7
687 687 Wed Jan 25 2017 Los Angeles Lakers 98 Portland Trail Blazers 105 -7
688 688 Thu Jan 26 2017 Phoenix Suns 120 Denver Nuggets 127 -7
1951 688 Thu Jan 26 2017 Denver Nuggets 127 Phoenix Suns 120 7
689 689 Thu Jan 26 2017 Indiana Pacers 109 Minnesota Timberwolves 103 6
1952 689 Thu Jan 26 2017 Minnesota Timberwolves 103 Indiana Pacers 109 -6
690 690 Thu Jan 26 2017 Dallas Mavericks 98 Oklahoma City Thunder 109 -11
1953 690 Thu Jan 26 2017 Oklahoma City Thunder 109 Dallas Mavericks 98 11
691 691 Thu Jan 26 2017 Los Angeles Lakers 88 Utah Jazz 96 -8
1954 691 Thu Jan 26 2017 Utah Jazz 96 Los Angeles Lakers 88 8
692 692 Fri Jan 27 2017 Washington Wizards 112 Atlanta Hawks 86 26
1955 692 Fri Jan 27 2017 Atlanta Hawks 86 Washington Wizards 112 -26
693 693 Fri Jan 27 2017 Orlando Magic 98 Boston Celtics 128 -30
1956 693 Fri Jan 27 2017 Boston Celtics 128 Orlando Magic 98 30
694 694 Fri Jan 27 2017 Miami Heat 100 Chicago Bulls 88 12
1957 694 Fri Jan 27 2017 Chicago Bulls 88 Miami Heat 100 -12
695 695 Fri Jan 27 2017 Brooklyn Nets 116 Cleveland Cavaliers 124 -8
1958 695 Fri Jan 27 2017 Cleveland Cavaliers 124 Brooklyn Nets 116 8
696 696 Fri Jan 27 2017 Sacramento Kings 111 Indiana Pacers 115 -4
1959 696 Fri Jan 27 2017 Indiana Pacers 115 Sacramento Kings 111 4
697 697 Fri Jan 27 2017 San Antonio Spurs 103 New Orleans Pelicans 119 -16
1960 697 Fri Jan 27 2017 New Orleans Pelicans 119 San Antonio Spurs 103 16
698 698 Fri Jan 27 2017 Charlotte Hornets 107 New York Knicks 110 -3
1961 698 Fri Jan 27 2017 New York Knicks 110 Charlotte Hornets 107 3
699 699 Fri Jan 27 2017 Houston Rockets 123 Philadelphia 76ers 118 5
1962 699 Fri Jan 27 2017 Philadelphia 76ers 118 Houston Rockets 123 -5
700 700 Fri Jan 27 2017 Memphis Grizzlies 109 Portland Trail Blazers 112 -3
1963 700 Fri Jan 27 2017 Portland Trail Blazers 112 Memphis Grizzlies 109 3
1964 701 Fri Jan 27 2017 Toronto Raptors 102 Milwaukee Bucks 86 16
701 701 Fri Jan 27 2017 Milwaukee Bucks 86 Toronto Raptors 102 -16
1965 702 Sat Jan 28 2017 Charlotte Hornets 106 Sacramento Kings 109 -3
702 702 Sat Jan 28 2017 Sacramento Kings 109 Charlotte Hornets 106 3
1966 703 Sat Jan 28 2017 Golden State Warriors 144 Los Angeles Clippers 98 46
703 703 Sat Jan 28 2017 Los Angeles Clippers 98 Golden State Warriors 144 -46
1967 704 Sat Jan 28 2017 Miami Heat 116 Detroit Pistons 103 13
704 704 Sat Jan 28 2017 Detroit Pistons 103 Miami Heat 116 -13
1968 705 Sat Jan 28 2017 Milwaukee Bucks 108 Boston Celtics 112 -4
705 705 Sat Jan 28 2017 Boston Celtics 112 Milwaukee Bucks 108 4
1969 706 Sat Jan 28 2017 Minnesota Timberwolves 129 Brooklyn Nets 109 20
706 706 Sat Jan 28 2017 Brooklyn Nets 109 Minnesota Timberwolves 129 -20
1970 707 Sat Jan 28 2017 Phoenix Suns 112 Denver Nuggets 123 -11
707 707 Sat Jan 28 2017 Denver Nuggets 123 Phoenix Suns 112 11
1971 708 Sat Jan 28 2017 Utah Jazz 95 Memphis Grizzlies 102 -7
708 708 Sat Jan 28 2017 Memphis Grizzlies 102 Utah Jazz 95 7
1972 709 Sun Jan 29 2017 Atlanta Hawks 142 New York Knicks 139 3
709 709 Sun Jan 29 2017 New York Knicks 139 Atlanta Hawks 142 -3
1973 710 Sun Jan 29 2017 Chicago Bulls 121 Philadelphia 76ers 108 13
710 710 Sun Jan 29 2017 Philadelphia 76ers 108 Chicago Bulls 121 -13
1974 711 Sun Jan 29 2017 Cleveland Cavaliers 107 Oklahoma City Thunder 91 16
711 711 Sun Jan 29 2017 Oklahoma City Thunder 91 Cleveland Cavaliers 107 -16
1975 712 Sun Jan 29 2017 Indiana Pacers 120 Houston Rockets 101 19
712 712 Sun Jan 29 2017 Houston Rockets 101 Indiana Pacers 120 -19
1976 713 Sun Jan 29 2017 New Orleans Pelicans 94 Washington Wizards 107 -13
713 713 Sun Jan 29 2017 Washington Wizards 107 New Orleans Pelicans 94 13
1977 714 Sun Jan 29 2017 Portland Trail Blazers 111 Golden State Warriors 113 -2
714 714 Sun Jan 29 2017 Golden State Warriors 113 Portland Trail Blazers 111 2
1978 715 Sun Jan 29 2017 San Antonio Spurs 101 Dallas Mavericks 105 -4
715 715 Sun Jan 29 2017 Dallas Mavericks 105 San Antonio Spurs 101 4
1979 716 Sun Jan 29 2017 Toronto Raptors 113 Orlando Magic 114 -1
716 716 Sun Jan 29 2017 Orlando Magic 114 Toronto Raptors 113 1
1980 717 Mon Jan 30 2017 Boston Celtics 113 Detroit Pistons 109 4
717 717 Mon Jan 30 2017 Detroit Pistons 109 Boston Celtics 113 -4
1981 718 Mon Jan 30 2017 Dallas Mavericks 104 Cleveland Cavaliers 97 7
718 718 Mon Jan 30 2017 Cleveland Cavaliers 97 Dallas Mavericks 104 -7
1982 719 Mon Jan 30 2017 Miami Heat 104 Brooklyn Nets 96 8
719 719 Mon Jan 30 2017 Brooklyn Nets 96 Miami Heat 104 -8
1983 720 Mon Jan 30 2017 Minnesota Timberwolves 111 Orlando Magic 105 6
720 720 Mon Jan 30 2017 Orlando Magic 105 Minnesota Timberwolves 111 -6
1984 721 Mon Jan 30 2017 Philadelphia 76ers 122 Sacramento Kings 119 3
721 721 Mon Jan 30 2017 Sacramento Kings 119 Philadelphia 76ers 122 -3
1985 722 Mon Jan 30 2017 Phoenix Suns 96 Memphis Grizzlies 115 -19
722 722 Mon Jan 30 2017 Memphis Grizzlies 115 Phoenix Suns 96 19
1986 723 Tue Jan 31 2017 Houston Rockets 105 Sacramento Kings 83 22
723 723 Tue Jan 31 2017 Sacramento Kings 83 Houston Rockets 105 -22
724 724 Tue Jan 31 2017 Denver Nuggets 116 Los Angeles Lakers 120 -4
1987 724 Tue Jan 31 2017 Los Angeles Lakers 120 Denver Nuggets 116 4
1988 725 Tue Jan 31 2017 Portland Trail Blazers 115 Charlotte Hornets 98 17
725 725 Tue Jan 31 2017 Charlotte Hornets 98 Portland Trail Blazers 115 -17
1989 726 Tue Jan 31 2017 San Antonio Spurs 108 Oklahoma City Thunder 94 14
726 726 Tue Jan 31 2017 Oklahoma City Thunder 94 San Antonio Spurs 108 -14
1990 727 Tue Jan 31 2017 Toronto Raptors 108 New Orleans Pelicans 106 2
727 727 Tue Jan 31 2017 New Orleans Pelicans 106 Toronto Raptors 108 -2
728 728 Tue Jan 31 2017 New York Knicks 101 Washington Wizards 117 -16
1991 728 Tue Jan 31 2017 Washington Wizards 117 New York Knicks 101 16
729 729 Wed Feb 1 2017 Toronto Raptors 104 Boston Celtics 109 -5
1992 729 Wed Feb 1 2017 Boston Celtics 109 Toronto Raptors 104 5
1993 730 Wed Feb 1 2017 Brooklyn Nets 90 New York Knicks 95 -5
730 730 Wed Feb 1 2017 New York Knicks 95 Brooklyn Nets 90 5
731 731 Wed Feb 1 2017 Minnesota Timberwolves 97 Cleveland Cavaliers 125 -28
1994 731 Wed Feb 1 2017 Cleveland Cavaliers 125 Minnesota Timberwolves 97 28
732 732 Wed Feb 1 2017 Philadelphia 76ers 95 Dallas Mavericks 113 -18
1995 732 Wed Feb 1 2017 Dallas Mavericks 113 Philadelphia 76ers 95 18
1996 733 Wed Feb 1 2017 Denver Nuggets 99 Memphis Grizzlies 119 -20
733 733 Wed Feb 1 2017 Memphis Grizzlies 119 Denver Nuggets 99 20
1997 734 Wed Feb 1 2017 Detroit Pistons 118 New Orleans Pelicans 98 20
734 734 Wed Feb 1 2017 New Orleans Pelicans 98 Detroit Pistons 118 -20
1998 735 Wed Feb 1 2017 Golden State Warriors 126 Charlotte Hornets 111 15
735 735 Wed Feb 1 2017 Charlotte Hornets 111 Golden State Warriors 126 -15
736 736 Wed Feb 1 2017 Atlanta Hawks 93 Miami Heat 116 -23
1999 736 Wed Feb 1 2017 Miami Heat 116 Atlanta Hawks 93 23
2000 737 Wed Feb 1 2017 Oklahoma City Thunder 100 Chicago Bulls 128 -28
737 737 Wed Feb 1 2017 Chicago Bulls 128 Oklahoma City Thunder 100 28
2001 738 Wed Feb 1 2017 Orlando Magic 88 Indiana Pacers 98 -10
738 738 Wed Feb 1 2017 Indiana Pacers 98 Orlando Magic 88 10
739 739 Wed Feb 1 2017 Los Angeles Clippers 124 Phoenix Suns 114 10
2002 739 Wed Feb 1 2017 Phoenix Suns 114 Los Angeles Clippers 124 -10
2003 740 Wed Feb 1 2017 Utah Jazz 104 Milwaukee Bucks 88 16
740 740 Wed Feb 1 2017 Milwaukee Bucks 88 Utah Jazz 104 -16
741 741 Thu Feb 2 2017 Atlanta Hawks 113 Houston Rockets 108 5
2004 741 Thu Feb 2 2017 Houston Rockets 108 Atlanta Hawks 113 -5
2005 742 Thu Feb 2 2017 Los Angeles Clippers 120 Golden State Warriors 133 -13
742 742 Thu Feb 2 2017 Golden State Warriors 133 Los Angeles Clippers 120 13
743 743 Thu Feb 2 2017 Philadelphia 76ers 86 San Antonio Spurs 102 -16
2006 743 Thu Feb 2 2017 San Antonio Spurs 102 Philadelphia 76ers 86 16
2007 744 Thu Feb 2 2017 Washington Wizards 116 Los Angeles Lakers 108 8
744 744 Thu Feb 2 2017 Los Angeles Lakers 108 Washington Wizards 116 -8
745 745 Fri Feb 3 2017 Los Angeles Lakers 107 Boston Celtics 113 -6
2008 745 Fri Feb 3 2017 Boston Celtics 113 Los Angeles Lakers 107 6
746 746 Fri Feb 3 2017 Indiana Pacers 106 Brooklyn Nets 97 9
2009 746 Fri Feb 3 2017 Brooklyn Nets 97 Indiana Pacers 106 -9
747 747 Fri Feb 3 2017 Milwaukee Bucks 117 Denver Nuggets 121 -4
2010 747 Fri Feb 3 2017 Denver Nuggets 121 Milwaukee Bucks 117 4
2011 748 Fri Feb 3 2017 Detroit Pistons 116 Minnesota Timberwolves 108 8
748 748 Fri Feb 3 2017 Minnesota Timberwolves 108 Detroit Pistons 116 -8
749 749 Fri Feb 3 2017 Chicago Bulls 117 Houston Rockets 121 -4
2012 749 Fri Feb 3 2017 Houston Rockets 121 Chicago Bulls 117 4
750 750 Fri Feb 3 2017 Memphis Grizzlies 102 Oklahoma City Thunder 114 -12
2013 750 Fri Feb 3 2017 Oklahoma City Thunder 114 Memphis Grizzlies 102 12
2014 751 Fri Feb 3 2017 Orlando Magic 102 Toronto Raptors 94 8
751 751 Fri Feb 3 2017 Toronto Raptors 94 Orlando Magic 102 -8
2015 752 Fri Feb 3 2017 Portland Trail Blazers 104 Dallas Mavericks 108 -4
752 752 Fri Feb 3 2017 Dallas Mavericks 108 Portland Trail Blazers 104 4
753 753 Fri Feb 3 2017 Phoenix Suns 105 Sacramento Kings 103 2
2016 753 Fri Feb 3 2017 Sacramento Kings 103 Phoenix Suns 105 -2
754 754 Sat Feb 4 2017 Orlando Magic 86 Atlanta Hawks 113 -27
2017 754 Sat Feb 4 2017 Atlanta Hawks 113 Orlando Magic 86 27
755 755 Sat Feb 4 2017 Detroit Pistons 84 Indiana Pacers 105 -21
2018 755 Sat Feb 4 2017 Indiana Pacers 105 Detroit Pistons 84 21
2019 756 Sat Feb 4 2017 Miami Heat 125 Philadelphia 76ers 102 23
756 756 Sat Feb 4 2017 Philadelphia 76ers 102 Miami Heat 125 -23
757 757 Sat Feb 4 2017 Memphis Grizzlies 107 Minnesota Timberwolves 99 8
2020 757 Sat Feb 4 2017 Minnesota Timberwolves 99 Memphis Grizzlies 107 -8
758 758 Sat Feb 4 2017 Cleveland Cavaliers 111 New York Knicks 104 7
2021 758 Sat Feb 4 2017 New York Knicks 104 Cleveland Cavaliers 111 -7
2022 759 Sat Feb 4 2017 Phoenix Suns 112 Milwaukee Bucks 137 -25
759 759 Sat Feb 4 2017 Milwaukee Bucks 137 Phoenix Suns 112 25
760 760 Sat Feb 4 2017 Golden State Warriors 106 Sacramento Kings 109 -3
2023 760 Sat Feb 4 2017 Sacramento Kings 109 Golden State Warriors 106 3
761 761 Sat Feb 4 2017 Denver Nuggets 97 San Antonio Spurs 121 -24
2024 761 Sat Feb 4 2017 San Antonio Spurs 121 Denver Nuggets 97 24
762 762 Sat Feb 4 2017 Charlotte Hornets 98 Utah Jazz 105 -7
2025 762 Sat Feb 4 2017 Utah Jazz 105 Charlotte Hornets 98 7
763 763 Sat Feb 4 2017 New Orleans Pelicans 91 Washington Wizards 105 -14
2026 763 Sat Feb 4 2017 Washington Wizards 105 New Orleans Pelicans 91 14
2027 764 Sun Feb 5 2017 Boston Celtics 107 Los Angeles Clippers 102 5
764 764 Sun Feb 5 2017 Los Angeles Clippers 102 Boston Celtics 107 -5
2028 765 Sun Feb 5 2017 Brooklyn Nets 95 Toronto Raptors 103 -8
765 765 Sun Feb 5 2017 Toronto Raptors 103 Brooklyn Nets 95 8
2029 766 Sun Feb 5 2017 Oklahoma City Thunder 105 Portland Trail Blazers 99 6
766 766 Sun Feb 5 2017 Portland Trail Blazers 99 Oklahoma City Thunder 105 -6
767 767 Mon Feb 6 2017 Utah Jazz 120 Atlanta Hawks 95 25
2030 767 Mon Feb 6 2017 Atlanta Hawks 95 Utah Jazz 120 -25
768 768 Mon Feb 6 2017 Dallas Mavericks 87 Denver Nuggets 110 -23
2031 768 Mon Feb 6 2017 Denver Nuggets 110 Dallas Mavericks 87 23
769 769 Mon Feb 6 2017 Philadelphia 76ers 96 Detroit Pistons 113 -17
2032 769 Mon Feb 6 2017 Detroit Pistons 113 Philadelphia 76ers 96 17
770 770 Mon Feb 6 2017 Oklahoma City Thunder 90 Indiana Pacers 93 -3
2033 770 Mon Feb 6 2017 Indiana Pacers 93 Oklahoma City Thunder 90 3
2034 771 Mon Feb 6 2017 Memphis Grizzlies 89 San Antonio Spurs 74 15
771 771 Mon Feb 6 2017 San Antonio Spurs 74 Memphis Grizzlies 89 -15
2035 772 Mon Feb 6 2017 Minnesota Timberwolves 113 Miami Heat 115 -2
772 772 Mon Feb 6 2017 Miami Heat 115 Minnesota Timberwolves 113 2
2036 773 Mon Feb 6 2017 New Orleans Pelicans 111 Phoenix Suns 106 5
773 773 Mon Feb 6 2017 Phoenix Suns 106 New Orleans Pelicans 111 -5
774 774 Mon Feb 6 2017 Los Angeles Lakers 121 New York Knicks 107 14
2037 774 Mon Feb 6 2017 New York Knicks 107 Los Angeles Lakers 121 -14
2038 775 Mon Feb 6 2017 Sacramento Kings 107 Chicago Bulls 112 -5
775 775 Mon Feb 6 2017 Chicago Bulls 112 Sacramento Kings 107 5
776 776 Mon Feb 6 2017 Los Angeles Clippers 109 Toronto Raptors 118 -9
2039 776 Mon Feb 6 2017 Toronto Raptors 118 Los Angeles Clippers 109 9
2040 777 Mon Feb 6 2017 Washington Wizards 135 Cleveland Cavaliers 140 -5
777 777 Mon Feb 6 2017 Cleveland Cavaliers 140 Washington Wizards 135 5
778 778 Tue Feb 7 2017 Brooklyn Nets 107 Charlotte Hornets 111 -4
2041 778 Tue Feb 7 2017 Charlotte Hornets 111 Brooklyn Nets 107 4
2042 779 Tue Feb 7 2017 Dallas Mavericks 113 Portland Trail Blazers 114 -1
779 779 Tue Feb 7 2017 Portland Trail Blazers 114 Dallas Mavericks 113 1
2043 780 Tue Feb 7 2017 Houston Rockets 128 Orlando Magic 104 24
780 780 Tue Feb 7 2017 Orlando Magic 104 Houston Rockets 128 -24
2044 781 Wed Feb 8 2017 Atlanta Hawks 117 Denver Nuggets 106 11
781 781 Wed Feb 8 2017 Denver Nuggets 106 Atlanta Hawks 117 -11
2045 782 Wed Feb 8 2017 Brooklyn Nets 110 Washington Wizards 114 -4
782 782 Wed Feb 8 2017 Washington Wizards 114 Brooklyn Nets 110 4
783 783 Wed Feb 8 2017 Los Angeles Lakers 102 Detroit Pistons 121 -19
2046 783 Wed Feb 8 2017 Detroit Pistons 121 Los Angeles Lakers 102 19
784 784 Wed Feb 8 2017 Chicago Bulls 92 Golden State Warriors 123 -31
2047 784 Wed Feb 8 2017 Golden State Warriors 123 Chicago Bulls 92 31
785 785 Wed Feb 8 2017 Cleveland Cavaliers 132 Indiana Pacers 117 15
2048 785 Wed Feb 8 2017 Indiana Pacers 117 Cleveland Cavaliers 132 -15
2049 786 Wed Feb 8 2017 Memphis Grizzlies 110 Phoenix Suns 91 19
786 786 Wed Feb 8 2017 Phoenix Suns 91 Memphis Grizzlies 110 -19
787 787 Wed Feb 8 2017 Miami Heat 106 Milwaukee Bucks 88 18
2050 787 Wed Feb 8 2017 Milwaukee Bucks 88 Miami Heat 106 -18
2051 788 Wed Feb 8 2017 Minnesota Timberwolves 112 Toronto Raptors 109 3
788 788 Wed Feb 8 2017 Toronto Raptors 109 Minnesota Timberwolves 112 -3
789 789 Wed Feb 8 2017 Utah Jazz 127 New Orleans Pelicans 94 33
2052 789 Wed Feb 8 2017 New Orleans Pelicans 94 Utah Jazz 127 -33
790 790 Wed Feb 8 2017 Los Angeles Clippers 119 New York Knicks 115 4
2053 790 Wed Feb 8 2017 New York Knicks 115 Los Angeles Clippers 119 -4
791 791 Wed Feb 8 2017 San Antonio Spurs 111 Philadelphia 76ers 103 8
2054 791 Wed Feb 8 2017 Philadelphia 76ers 103 San Antonio Spurs 111 -8
792 792 Wed Feb 8 2017 Boston Celtics 92 Sacramento Kings 108 -16
2055 792 Wed Feb 8 2017 Sacramento Kings 108 Boston Celtics 92 16
793 793 Thu Feb 9 2017 Houston Rockets 107 Charlotte Hornets 95 12
2056 793 Thu Feb 9 2017 Charlotte Hornets 95 Houston Rockets 107 -12
794 794 Thu Feb 9 2017 Utah Jazz 105 Dallas Mavericks 112 -7
2057 794 Thu Feb 9 2017 Dallas Mavericks 112 Utah Jazz 105 7
795 795 Thu Feb 9 2017 Cleveland Cavaliers 109 Oklahoma City Thunder 118 -9
2058 795 Thu Feb 9 2017 Oklahoma City Thunder 118 Cleveland Cavaliers 109 9
2059 796 Thu Feb 9 2017 Orlando Magic 111 Philadelphia 76ers 112 -1
796 796 Thu Feb 9 2017 Philadelphia 76ers 112 Orlando Magic 111 1
797 797 Thu Feb 9 2017 Boston Celtics 120 Portland Trail Blazers 111 9
2060 797 Thu Feb 9 2017 Portland Trail Blazers 111 Boston Celtics 120 -9
798 798 Fri Feb 10 2017 Miami Heat 108 Brooklyn Nets 99 9
2061 798 Fri Feb 10 2017 Brooklyn Nets 99 Miami Heat 108 -9
2062 799 Fri Feb 10 2017 Detroit Pistons 92 San Antonio Spurs 103 -11
799 799 Fri Feb 10 2017 San Antonio Spurs 103 Detroit Pistons 92 11
2063 800 Fri Feb 10 2017 Memphis Grizzlies 107 Golden State Warriors 122 -15
800 800 Fri Feb 10 2017 Golden State Warriors 122 Memphis Grizzlies 107 15
801 801 Fri Feb 10 2017 Los Angeles Lakers 122 Milwaukee Bucks 114 8
2064 801 Fri Feb 10 2017 Milwaukee Bucks 114 Los Angeles Lakers 122 -8
2065 802 Fri Feb 10 2017 Minnesota Timberwolves 106 New Orleans Pelicans 122 -16
802 802 Fri Feb 10 2017 New Orleans Pelicans 122 Minnesota Timberwolves 106 16
2066 803 Fri Feb 10 2017 New York Knicks 123 Denver Nuggets 131 -8
803 803 Fri Feb 10 2017 Denver Nuggets 131 New York Knicks 123 8
2067 804 Fri Feb 10 2017 Phoenix Suns 115 Chicago Bulls 97 18
804 804 Fri Feb 10 2017 Chicago Bulls 97 Phoenix Suns 115 -18
2068 805 Fri Feb 10 2017 Sacramento Kings 108 Atlanta Hawks 107 1
805 805 Fri Feb 10 2017 Atlanta Hawks 107 Sacramento Kings 108 -1
2069 806 Fri Feb 10 2017 Washington Wizards 112 Indiana Pacers 107 5
806 806 Fri Feb 10 2017 Indiana Pacers 107 Washington Wizards 112 -5
2070 807 Sat Feb 11 2017 Charlotte Hornets 102 Los Angeles Clippers 107 -5
807 807 Sat Feb 11 2017 Los Angeles Clippers 107 Charlotte Hornets 102 5
2071 808 Sat Feb 11 2017 Cleveland Cavaliers 125 Denver Nuggets 109 16
808 808 Sat Feb 11 2017 Denver Nuggets 109 Cleveland Cavaliers 125 -16
2072 809 Sat Feb 11 2017 Dallas Mavericks 112 Orlando Magic 80 32
809 809 Sat Feb 11 2017 Orlando Magic 80 Dallas Mavericks 112 -32
810 810 Sat Feb 11 2017 Phoenix Suns 102 Houston Rockets 133 -31
2073 810 Sat Feb 11 2017 Houston Rockets 133 Phoenix Suns 102 31
2074 811 Sat Feb 11 2017 Indiana Pacers 100 Milwaukee Bucks 116 -16
811 811 Sat Feb 11 2017 Milwaukee Bucks 116 Indiana Pacers 100 16
812 812 Sat Feb 11 2017 Golden State Warriors 130 Oklahoma City Thunder 114 16
2075 812 Sat Feb 11 2017 Oklahoma City Thunder 114 Golden State Warriors 130 -16
813 813 Sat Feb 11 2017 Miami Heat 109 Philadelphia 76ers 117 -8
2076 813 Sat Feb 11 2017 Philadelphia 76ers 117 Miami Heat 109 8
2077 814 Sat Feb 11 2017 Utah Jazz 104 Boston Celtics 112 -8
814 814 Sat Feb 11 2017 Boston Celtics 112 Utah Jazz 104 8
815 815 Sun Feb 12 2017 Chicago Bulls 89 Minnesota Timberwolves 117 -28
2078 815 Sun Feb 12 2017 Minnesota Timberwolves 117 Chicago Bulls 89 28
2079 816 Sun Feb 12 2017 New York Knicks 94 San Antonio Spurs 90 4
816 816 Sun Feb 12 2017 San Antonio Spurs 90 New York Knicks 94 -4
2080 817 Sun Feb 12 2017 Sacramento Kings 105 New Orleans Pelicans 99 6
817 817 Sun Feb 12 2017 New Orleans Pelicans 99 Sacramento Kings 105 -6
2081 818 Sun Feb 12 2017 Toronto Raptors 101 Detroit Pistons 102 -1
818 818 Sun Feb 12 2017 Detroit Pistons 102 Toronto Raptors 101 1
2082 819 Mon Feb 13 2017 Brooklyn Nets 103 Memphis Grizzlies 112 -9
819 819 Mon Feb 13 2017 Memphis Grizzlies 112 Brooklyn Nets 103 9
2083 820 Mon Feb 13 2017 Charlotte Hornets 99 Philadelphia 76ers 105 -6
820 820 Mon Feb 13 2017 Philadelphia 76ers 105 Charlotte Hornets 99 6
2084 821 Mon Feb 13 2017 Dallas Mavericks 98 Boston Celtics 111 -13
821 821 Mon Feb 13 2017 Boston Celtics 111 Dallas Mavericks 98 13
822 822 Mon Feb 13 2017 Golden State Warriors 110 Denver Nuggets 132 -22
2085 822 Mon Feb 13 2017 Denver Nuggets 132 Golden State Warriors 110 22
823 823 Mon Feb 13 2017 San Antonio Spurs 110 Indiana Pacers 106 4
2086 823 Mon Feb 13 2017 Indiana Pacers 106 San Antonio Spurs 110 -4
824 824 Mon Feb 13 2017 Orlando Magic 116 Miami Heat 107 9
2087 824 Mon Feb 13 2017 Miami Heat 107 Orlando Magic 116 -9
2088 825 Mon Feb 13 2017 Milwaukee Bucks 102 Detroit Pistons 89 13
825 825 Mon Feb 13 2017 Detroit Pistons 89 Milwaukee Bucks 102 -13
826 826 Mon Feb 13 2017 New Orleans Pelicans 110 Phoenix Suns 108 2
2089 826 Mon Feb 13 2017 Phoenix Suns 108 New Orleans Pelicans 110 -2
2090 827 Mon Feb 13 2017 Portland Trail Blazers 104 Atlanta Hawks 109 -5
827 827 Mon Feb 13 2017 Atlanta Hawks 109 Portland Trail Blazers 104 5
2091 828 Mon Feb 13 2017 Utah Jazz 72 Los Angeles Clippers 88 -16
828 828 Mon Feb 13 2017 Los Angeles Clippers 88 Utah Jazz 72 16
2092 829 Mon Feb 13 2017 Washington Wizards 120 Oklahoma City Thunder 98 22
829 829 Mon Feb 13 2017 Oklahoma City Thunder 98 Washington Wizards 120 -22
830 830 Tue Feb 14 2017 Toronto Raptors 94 Chicago Bulls 105 -11
2093 830 Tue Feb 14 2017 Chicago Bulls 105 Toronto Raptors 94 11
831 831 Tue Feb 14 2017 Sacramento Kings 97 Los Angeles Lakers 96 1
2094 831 Tue Feb 14 2017 Los Angeles Lakers 96 Sacramento Kings 97 -1
2095 832 Tue Feb 14 2017 Minnesota Timberwolves 108 Cleveland Cavaliers 116 -8
832 832 Tue Feb 14 2017 Cleveland Cavaliers 116 Minnesota Timberwolves 108 8
2096 833 Wed Feb 15 2017 Boston Celtics 116 Philadelphia 76ers 108 8
833 833 Wed Feb 15 2017 Philadelphia 76ers 108 Boston Celtics 116 -8
2097 834 Wed Feb 15 2017 Brooklyn Nets 125 Milwaukee Bucks 129 -4
834 834 Wed Feb 15 2017 Milwaukee Bucks 129 Brooklyn Nets 125 4
2098 835 Wed Feb 15 2017 Cleveland Cavaliers 113 Indiana Pacers 104 9
835 835 Wed Feb 15 2017 Indiana Pacers 104 Cleveland Cavaliers 113 -9
836 836 Wed Feb 15 2017 Minnesota Timberwolves 112 Denver Nuggets 99 13
2099 836 Wed Feb 15 2017 Denver Nuggets 99 Minnesota Timberwolves 112 -13
2100 837 Wed Feb 15 2017 Detroit Pistons 98 Dallas Mavericks 91 7
837 837 Wed Feb 15 2017 Dallas Mavericks 91 Detroit Pistons 98 -7
838 838 Wed Feb 15 2017 Sacramento Kings 86 Golden State Warriors 109 -23
2101 838 Wed Feb 15 2017 Golden State Warriors 109 Sacramento Kings 86 23
839 839 Wed Feb 15 2017 Miami Heat 117 Houston Rockets 109 8
2102 839 Wed Feb 15 2017 Houston Rockets 109 Miami Heat 117 -8
2103 840 Wed Feb 15 2017 Los Angeles Clippers 99 Atlanta Hawks 84 15
840 840 Wed Feb 15 2017 Atlanta Hawks 84 Los Angeles Clippers 99 -15
2104 841 Wed Feb 15 2017 Memphis Grizzlies 91 New Orleans Pelicans 95 -4
841 841 Wed Feb 15 2017 New Orleans Pelicans 95 Memphis Grizzlies 91 4
2105 842 Wed Feb 15 2017 Oklahoma City Thunder 116 New York Knicks 105 11
842 842 Wed Feb 15 2017 New York Knicks 105 Oklahoma City Thunder 116 -11
843 843 Wed Feb 15 2017 San Antonio Spurs 107 Orlando Magic 79 28
2106 843 Wed Feb 15 2017 Orlando Magic 79 San Antonio Spurs 107 -28
2107 844 Wed Feb 15 2017 Phoenix Suns 137 Los Angeles Lakers 101 36
844 844 Wed Feb 15 2017 Los Angeles Lakers 101 Phoenix Suns 137 -36
845 845 Wed Feb 15 2017 Charlotte Hornets 85 Toronto Raptors 90 -5
2108 845 Wed Feb 15 2017 Toronto Raptors 90 Charlotte Hornets 85 5
2109 846 Wed Feb 15 2017 Utah Jazz 111 Portland Trail Blazers 88 23
846 846 Wed Feb 15 2017 Portland Trail Blazers 88 Utah Jazz 111 -23
847 847 Thu Feb 16 2017 Boston Celtics 103 Chicago Bulls 104 -1
2110 847 Thu Feb 16 2017 Chicago Bulls 104 Boston Celtics 103 1
2111 848 Thu Feb 16 2017 Indiana Pacers 98 Washington Wizards 111 -13
848 848 Thu Feb 16 2017 Washington Wizards 111 Indiana Pacers 98 13
2112 849 Thu Feb 23 2017 Cleveland Cavaliers 119 New York Knicks 104 15
849 849 Thu Feb 23 2017 New York Knicks 104 Cleveland Cavaliers 119 -15
850 850 Thu Feb 23 2017 Charlotte Hornets 108 Detroit Pistons 114 -6
2113 850 Thu Feb 23 2017 Detroit Pistons 114 Charlotte Hornets 108 6
851 851 Thu Feb 23 2017 Los Angeles Clippers 113 Golden State Warriors 123 -10
2114 851 Thu Feb 23 2017 Golden State Warriors 123 Los Angeles Clippers 113 10
2115 852 Thu Feb 23 2017 New Orleans Pelicans 99 Houston Rockets 129 -30
852 852 Thu Feb 23 2017 Houston Rockets 129 New Orleans Pelicans 99 30
2116 853 Thu Feb 23 2017 Orlando Magic 103 Portland Trail Blazers 112 -9
853 853 Thu Feb 23 2017 Portland Trail Blazers 112 Orlando Magic 103 9
854 854 Thu Feb 23 2017 Denver Nuggets 100 Sacramento Kings 116 -16
2117 854 Thu Feb 23 2017 Sacramento Kings 116 Denver Nuggets 100 16
855 855 Fri Feb 24 2017 Miami Heat 108 Atlanta Hawks 90 18
2118 855 Fri Feb 24 2017 Atlanta Hawks 90 Miami Heat 108 -18
856 856 Fri Feb 24 2017 Phoenix Suns 121 Chicago Bulls 128 -7
2119 856 Fri Feb 24 2017 Chicago Bulls 128 Phoenix Suns 121 7
857 857 Fri Feb 24 2017 Brooklyn Nets 109 Denver Nuggets 129 -20
2120 857 Fri Feb 24 2017 Denver Nuggets 129 Brooklyn Nets 109 20
858 858 Fri Feb 24 2017 Memphis Grizzlies 92 Indiana Pacers 102 -10
2121 858 Fri Feb 24 2017 Indiana Pacers 102 Memphis Grizzlies 92 10
859 859 Fri Feb 24 2017 San Antonio Spurs 105 Los Angeles Clippers 97 8
2122 859 Fri Feb 24 2017 Los Angeles Clippers 97 San Antonio Spurs 105 -8
2123 860 Fri Feb 24 2017 Milwaukee Bucks 95 Utah Jazz 109 -14
860 860 Fri Feb 24 2017 Utah Jazz 109 Milwaukee Bucks 95 14
2124 861 Fri Feb 24 2017 Minnesota Timberwolves 97 Dallas Mavericks 84 13
861 861 Fri Feb 24 2017 Dallas Mavericks 84 Minnesota Timberwolves 97 -13
2125 862 Fri Feb 24 2017 Oklahoma City Thunder 110 Los Angeles Lakers 93 17
862 862 Fri Feb 24 2017 Los Angeles Lakers 93 Oklahoma City Thunder 110 -17
863 863 Fri Feb 24 2017 Washington Wizards 112 Philadelphia 76ers 120 -8
2126 863 Fri Feb 24 2017 Philadelphia 76ers 120 Washington Wizards 112 8
864 864 Fri Feb 24 2017 Boston Celtics 97 Toronto Raptors 107 -10
2127 864 Fri Feb 24 2017 Toronto Raptors 107 Boston Celtics 97 10
865 865 Sat Feb 25 2017 Chicago Bulls 117 Cleveland Cavaliers 99 18
2128 865 Sat Feb 25 2017 Cleveland Cavaliers 99 Chicago Bulls 117 -18
866 866 Sat Feb 25 2017 New Orleans Pelicans 83 Dallas Mavericks 96 -13
2129 866 Sat Feb 25 2017 Dallas Mavericks 96 New Orleans Pelicans 83 13
867 867 Sat Feb 25 2017 Brooklyn Nets 95 Golden State Warriors 112 -17
2130 867 Sat Feb 25 2017 Golden State Warriors 112 Brooklyn Nets 95 17
2131 868 Sat Feb 25 2017 Houston Rockets 142 Minnesota Timberwolves 130 12
868 868 Sat Feb 25 2017 Minnesota Timberwolves 130 Houston Rockets 142 -12
869 869 Sat Feb 25 2017 Indiana Pacers 95 Miami Heat 113 -18
2132 869 Sat Feb 25 2017 Miami Heat 113 Indiana Pacers 95 18
870 870 Sat Feb 25 2017 Philadelphia 76ers 109 New York Knicks 110 -1
2133 870 Sat Feb 25 2017 New York Knicks 110 Philadelphia 76ers 109 1
871 871 Sat Feb 25 2017 Atlanta Hawks 86 Orlando Magic 105 -19
2134 871 Sat Feb 25 2017 Orlando Magic 105 Atlanta Hawks 86 19
2135 872 Sat Feb 25 2017 Sacramento Kings 85 Charlotte Hornets 99 -14
872 872 Sat Feb 25 2017 Charlotte Hornets 99 Sacramento Kings 85 14
2136 873 Sun Feb 26 2017 Denver Nuggets 98 Memphis Grizzlies 105 -7
873 873 Sun Feb 26 2017 Memphis Grizzlies 105 Denver Nuggets 98 7
2137 874 Sun Feb 26 2017 Detroit Pistons 98 Boston Celtics 104 -6
874 874 Sun Feb 26 2017 Boston Celtics 104 Detroit Pistons 98 6
875 875 Sun Feb 26 2017 Charlotte Hornets 121 Los Angeles Clippers 124 -3
2138 875 Sun Feb 26 2017 Los Angeles Clippers 124 Charlotte Hornets 121 3
2139 876 Sun Feb 26 2017 Los Angeles Lakers 98 San Antonio Spurs 119 -21
876 876 Sun Feb 26 2017 San Antonio Spurs 119 Los Angeles Lakers 98 21
877 877 Sun Feb 26 2017 Phoenix Suns 96 Milwaukee Bucks 100 -4
2140 877 Sun Feb 26 2017 Milwaukee Bucks 100 Phoenix Suns 96 4
878 878 Sun Feb 26 2017 New Orleans Pelicans 110 Oklahoma City Thunder 118 -8
2141 878 Sun Feb 26 2017 Oklahoma City Thunder 118 New Orleans Pelicans 110 8
879 879 Sun Feb 26 2017 Portland Trail Blazers 106 Toronto Raptors 112 -6
2142 879 Sun Feb 26 2017 Toronto Raptors 112 Portland Trail Blazers 106 6
880 880 Sun Feb 26 2017 Utah Jazz 102 Washington Wizards 92 10
2143 880 Sun Feb 26 2017 Washington Wizards 92 Utah Jazz 102 -10
881 881 Mon Feb 27 2017 Atlanta Hawks 114 Boston Celtics 98 16
2144 881 Mon Feb 27 2017 Boston Celtics 98 Atlanta Hawks 114 -16
2145 882 Mon Feb 27 2017 Cleveland Cavaliers 102 Milwaukee Bucks 95 7
882 882 Mon Feb 27 2017 Milwaukee Bucks 95 Cleveland Cavaliers 102 -7
2146 883 Mon Feb 27 2017 Dallas Mavericks 96 Miami Heat 89 7
883 883 Mon Feb 27 2017 Miami Heat 89 Dallas Mavericks 96 -7
2147 884 Mon Feb 27 2017 Houston Rockets 108 Indiana Pacers 117 -9
884 884 Mon Feb 27 2017 Indiana Pacers 117 Houston Rockets 108 9
885 885 Mon Feb 27 2017 Toronto Raptors 92 New York Knicks 91 1
2148 885 Mon Feb 27 2017 New York Knicks 91 Toronto Raptors 92 -1
886 886 Mon Feb 27 2017 Golden State Warriors 119 Philadelphia 76ers 108 11
2149 886 Mon Feb 27 2017 Philadelphia 76ers 108 Golden State Warriors 119 -11
2150 887 Mon Feb 27 2017 Sacramento Kings 88 Minnesota Timberwolves 102 -14
887 887 Mon Feb 27 2017 Minnesota Timberwolves 102 Sacramento Kings 88 14
2151 888 Tue Feb 28 2017 Chicago Bulls 107 Denver Nuggets 125 -18
888 888 Tue Feb 28 2017 Denver Nuggets 125 Chicago Bulls 107 18
2152 889 Tue Feb 28 2017 Detroit Pistons 120 Portland Trail Blazers 113 7
889 889 Tue Feb 28 2017 Portland Trail Blazers 113 Detroit Pistons 120 -7
890 890 Tue Feb 28 2017 Charlotte Hornets 109 Los Angeles Lakers 104 5
2153 890 Tue Feb 28 2017 Los Angeles Lakers 104 Charlotte Hornets 109 -5
2154 891 Tue Feb 28 2017 Memphis Grizzlies 130 Phoenix Suns 112 18
891 891 Tue Feb 28 2017 Phoenix Suns 112 Memphis Grizzlies 130 -18
2155 892 Tue Feb 28 2017 Oklahoma City Thunder 109 Utah Jazz 106 3
892 892 Tue Feb 28 2017 Utah Jazz 106 Oklahoma City Thunder 109 -3
2156 893 Tue Feb 28 2017 Washington Wizards 112 Golden State Warriors 108 4
893 893 Tue Feb 28 2017 Golden State Warriors 108 Washington Wizards 112 -4
2157 894 Wed Mar 1 2017 Atlanta Hawks 100 Dallas Mavericks 95 5
894 894 Wed Mar 1 2017 Dallas Mavericks 95 Atlanta Hawks 100 -5
2158 895 Wed Mar 1 2017 Boston Celtics 103 Cleveland Cavaliers 99 4
895 895 Wed Mar 1 2017 Cleveland Cavaliers 99 Boston Celtics 103 -4
2159 896 Wed Mar 1 2017 Los Angeles Clippers 103 Houston Rockets 122 -19
896 896 Wed Mar 1 2017 Houston Rockets 122 Los Angeles Clippers 103 19
2160 897 Wed Mar 1 2017 Miami Heat 125 Philadelphia 76ers 98 27
897 897 Wed Mar 1 2017 Philadelphia 76ers 98 Miami Heat 125 -27
2161 898 Wed Mar 1 2017 Milwaukee Bucks 98 Denver Nuggets 110 -12
898 898 Wed Mar 1 2017 Denver Nuggets 110 Milwaukee Bucks 98 12
2162 899 Wed Mar 1 2017 New Orleans Pelicans 109 Detroit Pistons 86 23
899 899 Wed Mar 1 2017 Detroit Pistons 86 New Orleans Pelicans 109 -23
2163 900 Wed Mar 1 2017 Orlando Magic 90 New York Knicks 101 -11
900 900 Wed Mar 1 2017 New York Knicks 101 Orlando Magic 90 11
901 901 Wed Mar 1 2017 Brooklyn Nets 109 Sacramento Kings 100 9
2164 901 Wed Mar 1 2017 Sacramento Kings 100 Brooklyn Nets 109 -9
2165 902 Wed Mar 1 2017 San Antonio Spurs 100 Indiana Pacers 99 1
902 902 Wed Mar 1 2017 Indiana Pacers 99 San Antonio Spurs 100 -1
2166 903 Wed Mar 1 2017 Toronto Raptors 96 Washington Wizards 105 -9
903 903 Wed Mar 1 2017 Washington Wizards 105 Toronto Raptors 96 9
2167 904 Wed Mar 1 2017 Utah Jazz 80 Minnesota Timberwolves 107 -27
904 904 Wed Mar 1 2017 Minnesota Timberwolves 107 Utah Jazz 80 27
2168 905 Thu Mar 2 2017 Chicago Bulls 94 Golden State Warriors 87 7
905 905 Thu Mar 2 2017 Golden State Warriors 87 Chicago Bulls 94 -7
2169 906 Thu Mar 2 2017 Phoenix Suns 120 Charlotte Hornets 103 17
906 906 Thu Mar 2 2017 Charlotte Hornets 103 Phoenix Suns 120 -17
2170 907 Thu Mar 2 2017 Portland Trail Blazers 114 Oklahoma City Thunder 109 5
907 907 Thu Mar 2 2017 Oklahoma City Thunder 109 Portland Trail Blazers 114 -5
908 908 Fri Mar 3 2017 Cleveland Cavaliers 135 Atlanta Hawks 130 5
2171 908 Fri Mar 3 2017 Atlanta Hawks 130 Cleveland Cavaliers 135 -5
909 909 Fri Mar 3 2017 Memphis Grizzlies 100 Dallas Mavericks 104 -4
2172 909 Fri Mar 3 2017 Dallas Mavericks 104 Memphis Grizzlies 100 4
910 910 Fri Mar 3 2017 Boston Celtics 115 Los Angeles Lakers 95 20
2173 910 Fri Mar 3 2017 Los Angeles Lakers 95 Boston Celtics 115 -20
911 911 Fri Mar 3 2017 Los Angeles Clippers 101 Milwaukee Bucks 112 -11
2174 911 Fri Mar 3 2017 Milwaukee Bucks 112 Los Angeles Clippers 101 11
912 912 Fri Mar 3 2017 San Antonio Spurs 101 New Orleans Pelicans 98 3
2175 912 Fri Mar 3 2017 New Orleans Pelicans 98 San Antonio Spurs 101 -3
2176 913 Fri Mar 3 2017 Orlando Magic 110 Miami Heat 99 11
913 913 Fri Mar 3 2017 Miami Heat 99 Orlando Magic 110 -11
914 914 Fri Mar 3 2017 New York Knicks 102 Philadelphia 76ers 105 -3
2177 914 Fri Mar 3 2017 Philadelphia 76ers 105 New York Knicks 102 3
915 915 Fri Mar 3 2017 Oklahoma City Thunder 111 Phoenix Suns 118 -7
2178 915 Fri Mar 3 2017 Phoenix Suns 118 Oklahoma City Thunder 111 7
916 916 Fri Mar 3 2017 Brooklyn Nets 97 Utah Jazz 112 -15
2179 916 Fri Mar 3 2017 Utah Jazz 112 Brooklyn Nets 97 15
917 917 Fri Mar 3 2017 Toronto Raptors 114 Washington Wizards 106 8
2180 917 Fri Mar 3 2017 Washington Wizards 106 Toronto Raptors 114 -8
2181 918 Sat Mar 4 2017 Chicago Bulls 91 Los Angeles Clippers 101 -10
918 918 Sat Mar 4 2017 Los Angeles Clippers 101 Chicago Bulls 91 10
919 919 Sat Mar 4 2017 Charlotte Hornets 112 Denver Nuggets 102 10
2182 919 Sat Mar 4 2017 Denver Nuggets 102 Charlotte Hornets 112 -10
2183 920 Sat Mar 4 2017 Houston Rockets 123 Memphis Grizzlies 108 15
920 920 Sat Mar 4 2017 Memphis Grizzlies 108 Houston Rockets 123 -15
2184 921 Sat Mar 4 2017 Miami Heat 120 Cleveland Cavaliers 92 28
921 921 Sat Mar 4 2017 Cleveland Cavaliers 92 Miami Heat 120 -28
2185 922 Sat Mar 4 2017 Milwaukee Bucks 101 Toronto Raptors 94 7
922 922 Sat Mar 4 2017 Toronto Raptors 94 Milwaukee Bucks 101 -7
2186 923 Sat Mar 4 2017 Philadelphia 76ers 106 Detroit Pistons 136 -30
923 923 Sat Mar 4 2017 Detroit Pistons 136 Philadelphia 76ers 106 30
924 924 Sat Mar 4 2017 Brooklyn Nets 116 Portland Trail Blazers 130 -14
2187 924 Sat Mar 4 2017 Portland Trail Blazers 130 Brooklyn Nets 116 14
925 925 Sat Mar 4 2017 Minnesota Timberwolves 90 San Antonio Spurs 97 -7
2188 925 Sat Mar 4 2017 San Antonio Spurs 97 Minnesota Timberwolves 90 7
926 926 Sun Mar 5 2017 Indiana Pacers 97 Atlanta Hawks 96 1
2189 926 Sun Mar 5 2017 Atlanta Hawks 96 Indiana Pacers 97 -1
927 927 Sun Mar 5 2017 Oklahoma City Thunder 89 Dallas Mavericks 104 -15
2190 927 Sun Mar 5 2017 Dallas Mavericks 104 Oklahoma City Thunder 89 15
928 928 Sun Mar 5 2017 New Orleans Pelicans 105 Los Angeles Lakers 97 8
2191 928 Sun Mar 5 2017 Los Angeles Lakers 97 New Orleans Pelicans 105 -8
929 929 Sun Mar 5 2017 Golden State Warriors 112 New York Knicks 105 7
2192 929 Sun Mar 5 2017 New York Knicks 105 Golden State Warriors 112 -7
930 930 Sun Mar 5 2017 Boston Celtics 106 Phoenix Suns 109 -3
2193 930 Sun Mar 5 2017 Phoenix Suns 109 Boston Celtics 106 3
931 931 Sun Mar 5 2017 Utah Jazz 110 Sacramento Kings 109 1
2194 931 Sun Mar 5 2017 Sacramento Kings 109 Utah Jazz 110 -1
932 932 Sun Mar 5 2017 Orlando Magic 114 Washington Wizards 115 -1
2195 932 Sun Mar 5 2017 Washington Wizards 115 Orlando Magic 114 1
2196 933 Mon Mar 6 2017 Atlanta Hawks 111 Golden State Warriors 119 -8
933 933 Mon Mar 6 2017 Golden State Warriors 119 Atlanta Hawks 111 8
934 934 Mon Mar 6 2017 Indiana Pacers 88 Charlotte Hornets 100 -12
2197 934 Mon Mar 6 2017 Charlotte Hornets 100 Indiana Pacers 88 12
2198 935 Mon Mar 6 2017 Cleveland Cavaliers 98 Miami Heat 106 -8
935 935 Mon Mar 6 2017 Miami Heat 106 Cleveland Cavaliers 98 8
2199 936 Mon Mar 6 2017 Denver Nuggets 108 Sacramento Kings 96 12
936 936 Mon Mar 6 2017 Sacramento Kings 96 Denver Nuggets 108 -12
2200 937 Mon Mar 6 2017 Detroit Pistons 109 Chicago Bulls 95 14
937 937 Mon Mar 6 2017 Chicago Bulls 95 Detroit Pistons 109 -14
938 938 Mon Mar 6 2017 Boston Celtics 102 Los Angeles Clippers 116 -14
2201 938 Mon Mar 6 2017 Los Angeles Clippers 116 Boston Celtics 102 14
2202 939 Mon Mar 6 2017 Memphis Grizzlies 109 Brooklyn Nets 122 -13
939 939 Mon Mar 6 2017 Brooklyn Nets 122 Memphis Grizzlies 109 13
2203 940 Mon Mar 6 2017 Orlando Magic 105 New York Knicks 113 -8
940 940 Mon Mar 6 2017 New York Knicks 113 Orlando Magic 105 8
941 941 Mon Mar 6 2017 Milwaukee Bucks 112 Philadelphia 76ers 98 14
2204 941 Mon Mar 6 2017 Philadelphia 76ers 98 Milwaukee Bucks 112 -14
942 942 Mon Mar 6 2017 Houston Rockets 110 San Antonio Spurs 112 -2
2205 942 Mon Mar 6 2017 San Antonio Spurs 112 Houston Rockets 110 2
943 943 Mon Mar 6 2017 New Orleans Pelicans 83 Utah Jazz 88 -5
2206 943 Mon Mar 6 2017 Utah Jazz 88 New Orleans Pelicans 83 5
944 944 Tue Mar 7 2017 Los Angeles Lakers 111 Dallas Mavericks 122 -11
2207 944 Tue Mar 7 2017 Dallas Mavericks 122 Los Angeles Lakers 111 11
945 945 Tue Mar 7 2017 Portland Trail Blazers 126 Oklahoma City Thunder 121 5
2208 945 Tue Mar 7 2017 Oklahoma City Thunder 121 Portland Trail Blazers 126 -5
946 946 Tue Mar 7 2017 Washington Wizards 131 Phoenix Suns 127 4
2209 946 Tue Mar 7 2017 Phoenix Suns 127 Washington Wizards 131 -4
2210 947 Wed Mar 8 2017 Atlanta Hawks 110 Brooklyn Nets 105 5
947 947 Wed Mar 8 2017 Brooklyn Nets 105 Atlanta Hawks 110 -5
2211 948 Wed Mar 8 2017 Denver Nuggets 113 Washington Wizards 123 -10
948 948 Wed Mar 8 2017 Washington Wizards 123 Denver Nuggets 113 10
949 949 Wed Mar 8 2017 Boston Celtics 99 Golden State Warriors 86 13
2212 949 Wed Mar 8 2017 Golden State Warriors 86 Boston Celtics 99 -13
950 950 Wed Mar 8 2017 Utah Jazz 115 Houston Rockets 108 7
2213 950 Wed Mar 8 2017 Houston Rockets 108 Utah Jazz 115 -7
951 951 Wed Mar 8 2017 Detroit Pistons 98 Indiana Pacers 115 -17
2214 951 Wed Mar 8 2017 Indiana Pacers 115 Detroit Pistons 98 17
2215 952 Wed Mar 8 2017 Miami Heat 108 Charlotte Hornets 101 7
952 952 Wed Mar 8 2017 Charlotte Hornets 101 Miami Heat 108 -7
953 953 Wed Mar 8 2017 New York Knicks 93 Milwaukee Bucks 104 -11
2216 953 Wed Mar 8 2017 Milwaukee Bucks 104 New York Knicks 93 11
2217 954 Wed Mar 8 2017 Minnesota Timberwolves 107 Los Angeles Clippers 91 16
954 954 Wed Mar 8 2017 Los Angeles Clippers 91 Minnesota Timberwolves 107 -16
2218 955 Wed Mar 8 2017 New Orleans Pelicans 87 Toronto Raptors 94 -7
955 955 Wed Mar 8 2017 Toronto Raptors 94 New Orleans Pelicans 87 7
956 956 Wed Mar 8 2017 Chicago Bulls 91 Orlando Magic 98 -7
2219 956 Wed Mar 8 2017 Orlando Magic 98 Chicago Bulls 91 7
957 957 Wed Mar 8 2017 Sacramento Kings 104 San Antonio Spurs 114 -10
2220 957 Wed Mar 8 2017 San Antonio Spurs 114 Sacramento Kings 104 10
958 958 Thu Mar 9 2017 Cleveland Cavaliers 101 Detroit Pistons 106 -5
2221 958 Thu Mar 9 2017 Detroit Pistons 106 Cleveland Cavaliers 101 5
959 959 Thu Mar 9 2017 Los Angeles Clippers 114 Memphis Grizzlies 98 16
2222 959 Thu Mar 9 2017 Memphis Grizzlies 98 Los Angeles Clippers 114 -16
960 960 Thu Mar 9 2017 San Antonio Spurs 92 Oklahoma City Thunder 102 -10
2223 960 Thu Mar 9 2017 Oklahoma City Thunder 102 San Antonio Spurs 92 10
2224 961 Thu Mar 9 2017 Phoenix Suns 110 Los Angeles Lakers 122 -12
961 961 Thu Mar 9 2017 Los Angeles Lakers 122 Phoenix Suns 110 12
2225 962 Thu Mar 9 2017 Portland Trail Blazers 114 Philadelphia 76ers 108 6
962 962 Thu Mar 9 2017 Philadelphia 76ers 108 Portland Trail Blazers 114 -6
963 963 Fri Mar 10 2017 Toronto Raptors 99 Atlanta Hawks 105 -6
2226 963 Fri Mar 10 2017 Atlanta Hawks 105 Toronto Raptors 99 6
2227 964 Fri Mar 10 2017 Chicago Bulls 94 Houston Rockets 115 -21
964 964 Fri Mar 10 2017 Houston Rockets 115 Chicago Bulls 94 21
965 965 Fri Mar 10 2017 Orlando Magic 81 Charlotte Hornets 121 -40
2228 965 Fri Mar 10 2017 Charlotte Hornets 121 Orlando Magic 81 40
2229 966 Fri Mar 10 2017 Dallas Mavericks 105 Brooklyn Nets 96 9
966 966 Fri Mar 10 2017 Brooklyn Nets 96 Dallas Mavericks 105 -9
967 967 Fri Mar 10 2017 Boston Celtics 99 Denver Nuggets 119 -20
2230 967 Fri Mar 10 2017 Denver Nuggets 119 Boston Celtics 99 20
2231 968 Fri Mar 10 2017 Milwaukee Bucks 99 Indiana Pacers 85 14
968 968 Fri Mar 10 2017 Indiana Pacers 85 Milwaukee Bucks 99 -14
2232 969 Fri Mar 10 2017 Minnesota Timberwolves 103 Golden State Warriors 102 1
969 969 Fri Mar 10 2017 Golden State Warriors 102 Minnesota Timberwolves 103 -1
2233 970 Fri Mar 10 2017 Sacramento Kings 122 Washington Wizards 130 -8
970 970 Fri Mar 10 2017 Washington Wizards 130 Sacramento Kings 122 8
2234 971 Sat Mar 11 2017 Charlotte Hornets 122 New Orleans Pelicans 125 -3
971 971 Sat Mar 11 2017 New Orleans Pelicans 125 Charlotte Hornets 122 3
2235 972 Sat Mar 11 2017 Dallas Mavericks 98 Phoenix Suns 100 -2
972 972 Sat Mar 11 2017 Phoenix Suns 100 Dallas Mavericks 98 2
973 973 Sat Mar 11 2017 New York Knicks 92 Detroit Pistons 112 -20
2236 973 Sat Mar 11 2017 Detroit Pistons 112 New York Knicks 92 20
2237 974 Sat Mar 11 2017 Los Angeles Clippers 112 Philadelphia 76ers 100 12
974 974 Sat Mar 11 2017 Philadelphia 76ers 100 Los Angeles Clippers 112 -12
2238 975 Sat Mar 11 2017 Memphis Grizzlies 90 Atlanta Hawks 107 -17
975 975 Sat Mar 11 2017 Atlanta Hawks 107 Memphis Grizzlies 90 17
2239 976 Sat Mar 11 2017 Miami Heat 104 Toronto Raptors 89 15
976 976 Sat Mar 11 2017 Toronto Raptors 89 Miami Heat 104 -15
977 977 Sat Mar 11 2017 Minnesota Timberwolves 95 Milwaukee Bucks 102 -7
2240 977 Sat Mar 11 2017 Milwaukee Bucks 102 Minnesota Timberwolves 95 7
978 978 Sat Mar 11 2017 Utah Jazz 104 Oklahoma City Thunder 112 -8
2241 978 Sat Mar 11 2017 Oklahoma City Thunder 112 Utah Jazz 104 8
2242 979 Sat Mar 11 2017 Orlando Magic 104 Cleveland Cavaliers 116 -12
979 979 Sat Mar 11 2017 Cleveland Cavaliers 116 Orlando Magic 104 12
980 980 Sat Mar 11 2017 Washington Wizards 125 Portland Trail Blazers 124 1
2243 980 Sat Mar 11 2017 Portland Trail Blazers 124 Washington Wizards 125 -1
2244 981 Sat Mar 11 2017 Sacramento Kings 92 Denver Nuggets 105 -13
981 981 Sat Mar 11 2017 Denver Nuggets 105 Sacramento Kings 92 13
2245 982 Sat Mar 11 2017 San Antonio Spurs 107 Golden State Warriors 85 22
982 982 Sat Mar 11 2017 Golden State Warriors 85 San Antonio Spurs 107 -22
2246 983 Sun Mar 12 2017 Boston Celtics 100 Chicago Bulls 80 20
983 983 Sun Mar 12 2017 Chicago Bulls 80 Boston Celtics 100 -20
2247 984 Sun Mar 12 2017 Brooklyn Nets 120 New York Knicks 112 8
984 984 Sun Mar 12 2017 New York Knicks 112 Brooklyn Nets 120 -8
985 985 Sun Mar 12 2017 Cleveland Cavaliers 112 Houston Rockets 117 -5
2248 985 Sun Mar 12 2017 Houston Rockets 117 Cleveland Cavaliers 112 5
2249 986 Sun Mar 12 2017 Indiana Pacers 102 Miami Heat 98 4
986 986 Sun Mar 12 2017 Miami Heat 98 Indiana Pacers 102 -4
2250 987 Sun Mar 12 2017 Los Angeles Lakers 116 Philadelphia 76ers 118 -2
987 987 Sun Mar 12 2017 Philadelphia 76ers 118 Los Angeles Lakers 116 2
2251 988 Sun Mar 12 2017 Phoenix Suns 101 Portland Trail Blazers 110 -9
988 988 Sun Mar 12 2017 Portland Trail Blazers 110 Phoenix Suns 101 9
2252 989 Mon Mar 13 2017 Charlotte Hornets 109 Chicago Bulls 115 -6
989 989 Mon Mar 13 2017 Chicago Bulls 115 Charlotte Hornets 109 6
2253 990 Mon Mar 13 2017 Denver Nuggets 129 Los Angeles Lakers 101 28
990 990 Mon Mar 13 2017 Los Angeles Lakers 101 Denver Nuggets 129 -28
991 991 Mon Mar 13 2017 Milwaukee Bucks 93 Memphis Grizzlies 113 -20
2254 991 Mon Mar 13 2017 Memphis Grizzlies 113 Milwaukee Bucks 93 20
992 992 Mon Mar 13 2017 Washington Wizards 104 Minnesota Timberwolves 119 -15
2255 992 Mon Mar 13 2017 Minnesota Timberwolves 119 Washington Wizards 104 15
993 993 Mon Mar 13 2017 Orlando Magic 115 Sacramento Kings 120 -5
2256 993 Mon Mar 13 2017 Sacramento Kings 120 Orlando Magic 115 5
2257 994 Mon Mar 13 2017 San Antonio Spurs 107 Atlanta Hawks 99 8
994 994 Mon Mar 13 2017 Atlanta Hawks 99 San Antonio Spurs 107 -8
995 995 Mon Mar 13 2017 Dallas Mavericks 78 Toronto Raptors 100 -22
2258 995 Mon Mar 13 2017 Toronto Raptors 100 Dallas Mavericks 78 22
2259 996 Mon Mar 13 2017 Utah Jazz 114 Los Angeles Clippers 108 6
996 996 Mon Mar 13 2017 Los Angeles Clippers 108 Utah Jazz 114 -6
997 997 Tue Mar 14 2017 Oklahoma City Thunder 122 Brooklyn Nets 104 18
2260 997 Tue Mar 14 2017 Brooklyn Nets 104 Oklahoma City Thunder 122 -18
2261 998 Tue Mar 14 2017 Cleveland Cavaliers 128 Detroit Pistons 96 32
998 998 Tue Mar 14 2017 Detroit Pistons 96 Cleveland Cavaliers 128 -32
999 999 Tue Mar 14 2017 Philadelphia 76ers 104 Golden State Warriors 106 -2
2262 999 Tue Mar 14 2017 Golden State Warriors 106 Philadelphia 76ers 104 2
1000 1000 Tue Mar 14 2017 Portland Trail Blazers 77 New Orleans Pelicans 100 -23
2263 1000 Tue Mar 14 2017 New Orleans Pelicans 100 Portland Trail Blazers 77 23
1001 1001 Tue Mar 14 2017 Indiana Pacers 81 New York Knicks 87 -6
2264 1001 Tue Mar 14 2017 New York Knicks 87 Indiana Pacers 81 6
1002 1002 Wed Mar 15 2017 Minnesota Timberwolves 104 Boston Celtics 117 -13
2265 1002 Wed Mar 15 2017 Boston Celtics 117 Minnesota Timberwolves 104 13
1003 1003 Wed Mar 15 2017 Memphis Grizzlies 98 Chicago Bulls 91 7
2266 1003 Wed Mar 15 2017 Chicago Bulls 91 Memphis Grizzlies 98 -7
2267 1004 Wed Mar 15 2017 Detroit Pistons 83 Utah Jazz 97 -14
1004 1004 Wed Mar 15 2017 Utah Jazz 97 Detroit Pistons 83 14
1005 1005 Wed Mar 15 2017 Los Angeles Lakers 100 Houston Rockets 139 -39
2268 1005 Wed Mar 15 2017 Houston Rockets 139 Los Angeles Lakers 100 39
2269 1006 Wed Mar 15 2017 Indiana Pacers 98 Charlotte Hornets 77 21
1006 1006 Wed Mar 15 2017 Charlotte Hornets 77 Indiana Pacers 98 -21
2270 1007 Wed Mar 15 2017 Los Angeles Clippers 96 Milwaukee Bucks 97 -1
1007 1007 Wed Mar 15 2017 Milwaukee Bucks 97 Los Angeles Clippers 96 1
2271 1008 Wed Mar 15 2017 Miami Heat 120 New Orleans Pelicans 112 8
1008 1008 Wed Mar 15 2017 New Orleans Pelicans 112 Miami Heat 120 -8
1009 1009 Wed Mar 15 2017 Sacramento Kings 107 Phoenix Suns 101 6
2272 1009 Wed Mar 15 2017 Phoenix Suns 101 Sacramento Kings 107 -6
1010 1010 Wed Mar 15 2017 Portland Trail Blazers 110 San Antonio Spurs 106 4
2273 1010 Wed Mar 15 2017 San Antonio Spurs 106 Portland Trail Blazers 110 -4
1011 1011 Wed Mar 15 2017 Dallas Mavericks 112 Washington Wizards 107 5
2274 1011 Wed Mar 15 2017 Washington Wizards 107 Dallas Mavericks 112 -5
2275 1012 Thu Mar 16 2017 Atlanta Hawks 91 Memphis Grizzlies 103 -12
1012 1012 Thu Mar 16 2017 Memphis Grizzlies 103 Atlanta Hawks 91 12
1013 1013 Thu Mar 16 2017 Utah Jazz 83 Cleveland Cavaliers 91 -8
2276 1013 Thu Mar 16 2017 Cleveland Cavaliers 91 Utah Jazz 83 8
1014 1014 Thu Mar 16 2017 Los Angeles Clippers 114 Denver Nuggets 129 -15
2277 1014 Thu Mar 16 2017 Denver Nuggets 129 Los Angeles Clippers 114 15
2278 1015 Thu Mar 16 2017 Golden State Warriors 122 Orlando Magic 92 30
1015 1015 Thu Mar 16 2017 Orlando Magic 92 Golden State Warriors 122 -30
1016 1016 Thu Mar 16 2017 Brooklyn Nets 121 New York Knicks 110 11
2279 1016 Thu Mar 16 2017 New York Knicks 110 Brooklyn Nets 121 -11
1017 1017 Thu Mar 16 2017 Oklahoma City Thunder 123 Toronto Raptors 102 21
2280 1017 Thu Mar 16 2017 Toronto Raptors 102 Oklahoma City Thunder 123 -21
1018 1018 Fri Mar 17 2017 Boston Celtics 98 Brooklyn Nets 95 3
2281 1018 Fri Mar 17 2017 Brooklyn Nets 95 Boston Celtics 98 -3
1019 1019 Fri Mar 17 2017 Toronto Raptors 87 Detroit Pistons 75 12
2282 1019 Fri Mar 17 2017 Detroit Pistons 75 Toronto Raptors 87 -12
2283 1020 Fri Mar 17 2017 Los Angeles Lakers 103 Milwaukee Bucks 107 -4
1020 1020 Fri Mar 17 2017 Milwaukee Bucks 107 Los Angeles Lakers 103 4
2284 1021 Fri Mar 17 2017 Miami Heat 123 Minnesota Timberwolves 105 18
1021 1021 Fri Mar 17 2017 Minnesota Timberwolves 105 Miami Heat 123 -18
2285 1022 Fri Mar 17 2017 New Orleans Pelicans 128 Houston Rockets 112 16
1022 1022 Fri Mar 17 2017 Houston Rockets 112 New Orleans Pelicans 128 -16
1023 1023 Fri Mar 17 2017 Dallas Mavericks 74 Philadelphia 76ers 116 -42
2286 1023 Fri Mar 17 2017 Philadelphia 76ers 116 Dallas Mavericks 74 42
1024 1024 Fri Mar 17 2017 Orlando Magic 109 Phoenix Suns 103 6
2287 1024 Fri Mar 17 2017 Phoenix Suns 103 Orlando Magic 109 -6
1025 1025 Fri Mar 17 2017 Chicago Bulls 107 Washington Wizards 112 -5
2288 1025 Fri Mar 17 2017 Washington Wizards 112 Chicago Bulls 107 5
1026 1026 Sat Mar 18 2017 Portland Trail Blazers 113 Atlanta Hawks 97 16
2289 1026 Sat Mar 18 2017 Atlanta Hawks 97 Portland Trail Blazers 113 -16
2290 1027 Sat Mar 18 2017 Chicago Bulls 95 Utah Jazz 86 9
1027 1027 Sat Mar 18 2017 Utah Jazz 86 Chicago Bulls 95 -9
2291 1028 Sat Mar 18 2017 Charlotte Hornets 98 Washington Wizards 93 5
1028 1028 Sat Mar 18 2017 Washington Wizards 93 Charlotte Hornets 98 -5
1029 1029 Sat Mar 18 2017 Houston Rockets 109 Denver Nuggets 105 4
2292 1029 Sat Mar 18 2017 Denver Nuggets 105 Houston Rockets 109 -4
1030 1030 Sat Mar 18 2017 Milwaukee Bucks 92 Golden State Warriors 117 -25
2293 1030 Sat Mar 18 2017 Golden State Warriors 117 Milwaukee Bucks 92 25
1031 1031 Sat Mar 18 2017 Cleveland Cavaliers 78 Los Angeles Clippers 108 -30
2294 1031 Sat Mar 18 2017 Los Angeles Clippers 108 Cleveland Cavaliers 78 30
1032 1032 Sat Mar 18 2017 San Antonio Spurs 96 Memphis Grizzlies 104 -8
2295 1032 Sat Mar 18 2017 Memphis Grizzlies 104 San Antonio Spurs 96 8
2296 1033 Sat Mar 18 2017 Oklahoma City Thunder 110 Sacramento Kings 94 16
1033 1033 Sat Mar 18 2017 Sacramento Kings 94 Oklahoma City Thunder 110 -16
1034 1034 Sun Mar 19 2017 Dallas Mavericks 111 Brooklyn Nets 104 7
2297 1034 Sun Mar 19 2017 Brooklyn Nets 104 Dallas Mavericks 111 -7
1035 1035 Sun Mar 19 2017 Phoenix Suns 95 Detroit Pistons 112 -17
2298 1035 Sun Mar 19 2017 Detroit Pistons 112 Phoenix Suns 95 17
1036 1036 Sun Mar 19 2017 Cleveland Cavaliers 125 Los Angeles Lakers 120 5
2299 1036 Sun Mar 19 2017 Los Angeles Lakers 120 Cleveland Cavaliers 125 -5
2300 1037 Sun Mar 19 2017 Miami Heat 104 Portland Trail Blazers 115 -11
1037 1037 Sun Mar 19 2017 Portland Trail Blazers 115 Miami Heat 104 11
2301 1038 Sun Mar 19 2017 New Orleans Pelicans 123 Minnesota Timberwolves 109 14
1038 1038 Sun Mar 19 2017 Minnesota Timberwolves 109 New Orleans Pelicans 123 -14
2302 1039 Sun Mar 19 2017 Philadelphia 76ers 105 Boston Celtics 99 6
1039 1039 Sun Mar 19 2017 Boston Celtics 99 Philadelphia 76ers 105 -6
1040 1040 Sun Mar 19 2017 Sacramento Kings 102 San Antonio Spurs 118 -16
2303 1040 Sun Mar 19 2017 San Antonio Spurs 118 Sacramento Kings 102 16
2304 1041 Sun Mar 19 2017 Toronto Raptors 116 Indiana Pacers 91 25
1041 1041 Sun Mar 19 2017 Indiana Pacers 91 Toronto Raptors 116 -25
1042 1042 Mon Mar 20 2017 Washington Wizards 102 Boston Celtics 110 -8
2305 1042 Mon Mar 20 2017 Boston Celtics 110 Washington Wizards 102 8
2306 1043 Mon Mar 20 2017 Charlotte Hornets 105 Atlanta Hawks 90 15
1043 1043 Mon Mar 20 2017 Atlanta Hawks 90 Charlotte Hornets 105 -15
2307 1044 Mon Mar 20 2017 Houston Rockets 125 Denver Nuggets 124 1
1044 1044 Mon Mar 20 2017 Denver Nuggets 124 Houston Rockets 125 -1
1045 1045 Mon Mar 20 2017 Utah Jazz 100 Indiana Pacers 107 -7
2308 1045 Mon Mar 20 2017 Indiana Pacers 107 Utah Jazz 100 7
2309 1046 Mon Mar 20 2017 Los Angeles Clippers 114 New York Knicks 105 9
1046 1046 Mon Mar 20 2017 New York Knicks 105 Los Angeles Clippers 114 -9
2310 1047 Mon Mar 20 2017 Oklahoma City Thunder 95 Golden State Warriors 111 -16
1047 1047 Mon Mar 20 2017 Golden State Warriors 111 Oklahoma City Thunder 95 16
2311 1048 Mon Mar 20 2017 Orlando Magic 112 Philadelphia 76ers 109 3
1048 1048 Mon Mar 20 2017 Philadelphia 76ers 109 Orlando Magic 112 -3
2312 1049 Tue Mar 21 2017 Brooklyn Nets 98 Detroit Pistons 96 2
1049 1049 Tue Mar 21 2017 Detroit Pistons 96 Brooklyn Nets 98 -2
2313 1050 Tue Mar 21 2017 Dallas Mavericks 87 Golden State Warriors 112 -25
1050 1050 Tue Mar 21 2017 Golden State Warriors 112 Dallas Mavericks 87 25
1051 1051 Tue Mar 21 2017 Los Angeles Clippers 133 Los Angeles Lakers 109 24
2314 1051 Tue Mar 21 2017 Los Angeles Lakers 109 Los Angeles Clippers 133 -24
1052 1052 Tue Mar 21 2017 Phoenix Suns 97 Miami Heat 112 -15
2315 1052 Tue Mar 21 2017 Miami Heat 112 Phoenix Suns 97 15
2316 1053 Tue Mar 21 2017 Minnesota Timberwolves 93 San Antonio Spurs 100 -7
1053 1053 Tue Mar 21 2017 San Antonio Spurs 100 Minnesota Timberwolves 93 7
1054 1054 Tue Mar 21 2017 Memphis Grizzlies 82 New Orleans Pelicans 95 -13
2317 1054 Tue Mar 21 2017 New Orleans Pelicans 95 Memphis Grizzlies 82 13
1055 1055 Tue Mar 21 2017 Milwaukee Bucks 93 Portland Trail Blazers 90 3
2318 1055 Tue Mar 21 2017 Portland Trail Blazers 90 Milwaukee Bucks 93 -3
1056 1056 Tue Mar 21 2017 Chicago Bulls 120 Toronto Raptors 122 -2
2319 1056 Tue Mar 21 2017 Toronto Raptors 122 Chicago Bulls 120 2
1057 1057 Wed Mar 22 2017 Indiana Pacers 100 Boston Celtics 109 -9
2320 1057 Wed Mar 22 2017 Boston Celtics 109 Indiana Pacers 100 9
2321 1058 Wed Mar 22 2017 Chicago Bulls 117 Detroit Pistons 95 22
1058 1058 Wed Mar 22 2017 Detroit Pistons 95 Chicago Bulls 117 -22
2322 1059 Wed Mar 22 2017 Denver Nuggets 126 Cleveland Cavaliers 113 13
1059 1059 Wed Mar 22 2017 Cleveland Cavaliers 113 Denver Nuggets 126 -13
2323 1060 Wed Mar 22 2017 Oklahoma City Thunder 122 Philadelphia 76ers 97 25
1060 1060 Wed Mar 22 2017 Philadelphia 76ers 97 Oklahoma City Thunder 122 -25
2324 1061 Wed Mar 22 2017 Orlando Magic 102 Charlotte Hornets 109 -7
1061 1061 Wed Mar 22 2017 Charlotte Hornets 109 Orlando Magic 102 7
1062 1062 Wed Mar 22 2017 Milwaukee Bucks 116 Sacramento Kings 98 18
2325 1062 Wed Mar 22 2017 Sacramento Kings 98 Milwaukee Bucks 116 -18
1063 1063 Wed Mar 22 2017 New York Knicks 101 Utah Jazz 108 -7
2326 1063 Wed Mar 22 2017 Utah Jazz 108 New York Knicks 101 7
2327 1064 Wed Mar 22 2017 Washington Wizards 104 Atlanta Hawks 100 4
1064 1064 Wed Mar 22 2017 Atlanta Hawks 100 Washington Wizards 104 -4
2328 1065 Thu Mar 23 2017 Brooklyn Nets 126 Phoenix Suns 98 28
1065 1065 Thu Mar 23 2017 Phoenix Suns 98 Brooklyn Nets 126 -28
2329 1066 Thu Mar 23 2017 Dallas Mavericks 97 Los Angeles Clippers 95 2
1066 1066 Thu Mar 23 2017 Los Angeles Clippers 95 Dallas Mavericks 97 -2
2330 1067 Thu Mar 23 2017 Miami Heat 84 Toronto Raptors 101 -17
1067 1067 Thu Mar 23 2017 Toronto Raptors 101 Miami Heat 84 17
2331 1068 Thu Mar 23 2017 Portland Trail Blazers 110 New York Knicks 95 15
1068 1068 Thu Mar 23 2017 New York Knicks 95 Portland Trail Blazers 110 -15
1069 1069 Thu Mar 23 2017 Memphis Grizzlies 90 San Antonio Spurs 97 -7
2332 1069 Thu Mar 23 2017 San Antonio Spurs 97 Memphis Grizzlies 90 7
1070 1070 Fri Mar 24 2017 Phoenix Suns 120 Boston Celtics 130 -10
2333 1070 Fri Mar 24 2017 Boston Celtics 130 Phoenix Suns 120 10
1071 1071 Fri Mar 24 2017 Philadelphia 76ers 117 Chicago Bulls 107 10
2334 1071 Fri Mar 24 2017 Chicago Bulls 107 Philadelphia 76ers 117 -10
2335 1072 Fri Mar 24 2017 Charlotte Hornets 105 Cleveland Cavaliers 112 -7
1072 1072 Fri Mar 24 2017 Cleveland Cavaliers 112 Charlotte Hornets 105 7
2336 1073 Fri Mar 24 2017 Golden State Warriors 114 Sacramento Kings 100 14
1073 1073 Fri Mar 24 2017 Sacramento Kings 100 Golden State Warriors 114 -14
2337 1074 Fri Mar 24 2017 Houston Rockets 117 New Orleans Pelicans 107 10
1074 1074 Fri Mar 24 2017 New Orleans Pelicans 107 Houston Rockets 117 -10
1075 1075 Fri Mar 24 2017 Denver Nuggets 125 Indiana Pacers 117 8
2338 1075 Fri Mar 24 2017 Indiana Pacers 117 Denver Nuggets 125 -8
1076 1076 Fri Mar 24 2017 Minnesota Timberwolves 119 Los Angeles Lakers 130 -11
2339 1076 Fri Mar 24 2017 Los Angeles Lakers 130 Minnesota Timberwolves 119 11
2340 1077 Fri Mar 24 2017 Milwaukee Bucks 100 Atlanta Hawks 97 3
1077 1077 Fri Mar 24 2017 Atlanta Hawks 97 Milwaukee Bucks 100 -3
1078 1078 Fri Mar 24 2017 Detroit Pistons 87 Orlando Magic 115 -28
2341 1078 Fri Mar 24 2017 Orlando Magic 115 Detroit Pistons 87 28
2342 1079 Fri Mar 24 2017 Washington Wizards 129 Brooklyn Nets 108 21
1079 1079 Fri Mar 24 2017 Brooklyn Nets 108 Washington Wizards 129 -21
2343 1080 Sat Mar 25 2017 Cleveland Cavaliers 115 Washington Wizards 127 -12
1080 1080 Sat Mar 25 2017 Washington Wizards 127 Cleveland Cavaliers 115 12
2344 1081 Sat Mar 25 2017 Dallas Mavericks 86 Toronto Raptors 94 -8
1081 1081 Sat Mar 25 2017 Toronto Raptors 94 Dallas Mavericks 86 8
1082 1082 Sat Mar 25 2017 Utah Jazz 95 Los Angeles Clippers 108 -13
2345 1082 Sat Mar 25 2017 Los Angeles Clippers 108 Utah Jazz 95 13
1083 1083 Sat Mar 25 2017 Minnesota Timberwolves 100 Portland Trail Blazers 112 -12
2346 1083 Sat Mar 25 2017 Portland Trail Blazers 112 Minnesota Timberwolves 100 12
1084 1084 Sat Mar 25 2017 New York Knicks 98 San Antonio Spurs 106 -8
2347 1084 Sat Mar 25 2017 San Antonio Spurs 106 New York Knicks 98 8
2348 1085 Sun Mar 26 2017 Atlanta Hawks 92 Brooklyn Nets 107 -15
1085 1085 Sun Mar 26 2017 Brooklyn Nets 107 Atlanta Hawks 92 15
1086 1086 Sun Mar 26 2017 Miami Heat 108 Boston Celtics 112 -4
2349 1086 Sun Mar 26 2017 Boston Celtics 112 Miami Heat 108 4
1087 1087 Sun Mar 26 2017 Phoenix Suns 106 Charlotte Hornets 120 -14
2350 1087 Sun Mar 26 2017 Charlotte Hornets 120 Phoenix Suns 106 14
2351 1088 Sun Mar 26 2017 Denver Nuggets 90 New Orleans Pelicans 115 -25
1088 1088 Sun Mar 26 2017 New Orleans Pelicans 115 Denver Nuggets 90 25
2352 1089 Sun Mar 26 2017 Golden State Warriors 106 Memphis Grizzlies 94 12
1089 1089 Sun Mar 26 2017 Memphis Grizzlies 94 Golden State Warriors 106 -12
1090 1090 Sun Mar 26 2017 Oklahoma City Thunder 125 Houston Rockets 137 -12
2353 1090 Sun Mar 26 2017 Houston Rockets 137 Oklahoma City Thunder 125 12
2354 1091 Sun Mar 26 2017 Indiana Pacers 107 Philadelphia 76ers 94 13
1091 1091 Sun Mar 26 2017 Philadelphia 76ers 94 Indiana Pacers 107 -13
2355 1092 Sun Mar 26 2017 Los Angeles Clippers 97 Sacramento Kings 98 -1
1092 1092 Sun Mar 26 2017 Sacramento Kings 98 Los Angeles Clippers 97 1
1093 1093 Sun Mar 26 2017 Portland Trail Blazers 97 Los Angeles Lakers 81 16
2356 1093 Sun Mar 26 2017 Los Angeles Lakers 81 Portland Trail Blazers 97 -16
2357 1094 Sun Mar 26 2017 Milwaukee Bucks 94 Chicago Bulls 109 -15
1094 1094 Sun Mar 26 2017 Chicago Bulls 109 Milwaukee Bucks 94 15
1095 1095 Mon Mar 27 2017 Oklahoma City Thunder 92 Dallas Mavericks 91 1
2358 1095 Mon Mar 27 2017 Dallas Mavericks 91 Oklahoma City Thunder 92 -1
2359 1096 Mon Mar 27 2017 New York Knicks 109 Detroit Pistons 95 14
1096 1096 Mon Mar 27 2017 Detroit Pistons 95 New York Knicks 109 -14
1097 1097 Mon Mar 27 2017 Memphis Grizzlies 90 Sacramento Kings 91 -1
2360 1097 Mon Mar 27 2017 Sacramento Kings 91 Memphis Grizzlies 90 1
1098 1098 Mon Mar 27 2017 Cleveland Cavaliers 74 San Antonio Spurs 103 -29
2361 1098 Mon Mar 27 2017 San Antonio Spurs 103 Cleveland Cavaliers 74 29
1099 1099 Mon Mar 27 2017 Orlando Magic 112 Toronto Raptors 131 -19
2362 1099 Mon Mar 27 2017 Toronto Raptors 131 Orlando Magic 112 19
2363 1100 Mon Mar 27 2017 Utah Jazz 108 New Orleans Pelicans 100 8
1100 1100 Mon Mar 27 2017 New Orleans Pelicans 100 Utah Jazz 108 -8
1101 1101 Tue Mar 28 2017 Phoenix Suns 91 Atlanta Hawks 95 -4
2364 1101 Tue Mar 28 2017 Atlanta Hawks 95 Phoenix Suns 91 4
2365 1102 Tue Mar 28 2017 Brooklyn Nets 101 Philadelphia 76ers 106 -5
1102 1102 Tue Mar 28 2017 Philadelphia 76ers 106 Brooklyn Nets 101 5
2366 1103 Tue Mar 28 2017 Charlotte Hornets 108 Milwaukee Bucks 118 -10
1103 1103 Tue Mar 28 2017 Milwaukee Bucks 118 Charlotte Hornets 108 10
2367 1104 Tue Mar 28 2017 Detroit Pistons 96 Miami Heat 97 -1
1104 1104 Tue Mar 28 2017 Miami Heat 97 Detroit Pistons 96 1
1105 1105 Tue Mar 28 2017 Golden State Warriors 113 Houston Rockets 106 7
2368 1105 Tue Mar 28 2017 Houston Rockets 106 Golden State Warriors 113 -7
1106 1106 Tue Mar 28 2017 Minnesota Timberwolves 115 Indiana Pacers 114 1
2369 1106 Tue Mar 28 2017 Indiana Pacers 114 Minnesota Timberwolves 115 -1
2370 1107 Tue Mar 28 2017 Los Angeles Lakers 108 Washington Wizards 119 -11
1107 1107 Tue Mar 28 2017 Washington Wizards 119 Los Angeles Lakers 108 11
1108 1108 Tue Mar 28 2017 Denver Nuggets 113 Portland Trail Blazers 122 -9
2371 1108 Tue Mar 28 2017 Portland Trail Blazers 122 Denver Nuggets 113 9
2372 1109 Wed Mar 29 2017 Boston Celtics 100 Milwaukee Bucks 103 -3
1109 1109 Wed Mar 29 2017 Milwaukee Bucks 103 Boston Celtics 100 3
2373 1110 Wed Mar 29 2017 Los Angeles Clippers 133 Washington Wizards 124 9
1110 1110 Wed Mar 29 2017 Washington Wizards 124 Los Angeles Clippers 133 -9
2374 1111 Wed Mar 29 2017 Memphis Grizzlies 110 Indiana Pacers 97 13
1111 1111 Wed Mar 29 2017 Indiana Pacers 97 Memphis Grizzlies 110 -13
2375 1112 Wed Mar 29 2017 New Orleans Pelicans 121 Dallas Mavericks 118 3
1112 1112 Wed Mar 29 2017 Dallas Mavericks 118 New Orleans Pelicans 121 -3
1113 1113 Wed Mar 29 2017 Miami Heat 105 New York Knicks 88 17
2376 1113 Wed Mar 29 2017 New York Knicks 88 Miami Heat 105 -17
2377 1114 Wed Mar 29 2017 Orlando Magic 106 Oklahoma City Thunder 114 -8
1114 1114 Wed Mar 29 2017 Oklahoma City Thunder 114 Orlando Magic 106 8
2378 1115 Wed Mar 29 2017 Philadelphia 76ers 92 Atlanta Hawks 99 -7
1115 1115 Wed Mar 29 2017 Atlanta Hawks 99 Philadelphia 76ers 92 7
2379 1116 Wed Mar 29 2017 Sacramento Kings 82 Utah Jazz 112 -30
1116 1116 Wed Mar 29 2017 Utah Jazz 112 Sacramento Kings 82 30
2380 1117 Wed Mar 29 2017 San Antonio Spurs 98 Golden State Warriors 110 -12
1117 1117 Wed Mar 29 2017 Golden State Warriors 110 San Antonio Spurs 98 12
2381 1118 Wed Mar 29 2017 Toronto Raptors 106 Charlotte Hornets 110 -4
1118 1118 Wed Mar 29 2017 Charlotte Hornets 110 Toronto Raptors 106 4
1119 1119 Thu Mar 30 2017 Cleveland Cavaliers 93 Chicago Bulls 99 -6
2382 1119 Thu Mar 30 2017 Chicago Bulls 99 Cleveland Cavaliers 93 6
1120 1120 Thu Mar 30 2017 Brooklyn Nets 89 Detroit Pistons 90 -1
2383 1120 Thu Mar 30 2017 Detroit Pistons 90 Brooklyn Nets 89 1
1121 1121 Thu Mar 30 2017 Los Angeles Lakers 104 Minnesota Timberwolves 119 -15
2384 1121 Thu Mar 30 2017 Minnesota Timberwolves 119 Los Angeles Lakers 104 15
2385 1122 Thu Mar 30 2017 Phoenix Suns 118 Los Angeles Clippers 124 -6
1122 1122 Thu Mar 30 2017 Los Angeles Clippers 124 Phoenix Suns 118 6
1123 1123 Thu Mar 30 2017 Houston Rockets 107 Portland Trail Blazers 117 -10
2386 1123 Thu Mar 30 2017 Portland Trail Blazers 117 Houston Rockets 107 10
2387 1124 Fri Mar 31 2017 Boston Celtics 117 Orlando Magic 116 1
1124 1124 Fri Mar 31 2017 Orlando Magic 116 Boston Celtics 117 -1
1125 1125 Fri Mar 31 2017 Denver Nuggets 114 Charlotte Hornets 122 -8
2388 1125 Fri Mar 31 2017 Charlotte Hornets 122 Denver Nuggets 114 8
2389 1126 Fri Mar 31 2017 Cleveland Cavaliers 122 Philadelphia 76ers 105 17
1126 1126 Fri Mar 31 2017 Philadelphia 76ers 105 Cleveland Cavaliers 122 -17
1127 1127 Fri Mar 31 2017 Houston Rockets 98 Golden State Warriors 107 -9
2390 1127 Fri Mar 31 2017 Golden State Warriors 107 Houston Rockets 98 9
1128 1128 Fri Mar 31 2017 Dallas Mavericks 90 Memphis Grizzlies 99 -9
2391 1128 Fri Mar 31 2017 Memphis Grizzlies 99 Dallas Mavericks 90 9
1129 1129 Fri Mar 31 2017 New York Knicks 98 Miami Heat 94 4
2392 1129 Fri Mar 31 2017 Miami Heat 94 New York Knicks 98 -4
1130 1130 Fri Mar 31 2017 Detroit Pistons 105 Milwaukee Bucks 108 -3
2393 1130 Fri Mar 31 2017 Milwaukee Bucks 108 Detroit Pistons 105 3
1131 1131 Fri Mar 31 2017 Sacramento Kings 89 New Orleans Pelicans 117 -28
2394 1131 Fri Mar 31 2017 New Orleans Pelicans 117 Sacramento Kings 89 28
2395 1132 Fri Mar 31 2017 Oklahoma City Thunder 95 San Antonio Spurs 100 -5
1132 1132 Fri Mar 31 2017 San Antonio Spurs 100 Oklahoma City Thunder 95 5
1133 1133 Fri Mar 31 2017 Indiana Pacers 100 Toronto Raptors 111 -11
2396 1133 Fri Mar 31 2017 Toronto Raptors 111 Indiana Pacers 100 11
2397 1134 Fri Mar 31 2017 Utah Jazz 95 Washington Wizards 88 7
1134 1134 Fri Mar 31 2017 Washington Wizards 88 Utah Jazz 95 -7
2398 1135 Sat Apr 1 2017 Brooklyn Nets 121 Orlando Magic 111 10
1135 1135 Sat Apr 1 2017 Orlando Magic 111 Brooklyn Nets 121 -10
2399 1136 Sat Apr 1 2017 Chicago Bulls 106 Atlanta Hawks 104 2
1136 1136 Sat Apr 1 2017 Atlanta Hawks 104 Chicago Bulls 106 -2
1137 1137 Sat Apr 1 2017 Los Angeles Lakers 104 Los Angeles Clippers 115 -11
2400 1137 Sat Apr 1 2017 Los Angeles Clippers 115 Los Angeles Lakers 104 11
1138 1138 Sat Apr 1 2017 Sacramento Kings 123 Minnesota Timberwolves 117 6
2401 1138 Sat Apr 1 2017 Minnesota Timberwolves 117 Sacramento Kings 123 -6
1139 1139 Sat Apr 1 2017 Phoenix Suns 117 Portland Trail Blazers 130 -13
2402 1139 Sat Apr 1 2017 Portland Trail Blazers 130 Phoenix Suns 117 13
2403 1140 Sun Apr 2 2017 Brooklyn Nets 91 Atlanta Hawks 82 9
1140 1140 Sun Apr 2 2017 Atlanta Hawks 82 Brooklyn Nets 91 -9
1141 1141 Sun Apr 2 2017 Indiana Pacers 130 Cleveland Cavaliers 135 -5
2404 1141 Sun Apr 2 2017 Cleveland Cavaliers 135 Indiana Pacers 130 5
1142 1142 Sun Apr 2 2017 Washington Wizards 115 Golden State Warriors 139 -24
2405 1142 Sun Apr 2 2017 Golden State Warriors 139 Washington Wizards 115 24
2406 1143 Sun Apr 2 2017 Los Angeles Lakers 108 Memphis Grizzlies 103 5
1143 1143 Sun Apr 2 2017 Memphis Grizzlies 103 Los Angeles Lakers 108 -5
1144 1144 Sun Apr 2 2017 Denver Nuggets 116 Miami Heat 113 3
2407 1144 Sun Apr 2 2017 Miami Heat 113 Denver Nuggets 116 -3
1145 1145 Sun Apr 2 2017 Dallas Mavericks 109 Milwaukee Bucks 105 4
2408 1145 Sun Apr 2 2017 Milwaukee Bucks 105 Dallas Mavericks 109 -4
1146 1146 Sun Apr 2 2017 Chicago Bulls 117 New Orleans Pelicans 110 7
2409 1146 Sun Apr 2 2017 New Orleans Pelicans 110 Chicago Bulls 117 -7
1147 1147 Sun Apr 2 2017 Boston Celtics 110 New York Knicks 94 16
2410 1147 Sun Apr 2 2017 New York Knicks 94 Boston Celtics 110 -16
2411 1148 Sun Apr 2 2017 Oklahoma City Thunder 101 Charlotte Hornets 113 -12
1148 1148 Sun Apr 2 2017 Charlotte Hornets 113 Oklahoma City Thunder 101 12
2412 1149 Sun Apr 2 2017 Phoenix Suns 116 Houston Rockets 123 -7
1149 1149 Sun Apr 2 2017 Houston Rockets 123 Phoenix Suns 116 7
2413 1150 Sun Apr 2 2017 San Antonio Spurs 109 Utah Jazz 103 6
1150 1150 Sun Apr 2 2017 Utah Jazz 103 San Antonio Spurs 109 -6
1151 1151 Sun Apr 2 2017 Philadelphia 76ers 105 Toronto Raptors 113 -8
2414 1151 Sun Apr 2 2017 Toronto Raptors 113 Philadelphia 76ers 105 8
1152 1152 Mon Apr 3 2017 Portland Trail Blazers 109 Minnesota Timberwolves 110 -1
2415 1152 Mon Apr 3 2017 Minnesota Timberwolves 110 Portland Trail Blazers 109 1
1153 1153 Tue Apr 4 2017 Orlando Magic 102 Cleveland Cavaliers 122 -20
2416 1153 Tue Apr 4 2017 Cleveland Cavaliers 122 Orlando Magic 102 20
1154 1154 Tue Apr 4 2017 Minnesota Timberwolves 107 Golden State Warriors 121 -14
2417 1154 Tue Apr 4 2017 Golden State Warriors 121 Minnesota Timberwolves 107 14
2418 1155 Tue Apr 4 2017 Indiana Pacers 108 Toronto Raptors 90 18
1155 1155 Tue Apr 4 2017 Toronto Raptors 90 Indiana Pacers 108 -18
2419 1156 Tue Apr 4 2017 New Orleans Pelicans 131 Denver Nuggets 134 -3
1156 1156 Tue Apr 4 2017 Denver Nuggets 134 New Orleans Pelicans 131 3
2420 1157 Tue Apr 4 2017 New York Knicks 100 Chicago Bulls 91 9
1157 1157 Tue Apr 4 2017 Chicago Bulls 91 New York Knicks 100 -9
1158 1158 Tue Apr 4 2017 Milwaukee Bucks 79 Oklahoma City Thunder 110 -31
2421 1158 Tue Apr 4 2017 Oklahoma City Thunder 110 Milwaukee Bucks 79 31
1159 1159 Tue Apr 4 2017 Brooklyn Nets 141 Philadelphia 76ers 118 23
2422 1159 Tue Apr 4 2017 Philadelphia 76ers 118 Brooklyn Nets 141 -23
1160 1160 Tue Apr 4 2017 Dallas Mavericks 87 Sacramento Kings 98 -11
2423 1160 Tue Apr 4 2017 Sacramento Kings 98 Dallas Mavericks 87 11
2424 1161 Tue Apr 4 2017 San Antonio Spurs 95 Memphis Grizzlies 89 6
1161 1161 Tue Apr 4 2017 Memphis Grizzlies 89 San Antonio Spurs 95 -6
2425 1162 Tue Apr 4 2017 Utah Jazz 106 Portland Trail Blazers 87 19
1162 1162 Tue Apr 4 2017 Portland Trail Blazers 87 Utah Jazz 106 -19
2426 1163 Tue Apr 4 2017 Washington Wizards 118 Charlotte Hornets 111 7
1163 1163 Tue Apr 4 2017 Charlotte Hornets 111 Washington Wizards 118 -7
2427 1164 Wed Apr 5 2017 Boston Celtics 91 Cleveland Cavaliers 114 -23
1164 1164 Wed Apr 5 2017 Cleveland Cavaliers 114 Boston Celtics 91 23
2428 1165 Wed Apr 5 2017 Charlotte Hornets 99 Miami Heat 112 -13
1165 1165 Wed Apr 5 2017 Miami Heat 112 Charlotte Hornets 99 13
1166 1166 Wed Apr 5 2017 Toronto Raptors 105 Detroit Pistons 102 3
2429 1166 Wed Apr 5 2017 Detroit Pistons 102 Toronto Raptors 105 -3
1167 1167 Wed Apr 5 2017 Denver Nuggets 104 Houston Rockets 110 -6
2430 1167 Wed Apr 5 2017 Houston Rockets 110 Denver Nuggets 104 6
2431 1168 Wed Apr 5 2017 Los Angeles Clippers 112 Dallas Mavericks 101 11
1168 1168 Wed Apr 5 2017 Dallas Mavericks 101 Los Angeles Clippers 112 -11
1169 1169 Wed Apr 5 2017 Oklahoma City Thunder 103 Memphis Grizzlies 100 3
2432 1169 Wed Apr 5 2017 Memphis Grizzlies 100 Oklahoma City Thunder 103 -3
2433 1170 Wed Apr 5 2017 Phoenix Suns 111 Golden State Warriors 120 -9
1170 1170 Wed Apr 5 2017 Golden State Warriors 120 Phoenix Suns 111 9
2434 1171 Wed Apr 5 2017 San Antonio Spurs 95 Los Angeles Lakers 102 -7
1171 1171 Wed Apr 5 2017 Los Angeles Lakers 102 San Antonio Spurs 95 7
2435 1172 Thu Apr 6 2017 Atlanta Hawks 123 Boston Celtics 116 7
1172 1172 Thu Apr 6 2017 Boston Celtics 116 Atlanta Hawks 123 -7
1173 1173 Thu Apr 6 2017 Milwaukee Bucks 89 Indiana Pacers 104 -15
2436 1173 Thu Apr 6 2017 Indiana Pacers 104 Milwaukee Bucks 89 15
2437 1174 Thu Apr 6 2017 New York Knicks 103 Washington Wizards 106 -3
1174 1174 Thu Apr 6 2017 Washington Wizards 106 New York Knicks 103 3
1175 1175 Thu Apr 6 2017 Brooklyn Nets 107 Orlando Magic 115 -8
2438 1175 Thu Apr 6 2017 Orlando Magic 115 Brooklyn Nets 107 8
1176 1176 Thu Apr 6 2017 Chicago Bulls 102 Philadelphia 76ers 90 12
2439 1176 Thu Apr 6 2017 Philadelphia 76ers 90 Chicago Bulls 102 -12
2440 1177 Thu Apr 6 2017 Portland Trail Blazers 105 Minnesota Timberwolves 98 7
1177 1177 Thu Apr 6 2017 Minnesota Timberwolves 98 Portland Trail Blazers 105 -7
2441 1178 Fri Apr 7 2017 Cleveland Cavaliers 100 Atlanta Hawks 114 -14
1178 1178 Fri Apr 7 2017 Atlanta Hawks 114 Cleveland Cavaliers 100 14
1179 1179 Fri Apr 7 2017 San Antonio Spurs 102 Dallas Mavericks 89 13
2442 1179 Fri Apr 7 2017 Dallas Mavericks 89 San Antonio Spurs 102 -13
2443 1180 Fri Apr 7 2017 Denver Nuggets 122 New Orleans Pelicans 106 16
1180 1180 Fri Apr 7 2017 New Orleans Pelicans 106 Denver Nuggets 122 -16
1181 1181 Fri Apr 7 2017 Detroit Pistons 114 Houston Rockets 109 5
2444 1181 Fri Apr 7 2017 Houston Rockets 109 Detroit Pistons 114 -5
1182 1182 Fri Apr 7 2017 Sacramento Kings 94 Los Angeles Lakers 98 -4
2445 1182 Fri Apr 7 2017 Los Angeles Lakers 98 Sacramento Kings 94 4
1183 1183 Fri Apr 7 2017 New York Knicks 88 Memphis Grizzlies 101 -13
2446 1183 Fri Apr 7 2017 Memphis Grizzlies 101 New York Knicks 88 13
1184 1184 Fri Apr 7 2017 Oklahoma City Thunder 99 Phoenix Suns 120 -21
2447 1184 Fri Apr 7 2017 Phoenix Suns 120 Oklahoma City Thunder 99 21
1185 1185 Fri Apr 7 2017 Miami Heat 94 Toronto Raptors 96 -2
2448 1185 Fri Apr 7 2017 Toronto Raptors 96 Miami Heat 94 2
1186 1186 Fri Apr 7 2017 Minnesota Timberwolves 113 Utah Jazz 120 -7
2449 1186 Fri Apr 7 2017 Utah Jazz 120 Minnesota Timberwolves 113 7
2450 1187 Sat Apr 8 2017 Brooklyn Nets 107 Chicago Bulls 106 1
1187 1187 Sat Apr 8 2017 Chicago Bulls 106 Brooklyn Nets 107 -1
2451 1188 Sat Apr 8 2017 Charlotte Hornets 114 Boston Celtics 121 -7
1188 1188 Sat Apr 8 2017 Boston Celtics 121 Charlotte Hornets 114 7
1189 1189 Sat Apr 8 2017 New Orleans Pelicans 101 Golden State Warriors 123 -22
2452 1189 Sat Apr 8 2017 Golden State Warriors 123 New Orleans Pelicans 101 22
2453 1190 Sat Apr 8 2017 Orlando Magic 112 Indiana Pacers 127 -15
1190 1190 Sat Apr 8 2017 Indiana Pacers 127 Orlando Magic 112 15
1191 1191 Sat Apr 8 2017 Milwaukee Bucks 90 Philadelphia 76ers 82 8
2454 1191 Sat Apr 8 2017 Philadelphia 76ers 82 Milwaukee Bucks 90 -8
1192 1192 Sat Apr 8 2017 Utah Jazz 86 Portland Trail Blazers 101 -15
2455 1192 Sat Apr 8 2017 Portland Trail Blazers 101 Utah Jazz 86 15
1193 1193 Sat Apr 8 2017 Los Angeles Clippers 98 San Antonio Spurs 87 11
2456 1193 Sat Apr 8 2017 San Antonio Spurs 87 Los Angeles Clippers 98 -11
1194 1194 Sat Apr 8 2017 Miami Heat 106 Washington Wizards 103 3
2457 1194 Sat Apr 8 2017 Washington Wizards 103 Miami Heat 106 -3
1195 1195 Sun Apr 9 2017 Cleveland Cavaliers 125 Atlanta Hawks 126 -1
2458 1195 Sun Apr 9 2017 Atlanta Hawks 126 Cleveland Cavaliers 125 1
2459 1196 Sun Apr 9 2017 Denver Nuggets 105 Oklahoma City Thunder 106 -1
1196 1196 Sun Apr 9 2017 Oklahoma City Thunder 106 Denver Nuggets 105 1
1197 1197 Sun Apr 9 2017 Minnesota Timberwolves 109 Los Angeles Lakers 110 -1
2460 1197 Sun Apr 9 2017 Los Angeles Lakers 110 Minnesota Timberwolves 109 1
2461 1198 Sun Apr 9 2017 Memphis Grizzlies 90 Detroit Pistons 103 -13
1198 1198 Sun Apr 9 2017 Detroit Pistons 103 Memphis Grizzlies 90 13
2462 1199 Sun Apr 9 2017 New York Knicks 97 Toronto Raptors 110 -13
1199 1199 Sun Apr 9 2017 Toronto Raptors 110 New York Knicks 97 13
2463 1200 Sun Apr 9 2017 Phoenix Suns 124 Dallas Mavericks 111 13
1200 1200 Sun Apr 9 2017 Dallas Mavericks 111 Phoenix Suns 124 -13
1201 1201 Sun Apr 9 2017 Houston Rockets 135 Sacramento Kings 128 7
2464 1201 Sun Apr 9 2017 Sacramento Kings 128 Houston Rockets 135 -7
1202 1202 Mon Apr 10 2017 Brooklyn Nets 105 Boston Celtics 114 -9
2465 1202 Mon Apr 10 2017 Boston Celtics 114 Brooklyn Nets 105 9
1203 1203 Mon Apr 10 2017 Orlando Magic 75 Chicago Bulls 122 -47
2466 1203 Mon Apr 10 2017 Chicago Bulls 122 Orlando Magic 75 47
2467 1204 Mon Apr 10 2017 Detroit Pistons 101 Washington Wizards 105 -4
1204 1204 Mon Apr 10 2017 Washington Wizards 105 Detroit Pistons 101 4
2468 1205 Mon Apr 10 2017 Golden State Warriors 99 Utah Jazz 105 -6
1205 1205 Mon Apr 10 2017 Utah Jazz 105 Golden State Warriors 99 6
1206 1206 Mon Apr 10 2017 Houston Rockets 96 Los Angeles Clippers 125 -29
2469 1206 Mon Apr 10 2017 Los Angeles Clippers 125 Houston Rockets 96 29
2470 1207 Mon Apr 10 2017 Miami Heat 124 Cleveland Cavaliers 121 3
1207 1207 Mon Apr 10 2017 Cleveland Cavaliers 121 Miami Heat 124 -3
1208 1208 Mon Apr 10 2017 Charlotte Hornets 79 Milwaukee Bucks 89 -10
2471 1208 Mon Apr 10 2017 Milwaukee Bucks 89 Charlotte Hornets 79 10
1209 1209 Mon Apr 10 2017 Indiana Pacers 120 Philadelphia 76ers 111 9
2472 1209 Mon Apr 10 2017 Philadelphia 76ers 111 Indiana Pacers 120 -9
1210 1210 Mon Apr 10 2017 San Antonio Spurs 98 Portland Trail Blazers 99 -1
2473 1210 Mon Apr 10 2017 Portland Trail Blazers 99 San Antonio Spurs 98 1
1211 1211 Tue Apr 11 2017 Charlotte Hornets 76 Atlanta Hawks 103 -27
2474 1211 Tue Apr 11 2017 Atlanta Hawks 103 Charlotte Hornets 76 27
2475 1212 Tue Apr 11 2017 Dallas Mavericks 91 Denver Nuggets 109 -18
1212 1212 Tue Apr 11 2017 Denver Nuggets 109 Dallas Mavericks 91 18
2476 1213 Tue Apr 11 2017 Los Angeles Lakers 108 New Orleans Pelicans 96 12
1213 1213 Tue Apr 11 2017 New Orleans Pelicans 96 Los Angeles Lakers 108 -12
1214 1214 Tue Apr 11 2017 Oklahoma City Thunder 100 Minnesota Timberwolves 98 2
2477 1214 Tue Apr 11 2017 Minnesota Timberwolves 98 Oklahoma City Thunder 100 -2
2478 1215 Tue Apr 11 2017 Sacramento Kings 129 Phoenix Suns 104 25
1215 1215 Tue Apr 11 2017 Phoenix Suns 104 Sacramento Kings 129 -25
1216 1216 Wed Apr 12 2017 Milwaukee Bucks 94 Boston Celtics 112 -18
2479 1216 Wed Apr 12 2017 Boston Celtics 112 Milwaukee Bucks 94 18
1217 1217 Wed Apr 12 2017 Brooklyn Nets 73 Chicago Bulls 112 -39
2480 1217 Wed Apr 12 2017 Chicago Bulls 112 Brooklyn Nets 73 39
1218 1218 Wed Apr 12 2017 Toronto Raptors 98 Cleveland Cavaliers 83 15
2481 1218 Wed Apr 12 2017 Cleveland Cavaliers 83 Toronto Raptors 98 -15
2482 1219 Wed Apr 12 2017 Golden State Warriors 109 Los Angeles Lakers 94 15
1219 1219 Wed Apr 12 2017 Los Angeles Lakers 94 Golden State Warriors 109 -15
2483 1220 Wed Apr 12 2017 Houston Rockets 123 Minnesota Timberwolves 118 5
1220 1220 Wed Apr 12 2017 Minnesota Timberwolves 118 Houston Rockets 123 -5
2484 1221 Wed Apr 12 2017 Indiana Pacers 104 Atlanta Hawks 86 18
1221 1221 Wed Apr 12 2017 Atlanta Hawks 86 Indiana Pacers 104 -18
1222 1222 Wed Apr 12 2017 Sacramento Kings 95 Los Angeles Clippers 115 -20
2485 1222 Wed Apr 12 2017 Los Angeles Clippers 115 Sacramento Kings 95 20
1223 1223 Wed Apr 12 2017 Dallas Mavericks 100 Memphis Grizzlies 93 7
2486 1223 Wed Apr 12 2017 Memphis Grizzlies 93 Dallas Mavericks 100 -7
2487 1224 Wed Apr 12 2017 Miami Heat 110 Washington Wizards 102 8
1224 1224 Wed Apr 12 2017 Washington Wizards 102 Miami Heat 110 -8
1225 1225 Wed Apr 12 2017 Philadelphia 76ers 113 New York Knicks 114 -1
2488 1225 Wed Apr 12 2017 New York Knicks 114 Philadelphia 76ers 113 1
1226 1226 Wed Apr 12 2017 Denver Nuggets 111 Oklahoma City Thunder 105 6
2489 1226 Wed Apr 12 2017 Oklahoma City Thunder 105 Denver Nuggets 111 -6
1227 1227 Wed Apr 12 2017 Detroit Pistons 109 Orlando Magic 113 -4
2490 1227 Wed Apr 12 2017 Orlando Magic 113 Detroit Pistons 109 4
2491 1228 Wed Apr 12 2017 Portland Trail Blazers 100 New Orleans Pelicans 103 -3
1228 1228 Wed Apr 12 2017 New Orleans Pelicans 103 Portland Trail Blazers 100 3
1229 1229 Wed Apr 12 2017 San Antonio Spurs 97 Utah Jazz 101 -4
2492 1229 Wed Apr 12 2017 Utah Jazz 101 San Antonio Spurs 97 4
2493 1230 Sat Apr 15 2017 Cleveland Cavaliers 109 Indiana Pacers 108 1
1230 1230 Sat Apr 15 2017 Indiana Pacers 108 Cleveland Cavaliers 109 -1
2494 1231 Sat Apr 15 2017 Los Angeles Clippers 95 Utah Jazz 97 -2
1231 1231 Sat Apr 15 2017 Utah Jazz 97 Los Angeles Clippers 95 2
2495 1232 Sat Apr 15 2017 San Antonio Spurs 111 Memphis Grizzlies 82 29
1232 1232 Sat Apr 15 2017 Memphis Grizzlies 82 San Antonio Spurs 111 -29
1233 1233 Sat Apr 15 2017 Milwaukee Bucks 97 Toronto Raptors 83 14
2496 1233 Sat Apr 15 2017 Toronto Raptors 83 Milwaukee Bucks 97 -14
1234 1234 Sun Apr 16 2017 Chicago Bulls 106 Boston Celtics 102 4
2497 1234 Sun Apr 16 2017 Boston Celtics 102 Chicago Bulls 106 -4
1235 1235 Sun Apr 16 2017 Portland Trail Blazers 109 Golden State Warriors 121 -12
2498 1235 Sun Apr 16 2017 Golden State Warriors 121 Portland Trail Blazers 109 12
2499 1236 Sun Apr 16 2017 Houston Rockets 118 Oklahoma City Thunder 87 31
1236 1236 Sun Apr 16 2017 Oklahoma City Thunder 87 Houston Rockets 118 -31
1237 1237 Sun Apr 16 2017 Atlanta Hawks 107 Washington Wizards 114 -7
2500 1237 Sun Apr 16 2017 Washington Wizards 114 Atlanta Hawks 107 7
2501 1238 Mon Apr 17 2017 Cleveland Cavaliers 117 Indiana Pacers 111 6
1238 1238 Mon Apr 17 2017 Indiana Pacers 111 Cleveland Cavaliers 117 -6
1239 1239 Mon Apr 17 2017 Memphis Grizzlies 82 San Antonio Spurs 96 -14
2502 1239 Mon Apr 17 2017 San Antonio Spurs 96 Memphis Grizzlies 82 14
2503 1240 Tue Apr 18 2017 Boston Celtics 97 Chicago Bulls 111 -14
1240 1240 Tue Apr 18 2017 Chicago Bulls 111 Boston Celtics 97 14
1241 1241 Tue Apr 18 2017 Utah Jazz 91 Los Angeles Clippers 99 -8
2504 1241 Tue Apr 18 2017 Los Angeles Clippers 99 Utah Jazz 91 8
2505 1242 Tue Apr 18 2017 Toronto Raptors 106 Milwaukee Bucks 100 6
1242 1242 Tue Apr 18 2017 Milwaukee Bucks 100 Toronto Raptors 106 -6
2506 1243 Wed Apr 19 2017 Golden State Warriors 110 Portland Trail Blazers 81 29
1243 1243 Wed Apr 19 2017 Portland Trail Blazers 81 Golden State Warriors 110 -29
2507 1244 Wed Apr 19 2017 Houston Rockets 115 Oklahoma City Thunder 111 4
1244 1244 Wed Apr 19 2017 Oklahoma City Thunder 111 Houston Rockets 115 -4
1245 1245 Wed Apr 19 2017 Atlanta Hawks 101 Washington Wizards 109 -8
2508 1245 Wed Apr 19 2017 Washington Wizards 109 Atlanta Hawks 101 8
2509 1246 Thu Apr 20 2017 Indiana Pacers 114 Cleveland Cavaliers 119 -5
1246 1246 Thu Apr 20 2017 Cleveland Cavaliers 119 Indiana Pacers 114 5
2510 1247 Thu Apr 20 2017 Memphis Grizzlies 105 San Antonio Spurs 94 11
1247 1247 Thu Apr 20 2017 San Antonio Spurs 94 Memphis Grizzlies 105 -11
2511 1248 Thu Apr 20 2017 Milwaukee Bucks 104 Toronto Raptors 77 27
1248 1248 Thu Apr 20 2017 Toronto Raptors 77 Milwaukee Bucks 104 -27
1249 1249 Fri Apr 21 2017 Boston Celtics 104 Chicago Bulls 87 17
2512 1249 Fri Apr 21 2017 Chicago Bulls 87 Boston Celtics 104 -17
2513 1250 Fri Apr 21 2017 Oklahoma City Thunder 115 Houston Rockets 113 2
1250 1250 Fri Apr 21 2017 Houston Rockets 113 Oklahoma City Thunder 115 -2
2514 1251 Fri Apr 21 2017 Utah Jazz 106 Los Angeles Clippers 111 -5
1251 1251 Fri Apr 21 2017 Los Angeles Clippers 111 Utah Jazz 106 5
2515 1252 Sat Apr 22 2017 Atlanta Hawks 116 Washington Wizards 98 18
1252 1252 Sat Apr 22 2017 Washington Wizards 98 Atlanta Hawks 116 -18
2516 1253 Sat Apr 22 2017 Memphis Grizzlies 110 San Antonio Spurs 108 2
1253 1253 Sat Apr 22 2017 San Antonio Spurs 108 Memphis Grizzlies 110 -2
2517 1254 Sat Apr 22 2017 Milwaukee Bucks 76 Toronto Raptors 87 -11
1254 1254 Sat Apr 22 2017 Toronto Raptors 87 Milwaukee Bucks 76 11
2518 1255 Sat Apr 22 2017 Portland Trail Blazers 113 Golden State Warriors 119 -6
1255 1255 Sat Apr 22 2017 Golden State Warriors 119 Portland Trail Blazers 113 6
2519 1256 Sun Apr 23 2017 Chicago Bulls 95 Boston Celtics 104 -9
1256 1256 Sun Apr 23 2017 Boston Celtics 104 Chicago Bulls 95 9
1257 1257 Sun Apr 23 2017 Cleveland Cavaliers 106 Indiana Pacers 102 4
2520 1257 Sun Apr 23 2017 Indiana Pacers 102 Cleveland Cavaliers 106 -4
2521 1258 Sun Apr 23 2017 Oklahoma City Thunder 109 Houston Rockets 113 -4
1258 1258 Sun Apr 23 2017 Houston Rockets 113 Oklahoma City Thunder 109 4
2522 1259 Sun Apr 23 2017 Utah Jazz 105 Los Angeles Clippers 98 7
1259 1259 Sun Apr 23 2017 Los Angeles Clippers 98 Utah Jazz 105 -7
2523 1260 Mon Apr 24 2017 Atlanta Hawks 111 Washington Wizards 101 10
1260 1260 Mon Apr 24 2017 Washington Wizards 101 Atlanta Hawks 111 -10
2524 1261 Mon Apr 24 2017 Portland Trail Blazers 103 Golden State Warriors 128 -25
1261 1261 Mon Apr 24 2017 Golden State Warriors 128 Portland Trail Blazers 103 25
1262 1262 Mon Apr 24 2017 Milwaukee Bucks 93 Toronto Raptors 118 -25
2525 1262 Mon Apr 24 2017 Toronto Raptors 118 Milwaukee Bucks 93 25
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file has been truncated, but you can view the full file.
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.d3 = global.d3 || {})));
}(this, function (exports) { 'use strict';
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
function bisector(compare) {
if (compare.length === 1) compare = ascendingComparator(compare);
return {
left: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) < 0) lo = mid + 1;
else hi = mid;
}
return lo;
},
right: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) > 0) hi = mid;
else lo = mid + 1;
}
return lo;
}
};
}
function ascendingComparator(f) {
return function(d, x) {
return ascending(f(d), x);
};
}
var ascendingBisect = bisector(ascending);
var bisectRight = ascendingBisect.right;
var bisectLeft = ascendingBisect.left;
function descending(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
function number(x) {
return x === null ? NaN : +x;
}
function variance(array, f) {
var n = array.length,
m = 0,
a,
d,
s = 0,
i = -1,
j = 0;
if (f == null) {
while (++i < n) {
if (!isNaN(a = number(array[i]))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
}
else {
while (++i < n) {
if (!isNaN(a = number(f(array[i], i, array)))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
}
if (j > 1) return s / (j - 1);
}
function deviation(array, f) {
var v = variance(array, f);
return v ? Math.sqrt(v) : v;
}
function extent(array, f) {
var i = -1,
n = array.length,
a,
b,
c;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = array[i]) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
return [a, c];
}
var array = Array.prototype;
var slice = array.slice;
var map = array.map;
function constant(x) {
return function() {
return x;
};
}
function identity(x) {
return x;
}
function range(start, stop, step) {
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
var i = -1,
n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
range = new Array(n);
while (++i < n) {
range[i] = start + i * step;
}
return range;
}
var e10 = Math.sqrt(50);
var e5 = Math.sqrt(10);
var e2 = Math.sqrt(2);
function ticks(start, stop, count) {
var step = tickStep(start, stop, count);
return range(
Math.ceil(start / step) * step,
Math.floor(stop / step) * step + step / 2, // inclusive
step
);
}
function tickStep(start, stop, count) {
var step0 = Math.abs(stop - start) / Math.max(0, count),
step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
error = step0 / step1;
if (error >= e10) step1 *= 10;
else if (error >= e5) step1 *= 5;
else if (error >= e2) step1 *= 2;
return stop < start ? -step1 : step1;
}
function sturges(values) {
return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
}
function histogram() {
var value = identity,
domain = extent,
threshold = sturges;
function histogram(data) {
var i,
n = data.length,
x,
values = new Array(n);
for (i = 0; i < n; ++i) {
values[i] = value(data[i], i, data);
}
var xz = domain(values),
x0 = xz[0],
x1 = xz[1],
tz = threshold(values, x0, x1);
// Convert number of thresholds into uniform thresholds.
if (!Array.isArray(tz)) tz = ticks(x0, x1, tz);
// Remove any thresholds outside the domain.
var m = tz.length;
while (tz[0] <= x0) tz.shift(), --m;
while (tz[m - 1] >= x1) tz.pop(), --m;
var bins = new Array(m + 1),
bin;
// Initialize bins.
for (i = 0; i <= m; ++i) {
bin = bins[i] = [];
bin.x0 = i > 0 ? tz[i - 1] : x0;
bin.x1 = i < m ? tz[i] : x1;
}
// Assign data to bins by value, ignoring any outside the domain.
for (i = 0; i < n; ++i) {
x = values[i];
if (x0 <= x && x <= x1) {
bins[bisectRight(tz, x, 0, m)].push(data[i]);
}
}
return bins;
}
histogram.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
};
histogram.domain = function(_) {
return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
};
histogram.thresholds = function(_) {
return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
};
return histogram;
}
function threshold(array, p, f) {
if (f == null) f = number;
if (!(n = array.length)) return;
if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array);
if (p >= 1) return +f(array[n - 1], n - 1, array);
var n,
h = (n - 1) * p,
i = Math.floor(h),
a = +f(array[i], i, array),
b = +f(array[i + 1], i + 1, array);
return a + (b - a) * (h - i);
}
function freedmanDiaconis(values, min, max) {
values = map.call(values, number).sort(ascending);
return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
}
function scott(values, min, max) {
return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
}
function max(array, f) {
var i = -1,
n = array.length,
a,
b;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = array[i]) != null && b > a) a = b;
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b;
}
return a;
}
function mean(array, f) {
var s = 0,
n = array.length,
a,
i = -1,
j = n;
if (f == null) {
while (++i < n) if (!isNaN(a = number(array[i]))) s += a; else --j;
}
else {
while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) s += a; else --j;
}
if (j) return s / j;
}
function median(array, f) {
var numbers = [],
n = array.length,
a,
i = -1;
if (f == null) {
while (++i < n) if (!isNaN(a = number(array[i]))) numbers.push(a);
}
else {
while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) numbers.push(a);
}
return threshold(numbers.sort(ascending), 0.5);
}
function merge(arrays) {
var n = arrays.length,
m,
i = -1,
j = 0,
merged,
array;
while (++i < n) j += arrays[i].length;
merged = new Array(j);
while (--n >= 0) {
array = arrays[n];
m = array.length;
while (--m >= 0) {
merged[--j] = array[m];
}
}
return merged;
}
function min(array, f) {
var i = -1,
n = array.length,
a,
b;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = array[i]) != null && a > b) a = b;
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b;
}
return a;
}
function pairs(array) {
var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
while (i < n) pairs[i] = [p, p = array[++i]];
return pairs;
}
function permute(array, indexes) {
var i = indexes.length, permutes = new Array(i);
while (i--) permutes[i] = array[indexes[i]];
return permutes;
}
function scan(array, compare) {
if (!(n = array.length)) return;
var i = 0,
n,
j = 0,
xi,
xj = array[j];
if (!compare) compare = ascending;
while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i;
if (compare(xj, xj) === 0) return j;
}
function shuffle(array, i0, i1) {
var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
t,
i;
while (m) {
i = Math.random() * m-- | 0;
t = array[m + i0];
array[m + i0] = array[i + i0];
array[i + i0] = t;
}
return array;
}
function sum(array, f) {
var s = 0,
n = array.length,
a,
i = -1;
if (f == null) {
while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent.
}
else {
while (++i < n) if (a = +f(array[i], i, array)) s += a;
}
return s;
}
function transpose(matrix) {
if (!(n = matrix.length)) return [];
for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
row[j] = matrix[j][i];
}
}
return transpose;
}
function length(d) {
return d.length;
}
function zip() {
return transpose(arguments);
}
var prefix = "$";
function Map() {}
Map.prototype = map$1.prototype = {
constructor: Map,
has: function(key) {
return (prefix + key) in this;
},
get: function(key) {
return this[prefix + key];
},
set: function(key, value) {
this[prefix + key] = value;
return this;
},
remove: function(key) {
var property = prefix + key;
return property in this && delete this[property];
},
clear: function() {
for (var property in this) if (property[0] === prefix) delete this[property];
},
keys: function() {
var keys = [];
for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
return keys;
},
values: function() {
var values = [];
for (var property in this) if (property[0] === prefix) values.push(this[property]);
return values;
},
entries: function() {
var entries = [];
for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
return entries;
},
size: function() {
var size = 0;
for (var property in this) if (property[0] === prefix) ++size;
return size;
},
empty: function() {
for (var property in this) if (property[0] === prefix) return false;
return true;
},
each: function(f) {
for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
}
};
function map$1(object, f) {
var map = new Map;
// Copy constructor.
if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
// Index array by numeric index or specified key function.
else if (Array.isArray(object)) {
var i = -1,
n = object.length,
o;
if (f == null) while (++i < n) map.set(i, object[i]);
else while (++i < n) map.set(f(o = object[i], i, object), o);
}
// Convert object to map.
else if (object) for (var key in object) map.set(key, object[key]);
return map;
}
function nest() {
var keys = [],
sortKeys = [],
sortValues,
rollup,
nest;
function apply(array, depth, createResult, setResult) {
if (depth >= keys.length) return rollup != null
? rollup(array) : (sortValues != null
? array.sort(sortValues)
: array);
var i = -1,
n = array.length,
key = keys[depth++],
keyValue,
value,
valuesByKey = map$1(),
values,
result = createResult();
while (++i < n) {
if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
values.push(value);
} else {
valuesByKey.set(keyValue, [value]);
}
}
valuesByKey.each(function(values, key) {
setResult(result, key, apply(values, depth, createResult, setResult));
});
return result;
}
function entries(map, depth) {
if (++depth > keys.length) return map;
var array, sortKey = sortKeys[depth - 1];
if (rollup != null && depth >= keys.length) array = map.entries();
else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
}
return nest = {
object: function(array) { return apply(array, 0, createObject, setObject); },
map: function(array) { return apply(array, 0, createMap, setMap); },
entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
key: function(d) { keys.push(d); return nest; },
sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
sortValues: function(order) { sortValues = order; return nest; },
rollup: function(f) { rollup = f; return nest; }
};
}
function createObject() {
return {};
}
function setObject(object, key, value) {
object[key] = value;
}
function createMap() {
return map$1();
}
function setMap(map, key, value) {
map.set(key, value);
}
function Set() {}
var proto = map$1.prototype;
Set.prototype = set.prototype = {
constructor: Set,
has: proto.has,
add: function(value) {
value += "";
this[prefix + value] = value;
return this;
},
remove: proto.remove,
clear: proto.clear,
values: proto.keys,
size: proto.size,
empty: proto.empty,
each: proto.each
};
function set(object, f) {
var set = new Set;
// Copy constructor.
if (object instanceof Set) object.each(function(value) { set.add(value); });
// Otherwise, assume it’s an array.
else if (object) {
var i = -1, n = object.length;
if (f == null) while (++i < n) set.add(object[i]);
else while (++i < n) set.add(f(object[i], i, object));
}
return set;
}
function d3keys(map) {
var keys = [];
for (var key in map) keys.push(key);
return keys;
}
function values(map) {
var values = [];
for (var key in map) values.push(map[key]);
return values;
}
function entries(map) {
var entries = [];
for (var key in map) entries.push({key: key, value: map[key]});
return entries;
}
function uniform(min, max) {
min = min == null ? 0 : +min;
max = max == null ? 1 : +max;
if (arguments.length === 1) max = min, min = 0;
else max -= min;
return function() {
return Math.random() * max + min;
};
}
function normal(mu, sigma) {
var x, r;
mu = mu == null ? 0 : +mu;
sigma = sigma == null ? 1 : +sigma;
return function() {
var y;
// If available, use the second previously-generated uniform random.
if (x != null) y = x, x = null;
// Otherwise, generate a new x and y.
else do {
x = Math.random() * 2 - 1;
y = Math.random() * 2 - 1;
r = x * x + y * y;
} while (!r || r > 1);
return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
};
}
function logNormal() {
var randomNormal = normal.apply(this, arguments);
return function() {
return Math.exp(randomNormal());
};
}
function irwinHall(n) {
return function() {
for (var sum = 0, i = 0; i < n; ++i) sum += Math.random();
return sum;
};
}
function bates(n) {
var randomIrwinHall = irwinHall(n);
return function() {
return randomIrwinHall() / n;
};
}
function exponential(lambda) {
return function() {
return -Math.log(1 - Math.random()) / lambda;
};
}
function linear(t) {
return +t;
}
function quadIn(t) {
return t * t;
}
function quadOut(t) {
return t * (2 - t);
}
function quadInOut(t) {
return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
}
function cubicIn(t) {
return t * t * t;
}
function cubicOut(t) {
return --t * t * t + 1;
}
function easeCubicInOut(t) {
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
}
var exponent = 3;
var polyIn = (function custom(e) {
e = +e;
function polyIn(t) {
return Math.pow(t, e);
}
polyIn.exponent = custom;
return polyIn;
})(exponent);
var polyOut = (function custom(e) {
e = +e;
function polyOut(t) {
return 1 - Math.pow(1 - t, e);
}
polyOut.exponent = custom;
return polyOut;
})(exponent);
var polyInOut = (function custom(e) {
e = +e;
function polyInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
}
polyInOut.exponent = custom;
return polyInOut;
})(exponent);
var pi = Math.PI;
var halfPi = pi / 2;
function sinIn(t) {
return 1 - Math.cos(t * halfPi);
}
function sinOut(t) {
return Math.sin(t * halfPi);
}
function sinInOut(t) {
return (1 - Math.cos(pi * t)) / 2;
}
function expIn(t) {
return Math.pow(2, 10 * t - 10);
}
function expOut(t) {
return 1 - Math.pow(2, -10 * t);
}
function expInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
}
function circleIn(t) {
return 1 - Math.sqrt(1 - t * t);
}
function circleOut(t) {
return Math.sqrt(1 - --t * t);
}
function circleInOut(t) {
return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
}
var b1 = 4 / 11;
var b2 = 6 / 11;
var b3 = 8 / 11;
var b4 = 3 / 4;
var b5 = 9 / 11;
var b6 = 10 / 11;
var b7 = 15 / 16;
var b8 = 21 / 22;
var b9 = 63 / 64;
var b0 = 1 / b1 / b1;
function bounceIn(t) {
return 1 - bounceOut(1 - t);
}
function bounceOut(t) {
return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
}
function bounceInOut(t) {
return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
}
var overshoot = 1.70158;
var backIn = (function custom(s) {
s = +s;
function backIn(t) {
return t * t * ((s + 1) * t - s);
}
backIn.overshoot = custom;
return backIn;
})(overshoot);
var backOut = (function custom(s) {
s = +s;
function backOut(t) {
return --t * t * ((s + 1) * t + s) + 1;
}
backOut.overshoot = custom;
return backOut;
})(overshoot);
var backInOut = (function custom(s) {
s = +s;
function backInOut(t) {
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
}
backInOut.overshoot = custom;
return backInOut;
})(overshoot);
var tau = 2 * Math.PI;
var amplitude = 1;
var period = 0.3;
var elasticIn = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticIn(t) {
return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
}
elasticIn.amplitude = function(a) { return custom(a, p * tau); };
elasticIn.period = function(p) { return custom(a, p); };
return elasticIn;
})(amplitude, period);
var elasticOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticOut(t) {
return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
}
elasticOut.amplitude = function(a) { return custom(a, p * tau); };
elasticOut.period = function(p) { return custom(a, p); };
return elasticOut;
})(amplitude, period);
var elasticInOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticInOut(t) {
return ((t = t * 2 - 1) < 0
? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
: 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
}
elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
elasticInOut.period = function(p) { return custom(a, p); };
return elasticInOut;
})(amplitude, period);
function area(polygon) {
var i = -1,
n = polygon.length,
a,
b = polygon[n - 1],
area = 0;
while (++i < n) {
a = b;
b = polygon[i];
area += a[1] * b[0] - a[0] * b[1];
}
return area / 2;
}
function centroid(polygon) {
var i = -1,
n = polygon.length,
x = 0,
y = 0,
a,
b = polygon[n - 1],
c,
k = 0;
while (++i < n) {
a = b;
b = polygon[i];
k += c = a[0] * b[1] - b[0] * a[1];
x += (a[0] + b[0]) * c;
y += (a[1] + b[1]) * c;
}
return k *= 3, [x / k, y / k];
}
// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
// the 3D cross product in a quadrant I Cartesian coordinate system (+x is
// right, +y is up). Returns a positive value if ABC is counter-clockwise,
// negative if clockwise, and zero if the points are collinear.
function cross(a, b, c) {
return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
}
function lexicographicOrder(a, b) {
return a[0] - b[0] || a[1] - b[1];
}
// Computes the upper convex hull per the monotone chain algorithm.
// Assumes points.length >= 3, is sorted by x, unique in y.
// Returns an array of indices into points in left-to-right order.
function computeUpperHullIndexes(points) {
var n = points.length,
indexes = [0, 1],
size = 2;
for (var i = 2; i < n; ++i) {
while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
indexes[size++] = i;
}
return indexes.slice(0, size); // remove popped points
}
function hull(points) {
if ((n = points.length) < 3) return null;
var i,
n,
sortedPoints = new Array(n),
flippedPoints = new Array(n);
for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
sortedPoints.sort(lexicographicOrder);
for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
var upperIndexes = computeUpperHullIndexes(sortedPoints),
lowerIndexes = computeUpperHullIndexes(flippedPoints);
// Construct the hull polygon, removing possible duplicate endpoints.
var skipLeft = lowerIndexes[0] === upperIndexes[0],
skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
hull = [];
// Add upper hull in right-to-l order.
// Then add lower hull in left-to-right order.
for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
return hull;
}
function contains(polygon, point) {
var n = polygon.length,
p = polygon[n - 1],
x = point[0], y = point[1],
x0 = p[0], y0 = p[1],
x1, y1,
inside = false;
for (var i = 0; i < n; ++i) {
p = polygon[i], x1 = p[0], y1 = p[1];
if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
x0 = x1, y0 = y1;
}
return inside;
}
function length$1(polygon) {
var i = -1,
n = polygon.length,
b = polygon[n - 1],
xa,
ya,
xb = b[0],
yb = b[1],
perimeter = 0;
while (++i < n) {
xa = xb;
ya = yb;
b = polygon[i];
xb = b[0];
yb = b[1];
xa -= xb;
ya -= yb;
perimeter += Math.sqrt(xa * xa + ya * ya);
}
return perimeter;
}
var pi$1 = Math.PI;
var tau$1 = 2 * pi$1;
var epsilon = 1e-6;
var tauEpsilon = tau$1 - epsilon;
function Path() {
this._x0 = this._y0 = // start of current subpath
this._x1 = this._y1 = null; // end of current subpath
this._ = [];
}
function path() {
return new Path;
}
Path.prototype = path.prototype = {
constructor: Path,
moveTo: function(x, y) {
this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y);
},
closePath: function() {
if (this._x1 !== null) {
this._x1 = this._x0, this._y1 = this._y0;
this._.push("Z");
}
},
lineTo: function(x, y) {
this._.push("L", this._x1 = +x, ",", this._y1 = +y);
},
quadraticCurveTo: function(x1, y1, x, y) {
this._.push("Q", +x1, ",", +y1, ",", this._x1 = +x, ",", this._y1 = +y);
},
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
this._.push("C", +x1, ",", +y1, ",", +x2, ",", +y2, ",", this._x1 = +x, ",", this._y1 = +y);
},
arcTo: function(x1, y1, x2, y2, r) {
x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
var x0 = this._x1,
y0 = this._y1,
x21 = x2 - x1,
y21 = y2 - y1,
x01 = x0 - x1,
y01 = y0 - y1,
l01_2 = x01 * x01 + y01 * y01;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x1,y1).
if (this._x1 === null) {
this._.push(
"M", this._x1 = x1, ",", this._y1 = y1
);
}
// Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
else if (!(l01_2 > epsilon));
// Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
// Equivalently, is (x1,y1) coincident with (x2,y2)?
// Or, is the radius zero? Line to (x1,y1).
else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
this._.push(
"L", this._x1 = x1, ",", this._y1 = y1
);
}
// Otherwise, draw an arc!
else {
var x20 = x2 - x0,
y20 = y2 - y0,
l21_2 = x21 * x21 + y21 * y21,
l20_2 = x20 * x20 + y20 * y20,
l21 = Math.sqrt(l21_2),
l01 = Math.sqrt(l01_2),
l = r * Math.tan((pi$1 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
t01 = l / l01,
t21 = l / l21;
// If the start tangent is not coincident with (x0,y0), line to.
if (Math.abs(t01 - 1) > epsilon) {
this._.push(
"L", x1 + t01 * x01, ",", y1 + t01 * y01
);
}
this._.push(
"A", r, ",", r, ",0,0,", +(y01 * x20 > x01 * y20), ",", this._x1 = x1 + t21 * x21, ",", this._y1 = y1 + t21 * y21
);
}
},
arc: function(x, y, r, a0, a1, ccw) {
x = +x, y = +y, r = +r;
var dx = r * Math.cos(a0),
dy = r * Math.sin(a0),
x0 = x + dx,
y0 = y + dy,
cw = 1 ^ ccw,
da = ccw ? a0 - a1 : a1 - a0;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x0,y0).
if (this._x1 === null) {
this._.push(
"M", x0, ",", y0
);
}
// Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
this._.push(
"L", x0, ",", y0
);
}
// Is this arc empty? We’re done.
if (!r) return;
// Is this a complete circle? Draw two arcs to complete the circle.
if (da > tauEpsilon) {
this._.push(
"A", r, ",", r, ",0,1,", cw, ",", x - dx, ",", y - dy,
"A", r, ",", r, ",0,1,", cw, ",", this._x1 = x0, ",", this._y1 = y0
);
}
// Otherwise, draw an arc!
else {
if (da < 0) da = da % tau$1 + tau$1;
this._.push(
"A", r, ",", r, ",0,", +(da >= pi$1), ",", cw, ",", this._x1 = x + r * Math.cos(a1), ",", this._y1 = y + r * Math.sin(a1)
);
}
},
rect: function(x, y, w, h) {
this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y, "h", +w, "v", +h, "h", -w, "Z");
},
toString: function() {
return this._.join("");
}
};
function tree_add(d) {
var x = +this._x.call(null, d),
y = +this._y.call(null, d);
return add(this.cover(x, y), x, y, d);
}
function add(tree, x, y, d) {
if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
var parent,
node = tree._root,
leaf = {data: d},
x0 = tree._x0,
y0 = tree._y0,
x1 = tree._x1,
y1 = tree._y1,
xm,
ym,
xp,
yp,
right,
bottom,
i,
j;
// If the tree is empty, initialize the root as a leaf.
if (!node) return tree._root = leaf, tree;
// Find the existing leaf for the new point, or add it.
while (node.length) {
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
}
// Is the new point is exactly coincident with the existing point?
xp = +tree._x.call(null, node.data);
yp = +tree._y.call(null, node.data);
if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
// Otherwise, split the leaf node until the old and new point are separated.
do {
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
return parent[j] = node, parent[i] = leaf, tree;
}
function addAll(data) {
var d, i, n = data.length,
x,
y,
xz = new Array(n),
yz = new Array(n),
x0 = Infinity,
y0 = Infinity,
x1 = -Infinity,
y1 = -Infinity;
// Compute the points and their extent.
for (i = 0; i < n; ++i) {
if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
xz[i] = x;
yz[i] = y;
if (x < x0) x0 = x;
if (x > x1) x1 = x;
if (y < y0) y0 = y;
if (y > y1) y1 = y;
}
// If there were no (valid) points, inherit the existing extent.
if (x1 < x0) x0 = this._x0, x1 = this._x1;
if (y1 < y0) y0 = this._y0, y1 = this._y1;
// Expand the tree to cover the new points.
this.cover(x0, y0).cover(x1, y1);
// Add the new points.
for (i = 0; i < n; ++i) {
add(this, xz[i], yz[i], data[i]);
}
return this;
}
function tree_cover(x, y) {
if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
var x0 = this._x0,
y0 = this._y0,
x1 = this._x1,
y1 = this._y1;
// If the quadtree has no extent, initialize them.
// Integer extent are necessary so that if we later double the extent,
// the existing quadrant boundaries don’t change due to floating point error!
if (isNaN(x0)) {
x1 = (x0 = Math.floor(x)) + 1;
y1 = (y0 = Math.floor(y)) + 1;
}
// Otherwise, double repeatedly to cover.
else if (x0 > x || x > x1 || y0 > y || y > y1) {
var z = x1 - x0,
node = this._root,
parent,
i;
switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
case 0: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
break;
}
case 1: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
break;
}
case 2: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
break;
}
case 3: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
break;
}
}
if (this._root && this._root.length) this._root = node;
}
// If the quadtree covers the point already, just return.
else return this;
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
return this;
}
function tree_data() {
var data = [];
this.visit(function(node) {
if (!node.length) do data.push(node.data); while (node = node.next)
});
return data;
}
function tree_extent(_) {
return arguments.length
? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
: isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
}
function Quad(node, x0, y0, x1, y1) {
this.node = node;
this.x0 = x0;
this.y0 = y0;
this.x1 = x1;
this.y1 = y1;
}
function tree_find(x, y, radius) {
var data,
x0 = this._x0,
y0 = this._y0,
x1,
y1,
x2,
y2,
x3 = this._x1,
y3 = this._y1,
quads = [],
node = this._root,
q,
i;
if (node) quads.push(new Quad(node, x0, y0, x3, y3));
if (radius == null) radius = Infinity;
else {
x0 = x - radius, y0 = y - radius;
x3 = x + radius, y3 = y + radius;
radius *= radius;
}
while (q = quads.pop()) {
// Stop searching if this quadrant can’t contain a closer node.
if (!(node = q.node)
|| (x1 = q.x0) > x3
|| (y1 = q.y0) > y3
|| (x2 = q.x1) < x0
|| (y2 = q.y1) < y0) continue;
// Bisect the current quadrant.
if (node.length) {
var xm = (x1 + x2) / 2,
ym = (y1 + y2) / 2;
quads.push(
new Quad(node[3], xm, ym, x2, y2),
new Quad(node[2], x1, ym, xm, y2),
new Quad(node[1], xm, y1, x2, ym),
new Quad(node[0], x1, y1, xm, ym)
);
// Visit the closest quadrant first.
if (i = (y >= ym) << 1 | (x >= xm)) {
q = quads[quads.length - 1];
quads[quads.length - 1] = quads[quads.length - 1 - i];
quads[quads.length - 1 - i] = q;
}
}
// Visit this point. (Visiting coincident points isn’t necessary!)
else {
var dx = x - +this._x.call(null, node.data),
dy = y - +this._y.call(null, node.data),
d2 = dx * dx + dy * dy;
if (d2 < radius) {
var d = Math.sqrt(radius = d2);
x0 = x - d, y0 = y - d;
x3 = x + d, y3 = y + d;
data = node.data;
}
}
}
return data;
}
function tree_remove(d) {
if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
var parent,
node = this._root,
retainer,
previous,
next,
x0 = this._x0,
y0 = this._y0,
x1 = this._x1,
y1 = this._y1,
x,
y,
xm,
ym,
right,
bottom,
i,
j;
// If the tree is empty, initialize the root as a leaf.
if (!node) return this;
// Find the leaf node for the point.
// While descending, also retain the deepest parent with a non-removed sibling.
if (node.length) while (true) {
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
if (!node.length) break;
if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
}
// Find the point to remove.
while (node.data !== d) if (!(previous = node, node = node.next)) return this;
if (next = node.next) delete node.next;
// If there are multiple coincident points, remove just the point.
if (previous) return (next ? previous.next = next : delete previous.next), this;
// If this is the root point, remove it.
if (!parent) return this._root = next, this;
// Remove this leaf.
next ? parent[i] = next : delete parent[i];
// If the parent now contains exactly one leaf, collapse superfluous parents.
if ((node = parent[0] || parent[1] || parent[2] || parent[3])
&& node === (parent[3] || parent[2] || parent[1] || parent[0])
&& !node.length) {
if (retainer) retainer[j] = node;
else this._root = node;
}
return this;
}
function removeAll(data) {
for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
return this;
}
function tree_root() {
return this._root;
}
function tree_size() {
var size = 0;
this.visit(function(node) {
if (!node.length) do ++size; while (node = node.next)
});
return size;
}
function tree_visit(callback) {
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
}
}
return this;
}
function tree_visitAfter(callback) {
var quads = [], next = [], q;
if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
var node = q.node;
if (node.length) {
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
}
next.push(q);
}
while (q = next.pop()) {
callback(q.node, q.x0, q.y0, q.x1, q.y1);
}
return this;
}
function defaultX(d) {
return d[0];
}
function tree_x(_) {
return arguments.length ? (this._x = _, this) : this._x;
}
function defaultY(d) {
return d[1];
}
function tree_y(_) {
return arguments.length ? (this._y = _, this) : this._y;
}
function quadtree(nodes, x, y) {
var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
return nodes == null ? tree : tree.addAll(nodes);
}
function Quadtree(x, y, x0, y0, x1, y1) {
this._x = x;
this._y = y;
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
this._root = undefined;
}
function leaf_copy(leaf) {
var copy = {data: leaf.data}, next = copy;
while (leaf = leaf.next) next = next.next = {data: leaf.data};
return copy;
}
var treeProto = quadtree.prototype = Quadtree.prototype;
treeProto.copy = function() {
var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
node = this._root,
nodes,
child;
if (!node) return copy;
if (!node.length) return copy._root = leaf_copy(node), copy;
nodes = [{source: node, target: copy._root = new Array(4)}];
while (node = nodes.pop()) {
for (var i = 0; i < 4; ++i) {
if (child = node.source[i]) {
if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
else node.target[i] = leaf_copy(child);
}
}
}
return copy;
};
treeProto.add = tree_add;
treeProto.addAll = addAll;
treeProto.cover = tree_cover;
treeProto.data = tree_data;
treeProto.extent = tree_extent;
treeProto.find = tree_find;
treeProto.remove = tree_remove;
treeProto.removeAll = removeAll;
treeProto.root = tree_root;
treeProto.size = tree_size;
treeProto.visit = tree_visit;
treeProto.visitAfter = tree_visitAfter;
treeProto.x = tree_x;
treeProto.y = tree_y;
var slice$1 = [].slice;
var noabort = {};
function Queue(size) {
if (!(size >= 1)) throw new Error;
this._size = size;
this._call =
this._error = null;
this._tasks = [];
this._data = [];
this._waiting =
this._active =
this._ended =
this._start = 0; // inside a synchronous task callback?
}
Queue.prototype = queue.prototype = {
constructor: Queue,
defer: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
if (this._error != null) return this;
var t = slice$1.call(arguments, 1);
t.push(callback);
++this._waiting, this._tasks.push(t);
poke(this);
return this;
},
abort: function() {
if (this._error == null) abort(this, new Error("abort"));
return this;
},
await: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
maybeNotify(this);
return this;
},
awaitAll: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
this._call = callback;
maybeNotify(this);
return this;
}
};
function poke(q) {
if (!q._start) {
try { start(q); } // let the current task complete
catch (e) {
if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
else if (!q._data) throw e; // await callback errored synchronously
}
}
}
function start(q) {
while (q._start = q._waiting && q._active < q._size) {
var i = q._ended + q._active,
t = q._tasks[i],
j = t.length - 1,
c = t[j];
t[j] = end(q, i);
--q._waiting, ++q._active;
t = c.apply(null, t);
if (!q._tasks[i]) continue; // task finished synchronously
q._tasks[i] = t || noabort;
}
}
function end(q, i) {
return function(e, r) {
if (!q._tasks[i]) return; // ignore multiple callbacks
--q._active, ++q._ended;
q._tasks[i] = null;
if (q._error != null) return; // ignore secondary errors
if (e != null) {
abort(q, e);
} else {
q._data[i] = r;
if (q._waiting) poke(q);
else maybeNotify(q);
}
};
}
function abort(q, e) {
var i = q._tasks.length, t;
q._error = e; // ignore active callbacks
q._data = undefined; // allow gc
q._waiting = NaN; // prevent starting
while (--i >= 0) {
if (t = q._tasks[i]) {
q._tasks[i] = null;
if (t.abort) {
try { t.abort(); }
catch (e) { /* ignore */ }
}
}
}
q._active = NaN; // allow notification
maybeNotify(q);
}
function maybeNotify(q) {
if (!q._active && q._call) {
var d = q._data;
q._data = undefined; // allow gc
q._call(q._error, d);
}
}
function queue(concurrency) {
return new Queue(arguments.length ? +concurrency : Infinity);
}
function constant$1(x) {
return function constant() {
return x;
};
}
var epsilon$1 = 1e-12;
var pi$2 = Math.PI;
var halfPi$1 = pi$2 / 2;
var tau$2 = 2 * pi$2;
function arcInnerRadius(d) {
return d.innerRadius;
}
function arcOuterRadius(d) {
return d.outerRadius;
}
function arcStartAngle(d) {
return d.startAngle;
}
function arcEndAngle(d) {
return d.endAngle;
}
function arcPadAngle(d) {
return d && d.padAngle; // Note: optional!
}
function asin(x) {
return x >= 1 ? halfPi$1 : x <= -1 ? -halfPi$1 : Math.asin(x);
}
function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
var x10 = x1 - x0, y10 = y1 - y0,
x32 = x3 - x2, y32 = y3 - y2,
t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
return [x0 + t * x10, y0 + t * y10];
}
// Compute perpendicular offset line of length rc.
// http://mathworld.wolfram.com/Circle-LineIntersection.html
function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
var x01 = x0 - x1,
y01 = y0 - y1,
lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01),
ox = lo * y01,
oy = -lo * x01,
x11 = x0 + ox,
y11 = y0 + oy,
x10 = x1 + ox,
y10 = y1 + oy,
x00 = (x11 + x10) / 2,
y00 = (y11 + y10) / 2,
dx = x10 - x11,
dy = y10 - y11,
d2 = dx * dx + dy * dy,
r = r1 - rc,
D = x11 * y10 - x10 * y11,
d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)),
cx0 = (D * dy - dx * d) / d2,
cy0 = (-D * dx - dy * d) / d2,
cx1 = (D * dy + dx * d) / d2,
cy1 = (-D * dx + dy * d) / d2,
dx0 = cx0 - x00,
dy0 = cy0 - y00,
dx1 = cx1 - x00,
dy1 = cy1 - y00;
// Pick the closer of the two intersection points.
// TODO Is there a faster way to determine which intersection to use?
if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
return {
cx: cx0,
cy: cy0,
x01: -ox,
y01: -oy,
x11: cx0 * (r1 / r - 1),
y11: cy0 * (r1 / r - 1)
};
}
function arc() {
var innerRadius = arcInnerRadius,
outerRadius = arcOuterRadius,
cornerRadius = constant$1(0),
padRadius = null,
startAngle = arcStartAngle,
endAngle = arcEndAngle,
padAngle = arcPadAngle,
context = null;
function arc() {
var buffer,
r,
r0 = +innerRadius.apply(this, arguments),
r1 = +outerRadius.apply(this, arguments),
a0 = startAngle.apply(this, arguments) - halfPi$1,
a1 = endAngle.apply(this, arguments) - halfPi$1,
da = Math.abs(a1 - a0),
cw = a1 > a0;
if (!context) context = buffer = path();
// Ensure that the outer radius is always larger than the inner radius.
if (r1 < r0) r = r1, r1 = r0, r0 = r;
// Is it a point?
if (!(r1 > epsilon$1)) context.moveTo(0, 0);
// Or is it a circle or annulus?
else if (da > tau$2 - epsilon$1) {
context.moveTo(r1 * Math.cos(a0), r1 * Math.sin(a0));
context.arc(0, 0, r1, a0, a1, !cw);
if (r0 > epsilon$1) {
context.moveTo(r0 * Math.cos(a1), r0 * Math.sin(a1));
context.arc(0, 0, r0, a1, a0, cw);
}
}
// Or is it a circular or annular sector?
else {
var a01 = a0,
a11 = a1,
a00 = a0,
a10 = a1,
da0 = da,
da1 = da,
ap = padAngle.apply(this, arguments) / 2,
rp = (ap > epsilon$1) && (padRadius ? +padRadius.apply(this, arguments) : Math.sqrt(r0 * r0 + r1 * r1)),
rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
rc0 = rc,
rc1 = rc,
t0,
t1;
// Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
if (rp > epsilon$1) {
var p0 = asin(rp / r0 * Math.sin(ap)),
p1 = asin(rp / r1 * Math.sin(ap));
if ((da0 -= p0 * 2) > epsilon$1) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
else da0 = 0, a00 = a10 = (a0 + a1) / 2;
if ((da1 -= p1 * 2) > epsilon$1) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
else da1 = 0, a01 = a11 = (a0 + a1) / 2;
}
var x01 = r1 * Math.cos(a01),
y01 = r1 * Math.sin(a01),
x10 = r0 * Math.cos(a10),
y10 = r0 * Math.sin(a10);
// Apply rounded corners?
if (rc > epsilon$1) {
var x11 = r1 * Math.cos(a11),
y11 = r1 * Math.sin(a11),
x00 = r0 * Math.cos(a00),
y00 = r0 * Math.sin(a00);
// Restrict the corner radius according to the sector angle.
if (da < pi$2) {
var oc = da0 > epsilon$1 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
ax = x01 - oc[0],
ay = y01 - oc[1],
bx = x11 - oc[0],
by = y11 - oc[1],
kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2),
lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
rc0 = Math.min(rc, (r0 - lc) / (kc - 1));
rc1 = Math.min(rc, (r1 - lc) / (kc + 1));
}
}
// Is the sector collapsed to a line?
if (!(da1 > epsilon$1)) context.moveTo(x01, y01);
// Does the sector’s outer ring have rounded corners?
else if (rc1 > epsilon$1) {
t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r1, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
context.arc(t1.cx, t1.cy, rc1, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw);
}
}
// Or is the outer ring just a circular arc?
else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
// Is there no inner ring, and it’s a circular sector?
// Or perhaps it’s an annular sector collapsed due to padding?
if (!(r0 > epsilon$1) || !(da0 > epsilon$1)) context.lineTo(x10, y10);
// Does the sector’s inner ring (or point) have rounded corners?
else if (rc0 > epsilon$1) {
t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r0, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);
context.arc(t1.cx, t1.cy, rc0, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw);
}
}
// Or is the inner ring just a circular arc?
else context.arc(0, 0, r0, a10, a00, cw);
}
context.closePath();
if (buffer) return context = null, buffer + "" || null;
}
arc.centroid = function() {
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$2 / 2;
return [Math.cos(a) * r, Math.sin(a) * r];
};
arc.innerRadius = function(_) {
return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : innerRadius;
};
arc.outerRadius = function(_) {
return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : outerRadius;
};
arc.cornerRadius = function(_) {
return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : cornerRadius;
};
arc.padRadius = function(_) {
return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), arc) : padRadius;
};
arc.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : startAngle;
};
arc.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : endAngle;
};
arc.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : padAngle;
};
arc.context = function(_) {
return arguments.length ? ((context = _ == null ? null : _), arc) : context;
};
return arc;
}
function Linear(context) {
this._context = context;
}
Linear.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: this._context.lineTo(x, y); break;
}
}
};
function curveLinear(context) {
return new Linear(context);
}
function x(p) {
return p[0];
}
function y(p) {
return p[1];
}
function line() {
var x$$ = x,
y$$ = y,
defined = constant$1(true),
context = null,
curve = curveLinear,
output = null;
function line(data) {
var i,
n = data.length,
d,
defined0 = false,
buffer;
if (context == null) output = curve(buffer = path());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) output.lineStart();
else output.lineEnd();
}
if (defined0) output.point(+x$$(d, i, data), +y$$(d, i, data));
}
if (buffer) return output = null, buffer + "" || null;
}
line.x = function(_) {
return arguments.length ? (x$$ = typeof _ === "function" ? _ : constant$1(+_), line) : x$$;
};
line.y = function(_) {
return arguments.length ? (y$$ = typeof _ === "function" ? _ : constant$1(+_), line) : y$$;
};
line.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), line) : defined;
};
line.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
};
line.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
};
return line;
}
function area$1() {
var x0 = x,
x1 = null,
y0 = constant$1(0),
y1 = y,
defined = constant$1(true),
context = null,
curve = curveLinear,
output = null;
function area(data) {
var i,
j,
k,
n = data.length,
d,
defined0 = false,
buffer,
x0z = new Array(n),
y0z = new Array(n);
if (context == null) output = curve(buffer = path());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) {
j = i;
output.areaStart();
output.lineStart();
} else {
output.lineEnd();
output.lineStart();
for (k = i - 1; k >= j; --k) {
output.point(x0z[k], y0z[k]);
}
output.lineEnd();
output.areaEnd();
}
}
if (defined0) {
x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
}
}
if (buffer) return output = null, buffer + "" || null;
}
function arealine() {
return line().defined(defined).curve(curve).context(context);
}
area.x = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), x1 = null, area) : x0;
};
area.x0 = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), area) : x0;
};
area.x1 = function(_) {
return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : x1;
};
area.y = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), y1 = null, area) : y0;
};
area.y0 = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), area) : y0;
};
area.y1 = function(_) {
return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : y1;
};
area.lineX0 =
area.lineY0 = function() {
return arealine().x(x0).y(y0);
};
area.lineY1 = function() {
return arealine().x(x0).y(y1);
};
area.lineX1 = function() {
return arealine().x(x1).y(y0);
};
area.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), area) : defined;
};
area.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
};
area.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
};
return area;
}
function descending$1(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
function identity$1(d) {
return d;
}
function pie() {
var value = identity$1,
sortValues = descending$1,
sort = null,
startAngle = constant$1(0),
endAngle = constant$1(tau$2),
padAngle = constant$1(0);
function pie(data) {
var i,
n = data.length,
j,
k,
sum = 0,
index = new Array(n),
arcs = new Array(n),
a0 = +startAngle.apply(this, arguments),
da = Math.min(tau$2, Math.max(-tau$2, endAngle.apply(this, arguments) - a0)),
a1,
p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
pa = p * (da < 0 ? -1 : 1),
v;
for (i = 0; i < n; ++i) {
if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
sum += v;
}
}
// Optionally sort the arcs by previously-computed values or by data.
if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
// Compute the arcs! They are stored in the original data's order.
for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
data: data[j],
index: i,
value: v,
startAngle: a0,
endAngle: a1,
padAngle: p
};
}
return arcs;
}
pie.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), pie) : value;
};
pie.sortValues = function(_) {
return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
};
pie.sort = function(_) {
return arguments.length ? (sort = _, sortValues = null, pie) : sort;
};
pie.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : startAngle;
};
pie.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : endAngle;
};
pie.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : padAngle;
};
return pie;
}
var curveRadialLinear = curveRadial(curveLinear);
function Radial(curve) {
this._curve = curve;
}
Radial.prototype = {
areaStart: function() {
this._curve.areaStart();
},
areaEnd: function() {
this._curve.areaEnd();
},
lineStart: function() {
this._curve.lineStart();
},
lineEnd: function() {
this._curve.lineEnd();
},
point: function(a, r) {
this._curve.point(r * Math.sin(a), r * -Math.cos(a));
}
};
function curveRadial(curve) {
function radial(context) {
return new Radial(curve(context));
}
radial._curve = curve;
return radial;
}
function radialLine(l) {
var c = l.curve;
l.angle = l.x, delete l.x;
l.radius = l.y, delete l.y;
l.curve = function(_) {
return arguments.length ? c(curveRadial(_)) : c()._curve;
};
return l;
}
function radialLine$1() {
return radialLine(line().curve(curveRadialLinear));
}
function radialArea() {
var a = area$1().curve(curveRadialLinear),
c = a.curve,
x0 = a.lineX0,
x1 = a.lineX1,
y0 = a.lineY0,
y1 = a.lineY1;
a.angle = a.x, delete a.x;
a.startAngle = a.x0, delete a.x0;
a.endAngle = a.x1, delete a.x1;
a.radius = a.y, delete a.y;
a.innerRadius = a.y0, delete a.y0;
a.outerRadius = a.y1, delete a.y1;
a.lineStartAngle = function() { return radialLine(x0()); }, delete a.lineX0;
a.lineEndAngle = function() { return radialLine(x1()); }, delete a.lineX1;
a.lineInnerRadius = function() { return radialLine(y0()); }, delete a.lineY0;
a.lineOuterRadius = function() { return radialLine(y1()); }, delete a.lineY1;
a.curve = function(_) {
return arguments.length ? c(curveRadial(_)) : c()._curve;
};
return a;
}
var circle = {
draw: function(context, size) {
var r = Math.sqrt(size / pi$2);
context.moveTo(r, 0);
context.arc(0, 0, r, 0, tau$2);
}
};
var cross$1 = {
draw: function(context, size) {
var r = Math.sqrt(size / 5) / 2;
context.moveTo(-3 * r, -r);
context.lineTo(-r, -r);
context.lineTo(-r, -3 * r);
context.lineTo(r, -3 * r);
context.lineTo(r, -r);
context.lineTo(3 * r, -r);
context.lineTo(3 * r, r);
context.lineTo(r, r);
context.lineTo(r, 3 * r);
context.lineTo(-r, 3 * r);
context.lineTo(-r, r);
context.lineTo(-3 * r, r);
context.closePath();
}
};
var tan30 = Math.sqrt(1 / 3);
var tan30_2 = tan30 * 2;
var diamond = {
draw: function(context, size) {
var y = Math.sqrt(size / tan30_2),
x = y * tan30;
context.moveTo(0, -y);
context.lineTo(x, 0);
context.lineTo(0, y);
context.lineTo(-x, 0);
context.closePath();
}
};
var ka = 0.89081309152928522810;
var kr = Math.sin(pi$2 / 10) / Math.sin(7 * pi$2 / 10);
var kx = Math.sin(tau$2 / 10) * kr;
var ky = -Math.cos(tau$2 / 10) * kr;
var star = {
draw: function(context, size) {
var r = Math.sqrt(size * ka),
x = kx * r,
y = ky * r;
context.moveTo(0, -r);
context.lineTo(x, y);
for (var i = 1; i < 5; ++i) {
var a = tau$2 * i / 5,
c = Math.cos(a),
s = Math.sin(a);
context.lineTo(s * r, -c * r);
context.lineTo(c * x - s * y, s * x + c * y);
}
context.closePath();
}
};
var square = {
draw: function(context, size) {
var w = Math.sqrt(size),
x = -w / 2;
context.rect(x, x, w, w);
}
};
var sqrt3 = Math.sqrt(3);
var triangle = {
draw: function(context, size) {
var y = -Math.sqrt(size / (sqrt3 * 3));
context.moveTo(0, y * 2);
context.lineTo(-sqrt3 * y, -y);
context.lineTo(sqrt3 * y, -y);
context.closePath();
}
};
var c = -0.5;
var s = Math.sqrt(3) / 2;
var k = 1 / Math.sqrt(12);
var a = (k / 2 + 1) * 3;
var wye = {
draw: function(context, size) {
var r = Math.sqrt(size / a),
x0 = r / 2,
y0 = r * k,
x1 = x0,
y1 = r * k + r,
x2 = -x1,
y2 = y1;
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.lineTo(x2, y2);
context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
context.closePath();
}
};
var symbols = [
circle,
cross$1,
diamond,
square,
star,
triangle,
wye
];
function symbol() {
var type = constant$1(circle),
size = constant$1(64),
context = null;
function symbol() {
var buffer;
if (!context) context = buffer = path();
type.apply(this, arguments).draw(context, +size.apply(this, arguments));
if (buffer) return context = null, buffer + "" || null;
}
symbol.type = function(_) {
return arguments.length ? (type = typeof _ === "function" ? _ : constant$1(_), symbol) : type;
};
symbol.size = function(_) {
return arguments.length ? (size = typeof _ === "function" ? _ : constant$1(+_), symbol) : size;
};
symbol.context = function(_) {
return arguments.length ? (context = _ == null ? null : _, symbol) : context;
};
return symbol;
}
function noop() {}
function point(that, x, y) {
that._context.bezierCurveTo(
(2 * that._x0 + that._x1) / 3,
(2 * that._y0 + that._y1) / 3,
(that._x0 + 2 * that._x1) / 3,
(that._y0 + 2 * that._y1) / 3,
(that._x0 + 4 * that._x1 + x) / 6,
(that._y0 + 4 * that._y1 + y) / 6
);
}
function Basis(context) {
this._context = context;
}
Basis.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 3: point(this, this._x1, this._y1); // proceed
case 2: this._context.lineTo(this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basis(context) {
return new Basis(context);
}
function BasisClosed(context) {
this._context = context;
}
BasisClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x2, this._y2);
this._context.closePath();
break;
}
case 2: {
this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x2, this._y2);
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basisClosed(context) {
return new BasisClosed(context);
}
function BasisOpen(context) {
this._context = context;
}
BasisOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
case 3: this._point = 4; // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basisOpen(context) {
return new BasisOpen(context);
}
function Bundle(context, beta) {
this._basis = new Basis(context);
this._beta = beta;
}
Bundle.prototype = {
lineStart: function() {
this._x = [];
this._y = [];
this._basis.lineStart();
},
lineEnd: function() {
var x = this._x,
y = this._y,
j = x.length - 1;
if (j > 0) {
var x0 = x[0],
y0 = y[0],
dx = x[j] - x0,
dy = y[j] - y0,
i = -1,
t;
while (++i <= j) {
t = i / j;
this._basis.point(
this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
);
}
}
this._x = this._y = null;
this._basis.lineEnd();
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
var bundle = (function custom(beta) {
function bundle(context) {
return beta === 1 ? new Basis(context) : new Bundle(context, beta);
}
bundle.beta = function(beta) {
return custom(+beta);
};
return bundle;
})(0.85);
function point$1(that, x, y) {
that._context.bezierCurveTo(
that._x1 + that._k * (that._x2 - that._x0),
that._y1 + that._k * (that._y2 - that._y0),
that._x2 + that._k * (that._x1 - x),
that._y2 + that._k * (that._y1 - y),
that._x2,
that._y2
);
}
function Cardinal(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
Cardinal.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: point$1(this, this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
case 2: this._point = 3; // proceed
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinal = (function custom(tension) {
function cardinal(context) {
return new Cardinal(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function CardinalClosed(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinalClosed = (function custom(tension) {
function cardinal(context) {
return new CardinalClosed(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function CardinalOpen(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinalOpen = (function custom(tension) {
function cardinal(context) {
return new CardinalOpen(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function point$2(that, x, y) {
var x1 = that._x1,
y1 = that._y1,
x2 = that._x2,
y2 = that._y2;
if (that._l01_a > epsilon$1) {
var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
n = 3 * that._l01_a * (that._l01_a + that._l12_a);
x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
}
if (that._l23_a > epsilon$1) {
var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
m = 3 * that._l23_a * (that._l23_a + that._l12_a);
x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
}
that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
}
function CatmullRom(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRom.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: this.point(this, this._x2, this._y2); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; // proceed
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRom = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function CatmullRomClosed(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRomClosed = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function CatmullRomOpen(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRomOpen = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function LinearClosed(context) {
this._context = context;
}
LinearClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._point) this._context.closePath();
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) this._context.lineTo(x, y);
else this._point = 1, this._context.moveTo(x, y);
}
};
function linearClosed(context) {
return new LinearClosed(context);
}
function sign(x) {
return x < 0 ? -1 : 1;
}
// Calculate the slopes of the tangents (Hermite-type interpolation) based on
// the following paper: Steffen, M. 1990. A Simple Method for Monotonic
// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
// NOV(II), P. 443, 1990.
function slope3(that, x2, y2) {
var h0 = that._x1 - that._x0,
h1 = x2 - that._x1,
s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
p = (s0 * h1 + s1 * h0) / (h0 + h1);
return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
}
// Calculate a one-sided slope.
function slope2(that, t) {
var h = that._x1 - that._x0;
return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
}
// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
function point$3(that, t0, t1) {
var x0 = that._x0,
y0 = that._y0,
x1 = that._x1,
y1 = that._y1,
dx = (x1 - x0) / 3;
that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
}
function MonotoneX(context) {
this._context = context;
}
MonotoneX.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 =
this._t0 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x1, this._y1); break;
case 3: point$3(this, this._t0, slope2(this, this._t0)); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
var t1 = NaN;
x = +x, y = +y;
if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
default: point$3(this, this._t0, t1 = slope3(this, x, y)); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
this._t0 = t1;
}
}
function MonotoneY(context) {
this._context = new ReflectContext(context);
}
(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
MonotoneX.prototype.point.call(this, y, x);
};
function ReflectContext(context) {
this._context = context;
}
ReflectContext.prototype = {
moveTo: function(x, y) { this._context.moveTo(y, x); },
closePath: function() { this._context.closePath(); },
lineTo: function(x, y) { this._context.lineTo(y, x); },
bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
};
function monotoneX(context) {
return new MonotoneX(context);
}
function monotoneY(context) {
return new MonotoneY(context);
}
function Natural(context) {
this._context = context;
}
Natural.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = [];
this._y = [];
},
lineEnd: function() {
var x = this._x,
y = this._y,
n = x.length;
if (n) {
this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
if (n === 2) {
this._context.lineTo(x[1], y[1]);
} else {
var px = controlPoints(x),
py = controlPoints(y);
for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
}
}
}
if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
this._line = 1 - this._line;
this._x = this._y = null;
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
// See https://www.particleincell.com/2012/bezier-splines/ for derivation.
function controlPoints(x) {
var i,
n = x.length - 1,
m,
a = new Array(n),
b = new Array(n),
r = new Array(n);
a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
a[n - 1] = r[n - 1] / b[n - 1];
for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
b[n - 1] = (x[n] + a[n - 1]) / 2;
for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
return [a, b];
}
function natural(context) {
return new Natural(context);
}
function Step(context, t) {
this._context = context;
this._t = t;
}
Step.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = this._y = NaN;
this._point = 0;
},
lineEnd: function() {
if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: {
if (this._t <= 0) {
this._context.lineTo(this._x, y);
this._context.lineTo(x, y);
} else {
var x1 = this._x * (1 - this._t) + x * this._t;
this._context.lineTo(x1, this._y);
this._context.lineTo(x1, y);
}
break;
}
}
this._x = x, this._y = y;
}
};
function step(context) {
return new Step(context, 0.5);
}
function stepBefore(context) {
return new Step(context, 0);
}
function stepAfter(context) {
return new Step(context, 1);
}
var slice$2 = Array.prototype.slice;
function none(series, order) {
if (!((n = series.length) > 1)) return;
for (var i = 1, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
s0 = s1, s1 = series[order[i]];
for (var j = 0; j < m; ++j) {
s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
}
}
}
function none$1(series) {
var n = series.length, o = new Array(n);
while (--n >= 0) o[n] = n;
return o;
}
function stackValue(d, key) {
return d[key];
}
function stack() {
var keys = constant$1([]),
order = none$1,
offset = none,
value = stackValue;
function stack(data) {
var kz = keys.apply(this, arguments),
i,
m = data.length,
n = kz.length,
sz = new Array(n),
oz;
for (i = 0; i < n; ++i) {
for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
si[j] = sij = [0, +value(data[j], ki, j, data)];
sij.data = data[j];
}
si.key = ki;
}
for (i = 0, oz = order(sz); i < n; ++i) {
sz[oz[i]].index = i;
}
offset(sz, oz);
return sz;
}
stack.keys = function(_) {
return arguments.length ? (keys = typeof _ === "function" ? _ : constant$1(slice$2.call(_)), stack) : keys;
};
stack.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), stack) : value;
};
stack.order = function(_) {
return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant$1(slice$2.call(_)), stack) : order;
};
stack.offset = function(_) {
return arguments.length ? (offset = _ == null ? none : _, stack) : offset;
};
return stack;
}
function expand(series, order) {
if (!((n = series.length) > 0)) return;
for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
}
none(series, order);
}
function silhouette(series, order) {
if (!((n = series.length) > 0)) return;
for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
s0[j][1] += s0[j][0] = -y / 2;
}
none(series, order);
}
function wiggle(series, order) {
if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
var si = series[order[i]],
sij0 = si[j][1] || 0,
sij1 = si[j - 1][1] || 0,
s3 = (sij0 - sij1) / 2;
for (var k = 0; k < i; ++k) {
var sk = series[order[k]],
skj0 = sk[j][1] || 0,
skj1 = sk[j - 1][1] || 0;
s3 += skj0 - skj1;
}
s1 += sij0, s2 += s3 * sij0;
}
s0[j - 1][1] += s0[j - 1][0] = y;
if (s1) y -= s2 / s1;
}
s0[j - 1][1] += s0[j - 1][0] = y;
none(series, order);
}
function ascending$1(series) {
var sums = series.map(sum$1);
return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; });
}
function sum$1(series) {
var s = 0, i = -1, n = series.length, v;
while (++i < n) if (v = +series[i][1]) s += v;
return s;
}
function descending$2(series) {
return ascending$1(series).reverse();
}
function insideOut(series) {
var n = series.length,
i,
j,
sums = series.map(sum$1),
order = none$1(series).sort(function(a, b) { return sums[b] - sums[a]; }),
top = 0,
bottom = 0,
tops = [],
bottoms = [];
for (i = 0; i < n; ++i) {
j = order[i];
if (top < bottom) {
top += sums[j];
tops.push(j);
} else {
bottom += sums[j];
bottoms.push(j);
}
}
return bottoms.reverse().concat(tops);
}
function reverse(series) {
return none$1(series).reverse();
}
function define(constructor, factory, prototype) {
constructor.prototype = factory.prototype = prototype;
prototype.constructor = constructor;
}
function extend(parent, definition) {
var prototype = Object.create(parent.prototype);
for (var key in definition) prototype[key] = definition[key];
return prototype;
}
function Color() {}
var darker = 0.7;
var brighter = 1 / darker;
var reHex3 = /^#([0-9a-f]{3})$/;
var reHex6 = /^#([0-9a-f]{6})$/;
var reRgbInteger = /^rgb\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*\)$/;
var reRgbPercent = /^rgb\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/;
var reRgbaInteger = /^rgba\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var reRgbaPercent = /^rgba\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var reHslPercent = /^hsl\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/;
var reHslaPercent = /^hsla\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var named = {
aliceblue: 0xf0f8ff,
antiquewhite: 0xfaebd7,
aqua: 0x00ffff,
aquamarine: 0x7fffd4,
azure: 0xf0ffff,
beige: 0xf5f5dc,
bisque: 0xffe4c4,
black: 0x000000,
blanchedalmond: 0xffebcd,
blue: 0x0000ff,
blueviolet: 0x8a2be2,
brown: 0xa52a2a,
burlywood: 0xdeb887,
cadetblue: 0x5f9ea0,
chartreuse: 0x7fff00,
chocolate: 0xd2691e,
coral: 0xff7f50,
cornflowerblue: 0x6495ed,
cornsilk: 0xfff8dc,
crimson: 0xdc143c,
cyan: 0x00ffff,
darkblue: 0x00008b,
darkcyan: 0x008b8b,
darkgoldenrod: 0xb8860b,
darkgray: 0xa9a9a9,
darkgreen: 0x006400,
darkgrey: 0xa9a9a9,
darkkhaki: 0xbdb76b,
darkmagenta: 0x8b008b,
darkolivegreen: 0x556b2f,
darkorange: 0xff8c00,
darkorchid: 0x9932cc,
darkred: 0x8b0000,
darksalmon: 0xe9967a,
darkseagreen: 0x8fbc8f,
darkslateblue: 0x483d8b,
darkslategray: 0x2f4f4f,
darkslategrey: 0x2f4f4f,
darkturquoise: 0x00ced1,
darkviolet: 0x9400d3,
deeppink: 0xff1493,
deepskyblue: 0x00bfff,
dimgray: 0x696969,
dimgrey: 0x696969,
dodgerblue: 0x1e90ff,
firebrick: 0xb22222,
floralwhite: 0xfffaf0,
forestgreen: 0x228b22,
fuchsia: 0xff00ff,
gainsboro: 0xdcdcdc,
ghostwhite: 0xf8f8ff,
gold: 0xffd700,
goldenrod: 0xdaa520,
gray: 0x808080,
green: 0x008000,
greenyellow: 0xadff2f,
grey: 0x808080,
honeydew: 0xf0fff0,
hotpink: 0xff69b4,
indianred: 0xcd5c5c,
indigo: 0x4b0082,
ivory: 0xfffff0,
khaki: 0xf0e68c,
lavender: 0xe6e6fa,
lavenderblush: 0xfff0f5,
lawngreen: 0x7cfc00,
lemonchiffon: 0xfffacd,
lightblue: 0xadd8e6,
lightcoral: 0xf08080,
lightcyan: 0xe0ffff,
lightgoldenrodyellow: 0xfafad2,
lightgray: 0xd3d3d3,
lightgreen: 0x90ee90,
lightgrey: 0xd3d3d3,
lightpink: 0xffb6c1,
lightsalmon: 0xffa07a,
lightseagreen: 0x20b2aa,
lightskyblue: 0x87cefa,
lightslategray: 0x778899,
lightslategrey: 0x778899,
lightsteelblue: 0xb0c4de,
lightyellow: 0xffffe0,
lime: 0x00ff00,
limegreen: 0x32cd32,
linen: 0xfaf0e6,
magenta: 0xff00ff,
maroon: 0x800000,
mediumaquamarine: 0x66cdaa,
mediumblue: 0x0000cd,
mediumorchid: 0xba55d3,
mediumpurple: 0x9370db,
mediumseagreen: 0x3cb371,
mediumslateblue: 0x7b68ee,
mediumspringgreen: 0x00fa9a,
mediumturquoise: 0x48d1cc,
mediumvioletred: 0xc71585,
midnightblue: 0x191970,
mintcream: 0xf5fffa,
mistyrose: 0xffe4e1,
moccasin: 0xffe4b5,
navajowhite: 0xffdead,
navy: 0x000080,
oldlace: 0xfdf5e6,
olive: 0x808000,
olivedrab: 0x6b8e23,
orange: 0xffa500,
orangered: 0xff4500,
orchid: 0xda70d6,
palegoldenrod: 0xeee8aa,
palegreen: 0x98fb98,
paleturquoise: 0xafeeee,
palevioletred: 0xdb7093,
papayawhip: 0xffefd5,
peachpuff: 0xffdab9,
peru: 0xcd853f,
pink: 0xffc0cb,
plum: 0xdda0dd,
powderblue: 0xb0e0e6,
purple: 0x800080,
rebeccapurple: 0x663399,
red: 0xff0000,
rosybrown: 0xbc8f8f,
royalblue: 0x4169e1,
saddlebrown: 0x8b4513,
salmon: 0xfa8072,
sandybrown: 0xf4a460,
seagreen: 0x2e8b57,
seashell: 0xfff5ee,
sienna: 0xa0522d,
silver: 0xc0c0c0,
skyblue: 0x87ceeb,
slateblue: 0x6a5acd,
slategray: 0x708090,
slategrey: 0x708090,
snow: 0xfffafa,
springgreen: 0x00ff7f,
steelblue: 0x4682b4,
tan: 0xd2b48c,
teal: 0x008080,
thistle: 0xd8bfd8,
tomato: 0xff6347,
turquoise: 0x40e0d0,
violet: 0xee82ee,
wheat: 0xf5deb3,
white: 0xffffff,
whitesmoke: 0xf5f5f5,
yellow: 0xffff00,
yellowgreen: 0x9acd32
};
define(Color, color, {
displayable: function() {
return this.rgb().displayable();
},
toString: function() {
return this.rgb() + "";
}
});
function color(format) {
var m;
format = (format + "").trim().toLowerCase();
return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
: (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
: (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
: (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
: (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
: (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
: (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
: (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
: named.hasOwnProperty(format) ? rgbn(named[format])
: format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
: null;
}
function rgbn(n) {
return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
}
function rgba(r, g, b, a) {
if (a <= 0) r = g = b = NaN;
return new Rgb(r, g, b, a);
}
function rgbConvert(o) {
if (!(o instanceof Color)) o = color(o);
if (!o) return new Rgb;
o = o.rgb();
return new Rgb(o.r, o.g, o.b, o.opacity);
}
function colorRgb(r, g, b, opacity) {
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
}
function Rgb(r, g, b, opacity) {
this.r = +r;
this.g = +g;
this.b = +b;
this.opacity = +opacity;
}
define(Rgb, colorRgb, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
rgb: function() {
return this;
},
displayable: function() {
return (0 <= this.r && this.r <= 255)
&& (0 <= this.g && this.g <= 255)
&& (0 <= this.b && this.b <= 255)
&& (0 <= this.opacity && this.opacity <= 1);
},
toString: function() {
var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
return (a === 1 ? "rgb(" : "rgba(")
+ Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.b) || 0))
+ (a === 1 ? ")" : ", " + a + ")");
}
}));
function hsla(h, s, l, a) {
if (a <= 0) h = s = l = NaN;
else if (l <= 0 || l >= 1) h = s = NaN;
else if (s <= 0) h = NaN;
return new Hsl(h, s, l, a);
}
function hslConvert(o) {
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Color)) o = color(o);
if (!o) return new Hsl;
if (o instanceof Hsl) return o;
o = o.rgb();
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
min = Math.min(r, g, b),
max = Math.max(r, g, b),
h = NaN,
s = max - min,
l = (max + min) / 2;
if (s) {
if (r === max) h = (g - b) / s + (g < b) * 6;
else if (g === max) h = (b - r) / s + 2;
else h = (r - g) / s + 4;
s /= l < 0.5 ? max + min : 2 - max - min;
h *= 60;
} else {
s = l > 0 && l < 1 ? 0 : h;
}
return new Hsl(h, s, l, o.opacity);
}
function colorHsl(h, s, l, opacity) {
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
}
function Hsl(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define(Hsl, colorHsl, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = this.h % 360 + (this.h < 0) * 360,
s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
l = this.l,
m2 = l + (l < 0.5 ? l : 1 - l) * s,
m1 = 2 * l - m2;
return new Rgb(
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
hsl2rgb(h, m1, m2),
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
this.opacity
);
},
displayable: function() {
return (0 <= this.s && this.s <= 1 || isNaN(this.s))
&& (0 <= this.l && this.l <= 1)
&& (0 <= this.opacity && this.opacity <= 1);
}
}));
/* From FvD 13.37, CSS Color Module Level 3 */
function hsl2rgb(h, m1, m2) {
return (h < 60 ? m1 + (m2 - m1) * h / 60
: h < 180 ? m2
: h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
: m1) * 255;
}
var deg2rad = Math.PI / 180;
var rad2deg = 180 / Math.PI;
var Kn = 18;
var Xn = 0.950470;
var Yn = 1;
var Zn = 1.088830;
var t0 = 4 / 29;
var t1 = 6 / 29;
var t2 = 3 * t1 * t1;
var t3 = t1 * t1 * t1;
function labConvert(o) {
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
if (o instanceof Hcl) {
var h = o.h * deg2rad;
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
}
if (!(o instanceof Rgb)) o = rgbConvert(o);
var b = rgb2xyz(o.r),
a = rgb2xyz(o.g),
l = rgb2xyz(o.b),
x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
}
function lab(l, a, b, opacity) {
return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
}
function Lab(l, a, b, opacity) {
this.l = +l;
this.a = +a;
this.b = +b;
this.opacity = +opacity;
}
define(Lab, lab, extend(Color, {
brighter: function(k) {
return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
darker: function(k) {
return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
rgb: function() {
var y = (this.l + 16) / 116,
x = isNaN(this.a) ? y : y + this.a / 500,
z = isNaN(this.b) ? y : y - this.b / 200;
y = Yn * lab2xyz(y);
x = Xn * lab2xyz(x);
z = Zn * lab2xyz(z);
return new Rgb(
xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
this.opacity
);
}
}));
function xyz2lab(t) {
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
}
function lab2xyz(t) {
return t > t1 ? t * t * t : t2 * (t - t0);
}
function xyz2rgb(x) {
return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
}
function rgb2xyz(x) {
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
}
function hclConvert(o) {
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
if (!(o instanceof Lab)) o = labConvert(o);
var h = Math.atan2(o.b, o.a) * rad2deg;
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
}
function colorHcl(h, c, l, opacity) {
return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
}
function Hcl(h, c, l, opacity) {
this.h = +h;
this.c = +c;
this.l = +l;
this.opacity = +opacity;
}
define(Hcl, colorHcl, extend(Color, {
brighter: function(k) {
return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
},
darker: function(k) {
return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
},
rgb: function() {
return labConvert(this).rgb();
}
}));
var A = -0.14861;
var B = +1.78277;
var C = -0.29227;
var D = -0.90649;
var E = +1.97294;
var ED = E * D;
var EB = E * B;
var BC_DA = B * C - D * A;
function cubehelixConvert(o) {
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Rgb)) o = rgbConvert(o);
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
bl = b - l,
k = (E * (g - l) - C * bl) / D,
s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
}
function cubehelix(h, s, l, opacity) {
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
}
function Cubehelix(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define(Cubehelix, cubehelix, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
l = +this.l,
a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
cosh = Math.cos(h),
sinh = Math.sin(h);
return new Rgb(
255 * (l + a * (A * cosh + B * sinh)),
255 * (l + a * (C * cosh + D * sinh)),
255 * (l + a * (E * cosh)),
this.opacity
);
}
}));
function basis$1(t1, v0, v1, v2, v3) {
var t2 = t1 * t1, t3 = t2 * t1;
return ((1 - 3 * t1 + 3 * t2 - t3) * v0
+ (4 - 6 * t2 + 3 * t3) * v1
+ (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
+ t3 * v3) / 6;
}
function basis$2(values) {
var n = values.length - 1;
return function(t) {
var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
v1 = values[i],
v2 = values[i + 1],
v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
return basis$1((t - i / n) * n, v0, v1, v2, v3);
};
}
function basisClosed$1(values) {
var n = values.length;
return function(t) {
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
v0 = values[(i + n - 1) % n],
v1 = values[i % n],
v2 = values[(i + 1) % n],
v3 = values[(i + 2) % n];
return basis$1((t - i / n) * n, v0, v1, v2, v3);
};
}
function constant$2(x) {
return function() {
return x;
};
}
function linear$1(a, d) {
return function(t) {
return a + t * d;
};
}
function exponential$1(a, b, y) {
return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
return Math.pow(a + t * b, y);
};
}
function hue(a, b) {
var d = b - a;
return d ? linear$1(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$2(isNaN(a) ? b : a);
}
function gamma(y) {
return (y = +y) === 1 ? nogamma : function(a, b) {
return b - a ? exponential$1(a, b, y) : constant$2(isNaN(a) ? b : a);
};
}
function nogamma(a, b) {
var d = b - a;
return d ? linear$1(a, d) : constant$2(isNaN(a) ? b : a);
}
var interpolateRgb = (function rgbGamma(y) {
var color = gamma(y);
function rgb(start, end) {
var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),
g = color(start.g, end.g),
b = color(start.b, end.b),
opacity = color(start.opacity, end.opacity);
return function(t) {
start.r = r(t);
start.g = g(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
rgb.gamma = rgbGamma;
return rgb;
})(1);
function rgbSpline(spline) {
return function(colors) {
var n = colors.length,
r = new Array(n),
g = new Array(n),
b = new Array(n),
i, color;
for (i = 0; i < n; ++i) {
color = colorRgb(colors[i]);
r[i] = color.r || 0;
g[i] = color.g || 0;
b[i] = color.b || 0;
}
r = spline(r);
g = spline(g);
b = spline(b);
color.opacity = 1;
return function(t) {
color.r = r(t);
color.g = g(t);
color.b = b(t);
return color + "";
};
};
}
var rgbBasis = rgbSpline(basis$2);
var rgbBasisClosed = rgbSpline(basisClosed$1);
function array$1(a, b) {
var nb = b ? b.length : 0,
na = a ? Math.min(nb, a.length) : 0,
x = new Array(nb),
c = new Array(nb),
i;
for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
for (; i < nb; ++i) c[i] = b[i];
return function(t) {
for (i = 0; i < na; ++i) c[i] = x[i](t);
return c;
};
}
function date(a, b) {
var d = new Date;
return a = +a, b -= a, function(t) {
return d.setTime(a + b * t), d;
};
}
function interpolateNumber(a, b) {
return a = +a, b -= a, function(t) {
return a + b * t;
};
}
function object(a, b) {
var i = {},
c = {},
k;
if (a === null || typeof a !== "object") a = {};
if (b === null || typeof b !== "object") b = {};
for (k in b) {
if (k in a) {
i[k] = interpolate(a[k], b[k]);
} else {
c[k] = b[k];
}
}
return function(t) {
for (k in i) c[k] = i[k](t);
return c;
};
}
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
var reB = new RegExp(reA.source, "g");
function zero(b) {
return function() {
return b;
};
}
function one(b) {
return function(t) {
return b(t) + "";
};
}
function interpolateString(a, b) {
var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
am, // current match in a
bm, // current match in b
bs, // string preceding current number in b, if any
i = -1, // index in s
s = [], // string constants and placeholders
q = []; // number interpolators
// Coerce inputs to strings.
a = a + "", b = b + "";
// Interpolate pairs of numbers in a & b.
while ((am = reA.exec(a))
&& (bm = reB.exec(b))) {
if ((bs = bm.index) > bi) { // a string precedes the next number in b
bs = b.slice(bi, bs);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
if (s[i]) s[i] += bm; // coalesce with previous string
else s[++i] = bm;
} else { // interpolate non-matching numbers
s[++i] = null;
q.push({i: i, x: interpolateNumber(am, bm)});
}
bi = reB.lastIndex;
}
// Add remains of b.
if (bi < b.length) {
bs = b.slice(bi);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
// Special optimization for only a single match.
// Otherwise, interpolate each of the numbers and rejoin the string.
return s.length < 2 ? (q[0]
? one(q[0].x)
: zero(b))
: (b = q.length, function(t) {
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
return s.join("");
});
}
function interpolate(a, b) {
var t = typeof b, c;
return b == null || t === "boolean" ? constant$2(b)
: (t === "number" ? interpolateNumber
: t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
: b instanceof color ? interpolateRgb
: b instanceof Date ? date
: Array.isArray(b) ? array$1
: isNaN(b) ? object
: interpolateNumber)(a, b);
}
function interpolateRound(a, b) {
return a = +a, b -= a, function(t) {
return Math.round(a + b * t);
};
}
var degrees = 180 / Math.PI;
var identity$2 = {
translateX: 0,
translateY: 0,
rotate: 0,
skewX: 0,
scaleX: 1,
scaleY: 1
};
function decompose(a, b, c, d, e, f) {
var scaleX, scaleY, skewX;
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
return {
translateX: e,
translateY: f,
rotate: Math.atan2(b, a) * degrees,
skewX: Math.atan(skewX) * degrees,
scaleX: scaleX,
scaleY: scaleY
};
}
var cssNode;
var cssRoot;
var cssView;
var svgNode;
function parseCss(value) {
if (value === "none") return identity$2;
if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
cssNode.style.transform = value;
value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
cssRoot.removeChild(cssNode);
value = value.slice(7, -1).split(",");
return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
}
function parseSvg(value) {
if (value == null) return identity$2;
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
svgNode.setAttribute("transform", value);
if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
value = value.matrix;
return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
}
function interpolateTransform(parse, pxComma, pxParen, degParen) {
function pop(s) {
return s.length ? s.pop() + " " : "";
}
function translate(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push("translate(", null, pxComma, null, pxParen);
q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
} else if (xb || yb) {
s.push("translate(" + xb + pxComma + yb + pxParen);
}
}
function rotate(a, b, s, q) {
if (a !== b) {
if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
} else if (b) {
s.push(pop(s) + "rotate(" + b + degParen);
}
}
function skewX(a, b, s, q) {
if (a !== b) {
q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
} else if (b) {
s.push(pop(s) + "skewX(" + b + degParen);
}
}
function scale(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
} else if (xb !== 1 || yb !== 1) {
s.push(pop(s) + "scale(" + xb + "," + yb + ")");
}
}
return function(a, b) {
var s = [], // string constants and placeholders
q = []; // number interpolators
a = parse(a), b = parse(b);
translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
rotate(a.rotate, b.rotate, s, q);
skewX(a.skewX, b.skewX, s, q);
scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
a = b = null; // gc
return function(t) {
var i = -1, n = q.length, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};
}
var interpolateTransform$1 = interpolateTransform(parseCss, "px, ", "px)", "deg)");
var interpolateTransform$2 = interpolateTransform(parseSvg, ", ", ")", ")");
var rho = Math.SQRT2;
var rho2 = 2;
var rho4 = 4;
var epsilon2 = 1e-12;
function cosh(x) {
return ((x = Math.exp(x)) + 1 / x) / 2;
}
function sinh(x) {
return ((x = Math.exp(x)) - 1 / x) / 2;
}
function tanh(x) {
return ((x = Math.exp(2 * x)) - 1) / (x + 1);
}
// p0 = [ux0, uy0, w0]
// p1 = [ux1, uy1, w1]
function interpolateZoom(p0, p1) {
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
dx = ux1 - ux0,
dy = uy1 - uy0,
d2 = dx * dx + dy * dy,
i,
S;
// Special case for u0 ≅ u1.
if (d2 < epsilon2) {
S = Math.log(w1 / w0) / rho;
i = function(t) {
return [
ux0 + t * dx,
uy0 + t * dy,
w0 * Math.exp(rho * t * S)
];
}
}
// General case.
else {
var d1 = Math.sqrt(d2),
b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
S = (r1 - r0) / rho;
i = function(t) {
var s = t * S,
coshr0 = cosh(r0),
u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
return [
ux0 + u * dx,
uy0 + u * dy,
w0 * coshr0 / cosh(rho * s + r0)
];
}
}
i.duration = S * 1000;
return i;
}
function hsl(hue) {
return function(start, end) {
var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),
s = nogamma(start.s, end.s),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
var hsl$1 = hsl(hue);
var hslLong = hsl(nogamma);
function lab$1(start, end) {
var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
a = nogamma(start.a, end.a),
b = nogamma(start.b, end.b),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.l = l(t);
start.a = a(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
function hcl(hue) {
return function(start, end) {
var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),
c = nogamma(start.c, end.c),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.c = c(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
var hcl$1 = hcl(hue);
var hclLong = hcl(nogamma);
function cubehelix$1(hue) {
return (function cubehelixGamma(y) {
y = +y;
function cubehelix$$(start, end) {
var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
s = nogamma(start.s, end.s),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(Math.pow(t, y));
start.opacity = opacity(t);
return start + "";
};
}
cubehelix$$.gamma = cubehelixGamma;
return cubehelix$$;
})(1);
}
var cubehelix$2 = cubehelix$1(hue);
var interpolateCubehelixLong = cubehelix$1(nogamma);
function quantize(interpolator, n) {
var samples = new Array(n);
for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
return samples;
}
var noop$1 = {value: function() {}};
function dispatch() {
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
_[t] = [];
}
return new Dispatch(_);
}
function Dispatch(_) {
this._ = _;
}
function parseTypenames(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
return {type: t, name: name};
});
}
Dispatch.prototype = dispatch.prototype = {
constructor: Dispatch,
on: function(typename, callback) {
var _ = this._,
T = parseTypenames(typename + "", _),
t,
i = -1,
n = T.length;
// If no callback was specified, return the callback of the given type and name.
if (arguments.length < 2) {
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
return;
}
// If a type was specified, set the callback for the given type and name.
// Otherwise, if a null callback was specified, remove callbacks of the given name.
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
while (++i < n) {
if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);
else if (callback == null) for (t in _) _[t] = set$1(_[t], typename.name, null);
}
return this;
},
copy: function() {
var copy = {}, _ = this._;
for (var t in _) copy[t] = _[t].slice();
return new Dispatch(copy);
},
call: function(type, that) {
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
},
apply: function(type, that, args) {
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
}
};
function get(type, name) {
for (var i = 0, n = type.length, c; i < n; ++i) {
if ((c = type[i]).name === name) {
return c.value;
}
}
}
function set$1(type, name, callback) {
for (var i = 0, n = type.length; i < n; ++i) {
if (type[i].name === name) {
type[i] = noop$1, type = type.slice(0, i).concat(type.slice(i + 1));
break;
}
}
if (callback != null) type.push({name: name, value: callback});
return type;
}
function objectConverter(columns) {
return new Function("d", "return {" + columns.map(function(name, i) {
return JSON.stringify(name) + ": d[" + i + "]";
}).join(",") + "}");
}
function customConverter(columns, f) {
var object = objectConverter(columns);
return function(row, i) {
return f(object(row), i, columns);
};
}
// Compute unique columns in order of discovery.
function inferColumns(rows) {
var columnSet = Object.create(null),
columns = [];
rows.forEach(function(row) {
for (var column in row) {
if (!(column in columnSet)) {
columns.push(columnSet[column] = column);
}
}
});
return columns;
}
function dsv(delimiter) {
var reFormat = new RegExp("[\"" + delimiter + "\n]"),
delimiterCode = delimiter.charCodeAt(0);
function parse(text, f) {
var convert, columns, rows = parseRows(text, function(row, i) {
if (convert) return convert(row, i - 1);
columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
});
rows.columns = columns;
return rows;
}
function parseRows(text, f) {
var EOL = {}, // sentinel value for end-of-line
EOF = {}, // sentinel value for end-of-file
rows = [], // output rows
N = text.length,
I = 0, // current character index
n = 0, // the current line number
t, // the current token
eol; // is the current token followed by EOL?
function token() {
if (I >= N) return EOF; // special case: end of file
if (eol) return eol = false, EOL; // special case: end of line
// special case: quotes
var j = I, c;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < N) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
++i;
}
}
I = i + 2;
c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) ++I;
} else if (c === 10) {
eol = true;
}
return text.slice(j + 1, i).replace(/""/g, "\"");
}
// common case: find next delimiter or newline
while (I < N) {
var k = 1;
c = text.charCodeAt(I++);
if (c === 10) eol = true; // \n
else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n
else if (c !== delimiterCode) continue;
return text.slice(j, I - k);
}
// special case: last token before EOF
return text.slice(j);
}
while ((t = token()) !== EOF) {
var a = [];
while (t !== EOL && t !== EOF) {
a.push(t);
t = token();
}
if (f && (a = f(a, n++)) == null) continue;
rows.push(a);
}
return rows;
}
function format(rows, columns) {
if (columns == null) columns = inferColumns(rows);
return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
return columns.map(function(column) {
return formatValue(row[column]);
}).join(delimiter);
})).join("\n");
}
function formatRows(rows) {
return rows.map(formatRow).join("\n");
}
function formatRow(row) {
return row.map(formatValue).join(delimiter);
}
function formatValue(text) {
return text == null ? ""
: reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\""
: text;
}
return {
parse: parse,
parseRows: parseRows,
format: format,
formatRows: formatRows
};
}
var csv = dsv(",");
var csvParse = csv.parse;
var csvParseRows = csv.parseRows;
var csvFormat = csv.format;
var csvFormatRows = csv.formatRows;
var tsv = dsv("\t");
var tsvParse = tsv.parse;
var tsvParseRows = tsv.parseRows;
var tsvFormat = tsv.format;
var tsvFormatRows = tsv.formatRows;
function request(url, callback) {
var request,
event = dispatch("beforesend", "progress", "load", "error"),
mimeType,
headers = map$1(),
xhr = new XMLHttpRequest,
user = null,
password = null,
response,
responseType,
timeout = 0;
// If IE does not support CORS, use XDomainRequest.
if (typeof XDomainRequest !== "undefined"
&& !("withCredentials" in xhr)
&& /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
"onload" in xhr
? xhr.onload = xhr.onerror = xhr.ontimeout = respond
: xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
function respond(o) {
var status = xhr.status, result;
if (!status && hasResponse(xhr)
|| status >= 200 && status < 300
|| status === 304) {
if (response) {
try {
result = response.call(request, xhr);
} catch (e) {
event.call("error", request, e);
return;
}
} else {
result = xhr;
}
event.call("load", request, result);
} else {
event.call("error", request, o);
}
}
xhr.onprogress = function(e) {
event.call("progress", request, e);
};
request = {
header: function(name, value) {
name = (name + "").toLowerCase();
if (arguments.length < 2) return headers.get(name);
if (value == null) headers.remove(name);
else headers.set(name, value + "");
return request;
},
// If mimeType is non-null and no Accept header is set, a default is used.
mimeType: function(value) {
if (!arguments.length) return mimeType;
mimeType = value == null ? null : value + "";
return request;
},
// Specifies what type the response value should take;
// for instance, arraybuffer, blob, document, or text.
responseType: function(value) {
if (!arguments.length) return responseType;
responseType = value;
return request;
},
timeout: function(value) {
if (!arguments.length) return timeout;
timeout = +value;
return request;
},
user: function(value) {
return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
},
password: function(value) {
return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
},
// Specify how to convert the response content to a specific type;
// changes the callback value on "load" events.
response: function(value) {
response = value;
return request;
},
// Alias for send("GET", …).
get: function(data, callback) {
return request.send("GET", data, callback);
},
// Alias for send("POST", …).
post: function(data, callback) {
return request.send("POST", data, callback);
},
// If callback is non-null, it will be used for error and load events.
send: function(method, data, callback) {
xhr.open(method, url, true, user, password);
if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
if (responseType != null) xhr.responseType = responseType;
if (timeout > 0) xhr.timeout = timeout;
if (callback == null && typeof data === "function") callback = data, data = null;
if (callback != null && callback.length === 1) callback = fixCallback(callback);
if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
event.call("beforesend", request, xhr);
xhr.send(data == null ? null : data);
return request;
},
abort: function() {
xhr.abort();
return request;
},
on: function() {
var value = event.on.apply(event, arguments);
return value === event ? request : value;
}
};
if (callback != null) {
if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
return request.get(callback);
}
return request;
}
function fixCallback(callback) {
return function(error, xhr) {
callback(error == null ? xhr : null);
};
}
function hasResponse(xhr) {
var type = xhr.responseType;
return type && type !== "text"
? xhr.response // null on error
: xhr.responseText; // "" on error
}
function type(defaultMimeType, response) {
return function(url, callback) {
var r = request(url).mimeType(defaultMimeType).response(response);
if (callback != null) {
if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
return r.get(callback);
}
return r;
};
}
var html = type("text/html", function(xhr) {
return document.createRange().createContextualFragment(xhr.responseText);
});
var json = type("application/json", function(xhr) {
return JSON.parse(xhr.responseText);
});
var text = type("text/plain", function(xhr) {
return xhr.responseText;
});
var xml = type("application/xml", function(xhr) {
var xml = xhr.responseXML;
if (!xml) throw new Error("parse error");
return xml;
});
function dsv$1(defaultMimeType, parse) {
return function(url, row, callback) {
if (arguments.length < 3) callback = row, row = null;
var r = request(url).mimeType(defaultMimeType);
r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
r.row(row);
return callback ? r.get(callback) : r;
};
}
function responseOf(parse, row) {
return function(request) {
return parse(request.responseText, row);
};
}
var csv$1 = dsv$1("text/csv", csvParse);
var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
var frame = 0;
var timeout = 0;
var interval = 0;
var pokeDelay = 1000;
var taskHead;
var taskTail;
var clockLast = 0;
var clockNow = 0;
var clockSkew = 0;
var clock = typeof performance === "object" && performance.now ? performance : Date;
var setFrame = typeof requestAnimationFrame === "function"
? (clock === Date ? function(f) { requestAnimationFrame(function() { f(clock.now()); }); } : requestAnimationFrame)
: function(f) { setTimeout(f, 17); };
function now() {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
}
function clearNow() {
clockNow = 0;
}
function Timer() {
this._call =
this._time =
this._next = null;
}
Timer.prototype = timer.prototype = {
constructor: Timer,
restart: function(callback, delay, time) {
if (typeof callback !== "function") throw new TypeError("callback is not a function");
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this;
else taskHead = this;
taskTail = this;
}
this._call = callback;
this._time = time;
sleep();
},
stop: function() {
if (this._call) {
this._call = null;
this._time = Infinity;
sleep();
}
}
};
function timer(callback, delay, time) {
var t = new Timer;
t.restart(callback, delay, time);
return t;
}
function timerFlush() {
now(); // Get the current time, if not already set.
++frame; // Pretend we’ve set an alarm, if we haven’t already.
var t = taskHead, e;
while (t) {
if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
t = t._next;
}
--frame;
}
function wake(time) {
clockNow = (clockLast = time || clock.now()) + clockSkew;
frame = timeout = 0;
try {
timerFlush();
} finally {
frame = 0;
nap();
clockNow = 0;
}
}
function poke$1() {
var now = clock.now(), delay = now - clockLast;
if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
}
function nap() {
var t0, t1 = taskHead, t2, time = Infinity;
while (t1) {
if (t1._call) {
if (time > t1._time) time = t1._time;
t0 = t1, t1 = t1._next;
} else {
t2 = t1._next, t1._next = null;
t1 = t0 ? t0._next = t2 : taskHead = t2;
}
}
taskTail = t0;
sleep(time);
}
function sleep(time) {
if (frame) return; // Soonest alarm already set, or will be.
if (timeout) timeout = clearTimeout(timeout);
var delay = time - clockNow;
if (delay > 24) {
if (time < Infinity) timeout = setTimeout(wake, delay);
if (interval) interval = clearInterval(interval);
} else {
if (!interval) interval = setInterval(poke$1, pokeDelay);
frame = 1, setFrame(wake);
}
}
function timeout$1(callback, delay, time) {
var t = new Timer;
delay = delay == null ? 0 : +delay;
t.restart(function(elapsed) {
t.stop();
callback(elapsed + delay);
}, delay, time);
return t;
}
function interval$1(callback, delay, time) {
var t = new Timer, total = delay;
if (delay == null) return t.restart(callback, delay, time), t;
delay = +delay, time = time == null ? now() : +time;
t.restart(function tick(elapsed) {
elapsed += total;
t.restart(tick, total += delay, time);
callback(elapsed);
}, delay, time);
return t;
}
var t0$1 = new Date;
var t1$1 = new Date;
function newInterval(floori, offseti, count, field) {
function interval(date) {
return floori(date = new Date(+date)), date;
}
interval.floor = interval;
interval.ceil = function(date) {
return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
};
interval.round = function(date) {
var d0 = interval(date),
d1 = interval.ceil(date);
return date - d0 < d1 - date ? d0 : d1;
};
interval.offset = function(date, step) {
return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
};
interval.range = function(start, stop, step) {
var range = [];
start = interval.ceil(start);
step = step == null ? 1 : Math.floor(step);
if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
return range;
};
interval.filter = function(test) {
return newInterval(function(date) {
while (floori(date), !test(date)) date.setTime(date - 1);
}, function(date, step) {
while (--step >= 0) while (offseti(date, 1), !test(date));
});
};
if (count) {
interval.count = function(start, end) {
t0$1.setTime(+start), t1$1.setTime(+end);
floori(t0$1), floori(t1$1);
return Math.floor(count(t0$1, t1$1));
};
interval.every = function(step) {
step = Math.floor(step);
return !isFinite(step) || !(step > 0) ? null
: !(step > 1) ? interval
: interval.filter(field
? function(d) { return field(d) % step === 0; }
: function(d) { return interval.count(0, d) % step === 0; });
};
}
return interval;
}
var millisecond = newInterval(function() {
// noop
}, function(date, step) {
date.setTime(+date + step);
}, function(start, end) {
return end - start;
});
// An optimized implementation for this simple case.
millisecond.every = function(k) {
k = Math.floor(k);
if (!isFinite(k) || !(k > 0)) return null;
if (!(k > 1)) return millisecond;
return newInterval(function(date) {
date.setTime(Math.floor(date / k) * k);
}, function(date, step) {
date.setTime(+date + step * k);
}, function(start, end) {
return (end - start) / k;
});
};
var milliseconds = millisecond.range;
var durationSecond = 1e3;
var durationMinute = 6e4;
var durationHour = 36e5;
var durationDay = 864e5;
var durationWeek = 6048e5;
var second = newInterval(function(date) {
date.setTime(Math.floor(date / durationSecond) * durationSecond);
}, function(date, step) {
date.setTime(+date + step * durationSecond);
}, function(start, end) {
return (end - start) / durationSecond;
}, function(date) {
return date.getUTCSeconds();
});
var seconds = second.range;
var minute = newInterval(function(date) {
date.setTime(Math.floor(date / durationMinute) * durationMinute);
}, function(date, step) {
date.setTime(+date + step * durationMinute);
}, function(start, end) {
return (end - start) / durationMinute;
}, function(date) {
return date.getMinutes();
});
var minutes = minute.range;
var hour = newInterval(function(date) {
var offset = date.getTimezoneOffset() * durationMinute % durationHour;
if (offset < 0) offset += durationHour;
date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
}, function(date, step) {
date.setTime(+date + step * durationHour);
}, function(start, end) {
return (end - start) / durationHour;
}, function(date) {
return date.getHours();
});
var hours = hour.range;
var day = newInterval(function(date) {
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setDate(date.getDate() + step);
}, function(start, end) {
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
}, function(date) {
return date.getDate() - 1;
});
var days = day.range;
function weekday(i) {
return newInterval(function(date) {
date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setDate(date.getDate() + step * 7);
}, function(start, end) {
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
});
}
var timeWeek = weekday(0);
var timeMonday = weekday(1);
var tuesday = weekday(2);
var wednesday = weekday(3);
var thursday = weekday(4);
var friday = weekday(5);
var saturday = weekday(6);
var sundays = timeWeek.range;
var mondays = timeMonday.range;
var tuesdays = tuesday.range;
var wednesdays = wednesday.range;
var thursdays = thursday.range;
var fridays = friday.range;
var saturdays = saturday.range;
var month = newInterval(function(date) {
date.setDate(1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setMonth(date.getMonth() + step);
}, function(start, end) {
return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
}, function(date) {
return date.getMonth();
});
var months = month.range;
var year = newInterval(function(date) {
date.setMonth(0, 1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setFullYear(date.getFullYear() + step);
}, function(start, end) {
return end.getFullYear() - start.getFullYear();
}, function(date) {
return date.getFullYear();
});
// An optimized implementation for this simple case.
year.every = function(k) {
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
date.setFullYear(Math.floor(date.getFullYear() / k) * k);
date.setMonth(0, 1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setFullYear(date.getFullYear() + step * k);
});
};
var years = year.range;
var utcMinute = newInterval(function(date) {
date.setUTCSeconds(0, 0);
}, function(date, step) {
date.setTime(+date + step * durationMinute);
}, function(start, end) {
return (end - start) / durationMinute;
}, function(date) {
return date.getUTCMinutes();
});
var utcMinutes = utcMinute.range;
var utcHour = newInterval(function(date) {
date.setUTCMinutes(0, 0, 0);
}, function(date, step) {
date.setTime(+date + step * durationHour);
}, function(start, end) {
return (end - start) / durationHour;
}, function(date) {
return date.getUTCHours();
});
var utcHours = utcHour.range;
var utcDay = newInterval(function(date) {
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCDate(date.getUTCDate() + step);
}, function(start, end) {
return (end - start) / durationDay;
}, function(date) {
return date.getUTCDate() - 1;
});
var utcDays = utcDay.range;
function utcWeekday(i) {
return newInterval(function(date) {
date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCDate(date.getUTCDate() + step * 7);
}, function(start, end) {
return (end - start) / durationWeek;
});
}
var utcWeek = utcWeekday(0);
var utcMonday = utcWeekday(1);
var utcTuesday = utcWeekday(2);
var utcWednesday = utcWeekday(3);
var utcThursday = utcWeekday(4);
var utcFriday = utcWeekday(5);
var utcSaturday = utcWeekday(6);
var utcSundays = utcWeek.range;
var utcMondays = utcMonday.range;
var utcTuesdays = utcTuesday.range;
var utcWednesdays = utcWednesday.range;
var utcThursdays = utcThursday.range;
var utcFridays = utcFriday.range;
var utcSaturdays = utcSaturday.range;
var utcMonth = newInterval(function(date) {
date.setUTCDate(1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCMonth(date.getUTCMonth() + step);
}, function(start, end) {
return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
}, function(date) {
return date.getUTCMonth();
});
var utcMonths = utcMonth.range;
var utcYear = newInterval(function(date) {
date.setUTCMonth(0, 1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCFullYear(date.getUTCFullYear() + step);
}, function(start, end) {
return end.getUTCFullYear() - start.getUTCFullYear();
}, function(date) {
return date.getUTCFullYear();
});
// An optimized implementation for this simple case.
utcYear.every = function(k) {
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
date.setUTCMonth(0, 1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCFullYear(date.getUTCFullYear() + step * k);
});
};
var utcYears = utcYear.range;
// Computes the decimal coefficient and exponent of the specified number x with
// significant digits p, where x is positive and p is in [1, 21] or undefined.
// For example, formatDecimal(1.23) returns ["123", 0].
function formatDecimal(x, p) {
if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
var i, coefficient = x.slice(0, i);
// The string returned by toExponential either has the form \d\.\d+e[-+]\d+
// (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
return [
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
+x.slice(i + 1)
];
}
function exponent$1(x) {
return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
}
function formatGroup(grouping, thousands) {
return function(value, width) {
var i = value.length,
t = [],
j = 0,
g = grouping[0],
length = 0;
while (i > 0 && g > 0) {
if (length + g + 1 > width) g = Math.max(1, width - length);
t.push(value.substring(i -= g, i + g));
if ((length += g + 1) > width) break;
g = grouping[j = (j + 1) % grouping.length];
}
return t.reverse().join(thousands);
};
}
function formatDefault(x, p) {
x = x.toPrecision(p);
out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
switch (x[i]) {
case ".": i0 = i1 = i; break;
case "0": if (i0 === 0) i0 = i; i1 = i; break;
case "e": break out;
default: if (i0 > 0) i0 = 0; break;
}
}
return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
}
var prefixExponent;
function formatPrefixAuto(x, p) {
var d = formatDecimal(x, p);
if (!d) return x + "";
var coefficient = d[0],
exponent = d[1],
i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
n = coefficient.length;
return i === n ? coefficient
: i > n ? coefficient + new Array(i - n + 1).join("0")
: i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
: "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
}
function formatRounded(x, p) {
var d = formatDecimal(x, p);
if (!d) return x + "";
var coefficient = d[0],
exponent = d[1];
return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
: coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
: coefficient + new Array(exponent - coefficient.length + 2).join("0");
}
var formatTypes = {
"": formatDefault,
"%": function(x, p) { return (x * 100).toFixed(p); },
"b": function(x) { return Math.round(x).toString(2); },
"c": function(x) { return x + ""; },
"d": function(x) { return Math.round(x).toString(10); },
"e": function(x, p) { return x.toExponential(p); },
"f": function(x, p) { return x.toFixed(p); },
"g": function(x, p) { return x.toPrecision(p); },
"o": function(x) { return Math.round(x).toString(8); },
"p": function(x, p) { return formatRounded(x * 100, p); },
"r": formatRounded,
"s": formatPrefixAuto,
"X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
"x": function(x) { return Math.round(x).toString(16); }
};
// [[fill]align][sign][symbol][0][width][,][.precision][type]
var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
function formatSpecifier(specifier) {
return new FormatSpecifier(specifier);
}
function FormatSpecifier(specifier) {
if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
var match,
fill = match[1] || " ",
align = match[2] || ">",
sign = match[3] || "-",
symbol = match[4] || "",
zero = !!match[5],
width = match[6] && +match[6],
comma = !!match[7],
precision = match[8] && +match[8].slice(1),
type = match[9] || "";
// The "n" type is an alias for ",g".
if (type === "n") comma = true, type = "g";
// Map invalid types to the default format.
else if (!formatTypes[type]) type = "";
// If zero fill is specified, padding goes after sign and before digits.
if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
this.fill = fill;
this.align = align;
this.sign = sign;
this.symbol = symbol;
this.zero = zero;
this.width = width;
this.comma = comma;
this.precision = precision;
this.type = type;
}
FormatSpecifier.prototype.toString = function() {
return this.fill
+ this.align
+ this.sign
+ this.symbol
+ (this.zero ? "0" : "")
+ (this.width == null ? "" : Math.max(1, this.width | 0))
+ (this.comma ? "," : "")
+ (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
+ this.type;
};
var prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];
function identity$3(x) {
return x;
}
function formatLocale(locale) {
var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
currency = locale.currency,
decimal = locale.decimal;
function newFormat(specifier) {
specifier = formatSpecifier(specifier);
var fill = specifier.fill,
align = specifier.align,
sign = specifier.sign,
symbol = specifier.symbol,
zero = specifier.zero,
width = specifier.width,
comma = specifier.comma,
precision = specifier.precision,
type = specifier.type;
// Compute the prefix and suffix.
// For SI-prefix, the suffix is lazily computed.
var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? "%" : "";
// What format function should we use?
// Is this an integer type?
// Can this type generate exponential notation?
var formatType = formatTypes[type],
maybeSuffix = !type || /[defgprs%]/.test(type);
// Set the default precision if not specified,
// or clamp the specified precision to the supported range.
// For significant precision, it must be in [1, 21].
// For fixed precision, it must be in [0, 20].
precision = precision == null ? (type ? 6 : 12)
: /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
: Math.max(0, Math.min(20, precision));
function format(value) {
var valuePrefix = prefix,
valueSuffix = suffix,
i, n, c;
if (type === "c") {
valueSuffix = formatType(value) + valueSuffix;
value = "";
} else {
value = +value;
// Convert negative to positive, and compute the prefix.
// Note that -0 is not less than 0, but 1 / -0 is!
var valueNegative = (value < 0 || 1 / value < 0) && (value *= -1, true);
// Perform the initial formatting.
value = formatType(value, precision);
// If the original value was negative, it may be rounded to zero during
// formatting; treat this as (positive) zero.
if (valueNegative) {
i = -1, n = value.length;
valueNegative = false;
while (++i < n) {
if (c = value.charCodeAt(i), (48 < c && c < 58)
|| (type === "x" && 96 < c && c < 103)
|| (type === "X" && 64 < c && c < 71)) {
valueNegative = true;
break;
}
}
}
// Compute the prefix and suffix.
valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
// Break the formatted value into the integer “value” part that can be
// grouped, and fractional or exponential “suffix” part that is not.
if (maybeSuffix) {
i = -1, n = value.length;
while (++i < n) {
if (c = value.charCodeAt(i), 48 > c || c > 57) {
valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
value = value.slice(0, i);
break;
}
}
}
}
// If the fill character is not "0", grouping is applied before padding.
if (comma && !zero) value = group(value, Infinity);
// Compute the padding.
var length = valuePrefix.length + value.length + valueSuffix.length,
padding = length < width ? new Array(width - length + 1).join(fill) : "";
// If the fill character is "0", grouping is applied after padding.
if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
// Reconstruct the final output based on the desired alignment.
switch (align) {
case "<": return valuePrefix + value + valueSuffix + padding;
case "=": return valuePrefix + padding + value + valueSuffix;
case "^": return padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
}
return padding + valuePrefix + value + valueSuffix;
}
format.toString = function() {
return specifier + "";
};
return format;
}
function formatPrefix(specifier, value) {
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
k = Math.pow(10, -e),
prefix = prefixes[8 + e / 3];
return function(value) {
return f(k * value) + prefix;
};
}
return {
format: newFormat,
formatPrefix: formatPrefix
};
}
var locale;
exports.format;
exports.formatPrefix;
defaultLocale({
decimal: ".",
thousands: ",",
grouping: [3],
currency: ["$", ""]
});
function defaultLocale(definition) {
locale = formatLocale(definition);
exports.format = locale.format;
exports.formatPrefix = locale.formatPrefix;
return locale;
}
function precisionFixed(step) {
return Math.max(0, -exponent$1(Math.abs(step)));
}
function precisionPrefix(step, value) {
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
}
function precisionRound(step, max) {
step = Math.abs(step), max = Math.abs(max) - step;
return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
}
function localDate(d) {
if (0 <= d.y && d.y < 100) {
var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
date.setFullYear(d.y);
return date;
}
return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
}
function utcDate(d) {
if (0 <= d.y && d.y < 100) {
var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
date.setUTCFullYear(d.y);
return date;
}
return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
}
function newYear(y) {
return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
}
function formatLocale$1(locale) {
var locale_dateTime = locale.dateTime,
locale_date = locale.date,
locale_time = locale.time,
locale_periods = locale.periods,
locale_weekdays = locale.days,
locale_shortWeekdays = locale.shortDays,
locale_months = locale.months,
locale_shortMonths = locale.shortMonths;
var periodRe = formatRe(locale_periods),
periodLookup = formatLookup(locale_periods),
weekdayRe = formatRe(locale_weekdays),
weekdayLookup = formatLookup(locale_weekdays),
shortWeekdayRe = formatRe(locale_shortWeekdays),
shortWeekdayLookup = formatLookup(locale_shortWeekdays),
monthRe = formatRe(locale_months),
monthLookup = formatLookup(locale_months),
shortMonthRe = formatRe(locale_shortMonths),
shortMonthLookup = formatLookup(locale_shortMonths);
var formats = {
"a": formatShortWeekday,
"A": formatWeekday,
"b": formatShortMonth,
"B": formatMonth,
"c": null,
"d": formatDayOfMonth,
"e": formatDayOfMonth,
"H": formatHour24,
"I": formatHour12,
"j": formatDayOfYear,
"L": formatMilliseconds,
"m": formatMonthNumber,
"M": formatMinutes,
"p": formatPeriod,
"S": formatSeconds,
"U": formatWeekNumberSunday,
"w": formatWeekdayNumber,
"W": formatWeekNumberMonday,
"x": null,
"X": null,
"y": formatYear,
"Y": formatFullYear,
"Z": formatZone,
"%": formatLiteralPercent
};
var utcFormats = {
"a": formatUTCShortWeekday,
"A": formatUTCWeekday,
"b": formatUTCShortMonth,
"B": formatUTCMonth,
"c": null,
"d": formatUTCDayOfMonth,
"e": formatUTCDayOfMonth,
"H": formatUTCHour24,
"I": formatUTCHour12,
"j": formatUTCDayOfYear,
"L": formatUTCMilliseconds,
"m": formatUTCMonthNumber,
"M": formatUTCMinutes,
"p": formatUTCPeriod,
"S": formatUTCSeconds,
"U": formatUTCWeekNumberSunday,
"w": formatUTCWeekdayNumber,
"W": formatUTCWeekNumberMonday,
"x": null,
"X": null,
"y": formatUTCYear,
"Y": formatUTCFullYear,
"Z": formatUTCZone,
"%": formatLiteralPercent
};
var parses = {
"a": parseShortWeekday,
"A": parseWeekday,
"b": parseShortMonth,
"B": parseMonth,
"c": parseLocaleDateTime,
"d": parseDayOfMonth,
"e": parseDayOfMonth,
"H": parseHour24,
"I": parseHour24,
"j": parseDayOfYear,
"L": parseMilliseconds,
"m": parseMonthNumber,
"M": parseMinutes,
"p": parsePeriod,
"S": parseSeconds,
"U": parseWeekNumberSunday,
"w": parseWeekdayNumber,
"W": parseWeekNumberMonday,
"x": parseLocaleDate,
"X": parseLocaleTime,
"y": parseYear,
"Y": parseFullYear,
"Z": parseZone,
"%": parseLiteralPercent
};
// These recursive directive definitions must be deferred.
formats.x = newFormat(locale_date, formats);
formats.X = newFormat(locale_time, formats);
formats.c = newFormat(locale_dateTime, formats);
utcFormats.x = newFormat(locale_date, utcFormats);
utcFormats.X = newFormat(locale_time, utcFormats);
utcFormats.c = newFormat(locale_dateTime, utcFormats);
function newFormat(specifier, formats) {
return function(date) {
var string = [],
i = -1,
j = 0,
n = specifier.length,
c,
pad,
format;
if (!(date instanceof Date)) date = new Date(+date);
while (++i < n) {
if (specifier.charCodeAt(i) === 37) {
string.push(specifier.slice(j, i));
if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
else pad = c === "e" ? " " : "0";
if (format = formats[c]) c = format(date, pad);
string.push(c);
j = i + 1;
}
}
string.push(specifier.slice(j, i));
return string.join("");
};
}
function newParse(specifier, newDate) {
return function(string) {
var d = newYear(1900),
i = parseSpecifier(d, specifier, string += "", 0);
if (i != string.length) return null;
// The am-pm flag is 0 for AM, and 1 for PM.
if ("p" in d) d.H = d.H % 12 + d.p * 12;
// Convert day-of-week and week-of-year to day-of-year.
if ("W" in d || "U" in d) {
if (!("w" in d)) d.w = "W" in d ? 1 : 0;
var day = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
d.m = 0;
d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;
}
// If a time zone is specified, all fields are interpreted as UTC and then
// offset according to the specified time zone.
if ("Z" in d) {
d.H += d.Z / 100 | 0;
d.M += d.Z % 100;
return utcDate(d);
}
// Otherwise, all fields are in local time.
return newDate(d);
};
}
function parseSpecifier(d, specifier, string, j) {
var i = 0,
n = specifier.length,
m = string.length,
c,
parse;
while (i < n) {
if (j >= m) return -1;
c = specifier.charCodeAt(i++);
if (c === 37) {
c = specifier.charAt(i++);
parse = parses[c in pads ? specifier.charAt(i++) : c];
if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
} else if (c != string.charCodeAt(j++)) {
return -1;
}
}
return j;
}
function parsePeriod(d, string, i) {
var n = periodRe.exec(string.slice(i));
return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseShortWeekday(d, string, i) {
var n = shortWeekdayRe.exec(string.slice(i));
return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseWeekday(d, string, i) {
var n = weekdayRe.exec(string.slice(i));
return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseShortMonth(d, string, i) {
var n = shortMonthRe.exec(string.slice(i));
return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseMonth(d, string, i) {
var n = monthRe.exec(string.slice(i));
return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseLocaleDateTime(d, string, i) {
return parseSpecifier(d, locale_dateTime, string, i);
}
function parseLocaleDate(d, string, i) {
return parseSpecifier(d, locale_date, string, i);
}
function parseLocaleTime(d, string, i) {
return parseSpecifier(d, locale_time, string, i);
}
function formatShortWeekday(d) {
return locale_shortWeekdays[d.getDay()];
}
function formatWeekday(d) {
return locale_weekdays[d.getDay()];
}
function formatShortMonth(d) {
return locale_shortMonths[d.getMonth()];
}
function formatMonth(d) {
return locale_months[d.getMonth()];
}
function formatPeriod(d) {
return locale_periods[+(d.getHours() >= 12)];
}
function formatUTCShortWeekday(d) {
return locale_shortWeekdays[d.getUTCDay()];
}
function formatUTCWeekday(d) {
return locale_weekdays[d.getUTCDay()];
}
function formatUTCShortMonth(d) {
return locale_shortMonths[d.getUTCMonth()];
}
function formatUTCMonth(d) {
return locale_months[d.getUTCMonth()];
}
function formatUTCPeriod(d) {
return locale_periods[+(d.getUTCHours() >= 12)];
}
return {
format: function(specifier) {
var f = newFormat(specifier += "", formats);
f.toString = function() { return specifier; };
return f;
},
parse: function(specifier) {
var p = newParse(specifier += "", localDate);
p.toString = function() { return specifier; };
return p;
},
utcFormat: function(specifier) {
var f = newFormat(specifier += "", utcFormats);
f.toString = function() { return specifier; };
return f;
},
utcParse: function(specifier) {
var p = newParse(specifier, utcDate);
p.toString = function() { return specifier; };
return p;
}
};
}
var pads = {"-": "", "_": " ", "0": "0"};
var numberRe = /^\s*\d+/;
var percentRe = /^%/;
var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
function pad(value, fill, width) {
var sign = value < 0 ? "-" : "",
string = (sign ? -value : value) + "",
length = string.length;
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
}
function requote(s) {
return s.replace(requoteRe, "\\$&");
}
function formatRe(names) {
return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
}
function formatLookup(names) {
var map = {}, i = -1, n = names.length;
while (++i < n) map[names[i].toLowerCase()] = i;
return map;
}
function parseWeekdayNumber(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 1));
return n ? (d.w = +n[0], i + n[0].length) : -1;
}
function parseWeekNumberSunday(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.U = +n[0], i + n[0].length) : -1;
}
function parseWeekNumberMonday(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.W = +n[0], i + n[0].length) : -1;
}
function parseFullYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 4));
return n ? (d.y = +n[0], i + n[0].length) : -1;
}
function parseYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
}
function parseZone(d, string, i) {
var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
}
function parseMonthNumber(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
}
function parseDayOfMonth(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.d = +n[0], i + n[0].length) : -1;
}
function parseDayOfYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 3));
return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
}
function parseHour24(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.H = +n[0], i + n[0].length) : -1;
}
function parseMinutes(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.M = +n[0], i + n[0].length) : -1;
}
function parseSeconds(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.S = +n[0], i + n[0].length) : -1;
}
function parseMilliseconds(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 3));
return n ? (d.L = +n[0], i + n[0].length) : -1;
}
function parseLiteralPercent(d, string, i) {
var n = percentRe.exec(string.slice(i, i + 1));
return n ? i + n[0].length : -1;
}
function formatDayOfMonth(d, p) {
return pad(d.getDate(), p, 2);
}
function formatHour24(d, p) {
return pad(d.getHours(), p, 2);
}
function formatHour12(d, p) {
return pad(d.getHours() % 12 || 12, p, 2);
}
function formatDayOfYear(d, p) {
return pad(1 + day.count(year(d), d), p, 3);
}
function formatMilliseconds(d, p) {
return pad(d.getMilliseconds(), p, 3);
}
function formatMonthNumber(d, p) {
return pad(d.getMonth() + 1, p, 2);
}
function formatMinutes(d, p) {
return pad(d.getMinutes(), p, 2);
}
function formatSeconds(d, p) {
return pad(d.getSeconds(), p, 2);
}
function formatWeekNumberSunday(d, p) {
return pad(timeWeek.count(year(d), d), p, 2);
}
function formatWeekdayNumber(d) {
return d.getDay();
}
function formatWeekNumberMonday(d, p) {
return pad(timeMonday.count(year(d), d), p, 2);
}
function formatYear(d, p) {
return pad(d.getFullYear() % 100, p, 2);
}
function formatFullYear(d, p) {
return pad(d.getFullYear() % 10000, p, 4);
}
function formatZone(d) {
var z = d.getTimezoneOffset();
return (z > 0 ? "-" : (z *= -1, "+"))
+ pad(z / 60 | 0, "0", 2)
+ pad(z % 60, "0", 2);
}
function formatUTCDayOfMonth(d, p) {
return pad(d.getUTCDate(), p, 2);
}
function formatUTCHour24(d, p) {
return pad(d.getUTCHours(), p, 2);
}
function formatUTCHour12(d, p) {
return pad(d.getUTCHours() % 12 || 12, p, 2);
}
function formatUTCDayOfYear(d, p) {
return pad(1 + utcDay.count(utcYear(d), d), p, 3);
}
function formatUTCMilliseconds(d, p) {
return pad(d.getUTCMilliseconds(), p, 3);
}
function formatUTCMonthNumber(d, p) {
return pad(d.getUTCMonth() + 1, p, 2);
}
function formatUTCMinutes(d, p) {
return pad(d.getUTCMinutes(), p, 2);
}
function formatUTCSeconds(d, p) {
return pad(d.getUTCSeconds(), p, 2);
}
function formatUTCWeekNumberSunday(d, p) {
return pad(utcWeek.count(utcYear(d), d), p, 2);
}
function formatUTCWeekdayNumber(d) {
return d.getUTCDay();
}
function formatUTCWeekNumberMonday(d, p) {
return pad(utcMonday.count(utcYear(d), d), p, 2);
}
function formatUTCYear(d, p) {
return pad(d.getUTCFullYear() % 100, p, 2);
}
function formatUTCFullYear(d, p) {
return pad(d.getUTCFullYear() % 10000, p, 4);
}
function formatUTCZone() {
return "+0000";
}
function formatLiteralPercent() {
return "%";
}
var locale$1;
exports.timeFormat;
exports.timeParse;
exports.utcFormat;
exports.utcParse;
defaultLocale$1({
dateTime: "%x, %X",
date: "%-m/%-d/%Y",
time: "%-I:%M:%S %p",
periods: ["AM", "PM"],
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
});
function defaultLocale$1(definition) {
locale$1 = formatLocale$1(definition);
exports.timeFormat = locale$1.format;
exports.timeParse = locale$1.parse;
exports.utcFormat = locale$1.utcFormat;
exports.utcParse = locale$1.utcParse;
return locale$1;
}
var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
function formatIsoNative(date) {
return date.toISOString();
}
var formatIso = Date.prototype.toISOString
? formatIsoNative
: exports.utcFormat(isoSpecifier);
function parseIsoNative(string) {
var date = new Date(string);
return isNaN(date) ? null : date;
}
var parseIso = +new Date("2000-01-01T00:00:00.000Z")
? parseIsoNative
: exports.utcParse(isoSpecifier);
var array$2 = Array.prototype;
var map$2 = array$2.map;
var slice$3 = array$2.slice;
var implicit = {name: "implicit"};
function ordinal(range) {
var index = map$1(),
domain = [],
unknown = implicit;
range = range == null ? [] : slice$3.call(range);
function scale(d) {
var key = d + "", i = index.get(key);
if (!i) {
if (unknown !== implicit) return unknown;
index.set(key, i = domain.push(d));
}
return range[(i - 1) % range.length];
}
scale.domain = function(_) {
if (!arguments.length) return domain.slice();
domain = [], index = map$1();
var i = -1, n = _.length, d, key;
while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
return scale;
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), scale) : range.slice();
};
scale.unknown = function(_) {
return arguments.length ? (unknown = _, scale) : unknown;
};
scale.copy = function() {
return ordinal()
.domain(domain)
.range(range)
.unknown(unknown);
};
return scale;
}
function band() {
var scale = ordinal().unknown(undefined),
domain = scale.domain,
ordinalRange = scale.range,
range$$ = [0, 1],
step,
bandwidth,
round = false,
paddingInner = 0,
paddingOuter = 0,
align = 0.5;
delete scale.unknown;
function rescale() {
var n = domain().length,
reverse = range$$[1] < range$$[0],
start = range$$[reverse - 0],
stop = range$$[1 - reverse];
step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
if (round) step = Math.floor(step);
start += (stop - start - step * (n - paddingInner)) * align;
bandwidth = step * (1 - paddingInner);
if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
var values = range(n).map(function(i) { return start + step * i; });
return ordinalRange(reverse ? values.reverse() : values);
}
scale.domain = function(_) {
return arguments.length ? (domain(_), rescale()) : domain();
};
scale.range = function(_) {
return arguments.length ? (range$$ = [+_[0], +_[1]], rescale()) : range$$.slice();
};
scale.rangeRound = function(_) {
return range$$ = [+_[0], +_[1]], round = true, rescale();
};
scale.bandwidth = function() {
return bandwidth;
};
scale.step = function() {
return step;
};
scale.round = function(_) {
return arguments.length ? (round = !!_, rescale()) : round;
};
scale.padding = function(_) {
return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
};
scale.paddingInner = function(_) {
return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
};
scale.paddingOuter = function(_) {
return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
};
scale.align = function(_) {
return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
};
scale.copy = function() {
return band()
.domain(domain())
.range(range$$)
.round(round)
.paddingInner(paddingInner)
.paddingOuter(paddingOuter)
.align(align);
};
return rescale();
}
function pointish(scale) {
var copy = scale.copy;
scale.padding = scale.paddingOuter;
delete scale.paddingInner;
delete scale.paddingOuter;
scale.copy = function() {
return pointish(copy());
};
return scale;
}
function point$4() {
return pointish(band().paddingInner(1));
}
function constant$3(x) {
return function() {
return x;
};
}
function number$1(x) {
return +x;
}
var unit = [0, 1];
function deinterpolate(a, b) {
return (b -= (a = +a))
? function(x) { return (x - a) / b; }
: constant$3(b);
}
function deinterpolateClamp(deinterpolate) {
return function(a, b) {
var d = deinterpolate(a = +a, b = +b);
return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
};
}
function reinterpolateClamp(reinterpolate) {
return function(a, b) {
var r = reinterpolate(a = +a, b = +b);
return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
};
}
function bimap(domain, range, deinterpolate, reinterpolate) {
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
return function(x) { return r0(d0(x)); };
}
function polymap(domain, range, deinterpolate, reinterpolate) {
var j = Math.min(domain.length, range.length) - 1,
d = new Array(j),
r = new Array(j),
i = -1;
// Reverse descending domains.
if (domain[j] < domain[0]) {
domain = domain.slice().reverse();
range = range.slice().reverse();
}
while (++i < j) {
d[i] = deinterpolate(domain[i], domain[i + 1]);
r[i] = reinterpolate(range[i], range[i + 1]);
}
return function(x) {
var i = bisectRight(domain, x, 1, j) - 1;
return r[i](d[i](x));
};
}
function copy(source, target) {
return target
.domain(source.domain())
.range(source.range())
.interpolate(source.interpolate())
.clamp(source.clamp());
}
// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
function continuous(deinterpolate$$, reinterpolate) {
var domain = unit,
range = unit,
interpolate$$ = interpolate,
clamp = false,
piecewise,
output,
input;
function rescale() {
piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
output = input = null;
return scale;
}
function scale(x) {
return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate$$) : deinterpolate$$, interpolate$$)))(+x);
}
scale.invert = function(y) {
return (input || (input = piecewise(range, domain, deinterpolate, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
};
scale.domain = function(_) {
return arguments.length ? (domain = map$2.call(_, number$1), rescale()) : domain.slice();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), rescale()) : range.slice();
};
scale.rangeRound = function(_) {
return range = slice$3.call(_), interpolate$$ = interpolateRound, rescale();
};
scale.clamp = function(_) {
return arguments.length ? (clamp = !!_, rescale()) : clamp;
};
scale.interpolate = function(_) {
return arguments.length ? (interpolate$$ = _, rescale()) : interpolate$$;
};
return rescale();
}
function tickFormat(domain, count, specifier) {
var start = domain[0],
stop = domain[domain.length - 1],
step = tickStep(start, stop, count == null ? 10 : count),
precision;
specifier = formatSpecifier(specifier == null ? ",f" : specifier);
switch (specifier.type) {
case "s": {
var value = Math.max(Math.abs(start), Math.abs(stop));
if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
return exports.formatPrefix(specifier, value);
}
case "":
case "e":
case "g":
case "p":
case "r": {
if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
break;
}
case "f":
case "%": {
if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
break;
}
}
return exports.format(specifier);
}
function linearish(scale) {
var domain = scale.domain;
scale.ticks = function(count) {
var d = domain();
return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
};
scale.tickFormat = function(count, specifier) {
return tickFormat(domain(), count, specifier);
};
scale.nice = function(count) {
var d = domain(),
i = d.length - 1,
n = count == null ? 10 : count,
start = d[0],
stop = d[i],
step = tickStep(start, stop, n);
if (step) {
step = tickStep(Math.floor(start / step) * step, Math.ceil(stop / step) * step, n);
d[0] = Math.floor(start / step) * step;
d[i] = Math.ceil(stop / step) * step;
domain(d);
}
return scale;
};
return scale;
}
function linear$2() {
var scale = continuous(deinterpolate, interpolateNumber);
scale.copy = function() {
return copy(scale, linear$2());
};
return linearish(scale);
}
function identity$4() {
var domain = [0, 1];
function scale(x) {
return +x;
}
scale.invert = scale;
scale.domain = scale.range = function(_) {
return arguments.length ? (domain = map$2.call(_, number$1), scale) : domain.slice();
};
scale.copy = function() {
return identity$4().domain(domain);
};
return linearish(scale);
}
function nice(domain, interval) {
domain = domain.slice();
var i0 = 0,
i1 = domain.length - 1,
x0 = domain[i0],
x1 = domain[i1],
t;
if (x1 < x0) {
t = i0, i0 = i1, i1 = t;
t = x0, x0 = x1, x1 = t;
}
domain[i0] = interval.floor(x0);
domain[i1] = interval.ceil(x1);
return domain;
}
function deinterpolate$1(a, b) {
return (b = Math.log(b / a))
? function(x) { return Math.log(x / a) / b; }
: constant$3(b);
}
function reinterpolate(a, b) {
return a < 0
? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
: function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
}
function pow10(x) {
return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
}
function powp(base) {
return base === 10 ? pow10
: base === Math.E ? Math.exp
: function(x) { return Math.pow(base, x); };
}
function logp(base) {
return base === Math.E ? Math.log
: base === 10 && Math.log10
|| base === 2 && Math.log2
|| (base = Math.log(base), function(x) { return Math.log(x) / base; });
}
function reflect(f) {
return function(x) {
return -f(-x);
};
}
function log() {
var scale = continuous(deinterpolate$1, reinterpolate).domain([1, 10]),
domain = scale.domain,
base = 10,
logs = logp(10),
pows = powp(10);
function rescale() {
logs = logp(base), pows = powp(base);
if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
return scale;
}
scale.base = function(_) {
return arguments.length ? (base = +_, rescale()) : base;
};
scale.domain = function(_) {
return arguments.length ? (domain(_), rescale()) : domain();
};
scale.ticks = function(count) {
var d = domain(),
u = d[0],
v = d[d.length - 1],
r;
if (r = v < u) i = u, u = v, v = i;
var i = logs(u),
j = logs(v),
p,
k,
t,
n = count == null ? 10 : +count,
z = [];
if (!(base % 1) && j - i < n) {
i = Math.round(i) - 1, j = Math.round(j) + 1;
if (u > 0) for (; i < j; ++i) {
for (k = 1, p = pows(i); k < base; ++k) {
t = p * k;
if (t < u) continue;
if (t > v) break;
z.push(t);
}
} else for (; i < j; ++i) {
for (k = base - 1, p = pows(i); k >= 1; --k) {
t = p * k;
if (t < u) continue;
if (t > v) break;
z.push(t);
}
}
} else {
z = ticks(i, j, Math.min(j - i, n)).map(pows);
}
return r ? z.reverse() : z;
};
scale.tickFormat = function(count, specifier) {
if (specifier == null) specifier = base === 10 ? ".0e" : ",";
if (typeof specifier !== "function") specifier = exports.format(specifier);
if (count === Infinity) return specifier;
if (count == null) count = 10;
var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
return function(d) {
var i = d / pows(Math.round(logs(d)));
if (i * base < base - 0.5) i *= base;
return i <= k ? specifier(d) : "";
};
};
scale.nice = function() {
return domain(nice(domain(), {
floor: function(x) { return pows(Math.floor(logs(x))); },
ceil: function(x) { return pows(Math.ceil(logs(x))); }
}));
};
scale.copy = function() {
return copy(scale, log().base(base));
};
return scale;
}
function raise(x, exponent) {
return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
}
function pow() {
var exponent = 1,
scale = continuous(deinterpolate, reinterpolate),
domain = scale.domain;
function deinterpolate(a, b) {
return (b = raise(b, exponent) - (a = raise(a, exponent)))
? function(x) { return (raise(x, exponent) - a) / b; }
: constant$3(b);
}
function reinterpolate(a, b) {
b = raise(b, exponent) - (a = raise(a, exponent));
return function(t) { return raise(a + b * t, 1 / exponent); };
}
scale.exponent = function(_) {
return arguments.length ? (exponent = +_, domain(domain())) : exponent;
};
scale.copy = function() {
return copy(scale, pow().exponent(exponent));
};
return linearish(scale);
}
function sqrt() {
return pow().exponent(0.5);
}
function quantile() {
var domain = [],
range = [],
thresholds = [];
function rescale() {
var i = 0, n = Math.max(1, range.length);
thresholds = new Array(n - 1);
while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
return scale;
}
function scale(x) {
if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
}
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return i < 0 ? [NaN, NaN] : [
i > 0 ? thresholds[i - 1] : domain[0],
i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
];
};
scale.domain = function(_) {
if (!arguments.length) return domain.slice();
domain = [];
for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
domain.sort(ascending);
return rescale();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), rescale()) : range.slice();
};
scale.quantiles = function() {
return thresholds.slice();
};
scale.copy = function() {
return quantile()
.domain(domain)
.range(range);
};
return scale;
}
function quantize$1() {
var x0 = 0,
x1 = 1,
n = 1,
domain = [0.5],
range = [0, 1];
function scale(x) {
if (x <= x) return range[bisectRight(domain, x, 0, n)];
}
function rescale() {
var i = -1;
domain = new Array(n);
while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
return scale;
}
scale.domain = function(_) {
return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
};
scale.range = function(_) {
return arguments.length ? (n = (range = slice$3.call(_)).length - 1, rescale()) : range.slice();
};
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return i < 0 ? [NaN, NaN]
: i < 1 ? [x0, domain[0]]
: i >= n ? [domain[n - 1], x1]
: [domain[i - 1], domain[i]];
};
scale.copy = function() {
return quantize$1()
.domain([x0, x1])
.range(range);
};
return linearish(scale);
}
function threshold$1() {
var domain = [0.5],
range = [0, 1],
n = 1;
function scale(x) {
if (x <= x) return range[bisectRight(domain, x, 0, n)];
}
scale.domain = function(_) {
return arguments.length ? (domain = slice$3.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
};
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return [domain[i - 1], domain[i]];
};
scale.copy = function() {
return threshold$1()
.domain(domain)
.range(range);
};
return scale;
}
var durationSecond$1 = 1000;
var durationMinute$1 = durationSecond$1 * 60;
var durationHour$1 = durationMinute$1 * 60;
var durationDay$1 = durationHour$1 * 24;
var durationWeek$1 = durationDay$1 * 7;
var durationMonth = durationDay$1 * 30;
var durationYear = durationDay$1 * 365;
function date$1(t) {
return new Date(t);
}
function number$2(t) {
return t instanceof Date ? +t : +new Date(+t);
}
function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
var scale = continuous(deinterpolate, interpolateNumber),
invert = scale.invert,
domain = scale.domain;
var formatMillisecond = format(".%L"),
formatSecond = format(":%S"),
formatMinute = format("%I:%M"),
formatHour = format("%I %p"),
formatDay = format("%a %d"),
formatWeek = format("%b %d"),
formatMonth = format("%B"),
formatYear = format("%Y");
var tickIntervals = [
[second, 1, durationSecond$1],
[second, 5, 5 * durationSecond$1],
[second, 15, 15 * durationSecond$1],
[second, 30, 30 * durationSecond$1],
[minute, 1, durationMinute$1],
[minute, 5, 5 * durationMinute$1],
[minute, 15, 15 * durationMinute$1],
[minute, 30, 30 * durationMinute$1],
[ hour, 1, durationHour$1 ],
[ hour, 3, 3 * durationHour$1 ],
[ hour, 6, 6 * durationHour$1 ],
[ hour, 12, 12 * durationHour$1 ],
[ day, 1, durationDay$1 ],
[ day, 2, 2 * durationDay$1 ],
[ week, 1, durationWeek$1 ],
[ month, 1, durationMonth ],
[ month, 3, 3 * durationMonth ],
[ year, 1, durationYear ]
];
function tickFormat(date) {
return (second(date) < date ? formatMillisecond
: minute(date) < date ? formatSecond
: hour(date) < date ? formatMinute
: day(date) < date ? formatHour
: month(date) < date ? (week(date) < date ? formatDay : formatWeek)
: year(date) < date ? formatMonth
: formatYear)(date);
}
function tickInterval(interval, start, stop, step) {
if (interval == null) interval = 10;
// If a desired tick count is specified, pick a reasonable tick interval
// based on the extent of the domain and a rough estimate of tick size.
// Otherwise, assume interval is already a time interval and use it.
if (typeof interval === "number") {
var target = Math.abs(stop - start) / interval,
i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
if (i === tickIntervals.length) {
step = tickStep(start / durationYear, stop / durationYear, interval);
interval = year;
} else if (i) {
i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
step = i[1];
interval = i[0];
} else {
step = tickStep(start, stop, interval);
interval = millisecond;
}
}
return step == null ? interval : interval.every(step);
}
scale.invert = function(y) {
return new Date(invert(y));
};
scale.domain = function(_) {
return arguments.length ? domain(map$2.call(_, number$2)) : domain().map(date$1);
};
scale.ticks = function(interval, step) {
var d = domain(),
t0 = d[0],
t1 = d[d.length - 1],
r = t1 < t0,
t;
if (r) t = t0, t0 = t1, t1 = t;
t = tickInterval(interval, t0, t1, step);
t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
return r ? t.reverse() : t;
};
scale.tickFormat = function(count, specifier) {
return specifier == null ? tickFormat : format(specifier);
};
scale.nice = function(interval, step) {
var d = domain();
return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
? domain(nice(d, interval))
: scale;
};
scale.copy = function() {
return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
};
return scale;
}
function time() {
return calendar(year, month, timeWeek, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
}
function utcTime() {
return calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
}
function colors(s) {
return s.match(/.{6}/g).map(function(x) {
return "#" + x;
});
}
var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
var cubehelix$3 = interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
var rainbow = cubehelix();
function rainbow$1(t) {
if (t < 0 || t > 1) t -= Math.floor(t);
var ts = Math.abs(t - 0.5);
rainbow.h = 360 * t - 100;
rainbow.s = 1.5 - 1.5 * ts;
rainbow.l = 0.8 - 0.9 * ts;
return rainbow + "";
}
function ramp(range) {
var n = range.length;
return function(t) {
return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
};
}
var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
function sequential(interpolator) {
var x0 = 0,
x1 = 1,
clamp = false;
function scale(x) {
var t = (x - x0) / (x1 - x0);
return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
}
scale.domain = function(_) {
return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
};
scale.clamp = function(_) {
return arguments.length ? (clamp = !!_, scale) : clamp;
};
scale.interpolator = function(_) {
return arguments.length ? (interpolator = _, scale) : interpolator;
};
scale.copy = function() {
return sequential(interpolator).domain([x0, x1]).clamp(clamp);
};
return linearish(scale);
}
var xhtml = "http://www.w3.org/1999/xhtml";
var namespaces = {
svg: "http://www.w3.org/2000/svg",
xhtml: xhtml,
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
};
function namespace(name) {
var prefix = name += "", i = prefix.indexOf(":");
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
}
function creatorInherit(name) {
return function() {
var document = this.ownerDocument,
uri = this.namespaceURI;
return uri === xhtml && document.documentElement.namespaceURI === xhtml
? document.createElement(name)
: document.createElementNS(uri, name);
};
}
function creatorFixed(fullname) {
return function() {
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
};
}
function creator(name) {
var fullname = namespace(name);
return (fullname.local
? creatorFixed
: creatorInherit)(fullname);
}
var nextId = 0;
function local() {
return new Local;
}
function Local() {
this._ = "@" + (++nextId).toString(36);
}
Local.prototype = local.prototype = {
constructor: Local,
get: function(node) {
var id = this._;
while (!(id in node)) if (!(node = node.parentNode)) return;
return node[id];
},
set: function(node, value) {
return node[this._] = value;
},
remove: function(node) {
return this._ in node && delete node[this._];
},
toString: function() {
return this._;
}
};
var matcher = function(selector) {
return function() {
return this.matches(selector);
};
};
if (typeof document !== "undefined") {
var element = document.documentElement;
if (!element.matches) {
var vendorMatches = element.webkitMatchesSelector
|| element.msMatchesSelector
|| element.mozMatchesSelector
|| element.oMatchesSelector;
matcher = function(selector) {
return function() {
return vendorMatches.call(this, selector);
};
};
}
}
var matcher$1 = matcher;
var filterEvents = {};
exports.event = null;
if (typeof document !== "undefined") {
var element$1 = document.documentElement;
if (!("onmouseenter" in element$1)) {
filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
}
}
function filterContextListener(listener, index, group) {
listener = contextListener(listener, index, group);
return function(event) {
var related = event.relatedTarget;
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
listener.call(this, event);
}
};
}
function contextListener(listener, index, group) {
return function(event1) {
var event0 = exports.event; // Events can be reentrant (e.g., focus).
exports.event = event1;
try {
listener.call(this, this.__data__, index, group);
} finally {
exports.event = event0;
}
};
}
function parseTypenames$1(typenames) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
return {type: t, name: name};
});
}
function onRemove(typename) {
return function() {
var on = this.__on;
if (!on) return;
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
} else {
on[++i] = o;
}
}
if (++i) on.length = i;
else delete this.__on;
};
}
function onAdd(typename, value, capture) {
var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
return function(d, i, group) {
var on = this.__on, o, listener = wrap(value, i, group);
if (on) for (var j = 0, m = on.length; j < m; ++j) {
if ((o = on[j]).type === typename.type && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
this.addEventListener(o.type, o.listener = listener, o.capture = capture);
o.value = value;
return;
}
}
this.addEventListener(typename.type, listener, capture);
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
if (!on) this.__on = [o];
else on.push(o);
};
}
function selection_on(typename, value, capture) {
var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
if (arguments.length < 2) {
var on = this.node().__on;
if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
for (i = 0, o = on[j]; i < n; ++i) {
if ((t = typenames[i]).type === o.type && t.name === o.name) {
return o.value;
}
}
}
return;
}
on = value ? onAdd : onRemove;
if (capture == null) capture = false;
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
return this;
}
function customEvent(event1, listener, that, args) {
var event0 = exports.event;
event1.sourceEvent = exports.event;
exports.event = event1;
try {
return listener.apply(that, args);
} finally {
exports.event = event0;
}
}
function sourceEvent() {
var current = exports.event, source;
while (source = current.sourceEvent) current = source;
return current;
}
function point$5(node, event) {
var svg = node.ownerSVGElement || node;
if (svg.createSVGPoint) {
var point = svg.createSVGPoint();
point.x = event.clientX, point.y = event.clientY;
point = point.matrixTransform(node.getScreenCTM().inverse());
return [point.x, point.y];
}
var rect = node.getBoundingClientRect();
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
}
function mouse(node) {
var event = sourceEvent();
if (event.changedTouches) event = event.changedTouches[0];
return point$5(node, event);
}
function none$2() {}
function selector(selector) {
return selector == null ? none$2 : function() {
return this.querySelector(selector);
};
}
function selection_select(select) {
if (typeof select !== "function") select = selector(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
}
}
}
return new Selection(subgroups, this._parents);
}
function empty() {
return [];
}
function selectorAll(selector) {
return selector == null ? empty : function() {
return this.querySelectorAll(selector);
};
}
function selection_selectAll(select) {
if (typeof select !== "function") select = selectorAll(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
subgroups.push(select.call(node, node.__data__, i, group));
parents.push(node);
}
}
}
return new Selection(subgroups, parents);
}
function selection_filter(match) {
if (typeof match !== "function") match = matcher$1(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Selection(subgroups, this._parents);
}
function sparse(update) {
return new Array(update.length);
}
function selection_enter() {
return new Selection(this._enter || this._groups.map(sparse), this._parents);
}
function EnterNode(parent, datum) {
this.ownerDocument = parent.ownerDocument;
this.namespaceURI = parent.namespaceURI;
this._next = null;
this._parent = parent;
this.__data__ = datum;
}
EnterNode.prototype = {
constructor: EnterNode,
appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
querySelector: function(selector) { return this._parent.querySelector(selector); },
querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
};
function constant$4(x) {
return function() {
return x;
};
}
var keyPrefix = "$"; // Protect against keys like “__proto__”.
function bindIndex(parent, group, enter, update, exit, data) {
var i = 0,
node,
groupLength = group.length,
dataLength = data.length;
// Put any non-null nodes that fit into update.
// Put any null nodes into enter.
// Put any remaining data into enter.
for (; i < dataLength; ++i) {
if (node = group[i]) {
node.__data__ = data[i];
update[i] = node;
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
// Put any non-null nodes that don’t fit into exit.
for (; i < groupLength; ++i) {
if (node = group[i]) {
exit[i] = node;
}
}
}
function bindKey(parent, group, enter, update, exit, data, key) {
var i,
node,
nodeByKeyValue = {},
groupLength = group.length,
dataLength = data.length,
keyValues = new Array(groupLength),
keyValue;
// Compute the key for each node.
// If multiple nodes have the same key, the duplicates are added to exit.
for (i = 0; i < groupLength; ++i) {
if (node = group[i]) {
keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
if (keyValue in nodeByKeyValue) {
exit[i] = node;
} else {
nodeByKeyValue[keyValue] = node;
}
}
}
// Compute the key for each datum.
// If there a node associated with this key, join and add it to update.
// If there is not (or the key is a duplicate), add it to enter.
for (i = 0; i < dataLength; ++i) {
keyValue = keyPrefix + key.call(parent, data[i], i, data);
if (node = nodeByKeyValue[keyValue]) {
update[i] = node;
node.__data__ = data[i];
nodeByKeyValue[keyValue] = null;
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
// Add any remaining nodes that were not bound to data to exit.
for (i = 0; i < groupLength; ++i) {
if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
exit[i] = node;
}
}
}
function selection_data(value, key) {
if (!value) {
data = new Array(this.size()), j = -1;
this.each(function(d) { data[++j] = d; });
return data;
}
var bind = key ? bindKey : bindIndex,
parents = this._parents,
groups = this._groups;
if (typeof value !== "function") value = constant$4(value);
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
var parent = parents[j],
group = groups[j],
groupLength = group.length,
data = value.call(parent, parent && parent.__data__, j, parents),
dataLength = data.length,
enterGroup = enter[j] = new Array(dataLength),
updateGroup = update[j] = new Array(dataLength),
exitGroup = exit[j] = new Array(groupLength);
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
// Now connect the enter nodes to their following update node, such that
// appendChild can insert the materialized enter node before this node,
// rather than at the end of the parent node.
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
if (previous = enterGroup[i0]) {
if (i0 >= i1) i1 = i0 + 1;
while (!(next = updateGroup[i1]) && ++i1 < dataLength);
previous._next = next || null;
}
}
}
update = new Selection(update, parents);
update._enter = enter;
update._exit = exit;
return update;
}
function selection_exit() {
return new Selection(this._exit || this._groups.map(sparse), this._parents);
}
function selection_merge(selection) {
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Selection(merges, this._parents);
}
function selection_order() {
for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
if (node = group[i]) {
if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
next = node;
}
}
}
return this;
}
function selection_sort(compare) {
if (!compare) compare = ascending$2;
function compareNode(a, b) {
return a && b ? compare(a.__data__, b.__data__) : !a - !b;
}
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group[i]) {
sortgroup[i] = node;
}
}
sortgroup.sort(compareNode);
}
return new Selection(sortgroups, this._parents).order();
}
function ascending$2(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
function selection_call() {
var callback = arguments[0];
arguments[0] = this;
callback.apply(null, arguments);
return this;
}
function selection_nodes() {
var nodes = new Array(this.size()), i = -1;
this.each(function() { nodes[++i] = this; });
return nodes;
}
function selection_node() {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
var node = group[i];
if (node) return node;
}
}
return null;
}
function selection_size() {
var size = 0;
this.each(function() { ++size; });
return size;
}
function selection_empty() {
return !this.node();
}
function selection_each(callback) {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
if (node = group[i]) callback.call(node, node.__data__, i, group);
}
}
return this;
}
function attrRemove(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant(name, value) {
return function() {
this.setAttribute(name, value);
};
}
function attrConstantNS(fullname, value) {
return function() {
this.setAttributeNS(fullname.space, fullname.local, value);
};
}
function attrFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttribute(name);
else this.setAttribute(name, v);
};
}
function attrFunctionNS(fullname, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
else this.setAttributeNS(fullname.space, fullname.local, v);
};
}
function selection_attr(name, value) {
var fullname = namespace(name);
if (arguments.length < 2) {
var node = this.node();
return fullname.local
? node.getAttributeNS(fullname.space, fullname.local)
: node.getAttribute(fullname);
}
return this.each((value == null
? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
? (fullname.local ? attrFunctionNS : attrFunction)
: (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
}
function window$1(node) {
return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
|| (node.document && node) // node is a Window
|| node.defaultView; // node is a Document
}
function styleRemove(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant(name, value, priority) {
return function() {
this.style.setProperty(name, value, priority);
};
}
function styleFunction(name, value, priority) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.style.removeProperty(name);
else this.style.setProperty(name, v, priority);
};
}
function selection_style(name, value, priority) {
var node;
return arguments.length > 1
? this.each((value == null
? styleRemove : typeof value === "function"
? styleFunction
: styleConstant)(name, value, priority == null ? "" : priority))
: window$1(node = this.node())
.getComputedStyle(node, null)
.getPropertyValue(name);
}
function propertyRemove(name) {
return function() {
delete this[name];
};
}
function propertyConstant(name, value) {
return function() {
this[name] = value;
};
}
function propertyFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) delete this[name];
else this[name] = v;
};
}
function selection_property(name, value) {
return arguments.length > 1
? this.each((value == null
? propertyRemove : typeof value === "function"
? propertyFunction
: propertyConstant)(name, value))
: this.node()[name];
}
function classArray(string) {
return string.trim().split(/^|\s+/);
}
function classList(node) {
return node.classList || new ClassList(node);
}
function ClassList(node) {
this._node = node;
this._names = classArray(node.getAttribute("class") || "");
}
ClassList.prototype = {
add: function(name) {
var i = this._names.indexOf(name);
if (i < 0) {
this._names.push(name);
this._node.setAttribute("class", this._names.join(" "));
}
},
remove: function(name) {
var i = this._names.indexOf(name);
if (i >= 0) {
this._names.splice(i, 1);
this._node.setAttribute("class", this._names.join(" "));
}
},
contains: function(name) {
return this._names.indexOf(name) >= 0;
}
};
function classedAdd(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.add(names[i]);
}
function classedRemove(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.remove(names[i]);
}
function classedTrue(names) {
return function() {
classedAdd(this, names);
};
}
function classedFalse(names) {
return function() {
classedRemove(this, names);
};
}
function classedFunction(names, value) {
return function() {
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
};
}
function selection_classed(name, value) {
var names = classArray(name + "");
if (arguments.length < 2) {
var list = classList(this.node()), i = -1, n = names.length;
while (++i < n) if (!list.contains(names[i])) return false;
return true;
}
return this.each((typeof value === "function"
? classedFunction : value
? classedTrue
: classedFalse)(names, value));
}
function textRemove() {
this.textContent = "";
}
function textConstant(value) {
return function() {
this.textContent = value;
};
}
function textFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
};
}
function selection_text(value) {
return arguments.length
? this.each(value == null
? textRemove : (typeof value === "function"
? textFunction
: textConstant)(value))
: this.node().textContent;
}
function htmlRemove() {
this.innerHTML = "";
}
function htmlConstant(value) {
return function() {
this.innerHTML = value;
};
}
function htmlFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.innerHTML = v == null ? "" : v;
};
}
function selection_html(value) {
return arguments.length
? this.each(value == null
? htmlRemove : (typeof value === "function"
? htmlFunction
: htmlConstant)(value))
: this.node().innerHTML;
}
function raise$1() {
if (this.nextSibling) this.parentNode.appendChild(this);
}
function selection_raise() {
return this.each(raise$1);
}
function lower() {
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
}
function selection_lower() {
return this.each(lower);
}
function selection_append(name) {
var create = typeof name === "function" ? name : creator(name);
return this.select(function() {
return this.appendChild(create.apply(this, arguments));
});
}
function constantNull() {
return null;
}
function selection_insert(name, before) {
var create = typeof name === "function" ? name : creator(name),
select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
return this.select(function() {
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
});
}
function remove() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
}
function selection_remove() {
return this.each(remove);
}
function selection_datum(value) {
return arguments.length
? this.property("__data__", value)
: this.node().__data__;
}
function dispatchEvent(node, type, params) {
var window = window$1(node),
event = window.CustomEvent;
if (event) {
event = new event(type, params);
} else {
event = window.document.createEvent("Event");
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
else event.initEvent(type, false, false);
}
node.dispatchEvent(event);
}
function dispatchConstant(type, params) {
return function() {
return dispatchEvent(this, type, params);
};
}
function dispatchFunction(type, params) {
return function() {
return dispatchEvent(this, type, params.apply(this, arguments));
};
}
function selection_dispatch(type, params) {
return this.each((typeof params === "function"
? dispatchFunction
: dispatchConstant)(type, params));
}
var root = [null];
function Selection(groups, parents) {
this._groups = groups;
this._parents = parents;
}
function selection() {
return new Selection([[document.documentElement]], root);
}
Selection.prototype = selection.prototype = {
constructor: Selection,
select: selection_select,
selectAll: selection_selectAll,
filter: selection_filter,
data: selection_data,
enter: selection_enter,
exit: selection_exit,
merge: selection_merge,
order: selection_order,
sort: selection_sort,
call: selection_call,
nodes: selection_nodes,
node: selection_node,
size: selection_size,
empty: selection_empty,
each: selection_each,
attr: selection_attr,
style: selection_style,
property: selection_property,
classed: selection_classed,
text: selection_text,
html: selection_html,
raise: selection_raise,
lower: selection_lower,
append: selection_append,
insert: selection_insert,
remove: selection_remove,
datum: selection_datum,
on: selection_on,
dispatch: selection_dispatch
};
function select(selector) {
return typeof selector === "string"
? new Selection([[document.querySelector(selector)]], [document.documentElement])
: new Selection([[selector]], root);
}
function selectAll(selector) {
return typeof selector === "string"
? new Selection([document.querySelectorAll(selector)], [document.documentElement])
: new Selection([selector == null ? [] : selector], root);
}
function touch(node, touches, identifier) {
if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
if ((touch = touches[i]).identifier === identifier) {
return point$5(node, touch);
}
}
return null;
}
function touches(node, touches) {
if (touches == null) touches = sourceEvent().touches;
for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
points[i] = point$5(node, touches[i]);
}
return points;
}
var emptyOn = dispatch("start", "end", "interrupt");
var emptyTween = [];
var CREATED = 0;
var SCHEDULED = 1;
var STARTING = 2;
var STARTED = 3;
var ENDING = 4;
var ENDED = 5;
function schedule(node, name, id, index, group, timing) {
var schedules = node.__transition;
if (!schedules) node.__transition = {};
else if (id in schedules) return;
create(node, id, {
name: name,
index: index, // For context during callback.
group: group, // For context during callback.
on: emptyOn,
tween: emptyTween,
time: timing.time,
delay: timing.delay,
duration: timing.duration,
ease: timing.ease,
timer: null,
state: CREATED
});
}
function init(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
return schedule;
}
function set$2(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
return schedule;
}
function get$1(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
return schedule;
}
function create(node, id, self) {
var schedules = node.__transition,
tween;
// Initialize the self timer when the transition is created.
// Note the actual delay is not known until the first callback!
schedules[id] = self;
self.timer = timer(schedule, 0, self.time);
// If the delay is greater than this first sleep, sleep some more;
// otherwise, start immediately.
function schedule(elapsed) {
self.state = SCHEDULED;
if (self.delay <= elapsed) start(elapsed - self.delay);
else self.timer.restart(start, self.delay, self.time);
}
function start(elapsed) {
var i, j, n, o;
for (i in schedules) {
o = schedules[i];
if (o.name !== self.name) continue;
// Interrupt the active transition, if any.
// Dispatch the interrupt event.
if (o.state === STARTED) {
o.state = ENDED;
o.timer.stop();
o.on.call("interrupt", node, node.__data__, o.index, o.group);
delete schedules[i];
}
// Cancel any pre-empted transitions. No interrupt event is dispatched
// because the cancelled transitions never started. Note that this also
// removes this transition from the pending list!
else if (+i < id) {
o.state = ENDED;
o.timer.stop();
delete schedules[i];
}
}
// Defer the first tick to end of the current frame; see mbostock/d3#1576.
// Note the transition may be canceled after start and before the first tick!
// Note this must be scheduled before the start event; see d3/d3-transition#16!
// Assuming this is successful, subsequent callbacks go straight to tick.
timeout$1(function() {
if (self.state === STARTED) {
self.timer.restart(tick, self.delay, self.time);
tick(elapsed);
}
});
// Dispatch the start event.
// Note this must be done before the tween are initialized.
self.state = STARTING;
self.on.call("start", node, node.__data__, self.index, self.group);
if (self.state !== STARTING) return; // interrupted
self.state = STARTED;
// Initialize the tween, deleting null tween.
tween = new Array(n = self.tween.length);
for (i = 0, j = -1; i < n; ++i) {
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
tween[++j] = o;
}
}
tween.length = j + 1;
}
function tick(elapsed) {
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.state = ENDING, 1),
i = -1,
n = tween.length;
while (++i < n) {
tween[i].call(null, t);
}
// Dispatch the end event.
if (self.state === ENDING) {
self.state = ENDED;
self.timer.stop();
self.on.call("end", node, node.__data__, self.index, self.group);
for (i in schedules) if (+i !== id) return void delete schedules[id];
delete node.__transition;
}
}
}
function interrupt(node, name) {
var schedules = node.__transition,
schedule,
active,
empty = true,
i;
if (!schedules) return;
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
active = schedule.state === STARTED;
schedule.state = ENDED;
schedule.timer.stop();
if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group);
delete schedules[i];
}
if (empty) delete node.__transition;
}
function selection_interrupt(name) {
return this.each(function() {
interrupt(this, name);
});
}
function tweenRemove(id, name) {
var tween0, tween1;
return function() {
var schedule = set$2(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and we’re done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = tween0 = tween;
for (var i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1 = tween1.slice();
tween1.splice(i, 1);
break;
}
}
}
schedule.tween = tween1;
};
}
function tweenFunction(id, name, value) {
var tween0, tween1;
if (typeof value !== "function") throw new Error;
return function() {
var schedule = set$2(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and we’re done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = (tween0 = tween).slice();
for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1[i] = t;
break;
}
}
if (i === n) tween1.push(t);
}
schedule.tween = tween1;
};
}
function transition_tween(name, value) {
var id = this._id;
name += "";
if (arguments.length < 2) {
var tween = get$1(this.node(), id).tween;
for (var i = 0, n = tween.length, t; i < n; ++i) {
if ((t = tween[i]).name === name) {
return t.value;
}
}
return null;
}
return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
}
function tweenValue(transition, name, value) {
var id = transition._id;
transition.each(function() {
var schedule = set$2(this, id);
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
});
return function(node) {
return get$1(node, id).value[name];
};
}
function interpolate$1(a, b) {
var c;
return (typeof b === "number" ? interpolateNumber
: b instanceof color ? interpolateRgb
: (c = color(b)) ? (b = c, interpolateRgb)
: interpolateString)(a, b);
}
function attrRemove$1(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS$1(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant$1(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrConstantNS$1(fullname, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrFunction$1(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttribute(name);
value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function attrFunctionNS$1(fullname, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function transition_attr(name, value) {
var fullname = namespace(name), i = fullname === "transform" ? interpolateTransform$2 : interpolate$1;
return this.attrTween(name, typeof value === "function"
? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
: value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
: (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
}
function attrTweenNS(fullname, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttributeNS(fullname.space, fullname.local, i(t));
};
}
tween._value = value;
return tween;
}
function attrTween(name, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttribute(name, i(t));
};
}
tween._value = value;
return tween;
}
function transition_attrTween(name, value) {
var key = "attr." + name;
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
var fullname = namespace(name);
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
}
function delayFunction(id, value) {
return function() {
init(this, id).delay = +value.apply(this, arguments);
};
}
function delayConstant(id, value) {
return value = +value, function() {
init(this, id).delay = value;
};
}
function transition_delay(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? delayFunction
: delayConstant)(id, value))
: get$1(this.node(), id).delay;
}
function durationFunction(id, value) {
return function() {
set$2(this, id).duration = +value.apply(this, arguments);
};
}
function durationConstant(id, value) {
return value = +value, function() {
set$2(this, id).duration = value;
};
}
function transition_duration(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? durationFunction
: durationConstant)(id, value))
: get$1(this.node(), id).duration;
}
function easeConstant(id, value) {
if (typeof value !== "function") throw new Error;
return function() {
set$2(this, id).ease = value;
};
}
function transition_ease(value) {
var id = this._id;
return arguments.length
? this.each(easeConstant(id, value))
: get$1(this.node(), id).ease;
}
function transition_filter(match) {
if (typeof match !== "function") match = matcher$1(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Transition(subgroups, this._parents, this._name, this._id);
}
function transition_merge(transition) {
if (transition._id !== this._id) throw new Error;
for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Transition(merges, this._parents, this._name, this._id);
}
function start$1(name) {
return (name + "").trim().split(/^|\s+/).every(function(t) {
var i = t.indexOf(".");
if (i >= 0) t = t.slice(0, i);
return !t || t === "start";
});
}
function onFunction(id, name, listener) {
var on0, on1, sit = start$1(name) ? init : set$2;
return function() {
var schedule = sit(this, id),
on = schedule.on;
// If this node shared a dispatch with the previous node,
// just assign the updated shared dispatch and we’re done!
// Otherwise, copy-on-write.
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
schedule.on = on1;
};
}
function transition_on(name, listener) {
var id = this._id;
return arguments.length < 2
? get$1(this.node(), id).on.on(name)
: this.each(onFunction(id, name, listener));
}
function removeFunction(id) {
return function() {
var parent = this.parentNode;
for (var i in this.__transition) if (+i !== id) return;
if (parent) parent.removeChild(this);
};
}
function transition_remove() {
return this.on("end.remove", removeFunction(this._id));
}
function transition_select(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = selector(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
}
}
}
return new Transition(subgroups, this._parents, name, id);
}
function transition_selectAll(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = selectorAll(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
if (child = children[k]) {
schedule(child, name, id, k, children, inherit);
}
}
subgroups.push(children);
parents.push(node);
}
}
}
return new Transition(subgroups, parents, name, id);
}
var Selection$1 = selection.prototype.constructor;
function transition_selection() {
return new Selection$1(this._groups, this._parents);
}
function styleRemove$1(name, interpolate) {
var value00,
value10,
interpolate0;
return function() {
var style = window$1(this).getComputedStyle(this, null),
value0 = style.getPropertyValue(name),
value1 = (this.style.removeProperty(name), style.getPropertyValue(name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function styleRemoveEnd(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant$1(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = window$1(this).getComputedStyle(this, null).getPropertyValue(name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function styleFunction$1(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var style = window$1(this).getComputedStyle(this, null),
value0 = style.getPropertyValue(name),
value1 = value(this);
if (value1 == null) value1 = (this.style.removeProperty(name), style.getPropertyValue(name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function transition_style(name, value, priority) {
var i = (name += "") === "transform" ? interpolateTransform$1 : interpolate$1;
return value == null ? this
.styleTween(name, styleRemove$1(name, i))
.on("end.style." + name, styleRemoveEnd(name))
: this.styleTween(name, typeof value === "function"
? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
: styleConstant$1(name, i, value), priority);
}
function styleTween(name, value, priority) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.style.setProperty(name, i(t), priority);
};
}
tween._value = value;
return tween;
}
function transition_styleTween(name, value, priority) {
var key = "style." + (name += "");
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
}
function textConstant$1(value) {
return function() {
this.textContent = value;
};
}
function textFunction$1(value) {
return function() {
var value1 = value(this);
this.textContent = value1 == null ? "" : value1;
};
}
function transition_text(value) {
return this.tween("text", typeof value === "function"
? textFunction$1(tweenValue(this, "text", value))
: textConstant$1(value == null ? "" : value + ""));
}
function transition_transition() {
var name = this._name,
id0 = this._id,
id1 = newId();
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
var inherit = get$1(node, id0);
schedule(node, name, id1, i, group, {
time: inherit.time + inherit.delay + inherit.duration,
delay: 0,
duration: inherit.duration,
ease: inherit.ease
});
}
}
}
return new Transition(groups, this._parents, name, id1);
}
var id = 0;
function Transition(groups, parents, name, id) {
this._groups = groups;
this._parents = parents;
this._name = name;
this._id = id;
}
function transition(name) {
return selection().transition(name);
}
function newId() {
return ++id;
}
var selection_prototype = selection.prototype;
Transition.prototype = transition.prototype = {
constructor: Transition,
select: transition_select,
selectAll: transition_selectAll,
filter: transition_filter,
merge: transition_merge,
selection: transition_selection,
transition: transition_transition,
call: selection_prototype.call,
nodes: selection_prototype.nodes,
node: selection_prototype.node,
size: selection_prototype.size,
empty: selection_prototype.empty,
each: selection_prototype.each,
on: transition_on,
attr: transition_attr,
attrTween: transition_attrTween,
style: transition_style,
styleTween: transition_styleTween,
text: transition_text,
remove: transition_remove,
tween: transition_tween,
delay: transition_delay,
duration: transition_duration,
ease: transition_ease
};
var defaultTiming = {
time: null, // Set on use.
delay: 0,
duration: 250,
ease: easeCubicInOut
};
function inherit(node, id) {
var timing;
while (!(timing = node.__transition) || !(timing = timing[id])) {
if (!(node = node.parentNode)) {
return defaultTiming.time = now(), defaultTiming;
}
}
return timing;
}
function selection_transition(name) {
var id,
timing;
if (name instanceof Transition) {
id = name._id, name = name._name;
} else {
id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
}
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
schedule(node, name, id, i, group, timing || inherit(node, id));
}
}
}
return new Transition(groups, this._parents, name, id);
}
selection.prototype.interrupt = selection_interrupt;
selection.prototype.transition = selection_transition;
var root$1 = [null];
function active(node, name) {
var schedules = node.__transition,
schedule,
i;
if (schedules) {
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
return new Transition([[node]], root$1, name, +i);
}
}
}
return null;
}
var slice$4 = Array.prototype.slice;
function identity$5(x) {
return x;
}
var top = 1;
var right = 2;
var bottom = 3;
var left = 4;
var epsilon$2 = 1e-6;
function translateX(scale0, scale1, d) {
var x = scale0(d);
return "translate(" + (isFinite(x) ? x : scale1(d)) + ",0)";
}
function translateY(scale0, scale1, d) {
var y = scale0(d);
return "translate(0," + (isFinite(y) ? y : scale1(d)) + ")";
}
function center(scale) {
var offset = scale.bandwidth() / 2;
if (scale.round()) offset = Math.round(offset);
return function(d) {
return scale(d) + offset;
};
}
function entering() {
return !this.__axis;
}
function axis(orient, scale) {
var tickArguments = [],
tickValues = null,
tickFormat = null,
tickSizeInner = 6,
tickSizeOuter = 6,
tickPadding = 3;
function axis(context) {
var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$5) : tickFormat,
spacing = Math.max(tickSizeInner, 0) + tickPadding,
transform = orient === top || orient === bottom ? translateX : translateY,
range = scale.range(),
range0 = range[0] + 0.5,
range1 = range[range.length - 1] + 0.5,
position = (scale.bandwidth ? center : identity$5)(scale.copy()),
selection = context.selection ? context.selection() : context,
path = selection.selectAll(".domain").data([null]),
tick = selection.selectAll(".tick").data(values, scale).order(),
tickExit = tick.exit(),
tickEnter = tick.enter().append("g").attr("class", "tick"),
line = tick.select("line"),
text = tick.select("text"),
k = orient === top || orient === left ? -1 : 1,
x, y = orient === left || orient === right ? (x = "x", "y") : (x = "y", "x");
path = path.merge(path.enter().insert("path", ".tick")
.attr("class", "domain")
.attr("stroke", "#000"));
tick = tick.merge(tickEnter);
line = line.merge(tickEnter.append("line")
.attr("stroke", "#000")
.attr(x + "2", k * tickSizeInner)
.attr(y + "1", 0.5)
.attr(y + "2", 0.5));
text = text.merge(tickEnter.append("text")
.attr("fill", "#000")
.attr(x, k * spacing)
.attr(y, 0.5)
.attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
if (context !== selection) {
path = path.transition(context);
tick = tick.transition(context);
line = line.transition(context);
text = text.transition(context);
tickExit = tickExit.transition(context)
.attr("opacity", epsilon$2)
.attr("transform", function(d) { return transform(position, this.parentNode.__axis || position, d); });
tickEnter
.attr("opacity", epsilon$2)
.attr("transform", function(d) { return transform(this.parentNode.__axis || position, position, d); });
}
tickExit.remove();
path
.attr("d", orient === left || orient == right
? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
: "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
tick
.attr("opacity", 1)
.attr("transform", function(d) { return transform(position, position, d); });
line
.attr(x + "2", k * tickSizeInner);
text
.attr(x, k * spacing)
.text(format);
selection.filter(entering)
.attr("fill", "none")
.attr("font-size", 10)
.attr("font-family", "sans-serif")
.attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
selection
.each(function() { this.__axis = position; });
}
axis.scale = function(_) {
return arguments.length ? (scale = _, axis) : scale;
};
axis.ticks = function() {
return tickArguments = slice$4.call(arguments), axis;
};
axis.tickArguments = function(_) {
return arguments.length ? (tickArguments = _ == null ? [] : slice$4.call(_), axis) : tickArguments.slice();
};
axis.tickValues = function(_) {
return arguments.length ? (tickValues = _ == null ? null : slice$4.call(_), axis) : tickValues && tickValues.slice();
};
axis.tickFormat = function(_) {
return arguments.length ? (tickFormat = _, axis) : tickFormat;
};
axis.tickSize = function(_) {
return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
};
axis.tickSizeInner = function(_) {
return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
};
axis.tickSizeOuter = function(_) {
return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
};
axis.tickPadding = function(_) {
return arguments.length ? (tickPadding = +_, axis) : tickPadding;
};
return axis;
}
function axisTop(scale) {
return axis(top, scale);
}
function axisRight(scale) {
return axis(right, scale);
}
function axisBottom(scale) {
return axis(bottom, scale);
}
function axisLeft(scale) {
return axis(left, scale);
}
function defaultSeparation(a, b) {
return a.parent === b.parent ? 1 : 2;
}
function meanX(children) {
return children.reduce(meanXReduce, 0) / children.length;
}
function meanXReduce(x, c) {
return x + c.x;
}
function maxY(children) {
return 1 + children.reduce(maxYReduce, 0);
}
function maxYReduce(y, c) {
return Math.max(y, c.y);
}
function leafLeft(node) {
var children;
while (children = node.children) node = children[0];
return node;
}
function leafRight(node) {
var children;
while (children = node.children) node = children[children.length - 1];
return node;
}
function cluster() {
var separation = defaultSeparation,
dx = 1,
dy = 1,
nodeSize = false;
function cluster(root) {
var previousNode,
x = 0;
// First walk, computing the initial x & y values.
root.eachAfter(function(node) {
var children = node.children;
if (children) {
node.x = meanX(children);
node.y = maxY(children);
} else {
node.x = previousNode ? x += separation(node, previousNode) : 0;
node.y = 0;
previousNode = node;
}
});
var left = leafLeft(root),
right = leafRight(root),
x0 = left.x - separation(left, right) / 2,
x1 = right.x + separation(right, left) / 2;
// Second walk, normalizing x & y to the desired size.
return root.eachAfter(nodeSize ? function(node) {
node.x = (node.x - root.x) * dx;
node.y = (root.y - node.y) * dy;
} : function(node) {
node.x = (node.x - x0) / (x1 - x0) * dx;
node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
});
}
cluster.separation = function(x) {
return arguments.length ? (separation = x, cluster) : separation;
};
cluster.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
};
cluster.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
};
return cluster;
}
function node_each(callback) {
var node = this, current, next = [node], children, i, n;
do {
current = next.reverse(), next = [];
while (node = current.pop()) {
callback(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
next.push(children[i]);
}
}
} while (next.length);
return this;
}
function node_eachBefore(callback) {
var node = this, nodes = [node], children, i;
while (node = nodes.pop()) {
callback(node), children = node.children;
if (children) for (i = children.length - 1; i >= 0; --i) {
nodes.push(children[i]);
}
}
return this;
}
function node_eachAfter(callback) {
var node = this, nodes = [node], next = [], children, i, n;
while (node = nodes.pop()) {
next.push(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
nodes.push(children[i]);
}
}
while (node = next.pop()) {
callback(node);
}
return this;
}
function node_sum(value) {
return this.eachAfter(function(node) {
var sum = +value(node.data) || 0,
children = node.children,
i = children && children.length;
while (--i >= 0) sum += children[i].value;
node.value = sum;
});
}
function node_sort(compare) {
return this.eachBefore(function(node) {
if (node.children) {
node.children.sort(compare);
}
});
}
function node_path(end) {
var start = this,
ancestor = leastCommonAncestor(start, end),
nodes = [start];
while (start !== ancestor) {
start = start.parent;
nodes.push(start);
}
var k = nodes.length;
while (end !== ancestor) {
nodes.splice(k, 0, end);
end = end.parent;
}
return nodes;
}
function leastCommonAncestor(a, b) {
if (a === b) return a;
var aNodes = a.ancestors(),
bNodes = b.ancestors(),
c = null;
a = aNodes.pop();
b = bNodes.pop();
while (a === b) {
c = a;
a = aNodes.pop();
b = bNodes.pop();
}
return c;
}
function node_ancestors() {
var node = this, nodes = [node];
while (node = node.parent) {
nodes.push(node);
}
return nodes;
}
function node_descendants() {
var nodes = [];
this.each(function(node) {
nodes.push(node);
});
return nodes;
}
function node_leaves() {
var leaves = [];
this.eachBefore(function(node) {
if (!node.children) {
leaves.push(node);
}
});
return leaves;
}
function node_links() {
var root = this, links = [];
root.each(function(node) {
if (node !== root) { // Don’t include the root’s parent, if any.
links.push({source: node.parent, target: node});
}
});
return links;
}
function hierarchy(data, children) {
var root = new Node(data),
valued = +data.value && (root.value = data.value),
node,
nodes = [root],
child,
childs,
i,
n;
if (children == null) children = defaultChildren;
while (node = nodes.pop()) {
if (valued) node.value = +node.data.value;
if ((childs = children(node.data)) && (n = childs.length)) {
node.children = new Array(n);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new Node(childs[i]));
child.parent = node;
child.depth = node.depth + 1;
}
}
}
return root.eachBefore(computeHeight);
}
function node_copy() {
return hierarchy(this).eachBefore(copyData);
}
function defaultChildren(d) {
return d.children;
}
function copyData(node) {
node.data = node.data.data;
}
function computeHeight(node) {
var height = 0;
do node.height = height;
while ((node = node.parent) && (node.height < ++height));
}
function Node(data) {
this.data = data;
this.depth =
this.height = 0;
this.parent = null;
}
Node.prototype = hierarchy.prototype = {
constructor: Node,
each: node_each,
eachAfter: node_eachAfter,
eachBefore: node_eachBefore,
sum: node_sum,
sort: node_sort,
path: node_path,
ancestors: node_ancestors,
descendants: node_descendants,
leaves: node_leaves,
links: node_links,
copy: node_copy
};
function Node$2(value) {
this._ = value;
this.next = null;
}
function shuffle$1(array) {
var i,
n = (array = array.slice()).length,
head = null,
node = head;
while (n) {
var next = new Node$2(array[n - 1]);
if (node) node = node.next = next;
else node = head = next;
array[i] = array[--n];
}
return {
head: head,
tail: node
};
}
function enclose(circles) {
return encloseN(shuffle$1(circles), []);
}
function encloses(a, b) {
var dx = b.x - a.x,
dy = b.y - a.y,
dr = a.r - b.r;
return dr * dr + 1e-6 > dx * dx + dy * dy;
}
// Returns the smallest circle that contains circles L and intersects circles B.
function encloseN(L, B) {
var circle,
l0 = null,
l1 = L.head,
l2,
p1;
switch (B.length) {
case 1: circle = enclose1(B[0]); break;
case 2: circle = enclose2(B[0], B[1]); break;
case 3: circle = enclose3(B[0], B[1], B[2]); break;
}
while (l1) {
p1 = l1._, l2 = l1.next;
if (!circle || !encloses(circle, p1)) {
// Temporarily truncate L before l1.
if (l0) L.tail = l0, l0.next = null;
else L.head = L.tail = null;
B.push(p1);
circle = encloseN(L, B); // Note: reorders L!
B.pop();
// Move l1 to the front of L and reconnect the truncated list L.
if (L.head) l1.next = L.head, L.head = l1;
else l1.next = null, L.head = L.tail = l1;
l0 = L.tail, l0.next = l2;
} else {
l0 = l1;
}
l1 = l2;
}
L.tail = l0;
return circle;
}
function enclose1(a) {
return {
x: a.x,
y: a.y,
r: a.r
};
}
function enclose2(a, b) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
l = Math.sqrt(x21 * x21 + y21 * y21);
return {
x: (x1 + x2 + x21 / l * r21) / 2,
y: (y1 + y2 + y21 / l * r21) / 2,
r: (l + r1 + r2) / 2
};
}
function enclose3(a, b, c) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x3 = c.x, y3 = c.y, r3 = c.r,
a2 = 2 * (x1 - x2),
b2 = 2 * (y1 - y2),
c2 = 2 * (r2 - r1),
d2 = x1 * x1 + y1 * y1 - r1 * r1 - x2 * x2 - y2 * y2 + r2 * r2,
a3 = 2 * (x1 - x3),
b3 = 2 * (y1 - y3),
c3 = 2 * (r3 - r1),
d3 = x1 * x1 + y1 * y1 - r1 * r1 - x3 * x3 - y3 * y3 + r3 * r3,
ab = a3 * b2 - a2 * b3,
xa = (b2 * d3 - b3 * d2) / ab - x1,
xb = (b3 * c2 - b2 * c3) / ab,
ya = (a3 * d2 - a2 * d3) / ab - y1,
yb = (a2 * c3 - a3 * c2) / ab,
A = xb * xb + yb * yb - 1,
B = 2 * (xa * xb + ya * yb + r1),
C = xa * xa + ya * ya - r1 * r1,
r = (-B - Math.sqrt(B * B - 4 * A * C)) / (2 * A);
return {
x: xa + xb * r + x1,
y: ya + yb * r + y1,
r: r
};
}
function place(a, b, c) {
var ax = a.x,
ay = a.y,
da = b.r + c.r,
db = a.r + c.r,
dx = b.x - ax,
dy = b.y - ay,
dc = dx * dx + dy * dy;
if (dc) {
var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
c.x = ax + x * dx + y * dy;
c.y = ay + x * dy - y * dx;
} else {
c.x = ax + db;
c.y = ay;
}
}
function intersects(a, b) {
var dx = b.x - a.x,
dy = b.y - a.y,
dr = a.r + b.r;
return dr * dr > dx * dx + dy * dy;
}
function distance2(circle, x, y) {
var dx = circle.x - x,
dy = circle.y - y;
return dx * dx + dy * dy;
}
function Node$1(circle) {
this._ = circle;
this.next = null;
this.previous = null;
}
function packEnclose(circles) {
if (!(n = circles.length)) return 0;
var a, b, c, n;
// Place the first circle.
a = circles[0], a.x = 0, a.y = 0;
if (!(n > 1)) return a.r;
// Place the second circle.
b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
if (!(n > 2)) return a.r + b.r;
// Place the third circle.
place(b, a, c = circles[2]);
// Initialize the weighted centroid.
var aa = a.r * a.r,
ba = b.r * b.r,
ca = c.r * c.r,
oa = aa + ba + ca,
ox = aa * a.x + ba * b.x + ca * c.x,
oy = aa * a.y + ba * b.y + ca * c.y,
cx, cy, i, j, k, sj, sk;
// Initialize the front-chain using the first three circles a, b and c.
a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
a.next = c.previous = b;
b.next = a.previous = c;
c.next = b.previous = a;
// Attempt to place each remaining circle…
pack: for (i = 3; i < n; ++i) {
place(a._, b._, c = circles[i]), c = new Node$1(c);
// If there are only three elements in the front-chain…
if ((k = a.previous) === (j = b.next)) {
// If the new circle intersects the third circle,
// rotate the front chain to try the next position.
if (intersects(j._, c._)) {
a = b, b = j, --i;
continue pack;
}
}
// Find the closest intersecting circle on the front-chain, if any.
else {
sj = j._.r, sk = k._.r;
do {
if (sj <= sk) {
if (intersects(j._, c._)) {
b = j, a.next = b, b.previous = a, --i;
continue pack;
}
j = j.next, sj += j._.r;
} else {
if (intersects(k._, c._)) {
a = k, a.next = b, b.previous = a, --i;
continue pack;
}
k = k.previous, sk += k._.r;
}
} while (j !== k.next);
}
// Success! Insert the new circle c between a and b.
c.previous = a, c.next = b, a.next = b.previous = b = c;
// Update the weighted centroid.
oa += ca = c._.r * c._.r;
ox += ca * c._.x;
oy += ca * c._.y;
// Compute the new closest circle a to centroid.
aa = distance2(a._, cx = ox / oa, cy = oy / oa);
while ((c = c.next) !== b) {
if ((ca = distance2(c._, cx, cy)) < aa) {
a = c, aa = ca;
}
}
b = a.next;
}
// Compute the enclosing circle of the front chain.
a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
// Translate the circles to put the enclosing circle around the origin.
for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
return c.r;
}
function siblings(circles) {
packEnclose(circles);
return circles;
}
function optional(f) {
return f == null ? null : required(f);
}
function required(f) {
if (typeof f !== "function") throw new Error;
return f;
}
function constantZero() {
return 0;
}
function constant$5(x) {
return function() {
return x;
};
}
function defaultRadius(d) {
return Math.sqrt(d.value);
}
function index() {
var radius = null,
dx = 1,
dy = 1,
padding = constantZero;
function pack(root) {
root.x = dx / 2, root.y = dy / 2;
if (radius) {
root.eachBefore(radiusLeaf(radius))
.eachAfter(packChildren(padding, 0.5))
.eachBefore(translateChild(1));
} else {
root.eachBefore(radiusLeaf(defaultRadius))
.eachAfter(packChildren(constantZero, 1))
.eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
.eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
}
return root;
}
pack.radius = function(x) {
return arguments.length ? (radius = optional(x), pack) : radius;
};
pack.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
};
pack.padding = function(x) {
return arguments.length ? (padding = typeof x === "function" ? x : constant$5(+x), pack) : padding;
};
return pack;
}
function radiusLeaf(radius) {
return function(node) {
if (!node.children) {
node.r = Math.max(0, +radius(node) || 0);
}
};
}
function packChildren(padding, k) {
return function(node) {
if (children = node.children) {
var children,
i,
n = children.length,
r = padding(node) * k || 0,
e;
if (r) for (i = 0; i < n; ++i) children[i].r += r;
e = packEnclose(children);
if (r) for (i = 0; i < n; ++i) children[i].r -= r;
node.r = e + r;
}
};
}
function translateChild(k) {
return function(node) {
var parent = node.parent;
node.r *= k;
if (parent) {
node.x = parent.x + k * node.x;
node.y = parent.y + k * node.y;
}
};
}
function roundNode(node) {
node.x0 = Math.round(node.x0);
node.y0 = Math.round(node.y0);
node.x1 = Math.round(node.x1);
node.y1 = Math.round(node.y1);
}
function treemapDice(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (x1 - x0) / parent.value;
while (++i < n) {
node = nodes[i], node.y0 = y0, node.y1 = y1;
node.x0 = x0, node.x1 = x0 += node.value * k;
}
}
function partition() {
var dx = 1,
dy = 1,
padding = 0,
round = false;
function partition(root) {
var n = root.height + 1;
root.x0 =
root.y0 = padding;
root.x1 = dx;
root.y1 = dy / n;
root.eachBefore(positionNode(dy, n));
if (round) root.eachBefore(roundNode);
return root;
}
function positionNode(dy, n) {
return function(node) {
if (node.children) {
treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
}
var x0 = node.x0,
y0 = node.y0,
x1 = node.x1 - padding,
y1 = node.y1 - padding;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
};
}
partition.round = function(x) {
return arguments.length ? (round = !!x, partition) : round;
};
partition.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
};
partition.padding = function(x) {
return arguments.length ? (padding = +x, partition) : padding;
};
return partition;
}
var keyPrefix$1 = "$";
var preroot = {depth: -1};
var ambiguous = {};
function defaultId(d) {
return d.id;
}
function defaultParentId(d) {
return d.parentId;
}
function stratify() {
var id = defaultId,
parentId = defaultParentId;
function stratify(data) {
var d,
i,
n = data.length,
root,
parent,
node,
nodes = new Array(n),
nodeId,
nodeKey,
nodeByKey = {};
for (i = 0; i < n; ++i) {
d = data[i], node = nodes[i] = new Node(d);
if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
nodeKey = keyPrefix$1 + (node.id = nodeId);
nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
}
}
for (i = 0; i < n; ++i) {
node = nodes[i], nodeId = parentId(data[i], i, data);
if (nodeId == null || !(nodeId += "")) {
if (root) throw new Error("multiple roots");
root = node;
} else {
parent = nodeByKey[keyPrefix$1 + nodeId];
if (!parent) throw new Error("missing: " + nodeId);
if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
if (parent.children) parent.children.push(node);
else parent.children = [node];
node.parent = parent;
}
}
if (!root) throw new Error("no root");
root.parent = preroot;
root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
root.parent = null;
if (n > 0) throw new Error("cycle");
return root;
}
stratify.id = function(x) {
return arguments.length ? (id = required(x), stratify) : id;
};
stratify.parentId = function(x) {
return arguments.length ? (parentId = required(x), stratify) : parentId;
};
return stratify;
}
function defaultSeparation$1(a, b) {
return a.parent === b.parent ? 1 : 2;
}
// function radialSeparation(a, b) {
// return (a.parent === b.parent ? 1 : 2) / a.depth;
// }
// This function is used to traverse the left contour of a subtree (or
// subforest). It returns the successor of v on this contour. This successor is
// either given by the leftmost child of v or by the thread of v. The function
// returns null if and only if v is on the highest level of its subtree.
function nextLeft(v) {
var children = v.children;
return children ? children[0] : v.t;
}
// This function works analogously to nextLeft.
function nextRight(v) {
var children = v.children;
return children ? children[children.length - 1] : v.t;
}
// Shifts the current subtree rooted at w+. This is done by increasing
// prelim(w+) and mod(w+) by shift.
function moveSubtree(wm, wp, shift) {
var change = shift / (wp.i - wm.i);
wp.c -= change;
wp.s += shift;
wm.c += change;
wp.z += shift;
wp.m += shift;
}
// All other shifts, applied to the smaller subtrees between w- and w+, are
// performed by this function. To prepare the shifts, we have to adjust
// change(w+), shift(w+), and change(w-).
function executeShifts(v) {
var shift = 0,
change = 0,
children = v.children,
i = children.length,
w;
while (--i >= 0) {
w = children[i];
w.z += shift;
w.m += shift;
shift += w.s + (change += w.c);
}
}
// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
// returns the specified (default) ancestor.
function nextAncestor(vim, v, ancestor) {
return vim.a.parent === v.parent ? vim.a : ancestor;
}
function TreeNode(node, i) {
this._ = node;
this.parent = null;
this.children = null;
this.A = null; // default ancestor
this.a = this; // ancestor
this.z = 0; // prelim
this.m = 0; // mod
this.c = 0; // change
this.s = 0; // shift
this.t = null; // thread
this.i = i; // number
}
TreeNode.prototype = Object.create(Node.prototype);
function treeRoot(root) {
var tree = new TreeNode(root, 0),
node,
nodes = [tree],
child,
children,
i,
n;
while (node = nodes.pop()) {
if (children = node._.children) {
node.children = new Array(n = children.length);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new TreeNode(children[i], i));
child.parent = node;
}
}
}
(tree.parent = new TreeNode(null, 0)).children = [tree];
return tree;
}
// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
function tree() {
var separation = defaultSeparation$1,
dx = 1,
dy = 1,
nodeSize = null;
function tree(root) {
var t = treeRoot(root);
// Compute the layout using Buchheim et al.’s algorithm.
t.eachAfter(firstWalk), t.parent.m = -t.z;
t.eachBefore(secondWalk);
// If a fixed node size is specified, scale x and y.
if (nodeSize) root.eachBefore(sizeNode);
// If a fixed tree size is specified, scale x and y based on the extent.
// Compute the left-most, right-most, and depth-most nodes for extents.
else {
var left = root,
right = root,
bottom = root;
root.eachBefore(function(node) {
if (node.x < left.x) left = node;
if (node.x > right.x) right = node;
if (node.depth > bottom.depth) bottom = node;
});
var s = left === right ? 1 : separation(left, right) / 2,
tx = s - left.x,
kx = dx / (right.x + s + tx),
ky = dy / (bottom.depth || 1);
root.eachBefore(function(node) {
node.x = (node.x + tx) * kx;
node.y = node.depth * ky;
});
}
return root;
}
// Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
// applied recursively to the children of v, as well as the function
// APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
// node v is placed to the midpoint of its outermost children.
function firstWalk(v) {
var children = v.children,
siblings = v.parent.children,
w = v.i ? siblings[v.i - 1] : null;
if (children) {
executeShifts(v);
var midpoint = (children[0].z + children[children.length - 1].z) / 2;
if (w) {
v.z = w.z + separation(v._, w._);
v.m = v.z - midpoint;
} else {
v.z = midpoint;
}
} else if (w) {
v.z = w.z + separation(v._, w._);
}
v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
}
// Computes all real x-coordinates by summing up the modifiers recursively.
function secondWalk(v) {
v._.x = v.z + v.parent.m;
v.m += v.parent.m;
}
// The core of the algorithm. Here, a new subtree is combined with the
// previous subtrees. Threads are used to traverse the inside and outside
// contours of the left and right subtree up to the highest common level. The
// vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
// superscript o means outside and i means inside, the subscript - means left
// subtree and + means right subtree. For summing up the modifiers along the
// contour, we use respective variables si+, si-, so-, and so+. Whenever two
// nodes of the inside contours conflict, we compute the left one of the
// greatest uncommon ancestors using the function ANCESTOR and call MOVE
// SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
// Finally, we add a new thread (if necessary).
function apportion(v, w, ancestor) {
if (w) {
var vip = v,
vop = v,
vim = w,
vom = vip.parent.children[0],
sip = vip.m,
sop = vop.m,
sim = vim.m,
som = vom.m,
shift;
while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
vom = nextLeft(vom);
vop = nextRight(vop);
vop.a = v;
shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
if (shift > 0) {
moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
sip += shift;
sop += shift;
}
sim += vim.m;
sip += vip.m;
som += vom.m;
sop += vop.m;
}
if (vim && !nextRight(vop)) {
vop.t = vim;
vop.m += sim - sop;
}
if (vip && !nextLeft(vom)) {
vom.t = vip;
vom.m += sip - som;
ancestor = v;
}
}
return ancestor;
}
function sizeNode(node) {
node.x *= dx;
node.y = node.depth * dy;
}
tree.separation = function(x) {
return arguments.length ? (separation = x, tree) : separation;
};
tree.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
};
tree.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
};
return tree;
}
function treemapSlice(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (y1 - y0) / parent.value;
while (++i < n) {
node = nodes[i], node.x0 = x0, node.x1 = x1;
node.y0 = y0, node.y1 = y0 += node.value * k;
}
}
var phi = (1 + Math.sqrt(5)) / 2;
function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
var rows = [],
nodes = parent.children,
row,
nodeValue,
i0 = 0,
i1,
n = nodes.length,
dx, dy,
value = parent.value,
sumValue,
minValue,
maxValue,
newRatio,
minRatio,
alpha,
beta;
while (i0 < n) {
dx = x1 - x0, dy = y1 - y0;
minValue = maxValue = sumValue = nodes[i0].value;
alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
beta = sumValue * sumValue * alpha;
minRatio = Math.max(maxValue / beta, beta / minValue);
// Keep adding nodes while the aspect ratio maintains or improves.
for (i1 = i0 + 1; i1 < n; ++i1) {
sumValue += nodeValue = nodes[i1].value;
if (nodeValue < minValue) minValue = nodeValue;
if (nodeValue > maxValue) maxValue = nodeValue;
beta = sumValue * sumValue * alpha;
newRatio = Math.max(maxValue / beta, beta / minValue);
if (newRatio > minRatio) { sumValue -= nodeValue; break; }
minRatio = newRatio;
}
// Position and record the row orientation.
rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
value -= sumValue, i0 = i1;
}
return rows;
}
var squarify = (function custom(ratio) {
function squarify(parent, x0, y0, x1, y1) {
squarifyRatio(ratio, parent, x0, y0, x1, y1);
}
squarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return squarify;
})(phi);
function index$1() {
var tile = squarify,
round = false,
dx = 1,
dy = 1,
paddingStack = [0],
paddingInner = constantZero,
paddingTop = constantZero,
paddingRight = constantZero,
paddingBottom = constantZero,
paddingLeft = constantZero;
function treemap(root) {
root.x0 =
root.y0 = 0;
root.x1 = dx;
root.y1 = dy;
root.eachBefore(positionNode);
paddingStack = [0];
if (round) root.eachBefore(roundNode);
return root;
}
function positionNode(node) {
var p = paddingStack[node.depth],
x0 = node.x0 + p,
y0 = node.y0 + p,
x1 = node.x1 - p,
y1 = node.y1 - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
if (node.children) {
p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
x0 += paddingLeft(node) - p;
y0 += paddingTop(node) - p;
x1 -= paddingRight(node) - p;
y1 -= paddingBottom(node) - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
tile(node, x0, y0, x1, y1);
}
}
treemap.round = function(x) {
return arguments.length ? (round = !!x, treemap) : round;
};
treemap.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
};
treemap.tile = function(x) {
return arguments.length ? (tile = required(x), treemap) : tile;
};
treemap.padding = function(x) {
return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
};
treemap.paddingInner = function(x) {
return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$5(+x), treemap) : paddingInner;
};
treemap.paddingOuter = function(x) {
return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
};
treemap.paddingTop = function(x) {
return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$5(+x), treemap) : paddingTop;
};
treemap.paddingRight = function(x) {
return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$5(+x), treemap) : paddingRight;
};
treemap.paddingBottom = function(x) {
return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$5(+x), treemap) : paddingBottom;
};
treemap.paddingLeft = function(x) {
return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$5(+x), treemap) : paddingLeft;
};
return treemap;
}
function binary(parent, x0, y0, x1, y1) {
var nodes = parent.children,
i, n = nodes.length,
sum, sums = new Array(n + 1);
for (sums[0] = sum = i = 0; i < n; ++i) {
sums[i + 1] = sum += nodes[i].value;
}
partition(0, n, parent.value, x0, y0, x1, y1);
function partition(i, j, value, x0, y0, x1, y1) {
if (i >= j - 1) {
var node = nodes[i];
node.x0 = x0, node.y0 = y0;
node.x1 = x1, node.y1 = y1;
return;
}
var valueOffset = sums[i],
valueTarget = (value / 2) + valueOffset,
k = i + 1,
hi = j - 1;
while (k < hi) {
var mid = k + hi >>> 1;
if (sums[mid] < valueTarget) k = mid + 1;
else hi = mid;
}
var valueLeft = sums[k] - valueOffset,
valueRight = value - valueLeft;
if ((y1 - y0) > (x1 - x0)) {
var yk = (y0 * valueRight + y1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, x1, yk);
partition(k, j, valueRight, x0, yk, x1, y1);
} else {
var xk = (x0 * valueRight + x1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, xk, y1);
partition(k, j, valueRight, xk, y0, x1, y1);
}
}
}
function sliceDice(parent, x0, y0, x1, y1) {
(parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
}
var resquarify = (function custom(ratio) {
function resquarify(parent, x0, y0, x1, y1) {
if ((rows = parent._squarify) && (rows.ratio === ratio)) {
var rows,
row,
nodes,
i,
j = -1,
n,
m = rows.length,
value = parent.value;
while (++j < m) {
row = rows[j], nodes = row.children;
for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
value -= row.value;
}
} else {
parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
rows.ratio = ratio;
}
}
resquarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return resquarify;
})(phi);
function center$1(x, y) {
var nodes;
if (x == null) x = 0;
if (y == null) y = 0;
function force() {
var i,
n = nodes.length,
node,
sx = 0,
sy = 0;
for (i = 0; i < n; ++i) {
node = nodes[i], sx += node.x, sy += node.y;
}
for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
node = nodes[i], node.x -= sx, node.y -= sy;
}
}
force.initialize = function(_) {
nodes = _;
};
force.x = function(_) {
return arguments.length ? (x = +_, force) : x;
};
force.y = function(_) {
return arguments.length ? (y = +_, force) : y;
};
return force;
}
function constant$6(x) {
return function() {
return x;
};
}
function jiggle() {
return (Math.random() - 0.5) * 1e-6;
}
function x$1(d) {
return d.x + d.vx;
}
function y$1(d) {
return d.y + d.vy;
}
function collide(radius) {
var nodes,
radii,
strength = 1,
iterations = 1;
if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
function force() {
var i, n = nodes.length,
tree,
node,
xi,
yi,
ri,
ri2;
for (var k = 0; k < iterations; ++k) {
tree = quadtree(nodes, x$1, y$1).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
ri = radii[i], ri2 = ri * ri;
xi = node.x + node.vx;
yi = node.y + node.vy;
tree.visit(apply);
}
}
function apply(quad, x0, y0, x1, y1) {
var data = quad.data, rj = quad.r, r = ri + rj;
if (data) {
if (data.index > i) {
var x = xi - data.x - data.vx,
y = yi - data.y - data.vy,
l = x * x + y * y;
if (l < r * r) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
l = (r - (l = Math.sqrt(l))) / l * strength;
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
node.vy += (y *= l) * r;
data.vx -= x * (r = 1 - r);
data.vy -= y * r;
}
}
return;
}
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
}
}
function prepare(quad) {
if (quad.data) return quad.r = radii[quad.data.index];
for (var i = quad.r = 0; i < 4; ++i) {
if (quad[i] && quad[i].r > quad.r) {
quad.r = quad[i].r;
}
}
}
force.initialize = function(_) {
var i, n = (nodes = _).length; radii = new Array(n);
for (i = 0; i < n; ++i) radii[i] = +radius(nodes[i], i, nodes);
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), force) : radius;
};
return force;
}
function index$2(d, i) {
return i;
}
function link(links) {
var id = index$2,
strength = defaultStrength,
strengths,
distance = constant$6(30),
distances,
nodes,
count,
bias,
iterations = 1;
if (links == null) links = [];
function defaultStrength(link) {
return 1 / Math.min(count[link.source.index], count[link.target.index]);
}
function force(alpha) {
for (var k = 0, n = links.length; k < iterations; ++k) {
for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
link = links[i], source = link.source, target = link.target;
x = target.x + target.vx - source.x - source.vx || jiggle();
y = target.y + target.vy - source.y - source.vy || jiggle();
l = Math.sqrt(x * x + y * y);
l = (l - distances[i]) / l * alpha * strengths[i];
x *= l, y *= l;
target.vx -= x * (b = bias[i]);
target.vy -= y * b;
source.vx += x * (b = 1 - b);
source.vy += y * b;
}
}
}
function initialize() {
if (!nodes) return;
var i,
n = nodes.length,
m = links.length,
nodeById = map$1(nodes, id),
link;
for (i = 0, count = new Array(n); i < n; ++i) {
count[i] = 0;
}
for (i = 0; i < m; ++i) {
link = links[i], link.index = i;
if (typeof link.source !== "object") link.source = nodeById.get(link.source);
if (typeof link.target !== "object") link.target = nodeById.get(link.target);
++count[link.source.index], ++count[link.target.index];
}
for (i = 0, bias = new Array(m); i < m; ++i) {
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
}
strengths = new Array(m), initializeStrength();
distances = new Array(m), initializeDistance();
}
function initializeStrength() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
strengths[i] = +strength(links[i], i, links);
}
}
function initializeDistance() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
distances[i] = +distance(links[i], i, links);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.links = function(_) {
return arguments.length ? (links = _, initialize(), force) : links;
};
force.id = function(_) {
return arguments.length ? (id = _, force) : id;
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
};
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
};
return force;
}
function x$2(d) {
return d.x;
}
function y$2(d) {
return d.y;
}
var initialRadius = 10;
var initialAngle = Math.PI * (3 - Math.sqrt(5));
function simulation(nodes) {
var simulation,
alpha = 1,
alphaMin = 0.001,
alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
alphaTarget = 0,
velocityDecay = 0.6,
forces = map$1(),
stepper = timer(step),
event = dispatch("tick", "end");
if (nodes == null) nodes = [];
function step() {
tick();
event.call("tick", simulation);
if (alpha < alphaMin) {
stepper.stop();
event.call("end", simulation);
}
}
function tick() {
var i, n = nodes.length, node;
alpha += (alphaTarget - alpha) * alphaDecay;
forces.each(function(force) {
force(alpha);
});
for (i = 0; i < n; ++i) {
node = nodes[i];
if (node.fx == null) node.x += node.vx *= velocityDecay;
else node.x = node.fx, node.vx = 0;
if (node.fy == null) node.y += node.vy *= velocityDecay;
else node.y = node.fy, node.vy = 0;
}
}
function initializeNodes() {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.index = i;
if (isNaN(node.x) || isNaN(node.y)) {
var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
node.x = radius * Math.cos(angle);
node.y = radius * Math.sin(angle);
}
if (isNaN(node.vx) || isNaN(node.vy)) {
node.vx = node.vy = 0;
}
}
}
function initializeForce(force) {
if (force.initialize) force.initialize(nodes);
return force;
}
initializeNodes();
return simulation = {
tick: tick,
restart: function() {
return stepper.restart(step), simulation;
},
stop: function() {
return stepper.stop(), simulation;
},
nodes: function(_) {
return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
},
alpha: function(_) {
return arguments.length ? (alpha = +_, simulation) : alpha;
},
alphaMin: function(_) {
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
},
alphaDecay: function(_) {
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
},
alphaTarget: function(_) {
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
},
velocityDecay: function(_) {
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
},
force: function(name, _) {
return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
},
find: function(x, y, radius) {
var i = 0,
n = nodes.length,
dx,
dy,
d2,
node,
closest;
if (radius == null) radius = Infinity;
else radius *= radius;
for (i = 0; i < n; ++i) {
node = nodes[i];
dx = x - node.x;
dy = y - node.y;
d2 = dx * dx + dy * dy;
if (d2 < radius) closest = node, radius = d2;
}
return closest;
},
on: function(name, _) {
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
}
};
}
function manyBody() {
var nodes,
node,
alpha,
strength = constant$6(-30),
strengths,
distanceMin2 = 1,
distanceMax2 = Infinity,
theta2 = 0.81;
function force(_) {
var i, n = nodes.length, tree = quadtree(nodes, x$2, y$2).visitAfter(accumulate);
for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
for (i = 0; i < n; ++i) strengths[i] = +strength(nodes[i], i, nodes);
}
function accumulate(quad) {
var strength = 0, q, c, x, y, i;
// For internal nodes, accumulate forces from child quadrants.
if (quad.length) {
for (x = y = i = 0; i < 4; ++i) {
if ((q = quad[i]) && (c = q.value)) {
strength += c, x += c * q.x, y += c * q.y;
}
}
quad.x = x / strength;
quad.y = y / strength;
}
// For leaf nodes, accumulate forces from coincident quadrants.
else {
q = quad;
q.x = q.data.x;
q.y = q.data.y;
do strength += strengths[q.data.index];
while (q = q.next);
}
quad.value = strength;
}
function apply(quad, x1, _, x2) {
if (!quad.value) return true;
var x = quad.x - node.x,
y = quad.y - node.y,
w = x2 - x1,
l = x * x + y * y;
// Apply the Barnes-Hut approximation if possible.
// Limit forces for very close nodes; randomize direction if coincident.
if (w * w / theta2 < l) {
if (l < distanceMax2) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
node.vx += x * quad.value * alpha / l;
node.vy += y * quad.value * alpha / l;
}
return true;
}
// Otherwise, process points directly.
else if (quad.length || l >= distanceMax2) return;
// Limit forces for very close nodes; randomize direction if coincident.
if (quad.data !== node || quad.next) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
}
do if (quad.data !== node) {
w = strengths[quad.data.index] * alpha / l;
node.vx += x * w;
node.vy += y * w;
} while (quad = quad.next);
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.distanceMin = function(_) {
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
};
force.distanceMax = function(_) {
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
};
force.theta = function(_) {
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
};
return force;
}
function x$3(x) {
var strength = constant$6(0.1),
nodes,
strengths,
xz;
if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
xz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
};
return force;
}
function y$3(y) {
var strength = constant$6(0.1),
nodes,
strengths,
yz;
if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
yz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
};
return force;
}
function nopropagation() {
exports.event.stopImmediatePropagation();
}
function noevent() {
exports.event.preventDefault();
exports.event.stopImmediatePropagation();
}
function dragDisable(view) {
var root = view.document.documentElement,
selection = select(view).on("dragstart.drag", noevent, true);
if ("onselectstart" in root) {
selection.on("selectstart.drag", noevent, true);
} else {
root.__noselect = root.style.MozUserSelect;
root.style.MozUserSelect = "none";
}
}
function dragEnable(view, noclick) {
var root = view.document.documentElement,
selection = select(view).on("dragstart.drag", null);
if (noclick) {
selection.on("click.drag", noevent, true);
setTimeout(function() { selection.on("click.drag", null); }, 0);
}
if ("onselectstart" in root) {
selection.on("selectstart.drag", null);
} else {
root.style.MozUserSelect = root.__noselect;
delete root.__noselect;
}
}
function constant$7(x) {
return function() {
return x;
};
}
function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
this.target = target;
this.type = type;
this.subject = subject;
this.identifier = id;
this.active = active;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this._ = dispatch;
}
DragEvent.prototype.on = function() {
var value = this._.on.apply(this._, arguments);
return value === this._ ? this : value;
};
// Ignore right-click, since that should open the context menu.
function defaultFilter() {
return !exports.event.button;
}
function defaultContainer() {
return this.parentNode;
}
function defaultSubject(d) {
return d == null ? {x: exports.event.x, y: exports.event.y} : d;
}
function drag() {
var filter = defaultFilter,
container = defaultContainer,
subject = defaultSubject,
gestures = {},
listeners = dispatch("start", "drag", "end"),
active = 0,
mousemoving,
touchending;
function drag(selection) {
selection
.on("mousedown.drag", mousedowned)
.on("touchstart.drag", touchstarted)
.on("touchmove.drag", touchmoved)
.on("touchend.drag touchcancel.drag", touchended)
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
if (!gesture) return;
select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
dragDisable(exports.event.view);
nopropagation();
mousemoving = false;
gesture("start");
}
function mousemoved() {
noevent();
mousemoving = true;
gestures.mouse("drag");
}
function mouseupped() {
select(exports.event.view).on("mousemove.drag mouseup.drag", null);
dragEnable(exports.event.view, mousemoving);
noevent();
gestures.mouse("end");
}
function touchstarted() {
if (!filter.apply(this, arguments)) return;
var touches = exports.event.changedTouches,
c = container.apply(this, arguments),
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
nopropagation();
gesture("start");
}
}
}
function touchmoved() {
var touches = exports.event.changedTouches,
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
noevent();
gesture("drag");
}
}
}
function touchended() {
var touches = exports.event.changedTouches,
n = touches.length, i, gesture;
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
nopropagation();
gesture("end");
}
}
}
function beforestart(id, container, point, that, args) {
var p = point(container, id), s, dx, dy,
sublisteners = listeners.copy();
if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
if ((exports.event.subject = s = subject.apply(that, args)) == null) return false;
dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;
return true;
})) return;
return function gesture(type) {
var p0 = p, n;
switch (type) {
case "start": gestures[id] = gesture, n = active++; break;
case "end": delete gestures[id], --active; // nobreak
case "drag": p = point(container, id), n = active; break;
}
customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
};
}
drag.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : constant$7(!!_), drag) : filter;
};
drag.container = function(_) {
return arguments.length ? (container = typeof _ === "function" ? _ : constant$7(_), drag) : container;
};
drag.subject = function(_) {
return arguments.length ? (subject = typeof _ === "function" ? _ : constant$7(_), drag) : subject;
};
drag.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? drag : value;
};
return drag;
}
function constant$8(x) {
return function() {
return x;
};
}
function x$4(d) {
return d[0];
}
function y$4(d) {
return d[1];
}
function RedBlackTree() {
this._ = null; // root node
}
function RedBlackNode(node) {
node.U = // parent node
node.C = // color - true for red, false for black
node.L = // left node
node.R = // right node
node.P = // previous node
node.N = null; // next node
}
RedBlackTree.prototype = {
constructor: RedBlackTree,
insert: function(after, node) {
var parent, grandpa, uncle;
if (after) {
node.P = after;
node.N = after.N;
if (after.N) after.N.P = node;
after.N = node;
if (after.R) {
after = after.R;
while (after.L) after = after.L;
after.L = node;
} else {
after.R = node;
}
parent = after;
} else if (this._) {
after = RedBlackFirst(this._);
node.P = null;
node.N = after;
after.P = after.L = node;
parent = after;
} else {
node.P = node.N = null;
this._ = node;
parent = null;
}
node.L = node.R = null;
node.U = parent;
node.C = true;
after = node;
while (parent && parent.C) {
grandpa = parent.U;
if (parent === grandpa.L) {
uncle = grandpa.R;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.R) {
RedBlackRotateLeft(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
RedBlackRotateRight(this, grandpa);
}
} else {
uncle = grandpa.L;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.L) {
RedBlackRotateRight(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
RedBlackRotateLeft(this, grandpa);
}
}
parent = after.U;
}
this._.C = false;
},
remove: function(node) {
if (node.N) node.N.P = node.P;
if (node.P) node.P.N = node.N;
node.N = node.P = null;
var parent = node.U,
sibling,
left = node.L,
right = node.R,
next,
red;
if (!left) next = right;
else if (!right) next = left;
else next = RedBlackFirst(right);
if (parent) {
if (parent.L === node) parent.L = next;
else parent.R = next;
} else {
this._ = next;
}
if (left && right) {
red = next.C;
next.C = node.C;
next.L = left;
left.U = next;
if (next !== right) {
parent = next.U;
next.U = node.U;
node = next.R;
parent.L = node;
next.R = right;
right.U = next;
} else {
next.U = parent;
parent = next;
node = next.R;
}
} else {
red = node.C;
node = next;
}
if (node) node.U = parent;
if (red) return;
if (node && node.C) { node.C = false; return; }
do {
if (node === this._) break;
if (node === parent.L) {
sibling = parent.R;
if (sibling.C) {
sibling.C = false;
parent.C = true;
RedBlackRotateLeft(this, parent);
sibling = parent.R;
}
if ((sibling.L && sibling.L.C)
|| (sibling.R && sibling.R.C)) {
if (!sibling.R || !sibling.R.C) {
sibling.L.C = false;
sibling.C = true;
RedBlackRotateRight(this, sibling);
sibling = parent.R;
}
sibling.C = parent.C;
parent.C = sibling.R.C = false;
RedBlackRotateLeft(this, parent);
node = this._;
break;
}
} else {
sibling = parent.L;
if (sibling.C) {
sibling.C = false;
parent.C = true;
RedBlackRotateRight(this, parent);
sibling = parent.L;
}
if ((sibling.L && sibling.L.C)
|| (sibling.R && sibling.R.C)) {
if (!sibling.L || !sibling.L.C) {
sibling.R.C = false;
sibling.C = true;
RedBlackRotateLeft(this, sibling);
sibling = parent.L;
}
sibling.C = parent.C;
parent.C = sibling.L.C = false;
RedBlackRotateRight(this, parent);
node = this._;
break;
}
}
sibling.C = true;
node = parent;
parent = parent.U;
} while (!node.C);
if (node) node.C = false;
}
};
function RedBlackRotateLeft(tree, node) {
var p = node,
q = node.R,
parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q;
else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.R = q.L;
if (p.R) p.R.U = p;
q.L = p;
}
function RedBlackRotateRight(tree, node) {
var p = node,
q = node.L,
parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q;
else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.L = q.R;
if (p.L) p.L.U = p;
q.R = p;
}
function RedBlackFirst(node) {
while (node.L) node = node.L;
return node;
}
function createEdge(left, right, v0, v1) {
var edge = [null, null],
index = edges.push(edge) - 1;
edge.left = left;
edge.right = right;
if (v0) setEdgeEnd(edge, left, right, v0);
if (v1) setEdgeEnd(edge, right, left, v1);
cells[left.index].halfedges.push(index);
cells[right.index].halfedges.push(index);
return edge;
}
function createBorderEdge(left, v0, v1) {
var edge = [v0, v1];
edge.left = left;
return edge;
}
function setEdgeEnd(edge, left, right, vertex) {
if (!edge[0] && !edge[1]) {
edge[0] = vertex;
edge.left = left;
edge.right = right;
} else if (edge.left === right) {
edge[1] = vertex;
} else {
edge[0] = vertex;
}
}
// Liang–Barsky line clipping.
function clipEdge(edge, x0, y0, x1, y1) {
var a = edge[0],
b = edge[1],
ax = a[0],
ay = a[1],
bx = b[0],
by = b[1],
t0 = 0,
t1 = 1,
dx = bx - ax,
dy = by - ay,
r;
r = x0 - ax;
if (!dx && r > 0) return;
r /= dx;
if (dx < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dx > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = x1 - ax;
if (!dx && r < 0) return;
r /= dx;
if (dx < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dx > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
r = y0 - ay;
if (!dy && r > 0) return;
r /= dy;
if (dy < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dy > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = y1 - ay;
if (!dy && r < 0) return;
r /= dy;
if (dy < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dy > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
return true;
}
function connectEdge(edge, x0, y0, x1, y1) {
var v1 = edge[1];
if (v1) return true;
var v0 = edge[0],
left = edge.left,
right = edge.right,
lx = left[0],
ly = left[1],
rx = right[0],
ry = right[1],
fx = (lx + rx) / 2,
fy = (ly + ry) / 2,
fm,
fb;
if (ry === ly) {
if (fx < x0 || fx >= x1) return;
if (lx > rx) {
if (!v0) v0 = [fx, y0];
else if (v0[1] >= y1) return;
v1 = [fx, y1];
} else {
if (!v0) v0 = [fx, y1];
else if (v0[1] < y0) return;
v1 = [fx, y0];
}
} else {
fm = (lx - rx) / (ry - ly);
fb = fy - fm * fx;
if (fm < -1 || fm > 1) {
if (lx > rx) {
if (!v0) v0 = [(y0 - fb) / fm, y0];
else if (v0[1] >= y1) return;
v1 = [(y1 - fb) / fm, y1];
} else {
if (!v0) v0 = [(y1 - fb) / fm, y1];
else if (v0[1] < y0) return;
v1 = [(y0 - fb) / fm, y0];
}
} else {
if (ly < ry) {
if (!v0) v0 = [x0, fm * x0 + fb];
else if (v0[0] >= x1) return;
v1 = [x1, fm * x1 + fb];
} else {
if (!v0) v0 = [x1, fm * x1 + fb];
else if (v0[0] < x0) return;
v1 = [x0, fm * x0 + fb];
}
}
}
edge[0] = v0;
edge[1] = v1;
return true;
}
function clipEdges(x0, y0, x1, y1) {
var i = edges.length,
edge;
while (i--) {
if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
|| !clipEdge(edge, x0, y0, x1, y1)
|| !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$3
|| Math.abs(edge[0][1] - edge[1][1]) > epsilon$3)) {
delete edges[i];
}
}
}
function createCell(site) {
return cells[site.index] = {
site: site,
halfedges: []
};
}
function cellHalfedgeAngle(cell, edge) {
var site = cell.site,
va = edge.left,
vb = edge.right;
if (site === vb) vb = va, va = site;
if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
if (site === va) va = edge[1], vb = edge[0];
else va = edge[0], vb = edge[1];
return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
}
function cellHalfedgeStart(cell, edge) {
return edge[+(edge.left !== cell.site)];
}
function cellHalfedgeEnd(cell, edge) {
return edge[+(edge.left === cell.site)];
}
function sortCellHalfedges() {
for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment