Last active
April 27, 2017 07:07
-
-
Save jmahabal/cbc14c78e392cdccc96bb222697a3716 to your computer and use it in GitHub Desktop.
NBA Margin of Victory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file has been truncated, but you can view the full file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment