diff --git a/doc/软件系统的需求构思及描述.doc b/doc/软件系统的需求构思及描述.doc
new file mode 100644
index 0000000..df78ead
Binary files /dev/null and b/doc/软件系统的需求构思及描述.doc differ
diff --git a/doc/软件设计说明书.docx b/doc/软件设计说明书.docx
new file mode 100644
index 0000000..c5a58ce
Binary files /dev/null and b/doc/软件设计说明书.docx differ
diff --git a/doc/需求规格说明书.docx b/doc/需求规格说明书.docx
new file mode 100644
index 0000000..fa99f22
Binary files /dev/null and b/doc/需求规格说明书.docx differ
diff --git a/model/NBA胜率预测及球员数据可视化UML模型.doc b/model/NBA胜率预测及球员数据可视化UML模型.doc
new file mode 100644
index 0000000..3ef67bd
Binary files /dev/null and b/model/NBA胜率预测及球员数据可视化UML模型.doc differ
diff --git a/other/200340002 陈立 实践总结报告.docx b/other/200340002 陈立 实践总结报告.docx
new file mode 100644
index 0000000..efb8fd3
Binary files /dev/null and b/other/200340002 陈立 实践总结报告.docx differ
diff --git a/other/200340003 陈孟谦-实践总结报告(1).docx b/other/200340003 陈孟谦-实践总结报告(1).docx
new file mode 100644
index 0000000..338269a
Binary files /dev/null and b/other/200340003 陈孟谦-实践总结报告(1).docx differ
diff --git a/other/200340038张剑 实践总结报告.doc b/other/200340038张剑 实践总结报告.doc
new file mode 100644
index 0000000..e1009f9
Binary files /dev/null and b/other/200340038张剑 实践总结报告.doc differ
diff --git a/other/200340143 李文彪-实践总结报告.docx b/other/200340143 李文彪-实践总结报告.docx
new file mode 100644
index 0000000..5a8723a
Binary files /dev/null and b/other/200340143 李文彪-实践总结报告.docx differ
diff --git a/other/PPT(1).pptx b/other/PPT(1).pptx
new file mode 100644
index 0000000..137649b
Binary files /dev/null and b/other/PPT(1).pptx differ
diff --git a/other/data/20-20Team_Per_Game_Stat.csv b/other/data/20-20Team_Per_Game_Stat.csv
new file mode 100644
index 0000000..2b450a5
--- /dev/null
+++ b/other/data/20-20Team_Per_Game_Stat.csv
@@ -0,0 +1,31 @@
+Rk,Team,G,MP,FG,FGA,FG%,3P,3PA,3P%,2P,2PA,2P%,FT,FTA,FT%,ORB,DRB,TRB,AST,STL,BLK,TOV,PF,PTS
+1,Golden State Warriors,82,242.4,42.5,87.3,0.487,13.1,31.6,0.416,29.4,55.7,0.528,16.7,21.8,0.763,10,36.2,46.2,28.9,8.4,6.1,15.2,20.7,114.9
+2,Oklahoma City Thunder,82,241.8,41.1,86.4,0.476,8.3,23.7,0.349,32.9,62.6,0.524,19.7,25.2,0.782,13.1,35.6,48.6,23,7.4,5.9,15.9,20.6,110.2
+3,Sacramento Kings,82,241.5,40,86.4,0.464,8,22.4,0.359,32,64,0.5,18.5,25.5,0.725,10.6,33.7,44.2,24.5,8.9,4.5,16.2,20.4,106.6
+4,Houston Rockets,82,241.8,37.7,83.5,0.452,10.7,30.9,0.347,27,52.6,0.514,20.4,29.4,0.694,11.3,31.7,43.1,22.2,10,5.2,15.9,21.8,106.5
+5,Boston Celtics,82,241.2,39.2,89.2,0.439,8.7,26.1,0.335,30.5,63.1,0.483,18.5,23.5,0.788,11.6,33.3,44.9,24.2,9.2,4.2,13.7,21.9,105.7
+6,Portland Trail Blazers,82,241.5,38.6,85.9,0.45,10.5,28.5,0.37,28.1,57.4,0.49,17.4,23,0.754,11.6,33.9,45.5,21.3,6.9,4.6,14.6,21.7,105.1
+7,Los Angeles Clippers,82,241.8,38.3,82.4,0.465,9.7,26.7,0.364,28.6,55.7,0.513,18.2,26.2,0.692,8.8,33.3,42,22.8,8.6,5.6,13,21.3,104.5
+8,Cleveland Cavaliers,82,242.1,38.7,84,0.46,10.7,29.6,0.362,27.9,54.4,0.514,16.3,21.7,0.748,10.6,33.9,44.5,22.7,6.7,3.9,13.6,20.3,104.3
+9,Washington Wizards,82,240.9,39.5,85.8,0.46,8.6,24.2,0.358,30.8,61.6,0.501,16.5,22.5,0.73,9.1,32.8,41.8,24.5,8.6,3.9,14.5,20.8,104.1
+10,San Antonio Spurs,82,240.3,40.1,82.9,0.484,7,18.5,0.375,33.2,64.4,0.515,16.4,20.4,0.803,9.4,34.5,43.9,24.5,8.3,5.9,13.1,17.5,103.5
+11,Charlotte Hornets,82,242.1,37,84.4,0.439,10.6,29.4,0.362,26.4,55,0.479,18.7,23.7,0.79,9,35,43.9,21.7,7.3,5.3,12.6,18.1,103.4
+12,Atlanta Hawks,82,241.8,38.6,84.4,0.458,9.9,28.4,0.35,28.7,56.1,0.512,15.6,20,0.783,8.3,33.8,42.1,25.6,9.1,5.9,15,19.1,102.8
+13,New Orleans Pelicans,82,241.2,38.5,85.9,0.448,8.6,23.8,0.36,29.9,62.1,0.482,17.3,22.2,0.776,9.5,33.1,42.6,22.2,7.7,4.2,13.4,20.9,102.7
+14,Toronto Raptors,82,241.2,36.7,81.3,0.451,8.6,23.4,0.37,28,58,0.483,20.8,26.7,0.777,10.2,33.2,43.4,18.7,7.8,5.5,13.1,19.6,102.7
+15,Minnesota Timberwolves,82,242.4,37.7,81.3,0.464,5.5,16.4,0.338,32.2,64.9,0.496,21.4,27,0.792,10,31.5,41.6,23.4,8,4.6,15,20.7,102.4
+16,Dallas Mavericks,82,244,37.4,84.1,0.444,9.8,28.6,0.344,27.5,55.6,0.495,17.7,22.3,0.794,9.2,33.9,43.1,22.1,6.8,3.7,12.8,19.5,102.3
+17,Indiana Pacers,82,242.4,38.3,85.2,0.45,8.1,23,0.351,30.2,62.1,0.486,17.4,22.8,0.764,10.3,33.9,44.2,21.2,9,4.8,14.9,20,102.2
+18,Orlando Magic,82,242.7,39.5,86.8,0.455,7.8,22.2,0.35,31.8,64.7,0.492,15.2,20.1,0.757,10.3,33,43.3,23.6,8.2,5.1,14.1,20.7,102.1
+19,Detroit Pistons,82,242.4,37.9,86.4,0.439,9,26.2,0.345,28.9,60.2,0.48,17.1,25.5,0.668,12.5,33.9,46.3,19.4,7,3.7,13.5,19,102
+20,Denver Nuggets,82,241.8,37.7,85.4,0.442,8,23.7,0.338,29.7,61.7,0.482,18.5,24.1,0.766,11.5,33.1,44.6,22.7,7.4,4.8,14.7,21,101.9
+21,Chicago Bulls,82,242.7,38.6,87.4,0.441,7.9,21.4,0.371,30.7,66.1,0.464,16.5,21,0.787,11.1,35.2,46.3,22.8,6,5.7,13.9,18.8,101.6
+22,Phoenix Suns,82,240.3,37.2,85.6,0.435,9,25.8,0.348,28.2,59.8,0.472,17.5,23.2,0.751,11.5,33.3,44.8,20.7,7.7,3.8,17.2,22.7,100.9
+23,Miami Heat,82,241.8,38.4,81.7,0.47,6.1,18,0.336,32.3,63.6,0.508,17.1,23,0.744,9.8,34.3,44.1,20.8,6.7,6.5,14.1,18.3,100
+24,Memphis Grizzlies,82,241.8,36.8,83.6,0.44,6.1,18.5,0.331,30.7,65.1,0.471,19.3,24.7,0.783,11.2,30.5,41.6,20.7,8.8,4.3,13.3,21.7,99.1
+25,Milwaukee Bucks,82,241.8,38.4,82.2,0.467,5.4,15.6,0.345,33,66.6,0.495,17,22.7,0.747,10.5,31.2,41.7,23.1,8.2,5.8,15.2,20.7,99
+26,Brooklyn Nets,82,240.9,38.2,84.4,0.453,6.5,18.4,0.352,31.8,66,0.481,15.7,20.7,0.757,10.5,31.9,42.4,22.3,7.6,4,14.8,18,98.6
+27,New York Knicks,82,241.5,36.9,84,0.439,7.4,21.5,0.346,29.4,62.5,0.471,17.2,21.4,0.805,10.4,34,44.4,20.5,5.7,5.7,13.4,19.7,98.4
+28,Utah Jazz,82,243.4,36.1,80.4,0.449,8.5,23.9,0.355,27.6,56.5,0.488,17.1,23,0.744,10.7,32.5,43.2,19,7.7,5.2,14.9,20.2,97.7
+29,Philadelphia 76ers,82,241.5,36.2,84,0.431,9.3,27.5,0.339,26.9,56.5,0.476,15.7,22.6,0.694,9.5,31.8,41.2,21.5,8.3,6,16.4,21.7,97.4
+30,Los Angeles Lakers,82,240.6,35.1,84.8,0.414,7.8,24.6,0.317,27.3,60.2,0.454,19.3,24.7,0.781,10.7,32.3,43,18,7.2,4.1,13.7,20.3,97.3
diff --git a/other/data/20-21Opponent_Per_Game_Stat.csv b/other/data/20-21Opponent_Per_Game_Stat.csv
new file mode 100644
index 0000000..091d34b
--- /dev/null
+++ b/other/data/20-21Opponent_Per_Game_Stat.csv
@@ -0,0 +1,31 @@
+Rk,Team,G,MP,FG,FGA,FG%,3P,3PA,3P%,2P,2PA,2P%,FT,FTA,FT%,ORB,DRB,TRB,AST,STL,BLK,TOV,PF,PTS
+1,San Antonio Spurs,82,240.3,35.7,81.8,0.436,6.6,19.9,0.331,29.1,61.9,0.47,14.9,19.6,0.758,9.1,31.4,40.5,20.8,7.2,3.9,14.8,19.5,92.9
+2,Utah Jazz,82,243.4,35.6,79.9,0.446,7.9,22.2,0.357,27.7,57.7,0.48,16.8,22.5,0.746,9.3,30.8,40.1,19.1,8,4.7,14,19.9,95.9
+3,Toronto Raptors,82,241.2,36.5,82.1,0.444,8.7,23.4,0.373,27.7,58.7,0.473,16.5,22.1,0.748,9.5,31.2,40.8,21.7,6.5,5.4,13.3,22,98.2
+4,Cleveland Cavaliers,82,242.1,36.8,82.1,0.448,7.9,22.7,0.347,28.9,59.4,0.487,16.8,22.6,0.743,9.3,31.8,41,21.4,7.2,4.4,13.3,20.6,98.3
+5,Miami Heat,82,241.8,37.2,84.3,0.442,7.4,21.2,0.347,29.9,63.1,0.474,16.5,21.5,0.77,9.8,31.5,41.3,20.2,7.5,4.1,12.9,19.6,98.4
+6,Atlanta Hawks,82,241.8,37.1,86.1,0.432,8.3,24.5,0.338,28.9,61.6,0.469,16.7,22.1,0.755,11.5,35,46.5,22,8.6,5,16.1,18.3,99.2
+7,Los Angeles Clippers,82,241.8,36.8,84.7,0.434,7.9,23.3,0.338,28.9,61.4,0.471,18.8,25.1,0.751,11.8,34.9,46.7,21.2,7.1,3.2,15.4,22.5,100.2
+8,Indiana Pacers,82,242.4,37.4,84.9,0.44,8.3,24.8,0.334,29.1,60.1,0.484,17.4,23.2,0.751,10.7,33.8,44.5,20.8,7.7,4.5,15.8,20.4,100.5
+9,Charlotte Hornets,82,242.1,37.8,85,0.444,8.9,25.4,0.349,28.9,59.6,0.485,16.3,21.2,0.769,8.9,35.8,44.7,23.2,6.7,5.5,13.5,20.4,100.7
+10,New York Knicks,82,241.5,38,85.8,0.443,7.6,22.4,0.341,30.3,63.4,0.479,17.5,23.2,0.754,10.9,33.3,44.2,20.8,7.2,4.2,11.3,18.5,101.1
+11,Memphis Grizzlies,82,241.8,35.9,78.8,0.456,9.7,26.6,0.365,26.2,52.1,0.503,19.7,25.7,0.768,10.1,33.1,43.2,21.9,7,5.7,16.2,21.1,101.3
+12,Detroit Pistons,82,242.4,38.8,84.2,0.461,7.3,20.5,0.355,31.5,63.7,0.495,16.5,21,0.783,8.8,33.7,42.5,21.5,7.1,4.5,13.4,21.6,101.4
+13,Boston Celtics,82,241.2,37.5,85,0.441,7.8,23.3,0.336,29.7,61.7,0.481,19.7,26,0.755,11.4,34.6,46,20.9,7.6,5.5,16.4,21,102.5
+14,Dallas Mavericks,82,244,38.3,85,0.451,9.1,26.5,0.342,29.3,58.5,0.5,16.9,22.8,0.738,10.6,35.2,45.8,22,7.5,4.4,13.9,21.4,102.6
+15,Oklahoma City Thunder,82,241.8,38.4,87.7,0.438,8.1,23.8,0.342,30.3,63.9,0.474,18,23.8,0.756,11.3,28.9,40.2,21.5,8.8,4.5,13,20.2,102.9
+16,Chicago Bulls,82,242.7,39.4,89.4,0.441,7.9,23,0.345,31.5,66.4,0.474,16.3,22.1,0.737,11.8,34.1,45.9,22.5,8,5.7,11.9,18.7,103.1
+17,Milwaukee Bucks,82,241.8,37.8,83.1,0.454,9.3,26.5,0.352,28.4,56.7,0.502,18.4,23.9,0.768,11.5,31.5,43,24.5,8.3,5.6,15.5,19.5,103.2
+18,Orlando Magic,82,242.7,38.4,83.5,0.46,8.9,24.9,0.359,29.5,58.6,0.503,17.9,24,0.746,10.1,34.1,44.3,23.2,7.6,5.5,15.1,18.3,103.7
+19,Golden State Warriors,82,242.4,38.9,89.4,0.435,7.8,23.5,0.332,31.1,65.9,0.472,18.6,24.5,0.757,11.4,32.5,43.9,22.2,8.7,4.1,14.5,19.8,104.1
+20,Portland Trail Blazers*,82,241.5,38.4,84.7,0.453,8.5,23,0.371,29.8,61.7,0.484,19,26,0.734,10.6,33.1,43.7,21.6,7.7,5.2,13.3,19.5,104.3
+21,Washington Wizards,82,240.9,38.7,83.8,0.462,9,24.2,0.371,29.7,59.5,0.498,18.3,23.7,0.769,9.4,34.9,44.3,22.5,8.1,4.3,16.2,20.1,104.6
+22,Denver Nuggets,82,241.8,38.8,84.2,0.461,9.2,24.8,0.371,29.6,59.4,0.498,18.2,23.9,0.761,9.7,32.9,42.7,23.5,8,6.3,13.7,20.9,105
+23,Minnesota Timberwolves,82,242.4,40,84.9,0.471,9,25.5,0.355,30.9,59.4,0.52,17,22.5,0.757,10.7,31.2,41.9,22.6,7.8,5.2,14.9,21.6,106
+24,Brooklyn Nets,82,240.9,40.8,85.2,0.479,9.5,25.6,0.369,31.3,59.6,0.526,15,19.6,0.763,10.2,33.2,43.4,24.5,8.8,5.2,14.2,18.4,106
+25,Houston Rockets,82,241.8,39,85.1,0.459,9.7,26.9,0.361,29.3,58.2,0.504,18.6,24.6,0.756,11.8,32.8,44.6,24.6,9,4.9,16.6,22.5,106.4
+26,New Orleans Pelicans,82,241.2,39.2,83.9,0.468,9.2,24.9,0.369,30,59,0.51,18.8,24,0.783,8.9,35.5,44.4,23.2,7.3,5.2,13.7,19.9,106.5
+27,Los Angeles Lakers,82,240.6,40.5,85.6,0.473,8.5,24.6,0.347,32,61.1,0.524,17.3,23.7,0.731,10.9,35.5,46.5,24.7,7.5,5.6,12.6,19.2,106.9
+28,Phoenix Suns,82,240.3,39.1,83.8,0.467,9.4,24.9,0.377,29.7,58.9,0.505,19.9,26.5,0.749,9.9,33.8,43.7,22.4,9.5,5.5,14.9,21.6,107.5
+29,Philadelphia 76ers,82,241.5,39.7,85.4,0.464,7.8,21.7,0.359,31.9,63.8,0.5,20.5,26.1,0.786,11.1,36.4,47.6,23.4,8.7,5.7,15.1,19.2,107.6
+30,Sacramento Kings,82,241.5,40.6,87.7,0.462,10.2,28,0.366,30.3,59.8,0.508,17.7,23.2,0.762,11.3,33.7,45,24.2,8.8,5.3,16,22,109.1
diff --git a/other/data/2010年-2020年NBA球员数据排行TOP50.xls b/other/data/2010年-2020年NBA球员数据排行TOP50.xls
new file mode 100644
index 0000000..8cb7d5c
Binary files /dev/null and b/other/data/2010年-2020年NBA球员数据排行TOP50.xls differ
diff --git a/other/data/2020-2021_result.csv b/other/data/2020-2021_result.csv
new file mode 100644
index 0000000..76c5b21
--- /dev/null
+++ b/other/data/2020-2021_result.csv
@@ -0,0 +1,1317 @@
+WTeam,LTeam,WLoc
+Atlanta Hawks,New York Knicks,V
+San Antonio Spurs,Brooklyn Nets,H
+Memphis Grizzlies,Brooklyn Nets,H
+Chicago Bulls,Brooklyn Nets,V
+Detroit Pistons,Chicago Bulls,H
+Miami Heat,Charlotte Hornets,H
+Atlanta Hawks,Charlotte Hornets,H
+Chicago Bulls,Cleveland Cavaliers,H
+Cleveland Cavaliers,Memphis Grizzlies,V
+Dallas Mavericks,Phoenix Suns,V
+Los Angeles Clippers,Dallas Mavericks,H
+Denver Nuggets,Houston Rockets,V
+Detroit Pistons,Atlanta Hawks,V
+Golden State Warriors,Houston Rockets,V
+Golden State Warriors,New Orleans Pelicans,V
+Toronto Raptors,Indiana Pacers,H
+Los Angeles Clippers,Sacramento Kings,V
+Sacramento Kings,Los Angeles Lakers,H
+Memphis Grizzlies,Indiana Pacers,V
+Cleveland Cavaliers,Miami Heat,H
+Minnesota Timberwolves,Los Angeles Lakers,V
+Minnesota Timberwolves,Denver Nuggets,V
+Golden State Warriors,New Orleans Pelicans,H
+Portland Trail Blazers,New Orleans Pelicans,H
+New York Knicks,Milwaukee Bucks,V
+New York Knicks,Washington Wizards,V
+Oklahoma City Thunder,Orlando Magic,V
+Boston Celtics,Philadelphia 76ers,H
+Phoenix Suns,Portland Trail Blazers,V
+Phoenix Suns,Portland Trail Blazers,H
+Los Angeles Clippers,Sacramento Kings,H
+Oklahoma City Thunder,San Antonio Spurs,H
+Toronto Raptors,Boston Celtics,V
+Detroit Pistons,Utah Jazz,H
+Utah Jazz,Philadelphia 76ers,V
+Utah Jazz,Indiana Pacers,V
+Washington Wizards,Orlando Magic,V
+Washington Wizards,Milwaukee Bucks,V
+San Antonio Spurs,Boston Celtics,V
+Chicago Bulls,Orlando Magic,H
+Atlanta Hawks,Charlotte Hornets,V
+Dallas Mavericks,Los Angeles Lakers,V
+Miami Heat,Houston Rockets,H
+Oklahoma City Thunder,Denver Nuggets,H
+Toronto Raptors,Milwaukee Bucks,H
+Milwaukee Bucks,Brooklyn Nets,V
+Golden State Warriors,Memphis Grizzlies,H
+Houston Rockets,Oklahoma City Thunder,H
+Los Angeles Clippers,Phoenix Suns,H
+Portland Trail Blazers,Minnesota Timberwolves,V
+San Antonio Spurs,New York Knicks,V
+Cleveland Cavaliers,Philadelphia 76ers,V
+Charlotte Hornets,Chicago Bulls,H
+Toronto Raptors,Dallas Mavericks,V
+Indiana Pacers,Detroit Pistons,V
+Denver Nuggets,Los Angeles Lakers,V
+Atlanta Hawks,Miami Heat,V
+Orlando Magic,New Orleans Pelicans,V
+Memphis Grizzlies,Sacramento Kings,V
+Atlanta Hawks,Brooklyn Nets,H
+Cleveland Cavaliers,New York Knicks,H
+Golden State Warriors,Los Angeles Clippers,H
+Houston Rockets,Orlando Magic,H
+Indiana Pacers,Boston Celtics,H
+Milwaukee Bucks,Philadelphia 76ers,H
+Toronto Raptors,Oklahoma City Thunder,V
+Phoenix Suns,Sacramento Kings,H
+Portland Trail Blazers,Utah Jazz,V
+Washington Wizards,San Antonio Spurs,H
+Chicago Bulls,Oklahoma City Thunder,H
+Charlotte Hornets,Dallas Mavericks,V
+Utah Jazz,Denver Nuggets,V
+Miami Heat,Minnesota Timberwolves,V
+Portland Trail Blazers,Memphis Grizzlies,H
+Boston Celtics,Washington Wizards,H
+Los Angeles Lakers,Brooklyn Nets,V
+Cleveland Cavaliers,Philadelphia 76ers,H
+Golden State Warriors,Denver Nuggets,H
+Indiana Pacers,Miami Heat,H
+Atlanta Hawks,New Orleans Pelicans,V
+Milwaukee Bucks,New York Knicks,V
+Orlando Magic,Toronto Raptors,H
+Detroit Pistons,Phoenix Suns,V
+Houston Rockets,Sacramento Kings,V
+Atlanta Hawks,Washington Wizards,H
+Minnesota Timberwolves,Chicago Bulls,V
+Dallas Mavericks,New Orleans Pelicans,H
+Houston Rockets,Los Angeles Clippers,V
+Milwaukee Bucks,Brooklyn Nets,H
+Orlando Magic,Philadelphia 76ers,V
+Golden State Warriors,Sacramento Kings,V
+San Antonio Spurs,Charlotte Hornets,H
+Utah Jazz,Memphis Grizzlies,H
+Cleveland Cavaliers,Indiana Pacers,H
+Miami Heat,Toronto Raptors,H
+New York Knicks,Los Angeles Lakers,H
+Oklahoma City Thunder,Phoenix Suns,H
+Detroit Pistons,Portland Trail Blazers,V
+Minnesota Timberwolves,Atlanta Hawks,V
+Denver Nuggets,Portland Trail Blazers,H
+Golden State Warriors,Detroit Pistons,H
+Indiana Pacers,Orlando Magic,H
+Los Angeles Clippers,Memphis Grizzlies,H
+Chicago Bulls,Philadelphia 76ers,V
+San Antonio Spurs,Sacramento Kings,V
+Cleveland Cavaliers,Utah Jazz,H
+Miami Heat,Los Angeles Lakers,H
+Boston Celtics,Milwaukee Bucks,V
+Charlotte Hornets,Minnesota Timberwolves,V
+New Orleans Pelicans,Dallas Mavericks,H
+New York Knicks,Toronto Raptors,V
+Oklahoma City Thunder,Washington Wizards,V
+Atlanta Hawks,New Orleans Pelicans,H
+Indiana Pacers,Boston Celtics,V
+Charlotte Hornets,New York Knicks,H
+Dallas Mavericks,Los Angeles Clippers,H
+Denver Nuggets,Milwaukee Bucks,H
+Brooklyn Nets,Houston Rockets,V
+Golden State Warriors,Memphis Grizzlies,V
+Orlando Magic,Los Angeles Lakers,H
+Toronto Raptors,Philadelphia 76ers,V
+San Antonio Spurs,Portland Trail Blazers,V
+Sacramento Kings,Detroit Pistons,H
+Miami Heat,Utah Jazz,H
+Golden State Warriors,Minnesota Timberwolves,V
+Phoenix Suns,Los Angeles Clippers,H
+Boston Celtics,Atlanta Hawks,H
+Chicago Bulls,Charlotte Hornets,H
+Dallas Mavericks,Los Angeles Lakers,H
+Denver Nuggets,Houston Rockets,H
+Indiana Pacers,Minnesota Timberwolves,H
+Memphis Grizzlies,Portland Trail Blazers,H
+Cleveland Cavaliers,New York Knicks,V
+Oklahoma City Thunder,Philadelphia 76ers,H
+Orlando Magic,Utah Jazz,H
+Sacramento Kings,Brooklyn Nets,H
+Toronto Raptors,New Orleans Pelicans,H
+Golden State Warriors,Brooklyn Nets,H
+Dallas Mavericks,Houston Rockets,V
+Los Angeles Clippers,Detroit Pistons,H
+Milwaukee Bucks,Cleveland Cavaliers,H
+Phoenix Suns,Denver Nuggets,H
+San Antonio Spurs,Philadelphia 76ers,H
+Washington Wizards,Orlando Magic,H
+Utah Jazz,Atlanta Hawks,V
+Charlotte Hornets,Portland Trail Blazers,H
+Los Angeles Lakers,Detroit Pistons,H
+Memphis Grizzlies,Minnesota Timberwolves,V
+New York Knicks,New Orleans Pelicans,H
+Boston Celtics,Oklahoma City Thunder,V
+Sacramento Kings,Toronto Raptors,H
+Chicago Bulls,Indiana Pacers,H
+Boston Celtics,Houston Rockets,V
+Memphis Grizzlies,Oklahoma City Thunder,H
+Dallas Mavericks,Philadelphia 76ers,V
+Phoenix Suns,Los Angeles Lakers,H
+San Antonio Spurs,Portland Trail Blazers,H
+Brooklyn Nets,Atlanta Hawks,H
+Detroit Pistons,Cleveland Cavaliers,H
+Golden State Warriors,Toronto Raptors,H
+Minnesota Timberwolves,Miami Heat,V
+Denver Nuggets,New Orleans Pelicans,V
+New York Knicks,Charlotte Hornets,H
+Washington Wizards,Milwaukee Bucks,H
+Atlanta Hawks,Sacramento Kings,H
+Dallas Mavericks,Boston Celtics,V
+Charlotte Hornets,Brooklyn Nets,H
+Houston Rockets,Portland Trail Blazers,H
+Oklahoma City Thunder,New Orleans Pelicans,H
+Orlando Magic,Minnesota Timberwolves,H
+Indiana Pacers,Philadelphia 76ers,V
+Chicago Bulls,Phoenix Suns,V
+San Antonio Spurs,Denver Nuggets,H
+Utah Jazz,Toronto Raptors,H
+Cleveland Cavaliers,Milwaukee Bucks,H
+Golden State Warriors,Los Angeles Clippers,V
+Miami Heat,Sacramento Kings,H
+Boston Celtics,Brooklyn Nets,H
+Charlotte Hornets,Philadelphia 76ers,H
+Dallas Mavericks,Utah Jazz,H
+Phoenix Suns,Denver Nuggets,V
+Golden State Warriors,Chicago Bulls,H
+Toronto Raptors,Los Angeles Lakers,V
+Memphis Grizzlies,Houston Rockets,H
+Detroit Pistons,Minnesota Timberwolves,V
+New Orleans Pelicans,San Antonio Spurs,H
+New York Knicks,Oklahoma City Thunder,V
+Portland Trail Blazers,Los Angeles Clippers,H
+Cleveland Cavaliers,Atlanta Hawks,H
+Washington Wizards,Detroit Pistons,V
+New York Knicks,Houston Rockets,V
+Indiana Pacers,Milwaukee Bucks,H
+Miami Heat,Philadelphia 76ers,H
+Sacramento Kings,Orlando Magic,V
+San Antonio Spurs,Memphis Grizzlies,H
+Brooklyn Nets,Boston Celtics,H
+Golden State Warriors,Denver Nuggets,V
+Toronto Raptors,Los Angeles Clippers,V
+Portland Trail Blazers,Los Angeles Lakers,V
+New Orleans Pelicans,Phoenix Suns,H
+Oklahoma City Thunder,Dallas Mavericks,H
+Charlotte Hornets,Sacramento Kings,H
+Cleveland Cavaliers,Orlando Magic,H
+Miami Heat,New York Knicks,H
+Milwaukee Bucks,Detroit Pistons,H
+Minnesota Timberwolves,Philadelphia 76ers,H
+San Antonio Spurs,Phoenix Suns,H
+Oklahoma City Thunder,Utah Jazz,V
+Atlanta Hawks,Boston Celtics,H
+Los Angeles Clippers,Denver Nuggets,V
+Golden State Warriors,Los Angeles Lakers,H
+Memphis Grizzlies,Dallas Mavericks,H
+Chicago Bulls,Portland Trail Blazers,V
+Indiana Pacers,Washington Wizards,V
+Boston Celtics,Philadelphia 76ers,H
+Charlotte Hornets,Washington Wizards,H
+Detroit Pistons,Miami Heat,H
+Memphis Grizzlies,Houston Rockets,V
+Utah Jazz,Los Angeles Clippers,V
+Sacramento Kings,Milwaukee Bucks,V
+Minnesota Timberwolves,Atlanta Hawks,H
+Oklahoma City Thunder,Brooklyn Nets,H
+Orlando Magic,New York Knicks,H
+New Orleans Pelicans,Phoenix Suns,V
+San Antonio Spurs,Dallas Mavericks,H
+Toronto Raptors,Cleveland Cavaliers,H
+Boston Celtics,Washington Wizards,H
+Cleveland Cavaliers,Charlotte Hornets,V
+San Antonio Spurs,Denver Nuggets,V
+Houston Rockets,Philadelphia 76ers,H
+Indiana Pacers,Chicago Bulls,H
+Los Angeles Clippers,New Orleans Pelicans,H
+Atlanta Hawks,Memphis Grizzlies,V
+Miami Heat,New York Knicks,V
+Oklahoma City Thunder,Detroit Pistons,H
+Orlando Magic,Milwaukee Bucks,H
+Golden State Warriors,Phoenix Suns,V
+Minnesota Timberwolves,Sacramento Kings,V
+Cleveland Cavaliers,Brooklyn Nets,H
+Dallas Mavericks,Denver Nuggets,H
+Golden State Warriors,Sacramento Kings,H
+Portland Trail Blazers,Los Angeles Lakers,H
+San Antonio Spurs,Atlanta Hawks,H
+Utah Jazz,New Orleans Pelicans,H
+Toronto Raptors,Washington Wizards,V
+Brooklyn Nets,Detroit Pistons,H
+Charlotte Hornets,Milwaukee Bucks,H
+Los Angeles Clippers,Minnesota Timberwolves,H
+Indiana Pacers,Los Angeles Lakers,V
+Memphis Grizzlies,Philadelphia 76ers,H
+Houston Rockets,New York Knicks,V
+Orlando Magic,Boston Celtics,H
+Phoenix Suns,Toronto Raptors,V
+Atlanta Hawks,Oklahoma City Thunder,H
+Chicago Bulls,San Antonio Spurs,H
+Detroit Pistons,Houston Rockets,H
+Los Angeles Clippers,Portland Trail Blazers,H
+Boston Celtics,Miami Heat,V
+Milwaukee Bucks,Denver Nuggets,H
+Sacramento Kings,Dallas Mavericks,H
+Golden State Warriors,Utah Jazz,V
+Brooklyn Nets,Phoenix Suns,H
+Washington Wizards,Cleveland Cavaliers,V
+Orlando Magic,Minnesota Timberwolves,V
+Memphis Grizzlies,New Orleans Pelicans,V
+Philadelphia 76ers,Los Angeles Lakers,H
+Dallas Mavericks,Portland Trail Blazers,V
+Toronto Raptors,Atlanta Hawks,V
+Chicago Bulls,Denver Nuggets,H
+Golden State Warriors,Charlotte Hornets,V
+Detroit Pistons,Phoenix Suns,H
+Houston Rockets,New Orleans Pelicans,H
+Indiana Pacers,Los Angeles Clippers,V
+New York Knicks,Philadelphia 76ers,H
+San Antonio Spurs,Milwaukee Bucks,H
+Los Angeles Lakers,Washington Wizards,V
+San Antonio Spurs,Memphis Grizzlies,V
+Miami Heat,Oklahoma City Thunder,H
+Portland Trail Blazers,Indiana Pacers,H
+Boston Celtics,Sacramento Kings,V
+Denver Nuggets,Toronto Raptors,V
+Orlando Magic,Utah Jazz,V
+Atlanta Hawks,Los Angeles Lakers,H
+Houston Rockets,Dallas Mavericks,V
+Detroit Pistons,Milwaukee Bucks,H
+New Orleans Pelicans,Cleveland Cavaliers,H
+New York Knicks,Brooklyn Nets,H
+Washington Wizards,Phoenix Suns,H
+Charlotte Hornets,Chicago Bulls,V
+Houston Rockets,Sacramento Kings,H
+Los Angeles Clippers,Orlando Magic,H
+Miami Heat,Cleveland Cavaliers,H
+Milwaukee Bucks,New York Knicks,H
+Portland Trail Blazers,Minnesota Timberwolves,V
+Denver Nuggets,Philadelphia 76ers,V
+San Antonio Spurs,Boston Celtics,H
+Golden State Warriors,Toronto Raptors,V
+Utah Jazz,Indiana Pacers,H
+Golden State Warriors,Brooklyn Nets,V
+Detroit Pistons,Los Angeles Lakers,H
+Memphis Grizzlies,Phoenix Suns,H
+Oklahoma City Thunder,Sacramento Kings,H
+Dallas Mavericks,Washington Wizards,V
+Phoenix Suns,Chicago Bulls,V
+Charlotte Hornets,Detroit Pistons,H
+Washington Wizards,Miami Heat,V
+Milwaukee Bucks,Portland Trail Blazers,H
+Los Angeles Clippers,Minnesota Timberwolves,V
+Boston Celtics,New Orleans Pelicans,V
+Dallas Mavericks,New York Knicks,V
+San Antonio Spurs,Philadelphia 76ers,V
+Toronto Raptors,Los Angeles Lakers,H
+Brooklyn Nets,Houston Rockets,H
+Cleveland Cavaliers,Portland Trail Blazers,H
+Orlando Magic,Denver Nuggets,V
+Golden State Warriors,Indiana Pacers,V
+Oklahoma City Thunder,Memphis Grizzlies,V
+Sacramento Kings,Utah Jazz,H
+Boston Celtics,Chicago Bulls,H
+Charlotte Hornets,Miami Heat,H
+Atlanta Hawks,Dallas Mavericks,V
+Memphis Grizzlies,Detroit Pistons,V
+Los Angeles Clippers,Milwaukee Bucks,V
+Minnesota Timberwolves,Los Angeles Lakers,H
+Phoenix Suns,Orlando Magic,H
+Toronto Raptors,San Antonio Spurs,H
+Utah Jazz,New York Knicks,H
+Houston Rockets,Washington Wizards,V
+Brooklyn Nets,Philadelphia 76ers,H
+Chicago Bulls,Los Angeles Clippers,H
+Oklahoma City Thunder,Atlanta Hawks,H
+Sacramento Kings,New York Knicks,H
+Golden State Warriors,Boston Celtics,V
+Denver Nuggets,Minnesota Timberwolves,H
+Indiana Pacers,Miami Heat,H
+Charlotte Hornets,Memphis Grizzlies,V
+New Orleans Pelicans,Washington Wizards,H
+Cleveland Cavaliers,Orlando Magic,V
+Detroit Pistons,Philadelphia 76ers,V
+Portland Trail Blazers,Phoenix Suns,V
+San Antonio Spurs,Los Angeles Lakers,H
+Toronto Raptors,Milwaukee Bucks,H
+Oklahoma City Thunder,Utah Jazz,V
+San Antonio Spurs,Atlanta Hawks,V
+Los Angeles Clippers,Brooklyn Nets,V
+Chicago Bulls,New Orleans Pelicans,H
+Boston Celtics,Charlotte Hornets,V
+Washington Wizards,Dallas Mavericks,V
+Detroit Pistons,Indiana Pacers,H
+Houston Rockets,Los Angeles Lakers,H
+Milwaukee Bucks,Golden State Warriors,H
+New York Knicks,Portland Trail Blazers,V
+Miami Heat,Memphis Grizzlies,H
+Oklahoma City Thunder,Utah Jazz,H
+Phoenix Suns,Minnesota Timberwolves,H
+Toronto Raptors,Philadelphia 76ers,H
+Miami Heat,Atlanta Hawks,V
+Orlando Magic,Brooklyn Nets,V
+Chicago Bulls,Philadelphia 76ers,H
+Dallas Mavericks,Phoenix Suns,H
+Denver Nuggets,Houston Rockets,H
+Los Angeles Clippers,Detroit Pistons,V
+Indiana Pacers,Toronto Raptors,H
+Memphis Grizzlies,Washington Wizards,H
+Portland Trail Blazers,New Orleans Pelicans,H
+San Antonio Spurs,Utah Jazz,H
+Cleveland Cavaliers,Boston Celtics,V
+Los Angeles Lakers,Milwaukee Bucks,H
+Denver Nuggets,Minnesota Timberwolves,V
+Sacramento Kings,Houston Rockets,H
+Atlanta Hawks,Philadelphia 76ers,H
+Miami Heat,Brooklyn Nets,V
+Chicago Bulls,Memphis Grizzlies,H
+Detroit Pistons,Boston Celtics,H
+Golden State Warriors,Phoenix Suns,H
+Indiana Pacers,Dallas Mavericks,H
+Los Angeles Clippers,Milwaukee Bucks,H
+New York Knicks,Minnesota Timberwolves,H
+Oklahoma City Thunder,Portland Trail Blazers,H
+Orlando Magic,Charlotte Hornets,H
+San Antonio Spurs,Washington Wizards,H
+New Orleans Pelicans,Utah Jazz,V
+Charlotte Hornets,Toronto Raptors,H
+Cleveland Cavaliers,Oklahoma City Thunder,H
+Houston Rockets,Los Angeles Lakers,V
+Atlanta Hawks,Boston Celtics,V
+Detroit Pistons,Chicago Bulls,V
+Dallas Mavericks,Memphis Grizzlies,H
+Golden State Warriors,Milwaukee Bucks,H
+Indiana Pacers,Brooklyn Nets,H
+Toronto Raptors,Miami Heat,V
+Minnesota Timberwolves,Sacramento Kings,H
+Orlando Magic,Portland Trail Blazers,H
+New York Knicks,Philadelphia 76ers,V
+Phoenix Suns,New Orleans Pelicans,H
+San Antonio Spurs,Los Angeles Clippers,H
+Utah Jazz,Denver Nuggets,H
+Houston Rockets,Los Angeles Clippers,H
+Memphis Grizzlies,Indiana Pacers,H
+New York Knicks,Chicago Bulls,H
+Oklahoma City Thunder,Los Angeles Lakers,H
+Washington Wizards,Charlotte Hornets,H
+Minnesota Timberwolves,Brooklyn Nets,V
+Cleveland Cavaliers,Philadelphia 76ers,H
+New Orleans Pelicans,Denver Nuggets,V
+Miami Heat,Portland Trail Blazers,H
+Atlanta Hawks,Orlando Magic,V
+Milwaukee Bucks,Phoenix Suns,V
+Sacramento Kings,Toronto Raptors,V
+Atlanta Hawks,Portland Trail Blazers,H
+Boston Celtics,Minnesota Timberwolves,H
+Brooklyn Nets,Chicago Bulls,V
+Houston Rockets,Charlotte Hornets,H
+Oklahoma City Thunder,Los Angeles Clippers,V
+Orlando Magic,New York Knicks,V
+San Antonio Spurs,Indiana Pacers,H
+Utah Jazz,Phoenix Suns,H
+Washington Wizards,Sacramento Kings,H
+Los Angeles Lakers,Denver Nuggets,V
+Detroit Pistons,Miami Heat,V
+Memphis Grizzlies,Philadelphia 76ers,V
+Toronto Raptors,Dallas Mavericks,H
+Atlanta Hawks,Detroit Pistons,H
+Dallas Mavericks,Brooklyn Nets,V
+Boston Celtics,Charlotte Hornets,V
+Cleveland Cavaliers,New York Knicks,H
+Golden State Warriors,Utah Jazz,H
+Sacramento Kings,Indiana Pacers,V
+Oklahoma City Thunder,Los Angeles Lakers,V
+Milwaukee Bucks,Philadelphia 76ers,H
+San Antonio Spurs,Minnesota Timberwolves,V
+New Orleans Pelicans,Portland Trail Blazers,H
+Orlando Magic,Houston Rockets,H
+Denver Nuggets,Phoenix Suns,V
+Washington Wizards,Memphis Grizzlies,H
+Golden State Warriors,Cleveland Cavaliers,H
+Houston Rockets,San Antonio Spurs,H
+Los Angeles Clippers,Los Angeles Lakers,V
+Miami Heat,New Orleans Pelicans,H
+Chicago Bulls,Oklahoma City Thunder,V
+Atlanta Hawks,New York Knicks,H
+Washington Wizards,Brooklyn Nets,V
+Charlotte Hornets,Memphis Grizzlies,H
+Dallas Mavericks,Chicago Bulls,H
+Boston Celtics,Detroit Pistons,V
+Toronto Raptors,Milwaukee Bucks,V
+Indiana Pacers,Minnesota Timberwolves,V
+New Orleans Pelicans,Houston Rockets,H
+Miami Heat,Orlando Magic,V
+Philadelphia 76ers,Phoenix Suns,V
+Portland Trail Blazers,Cleveland Cavaliers,H
+San Antonio Spurs,Denver Nuggets,H
+Los Angeles Clippers,Utah Jazz,V
+Boston Celtics,New York Knicks,H
+Memphis Grizzlies,Los Angeles Lakers,H
+Oklahoma City Thunder,Denver Nuggets,H
+Portland Trail Blazers,Sacramento Kings,V
+Chicago Bulls,Toronto Raptors,H
+Charlotte Hornets,Los Angeles Lakers,H
+Dallas Mavericks,Milwaukee Bucks,H
+Golden State Warriors,Sacramento Kings,H
+Indiana Pacers,Atlanta Hawks,H
+Brooklyn Nets,Miami Heat,V
+Orlando Magic,New Orleans Pelicans,H
+Cleveland Cavaliers,Phoenix Suns,V
+San Antonio Spurs,Minnesota Timberwolves,H
+Utah Jazz,Philadelphia 76ers,H
+Los Angeles Clippers,Washington Wizards,V
+Cleveland Cavaliers,Denver Nuggets,V
+Atlanta Hawks,Houston Rockets,V
+Memphis Grizzlies,Miami Heat,H
+New York Knicks,Detroit Pistons,H
+Oklahoma City Thunder,Milwaukee Bucks,H
+Los Angeles Lakers,Boston Celtics,V
+Chicago Bulls,Indiana Pacers,H
+Los Angeles Clippers,Charlotte Hornets,V
+Dallas Mavericks,Golden State Warriors,H
+Minnesota Timberwolves,Utah Jazz,H
+Orlando Magic,Brooklyn Nets,H
+Portland Trail Blazers,Denver Nuggets,H
+Philadelphia 76ers,Sacramento Kings,V
+San Antonio Spurs,Phoenix Suns,H
+Toronto Raptors,Washington Wizards,H
+Detroit Pistons,Minnesota Timberwolves,H
+Golden State Warriors,Houston Rockets,V
+Milwaukee Bucks,Indiana Pacers,V
+Los Angeles Clippers,New Orleans Pelicans,V
+Oklahoma City Thunder,Phoenix Suns,H
+Utah Jazz,Portland Trail Blazers,H
+Chicago Bulls,New York Knicks,H
+Los Angeles Lakers,Philadelphia 76ers,H
+Miami Heat,Dallas Mavericks,H
+Toronto Raptors,Charlotte Hornets,H
+Washington Wizards,Orlando Magic,H
+Brooklyn Nets,Boston Celtics,V
+Oklahoma City Thunder,Charlotte Hornets,V
+Cleveland Cavaliers,Orlando Magic,H
+New Orleans Pelicans,Dallas Mavericks,V
+Golden State Warriors,Denver Nuggets,H
+Indiana Pacers,Detroit Pistons,H
+Los Angeles Clippers,Philadelphia 76ers,H
+Milwaukee Bucks,Minnesota Timberwolves,V
+Sacramento Kings,Phoenix Suns,H
+San Antonio Spurs,Houston Rockets,H
+Utah Jazz,Memphis Grizzlies,H
+Portland Trail Blazers,Denver Nuggets,V
+Los Angeles Lakers,Phoenix Suns,H
+New York Knicks,Atlanta Hawks,H
+Chicago Bulls,Toronto Raptors,V
+Miami Heat,Washington Wizards,V
+Boston Celtics,Brooklyn Nets,V
+Cleveland Cavaliers,Toronto Raptors,H
+Detroit Pistons,Orlando Magic,H
+Golden State Warriors,Charlotte Hornets,H
+Miami Heat,Indiana Pacers,H
+San Antonio Spurs,Milwaukee Bucks,V
+Sacramento Kings,Oklahoma City Thunder,V
+Philadelphia 76ers,Minnesota Timberwolves,H
+Memphis Grizzlies,Portland Trail Blazers,V
+Houston Rockets,Utah Jazz,V
+New York Knicks,Atlanta Hawks,V
+Chicago Bulls,Milwaukee Bucks,H
+Dallas Mavericks,Sacramento Kings,H
+Golden State Warriors,Los Angeles Lakers,V
+Detroit Pistons,Boston Celtics,V
+Toronto Raptors,Brooklyn Nets,V
+New York Knicks,Miami Heat,V
+Denver Nuggets,Minnesota Timberwolves,V
+Dallas Mavericks,New Orleans Pelicans,V
+Oklahoma City Thunder,Memphis Grizzlies,H
+Indiana Pacers,Orlando Magic,V
+Phoenix Suns,Charlotte Hornets,H
+Los Angeles Clippers,Portland Trail Blazers,V
+San Antonio Spurs,Utah Jazz,H
+Cleveland Cavaliers,Washington Wizards,V
+Chicago Bulls,Boston Celtics,H
+Houston Rockets,Utah Jazz,H
+Atlanta Hawks,Philadelphia 76ers,V
+Sacramento Kings,Los Angeles Lakers,H
+Orlando Magic,Brooklyn Nets,V
+Oklahoma City Thunder,Los Angeles Lakers,V
+Memphis Grizzlies,Denver Nuggets,H
+Milwaukee Bucks,Dallas Mavericks,H
+Cleveland Cavaliers,Minnesota Timberwolves,V
+Indiana Pacers,New Orleans Pelicans,V
+Miami Heat,Phoenix Suns,V
+Golden State Warriors,Portland Trail Blazers,V
+San Antonio Spurs,New York Knicks,H
+Toronto Raptors,Washington Wizards,V
+Atlanta Hawks,Chicago Bulls,H
+Detroit Pistons,Brooklyn Nets,H
+Los Angeles Clippers,Charlotte Hornets,H
+Washington Wizards,Orlando Magic,V
+Toronto Raptors,Philadelphia 76ers,V
+Golden State Warriors,Sacramento Kings,V
+Utah Jazz,Miami Heat,H
+Denver Nuggets,Charlotte Hornets,H
+Houston Rockets,Indiana Pacers,H
+Los Angeles Clippers,New Orleans Pelicans,H
+Utah Jazz,Los Angeles Lakers,V
+Memphis Grizzlies,Boston Celtics,H
+Dallas Mavericks,Minnesota Timberwolves,V
+New York Knicks,Milwaukee Bucks,H
+Cleveland Cavaliers,Philadelphia 76ers,V
+Portland Trail Blazers,Oklahoma City Thunder,H
+San Antonio Spurs,Brooklyn Nets,V
+Washington Wizards,Chicago Bulls,V
+Golden State Warriors,Miami Heat,H
+Cleveland Cavaliers,Dallas Mavericks,V
+San Antonio Spurs,Detroit Pistons,V
+Indiana Pacers,Phoenix Suns,H
+Los Angeles Lakers,New Orleans Pelicans,H
+Houston Rockets,Memphis Grizzlies,V
+Milwaukee Bucks,Chicago Bulls,H
+Oklahoma City Thunder,Minnesota Timberwolves,V
+New York Knicks,Boston Celtics,H
+Boston Celtics,Indiana Pacers,H
+Brooklyn Nets,New York Knicks,H
+Charlotte Hornets,Atlanta Hawks,H
+Denver Nuggets,Golden State Warriors,H
+Houston Rockets,Minnesota Timberwolves,H
+Los Angeles Clippers,Miami Heat,H
+Oklahoma City Thunder,Dallas Mavericks,H
+Portland Trail Blazers,Utah Jazz,H
+New Orleans Pelicans,Sacramento Kings,V
+Washington Wizards,Milwaukee Bucks,H
+Golden State Warriors,Los Angeles Lakers,H
+Memphis Grizzlies,Detroit Pistons,H
+Toronto Raptors,Orlando Magic,V
+Chicago Bulls,Philadelphia 76ers,V
+San Antonio Spurs,Cleveland Cavaliers,H
+Sacramento Kings,Utah Jazz,V
+Boston Celtics,Phoenix Suns,H
+Portland Trail Blazers,Brooklyn Nets,V
+Dallas Mavericks,Chicago Bulls,V
+Miami Heat,Denver Nuggets,V
+Cleveland Cavaliers,Houston Rockets,V
+Washington Wizards,Indiana Pacers,V
+Milwaukee Bucks,Atlanta Hawks,H
+New Orleans Pelicans,Charlotte Hornets,H
+Oklahoma City Thunder,Minnesota Timberwolves,H
+Atlanta Hawks,Brooklyn Nets,H
+Milwaukee Bucks,Charlotte Hornets,V
+Detroit Pistons,Golden State Warriors,H
+Sacramento Kings,Los Angeles Clippers,V
+Memphis Grizzlies,New York Knicks,H
+Philadelphia 76ers,Portland Trail Blazers,H
+Utah Jazz,Los Angeles Lakers,H
+Boston Celtics,Washington Wizards,V
+Denver Nuggets,Indiana Pacers,H
+Houston Rockets,Los Angeles Lakers,V
+Minnesota Timberwolves,Phoenix Suns,H
+Oklahoma City Thunder,Miami Heat,H
+San Antonio Spurs,Dallas Mavericks,H
+Atlanta Hawks,Orlando Magic,H
+Charlotte Hornets,Utah Jazz,H
+Golden State Warriors,Cleveland Cavaliers,V
+Dallas Mavericks,Boston Celtics,H
+Chicago Bulls,Detroit Pistons,V
+Los Angeles Clippers,Houston Rockets,H
+Memphis Grizzlies,New Orleans Pelicans,H
+New York Knicks,Philadelphia 76ers,H
+Toronto Raptors,Brooklyn Nets,H
+Portland Trail Blazers,Washington Wizards,V
+Oklahoma City Thunder,Denver Nuggets,V
+Milwaukee Bucks,Miami Heat,V
+New Orleans Pelicans,Minnesota Timberwolves,H
+Indiana Pacers,Phoenix Suns,V
+Cleveland Cavaliers,Brooklyn Nets,V
+Golden State Warriors,Chicago Bulls,V
+Dallas Mavericks,Minnesota Timberwolves,H
+Detroit Pistons,Houston Rockets,V
+Sacramento Kings,Los Angeles Lakers,V
+New York Knicks,Utah Jazz,H
+Oklahoma City Thunder,Charlotte Hornets,H
+Philadelphia 76ers,Orlando Magic,V
+Atlanta Hawks,Portland Trail Blazers,V
+Toronto Raptors,Boston Celtics,H
+Washington Wizards,Miami Heat,H
+Cleveland Cavaliers,Los Angeles Clippers,H
+Memphis Grizzlies,Denver Nuggets,V
+New Orleans Pelicans,Detroit Pistons,H
+San Antonio Spurs,Phoenix Suns,V
+Sacramento Kings,Atlanta Hawks,H
+Boston Celtics,Chicago Bulls,H
+Utah Jazz,Brooklyn Nets,V
+Oklahoma City Thunder,Dallas Mavericks,V
+Golden State Warriors,Indiana Pacers,H
+Houston Rockets,Milwaukee Bucks,H
+San Antonio Spurs,Los Angeles Lakers,V
+Los Angeles Clippers,New York Knicks,V
+Charlotte Hornets,Orlando Magic,V
+Toronto Raptors,Miami Heat,H
+Charlotte Hornets,New York Knicks,H
+Chicago Bulls,Cleveland Cavaliers,V
+Denver Nuggets,Detroit Pistons,H
+Minnesota Timberwolves,Memphis Grizzlies,H
+New Orleans Pelicans,Milwaukee Bucks,H
+Phoenix Suns,Atlanta Hawks,H
+Portland Trail Blazers,Los Angeles Lakers,H
+Sacramento Kings,Indiana Pacers,H
+Brooklyn Nets,Oklahoma City Thunder,H
+Houston Rockets,Dallas Mavericks,H
+Boston Celtics,Philadelphia 76ers,V
+Toronto Raptors,Los Angeles Clippers,H
+Miami Heat,Chicago Bulls,V
+Cleveland Cavaliers,Minnesota Timberwolves,H
+Atlanta Hawks,Denver Nuggets,V
+Golden State Warriors,San Antonio Spurs,H
+Memphis Grizzlies,Orlando Magic,H
+Houston Rockets,New Orleans Pelicans,V
+Charlotte Hornets,Sacramento Kings,V
+Detroit Pistons,Utah Jazz,V
+Boston Celtics,Washington Wizards,V
+Miami Heat,Brooklyn Nets,V
+Los Angeles Clippers,Indiana Pacers,V
+Dallas Mavericks,Los Angeles Lakers,V
+Milwaukee Bucks,Orlando Magic,H
+Oklahoma City Thunder,New York Knicks,V
+Philadelphia 76ers,Phoenix Suns,H
+Portland Trail Blazers,Sacramento Kings,H
+Toronto Raptors,Washington Wizards,H
+Los Angeles Clippers,Atlanta Hawks,V
+Boston Celtics,Denver Nuggets,H
+Cleveland Cavaliers,Phoenix Suns,H
+Detroit Pistons,Philadelphia 76ers,H
+Golden State Warriors,Dallas Mavericks,H
+Oklahoma City Thunder,Minnesota Timberwolves,V
+San Antonio Spurs,Houston Rockets,H
+Utah Jazz,Charlotte Hornets,H
+Indiana Pacers,Atlanta Hawks,H
+Chicago Bulls,Los Angeles Lakers,V
+Memphis Grizzlies,Milwaukee Bucks,H
+New Orleans Pelicans,Sacramento Kings,H
+Toronto Raptors,New York Knicks,H
+Denver Nuggets,Washington Wizards,V
+Boston Celtics,Orlando Magic,H
+Dallas Mavericks,Brooklyn Nets,H
+Cleveland Cavaliers,Detroit Pistons,V
+Los Angeles Clippers,Los Angeles Lakers,H
+Miami Heat,Milwaukee Bucks,V
+New York Knicks,Phoenix Suns,H
+Oklahoma City Thunder,Houston Rockets,H
+Portland Trail Blazers,Charlotte Hornets,H
+Utah Jazz,Minnesota Timberwolves,H
+Cleveland Cavaliers,San Antonio Spurs,H
+Washington Wizards,Houston Rockets,V
+Indiana Pacers,Denver Nuggets,H
+Memphis Grizzlies,Sacramento Kings,H
+New Orleans Pelicans,Brooklyn Nets,H
+Golden State Warriors,Philadelphia 76ers,V
+Toronto Raptors,Detroit Pistons,H
+Dallas Mavericks,Phoenix Suns,H
+Los Angeles Clippers,Chicago Bulls,H
+Charlotte Hornets,Los Angeles Lakers,V
+Miami Heat,Atlanta Hawks,H
+Golden State Warriors,New York Knicks,V
+Orlando Magic,Boston Celtics,H
+Portland Trail Blazers,Minnesota Timberwolves,H
+Atlanta Hawks,Dallas Mavericks,H
+Detroit Pistons,Brooklyn Nets,V
+Denver Nuggets,Toronto Raptors,H
+Cleveland Cavaliers,Indiana Pacers,V
+Memphis Grizzlies,New Orleans Pelicans,V
+Oklahoma City Thunder,Washington Wizards,H
+Sacramento Kings,Milwaukee Bucks,H
+San Antonio Spurs,Orlando Magic,H
+Utah Jazz,Chicago Bulls,H
+Houston Rockets,Miami Heat,H
+Los Angeles Lakers,Minnesota Timberwolves,H
+Boston Celtics,New York Knicks,V
+Toronto Raptors,Phoenix Suns,V
+Portland Trail Blazers,Milwaukee Bucks,H
+Boston Celtics,Detroit Pistons,H
+Indiana Pacers,Brooklyn Nets,V
+Charlotte Hornets,Cleveland Cavaliers,H
+Miami Heat,Dallas Mavericks,V
+Minnesota Timberwolves,Los Angeles Clippers,V
+Oklahoma City Thunder,Orlando Magic,H
+Atlanta Hawks,Philadelphia 76ers,V
+Chicago Bulls,Sacramento Kings,V
+San Antonio Spurs,New Orleans Pelicans,H
+Utah Jazz,Denver Nuggets,H
+Golden State Warriors,Washington Wizards,V
+Detroit Pistons,New York Knicks,H
+Los Angeles Lakers,New Orleans Pelicans,V
+Houston Rockets,Phoenix Suns,V
+Toronto Raptors,Portland Trail Blazers,V
+Atlanta Hawks,Indiana Pacers,H
+Brooklyn Nets,Sacramento Kings,H
+Miami Heat,Charlotte Hornets,V
+Boston Celtics,Cleveland Cavaliers,V
+San Antonio Spurs,Dallas Mavericks,V
+Denver Nuggets,Chicago Bulls,H
+Memphis Grizzlies,New York Knicks,V
+Los Angeles Clippers,Orlando Magic,V
+Utah Jazz,Milwaukee Bucks,H
+Washington Wizards,Philadelphia 76ers,H
+Charlotte Hornets,Washington Wizards,H
+Cleveland Cavaliers,New Orleans Pelicans,H
+Golden State Warriors,Oklahoma City Thunder,H
+Portland Trail Blazers,Houston Rockets,V
+Indiana Pacers,Detroit Pistons,H
+Dallas Mavericks,Memphis Grizzlies,V
+Minnesota Timberwolves,Chicago Bulls,H
+Philadelphia 76ers,Brooklyn Nets,H
+Utah Jazz,Phoenix Suns,V
+San Antonio Spurs,Los Angeles Lakers,H
+Boston Celtics,Sacramento Kings,H
+Los Angeles Clippers,Miami Heat,V
+Denver Nuggets,New York Knicks,V
+Orlando Magic,Atlanta Hawks,H
+Orlando Magic,Atlanta Hawks,V
+Brooklyn Nets,Denver Nuggets,H
+Charlotte Hornets,Chicago Bulls,H
+Cleveland Cavaliers,Sacramento Kings,H
+Toronto Raptors,Detroit Pistons,V
+Indiana Pacers,Los Angeles Lakers,H
+Portland Trail Blazers,Memphis Grizzlies,V
+New Orleans Pelicans,Minnesota Timberwolves,V
+Los Angeles Clippers,Philadelphia 76ers,V
+Oklahoma City Thunder,Phoenix Suns,V
+Utah Jazz,Dallas Mavericks,V
+Golden State Warriors,Houston Rockets,H
+San Antonio Spurs,Miami Heat,V
+Milwaukee Bucks,Boston Celtics,H
+Washington Wizards,New York Knicks,V
+Boston Celtics,Los Angeles Clippers,H
+Memphis Grizzlies,Brooklyn Nets,V
+Atlanta Hawks,Chicago Bulls,V
+Cleveland Cavaliers,Los Angeles Lakers,H
+Denver Nuggets,Detroit Pistons,V
+Charlotte Hornets,Indiana Pacers,V
+Minnesota Timberwolves,Toronto Raptors,H
+New Orleans Pelicans,Utah Jazz,H
+San Antonio Spurs,Orlando Magic,V
+Sacramento Kings,Philadelphia 76ers,V
+Golden State Warriors,Phoenix Suns,V
+Portland Trail Blazers,Houston Rockets,H
+Milwaukee Bucks,Washington Wizards,H
+Oklahoma City Thunder,New Orleans Pelicans,H
+Cleveland Cavaliers,Chicago Bulls,H
+Los Angeles Clippers,San Antonio Spurs,H
+Washington Wizards,Utah Jazz,H
+Miami Heat,Atlanta Hawks,V
+Brooklyn Nets,New York Knicks,H
+Chicago Bulls,Toronto Raptors,H
+San Antonio Spurs,Los Angeles Lakers,V
+Memphis Grizzlies,Minnesota Timberwolves,H
+Charlotte Hornets,Milwaukee Bucks,V
+New Orleans Pelicans,Philadelphia 76ers,H
+Indiana Pacers,Oklahoma City Thunder,V
+Orlando Magic,Dallas Mavericks,H
+Houston Rockets,Phoenix Suns,V
+Portland Trail Blazers,Golden State Warriors,H
+Sacramento Kings,Denver Nuggets,H
+Utah Jazz,Boston Celtics,H
+Washington Wizards,Detroit Pistons,H
+Milwaukee Bucks,Atlanta Hawks,V
+Golden State Warriors,Los Angeles Clippers,V
+Miami Heat,Washington Wizards,H
+New York Knicks,Minnesota Timberwolves,V
+Charlotte Hornets,Brooklyn Nets,V
+Chicago Bulls,Los Angeles Lakers,H
+Dallas Mavericks,Philadelphia 76ers,H
+Boston Celtics,Denver Nuggets,V
+New Orleans Pelicans,Detroit Pistons,V
+Cleveland Cavaliers,Oklahoma City Thunder,V
+Indiana Pacers,Orlando Magic,V
+San Antonio Spurs,Phoenix Suns,V
+Portland Trail Blazers,Utah Jazz,H
+Toronto Raptors,Memphis Grizzlies,H
+Golden State Warriors,Atlanta Hawks,V
+Detroit Pistons,Cleveland Cavaliers,V
+Los Angeles Clippers,Phoenix Suns,H
+Miami Heat,Indiana Pacers,H
+Milwaukee Bucks,Los Angeles Lakers,H
+Minnesota Timberwolves,Boston Celtics,H
+Toronto Raptors,New York Knicks,V
+Sacramento Kings,Denver Nuggets,V
+Orlando Magic,Philadelphia 76ers,V
+Portland Trail Blazers,Brooklyn Nets,H
+Utah Jazz,Houston Rockets,H
+Washington Wizards,New Orleans Pelicans,H
+Chicago Bulls,Washington Wizards,H
+Cleveland Cavaliers,Charlotte Hornets,H
+Oklahoma City Thunder,Dallas Mavericks,V
+Detroit Pistons,Philadelphia 76ers,H
+Indiana Pacers,New York Knicks,H
+Denver Nuggets,Los Angeles Clippers,V
+Memphis Grizzlies,Los Angeles Lakers,H
+Golden State Warriors,Miami Heat,V
+San Antonio Spurs,Sacramento Kings,V
+Toronto Raptors,Minnesota Timberwolves,H
+Boston Celtics,Milwaukee Bucks,H
+New Orleans Pelicans,Oklahoma City Thunder,H
+Golden State Warriors,Orlando Magic,V
+Brooklyn Nets,Phoenix Suns,V
+Houston Rockets,Portland Trail Blazers,V
+San Antonio Spurs,Utah Jazz,V
+Atlanta Hawks,Chicago Bulls,H
+Dallas Mavericks,Denver Nuggets,H
+Charlotte Hornets,Indiana Pacers,V
+Memphis Grizzlies,Los Angeles Lakers,V
+New York Knicks,Orlando Magic,H
+Washington Wizards,Philadelphia 76ers,V
+Los Angeles Clippers,Sacramento Kings,V
+Toronto Raptors,Cleveland Cavaliers,H
+Boston Celtics,Miami Heat,H
+Portland Trail Blazers,Chicago Bulls,V
+San Antonio Spurs,Houston Rockets,V
+Detroit Pistons,Milwaukee Bucks,V
+Minnesota Timberwolves,New Orleans Pelicans,V
+Golden State Warriors,Oklahoma City Thunder,V
+Phoenix Suns,Memphis Grizzlies,H
+Brooklyn Nets,Utah Jazz,V
+Atlanta Hawks,Charlotte Hornets,H
+Dallas Mavericks,Minnesota Timberwolves,H
+Detroit Pistons,Toronto Raptors,H
+Portland Trail Blazers,Indiana Pacers,V
+Miami Heat,New York Knicks,V
+Orlando Magic,Philadelphia 76ers,H
+Washington Wizards,Cleveland Cavaliers,H
+Boston Celtics,Utah Jazz,H
+Cleveland Cavaliers,Indiana Pacers,H
+Memphis Grizzlies,Denver Nuggets,V
+Los Angeles Clippers,Brooklyn Nets,H
+Milwaukee Bucks,Houston Rockets,H
+Oklahoma City Thunder,Sacramento Kings,V
+Washington Wizards,Philadelphia 76ers,H
+Charlotte Hornets,Phoenix Suns,H
+Dallas Mavericks,Orlando Magic,H
+Golden State Warriors,Atlanta Hawks,H
+Los Angeles Lakers,Brooklyn Nets,H
+Miami Heat,Chicago Bulls,H
+Portland Trail Blazers,New York Knicks,V
+Boston Celtics,Portland Trail Blazers,H
+Denver Nuggets,Los Angeles Lakers,H
+Houston Rockets,New Orleans Pelicans,H
+Los Angeles Clippers,Oklahoma City Thunder,H
+Memphis Grizzlies,Sacramento Kings,H
+Indiana Pacers,Milwaukee Bucks,V
+Washington Wizards,Minnesota Timberwolves,V
+Orlando Magic,Chicago Bulls,H
+Charlotte Hornets,Philadelphia 76ers,V
+San Antonio Spurs,Detroit Pistons,H
+Toronto Raptors,Utah Jazz,H
+Sacramento Kings,Dallas Mavericks,V
+Golden State Warriors,Oklahoma City Thunder,H
+Miami Heat,Phoenix Suns,H
+San Antonio Spurs,New Orleans Pelicans,V
+Boston Celtics,New York Knicks,H
+Charlotte Hornets,Indiana Pacers,H
+Cleveland Cavaliers,Washington Wizards,H
+Brooklyn Nets,Denver Nuggets,V
+Atlanta Hawks,Los Angeles Lakers,V
+Memphis Grizzlies,Utah Jazz,H
+Milwaukee Bucks,Minnesota Timberwolves,H
+Phoenix Suns,Orlando Magic,V
+Miami Heat,Philadelphia 76ers,V
+Toronto Raptors,Portland Trail Blazers,H
+Chicago Bulls,Houston Rockets,H
+Cleveland Cavaliers,Boston Celtics,H
+Atlanta Hawks,Los Angeles Clippers,V
+Minnesota Timberwolves,Brooklyn Nets,H
+Utah Jazz,New Orleans Pelicans,V
+New York Knicks,Detroit Pistons,H
+San Antonio Spurs,Sacramento Kings,H
+Indiana Pacers,Washington Wizards,V
+Denver Nuggets,Dallas Mavericks,H
+Detroit Pistons,Portland Trail Blazers,H
+Los Angeles Lakers,Golden State Warriors,H
+Phoenix Suns,Memphis Grizzlies,V
+Miami Heat,Philadelphia 76ers,H
+Oklahoma City Thunder,Milwaukee Bucks,V
+Houston Rockets,Toronto Raptors,V
+Chicago Bulls,Milwaukee Bucks,H
+Charlotte Hornets,Minnesota Timberwolves,H
+Memphis Grizzlies,Cleveland Cavaliers,V
+Los Angeles Clippers,Dallas Mavericks,V
+Golden State Warriors,Orlando Magic,H
+Indiana Pacers,San Antonio Spurs,H
+New Orleans Pelicans,Sacramento Kings,H
+Denver Nuggets,New York Knicks,H
+Los Angeles Lakers,Orlando Magic,H
+San Antonio Spurs,Minnesota Timberwolves,V
+Portland Trail Blazers,Washington Wizards,H
+Toronto Raptors,Brooklyn Nets,H
+Atlanta Hawks,Utah Jazz,V
+Boston Celtics,Memphis Grizzlies,H
+Charlotte Hornets,New Orleans Pelicans,H
+Detroit Pistons,Dallas Mavericks,V
+Golden State Warriors,Utah Jazz,H
+Milwaukee Bucks,Miami Heat,H
+Oklahoma City Thunder,Los Angeles Clippers,H
+Houston Rockets,Philadelphia 76ers,V
+New York Knicks,Phoenix Suns,V
+Cleveland Cavaliers,Sacramento Kings,V
+Denver Nuggets,Phoenix Suns,H
+Cleveland Cavaliers,Los Angeles Lakers,V
+San Antonio Spurs,Chicago Bulls,H
+Toronto Raptors,Atlanta Hawks,H
+Houston Rockets,Boston Celtics,V
+Miami Heat,Chicago Bulls,V
+Charlotte Hornets,Detroit Pistons,H
+Golden State Warriors,Portland Trail Blazers,H
+Los Angeles Clippers,New York Knicks,H
+Memphis Grizzlies,New Orleans Pelicans,H
+Minnesota Timberwolves,Oklahoma City Thunder,V
+Philadelphia 76ers,Brooklyn Nets,H
+Orlando Magic,Sacramento Kings,V
+Utah Jazz,Washington Wizards,H
+Atlanta Hawks,Memphis Grizzlies,H
+Charlotte Hornets,Houston Rockets,H
+Indiana Pacers,Dallas Mavericks,V
+Denver Nuggets,Washington Wizards,H
+Golden State Warriors,Phoenix Suns,H
+Milwaukee Bucks,New Orleans Pelicans,H
+Detroit Pistons,Philadelphia 76ers,V
+Portland Trail Blazers,Orlando Magic,H
+San Antonio Spurs,Oklahoma City Thunder,H
+Toronto Raptors,Miami Heat,H
+Atlanta Hawks,Indiana Pacers,H
+Milwaukee Bucks,Brooklyn Nets,V
+Cleveland Cavaliers,Los Angeles Clippers,V
+New York Knicks,Los Angeles Lakers,V
+Utah Jazz,Sacramento Kings,V
+Dallas Mavericks,Charlotte Hornets,V
+Golden State Warriors,New Orleans Pelicans,H
+Houston Rockets,Memphis Grizzlies,H
+Miami Heat,Denver Nuggets,H
+Oklahoma City Thunder,Portland Trail Blazers,H
+Phoenix Suns,Minnesota Timberwolves,H
+Chicago Bulls,Toronto Raptors,V
+Utah Jazz,Cleveland Cavaliers,H
+Washington Wizards,Detroit Pistons,H
+Brooklyn Nets,Philadelphia 76ers,H
+Indiana Pacers,Boston Celtics,H
+Sacramento Kings,Los Angeles Lakers,V
+Toronto Raptors,Milwaukee Bucks,V
+Orlando Magic,Denver Nuggets,H
+San Antonio Spurs,Los Angeles Clippers,H
+Oklahoma City Thunder,Boston Celtics,V
+Charlotte Hornets,Orlando Magic,H
+Cleveland Cavaliers,Dallas Mavericks,H
+Atlanta Hawks,Detroit Pistons,V
+Golden State Warriors,New York Knicks,H
+Los Angeles Clippers,Houston Rockets,V
+Minnesota Timberwolves,Memphis Grizzlies,V
+New Orleans Pelicans,Sacramento Kings,V
+Washington Wizards,Chicago Bulls,H
+Atlanta Hawks,Denver Nuggets,H
+Chicago Bulls,Brooklyn Nets,H
+Toronto Raptors,Indiana Pacers,V
+Charlotte Hornets,Miami Heat,V
+Milwaukee Bucks,Memphis Grizzlies,H
+Washington Wizards,Philadelphia 76ers,V
+San Antonio Spurs,Portland Trail Blazers,H
+Utah Jazz,Phoenix Suns,H
+Golden State Warriors,Dallas Mavericks,V
+Detroit Pistons,Sacramento Kings,H
+Houston Rockets,Minnesota Timberwolves,H
+Phoenix Suns,Los Angeles Lakers,V
+Portland Trail Blazers,New Orleans Pelicans,V
+Cleveland Cavaliers,Orlando Magic,V
+Oklahoma City Thunder,Philadelphia 76ers,V
+Toronto Raptors,Boston Celtics,H
+Atlanta Hawks,Houston Rockets,H
+Chicago Bulls,Utah Jazz,H
+Denver Nuggets,Charlotte Hornets,V
+Detroit Pistons,Brooklyn Nets,H
+Oklahoma City Thunder,Indiana Pacers,V
+Memphis Grizzlies,Los Angeles Clippers,H
+Miami Heat,Cleveland Cavaliers,H
+San Antonio Spurs,Golden State Warriors,H
+Washington Wizards,New York Knicks,H
+Dallas Mavericks,Portland Trail Blazers,H
+Utah Jazz,Milwaukee Bucks,V
+New Orleans Pelicans,Los Angeles Clippers,H
+Sacramento Kings,New York Knicks,V
+Boston Celtics,Philadelphia 76ers,V
+Toronto Raptors,Orlando Magic,H
+Washington Wizards,Atlanta Hawks,V
+Boston Celtics,Orlando Magic,H
+Chicago Bulls,Sacramento Kings,H
+Charlotte Hornets,San Antonio Spurs,H
+Cleveland Cavaliers,Denver Nuggets,H
+Detroit Pistons,Milwaukee Bucks,H
+Indiana Pacers,Philadelphia 76ers,H
+Golden State Warriors,Minnesota Timberwolves,V
+Memphis Grizzlies,Phoenix Suns,V
+Charlotte Hornets,Brooklyn Nets,V
+Los Angeles Lakers,Memphis Grizzlies,H
+Miami Heat,New Orleans Pelicans,V
+Oklahoma City Thunder,Houston Rockets,H
+Boston Celtics,Toronto Raptors,H
+New York Knicks,Chicago Bulls,V
+Cleveland Cavaliers,Milwaukee Bucks,H
+Denver Nuggets,Philadelphia 76ers,H
+Detroit Pistons,Orlando Magic,H
+Golden State Warriors,Los Angeles Clippers,H
+Utah Jazz,Houston Rockets,V
+Minnesota Timberwolves,Sacramento Kings,H
+Phoenix Suns,Los Angeles Lakers,H
+Portland Trail Blazers,Dallas Mavericks,H
+San Antonio Spurs,Miami Heat,H
+Atlanta Hawks,Washington Wizards,V
+Brooklyn Nets,Cleveland Cavaliers,H
+Indiana Pacers,New Orleans Pelicans,H
+Los Angeles Clippers,Portland Trail Blazers,H
+New York Knicks,Chicago Bulls,H
+Oklahoma City Thunder,Utah Jazz,H
+Atlanta Hawks,Milwaukee Bucks,H
+Detroit Pistons,Charlotte Hornets,H
+Golden State Warriors,Dallas Mavericks,H
+Houston Rockets,Toronto Raptors,H
+Denver Nuggets,Los Angeles Lakers,V
+Miami Heat,Orlando Magic,H
+Sacramento Kings,Phoenix Suns,H
+San Antonio Spurs,Memphis Grizzlies,H
+Minnesota Timberwolves,Washington Wizards,V
+Brooklyn Nets,Indiana Pacers,H
+Atlanta Hawks,Detroit Pistons,V
+Charlotte Hornets,Milwaukee Bucks,V
+Utah Jazz,Minnesota Timberwolves,V
+Toronto Raptors,New Orleans Pelicans,V
+Cleveland Cavaliers,New York Knicks,V
+Oklahoma City Thunder,San Antonio Spurs,H
+Orlando Magic,Chicago Bulls,H
+Boston Celtics,Phoenix Suns,V
+Portland Trail Blazers,Philadelphia 76ers,H
+Golden State Warriors,Philadelphia 76ers,H
+Indiana Pacers,Houston Rockets,H
+Los Angeles Clippers,Denver Nuggets,H
+Washington Wizards,Los Angeles Lakers,V
+Sacramento Kings,Dallas Mavericks,H
+Atlanta Hawks,Chicago Bulls,V
+Dallas Mavericks,Denver Nuggets,V
+Los Angeles Clippers,Boston Celtics,H
+San Antonio Spurs,Memphis Grizzlies,V
+Miami Heat,Brooklyn Nets,H
+Minnesota Timberwolves,Phoenix Suns,H
+New Orleans Pelicans,New York Knicks,H
+Portland Trail Blazers,Sacramento Kings,H
+Oklahoma City Thunder,Toronto Raptors,V
+Utah Jazz,Los Angeles Lakers,H
+Houston Rockets,Cleveland Cavaliers,V
+Detroit Pistons,Oklahoma City Thunder,H
+Golden State Warriors,Washington Wizards,H
+Chicago Bulls,Indiana Pacers,V
+Orlando Magic,Brooklyn Nets,H
+Charlotte Hornets,Philadelphia 76ers,V
+Dallas Mavericks,New York Knicks,H
+Los Angeles Lakers,Miami Heat,H
+Denver Nuggets,Memphis Grizzlies,V
+Milwaukee Bucks,Phoenix Suns,H
+Los Angeles Clippers,Minnesota Timberwolves,V
+Sacramento Kings,Washington Wizards,H
+San Antonio Spurs,New Orleans Pelicans,H
+Toronto Raptors,Atlanta Hawks,H
+Golden State Warriors,Utah Jazz,V
+Cleveland Cavaliers,Brooklyn Nets,H
+Chicago Bulls,Houston Rockets,V
+Orlando Magic,Indiana Pacers,V
+New Orleans Pelicans,Denver Nuggets,H
+Oklahoma City Thunder,Los Angeles Clippers,H
+Portland Trail Blazers,Boston Celtics,H
+Cleveland Cavaliers,Atlanta Hawks,V
+Charlotte Hornets,Philadelphia 76ers,H
+Dallas Mavericks,Detroit Pistons,V
+Boston Celtics,Golden State Warriors,V
+Toronto Raptors,Memphis Grizzlies,V
+Milwaukee Bucks,Orlando Magic,H
+New York Knicks,Brooklyn Nets,H
+Washington Wizards,Phoenix Suns,V
+Miami Heat,Sacramento Kings,V
+Utah Jazz,Minnesota Timberwolves,H
+Detroit Pistons,Chicago Bulls,V
+Sacramento Kings,Denver Nuggets,V
+Indiana Pacers,Philadelphia 76ers,V
+Portland Trail Blazers,Miami Heat,H
+San Antonio Spurs,Toronto Raptors,H
+New Orleans Pelicans,Brooklyn Nets,V
+Cleveland Cavaliers,Charlotte Hornets,H
+Golden State Warriors,Portland Trail Blazers,H
+Houston Rockets,Oklahoma City Thunder,H
+Los Angeles Clippers,Washington Wizards,H
+Boston Celtics,Los Angeles Lakers,V
+Chicago Bulls,Milwaukee Bucks,V
+Dallas Mavericks,Minnesota Timberwolves,V
+Indiana Pacers,New York Knicks,V
+Orlando Magic,Memphis Grizzlies,H
+Utah Jazz,Phoenix Suns,V
+Atlanta Hawks,Phoenix Suns,H
+Oklahoma City Thunder,Denver Nuggets,V
+Minnesota Timberwolves,Golden State Warriors,V
+Los Angeles Clippers,Los Angeles Lakers,H
+Memphis Grizzlies,Chicago Bulls,H
+Miami Heat,Detroit Pistons,H
+Cleveland Cavaliers,Milwaukee Bucks,V
+Philadelphia 76ers,New Orleans Pelicans,H
+Portland Trail Blazers,Sacramento Kings,V
+Toronto Raptors,Charlotte Hornets,H
+San Antonio Spurs,Utah Jazz,V
+Boston Celtics,New Orleans Pelicans,H
+Dallas Mavericks,Houston Rockets,H
+Indiana Pacers,Cleveland Cavaliers,H
+Los Angeles Clippers,Los Angeles Lakers,V
+Charlotte Hornets,New York Knicks,V
+Detroit Pistons,Orlando Magic,V
+Portland Trail Blazers,Oklahoma City Thunder,H
+Washington Wizards,Brooklyn Nets,H
+Atlanta Hawks,Toronto Raptors,H
+Golden State Warriors,San Antonio Spurs,H
+Phoenix Suns,Houston Rockets,V
+Miami Heat,Chicago Bulls,H
+Minnesota Timberwolves,Sacramento Kings,V
+Boston Celtics,Milwaukee Bucks,H
+Charlotte Hornets,Brooklyn Nets,H
+Dallas Mavericks,Memphis Grizzlies,H
+Denver Nuggets,San Antonio Spurs,H
+Detroit Pistons,Washington Wizards,H
+New Orleans Pelicans,Los Angeles Lakers,H
+Orlando Magic,Miami Heat,H
+New York Knicks,Philadelphia 76ers,V
+Toronto Raptors,Indiana Pacers,H
+Los Angeles Clippers,Utah Jazz,V
+Atlanta Hawks,Boston Celtics,H
+Chicago Bulls,Cleveland Cavaliers,H
+Golden State Warriors,Memphis Grizzlies,V
+Phoenix Suns,New Orleans Pelicans,V
+Minnesota Timberwolves,Portland Trail Blazers,V
+Sacramento Kings,Oklahoma City Thunder,H
+Utah Jazz,Denver Nuggets,V
+Houston Rockets,Los Angeles Lakers,H
+Indiana Pacers,Brooklyn Nets,H
+Los Angeles Clippers,Dallas Mavericks,H
+Miami Heat,Orlando Magic,H
+Toronto Raptors,New York Knicks,V
+Milwaukee Bucks,Philadelphia 76ers,V
+Golden State Warriors,San Antonio Spurs,V
+Washington Wizards,Charlotte Hornets,H
+Charlotte Hornets,Boston Celtics,V
+Washington Wizards,Brooklyn Nets,V
+Cleveland Cavaliers,Atlanta Hawks,H
+Houston Rockets,Minnesota Timberwolves,V
+Chicago Bulls,New Orleans Pelicans,V
+Oklahoma City Thunder,Los Angeles Lakers,H
+Orlando Magic,Milwaukee Bucks,H
+Sacramento Kings,Phoenix Suns,V
+Dallas Mavericks,Utah Jazz,V
+Miami Heat,Detroit Pistons,V
+Indiana Pacers,New York Knicks,H
+Los Angeles Clippers,Memphis Grizzlies,H
+San Antonio Spurs,Oklahoma City Thunder,H
+Toronto Raptors,Philadelphia 76ers,H
+Boston Celtics,Miami Heat,H
+Toronto Raptors,Brooklyn Nets,V
+Chicago Bulls,Philadelphia 76ers,H
+Charlotte Hornets,Orlando Magic,H
+Detroit Pistons,Cleveland Cavaliers,V
+San Antonio Spurs,Dallas Mavericks,V
+Golden State Warriors,Memphis Grizzlies,H
+Houston Rockets,Sacramento Kings,H
+Los Angeles Lakers,Utah Jazz,H
+Indiana Pacers,Milwaukee Bucks,V
+Minnesota Timberwolves,New Orleans Pelicans,H
+Phoenix Suns,Los Angeles Clippers,H
+Portland Trail Blazers,Denver Nuggets,H
+Washington Wizards,Atlanta Hawks,H
+Atlanta Hawks,Boston Celtics,H
+Golden State Warriors,Houston Rockets,H
+Oklahoma City Thunder,Dallas Mavericks,H
+Indiana Pacers,Toronto Raptors,V
+Cleveland Cavaliers,Detroit Pistons,H
+Los Angeles Clippers,Portland Trail Blazers,H
+Miami Heat,Charlotte Hornets,H
+San Antonio Spurs,Memphis Grizzlies,H
+Golden State Warriors,Houston Rockets,H
+Dallas Mavericks,Oklahoma City Thunder,V
+Toronto Raptors,Indiana Pacers,H
+Atlanta Hawks,Boston Celtics,H
+San Antonio Spurs,Memphis Grizzlies,H
+Cleveland Cavaliers,Detroit Pistons,H
+Los Angeles Clippers,Portland Trail Blazers,H
+Miami Heat,Charlotte Hornets,H
+Oklahoma City Thunder,Dallas Mavericks,V
+Houston Rockets,Golden State Warriors,H
+Toronto Raptors,Indiana Pacers,V
+Boston Celtics,Atlanta Hawks,H
+Cleveland Cavaliers,Detroit Pistons,V
+San Antonio Spurs,Memphis Grizzlies,V
+Charlotte Hornets,Miami Heat,H
+Oklahoma City Thunder,Dallas Mavericks,V
+Indiana Pacers,Toronto Raptors,H
+Portland Trail Blazers,Los Angeles Clippers,H
+Boston Celtics,Atlanta Hawks,H
+Cleveland Cavaliers,Detroit Pistons,V
+Golden State Warriors,Houston Rockets,V
+San Antonio Spurs,Memphis Grizzlies,V
+Charlotte Hornets,Miami Heat,H
+Oklahoma City Thunder,Dallas Mavericks,H
+Portland Trail Blazers,Los Angeles Clippers,H
+Atlanta Hawks,Boston Celtics,H
+Toronto Raptors,Indiana Pacers,H
+Golden State Warriors,Houston Rockets,H
+Portland Trail Blazers,Los Angeles Clippers,V
+Charlotte Hornets,Miami Heat,V
+Atlanta Hawks,Boston Celtics,V
+Miami Heat,Charlotte Hornets,V
+Indiana Pacers,Toronto Raptors,H
+Portland Trail Blazers,Los Angeles Clippers,H
+San Antonio Spurs,Oklahoma City Thunder,H
+Golden State Warriors,Portland Trail Blazers,H
+Miami Heat,Charlotte Hornets,H
+Toronto Raptors,Indiana Pacers,H
+Cleveland Cavaliers,Atlanta Hawks,H
+Oklahoma City Thunder,San Antonio Spurs,V
+Golden State Warriors,Portland Trail Blazers,H
+Miami Heat,Toronto Raptors,V
+Cleveland Cavaliers,Atlanta Hawks,H
+Toronto Raptors,Miami Heat,H
+Cleveland Cavaliers,Atlanta Hawks,V
+San Antonio Spurs,Oklahoma City Thunder,V
+Toronto Raptors,Miami Heat,V
+Portland Trail Blazers,Golden State Warriors,H
+Cleveland Cavaliers,Atlanta Hawks,V
+Oklahoma City Thunder,San Antonio Spurs,H
+Miami Heat,Toronto Raptors,H
+Golden State Warriors,Portland Trail Blazers,V
+Oklahoma City Thunder,San Antonio Spurs,V
+Golden State Warriors,Portland Trail Blazers,H
+Toronto Raptors,Miami Heat,H
+Oklahoma City Thunder,San Antonio Spurs,H
+Miami Heat,Toronto Raptors,H
+Toronto Raptors,Miami Heat,H
+Oklahoma City Thunder,Golden State Warriors,V
+Cleveland Cavaliers,Toronto Raptors,H
+Golden State Warriors,Oklahoma City Thunder,H
+Cleveland Cavaliers,Toronto Raptors,H
+Toronto Raptors,Cleveland Cavaliers,H
+Oklahoma City Thunder,Golden State Warriors,H
+Toronto Raptors,Cleveland Cavaliers,H
+Oklahoma City Thunder,Golden State Warriors,H
+Cleveland Cavaliers,Toronto Raptors,H
+Golden State Warriors,Oklahoma City Thunder,H
+Cleveland Cavaliers,Toronto Raptors,V
+Golden State Warriors,Oklahoma City Thunder,V
+Golden State Warriors,Oklahoma City Thunder,H
+Golden State Warriors,Cleveland Cavaliers,H
+Golden State Warriors,Cleveland Cavaliers,H
+Cleveland Cavaliers,Golden State Warriors,H
+Golden State Warriors,Cleveland Cavaliers,V
+Cleveland Cavaliers,Golden State Warriors,V
+Cleveland Cavaliers,Golden State Warriors,H
+Cleveland Cavaliers,Golden State Warriors,V
diff --git a/other/data/2021Miscellaneous_Stat.csv b/other/data/2021Miscellaneous_Stat.csv
new file mode 100644
index 0000000..9654a6d
--- /dev/null
+++ b/other/data/2021Miscellaneous_Stat.csv
@@ -0,0 +1,31 @@
+Rk,Team,Age,W,L,PW,PL,MOV,SOS,SRS,ORtg,DRtg,Pace,FTr,3PAr,TS%,eFG%,TOV%,ORB%,FT/FGA,eFG%,TOV%,DRB%,FT/FGA,Arena,Attendance
+1,Golden State Warriors,27.4,73,9,65,17,10.76,-0.38,10.38,114.5,103.8,99.3,0.25,0.362,0.593,0.563,13.5,23.5,0.191,0.479,12.6,76,0.208,Oracle Arena,803436
+2,San Antonio Spurs,30.3,67,15,67,15,10.63,-0.36,10.28,110.3,99,93.8,0.246,0.223,0.564,0.526,12.4,23,0.197,0.477,14.1,79.1,0.182,AT&T Center,756445
+3,Oklahoma City Thunder,25.8,55,27,59,23,7.28,-0.19,7.09,113.1,105.6,96.7,0.292,0.275,0.565,0.524,14,31.1,0.228,0.484,11.7,76,0.205,Chesapeake Energy Arena,746323
+4,Cleveland Cavaliers,28.1,57,25,57,25,6,-0.55,5.45,110.9,104.5,93.3,0.259,0.352,0.558,0.524,12.7,25.1,0.194,0.496,12.6,78.5,0.205,Quicken Loans Arena,843042
+5,Los Angeles Clippers,29.7,53,29,53,29,4.28,-0.15,4.13,108.3,103.8,95.8,0.318,0.324,0.556,0.524,12.1,20.1,0.22,0.48,13.8,73.8,0.222,STAPLES Center,786910
+6,Toronto Raptors,26.3,56,26,53,29,4.5,-0.42,4.08,110,105.2,92.9,0.328,0.287,0.552,0.504,12.3,24.6,0.255,0.498,12.7,77.7,0.201,Air Canada Centre,812863
+7,Atlanta Hawks,28.2,48,34,51,31,3.61,-0.12,3.49,105.1,101.4,97.1,0.237,0.336,0.552,0.516,13.8,19.1,0.185,0.48,14.4,74.6,0.194,Philips Arena,690150
+8,Boston Celtics,25.2,48,34,50,32,3.21,-0.37,2.84,106.8,103.6,98.5,0.264,0.293,0.531,0.488,12.1,25.1,0.208,0.487,14.6,74.6,0.231,TD Garden,749076
+9,Charlotte Hornets,26,48,34,49,33,2.72,-0.36,2.36,107.1,104.3,95.7,0.28,0.348,0.545,0.502,11.7,20,0.222,0.496,12.5,79.8,0.191,Time Warner Cable Arena,716894
+10,Utah Jazz,24.2,40,42,46,36,1.79,0.05,1.84,105.9,103.9,91,0.286,0.297,0.54,0.501,14.2,25.9,0.213,0.495,13.5,77.7,0.21,Vivint Smart Home Arena,791489
+11,Indiana Pacers,26.9,45,37,46,36,1.71,-0.09,1.62,104.6,102.9,96.6,0.268,0.27,0.536,0.497,13.5,23.4,0.205,0.489,14.3,76,0.205,Bankers Life Fieldhouse,690733
+12,Miami Heat,28.4,48,34,46,36,1.65,-0.14,1.5,106.1,104.4,93.6,0.282,0.221,0.545,0.508,13.3,23.8,0.21,0.485,12.1,77.8,0.196,AmericanAirlines Arena,809350
+13,Portland Trail Blazers,24.3,44,38,43,39,0.83,0.15,0.98,108.8,108,96,0.268,0.332,0.548,0.511,13.2,25.9,0.202,0.503,12.1,76.2,0.225,Moda Center,794085
+14,Detroit Pistons,25,44,38,43,39,0.61,-0.18,0.43,106.1,105.5,95.1,0.296,0.303,0.522,0.491,12.2,27,0.197,0.504,12.5,79.3,0.196,The Palace of Auburn Hills,677138
+15,Houston Rockets,27.8,41,41,42,40,0.2,0.14,0.34,108.3,108.1,97.6,0.352,0.37,0.553,0.516,14.2,25.7,0.244,0.516,14.7,72.8,0.219,Toyota Center,737244
+16,Dallas Mavericks,30.3,42,40,40,42,-0.3,0.29,-0.02,106.7,107,94.3,0.265,0.339,0.544,0.502,12,20.6,0.211,0.504,12.8,76.2,0.198,American Airlines Center,825901
+17,Washington Wizards,27.3,41,41,40,42,-0.5,0,-0.5,105.3,105.8,98.5,0.263,0.282,0.544,0.511,13.1,20.6,0.192,0.515,14.6,77.7,0.218,Verizon Center,725426
+18,Chicago Bulls,27.6,42,40,37,45,-1.48,0.01,-1.46,105,106.5,95.7,0.24,0.244,0.526,0.487,12.6,24.5,0.189,0.485,10.7,74.9,0.182,United Center,894659
+19,Orlando Magic,23.9,35,47,36,46,-1.62,-0.06,-1.68,105.1,106.8,96,0.232,0.255,0.533,0.5,12.8,23.1,0.175,0.513,13.8,76.5,0.215,Amway Center,719275
+20,Memphis Grizzlies,30.5,42,40,35,47,-2.24,0.11,-2.14,105.4,107.8,93.3,0.295,0.222,0.524,0.477,12.3,25.3,0.231,0.518,15.2,75.1,0.251,FedEx Forum,701894
+21,Sacramento Kings,26.6,33,49,34,48,-2.48,0.16,-2.32,106,108.4,100,0.295,0.26,0.546,0.51,14.2,23.9,0.214,0.521,14,74.9,0.202,Sleep Train Arena,707526
+22,New York Knicks,27.2,32,50,33,49,-2.73,0,-2.74,104.6,107.6,93.4,0.255,0.256,0.527,0.483,12.6,23.7,0.205,0.487,10.5,75.8,0.204,Madison Square Garden (IV),812292
+23,Denver Nuggets,24.7,33,49,33,49,-3.1,0.29,-2.81,105.6,108.9,95.7,0.282,0.277,0.531,0.489,13.2,25.8,0.216,0.515,12.6,77.3,0.216,Pepsi Center,577898
+24,Minnesota Timberwolves,24.6,29,53,31,51,-3.54,0.15,-3.38,106.5,110.1,95.2,0.332,0.202,0.549,0.498,13.9,24.3,0.263,0.524,13.6,74.7,0.2,Target Center,581178
+25,New Orleans Pelicans,26.6,30,52,31,51,-3.79,0.24,-3.56,105.6,109.5,96.8,0.259,0.277,0.537,0.498,12.3,21.2,0.201,0.523,12.7,78.8,0.225,Smoothie King Center,688549
+26,Milwaukee Bucks,23.5,33,49,29,53,-4.18,0.2,-3.98,104.3,108.7,94.2,0.276,0.189,0.537,0.499,14.2,24.9,0.207,0.51,14.2,73.1,0.221,BMO Harris Bradley Center,621808
+27,Phoenix Suns,26,23,59,24,58,-6.66,0.34,-6.32,102.2,109,98.5,0.271,0.302,0.526,0.487,15.2,25.4,0.204,0.523,13.5,77.1,0.237,Talking Stick Resort Arena,701405
+28,Brooklyn Nets,26.9,21,61,22,60,-7.35,0.24,-7.12,103.2,110.9,95.2,0.246,0.218,0.527,0.492,13.6,24.1,0.186,0.534,13.1,75.7,0.176,Barclays Center,620142
+29,Los Angeles Lakers,26.5,17,65,17,65,-9.56,0.64,-8.92,101.6,111.6,95.6,0.292,0.29,0.509,0.46,12.5,23.1,0.228,0.523,11.6,74.7,0.202,STAPLES Center,778877
+30,Philadelphia 76ers,23.3,10,72,16,66,-10.23,0.31,-9.92,98.8,109.2,97.9,0.269,0.327,0.519,0.487,14.8,20.6,0.186,0.51,13.5,74,0.24,Wells Fargo Center,614650
diff --git a/other/data/21-22Result.csv b/other/data/21-22Result.csv
new file mode 100644
index 0000000..740193c
--- /dev/null
+++ b/other/data/21-22Result.csv
@@ -0,0 +1,1230 @@
+win,lose,probability
+Cleveland Cavaliers,New York Knicks,0.910945673538786
+Golden State Warriors,San Antonio Spurs,0.6513314781536191
+Portland Trail Blazers,Utah Jazz,0.7881071461573498
+Boston Celtics,Brooklyn Nets,0.9037914734330236
+Indiana Pacers,Dallas Mavericks,0.6294890501142083
+Houston Rockets,Los Angeles Lakers,0.9091001386952638
+Memphis Grizzlies,Minnesota Timberwolves,0.6391705982462286
+Charlotte Hornets,Milwaukee Bucks,0.772729041185426
+Denver Nuggets,New Orleans Pelicans,0.6165961221759775
+Miami Heat,Orlando Magic,0.6679605471462637
+Oklahoma City Thunder,Philadelphia 76ers,0.9850889685949972
+Sacramento Kings,Phoenix Suns,0.7378958718883849
+Toronto Raptors,Detroit Pistons,0.7205030001905396
+Atlanta Hawks,Washington Wizards,0.645037490735184
+Boston Celtics,Chicago Bulls,0.5211526256247747
+Portland Trail Blazers,Los Angeles Clippers,0.6417347614659707
+San Antonio Spurs,Sacramento Kings,0.8542060260605685
+Indiana Pacers,Brooklyn Nets,0.8932493059410368
+Dallas Mavericks,Houston Rockets,0.5284229857234188
+Detroit Pistons,Orlando Magic,0.6568380918875059
+Miami Heat,Charlotte Hornets,0.5636036106371278
+Golden State Warriors,New Orleans Pelicans,0.9094810947100891
+Oklahoma City Thunder,Phoenix Suns,0.9217004614721095
+Toronto Raptors,Cleveland Cavaliers,0.5414506135932451
+Utah Jazz,Los Angeles Lakers,0.9050539698282559
+Chicago Bulls,Indiana Pacers,0.5438036453214102
+Charlotte Hornets,Boston Celtics,0.5248735201171141
+Cleveland Cavaliers,Orlando Magic,0.868858274042883
+Portland Trail Blazers,Denver Nuggets,0.6704547911733075
+Milwaukee Bucks,Brooklyn Nets,0.6773974242380878
+Memphis Grizzlies,New York Knicks,0.627002896098444
+Atlanta Hawks,Philadelphia 76ers,0.977722349080111
+Sacramento Kings,Minnesota Timberwolves,0.5372216083882487
+San Antonio Spurs,New Orleans Pelicans,0.9144078692442914
+Detroit Pistons,Milwaukee Bucks,0.7081537265549922
+Houston Rockets,Dallas Mavericks,0.5484635235494044
+Los Angeles Clippers,Utah Jazz,0.737586544702152
+Washington Wizards,Memphis Grizzlies,0.5324132607249484
+San Antonio Spurs,Miami Heat,0.6322217809067541
+Oklahoma City Thunder,Los Angeles Lakers,0.9642959605770868
+Golden State Warriors,Phoenix Suns,0.9515197953692456
+Atlanta Hawks,Sacramento Kings,0.749364111618706
+Chicago Bulls,Brooklyn Nets,0.8679345758358623
+Los Angeles Clippers,Phoenix Suns,0.90021965786247
+Toronto Raptors,Denver Nuggets,0.8191898866371986
+Cleveland Cavaliers,Houston Rockets,0.8269396223227754
+Detroit Pistons,New York Knicks,0.7471690620137846
+Indiana Pacers,Los Angeles Lakers,0.9225231269834872
+Miami Heat,Sacramento Kings,0.7634533160413839
+Memphis Grizzlies,Minnesota Timberwolves,0.6798209709660259
+Milwaukee Bucks,New Orleans Pelicans,0.5506449643984364
+Orlando Magic,Philadelphia 76ers,0.9475259110879476
+Golden State Warriors,Portland Trail Blazers,0.5746284548698412
+San Antonio Spurs,Utah Jazz,0.8563015879263921
+Atlanta Hawks,Los Angeles Lakers,0.9407189655892345
+Boston Celtics,Chicago Bulls,0.672659518278773
+Detroit Pistons,Brooklyn Nets,0.8895602705326521
+Charlotte Hornets,Philadelphia 76ers,0.9622489609127842
+Oklahoma City Thunder,Los Angeles Clippers,0.5027769796823538
+Memphis Grizzlies,New Orleans Pelicans,0.6512049104129524
+Houston Rockets,New York Knicks,0.6551162929224978
+Portland Trail Blazers,Phoenix Suns,0.8367378108503962
+Utah Jazz,Dallas Mavericks,0.576294077031833
+Toronto Raptors,Washington Wizards,0.6445132283306332
+Cleveland Cavaliers,Boston Celtics,0.7298581867315248
+Golden State Warriors,Oklahoma City Thunder,0.724374076778863
+Indiana Pacers,Milwaukee Bucks,0.7348860900107408
+Denver Nuggets,Minnesota Timberwolves,0.6417604989251788
+Orlando Magic,Sacramento Kings,0.5277512563404784
+Charlotte Hornets,Brooklyn Nets,0.9112180730690862
+Chicago Bulls,New York Knicks,0.7767233131069875
+Portland Trail Blazers,Dallas Mavericks,0.5208537025596347
+Golden State Warriors,Los Angeles Lakers,0.9790147363638145
+Los Angeles Clippers,Memphis Grizzlies,0.6659868528357222
+New Orleans Pelicans,Phoenix Suns,0.616141817873113
+Toronto Raptors,Miami Heat,0.6922006702911019
+San Antonio Spurs,Utah Jazz,0.7554533345420018
+Atlanta Hawks,Washington Wizards,0.5878971846897307
+Atlanta Hawks,Houston Rockets,0.6667248781260917
+Detroit Pistons,Denver Nuggets,0.6489861437070469
+Indiana Pacers,Chicago Bulls,0.5836744284667654
+Sacramento Kings,Milwaukee Bucks,0.5763675413000096
+Oklahoma City Thunder,Minnesota Timberwolves,0.8618423484130558
+Washington Wizards,Orlando Magic,0.5955141193474442
+Cleveland Cavaliers,Philadelphia 76ers,0.9862499716834574
+San Antonio Spurs,Los Angeles Clippers,0.7415909571565803
+Boston Celtics,Denver Nuggets,0.7466284168285751
+Dallas Mavericks,Milwaukee Bucks,0.6632528005878194
+Phoenix Suns,Los Angeles Lakers,0.7431120335451005
+Portland Trail Blazers,Memphis Grizzlies,0.5574945918758645
+Utah Jazz,New York Knicks,0.6381447752380096
+Toronto Raptors,Sacramento Kings,0.8348671614437553
+Chicago Bulls,Orlando Magic,0.692607318715456
+Charlotte Hornets,Indiana Pacers,0.5890167658688972
+Golden State Warriors,New Orleans Pelicans,0.9305139431810429
+Los Angeles Clippers,Detroit Pistons,0.665394489896761
+Oklahoma City Thunder,Miami Heat,0.69357973583372
+Utah Jazz,Philadelphia 76ers,0.9587532147494088
+Washington Wizards,Houston Rockets,0.5513229804516817
+Minnesota Timberwolves,Brooklyn Nets,0.7701253617664123
+Cleveland Cavaliers,Atlanta Hawks,0.7316076415024936
+Dallas Mavericks,Los Angeles Lakers,0.8983348594463225
+Memphis Grizzlies,Denver Nuggets,0.5642524017846442
+Portland Trail Blazers,Phoenix Suns,0.9227105998532737
+Sacramento Kings,New Orleans Pelicans,0.5502636500993806
+Atlanta Hawks,Chicago Bulls,0.6513770754884305
+Charlotte Hornets,Utah Jazz,0.6778805686506906
+Golden State Warriors,Dallas Mavericks,0.8869929996912033
+Indiana Pacers,Philadelphia 76ers,0.9514171990347409
+Los Angeles Clippers,Portland Trail Blazers,0.6817660402765916
+New York Knicks,Brooklyn Nets,0.6920936124037728
+Oklahoma City Thunder,Toronto Raptors,0.6044791660189538
+Orlando Magic,Minnesota Timberwolves,0.5780547388924916
+Detroit Pistons,Phoenix Suns,0.8466578852402803
+San Antonio Spurs,Houston Rockets,0.8469168632827457
+Boston Celtics,Washington Wizards,0.5900496035050935
+Golden State Warriors,Denver Nuggets,0.8862498278577697
+Miami Heat,Chicago Bulls,0.6685380845922825
+New Orleans Pelicans,Milwaukee Bucks,0.5129051176552359
+Sacramento Kings,Los Angeles Lakers,0.8340518092035957
+Boston Celtics,New York Knicks,0.824869717282802
+Toronto Raptors,Charlotte Hornets,0.5327681139234506
+Oklahoma City Thunder,Los Angeles Clippers,0.6384911361926477
+Utah Jazz,Orlando Magic,0.5538925517457819
+Indiana Pacers,Philadelphia 76ers,0.9715351384881646
+Portland Trail Blazers,Sacramento Kings,0.837682303738023
+San Antonio Spurs,Detroit Pistons,0.8082798550853397
+Cleveland Cavaliers,Washington Wizards,0.6998337688195485
+Atlanta Hawks,Philadelphia 76ers,0.9630985581234137
+Chicago Bulls,Washington Wizards,0.5961416330768025
+Detroit Pistons,Denver Nuggets,0.6866953306731447
+San Antonio Spurs,Houston Rockets,0.7757424997465636
+Boston Celtics,Indiana Pacers,0.5409085632121504
+Miami Heat,Utah Jazz,0.6993440619977782
+Memphis Grizzlies,Milwaukee Bucks,0.642784192622768
+Los Angeles Clippers,Minnesota Timberwolves,0.8222317412337778
+New Orleans Pelicans,Los Angeles Lakers,0.7864502838591256
+Phoenix Suns,Brooklyn Nets,0.5036637948564003
+Toronto Raptors,New York Knicks,0.8786655233057723
+Cleveland Cavaliers,Charlotte Hornets,0.7407748163318797
+Golden State Warriors,Phoenix Suns,0.959961011674701
+Minnesota Timberwolves,Los Angeles Lakers,0.7677717390444269
+Oklahoma City Thunder,Orlando Magic,0.8252022362975616
+Portland Trail Blazers,Denver Nuggets,0.822215377724437
+Oklahoma City Thunder,Detroit Pistons,0.6565282138538856
+Houston Rockets,Philadelphia 76ers,0.9333373720198529
+Indiana Pacers,Orlando Magic,0.675462677405449
+Los Angeles Clippers,Brooklyn Nets,0.9176402436395633
+Boston Celtics,New Orleans Pelicans,0.7920742309688482
+Dallas Mavericks,New York Knicks,0.6266254979534505
+San Antonio Spurs,Miami Heat,0.786228782929206
+Utah Jazz,Memphis Grizzlies,0.5759000755010675
+Cleveland Cavaliers,Toronto Raptors,0.682019095590589
+Brooklyn Nets,Los Angeles Lakers,0.7008116520934212
+Miami Heat,Atlanta Hawks,0.5519604943835104
+Charlotte Hornets,Minnesota Timberwolves,0.8004749970712595
+Portland Trail Blazers,Chicago Bulls,0.7633180386982865
+Atlanta Hawks,Milwaukee Bucks,0.7785813478299822
+Boston Celtics,Dallas Mavericks,0.7134885980702428
+Denver Nuggets,Phoenix Suns,0.67426195243232
+Cleveland Cavaliers,Indiana Pacers,0.6561844995155902
+Los Angeles Clippers,Memphis Grizzlies,0.7467593149116336
+Detroit Pistons,New York Knicks,0.7136862592574185
+Oklahoma City Thunder,Houston Rockets,0.7729753509947972
+Orlando Magic,New Orleans Pelicans,0.5908225023820117
+Washington Wizards,Philadelphia 76ers,0.9649891187062362
+San Antonio Spurs,Sacramento Kings,0.8542060260605685
+Golden State Warriors,Toronto Raptors,0.5796463211416227
+Portland Trail Blazers,Houston Rockets,0.5316206473256138
+Miami Heat,Milwaukee Bucks,0.7914851501430366
+Minnesota Timberwolves,Philadelphia 76ers,0.8446605120654371
+Utah Jazz,Chicago Bulls,0.5288251889862404
+Washington Wizards,New York Knicks,0.7245536693900161
+Golden State Warriors,Boston Celtics,0.6795010317114794
+Charlotte Hornets,Atlanta Hawks,0.5270903223652368
+Cleveland Cavaliers,Detroit Pistons,0.7845432293852561
+Dallas Mavericks,Memphis Grizzlies,0.5587374481213283
+Toronto Raptors,Denver Nuggets,0.7881800071385543
+Indiana Pacers,Phoenix Suns,0.8384414477727877
+San Antonio Spurs,Los Angeles Lakers,0.9737719763455626
+Portland Trail Blazers,New Orleans Pelicans,0.724034642359451
+Oklahoma City Thunder,Brooklyn Nets,0.9356388564114775
+Los Angeles Clippers,Sacramento Kings,0.7526308868162708
+Boston Celtics,Detroit Pistons,0.5616258296132322
+Houston Rockets,Utah Jazz,0.5361644284597848
+Los Angeles Clippers,Chicago Bulls,0.7090689039416673
+Memphis Grizzlies,Minnesota Timberwolves,0.6391705982462286
+Golden State Warriors,Milwaukee Bucks,0.9046266719331423
+Charlotte Hornets,New Orleans Pelicans,0.7826841837838852
+Dallas Mavericks,Orlando Magic,0.5416177445109935
+Phoenix Suns,Philadelphia 76ers,0.878665706237008
+Miami Heat,Washington Wizards,0.5503939187043101
+Portland Trail Blazers,Brooklyn Nets,0.882028930597329
+Utah Jazz,Denver Nuggets,0.6079445383505202
+Chicago Bulls,Los Angeles Lakers,0.9145896426571319
+Atlanta Hawks,New York Knicks,0.7690406675112005
+Oklahoma City Thunder,Indiana Pacers,0.7140889041489389
+Toronto Raptors,Sacramento Kings,0.7785697260141985
+Charlotte Hornets,Memphis Grizzlies,0.6882582932776412
+Detroit Pistons,Houston Rockets,0.5799151105484155
+Golden State Warriors,Indiana Pacers,0.7565472954780212
+Los Angeles Clippers,Toronto Raptors,0.5394559852120299
+Orlando Magic,Milwaukee Bucks,0.5945684191249537
+Boston Celtics,Minnesota Timberwolves,0.8092836325399286
+Miami Heat,Philadelphia 76ers,0.9741341375336782
+San Antonio Spurs,Dallas Mavericks,0.8622921525982259
+Washington Wizards,Phoenix Suns,0.8094603577658495
+Atlanta Hawks,New Orleans Pelicans,0.7943700357134191
+Chicago Bulls,Denver Nuggets,0.6413610047984821
+Oklahoma City Thunder,Los Angeles Lakers,0.9634902280593779
+Portland Trail Blazers,New York Knicks,0.6982299864891919
+Boston Celtics,Brooklyn Nets,0.9156527904181759
+San Antonio Spurs,Charlotte Hornets,0.6551800566306909
+Cleveland Cavaliers,Portland Trail Blazers,0.7968648021545789
+Los Angeles Clippers,Dallas Mavericks,0.6324060375159688
+Miami Heat,Detroit Pistons,0.5214505761758803
+Golden State Warriors,Los Angeles Lakers,0.9821456918905238
+Toronto Raptors,Houston Rockets,0.6748927289009368
+Atlanta Hawks,Indiana Pacers,0.5386998459163754
+Minnesota Timberwolves,New Orleans Pelicans,0.5403614035977689
+Orlando Magic,Phoenix Suns,0.7210738746486182
+Memphis Grizzlies,Philadelphia 76ers,0.9568151325643407
+Oklahoma City Thunder,Sacramento Kings,0.8063728147757144
+Utah Jazz,Denver Nuggets,0.6167794489859763
+San Antonio Spurs,Boston Celtics,0.6278728733890596
+Cleveland Cavaliers,Dallas Mavericks,0.8439516757269584
+Oklahoma City Thunder,Denver Nuggets,0.8150630436430326
+Los Angeles Clippers,Detroit Pistons,0.582718315024819
+Indiana Pacers,Brooklyn Nets,0.8650307419281302
+Golden State Warriors,Los Angeles Lakers,0.9790147363638145
+Miami Heat,Memphis Grizzlies,0.6087360042548863
+Toronto Raptors,Milwaukee Bucks,0.819167700408088
+Charlotte Hornets,New York Knicks,0.7605499701863525
+Washington Wizards,Orlando Magic,0.5955141193474442
+Chicago Bulls,Philadelphia 76ers,0.9640376008791884
+Minnesota Timberwolves,Phoenix Suns,0.6966481459706437
+Portland Trail Blazers,New Orleans Pelicans,0.869589125206319
+Houston Rockets,Sacramento Kings,0.6121422354502845
+Atlanta Hawks,Utah Jazz,0.5932836581155427
+Charlotte Hornets,New York Knicks,0.8070430259054339
+Golden State Warriors,Minnesota Timberwolves,0.9270367506372811
+Miami Heat,Memphis Grizzlies,0.7093268057550844
+Oklahoma City Thunder,Detroit Pistons,0.7218062228240218
+San Antonio Spurs,Washington Wizards,0.7513143391646443
+Sacramento Kings,Brooklyn Nets,0.8041903457803431
+Dallas Mavericks,New Orleans Pelicans,0.6839267066343925
+Los Angeles Clippers,Indiana Pacers,0.5622208612244834
+Atlanta Hawks,Los Angeles Lakers,0.9460375330719786
+Orlando Magic,Milwaukee Bucks,0.5679062277917467
+Cleveland Cavaliers,Philadelphia 76ers,0.9862499716834574
+Denver Nuggets,Phoenix Suns,0.7585442163294305
+Portland Trail Blazers,Houston Rockets,0.7754367132277132
+Golden State Warriors,Atlanta Hawks,0.7982274074070118
+Charlotte Hornets,Memphis Grizzlies,0.6336282324996041
+Miami Heat,Boston Celtics,0.549760689910959
+Utah Jazz,Minnesota Timberwolves,0.6901647545548728
+Oklahoma City Thunder,New York Knicks,0.8336737762750189
+Toronto Raptors,Philadelphia 76ers,0.9778431757624951
+Washington Wizards,Sacramento Kings,0.647446121553618
+Los Angeles Clippers,Brooklyn Nets,0.9220746519194348
+Charlotte Hornets,Detroit Pistons,0.5982105214733465
+Cleveland Cavaliers,Milwaukee Bucks,0.8534872120349035
+New Orleans Pelicans,Los Angeles Lakers,0.7864502838591256
+San Antonio Spurs,Orlando Magic,0.8846714827781536
+Utah Jazz,Houston Rockets,0.5458062237875888
+Boston Celtics,Detroit Pistons,0.6263991961477873
+Chicago Bulls,Los Angeles Lakers,0.9280071603628831
+San Antonio Spurs,Dallas Mavericks,0.768139827856392
+Miami Heat,Denver Nuggets,0.7152956702256419
+New York Knicks,Minnesota Timberwolves,0.5284763117149254
+Oklahoma City Thunder,Washington Wizards,0.7556682794468954
+Atlanta Hawks,Phoenix Suns,0.8806050359269868
+Portland Trail Blazers,Indiana Pacers,0.7169549228632791
+Toronto Raptors,Memphis Grizzlies,0.7926432923794707
+Milwaukee Bucks,Brooklyn Nets,0.77738614064479
+Charlotte Hornets,Dallas Mavericks,0.6886043523426272
+Cleveland Cavaliers,Los Angeles Clippers,0.7125341593660648
+Golden State Warriors,Houston Rockets,0.873972520984708
+Memphis Grizzlies,Orlando Magic,0.5727519613234661
+Miami Heat,Utah Jazz,0.5559002917798469
+Atlanta Hawks,Detroit Pistons,0.6038802573333406
+Boston Celtics,Sacramento Kings,0.7668062259442151
+Cleveland Cavaliers,Chicago Bulls,0.6380699609772931
+Houston Rockets,Denver Nuggets,0.625501247777912
+Los Angeles Clippers,New Orleans Pelicans,0.805910508584724
+Minnesota Timberwolves,New York Knicks,0.5090282992624868
+Orlando Magic,Philadelphia 76ers,0.9475259110879476
+San Antonio Spurs,Washington Wizards,0.8340363924813742
+Toronto Raptors,Los Angeles Lakers,0.9640721594321646
+Charlotte Hornets,Minnesota Timberwolves,0.7816405792868943
+Dallas Mavericks,Chicago Bulls,0.5113738645819857
+Golden State Warriors,Phoenix Suns,0.959961011674701
+Memphis Grizzlies,Los Angeles Lakers,0.8846502571417674
+Milwaukee Bucks,Brooklyn Nets,0.6773974242380878
+Boston Celtics,Philadelphia 76ers,0.9779151918064878
+Portland Trail Blazers,Miami Heat,0.6965639820887736
+Toronto Raptors,Atlanta Hawks,0.6586785799507046
+Utah Jazz,Denver Nuggets,0.6167794489859763
+Detroit Pistons,Orlando Magic,0.6568380918875059
+Los Angeles Clippers,Indiana Pacers,0.6568562148674806
+Sacramento Kings,New York Knicks,0.559662113528131
+Oklahoma City Thunder,New Orleans Pelicans,0.8679840452122157
+Oklahoma City Thunder,Atlanta Hawks,0.5687802848125711
+Washington Wizards,Brooklyn Nets,0.8710888354435267
+Chicago Bulls,Portland Trail Blazers,0.5715674164036149
+Charlotte Hornets,Dallas Mavericks,0.5987541945427852
+Golden State Warriors,Indiana Pacers,0.8357152802069171
+Boston Celtics,Houston Rockets,0.622356322402252
+Utah Jazz,Los Angeles Lakers,0.9027720854089509
+San Antonio Spurs,Milwaukee Bucks,0.883020103086792
+Memphis Grizzlies,New Orleans Pelicans,0.6558966184338011
+Denver Nuggets,Philadelphia 76ers,0.9492222305347946
+Toronto Raptors,Cleveland Cavaliers,0.5414506135932451
+Detroit Pistons,Chicago Bulls,0.5631887344038223
+Memphis Grizzlies,Philadelphia 76ers,0.9265439176880996
+Miami Heat,New York Knicks,0.8221580337724813
+San Antonio Spurs,Minnesota Timberwolves,0.8990602374157421
+Utah Jazz,Phoenix Suns,0.8060007067984433
+Washington Wizards,Orlando Magic,0.630142402870544
+Atlanta Hawks,Miami Heat,0.5708032687976801
+Denver Nuggets,Brooklyn Nets,0.8208838019157048
+Charlotte Hornets,Detroit Pistons,0.5982105214733465
+Dallas Mavericks,Sacramento Kings,0.6261251732548709
+Houston Rockets,Los Angeles Lakers,0.894878593287147
+Golden State Warriors,Los Angeles Clippers,0.6412633983972746
+Portland Trail Blazers,Milwaukee Bucks,0.7123800990037856
+Cleveland Cavaliers,New York Knicks,0.84476644565779
+Boston Celtics,Orlando Magic,0.7028451764614108
+Indiana Pacers,Phoenix Suns,0.8515408290487404
+San Antonio Spurs,Chicago Bulls,0.6955349642948577
+Portland Trail Blazers,Memphis Grizzlies,0.5574945918758645
+New Orleans Pelicans,Philadelphia 76ers,0.8582961585483596
+Toronto Raptors,Minnesota Timberwolves,0.861068869924068
+Golden State Warriors,Utah Jazz,0.7951559619465784
+Washington Wizards,Denver Nuggets,0.6220311193381278
+Toronto Raptors,Boston Celtics,0.5031187239815695
+Charlotte Hornets,Orlando Magic,0.730384549178095
+Cleveland Cavaliers,Miami Heat,0.7605707588522127
+Indiana Pacers,Dallas Mavericks,0.5488554611953915
+Phoenix Suns,Los Angeles Lakers,0.7431120335451005
+Atlanta Hawks,Milwaukee Bucks,0.7809122824496479
+Detroit Pistons,Minnesota Timberwolves,0.7589486106567865
+Oklahoma City Thunder,Houston Rockets,0.7729753509947972
+Sacramento Kings,New York Knicks,0.5756202689546583
+Chicago Bulls,Miami Heat,0.5193021508393872
+Cleveland Cavaliers,Charlotte Hornets,0.7407748163318797
+Houston Rockets,Dallas Mavericks,0.5484635235494044
+Indiana Pacers,Portland Trail Blazers,0.5520381856992694
+Los Angeles Clippers,New Orleans Pelicans,0.8344140812303181
+Golden State Warriors,Memphis Grizzlies,0.8283177856452285
+Orlando Magic,Denver Nuggets,0.5003663386715475
+San Antonio Spurs,Brooklyn Nets,0.9593848947129437
+Utah Jazz,Sacramento Kings,0.6423445374547871
+Washington Wizards,Milwaukee Bucks,0.6835266445517905
+Detroit Pistons,Philadelphia 76ers,0.9473957956457268
+New York Knicks,Los Angeles Lakers,0.8236901188533063
+Golden State Warriors,Minnesota Timberwolves,0.9179793327550426
+Oklahoma City Thunder,Boston Celtics,0.6581364526152167
+New Orleans Pelicans,Phoenix Suns,0.6854243362588874
+Dallas Mavericks,Denver Nuggets,0.6001224610550165
+Houston Rockets,Brooklyn Nets,0.8208559148872403
+Charlotte Hornets,Indiana Pacers,0.5269499754611222
+Los Angeles Clippers,Portland Trail Blazers,0.6817660402765916
+Miami Heat,Washington Wizards,0.6623488021178058
+Sacramento Kings,Los Angeles Lakers,0.8340518092035957
+Toronto Raptors,Milwaukee Bucks,0.8560320182323938
+Atlanta Hawks,Orlando Magic,0.7350153341096735
+Chicago Bulls,Minnesota Timberwolves,0.748572857719385
+Cleveland Cavaliers,Memphis Grizzlies,0.843739080498286
+Golden State Warriors,New Orleans Pelicans,0.9094810947100891
+New York Knicks,Phoenix Suns,0.6627850006384427
+Portland Trail Blazers,Oklahoma City Thunder,0.5668432608479947
+Brooklyn Nets,Los Angeles Lakers,0.5637605467588406
+Detroit Pistons,Dallas Mavericks,0.5394019112380164
+Houston Rockets,Sacramento Kings,0.6159613138520657
+Cleveland Cavaliers,Memphis Grizzlies,0.7476741912338607
+Miami Heat,Indiana Pacers,0.6130212413823238
+Los Angeles Clippers,Orlando Magic,0.7205240837461162
+Toronto Raptors,Philadelphia 76ers,0.9823873772272136
+San Antonio Spurs,Boston Celtics,0.7577592088942211
+Oklahoma City Thunder,Utah Jazz,0.6870891092701095
+Charlotte Hornets,Washington Wizards,0.576415092870763
+Portland Trail Blazers,Denver Nuggets,0.6704547911733075
+Golden State Warriors,New York Knicks,0.9368904636673482
+Chicago Bulls,Milwaukee Bucks,0.6852500426161923
+Indiana Pacers,New Orleans Pelicans,0.7459538946303981
+San Antonio Spurs,Phoenix Suns,0.9398301298340116
+Boston Celtics,Charlotte Hornets,0.568187054027381
+Chicago Bulls,Milwaukee Bucks,0.7406857866137775
+Houston Rockets,New Orleans Pelicans,0.6745173503291141
+Memphis Grizzlies,Sacramento Kings,0.5909979465147822
+Miami Heat,Los Angeles Clippers,0.5283506717781481
+Orlando Magic,Brooklyn Nets,0.7614845004422947
+Los Angeles Lakers,Philadelphia 76ers,0.7594011562632295
+Toronto Raptors,Atlanta Hawks,0.6586785799507046
+Utah Jazz,Dallas Mavericks,0.576294077031833
+Detroit Pistons,Washington Wizards,0.5164271476442555
+Atlanta Hawks,Charlotte Hornets,0.5447096530376866
+Cleveland Cavaliers,Los Angeles Lakers,0.9742952105132068
+Denver Nuggets,New York Knicks,0.5617286507378721
+Detroit Pistons,Indiana Pacers,0.5031406890370482
+Golden State Warriors,Portland Trail Blazers,0.8505944568958157
+Houston Rockets,Minnesota Timberwolves,0.7058211919600239
+Oklahoma City Thunder,Phoenix Suns,0.9217004614721095
+Dallas Mavericks,Sacramento Kings,0.6261251732548709
+Memphis Grizzlies,Utah Jazz,0.51013917616139
+Miami Heat,Boston Celtics,0.549760689910959
+Toronto Raptors,Orlando Magic,0.7487055100835798
+Brooklyn Nets,Philadelphia 76ers,0.8543101342335301
+San Antonio Spurs,New Orleans Pelicans,0.9144078692442914
+Los Angeles Clippers,Washington Wizards,0.6107224030913136
+Chicago Bulls,Detroit Pistons,0.5532416785743169
+Dallas Mavericks,Denver Nuggets,0.5960724028284132
+Indiana Pacers,Washington Wizards,0.5769033775181261
+Minnesota Timberwolves,Phoenix Suns,0.5903266410874655
+Oklahoma City Thunder,Atlanta Hawks,0.6601340944937261
+Charlotte Hornets,Los Angeles Lakers,0.9393865417382348
+Golden State Warriors,Utah Jazz,0.881929839060726
+San Antonio Spurs,Houston Rockets,0.7757424997465636
+Los Angeles Clippers,Denver Nuggets,0.7775314467152526
+Boston Celtics,Memphis Grizzlies,0.6465503870392937
+Miami Heat,Orlando Magic,0.7496416578736835
+Cleveland Cavaliers,Milwaukee Bucks,0.8534872120349035
+Indiana Pacers,New York Knicks,0.7214102060867198
+New Orleans Pelicans,Philadelphia 76ers,0.9283943796481311
+Portland Trail Blazers,Sacramento Kings,0.6578221224628873
+Toronto Raptors,Brooklyn Nets,0.9352474880520673
+Atlanta Hawks,Minnesota Timberwolves,0.7856493769740942
+Chicago Bulls,Washington Wizards,0.5961416330768025
+Cleveland Cavaliers,Milwaukee Bucks,0.8936045207332446
+Detroit Pistons,Memphis Grizzlies,0.6093664507620966
+Oklahoma City Thunder,New Orleans Pelicans,0.8503783565908092
+Houston Rockets,Phoenix Suns,0.8079703336023722
+Portland Trail Blazers,Dallas Mavericks,0.7962642290299232
+Utah Jazz,Sacramento Kings,0.6423445374547871
+Golden State Warriors,Brooklyn Nets,0.9662530927028656
+Boston Celtics,Indiana Pacers,0.5409085632121504
+San Antonio Spurs,Los Angeles Clippers,0.5872174753740129
+Miami Heat,Los Angeles Lakers,0.9448431322871262
+Orlando Magic,New York Knicks,0.5780552884369909
+Oklahoma City Thunder,Boston Celtics,0.5453093265348623
+Charlotte Hornets,Chicago Bulls,0.6459886347594599
+Cleveland Cavaliers,Brooklyn Nets,0.9532749103283319
+Atlanta Hawks,Denver Nuggets,0.7454065040885878
+Golden State Warriors,Detroit Pistons,0.7716417174881048
+Los Angeles Clippers,Dallas Mavericks,0.7470642988864873
+Houston Rockets,Memphis Grizzlies,0.5084297621871419
+Washington Wizards,Milwaukee Bucks,0.6912152403146272
+Sacramento Kings,Minnesota Timberwolves,0.6161786086748275
+Miami Heat,New Orleans Pelicans,0.7641496136178543
+Orlando Magic,Los Angeles Lakers,0.8557277919949441
+Phoenix Suns,Philadelphia 76ers,0.7561378350127939
+San Antonio Spurs,Portland Trail Blazers,0.5180878888323307
+Toronto Raptors,Utah Jazz,0.6496007528840624
+Cleveland Cavaliers,Golden State Warriors,0.5060151317829639
+Los Angeles Clippers,Los Angeles Lakers,0.9506901392566504
+Boston Celtics,New York Knicks,0.7706161235260826
+Oklahoma City Thunder,Minnesota Timberwolves,0.8618423484130558
+San Antonio Spurs,Chicago Bulls,0.8378490209768296
+Charlotte Hornets,Brooklyn Nets,0.9112180730690862
+Chicago Bulls,Indiana Pacers,0.5438036453214102
+Cleveland Cavaliers,Detroit Pistons,0.674826996698044
+Houston Rockets,Phoenix Suns,0.787699889257856
+Los Angeles Clippers,Denver Nuggets,0.7775314467152526
+Atlanta Hawks,Minnesota Timberwolves,0.8079075524135518
+Dallas Mavericks,New Orleans Pelicans,0.6555323937819689
+Memphis Grizzlies,Orlando Magic,0.5420182673434084
+Portland Trail Blazers,Toronto Raptors,0.6078405271852036
+Sacramento Kings,Philadelphia 76ers,0.8920804235457511
+Washington Wizards,Milwaukee Bucks,0.6835266445517905
+Boston Celtics,Memphis Grizzlies,0.7131586737602972
+Dallas Mavericks,Houston Rockets,0.5284229857234188
+Utah Jazz,Los Angeles Lakers,0.9027720854089509
+Oklahoma City Thunder,Miami Heat,0.5499314762976709
+Atlanta Hawks,New York Knicks,0.8106984118491968
+Chicago Bulls,Brooklyn Nets,0.8740285590551515
+Denver Nuggets,Minnesota Timberwolves,0.5231143906282506
+Detroit Pistons,Milwaukee Bucks,0.7081537265549922
+Golden State Warriors,Toronto Raptors,0.7568569186207694
+Los Angeles Clippers,New Orleans Pelicans,0.805910508584724
+Charlotte Hornets,Orlando Magic,0.6909975274944149
+Portland Trail Blazers,Sacramento Kings,0.837682303738023
+San Antonio Spurs,Phoenix Suns,0.95031599020266
+Indiana Pacers,Washington Wizards,0.5259378176663204
+Charlotte Hornets,Miami Heat,0.5650011313292498
+Cleveland Cavaliers,Boston Celtics,0.7298581867315248
+Dallas Mavericks,Los Angeles Lakers,0.8983348594463225
+Oklahoma City Thunder,Memphis Grizzlies,0.7318458424793735
+Toronto Raptors,Phoenix Suns,0.9036017167189094
+Utah Jazz,Philadelphia 76ers,0.9400395103271514
+Atlanta Hawks,Detroit Pistons,0.6038802573333406
+Boston Celtics,Miami Heat,0.5939381829682465
+Denver Nuggets,Philadelphia 76ers,0.8865053165439156
+Golden State Warriors,Dallas Mavericks,0.8869929996912033
+Los Angeles Clippers,Houston Rockets,0.6423873548177825
+Indiana Pacers,Chicago Bulls,0.5836744284667654
+Milwaukee Bucks,Minnesota Timberwolves,0.5771696211426716
+New York Knicks,New Orleans Pelicans,0.5015351211028908
+San Antonio Spurs,Portland Trail Blazers,0.8195561866572759
+Washington Wizards,Brooklyn Nets,0.839908633574516
+Chicago Bulls,Milwaukee Bucks,0.7406857866137775
+Cleveland Cavaliers,Charlotte Hornets,0.5945385343354597
+Houston Rockets,New York Knicks,0.6967294326238203
+Oklahoma City Thunder,Los Angeles Clippers,0.6384911361926477
+Memphis Grizzlies,Sacramento Kings,0.5827568768390616
+Utah Jazz,Phoenix Suns,0.8060007067984433
+San Antonio Spurs,Atlanta Hawks,0.6498187958036055
+Indiana Pacers,Orlando Magic,0.675462677405449
+Toronto Raptors,Los Angeles Lakers,0.9570459965730215
+Miami Heat,Detroit Pistons,0.6220226006103141
+Portland Trail Blazers,Minnesota Timberwolves,0.7450629454479258
+Utah Jazz,Brooklyn Nets,0.8507153953965613
+Charlotte Hornets,Chicago Bulls,0.5071406794950746
+Cleveland Cavaliers,New Orleans Pelicans,0.9022213053303488
+Golden State Warriors,Denver Nuggets,0.9027981900447736
+Washington Wizards,Houston Rockets,0.5063713108528505
+Los Angeles Clippers,Phoenix Suns,0.90021965786247
+Oklahoma City Thunder,Milwaukee Bucks,0.8429018223120504
+Orlando Magic,New York Knicks,0.5780552884369909
+Boston Celtics,Utah Jazz,0.7032524749493632
+Dallas Mavericks,Washington Wizards,0.5044253257503879
+Sacramento Kings,Denver Nuggets,0.5277589880138731
+Detroit Pistons,Indiana Pacers,0.5031406890370482
+Memphis Grizzlies,Los Angeles Lakers,0.8984821134322052
+Minnesota Timberwolves,Philadelphia 76ers,0.9318116310195025
+Miami Heat,Phoenix Suns,0.8635572868574253
+San Antonio Spurs,Toronto Raptors,0.7129175998864732
+Oklahoma City Thunder,Charlotte Hornets,0.5745699702381706
+Cleveland Cavaliers,Chicago Bulls,0.8169442060842229
+Golden State Warriors,Portland Trail Blazers,0.8505944568958157
+Los Angeles Clippers,Memphis Grizzlies,0.7467593149116336
+Milwaukee Bucks,New York Knicks,0.5193893757694541
+Atlanta Hawks,Orlando Magic,0.7009848656312021
+Miami Heat,Sacramento Kings,0.7036220610320252
+Dallas Mavericks,Phoenix Suns,0.7948324970635221
+San Antonio Spurs,Denver Nuggets,0.8611191846346555
+Charlotte Hornets,Detroit Pistons,0.5477705113528506
+Oklahoma City Thunder,Houston Rockets,0.7108794967217815
+Indiana Pacers,Brooklyn Nets,0.8650307419281302
+Atlanta Hawks,New Orleans Pelicans,0.7906061075379057
+Portland Trail Blazers,Los Angeles Lakers,0.9647775763647866
+Toronto Raptors,Utah Jazz,0.7846532348415816
+Boston Celtics,Philadelphia 76ers,0.9663348016704397
+Cleveland Cavaliers,Brooklyn Nets,0.9461924140437734
+Golden State Warriors,Memphis Grizzlies,0.8868311795635295
+Miami Heat,Los Angeles Lakers,0.9376712552914026
+Milwaukee Bucks,New York Knicks,0.5128600627267141
+Houston Rockets,Orlando Magic,0.5721663671164672
+Los Angeles Clippers,Sacramento Kings,0.7526308868162708
+Washington Wizards,Minnesota Timberwolves,0.692430304746974
+Boston Celtics,New Orleans Pelicans,0.8094764311634105
+Toronto Raptors,Chicago Bulls,0.578226666664924
+Atlanta Hawks,Dallas Mavericks,0.6100404081637408
+Indiana Pacers,New York Knicks,0.7626625362601138
+Utah Jazz,Minnesota Timberwolves,0.6901647545548728
+Oklahoma City Thunder,Denver Nuggets,0.8201478208741535
+San Antonio Spurs,Charlotte Hornets,0.7679068801587653
+Brooklyn Nets,Philadelphia 76ers,0.6800471337206065
+Los Angeles Clippers,Miami Heat,0.6343438302001299
+Orlando Magic,Los Angeles Lakers,0.8782419790448615
+Memphis Grizzlies,Utah Jazz,0.51013917616139
+Washington Wizards,Milwaukee Bucks,0.6912152403146272
+Cleveland Cavaliers,Phoenix Suns,0.9233953285217892
+Portland Trail Blazers,Detroit Pistons,0.7246247142237042
+Golden State Warriors,Sacramento Kings,0.8804138910700824
+Toronto Raptors,Houston Rockets,0.7718360630850073
+Oklahoma City Thunder,Chicago Bulls,0.6188709415636162
+Dallas Mavericks,Minnesota Timberwolves,0.6794696943721221
+New York Knicks,New Orleans Pelicans,0.5041140317433757
+Atlanta Hawks,Brooklyn Nets,0.9149635533873091
+Golden State Warriors,Miami Heat,0.8217529126468895
+Charlotte Hornets,Houston Rockets,0.6090844370504294
+Portland Trail Blazers,Los Angeles Lakers,0.9241400427394095
+Detroit Pistons,Sacramento Kings,0.6743828652184481
+San Antonio Spurs,Milwaukee Bucks,0.9067540362880537
+Toronto Raptors,Boston Celtics,0.6566768323026223
+Cleveland Cavaliers,Utah Jazz,0.7044925767692124
+Washington Wizards,Chicago Bulls,0.5343722444953217
+Boston Celtics,Washington Wizards,0.666508804452891
+Los Angeles Clippers,Orlando Magic,0.7834673162612331
+Houston Rockets,Minnesota Timberwolves,0.7058211919600239
+Oklahoma City Thunder,Memphis Grizzlies,0.7937064529005851
+New York Knicks,Philadelphia 76ers,0.9212315962024815
+Portland Trail Blazers,Cleveland Cavaliers,0.5465510153476122
+New Orleans Pelicans,Brooklyn Nets,0.760686258207887
+Indiana Pacers,Denver Nuggets,0.694836073344844
+Golden State Warriors,Detroit Pistons,0.8408811875219446
+Chicago Bulls,New York Knicks,0.670382780615068
+Dallas Mavericks,Phoenix Suns,0.7880209304518935
+San Antonio Spurs,Los Angeles Lakers,0.9777207261443515
+Atlanta Hawks,Boston Celtics,0.5307663794727151
+Houston Rockets,Memphis Grizzlies,0.5480639375116193
+Miami Heat,Milwaukee Bucks,0.7536126929065275
+Oklahoma City Thunder,Minnesota Timberwolves,0.8635931477335815
+Charlotte Hornets,Philadelphia 76ers,0.9766706351774015
+Portland Trail Blazers,Orlando Magic,0.8272239288976616
+Cleveland Cavaliers,Sacramento Kings,0.8188906997725101
+Toronto Raptors,Brooklyn Nets,0.9352474880520673
+Detroit Pistons,Utah Jazz,0.5219882280540216
+Chicago Bulls,New Orleans Pelicans,0.7583379565028897
+Los Angeles Clippers,Los Angeles Lakers,0.9539166002352777
+San Antonio Spurs,Phoenix Suns,0.9398301298340116
+Utah Jazz,Orlando Magic,0.6249354788155909
+Washington Wizards,Philadelphia 76ers,0.9412829419654891
+Atlanta Hawks,Milwaukee Bucks,0.7785813478299822
+Houston Rockets,Brooklyn Nets,0.8599057722293095
+Dallas Mavericks,Minnesota Timberwolves,0.6724535164702867
+Detroit Pistons,Los Angeles Lakers,0.9291987853493926
+Chicago Bulls,Memphis Grizzlies,0.5254862878469151
+Oklahoma City Thunder,Sacramento Kings,0.8063728147757144
+Toronto Raptors,New York Knicks,0.8786655233057723
+Boston Celtics,Charlotte Hornets,0.568187054027381
+Orlando Magic,Denver Nuggets,0.546404718852969
+Golden State Warriors,Cleveland Cavaliers,0.7076556139235286
+Indiana Pacers,New Orleans Pelicans,0.7435017134170783
+Oklahoma City Thunder,Los Angeles Clippers,0.5027769796823538
+Milwaukee Bucks,Philadelphia 76ers,0.8651572571727271
+Atlanta Hawks,New York Knicks,0.7690406675112005
+Utah Jazz,Phoenix Suns,0.7961804739547784
+Washington Wizards,Portland Trail Blazers,0.5021848961939593
+Toronto Raptors,Brooklyn Nets,0.9318545523726081
+Chicago Bulls,Dallas Mavericks,0.6477959997787966
+Denver Nuggets,Los Angeles Lakers,0.881898863148626
+Miami Heat,Houston Rockets,0.6834974840551156
+San Antonio Spurs,Minnesota Timberwolves,0.9102024821772375
+Boston Celtics,New York Knicks,0.824869717282802
+Charlotte Hornets,Portland Trail Blazers,0.6159720746091635
+Atlanta Hawks,Detroit Pistons,0.5594356025196464
+Golden State Warriors,Oklahoma City Thunder,0.724374076778863
+Houston Rockets,Milwaukee Bucks,0.6535397646128213
+Orlando Magic,New Orleans Pelicans,0.6083723906462333
+Toronto Raptors,Philadelphia 76ers,0.9823873772272136
+Indiana Pacers,Sacramento Kings,0.6826957013784596
+Washington Wizards,Memphis Grizzlies,0.5813316875836788
+Cleveland Cavaliers,Phoenix Suns,0.9429228802196592
+Los Angeles Clippers,Minnesota Timberwolves,0.827021867477919
+Miami Heat,Dallas Mavericks,0.7096593431314695
+Washington Wizards,New York Knicks,0.6764967244669957
+San Antonio Spurs,Denver Nuggets,0.8810888742775865
+Atlanta Hawks,Chicago Bulls,0.6513770754884305
+Toronto Raptors,Charlotte Hornets,0.5327681139234506
+Dallas Mavericks,Utah Jazz,0.5468866274870011
+Golden State Warriors,Houston Rockets,0.8129666587642488
+Indiana Pacers,Los Angeles Lakers,0.9316654807001815
+Memphis Grizzlies,Sacramento Kings,0.5909979465147822
+New Orleans Pelicans,Brooklyn Nets,0.6646854524660385
+Orlando Magic,Milwaukee Bucks,0.5679062277917467
+Portland Trail Blazers,Philadelphia 76ers,0.9682507783120081
+Atlanta Hawks,Philadelphia 76ers,0.9630985581234137
+Boston Celtics,Portland Trail Blazers,0.6436569234796641
+Chicago Bulls,Sacramento Kings,0.7083412528159343
+Charlotte Hornets,Brooklyn Nets,0.892955789487726
+Cleveland Cavaliers,San Antonio Spurs,0.5627767802077378
+Los Angeles Clippers,Denver Nuggets,0.7630242837132536
+Detroit Pistons,Washington Wizards,0.5563377609924854
+Houston Rockets,Memphis Grizzlies,0.5084297621871419
+Miami Heat,Milwaukee Bucks,0.7914851501430366
+New York Knicks,Phoenix Suns,0.6454010633231948
+Indiana Pacers,Utah Jazz,0.5314887501115197
+Dallas Mavericks,Los Angeles Lakers,0.8988726279374206
+Denver Nuggets,Minnesota Timberwolves,0.6417604989251788
+Golden State Warriors,Orlando Magic,0.861848054169918
+Toronto Raptors,Phoenix Suns,0.9212314716932575
+Atlanta Hawks,Los Angeles Clippers,0.5092593944871583
+San Antonio Spurs,Brooklyn Nets,0.9579589944627641
+Charlotte Hornets,Washington Wizards,0.6396052774245168
+Detroit Pistons,Sacramento Kings,0.6735399071295384
+Indiana Pacers,New York Knicks,0.7626625362601138
+Golden State Warriors,Miami Heat,0.6835506747278112
+Houston Rockets,Milwaukee Bucks,0.6703335245084918
+Cleveland Cavaliers,New Orleans Pelicans,0.8605433205941222
+Oklahoma City Thunder,Utah Jazz,0.6870891092701095
+Utah Jazz,Denver Nuggets,0.6079445383505202
+Chicago Bulls,Orlando Magic,0.5887999690619977
+Los Angeles Clippers,Philadelphia 76ers,0.9797017272536213
+Minnesota Timberwolves,Phoenix Suns,0.6966481459706437
+San Antonio Spurs,Toronto Raptors,0.523219327990091
+Boston Celtics,Washington Wizards,0.5900496035050935
+Boston Celtics,Houston Rockets,0.6875198520312162
+Miami Heat,Brooklyn Nets,0.9022772528767836
+Atlanta Hawks,Chicago Bulls,0.5189333930570054
+Golden State Warriors,Charlotte Hornets,0.7048008837705897
+Cleveland Cavaliers,Sacramento Kings,0.8771706708275222
+Dallas Mavericks,New York Knicks,0.7057767562157982
+Toronto Raptors,Memphis Grizzlies,0.6973577353507303
+Milwaukee Bucks,Philadelphia 76ers,0.8651572571727271
+Oklahoma City Thunder,New Orleans Pelicans,0.8503783565908092
+Portland Trail Blazers,Los Angeles Lakers,0.9647775763647866
+Denver Nuggets,Phoenix Suns,0.67426195243232
+Indiana Pacers,Minnesota Timberwolves,0.7658521110665237
+Oklahoma City Thunder,Dallas Mavericks,0.793970496452267
+Utah Jazz,Los Angeles Lakers,0.9050539698282559
+Atlanta Hawks,Washington Wizards,0.645037490735184
+Boston Celtics,Orlando Magic,0.7531270343300652
+Chicago Bulls,Miami Heat,0.5193021508393872
+Cleveland Cavaliers,Brooklyn Nets,0.9532749103283319
+Indiana Pacers,Sacramento Kings,0.6916835175429246
+San Antonio Spurs,New Orleans Pelicans,0.8888391437216197
+Charlotte Hornets,New York Knicks,0.7605499701863525
+Houston Rockets,Philadelphia 76ers,0.9615927595352421
+Portland Trail Blazers,Memphis Grizzlies,0.796002369799972
+Toronto Raptors,Milwaukee Bucks,0.8560320182323938
+Charlotte Hornets,Sacramento Kings,0.7448970514344154
+Golden State Warriors,Los Angeles Clippers,0.7824806928354034
+Miami Heat,Detroit Pistons,0.6220226006103141
+Boston Celtics,Milwaukee Bucks,0.7824296682516023
+Minnesota Timberwolves,Brooklyn Nets,0.6402286639585565
+Denver Nuggets,Phoenix Suns,0.7585442163294305
+Utah Jazz,Memphis Grizzlies,0.5759000755010675
+Atlanta Hawks,New York Knicks,0.8106984118491968
+Chicago Bulls,Philadelphia 76ers,0.9549558892016753
+Cleveland Cavaliers,Oklahoma City Thunder,0.6442378330211438
+Indiana Pacers,Houston Rockets,0.600173265638124
+Washington Wizards,New Orleans Pelicans,0.7033702934777505
+Golden State Warriors,Portland Trail Blazers,0.5746284548698412
+San Antonio Spurs,Dallas Mavericks,0.8622921525982259
+Toronto Raptors,Orlando Magic,0.8242654546368156
+Boston Celtics,Detroit Pistons,0.6263991961477873
+Cleveland Cavaliers,Dallas Mavericks,0.7188388636051233
+Miami Heat,Brooklyn Nets,0.9021568487202618
+Orlando Magic,Minnesota Timberwolves,0.6337559211688705
+Sacramento Kings,Philadelphia 76ers,0.9436689981206002
+Memphis Grizzlies,Phoenix Suns,0.7882903100667067
+Houston Rockets,Sacramento Kings,0.6159613138520657
+Denver Nuggets,Los Angeles Lakers,0.881898863148626
+Portland Trail Blazers,Charlotte Hornets,0.6737460568747573
+San Antonio Spurs,Oklahoma City Thunder,0.6770692742700588
+Toronto Raptors,New Orleans Pelicans,0.8672396544791928
+Washington Wizards,New York Knicks,0.7245536693900161
+Toronto Raptors,Boston Celtics,0.5031187239815695
+New York Knicks,Brooklyn Nets,0.7414199808621746
+Cleveland Cavaliers,Minnesota Timberwolves,0.8974842854269809
+Dallas Mavericks,Philadelphia 76ers,0.9359747298795509
+Memphis Grizzlies,Denver Nuggets,0.5964607954647576
+Detroit Pistons,New Orleans Pelicans,0.7272048189487552
+Golden State Warriors,Charlotte Hornets,0.8057233679441533
+Miami Heat,Atlanta Hawks,0.5519604943835104
+Oklahoma City Thunder,Chicago Bulls,0.7607648276420467
+Indiana Pacers,Orlando Magic,0.6457838180612443
+Los Angeles Clippers,Phoenix Suns,0.8902446779003392
+Utah Jazz,Milwaukee Bucks,0.6786880539772463
+Atlanta Hawks,Houston Rockets,0.6202643635550812
+Golden State Warriors,Los Angeles Clippers,0.6412633983972746
+San Antonio Spurs,Philadelphia 76ers,0.9863344491685189
+Washington Wizards,Los Angeles Lakers,0.906951100463997
+Boston Celtics,Los Angeles Lakers,0.9458074534908282
+Indiana Pacers,Brooklyn Nets,0.8932493059410368
+Denver Nuggets,Milwaukee Bucks,0.5127582845726911
+Detroit Pistons,Minnesota Timberwolves,0.7166517450769262
+Houston Rockets,Chicago Bulls,0.5005787297303419
+Oklahoma City Thunder,Memphis Grizzlies,0.7937064529005851
+Toronto Raptors,Orlando Magic,0.7487055100835798
+Portland Trail Blazers,Dallas Mavericks,0.7962642290299232
+Sacramento Kings,Phoenix Suns,0.6865768650462503
+Atlanta Hawks,Orlando Magic,0.7350153341096735
+Indiana Pacers,Detroit Pistons,0.5335588066627329
+Miami Heat,Philadelphia 76ers,0.9657225133434763
+Memphis Grizzlies,Minnesota Timberwolves,0.6798209709660259
+Cleveland Cavaliers,New York Knicks,0.84476644565779
+Milwaukee Bucks,Phoenix Suns,0.7053417854206088
+Golden State Warriors,Sacramento Kings,0.8804138910700824
+San Antonio Spurs,Denver Nuggets,0.8810888742775865
+Charlotte Hornets,Utah Jazz,0.5818448982335008
+Washington Wizards,New Orleans Pelicans,0.7035122731738267
+Boston Celtics,Los Angeles Clippers,0.5329975773140343
+Toronto Raptors,Brooklyn Nets,0.9318545523726081
+Oklahoma City Thunder,Portland Trail Blazers,0.7365106391984931
+Atlanta Hawks,Utah Jazz,0.6830217734869102
+Dallas Mavericks,Denver Nuggets,0.5960724028284132
+Detroit Pistons,Philadelphia 76ers,0.9473957956457268
+Oklahoma City Thunder,Indiana Pacers,0.6374003272962141
+San Antonio Spurs,Memphis Grizzlies,0.7933723357353494
+Miami Heat,Minnesota Timberwolves,0.783037165168968
+New Orleans Pelicans,Phoenix Suns,0.616141817873113
+New York Knicks,Los Angeles Lakers,0.8067985183520258
+Chicago Bulls,Sacramento Kings,0.6282314851425062
+Toronto Raptors,Los Angeles Clippers,0.6369939023524225
+Cleveland Cavaliers,Washington Wizards,0.6998337688195485
+Charlotte Hornets,Brooklyn Nets,0.892955789487726
+Portland Trail Blazers,Dallas Mavericks,0.5208537025596347
+Houston Rockets,Orlando Magic,0.5980715997709747
+Atlanta Hawks,Denver Nuggets,0.7282120046402423
+Washington Wizards,Brooklyn Nets,0.8710888354435267
+Detroit Pistons,Los Angeles Lakers,0.9163203941778426
+Golden State Warriors,Chicago Bulls,0.8662542245482807
+Cleveland Cavaliers,Indiana Pacers,0.6561844995155902
+Memphis Grizzlies,Phoenix Suns,0.7697265445039138
+Miami Heat,Milwaukee Bucks,0.7536126929065275
+Toronto Raptors,Minnesota Timberwolves,0.842400557815895
+Utah Jazz,New Orleans Pelicans,0.6666342960052667
+Los Angeles Clippers,New York Knicks,0.7854936139184838
+San Antonio Spurs,Philadelphia 76ers,0.9893553587703356
+Boston Celtics,Sacramento Kings,0.7362394908484111
+Charlotte Hornets,Houston Rockets,0.6614503641565681
+Dallas Mavericks,Utah Jazz,0.5468866274870011
+Oklahoma City Thunder,Cleveland Cavaliers,0.5430592361812023
+Orlando Magic,Philadelphia 76ers,0.9070217296173135
+Portland Trail Blazers,Boston Celtics,0.6612973159259319
+Miami Heat,Brooklyn Nets,0.9022772528767836
+San Antonio Spurs,Detroit Pistons,0.7289352176897893
+Golden State Warriors,Memphis Grizzlies,0.8283177856452285
+Milwaukee Bucks,Los Angeles Lakers,0.7959630958666768
+New Orleans Pelicans,Minnesota Timberwolves,0.5540658328613459
+Denver Nuggets,New York Knicks,0.586482924118968
+Chicago Bulls,Phoenix Suns,0.8183467960155119
+Atlanta Hawks,Sacramento Kings,0.7345092715839344
+Indiana Pacers,Washington Wizards,0.5259378176663204
+Charlotte Hornets,Los Angeles Clippers,0.5033491745004646
+Cleveland Cavaliers,Denver Nuggets,0.8648594769274954
+Dallas Mavericks,Orlando Magic,0.6084079225748824
+Houston Rockets,Phoenix Suns,0.787699889257856
+Indiana Pacers,Milwaukee Bucks,0.7251585974045648
+Golden State Warriors,Oklahoma City Thunder,0.5780664269267013
+Miami Heat,Philadelphia 76ers,0.9741341375336782
+Boston Celtics,Utah Jazz,0.5954273039977191
+Chicago Bulls,Minnesota Timberwolves,0.7198031741570186
+San Antonio Spurs,New York Knicks,0.8758013974502015
+Sacramento Kings,New Orleans Pelicans,0.5502636500993806
+Toronto Raptors,Detroit Pistons,0.7205030001905396
+Memphis Grizzlies,Brooklyn Nets,0.8445241057613018
+Charlotte Hornets,Philadelphia 76ers,0.9622489609127842
+Boston Celtics,Dallas Mavericks,0.6121534719133737
+Golden State Warriors,Denver Nuggets,0.8862498278577697
+San Antonio Spurs,Indiana Pacers,0.7120712339591921
+Miami Heat,Orlando Magic,0.7496416578736835
+Detroit Pistons,Milwaukee Bucks,0.7273945808620585
+New Orleans Pelicans,Phoenix Suns,0.6854243362588874
+Portland Trail Blazers,Atlanta Hawks,0.6632859373018714
+Los Angeles Clippers,Utah Jazz,0.6160054015646187
+Oklahoma City Thunder,Washington Wizards,0.682279667989691
+Toronto Raptors,Chicago Bulls,0.578226666664924
+Sacramento Kings,Los Angeles Lakers,0.8699913368583889
+Cleveland Cavaliers,Minnesota Timberwolves,0.8729944136784697
+Boston Celtics,Philadelphia 76ers,0.9663348016704397
+Milwaukee Bucks,Brooklyn Nets,0.77738614064479
+Cleveland Cavaliers,Indiana Pacers,0.7780310877942109
+Denver Nuggets,Minnesota Timberwolves,0.5231143906282506
+Detroit Pistons,Dallas Mavericks,0.6097504295315014
+Golden State Warriors,Sacramento Kings,0.9120048472276371
+Miami Heat,Houston Rockets,0.5836204588404836
+Los Angeles Clippers,Atlanta Hawks,0.5981784095118714
+Memphis Grizzlies,New Orleans Pelicans,0.6512049104129524
+Oklahoma City Thunder,New York Knicks,0.8793547612563638
+San Antonio Spurs,Orlando Magic,0.8323462017993584
+Phoenix Suns,Los Angeles Lakers,0.6534118384589391
+Toronto Raptors,Charlotte Hornets,0.6692104481235245
+Portland Trail Blazers,Utah Jazz,0.5033843953011446
+Boston Celtics,Chicago Bulls,0.5211526256247747
+Indiana Pacers,Washington Wizards,0.5769033775181261
+Cleveland Cavaliers,New York Knicks,0.910945673538786
+Charlotte Hornets,Detroit Pistons,0.5477705113528506
+Golden State Warriors,Los Angeles Clippers,0.7824806928354034
+Houston Rockets,New Orleans Pelicans,0.6829335143262467
+Portland Trail Blazers,Orlando Magic,0.6196288684083593
+Denver Nuggets,Sacramento Kings,0.5409493841058887
+Atlanta Hawks,Miami Heat,0.5708032687976801
+Chicago Bulls,Phoenix Suns,0.8489022335176754
+Denver Nuggets,Brooklyn Nets,0.7188099167347658
+Indiana Pacers,Memphis Grizzlies,0.6291126794856442
+San Antonio Spurs,Los Angeles Clippers,0.5872174753740129
+Utah Jazz,Milwaukee Bucks,0.6537150164720994
+Dallas Mavericks,Minnesota Timberwolves,0.6794696943721221
+Oklahoma City Thunder,Los Angeles Lakers,0.9642959605770868
+Washington Wizards,Philadelphia 76ers,0.9649891187062362
+Toronto Raptors,Boston Celtics,0.6566768323026223
+Cleveland Cavaliers,Chicago Bulls,0.8169442060842229
+Dallas Mavericks,New Orleans Pelicans,0.6839267066343925
+Golden State Warriors,Brooklyn Nets,0.967329917894421
+Houston Rockets,Minnesota Timberwolves,0.6628709701215469
+Miami Heat,Indiana Pacers,0.6130212413823238
+New York Knicks,Philadelphia 76ers,0.8729048451096209
+Atlanta Hawks,Orlando Magic,0.7009848656312021
+Charlotte Hornets,Sacramento Kings,0.7252027182087954
+Memphis Grizzlies,Denver Nuggets,0.5964607954647576
+Boston Celtics,Detroit Pistons,0.5616258296132322
+Los Angeles Clippers,Charlotte Hornets,0.6094702553745488
+San Antonio Spurs,Los Angeles Lakers,0.9737719763455626
+Milwaukee Bucks,Phoenix Suns,0.6296687695679322
+Oklahoma City Thunder,New Orleans Pelicans,0.8679840452122157
+Toronto Raptors,Portland Trail Blazers,0.735251034889827
+Washington Wizards,Utah Jazz,0.5696202671112416
+Boston Celtics,Atlanta Hawks,0.5565700122350405
+Cleveland Cavaliers,Milwaukee Bucks,0.8936045207332446
+Miami Heat,Dallas Mavericks,0.5730889545797486
+Indiana Pacers,Houston Rockets,0.5595253020945163
+Toronto Raptors,New York Knicks,0.8088616394029131
+Golden State Warriors,Philadelphia 76ers,0.9915102901105846
+Sacramento Kings,Minnesota Timberwolves,0.5372216083882487
+Chicago Bulls,Denver Nuggets,0.6851815383086881
+Detroit Pistons,Portland Trail Blazers,0.5312459926537206
+Charlotte Hornets,Los Angeles Lakers,0.9435763216623784
+Memphis Grizzlies,Phoenix Suns,0.7697265445039138
+Oklahoma City Thunder,Utah Jazz,0.785746288626296
+Golden State Warriors,Washington Wizards,0.7915034833695422
+Atlanta Hawks,Dallas Mavericks,0.6936517492730055
+Cleveland Cavaliers,Boston Celtics,0.5656129755096008
+Los Angeles Clippers,Houston Rockets,0.7229571141818244
+Miami Heat,Philadelphia 76ers,0.9657225133434763
+Denver Nuggets,Milwaukee Bucks,0.6028928109381392
+Detroit Pistons,New Orleans Pelicans,0.7386639175230978
+Orlando Magic,New York Knicks,0.6154902912454222
+Sacramento Kings,Brooklyn Nets,0.7301147669610306
+San Antonio Spurs,Indiana Pacers,0.8023043634759114
+Toronto Raptors,Washington Wizards,0.7544697268953504
+Utah Jazz,Minnesota Timberwolves,0.6876656395909585
+Golden State Warriors,Chicago Bulls,0.7416385728066474
+Charlotte Hornets,Phoenix Suns,0.875552050232863
+Portland Trail Blazers,Oklahoma City Thunder,0.5668432608479947
+Cleveland Cavaliers,Atlanta Hawks,0.5888261298550048
+Dallas Mavericks,Memphis Grizzlies,0.5587374481213283
+Boston Celtics,Los Angeles Lakers,0.9464896391391602
+Los Angeles Clippers,Milwaukee Bucks,0.7967430444776802
+San Antonio Spurs,New Orleans Pelicans,0.8888391437216197
+Miami Heat,Orlando Magic,0.6679605471462637
+New York Knicks,Philadelphia 76ers,0.9212315962024815
+Oklahoma City Thunder,Phoenix Suns,0.9173717449391703
+Utah Jazz,Brooklyn Nets,0.836890433445673
+Toronto Raptors,Washington Wizards,0.6445132283306332
+Los Angeles Clippers,Chicago Bulls,0.5426065257797783
+Charlotte Hornets,Denver Nuggets,0.7363448259127616
+Houston Rockets,Memphis Grizzlies,0.5480639375116193
+Cleveland Cavaliers,Miami Heat,0.5701914089231152
+Toronto Raptors,Milwaukee Bucks,0.819167700408088
+Detroit Pistons,Philadelphia 76ers,0.970462003512937
+Portland Trail Blazers,Brooklyn Nets,0.9364815683508204
+San Antonio Spurs,Minnesota Timberwolves,0.9102024821772375
+Atlanta Hawks,Indiana Pacers,0.5947283447367872
+Oklahoma City Thunder,Dallas Mavericks,0.7019228130530718
+New Orleans Pelicans,Los Angeles Lakers,0.8381646080009353
+Golden State Warriors,New York Knicks,0.8985881577189333
+Boston Celtics,Phoenix Suns,0.8815366994280542
+Utah Jazz,Sacramento Kings,0.5943653863865784
+Washington Wizards,Orlando Magic,0.630142402870544
+Golden State Warriors,Atlanta Hawks,0.6998576962376015
+Charlotte Hornets,Indiana Pacers,0.5890167658688972
+Cleveland Cavaliers,Miami Heat,0.7605707588522127
+Sacramento Kings,Denver Nuggets,0.5277589880138731
+Detroit Pistons,Chicago Bulls,0.5631887344038223
+Los Angeles Clippers,Boston Celtics,0.5960394509901615
+Memphis Grizzlies,Brooklyn Nets,0.804994654663697
+Orlando Magic,New York Knicks,0.6154902912454222
+Milwaukee Bucks,Philadelphia 76ers,0.9344004321616731
+San Antonio Spurs,Houston Rockets,0.8469168632827457
+Utah Jazz,New Orleans Pelicans,0.6988446169441191
+Dallas Mavericks,Los Angeles Lakers,0.8988726279374206
+Oklahoma City Thunder,Portland Trail Blazers,0.7365106391984931
+Washington Wizards,Phoenix Suns,0.8224431246677617
+Atlanta Hawks,Brooklyn Nets,0.8951949965998754
+Washington Wizards,Denver Nuggets,0.6477303918467704
+Golden State Warriors,Boston Celtics,0.7967915840919831
+Houston Rockets,Utah Jazz,0.5361644284597848
+Indiana Pacers,Detroit Pistons,0.5335588066627329
+Miami Heat,Charlotte Hornets,0.5636036106371278
+Milwaukee Bucks,New York Knicks,0.5128600627267141
+Los Angeles Clippers,Minnesota Timberwolves,0.8222317412337778
+Toronto Raptors,New Orleans Pelicans,0.8275426728404633
+Chicago Bulls,Orlando Magic,0.5887999690619977
+San Antonio Spurs,Sacramento Kings,0.8921060287464726
+Cleveland Cavaliers,Detroit Pistons,0.674826996698044
+Los Angeles Clippers,Memphis Grizzlies,0.6659868528357222
+San Antonio Spurs,Oklahoma City Thunder,0.5216023890412093
+Phoenix Suns,Los Angeles Lakers,0.6534118384589391
+Portland Trail Blazers,Philadelphia 76ers,0.9782842992277977
+Toronto Raptors,Atlanta Hawks,0.5268779847829627
+Chicago Bulls,Houston Rockets,0.6190521239006089
+Charlotte Hornets,Orlando Magic,0.730384549178095
+Dallas Mavericks,Brooklyn Nets,0.8271190677997857
+Boston Celtics,Denver Nuggets,0.7470901586665442
+Indiana Pacers,Milwaukee Bucks,0.7348860900107408
+Golden State Warriors,Minnesota Timberwolves,0.9179793327550426
+Washington Wizards,Sacramento Kings,0.6347012397661671
+Charlotte Hornets,New Orleans Pelicans,0.7904808378562765
+Dallas Mavericks,Phoenix Suns,0.7948324970635221
+Detroit Pistons,New York Knicks,0.7471690620137846
+Los Angeles Clippers,Philadelphia 76ers,0.9714649925762824
+Atlanta Hawks,Memphis Grizzlies,0.6445158985655806
+Toronto Raptors,Miami Heat,0.5077826307651524
+Minnesota Timberwolves,Milwaukee Bucks,0.5260278413729665
+Oklahoma City Thunder,Utah Jazz,0.785746288626296
+Cleveland Cavaliers,Orlando Magic,0.793018857346611
+Portland Trail Blazers,Washington Wizards,0.7582585990849217
+Denver Nuggets,Sacramento Kings,0.5409493841058887
+San Antonio Spurs,Golden State Warriors,0.5425448544617014
+Boston Celtics,Chicago Bulls,0.672659518278773
+New York Knicks,Brooklyn Nets,0.7414199808621746
+Cleveland Cavaliers,Houston Rockets,0.7274845922028437
+Miami Heat,Indiana Pacers,0.5005232062003905
+Los Angeles Lakers,Philadelphia 76ers,0.5660613269463058
+Portland Trail Blazers,Phoenix Suns,0.8367378108503962
+Charlotte Hornets,Chicago Bulls,0.6459886347594599
+Denver Nuggets,Los Angeles Lakers,0.8260634504712346
+Memphis Grizzlies,Milwaukee Bucks,0.6295500075557516
+Washington Wizards,Minnesota Timberwolves,0.7253759583466928
+Orlando Magic,Sacramento Kings,0.5323337450156456
+San Antonio Spurs,Atlanta Hawks,0.7593875426277472
+Toronto Raptors,Dallas Mavericks,0.7929083416622169
+Los Angeles Clippers,Utah Jazz,0.6160054015646187
+Oklahoma City Thunder,Brooklyn Nets,0.9418485232736844
+Cleveland Cavaliers,Detroit Pistons,0.7845432293852561
+Golden State Warriors,Philadelphia 76ers,0.9890677418907183
+Portland Trail Blazers,New Orleans Pelicans,0.724034642359451
+Indiana Pacers,New York Knicks,0.7214102060867198
+Boston Celtics,Minnesota Timberwolves,0.8012361249385631
+Chicago Bulls,Memphis Grizzlies,0.647427809876908
+Detroit Pistons,Utah Jazz,0.5978968097705802
+Houston Rockets,Los Angeles Lakers,0.894878593287147
+Charlotte Hornets,Indiana Pacers,0.5269499754611222
+Los Angeles Clippers,Milwaukee Bucks,0.8210072531546425
+Miami Heat,New Orleans Pelicans,0.8065822891612504
+Sacramento Kings,Phoenix Suns,0.7378958718883849
+San Antonio Spurs,Portland Trail Blazers,0.8195561866572759
+Washington Wizards,Dallas Mavericks,0.5817243079839153
+Atlanta Hawks,Memphis Grizzlies,0.6933088012079688
+Cleveland Cavaliers,Utah Jazz,0.8373137914628203
+Los Angeles Clippers,Denver Nuggets,0.7630242837132536
+Golden State Warriors,Orlando Magic,0.9057966613756931
+New York Knicks,Brooklyn Nets,0.6920936124037728
+Toronto Raptors,Oklahoma City Thunder,0.5617881030580666
+Boston Celtics,Brooklyn Nets,0.9156527904181759
+Toronto Raptors,Detroit Pistons,0.6174172067877427
+Milwaukee Bucks,Los Angeles Lakers,0.8505203027994223
+Miami Heat,Minnesota Timberwolves,0.7982480069329386
+Houston Rockets,New Orleans Pelicans,0.6829335143262467
+Dallas Mavericks,Philadelphia 76ers,0.956748418779101
+Orlando Magic,Phoenix Suns,0.75214126858813
+Washington Wizards,Chicago Bulls,0.5343722444953217
+Atlanta Hawks,Portland Trail Blazers,0.6215497357689157
+Chicago Bulls,Utah Jazz,0.636408907093765
+Charlotte Hornets,Washington Wizards,0.6396052774245168
+Houston Rockets,Denver Nuggets,0.625501247777912
+Golden State Warriors,Milwaukee Bucks,0.9241809311271724
+Cleveland Cavaliers,Los Angeles Clippers,0.523319652933677
+San Antonio Spurs,Memphis Grizzlies,0.7933723357353494
+Oklahoma City Thunder,Sacramento Kings,0.8357586898569345
+Dallas Mavericks,Brooklyn Nets,0.844312146528328
+Detroit Pistons,Phoenix Suns,0.8267712304039557
+Cleveland Cavaliers,Los Angeles Lakers,0.9662753788944691
+Miami Heat,Portland Trail Blazers,0.6393661026597248
+Minnesota Timberwolves,New Orleans Pelicans,0.5403614035977689
+Boston Celtics,Philadelphia 76ers,0.9779151918064878
+San Antonio Spurs,Sacramento Kings,0.8921060287464726
+Toronto Raptors,Indiana Pacers,0.7127639156021335
+Boston Celtics,Washington Wizards,0.666508804452891
+Charlotte Hornets,Atlanta Hawks,0.5270903223652368
+Houston Rockets,Denver Nuggets,0.5897149204496572
+Indiana Pacers,Utah Jazz,0.6178592323391957
+Los Angeles Clippers,New York Knicks,0.8481704501314866
+Golden State Warriors,Oklahoma City Thunder,0.5780664269267013
+Orlando Magic,Philadelphia 76ers,0.9070217296173135
+Detroit Pistons,Brooklyn Nets,0.8895602705326521
+Golden State Warriors,Dallas Mavericks,0.8063108547379034
+Los Angeles Clippers,Los Angeles Lakers,0.9506901392566504
+Miami Heat,Phoenix Suns,0.8818827987620536
+San Antonio Spurs,Minnesota Timberwolves,0.8990602374157421
+Memphis Grizzlies,New Orleans Pelicans,0.6558966184338011
+Portland Trail Blazers,Milwaukee Bucks,0.8585474804518705
+Toronto Raptors,Chicago Bulls,0.759583321837707
+Boston Celtics,Indiana Pacers,0.6174379611309165
+Chicago Bulls,Detroit Pistons,0.5532416785743169
+Cleveland Cavaliers,Denver Nuggets,0.8271395461962967
+Oklahoma City Thunder,Philadelphia 76ers,0.9779831537444693
+Charlotte Hornets,Orlando Magic,0.6909975274944149
+Sacramento Kings,Milwaukee Bucks,0.5268947894555486
+Utah Jazz,New York Knicks,0.7200854698725926
+Atlanta Hawks,Washington Wizards,0.5878971846897307
+Phoenix Suns,Brooklyn Nets,0.6396896849566753
+Los Angeles Clippers,Dallas Mavericks,0.6324060375159688
+Toronto Raptors,Miami Heat,0.5077826307651524
+Portland Trail Blazers,New York Knicks,0.8808405725613171
+San Antonio Spurs,Memphis Grizzlies,0.8621004611203563
+Boston Celtics,Phoenix Suns,0.8838125115820208
+Chicago Bulls,Philadelphia 76ers,0.9549558892016753
+Cleveland Cavaliers,Charlotte Hornets,0.5945385343354597
+Golden State Warriors,Sacramento Kings,0.9120048472276371
+Houston Rockets,New Orleans Pelicans,0.6745173503291141
+Indiana Pacers,Denver Nuggets,0.667821366242076
+Minnesota Timberwolves,Los Angeles Lakers,0.8451697856736602
+Atlanta Hawks,Milwaukee Bucks,0.7809122824496479
+Detroit Pistons,Orlando Magic,0.6370181117454732
+Washington Wizards,Brooklyn Nets,0.839908633574516
+Cleveland Cavaliers,Washington Wizards,0.8127498981091046
+Toronto Raptors,Dallas Mavericks,0.6653460296833326
+Los Angeles Clippers,Utah Jazz,0.737586544702152
+Portland Trail Blazers,Minnesota Timberwolves,0.8635103584313623
+San Antonio Spurs,New York Knicks,0.9221387214469564
+Atlanta Hawks,Brooklyn Nets,0.8951949965998754
+Boston Celtics,Miami Heat,0.5939381829682465
+Charlotte Hornets,Phoenix Suns,0.8710477086412305
+Denver Nuggets,New Orleans Pelicans,0.5362107758936552
+Golden State Warriors,Memphis Grizzlies,0.8868311795635295
+Oklahoma City Thunder,Houston Rockets,0.7108794967217815
+Indiana Pacers,Philadelphia 76ers,0.9514171990347409
+Los Angeles Clippers,Sacramento Kings,0.7959209084683025
+Portland Trail Blazers,Los Angeles Lakers,0.9241400427394095
+Chicago Bulls,Milwaukee Bucks,0.6852500426161923
+Oklahoma City Thunder,Dallas Mavericks,0.7019228130530718
+Detroit Pistons,New York Knicks,0.7136862592574185
+Memphis Grizzlies,Sacramento Kings,0.5827568768390616
+San Antonio Spurs,Cleveland Cavaliers,0.6588328805130672
+Toronto Raptors,Orlando Magic,0.8242654546368156
+Utah Jazz,New Orleans Pelicans,0.6988446169441191
+Atlanta Hawks,Phoenix Suns,0.8736803704726138
+Brooklyn Nets,Philadelphia 76ers,0.6800471337206065
+Charlotte Hornets,Milwaukee Bucks,0.7744783078184468
+Miami Heat,Detroit Pistons,0.5214505761758803
+Golden State Warriors,Houston Rockets,0.8129666587642488
+Indiana Pacers,Minnesota Timberwolves,0.7333479123691258
+Washington Wizards,Los Angeles Lakers,0.9167364887609396
+Portland Trail Blazers,Denver Nuggets,0.822215377724437
+Boston Celtics,Milwaukee Bucks,0.7945476517623355
+Los Angeles Clippers,Washington Wizards,0.7033005616876681
+Indiana Pacers,Memphis Grizzlies,0.5850609155200516
+Dallas Mavericks,New Orleans Pelicans,0.6555323937819689
+Miami Heat,New York Knicks,0.7407528947331281
+Oklahoma City Thunder,Orlando Magic,0.7791949368070087
+Atlanta Hawks,Philadelphia 76ers,0.977722349080111
+Utah Jazz,Sacramento Kings,0.5943653863865784
+San Antonio Spurs,Golden State Warriors,0.5425448544617014
+Toronto Raptors,Charlotte Hornets,0.6692104481235245
+Cleveland Cavaliers,Chicago Bulls,0.6380699609772931
+Detroit Pistons,Brooklyn Nets,0.8549489281914598
+Minnesota Timberwolves,Los Angeles Lakers,0.7677717390444269
+Los Angeles Clippers,Phoenix Suns,0.8902446779003392
+Portland Trail Blazers,Houston Rockets,0.7754367132277132
+Boston Celtics,Orlando Magic,0.7531270343300652
+Charlotte Hornets,Denver Nuggets,0.7235070512053406
+Cleveland Cavaliers,Philadelphia 76ers,0.9842119373151951
+Golden State Warriors,Houston Rockets,0.873972520984708
+Memphis Grizzlies,Dallas Mavericks,0.522513794908585
+Miami Heat,New York Knicks,0.8221580337724813
+Detroit Pistons,Milwaukee Bucks,0.7273945808620585
+Sacramento Kings,New Orleans Pelicans,0.5903642611587099
+San Antonio Spurs,Oklahoma City Thunder,0.5216023890412093
+Toronto Raptors,Indiana Pacers,0.7127639156021335
+Utah Jazz,Washington Wizards,0.5218927943292156
+Orlando Magic,Brooklyn Nets,0.8157323992230832
+Atlanta Hawks,Chicago Bulls,0.5189333930570054
+Los Angeles Clippers,Los Angeles Lakers,0.9539166002352777
+Sacramento Kings,Minnesota Timberwolves,0.6161786086748275
+Portland Trail Blazers,Phoenix Suns,0.9227105998532737
+Atlanta Hawks,Brooklyn Nets,0.9149635533873091
+Cleveland Cavaliers,Indiana Pacers,0.7780310877942109
+Golden State Warriors,Washington Wizards,0.8630002742136407
+Memphis Grizzlies,Los Angeles Lakers,0.8984821134322052
+Miami Heat,Denver Nuggets,0.7430825906817102
+Dallas Mavericks,Milwaukee Bucks,0.6424136555455248
+Chicago Bulls,New Orleans Pelicans,0.6975371601376568
+Boston Celtics,New York Knicks,0.7706161235260826
+Oklahoma City Thunder,Charlotte Hornets,0.6706435080450158
+Houston Rockets,Phoenix Suns,0.8079703336023722
+San Antonio Spurs,Utah Jazz,0.8563015879263921
+Toronto Raptors,Philadelphia 76ers,0.9778431757624951
+Cleveland Cavaliers,Orlando Magic,0.868858274042883
+Golden State Warriors,Minnesota Timberwolves,0.9270367506372811
+Toronto Raptors,Indiana Pacers,0.5974467377790877
+Denver Nuggets,New Orleans Pelicans,0.6165961221759775
+Chicago Bulls,New York Knicks,0.670382780615068
+Oklahoma City Thunder,Milwaukee Bucks,0.8568288760769732
+Brooklyn Nets,Philadelphia 76ers,0.8543101342335301
+Dallas Mavericks,Sacramento Kings,0.5823645298341502
+San Antonio Spurs,Memphis Grizzlies,0.8621004611203563
+Portland Trail Blazers,Utah Jazz,0.5033843953011446
+Charlotte Hornets,Washington Wizards,0.576415092870763
+Cleveland Cavaliers,Boston Celtics,0.5656129755096008
+Charlotte Hornets,Miami Heat,0.5650011313292498
+Toronto Raptors,Detroit Pistons,0.6174172067877427
+Houston Rockets,Denver Nuggets,0.5897149204496572
+Los Angeles Clippers,Dallas Mavericks,0.7470642988864873
+Oklahoma City Thunder,Memphis Grizzlies,0.7318458424793735
+Golden State Warriors,Phoenix Suns,0.9515197953692456
+San Antonio Spurs,Los Angeles Lakers,0.9777207261443515
+Atlanta Hawks,Boston Celtics,0.5307663794727151
+Indiana Pacers,Milwaukee Bucks,0.7251585974045648
+Washington Wizards,New York Knicks,0.6764967244669957
+Orlando Magic,Brooklyn Nets,0.7614845004422947
+Chicago Bulls,Philadelphia 76ers,0.9640376008791884
+Portland Trail Blazers,Minnesota Timberwolves,0.8635103584313623
+Cleveland Cavaliers,Atlanta Hawks,0.7316076415024936
+San Antonio Spurs,Dallas Mavericks,0.768139827856392
+Denver Nuggets,New Orleans Pelicans,0.5362107758936552
+Detroit Pistons,Houston Rockets,0.5501120676230924
+Sacramento Kings,Los Angeles Lakers,0.8699913368583889
+Memphis Grizzlies,New York Knicks,0.6742395740877684
+Oklahoma City Thunder,Phoenix Suns,0.9173717449391703
+Toronto Raptors,Miami Heat,0.6922006702911019
+Utah Jazz,Minnesota Timberwolves,0.6876656395909585
+Chicago Bulls,Brooklyn Nets,0.8679345758358623
+Charlotte Hornets,Boston Celtics,0.5248735201171141
+Golden State Warriors,New Orleans Pelicans,0.9305139431810429
+Indiana Pacers,Orlando Magic,0.6457838180612443
+Milwaukee Bucks,Philadelphia 76ers,0.9344004321616731
+Portland Trail Blazers,Utah Jazz,0.7881071461573498
+San Antonio Spurs,Los Angeles Clippers,0.7415909571565803
+Miami Heat,Washington Wizards,0.5503939187043101
+Cleveland Cavaliers,Atlanta Hawks,0.5888261298550048
+Oklahoma City Thunder,Denver Nuggets,0.8150630436430326
+Minnesota Timberwolves,Los Angeles Lakers,0.8451697856736602
+Detroit Pistons,Memphis Grizzlies,0.5757796458636804
+Toronto Raptors,New York Knicks,0.8088616394029131
+Dallas Mavericks,Phoenix Suns,0.7880209304518935
+Houston Rockets,Sacramento Kings,0.6121422354502845
+Boston Celtics,Brooklyn Nets,0.9037914734330236
+Chicago Bulls,Orlando Magic,0.692607318715456
+Detroit Pistons,Washington Wizards,0.5563377609924854
+Golden State Warriors,Utah Jazz,0.881929839060726
+Los Angeles Clippers,Houston Rockets,0.7229571141818244
+Cleveland Cavaliers,Miami Heat,0.5701914089231152
+Charlotte Hornets,Milwaukee Bucks,0.772729041185426
+Indiana Pacers,Philadelphia 76ers,0.9715351384881646
+San Antonio Spurs,Portland Trail Blazers,0.5180878888323307
+Atlanta Hawks,Charlotte Hornets,0.5447096530376866
+Dallas Mavericks,Denver Nuggets,0.6001224610550165
+New Orleans Pelicans,Los Angeles Lakers,0.8381646080009353
+Oklahoma City Thunder,Minnesota Timberwolves,0.8635931477335815
+Sacramento Kings,Phoenix Suns,0.6865768650462503
+Boston Celtics,Milwaukee Bucks,0.7945476517623355
+Chicago Bulls,Brooklyn Nets,0.8740285590551515
+Cleveland Cavaliers,Toronto Raptors,0.682019095590589
+Golden State Warriors,Los Angeles Lakers,0.9821456918905238
+Houston Rockets,Minnesota Timberwolves,0.6628709701215469
+Atlanta Hawks,Indiana Pacers,0.5386998459163754
+Los Angeles Clippers,Sacramento Kings,0.7959209084683025
+Memphis Grizzlies,Dallas Mavericks,0.522513794908585
+Miami Heat,Washington Wizards,0.6623488021178058
+New York Knicks,Philadelphia 76ers,0.8729048451096209
+Oklahoma City Thunder,Denver Nuggets,0.8201478208741535
+Detroit Pistons,Orlando Magic,0.6370181117454732
+Portland Trail Blazers,New Orleans Pelicans,0.869589125206319
+San Antonio Spurs,Utah Jazz,0.7554533345420018
diff --git a/other/data/21-22Schedule.csv b/other/data/21-22Schedule.csv
new file mode 100644
index 0000000..b68cd5b
--- /dev/null
+++ b/other/data/21-22Schedule.csv
@@ -0,0 +1,1230 @@
+Vteam,Hteam
+New York Knicks,Cleveland Cavaliers
+San Antonio Spurs,Golden State Warriors
+Utah Jazz,Portland Trail Blazers
+Brooklyn Nets,Boston Celtics
+Dallas Mavericks,Indiana Pacers
+Houston Rockets,Los Angeles Lakers
+Minnesota Timberwolves,Memphis Grizzlies
+Charlotte Hornets,Milwaukee Bucks
+Denver Nuggets,New Orleans Pelicans
+Miami Heat,Orlando Magic
+Oklahoma City Thunder,Philadelphia 76ers
+Sacramento Kings,Phoenix Suns
+Detroit Pistons,Toronto Raptors
+Washington Wizards,Atlanta Hawks
+Boston Celtics,Chicago Bulls
+Los Angeles Clippers,Portland Trail Blazers
+San Antonio Spurs,Sacramento Kings
+Indiana Pacers,Brooklyn Nets
+Houston Rockets,Dallas Mavericks
+Orlando Magic,Detroit Pistons
+Charlotte Hornets,Miami Heat
+Golden State Warriors,New Orleans Pelicans
+Phoenix Suns,Oklahoma City Thunder
+Cleveland Cavaliers,Toronto Raptors
+Los Angeles Lakers,Utah Jazz
+Indiana Pacers,Chicago Bulls
+Boston Celtics,Charlotte Hornets
+Orlando Magic,Cleveland Cavaliers
+Portland Trail Blazers,Denver Nuggets
+Brooklyn Nets,Milwaukee Bucks
+Memphis Grizzlies,New York Knicks
+Atlanta Hawks,Philadelphia 76ers
+Minnesota Timberwolves,Sacramento Kings
+New Orleans Pelicans,San Antonio Spurs
+Milwaukee Bucks,Detroit Pistons
+Dallas Mavericks,Houston Rockets
+Utah Jazz,Los Angeles Clippers
+Washington Wizards,Memphis Grizzlies
+San Antonio Spurs,Miami Heat
+Los Angeles Lakers,Oklahoma City Thunder
+Golden State Warriors,Phoenix Suns
+Sacramento Kings,Atlanta Hawks
+Chicago Bulls,Brooklyn Nets
+Phoenix Suns,Los Angeles Clippers
+Denver Nuggets,Toronto Raptors
+Houston Rockets,Cleveland Cavaliers
+New York Knicks,Detroit Pistons
+Los Angeles Lakers,Indiana Pacers
+Sacramento Kings,Miami Heat
+Memphis Grizzlies,Minnesota Timberwolves
+Milwaukee Bucks,New Orleans Pelicans
+Orlando Magic,Philadelphia 76ers
+Golden State Warriors,Portland Trail Blazers
+Utah Jazz,San Antonio Spurs
+Los Angeles Lakers,Atlanta Hawks
+Chicago Bulls,Boston Celtics
+Detroit Pistons,Brooklyn Nets
+Philadelphia 76ers,Charlotte Hornets
+Oklahoma City Thunder,Los Angeles Clippers
+New Orleans Pelicans,Memphis Grizzlies
+Houston Rockets,New York Knicks
+Portland Trail Blazers,Phoenix Suns
+Dallas Mavericks,Utah Jazz
+Toronto Raptors,Washington Wizards
+Boston Celtics,Cleveland Cavaliers
+Oklahoma City Thunder,Golden State Warriors
+Indiana Pacers,Milwaukee Bucks
+Denver Nuggets,Minnesota Timberwolves
+Sacramento Kings,Orlando Magic
+Charlotte Hornets,Brooklyn Nets
+New York Knicks,Chicago Bulls
+Portland Trail Blazers,Dallas Mavericks
+Golden State Warriors,Los Angeles Lakers
+Los Angeles Clippers,Memphis Grizzlies
+Phoenix Suns,New Orleans Pelicans
+Miami Heat,Toronto Raptors
+San Antonio Spurs,Utah Jazz
+Atlanta Hawks,Washington Wizards
+Houston Rockets,Atlanta Hawks
+Denver Nuggets,Detroit Pistons
+Chicago Bulls,Indiana Pacers
+Sacramento Kings,Milwaukee Bucks
+Minnesota Timberwolves,Oklahoma City Thunder
+Washington Wizards,Orlando Magic
+Cleveland Cavaliers,Philadelphia 76ers
+Los Angeles Clippers,San Antonio Spurs
+Denver Nuggets,Boston Celtics
+Milwaukee Bucks,Dallas Mavericks
+Phoenix Suns,Los Angeles Lakers
+Portland Trail Blazers,Memphis Grizzlies
+Utah Jazz,New York Knicks
+Sacramento Kings,Toronto Raptors
+Orlando Magic,Chicago Bulls
+Indiana Pacers,Charlotte Hornets
+New Orleans Pelicans,Golden State Warriors
+Detroit Pistons,Los Angeles Clippers
+Miami Heat,Oklahoma City Thunder
+Utah Jazz,Philadelphia 76ers
+Houston Rockets,Washington Wizards
+Minnesota Timberwolves,Brooklyn Nets
+Atlanta Hawks,Cleveland Cavaliers
+Dallas Mavericks,Los Angeles Lakers
+Denver Nuggets,Memphis Grizzlies
+Phoenix Suns,Portland Trail Blazers
+New Orleans Pelicans,Sacramento Kings
+Chicago Bulls,Atlanta Hawks
+Utah Jazz,Charlotte Hornets
+Dallas Mavericks,Golden State Warriors
+Philadelphia 76ers,Indiana Pacers
+Portland Trail Blazers,Los Angeles Clippers
+Brooklyn Nets,New York Knicks
+Toronto Raptors,Oklahoma City Thunder
+Minnesota Timberwolves,Orlando Magic
+Detroit Pistons,Phoenix Suns
+Houston Rockets,San Antonio Spurs
+Boston Celtics,Washington Wizards
+Golden State Warriors,Denver Nuggets
+Chicago Bulls,Miami Heat
+New Orleans Pelicans,Milwaukee Bucks
+Los Angeles Lakers,Sacramento Kings
+New York Knicks,Boston Celtics
+Toronto Raptors,Charlotte Hornets
+Los Angeles Clippers,Oklahoma City Thunder
+Utah Jazz,Orlando Magic
+Indiana Pacers,Philadelphia 76ers
+Sacramento Kings,Portland Trail Blazers
+Detroit Pistons,San Antonio Spurs
+Cleveland Cavaliers,Washington Wizards
+Philadelphia 76ers,Atlanta Hawks
+Washington Wizards,Chicago Bulls
+Detroit Pistons,Denver Nuggets
+San Antonio Spurs,Houston Rockets
+Boston Celtics,Indiana Pacers
+Utah Jazz,Miami Heat
+Memphis Grizzlies,Milwaukee Bucks
+Los Angeles Clippers,Minnesota Timberwolves
+Los Angeles Lakers,New Orleans Pelicans
+Brooklyn Nets,Phoenix Suns
+New York Knicks,Toronto Raptors
+Charlotte Hornets,Cleveland Cavaliers
+Phoenix Suns,Golden State Warriors
+Los Angeles Lakers,Minnesota Timberwolves
+Orlando Magic,Oklahoma City Thunder
+Denver Nuggets,Portland Trail Blazers
+Oklahoma City Thunder,Detroit Pistons
+Philadelphia 76ers,Houston Rockets
+Orlando Magic,Indiana Pacers
+Brooklyn Nets,Los Angeles Clippers
+Boston Celtics,New Orleans Pelicans
+Dallas Mavericks,New York Knicks
+Miami Heat,San Antonio Spurs
+Memphis Grizzlies,Utah Jazz
+Toronto Raptors,Cleveland Cavaliers
+Brooklyn Nets,Los Angeles Lakers
+Atlanta Hawks,Miami Heat
+Charlotte Hornets,Minnesota Timberwolves
+Chicago Bulls,Portland Trail Blazers
+Milwaukee Bucks,Atlanta Hawks
+Dallas Mavericks,Boston Celtics
+Phoenix Suns,Denver Nuggets
+Cleveland Cavaliers,Indiana Pacers
+Memphis Grizzlies,Los Angeles Clippers
+Detroit Pistons,New York Knicks
+Houston Rockets,Oklahoma City Thunder
+New Orleans Pelicans,Orlando Magic
+Washington Wizards,Philadelphia 76ers
+San Antonio Spurs,Sacramento Kings
+Golden State Warriors,Toronto Raptors
+Portland Trail Blazers,Houston Rockets
+Milwaukee Bucks,Miami Heat
+Philadelphia 76ers,Minnesota Timberwolves
+Chicago Bulls,Utah Jazz
+New York Knicks,Washington Wizards
+Golden State Warriors,Boston Celtics
+Atlanta Hawks,Charlotte Hornets
+Detroit Pistons,Cleveland Cavaliers
+Memphis Grizzlies,Dallas Mavericks
+Toronto Raptors,Denver Nuggets
+Phoenix Suns,Indiana Pacers
+San Antonio Spurs,Los Angeles Lakers
+Portland Trail Blazers,New Orleans Pelicans
+Brooklyn Nets,Oklahoma City Thunder
+Los Angeles Clippers,Sacramento Kings
+Boston Celtics,Detroit Pistons
+Utah Jazz,Houston Rockets
+Chicago Bulls,Los Angeles Clippers
+Minnesota Timberwolves,Memphis Grizzlies
+Golden State Warriors,Milwaukee Bucks
+Charlotte Hornets,New Orleans Pelicans
+Dallas Mavericks,Orlando Magic
+Phoenix Suns,Philadelphia 76ers
+Miami Heat,Washington Wizards
+Portland Trail Blazers,Brooklyn Nets
+Utah Jazz,Denver Nuggets
+Chicago Bulls,Los Angeles Lakers
+Atlanta Hawks,New York Knicks
+Indiana Pacers,Oklahoma City Thunder
+Toronto Raptors,Sacramento Kings
+Memphis Grizzlies,Charlotte Hornets
+Houston Rockets,Detroit Pistons
+Golden State Warriors,Indiana Pacers
+Toronto Raptors,Los Angeles Clippers
+Orlando Magic,Milwaukee Bucks
+Boston Celtics,Minnesota Timberwolves
+Miami Heat,Philadelphia 76ers
+Dallas Mavericks,San Antonio Spurs
+Phoenix Suns,Washington Wizards
+New Orleans Pelicans,Atlanta Hawks
+Chicago Bulls,Denver Nuggets
+Oklahoma City Thunder,Los Angeles Lakers
+Portland Trail Blazers,New York Knicks
+Boston Celtics,Brooklyn Nets
+San Antonio Spurs,Charlotte Hornets
+Portland Trail Blazers,Cleveland Cavaliers
+Los Angeles Clippers,Dallas Mavericks
+Miami Heat,Detroit Pistons
+Los Angeles Lakers,Golden State Warriors
+Toronto Raptors,Houston Rockets
+Atlanta Hawks,Indiana Pacers
+Minnesota Timberwolves,New Orleans Pelicans
+Phoenix Suns,Orlando Magic
+Memphis Grizzlies,Philadelphia 76ers
+Oklahoma City Thunder,Sacramento Kings
+Denver Nuggets,Utah Jazz
+San Antonio Spurs,Boston Celtics
+Dallas Mavericks,Cleveland Cavaliers
+Oklahoma City Thunder,Denver Nuggets
+Los Angeles Clippers,Detroit Pistons
+Brooklyn Nets,Indiana Pacers
+Golden State Warriors,Los Angeles Lakers
+Miami Heat,Memphis Grizzlies
+Toronto Raptors,Milwaukee Bucks
+Charlotte Hornets,New York Knicks
+Washington Wizards,Orlando Magic
+Chicago Bulls,Philadelphia 76ers
+Minnesota Timberwolves,Phoenix Suns
+New Orleans Pelicans,Portland Trail Blazers
+Houston Rockets,Sacramento Kings
+Atlanta Hawks,Utah Jazz
+New York Knicks,Charlotte Hornets
+Minnesota Timberwolves,Golden State Warriors
+Memphis Grizzlies,Miami Heat
+Detroit Pistons,Oklahoma City Thunder
+San Antonio Spurs,Washington Wizards
+Sacramento Kings,Brooklyn Nets
+New Orleans Pelicans,Dallas Mavericks
+Los Angeles Clippers,Indiana Pacers
+Atlanta Hawks,Los Angeles Lakers
+Milwaukee Bucks,Orlando Magic
+Cleveland Cavaliers,Philadelphia 76ers
+Denver Nuggets,Phoenix Suns
+Houston Rockets,Portland Trail Blazers
+Atlanta Hawks,Golden State Warriors
+Charlotte Hornets,Memphis Grizzlies
+Boston Celtics,Miami Heat
+Utah Jazz,Minnesota Timberwolves
+Oklahoma City Thunder,New York Knicks
+Philadelphia 76ers,Toronto Raptors
+Sacramento Kings,Washington Wizards
+Los Angeles Clippers,Brooklyn Nets
+Detroit Pistons,Charlotte Hornets
+Cleveland Cavaliers,Milwaukee Bucks
+Los Angeles Lakers,New Orleans Pelicans
+Orlando Magic,San Antonio Spurs
+Houston Rockets,Utah Jazz
+Detroit Pistons,Boston Celtics
+Los Angeles Lakers,Chicago Bulls
+San Antonio Spurs,Dallas Mavericks
+Miami Heat,Denver Nuggets
+New York Knicks,Minnesota Timberwolves
+Washington Wizards,Oklahoma City Thunder
+Atlanta Hawks,Phoenix Suns
+Indiana Pacers,Portland Trail Blazers
+Memphis Grizzlies,Toronto Raptors
+Milwaukee Bucks,Brooklyn Nets
+Dallas Mavericks,Charlotte Hornets
+Los Angeles Clippers,Cleveland Cavaliers
+Houston Rockets,Golden State Warriors
+Orlando Magic,Memphis Grizzlies
+Miami Heat,Utah Jazz
+Detroit Pistons,Atlanta Hawks
+Sacramento Kings,Boston Celtics
+Cleveland Cavaliers,Chicago Bulls
+Houston Rockets,Denver Nuggets
+Los Angeles Clippers,New Orleans Pelicans
+Minnesota Timberwolves,New York Knicks
+Orlando Magic,Philadelphia 76ers
+Washington Wizards,San Antonio Spurs
+Los Angeles Lakers,Toronto Raptors
+Minnesota Timberwolves,Charlotte Hornets
+Chicago Bulls,Dallas Mavericks
+Phoenix Suns,Golden State Warriors
+Los Angeles Lakers,Memphis Grizzlies
+Brooklyn Nets,Milwaukee Bucks
+Boston Celtics,Philadelphia 76ers
+Miami Heat,Portland Trail Blazers
+Atlanta Hawks,Toronto Raptors
+Denver Nuggets,Utah Jazz
+Orlando Magic,Detroit Pistons
+Indiana Pacers,Los Angeles Clippers
+Sacramento Kings,New York Knicks
+New Orleans Pelicans,Oklahoma City Thunder
+Oklahoma City Thunder,Atlanta Hawks
+Washington Wizards,Brooklyn Nets
+Portland Trail Blazers,Chicago Bulls
+Charlotte Hornets,Dallas Mavericks
+Indiana Pacers,Golden State Warriors
+Boston Celtics,Houston Rockets
+Utah Jazz,Los Angeles Lakers
+San Antonio Spurs,Milwaukee Bucks
+Memphis Grizzlies,New Orleans Pelicans
+Denver Nuggets,Philadelphia 76ers
+Cleveland Cavaliers,Toronto Raptors
+Chicago Bulls,Detroit Pistons
+Philadelphia 76ers,Memphis Grizzlies
+New York Knicks,Miami Heat
+San Antonio Spurs,Minnesota Timberwolves
+Phoenix Suns,Utah Jazz
+Orlando Magic,Washington Wizards
+Miami Heat,Atlanta Hawks
+Denver Nuggets,Brooklyn Nets
+Detroit Pistons,Charlotte Hornets
+Sacramento Kings,Dallas Mavericks
+Los Angeles Lakers,Houston Rockets
+Golden State Warriors,Los Angeles Clippers
+Portland Trail Blazers,Milwaukee Bucks
+Cleveland Cavaliers,New York Knicks
+Boston Celtics,Orlando Magic
+Indiana Pacers,Phoenix Suns
+San Antonio Spurs,Chicago Bulls
+Portland Trail Blazers,Memphis Grizzlies
+Philadelphia 76ers,New Orleans Pelicans
+Minnesota Timberwolves,Toronto Raptors
+Golden State Warriors,Utah Jazz
+Denver Nuggets,Washington Wizards
+Toronto Raptors,Boston Celtics
+Orlando Magic,Charlotte Hornets
+Miami Heat,Cleveland Cavaliers
+Indiana Pacers,Dallas Mavericks
+Phoenix Suns,Los Angeles Lakers
+Atlanta Hawks,Milwaukee Bucks
+Detroit Pistons,Minnesota Timberwolves
+Houston Rockets,Oklahoma City Thunder
+New York Knicks,Sacramento Kings
+Miami Heat,Chicago Bulls
+Charlotte Hornets,Cleveland Cavaliers
+Dallas Mavericks,Houston Rockets
+Portland Trail Blazers,Indiana Pacers
+New Orleans Pelicans,Los Angeles Clippers
+Golden State Warriors,Memphis Grizzlies
+Denver Nuggets,Orlando Magic
+Brooklyn Nets,San Antonio Spurs
+Sacramento Kings,Utah Jazz
+Milwaukee Bucks,Washington Wizards
+Philadelphia 76ers,Detroit Pistons
+New York Knicks,Los Angeles Lakers
+Golden State Warriors,Minnesota Timberwolves
+Boston Celtics,Oklahoma City Thunder
+New Orleans Pelicans,Phoenix Suns
+Denver Nuggets,Dallas Mavericks
+Brooklyn Nets,Houston Rockets
+Charlotte Hornets,Indiana Pacers
+Portland Trail Blazers,Los Angeles Clippers
+Washington Wizards,Miami Heat
+Los Angeles Lakers,Sacramento Kings
+Milwaukee Bucks,Toronto Raptors
+Orlando Magic,Atlanta Hawks
+Minnesota Timberwolves,Chicago Bulls
+Memphis Grizzlies,Cleveland Cavaliers
+Golden State Warriors,New Orleans Pelicans
+New York Knicks,Phoenix Suns
+Oklahoma City Thunder,Portland Trail Blazers
+Los Angeles Lakers,Brooklyn Nets
+Detroit Pistons,Dallas Mavericks
+Sacramento Kings,Houston Rockets
+Cleveland Cavaliers,Memphis Grizzlies
+Indiana Pacers,Miami Heat
+Los Angeles Clippers,Orlando Magic
+Toronto Raptors,Philadelphia 76ers
+Boston Celtics,San Antonio Spurs
+Oklahoma City Thunder,Utah Jazz
+Charlotte Hornets,Washington Wizards
+Portland Trail Blazers,Denver Nuggets
+New York Knicks,Golden State Warriors
+Chicago Bulls,Milwaukee Bucks
+Indiana Pacers,New Orleans Pelicans
+San Antonio Spurs,Phoenix Suns
+Charlotte Hornets,Boston Celtics
+Milwaukee Bucks,Chicago Bulls
+New Orleans Pelicans,Houston Rockets
+Sacramento Kings,Memphis Grizzlies
+Los Angeles Clippers,Miami Heat
+Brooklyn Nets,Orlando Magic
+Los Angeles Lakers,Philadelphia 76ers
+Atlanta Hawks,Toronto Raptors
+Dallas Mavericks,Utah Jazz
+Detroit Pistons,Washington Wizards
+Charlotte Hornets,Atlanta Hawks
+Los Angeles Lakers,Cleveland Cavaliers
+New York Knicks,Denver Nuggets
+Indiana Pacers,Detroit Pistons
+Portland Trail Blazers,Golden State Warriors
+Houston Rockets,Minnesota Timberwolves
+Phoenix Suns,Oklahoma City Thunder
+Sacramento Kings,Dallas Mavericks
+Utah Jazz,Memphis Grizzlies
+Boston Celtics,Miami Heat
+Toronto Raptors,Orlando Magic
+Brooklyn Nets,Philadelphia 76ers
+New Orleans Pelicans,San Antonio Spurs
+Los Angeles Clippers,Washington Wizards
+Detroit Pistons,Chicago Bulls
+Dallas Mavericks,Denver Nuggets
+Washington Wizards,Indiana Pacers
+Phoenix Suns,Minnesota Timberwolves
+Atlanta Hawks,Oklahoma City Thunder
+Los Angeles Lakers,Charlotte Hornets
+Utah Jazz,Golden State Warriors
+San Antonio Spurs,Houston Rockets
+Denver Nuggets,Los Angeles Clippers
+Boston Celtics,Memphis Grizzlies
+Orlando Magic,Miami Heat
+Cleveland Cavaliers,Milwaukee Bucks
+Indiana Pacers,New York Knicks
+New Orleans Pelicans,Philadelphia 76ers
+Portland Trail Blazers,Sacramento Kings
+Brooklyn Nets,Toronto Raptors
+Minnesota Timberwolves,Atlanta Hawks
+Washington Wizards,Chicago Bulls
+Milwaukee Bucks,Cleveland Cavaliers
+Memphis Grizzlies,Detroit Pistons
+Oklahoma City Thunder,New Orleans Pelicans
+Houston Rockets,Phoenix Suns
+Dallas Mavericks,Portland Trail Blazers
+Sacramento Kings,Utah Jazz
+Golden State Warriors,Brooklyn Nets
+Boston Celtics,Indiana Pacers
+San Antonio Spurs,Los Angeles Clippers
+Los Angeles Lakers,Miami Heat
+Orlando Magic,New York Knicks
+Oklahoma City Thunder,Boston Celtics
+Chicago Bulls,Charlotte Hornets
+Brooklyn Nets,Cleveland Cavaliers
+Atlanta Hawks,Denver Nuggets
+Golden State Warriors,Detroit Pistons
+Dallas Mavericks,Los Angeles Clippers
+Houston Rockets,Memphis Grizzlies
+Washington Wizards,Milwaukee Bucks
+Sacramento Kings,Minnesota Timberwolves
+Miami Heat,New Orleans Pelicans
+Los Angeles Lakers,Orlando Magic
+Philadelphia 76ers,Phoenix Suns
+San Antonio Spurs,Portland Trail Blazers
+Toronto Raptors,Utah Jazz
+Golden State Warriors,Cleveland Cavaliers
+Los Angeles Clippers,Los Angeles Lakers
+Boston Celtics,New York Knicks
+Minnesota Timberwolves,Oklahoma City Thunder
+Chicago Bulls,San Antonio Spurs
+Charlotte Hornets,Brooklyn Nets
+Indiana Pacers,Chicago Bulls
+Cleveland Cavaliers,Detroit Pistons
+Phoenix Suns,Houston Rockets
+Denver Nuggets,Los Angeles Clippers
+Atlanta Hawks,Minnesota Timberwolves
+Dallas Mavericks,New Orleans Pelicans
+Memphis Grizzlies,Orlando Magic
+Toronto Raptors,Portland Trail Blazers
+Philadelphia 76ers,Sacramento Kings
+Milwaukee Bucks,Washington Wizards
+Memphis Grizzlies,Boston Celtics
+Houston Rockets,Dallas Mavericks
+Utah Jazz,Los Angeles Lakers
+Oklahoma City Thunder,Miami Heat
+New York Knicks,Atlanta Hawks
+Brooklyn Nets,Chicago Bulls
+Minnesota Timberwolves,Denver Nuggets
+Milwaukee Bucks,Detroit Pistons
+Toronto Raptors,Golden State Warriors
+Los Angeles Clippers,New Orleans Pelicans
+Charlotte Hornets,Orlando Magic
+Sacramento Kings,Portland Trail Blazers
+Phoenix Suns,San Antonio Spurs
+Indiana Pacers,Washington Wizards
+Miami Heat,Charlotte Hornets
+Boston Celtics,Cleveland Cavaliers
+Dallas Mavericks,Los Angeles Lakers
+Oklahoma City Thunder,Memphis Grizzlies
+Toronto Raptors,Phoenix Suns
+Philadelphia 76ers,Utah Jazz
+Detroit Pistons,Atlanta Hawks
+Miami Heat,Boston Celtics
+Philadelphia 76ers,Denver Nuggets
+Dallas Mavericks,Golden State Warriors
+Los Angeles Clippers,Houston Rockets
+Chicago Bulls,Indiana Pacers
+Milwaukee Bucks,Minnesota Timberwolves
+New York Knicks,New Orleans Pelicans
+Portland Trail Blazers,San Antonio Spurs
+Brooklyn Nets,Washington Wizards
+Milwaukee Bucks,Chicago Bulls
+Cleveland Cavaliers,Charlotte Hornets
+New York Knicks,Houston Rockets
+Los Angeles Clippers,Oklahoma City Thunder
+Memphis Grizzlies,Sacramento Kings
+Phoenix Suns,Utah Jazz
+San Antonio Spurs,Atlanta Hawks
+Orlando Magic,Indiana Pacers
+Toronto Raptors,Los Angeles Lakers
+Detroit Pistons,Miami Heat
+Portland Trail Blazers,Minnesota Timberwolves
+Utah Jazz,Brooklyn Nets
+Charlotte Hornets,Chicago Bulls
+New Orleans Pelicans,Cleveland Cavaliers
+Denver Nuggets,Golden State Warriors
+Washington Wizards,Houston Rockets
+Phoenix Suns,Los Angeles Clippers
+Oklahoma City Thunder,Milwaukee Bucks
+Orlando Magic,New York Knicks
+Utah Jazz,Boston Celtics
+Washington Wizards,Dallas Mavericks
+Sacramento Kings,Denver Nuggets
+Indiana Pacers,Detroit Pistons
+Memphis Grizzlies,Los Angeles Lakers
+Minnesota Timberwolves,Philadelphia 76ers
+Miami Heat,Phoenix Suns
+Toronto Raptors,San Antonio Spurs
+Oklahoma City Thunder,Charlotte Hornets
+Chicago Bulls,Cleveland Cavaliers
+Portland Trail Blazers,Golden State Warriors
+Memphis Grizzlies,Los Angeles Clippers
+Milwaukee Bucks,New York Knicks
+Atlanta Hawks,Orlando Magic
+Miami Heat,Sacramento Kings
+Phoenix Suns,Dallas Mavericks
+San Antonio Spurs,Denver Nuggets
+Charlotte Hornets,Detroit Pistons
+Oklahoma City Thunder,Houston Rockets
+Brooklyn Nets,Indiana Pacers
+Atlanta Hawks,New Orleans Pelicans
+Los Angeles Lakers,Portland Trail Blazers
+Utah Jazz,Toronto Raptors
+Philadelphia 76ers,Boston Celtics
+Cleveland Cavaliers,Brooklyn Nets
+Memphis Grizzlies,Golden State Warriors
+Miami Heat,Los Angeles Lakers
+New York Knicks,Milwaukee Bucks
+Houston Rockets,Orlando Magic
+Los Angeles Clippers,Sacramento Kings
+Minnesota Timberwolves,Washington Wizards
+New Orleans Pelicans,Boston Celtics
+Toronto Raptors,Chicago Bulls
+Atlanta Hawks,Dallas Mavericks
+New York Knicks,Indiana Pacers
+Utah Jazz,Minnesota Timberwolves
+Denver Nuggets,Oklahoma City Thunder
+Charlotte Hornets,San Antonio Spurs
+Philadelphia 76ers,Brooklyn Nets
+Miami Heat,Los Angeles Clippers
+Orlando Magic,Los Angeles Lakers
+Utah Jazz,Memphis Grizzlies
+Washington Wizards,Milwaukee Bucks
+Cleveland Cavaliers,Phoenix Suns
+Detroit Pistons,Portland Trail Blazers
+Golden State Warriors,Sacramento Kings
+Houston Rockets,Toronto Raptors
+Oklahoma City Thunder,Chicago Bulls
+Dallas Mavericks,Minnesota Timberwolves
+New Orleans Pelicans,New York Knicks
+Atlanta Hawks,Brooklyn Nets
+Miami Heat,Golden State Warriors
+Charlotte Hornets,Houston Rockets
+Portland Trail Blazers,Los Angeles Lakers
+Detroit Pistons,Sacramento Kings
+Milwaukee Bucks,San Antonio Spurs
+Boston Celtics,Toronto Raptors
+Cleveland Cavaliers,Utah Jazz
+Chicago Bulls,Washington Wizards
+Washington Wizards,Boston Celtics
+Orlando Magic,Los Angeles Clippers
+Houston Rockets,Minnesota Timberwolves
+Memphis Grizzlies,Oklahoma City Thunder
+New York Knicks,Philadelphia 76ers
+Cleveland Cavaliers,Portland Trail Blazers
+New Orleans Pelicans,Brooklyn Nets
+Indiana Pacers,Denver Nuggets
+Detroit Pistons,Golden State Warriors
+Chicago Bulls,New York Knicks
+Dallas Mavericks,Phoenix Suns
+Los Angeles Lakers,San Antonio Spurs
+Boston Celtics,Atlanta Hawks
+Memphis Grizzlies,Houston Rockets
+Miami Heat,Milwaukee Bucks
+Oklahoma City Thunder,Minnesota Timberwolves
+Charlotte Hornets,Philadelphia 76ers
+Orlando Magic,Portland Trail Blazers
+Cleveland Cavaliers,Sacramento Kings
+Brooklyn Nets,Toronto Raptors
+Detroit Pistons,Utah Jazz
+New Orleans Pelicans,Chicago Bulls
+Los Angeles Lakers,Los Angeles Clippers
+San Antonio Spurs,Phoenix Suns
+Orlando Magic,Utah Jazz
+Philadelphia 76ers,Washington Wizards
+Milwaukee Bucks,Atlanta Hawks
+Houston Rockets,Brooklyn Nets
+Minnesota Timberwolves,Dallas Mavericks
+Detroit Pistons,Los Angeles Lakers
+Chicago Bulls,Memphis Grizzlies
+Oklahoma City Thunder,Sacramento Kings
+New York Knicks,Toronto Raptors
+Charlotte Hornets,Boston Celtics
+Orlando Magic,Denver Nuggets
+Cleveland Cavaliers,Golden State Warriors
+New Orleans Pelicans,Indiana Pacers
+Oklahoma City Thunder,Los Angeles Clippers
+Philadelphia 76ers,Milwaukee Bucks
+Atlanta Hawks,New York Knicks
+Utah Jazz,Phoenix Suns
+Portland Trail Blazers,Washington Wizards
+Toronto Raptors,Brooklyn Nets
+Dallas Mavericks,Chicago Bulls
+Denver Nuggets,Los Angeles Lakers
+Houston Rockets,Miami Heat
+Minnesota Timberwolves,San Antonio Spurs
+New York Knicks,Boston Celtics
+Portland Trail Blazers,Charlotte Hornets
+Atlanta Hawks,Detroit Pistons
+Oklahoma City Thunder,Golden State Warriors
+Milwaukee Bucks,Houston Rockets
+Orlando Magic,New Orleans Pelicans
+Toronto Raptors,Philadelphia 76ers
+Indiana Pacers,Sacramento Kings
+Memphis Grizzlies,Washington Wizards
+Phoenix Suns,Cleveland Cavaliers
+Minnesota Timberwolves,Los Angeles Clippers
+Dallas Mavericks,Miami Heat
+Washington Wizards,New York Knicks
+Denver Nuggets,San Antonio Spurs
+Chicago Bulls,Atlanta Hawks
+Toronto Raptors,Charlotte Hornets
+Utah Jazz,Dallas Mavericks
+Golden State Warriors,Houston Rockets
+Indiana Pacers,Los Angeles Lakers
+Sacramento Kings,Memphis Grizzlies
+Brooklyn Nets,New Orleans Pelicans
+Milwaukee Bucks,Orlando Magic
+Portland Trail Blazers,Philadelphia 76ers
+Philadelphia 76ers,Atlanta Hawks
+Portland Trail Blazers,Boston Celtics
+Sacramento Kings,Chicago Bulls
+Brooklyn Nets,Charlotte Hornets
+San Antonio Spurs,Cleveland Cavaliers
+Los Angeles Clippers,Denver Nuggets
+Washington Wizards,Detroit Pistons
+Houston Rockets,Memphis Grizzlies
+Milwaukee Bucks,Miami Heat
+Phoenix Suns,New York Knicks
+Indiana Pacers,Utah Jazz
+Los Angeles Lakers,Dallas Mavericks
+Denver Nuggets,Minnesota Timberwolves
+Golden State Warriors,Orlando Magic
+Phoenix Suns,Toronto Raptors
+Los Angeles Clippers,Atlanta Hawks
+San Antonio Spurs,Brooklyn Nets
+Washington Wizards,Charlotte Hornets
+Sacramento Kings,Detroit Pistons
+New York Knicks,Indiana Pacers
+Golden State Warriors,Miami Heat
+Houston Rockets,Milwaukee Bucks
+Cleveland Cavaliers,New Orleans Pelicans
+Oklahoma City Thunder,Utah Jazz
+Utah Jazz,Denver Nuggets
+Chicago Bulls,Orlando Magic
+Los Angeles Clippers,Philadelphia 76ers
+Minnesota Timberwolves,Phoenix Suns
+San Antonio Spurs,Toronto Raptors
+Boston Celtics,Washington Wizards
+Houston Rockets,Boston Celtics
+Miami Heat,Brooklyn Nets
+Atlanta Hawks,Chicago Bulls
+Golden State Warriors,Charlotte Hornets
+Sacramento Kings,Cleveland Cavaliers
+New York Knicks,Dallas Mavericks
+Toronto Raptors,Memphis Grizzlies
+Philadelphia 76ers,Milwaukee Bucks
+Oklahoma City Thunder,New Orleans Pelicans
+Los Angeles Lakers,Portland Trail Blazers
+Phoenix Suns,Denver Nuggets
+Indiana Pacers,Minnesota Timberwolves
+Dallas Mavericks,Oklahoma City Thunder
+Los Angeles Lakers,Utah Jazz
+Washington Wizards,Atlanta Hawks
+Orlando Magic,Boston Celtics
+Miami Heat,Chicago Bulls
+Brooklyn Nets,Cleveland Cavaliers
+Sacramento Kings,Indiana Pacers
+San Antonio Spurs,New Orleans Pelicans
+Charlotte Hornets,New York Knicks
+Houston Rockets,Philadelphia 76ers
+Memphis Grizzlies,Portland Trail Blazers
+Milwaukee Bucks,Toronto Raptors
+Sacramento Kings,Charlotte Hornets
+Los Angeles Clippers,Golden State Warriors
+Detroit Pistons,Miami Heat
+Boston Celtics,Milwaukee Bucks
+Brooklyn Nets,Minnesota Timberwolves
+Denver Nuggets,Phoenix Suns
+Memphis Grizzlies,Utah Jazz
+New York Knicks,Atlanta Hawks
+Philadelphia 76ers,Chicago Bulls
+Oklahoma City Thunder,Cleveland Cavaliers
+Houston Rockets,Indiana Pacers
+Washington Wizards,New Orleans Pelicans
+Golden State Warriors,Portland Trail Blazers
+Dallas Mavericks,San Antonio Spurs
+Orlando Magic,Toronto Raptors
+Detroit Pistons,Boston Celtics
+Cleveland Cavaliers,Dallas Mavericks
+Brooklyn Nets,Miami Heat
+Orlando Magic,Minnesota Timberwolves
+Sacramento Kings,Philadelphia 76ers
+Memphis Grizzlies,Phoenix Suns
+Sacramento Kings,Houston Rockets
+Denver Nuggets,Los Angeles Lakers
+Charlotte Hornets,Portland Trail Blazers
+Oklahoma City Thunder,San Antonio Spurs
+New Orleans Pelicans,Toronto Raptors
+New York Knicks,Washington Wizards
+Toronto Raptors,Boston Celtics
+New York Knicks,Brooklyn Nets
+Minnesota Timberwolves,Cleveland Cavaliers
+Philadelphia 76ers,Dallas Mavericks
+Memphis Grizzlies,Denver Nuggets
+New Orleans Pelicans,Detroit Pistons
+Charlotte Hornets,Golden State Warriors
+Atlanta Hawks,Miami Heat
+Chicago Bulls,Oklahoma City Thunder
+Indiana Pacers,Orlando Magic
+Los Angeles Clippers,Phoenix Suns
+Milwaukee Bucks,Utah Jazz
+Atlanta Hawks,Houston Rockets
+Golden State Warriors,Los Angeles Clippers
+Philadelphia 76ers,San Antonio Spurs
+Los Angeles Lakers,Washington Wizards
+Los Angeles Lakers,Boston Celtics
+Indiana Pacers,Brooklyn Nets
+Milwaukee Bucks,Denver Nuggets
+Minnesota Timberwolves,Detroit Pistons
+Chicago Bulls,Houston Rockets
+Memphis Grizzlies,Oklahoma City Thunder
+Toronto Raptors,Orlando Magic
+Dallas Mavericks,Portland Trail Blazers
+Phoenix Suns,Sacramento Kings
+Orlando Magic,Atlanta Hawks
+Detroit Pistons,Indiana Pacers
+Philadelphia 76ers,Miami Heat
+Memphis Grizzlies,Minnesota Timberwolves
+Cleveland Cavaliers,New York Knicks
+Milwaukee Bucks,Phoenix Suns
+Golden State Warriors,Sacramento Kings
+Denver Nuggets,San Antonio Spurs
+Charlotte Hornets,Utah Jazz
+New Orleans Pelicans,Washington Wizards
+Los Angeles Clippers,Boston Celtics
+Toronto Raptors,Brooklyn Nets
+Portland Trail Blazers,Oklahoma City Thunder
+Utah Jazz,Atlanta Hawks
+Dallas Mavericks,Denver Nuggets
+Philadelphia 76ers,Detroit Pistons
+Oklahoma City Thunder,Indiana Pacers
+San Antonio Spurs,Memphis Grizzlies
+Miami Heat,Minnesota Timberwolves
+Phoenix Suns,New Orleans Pelicans
+Los Angeles Lakers,New York Knicks
+Chicago Bulls,Sacramento Kings
+Los Angeles Clippers,Toronto Raptors
+Cleveland Cavaliers,Washington Wizards
+Brooklyn Nets,Charlotte Hornets
+Portland Trail Blazers,Dallas Mavericks
+Orlando Magic,Houston Rockets
+Denver Nuggets,Atlanta Hawks
+Washington Wizards,Brooklyn Nets
+Los Angeles Lakers,Detroit Pistons
+Chicago Bulls,Golden State Warriors
+Cleveland Cavaliers,Indiana Pacers
+Phoenix Suns,Memphis Grizzlies
+Miami Heat,Milwaukee Bucks
+Toronto Raptors,Minnesota Timberwolves
+Utah Jazz,New Orleans Pelicans
+Los Angeles Clippers,New York Knicks
+San Antonio Spurs,Philadelphia 76ers
+Boston Celtics,Sacramento Kings
+Houston Rockets,Charlotte Hornets
+Utah Jazz,Dallas Mavericks
+Cleveland Cavaliers,Oklahoma City Thunder
+Philadelphia 76ers,Orlando Magic
+Boston Celtics,Portland Trail Blazers
+Miami Heat,Brooklyn Nets
+San Antonio Spurs,Detroit Pistons
+Golden State Warriors,Memphis Grizzlies
+Los Angeles Lakers,Milwaukee Bucks
+New Orleans Pelicans,Minnesota Timberwolves
+Denver Nuggets,New York Knicks
+Chicago Bulls,Phoenix Suns
+Atlanta Hawks,Sacramento Kings
+Indiana Pacers,Washington Wizards
+Los Angeles Clippers,Charlotte Hornets
+Denver Nuggets,Cleveland Cavaliers
+Orlando Magic,Dallas Mavericks
+Phoenix Suns,Houston Rockets
+Milwaukee Bucks,Indiana Pacers
+Golden State Warriors,Oklahoma City Thunder
+Miami Heat,Philadelphia 76ers
+Boston Celtics,Utah Jazz
+Chicago Bulls,Minnesota Timberwolves
+San Antonio Spurs,New York Knicks
+New Orleans Pelicans,Sacramento Kings
+Detroit Pistons,Toronto Raptors
+Memphis Grizzlies,Brooklyn Nets
+Philadelphia 76ers,Charlotte Hornets
+Boston Celtics,Dallas Mavericks
+Golden State Warriors,Denver Nuggets
+San Antonio Spurs,Indiana Pacers
+Orlando Magic,Miami Heat
+Detroit Pistons,Milwaukee Bucks
+New Orleans Pelicans,Phoenix Suns
+Atlanta Hawks,Portland Trail Blazers
+Los Angeles Clippers,Utah Jazz
+Oklahoma City Thunder,Washington Wizards
+Toronto Raptors,Chicago Bulls
+Sacramento Kings,Los Angeles Lakers
+Cleveland Cavaliers,Minnesota Timberwolves
+Philadelphia 76ers,Boston Celtics
+Milwaukee Bucks,Brooklyn Nets
+Indiana Pacers,Cleveland Cavaliers
+Minnesota Timberwolves,Denver Nuggets
+Dallas Mavericks,Detroit Pistons
+Sacramento Kings,Golden State Warriors
+Miami Heat,Houston Rockets
+Atlanta Hawks,Los Angeles Clippers
+New Orleans Pelicans,Memphis Grizzlies
+New York Knicks,Oklahoma City Thunder
+San Antonio Spurs,Orlando Magic
+Los Angeles Lakers,Phoenix Suns
+Charlotte Hornets,Toronto Raptors
+Portland Trail Blazers,Utah Jazz
+Boston Celtics,Chicago Bulls
+Washington Wizards,Indiana Pacers
+New York Knicks,Cleveland Cavaliers
+Charlotte Hornets,Detroit Pistons
+Los Angeles Clippers,Golden State Warriors
+Houston Rockets,New Orleans Pelicans
+Portland Trail Blazers,Orlando Magic
+Denver Nuggets,Sacramento Kings
+Miami Heat,Atlanta Hawks
+Phoenix Suns,Chicago Bulls
+Brooklyn Nets,Denver Nuggets
+Memphis Grizzlies,Indiana Pacers
+San Antonio Spurs,Los Angeles Clippers
+Utah Jazz,Milwaukee Bucks
+Dallas Mavericks,Minnesota Timberwolves
+Los Angeles Lakers,Oklahoma City Thunder
+Washington Wizards,Philadelphia 76ers
+Boston Celtics,Toronto Raptors
+Chicago Bulls,Cleveland Cavaliers
+New Orleans Pelicans,Dallas Mavericks
+Brooklyn Nets,Golden State Warriors
+Minnesota Timberwolves,Houston Rockets
+Indiana Pacers,Miami Heat
+Philadelphia 76ers,New York Knicks
+Atlanta Hawks,Orlando Magic
+Charlotte Hornets,Sacramento Kings
+Memphis Grizzlies,Denver Nuggets
+Boston Celtics,Detroit Pistons
+Charlotte Hornets,Los Angeles Clippers
+San Antonio Spurs,Los Angeles Lakers
+Phoenix Suns,Milwaukee Bucks
+New Orleans Pelicans,Oklahoma City Thunder
+Portland Trail Blazers,Toronto Raptors
+Utah Jazz,Washington Wizards
+Atlanta Hawks,Boston Celtics
+Milwaukee Bucks,Cleveland Cavaliers
+Miami Heat,Dallas Mavericks
+Indiana Pacers,Houston Rockets
+Toronto Raptors,New York Knicks
+Golden State Warriors,Philadelphia 76ers
+Minnesota Timberwolves,Sacramento Kings
+Denver Nuggets,Chicago Bulls
+Portland Trail Blazers,Detroit Pistons
+Charlotte Hornets,Los Angeles Lakers
+Phoenix Suns,Memphis Grizzlies
+Utah Jazz,Oklahoma City Thunder
+Golden State Warriors,Washington Wizards
+Dallas Mavericks,Atlanta Hawks
+Cleveland Cavaliers,Boston Celtics
+Houston Rockets,Los Angeles Clippers
+Philadelphia 76ers,Miami Heat
+Denver Nuggets,Milwaukee Bucks
+Detroit Pistons,New Orleans Pelicans
+New York Knicks,Orlando Magic
+Brooklyn Nets,Sacramento Kings
+Indiana Pacers,San Antonio Spurs
+Washington Wizards,Toronto Raptors
+Minnesota Timberwolves,Utah Jazz
+Golden State Warriors,Chicago Bulls
+Charlotte Hornets,Phoenix Suns
+Oklahoma City Thunder,Portland Trail Blazers
+Cleveland Cavaliers,Atlanta Hawks
+Memphis Grizzlies,Dallas Mavericks
+Boston Celtics,Los Angeles Lakers
+Los Angeles Clippers,Milwaukee Bucks
+San Antonio Spurs,New Orleans Pelicans
+Miami Heat,Orlando Magic
+New York Knicks,Philadelphia 76ers
+Oklahoma City Thunder,Phoenix Suns
+Brooklyn Nets,Utah Jazz
+Toronto Raptors,Washington Wizards
+Los Angeles Clippers,Chicago Bulls
+Charlotte Hornets,Denver Nuggets
+Memphis Grizzlies,Houston Rockets
+Cleveland Cavaliers,Miami Heat
+Toronto Raptors,Milwaukee Bucks
+Detroit Pistons,Philadelphia 76ers
+Brooklyn Nets,Portland Trail Blazers
+Minnesota Timberwolves,San Antonio Spurs
+Indiana Pacers,Atlanta Hawks
+Oklahoma City Thunder,Dallas Mavericks
+New Orleans Pelicans,Los Angeles Lakers
+Golden State Warriors,New York Knicks
+Boston Celtics,Phoenix Suns
+Utah Jazz,Sacramento Kings
+Orlando Magic,Washington Wizards
+Golden State Warriors,Atlanta Hawks
+Indiana Pacers,Charlotte Hornets
+Miami Heat,Cleveland Cavaliers
+Sacramento Kings,Denver Nuggets
+Chicago Bulls,Detroit Pistons
+Boston Celtics,Los Angeles Clippers
+Brooklyn Nets,Memphis Grizzlies
+New York Knicks,Orlando Magic
+Milwaukee Bucks,Philadelphia 76ers
+Houston Rockets,San Antonio Spurs
+New Orleans Pelicans,Utah Jazz
+Los Angeles Lakers,Dallas Mavericks
+Portland Trail Blazers,Oklahoma City Thunder
+Washington Wizards,Phoenix Suns
+Brooklyn Nets,Atlanta Hawks
+Washington Wizards,Denver Nuggets
+Boston Celtics,Golden State Warriors
+Utah Jazz,Houston Rockets
+Detroit Pistons,Indiana Pacers
+Charlotte Hornets,Miami Heat
+New York Knicks,Milwaukee Bucks
+Los Angeles Clippers,Minnesota Timberwolves
+Toronto Raptors,New Orleans Pelicans
+Chicago Bulls,Orlando Magic
+Sacramento Kings,San Antonio Spurs
+Cleveland Cavaliers,Detroit Pistons
+Los Angeles Clippers,Memphis Grizzlies
+San Antonio Spurs,Oklahoma City Thunder
+Los Angeles Lakers,Phoenix Suns
+Philadelphia 76ers,Portland Trail Blazers
+Toronto Raptors,Atlanta Hawks
+Houston Rockets,Chicago Bulls
+Orlando Magic,Charlotte Hornets
+Brooklyn Nets,Dallas Mavericks
+Boston Celtics,Denver Nuggets
+Indiana Pacers,Milwaukee Bucks
+Golden State Warriors,Minnesota Timberwolves
+Washington Wizards,Sacramento Kings
+New Orleans Pelicans,Charlotte Hornets
+Phoenix Suns,Dallas Mavericks
+New York Knicks,Detroit Pistons
+Philadelphia 76ers,Los Angeles Clippers
+Atlanta Hawks,Memphis Grizzlies
+Toronto Raptors,Miami Heat
+Minnesota Timberwolves,Milwaukee Bucks
+Utah Jazz,Oklahoma City Thunder
+Cleveland Cavaliers,Orlando Magic
+Washington Wizards,Portland Trail Blazers
+Denver Nuggets,Sacramento Kings
+Golden State Warriors,San Antonio Spurs
+Chicago Bulls,Boston Celtics
+New York Knicks,Brooklyn Nets
+Cleveland Cavaliers,Houston Rockets
+Miami Heat,Indiana Pacers
+Philadelphia 76ers,Los Angeles Lakers
+Portland Trail Blazers,Phoenix Suns
+Chicago Bulls,Charlotte Hornets
+Los Angeles Lakers,Denver Nuggets
+Milwaukee Bucks,Memphis Grizzlies
+Washington Wizards,Minnesota Timberwolves
+Orlando Magic,Sacramento Kings
+Atlanta Hawks,San Antonio Spurs
+Dallas Mavericks,Toronto Raptors
+Los Angeles Clippers,Utah Jazz
+Oklahoma City Thunder,Brooklyn Nets
+Detroit Pistons,Cleveland Cavaliers
+Philadelphia 76ers,Golden State Warriors
+Portland Trail Blazers,New Orleans Pelicans
+Indiana Pacers,New York Knicks
+Minnesota Timberwolves,Boston Celtics
+Memphis Grizzlies,Chicago Bulls
+Utah Jazz,Detroit Pistons
+Los Angeles Lakers,Houston Rockets
+Charlotte Hornets,Indiana Pacers
+Milwaukee Bucks,Los Angeles Clippers
+New Orleans Pelicans,Miami Heat
+Sacramento Kings,Phoenix Suns
+Portland Trail Blazers,San Antonio Spurs
+Dallas Mavericks,Washington Wizards
+Memphis Grizzlies,Atlanta Hawks
+Utah Jazz,Cleveland Cavaliers
+Los Angeles Clippers,Denver Nuggets
+Orlando Magic,Golden State Warriors
+Brooklyn Nets,New York Knicks
+Oklahoma City Thunder,Toronto Raptors
+Boston Celtics,Brooklyn Nets
+Toronto Raptors,Detroit Pistons
+Milwaukee Bucks,Los Angeles Lakers
+Minnesota Timberwolves,Miami Heat
+Houston Rockets,New Orleans Pelicans
+Dallas Mavericks,Philadelphia 76ers
+Orlando Magic,Phoenix Suns
+Chicago Bulls,Washington Wizards
+Portland Trail Blazers,Atlanta Hawks
+Utah Jazz,Chicago Bulls
+Washington Wizards,Charlotte Hornets
+Houston Rockets,Denver Nuggets
+Milwaukee Bucks,Golden State Warriors
+Cleveland Cavaliers,Los Angeles Clippers
+San Antonio Spurs,Memphis Grizzlies
+Sacramento Kings,Oklahoma City Thunder
+Dallas Mavericks,Brooklyn Nets
+Phoenix Suns,Detroit Pistons
+Cleveland Cavaliers,Los Angeles Lakers
+Portland Trail Blazers,Miami Heat
+Minnesota Timberwolves,New Orleans Pelicans
+Boston Celtics,Philadelphia 76ers
+Sacramento Kings,San Antonio Spurs
+Indiana Pacers,Toronto Raptors
+Washington Wizards,Boston Celtics
+Atlanta Hawks,Charlotte Hornets
+Denver Nuggets,Houston Rockets
+Utah Jazz,Indiana Pacers
+New York Knicks,Los Angeles Clippers
+Golden State Warriors,Oklahoma City Thunder
+Philadelphia 76ers,Orlando Magic
+Detroit Pistons,Brooklyn Nets
+Golden State Warriors,Dallas Mavericks
+Los Angeles Clippers,Los Angeles Lakers
+Phoenix Suns,Miami Heat
+San Antonio Spurs,Minnesota Timberwolves
+Memphis Grizzlies,New Orleans Pelicans
+Milwaukee Bucks,Portland Trail Blazers
+Chicago Bulls,Toronto Raptors
+Indiana Pacers,Boston Celtics
+Detroit Pistons,Chicago Bulls
+Cleveland Cavaliers,Denver Nuggets
+Philadelphia 76ers,Oklahoma City Thunder
+Charlotte Hornets,Orlando Magic
+Milwaukee Bucks,Sacramento Kings
+New York Knicks,Utah Jazz
+Atlanta Hawks,Washington Wizards
+Phoenix Suns,Brooklyn Nets
+Los Angeles Clippers,Dallas Mavericks
+Toronto Raptors,Miami Heat
+New York Knicks,Portland Trail Blazers
+Memphis Grizzlies,San Antonio Spurs
+Phoenix Suns,Boston Celtics
+Philadelphia 76ers,Chicago Bulls
+Cleveland Cavaliers,Charlotte Hornets
+Sacramento Kings,Golden State Warriors
+New Orleans Pelicans,Houston Rockets
+Denver Nuggets,Indiana Pacers
+Minnesota Timberwolves,Los Angeles Lakers
+Atlanta Hawks,Milwaukee Bucks
+Detroit Pistons,Orlando Magic
+Brooklyn Nets,Washington Wizards
+Washington Wizards,Cleveland Cavaliers
+Toronto Raptors,Dallas Mavericks
+Utah Jazz,Los Angeles Clippers
+Minnesota Timberwolves,Portland Trail Blazers
+New York Knicks,San Antonio Spurs
+Brooklyn Nets,Atlanta Hawks
+Miami Heat,Boston Celtics
+Phoenix Suns,Charlotte Hornets
+New Orleans Pelicans,Denver Nuggets
+Memphis Grizzlies,Golden State Warriors
+Oklahoma City Thunder,Houston Rockets
+Philadelphia 76ers,Indiana Pacers
+Sacramento Kings,Los Angeles Clippers
+Portland Trail Blazers,Los Angeles Lakers
+Chicago Bulls,Milwaukee Bucks
+Oklahoma City Thunder,Dallas Mavericks
+Detroit Pistons,New York Knicks
+Memphis Grizzlies,Sacramento Kings
+Cleveland Cavaliers,San Antonio Spurs
+Orlando Magic,Toronto Raptors
+New Orleans Pelicans,Utah Jazz
+Phoenix Suns,Atlanta Hawks
+Philadelphia 76ers,Brooklyn Nets
+Milwaukee Bucks,Charlotte Hornets
+Miami Heat,Detroit Pistons
+Golden State Warriors,Houston Rockets
+Minnesota Timberwolves,Indiana Pacers
+Washington Wizards,Los Angeles Lakers
+Denver Nuggets,Portland Trail Blazers
+Milwaukee Bucks,Boston Celtics
+Washington Wizards,Los Angeles Clippers
+Indiana Pacers,Memphis Grizzlies
+Dallas Mavericks,New Orleans Pelicans
+Miami Heat,New York Knicks
+Oklahoma City Thunder,Orlando Magic
+Atlanta Hawks,Philadelphia 76ers
+Utah Jazz,Sacramento Kings
+Golden State Warriors,San Antonio Spurs
+Charlotte Hornets,Toronto Raptors
+Cleveland Cavaliers,Chicago Bulls
+Brooklyn Nets,Detroit Pistons
+Los Angeles Lakers,Minnesota Timberwolves
+Los Angeles Clippers,Phoenix Suns
+Houston Rockets,Portland Trail Blazers
+Orlando Magic,Boston Celtics
+Denver Nuggets,Charlotte Hornets
+Philadelphia 76ers,Cleveland Cavaliers
+Houston Rockets,Golden State Warriors
+Dallas Mavericks,Memphis Grizzlies
+New York Knicks,Miami Heat
+Detroit Pistons,Milwaukee Bucks
+Sacramento Kings,New Orleans Pelicans
+San Antonio Spurs,Oklahoma City Thunder
+Indiana Pacers,Toronto Raptors
+Washington Wizards,Utah Jazz
+Orlando Magic,Brooklyn Nets
+Atlanta Hawks,Chicago Bulls
+Los Angeles Lakers,Los Angeles Clippers
+Sacramento Kings,Minnesota Timberwolves
+Phoenix Suns,Portland Trail Blazers
+Atlanta Hawks,Brooklyn Nets
+Indiana Pacers,Cleveland Cavaliers
+Washington Wizards,Golden State Warriors
+Memphis Grizzlies,Los Angeles Lakers
+Denver Nuggets,Miami Heat
+Dallas Mavericks,Milwaukee Bucks
+Chicago Bulls,New Orleans Pelicans
+Boston Celtics,New York Knicks
+Charlotte Hornets,Oklahoma City Thunder
+Houston Rockets,Phoenix Suns
+Utah Jazz,San Antonio Spurs
+Philadelphia 76ers,Toronto Raptors
+Orlando Magic,Cleveland Cavaliers
+Minnesota Timberwolves,Golden State Warriors
+Toronto Raptors,Indiana Pacers
+Denver Nuggets,New Orleans Pelicans
+Chicago Bulls,New York Knicks
+Milwaukee Bucks,Oklahoma City Thunder
+Brooklyn Nets,Philadelphia 76ers
+Dallas Mavericks,Sacramento Kings
+Memphis Grizzlies,San Antonio Spurs
+Portland Trail Blazers,Utah Jazz
+Charlotte Hornets,Washington Wizards
+Cleveland Cavaliers,Boston Celtics
+Miami Heat,Charlotte Hornets
+Toronto Raptors,Detroit Pistons
+Denver Nuggets,Houston Rockets
+Dallas Mavericks,Los Angeles Clippers
+Oklahoma City Thunder,Memphis Grizzlies
+Golden State Warriors,Phoenix Suns
+Los Angeles Lakers,San Antonio Spurs
+Boston Celtics,Atlanta Hawks
+Milwaukee Bucks,Indiana Pacers
+Washington Wizards,New York Knicks
+Brooklyn Nets,Orlando Magic
+Chicago Bulls,Philadelphia 76ers
+Minnesota Timberwolves,Portland Trail Blazers
+Atlanta Hawks,Cleveland Cavaliers
+San Antonio Spurs,Dallas Mavericks
+New Orleans Pelicans,Denver Nuggets
+Detroit Pistons,Houston Rockets
+Sacramento Kings,Los Angeles Lakers
+New York Knicks,Memphis Grizzlies
+Oklahoma City Thunder,Phoenix Suns
+Miami Heat,Toronto Raptors
+Minnesota Timberwolves,Utah Jazz
+Chicago Bulls,Brooklyn Nets
+Boston Celtics,Charlotte Hornets
+New Orleans Pelicans,Golden State Warriors
+Indiana Pacers,Orlando Magic
+Milwaukee Bucks,Philadelphia 76ers
+Utah Jazz,Portland Trail Blazers
+Los Angeles Clippers,San Antonio Spurs
+Miami Heat,Washington Wizards
+Cleveland Cavaliers,Atlanta Hawks
+Oklahoma City Thunder,Denver Nuggets
+Minnesota Timberwolves,Los Angeles Lakers
+Detroit Pistons,Memphis Grizzlies
+Toronto Raptors,New York Knicks
+Dallas Mavericks,Phoenix Suns
+Houston Rockets,Sacramento Kings
+Brooklyn Nets,Boston Celtics
+Orlando Magic,Chicago Bulls
+Washington Wizards,Detroit Pistons
+Utah Jazz,Golden State Warriors
+Houston Rockets,Los Angeles Clippers
+Cleveland Cavaliers,Miami Heat
+Charlotte Hornets,Milwaukee Bucks
+Indiana Pacers,Philadelphia 76ers
+San Antonio Spurs,Portland Trail Blazers
+Charlotte Hornets,Atlanta Hawks
+Denver Nuggets,Dallas Mavericks
+New Orleans Pelicans,Los Angeles Lakers
+Oklahoma City Thunder,Minnesota Timberwolves
+Phoenix Suns,Sacramento Kings
+Milwaukee Bucks,Boston Celtics
+Brooklyn Nets,Chicago Bulls
+Toronto Raptors,Cleveland Cavaliers
+Los Angeles Lakers,Golden State Warriors
+Minnesota Timberwolves,Houston Rockets
+Atlanta Hawks,Indiana Pacers
+Sacramento Kings,Los Angeles Clippers
+Dallas Mavericks,Memphis Grizzlies
+Washington Wizards,Miami Heat
+Philadelphia 76ers,New York Knicks
+Denver Nuggets,Oklahoma City Thunder
+Detroit Pistons,Orlando Magic
+New Orleans Pelicans,Portland Trail Blazers
+San Antonio Spurs,Utah Jazz
diff --git a/other/data/advanced_team.csv b/other/data/advanced_team.csv
new file mode 100644
index 0000000..5f3955d
--- /dev/null
+++ b/other/data/advanced_team.csv
@@ -0,0 +1,31 @@
+Rk,Team,Age,W,L,PW,PL,MOV,SOS,SRS,ORtg,DRtg,NRtg,Pace,FTr,3PAr,TS%,eFG%,TOV%,ORB%,FT/FGA,eFG%,TOV%,DRB%,FT/FGA,Arena,Attend.,Attend./G
+1,San Antonio Spurs,30.3,67,15,67,15,10.63,-0.36,10.28,110.3,99.0,+11.3,93.8,.246,.223,.564,.526,12.4,23.0,.197,.477,14.1,79.1,.182,AT&T Center,"756,445","18,450"
+2,Golden State Warriors,27.4,73,9,65,17,10.76,-0.38,10.38,114.5,103.8,+10.7,99.3,.250,.362,.593,.563,13.5,23.5,.191,.479,12.6,76.0,.208,Oracle Arena,"803,436","19,596"
+3,Oklahoma City Thunder,25.8,55,27,59,23,7.28,-0.19,7.09,113.1,105.6,+7.5,96.7,.292,.275,.565,.524,14.0,31.1,.228,.484,11.7,76.0,.205,Chesapeake Energy Arena,"746,323","18,203"
+4,Cleveland Cavaliers,28.1,57,25,57,25,6.00,-0.55,5.45,110.9,104.5,+6.4,93.3,.259,.352,.558,.524,12.7,25.1,.194,.496,12.6,78.5,.205,Quicken Loans Arena,"843,042","20,562"
+5,Toronto Raptors,26.3,56,26,53,29,4.50,-0.42,4.08,110.0,105.2,+4.8,92.9,.328,.287,.552,.504,12.3,24.6,.255,.498,12.7,77.7,.201,Air Canada Centre,"812,863","19,826"
+6,Los Angeles Clippers,29.7,53,29,53,29,4.28,-0.15,4.13,108.3,103.8,+4.5,95.8,.318,.324,.556,.524,12.1,20.1,.220,.480,13.8,73.8,.222,STAPLES Center,"786,910","19,193"
+7,Atlanta Hawks,28.2,48,34,51,31,3.61,-0.12,3.49,105.1,101.4,+3.7,97.1,.237,.336,.552,.516,13.8,19.1,.185,.480,14.4,74.6,.194,Philips Arena,"690,150","16,833"
+8,Boston Celtics,25.2,48,34,50,32,3.21,-0.37,2.84,106.8,103.6,+3.2,98.5,.264,.293,.531,.488,12.1,25.1,.208,.487,14.6,74.6,.231,TD Garden,"749,076","18,270"
+9,Charlotte Hornets,26.0,48,34,49,33,2.72,-0.36,2.36,107.1,104.3,+2.8,95.7,.280,.348,.545,.502,11.7,20.0,.222,.496,12.5,79.8,.191,Time Warner Cable Arena,"716,894","17,485"
+10,Utah Jazz,40,42,46,36,1.79,0.05,1.84,105.9,103.9,+2.0,91.0,.286,.297,.540,.501,14.2,25.9,.213,.495,13.5,77.7,.210,Vivint Smart Home Arena,"791,489","19,305"
+11,Miami Heat,28.4,48,34,46,36,1.65,-0.14,1.50,106.1,104.4,+1.7,93.6,.282,.221,.545,.508,13.3,23.8,.210,.485,12.1,77.8,.196,AmericanAirlines Arena,"809,350","19,740"
+12,Indiana Pacers,26.9,45,37,46,36,1.71,-0.09,1.62,104.6,102.9,+1.7,96.6,.268,.270,.536,.497,13.5,23.4,.205,.489,14.3,76.0,.205,Bankers Life Fieldhouse,"690,733","16,847"
+13,Portland Trail Blazers,24.3,44,38,43,39,0.83,0.15,0.98,108.8,108.0,+0.8,96.0,.268,.332,.548,.511,13.2,25.9,.202,.503,12.1,76.2,.225,Moda Center,"794,085","19,368"
+14,Detroit Pistons,25.0,44,38,43,39,0.61,-0.18,0.43,106.1,105.5,+0.6,95.1,.296,.303,.522,.491,12.2,27.0,.197,.504,12.5,79.3,.196,The Palace of Auburn Hills,"677,138","16,516"
+15,Houston Rockets,27.8,41,41,42,40,0.20,0.14,0.34,108.3,108.1,+0.2,97.6,.352,.370,.553,.516,14.2,25.7,.244,.516,14.7,72.8,.219,Toyota Center,"737,244","17,982"
+16,Dallas Mavericks,30.3,42,40,40,42,-0.30,0.29,-0.02,106.7,107.0,-0.3,94.3,.265,.339,.544,.502,12.0,20.6,.211,.504,12.8,76.2,.198,American Airlines Center,"825,901","20,144"
+17,Washington Wizards,41,41,40,42,-0.50,0.00,-0.50,105.3,105.8,-0.5,98.5,.263,.282,.544,.511,13.1,20.6,.192,.515,14.6,77.7,.218,Verizon Center,"725,426","17,693"
+18,Chicago Bulls,42,40,37,45,-1.48,0.01,-1.46,105.0,106.5,-1.5,95.7,.240,.244,.526,.487,12.6,24.5,.189,.485,10.7,74.9,.182,United Center,"894,659","21,821"
+19,Orlando Magic,35,47,36,46,-1.62,-0.06,-1.68,105.1,106.8,-1.7,96.0,.232,.255,.533,.500,12.8,23.1,.175,.513,13.8,76.5,.215,Amway Center,"719,275","17,515"
+20,Sacramento Kings,33,49,34,48,-2.48,0.16,-2.32,106.0,108.4,-2.4,100.0,.295,.260,.546,.510,14.2,23.9,.214,.521,14.0,74.9,.202,Sleep Train Arena,"707,526","17,222"
+21,Memphis Grizzlies,30.5,42,40,35,47,-2.24,0.11,-2.14,105.4,107.8,-2.4,93.3,.295,.222,.524,.477,12.3,25.3,.231,.518,15.2,75.1,.251,FedEx Forum,"701,894","17,119"
+22,New York Knicks,32,50,33,49,-2.73,0.00,-2.74,104.6,107.6,-3.0,93.4,.255,.256,.527,.483,12.6,23.7,.205,.487,10.5,75.8,.204,Madison Square Garden (IV),"812,292","19,812"
+23,Denver Nuggets,33,49,33,49,-3.10,0.29,-2.81,105.6,108.9,-3.3,95.7,.282,.277,.531,.489,13.2,25.8,.216,.515,12.6,77.3,.216,Pepsi Center,"577,898","14,095"
+24,Minnesota Timberwolves,29,53,31,51,-3.54,0.15,-3.38,106.5,110.1,-3.6,95.2,.332,.202,.549,.498,13.9,24.3,.263,.524,13.6,74.7,.200,Target Center,"581,178","14,175"
+25,New Orleans Pelicans,30,52,31,51,-3.79,0.24,-3.56,105.6,109.5,-3.9,96.8,.259,.277,.537,.498,12.3,21.2,.201,.523,12.7,78.8,.225,Smoothie King Center,"688,549","16,794"
+26,Milwaukee Bucks,33,49,29,53,-4.18,0.20,-3.98,104.3,108.7,-4.4,94.2,.276,.189,.537,.499,14.2,24.9,.207,.510,14.2,73.1,.221,BMO Harris Bradley Center,"621,808","15,166"
+27,Phoenix Suns,23,59,24,58,-6.66,0.34,-6.32,102.2,109.0,-6.8,98.5,.271,.302,.526,.487,15.2,25.4,.204,.523,13.5,77.1,.237,Talking Stick Resort Arena,"701,405","17,107"
+28,Brooklyn Nets,21,61,22,60,-7.35,0.24,-7.12,103.2,110.9,-7.7,95.2,.246,.218,.527,.492,13.6,24.1,.186,.534,13.1,75.7,.176,Barclays Center,"620,142","15,125"
+29,Los Angeles Lakers,17,65,17,65,-9.56,0.64,-8.92,101.6,111.6,-10.0,95.6,.292,.290,.509,.460,12.5,23.1,.228,.523,11.6,74.7,.202,STAPLES Center,"778,877","18,997"
+30,Philadelphia 76ers,10,72,16,66,-10.23,0.31,-9.92,98.8,109.2,-10.4,97.9,.269,.327,.519,.487,14.8,20.6,.186,.510,13.5,74.0,.240,Wells Fargo Center,"614,650","14,991"
diff --git a/other/可视化_NBA数据分析 2022-11-27 14-38-48.mp4 b/other/可视化_NBA数据分析 2022-11-27 14-38-48.mp4
new file mode 100644
index 0000000..4775964
Binary files /dev/null and b/other/可视化_NBA数据分析 2022-11-27 14-38-48.mp4 differ
diff --git a/other/软件开发项目的个人自评报告.xlsx b/other/软件开发项目的个人自评报告.xlsx
new file mode 100644
index 0000000..6cbcc39
Binary files /dev/null and b/other/软件开发项目的个人自评报告.xlsx differ
diff --git a/other/软件开发项目的团队自评报告.xlsx b/other/软件开发项目的团队自评报告.xlsx
new file mode 100644
index 0000000..f32a4d3
Binary files /dev/null and b/other/软件开发项目的团队自评报告.xlsx differ
diff --git a/src/.idea/.gitignore b/src/.idea/.gitignore
new file mode 100644
index 0000000..359bb53
--- /dev/null
+++ b/src/.idea/.gitignore
@@ -0,0 +1,3 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
diff --git a/src/.idea/inspectionProfiles/Project_Default.xml b/src/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..587e609
--- /dev/null
+++ b/src/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/inspectionProfiles/profiles_settings.xml b/src/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/src/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/misc.xml b/src/.idea/misc.xml
new file mode 100644
index 0000000..7a85af6
--- /dev/null
+++ b/src/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/modules.xml b/src/.idea/modules.xml
new file mode 100644
index 0000000..faeddb7
--- /dev/null
+++ b/src/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/nba.iml b/src/.idea/nba.iml
new file mode 100644
index 0000000..9b31378
--- /dev/null
+++ b/src/.idea/nba.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.vs/ProjectSettings.json b/src/.vs/ProjectSettings.json
new file mode 100644
index 0000000..f8b4888
--- /dev/null
+++ b/src/.vs/ProjectSettings.json
@@ -0,0 +1,3 @@
+{
+ "CurrentProjectSetting": null
+}
\ No newline at end of file
diff --git a/src/.vs/VSWorkspaceState.json b/src/.vs/VSWorkspaceState.json
new file mode 100644
index 0000000..6b61141
--- /dev/null
+++ b/src/.vs/VSWorkspaceState.json
@@ -0,0 +1,6 @@
+{
+ "ExpandedNodes": [
+ ""
+ ],
+ "PreviewInSolutionExplorer": false
+}
\ No newline at end of file
diff --git a/src/.vs/nba1/FileContentIndex/7f326b57-3abb-46fe-9592-dd24180f7e3d.vsidx b/src/.vs/nba1/FileContentIndex/7f326b57-3abb-46fe-9592-dd24180f7e3d.vsidx
new file mode 100644
index 0000000..87e48bb
Binary files /dev/null and b/src/.vs/nba1/FileContentIndex/7f326b57-3abb-46fe-9592-dd24180f7e3d.vsidx differ
diff --git a/src/.vs/nba1/FileContentIndex/read.lock b/src/.vs/nba1/FileContentIndex/read.lock
new file mode 100644
index 0000000..e69de29
diff --git a/src/.vs/nba1/v17/.suo b/src/.vs/nba1/v17/.suo
new file mode 100644
index 0000000..94dccca
Binary files /dev/null and b/src/.vs/nba1/v17/.suo differ
diff --git a/src/.vs/slnx.sqlite b/src/.vs/slnx.sqlite
new file mode 100644
index 0000000..605c1d9
Binary files /dev/null and b/src/.vs/slnx.sqlite differ
diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json
new file mode 100644
index 0000000..6f3a291
--- /dev/null
+++ b/src/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "liveServer.settings.port": 5501
+}
\ No newline at end of file
diff --git a/src/NBAPlayer.py b/src/NBAPlayer.py
new file mode 100644
index 0000000..43ca571
--- /dev/null
+++ b/src/NBAPlayer.py
@@ -0,0 +1,160 @@
+import re
+import urllib.request,urllib.error
+import xlwt
+import sqlite3
+import socket
+import time
+import json
+
+def main(): #主程序
+ print("开始爬取.....")
+ year=2010 #起始年份
+ baseurl='https://china.nba.com/static/data/league/playerstats_All_All_All_0_All_false_2018_2_All_Team_points_All_perGame.json'
+ #获得数据
+ NBAPlayerdatadict=getdata(baseurl,year)
+ #所需信息的抬头列表
+ cols_index2 = ['displayName',"code", 'position', 'name',"code",'games',
+ 'points', 'pointsPg', 'rebsPg', 'assistsPg',
+ 'minsPg', 'fgpct', 'tppct', 'ftpct', 'blocksPg',
+ 'foulsPg', 'height', 'weight'
+ ]
+ cols_index1 = ['playerProfile','playerProfile', 'playerProfile', 'teamProfile',
+ 'teamProfile', 'statAverage',
+ 'statTotal', 'statAverage', 'statAverage', 'statAverage',
+ 'statAverage', 'statAverage', 'statAverage', 'statAverage',
+ 'statAverage', 'statAverage', 'playerProfile', 'playerProfile'
+ ]
+ #保存数据
+ savepath='.//'+str(year)+'年-2020年NBA球员数据排行TOP50.xls'
+ savedata(NBAPlayerdatadict,savepath,year,cols_index1,cols_index2)
+ #数据库位置
+ dbpath='.//NBA球员数据库.db'
+ #将数据保存到数据库
+ saveDB(NBAPlayerdatadict,dbpath,year,cols_index1,cols_index2)
+ print('成功爬取并保存数据!')
+def getdata(baseurl,year): #爬取网页获得需要的数据
+ Playerdatadict={}
+ for i in range(year,2020):
+ #创建模式匹配更换url获取不同年份的data
+ pattern_date = re.compile(r'(_\d*?_\d)', re.S)
+ newbaseurl = re.sub(pattern_date, '_'+str(i)+'_2', baseurl)
+ html=askUrl(newbaseurl)
+ # 将html中的文件进行json解析得到Playerdata字典
+ Playerdata=json.loads(html)
+ # 将Playerdata放大字典中并带上年份
+ Playerdatadict.setdefault(str(i)+"年", {}).update(Playerdata)
+ time.sleep(0.05) # 设置爬虫间隔
+ print('成功获取数据!')
+ return Playerdatadict
+def savedata(Playerdatadict,savepath,year,cols_index1,cols_index2): #保存数据到Excel
+ cols=['排名','球员','球员链接','位置','球队','球队链接',
+ '出场数','赛季得分','场均得分','场均篮板',
+ '场均助攻','分钟','命中率','三分命中率(%)',
+ '罚球命中率','场均盖帽','场均失误','身高(m)','体重']
+ workbook = xlwt.Workbook(encoding='UTF-8') # 创建workbook
+ for i in range(year, 2020):
+ worksheet = workbook.add_sheet(str(i) + '年') # 创建工作表
+ for j in range(len(cols)):
+ worksheet.write(0,j,cols[j])
+ for k in range(len(Playerdatadict[str(i) + '年']['payload']['players'])):
+ worksheet.write(k + 1, 0, k + 1)
+ for n in range(len(cols_index1)):
+ p_link = r'https://china.nba.com/players/#!/'
+ t_link = r'https://china.nba.com/'
+ # 从Playerdatadict将有效信息取出来
+ Playerdatadict_info = Playerdatadict[str(i) + "年"]['payload']['players'][k][cols_index1[n]][
+ cols_index2[n]]
+ if n != 1 and n != 4:
+ worksheet.write(k + 1, n + 1, Playerdatadict_info)
+ elif n == 1: # 球员链接+str(link)
+ worksheet.write(k + 1, n + 1, p_link + Playerdatadict_info)
+ else:
+ worksheet.write(k + 1, n + 1, t_link + Playerdatadict_info)
+ workbook.save(savepath)
+ print('保存数据成功!')
+def askUrl(url): #获得请求得到一个html(字符串的形式)
+ headers={ #伪装身份信息
+ 'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.03987.122Safari / 537.36'
+ }
+ request = urllib.request.Request(url,headers=headers)
+ html=''
+ try:
+ response=urllib.request.urlopen(request) #提交
+ html=response.read().decode('UTF-8')
+ print("成功爬取到html!")
+ except urllib.error.URLError as e:
+ if hasattr(e, "code"):
+ print(e.code)
+ if hasattr(e, "reason"):
+ print(e.reason)
+ if isinstance(e.reason, socket.timeout):
+ print('time out!')
+ return html
+def saveDB(Playerdatadict,dbpath,year,cols_index1,cols_index2): #保存数据到数据库
+ for i in range(year, 2020):
+ #表的名称
+ tablename="球员数据"+str(i)+'年'
+ #初始化数据库
+ initDB(tablename,dbpath)
+ con=sqlite3.connect(dbpath)
+ c=con.cursor()
+ #Playerdatadict_info为从Playerdatadict字典里面提取到的有用信息
+ Playerdatadict_info = Playerdatadict[str(i) + "年"]['payload']['players']
+ for j in range(len(Playerdatadict_info)): #球员信息个数len(Playerdatadict_info)
+ data_need = [] # 每一行所需信息
+ for k in range(len(cols_index1)):
+ # 从Playerdatadict将有效信息取出来
+ info = Playerdatadict_info[j][cols_index1[k]][cols_index2[k]]
+ p_link = r'https://china.nba.com/players/#!/'
+ t_link = r'https://china.nba.com/'
+ if k!= 1 and k!= 4:
+ data_need.append(str(info))
+ elif k==1:
+ data_need.append(p_link+str(info))
+ else:
+ data_need.append(t_link + str(info))
+ for index in range(len(data_need)):
+ data_need[index] = '"' + data_need[index] + '"'
+ sql = '''
+ insert into '''+str(tablename)+'''(
+ name,name_link,position,teamname,team_link,games,points,averpoints,averrebound,averassist,minutes,fgpct,tppct,ftpct,averblocks,averfouls,height,weight)
+ values (%s)'''%(",".join(data_need))
+ c.execute(sql)
+ con.commit()
+ c.close()
+ con.close()
+ initDB(str(year)+'',dbpath)
+ print('数据成功保存到数据库!')
+def initDB(tablename,dbpath):
+ sql = '''
+ create table ''' + str(tablename) + '''(
+ ranking integer primary key autoincrement,
+ name text,
+ name_link text,
+ position text,
+ teamname text,
+ team_link text,
+ games integer ,
+ points integer ,
+ averpoints integer ,
+ averrebound integer,
+ averassist integer ,
+ minutes integer ,
+ fgpct integer,
+ tppct integer,
+ ftpct integer ,
+ averblocks integer ,
+ averfouls integer,
+ height integer,
+ weight text
+ );
+ '''
+ con = sqlite3.connect(dbpath) # 连接数据库
+ c = con.cursor() # 创建游标
+ c.execute(sql)
+ con.commit()
+ c.close()
+ con.close()
+ print('表' + str(tablename) + "创建成功!")
+if __name__ == '__main__':
+ main()
\ No newline at end of file
diff --git a/src/NBAwordcloud.py b/src/NBAwordcloud.py
new file mode 100644
index 0000000..89b4abe
--- /dev/null
+++ b/src/NBAwordcloud.py
@@ -0,0 +1,77 @@
+import random
+import jieba
+import sqlite3
+import numpy as np
+from PIL import Image
+from wordcloud import WordCloud
+from matplotlib import pyplot as plt
+
+def random_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None):
+ h = random.randint(150, 250)
+ s = int(100.0 * 255.0 / 255.0)
+ l = int(100.0 * float(random.randint(60, 120)) / 255.0)
+ return "hsl({}, {}%, {}%)".format(h, s, l)
+# 起始年份
+year = 2010
+# 存放字符的字符串
+con = sqlite3.connect('D:\\Desktop\\nba1\\NBA球员数据库.db')
+c = con.cursor()
+text = ''
+for i in range(year, 2020):
+ sql = '''
+ select name from 球员数据''' + str(i) + '''年
+ '''
+ data = c.execute(sql)
+ for item in data:
+ text += item[0]
+cut = jieba.cut(text)
+string = ",".join(cut)
+print(string)
+img = Image.open(r'D:\Desktop\nba1\static\assets\img\NBA.png') # 打开图片
+img_array = np.array(img) # 将图片转化为数组
+wc = WordCloud(
+ background_color='blue',
+ mask=img_array,
+ font_path="/font/msyh.ttc",
+ color_func=random_color_func
+)
+wc.generate_from_text(string)
+# 绘制图片
+fig = plt.figure(1)
+plt.imshow(wc)
+plt.axis('off')
+plt.savefig(r'D:\Desktop\nba1\static\assets\img\namecloud.png', dpi=1000)
+
+# 起始年份
+year = 2010
+con = sqlite3.connect("D:\\Desktop\\nba1\\NBA球员数据库.db")
+c = con.cursor()
+# 存放字符的字符串
+text = ''
+for i in range(year, 2020):
+ sql = '''
+ select teamname from 球员数据''' + str(i) + '''年
+ '''
+ data = c.execute(sql)
+ for item in data:
+ text += item[0]
+cut = jieba.cut(text)
+string = ",".join(cut)
+print(string)
+c.close()
+con.close()
+img = Image.open(r'D:\Desktop\nba1\static\assets\img\乔1.jpg') # 打开图片
+img_array = np.array(img) # 将图片转化为数组
+wc = WordCloud(
+ background_color='white',
+ mask=img_array,
+ font_path="/font/msyh.ttc",
+ color_func=random_color_func
+)
+wc.generate_from_text(string)
+# 绘制图片
+fig = plt.figure(2)
+plt.imshow(wc)
+plt.axis('off')
+plt.savefig(r'D:\Desktop\nba1\static\assets\img\teamcloud.png', dpi=900)
+#plt.show()
\ No newline at end of file
diff --git a/src/NBA球员数据库.db b/src/NBA球员数据库.db
new file mode 100644
index 0000000..e69de29
diff --git a/src/README.md b/src/README.md
new file mode 100644
index 0000000..ed15406
--- /dev/null
+++ b/src/README.md
@@ -0,0 +1,2 @@
+nba球队胜率预测
+NBA球员数据可视化
diff --git a/src/app.py b/src/app.py
new file mode 100644
index 0000000..2e264ad
--- /dev/null
+++ b/src/app.py
@@ -0,0 +1,73 @@
+from flask import Flask,render_template,request
+import sqlite3
+app = Flask(__name__)
+@app.route('/')
+def welcome():
+ return render_template('index.html')
+@app.route('/index')
+def index():
+ return welcome()
+@app.route('/top50')
+def top50():
+ datalist = []
+ con = sqlite3.connect("NBA球员数据库.db")
+ c = con.cursor()
+ #设置当前页数
+ page=int(request.args.get('page',1))
+ year=int(page)+2009
+ sql= '''
+ select * from 球员数据'''+str(year)+'''年
+ '''
+ data=c.execute(sql)
+ for item in data:
+ datalist.append(item)
+ c.close()
+ con.close()
+ # 设置总页码数
+ pagemax = 10
+ return render_template('top50.html',datalist=datalist,page=page,pagemax=pagemax)
+@app.route('/cloud')
+def cloud():
+ return render_template('cloud.html')
+@app.route('/chart')
+def chart():
+ datalist = []
+ years=[] #年份
+ xx=[]#x坐标数据
+ #存放球队的名称的列表
+ team=[['76人'], ['公牛'], ['凯尔特人'], ['勇士'], ['国王'], ['太阳'], ['奇才'], ['小牛'], ['尼克斯'], ['开拓者'], ['快船'], ['掘金'], ['森林狼'], ['步行者'], ['活塞'], ['湖人'], ['火箭'], ['灰熊'], ['热火'], ['爵士'], ['猛龙'], ['篮网'], ['老鹰'], ['雄鹿'], ['雷霆'], ['马刺'], ['骑士'], ['魔术'], ['鹈鹕'], ['黄蜂']]
+ #存放球队名称的字符串
+ # 存放字符的字符串
+ text = ''
+ con = sqlite3.connect("NBA球员数据库.db")
+ c = con.cursor()
+ # 设置当前页数
+ page = 1
+ year = int(page) + 2009
+ for i in range(year, 2020):
+ data_peryear = []
+ years.append(i)
+ sql = '''
+ select * from 球员数据''' + str(i) + '''年
+ '''
+ data = c.execute(sql)
+ for item in data:
+ data_peryear.append(item)
+ #将球队名称练成字符串
+ text += item[4]
+ datalist.append(data_peryear)
+ for index in range(10):
+ xx.append(str(index+2010)+str(datalist[index][0][1]))
+ c.close()
+ con.close()
+ #利用字符串统计球队名称出现的次数
+ for i in range(len(team)):
+ number=text.count(team[i][0])
+ team[i].append(str(number))
+ return render_template('chart.html', datalist=datalist, years=years, xx=xx, team=team)
+@app.route('/team')
+def team():
+ return render_template('team.html')
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/src/db.db b/src/db.db
new file mode 100644
index 0000000..70da041
Binary files /dev/null and b/src/db.db differ
diff --git a/src/predict.py b/src/predict.py
new file mode 100644
index 0000000..d35d9ce
--- /dev/null
+++ b/src/predict.py
@@ -0,0 +1,142 @@
+import pandas as pd
+import math
+import numpy as np
+import csv
+from sklearn import linear_model
+from sklearn.model_selection import cross_val_score
+
+init_elo = 1600 # 初始化elo值
+team_elos = {}
+folder = '"D:\Desktop\nba1\"' # 文件路径
+
+def PruneData(M_stat, O_stat, T_stat):
+ #这个函数要完成的任务在于将原始读入的诸多队伍的数据经过修剪,使其变为一个以team为索引的排列的特征数据
+ #丢弃与球队实力无关的统计量
+ pruneM = M_stat.drop(['Rk', 'Arena'],axis = 1)
+ pruneO = O_stat.drop(['Rk','G','MP'],axis = 1)
+ pruneT = T_stat.drop(['Rk','G','MP'],axis = 1)
+
+ #将多个数据通过相同的index:team合并为一个数据
+ mergeMO = pd.merge(pruneM, pruneO, how = 'left', on = 'Team')
+ newstat = pd.merge(mergeMO, pruneT, how = 'left', on = 'Team')
+
+ #将team作为index的数据返回
+ return newstat.set_index('Team', drop = True, append = False)
+
+def GetElo(team):
+ # 初始化每个球队的elo等级分
+ try:
+ return team_elos[team]
+ except:
+ team_elos[team] = init_elo
+ return team_elos[team]
+
+def CalcElo(winteam, loseteam):
+ # winteam, loseteam的输入应为字符串
+ # 给出当前两个队伍的elo分数
+ R1 = GetElo(winteam)
+ R2 = GetElo(loseteam)
+ # 计算比赛后的等级分,参考elo计算公式
+ E1 = 1/(1 + math.pow(10,(R2 - R1)/400))
+ E2 = 1/(1 + math.pow(10,(R1 - R2)/400))
+ if R1>=2400:
+ K=16
+ elif R1<=2100:
+ K=32
+ else:
+ K=24
+ R1new = round(R1 + K*(1 - E1))
+ R2new = round(R2 + K*(0 - E2))
+ return R1new, R2new
+
+def GenerateTrainData(stat, trainresult):
+ #将输入构造为[[team1特征,team2特征],...[]...]
+ X = []
+ y = []
+ for index, rows in trainresult.iterrows():
+ winteam = rows['WTeam']
+ loseteam = rows['LTeam']
+ #获取最初的elo或是每个队伍最初的elo值
+ winelo = GetElo(winteam)
+ loseelo = GetElo(loseteam)
+ # 给主场比赛的队伍加上100的elo值
+ if rows['WLoc'] == 'H':
+ winelo = winelo+100
+ else:
+ loseelo = loseelo+100
+ # 把elo当为评价每个队伍的第一个特征值
+ fea_win = [winelo]
+ fea_lose = [loseelo]
+ # 添加我们从basketball reference.com获得的每个队伍的统计信息
+ for key, value in stat.loc[winteam].iteritems():
+ fea_win.append(value)
+ for key, value in stat.loc[loseteam].iteritems():
+ fea_lose.append(value)
+ # 将两支队伍的特征值随机的分配在每场比赛数据的左右两侧
+ # 并将对应的0/1赋给y值
+ if np.random.random() > 0.5:
+ X.append(fea_win+fea_lose)
+ y.append(0)
+ else:
+ X.append(fea_lose+fea_win)
+ y.append(1)
+ # 更新team elo分数
+ win_new_score, lose_new_score = CalcElo(winteam, loseteam)
+ team_elos[winteam] = win_new_score
+ team_elos[loseteam] = lose_new_score
+ # nan_to_num(x)是使用0代替数组x中的nan元素,使用有限的数字代替inf元素
+ return np.nan_to_num(X),y
+
+def GeneratePredictData(stat,info):
+ X=[]
+ #遍历所有的待预测数据,将数据变换为特征形式
+ for index, rows in stat.iterrows():
+
+ #首先将elo作为第一个特征
+ team1 = rows['Vteam']
+ team2 = rows['Hteam']
+ elo_team1 = GetElo(team1)
+ elo_team2 = GetElo(team2)
+ fea1 = [elo_team1]
+ fea2 = [elo_team2+100]
+ #球队统计信息作为剩余特征
+ for key, value in info.loc[team1].iteritems():
+ fea1.append(value)
+ for key, value in info.loc[team2].iteritems():
+ fea2.append(value)
+ #两队特征拼接
+ X.append(fea1 + fea2)
+ #nan_to_num的作用:1将列表变换为array,2.去除X中的非数字,保证训练器读入不出问题
+ return np.nan_to_num(X)
+
+if __name__ == '__main__':
+ # 设置导入数据表格文件的地址并读入数据
+ M_stat = pd.read_csv(folder + '/20-21Miscellaneous_Stat.csv')
+ O_stat = pd.read_csv(folder + '/20-21Opponent_Per_Game_Stat.csv')
+ T_stat = pd.read_csv(folder + '/20-21Team_Per_Game_Stat.csv')
+ team_result = pd.read_csv(folder + '/2020-2021_result.csv')
+
+ teamstat = PruneData(M_stat, O_stat, T_stat)
+ X,y = GenerateTrainData(teamstat, team_result)
+
+ # 训练网格模型
+ limodel = linear_model.LogisticRegression()
+ limodel.fit(X,y)
+
+ # 10折交叉验证
+ print(cross_val_score(model, X, y, cv=10, scoring='accuracy', n_jobs=-1).mean())
+
+ # 预测
+ pre_data = pd.read_csv(folder + '/21-22Schedule.csv')
+ pre_X = GeneratePredictData(pre_data, teamstat)
+ pre_y = limodel.predict_proba(pre_X)
+ predictlist = []
+ for index, rows in pre_data.iterrows():
+ reslt = [rows['Vteam'], pre_y[index][0], rows['Hteam'], pre_y[index][1]]
+ predictlist.append(reslt)
+
+ # 将预测结果输出保存为csv文件
+ with open(folder+'/prediction of 2021-2022.csv', 'w',newline='') as f:
+ writers = csv.writer(f)
+ writers.writerow(['Visit Team', 'corresponding probability of winning', 'Home Team', 'corresponding probability of winning'])
+ writers.writerows(predictlist)
diff --git a/src/predict.spider.py b/src/predict.spider.py
new file mode 100644
index 0000000..a6be1ba
--- /dev/null
+++ b/src/predict.spider.py
@@ -0,0 +1,197 @@
+import requests
+import re
+import csv
+from parsel import Selector
+
+class NBASpider:
+
+ def __init__(self):
+ self.url = "https://www.basketball-reference.com/leagues/NBA_2021.html"
+ self.schedule_url = "https://www.basketball-reference.com/leagues/NBA_2016_games-{}.html"
+ self.advanced_team_url = "https://www.basketball-reference.com/leagues/NBA_2016.html"
+ self.headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 "
+ "Safari/537.36"
+ }
+
+ # 发送请求,获取数据
+ def send(self, url):
+ response = requests.get(url, headers=self.headers, timeout=30)
+ response.encoding = 'utf-8'
+ return response.text
+
+ # 解析html
+ def parse(self, html):
+ team_heads, team_datas = self.get_team_info(html)
+ opponent_heads, opponent_datas = self.get_opponent_info(html)
+ return team_heads, team_datas, opponent_heads, opponent_datas
+
+ def get_team_info(self, html):
+ """
+ 通过正则从获取到的html页面数据中team表的表头和各行数据
+ :param html 爬取到的页面数据
+ :return: team_heads表头
+ team_datas 列表内容
+ """
+ # 1. 正则匹配数据所在的table
+ team_table = re.search('
(.*?)', html, re.S).group(1)
+ # 2. 正则从table中匹配出表头
+ team_head = re.search('(.*?)', team_table, re.S).group(1)
+ team_heads = re.findall('(.*?)', team_head, re.S)
+ # 3. 正则从table中匹配出表的各行数据
+ team_datas = self.get_datas(team_table)
+
+ return team_heads, team_datas
+
+ # 解析opponent数据
+ def get_opponent_info(self, html):
+ """
+ 通过正则从获取到的html页面数据中opponent表的表头和各行数据
+ :param html 爬取到的页面数据
+ :return:
+ """
+ # 1. 正则匹配数据所在的table
+ opponent_table = re.search('(.*?)', html, re.S).group(1)
+ # 2. 正则从table中匹配出表头
+ opponent_head = re.search('(.*?)', opponent_table, re.S).group(1)
+ opponent_heads = re.findall('(.*?)', opponent_head, re.S)
+ # 3. 正则从table中匹配出表的各行数据
+ opponent_datas = self.get_datas(opponent_table)
+
+ return opponent_heads, opponent_datas
+
+ # 获取表格body数据
+ def get_datas(self, table_html):
+ """
+ 从tboday数据中解析出实际数据(去掉页面标签)
+ :param table_html 解析出来的table数据
+ :return:
+ """
+ tboday = re.search('(.*?)', table_html, re.S).group(1)
+ contents = re.findall('(.*?)', tboday, re.S)
+ for oc in contents:
+ rk = re.findall('(.*?)', oc)
+ datas = re.findall('(.*?)', oc, re.S)
+ datas[0] = re.search('(.*?)', datas[0]).group(1)
+ datas.insert(0, rk[0])
+ # yield 声明这个方法是一个生成器, 返回的值是datas
+ yield datas
+
+ def get_schedule_datas(self, table_html):
+ """
+ 从tboday数据中解析出实际数据(去掉页面标签)
+ :param table_html 解析出来的table数据
+ :return:
+ """
+ tboday = re.search('(.*?)', table_html, re.S).group(1)
+ contents = re.findall('(.*?)', tboday, re.S)
+ for oc in contents:
+ rk = re.findall('(.*?)', oc)
+ datas = re.findall('(.*?)', oc, re.S)
+ if datas and len(datas) > 0:
+ datas[1] = re.search('(.*?)', datas[1]).group(1)
+ datas[3] = re.search('(.*?)', datas[3]).group(1)
+ datas[5] = re.search('(.*?)', datas[5]).group(1)
+
+ datas.insert(0, rk[0])
+ # yield 声明这个方法是一个生成器, 返回的值是datas
+ yield datas
+
+ def get_advanced_team_datas(self, table):
+ trs = table.xpath('./tbody/tr')
+ for tr in trs:
+ rk = tr.xpath('./th/text()').get()
+ datas = tr.xpath('./td[@data-stat!="DUMMY"]/text()').getall()
+ datas[0] = tr.xpath('./td/a/text()').get()
+ datas.insert(0, rk)
+ yield datas
+
+ def parse_schedule_info(self, html):
+ """
+ 通过正则从获取到的html页面数据中的表头和各行数据
+ :param html 爬取到的页面数据
+ :return: heads表头
+ datas 列表内容
+ """
+ # 1. 正则匹配数据所在的table
+ table = re.search('(.*?)', html, re.S).group(1)
+ table = table + ""
+ # 2. 正则从table中匹配出表头
+ head = re.search('(.*?)', table, re.S).group(1)
+ heads = re.findall('(.*?)', head, re.S)
+ # 3. 正则从table中匹配出表的各行数据
+ datas = self.get_schedule_datas(table)
+
+ return heads, datas
+
+ def parse_advanced_team(self, html):
+ """
+ 通过xpath从获取到的html页面数据中表头和各行数据
+ :param html 爬取到的页面数据
+ :return: heads表头
+ datas 列表内容
+ """
+
+ selector = Selector(text=html)
+ # 1. 获取对应的table
+ table = selector.xpath('//table[@id="advanced-team"]')
+ # 2. 从table中匹配出表头
+ res = table.xpath('./thead/tr')[1].xpath('./th/text()').getall()
+ heads = []
+ for i, head in enumerate(res):
+ if '\xa0' in head:
+ continue
+ heads.append(head)
+ # 3. 匹配出表的各行数据
+ table_data = self.get_advanced_team_datas(table)
+ return heads, table_data
+
+ # 存储成csv文件
+ def save_csv(self, title, heads, rows):
+ f = open(title + '.csv', mode='w', encoding='utf-8', newline='')
+ csv_writer = csv.writer(f)
+ csv_writer.writerow(heads)
+ for row in rows:
+ csv_writer.writerow(row)
+
+ f.close()
+
+ def crawl_team_opponent(self):
+ # 1. 发送请求
+ res = self.send(self.url)
+ # 2. 解析数据
+ team_heads, team_datas, opponent_heads, opponent_datas = self.parse(res)
+ # 3. 保存数据为csv
+ self.save_csv("team", team_heads, team_datas)
+ self.save_csv("opponent", opponent_heads, opponent_datas)
+
+ def crawl_schedule(self):
+ months = ["october", "november", "december", "january", "february", "march", "april", "may", "june"]
+ for month in months:
+ html = self.send(self.schedule_url.format(month))
+ # print(html)
+ heads, datas = self.parse_schedule_info(html)
+ # 3. 保存数据为csv
+ self.save_csv("schedule_"+month, heads, datas)
+
+ def crawl_advanced_team(self):
+ # 1. 发送请求
+ res = self.send(self.advanced_team_url)
+ # 2. 解析数据
+ heads, datas = self.parse_advanced_team(res)
+ # 3. 保存数据为csv
+ self.save_csv("advanced_team", heads, datas)
+
+ def crawl(self):
+ # 1. 爬取各队伍信息
+ # self.crawl_team_opponent()
+ # 2. 爬取计划表
+ # self.crawl_schedule()
+ # 3. 爬取Advanced Team表
+ self.crawl_advanced_team()
+
+if __name__ == '__main__':
+ # 运行爬虫
+ spider = NBASpider()
+ spider.crawl()
+
diff --git a/src/static/assets/css/style.css b/src/static/assets/css/style.css
new file mode 100644
index 0000000..933f675
--- /dev/null
+++ b/src/static/assets/css/style.css
@@ -0,0 +1,1474 @@
+/**
+* Template Name: Day - v2.1.0
+* Template URL: https://bootstrapmade.com/day-multipurpose-html-template-for-free/
+* Author: BootstrapMade.com
+* License: https://bootstrapmade.com/license/
+*/
+
+/*--------------------------------------------------------------
+# General
+--------------------------------------------------------------*/
+body {
+ font-family: "Open Sans", sans-serif;
+ color: #444444;
+}
+
+a {
+ color: #cc1616;
+}
+
+a:hover {
+ color: #e82d2d;
+ text-decoration: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Raleway", sans-serif;
+}
+
+/*--------------------------------------------------------------
+# Back to top button
+--------------------------------------------------------------*/
+.back-to-top {
+ position: fixed;
+ display: none;
+ right: 15px;
+ bottom: 15px;
+ z-index: 99999;
+}
+
+.back-to-top i {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ width: 40px;
+ height: 40px;
+ background: #cc1616;
+ color: #fff;
+ transition: all 0.4s;
+}
+
+.back-to-top i:hover {
+ background: #e72323;
+ color: #fff;
+}
+
+/*--------------------------------------------------------------
+# Preloader
+--------------------------------------------------------------*/
+#preloader {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
+ overflow: hidden;
+ background: #fff;
+}
+
+#preloader:before {
+ content: "";
+ position: fixed;
+ top: calc(50% - 30px);
+ left: calc(50% - 30px);
+ border: 6px solid #cc1616;
+ border-top-color: #efefef;
+ border-radius: 50%;
+ width: 60px;
+ height: 60px;
+ -webkit-animation: animate-preloader 1s linear infinite;
+ animation: animate-preloader 1s linear infinite;
+}
+
+@-webkit-keyframes animate-preloader {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes animate-preloader {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/*--------------------------------------------------------------
+# Disable aos animation delay on mobile devices
+--------------------------------------------------------------*/
+@media screen and (max-width: 768px) {
+ [data-aos-delay] {
+ transition-delay: 0 !important;
+ }
+}
+
+/*--------------------------------------------------------------
+# Top Bar
+--------------------------------------------------------------*/
+#topbar {
+ height: 40px;
+ font-size: 14px;
+ transition: all 0.5s;
+ color: rgba(255, 255, 255, 0.6);
+}
+
+#topbar.topbar-scrolled {
+ top: -40px;
+}
+
+#topbar .contact-info a {
+ line-height: 1;
+ color: rgba(255, 255, 255, 0.6);
+ transition: 0.3s;
+}
+
+#topbar .contact-info a:hover {
+ color: #fff;
+}
+
+#topbar .contact-info i {
+ color: #cc1616;
+ padding-right: 4px;
+}
+
+#topbar .contact-info i.icofont-phone {
+ margin-left: 15px;
+}
+
+#topbar .social-links a {
+ color: rgba(255, 255, 255, 0.5);
+ padding-left: 15px;
+ display: inline-block;
+ line-height: 1px;
+ transition: 0.3s;
+}
+
+#topbar .social-links a:hover {
+ color: #fff;
+}
+
+#topbar .social-links a:first-child {
+ border-left: 0;
+}
+
+/*--------------------------------------------------------------
+# Header
+--------------------------------------------------------------*/
+#header {
+ background: rgba(52, 58, 64, 0.2);
+ transition: all 0.5s;
+ z-index: 997;
+ top: 40px;
+}
+
+#header.header-scrolled {
+ top: 0;
+ background: rgba(0, 0, 0, 0.9);
+}
+
+#header .logo {
+ font-size: 32px;
+ margin: 0;
+ padding: 0;
+ line-height: 1;
+ font-weight: 700;
+ letter-spacing: 2px;
+ text-transform: uppercase;
+}
+
+#header .logo a {
+ color: #fff;
+}
+
+#header .logo img {
+ max-height: 40px;
+}
+
+@media (max-width: 992px) {
+ #header {
+ top: 0;
+ padding: 15px 0;
+ background: transparent;
+ }
+ #header .logo {
+ font-size: 28px;
+ }
+}
+
+.header-inner-pages {
+ background: rgba(0, 0, 0, 0.9) !important;
+}
+
+/*--------------------------------------------------------------
+# Navigation Menu
+--------------------------------------------------------------*/
+/* Desktop Navigation */
+.nav-menu ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.nav-menu > ul {
+ display: flex;
+}
+
+.nav-menu > ul > li {
+ position: relative;
+ white-space: nowrap;
+ padding: 18px 15px;
+ margin-left: 5px;
+ transition: 0.3s;
+}
+
+.nav-menu a {
+ display: block;
+ position: relative;
+ color: #fff;
+ transition: 0.3s;
+ font-size: 14px;
+ font-family: "Open Sans", sans-serif;
+}
+
+.nav-menu > ul > li:hover, .nav-menu .active {
+ background: #cc1616;
+}
+
+.nav-menu .drop-down ul {
+ display: block;
+ position: absolute;
+ left: 0;
+ top: calc(100% + 30px);
+ z-index: 99;
+ opacity: 0;
+ visibility: hidden;
+ padding: 10px 0;
+ background: #fff;
+ box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.25);
+ transition: 0.3s;
+}
+
+.nav-menu .drop-down:hover > ul {
+ opacity: 1;
+ top: 100%;
+ visibility: visible;
+}
+
+.nav-menu .drop-down li {
+ min-width: 180px;
+ position: relative;
+}
+
+.nav-menu .drop-down ul a {
+ padding: 10px 20px;
+ font-size: 14px;
+ font-weight: 500;
+ text-transform: none;
+ color: #191919;
+}
+
+.nav-menu .drop-down ul a:hover, .nav-menu .drop-down ul .active > a, .nav-menu .drop-down ul li:hover > a {
+ color: #e82d2d;
+}
+
+.nav-menu .drop-down > a:after {
+ content: "\ea99";
+ font-family: IcoFont;
+ padding-left: 5px;
+}
+
+.nav-menu .drop-down .drop-down ul {
+ top: 0;
+ left: calc(100% - 30px);
+}
+
+.nav-menu .drop-down .drop-down:hover > ul {
+ opacity: 1;
+ top: 0;
+ left: 100%;
+}
+
+.nav-menu .drop-down .drop-down > a {
+ padding-right: 35px;
+}
+
+.nav-menu .drop-down .drop-down > a:after {
+ content: "\eaa0";
+ font-family: IcoFont;
+ position: absolute;
+ right: 15px;
+}
+
+@media (max-width: 1366px) {
+ .nav-menu .drop-down .drop-down ul {
+ left: -90%;
+ }
+ .nav-menu .drop-down .drop-down:hover > ul {
+ left: -100%;
+ }
+ .nav-menu .drop-down .drop-down > a:after {
+ content: "\ea9d";
+ }
+}
+
+/* Mobile Navigation */
+.mobile-nav-toggle {
+ position: fixed;
+ right: 15px;
+ top: 15px;
+ z-index: 9998;
+ border: 0;
+ background: none;
+ font-size: 24px;
+ transition: all 0.4s;
+ outline: none !important;
+ line-height: 1;
+ cursor: pointer;
+ text-align: right;
+}
+
+.mobile-nav-toggle i {
+ color: #fff;
+}
+
+.mobile-nav {
+ position: fixed;
+ top: 55px;
+ right: 15px;
+ bottom: 15px;
+ left: 15px;
+ z-index: 9999;
+ overflow-y: auto;
+ background: #fff;
+ transition: ease-in-out 0.2s;
+ opacity: 0;
+ visibility: hidden;
+ border-radius: 10px;
+ padding: 10px 0;
+}
+
+.mobile-nav * {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.mobile-nav a {
+ display: block;
+ position: relative;
+ color: #191919;
+ padding: 10px 20px;
+ font-weight: 500;
+ outline: none;
+}
+
+.mobile-nav a:hover, .mobile-nav .active > a, .mobile-nav li:hover > a {
+ color: #e82d2d;
+ text-decoration: none;
+}
+
+.mobile-nav .drop-down > a:after {
+ content: "\ea99";
+ font-family: IcoFont;
+ padding-left: 10px;
+ position: absolute;
+ right: 15px;
+}
+
+.mobile-nav .active.drop-down > a:after {
+ content: "\eaa1";
+}
+
+.mobile-nav .drop-down > a {
+ padding-right: 35px;
+}
+
+.mobile-nav .drop-down ul {
+ display: none;
+ overflow: hidden;
+}
+
+.mobile-nav .drop-down li {
+ padding-left: 20px;
+}
+
+.mobile-nav-overly {
+ width: 100%;
+ height: 100%;
+ z-index: 9997;
+ top: 0;
+ left: 0;
+ position: fixed;
+ background: rgba(0, 0, 0, 0.6);
+ overflow: hidden;
+ display: none;
+ transition: ease-in-out 0.2s;
+}
+
+.mobile-nav-active {
+ overflow: hidden;
+}
+
+.mobile-nav-active .mobile-nav {
+ opacity: 1;
+ visibility: visible;
+}
+
+.mobile-nav-active .mobile-nav-toggle i {
+ color: #fff;
+}
+
+/*--------------------------------------------------------------
+# Hero Section
+--------------------------------------------------------------*/
+#hero {
+ width: 100%;
+ height: 100vh;
+ background: url("../img/科比.png") top center;
+ background-size: cover;
+ position: relative;
+}
+
+#hero:before {
+ content: "";
+ background: rgba(0, 0, 0, 0.5);
+ position: absolute;
+ bottom: 0;
+ top: 0;
+ left: 0;
+ right: 0;
+}
+
+#hero .container {
+ padding-top: 70px;
+}
+
+#hero h1 {
+ margin: 0 0 10px 0;
+ font-size: 48px;
+ font-weight: 700;
+ line-height: 56px;
+ text-transform: uppercase;
+ color: #fff;
+}
+
+#hero h2 {
+ color: #eee;
+ margin-bottom: 30px;
+ font-size: 24px;
+}
+
+#hero .btn-get-started {
+ font-family: "Raleway", sans-serif;
+ text-transform: uppercase;
+ font-weight: 500;
+ font-size: 14px;
+ letter-spacing: 0.5px;
+ display: inline-block;
+ padding: 10px 28px;
+ transition: 0.5s;
+ border: 2px solid #fff;
+ color: #fff;
+}
+
+#hero .btn-get-started:hover {
+ background: #cc1616;
+ border-color: #cc1616;
+}
+
+@media (min-width: 1024px) {
+ #hero {
+ background-attachment: fixed;
+ }
+}
+
+@media (max-width: 768px) {
+ #hero {
+ text-align: center;
+ }
+ #hero .container {
+ padding-top: 40px;
+ }
+ #hero h1 {
+ font-size: 28px;
+ line-height: 36px;
+ }
+ #hero h2 {
+ font-size: 18px;
+ line-height: 24px;
+ margin-bottom: 30px;
+ }
+}
+
+/*--------------------------------------------------------------
+# Sections General
+--------------------------------------------------------------*/
+section {
+ padding: 60px 0;
+ overflow: hidden;
+}
+
+.section-title {
+ text-align: center;
+ padding: 30px 0;
+ position: relative;
+}
+
+.section-title h2 {
+ font-size: 32px;
+ font-weight: 700;
+ text-transform: uppercase;
+ margin-bottom: 20px;
+ padding-bottom: 0;
+ color: #191919;
+ position: relative;
+ z-index: 2;
+}
+
+.section-title span {
+ position: absolute;
+ top: 30px;
+ color: #f4f4f4;
+ left: 0;
+ right: 0;
+ z-index: 1;
+ font-weight: 700;
+ font-size: 52px;
+ text-transform: uppercase;
+ line-height: 0;
+}
+
+.section-title p {
+ margin-bottom: 0;
+ position: relative;
+ z-index: 2;
+}
+
+@media (max-width: 575px) {
+ .section-title h2 {
+ font-size: 28px;
+ margin-bottom: 15px;
+ }
+ .section-title span {
+ font-size: 38px;
+ }
+}
+
+/*--------------------------------------------------------------
+# About
+--------------------------------------------------------------*/
+.about .content h3 {
+ font-weight: 600;
+ font-size: 26px;
+}
+
+.about .content ul {
+ list-style: none;
+ padding: 0;
+}
+
+.about .content ul li {
+ padding-bottom: 10px;
+}
+
+.about .content ul i {
+ font-size: 20px;
+ padding-right: 4px;
+ color: #cc1616;
+}
+
+.about .content p:last-child {
+ margin-bottom: 0;
+}
+
+/*--------------------------------------------------------------
+# Why Us
+--------------------------------------------------------------*/
+.why-us {
+ padding-top: 0;
+}
+
+.why-us .box {
+ padding: 50px 30px;
+ box-shadow: 0px 2px 15px rgba(0, 0, 0, 0.1);
+ transition: all ease-in-out 0.3s;
+}
+
+.why-us .box span {
+ display: block;
+ font-size: 28px;
+ font-weight: 700;
+ color: #ed5b5b;
+}
+
+.why-us .box h4 {
+ font-size: 24px;
+ font-weight: 600;
+ padding: 0;
+ margin: 20px 0;
+ color: #191919;
+}
+
+.why-us .box p {
+ color: #aaaaaa;
+ font-size: 15px;
+ margin: 0;
+ padding: 0;
+}
+
+.why-us .box:hover {
+ background: #cc1616;
+ padding: 30px 30px 70px 30px;
+ box-shadow: 10px 15px 30px rgba(0, 0, 0, 0.18);
+}
+
+.why-us .box:hover span, .why-us .box:hover h4, .why-us .box:hover p {
+ color: #fff;
+}
+
+/*--------------------------------------------------------------
+# Clients
+--------------------------------------------------------------*/
+.clients {
+ background: #f2f2f2;
+ padding: 15px 0;
+ text-align: center;
+}
+
+.clients img {
+ width: 50%;
+ -webkit-filter: grayscale(100);
+ filter: grayscale(100);
+ transition: all 0.4s ease-in-out;
+ display: inline-block;
+ padding: 15px 0;
+}
+
+.clients img:hover {
+ -webkit-filter: none;
+ filter: none;
+ transform: scale(1.2);
+}
+
+@media (max-width: 768px) {
+ .clients img {
+ width: 40%;
+ }
+}
+
+/*--------------------------------------------------------------
+# Services
+--------------------------------------------------------------*/
+.services .icon-box {
+ text-align: center;
+ padding: 80px 20px;
+ transition: all ease-in-out 0.3s;
+ box-shadow: 0px 2px 15px rgba(0, 0, 0, 0.1);
+}
+
+.services .icon-box .icon {
+ margin: 0 auto;
+ width: 64px;
+ height: 64px;
+ background: #cc1616;
+ transition: all .3s ease-out 0s;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 20px;
+ transform-style: preserve-3d;
+}
+
+.services .icon-box .icon i {
+ color: #fff;
+ font-size: 28px;
+}
+
+.services .icon-box .icon::before {
+ position: absolute;
+ content: '';
+ left: -8px;
+ top: -8px;
+ height: 100%;
+ width: 100%;
+ background: #fce5e5;
+ transition: all .3s ease-out 0s;
+ transform: translateZ(-1px);
+}
+
+.services .icon-box h4 {
+ font-weight: 700;
+ margin-bottom: 15px;
+ font-size: 24px;
+}
+
+.services .icon-box h4 a {
+ color: #191919;
+}
+
+.services .icon-box p {
+ line-height: 24px;
+ font-size: 14px;
+ margin-bottom: 0;
+}
+
+.services .icon-box:hover {
+ background: #cc1616;
+ border-color: #cc1616;
+ padding: 70px 20px 90px 20px;
+}
+
+.services .icon-box:hover .icon {
+ background: #fff;
+}
+
+.services .icon-box:hover .icon i {
+ color: #cc1616;
+}
+
+.services .icon-box:hover .icon::before {
+ background: #e82d2d;
+}
+
+.services .icon-box:hover h4 a, .services .icon-box:hover p {
+ color: #fff;
+}
+
+/*--------------------------------------------------------------
+# Cta
+--------------------------------------------------------------*/
+.cta {
+ background: linear-gradient(rgba(2, 2, 2, 0.5), rgba(0, 0, 0, 0.5)), url("../img/cta-bg.jpg") fixed center center;
+ background-size: cover;
+ padding: 120px 0;
+}
+
+.cta h3 {
+ color: #fff;
+ font-size: 28px;
+ font-weight: 700;
+}
+
+.cta p {
+ color: #fff;
+}
+
+.cta .cta-btn {
+ font-family: "Raleway", sans-serif;
+ text-transform: uppercase;
+ font-weight: 500;
+ font-size: 14px;
+ letter-spacing: 1px;
+ display: inline-block;
+ padding: 10px 28px;
+ transition: 0.5s;
+ margin-top: 10px;
+ border: 2px solid #fff;
+ color: #fff;
+}
+
+.cta .cta-btn:hover {
+ background: #cc1616;
+ border: 2px solid #cc1616;
+}
+
+/*--------------------------------------------------------------
+# Portfolio
+--------------------------------------------------------------*/
+.portfolio #portfolio-flters {
+ padding: 0;
+ margin: 0 auto 25px auto;
+ list-style: none;
+ text-align: center;
+ border-radius: 50px;
+}
+
+.portfolio #portfolio-flters li {
+ cursor: pointer;
+ display: inline-block;
+ padding: 10px 15px;
+ font-size: 15px;
+ font-weight: 500;
+ line-height: 1;
+ text-transform: uppercase;
+ color: #444444;
+ margin-bottom: 5px;
+ transition: all 0.3s ease-in-out;
+ font-family: "Poppins", sans-serif;
+}
+
+.portfolio #portfolio-flters li:hover, .portfolio #portfolio-flters li.filter-active {
+ color: #e82d2d;
+}
+
+.portfolio #portfolio-flters li:last-child {
+ margin-right: 0;
+}
+
+.portfolio .portfolio-item {
+ margin-bottom: 30px;
+}
+
+.portfolio .portfolio-item .portfolio-info {
+ opacity: 0;
+ position: absolute;
+ left: 30px;
+ right: 30px;
+ bottom: 0;
+ z-index: 3;
+ transition: all ease-in-out 0.3s;
+ background: rgba(255, 255, 255, 0.9);
+ padding: 15px;
+}
+
+.portfolio .portfolio-item .portfolio-info h4 {
+ font-size: 18px;
+ color: #fff;
+ font-weight: 600;
+ color: #191919;
+}
+
+.portfolio .portfolio-item .portfolio-info p {
+ color: #4c4c4c;
+ font-size: 14px;
+ margin-bottom: 0;
+}
+
+.portfolio .portfolio-item .portfolio-info .preview-link, .portfolio .portfolio-item .portfolio-info .details-link {
+ position: absolute;
+ right: 40px;
+ font-size: 24px;
+ top: calc(50% - 18px);
+ color: #333333;
+}
+
+.portfolio .portfolio-item .portfolio-info .preview-link:hover, .portfolio .portfolio-item .portfolio-info .details-link:hover {
+ color: #cc1616;
+}
+
+.portfolio .portfolio-item .portfolio-info .details-link {
+ right: 10px;
+}
+
+.portfolio .portfolio-item .portfolio-links {
+ opacity: 0;
+ left: 0;
+ right: 0;
+ text-align: center;
+ z-index: 3;
+ position: absolute;
+ transition: all ease-in-out 0.3s;
+}
+
+.portfolio .portfolio-item .portfolio-links a {
+ color: #fff;
+ margin: 0 2px;
+ font-size: 28px;
+ display: inline-block;
+ transition: 0.3s;
+}
+
+.portfolio .portfolio-item .portfolio-links a:hover {
+ color: #e82d2d;
+}
+
+.portfolio .portfolio-item:hover .portfolio-info {
+ opacity: 1;
+ bottom: 20px;
+}
+
+/*--------------------------------------------------------------
+# Pricing
+--------------------------------------------------------------*/
+.pricing .box {
+ padding: 20px;
+ background: #f9f9f9;
+ text-align: center;
+ border-radius: 8px;
+ position: relative;
+ overflow: hidden;
+}
+
+.pricing .box h3 {
+ font-weight: 400;
+ padding: 15px;
+ font-size: 18px;
+ text-transform: uppercase;
+ font-weight: 600;
+ color: #191919;
+}
+
+.pricing .box h4 {
+ font-size: 42px;
+ color: #cc1616;
+ font-weight: 500;
+ font-family: "Open Sans", sans-serif;
+ margin-bottom: 20px;
+}
+
+.pricing .box h4 sup {
+ font-size: 20px;
+ top: -15px;
+ left: -3px;
+}
+
+.pricing .box h4 span {
+ color: #bababa;
+ font-size: 16px;
+ font-weight: 300;
+}
+
+.pricing .box ul {
+ padding: 0;
+ list-style: none;
+ color: #191919;
+ text-align: center;
+ line-height: 20px;
+ font-size: 14px;
+}
+
+.pricing .box ul li {
+ padding-bottom: 16px;
+}
+
+.pricing .box ul i {
+ color: #cc1616;
+ font-size: 18px;
+ padding-right: 4px;
+}
+
+.pricing .box ul .na {
+ color: #ccc;
+ text-decoration: line-through;
+}
+
+.pricing .box .btn-wrap {
+ padding: 15px;
+ text-align: center;
+}
+
+.pricing .box .btn-buy {
+ background: #cc1616;
+ display: inline-block;
+ padding: 10px 40px;
+ color: #fff;
+ transition: none;
+ font-size: 14px;
+ font-weight: 400;
+ font-family: "Raleway", sans-serif;
+ font-weight: 600;
+ transition: 0.3s;
+}
+
+.pricing .box .btn-buy:hover {
+ background: #e82d2d;
+}
+
+.pricing .featured {
+ background: #cc1616;
+ box-shadow: none;
+ color: #fff;
+}
+
+.pricing .featured h3, .pricing .featured h4, .pricing .featured ul, .pricing .featured ul li, .pricing .featured ul .na {
+ color: #fff;
+}
+
+.pricing .featured h4 span {
+ color: rgba(255, 255, 255, 0.58);
+}
+
+.pricing .featured .btn-wrap {
+ padding: 15px;
+ text-align: center;
+}
+
+.pricing .featured .btn-buy {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.pricing .featured .btn-buy:hover {
+ background: #fff;
+ color: #cc1616;
+}
+
+/*--------------------------------------------------------------
+# Team
+--------------------------------------------------------------*/
+.team .member {
+ text-align: center;
+ margin-bottom: 20px;
+ box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.1);
+ padding: 30px 20px;
+ background: #fff;
+}
+
+.team .member img {
+ max-width: 60%;
+ border-radius: 50%;
+ margin: 0 0 30px 0;
+}
+
+.team .member h4 {
+ font-weight: 700;
+ margin-bottom: 2px;
+ font-size: 18px;
+}
+
+.team .member span {
+ font-style: italic;
+ display: block;
+ font-size: 13px;
+}
+
+.team .member p {
+ padding-top: 10px;
+ font-size: 14px;
+ font-style: italic;
+ color: #aaaaaa;
+}
+
+.team .member .social {
+ margin-top: 15px;
+}
+
+.team .member .social a {
+ color: #919191;
+ transition: 0.3s;
+}
+
+.team .member .social a:hover {
+ color: #cc1616;
+}
+
+.team .member .social i {
+ font-size: 18px;
+ margin: 0 2px;
+}
+
+/*--------------------------------------------------------------
+# Contact
+--------------------------------------------------------------*/
+.contact .info-box {
+ color: #444444;
+ text-align: center;
+ box-shadow: 0 0 30px rgba(214, 215, 216, 0.6);
+ padding: 20px 0 30px 0;
+}
+
+.contact .info-box i {
+ font-size: 32px;
+ color: #cc1616;
+ border-radius: 50%;
+ padding: 8px;
+ border: 2px dotted #f5a0a0;
+}
+
+.contact .info-box h3 {
+ font-size: 20px;
+ color: #777777;
+ font-weight: 700;
+ margin: 10px 0;
+}
+
+.contact .info-box p {
+ padding: 0;
+ line-height: 24px;
+ font-size: 14px;
+ margin-bottom: 0;
+}
+
+.contact .php-email-form {
+ box-shadow: 0 0 30px rgba(214, 215, 216, 0.6);
+ padding: 30px;
+}
+
+.contact .php-email-form .validate {
+ display: none;
+ color: red;
+ margin: 0 0 15px 0;
+ font-weight: 400;
+ font-size: 13px;
+}
+
+.contact .php-email-form .error-message {
+ display: none;
+ color: #fff;
+ background: #ed3c0d;
+ text-align: left;
+ padding: 15px;
+ font-weight: 600;
+}
+
+.contact .php-email-form .error-message br + br {
+ margin-top: 25px;
+}
+
+.contact .php-email-form .sent-message {
+ display: none;
+ color: #fff;
+ background: #18d26e;
+ text-align: center;
+ padding: 15px;
+ font-weight: 600;
+}
+
+.contact .php-email-form .loading {
+ display: none;
+ background: #fff;
+ text-align: center;
+ padding: 15px;
+}
+
+.contact .php-email-form .loading:before {
+ content: "";
+ display: inline-block;
+ border-radius: 50%;
+ width: 24px;
+ height: 24px;
+ margin: 0 10px -6px 0;
+ border: 3px solid #18d26e;
+ border-top-color: #eee;
+ -webkit-animation: animate-loading 1s linear infinite;
+ animation: animate-loading 1s linear infinite;
+}
+
+.contact .php-email-form input, .contact .php-email-form textarea {
+ border-radius: 0;
+ box-shadow: none;
+ font-size: 14px;
+}
+
+.contact .php-email-form input::focus, .contact .php-email-form textarea::focus {
+ background-color: #cc1616;
+}
+
+.contact .php-email-form input {
+ padding: 20px 15px;
+}
+
+.contact .php-email-form textarea {
+ padding: 12px 15px;
+}
+
+.contact .php-email-form button[type="submit"] {
+ background: #cc1616;
+ border: 0;
+ padding: 10px 24px;
+ color: #fff;
+ transition: 0.4s;
+}
+
+.contact .php-email-form button[type="submit"]:hover {
+ background: #e82d2d;
+}
+
+@-webkit-keyframes animate-loading {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes animate-loading {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/*--------------------------------------------------------------
+# Breadcrumbs
+--------------------------------------------------------------*/
+.breadcrumbs {
+ padding: 15px 0;
+ background: #efefef;
+ margin-top: 98px;
+}
+
+@media (max-width: 992px) {
+ .breadcrumbs {
+ margin-top: 50px;
+ }
+}
+
+.breadcrumbs h2 {
+ font-size: 26px;
+ font-weight: 600;
+}
+
+.breadcrumbs ol {
+ display: flex;
+ flex-wrap: wrap;
+ list-style: none;
+ padding: 0 0 10px 0;
+ margin: 0;
+ font-size: 14px;
+}
+
+.breadcrumbs ol li + li {
+ padding-left: 10px;
+}
+
+.breadcrumbs ol li + li::before {
+ display: inline-block;
+ padding-right: 10px;
+ color: #333333;
+ content: "/";
+}
+
+/*--------------------------------------------------------------
+# Portfolio Details
+--------------------------------------------------------------*/
+.portfolio-details {
+ padding-top: 40px;
+}
+
+.portfolio-details .portfolio-details-container {
+ position: relative;
+}
+
+.portfolio-details .portfolio-details-carousel {
+ position: relative;
+ z-index: 1;
+}
+
+.portfolio-details .portfolio-details-carousel .owl-nav, .portfolio-details .portfolio-details-carousel .owl-dots {
+ margin-top: 5px;
+ text-align: left;
+}
+
+.portfolio-details .portfolio-details-carousel .owl-dot {
+ display: inline-block;
+ margin: 0 10px 0 0;
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ background-color: #ddd !important;
+}
+
+.portfolio-details .portfolio-details-carousel .owl-dot.active {
+ background-color: #cc1616 !important;
+}
+
+.portfolio-details .portfolio-info {
+ padding: 30px;
+ position: absolute;
+ right: 0;
+ bottom: -70px;
+ background: #fff;
+ box-shadow: 0px 2px 15px rgba(0, 0, 0, 0.1);
+ z-index: 2;
+}
+
+.portfolio-details .portfolio-info h3 {
+ font-size: 22px;
+ font-weight: 700;
+ margin-bottom: 20px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid #eee;
+}
+
+.portfolio-details .portfolio-info ul {
+ list-style: none;
+ padding: 0;
+ font-size: 15px;
+}
+
+.portfolio-details .portfolio-info ul li + li {
+ margin-top: 10px;
+}
+
+.portfolio-details .portfolio-description {
+ padding-top: 50px;
+}
+
+.portfolio-details .portfolio-description h2 {
+ width: 50%;
+ font-size: 26px;
+ font-weight: 700;
+ margin-bottom: 20px;
+}
+
+.portfolio-details .portfolio-description p {
+ padding: 0 0 0 0;
+}
+
+@media (max-width: 768px) {
+ .portfolio-details .portfolio-info {
+ position: static;
+ margin-top: 30px;
+ }
+}
+
+/*--------------------------------------------------------------
+# Footer
+--------------------------------------------------------------*/
+#footer {
+ background: #0c0c0c;
+ padding: 0 0 30px 0;
+ color: #fff;
+ font-size: 14px;
+}
+
+#footer .footer-top {
+ padding: 60px 0 30px 0;
+}
+
+#footer .footer-top .footer-info {
+ margin-bottom: 15px;
+ background: #191919;
+ color: #fff;
+ border-top: 4px solid #cc1616;
+ text-align: center;
+ padding: 30px 20px;
+}
+
+#footer .footer-top .footer-info h3 {
+ font-size: 36px;
+ margin: 0 0 20px 0;
+ padding: 2px 0 2px 0;
+ line-height: 1;
+ font-weight: 700;
+}
+
+#footer .footer-top .footer-info p {
+ font-size: 14px;
+ line-height: 24px;
+ margin-bottom: 0;
+ font-family: "Raleway", sans-serif;
+}
+
+#footer .footer-top .social-links a {
+ font-size: 18px;
+ display: inline-block;
+ background: #262626;
+ color: #fff;
+ line-height: 1;
+ padding: 8px 0;
+ margin-right: 4px;
+ border-radius: 50%;
+ text-align: center;
+ width: 36px;
+ height: 36px;
+ transition: 0.3s;
+}
+
+#footer .footer-top .social-links a:hover {
+ background: #cc1616;
+ color: #fff;
+ text-decoration: none;
+}
+
+#footer .footer-top h4 {
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ position: relative;
+ padding-bottom: 12px;
+}
+
+#footer .footer-top .footer-links {
+ margin-bottom: 30px;
+}
+
+#footer .footer-top .footer-links ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+#footer .footer-top .footer-links ul i {
+ padding-right: 2px;
+ color: #ed5b5b;
+ font-size: 18px;
+ line-height: 1;
+}
+
+#footer .footer-top .footer-links ul li {
+ padding: 10px 0;
+ display: flex;
+ align-items: center;
+}
+
+#footer .footer-top .footer-links ul li:first-child {
+ padding-top: 0;
+}
+
+#footer .footer-top .footer-links ul a {
+ color: #fff;
+ transition: 0.3s;
+ display: inline-block;
+ line-height: 1;
+}
+
+#footer .footer-top .footer-links ul a:hover {
+ color: #eb4444;
+}
+
+#footer .footer-top .footer-newsletter form {
+ margin-top: 30px;
+ background: #fff;
+ padding: 6px 10px;
+ position: relative;
+ border-radius: 4;
+}
+
+#footer .footer-top .footer-newsletter form input[type="email"] {
+ border: 0;
+ padding: 4px;
+ width: calc(100% - 110px);
+}
+
+#footer .footer-top .footer-newsletter form input[type="submit"] {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ border: 0;
+ background: none;
+ font-size: 16px;
+ padding: 0 20px;
+ background: #cc1616;
+ color: #fff;
+ transition: 0.3s;
+ border-radius: 4;
+}
+
+#footer .footer-top .footer-newsletter form input[type="submit"]:hover {
+ background: #e82d2d;
+}
+
+#footer .copyright {
+ border-top: 1px solid #262626;
+ text-align: center;
+ padding-top: 30px;
+}
+
+#footer .credits {
+ padding-top: 5px;
+ text-align: center;
+ font-size: 13px;
+ color: #fff;
+}
+
+#footer .credits a {
+ color: #e82d2d;
+}
+
+@media (max-width: 575px) {
+ #footer .footer-top .footer-info {
+ margin: -20px 0 30px 0;
+ }
+}
diff --git a/src/static/assets/img/NBA.png b/src/static/assets/img/NBA.png
new file mode 100644
index 0000000..f2e7d42
Binary files /dev/null and b/src/static/assets/img/NBA.png differ
diff --git a/src/static/assets/img/clients/76人队.png b/src/static/assets/img/clients/76人队.png
new file mode 100644
index 0000000..abfab42
Binary files /dev/null and b/src/static/assets/img/clients/76人队.png differ
diff --git a/src/static/assets/img/clients/凯尔特人队.png b/src/static/assets/img/clients/凯尔特人队.png
new file mode 100644
index 0000000..214d90e
Binary files /dev/null and b/src/static/assets/img/clients/凯尔特人队.png differ
diff --git a/src/static/assets/img/clients/勇士队.png b/src/static/assets/img/clients/勇士队.png
new file mode 100644
index 0000000..9629901
Binary files /dev/null and b/src/static/assets/img/clients/勇士队.png differ
diff --git a/src/static/assets/img/clients/开拓者队.png b/src/static/assets/img/clients/开拓者队.png
new file mode 100644
index 0000000..d2ddfdc
Binary files /dev/null and b/src/static/assets/img/clients/开拓者队.png differ
diff --git a/src/static/assets/img/clients/湖人队.png b/src/static/assets/img/clients/湖人队.png
new file mode 100644
index 0000000..cbb19c9
Binary files /dev/null and b/src/static/assets/img/clients/湖人队.png differ
diff --git a/src/static/assets/img/clients/猛龙队.png b/src/static/assets/img/clients/猛龙队.png
new file mode 100644
index 0000000..6f6f73e
Binary files /dev/null and b/src/static/assets/img/clients/猛龙队.png differ
diff --git a/src/static/assets/img/clients/雄鹿队.png b/src/static/assets/img/clients/雄鹿队.png
new file mode 100644
index 0000000..ad9868f
Binary files /dev/null and b/src/static/assets/img/clients/雄鹿队.png differ
diff --git a/src/static/assets/img/cta-bg.jpg b/src/static/assets/img/cta-bg.jpg
new file mode 100644
index 0000000..05badaa
Binary files /dev/null and b/src/static/assets/img/cta-bg.jpg differ
diff --git a/src/static/assets/img/favicon.png b/src/static/assets/img/favicon.png
new file mode 100644
index 0000000..af5a48b
Binary files /dev/null and b/src/static/assets/img/favicon.png differ
diff --git a/src/static/assets/img/hero-bg.jpg b/src/static/assets/img/hero-bg.jpg
new file mode 100644
index 0000000..9436830
Binary files /dev/null and b/src/static/assets/img/hero-bg.jpg differ
diff --git a/src/static/assets/img/name.png b/src/static/assets/img/name.png
new file mode 100644
index 0000000..41bef2a
Binary files /dev/null and b/src/static/assets/img/name.png differ
diff --git a/src/static/assets/img/namecloud.png b/src/static/assets/img/namecloud.png
new file mode 100644
index 0000000..20d72a9
Binary files /dev/null and b/src/static/assets/img/namecloud.png differ
diff --git a/src/static/assets/img/players/lbj.jpg b/src/static/assets/img/players/lbj.jpg
new file mode 100644
index 0000000..bb2f455
Binary files /dev/null and b/src/static/assets/img/players/lbj.jpg differ
diff --git a/src/static/assets/img/players/乔丹2.jpg b/src/static/assets/img/players/乔丹2.jpg
new file mode 100644
index 0000000..5fd0c15
Binary files /dev/null and b/src/static/assets/img/players/乔丹2.jpg differ
diff --git a/src/static/assets/img/players/保罗.jpg b/src/static/assets/img/players/保罗.jpg
new file mode 100644
index 0000000..513c5c6
Binary files /dev/null and b/src/static/assets/img/players/保罗.jpg differ
diff --git a/src/static/assets/img/players/克莱.jpg b/src/static/assets/img/players/克莱.jpg
new file mode 100644
index 0000000..083a4eb
Binary files /dev/null and b/src/static/assets/img/players/克莱.jpg differ
diff --git a/src/static/assets/img/players/哈登.jpg b/src/static/assets/img/players/哈登.jpg
new file mode 100644
index 0000000..24e5d49
Binary files /dev/null and b/src/static/assets/img/players/哈登.jpg differ
diff --git a/src/static/assets/img/players/哈登1.jpg b/src/static/assets/img/players/哈登1.jpg
new file mode 100644
index 0000000..3785519
Binary files /dev/null and b/src/static/assets/img/players/哈登1.jpg differ
diff --git a/src/static/assets/img/players/大姚.jpg b/src/static/assets/img/players/大姚.jpg
new file mode 100644
index 0000000..cb8165b
Binary files /dev/null and b/src/static/assets/img/players/大姚.jpg differ
diff --git a/src/static/assets/img/players/库里.jpg b/src/static/assets/img/players/库里.jpg
new file mode 100644
index 0000000..e90b805
Binary files /dev/null and b/src/static/assets/img/players/库里.jpg differ
diff --git a/src/static/assets/img/players/库里1.jpg b/src/static/assets/img/players/库里1.jpg
new file mode 100644
index 0000000..77d6858
Binary files /dev/null and b/src/static/assets/img/players/库里1.jpg differ
diff --git a/src/static/assets/img/players/戴维斯.jpg b/src/static/assets/img/players/戴维斯.jpg
new file mode 100644
index 0000000..2a7b6ab
Binary files /dev/null and b/src/static/assets/img/players/戴维斯.jpg differ
diff --git a/src/static/assets/img/players/湖人.jpg b/src/static/assets/img/players/湖人.jpg
new file mode 100644
index 0000000..12b615e
Binary files /dev/null and b/src/static/assets/img/players/湖人.jpg differ
diff --git a/src/static/assets/img/players/火箭.jpg b/src/static/assets/img/players/火箭.jpg
new file mode 100644
index 0000000..1f4b2d4
Binary files /dev/null and b/src/static/assets/img/players/火箭.jpg differ
diff --git a/src/static/assets/img/players/科比.jpg b/src/static/assets/img/players/科比.jpg
new file mode 100644
index 0000000..9867b05
Binary files /dev/null and b/src/static/assets/img/players/科比.jpg differ
diff --git a/src/static/assets/img/players/詹姆斯.jpg b/src/static/assets/img/players/詹姆斯.jpg
new file mode 100644
index 0000000..41116c5
Binary files /dev/null and b/src/static/assets/img/players/詹姆斯.jpg differ
diff --git a/src/static/assets/img/players/韦德.jpg b/src/static/assets/img/players/韦德.jpg
new file mode 100644
index 0000000..52d54bb
Binary files /dev/null and b/src/static/assets/img/players/韦德.jpg differ
diff --git a/src/static/assets/img/team/team1.jpg b/src/static/assets/img/team/team1.jpg
new file mode 100644
index 0000000..f88c016
Binary files /dev/null and b/src/static/assets/img/team/team1.jpg differ
diff --git a/src/static/assets/img/team/team3.jpg b/src/static/assets/img/team/team3.jpg
new file mode 100644
index 0000000..fa8a849
Binary files /dev/null and b/src/static/assets/img/team/team3.jpg differ
diff --git a/src/static/assets/img/team/teamx.jpg b/src/static/assets/img/team/teamx.jpg
new file mode 100644
index 0000000..b6635a2
Binary files /dev/null and b/src/static/assets/img/team/teamx.jpg differ
diff --git a/src/static/assets/img/teamcloud.png b/src/static/assets/img/teamcloud.png
new file mode 100644
index 0000000..d752d5a
Binary files /dev/null and b/src/static/assets/img/teamcloud.png differ
diff --git a/src/static/assets/img/乔1.jpg b/src/static/assets/img/乔1.jpg
new file mode 100644
index 0000000..ff1114e
Binary files /dev/null and b/src/static/assets/img/乔1.jpg differ
diff --git a/src/static/assets/img/奖杯.png b/src/static/assets/img/奖杯.png
new file mode 100644
index 0000000..cd4888f
Binary files /dev/null and b/src/static/assets/img/奖杯.png differ
diff --git a/src/static/assets/img/科比.png b/src/static/assets/img/科比.png
new file mode 100644
index 0000000..519ea8b
Binary files /dev/null and b/src/static/assets/img/科比.png differ
diff --git a/src/static/assets/img/詹韦连线.png b/src/static/assets/img/詹韦连线.png
new file mode 100644
index 0000000..e55abb4
Binary files /dev/null and b/src/static/assets/img/詹韦连线.png differ
diff --git a/src/static/assets/js/JQuery.js b/src/static/assets/js/JQuery.js
new file mode 100644
index 0000000..8dc7395
--- /dev/null
+++ b/src/static/assets/js/JQuery.js
@@ -0,0 +1,16 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function (a, b) { "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function (a) { if (!a.document) throw new Error("jQuery requires a window with a document"); return b(a) } : b(a) }("undefined" != typeof window ? window : this, function (a, b) {
+ var c = [], d = a.document, e = c.slice, f = c.concat, g = c.push, h = c.indexOf, i = {}, j = i.toString, k = i.hasOwnProperty, l = {}, m = "1.12.4", n = function (a, b) { return new n.fn.init(a, b) }, o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, p = /^-ms-/, q = /-([\da-z])/gi, r = function (a, b) { return b.toUpperCase() }; n.fn = n.prototype = { jquery: m, constructor: n, selector: "", length: 0, toArray: function () { return e.call(this) }, get: function (a) { return null != a ? 0 > a ? this[a + this.length] : this[a] : e.call(this) }, pushStack: function (a) { var b = n.merge(this.constructor(), a); return b.prevObject = this, b.context = this.context, b }, each: function (a) { return n.each(this, a) }, map: function (a) { return this.pushStack(n.map(this, function (b, c) { return a.call(b, c, b) })) }, slice: function () { return this.pushStack(e.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, eq: function (a) { var b = this.length, c = +a + (0 > a ? b : 0); return this.pushStack(c >= 0 && b > c ? [this[c]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: g, sort: c.sort, splice: c.splice }, n.extend = n.fn.extend = function () { var a, b, c, d, e, f, g = arguments[0] || {}, h = 1, i = arguments.length, j = !1; for ("boolean" == typeof g && (j = g, g = arguments[h] || {}, h++), "object" == typeof g || n.isFunction(g) || (g = {}), h === i && (g = this, h--); i > h; h++)if (null != (e = arguments[h])) for (d in e) a = g[d], c = e[d], g !== c && (j && c && (n.isPlainObject(c) || (b = n.isArray(c))) ? (b ? (b = !1, f = a && n.isArray(a) ? a : []) : f = a && n.isPlainObject(a) ? a : {}, g[d] = n.extend(j, f, c)) : void 0 !== c && (g[d] = c)); return g }, n.extend({ expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (a) { throw new Error(a) }, noop: function () { }, isFunction: function (a) { return "function" === n.type(a) }, isArray: Array.isArray || function (a) { return "array" === n.type(a) }, isWindow: function (a) { return null != a && a == a.window }, isNumeric: function (a) { var b = a && a.toString(); return !n.isArray(a) && b - parseFloat(b) + 1 >= 0 }, isEmptyObject: function (a) { var b; for (b in a) return !1; return !0 }, isPlainObject: function (a) { var b; if (!a || "object" !== n.type(a) || a.nodeType || n.isWindow(a)) return !1; try { if (a.constructor && !k.call(a, "constructor") && !k.call(a.constructor.prototype, "isPrototypeOf")) return !1 } catch (c) { return !1 } if (!l.ownFirst) for (b in a) return k.call(a, b); for (b in a); return void 0 === b || k.call(a, b) }, type: function (a) { return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? i[j.call(a)] || "object" : typeof a }, globalEval: function (b) { b && n.trim(b) && (a.execScript || function (b) { a.eval.call(a, b) })(b) }, camelCase: function (a) { return a.replace(p, "ms-").replace(q, r) }, nodeName: function (a, b) { return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase() }, each: function (a, b) { var c, d = 0; if (s(a)) { for (c = a.length; c > d; d++)if (b.call(a[d], d, a[d]) === !1) break } else for (d in a) if (b.call(a[d], d, a[d]) === !1) break; return a }, trim: function (a) { return null == a ? "" : (a + "").replace(o, "") }, makeArray: function (a, b) { var c = b || []; return null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : g.call(c, a)), c }, inArray: function (a, b, c) { var d; if (b) { if (h) return h.call(b, a, c); for (d = b.length, c = c ? 0 > c ? Math.max(0, d + c) : c : 0; d > c; c++)if (c in b && b[c] === a) return c } return -1 }, merge: function (a, b) { var c = +b.length, d = 0, e = a.length; while (c > d) a[e++] = b[d++]; if (c !== c) while (void 0 !== b[d]) a[e++] = b[d++]; return a.length = e, a }, grep: function (a, b, c) { for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++)d = !b(a[f], f), d !== h && e.push(a[f]); return e }, map: function (a, b, c) { var d, e, g = 0, h = []; if (s(a)) for (d = a.length; d > g; g++)e = b(a[g], g, c), null != e && h.push(e); else for (g in a) e = b(a[g], g, c), null != e && h.push(e); return f.apply([], h) }, guid: 1, proxy: function (a, b) { var c, d, f; return "string" == typeof b && (f = a[b], b = a, a = f), n.isFunction(a) ? (c = e.call(arguments, 2), d = function () { return a.apply(b || this, c.concat(e.call(arguments))) }, d.guid = a.guid = a.guid || n.guid++, d) : void 0 }, now: function () { return +new Date }, support: l }), "function" == typeof Symbol && (n.fn[Symbol.iterator] = c[Symbol.iterator]), n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (a, b) { i["[object " + b + "]"] = b.toLowerCase() }); function s(a) { var b = !!a && "length" in a && a.length, c = n.type(a); return "function" === c || n.isWindow(a) ? !1 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a } var t = function (a) { var b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u = "sizzle" + 1 * new Date, v = a.document, w = 0, x = 0, y = ga(), z = ga(), A = ga(), B = function (a, b) { return a === b && (l = !0), 0 }, C = 1 << 31, D = {}.hasOwnProperty, E = [], F = E.pop, G = E.push, H = E.push, I = E.slice, J = function (a, b) { for (var c = 0, d = a.length; d > c; c++)if (a[c] === b) return c; return -1 }, K = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", L = "[\\x20\\t\\r\\n\\f]", M = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", N = "\\[" + L + "*(" + M + ")(?:" + L + "*([*^$|!~]?=)" + L + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + M + "))|)" + L + "*\\]", O = ":(" + M + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + N + ")*)|.*)\\)|)", P = new RegExp(L + "+", "g"), Q = new RegExp("^" + L + "+|((?:^|[^\\\\])(?:\\\\.)*)" + L + "+$", "g"), R = new RegExp("^" + L + "*," + L + "*"), S = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"), T = new RegExp("=" + L + "*([^\\]'\"]*?)" + L + "*\\]", "g"), U = new RegExp(O), V = new RegExp("^" + M + "$"), W = { ID: new RegExp("^#(" + M + ")"), CLASS: new RegExp("^\\.(" + M + ")"), TAG: new RegExp("^(" + M + "|[*])"), ATTR: new RegExp("^" + N), PSEUDO: new RegExp("^" + O), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + L + "*(even|odd|(([+-]|)(\\d*)n|)" + L + "*(?:([+-]|)" + L + "*(\\d+)|))" + L + "*\\)|)", "i"), bool: new RegExp("^(?:" + K + ")$", "i"), needsContext: new RegExp("^" + L + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + L + "*((?:-\\d)?\\d*)" + L + "*\\)|)(?=[^-]|$)", "i") }, X = /^(?:input|select|textarea|button)$/i, Y = /^h\d$/i, Z = /^[^{]+\{\s*\[native \w/, $ = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, _ = /[+~]/, aa = /'|\\/g, ba = new RegExp("\\\\([\\da-f]{1,6}" + L + "?|(" + L + ")|.)", "ig"), ca = function (a, b, c) { var d = "0x" + b - 65536; return d !== d || c ? b : 0 > d ? String.fromCharCode(d + 65536) : String.fromCharCode(d >> 10 | 55296, 1023 & d | 56320) }, da = function () { m() }; try { H.apply(E = I.call(v.childNodes), v.childNodes), E[v.childNodes.length].nodeType } catch (ea) { H = { apply: E.length ? function (a, b) { G.apply(a, I.call(b)) } : function (a, b) { var c = a.length, d = 0; while (a[c++] = b[d++]); a.length = c - 1 } } } function fa(a, b, d, e) { var f, h, j, k, l, o, r, s, w = b && b.ownerDocument, x = b ? b.nodeType : 9; if (d = d || [], "string" != typeof a || !a || 1 !== x && 9 !== x && 11 !== x) return d; if (!e && ((b ? b.ownerDocument || b : v) !== n && m(b), b = b || n, p)) { if (11 !== x && (o = $.exec(a))) if (f = o[1]) { if (9 === x) { if (!(j = b.getElementById(f))) return d; if (j.id === f) return d.push(j), d } else if (w && (j = w.getElementById(f)) && t(b, j) && j.id === f) return d.push(j), d } else { if (o[2]) return H.apply(d, b.getElementsByTagName(a)), d; if ((f = o[3]) && c.getElementsByClassName && b.getElementsByClassName) return H.apply(d, b.getElementsByClassName(f)), d } if (c.qsa && !A[a + " "] && (!q || !q.test(a))) { if (1 !== x) w = b, s = a; else if ("object" !== b.nodeName.toLowerCase()) { (k = b.getAttribute("id")) ? k = k.replace(aa, "\\$&") : b.setAttribute("id", k = u), r = g(a), h = r.length, l = V.test(k) ? "#" + k : "[id='" + k + "']"; while (h--) r[h] = l + " " + qa(r[h]); s = r.join(","), w = _.test(a) && oa(b.parentNode) || b } if (s) try { return H.apply(d, w.querySelectorAll(s)), d } catch (y) { } finally { k === u && b.removeAttribute("id") } } } return i(a.replace(Q, "$1"), b, d, e) } function ga() { var a = []; function b(c, e) { return a.push(c + " ") > d.cacheLength && delete b[a.shift()], b[c + " "] = e } return b } function ha(a) { return a[u] = !0, a } function ia(a) { var b = n.createElement("div"); try { return !!a(b) } catch (c) { return !1 } finally { b.parentNode && b.parentNode.removeChild(b), b = null } } function ja(a, b) { var c = a.split("|"), e = c.length; while (e--) d.attrHandle[c[e]] = b } function ka(a, b) { var c = b && a, d = c && 1 === a.nodeType && 1 === b.nodeType && (~b.sourceIndex || C) - (~a.sourceIndex || C); if (d) return d; if (c) while (c = c.nextSibling) if (c === b) return -1; return a ? 1 : -1 } function la(a) { return function (b) { var c = b.nodeName.toLowerCase(); return "input" === c && b.type === a } } function ma(a) { return function (b) { var c = b.nodeName.toLowerCase(); return ("input" === c || "button" === c) && b.type === a } } function na(a) { return ha(function (b) { return b = +b, ha(function (c, d) { var e, f = a([], c.length, b), g = f.length; while (g--) c[e = f[g]] && (c[e] = !(d[e] = c[e])) }) }) } function oa(a) { return a && "undefined" != typeof a.getElementsByTagName && a } c = fa.support = {}, f = fa.isXML = function (a) { var b = a && (a.ownerDocument || a).documentElement; return b ? "HTML" !== b.nodeName : !1 }, m = fa.setDocument = function (a) { var b, e, g = a ? a.ownerDocument || a : v; return g !== n && 9 === g.nodeType && g.documentElement ? (n = g, o = n.documentElement, p = !f(n), (e = n.defaultView) && e.top !== e && (e.addEventListener ? e.addEventListener("unload", da, !1) : e.attachEvent && e.attachEvent("onunload", da)), c.attributes = ia(function (a) { return a.className = "i", !a.getAttribute("className") }), c.getElementsByTagName = ia(function (a) { return a.appendChild(n.createComment("")), !a.getElementsByTagName("*").length }), c.getElementsByClassName = Z.test(n.getElementsByClassName), c.getById = ia(function (a) { return o.appendChild(a).id = u, !n.getElementsByName || !n.getElementsByName(u).length }), c.getById ? (d.find.ID = function (a, b) { if ("undefined" != typeof b.getElementById && p) { var c = b.getElementById(a); return c ? [c] : [] } }, d.filter.ID = function (a) { var b = a.replace(ba, ca); return function (a) { return a.getAttribute("id") === b } }) : (delete d.find.ID, d.filter.ID = function (a) { var b = a.replace(ba, ca); return function (a) { var c = "undefined" != typeof a.getAttributeNode && a.getAttributeNode("id"); return c && c.value === b } }), d.find.TAG = c.getElementsByTagName ? function (a, b) { return "undefined" != typeof b.getElementsByTagName ? b.getElementsByTagName(a) : c.qsa ? b.querySelectorAll(a) : void 0 } : function (a, b) { var c, d = [], e = 0, f = b.getElementsByTagName(a); if ("*" === a) { while (c = f[e++]) 1 === c.nodeType && d.push(c); return d } return f }, d.find.CLASS = c.getElementsByClassName && function (a, b) { return "undefined" != typeof b.getElementsByClassName && p ? b.getElementsByClassName(a) : void 0 }, r = [], q = [], (c.qsa = Z.test(n.querySelectorAll)) && (ia(function (a) { o.appendChild(a).innerHTML = "", a.querySelectorAll("[msallowcapture^='']").length && q.push("[*^$]=" + L + "*(?:''|\"\")"), a.querySelectorAll("[selected]").length || q.push("\\[" + L + "*(?:value|" + K + ")"), a.querySelectorAll("[id~=" + u + "-]").length || q.push("~="), a.querySelectorAll(":checked").length || q.push(":checked"), a.querySelectorAll("a#" + u + "+*").length || q.push(".#.+[+~]") }), ia(function (a) { var b = n.createElement("input"); b.setAttribute("type", "hidden"), a.appendChild(b).setAttribute("name", "D"), a.querySelectorAll("[name=d]").length && q.push("name" + L + "*[*^$|!~]?="), a.querySelectorAll(":enabled").length || q.push(":enabled", ":disabled"), a.querySelectorAll("*,:x"), q.push(",.*:") })), (c.matchesSelector = Z.test(s = o.matches || o.webkitMatchesSelector || o.mozMatchesSelector || o.oMatchesSelector || o.msMatchesSelector)) && ia(function (a) { c.disconnectedMatch = s.call(a, "div"), s.call(a, "[s!='']:x"), r.push("!=", O) }), q = q.length && new RegExp(q.join("|")), r = r.length && new RegExp(r.join("|")), b = Z.test(o.compareDocumentPosition), t = b || Z.test(o.contains) ? function (a, b) { var c = 9 === a.nodeType ? a.documentElement : a, d = b && b.parentNode; return a === d || !(!d || 1 !== d.nodeType || !(c.contains ? c.contains(d) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(d))) } : function (a, b) { if (b) while (b = b.parentNode) if (b === a) return !0; return !1 }, B = b ? function (a, b) { if (a === b) return l = !0, 0; var d = !a.compareDocumentPosition - !b.compareDocumentPosition; return d ? d : (d = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1, 1 & d || !c.sortDetached && b.compareDocumentPosition(a) === d ? a === n || a.ownerDocument === v && t(v, a) ? -1 : b === n || b.ownerDocument === v && t(v, b) ? 1 : k ? J(k, a) - J(k, b) : 0 : 4 & d ? -1 : 1) } : function (a, b) { if (a === b) return l = !0, 0; var c, d = 0, e = a.parentNode, f = b.parentNode, g = [a], h = [b]; if (!e || !f) return a === n ? -1 : b === n ? 1 : e ? -1 : f ? 1 : k ? J(k, a) - J(k, b) : 0; if (e === f) return ka(a, b); c = a; while (c = c.parentNode) g.unshift(c); c = b; while (c = c.parentNode) h.unshift(c); while (g[d] === h[d]) d++; return d ? ka(g[d], h[d]) : g[d] === v ? -1 : h[d] === v ? 1 : 0 }, n) : n }, fa.matches = function (a, b) { return fa(a, null, null, b) }, fa.matchesSelector = function (a, b) { if ((a.ownerDocument || a) !== n && m(a), b = b.replace(T, "='$1']"), c.matchesSelector && p && !A[b + " "] && (!r || !r.test(b)) && (!q || !q.test(b))) try { var d = s.call(a, b); if (d || c.disconnectedMatch || a.document && 11 !== a.document.nodeType) return d } catch (e) { } return fa(b, n, null, [a]).length > 0 }, fa.contains = function (a, b) { return (a.ownerDocument || a) !== n && m(a), t(a, b) }, fa.attr = function (a, b) { (a.ownerDocument || a) !== n && m(a); var e = d.attrHandle[b.toLowerCase()], f = e && D.call(d.attrHandle, b.toLowerCase()) ? e(a, b, !p) : void 0; return void 0 !== f ? f : c.attributes || !p ? a.getAttribute(b) : (f = a.getAttributeNode(b)) && f.specified ? f.value : null }, fa.error = function (a) { throw new Error("Syntax error, unrecognized expression: " + a) }, fa.uniqueSort = function (a) { var b, d = [], e = 0, f = 0; if (l = !c.detectDuplicates, k = !c.sortStable && a.slice(0), a.sort(B), l) { while (b = a[f++]) b === a[f] && (e = d.push(f)); while (e--) a.splice(d[e], 1) } return k = null, a }, e = fa.getText = function (a) { var b, c = "", d = 0, f = a.nodeType; if (f) { if (1 === f || 9 === f || 11 === f) { if ("string" == typeof a.textContent) return a.textContent; for (a = a.firstChild; a; a = a.nextSibling)c += e(a) } else if (3 === f || 4 === f) return a.nodeValue } else while (b = a[d++]) c += e(b); return c }, d = fa.selectors = { cacheLength: 50, createPseudo: ha, match: W, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (a) { return a[1] = a[1].replace(ba, ca), a[3] = (a[3] || a[4] || a[5] || "").replace(ba, ca), "~=" === a[2] && (a[3] = " " + a[3] + " "), a.slice(0, 4) }, CHILD: function (a) { return a[1] = a[1].toLowerCase(), "nth" === a[1].slice(0, 3) ? (a[3] || fa.error(a[0]), a[4] = +(a[4] ? a[5] + (a[6] || 1) : 2 * ("even" === a[3] || "odd" === a[3])), a[5] = +(a[7] + a[8] || "odd" === a[3])) : a[3] && fa.error(a[0]), a }, PSEUDO: function (a) { var b, c = !a[6] && a[2]; return W.CHILD.test(a[0]) ? null : (a[3] ? a[2] = a[4] || a[5] || "" : c && U.test(c) && (b = g(c, !0)) && (b = c.indexOf(")", c.length - b) - c.length) && (a[0] = a[0].slice(0, b), a[2] = c.slice(0, b)), a.slice(0, 3)) } }, filter: { TAG: function (a) { var b = a.replace(ba, ca).toLowerCase(); return "*" === a ? function () { return !0 } : function (a) { return a.nodeName && a.nodeName.toLowerCase() === b } }, CLASS: function (a) { var b = y[a + " "]; return b || (b = new RegExp("(^|" + L + ")" + a + "(" + L + "|$)")) && y(a, function (a) { return b.test("string" == typeof a.className && a.className || "undefined" != typeof a.getAttribute && a.getAttribute("class") || "") }) }, ATTR: function (a, b, c) { return function (d) { var e = fa.attr(d, a); return null == e ? "!=" === b : b ? (e += "", "=" === b ? e === c : "!=" === b ? e !== c : "^=" === b ? c && 0 === e.indexOf(c) : "*=" === b ? c && e.indexOf(c) > -1 : "$=" === b ? c && e.slice(-c.length) === c : "~=" === b ? (" " + e.replace(P, " ") + " ").indexOf(c) > -1 : "|=" === b ? e === c || e.slice(0, c.length + 1) === c + "-" : !1) : !0 } }, CHILD: function (a, b, c, d, e) { var f = "nth" !== a.slice(0, 3), g = "last" !== a.slice(-4), h = "of-type" === b; return 1 === d && 0 === e ? function (a) { return !!a.parentNode } : function (b, c, i) { var j, k, l, m, n, o, p = f !== g ? "nextSibling" : "previousSibling", q = b.parentNode, r = h && b.nodeName.toLowerCase(), s = !i && !h, t = !1; if (q) { if (f) { while (p) { m = b; while (m = m[p]) if (h ? m.nodeName.toLowerCase() === r : 1 === m.nodeType) return !1; o = p = "only" === a && !o && "nextSibling" } return !0 } if (o = [g ? q.firstChild : q.lastChild], g && s) { m = q, l = m[u] || (m[u] = {}), k = l[m.uniqueID] || (l[m.uniqueID] = {}), j = k[a] || [], n = j[0] === w && j[1], t = n && j[2], m = n && q.childNodes[n]; while (m = ++n && m && m[p] || (t = n = 0) || o.pop()) if (1 === m.nodeType && ++t && m === b) { k[a] = [w, n, t]; break } } else if (s && (m = b, l = m[u] || (m[u] = {}), k = l[m.uniqueID] || (l[m.uniqueID] = {}), j = k[a] || [], n = j[0] === w && j[1], t = n), t === !1) while (m = ++n && m && m[p] || (t = n = 0) || o.pop()) if ((h ? m.nodeName.toLowerCase() === r : 1 === m.nodeType) && ++t && (s && (l = m[u] || (m[u] = {}), k = l[m.uniqueID] || (l[m.uniqueID] = {}), k[a] = [w, t]), m === b)) break; return t -= e, t === d || t % d === 0 && t / d >= 0 } } }, PSEUDO: function (a, b) { var c, e = d.pseudos[a] || d.setFilters[a.toLowerCase()] || fa.error("unsupported pseudo: " + a); return e[u] ? e(b) : e.length > 1 ? (c = [a, a, "", b], d.setFilters.hasOwnProperty(a.toLowerCase()) ? ha(function (a, c) { var d, f = e(a, b), g = f.length; while (g--) d = J(a, f[g]), a[d] = !(c[d] = f[g]) }) : function (a) { return e(a, 0, c) }) : e } }, pseudos: { not: ha(function (a) { var b = [], c = [], d = h(a.replace(Q, "$1")); return d[u] ? ha(function (a, b, c, e) { var f, g = d(a, null, e, []), h = a.length; while (h--) (f = g[h]) && (a[h] = !(b[h] = f)) }) : function (a, e, f) { return b[0] = a, d(b, null, f, c), b[0] = null, !c.pop() } }), has: ha(function (a) { return function (b) { return fa(a, b).length > 0 } }), contains: ha(function (a) { return a = a.replace(ba, ca), function (b) { return (b.textContent || b.innerText || e(b)).indexOf(a) > -1 } }), lang: ha(function (a) { return V.test(a || "") || fa.error("unsupported lang: " + a), a = a.replace(ba, ca).toLowerCase(), function (b) { var c; do if (c = p ? b.lang : b.getAttribute("xml:lang") || b.getAttribute("lang")) return c = c.toLowerCase(), c === a || 0 === c.indexOf(a + "-"); while ((b = b.parentNode) && 1 === b.nodeType); return !1 } }), target: function (b) { var c = a.location && a.location.hash; return c && c.slice(1) === b.id }, root: function (a) { return a === o }, focus: function (a) { return a === n.activeElement && (!n.hasFocus || n.hasFocus()) && !!(a.type || a.href || ~a.tabIndex) }, enabled: function (a) { return a.disabled === !1 }, disabled: function (a) { return a.disabled === !0 }, checked: function (a) { var b = a.nodeName.toLowerCase(); return "input" === b && !!a.checked || "option" === b && !!a.selected }, selected: function (a) { return a.parentNode && a.parentNode.selectedIndex, a.selected === !0 }, empty: function (a) { for (a = a.firstChild; a; a = a.nextSibling)if (a.nodeType < 6) return !1; return !0 }, parent: function (a) { return !d.pseudos.empty(a) }, header: function (a) { return Y.test(a.nodeName) }, input: function (a) { return X.test(a.nodeName) }, button: function (a) { var b = a.nodeName.toLowerCase(); return "input" === b && "button" === a.type || "button" === b }, text: function (a) { var b; return "input" === a.nodeName.toLowerCase() && "text" === a.type && (null == (b = a.getAttribute("type")) || "text" === b.toLowerCase()) }, first: na(function () { return [0] }), last: na(function (a, b) { return [b - 1] }), eq: na(function (a, b, c) { return [0 > c ? c + b : c] }), even: na(function (a, b) { for (var c = 0; b > c; c += 2)a.push(c); return a }), odd: na(function (a, b) { for (var c = 1; b > c; c += 2)a.push(c); return a }), lt: na(function (a, b, c) { for (var d = 0 > c ? c + b : c; --d >= 0;)a.push(d); return a }), gt: na(function (a, b, c) { for (var d = 0 > c ? c + b : c; ++d < b;)a.push(d); return a }) } }, d.pseudos.nth = d.pseudos.eq; for (b in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) d.pseudos[b] = la(b); for (b in { submit: !0, reset: !0 }) d.pseudos[b] = ma(b); function pa() { } pa.prototype = d.filters = d.pseudos, d.setFilters = new pa, g = fa.tokenize = function (a, b) { var c, e, f, g, h, i, j, k = z[a + " "]; if (k) return b ? 0 : k.slice(0); h = a, i = [], j = d.preFilter; while (h) { c && !(e = R.exec(h)) || (e && (h = h.slice(e[0].length) || h), i.push(f = [])), c = !1, (e = S.exec(h)) && (c = e.shift(), f.push({ value: c, type: e[0].replace(Q, " ") }), h = h.slice(c.length)); for (g in d.filter) !(e = W[g].exec(h)) || j[g] && !(e = j[g](e)) || (c = e.shift(), f.push({ value: c, type: g, matches: e }), h = h.slice(c.length)); if (!c) break } return b ? h.length : h ? fa.error(a) : z(a, i).slice(0) }; function qa(a) { for (var b = 0, c = a.length, d = ""; c > b; b++)d += a[b].value; return d } function ra(a, b, c) { var d = b.dir, e = c && "parentNode" === d, f = x++; return b.first ? function (b, c, f) { while (b = b[d]) if (1 === b.nodeType || e) return a(b, c, f) } : function (b, c, g) { var h, i, j, k = [w, f]; if (g) { while (b = b[d]) if ((1 === b.nodeType || e) && a(b, c, g)) return !0 } else while (b = b[d]) if (1 === b.nodeType || e) { if (j = b[u] || (b[u] = {}), i = j[b.uniqueID] || (j[b.uniqueID] = {}), (h = i[d]) && h[0] === w && h[1] === f) return k[2] = h[2]; if (i[d] = k, k[2] = a(b, c, g)) return !0 } } } function sa(a) { return a.length > 1 ? function (b, c, d) { var e = a.length; while (e--) if (!a[e](b, c, d)) return !1; return !0 } : a[0] } function ta(a, b, c) { for (var d = 0, e = b.length; e > d; d++)fa(a, b[d], c); return c } function ua(a, b, c, d, e) { for (var f, g = [], h = 0, i = a.length, j = null != b; i > h; h++)(f = a[h]) && (c && !c(f, d, e) || (g.push(f), j && b.push(h))); return g } function va(a, b, c, d, e, f) { return d && !d[u] && (d = va(d)), e && !e[u] && (e = va(e, f)), ha(function (f, g, h, i) { var j, k, l, m = [], n = [], o = g.length, p = f || ta(b || "*", h.nodeType ? [h] : h, []), q = !a || !f && b ? p : ua(p, m, a, h, i), r = c ? e || (f ? a : o || d) ? [] : g : q; if (c && c(q, r, h, i), d) { j = ua(r, n), d(j, [], h, i), k = j.length; while (k--) (l = j[k]) && (r[n[k]] = !(q[n[k]] = l)) } if (f) { if (e || a) { if (e) { j = [], k = r.length; while (k--) (l = r[k]) && j.push(q[k] = l); e(null, r = [], j, i) } k = r.length; while (k--) (l = r[k]) && (j = e ? J(f, l) : m[k]) > -1 && (f[j] = !(g[j] = l)) } } else r = ua(r === g ? r.splice(o, r.length) : r), e ? e(null, g, r, i) : H.apply(g, r) }) } function wa(a) { for (var b, c, e, f = a.length, g = d.relative[a[0].type], h = g || d.relative[" "], i = g ? 1 : 0, k = ra(function (a) { return a === b }, h, !0), l = ra(function (a) { return J(b, a) > -1 }, h, !0), m = [function (a, c, d) { var e = !g && (d || c !== j) || ((b = c).nodeType ? k(a, c, d) : l(a, c, d)); return b = null, e }]; f > i; i++)if (c = d.relative[a[i].type]) m = [ra(sa(m), c)]; else { if (c = d.filter[a[i].type].apply(null, a[i].matches), c[u]) { for (e = ++i; f > e; e++)if (d.relative[a[e].type]) break; return va(i > 1 && sa(m), i > 1 && qa(a.slice(0, i - 1).concat({ value: " " === a[i - 2].type ? "*" : "" })).replace(Q, "$1"), c, e > i && wa(a.slice(i, e)), f > e && wa(a = a.slice(e)), f > e && qa(a)) } m.push(c) } return sa(m) } function xa(a, b) { var c = b.length > 0, e = a.length > 0, f = function (f, g, h, i, k) { var l, o, q, r = 0, s = "0", t = f && [], u = [], v = j, x = f || e && d.find.TAG("*", k), y = w += null == v ? 1 : Math.random() || .1, z = x.length; for (k && (j = g === n || g || k); s !== z && null != (l = x[s]); s++) { if (e && l) { o = 0, g || l.ownerDocument === n || (m(l), h = !p); while (q = a[o++]) if (q(l, g || n, h)) { i.push(l); break } k && (w = y) } c && ((l = !q && l) && r--, f && t.push(l)) } if (r += s, c && s !== r) { o = 0; while (q = b[o++]) q(t, u, g, h); if (f) { if (r > 0) while (s--) t[s] || u[s] || (u[s] = F.call(i)); u = ua(u) } H.apply(i, u), k && !f && u.length > 0 && r + b.length > 1 && fa.uniqueSort(i) } return k && (w = y, j = v), t }; return c ? ha(f) : f } return h = fa.compile = function (a, b) { var c, d = [], e = [], f = A[a + " "]; if (!f) { b || (b = g(a)), c = b.length; while (c--) f = wa(b[c]), f[u] ? d.push(f) : e.push(f); f = A(a, xa(e, d)), f.selector = a } return f }, i = fa.select = function (a, b, e, f) { var i, j, k, l, m, n = "function" == typeof a && a, o = !f && g(a = n.selector || a); if (e = e || [], 1 === o.length) { if (j = o[0] = o[0].slice(0), j.length > 2 && "ID" === (k = j[0]).type && c.getById && 9 === b.nodeType && p && d.relative[j[1].type]) { if (b = (d.find.ID(k.matches[0].replace(ba, ca), b) || [])[0], !b) return e; n && (b = b.parentNode), a = a.slice(j.shift().value.length) } i = W.needsContext.test(a) ? 0 : j.length; while (i--) { if (k = j[i], d.relative[l = k.type]) break; if ((m = d.find[l]) && (f = m(k.matches[0].replace(ba, ca), _.test(j[0].type) && oa(b.parentNode) || b))) { if (j.splice(i, 1), a = f.length && qa(j), !a) return H.apply(e, f), e; break } } } return (n || h(a, o))(f, b, !p, e, !b || _.test(a) && oa(b.parentNode) || b), e }, c.sortStable = u.split("").sort(B).join("") === u, c.detectDuplicates = !!l, m(), c.sortDetached = ia(function (a) { return 1 & a.compareDocumentPosition(n.createElement("div")) }), ia(function (a) { return a.innerHTML = "", "#" === a.firstChild.getAttribute("href") }) || ja("type|href|height|width", function (a, b, c) { return c ? void 0 : a.getAttribute(b, "type" === b.toLowerCase() ? 1 : 2) }), c.attributes && ia(function (a) { return a.innerHTML = "", a.firstChild.setAttribute("value", ""), "" === a.firstChild.getAttribute("value") }) || ja("value", function (a, b, c) { return c || "input" !== a.nodeName.toLowerCase() ? void 0 : a.defaultValue }), ia(function (a) { return null == a.getAttribute("disabled") }) || ja(K, function (a, b, c) { var d; return c ? void 0 : a[b] === !0 ? b.toLowerCase() : (d = a.getAttributeNode(b)) && d.specified ? d.value : null }), fa }(a); n.find = t, n.expr = t.selectors, n.expr[":"] = n.expr.pseudos, n.uniqueSort = n.unique = t.uniqueSort, n.text = t.getText, n.isXMLDoc = t.isXML, n.contains = t.contains; var u = function (a, b, c) { var d = [], e = void 0 !== c; while ((a = a[b]) && 9 !== a.nodeType) if (1 === a.nodeType) { if (e && n(a).is(c)) break; d.push(a) } return d }, v = function (a, b) { for (var c = []; a; a = a.nextSibling)1 === a.nodeType && a !== b && c.push(a); return c }, w = n.expr.match.needsContext, x = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/, y = /^.[^:#\[\.,]*$/; function z(a, b, c) { if (n.isFunction(b)) return n.grep(a, function (a, d) { return !!b.call(a, d, a) !== c }); if (b.nodeType) return n.grep(a, function (a) { return a === b !== c }); if ("string" == typeof b) { if (y.test(b)) return n.filter(b, a, c); b = n.filter(b, a) } return n.grep(a, function (a) { return n.inArray(a, b) > -1 !== c }) } n.filter = function (a, b, c) { var d = b[0]; return c && (a = ":not(" + a + ")"), 1 === b.length && 1 === d.nodeType ? n.find.matchesSelector(d, a) ? [d] : [] : n.find.matches(a, n.grep(b, function (a) { return 1 === a.nodeType })) }, n.fn.extend({ find: function (a) { var b, c = [], d = this, e = d.length; if ("string" != typeof a) return this.pushStack(n(a).filter(function () { for (b = 0; e > b; b++)if (n.contains(d[b], this)) return !0 })); for (b = 0; e > b; b++)n.find(a, d[b], c); return c = this.pushStack(e > 1 ? n.unique(c) : c), c.selector = this.selector ? this.selector + " " + a : a, c }, filter: function (a) { return this.pushStack(z(this, a || [], !1)) }, not: function (a) { return this.pushStack(z(this, a || [], !0)) }, is: function (a) { return !!z(this, "string" == typeof a && w.test(a) ? n(a) : a || [], !1).length } }); var A, B = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, C = n.fn.init = function (a, b, c) { var e, f; if (!a) return this; if (c = c || A, "string" == typeof a) { if (e = "<" === a.charAt(0) && ">" === a.charAt(a.length - 1) && a.length >= 3 ? [null, a, null] : B.exec(a), !e || !e[1] && b) return !b || b.jquery ? (b || c).find(a) : this.constructor(b).find(a); if (e[1]) { if (b = b instanceof n ? b[0] : b, n.merge(this, n.parseHTML(e[1], b && b.nodeType ? b.ownerDocument || b : d, !0)), x.test(e[1]) && n.isPlainObject(b)) for (e in b) n.isFunction(this[e]) ? this[e](b[e]) : this.attr(e, b[e]); return this } if (f = d.getElementById(e[2]), f && f.parentNode) { if (f.id !== e[2]) return A.find(a); this.length = 1, this[0] = f } return this.context = d, this.selector = a, this } return a.nodeType ? (this.context = this[0] = a, this.length = 1, this) : n.isFunction(a) ? "undefined" != typeof c.ready ? c.ready(a) : a(n) : (void 0 !== a.selector && (this.selector = a.selector, this.context = a.context), n.makeArray(a, this)) }; C.prototype = n.fn, A = n(d); var D = /^(?:parents|prev(?:Until|All))/, E = { children: !0, contents: !0, next: !0, prev: !0 }; n.fn.extend({ has: function (a) { var b, c = n(a, this), d = c.length; return this.filter(function () { for (b = 0; d > b; b++)if (n.contains(this, c[b])) return !0 }) }, closest: function (a, b) { for (var c, d = 0, e = this.length, f = [], g = w.test(a) || "string" != typeof a ? n(a, b || this.context) : 0; e > d; d++)for (c = this[d]; c && c !== b; c = c.parentNode)if (c.nodeType < 11 && (g ? g.index(c) > -1 : 1 === c.nodeType && n.find.matchesSelector(c, a))) { f.push(c); break } return this.pushStack(f.length > 1 ? n.uniqueSort(f) : f) }, index: function (a) { return a ? "string" == typeof a ? n.inArray(this[0], n(a)) : n.inArray(a.jquery ? a[0] : a, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (a, b) { return this.pushStack(n.uniqueSort(n.merge(this.get(), n(a, b)))) }, addBack: function (a) { return this.add(null == a ? this.prevObject : this.prevObject.filter(a)) } }); function F(a, b) { do a = a[b]; while (a && 1 !== a.nodeType); return a } n.each({ parent: function (a) { var b = a.parentNode; return b && 11 !== b.nodeType ? b : null }, parents: function (a) { return u(a, "parentNode") }, parentsUntil: function (a, b, c) { return u(a, "parentNode", c) }, next: function (a) { return F(a, "nextSibling") }, prev: function (a) { return F(a, "previousSibling") }, nextAll: function (a) { return u(a, "nextSibling") }, prevAll: function (a) { return u(a, "previousSibling") }, nextUntil: function (a, b, c) { return u(a, "nextSibling", c) }, prevUntil: function (a, b, c) { return u(a, "previousSibling", c) }, siblings: function (a) { return v((a.parentNode || {}).firstChild, a) }, children: function (a) { return v(a.firstChild) }, contents: function (a) { return n.nodeName(a, "iframe") ? a.contentDocument || a.contentWindow.document : n.merge([], a.childNodes) } }, function (a, b) { n.fn[a] = function (c, d) { var e = n.map(this, b, c); return "Until" !== a.slice(-5) && (d = c), d && "string" == typeof d && (e = n.filter(d, e)), this.length > 1 && (E[a] || (e = n.uniqueSort(e)), D.test(a) && (e = e.reverse())), this.pushStack(e) } }); var G = /\S+/g; function H(a) { var b = {}; return n.each(a.match(G) || [], function (a, c) { b[c] = !0 }), b } n.Callbacks = function (a) { a = "string" == typeof a ? H(a) : n.extend({}, a); var b, c, d, e, f = [], g = [], h = -1, i = function () { for (e = a.once, d = b = !0; g.length; h = -1) { c = g.shift(); while (++h < f.length) f[h].apply(c[0], c[1]) === !1 && a.stopOnFalse && (h = f.length, c = !1) } a.memory || (c = !1), b = !1, e && (f = c ? [] : "") }, j = { add: function () { return f && (c && !b && (h = f.length - 1, g.push(c)), function d(b) { n.each(b, function (b, c) { n.isFunction(c) ? a.unique && j.has(c) || f.push(c) : c && c.length && "string" !== n.type(c) && d(c) }) }(arguments), c && !b && i()), this }, remove: function () { return n.each(arguments, function (a, b) { var c; while ((c = n.inArray(b, f, c)) > -1) f.splice(c, 1), h >= c && h-- }), this }, has: function (a) { return a ? n.inArray(a, f) > -1 : f.length > 0 }, empty: function () { return f && (f = []), this }, disable: function () { return e = g = [], f = c = "", this }, disabled: function () { return !f }, lock: function () { return e = !0, c || j.disable(), this }, locked: function () { return !!e }, fireWith: function (a, c) { return e || (c = c || [], c = [a, c.slice ? c.slice() : c], g.push(c), b || i()), this }, fire: function () { return j.fireWith(this, arguments), this }, fired: function () { return !!d } }; return j }, n.extend({ Deferred: function (a) { var b = [["resolve", "done", n.Callbacks("once memory"), "resolved"], ["reject", "fail", n.Callbacks("once memory"), "rejected"], ["notify", "progress", n.Callbacks("memory")]], c = "pending", d = { state: function () { return c }, always: function () { return e.done(arguments).fail(arguments), this }, then: function () { var a = arguments; return n.Deferred(function (c) { n.each(b, function (b, f) { var g = n.isFunction(a[b]) && a[b]; e[f[1]](function () { var a = g && g.apply(this, arguments); a && n.isFunction(a.promise) ? a.promise().progress(c.notify).done(c.resolve).fail(c.reject) : c[f[0] + "With"](this === d ? c.promise() : this, g ? [a] : arguments) }) }), a = null }).promise() }, promise: function (a) { return null != a ? n.extend(a, d) : d } }, e = {}; return d.pipe = d.then, n.each(b, function (a, f) { var g = f[2], h = f[3]; d[f[1]] = g.add, h && g.add(function () { c = h }, b[1 ^ a][2].disable, b[2][2].lock), e[f[0]] = function () { return e[f[0] + "With"](this === e ? d : this, arguments), this }, e[f[0] + "With"] = g.fireWith }), d.promise(e), a && a.call(e, e), e }, when: function (a) { var b = 0, c = e.call(arguments), d = c.length, f = 1 !== d || a && n.isFunction(a.promise) ? d : 0, g = 1 === f ? a : n.Deferred(), h = function (a, b, c) { return function (d) { b[a] = this, c[a] = arguments.length > 1 ? e.call(arguments) : d, c === i ? g.notifyWith(b, c) : --f || g.resolveWith(b, c) } }, i, j, k; if (d > 1) for (i = new Array(d), j = new Array(d), k = new Array(d); d > b; b++)c[b] && n.isFunction(c[b].promise) ? c[b].promise().progress(h(b, j, i)).done(h(b, k, c)).fail(g.reject) : --f; return f || g.resolveWith(k, c), g.promise() } }); var I; n.fn.ready = function (a) { return n.ready.promise().done(a), this }, n.extend({ isReady: !1, readyWait: 1, holdReady: function (a) { a ? n.readyWait++ : n.ready(!0) }, ready: function (a) { (a === !0 ? --n.readyWait : n.isReady) || (n.isReady = !0, a !== !0 && --n.readyWait > 0 || (I.resolveWith(d, [n]), n.fn.triggerHandler && (n(d).triggerHandler("ready"), n(d).off("ready")))) } }); function J() { d.addEventListener ? (d.removeEventListener("DOMContentLoaded", K), a.removeEventListener("load", K)) : (d.detachEvent("onreadystatechange", K), a.detachEvent("onload", K)) } function K() { (d.addEventListener || "load" === a.event.type || "complete" === d.readyState) && (J(), n.ready()) } n.ready.promise = function (b) { if (!I) if (I = n.Deferred(), "complete" === d.readyState || "loading" !== d.readyState && !d.documentElement.doScroll) a.setTimeout(n.ready); else if (d.addEventListener) d.addEventListener("DOMContentLoaded", K), a.addEventListener("load", K); else { d.attachEvent("onreadystatechange", K), a.attachEvent("onload", K); var c = !1; try { c = null == a.frameElement && d.documentElement } catch (e) { } c && c.doScroll && !function f() { if (!n.isReady) { try { c.doScroll("left") } catch (b) { return a.setTimeout(f, 50) } J(), n.ready() } }() } return I.promise(b) }, n.ready.promise(); var L; for (L in n(l)) break; l.ownFirst = "0" === L, l.inlineBlockNeedsLayout = !1, n(function () { var a, b, c, e; c = d.getElementsByTagName("body")[0], c && c.style && (b = d.createElement("div"), e = d.createElement("div"), e.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px", c.appendChild(e).appendChild(b), "undefined" != typeof b.style.zoom && (b.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1", l.inlineBlockNeedsLayout = a = 3 === b.offsetWidth, a && (c.style.zoom = 1)), c.removeChild(e)) }), function () { var a = d.createElement("div"); l.deleteExpando = !0; try { delete a.test } catch (b) { l.deleteExpando = !1 } a = null }(); var M = function (a) { var b = n.noData[(a.nodeName + " ").toLowerCase()], c = +a.nodeType || 1; return 1 !== c && 9 !== c ? !1 : !b || b !== !0 && a.getAttribute("classid") === b }, N = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, O = /([A-Z])/g; function P(a, b, c) {
+ if (void 0 === c && 1 === a.nodeType) {
+ var d = "data-" + b.replace(O, "-$1").toLowerCase(); if (c = a.getAttribute(d), "string" == typeof c) { try { c = "true" === c ? !0 : "false" === c ? !1 : "null" === c ? null : +c + "" === c ? +c : N.test(c) ? n.parseJSON(c) : c } catch (e) { } n.data(a, b, c) } else c = void 0;
+ } return c
+ } function Q(a) { var b; for (b in a) if (("data" !== b || !n.isEmptyObject(a[b])) && "toJSON" !== b) return !1; return !0 } function R(a, b, d, e) { if (M(a)) { var f, g, h = n.expando, i = a.nodeType, j = i ? n.cache : a, k = i ? a[h] : a[h] && h; if (k && j[k] && (e || j[k].data) || void 0 !== d || "string" != typeof b) return k || (k = i ? a[h] = c.pop() || n.guid++ : h), j[k] || (j[k] = i ? {} : { toJSON: n.noop }), "object" != typeof b && "function" != typeof b || (e ? j[k] = n.extend(j[k], b) : j[k].data = n.extend(j[k].data, b)), g = j[k], e || (g.data || (g.data = {}), g = g.data), void 0 !== d && (g[n.camelCase(b)] = d), "string" == typeof b ? (f = g[b], null == f && (f = g[n.camelCase(b)])) : f = g, f } } function S(a, b, c) { if (M(a)) { var d, e, f = a.nodeType, g = f ? n.cache : a, h = f ? a[n.expando] : n.expando; if (g[h]) { if (b && (d = c ? g[h] : g[h].data)) { n.isArray(b) ? b = b.concat(n.map(b, n.camelCase)) : b in d ? b = [b] : (b = n.camelCase(b), b = b in d ? [b] : b.split(" ")), e = b.length; while (e--) delete d[b[e]]; if (c ? !Q(d) : !n.isEmptyObject(d)) return } (c || (delete g[h].data, Q(g[h]))) && (f ? n.cleanData([a], !0) : l.deleteExpando || g != g.window ? delete g[h] : g[h] = void 0) } } } n.extend({ cache: {}, noData: { "applet ": !0, "embed ": !0, "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function (a) { return a = a.nodeType ? n.cache[a[n.expando]] : a[n.expando], !!a && !Q(a) }, data: function (a, b, c) { return R(a, b, c) }, removeData: function (a, b) { return S(a, b) }, _data: function (a, b, c) { return R(a, b, c, !0) }, _removeData: function (a, b) { return S(a, b, !0) } }), n.fn.extend({ data: function (a, b) { var c, d, e, f = this[0], g = f && f.attributes; if (void 0 === a) { if (this.length && (e = n.data(f), 1 === f.nodeType && !n._data(f, "parsedAttrs"))) { c = g.length; while (c--) g[c] && (d = g[c].name, 0 === d.indexOf("data-") && (d = n.camelCase(d.slice(5)), P(f, d, e[d]))); n._data(f, "parsedAttrs", !0) } return e } return "object" == typeof a ? this.each(function () { n.data(this, a) }) : arguments.length > 1 ? this.each(function () { n.data(this, a, b) }) : f ? P(f, a, n.data(f, a)) : void 0 }, removeData: function (a) { return this.each(function () { n.removeData(this, a) }) } }), n.extend({ queue: function (a, b, c) { var d; return a ? (b = (b || "fx") + "queue", d = n._data(a, b), c && (!d || n.isArray(c) ? d = n._data(a, b, n.makeArray(c)) : d.push(c)), d || []) : void 0 }, dequeue: function (a, b) { b = b || "fx"; var c = n.queue(a, b), d = c.length, e = c.shift(), f = n._queueHooks(a, b), g = function () { n.dequeue(a, b) }; "inprogress" === e && (e = c.shift(), d--), e && ("fx" === b && c.unshift("inprogress"), delete f.stop, e.call(a, g, f)), !d && f && f.empty.fire() }, _queueHooks: function (a, b) { var c = b + "queueHooks"; return n._data(a, c) || n._data(a, c, { empty: n.Callbacks("once memory").add(function () { n._removeData(a, b + "queue"), n._removeData(a, c) }) }) } }), n.fn.extend({ queue: function (a, b) { var c = 2; return "string" != typeof a && (b = a, a = "fx", c--), arguments.length < c ? n.queue(this[0], a) : void 0 === b ? this : this.each(function () { var c = n.queue(this, a, b); n._queueHooks(this, a), "fx" === a && "inprogress" !== c[0] && n.dequeue(this, a) }) }, dequeue: function (a) { return this.each(function () { n.dequeue(this, a) }) }, clearQueue: function (a) { return this.queue(a || "fx", []) }, promise: function (a, b) { var c, d = 1, e = n.Deferred(), f = this, g = this.length, h = function () { --d || e.resolveWith(f, [f]) }; "string" != typeof a && (b = a, a = void 0), a = a || "fx"; while (g--) c = n._data(f[g], a + "queueHooks"), c && c.empty && (d++, c.empty.add(h)); return h(), e.promise(b) } }), function () { var a; l.shrinkWrapBlocks = function () { if (null != a) return a; a = !1; var b, c, e; return c = d.getElementsByTagName("body")[0], c && c.style ? (b = d.createElement("div"), e = d.createElement("div"), e.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px", c.appendChild(e).appendChild(b), "undefined" != typeof b.style.zoom && (b.style.cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1", b.appendChild(d.createElement("div")).style.width = "5px", a = 3 !== b.offsetWidth), c.removeChild(e), a) : void 0 } }(); var T = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, U = new RegExp("^(?:([+-])=|)(" + T + ")([a-z%]*)$", "i"), V = ["Top", "Right", "Bottom", "Left"], W = function (a, b) { return a = b || a, "none" === n.css(a, "display") || !n.contains(a.ownerDocument, a) }; function X(a, b, c, d) { var e, f = 1, g = 20, h = d ? function () { return d.cur() } : function () { return n.css(a, b, "") }, i = h(), j = c && c[3] || (n.cssNumber[b] ? "" : "px"), k = (n.cssNumber[b] || "px" !== j && +i) && U.exec(n.css(a, b)); if (k && k[3] !== j) { j = j || k[3], c = c || [], k = +i || 1; do f = f || ".5", k /= f, n.style(a, b, k + j); while (f !== (f = h() / i) && 1 !== f && --g) } return c && (k = +k || +i || 0, e = c[1] ? k + (c[1] + 1) * c[2] : +c[2], d && (d.unit = j, d.start = k, d.end = e)), e } var Y = function (a, b, c, d, e, f, g) { var h = 0, i = a.length, j = null == c; if ("object" === n.type(c)) { e = !0; for (h in c) Y(a, b, h, c[h], !0, f, g) } else if (void 0 !== d && (e = !0, n.isFunction(d) || (g = !0), j && (g ? (b.call(a, d), b = null) : (j = b, b = function (a, b, c) { return j.call(n(a), c) })), b)) for (; i > h; h++)b(a[h], c, g ? d : d.call(a[h], h, b(a[h], c))); return e ? a : j ? b.call(a) : i ? b(a[0], c) : f }, Z = /^(?:checkbox|radio)$/i, $ = /<([\w:-]+)/, _ = /^$|\/(?:java|ecma)script/i, aa = /^\s+/, ba = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video"; function ca(a) { var b = ba.split("|"), c = a.createDocumentFragment(); if (c.createElement) while (b.length) c.createElement(b.pop()); return c } !function () { var a = d.createElement("div"), b = d.createDocumentFragment(), c = d.createElement("input"); a.innerHTML = " a", l.leadingWhitespace = 3 === a.firstChild.nodeType, l.tbody = !a.getElementsByTagName("tbody").length, l.htmlSerialize = !!a.getElementsByTagName("link").length, l.html5Clone = "<:nav>" !== d.createElement("nav").cloneNode(!0).outerHTML, c.type = "checkbox", c.checked = !0, b.appendChild(c), l.appendChecked = c.checked, a.innerHTML = "", l.noCloneChecked = !!a.cloneNode(!0).lastChild.defaultValue, b.appendChild(a), c = d.createElement("input"), c.setAttribute("type", "radio"), c.setAttribute("checked", "checked"), c.setAttribute("name", "t"), a.appendChild(c), l.checkClone = a.cloneNode(!0).cloneNode(!0).lastChild.checked, l.noCloneEvent = !!a.addEventListener, a[n.expando] = 1, l.attributes = !a.getAttribute(n.expando) }(); var da = { option: [1, ""], legend: [1, ""], area: [1, ""], param: [1, ""], thead: [1, ""], tr: [2, ""], col: [2, ""], td: [3, ""], _default: l.htmlSerialize ? [0, "", ""] : [1, "X", "
"] }; da.optgroup = da.option, da.tbody = da.tfoot = da.colgroup = da.caption = da.thead, da.th = da.td; function ea(a, b) { var c, d, e = 0, f = "undefined" != typeof a.getElementsByTagName ? a.getElementsByTagName(b || "*") : "undefined" != typeof a.querySelectorAll ? a.querySelectorAll(b || "*") : void 0; if (!f) for (f = [], c = a.childNodes || a; null != (d = c[e]); e++)!b || n.nodeName(d, b) ? f.push(d) : n.merge(f, ea(d, b)); return void 0 === b || b && n.nodeName(a, b) ? n.merge([a], f) : f } function fa(a, b) { for (var c, d = 0; null != (c = a[d]); d++)n._data(c, "globalEval", !b || n._data(b[d], "globalEval")) } var ga = /<|?\w+;/, ha = / r; r++)if (g = a[r], g || 0 === g) if ("object" === n.type(g)) n.merge(q, g.nodeType ? [g] : g); else if (ga.test(g)) { i = i || p.appendChild(b.createElement("div")), j = ($.exec(g) || ["", ""])[1].toLowerCase(), m = da[j] || da._default, i.innerHTML = m[1] + n.htmlPrefilter(g) + m[2], f = m[0]; while (f--) i = i.lastChild; if (!l.leadingWhitespace && aa.test(g) && q.push(b.createTextNode(aa.exec(g)[0])), !l.tbody) { g = "table" !== j || ha.test(g) ? "" !== m[1] || ha.test(g) ? 0 : i : i.firstChild, f = g && g.childNodes.length; while (f--) n.nodeName(k = g.childNodes[f], "tbody") && !k.childNodes.length && g.removeChild(k) } n.merge(q, i.childNodes), i.textContent = ""; while (i.firstChild) i.removeChild(i.firstChild); i = p.lastChild } else q.push(b.createTextNode(g)); i && p.removeChild(i), l.appendChecked || n.grep(ea(q, "input"), ia), r = 0; while (g = q[r++]) if (d && n.inArray(g, d) > -1) e && e.push(g); else if (h = n.contains(g.ownerDocument, g), i = ea(p.appendChild(g), "script"), h && fa(i), c) { f = 0; while (g = i[f++]) _.test(g.type || "") && c.push(g) } return i = null, p } !function () { var b, c, e = d.createElement("div"); for (b in { submit: !0, change: !0, focusin: !0 }) c = "on" + b, (l[b] = c in a) || (e.setAttribute(c, "t"), l[b] = e.attributes[c].expando === !1); e = null }(); var ka = /^(?:input|select|textarea)$/i, la = /^key/, ma = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, na = /^(?:focusinfocus|focusoutblur)$/, oa = /^([^.]*)(?:\.(.+)|)/; function pa() { return !0 } function qa() { return !1 } function ra() { try { return d.activeElement } catch (a) { } } function sa(a, b, c, d, e, f) { var g, h; if ("object" == typeof b) { "string" != typeof c && (d = d || c, c = void 0); for (h in b) sa(a, h, c, d, b[h], f); return a } if (null == d && null == e ? (e = c, d = c = void 0) : null == e && ("string" == typeof c ? (e = d, d = void 0) : (e = d, d = c, c = void 0)), e === !1) e = qa; else if (!e) return a; return 1 === f && (g = e, e = function (a) { return n().off(a), g.apply(this, arguments) }, e.guid = g.guid || (g.guid = n.guid++)), a.each(function () { n.event.add(this, b, e, d, c) }) } n.event = { global: {}, add: function (a, b, c, d, e) { var f, g, h, i, j, k, l, m, o, p, q, r = n._data(a); if (r) { c.handler && (i = c, c = i.handler, e = i.selector), c.guid || (c.guid = n.guid++), (g = r.events) || (g = r.events = {}), (k = r.handle) || (k = r.handle = function (a) { return "undefined" == typeof n || a && n.event.triggered === a.type ? void 0 : n.event.dispatch.apply(k.elem, arguments) }, k.elem = a), b = (b || "").match(G) || [""], h = b.length; while (h--) f = oa.exec(b[h]) || [], o = q = f[1], p = (f[2] || "").split(".").sort(), o && (j = n.event.special[o] || {}, o = (e ? j.delegateType : j.bindType) || o, j = n.event.special[o] || {}, l = n.extend({ type: o, origType: q, data: d, handler: c, guid: c.guid, selector: e, needsContext: e && n.expr.match.needsContext.test(e), namespace: p.join(".") }, i), (m = g[o]) || (m = g[o] = [], m.delegateCount = 0, j.setup && j.setup.call(a, d, p, k) !== !1 || (a.addEventListener ? a.addEventListener(o, k, !1) : a.attachEvent && a.attachEvent("on" + o, k))), j.add && (j.add.call(a, l), l.handler.guid || (l.handler.guid = c.guid)), e ? m.splice(m.delegateCount++, 0, l) : m.push(l), n.event.global[o] = !0); a = null } }, remove: function (a, b, c, d, e) { var f, g, h, i, j, k, l, m, o, p, q, r = n.hasData(a) && n._data(a); if (r && (k = r.events)) { b = (b || "").match(G) || [""], j = b.length; while (j--) if (h = oa.exec(b[j]) || [], o = q = h[1], p = (h[2] || "").split(".").sort(), o) { l = n.event.special[o] || {}, o = (d ? l.delegateType : l.bindType) || o, m = k[o] || [], h = h[2] && new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)"), i = f = m.length; while (f--) g = m[f], !e && q !== g.origType || c && c.guid !== g.guid || h && !h.test(g.namespace) || d && d !== g.selector && ("**" !== d || !g.selector) || (m.splice(f, 1), g.selector && m.delegateCount--, l.remove && l.remove.call(a, g)); i && !m.length && (l.teardown && l.teardown.call(a, p, r.handle) !== !1 || n.removeEvent(a, o, r.handle), delete k[o]) } else for (o in k) n.event.remove(a, o + b[j], c, d, !0); n.isEmptyObject(k) && (delete r.handle, n._removeData(a, "events")) } }, trigger: function (b, c, e, f) { var g, h, i, j, l, m, o, p = [e || d], q = k.call(b, "type") ? b.type : b, r = k.call(b, "namespace") ? b.namespace.split(".") : []; if (i = m = e = e || d, 3 !== e.nodeType && 8 !== e.nodeType && !na.test(q + n.event.triggered) && (q.indexOf(".") > -1 && (r = q.split("."), q = r.shift(), r.sort()), h = q.indexOf(":") < 0 && "on" + q, b = b[n.expando] ? b : new n.Event(q, "object" == typeof b && b), b.isTrigger = f ? 2 : 3, b.namespace = r.join("."), b.rnamespace = b.namespace ? new RegExp("(^|\\.)" + r.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, b.result = void 0, b.target || (b.target = e), c = null == c ? [b] : n.makeArray(c, [b]), l = n.event.special[q] || {}, f || !l.trigger || l.trigger.apply(e, c) !== !1)) { if (!f && !l.noBubble && !n.isWindow(e)) { for (j = l.delegateType || q, na.test(j + q) || (i = i.parentNode); i; i = i.parentNode)p.push(i), m = i; m === (e.ownerDocument || d) && p.push(m.defaultView || m.parentWindow || a) } o = 0; while ((i = p[o++]) && !b.isPropagationStopped()) b.type = o > 1 ? j : l.bindType || q, g = (n._data(i, "events") || {})[b.type] && n._data(i, "handle"), g && g.apply(i, c), g = h && i[h], g && g.apply && M(i) && (b.result = g.apply(i, c), b.result === !1 && b.preventDefault()); if (b.type = q, !f && !b.isDefaultPrevented() && (!l._default || l._default.apply(p.pop(), c) === !1) && M(e) && h && e[q] && !n.isWindow(e)) { m = e[h], m && (e[h] = null), n.event.triggered = q; try { e[q]() } catch (s) { } n.event.triggered = void 0, m && (e[h] = m) } return b.result } }, dispatch: function (a) { a = n.event.fix(a); var b, c, d, f, g, h = [], i = e.call(arguments), j = (n._data(this, "events") || {})[a.type] || [], k = n.event.special[a.type] || {}; if (i[0] = a, a.delegateTarget = this, !k.preDispatch || k.preDispatch.call(this, a) !== !1) { h = n.event.handlers.call(this, a, j), b = 0; while ((f = h[b++]) && !a.isPropagationStopped()) { a.currentTarget = f.elem, c = 0; while ((g = f.handlers[c++]) && !a.isImmediatePropagationStopped()) a.rnamespace && !a.rnamespace.test(g.namespace) || (a.handleObj = g, a.data = g.data, d = ((n.event.special[g.origType] || {}).handle || g.handler).apply(f.elem, i), void 0 !== d && (a.result = d) === !1 && (a.preventDefault(), a.stopPropagation())) } return k.postDispatch && k.postDispatch.call(this, a), a.result } }, handlers: function (a, b) { var c, d, e, f, g = [], h = b.delegateCount, i = a.target; if (h && i.nodeType && ("click" !== a.type || isNaN(a.button) || a.button < 1)) for (; i != this; i = i.parentNode || this)if (1 === i.nodeType && (i.disabled !== !0 || "click" !== a.type)) { for (d = [], c = 0; h > c; c++)f = b[c], e = f.selector + " ", void 0 === d[e] && (d[e] = f.needsContext ? n(e, this).index(i) > -1 : n.find(e, this, null, [i]).length), d[e] && d.push(f); d.length && g.push({ elem: i, handlers: d }) } return h < b.length && g.push({ elem: this, handlers: b.slice(h) }), g }, fix: function (a) { if (a[n.expando]) return a; var b, c, e, f = a.type, g = a, h = this.fixHooks[f]; h || (this.fixHooks[f] = h = ma.test(f) ? this.mouseHooks : la.test(f) ? this.keyHooks : {}), e = h.props ? this.props.concat(h.props) : this.props, a = new n.Event(g), b = e.length; while (b--) c = e[b], a[c] = g[c]; return a.target || (a.target = g.srcElement || d), 3 === a.target.nodeType && (a.target = a.target.parentNode), a.metaKey = !!a.metaKey, h.filter ? h.filter(a, g) : a }, props: "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function (a, b) { return null == a.which && (a.which = null != b.charCode ? b.charCode : b.keyCode), a } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function (a, b) { var c, e, f, g = b.button, h = b.fromElement; return null == a.pageX && null != b.clientX && (e = a.target.ownerDocument || d, f = e.documentElement, c = e.body, a.pageX = b.clientX + (f && f.scrollLeft || c && c.scrollLeft || 0) - (f && f.clientLeft || c && c.clientLeft || 0), a.pageY = b.clientY + (f && f.scrollTop || c && c.scrollTop || 0) - (f && f.clientTop || c && c.clientTop || 0)), !a.relatedTarget && h && (a.relatedTarget = h === a.target ? b.toElement : h), a.which || void 0 === g || (a.which = 1 & g ? 1 : 2 & g ? 3 : 4 & g ? 2 : 0), a } }, special: { load: { noBubble: !0 }, focus: { trigger: function () { if (this !== ra() && this.focus) try { return this.focus(), !1 } catch (a) { } }, delegateType: "focusin" }, blur: { trigger: function () { return this === ra() && this.blur ? (this.blur(), !1) : void 0 }, delegateType: "focusout" }, click: { trigger: function () { return n.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : void 0 }, _default: function (a) { return n.nodeName(a.target, "a") } }, beforeunload: { postDispatch: function (a) { void 0 !== a.result && a.originalEvent && (a.originalEvent.returnValue = a.result) } } }, simulate: function (a, b, c) { var d = n.extend(new n.Event, c, { type: a, isSimulated: !0 }); n.event.trigger(d, null, b), d.isDefaultPrevented() && c.preventDefault() } }, n.removeEvent = d.removeEventListener ? function (a, b, c) { a.removeEventListener && a.removeEventListener(b, c) } : function (a, b, c) { var d = "on" + b; a.detachEvent && ("undefined" == typeof a[d] && (a[d] = null), a.detachEvent(d, c)) }, n.Event = function (a, b) { return this instanceof n.Event ? (a && a.type ? (this.originalEvent = a, this.type = a.type, this.isDefaultPrevented = a.defaultPrevented || void 0 === a.defaultPrevented && a.returnValue === !1 ? pa : qa) : this.type = a, b && n.extend(this, b), this.timeStamp = a && a.timeStamp || n.now(), void (this[n.expando] = !0)) : new n.Event(a, b) }, n.Event.prototype = { constructor: n.Event, isDefaultPrevented: qa, isPropagationStopped: qa, isImmediatePropagationStopped: qa, preventDefault: function () { var a = this.originalEvent; this.isDefaultPrevented = pa, a && (a.preventDefault ? a.preventDefault() : a.returnValue = !1) }, stopPropagation: function () { var a = this.originalEvent; this.isPropagationStopped = pa, a && !this.isSimulated && (a.stopPropagation && a.stopPropagation(), a.cancelBubble = !0) }, stopImmediatePropagation: function () { var a = this.originalEvent; this.isImmediatePropagationStopped = pa, a && a.stopImmediatePropagation && a.stopImmediatePropagation(), this.stopPropagation() } }, n.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (a, b) { n.event.special[a] = { delegateType: b, bindType: b, handle: function (a) { var c, d = this, e = a.relatedTarget, f = a.handleObj; return e && (e === d || n.contains(d, e)) || (a.type = f.origType, c = f.handler.apply(this, arguments), a.type = b), c } } }), l.submit || (n.event.special.submit = { setup: function () { return n.nodeName(this, "form") ? !1 : void n.event.add(this, "click._submit keypress._submit", function (a) { var b = a.target, c = n.nodeName(b, "input") || n.nodeName(b, "button") ? n.prop(b, "form") : void 0; c && !n._data(c, "submit") && (n.event.add(c, "submit._submit", function (a) { a._submitBubble = !0 }), n._data(c, "submit", !0)) }) }, postDispatch: function (a) { a._submitBubble && (delete a._submitBubble, this.parentNode && !a.isTrigger && n.event.simulate("submit", this.parentNode, a)) }, teardown: function () { return n.nodeName(this, "form") ? !1 : void n.event.remove(this, "._submit") } }), l.change || (n.event.special.change = { setup: function () { return ka.test(this.nodeName) ? ("checkbox" !== this.type && "radio" !== this.type || (n.event.add(this, "propertychange._change", function (a) { "checked" === a.originalEvent.propertyName && (this._justChanged = !0) }), n.event.add(this, "click._change", function (a) { this._justChanged && !a.isTrigger && (this._justChanged = !1), n.event.simulate("change", this, a) })), !1) : void n.event.add(this, "beforeactivate._change", function (a) { var b = a.target; ka.test(b.nodeName) && !n._data(b, "change") && (n.event.add(b, "change._change", function (a) { !this.parentNode || a.isSimulated || a.isTrigger || n.event.simulate("change", this.parentNode, a) }), n._data(b, "change", !0)) }) }, handle: function (a) { var b = a.target; return this !== b || a.isSimulated || a.isTrigger || "radio" !== b.type && "checkbox" !== b.type ? a.handleObj.handler.apply(this, arguments) : void 0 }, teardown: function () { return n.event.remove(this, "._change"), !ka.test(this.nodeName) } }), l.focusin || n.each({ focus: "focusin", blur: "focusout" }, function (a, b) { var c = function (a) { n.event.simulate(b, a.target, n.event.fix(a)) }; n.event.special[b] = { setup: function () { var d = this.ownerDocument || this, e = n._data(d, b); e || d.addEventListener(a, c, !0), n._data(d, b, (e || 0) + 1) }, teardown: function () { var d = this.ownerDocument || this, e = n._data(d, b) - 1; e ? n._data(d, b, e) : (d.removeEventListener(a, c, !0), n._removeData(d, b)) } } }), n.fn.extend({ on: function (a, b, c, d) { return sa(this, a, b, c, d) }, one: function (a, b, c, d) { return sa(this, a, b, c, d, 1) }, off: function (a, b, c) { var d, e; if (a && a.preventDefault && a.handleObj) return d = a.handleObj, n(a.delegateTarget).off(d.namespace ? d.origType + "." + d.namespace : d.origType, d.selector, d.handler), this; if ("object" == typeof a) { for (e in a) this.off(e, b, a[e]); return this } return b !== !1 && "function" != typeof b || (c = b, b = void 0), c === !1 && (c = qa), this.each(function () { n.event.remove(this, a, c, b) }) }, trigger: function (a, b) { return this.each(function () { n.event.trigger(a, b, this) }) }, triggerHandler: function (a, b) { var c = this[0]; return c ? n.event.trigger(a, b, c, !0) : void 0 } }); var ta = / jQuery\d+="(?:null|\d+)"/g, ua = new RegExp("<(?:" + ba + ")[\\s/>]", "i"), va = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, wa = /
+
+```
+
+```html
+
+
+```
+
+### Usage
+
+Wrap your items (`div`, `a`, `img`, `span`, `li` etc.) with a container element (`div`, `ul` etc.). Only the class `owl-carousel` is mandatory to apply proper styles:
+
+```html
+
+
Your Content
+
Your Content
+
Your Content
+
Your Content
+
Your Content
+
Your Content
+
Your Content
+
+```
+**NOTE:** The `owl-theme` class is optional, but without it, you will need to style navigation features on your own.
+
+
+Call the [plugin](https://learn.jquery.com/plugins/) function and your carousel is ready.
+
+```javascript
+$(document).ready(function(){
+ $('.owl-carousel').owlCarousel();
+});
+```
+
+## Documentation
+
+The documentation, included in this repo in the root directory, is built with [Assemble](http://assemble.io/) and publicly available at https://owlcarousel2.github.io/OwlCarousel2/. The documentation may also be run locally.
+
+## Building
+
+This package comes with [Grunt](http://gruntjs.com/) and [Bower](http://bower.io/). The following tasks are available:
+
+ * `default` compiles the CSS and JS into `/dist` and builds the doc.
+ * `dist` compiles the CSS and JS into `/dist` only.
+ * `watch` watches source files and builds them automatically whenever you save.
+ * `test` runs [JSHint](http://www.jshint.com/) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/).
+
+To define which plugins are build into the distribution just edit `/_config.json` to fit your needs.
+
+## Contributing
+
+Please read [CONTRIBUTING.md](CONTRIBUTING.md).
+
+## Roadmap
+
+Please make sure to check out our [Roadmap Discussion](https://github.com/OwlCarousel2/OwlCarousel2/issues/1756).
+
+
+## License
+
+The code and the documentation are released under the [MIT License](LICENSE).
diff --git a/src/static/assets/vendor/owl.carousel/assets/ajax-loader.gif b/src/static/assets/vendor/owl.carousel/assets/ajax-loader.gif
new file mode 100644
index 0000000..d3962f9
Binary files /dev/null and b/src/static/assets/vendor/owl.carousel/assets/ajax-loader.gif differ
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.carousel.css b/src/static/assets/vendor/owl.carousel/assets/owl.carousel.css
new file mode 100644
index 0000000..40237bc
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.carousel.css
@@ -0,0 +1,186 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+/*
+ * Owl Carousel - Core
+ */
+.owl-carousel {
+ display: none;
+ width: 100%;
+ -webkit-tap-highlight-color: transparent;
+ /* position relative and z-index fix webkit rendering fonts issue */
+ position: relative;
+ z-index: 1; }
+ .owl-carousel .owl-stage {
+ position: relative;
+ -ms-touch-action: pan-Y;
+ touch-action: manipulation;
+ -moz-backface-visibility: hidden;
+ /* fix firefox animation glitch */ }
+ .owl-carousel .owl-stage:after {
+ content: ".";
+ display: block;
+ clear: both;
+ visibility: hidden;
+ line-height: 0;
+ height: 0; }
+ .owl-carousel .owl-stage-outer {
+ position: relative;
+ overflow: hidden;
+ /* fix for flashing background */
+ -webkit-transform: translate3d(0px, 0px, 0px); }
+ .owl-carousel .owl-wrapper,
+ .owl-carousel .owl-item {
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0); }
+ .owl-carousel .owl-item {
+ position: relative;
+ min-height: 1px;
+ float: left;
+ -webkit-backface-visibility: hidden;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-touch-callout: none; }
+ .owl-carousel .owl-item img {
+ display: block;
+ width: 100%; }
+ .owl-carousel .owl-nav.disabled,
+ .owl-carousel .owl-dots.disabled {
+ display: none; }
+ .owl-carousel .owl-nav .owl-prev,
+ .owl-carousel .owl-nav .owl-next,
+ .owl-carousel .owl-dot {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+ .owl-carousel .owl-nav button.owl-prev,
+ .owl-carousel .owl-nav button.owl-next,
+ .owl-carousel button.owl-dot {
+ background: none;
+ color: inherit;
+ border: none;
+ padding: 0 !important;
+ font: inherit; }
+ .owl-carousel.owl-loaded {
+ display: block; }
+ .owl-carousel.owl-loading {
+ opacity: 0;
+ display: block; }
+ .owl-carousel.owl-hidden {
+ opacity: 0; }
+ .owl-carousel.owl-refresh .owl-item {
+ visibility: hidden; }
+ .owl-carousel.owl-drag .owl-item {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+ .owl-carousel.owl-grab {
+ cursor: move;
+ cursor: grab; }
+ .owl-carousel.owl-rtl {
+ direction: rtl; }
+ .owl-carousel.owl-rtl .owl-item {
+ float: right; }
+
+/* No Js */
+.no-js .owl-carousel {
+ display: block; }
+
+/*
+ * Owl Carousel - Animate Plugin
+ */
+.owl-carousel .animated {
+ animation-duration: 1000ms;
+ animation-fill-mode: both; }
+
+.owl-carousel .owl-animated-in {
+ z-index: 0; }
+
+.owl-carousel .owl-animated-out {
+ z-index: 1; }
+
+.owl-carousel .fadeOut {
+ animation-name: fadeOut; }
+
+@keyframes fadeOut {
+ 0% {
+ opacity: 1; }
+ 100% {
+ opacity: 0; } }
+
+/*
+ * Owl Carousel - Auto Height Plugin
+ */
+.owl-height {
+ transition: height 500ms ease-in-out; }
+
+/*
+ * Owl Carousel - Lazy Load Plugin
+ */
+.owl-carousel .owl-item {
+ /**
+ This is introduced due to a bug in IE11 where lazy loading combined with autoheight plugin causes a wrong
+ calculation of the height of the owl-item that breaks page layouts
+ */ }
+ .owl-carousel .owl-item .owl-lazy {
+ opacity: 0;
+ transition: opacity 400ms ease; }
+ .owl-carousel .owl-item .owl-lazy[src^=""], .owl-carousel .owl-item .owl-lazy:not([src]) {
+ max-height: 0; }
+ .owl-carousel .owl-item img.owl-lazy {
+ transform-style: preserve-3d; }
+
+/*
+ * Owl Carousel - Video Plugin
+ */
+.owl-carousel .owl-video-wrapper {
+ position: relative;
+ height: 100%;
+ background: #000; }
+
+.owl-carousel .owl-video-play-icon {
+ position: absolute;
+ height: 80px;
+ width: 80px;
+ left: 50%;
+ top: 50%;
+ margin-left: -40px;
+ margin-top: -40px;
+ background: url("owl.video.play.png") no-repeat;
+ cursor: pointer;
+ z-index: 1;
+ -webkit-backface-visibility: hidden;
+ transition: transform 100ms ease; }
+
+.owl-carousel .owl-video-play-icon:hover {
+ -ms-transform: scale(1.3, 1.3);
+ transform: scale(1.3, 1.3); }
+
+.owl-carousel .owl-video-playing .owl-video-tn,
+.owl-carousel .owl-video-playing .owl-video-play-icon {
+ display: none; }
+
+.owl-carousel .owl-video-tn {
+ opacity: 0;
+ height: 100%;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: contain;
+ transition: opacity 400ms ease; }
+
+.owl-carousel .owl-video-frame {
+ position: relative;
+ z-index: 1;
+ height: 100%;
+ width: 100%; }
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.carousel.min.css b/src/static/assets/vendor/owl.carousel/assets/owl.carousel.min.css
new file mode 100644
index 0000000..a71df11
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.carousel.min.css
@@ -0,0 +1,6 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;touch-action:manipulation;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-nav button.owl-next,.owl-carousel .owl-nav button.owl-prev,.owl-carousel button.owl-dot{background:0 0;color:inherit;border:none;padding:0!important;font:inherit}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item .owl-lazy:not([src]),.owl-carousel .owl-item .owl-lazy[src^=""]{max-height:0}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
\ No newline at end of file
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.css b/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.css
new file mode 100644
index 0000000..e2020fb
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.css
@@ -0,0 +1,50 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+/*
+ * Default theme - Owl Carousel CSS File
+ */
+.owl-theme .owl-nav {
+ margin-top: 10px;
+ text-align: center;
+ -webkit-tap-highlight-color: transparent; }
+ .owl-theme .owl-nav [class*='owl-'] {
+ color: #FFF;
+ font-size: 14px;
+ margin: 5px;
+ padding: 4px 7px;
+ background: #D6D6D6;
+ display: inline-block;
+ cursor: pointer;
+ border-radius: 3px; }
+ .owl-theme .owl-nav [class*='owl-']:hover {
+ background: #869791;
+ color: #FFF;
+ text-decoration: none; }
+ .owl-theme .owl-nav .disabled {
+ opacity: 0.5;
+ cursor: default; }
+
+.owl-theme .owl-nav.disabled + .owl-dots {
+ margin-top: 10px; }
+
+.owl-theme .owl-dots {
+ text-align: center;
+ -webkit-tap-highlight-color: transparent; }
+ .owl-theme .owl-dots .owl-dot {
+ display: inline-block;
+ zoom: 1;
+ *display: inline; }
+ .owl-theme .owl-dots .owl-dot span {
+ width: 10px;
+ height: 10px;
+ margin: 5px 7px;
+ background: #D6D6D6;
+ display: block;
+ -webkit-backface-visibility: visible;
+ transition: opacity 200ms ease;
+ border-radius: 30px; }
+ .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span {
+ background: #869791; }
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.min.css b/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.min.css
new file mode 100644
index 0000000..487088d
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.theme.default.min.css
@@ -0,0 +1,6 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791}
\ No newline at end of file
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.css b/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.css
new file mode 100644
index 0000000..5235fbe
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.css
@@ -0,0 +1,50 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+/*
+ * Green theme - Owl Carousel CSS File
+ */
+.owl-theme .owl-nav {
+ margin-top: 10px;
+ text-align: center;
+ -webkit-tap-highlight-color: transparent; }
+ .owl-theme .owl-nav [class*='owl-'] {
+ color: #FFF;
+ font-size: 14px;
+ margin: 5px;
+ padding: 4px 7px;
+ background: #D6D6D6;
+ display: inline-block;
+ cursor: pointer;
+ border-radius: 3px; }
+ .owl-theme .owl-nav [class*='owl-']:hover {
+ background: #4DC7A0;
+ color: #FFF;
+ text-decoration: none; }
+ .owl-theme .owl-nav .disabled {
+ opacity: 0.5;
+ cursor: default; }
+
+.owl-theme .owl-nav.disabled + .owl-dots {
+ margin-top: 10px; }
+
+.owl-theme .owl-dots {
+ text-align: center;
+ -webkit-tap-highlight-color: transparent; }
+ .owl-theme .owl-dots .owl-dot {
+ display: inline-block;
+ zoom: 1;
+ *display: inline; }
+ .owl-theme .owl-dots .owl-dot span {
+ width: 10px;
+ height: 10px;
+ margin: 5px 7px;
+ background: #D6D6D6;
+ display: block;
+ -webkit-backface-visibility: visible;
+ transition: opacity 200ms ease;
+ border-radius: 30px; }
+ .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span {
+ background: #4DC7A0; }
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.min.css b/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.min.css
new file mode 100644
index 0000000..187bea0
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/assets/owl.theme.green.min.css
@@ -0,0 +1,6 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0}
\ No newline at end of file
diff --git a/src/static/assets/vendor/owl.carousel/assets/owl.video.play.png b/src/static/assets/vendor/owl.carousel/assets/owl.video.play.png
new file mode 100644
index 0000000..5d0218d
Binary files /dev/null and b/src/static/assets/vendor/owl.carousel/assets/owl.video.play.png differ
diff --git a/src/static/assets/vendor/owl.carousel/owl.carousel.js b/src/static/assets/vendor/owl.carousel/owl.carousel.js
new file mode 100644
index 0000000..66c67eb
--- /dev/null
+++ b/src/static/assets/vendor/owl.carousel/owl.carousel.js
@@ -0,0 +1,3448 @@
+/**
+ * Owl Carousel v2.3.4
+ * Copyright 2013-2018 David Deutsch
+ * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
+ */
+/**
+ * Owl carousel
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ * @todo Lazy Load Icon
+ * @todo prevent animationend bubling
+ * @todo itemsScaleUp
+ * @todo Test Zepto
+ * @todo stagePadding calculate wrong active classes
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates a carousel.
+ * @class The Owl Carousel.
+ * @public
+ * @param {HTMLElement|jQuery} element - The element to create the carousel for.
+ * @param {Object} [options] - The options
+ */
+ function Owl(element, options) {
+
+ /**
+ * Current settings for the carousel.
+ * @public
+ */
+ this.settings = null;
+
+ /**
+ * Current options set by the caller including defaults.
+ * @public
+ */
+ this.options = $.extend({}, Owl.Defaults, options);
+
+ /**
+ * Plugin element.
+ * @public
+ */
+ this.$element = $(element);
+
+ /**
+ * Proxied event handlers.
+ * @protected
+ */
+ this._handlers = {};
+
+ /**
+ * References to the running plugins of this carousel.
+ * @protected
+ */
+ this._plugins = {};
+
+ /**
+ * Currently suppressed events to prevent them from being retriggered.
+ * @protected
+ */
+ this._supress = {};
+
+ /**
+ * Absolute current position.
+ * @protected
+ */
+ this._current = null;
+
+ /**
+ * Animation speed in milliseconds.
+ * @protected
+ */
+ this._speed = null;
+
+ /**
+ * Coordinates of all items in pixel.
+ * @todo The name of this member is missleading.
+ * @protected
+ */
+ this._coordinates = [];
+
+ /**
+ * Current breakpoint.
+ * @todo Real media queries would be nice.
+ * @protected
+ */
+ this._breakpoint = null;
+
+ /**
+ * Current width of the plugin element.
+ */
+ this._width = null;
+
+ /**
+ * All real items.
+ * @protected
+ */
+ this._items = [];
+
+ /**
+ * All cloned items.
+ * @protected
+ */
+ this._clones = [];
+
+ /**
+ * Merge values of all items.
+ * @todo Maybe this could be part of a plugin.
+ * @protected
+ */
+ this._mergers = [];
+
+ /**
+ * Widths of all items.
+ */
+ this._widths = [];
+
+ /**
+ * Invalidated parts within the update process.
+ * @protected
+ */
+ this._invalidated = {};
+
+ /**
+ * Ordered list of workers for the update process.
+ * @protected
+ */
+ this._pipe = [];
+
+ /**
+ * Current state information for the drag operation.
+ * @todo #261
+ * @protected
+ */
+ this._drag = {
+ time: null,
+ target: null,
+ pointer: null,
+ stage: {
+ start: null,
+ current: null
+ },
+ direction: null
+ };
+
+ /**
+ * Current state information and their tags.
+ * @type {Object}
+ * @protected
+ */
+ this._states = {
+ current: {},
+ tags: {
+ 'initializing': [ 'busy' ],
+ 'animating': [ 'busy' ],
+ 'dragging': [ 'interacting' ]
+ }
+ };
+
+ $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {
+ this._handlers[handler] = $.proxy(this[handler], this);
+ }, this));
+
+ $.each(Owl.Plugins, $.proxy(function(key, plugin) {
+ this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
+ = new plugin(this);
+ }, this));
+
+ $.each(Owl.Workers, $.proxy(function(priority, worker) {
+ this._pipe.push({
+ 'filter': worker.filter,
+ 'run': $.proxy(worker.run, this)
+ });
+ }, this));
+
+ this.setup();
+ this.initialize();
+ }
+
+ /**
+ * Default options for the carousel.
+ * @public
+ */
+ Owl.Defaults = {
+ items: 3,
+ loop: false,
+ center: false,
+ rewind: false,
+ checkVisibility: true,
+
+ mouseDrag: true,
+ touchDrag: true,
+ pullDrag: true,
+ freeDrag: false,
+
+ margin: 0,
+ stagePadding: 0,
+
+ merge: false,
+ mergeFit: true,
+ autoWidth: false,
+
+ startPosition: 0,
+ rtl: false,
+
+ smartSpeed: 250,
+ fluidSpeed: false,
+ dragEndSpeed: false,
+
+ responsive: {},
+ responsiveRefreshRate: 200,
+ responsiveBaseElement: window,
+
+ fallbackEasing: 'swing',
+ slideTransition: '',
+
+ info: false,
+
+ nestedItemSelector: false,
+ itemElement: 'div',
+ stageElement: 'div',
+
+ refreshClass: 'owl-refresh',
+ loadedClass: 'owl-loaded',
+ loadingClass: 'owl-loading',
+ rtlClass: 'owl-rtl',
+ responsiveClass: 'owl-responsive',
+ dragClass: 'owl-drag',
+ itemClass: 'owl-item',
+ stageClass: 'owl-stage',
+ stageOuterClass: 'owl-stage-outer',
+ grabClass: 'owl-grab'
+ };
+
+ /**
+ * Enumeration for width.
+ * @public
+ * @readonly
+ * @enum {String}
+ */
+ Owl.Width = {
+ Default: 'default',
+ Inner: 'inner',
+ Outer: 'outer'
+ };
+
+ /**
+ * Enumeration for types.
+ * @public
+ * @readonly
+ * @enum {String}
+ */
+ Owl.Type = {
+ Event: 'event',
+ State: 'state'
+ };
+
+ /**
+ * Contains all registered plugins.
+ * @public
+ */
+ Owl.Plugins = {};
+
+ /**
+ * List of workers involved in the update process.
+ */
+ Owl.Workers = [ {
+ filter: [ 'width', 'settings' ],
+ run: function() {
+ this._width = this.$element.width();
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function(cache) {
+ cache.current = this._items && this._items[this.relative(this._current)];
+ }
+ }, {
+ filter: [ 'items', 'settings' ],
+ run: function() {
+ this.$stage.children('.cloned').remove();
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function(cache) {
+ var margin = this.settings.margin || '',
+ grid = !this.settings.autoWidth,
+ rtl = this.settings.rtl,
+ css = {
+ 'width': 'auto',
+ 'margin-left': rtl ? margin : '',
+ 'margin-right': rtl ? '' : margin
+ };
+
+ !grid && this.$stage.children().css(css);
+
+ cache.css = css;
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function(cache) {
+ var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
+ merge = null,
+ iterator = this._items.length,
+ grid = !this.settings.autoWidth,
+ widths = [];
+
+ cache.items = {
+ merge: false,
+ width: width
+ };
+
+ while (iterator--) {
+ merge = this._mergers[iterator];
+ merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
+
+ cache.items.merge = merge > 1 || cache.items.merge;
+
+ widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
+ }
+
+ this._widths = widths;
+ }
+ }, {
+ filter: [ 'items', 'settings' ],
+ run: function() {
+ var clones = [],
+ items = this._items,
+ settings = this.settings,
+ // TODO: Should be computed from number of min width items in stage
+ view = Math.max(settings.items * 2, 4),
+ size = Math.ceil(items.length / 2) * 2,
+ repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
+ append = '',
+ prepend = '';
+
+ repeat /= 2;
+
+ while (repeat > 0) {
+ // Switch to only using appended clones
+ clones.push(this.normalize(clones.length / 2, true));
+ append = append + items[clones[clones.length - 1]][0].outerHTML;
+ clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
+ prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
+ repeat -= 1;
+ }
+
+ this._clones = clones;
+
+ $(append).addClass('cloned').appendTo(this.$stage);
+ $(prepend).addClass('cloned').prependTo(this.$stage);
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function() {
+ var rtl = this.settings.rtl ? 1 : -1,
+ size = this._clones.length + this._items.length,
+ iterator = -1,
+ previous = 0,
+ current = 0,
+ coordinates = [];
+
+ while (++iterator < size) {
+ previous = coordinates[iterator - 1] || 0;
+ current = this._widths[this.relative(iterator)] + this.settings.margin;
+ coordinates.push(previous + current * rtl);
+ }
+
+ this._coordinates = coordinates;
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function() {
+ var padding = this.settings.stagePadding,
+ coordinates = this._coordinates,
+ css = {
+ 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
+ 'padding-left': padding || '',
+ 'padding-right': padding || ''
+ };
+
+ this.$stage.css(css);
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function(cache) {
+ var iterator = this._coordinates.length,
+ grid = !this.settings.autoWidth,
+ items = this.$stage.children();
+
+ if (grid && cache.items.merge) {
+ while (iterator--) {
+ cache.css.width = this._widths[this.relative(iterator)];
+ items.eq(iterator).css(cache.css);
+ }
+ } else if (grid) {
+ cache.css.width = cache.items.width;
+ items.css(cache.css);
+ }
+ }
+ }, {
+ filter: [ 'items' ],
+ run: function() {
+ this._coordinates.length < 1 && this.$stage.removeAttr('style');
+ }
+ }, {
+ filter: [ 'width', 'items', 'settings' ],
+ run: function(cache) {
+ cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
+ cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
+ this.reset(cache.current);
+ }
+ }, {
+ filter: [ 'position' ],
+ run: function() {
+ this.animate(this.coordinates(this._current));
+ }
+ }, {
+ filter: [ 'width', 'position', 'items', 'settings' ],
+ run: function() {
+ var rtl = this.settings.rtl ? 1 : -1,
+ padding = this.settings.stagePadding * 2,
+ begin = this.coordinates(this.current()) + padding,
+ end = begin + this.width() * rtl,
+ inner, outer, matches = [], i, n;
+
+ for (i = 0, n = this._coordinates.length; i < n; i++) {
+ inner = this._coordinates[i - 1] || 0;
+ outer = Math.abs(this._coordinates[i]) + padding * rtl;
+
+ if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
+ || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
+ matches.push(i);
+ }
+ }
+
+ this.$stage.children('.active').removeClass('active');
+ this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
+
+ this.$stage.children('.center').removeClass('center');
+ if (this.settings.center) {
+ this.$stage.children().eq(this.current()).addClass('center');
+ }
+ }
+ } ];
+
+ /**
+ * Create the stage DOM element
+ */
+ Owl.prototype.initializeStage = function() {
+ this.$stage = this.$element.find('.' + this.settings.stageClass);
+
+ // if the stage is already in the DOM, grab it and skip stage initialization
+ if (this.$stage.length) {
+ return;
+ }
+
+ this.$element.addClass(this.options.loadingClass);
+
+ // create stage
+ this.$stage = $('<' + this.settings.stageElement + '>', {
+ "class": this.settings.stageClass
+ }).wrap( $( '', {
+ "class": this.settings.stageOuterClass
+ }));
+
+ // append stage
+ this.$element.append(this.$stage.parent());
+ };
+
+ /**
+ * Create item DOM elements
+ */
+ Owl.prototype.initializeItems = function() {
+ var $items = this.$element.find('.owl-item');
+
+ // if the items are already in the DOM, grab them and skip item initialization
+ if ($items.length) {
+ this._items = $items.get().map(function(item) {
+ return $(item);
+ });
+
+ this._mergers = this._items.map(function() {
+ return 1;
+ });
+
+ this.refresh();
+
+ return;
+ }
+
+ // append content
+ this.replace(this.$element.children().not(this.$stage.parent()));
+
+ // check visibility
+ if (this.isVisible()) {
+ // update view
+ this.refresh();
+ } else {
+ // invalidate width
+ this.invalidate('width');
+ }
+
+ this.$element
+ .removeClass(this.options.loadingClass)
+ .addClass(this.options.loadedClass);
+ };
+
+ /**
+ * Initializes the carousel.
+ * @protected
+ */
+ Owl.prototype.initialize = function() {
+ this.enter('initializing');
+ this.trigger('initialize');
+
+ this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
+
+ if (this.settings.autoWidth && !this.is('pre-loading')) {
+ var imgs, nestedSelector, width;
+ imgs = this.$element.find('img');
+ nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
+ width = this.$element.children(nestedSelector).width();
+
+ if (imgs.length && width <= 0) {
+ this.preloadAutoWidthImages(imgs);
+ }
+ }
+
+ this.initializeStage();
+ this.initializeItems();
+
+ // register event handlers
+ this.registerEventHandlers();
+
+ this.leave('initializing');
+ this.trigger('initialized');
+ };
+
+ /**
+ * @returns {Boolean} visibility of $element
+ * if you know the carousel will always be visible you can set `checkVisibility` to `false` to
+ * prevent the expensive browser layout forced reflow the $element.is(':visible') does
+ */
+ Owl.prototype.isVisible = function() {
+ return this.settings.checkVisibility
+ ? this.$element.is(':visible')
+ : true;
+ };
+
+ /**
+ * Setups the current settings.
+ * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
+ * @todo Support for media queries by using `matchMedia` would be nice.
+ * @public
+ */
+ Owl.prototype.setup = function() {
+ var viewport = this.viewport(),
+ overwrites = this.options.responsive,
+ match = -1,
+ settings = null;
+
+ if (!overwrites) {
+ settings = $.extend({}, this.options);
+ } else {
+ $.each(overwrites, function(breakpoint) {
+ if (breakpoint <= viewport && breakpoint > match) {
+ match = Number(breakpoint);
+ }
+ });
+
+ settings = $.extend({}, this.options, overwrites[match]);
+ if (typeof settings.stagePadding === 'function') {
+ settings.stagePadding = settings.stagePadding();
+ }
+ delete settings.responsive;
+
+ // responsive class
+ if (settings.responsiveClass) {
+ this.$element.attr('class',
+ this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
+ );
+ }
+ }
+
+ this.trigger('change', { property: { name: 'settings', value: settings } });
+ this._breakpoint = match;
+ this.settings = settings;
+ this.invalidate('settings');
+ this.trigger('changed', { property: { name: 'settings', value: this.settings } });
+ };
+
+ /**
+ * Updates option logic if necessery.
+ * @protected
+ */
+ Owl.prototype.optionsLogic = function() {
+ if (this.settings.autoWidth) {
+ this.settings.stagePadding = false;
+ this.settings.merge = false;
+ }
+ };
+
+ /**
+ * Prepares an item before add.
+ * @todo Rename event parameter `content` to `item`.
+ * @protected
+ * @returns {jQuery|HTMLElement} - The item container.
+ */
+ Owl.prototype.prepare = function(item) {
+ var event = this.trigger('prepare', { content: item });
+
+ if (!event.data) {
+ event.data = $('<' + this.settings.itemElement + '/>')
+ .addClass(this.options.itemClass).append(item)
+ }
+
+ this.trigger('prepared', { content: event.data });
+
+ return event.data;
+ };
+
+ /**
+ * Updates the view.
+ * @public
+ */
+ Owl.prototype.update = function() {
+ var i = 0,
+ n = this._pipe.length,
+ filter = $.proxy(function(p) { return this[p] }, this._invalidated),
+ cache = {};
+
+ while (i < n) {
+ if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
+ this._pipe[i].run(cache);
+ }
+ i++;
+ }
+
+ this._invalidated = {};
+
+ !this.is('valid') && this.enter('valid');
+ };
+
+ /**
+ * Gets the width of the view.
+ * @public
+ * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
+ * @returns {Number} - The width of the view in pixel.
+ */
+ Owl.prototype.width = function(dimension) {
+ dimension = dimension || Owl.Width.Default;
+ switch (dimension) {
+ case Owl.Width.Inner:
+ case Owl.Width.Outer:
+ return this._width;
+ default:
+ return this._width - this.settings.stagePadding * 2 + this.settings.margin;
+ }
+ };
+
+ /**
+ * Refreshes the carousel primarily for adaptive purposes.
+ * @public
+ */
+ Owl.prototype.refresh = function() {
+ this.enter('refreshing');
+ this.trigger('refresh');
+
+ this.setup();
+
+ this.optionsLogic();
+
+ this.$element.addClass(this.options.refreshClass);
+
+ this.update();
+
+ this.$element.removeClass(this.options.refreshClass);
+
+ this.leave('refreshing');
+ this.trigger('refreshed');
+ };
+
+ /**
+ * Checks window `resize` event.
+ * @protected
+ */
+ Owl.prototype.onThrottledResize = function() {
+ window.clearTimeout(this.resizeTimer);
+ this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
+ };
+
+ /**
+ * Checks window `resize` event.
+ * @protected
+ */
+ Owl.prototype.onResize = function() {
+ if (!this._items.length) {
+ return false;
+ }
+
+ if (this._width === this.$element.width()) {
+ return false;
+ }
+
+ if (!this.isVisible()) {
+ return false;
+ }
+
+ this.enter('resizing');
+
+ if (this.trigger('resize').isDefaultPrevented()) {
+ this.leave('resizing');
+ return false;
+ }
+
+ this.invalidate('width');
+
+ this.refresh();
+
+ this.leave('resizing');
+ this.trigger('resized');
+ };
+
+ /**
+ * Registers event handlers.
+ * @todo Check `msPointerEnabled`
+ * @todo #261
+ * @protected
+ */
+ Owl.prototype.registerEventHandlers = function() {
+ if ($.support.transition) {
+ this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
+ }
+
+ if (this.settings.responsive !== false) {
+ this.on(window, 'resize', this._handlers.onThrottledResize);
+ }
+
+ if (this.settings.mouseDrag) {
+ this.$element.addClass(this.options.dragClass);
+ this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
+ this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });
+ }
+
+ if (this.settings.touchDrag){
+ this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
+ this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
+ }
+ };
+
+ /**
+ * Handles `touchstart` and `mousedown` events.
+ * @todo Horizontal swipe threshold as option
+ * @todo #261
+ * @protected
+ * @param {Event} event - The event arguments.
+ */
+ Owl.prototype.onDragStart = function(event) {
+ var stage = null;
+
+ if (event.which === 3) {
+ return;
+ }
+
+ if ($.support.transform) {
+ stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
+ stage = {
+ x: stage[stage.length === 16 ? 12 : 4],
+ y: stage[stage.length === 16 ? 13 : 5]
+ };
+ } else {
+ stage = this.$stage.position();
+ stage = {
+ x: this.settings.rtl ?
+ stage.left + this.$stage.width() - this.width() + this.settings.margin :
+ stage.left,
+ y: stage.top
+ };
+ }
+
+ if (this.is('animating')) {
+ $.support.transform ? this.animate(stage.x) : this.$stage.stop()
+ this.invalidate('position');
+ }
+
+ this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
+
+ this.speed(0);
+
+ this._drag.time = new Date().getTime();
+ this._drag.target = $(event.target);
+ this._drag.stage.start = stage;
+ this._drag.stage.current = stage;
+ this._drag.pointer = this.pointer(event);
+
+ $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
+
+ $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {
+ var delta = this.difference(this._drag.pointer, this.pointer(event));
+
+ $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
+
+ if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
+ return;
+ }
+
+ event.preventDefault();
+
+ this.enter('dragging');
+ this.trigger('drag');
+ }, this));
+ };
+
+ /**
+ * Handles the `touchmove` and `mousemove` events.
+ * @todo #261
+ * @protected
+ * @param {Event} event - The event arguments.
+ */
+ Owl.prototype.onDragMove = function(event) {
+ var minimum = null,
+ maximum = null,
+ pull = null,
+ delta = this.difference(this._drag.pointer, this.pointer(event)),
+ stage = this.difference(this._drag.stage.start, delta);
+
+ if (!this.is('dragging')) {
+ return;
+ }
+
+ event.preventDefault();
+
+ if (this.settings.loop) {
+ minimum = this.coordinates(this.minimum());
+ maximum = this.coordinates(this.maximum() + 1) - minimum;
+ stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
+ } else {
+ minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
+ maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
+ pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
+ stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
+ }
+
+ this._drag.stage.current = stage;
+
+ this.animate(stage.x);
+ };
+
+ /**
+ * Handles the `touchend` and `mouseup` events.
+ * @todo #261
+ * @todo Threshold for click event
+ * @protected
+ * @param {Event} event - The event arguments.
+ */
+ Owl.prototype.onDragEnd = function(event) {
+ var delta = this.difference(this._drag.pointer, this.pointer(event)),
+ stage = this._drag.stage.current,
+ direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
+
+ $(document).off('.owl.core');
+
+ this.$element.removeClass(this.options.grabClass);
+
+ if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
+ this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
+ this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
+ this.invalidate('position');
+ this.update();
+
+ this._drag.direction = direction;
+
+ if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
+ this._drag.target.one('click.owl.core', function() { return false; });
+ }
+ }
+
+ if (!this.is('dragging')) {
+ return;
+ }
+
+ this.leave('dragging');
+ this.trigger('dragged');
+ };
+
+ /**
+ * Gets absolute position of the closest item for a coordinate.
+ * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
+ * @protected
+ * @param {Number} coordinate - The coordinate in pixel.
+ * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
+ * @return {Number} - The absolute position of the closest item.
+ */
+ Owl.prototype.closest = function(coordinate, direction) {
+ var position = -1,
+ pull = 30,
+ width = this.width(),
+ coordinates = this.coordinates();
+
+ if (!this.settings.freeDrag) {
+ // check closest item
+ $.each(coordinates, $.proxy(function(index, value) {
+ // on a left pull, check on current index
+ if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
+ position = index;
+ // on a right pull, check on previous index
+ // to do so, subtract width from value and set position = index + 1
+ } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
+ position = index + 1;
+ } else if (this.op(coordinate, '<', value)
+ && this.op(coordinate, '>', coordinates[index + 1] !== undefined ? coordinates[index + 1] : value - width)) {
+ position = direction === 'left' ? index + 1 : index;
+ }
+ return position === -1;
+ }, this));
+ }
+
+ if (!this.settings.loop) {
+ // non loop boundries
+ if (this.op(coordinate, '>', coordinates[this.minimum()])) {
+ position = coordinate = this.minimum();
+ } else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
+ position = coordinate = this.maximum();
+ }
+ }
+
+ return position;
+ };
+
+ /**
+ * Animates the stage.
+ * @todo #270
+ * @public
+ * @param {Number} coordinate - The coordinate in pixels.
+ */
+ Owl.prototype.animate = function(coordinate) {
+ var animate = this.speed() > 0;
+
+ this.is('animating') && this.onTransitionEnd();
+
+ if (animate) {
+ this.enter('animating');
+ this.trigger('translate');
+ }
+
+ if ($.support.transform3d && $.support.transition) {
+ this.$stage.css({
+ transform: 'translate3d(' + coordinate + 'px,0px,0px)',
+ transition: (this.speed() / 1000) + 's' + (
+ this.settings.slideTransition ? ' ' + this.settings.slideTransition : ''
+ )
+ });
+ } else if (animate) {
+ this.$stage.animate({
+ left: coordinate + 'px'
+ }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
+ } else {
+ this.$stage.css({
+ left: coordinate + 'px'
+ });
+ }
+ };
+
+ /**
+ * Checks whether the carousel is in a specific state or not.
+ * @param {String} state - The state to check.
+ * @returns {Boolean} - The flag which indicates if the carousel is busy.
+ */
+ Owl.prototype.is = function(state) {
+ return this._states.current[state] && this._states.current[state] > 0;
+ };
+
+ /**
+ * Sets the absolute position of the current item.
+ * @public
+ * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
+ * @returns {Number} - The absolute position of the current item.
+ */
+ Owl.prototype.current = function(position) {
+ if (position === undefined) {
+ return this._current;
+ }
+
+ if (this._items.length === 0) {
+ return undefined;
+ }
+
+ position = this.normalize(position);
+
+ if (this._current !== position) {
+ var event = this.trigger('change', { property: { name: 'position', value: position } });
+
+ if (event.data !== undefined) {
+ position = this.normalize(event.data);
+ }
+
+ this._current = position;
+
+ this.invalidate('position');
+
+ this.trigger('changed', { property: { name: 'position', value: this._current } });
+ }
+
+ return this._current;
+ };
+
+ /**
+ * Invalidates the given part of the update routine.
+ * @param {String} [part] - The part to invalidate.
+ * @returns {Array.} - The invalidated parts.
+ */
+ Owl.prototype.invalidate = function(part) {
+ if ($.type(part) === 'string') {
+ this._invalidated[part] = true;
+ this.is('valid') && this.leave('valid');
+ }
+ return $.map(this._invalidated, function(v, i) { return i });
+ };
+
+ /**
+ * Resets the absolute position of the current item.
+ * @public
+ * @param {Number} position - The absolute position of the new item.
+ */
+ Owl.prototype.reset = function(position) {
+ position = this.normalize(position);
+
+ if (position === undefined) {
+ return;
+ }
+
+ this._speed = 0;
+ this._current = position;
+
+ this.suppress([ 'translate', 'translated' ]);
+
+ this.animate(this.coordinates(position));
+
+ this.release([ 'translate', 'translated' ]);
+ };
+
+ /**
+ * Normalizes an absolute or a relative position of an item.
+ * @public
+ * @param {Number} position - The absolute or relative position to normalize.
+ * @param {Boolean} [relative=false] - Whether the given position is relative or not.
+ * @returns {Number} - The normalized position.
+ */
+ Owl.prototype.normalize = function(position, relative) {
+ var n = this._items.length,
+ m = relative ? 0 : this._clones.length;
+
+ if (!this.isNumeric(position) || n < 1) {
+ position = undefined;
+ } else if (position < 0 || position >= n + m) {
+ position = ((position - m / 2) % n + n) % n + m / 2;
+ }
+
+ return position;
+ };
+
+ /**
+ * Converts an absolute position of an item into a relative one.
+ * @public
+ * @param {Number} position - The absolute position to convert.
+ * @returns {Number} - The converted position.
+ */
+ Owl.prototype.relative = function(position) {
+ position -= this._clones.length / 2;
+ return this.normalize(position, true);
+ };
+
+ /**
+ * Gets the maximum position for the current item.
+ * @public
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
+ * @returns {Number}
+ */
+ Owl.prototype.maximum = function(relative) {
+ var settings = this.settings,
+ maximum = this._coordinates.length,
+ iterator,
+ reciprocalItemsWidth,
+ elementWidth;
+
+ if (settings.loop) {
+ maximum = this._clones.length / 2 + this._items.length - 1;
+ } else if (settings.autoWidth || settings.merge) {
+ iterator = this._items.length;
+ if (iterator) {
+ reciprocalItemsWidth = this._items[--iterator].width();
+ elementWidth = this.$element.width();
+ while (iterator--) {
+ reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;
+ if (reciprocalItemsWidth > elementWidth) {
+ break;
+ }
+ }
+ }
+ maximum = iterator + 1;
+ } else if (settings.center) {
+ maximum = this._items.length - 1;
+ } else {
+ maximum = this._items.length - settings.items;
+ }
+
+ if (relative) {
+ maximum -= this._clones.length / 2;
+ }
+
+ return Math.max(maximum, 0);
+ };
+
+ /**
+ * Gets the minimum position for the current item.
+ * @public
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
+ * @returns {Number}
+ */
+ Owl.prototype.minimum = function(relative) {
+ return relative ? 0 : this._clones.length / 2;
+ };
+
+ /**
+ * Gets an item at the specified relative position.
+ * @public
+ * @param {Number} [position] - The relative position of the item.
+ * @return {jQuery|Array.} - The item at the given position or all items if no position was given.
+ */
+ Owl.prototype.items = function(position) {
+ if (position === undefined) {
+ return this._items.slice();
+ }
+
+ position = this.normalize(position, true);
+ return this._items[position];
+ };
+
+ /**
+ * Gets an item at the specified relative position.
+ * @public
+ * @param {Number} [position] - The relative position of the item.
+ * @return {jQuery|Array.} - The item at the given position or all items if no position was given.
+ */
+ Owl.prototype.mergers = function(position) {
+ if (position === undefined) {
+ return this._mergers.slice();
+ }
+
+ position = this.normalize(position, true);
+ return this._mergers[position];
+ };
+
+ /**
+ * Gets the absolute positions of clones for an item.
+ * @public
+ * @param {Number} [position] - The relative position of the item.
+ * @returns {Array.} - The absolute positions of clones for the item or all if no position was given.
+ */
+ Owl.prototype.clones = function(position) {
+ var odd = this._clones.length / 2,
+ even = odd + this._items.length,
+ map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };
+
+ if (position === undefined) {
+ return $.map(this._clones, function(v, i) { return map(i) });
+ }
+
+ return $.map(this._clones, function(v, i) { return v === position ? map(i) : null });
+ };
+
+ /**
+ * Sets the current animation speed.
+ * @public
+ * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
+ * @returns {Number} - The current animation speed in milliseconds.
+ */
+ Owl.prototype.speed = function(speed) {
+ if (speed !== undefined) {
+ this._speed = speed;
+ }
+
+ return this._speed;
+ };
+
+ /**
+ * Gets the coordinate of an item.
+ * @todo The name of this method is missleanding.
+ * @public
+ * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
+ * @returns {Number|Array.} - The coordinate of the item in pixel or all coordinates.
+ */
+ Owl.prototype.coordinates = function(position) {
+ var multiplier = 1,
+ newPosition = position - 1,
+ coordinate;
+
+ if (position === undefined) {
+ return $.map(this._coordinates, $.proxy(function(coordinate, index) {
+ return this.coordinates(index);
+ }, this));
+ }
+
+ if (this.settings.center) {
+ if (this.settings.rtl) {
+ multiplier = -1;
+ newPosition = position + 1;
+ }
+
+ coordinate = this._coordinates[position];
+ coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
+ } else {
+ coordinate = this._coordinates[newPosition] || 0;
+ }
+
+ coordinate = Math.ceil(coordinate);
+
+ return coordinate;
+ };
+
+ /**
+ * Calculates the speed for a translation.
+ * @protected
+ * @param {Number} from - The absolute position of the start item.
+ * @param {Number} to - The absolute position of the target item.
+ * @param {Number} [factor=undefined] - The time factor in milliseconds.
+ * @returns {Number} - The time in milliseconds for the translation.
+ */
+ Owl.prototype.duration = function(from, to, factor) {
+ if (factor === 0) {
+ return 0;
+ }
+
+ return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));
+ };
+
+ /**
+ * Slides to the specified item.
+ * @public
+ * @param {Number} position - The position of the item.
+ * @param {Number} [speed] - The time in milliseconds for the transition.
+ */
+ Owl.prototype.to = function(position, speed) {
+ var current = this.current(),
+ revert = null,
+ distance = position - this.relative(current),
+ direction = (distance > 0) - (distance < 0),
+ items = this._items.length,
+ minimum = this.minimum(),
+ maximum = this.maximum();
+
+ if (this.settings.loop) {
+ if (!this.settings.rewind && Math.abs(distance) > items / 2) {
+ distance += direction * -1 * items;
+ }
+
+ position = current + distance;
+ revert = ((position - minimum) % items + items) % items + minimum;
+
+ if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
+ current = revert - distance;
+ position = revert;
+ this.reset(current);
+ }
+ } else if (this.settings.rewind) {
+ maximum += 1;
+ position = (position % maximum + maximum) % maximum;
+ } else {
+ position = Math.max(minimum, Math.min(maximum, position));
+ }
+
+ this.speed(this.duration(current, position, speed));
+ this.current(position);
+
+ if (this.isVisible()) {
+ this.update();
+ }
+ };
+
+ /**
+ * Slides to the next item.
+ * @public
+ * @param {Number} [speed] - The time in milliseconds for the transition.
+ */
+ Owl.prototype.next = function(speed) {
+ speed = speed || false;
+ this.to(this.relative(this.current()) + 1, speed);
+ };
+
+ /**
+ * Slides to the previous item.
+ * @public
+ * @param {Number} [speed] - The time in milliseconds for the transition.
+ */
+ Owl.prototype.prev = function(speed) {
+ speed = speed || false;
+ this.to(this.relative(this.current()) - 1, speed);
+ };
+
+ /**
+ * Handles the end of an animation.
+ * @protected
+ * @param {Event} event - The event arguments.
+ */
+ Owl.prototype.onTransitionEnd = function(event) {
+
+ // if css2 animation then event object is undefined
+ if (event !== undefined) {
+ event.stopPropagation();
+
+ // Catch only owl-stage transitionEnd event
+ if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
+ return false;
+ }
+ }
+
+ this.leave('animating');
+ this.trigger('translated');
+ };
+
+ /**
+ * Gets viewport width.
+ * @protected
+ * @return {Number} - The width in pixel.
+ */
+ Owl.prototype.viewport = function() {
+ var width;
+ if (this.options.responsiveBaseElement !== window) {
+ width = $(this.options.responsiveBaseElement).width();
+ } else if (window.innerWidth) {
+ width = window.innerWidth;
+ } else if (document.documentElement && document.documentElement.clientWidth) {
+ width = document.documentElement.clientWidth;
+ } else {
+ console.warn('Can not detect viewport width.');
+ }
+ return width;
+ };
+
+ /**
+ * Replaces the current content.
+ * @public
+ * @param {HTMLElement|jQuery|String} content - The new content.
+ */
+ Owl.prototype.replace = function(content) {
+ this.$stage.empty();
+ this._items = [];
+
+ if (content) {
+ content = (content instanceof jQuery) ? content : $(content);
+ }
+
+ if (this.settings.nestedItemSelector) {
+ content = content.find('.' + this.settings.nestedItemSelector);
+ }
+
+ content.filter(function() {
+ return this.nodeType === 1;
+ }).each($.proxy(function(index, item) {
+ item = this.prepare(item);
+ this.$stage.append(item);
+ this._items.push(item);
+ this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
+ }, this));
+
+ this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
+
+ this.invalidate('items');
+ };
+
+ /**
+ * Adds an item.
+ * @todo Use `item` instead of `content` for the event arguments.
+ * @public
+ * @param {HTMLElement|jQuery|String} content - The item content to add.
+ * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
+ */
+ Owl.prototype.add = function(content, position) {
+ var current = this.relative(this._current);
+
+ position = position === undefined ? this._items.length : this.normalize(position, true);
+ content = content instanceof jQuery ? content : $(content);
+
+ this.trigger('add', { content: content, position: position });
+
+ content = this.prepare(content);
+
+ if (this._items.length === 0 || position === this._items.length) {
+ this._items.length === 0 && this.$stage.append(content);
+ this._items.length !== 0 && this._items[position - 1].after(content);
+ this._items.push(content);
+ this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
+ } else {
+ this._items[position].before(content);
+ this._items.splice(position, 0, content);
+ this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
+ }
+
+ this._items[current] && this.reset(this._items[current].index());
+
+ this.invalidate('items');
+
+ this.trigger('added', { content: content, position: position });
+ };
+
+ /**
+ * Removes an item by its position.
+ * @todo Use `item` instead of `content` for the event arguments.
+ * @public
+ * @param {Number} position - The relative position of the item to remove.
+ */
+ Owl.prototype.remove = function(position) {
+ position = this.normalize(position, true);
+
+ if (position === undefined) {
+ return;
+ }
+
+ this.trigger('remove', { content: this._items[position], position: position });
+
+ this._items[position].remove();
+ this._items.splice(position, 1);
+ this._mergers.splice(position, 1);
+
+ this.invalidate('items');
+
+ this.trigger('removed', { content: null, position: position });
+ };
+
+ /**
+ * Preloads images with auto width.
+ * @todo Replace by a more generic approach
+ * @protected
+ */
+ Owl.prototype.preloadAutoWidthImages = function(images) {
+ images.each($.proxy(function(i, element) {
+ this.enter('pre-loading');
+ element = $(element);
+ $(new Image()).one('load', $.proxy(function(e) {
+ element.attr('src', e.target.src);
+ element.css('opacity', 1);
+ this.leave('pre-loading');
+ !this.is('pre-loading') && !this.is('initializing') && this.refresh();
+ }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
+ }, this));
+ };
+
+ /**
+ * Destroys the carousel.
+ * @public
+ */
+ Owl.prototype.destroy = function() {
+
+ this.$element.off('.owl.core');
+ this.$stage.off('.owl.core');
+ $(document).off('.owl.core');
+
+ if (this.settings.responsive !== false) {
+ window.clearTimeout(this.resizeTimer);
+ this.off(window, 'resize', this._handlers.onThrottledResize);
+ }
+
+ for (var i in this._plugins) {
+ this._plugins[i].destroy();
+ }
+
+ this.$stage.children('.cloned').remove();
+
+ this.$stage.unwrap();
+ this.$stage.children().contents().unwrap();
+ this.$stage.children().unwrap();
+ this.$stage.remove();
+ this.$element
+ .removeClass(this.options.refreshClass)
+ .removeClass(this.options.loadingClass)
+ .removeClass(this.options.loadedClass)
+ .removeClass(this.options.rtlClass)
+ .removeClass(this.options.dragClass)
+ .removeClass(this.options.grabClass)
+ .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
+ .removeData('owl.carousel');
+ };
+
+ /**
+ * Operators to calculate right-to-left and left-to-right.
+ * @protected
+ * @param {Number} [a] - The left side operand.
+ * @param {String} [o] - The operator.
+ * @param {Number} [b] - The right side operand.
+ */
+ Owl.prototype.op = function(a, o, b) {
+ var rtl = this.settings.rtl;
+ switch (o) {
+ case '<':
+ return rtl ? a > b : a < b;
+ case '>':
+ return rtl ? a < b : a > b;
+ case '>=':
+ return rtl ? a <= b : a >= b;
+ case '<=':
+ return rtl ? a >= b : a <= b;
+ default:
+ break;
+ }
+ };
+
+ /**
+ * Attaches to an internal event.
+ * @protected
+ * @param {HTMLElement} element - The event source.
+ * @param {String} event - The event name.
+ * @param {Function} listener - The event handler to attach.
+ * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
+ */
+ Owl.prototype.on = function(element, event, listener, capture) {
+ if (element.addEventListener) {
+ element.addEventListener(event, listener, capture);
+ } else if (element.attachEvent) {
+ element.attachEvent('on' + event, listener);
+ }
+ };
+
+ /**
+ * Detaches from an internal event.
+ * @protected
+ * @param {HTMLElement} element - The event source.
+ * @param {String} event - The event name.
+ * @param {Function} listener - The attached event handler to detach.
+ * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
+ */
+ Owl.prototype.off = function(element, event, listener, capture) {
+ if (element.removeEventListener) {
+ element.removeEventListener(event, listener, capture);
+ } else if (element.detachEvent) {
+ element.detachEvent('on' + event, listener);
+ }
+ };
+
+ /**
+ * Triggers a public event.
+ * @todo Remove `status`, `relatedTarget` should be used instead.
+ * @protected
+ * @param {String} name - The event name.
+ * @param {*} [data=null] - The event data.
+ * @param {String} [namespace=carousel] - The event namespace.
+ * @param {String} [state] - The state which is associated with the event.
+ * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
+ * @returns {Event} - The event arguments.
+ */
+ Owl.prototype.trigger = function(name, data, namespace, state, enter) {
+ var status = {
+ item: { count: this._items.length, index: this.current() }
+ }, handler = $.camelCase(
+ $.grep([ 'on', name, namespace ], function(v) { return v })
+ .join('-').toLowerCase()
+ ), event = $.Event(
+ [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),
+ $.extend({ relatedTarget: this }, status, data)
+ );
+
+ if (!this._supress[name]) {
+ $.each(this._plugins, function(name, plugin) {
+ if (plugin.onTrigger) {
+ plugin.onTrigger(event);
+ }
+ });
+
+ this.register({ type: Owl.Type.Event, name: name });
+ this.$element.trigger(event);
+
+ if (this.settings && typeof this.settings[handler] === 'function') {
+ this.settings[handler].call(this, event);
+ }
+ }
+
+ return event;
+ };
+
+ /**
+ * Enters a state.
+ * @param name - The state name.
+ */
+ Owl.prototype.enter = function(name) {
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
+ if (this._states.current[name] === undefined) {
+ this._states.current[name] = 0;
+ }
+
+ this._states.current[name]++;
+ }, this));
+ };
+
+ /**
+ * Leaves a state.
+ * @param name - The state name.
+ */
+ Owl.prototype.leave = function(name) {
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
+ this._states.current[name]--;
+ }, this));
+ };
+
+ /**
+ * Registers an event or state.
+ * @public
+ * @param {Object} object - The event or state to register.
+ */
+ Owl.prototype.register = function(object) {
+ if (object.type === Owl.Type.Event) {
+ if (!$.event.special[object.name]) {
+ $.event.special[object.name] = {};
+ }
+
+ if (!$.event.special[object.name].owl) {
+ var _default = $.event.special[object.name]._default;
+ $.event.special[object.name]._default = function(e) {
+ if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
+ return _default.apply(this, arguments);
+ }
+ return e.namespace && e.namespace.indexOf('owl') > -1;
+ };
+ $.event.special[object.name].owl = true;
+ }
+ } else if (object.type === Owl.Type.State) {
+ if (!this._states.tags[object.name]) {
+ this._states.tags[object.name] = object.tags;
+ } else {
+ this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
+ }
+
+ this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {
+ return $.inArray(tag, this._states.tags[object.name]) === i;
+ }, this));
+ }
+ };
+
+ /**
+ * Suppresses events.
+ * @protected
+ * @param {Array.} events - The events to suppress.
+ */
+ Owl.prototype.suppress = function(events) {
+ $.each(events, $.proxy(function(index, event) {
+ this._supress[event] = true;
+ }, this));
+ };
+
+ /**
+ * Releases suppressed events.
+ * @protected
+ * @param {Array.} events - The events to release.
+ */
+ Owl.prototype.release = function(events) {
+ $.each(events, $.proxy(function(index, event) {
+ delete this._supress[event];
+ }, this));
+ };
+
+ /**
+ * Gets unified pointer coordinates from event.
+ * @todo #261
+ * @protected
+ * @param {Event} - The `mousedown` or `touchstart` event.
+ * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
+ */
+ Owl.prototype.pointer = function(event) {
+ var result = { x: null, y: null };
+
+ event = event.originalEvent || event || window.event;
+
+ event = event.touches && event.touches.length ?
+ event.touches[0] : event.changedTouches && event.changedTouches.length ?
+ event.changedTouches[0] : event;
+
+ if (event.pageX) {
+ result.x = event.pageX;
+ result.y = event.pageY;
+ } else {
+ result.x = event.clientX;
+ result.y = event.clientY;
+ }
+
+ return result;
+ };
+
+ /**
+ * Determines if the input is a Number or something that can be coerced to a Number
+ * @protected
+ * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
+ * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
+ */
+ Owl.prototype.isNumeric = function(number) {
+ return !isNaN(parseFloat(number));
+ };
+
+ /**
+ * Gets the difference of two vectors.
+ * @todo #261
+ * @protected
+ * @param {Object} - The first vector.
+ * @param {Object} - The second vector.
+ * @returns {Object} - The difference.
+ */
+ Owl.prototype.difference = function(first, second) {
+ return {
+ x: first.x - second.x,
+ y: first.y - second.y
+ };
+ };
+
+ /**
+ * The jQuery Plugin for the Owl Carousel
+ * @todo Navigation plugin `next` and `prev`
+ * @public
+ */
+ $.fn.owlCarousel = function(option) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ return this.each(function() {
+ var $this = $(this),
+ data = $this.data('owl.carousel');
+
+ if (!data) {
+ data = new Owl(this, typeof option == 'object' && option);
+ $this.data('owl.carousel', data);
+
+ $.each([
+ 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
+ ], function(i, event) {
+ data.register({ type: Owl.Type.Event, name: event });
+ data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {
+ if (e.namespace && e.relatedTarget !== this) {
+ this.suppress([ event ]);
+ data[event].apply(this, [].slice.call(arguments, 1));
+ this.release([ event ]);
+ }
+ }, data));
+ });
+ }
+
+ if (typeof option == 'string' && option.charAt(0) !== '_') {
+ data[option].apply(data, args);
+ }
+ });
+ };
+
+ /**
+ * The constructor for the jQuery Plugin
+ * @public
+ */
+ $.fn.owlCarousel.Constructor = Owl;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * AutoRefresh Plugin
+ * @version 2.3.4
+ * @author Artus Kolanowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the auto refresh plugin.
+ * @class The Auto Refresh Plugin
+ * @param {Owl} carousel - The Owl Carousel
+ */
+ var AutoRefresh = function(carousel) {
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ /**
+ * Refresh interval.
+ * @protected
+ * @type {number}
+ */
+ this._interval = null;
+
+ /**
+ * Whether the element is currently visible or not.
+ * @protected
+ * @type {Boolean}
+ */
+ this._visible = null;
+
+ /**
+ * All event handlers.
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'initialized.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.autoRefresh) {
+ this.watch();
+ }
+ }, this)
+ };
+
+ // set default options
+ this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
+
+ // register event handlers
+ this._core.$element.on(this._handlers);
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ AutoRefresh.Defaults = {
+ autoRefresh: true,
+ autoRefreshInterval: 500
+ };
+
+ /**
+ * Watches the element.
+ */
+ AutoRefresh.prototype.watch = function() {
+ if (this._interval) {
+ return;
+ }
+
+ this._visible = this._core.isVisible();
+ this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
+ };
+
+ /**
+ * Refreshes the element.
+ */
+ AutoRefresh.prototype.refresh = function() {
+ if (this._core.isVisible() === this._visible) {
+ return;
+ }
+
+ this._visible = !this._visible;
+
+ this._core.$element.toggleClass('owl-hidden', !this._visible);
+
+ this._visible && (this._core.invalidate('width') && this._core.refresh());
+ };
+
+ /**
+ * Destroys the plugin.
+ */
+ AutoRefresh.prototype.destroy = function() {
+ var handler, property;
+
+ window.clearInterval(this._interval);
+
+ for (handler in this._handlers) {
+ this._core.$element.off(handler, this._handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] != 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * Lazy Plugin
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the lazy plugin.
+ * @class The Lazy Plugin
+ * @param {Owl} carousel - The Owl Carousel
+ */
+ var Lazy = function(carousel) {
+
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ /**
+ * Already loaded items.
+ * @protected
+ * @type {Array.}
+ */
+ this._loaded = [];
+
+ /**
+ * Event handlers.
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {
+ if (!e.namespace) {
+ return;
+ }
+
+ if (!this._core.settings || !this._core.settings.lazyLoad) {
+ return;
+ }
+
+ if ((e.property && e.property.name == 'position') || e.type == 'initialized') {
+ var settings = this._core.settings,
+ n = (settings.center && Math.ceil(settings.items / 2) || settings.items),
+ i = ((settings.center && n * -1) || 0),
+ position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
+ clones = this._core.clones().length,
+ load = $.proxy(function(i, v) { this.load(v) }, this);
+ //TODO: Need documentation for this new option
+ if (settings.lazyLoadEager > 0) {
+ n += settings.lazyLoadEager;
+ // If the carousel is looping also preload images that are to the "left"
+ if (settings.loop) {
+ position -= settings.lazyLoadEager;
+ n++;
+ }
+ }
+
+ while (i++ < n) {
+ this.load(clones / 2 + this._core.relative(position));
+ clones && $.each(this._core.clones(this._core.relative(position)), load);
+ position++;
+ }
+ }
+ }, this)
+ };
+
+ // set the default options
+ this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
+
+ // register event handler
+ this._core.$element.on(this._handlers);
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ Lazy.Defaults = {
+ lazyLoad: false,
+ lazyLoadEager: 0
+ };
+
+ /**
+ * Loads all resources of an item at the specified position.
+ * @param {Number} position - The absolute position of the item.
+ * @protected
+ */
+ Lazy.prototype.load = function(position) {
+ var $item = this._core.$stage.children().eq(position),
+ $elements = $item && $item.find('.owl-lazy');
+
+ if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
+ return;
+ }
+
+ $elements.each($.proxy(function(index, element) {
+ var $element = $(element), image,
+ url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src') || $element.attr('data-srcset');
+
+ this._core.trigger('load', { element: $element, url: url }, 'lazy');
+
+ if ($element.is('img')) {
+ $element.one('load.owl.lazy', $.proxy(function() {
+ $element.css('opacity', 1);
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
+ }, this)).attr('src', url);
+ } else if ($element.is('source')) {
+ $element.one('load.owl.lazy', $.proxy(function() {
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
+ }, this)).attr('srcset', url);
+ } else {
+ image = new Image();
+ image.onload = $.proxy(function() {
+ $element.css({
+ 'background-image': 'url("' + url + '")',
+ 'opacity': '1'
+ });
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
+ }, this);
+ image.src = url;
+ }
+ }, this));
+
+ this._loaded.push($item.get(0));
+ };
+
+ /**
+ * Destroys the plugin.
+ * @public
+ */
+ Lazy.prototype.destroy = function() {
+ var handler, property;
+
+ for (handler in this.handlers) {
+ this._core.$element.off(handler, this.handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] != 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * AutoHeight Plugin
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the auto height plugin.
+ * @class The Auto Height Plugin
+ * @param {Owl} carousel - The Owl Carousel
+ */
+ var AutoHeight = function(carousel) {
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ this._previousHeight = null;
+
+ /**
+ * All event handlers.
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.autoHeight) {
+ this.update();
+ }
+ }, this),
+ 'changed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.autoHeight && e.property.name === 'position'){
+ this.update();
+ }
+ }, this),
+ 'loaded.owl.lazy': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.autoHeight
+ && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
+ this.update();
+ }
+ }, this)
+ };
+
+ // set default options
+ this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
+
+ // register event handlers
+ this._core.$element.on(this._handlers);
+ this._intervalId = null;
+ var refThis = this;
+
+ // These changes have been taken from a PR by gavrochelegnou proposed in #1575
+ // and have been made compatible with the latest jQuery version
+ $(window).on('load', function() {
+ if (refThis._core.settings.autoHeight) {
+ refThis.update();
+ }
+ });
+
+ // Autoresize the height of the carousel when window is resized
+ // When carousel has images, the height is dependent on the width
+ // and should also change on resize
+ $(window).resize(function() {
+ if (refThis._core.settings.autoHeight) {
+ if (refThis._intervalId != null) {
+ clearTimeout(refThis._intervalId);
+ }
+
+ refThis._intervalId = setTimeout(function() {
+ refThis.update();
+ }, 250);
+ }
+ });
+
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ AutoHeight.Defaults = {
+ autoHeight: false,
+ autoHeightClass: 'owl-height'
+ };
+
+ /**
+ * Updates the view.
+ */
+ AutoHeight.prototype.update = function() {
+ var start = this._core._current,
+ end = start + this._core.settings.items,
+ lazyLoadEnabled = this._core.settings.lazyLoad,
+ visible = this._core.$stage.children().toArray().slice(start, end),
+ heights = [],
+ maxheight = 0;
+
+ $.each(visible, function(index, item) {
+ heights.push($(item).height());
+ });
+
+ maxheight = Math.max.apply(null, heights);
+
+ if (maxheight <= 1 && lazyLoadEnabled && this._previousHeight) {
+ maxheight = this._previousHeight;
+ }
+
+ this._previousHeight = maxheight;
+
+ this._core.$stage.parent()
+ .height(maxheight)
+ .addClass(this._core.settings.autoHeightClass);
+ };
+
+ AutoHeight.prototype.destroy = function() {
+ var handler, property;
+
+ for (handler in this._handlers) {
+ this._core.$element.off(handler, this._handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] !== 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * Video Plugin
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the video plugin.
+ * @class The Video Plugin
+ * @param {Owl} carousel - The Owl Carousel
+ */
+ var Video = function(carousel) {
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ /**
+ * Cache all video URLs.
+ * @protected
+ * @type {Object}
+ */
+ this._videos = {};
+
+ /**
+ * Current playing item.
+ * @protected
+ * @type {jQuery}
+ */
+ this._playing = null;
+
+ /**
+ * All event handlers.
+ * @todo The cloned content removale is too late
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'initialized.owl.carousel': $.proxy(function(e) {
+ if (e.namespace) {
+ this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });
+ }
+ }, this),
+ 'resize.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
+ e.preventDefault();
+ }
+ }, this),
+ 'refreshed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.is('resizing')) {
+ this._core.$stage.find('.cloned .owl-video-frame').remove();
+ }
+ }, this),
+ 'changed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && e.property.name === 'position' && this._playing) {
+ this.stop();
+ }
+ }, this),
+ 'prepared.owl.carousel': $.proxy(function(e) {
+ if (!e.namespace) {
+ return;
+ }
+
+ var $element = $(e.content).find('.owl-video');
+
+ if ($element.length) {
+ $element.css('display', 'none');
+ this.fetch($element, $(e.content));
+ }
+ }, this)
+ };
+
+ // set default options
+ this._core.options = $.extend({}, Video.Defaults, this._core.options);
+
+ // register event handlers
+ this._core.$element.on(this._handlers);
+
+ this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {
+ this.play(e);
+ }, this));
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ Video.Defaults = {
+ video: false,
+ videoHeight: false,
+ videoWidth: false
+ };
+
+ /**
+ * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
+ * @protected
+ * @param {jQuery} target - The target containing the video data.
+ * @param {jQuery} item - The item containing the video.
+ */
+ Video.prototype.fetch = function(target, item) {
+ var type = (function() {
+ if (target.attr('data-vimeo-id')) {
+ return 'vimeo';
+ } else if (target.attr('data-vzaar-id')) {
+ return 'vzaar'
+ } else {
+ return 'youtube';
+ }
+ })(),
+ id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
+ width = target.attr('data-width') || this._core.settings.videoWidth,
+ height = target.attr('data-height') || this._core.settings.videoHeight,
+ url = target.attr('href');
+
+ if (url) {
+
+ /*
+ Parses the id's out of the following urls (and probably more):
+ https://www.youtube.com/watch?v=:id
+ https://youtu.be/:id
+ https://vimeo.com/:id
+ https://vimeo.com/channels/:channel/:id
+ https://vimeo.com/groups/:group/videos/:id
+ https://app.vzaar.com/videos/:id
+
+ Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
+ */
+
+ id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
+
+ if (id[3].indexOf('youtu') > -1) {
+ type = 'youtube';
+ } else if (id[3].indexOf('vimeo') > -1) {
+ type = 'vimeo';
+ } else if (id[3].indexOf('vzaar') > -1) {
+ type = 'vzaar';
+ } else {
+ throw new Error('Video URL not supported.');
+ }
+ id = id[6];
+ } else {
+ throw new Error('Missing video URL.');
+ }
+
+ this._videos[url] = {
+ type: type,
+ id: id,
+ width: width,
+ height: height
+ };
+
+ item.attr('data-video', url);
+
+ this.thumbnail(target, this._videos[url]);
+ };
+
+ /**
+ * Creates video thumbnail.
+ * @protected
+ * @param {jQuery} target - The target containing the video data.
+ * @param {Object} info - The video info object.
+ * @see `fetch`
+ */
+ Video.prototype.thumbnail = function(target, video) {
+ var tnLink,
+ icon,
+ path,
+ dimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '',
+ customTn = target.find('img'),
+ srcType = 'src',
+ lazyClass = '',
+ settings = this._core.settings,
+ create = function(path) {
+ icon = '';
+
+ if (settings.lazyLoad) {
+ tnLink = $('',{
+ "class": 'owl-video-tn ' + lazyClass,
+ "srcType": path
+ });
+ } else {
+ tnLink = $( '', {
+ "class": "owl-video-tn",
+ "style": 'opacity:1;background-image:url(' + path + ')'
+ });
+ }
+ target.after(tnLink);
+ target.after(icon);
+ };
+
+ // wrap video content into owl-video-wrapper div
+ target.wrap( $( '', {
+ "class": "owl-video-wrapper",
+ "style": dimensions
+ }));
+
+ if (this._core.settings.lazyLoad) {
+ srcType = 'data-src';
+ lazyClass = 'owl-lazy';
+ }
+
+ // custom thumbnail
+ if (customTn.length) {
+ create(customTn.attr(srcType));
+ customTn.remove();
+ return false;
+ }
+
+ if (video.type === 'youtube') {
+ path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
+ create(path);
+ } else if (video.type === 'vimeo') {
+ $.ajax({
+ type: 'GET',
+ url: '//vimeo.com/api/v2/video/' + video.id + '.json',
+ jsonp: 'callback',
+ dataType: 'jsonp',
+ success: function(data) {
+ path = data[0].thumbnail_large;
+ create(path);
+ }
+ });
+ } else if (video.type === 'vzaar') {
+ $.ajax({
+ type: 'GET',
+ url: '//vzaar.com/api/videos/' + video.id + '.json',
+ jsonp: 'callback',
+ dataType: 'jsonp',
+ success: function(data) {
+ path = data.framegrab_url;
+ create(path);
+ }
+ });
+ }
+ };
+
+ /**
+ * Stops the current video.
+ * @public
+ */
+ Video.prototype.stop = function() {
+ this._core.trigger('stop', null, 'video');
+ this._playing.find('.owl-video-frame').remove();
+ this._playing.removeClass('owl-video-playing');
+ this._playing = null;
+ this._core.leave('playing');
+ this._core.trigger('stopped', null, 'video');
+ };
+
+ /**
+ * Starts the current video.
+ * @public
+ * @param {Event} event - The event arguments.
+ */
+ Video.prototype.play = function(event) {
+ var target = $(event.target),
+ item = target.closest('.' + this._core.settings.itemClass),
+ video = this._videos[item.attr('data-video')],
+ width = video.width || '100%',
+ height = video.height || this._core.$stage.height(),
+ html,
+ iframe;
+
+ if (this._playing) {
+ return;
+ }
+
+ this._core.enter('playing');
+ this._core.trigger('play', null, 'video');
+
+ item = this._core.items(this._core.relative(item.index()));
+
+ this._core.reset(item.index());
+
+ html = $( '' );
+ html.attr( 'height', height );
+ html.attr( 'width', width );
+ if (video.type === 'youtube') {
+ html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id );
+ } else if (video.type === 'vimeo') {
+ html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' );
+ } else if (video.type === 'vzaar') {
+ html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' );
+ }
+
+ iframe = $(html).wrap( '' ).insertAfter(item.find('.owl-video'));
+
+ this._playing = item.addClass('owl-video-playing');
+ };
+
+ /**
+ * Checks whether an video is currently in full screen mode or not.
+ * @todo Bad style because looks like a readonly method but changes members.
+ * @protected
+ * @returns {Boolean}
+ */
+ Video.prototype.isInFullScreen = function() {
+ var element = document.fullscreenElement || document.mozFullScreenElement ||
+ document.webkitFullscreenElement;
+
+ return element && $(element).parent().hasClass('owl-video-frame');
+ };
+
+ /**
+ * Destroys the plugin.
+ */
+ Video.prototype.destroy = function() {
+ var handler, property;
+
+ this._core.$element.off('click.owl.video');
+
+ for (handler in this._handlers) {
+ this._core.$element.off(handler, this._handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] != 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.Video = Video;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * Animate Plugin
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the animate plugin.
+ * @class The Navigation Plugin
+ * @param {Owl} scope - The Owl Carousel
+ */
+ var Animate = function(scope) {
+ this.core = scope;
+ this.core.options = $.extend({}, Animate.Defaults, this.core.options);
+ this.swapping = true;
+ this.previous = undefined;
+ this.next = undefined;
+
+ this.handlers = {
+ 'change.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && e.property.name == 'position') {
+ this.previous = this.core.current();
+ this.next = e.property.value;
+ }
+ }, this),
+ 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {
+ if (e.namespace) {
+ this.swapping = e.type == 'translated';
+ }
+ }, this),
+ 'translate.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
+ this.swap();
+ }
+ }, this)
+ };
+
+ this.core.$element.on(this.handlers);
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ Animate.Defaults = {
+ animateOut: false,
+ animateIn: false
+ };
+
+ /**
+ * Toggles the animation classes whenever an translations starts.
+ * @protected
+ * @returns {Boolean|undefined}
+ */
+ Animate.prototype.swap = function() {
+
+ if (this.core.settings.items !== 1) {
+ return;
+ }
+
+ if (!$.support.animation || !$.support.transition) {
+ return;
+ }
+
+ this.core.speed(0);
+
+ var left,
+ clear = $.proxy(this.clear, this),
+ previous = this.core.$stage.children().eq(this.previous),
+ next = this.core.$stage.children().eq(this.next),
+ incoming = this.core.settings.animateIn,
+ outgoing = this.core.settings.animateOut;
+
+ if (this.core.current() === this.previous) {
+ return;
+ }
+
+ if (outgoing) {
+ left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
+ previous.one($.support.animation.end, clear)
+ .css( { 'left': left + 'px' } )
+ .addClass('animated owl-animated-out')
+ .addClass(outgoing);
+ }
+
+ if (incoming) {
+ next.one($.support.animation.end, clear)
+ .addClass('animated owl-animated-in')
+ .addClass(incoming);
+ }
+ };
+
+ Animate.prototype.clear = function(e) {
+ $(e.target).css( { 'left': '' } )
+ .removeClass('animated owl-animated-out owl-animated-in')
+ .removeClass(this.core.settings.animateIn)
+ .removeClass(this.core.settings.animateOut);
+ this.core.onTransitionEnd();
+ };
+
+ /**
+ * Destroys the plugin.
+ * @public
+ */
+ Animate.prototype.destroy = function() {
+ var handler, property;
+
+ for (handler in this.handlers) {
+ this.core.$element.off(handler, this.handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] != 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * Autoplay Plugin
+ * @version 2.3.4
+ * @author Bartosz Wojciechowski
+ * @author Artus Kolanowski
+ * @author David Deutsch
+ * @author Tom De Caluwé
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+
+ /**
+ * Creates the autoplay plugin.
+ * @class The Autoplay Plugin
+ * @param {Owl} scope - The Owl Carousel
+ */
+ var Autoplay = function(carousel) {
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ /**
+ * The autoplay timeout id.
+ * @type {Number}
+ */
+ this._call = null;
+
+ /**
+ * Depending on the state of the plugin, this variable contains either
+ * the start time of the timer or the current timer value if it's
+ * paused. Since we start in a paused state we initialize the timer
+ * value.
+ * @type {Number}
+ */
+ this._time = 0;
+
+ /**
+ * Stores the timeout currently used.
+ * @type {Number}
+ */
+ this._timeout = 0;
+
+ /**
+ * Indicates whenever the autoplay is paused.
+ * @type {Boolean}
+ */
+ this._paused = true;
+
+ /**
+ * All event handlers.
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'changed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && e.property.name === 'settings') {
+ if (this._core.settings.autoplay) {
+ this.play();
+ } else {
+ this.stop();
+ }
+ } else if (e.namespace && e.property.name === 'position' && this._paused) {
+ // Reset the timer. This code is triggered when the position
+ // of the carousel was changed through user interaction.
+ this._time = 0;
+ }
+ }, this),
+ 'initialized.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.autoplay) {
+ this.play();
+ }
+ }, this),
+ 'play.owl.autoplay': $.proxy(function(e, t, s) {
+ if (e.namespace) {
+ this.play(t, s);
+ }
+ }, this),
+ 'stop.owl.autoplay': $.proxy(function(e) {
+ if (e.namespace) {
+ this.stop();
+ }
+ }, this),
+ 'mouseover.owl.autoplay': $.proxy(function() {
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
+ this.pause();
+ }
+ }, this),
+ 'mouseleave.owl.autoplay': $.proxy(function() {
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
+ this.play();
+ }
+ }, this),
+ 'touchstart.owl.core': $.proxy(function() {
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
+ this.pause();
+ }
+ }, this),
+ 'touchend.owl.core': $.proxy(function() {
+ if (this._core.settings.autoplayHoverPause) {
+ this.play();
+ }
+ }, this)
+ };
+
+ // register event handlers
+ this._core.$element.on(this._handlers);
+
+ // set default options
+ this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
+ };
+
+ /**
+ * Default options.
+ * @public
+ */
+ Autoplay.Defaults = {
+ autoplay: false,
+ autoplayTimeout: 5000,
+ autoplayHoverPause: false,
+ autoplaySpeed: false
+ };
+
+ /**
+ * Transition to the next slide and set a timeout for the next transition.
+ * @private
+ * @param {Number} [speed] - The animation speed for the animations.
+ */
+ Autoplay.prototype._next = function(speed) {
+ this._call = window.setTimeout(
+ $.proxy(this._next, this, speed),
+ this._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read()
+ );
+
+ if (this._core.is('interacting') || document.hidden) {
+ return;
+ }
+ this._core.next(speed || this._core.settings.autoplaySpeed);
+ }
+
+ /**
+ * Reads the current timer value when the timer is playing.
+ * @public
+ */
+ Autoplay.prototype.read = function() {
+ return new Date().getTime() - this._time;
+ };
+
+ /**
+ * Starts the autoplay.
+ * @public
+ * @param {Number} [timeout] - The interval before the next animation starts.
+ * @param {Number} [speed] - The animation speed for the animations.
+ */
+ Autoplay.prototype.play = function(timeout, speed) {
+ var elapsed;
+
+ if (!this._core.is('rotating')) {
+ this._core.enter('rotating');
+ }
+
+ timeout = timeout || this._core.settings.autoplayTimeout;
+
+ // Calculate the elapsed time since the last transition. If the carousel
+ // wasn't playing this calculation will yield zero.
+ elapsed = Math.min(this._time % (this._timeout || timeout), timeout);
+
+ if (this._paused) {
+ // Start the clock.
+ this._time = this.read();
+ this._paused = false;
+ } else {
+ // Clear the active timeout to allow replacement.
+ window.clearTimeout(this._call);
+ }
+
+ // Adjust the origin of the timer to match the new timeout value.
+ this._time += this.read() % timeout - elapsed;
+
+ this._timeout = timeout;
+ this._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed);
+ };
+
+ /**
+ * Stops the autoplay.
+ * @public
+ */
+ Autoplay.prototype.stop = function() {
+ if (this._core.is('rotating')) {
+ // Reset the clock.
+ this._time = 0;
+ this._paused = true;
+
+ window.clearTimeout(this._call);
+ this._core.leave('rotating');
+ }
+ };
+
+ /**
+ * Pauses the autoplay.
+ * @public
+ */
+ Autoplay.prototype.pause = function() {
+ if (this._core.is('rotating') && !this._paused) {
+ // Pause the clock.
+ this._time = this.read();
+ this._paused = true;
+
+ window.clearTimeout(this._call);
+ }
+ };
+
+ /**
+ * Destroys the plugin.
+ */
+ Autoplay.prototype.destroy = function() {
+ var handler, property;
+
+ this.stop();
+
+ for (handler in this._handlers) {
+ this._core.$element.off(handler, this._handlers[handler]);
+ }
+ for (property in Object.getOwnPropertyNames(this)) {
+ typeof this[property] != 'function' && (this[property] = null);
+ }
+ };
+
+ $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
+
+})(window.Zepto || window.jQuery, window, document);
+
+/**
+ * Navigation Plugin
+ * @version 2.3.4
+ * @author Artus Kolanowski
+ * @author David Deutsch
+ * @license The MIT License (MIT)
+ */
+;(function($, window, document, undefined) {
+ 'use strict';
+
+ /**
+ * Creates the navigation plugin.
+ * @class The Navigation Plugin
+ * @param {Owl} carousel - The Owl Carousel.
+ */
+ var Navigation = function(carousel) {
+ /**
+ * Reference to the core.
+ * @protected
+ * @type {Owl}
+ */
+ this._core = carousel;
+
+ /**
+ * Indicates whether the plugin is initialized or not.
+ * @protected
+ * @type {Boolean}
+ */
+ this._initialized = false;
+
+ /**
+ * The current paging indexes.
+ * @protected
+ * @type {Array}
+ */
+ this._pages = [];
+
+ /**
+ * All DOM elements of the user interface.
+ * @protected
+ * @type {Object}
+ */
+ this._controls = {};
+
+ /**
+ * Markup for an indicator.
+ * @protected
+ * @type {Array.}
+ */
+ this._templates = [];
+
+ /**
+ * The carousel element.
+ * @type {jQuery}
+ */
+ this.$element = this._core.$element;
+
+ /**
+ * Overridden methods of the carousel.
+ * @protected
+ * @type {Object}
+ */
+ this._overrides = {
+ next: this._core.next,
+ prev: this._core.prev,
+ to: this._core.to
+ };
+
+ /**
+ * All event handlers.
+ * @protected
+ * @type {Object}
+ */
+ this._handlers = {
+ 'prepared.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.dotsData) {
+ this._templates.push('' +
+ $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
');
+ }
+ }, this),
+ 'added.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.dotsData) {
+ this._templates.splice(e.position, 0, this._templates.pop());
+ }
+ }, this),
+ 'remove.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._core.settings.dotsData) {
+ this._templates.splice(e.position, 1);
+ }
+ }, this),
+ 'changed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && e.property.name == 'position') {
+ this.draw();
+ }
+ }, this),
+ 'initialized.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && !this._initialized) {
+ this._core.trigger('initialize', null, 'navigation');
+ this.initialize();
+ this.update();
+ this.draw();
+ this._initialized = true;
+ this._core.trigger('initialized', null, 'navigation');
+ }
+ }, this),
+ 'refreshed.owl.carousel': $.proxy(function(e) {
+ if (e.namespace && this._initialized) {
+ this._core.trigger('refresh', null, 'navigation');
+ this.update();
+ this.draw();
+ this._core.trigger('refreshed', null, 'navigation');
+ }
+ }, this)
+ };
+
+ // set default options
+ this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
+
+ // register event handlers
+ this.$element.on(this._handlers);
+ };
+
+ /**
+ * Default options.
+ * @public
+ * @todo Rename `slideBy` to `navBy`
+ */
+ Navigation.Defaults = {
+ nav: false,
+ navText: [
+ '‹',
+ '›'
+ ],
+ navSpeed: false,
+ navElement: 'button type="button" role="presentation"',
+ navContainer: false,
+ navContainerClass: 'owl-nav',
+ navClass: [
+ 'owl-prev',
+ 'owl-next'
+ ],
+ slideBy: 1,
+ dotClass: 'owl-dot',
+ dotsClass: 'owl-dots',
+ dots: true,
+ dotsEach: false,
+ dotsData: false,
+ dotsSpeed: false,
+ dotsContainer: false
+ };
+
+ /**
+ * Initializes the layout of the plugin and extends the carousel.
+ * @protected
+ */
+ Navigation.prototype.initialize = function() {
+ var override,
+ settings = this._core.settings;
+
+ // create DOM structure for relative navigation
+ this._controls.$relative = (settings.navContainer ? $(settings.navContainer)
+ : $('').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
+
+ this._controls.$previous = $('<' + settings.navElement + '>')
+ .addClass(settings.navClass[0])
+ .html(settings.navText[0])
+ .prependTo(this._controls.$relative)
+ .on('click', $.proxy(function(e) {
+ this.prev(settings.navSpeed);
+ }, this));
+ this._controls.$next = $('<' + settings.navElement + '>')
+ .addClass(settings.navClass[1])
+ .html(settings.navText[1])
+ .appendTo(this._controls.$relative)
+ .on('click', $.proxy(function(e) {
+ this.next(settings.navSpeed);
+ }, this));
+
+ // create DOM structure for absolute navigation
+ if (!settings.dotsData) {
+ this._templates = [ $('