1<!DOCTYPE html> 2<html lang="en_US"> 3 4<head> 5 <title>FPL Optimized - FPL Expected Points Calculator</title> 6 <meta charset="UTF-8" /> 7 <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> 8 <meta http-equiv="Pragma" content="no-cache"> 9 <meta http-equiv="Expires" content="0"> 10 <meta name="description" content="Optimized squads for Fantasy Premier League -- everyday!" /> 11 <meta name="keywords" 12 content="fantasy, football, soccer, premier league, mathematics, optimization, analytics, sports" /> 13 <meta name="author" content="Sertalp B. Cay ([email protected])" /> 14 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 15 <link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" 16 integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"> 17
17<script src="https://fastly.jsdelivr.net/npm/@fortawesome/[email protected]/js/fontawesome.min.js" 18 integrity="sha256-TMRxGf3NaZhrxTfD8y/NGiyE4UXBA3udH1l+Co8JDVU=" crossorigin="anonymous"></script>
18 19
19<script src="https://d3js.org/d3.v6.js"></script>
19 20
20<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-interpolate/1.3.0/d3-interpolate.js" 21 integrity="sha512-KcUKnCgVgjA6pyyyN33d5S1IHk9hFUaldkL8BmKvqR+7q9HyZj3jmWJemF6IJuLkcj3biCNzdGgXNPJCjurXnQ==" 22 crossorigin="anonymous"></script>
22 23 <link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css" 24 integrity="sha256-rx5u3IdaOCszi7Jb18XD9HSn8bNiEgAqWJbdBvIYYyU=" crossorigin="anonymous"> 25 <!-- <link href="url_for('static', filename='3rdparty/vis-timeline-graph2d.min.css')" rel="stylesheet" type="text/css" /> --> 26 27 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css"> --> 28 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/searchbuilder/1.0.1/css/searchBuilder.dataTables.min.css"> --> 29 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/fixedcolumns/3.3.2/css/fixedColumns.dataTables.min.css"> --> 30 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/1.10.22/css/dataTables.bootstrap4.min.css"> --> 31 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/fixedcolumns/3.3.2/css/fixedColumns.bootstrap4.min.css"> --> 32 <!-- <link rel="stylesheet" href="https://cdn.datatables.net/responsive/2.2.6/css/responsive.bootstrap4.min.css"> --> 33 34 <link rel="stylesheet" type="text/css" 35 href="https://cdn.datatables.net/v/bs4/dt-1.10.23/b-1.6.5/b-colvis-1.6.5/b-html5-1.6.5/fc-3.3.2/fh-3.1.7/r-2.2.6/sp-1.2.2/datatables.min.css" /> 36 37 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 68 bytes, lines 37-38
37 38 <script async src="https://www.googletagmanager.com/gtag/js?id=
38G-L07T8LS957
vendor: 16 bytes, lines 38-39
38"></script> 39
39<script> 40
vendor: 175 bytes, lines 40-46
40window.dataLayer = window.dataLayer || []; 41 42 function gtag() { 43 dataLayer.push(arguments); 44 } 45 gtag('js', new Date()); 46 gtag('config', '
46G-L07T8LS957
vendor: 8 bytes, lines 46-47
46'); 47
47</script>
47 48 49 <link rel="stylesheet" href="/static/css/styles.css?ts=20260920183004"> 50 <link rel="stylesheet" href="/static/css/svg.css?ts=20260920183004"> 51 52 <style> 53 :root { 54 --bg-primary: #1a1a1c; 55 --bg-secondary: #2d2d30; 56 --bg-card: #3a3a3d; 57 --bg-squad-card: #474747; 58 --text-primary: #e0e0e0; 59 --text-secondary: #b0b0b0; 60 --accent: #B81636; 61 --accent-hover: #5bbbb6; 62 --border-color: #4a4a4d; 63 --border-complement: #B81636; 64 --svg-bg: #5a5d5c; 65 --svg-text: #ffffff; 66 --svg-stroke: #ffffff; 67 --chart-goal: #40c8de; 68 --chart-assist: #ff9650; 69 --chart-cs: #97b070; 70 } 71 72 [data-theme="light"] { 73 --bg-primary: #f5f5f5; 74 --bg-secondary: #ffffff; 75 --bg-card: #ffffff; 76 --bg-squad-card: #fafafa; 77 --text-primary: #2d2d30; 78 --text-secondary: #6b6b6b; 79 --accent: #B81636; 80 --accent-hover: #5bbbb6; 81 --border-color: #e0e0e0; 82 --border-complement: #B81636; 83 --svg-bg: #e8e8e8; 84 --svg-text: #2d2d30; 85 --svg-stroke: #2d2d30; 86 --chart-goal: #2196F3; 87 --chart-assist: #FF6B35; 88 --chart-cs: #4CAF50; 89 } 90 91 body { 92 background: var(--bg-primary) !important; 93 color: var(--text-primary) !important; 94 transition: background-color 0.3s ease, color 0.3s ease; 95 } 96 97 .bg-squad-card { 98 background-color: var(--bg-squad-card) !important; 99 color: var(--text-primary) !important; 100 } 101 102 .border-complement { 103 border-color: var(--border-complement) !important; 104 } 105 106 .card { 107 background-color: var(--bg-card) !important; 108 color: var(--text-primary) !important; 109 } 110 111 .card-header { 112 background-color: var(--bg-squad-card) !important; 113 color: var(--text-primary) !important; 114 } 115 116 .table { 117 color: var(--text-primary) !important; 118 background-color: var(--bg-card) !important; 119 } 120 121 .table-striped tbody tr:nth-of-type(odd) { 122 background-color: var(--bg-secondary) !important; 123 } 124 125 .table-dark { 126 background-color: var(--bg-secondary) !important; 127 color: var(--text-primary) !important; 128 } 129
130 .modal-content { 131 background-color: var(--bg-card) !important; 132 color: var(--text-primary) !important; 133 } 134 135 .form-control { 136 background-color: var(--bg-secondary) !important; 137 border-color: var(--border-color) !important; 138 color: var(--text-primary) !important; 139 } 140 141 .form-control:focus { 142 background-color: var(--bg-secondary) !important; 143 border-color: var(--accent) !important; 144 color: var(--text-primary) !important; 145 box-shadow: 0 0 0 0.2rem rgba(184, 22, 54, 0.25) !important; 146 } 147 148 .input-group-text { 149 background-color: var(--bg-secondary) !important; 150 border-color: var(--border-color) !important; 151 color: var(--text-primary) !important; 152 } 153 154 .btn-primary { 155 background-color: var(--accent); 156 border-color: var(--accent); 157 } 158 159 .btn-primary:hover { 160 background-color: var(--accent-hover); 161 border-color: var(--accent-hover); 162 } 163 164 .btn-secondary { 165 background-color: var(--bg-secondary); 166 border-color: var(--border-color); 167 color: var(--text-primary); 168 } 169 170 .btn-secondary:hover { 171 background-color: var(--border-color); 172 border-color: var(--border-color); 173 color: var(--text-primary); 174 } 175 176 .theme-toggle-btn { 177 background: transparent; 178 border: 1px solid rgba(255, 255, 255, 0.3); 179 color: #e0e0e0; 180 border-radius: 20px; 181 padding: 5px 12px; 182 font-size: 13px; 183 cursor: pointer; 184 transition: all 0.3s ease; 185 display: inline-flex; 186 align-items: center; 187 gap: 6px; 188 margin-left: auto; 189 margin-right: 10px; 190 } 191 192 [data-theme="light"] .theme-toggle-btn { 193 border: 1px solid rgba(0, 0, 0, 0.2); 194 /*color: #2d2d30; 195 background: white;*/ 196 } 197 198 .theme-toggle-btn:hover { 199 background: rgba(255, 255, 255, 0.1); 200 border-color: var(--accent-hover); 201 } 202 203 [data-theme="light"] .theme-toggle-btn:hover { 204 background: rgba(0, 0, 0, 0.05); 205 } 206 207 .major-display-box { 208 background-color: var(--bg-secondary) !important; 209 color: var(--text-primary) !important; 210 border: var(--border-color) 1px solid !important; 211 } 212 213 .minor-display-box { 214 background-color: var(--bg-secondary) !important; 215 color: var(--text-primary) !important; 216 border: var(--border-color) 1px solid !important; 217 } 218 </style> 219 220
220<script> 221 // Apply theme immediately to prevent flash 222 (function () { 223 const savedTheme = localStorage.getItem('theme') || 'dark'; 224 document.documentElement.setAttribute('data-theme', savedTheme); 225 })(); 226 </script>
226 227 228 <link rel="manifest" href="/static/asset/manifest.json"> 229 <link rel="apple-touch-icon" href="/static/asset/apple_logo_114.png"> 230 <link rel="apple-touch-startup-image" href="/static/asset/apple_splash_320.png"> 231 <meta name="apple-mobile-web-app-capable" content="yes"> 232 <meta name="mobile-web-app-capable" content="yes"> 233 <meta name="apple-touch-fullscreen" content="yes" /> 234 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 235 <meta name="apple-mobile-web-app-title" content="FPLOptimized"> 236 237</head> 238 239<body> 240 241 <div id="app"> 242 243 <header class="bg-dark-gray mb-1"> 244 <div class="container"> 245 <nav class="navbar navbar-collapse navbar-dark container-fluid pl-0 pr-0"> 246 <a class="navbar-brand ml-0 ml-md-3 mr-0 mr-md-3 mr-auto" href="/" aria-label="Bootstrap"><img 247 src="/static/images/logo_128.png" height="33" /> FPL Optimized</a> 248 <span class="text-muted">by <a href="https://solioanalytics.com" target="_blank" 249 class="text-muted">Solio 250 Analytics</a></span> 251 <button class="theme-toggle-btn" onclick="toggleTheme()"> 252 <i class="fas fa-moon" id="theme-icon"></i> 253 <span id="theme-text">Dark</span> 254 </button> 255 <!-- <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#menuToggler" aria-controls="menuToggler" aria-expanded="false" aria-label="Toggle navigation"> 256 <span class="navbar-toggler-icon"></span> 257 </button> 258 <div class="collapse navbar-collapse text-secondary flex-row-reverse" id="menuToggler"> 259 <span class="twitter-link ml-2 float-right"><a href="https://twitter.com/sertalpbilal"></a></span> 260 <ul class="navbar-nav"> 261 <li class="nav-item"> 262 <a class="nav-link" href="week.html">Optimal Squads</a> 263 </li> 264 <li class="nav-item"> 265 <a class="nav-link" href="live_gw.html">Live GW</a> 266 </li> 267 <li class="nav-item"> 268 <a class="nav-link" href="team_summary.html">GW Summary</a> 269 </li> 270 <li class="nav-item"> 271 <a class="nav-link" href="fpl_analytics_league.html">FPL Analytics xP League</a> 272 </li> 273 <li class="nav-item no-sep"> 274 <a class="nav-link" href="https://twitter.com/sertalpbilal" target=_blank><i class="fab fa-twitter-square"></i></a> 275 </li> 276 </ul> 277 </div> --> 278 </nav> 279 </div> 280 </header> 281 282 283 <!-- <div class="mt-1 container"> 284 <div class="row pl-3 pr-3"> 285 <div class="col-12 alert alert-info alert-dismissible text-small fade show" role="alert"> 286 <i class="fas fa-info-circle"></i> First time on FPL Optimized? Read a summary of tools <a target="_blank" href="https://threadreaderapp.com/thread/1391100607205941253.html">here.</a> 287 <button type="button" class="close top-close" data-dismiss="alert" aria-label="Close"> 288 <span aria-hidden="true">×</span> 289 </button> 290 </div> 291 </div> 292 </div> --> 293 294 <!-- <div class="mt-2 container"> 295 <div class="row pl-3 pr-3"> 296 <div class="col-12 alert alert-warning alert-dismissible text-small fade show" role="alert"> 297 <i class="fas fa-info-circle"></i> FPLOptimized is getting ready for the new season! Some functonalities may not work properly.</a> 298 <button type="button" class="close top-close" data-dismiss="alert" aria-label="Close">
299 <span aria-hidden="true">×</span> 300 </button> 301 </div> 302 </div> 303 </div> --> 304 <!-- 305 <div class="mt-2 container"> 306 <div class="row pl-3 pr-3"> 307 <div class="col-12 alert alert-success alert-dismissible text-small fade show" role="alert"> 308 <i class="fas fa-info-circle"></i> FPLOptimized is ready for new season! Welcome back :)</a> 309 <button type="button" class="close top-close" data-dismiss="alert" aria-label="Close"> 310 <span aria-hidden="true">×</span> 311 </button> 312 </div> 313 </div> 314 </div> --> 315 316 317 <!-- <div class="mt-2 container mb-1"> 318 <div class="row pl-3 pr-3"> 319 <div class="col-12 alert alert-success alert-dismissible text-small fade show" role="alert"> 320 <i class="fas fa-info-circle"></i> Join the next part of our journey at <a 321 href="https://solioanalytics.com">solioanalytics.com</a> 322 <button type="button" class="close top-close" data-dismiss="alert" aria-label="Close"> 323 <span aria-hidden="true">×</span> 324 </button> 325 </div> 326 </div> 327 </div> --> 328 329 <!-- <div class="mt-2 container"> 330 <div class="row pl-3 pr-3"> 331 <div class="col-12 alert alert-warning alert-dismissible text-small fade show" role="alert"> 332 <i class="fas fa-trophy"></i> <a href="https://footballcontentawards.com/voting" target="blank">Vote for FPL Optimized in Football Content Awards. (Fantasy Football / Organization)</a> 333 <button type="button" class="close top-close" data-dismiss="alert" aria-label="Close"> 334 <span aria-hidden="true">×</span> 335 </button> 336 </div> 337 </div> 338 </div> --> 339 340
340<script> 341 function toggleTheme() { 342 const html = document.documentElement; 343 const icon = document.getElementById('theme-icon'); 344 const text = document.getElementById('theme-text'); 345 const currentTheme = html.getAttribute('data-theme'); 346 347 if (currentTheme === 'light') { 348 html.setAttribute('data-theme', 'dark'); 349 icon.className = 'fas fa-moon'; 350 text.textContent = 'Dark'; 351 localStorage.setItem('theme', 'dark'); 352 } else { 353 html.setAttribute('data-theme', 'light'); 354 icon.className = 'fas fa-sun'; 355 text.textContent = 'Light'; 356 localStorage.setItem('theme', 'light'); 357 } 358 359 // Trigger theme change event for charts 360 document.dispatchEvent(new CustomEvent('themeChanged')); 361 } 362 363 // Update icon after DOM loads 364 document.addEventListener('DOMContentLoaded', function () { 365 const savedTheme = localStorage.getItem('theme') || 'dark'; 366 const icon = document.getElementById('theme-icon'); 367 const text = document.getElementById('theme-text'); 368 369 /*if (savedTheme === 'light') { 370 icon.className = 'fas fa-sun'; 371 text.textContent = 'Light'; 372 } else { 373 icon.className = 'fas fa-moon'; 374 text.textContent = 'Dark'; 375 }*/ 376 }); 377 </script>
377 378 379<main class="container" v-cloak> 380 <div class="row mb-3"> 381 <div class="col-12"> 382 <div class="card border-dark bg-squad-card"> 383 <h5 class="card-header border-complement text-center scenario_title">FPL Expected Points Calculator</h5> 384 <div class="card-body red-border-bottom" v-cloak> 385 386 <!-- <div class="row justify-content-center"> 387 <div class="col-12 col-md-8"> 388 <div class="card mt-1 mr-3 m-1 ml-3 bg-gray-3 text-small"> 389 <div class="card-header pt-1 pb-0 click-title collapsed" data-toggle="collapse" data-target="#controls" aria-expanded="false" aria-controls="controls"> 390 <span>Bet Convertor</span> 391 <div class="close text-white"> 392 <i class="toggle-button fas fa-caret-up"></i> 393 </div> 394 </div> 395 <div class="collapse" id="controls"> 396 <div class="card-body pt-1 pb-2 row justify-content-center"> 397 398 <div class="flex-column metric mw-10 ml-1 col-4 col-md-3"> 399 <div class="text-center p-0">Fraction</div> 400 <div class="setting-value text-center p-0"> 401 <div class="d-flex flex-row setting-line mb-0"> 402 <input type="text" class="form-control live-select" v-model="bet_fraction"> 403 </div> 404 </div> 405 </div> 406 407 <div class="flex-column metric mw-10 ml-1 col-4 col-md-3"> 408 <div class="text-center p-0">Decimal</div> 409 <div class="setting-value text-center p-0"> 410 <div class="d-flex flex-row setting-line mb-0"> 411 <input type="text" class="form-control live-select" v-model="bet_decimal"> 412 </div> 413 </div> 414 </div> 415 416 <div class="flex-column metric mw-10 ml-1 col-4 col-md-3"> 417 <div class="text-center p-0">American</div> 418 <div class="setting-value text-center p-0"> 419 <div class="d-flex flex-row setting-line mb-0"> 420 <input type="text" class="form-control live-select" v-model="bet_american"> 421 </div> 422 </div> 423 </div> 424 425 <div class="flex-column metric mw-10 ml-1 col-4 col-md-3"> 426 <div class="text-center p-0">Bookmaker's Margin</div> 427 <div class="setting-value text-center p-0"> 428 <div class="d-flex flex-row setting-line mb-0"> 429 <input type="text" class="form-control live-select" v-model="bookmaker_margin"> 430 </div> 431 </div> 432 </div> 433 434 <div class="flex-column metric mw-10 ml-1 col-4 col-md-3"> 435 <div class="text-center p-0">Implied Probability %</div> 436 <div class="setting-value text-center p-0"> 437 <div class="d-flex flex-row setting-line mb-0"> 438 <input type="text" class="form-control live-select" v-model="bookmaker_margin"> 439 </div> 440 </div> 441 </div> 442 443 </div> 444 </div> 445 </div> 446 </div> 447 </div> --> 448 449 450 <!-- <div class="text-center mb-2 text-small"> 451 Sample values are available on <a href="https://fplreview.com/raw-free-model-data/" target=_blank>FPLReview</a> and <a href="https://www.drafthound.com/football/premier-league/players" target=_blank>DraftHound</a>. 452 </div> --> 453 454 <div class="text-center mb-2 text-small"> 455 <div class="custom-control custom-switch text-small d-inline-block mr-3"> 456 <input type="checkbox" class="custom-control-input" id="r_switch" @change="toggle_rate"> 457 <label class="custom-control-label highlighted-checkbox" for="r_switch">Show Rates</label> 458 </div> 459 </div> 460 461 <div class="controls-top row justify-content-center text-small mb-3" 462 v-for="p in _.range(player_count)"> 463 464 465 <!-- player_name --> 466 467 <div class="col-4 col-sm-2"> 468 <div class="form-group mb-0"> 469 <label for="select-2">Player Name</label> 470 <div class="input-group mb-1 no-wrap"> 471 <input type="text" class="form-control small-inner-text" id="select-name" 472 v-model="players[p].name"> 473 </div> 474 </div> 475 </div> 476 477 <div class="col-4 col-sm-2"> 478 <div class="form-group mb-0"> 479 <label for="select-1">Player Position</label> 480 <select class="form-control small-inner-text" id="select-1" 481 v-model="players[p].position"> 482 <option value="1">GK</option> 483 <option value="2">DF</option> 484 <option value="3">MD</option> 485 <option value="4">FW</option> 486 </select> 487 </div> 488 </div> 489 <!-- <div class="col-3 col-md-2 ml-1 mr-1"> 490 <div class="form-group"> 491 <label for="select-0">Play %</label> 492 <div class="input-group mb-3"> 493 <input type="number" step="0.1" min="0" max="100" class="form-control" id="select-0" v-model.number="player_play"> 494 <div class="input-group-append">
495 <span class="input-group-text">%</span> 496 </div> 497 </div> 498 </div> 499 </div> --> 500 <div class="col-4 col-sm-2"> 501 <div class="form-group mb-0"> 502 <div v-if="!show_rates"> 503 <label for="select-2" :style="{color: colors[0]}">Anytime Goal %</label> 504 <div class="input-group mb-1 no-wrap"> 505 <input type="number" step="0.1" min="0" max="100" 506 class="form-control small-inner-text" id="select-2" 507 v-model.number="players[p].goal"> 508 <div class="input-group-append"> 509 <span class="input-group-text small-perc">%</span> 510 </div> 511 </div> 512 </div> 513 <div v-else> 514 <label for="comp-2" :style="{color: colors[0]}">Avg. Goal Rate</label> 515 <div class="input-group mb-1 no-wrap"> 516 <input type="number" step="0.01" min="0" 517 class="form-control small-inner-text goal_rates" id="comp-2" 518 @change="update_goal" :data-order="p"> 519 </div> 520 </div> 521 </div> 522 </div> 523 <div class="col-5 col-sm-2"> 524 <div class="form-group mb-0 "> 525 <div v-if="!show_rates"> 526 <label for="select-3" :style="{color: colors[1]}">Anytime Assist %</label> 527 <div class="input-group mb-1 no-wrap"> 528 <input type="number" step="0.1" min="0" max="100" 529 class="form-control small-inner-text" id="select-3" 530 v-model.number="players[p].assist"> 531 <div class="input-group-append"> 532 <span class="input-group-text small-perc">%</span> 533 </div> 534 </div> 535 </div> 536 <div v-else> 537 <label for="comp-3" :style="{color: colors[1]}">Avg. Assist Rate</label> 538 <div class="input-group mb-1 no-wrap"> 539 <input type="number" step="0.01" min="0" 540 class="form-control small-inner-text assist_rates" id="comp-3" 541 @change="update_assist" :data-order="p"> 542 </div> 543 </div> 544 </div> 545 </div> 546 <div class="col-5 col-sm-2"> 547 <div class="form-group mb-0"> 548 <div v-if="!show_rates"> 549 <label for="select-4" :style="{color: colors[2]}">Clean Sheet %</label> 550 <div class="input-group mb-1 no-wrap"> 551 <input type="number" step="0.1" min="0" max="100" 552 class="form-control small-inner-text" id="select-4" 553 v-model.number="players[p].cs"> 554 <div class="input-group-append"> 555 <span class="input-group-text small-perc">%</span> 556 </div> 557 </div> 558 </div> 559 <div v-else> 560 <label for="comp-4" :style="{color: colors[2]}">Avg. Goals Conceded</label> 561 <div class="input-group mb-1 no-wrap"> 562 <input type="number" step="0.01" min="0" 563 class="form-control small-inner-text gc_rates" id="comp-4" 564 @change="update_gc" :data-order="p"> 565 </div> 566 </div> 567 </div> 568 </div> 569 <div class="col-0 d-flex align-items-end"> 570 <button :style="{'visibility': player_count > 1 || p > 0 ? 'visible': 'hidden'}" 571 class="btn btn-secondary text-small mb-1" @click="remove_player(players[p])"><i 572 class="fas fa-times"></i></button> 573 </div> 574 </div> 575 <div class="controls-top row justify-content-center text-small"> 576 <button class="btn btn-secondary text-small mb-1" @click="add_player" 577 v-show="player_count < 4"><i class="fas fa-plus"></i></button> 578 </div> 579 <div class="text-center"> 580 <button class="btn btn-primary text-small" @click="calculate">Calculate</button> 581 </div> 582 </div> 583 <div class="card-body red-border-bottom"> 584 585 <div class="row justify-content-center mb-3"> 586 <div class="major-display-box m-1" v-for="(value,key) in players_cached"> 587 <div class="major-box-title">EV {{ value.name ? '('+ value.name +')' : '' }}</div> 588 <div class="major-box-value">{{ expected_points[key].toFixed(2) }}</div> 589 <div class="major-box-footnote">*Excluding appearance, bonus, PK, GK save points</div> 590 </div> 591 </div> 592 593 <div class="row justify-content-center mb-3" v-if="players_cached.length == 2"> 594 <div class="minor-display-box m-1 p-3"> 595 <div class="minor-box-title">{{ players_cached[0].name }} > {{ players_cached[1].name }} 596 </div> 597 <div class="minor-box-value pb-2">{{ (comparison.p1_better * 100).toFixed(2) }}%</div> 598 </div> 599 <div class="minor-display-box m-1 p-3"> 600 <div class="minor-box-title">{{ players_cached[0].name }} = {{ players_cached[1].name }} 601 </div> 602 <div class="minor-box-value pb-2">{{ (comparison.players_equal * 100).toFixed(2) }}%</div> 603 </div> 604 <div class="minor-display-box m-1 p-3"> 605 <div class="minor-box-title">{{ players_cached[0].name }} < {{ players_cached[1].name 606 }}</div> 607 <div class="minor-box-value pb-2">{{ (comparison.p2_better * 100).toFixed(2) }}% 608 </div> 609 </div> 610 </div> 611 612 <div class="row justify-content-center mb-3" v-for="(value,key) in players_cached"> 613 <div class="col-4"> 614 <div class="minor-display-box"> 615 <div class="minor-box-title" :style="{color: colors[0]}">Average Goals Scored {{ 616 value.name ? '(' + value.name + ')' : '' }}</div> 617 <div class="minor-box-value red-border-bottom pb-2">{{ goal_rate[key].toFixed(2) }} 618 </div> 619 <div class="minor-box-title" :style="{color: colors[0]}">Average Goal Points</div> 620 <div class="minor-box-value">{{ goal_points[key].toFixed(2) }}</div> 621 <div class="minor-box-footnote">*Assuming 90 mins</div> 622 </div> 623 </div> 624 <div class="col-4"> 625 <div class="minor-display-box"> 626 <div class="minor-box-title" :style="{color: colors[1]}">Average Assists Made {{ 627 value.name ? '(' + value.name + ')' : '' }}</div> 628 <div class="minor-box-value red-border-bottom pb-2">{{ assist_rate[key].toFixed(2) 629 }}</div> 630 <div class="minor-box-title" :style="{color: colors[1]}">Average Assist Points</div> 631 <div class="minor-box-value">{{ assist_points[key].toFixed(2) }}</div> 632 <div class="minor-box-footnote">*Assuming 90 mins</div> 633 </div> 634 </div> 635 <div class="col-4"> 636 <div class="minor-display-box"> 637 <div class="minor-box-title" :style="{color: colors[2]}">Average Conceded {{ 638 value.name ? '(' + value.name + ')' : '' }}</div> 639 <div class="minor-box-value red-border-bottom pb-2">{{ gc_rate[key].toFixed(2) }} 640 </div> 641 <div class="minor-box-title" :style="{color: colors[2]}">Average CS-GC Points</div> 642 <div class="minor-box-value">{{ csgc_points[key].toFixed(2) }}</div> 643 <div class="minor-box-footnote">*Assuming 90 mins</div> 644 </div> 645 </div> 646 </div> 647 648 <div> 649 <div id="ev_graph"> 650 651 </div> 652 </div> 653 654 </div> 655 <div class="card-body red-border-bottom"> 656 <div class="metric-self"> 657 <div class="text-center mb-1" :style="{color: colors[0]}">Goals</div> 658 <div class="row"> 659 <div class="col-12"> 660 <div class="table-responsive"> 661 <table class="table table-sm table-striped"> 662 <thead> 663 <tr> 664 <th>#</th> 665 <th v-for="g in _.range(0,11)"> 666 {{ g }} 667 </th> 668 <th>Total</th> 669 </tr> 670 </thead> 671 <tbody> 672 <tr> 673 <td>Prob.</td> 674 <td v-for="g in _.range(0,11)"> 675 {{ ((goal_probs[0][g] || 0) * 100).toFixed(2) }}% 676 </td> 677 <td>-</td> 678 </tr> 679 <tr> 680 <td>Points</td> 681 <td v-for="g in _.range(0,11)"> 682 {{ (active_rates[0]['goal'] || 0) * g }} 683 </td> 684 <td>-</td> 685 </tr> 686 <tr> 687 <td>EV</td> 688 <td v-for="g in _.range(0,11)"> 689 {{ (active_rates[0]['goal'] * goal_probs[0][g] * g || 690 0).toFixed(2) }} 691 </td> 692 <td>{{ goal_points[0].toFixed(2) }}</td> 693 </tr> 694 </tbody> 695 </table> 696 </div> 697 <div id="goal_prob_graph"> 698 699 </div> 700 </div> 701 </div> 702 </div> 703 704 <div class="metric-self"> 705 <div class="text-center mb-1" :style="{color: colors[1]}">Assists</div> 706 <div class="row"> 707 <div class="col-12"> 708 <div class="table-responsive"> 709 <table class="table table-sm table-striped"> 710 <thead> 711 <tr> 712 <th>#</th> 713 <th v-for="g in _.range(0,11)"> 714 {{ g }} 715 </th> 716 <th>Total</th> 717 </tr> 718 </thead> 719 <tbody> 720 <tr> 721 <td>Prob.</td> 722 <td v-for="g in _.range(0,11)"> 723 {{ ((assist_probs[0][g] || 0) * 100).toFixed(2) }}% 724 </td> 725 <td>-</td> 726 </tr> 727 <tr> 728 <td>Points</td> 729 <td v-for="g in _.range(0,11)"> 730 {{ (active_rates[0]['assist'] || 0) * g }} 731 </td> 732 <td>-</td> 733 </tr> 734 <tr> 735 <td>EV</td> 736 <td v-for="g in _.range(0,11)"> 737 {{ (active_rates[0]['assist'] * assist_probs[0][g] * g || 738 0).toFixed(2) }} 739 </td> 740 <td>{{ assist_points[0].toFixed(2) }}</td> 741 </tr> 742 </tbody> 743 </table> 744 </div> 745 <div id="assist_prob_gra
745ph"> 746 747 </div> 748 </div> 749 </div> 750 </div> 751 752 <div class="metric-self"> 753 <div class="text-center mb-1" :style="{color: colors[2]}">Clean Sheet - Goals Conceded</div> 754 <div class="row"> 755 <div class="col-12"> 756 <div class="table-responsive"> 757 <table class="table table-sm table-striped"> 758 <thead> 759 <tr> 760 <th>#</th> 761 <th v-for="g in _.range(0,11)"> 762 {{ g }} 763 </th> 764 <th>Total</th> 765 </tr> 766 </thead> 767 <tbody> 768 <tr> 769 <td>Prob.</td> 770 <td v-for="g in _.range(0,11)"> 771 {{ ((gc_probs[0][g] || 0) * 100).toFixed(2) }}% 772 </td> 773 <td>-</td> 774 </tr> 775 <tr> 776 <td>CS Points</td> 777 <td v-for="g in _.range(0,11)"> 778 {{ (active_rates[0]['cs'] || 0) * (g==0) }} 779 </td> 780 <td>-</td> 781 </tr> 782 <tr> 783 <td>GC Points</td> 784 <td v-for="g in _.range(0,11)"> 785 {{ (active_rates[0]['2gc'] || 0) * (Math.floor(g/2)) }} 786 </td> 787 <td>-</td> 788 </tr> 789 <tr> 790 <td>EV</td> 791 <td v-for="g in _.range(0,11)"> 792 {{ ((gc_probs[0][g] || 0) * ((active_rates[0]['cs'] || 0) * 793 (g==0) + (active_rates[0]['2gc'] || 0) * 794 (Math.floor(g/2)))).toFixed(2) }} 795 </td> 796 <td>{{ csgc_points[0].toFixed(2) }}</td> 797 </tr> 798 </tbody> 799 </table> 800 </div> 801 <div class="mt-2" id="cs_prob_graph"> 802 803 </div> 804 <div class="mt-4" id="gc_prob_graph"> 805 806 </div> 807 </div> 808 </div> 809 </div> 810 811 </div> 812 </div> 813 </div> 814 </div> 815 816 <div class="row" v-cloak> 817 <div class="col-12 mb-3"> 818 <div class="card border-dark bg-squad-card qa"> 819 <div class="card-footer disclaimer"> 820 The information contained on this website is for general information purposes only. Any reliance 821 you place on this information is strictly at your own risk. 822 </div> 823 </div> 824 </div> 825 </div> 826 827</main> 828 829 </div> 830 831 832
833<script src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 833
833
834<script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/3.0.16/svg.js" 835 integrity="sha512-M17tsaj3tHw5m/gI+8XjDLTuPZ0cpTofhFLJUT9niFa/DK8WAhsSLW764iSaaXoAoivXEFUP6VxvpiahJPQ4fg==" 836 crossorigin="anonymous"></script>
vendor: 1 bytes, line 836
836
837<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js" 838 integrity="sha512-WNLxfP/8cVYL9sj8Jnp6et0BkubLP31jhTG9vhL/F5uEZmg5wEzKoXp1kJslzPQWwPT1eyMiSxlKCgzHLOTOTQ==" 839 crossorigin="anonymous"></script>
vendor: 1 bytes, line 839
839
840<script src="https://fastly.jsdelivr.net/npm/[email protected]/lodash.min.js" 841 integrity="sha256-ur/YlHMU96MxHEsy3fHGszZHas7NzH4RQlD4tDVvFhw=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 841
841
842<script src="https://fastly.jsdelivr.net/npm/[email protected]"></script>
842 843<!--
843<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
vendor: 1 bytes, line 843
843
844<script> 845 Vue.config.performance = true; 846 Vue.prototype.$log = console.log; 847</script>
847 -->
848<script src="https://cdnjs.cloudflare.com/ajax/libs/jstat/1.9.5/jstat.js" 849 integrity="sha512-D5uf20+sRi7oJxHzrp6LZDaY/IrSFIKmaQ7bOQA6V1Z+Jr9DOFKodR3RyYwdeEoGUZlfz76XQlDy5/TWdyKz9Q==" 850 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
vendor: 1 bytes, line 850
850
851<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.3.2/html2canvas.min.js" 852 integrity="sha512-tVYBzEItJit9HXaWTPo8vveXlkK62LbA+wez9IgzjTmFNLMBO1BEYladBw2wnM3YURZSMUyhayPCoLtjGh84NQ==" 853 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
853 854 855
856<script src="https://fastly.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.js" 857 crossorigin="anonymous"></script>
vendor: 1 bytes, line 857
857
858<script src="https://fastly.jsdelivr.net/npm/[email protected]/vue-cookies.js" 859 integrity="sha256-pdSyqKvUOsiAZVUhatSOyW3Wom0l7ABtO8w7LjPA3vU=" crossorigin="anonymous"></script>
859 860<!--
860<script type="text/javascript" src="url_for('static', filename='3rdparty/vis-timeline-graph2d.min.js')"></script>
860 --> 861 862<!--
862<script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
vendor: 1 bytes, line 862
862
863<script src="https://cdn.datatables.net/1.10.22/js/dataTables.bootstrap4.min.js"></script>
vendor: 1 bytes, line 863
863
864<script src="https://cdn.datatables.net/fixedcolumns/3.3.2/js/dataTables.fixedColumns.min.js"></script>
864 --> 865<!--
865<script src="https://cdn.datatables.net/responsive/2.2.6/js/dataTables.responsive.min.js"></script>
865 --> 866<!--
866<script src="https://cdn.datatables.net/responsive/2.2.6/js/responsive.bootstrap4.min.js"></script>
866 --> 867<!--
867<script src="https://cdn.datatables.net/fixedheader/3.1.7/js/dataTables.fixedHeader.min.js"></script>
867 --> 868<!--
868<script src="https://cdn.datatables.net/searchbuilder/1.0.1/js/dataTables.searchBuilder.min.js"></script>
868 --> 869
870<script type="text/javascript" 871 src="https://cdn.datatables.net/v/bs4/dt-1.10.23/b-1.6.5/b-colvis-1.6.5/b-html5-1.6.5/fc-3.3.2/fh-3.1.7/r-2.2.6/sp-1.2.2/datatables.min.js"></script>
871 872
873<script src="https://fastly.jsdelivr.net/npm/[email protected]"></script>
873 874
875<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/1.0.21/jquery.csv.js" 876 integrity="sha512-2ypsPur7qcA+2JjmmIJR1c4GWFqTLIe1naXXplraMg0aWyTOyAMpOk+QL+ULpzwrO/GdwA3qB3FhVyyiR8gdhw==" 877 crossorigin="anonymous" referrerpolicy="no-referrer"></script>
877 878
879<script src="https://fastly.jsdelivr.net/npm/[email protected]/fernetBrowser.js"></script>
879 880
881<script> 882 let repo_name = "" 883 let season = ""; 884 let gw = ""; 885 let next_gw = ""; 886 let date = ""; 887 let lastupdate = ""; 888 let listdates = [ 889 ]; 890 let is_active = false ; 891 let active_gw = -1 ; 892</script>
892 893 894
895<script src="/static/js/main.js?ts=20260920183004"></script>
895 896
897<script src="/static/js/calculator.js?ts=20260920183004"></script>
897 898 899
900<script> 901 $('.alert').alert() 902</script>
902 903
904<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"ebff31e0ee5346329299366b4d5cf8b1","r":1,"spa":2}' crossorigin="anonymous"></script>
904 905</body> 906 907<!-- <div class="text-muted text-center mx-auto text-small mb-1 c-footnote">Icons made by <a href="https://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div> --> 908<div class="mx-auto text-center d-block text-muted text-small mb-1">Last update: </div> 909 910</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.