
<!DOCTYPE html>

<html class="js-html" lang="en">
<head>
<script async="" src="https://www.googletagmanager.com/gtag/js?id=G-V8NLDKPXH3"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'G-V8NLDKPXH3', {
      'user_id': ''
    });

    
  </script>
<meta charset="utf-8"/>
<meta content="ie=edge" http-equiv="x-ua-compatible"/>
<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>
<meta content="Index, Follow" name="robots"/>
<title>
  Seungjoon Ahn | Swimcloud
</title>
<meta content="Seungjoon Ahn's swimmer profile, including times, results, and more." name="description">
<link href="https://fonts.googleapis.com" rel="preconnect"/>
<link crossorigin="" href="https://fonts.gstatic.com" rel="preconnect"/>
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500&amp;display=swap" rel="stylesheet"/>
<link href="/media/css/main.1677053966.css" media="all" rel="stylesheet"/>
<link href="/media/webpack/globalSearch/index.1673011910.css" rel="stylesheet"/>
<script defer="" src="/media/webpack/globalSearch/index.1676450527.js"></script>
<link href="/media/img/swimcloud/favicons/favicon.ico" rel="shortcut icon"/>
<link href="/media/img/swimcloud/favicons/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/>
<link href="/media/img/swimcloud/favicons/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/>
<link href="/media/img/swimcloud/favicons/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180"/>
<script type="text/javascript">var _sf_startpt=(new Date()).getTime();</script>
<meta content="Swimcloud" property="og:site_name"/>
<meta content="profile" property="og:type">
<meta content="https://swimcloud.com/swimmer/549377" property="og:url"/>
<meta content="Seungjoon Ahn" property="og:title"/>
<meta content="summary" name="twitter:card">
<meta content="" name="twitter:site">
<meta content="Seungjoon Ahn" name="twitter:title">
<meta content="Katy, TX" property="og:description">
<meta content="Katy, TX" name="twitter:description">
<meta content="https://s3.amazonaws.com/cstest/mb/2017/09/b5047045-0244-41.png.220x220_q85.jpg" property="og:image"/>
<meta content="https://s3.amazonaws.com/cstest/mb/2017/09/b5047045-0244-41.png.220x220_q85.jpg" name="twitter:image">
<script type="application/ld+json">
    {
      "@context": "http://schema.org/",
      "@type": "Person",
      
      "homeLocation": {
        "@type": "PostalAddress",
        "addressCountry": "USA",
        "addressLocality": "Katy",
        "addressRegion": "TX"
      },
      
      
        "image": "https://s3.amazonaws.com/cstest/mb/2017/09/b5047045-0244-41.png.88x88_q85.jpg",
      
      "name": "Seungjoon Ahn"
    }
  </script>
</meta></meta></meta></meta></meta></meta></meta></meta></head>
<body class="yui3-skin-sam u-background-gray-10">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe height="0" src="https://www.googletagmanager.com/ns.html?id=GTM-WDZBFJZ" style="display:none;visibility:hidden" width="0"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="c-header">
<div class="c-header__start">
<button aria-label="Main menu" class="c-header__toggle-btn c-header__toggle-btn--desktop js-sc-drawer-desktop-toggle" type="button">
<svg height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path>
</svg>
</button>
<button aria-label="Main menu" class="c-header__toggle-btn c-header__toggle-btn--mobile js-sc-drawer-mobile-toggle" type="button">
<svg height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path>
</svg>
</button>
<a class="c-header__home" href="/">
<img alt="Swimcloud logo" class="c-header__logo hidden-xs" src="/media/img/swimcloud/logos/swimcloud.svg"/>
<img alt="Swimcloud logo compact version" class="c-header__logo visible-xs" height="20" src="/media/img/swimcloud/logos/swimcloud-simple.svg"/>
</a>
</div>
<div class="c-header__search" id="global-search"></div>
<div class="c-header__end">
<nav class="c-nav c-nav--inline c-nav--global">
<a class="c-nav__item u-text-upcase hidden-xs" href="/login">Login</a>
<a class="c-nav__item u-text-upcase hidden-xs" href="/register">Register</a>
<div class="visible-xs dropdown">
<button aria-label="Login or Register dropdown" class="c-nav__item dropdown-toggle" data-toggle="dropdown" type="button">
<i aria-hidden="true" class="fas fa-user-circle fa-2x"></i>
</button>
<ul class="dropdown-menu dropdown-menu-right">
<li><a href="/login">Login</a></li>
<li><a href="/register">Register</a></li>
</ul>
</div>
</nav>
</div>
</div>
<div class="c-layout">
<div class="c-sc-drawer c-sc-drawer--desktop js-sc-drawer-desktop">
<nav class="c-nav c-nav--compact">
<a class="c-nav__item" href="/">
<i aria-hidden="true" class="c-nav__icon far fa-home-alt"></i>
        Home
    </a>
<a class="c-nav__item" href="/results/">
<i aria-hidden="true" class="c-nav__icon far fa-list-alt"></i>
      Meets
    </a>
<a class="c-nav__item" href="/times/">
<i aria-hidden="true" class="c-nav__icon far fa-stopwatch"></i>
      Top Times
    </a>
<a class="c-nav__item" href="/team/rankings/">
<i aria-hidden="true" class="c-nav__icon far fa-tshirt"></i>
      Team Rankings
    </a>
<a class="c-nav__item" href="/recruiting/">
<i aria-hidden="true" class="c-nav__icon far fa-graduation-cap"></i>
      Recruiting
    </a>
<a class="c-nav__item" href="/videos/">
<i aria-hidden="true" class="c-nav__icon far fa-video"></i>
      Videos
    </a>
<a class="c-nav__item" href="/meetsimulator/">
<i aria-hidden="true" class="c-nav__icon far fa-wand-magic-sparkles"></i>
      Meet Simulator
    </a>
<div class="c-nav__group">
<a class="c-nav__item" href="/help">
<i aria-hidden="true" class="c-nav__icon far fa-question-circle"></i>
        Help
      </a>
</div>
</nav>
<footer class="c-footer">
<nav class="c-footer__nav">
<a class="c-footer__link" href="/privacy">Privacy</a>
<a class="c-footer__link" href="/terms">Terms</a>
</nav>
</footer>
</div>
<div class="c-sc-drawer c-sc-drawer--mobile js-sc-drawer-mobile">
<header class="c-sc-drawer__header-mobile">
<a class="u-block" href="/">
<img alt="Swimcloud" src="/media/img/swimcloud/logos/swimcloud.svg"/>
</a>
<button class="btn btn-icon btn-icon-plain js-sc-drawer-mobile-close" type="button">
<i class="far fa-chevron-left"></i>
<span class="u-is-hidden-visually">Close</span>
</button>
</header>
<nav class="c-nav c-nav--compact">
<a class="c-nav__item" href="/">
<i aria-hidden="true" class="c-nav__icon far fa-home-alt"></i>
        Home
    </a>
<a class="c-nav__item" href="/results/">
<i aria-hidden="true" class="c-nav__icon far fa-list-alt"></i>
      Meets
    </a>
<a class="c-nav__item" href="/times/">
<i aria-hidden="true" class="c-nav__icon far fa-stopwatch"></i>
      Top Times
    </a>
<a class="c-nav__item" href="/team/rankings/">
<i aria-hidden="true" class="c-nav__icon far fa-tshirt"></i>
      Team Rankings
    </a>
<a class="c-nav__item" href="/recruiting/">
<i aria-hidden="true" class="c-nav__icon far fa-graduation-cap"></i>
      Recruiting
    </a>
<a class="c-nav__item" href="/videos/">
<i aria-hidden="true" class="c-nav__icon far fa-video"></i>
      Videos
    </a>
<a class="c-nav__item" href="/meetsimulator/">
<i aria-hidden="true" class="c-nav__icon far fa-wand-magic-sparkles"></i>
      Meet Simulator
    </a>
<div class="c-nav__group">
<a class="c-nav__item" href="/help">
<i aria-hidden="true" class="c-nav__icon far fa-question-circle"></i>
        Help
      </a>
</div>
</nav>
<footer class="c-footer">
<nav class="c-footer__nav">
<a class="c-footer__link" href="/privacy">Privacy</a>
<a class="c-footer__link" href="/terms">Terms</a>
</nav>
</footer>
</div>
<div class="c-sc-drawer__backdrop-mobile js-sc-drawer-mobile-backdrop"></div>
<div class="c-layout__main js-alerts-container">
<div class="container">
<div class="c-toolbar c-toolbar--fluid">
<div class="c-toolbar__cover hidden-print" style="background-image: url(https://s3.amazonaws.com/cstest/mb/default-covers/blue-abstract-bg-1.png);">
</div>
<div class="c-toolbar__header">
<div class="c-toolbar__media c-toolbar__media-user hidden-print">
<img alt="Seung Joon Ahn (Seungjoon) profile image" height="88" src="https://s3.amazonaws.com/cstest/mb/2017/09/b5047045-0244-41.png.88x88_q85.jpg" width="88"/>
</div>
<div class="c-toolbar__header-content">
<h1 class="c-toolbar__title u-flex u-flex-align-items-center">
<span class="u-mr-">Seungjoon Ahn</span>
</h1>
<div class="c-toolbar__meta hidden-print">
<ul class="o-list-inline o-list-inline--dotted">
<li>Katy, TX</li>
<li>
<a href="/team/283">Columbia University</a>
</li>
<li>
<ul class="o-list-inline">
<li class="u-mr-">
<a class="btn-icon-plain" href="https://twitter.com/SeungjoonA" target="_blank" title="Twitter">
<i class="fab fa-twitter"></i>
<span class="u-is-hidden-visually">
                              Seungjoon Ahn on Twitter
                            </span>
</a>
</li>
<li>
<a class="btn-icon-plain" href="https://instagram.com/seun_g01" target="_blank" title="Instagram">
<i class="fab fa-instagram"></i>
<span class="u-is-hidden-visually">
                              Seungjoon Ahn on Instagram
                            </span>
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="c-toolbar__nav">
<nav class="c-nav c-nav--inline c-nav--responsive">
<a class="c-nav__item c-nav__item--active" href="/swimmer/549377/">
        Home
      </a>
<a class="c-nav__item" href="/swimmer/549377/meets/">
        Meets
      </a>
<a class="c-nav__item" href="/swimmer/549377/rankings/">
        Rankings
      </a>
</nav>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-6 u-pr@sm">
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item u-flex u-flex-justify-between u-flex-align-items-center">
<h2 class="c-title">Meets</h2>
<a href="/swimmer/549377/meets/">See all</a>
</div>
<div id="js-swimmer-profile-latest-times">
<div id="js-swimmer-profile-latest-times-container">
<div class="c-card__item">
<div class="dropdown">
<button aria-expanded="true" aria-haspopup="true" class="btn btn-default dropdown-toggle u-text-start u-text-truncate u-ph" data-toggle="dropdown" type="button">
<div class="o-media">
<img alt="Ivy League Championships (M)" class="o-media__img c-avatar c-avatar--tiny u-object-contain" src="https://s3.amazonaws.com/cstest/results/Ivy_m4Fyy7R.png.68x68_q85.png"/>
<div class="o-media__body">
<div class="u-flex u-flex-align-items-center">
<span class="u-text-truncate">Ivy League Championships (M)</span>
<span class="u-color-mute u-ml- caret"></span>
</div>
<div class="u-color-mute u-text-xsmall u-text-normal">Feb 22–25, 2023</div>
</div>
</div>
</button>
<ul class="dropdown-menu">
<li class="active">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=263969" id="latest-times-meet-load">
                    Ivy League Championships (M)
                    <span class="u-ml- u-color-mute u-text-small">Feb. 22, 2023</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=248487" id="latest-times-meet-load">
                    Dartmouth vs. Columbia (M)
                    <span class="u-ml- u-color-mute u-text-small">Feb. 4, 2023</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=243706" id="latest-times-meet-load">
                    Cornell vs. Columbia (M)
                    <span class="u-ml- u-color-mute u-text-small">Jan. 28, 2023</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=244080" id="latest-times-meet-load">
                    Navy vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Jan. 21, 2023</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=258840" id="latest-times-meet-load">
                    Brown at Columbia
                    <span class="u-ml- u-color-mute u-text-small">Jan. 14, 2023</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=241307" id="latest-times-meet-load">
                    Princeton Big Al Invitational
                    <span class="u-ml- u-color-mute u-text-small">Dec. 2, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=246769" id="latest-times-meet-load">
                    Harvard vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Nov. 18, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=249784" id="latest-times-meet-load">
                    Yale vs. Columbia (M)
                    <span class="u-ml- u-color-mute u-text-small">Nov. 12, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=243524" id="latest-times-meet-load">
                    Columbia vs. Princeton (M)
                    <span class="u-ml- u-color-mute u-text-small">Nov. 11, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=244582" id="latest-times-meet-load">
                    Penn vs. Columbia (Men)
                    <span class="u-ml- u-color-mute u-text-small">Nov. 5, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=242101" id="latest-times-meet-load">
                    Columbia vs. Army
                    <span class="u-ml- u-color-mute u-text-small">Nov. 4, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=224466" id="latest-times-meet-load">
                    Ivy League Championships (M)
                    <span class="u-ml- u-color-mute u-text-small">Feb. 23, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=222851" id="latest-times-meet-load">
                    Columbia vs. Dartmouth
                    <span class="u-ml- u-color-mute u-text-small">Feb. 5, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=221004" id="latest-times-meet-load">
                    Cornell at Columbia
                    <span class="u-ml- u-color-mute u-text-small">Jan. 28, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=205971" id="latest-times-meet-load">
                    Columbia vs. Navy
                    <span class="u-ml- u-color-mute u-text-small">Jan. 22, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=205965" id="latest-times-meet-load">
                    Army vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Jan. 21, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=208813" id="latest-times-meet-load">
                    Brown vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Jan. 15, 2022</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=204391" id="latest-times-meet-load">
                    Princeton BIG AL INVITATIONAL
                    <span class="u-ml- u-color-mute u-text-small">Dec. 3, 2021</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=208812" id="latest-times-meet-load">
                    Harvard vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Nov. 19, 2021</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=208811" id="latest-times-meet-load">
                    Columbia vs. Yale
                    <span class="u-ml- u-color-mute u-text-small">Nov. 13, 2021</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=204652" id="latest-times-meet-load">
                    Princeton vs. Columbia
                    <span class="u-ml- u-color-mute u-text-small">Nov. 12, 2021</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=209276" id="latest-times-meet-load">
                    Columbia @ Pen
                    <span class="u-ml- u-color-mute u-text-small">Nov. 6, 2021</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=173714" id="latest-times-meet-load">
                    Speedo Champions Series - College Station
                    <span class="u-ml- u-color-mute u-text-small">Feb. 27, 2020</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=165768" id="latest-times-meet-load">
                    UIL 6A State Championship
                    <span class="u-ml- u-color-mute u-text-small">Feb. 14, 2020</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=165760" id="latest-times-meet-load">
                    UIL 6A Region 05 Championship
                    <span class="u-ml- u-color-mute u-text-small">Jan. 30, 2020</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=165737" id="latest-times-meet-load">
                    TAPPS Eastern Region Championship
                    <span class="u-ml- u-color-mute u-text-small">Jan. 30, 2020</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=174813" id="latest-times-meet-load">
                    GU COOG January UofH Invitational
                    <span class="u-ml- u-color-mute u-text-small">Jan. 10, 2020</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=197579" id="latest-times-meet-load">
                    Quad College Format
                    <span class="u-ml- u-color-mute u-text-small">Dec. 28, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=172474" id="latest-times-meet-load">
                    Speedo Winter Junior Championship West
                    <span class="u-ml- u-color-mute u-text-small">Dec. 11, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=171004" id="latest-times-meet-load">
                    GU TWST Southern Senior Championships
                    <span class="u-ml- u-color-mute u-text-small">Dec. 5, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=168295" id="latest-times-meet-load">
                    TISCA 6A Invite
                    <span class="u-ml- u-color-mute u-text-small">Nov. 21, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=173555" id="latest-times-meet-load">
                    GU PFL November Senior Meet
                    <span class="u-ml- u-color-mute u-text-small">Nov. 2, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=162612" id="latest-times-meet-load">
                    GU PACK October Open
                    <span class="u-ml- u-color-mute u-text-small">Oct. 12, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=130301" id="latest-times-meet-load">
                    NCSA Summer Championship
                    <span class="u-ml- u-color-mute u-text-small">Aug. 6, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=130241" id="latest-times-meet-load">
                    Phillips 66 Summer National Championships
                    <span class="u-ml- u-color-mute u-text-small">July 31, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=150274" id="latest-times-meet-load">
                    Phillips 66 Summer National Time Trials
                    <span class="u-ml- u-color-mute u-text-small">July 31, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=130222" id="latest-times-meet-load">
                    GU FCST Gulf Summer Champs
                    <span class="u-ml- u-color-mute u-text-small">July 19, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=148868" id="latest-times-meet-load">
                    GU TWST Senior LC Invite
                    <span class="u-ml- u-color-mute u-text-small">June 28, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=129570" id="latest-times-meet-load">
                    GU KATY Senior Invite
                    <span class="u-ml- u-color-mute u-text-small">May 18, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=128984" id="latest-times-meet-load">
                    Speedo Champions Series - Southern - College Station
                    <span class="u-ml- u-color-mute u-text-small">Feb. 28, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=122682" id="latest-times-meet-load">
                    UIL Texas 6A State Championship
                    <span class="u-ml- u-color-mute u-text-small">Feb. 15, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=122659" id="latest-times-meet-load">
                    TAPPS Eastern Region Championship
                    <span class="u-ml- u-color-mute u-text-small">Jan. 31, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=142058" id="latest-times-meet-load">
                    UIL 6A District 19 Championship
                    <span class="u-ml- u-color-mute u-text-small">Jan. 24, 2019</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=127953" id="latest-times-meet-load">
                    GU KATY Quad College Format
                    <span class="u-ml- u-color-mute u-text-small">Dec. 28, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=127768" id="latest-times-meet-load">
                    Speedo Winter Junior Championships - West
                    <span class="u-ml- u-color-mute u-text-small">Dec. 5, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=127715" id="latest-times-meet-load">
                    Gulf Swimming Southern Senior Champs
                    <span class="u-ml- u-color-mute u-text-small">Nov. 29, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=122605" id="latest-times-meet-load">
                    TISCA Gulf Zone Invitational
                    <span class="u-ml- u-color-mute u-text-small">Nov. 15, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=127288" id="latest-times-meet-load">
                    NT LAC Fall Classic
                    <span class="u-ml- u-color-mute u-text-small">Nov. 2, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=197581" id="latest-times-meet-load">
                    GU KATY Katy Quince Meet
                    <span class="u-ml- u-color-mute u-text-small">Oct. 20, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=197580" id="latest-times-meet-load">
                    Katy Purple &amp; Black Meet
                    <span class="u-ml- u-color-mute u-text-small">Sept. 22, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=114384" id="latest-times-meet-load">
                    Speedo Junior National Championships
                    <span class="u-ml- u-color-mute u-text-small">July 31, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=121460" id="latest-times-meet-load">
                    Speedo Junior National Time Trials
                    <span class="u-ml- u-color-mute u-text-small">July 31, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=120061" id="latest-times-meet-load">
                    Gulf Senior Champs
                    <span class="u-ml- u-color-mute u-text-small">July 20, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=116258" id="latest-times-meet-load">
                    CA MVN Fran Crippen Memorial Swim Meet of Champions
                    <span class="u-ml- u-color-mute u-text-small">June 21, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=117546" id="latest-times-meet-load">
                    GU KATY Senior Invite
                    <span class="u-ml- u-color-mute u-text-small">May 19, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=116676" id="latest-times-meet-load">
                    GU PLAT/KATY IMX Meet
                    <span class="u-ml- u-color-mute u-text-small">April 13, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=100095" id="latest-times-meet-load">
                    Speedo Champions Series - Southern - College Station
                    <span class="u-ml- u-color-mute u-text-small">March 1, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=102389" id="latest-times-meet-load">
                    UIL Texas 6A State Championships
                    <span class="u-ml- u-color-mute u-text-small">Feb. 16, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=102366" id="latest-times-meet-load">
                    TAPPS Eastern Region Championships
                    <span class="u-ml- u-color-mute u-text-small">Feb. 1, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=111888" id="latest-times-meet-load">
                    TYR Pro Swim Series - Austin
                    <span class="u-ml- u-color-mute u-text-small">Jan. 11, 2018</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=76279" id="latest-times-meet-load">
                    Speedo Winter Junior Championships - West
                    <span class="u-ml- u-color-mute u-text-small">Dec. 6, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=100046" id="latest-times-meet-load">
                    GU TWST Southern Senior Champs
                    <span class="u-ml- u-color-mute u-text-small">Nov. 30, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=102312" id="latest-times-meet-load">
                    TISCA Gulf Zone Invitational
                    <span class="u-ml- u-color-mute u-text-small">Nov. 16, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=108533" id="latest-times-meet-load">
                    GU PACK Open Invitational Meet
                    <span class="u-ml- u-color-mute u-text-small">Nov. 3, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215386" id="latest-times-meet-load">
                    Katy Quince Meet
                    <span class="u-ml- u-color-mute u-text-small">Oct. 21, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=96679" id="latest-times-meet-load">
                    Southern Zone Senior Championships
                    <span class="u-ml- u-color-mute u-text-small">Aug. 1, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=96434" id="latest-times-meet-load">
                    Gulf Swimming Senior Championships
                    <span class="u-ml- u-color-mute u-text-small">July 14, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=95206" id="latest-times-meet-load">
                    ST AAAA Northside George Block Invitational
                    <span class="u-ml- u-color-mute u-text-small">June 23, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=95103" id="latest-times-meet-load">
                    GU TWST Senior Open Meet
                    <span class="u-ml- u-color-mute u-text-small">May 20, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215396" id="latest-times-meet-load">
                    PLAT/KATY IMX Meet
                    <span class="u-ml- u-color-mute u-text-small">April 29, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=91949" id="latest-times-meet-load">
                    Speedo Champions Series - Southern - College Station
                    <span class="u-ml- u-color-mute u-text-small">Feb. 23, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=76085" id="latest-times-meet-load">
                    Texas 6A State Championships
                    <span class="u-ml- u-color-mute u-text-small">Feb. 17, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=75948" id="latest-times-meet-load">
                    Texas TAPPS East Region Championships
                    <span class="u-ml- u-color-mute u-text-small">Feb. 2, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215290" id="latest-times-meet-load">
                    Third Coast Invitational hoste
                    <span class="u-ml- u-color-mute u-text-small">Jan. 13, 2017</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215295" id="latest-times-meet-load">
                    Quad College Format 2016
                    <span class="u-ml- u-color-mute u-text-small">Dec. 30, 2016</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=82890" id="latest-times-meet-load">
                    GU TWST Southern Sr. Champs
                    <span class="u-ml- u-color-mute u-text-small">Dec. 1, 2016</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215309" id="latest-times-meet-load">
                    Gulf Senior Meet
                    <span class="u-ml- u-color-mute u-text-small">Nov. 5, 2016</span>
</a>
</li>
<li class="">
<a class="u-flex u-flex-justify-between u-flex-align-items-end" href="/swimmer/549377/times/latest/?meet_id=215317" id="latest-times-meet-load">
                    Katy Quince Meet
                    <span class="u-ml- u-color-mute u-text-small">Oct. 21, 2016</span>
</a>
</li>
</ul>
</div>
</div>
<div class="c-table-clean--responsive">
<table class="c-table-clean c-table-clean--middle table table-hover">
<thead>
<tr>
<th>Event</th>
<th class="c-table-clean__col-fit u-text-end">Time</th>
<th class="c-table-clean__col-fit hidden-xs"></th>
<th class="c-table-clean__col-fit u-text-end">Place</th>
<th class="c-table-clean__col-fit u-text-end">Imp</th>
<th class="c-table-clean__col-fit">
<span class="u-is-hidden-visually">Personal Season Best</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>200 Y Free <span class="u-color-mute">Timed Finals</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/2/?id=97778130#time97778130">1:37.48</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Relay Split">
        S
        
      </span>
</td>
<td class="u-text-end">
                    
                      
                        –
                      
                    
                  </td>
<td class="u-text-end">
                    
                      –
                    
                  </td>
<td>
</td>
</tr>
<tr>
<td>500 Y Free <span class="u-color-mute">Finals</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/3/?id=97777340#time97777340">4:23.83</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="u-text-end">
                    
                      
                        18th
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.2%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--sb u-help" title="Season Best">SB</span>
</td>
</tr>
<tr>
<td>500 Y Free <span class="u-color-mute">Prelims</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/3/?id=97777339#time97777339">4:27.72</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="u-text-end">
                    
                      
                        21st
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-danger">
	  	-0.2%
	  </span>
</td>
<td>
</td>
</tr>
<tr>
<td>50 Y Fly <span class="u-color-mute">Finals</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/9/?id=97777538#time97777538">22.33</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Extracted">
        X
        
      </span>
</td>
<td class="u-text-end">
                    
                      
                        –
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.2%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--pb u-help" title="Personal Best">PB</span>
</td>
</tr>
<tr>
<td>50 Y Fly <span class="u-color-mute">Prelims</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/9/?id=97777537#time97777537">22.18</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Extracted">
        X
        
      </span>
</td>
<td class="u-text-end">
                    
                      
                        –
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.8%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--pb u-help" title="Personal Best">PB</span>
</td>
</tr>
<tr>
<td>100 Y Fly <span class="u-color-mute">Finals</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/9/?id=97777538#time97777538">47.41</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<a href="/results/236950">
<span class="c-label c-label--outline c-label--warning" title="NCAA Division I Mens Championships">
        B
        
      </span>
</a>
</td>
<td class="u-text-end">
                    
                      
                        10th
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.8%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--pb u-help" title="Personal Best">PB</span>
</td>
</tr>
<tr>
<td>100 Y Fly <span class="u-color-mute">Prelims</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/9/?id=97777537#time97777537">47.48</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="u-text-end">
                    
                      
                        11th
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.7%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--pb u-help" title="Personal Best">PB</span>
</td>
</tr>
<tr>
<td>200 Y Fly <span class="u-color-mute">Finals</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/19/?id=97778074#time97778074">1:44.29</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<a href="/results/236950">
<span class="c-label c-label--outline c-label--warning" title="NCAA Division I Mens Championships">
        B
        
      </span>
</a>
</td>
<td class="u-text-end">
                    
                      
                        5th
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+1.2%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--sb u-help" title="Season Best">SB</span>
</td>
</tr>
<tr>
<td>200 Y Fly <span class="u-color-mute">Prelims</span></td>
<td class="u-text-semi u-text-end">
<a href="/results/263969/event/19/?id=97778073#time97778073">1:44.90</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="u-text-end">
                    
                      
                        7th
                      
                    
                  </td>
<td class="u-text-end">
<span class="u-color-success">
	  	+0.6%
	  </span>
</td>
<td>
<span class="c-label c-label--outline c-label--sb u-help" title="Season Best">SB</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item">
<h2 class="c-title">Teams</h2>
</div>
<div class="c-card__item">
<ul class="c-list c-list--multiline">
<li class="c-list__item">
<a class="c-list__avatar u-is-hidden@palm" href="/team/283" title="Columbia University">
<img alt="Columbia University logo" class="c-avatar c-avatar--tiny u-object-contain" loading="lazy" src="https://s3.amazonaws.com/cstest/teams/80-columbia.gif.68x68_q85.jpg"/>
</a>
<div class="c-list__primary-content">
<h3 class="c-list__title">
<a href="/team/283">Columbia University</a>
</h3>
<div class="c-list__text">
<ul class="o-list-inline o-list-inline--dotted">
<li>New York, NY</li>
</ul>
</div>
</div>
<div class="c-list__secondary-content">
</div>
</li>
<li class="c-list__item">
<a class="c-list__avatar u-is-hidden@palm" href="/team/8179" title="Katy Aquatics">
<img alt="Katy Aquatics logo" class="c-avatar c-avatar--tiny u-object-contain" loading="lazy" src="https://s3.amazonaws.com/cstest/mb/2019/06/ddecb1d4-4198-43.jpeg.68x68_q85.jpg"/>
</a>
<div class="c-list__primary-content">
<h3 class="c-list__title">
<a href="/team/8179">Katy Aquatics</a>
</h3>
<div class="c-list__text">
<ul class="o-list-inline o-list-inline--dotted">
<li>Katy, TX</li>
</ul>
</div>
</div>
<div class="c-list__secondary-content">
</div>
</li>
<li class="c-list__item">
<a class="c-list__avatar u-is-hidden@palm" href="/team/8688" title="Seven Lakes High School">
<img alt="Seven Lakes High School logo" class="c-avatar c-avatar--tiny u-object-contain" loading="lazy" src="https://swimcloud.com/media/img/icon-fa-institution.png"/>
</a>
<div class="c-list__primary-content">
<h3 class="c-list__title">
<a href="/team/8688">Seven Lakes High School</a>
</h3>
<div class="c-list__text">
<ul class="o-list-inline o-list-inline--dotted">
<li>Katy, TX</li>
</ul>
</div>
</div>
<div class="c-list__secondary-content">
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item">
<h2 class="c-title">Highlights</h2>
</div>
<div class="c-card__item">
<ul class="o-list-block o-list-block--huge o-list-block--divided">
<li class="o-list-block__item">
<div class="js-expandable">
<div class="c-expandable c-expandable--huge">
<div class="c-timeline">
<!-- Regroup highlits by Year -->
<!-- We want all highlights from the same day to be ordered by their class type -->
<!-- Thats why we first sort them by child_class and then by date_awarded -->
<!-- This leads to (date_awarded, class_name) sort. -->
<!-- Read more about python stable sort here: https://wiki.python.org/moin/HowTo/Sorting/#Sort_Stability_and_Complex_Sorts -->
<p class="c-timeline__year">2022</p>
<!-- Now we want to group highlits by type, e.g. Meet,Athletic,Academic -->
<!-- We do this to render each group in a own way -->
<!-- Define specific render for MeetHighlight -->
<!-- We can have records from several meets in a MeetHighlight Class -->
<!-- Thats why we sort all the highlights by meet_id -->
<!-- And then group my meet, to get all records from a meet. -->
<!-- meet_group contains all highlights per meet. -->
<!-- To keep the correct meet order, we sort the meets by startdate -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/224466">Ivy League Championships (M)</a>
</h3>
<time class="c-timeline__date" datetime="2022-02-23">
                              Feb 23
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      3rd place <a href="/results/224466/event/19/?id=59693509#time59693509">200 Y Fly – 1:43.75</a>
</p>
</div>
<p class="c-timeline__year">2020</p>
<!-- Now we want to group highlits by type, e.g. Meet,Athletic,Academic -->
<!-- We do this to render each group in a own way -->
<!-- Define specific render for MeetHighlight -->
<!-- We can have records from several meets in a MeetHighlight Class -->
<!-- Thats why we sort all the highlights by meet_id -->
<!-- And then group my meet, to get all records from a meet. -->
<!-- meet_group contains all highlights per meet. -->
<!-- To keep the correct meet order, we sort the meets by startdate -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/173714">Speedo Champions Series - College Station</a>
</h3>
<time class="c-timeline__date" datetime="2020-02-27">
                              Feb 27
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  4 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      3rd place <a href="/results/173714/event/10/?id=35083127#time35083127">200 L Fly – 2:02.05</a>
</p>
<p class="c-timeline__meta">
                                      6th place <a href="/results/173714/event/12/?id=35085701#time35085701">400 L Free – 4:03.81</a>
</p>
<p class="c-timeline__meta">
                                      6th place <a href="/results/173714/event/20/?id=35083505#time35083505">100 L Fly – 55.56</a>
</p>
<p class="c-timeline__meta">
                                      7th place <a href="/results/173714/event/12/?id=35083312#time35083312">500 Y Free – 4:25.45</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/165768">UIL 6A State Championship</a>
</h3>
<time class="c-timeline__date" datetime="2020-02-14">
                              Feb 14
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  2 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165768/event/16/?id=34535907#time34535907">500 Y Free – 4:21.68</a>
</p>
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165768/event/4/?id=34535870#time34535870">200 Y Free – 1:37.85</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/165737">TAPPS Eastern Region Championship</a>
</h3>
<time class="c-timeline__date" datetime="2020-01-30">
                              Jan 30
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  2 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165737/event/4/?id=33635699#time33635699">200 Y Free – 1:40.06</a>
</p>
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165737/event/16/?id=33635734#time33635734">500 Y Free – 4:27.47</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/165760">UIL 6A Region 05 Championship</a>
</h3>
<time class="c-timeline__date" datetime="2020-01-30">
                              Jan 30
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  2 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165760/event/16/?id=34199017#time34199017">500 Y Free – 4:27.47</a>
</p>
<p class="c-timeline__meta">
                                      2nd place <a href="/results/165760/event/4/?id=34198982#time34198982">200 Y Free – 1:40.06</a>
</p>
</div>
<p class="c-timeline__year">2019</p>
<!-- Now we want to group highlits by type, e.g. Meet,Athletic,Academic -->
<!-- We do this to render each group in a own way -->
<!-- Define specific render for MeetHighlight -->
<!-- Define default render for the rest highlight types -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">USA Swimming Scholastic All-America</h3>
<time class="c-timeline__date" datetime="2019-09-01">
                              Sep 1
                            </time>
</div>
<!-- Define specific render for MeetHighlight -->
<!-- We can have records from several meets in a MeetHighlight Class -->
<!-- Thats why we sort all the highlights by meet_id -->
<!-- And then group my meet, to get all records from a meet. -->
<!-- meet_group contains all highlights per meet. -->
<!-- To keep the correct meet order, we sort the meets by startdate -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/130301">NCSA Summer Championship</a>
</h3>
<time class="c-timeline__date" datetime="2019-08-06">
                              Aug 6
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/130301/event/25/?id=28637678#time28637678">200 L Fly – 2:02.02</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/128984">Speedo Champions Series - Southern - College Station</a>
</h3>
<time class="c-timeline__date" datetime="2019-02-28">
                              Feb 28
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      3rd place <a href="/results/128984/event/10/?id=25043101#time25043101">200 L Fly – 2:03.22</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/122682">UIL Texas 6A State Championship</a>
</h3>
<time class="c-timeline__date" datetime="2019-02-15">
                              Feb 15
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      5th place <a href="/results/122682/event/16/?id=24404574#time24404574">500 Y Free – 4:30.19</a>
</p>
</div>
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/122659">TAPPS Eastern Region Championship</a>
</h3>
<time class="c-timeline__date" datetime="2019-01-31">
                              Jan 31
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  2 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/122659/event/4/?id=24231193#time24231193">200 Y Free – 1:41.73</a>
</p>
<p class="c-timeline__meta">
                                      4th place <a href="/results/122659/event/16/?id=24231574#time24231574">500 Y Free – 4:33.06</a>
</p>
</div>
<p class="c-timeline__year">2018</p>
<!-- Now we want to group highlits by type, e.g. Meet,Athletic,Academic -->
<!-- We do this to render each group in a own way -->
<!-- Define specific render for MeetHighlight -->
<!-- Define default render for the rest highlight types -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">USA Swimming Scholastic All-America</h3>
<time class="c-timeline__date" datetime="2018-08-01">
                              Aug 1
                            </time>
</div>
<!-- Define specific render for MeetHighlight -->
<!-- We can have records from several meets in a MeetHighlight Class -->
<!-- Thats why we sort all the highlights by meet_id -->
<!-- And then group my meet, to get all records from a meet. -->
<!-- meet_group contains all highlights per meet. -->
<!-- To keep the correct meet order, we sort the meets by startdate -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/102366">TAPPS Eastern Region Championships</a>
</h3>
<time class="c-timeline__date" datetime="2018-02-01">
                              Feb 1
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  2 time Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      2nd place <a href="/results/102366/event/12/?id=13907729#time13907729">100 Y Fly – 50.45</a>
</p>
<p class="c-timeline__meta">
                                      3rd place <a href="/results/102366/event/4/?id=13908303#time13908303">200 Y Free – 1:43.48</a>
</p>
</div>
<p class="c-timeline__year">2017</p>
<!-- Now we want to group highlits by type, e.g. Meet,Athletic,Academic -->
<!-- We do this to render each group in a own way -->
<!-- Define specific render for MeetHighlight -->
<!-- We can have records from several meets in a MeetHighlight Class -->
<!-- Thats why we sort all the highlights by meet_id -->
<!-- And then group my meet, to get all records from a meet. -->
<!-- meet_group contains all highlights per meet. -->
<!-- To keep the correct meet order, we sort the meets by startdate -->
<div class="c-timeline__item">
<h3 class="c-timeline__title">
<a href="/results/75948">Texas TAPPS East Region Championships</a>
</h3>
<time class="c-timeline__date" datetime="2017-02-02">
                              Feb 2
                            </time>
<!-- Now we want to group highlights per htype (champion/finalist). -->
<h4 class="c-timeline__subtitle">
<!-- The icon for this htype -->
<i class="far fa-list-ol fa-fw u-mr u-color-hint"></i>
                                

                                
                                  Finalist
                                
                              </h4>
<!-- Now show all the times for this h_type ordered by place -->
<p class="c-timeline__meta">
                                      5th place <a href="/results/75948/event/12/?id=8799411#time8799411">100 Y Fly – 51.94</a>
</p>
</div>
</div>
<div class="c-exapndable__indicator"></div>
</div>
<footer class="u-text-end u-mt">
<button class="btn-link js-expandable-trigger" type="button">
                    Show more
                  </button>
</footer>
</div>
</li>
</ul>
</div>
</div>
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item" data-swimmer-id="549377">
<h2 class="c-title">Specialty</h2>
</div>
<div class="c-card__item u-p++">
<canvas id="radarChart"></canvas>
<canvas class="u-block u-1/2 u-center u-pt++" height="5" id="gradient"></canvas>
<div class="u-clearfix u-text-small u-center u-1/2 u-mt-">
<span class="u-pull-start">Sprint</span>
<span class="u-pull-end">Distance</span>
</div>
</div>
</div>
<script type="text/javascript">
  function colorCalculator(distance, alpha) {
    var distance = distance * 2.55;
    var result = "rgba(" + String(255-parseInt(distance/10)) + ",0," + String(0+parseInt(distance/10)) + "," + String(alpha) + ")";
    return result;
  }

  function drawChart(data) {
  	var config = {
      type: 'radar',
      data: {
    		labels: ["Free", "Back", "Breast", "Fly", "IM"],
    		datasets: [{
    			data: [
            data['1'],
            data['2'],
            data['3'],
            data['4'],
            data['5'],
          ],
    		}],
      },
      options: {
        aspectRatio: 2,
        legend: {
          display: false,
        },
        tooltips: {
          enabled: false,
        },
        elements: {
          point: {
            radius: 0,
            hoverRadius: 0,
          },
          line: {
            backgroundColor: colorCalculator(data['d'], 1),
            borderColor: colorCalculator(data['d'], 1),
            borderWidth: 1,
            tension: 0,
          }
        },
        scale: {
          angleLines: {
            color: '#eee',
          },
          gridLines: {
            color: '#eee',
            display: true,
          },
          ticks: {
            display: false,
            min: -100,
            suggestedMax: 1000,
            stepSize: 200,
          },
          pointLabels: {
            fontFamily: '"Roboto", "Helvetica", "Arial", "sans-serif"',
            fontSize: '16',
            fontColor: 'rgba(0, 0, 0, .87)',
          },
        },
      },
  	};

    var ctx2 = document.getElementById("radarChart").getContext("2d");
  	var chart = new Chart(ctx2, config);
    // generate gradient
    var c = document.getElementById("gradient");
    var w = document.getElementById("radarChart").width;
    var ctx = c.getContext("2d");
    var gradient = ctx.createLinearGradient(0, 0, w, 0);
    gradient.addColorStop(0, "red");
    gradient.addColorStop(1, "blue");
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, w, 5);
  }

  document.addEventListener("DOMContentLoaded", function(){
    $.getJSON("/swimmer/549377/specialty/", function(data) {

      //replace undefined with 0
      var strokes = ['1', '2', '3', '4', '5'];
      for (var i = 0; i < strokes.length; i++) {
        if (data[strokes[i]] == undefined) {
          data[strokes[i]] = 0;
        }
      }
      drawChart(data);
    })
  });
</script>
<style type="text/css">
  .line {
      fill: none;
      stroke: #4178BE;
      stroke-width: 2;
  }

  .chart{
    background: white;
  }

  .dot {
      fill: #4178BE;
      stroke: #fff;
      stroke-width: 2px;
  }

  .dot:hover{
    fill: #4178BE;
    stroke: white;
    stroke-width: 2px;
  }
</style>
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item">
<h2 class="c-title">Progression</h2>
</div>
<div class="c-card__item">
<div class="js-swimmer-profile-overall-progress" data-swimmer-id="549377"></div>
</div>
</div>
</div>
<div class="col-sm-12">
<div class="c-card c-card--large o-grid__col-span-2" id="js-swimmer-profile-times">
<div class="c-card__item">
<ul class="c-tabs u-mb js-swimmer-profile-times-options">
<li class="c-tabs__item active">
<a class="c-tabs__link u-text-truncate" href="/swimmer/549377/times/fastest/">
            PERSONAL BESTS
          </a>
</li>
<li class="c-tabs__item">
<a class="c-tabs__link u-text-truncate" href="/swimmer/549377/times/byevent/">
            EVENT PROGRESSION
          </a>
</li>
</ul>
<div id="js-swimmer-profile-times-container">
<div class="c-table-clean--responsive">
<table class="c-table-clean c-table-clean--middle table table-hover">
<thead>
<tr>
<th>Event</th>
<th class="c-table-clean__col-fit u-text-end">Time</th>
<th class="c-table-clean__col-fit hidden-xs"></th>
<th class="hidden-xs">Meet</th>
<th class="c-table-clean__col-fit">Date</th>
</tr>
</thead>
<tbody>
<tr>
<td class="u-text-truncate">50 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/241307/event/8/?id=90394357#time90394357">21.02</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/241307">Princeton Big Al Invitational</a>
</td>
<td class="u-text-truncate">Dec 02, 2022</td>
</tr>
<tr>
<td class="u-text-truncate">50 L Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/96679/event/6/?id=12249757#time12249757">25.98</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Relay Leadoff">
        R
        
      </span>
</td>
<td class="hidden-xs">
<a href="/results/96679">Southern Zone Senior Championships</a>
</td>
<td class="u-text-truncate">Aug 01, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">100 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/241307/event/34/?id=90394542#time90394542">45.70</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/241307">Princeton Big Al Invitational</a>
</td>
<td class="u-text-truncate">Dec 04, 2022</td>
</tr>
<tr>
<td class="u-text-truncate">100 L Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/148868/event/36/?id=27527423#time27527423">54.74</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Relay Leadoff">
        R
        
      </span>
</td>
<td class="hidden-xs">
<a href="/results/148868">GU TWST Senior LC Invite</a>
</td>
<td class="u-text-truncate">Jun 30, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">200 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/165768/event/4/?id=34535870#time34535870">1:37.85</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/165768">UIL 6A State Championship</a>
</td>
<td class="u-text-truncate">Feb 14, 2020</td>
</tr>
<tr>
<td class="u-text-truncate">200 L Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/130301/event/19/?id=28638000#time28638000">1:53.71</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Relay Leadoff">
        R
        
      </span>
</td>
<td class="hidden-xs">
<a href="/results/130301">NCSA Summer Championship</a>
</td>
<td class="u-text-truncate">Aug 07, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">400 L Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/173714/event/12/?id=35085701#time35085701">4:03.81</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/173714">Speedo Champions Series - College Station</a>
</td>
<td class="u-text-truncate">Feb 28, 2020</td>
</tr>
<tr>
<td class="u-text-truncate">500 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/165768/event/16/?id=34535907#time34535907">4:21.68</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/165768">UIL 6A State Championship</a>
</td>
<td class="u-text-truncate">Feb 14, 2020</td>
</tr>
<tr>
<td class="u-text-truncate">1000 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/127953/event/4/?id=41418568#time41418568">10:01.87</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/127953">GU KATY Quad College Format</a>
</td>
<td class="u-text-truncate">Dec 28, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">1500 L Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/95206/event/40/?id=11920739#time11920739">17:26.37</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/95206">ST AAAA Northside George Block Invitational</a>
</td>
<td class="u-text-truncate">Jun 25, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">1650 Y Free</td>
<td class="u-text-end u-text-semi">
<a href="/results/215290/event/8/?id=51252912#time51252912">16:55.64</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/215290">Third Coast Invitational hoste</a>
</td>
<td class="u-text-truncate">Jan 13, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">50 Y Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/171004/event/22/?id=31269395#time31269395">27.33</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Extracted">
        X
        
      </span>
</td>
<td class="hidden-xs">
<a href="/results/171004">GU TWST Southern Senior Championships</a>
</td>
<td class="u-text-truncate">Dec 07, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">50 L Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/96434/event/8/?id=12171551#time12171551">34.73</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/96434">Gulf Swimming Senior Championships</a>
</td>
<td class="u-text-truncate">Jul 14, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">100 Y Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/171004/event/22/?id=31269395#time31269395">56.47</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/171004">GU TWST Southern Senior Championships</a>
</td>
<td class="u-text-truncate">Dec 07, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">100 L Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/95206/event/34/?id=11916822#time11916822">1:11.38</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/95206">ST AAAA Northside George Block Invitational</a>
</td>
<td class="u-text-truncate">Jun 25, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">200 Y Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/197581/event/20/?id=41417809#time41417809">2:06.83</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/197581">GU KATY Katy Quince Meet</a>
</td>
<td class="u-text-truncate">Oct 21, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">200 L Back</td>
<td class="u-text-end u-text-semi">
<a href="/results/117546/event/18/?id=18611924#time18611924">2:31.41</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/117546">GU KATY Senior Invite</a>
</td>
<td class="u-text-truncate">May 20, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">50 Y Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/197580/event/8/?id=41416126#time41416126">29.69</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/197580">Katy Purple &amp; Black Meet</a>
</td>
<td class="u-text-truncate">Sep 22, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">50 L Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/96434/event/34/?id=12171758#time12171758">35.65</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/96434">Gulf Swimming Senior Championships</a>
</td>
<td class="u-text-truncate">Jul 16, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">100 Y Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/162612/event/6/?id=41412895#time41412895">1:02.65</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/162612">GU PACK October Open</a>
</td>
<td class="u-text-truncate">Oct 12, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">100 L Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/95103/event/12/?id=11877942#time11877942">1:15.69</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/95103">GU TWST Senior Open Meet</a>
</td>
<td class="u-text-truncate">May 20, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">200 Y Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/197581/event/26/?id=41417580#time41417580">2:16.99</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/197581">GU KATY Katy Quince Meet</a>
</td>
<td class="u-text-truncate">Oct 21, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">200 L Breast</td>
<td class="u-text-end u-text-semi">
<a href="/results/215396/event/6/?id=51464622#time51464622">2:44.88</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/215396">PLAT/KATY IMX Meet</a>
</td>
<td class="u-text-truncate">Apr 29, 2017</td>
</tr>
<tr>
<td class="u-text-truncate">50 Y Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/263969/event/9/?id=97777537#time97777537">22.18</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<span class="c-label c-label--neutral u-is-helpable" title="Extracted">
        X
        
      </span>
</td>
<td class="hidden-xs">
<a href="/results/263969">Ivy League Championships (M)</a>
</td>
<td class="u-text-truncate">Feb 24, 2023</td>
</tr>
<tr>
<td class="u-text-truncate">50 L Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/130301/event/10/?id=28636063#time28636063">25.37</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/130301">NCSA Summer Championship</a>
</td>
<td class="u-text-truncate">Aug 06, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">100 Y Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/263969/event/9/?id=97777538#time97777538">47.41</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<a href="/results/236950">
<span class="c-label c-label--outline c-label--warning" title="NCAA Division I Mens Championships">
        B
        
      </span>
</a>
</td>
<td class="hidden-xs">
<a href="/results/263969">Ivy League Championships (M)</a>
</td>
<td class="u-text-truncate">Feb 24, 2023</td>
</tr>
<tr>
<td class="u-text-truncate">100 L Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/150274/event/318/?id=28453763#time28453763">55.41</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/150274">Phillips 66 Summer National Time Trials</a>
</td>
<td class="u-text-truncate">Aug 02, 2019</td>
</tr>
<tr>
<td class="u-text-truncate">200 Y Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/224466/event/19/?id=59693509#time59693509">1:43.75</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<a href="/results/194776">
<span class="c-label c-label--outline c-label--warning" title="NCAA Division I Mens Championship">
        B
        
      </span>
</a>
</td>
<td class="hidden-xs">
<a href="/results/224466">Ivy League Championships (M)</a>
</td>
<td class="u-text-truncate">Feb 26, 2022</td>
</tr>
<tr>
<td class="u-text-truncate">200 L Fly</td>
<td class="u-text-end u-text-semi">
<a href="/results/114384/event/2/?id=19932245#time19932245">2:01.36</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
<a href="/results/130512">
<span class="c-label c-label--outline c-label--success" title="USA Swimming Winter National Championships">
        A
        
      </span>
</a>
</td>
<td class="hidden-xs">
<a href="/results/114384">Speedo Junior National Championships</a>
</td>
<td class="u-text-truncate">Jul 31, 2018</td>
</tr>
<tr>
<td class="u-text-truncate">200 Y IM</td>
<td class="u-text-end u-text-semi">
<a href="/results/173714/event/34/?id=35081136#time35081136">1:53.76</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/173714">Speedo Champions Series - College Station</a>
</td>
<td class="u-text-truncate">Mar 01, 2020</td>
</tr>
<tr>
<td class="u-text-truncate">200 L IM</td>
<td class="u-text-end u-text-semi">
<a href="/results/173714/event/34/?id=35081137#time35081137">2:12.30</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/173714">Speedo Champions Series - College Station</a>
</td>
<td class="u-text-truncate">Mar 01, 2020</td>
</tr>
<tr>
<td class="u-text-truncate">400 Y IM</td>
<td class="u-text-end u-text-semi">
<a href="/results/204391/event/16/?id=49075246#time49075246">4:12.33</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/204391">Princeton BIG AL INVITATIONAL</a>
</td>
<td class="u-text-truncate">Dec 04, 2021</td>
</tr>
<tr>
<td class="u-text-truncate">400 L IM</td>
<td class="u-text-end u-text-semi">
<a href="/results/117546/event/16/?id=18611849#time18611849">4:59.49</a>
</td>
<td class="u-pl0 u-nowrap hidden-xs">
</td>
<td class="hidden-xs">
<a href="/results/117546">GU KATY Senior Invite</a>
</td>
<td class="u-text-truncate">May 19, 2018</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item u-flex u-flex-justify-between u-flex-align-items-center">
<h2 class="c-title">Rankings</h2>
<a href="/swimmer/549377/rankings/">
        See all
      </a>
</div>
<div class="c-card__item">
<h3 class="u-text-upcase c-body2 u-color-mute u-text-small">
          Season 2022-2023
        </h3>
<div class="row">
<div class="col-md-4">
<div class="c-link-boxes u-mt">
<h4 class="c-link-boxes__header">
                    
                      USA
                    
                    College
                    
                  </h4>
<a class="c-link-boxes-item" href="/country/usa/college/conference/ivy/swimmers/?rank=8285840&amp;gender=M&amp;season_id=26&amp;page=2">
<img alt="Ivy logo" class="c-link-boxes-item__img" height="34" loading="lazy" src="https://s3.amazonaws.com/cstest/img/logos/conference-ivy.gif" width="34">
<h5 class="c-link-boxes-item__primary-text">
                        Ivy
                      </h5>
<span class="c-link-boxes-item__number">40th</span>
</img></a>
<a class="c-link-boxes-item" href="/team/283/roster/?rank=8290746&amp;gender=M&amp;season_id=26&amp;sort=perf">
<img alt="Columbia University logo" class="c-link-boxes-item__img" height="34" loading="lazy" src="https://s3.amazonaws.com/cstest/teams/80-columbia.gif.68x68_q85.jpg" width="34">
<h5 class="c-link-boxes-item__primary-text">
                        Columbia University
                      </h5>
<span class="c-link-boxes-item__number">5th</span>
</img></a>
</div>
</div>
</div>
</div>
</div>
<div class="c-card c-card--large c-card--divided">
<div class="c-card__item">
<div class="u-flex u-flex-align-items-center">
<h2 class="c-title">Photos</h2>
</div>
</div>
<div class="c-gallery js-gallery">
<figure class="c-gallery__item u-is-hidden">
<span class="c-gallery__helper"></span>
<img alt="Seungjoon Ahn image 1" class="c-gallery__img" src="https://s3.amazonaws.com/cstest/mb/2017/09/IMG_0588.PNG.640x480_q85.jpg"/>
<a aria-label="Seungjoon Ahn image 1" class="btn-overlay btn-overlay--block js-gallery-link" href="https://s3.amazonaws.com/cstest/mb/2017/09/IMG_0588.PNG.1024x768_q85.jpg">
</a>
</figure>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="/media/js/jquery-3.6.0.min.1673011910.js"></script>
<script src="/media/js/bootstrap.min.1673011910.js"></script>
<script src="/media/js/js.cookie.min.1673011910.js" type="text/javascript"></script>
<script crossorigin="anonymous" integrity="sha384-1+NVxJuzrJqJNxlOk23abXGMOTFCVL2ijvbPWADLNAye3nGSVKDqxT6vQqZVWRMd" src="https://browser.sentry-cdn.com/7.38.0/bundle.tracing.min.js"></script>
<script>
    const WEBPACK_PATH =
      "https://www.swimcloud.com/media/webpack/";

    Sentry.init({
      dsn: "https://d5e74d4028ae4a06a155bdeee21e45cc@o375140.ingest.sentry.io/5199088",
      release: "133c3c20f3b9d6835172e7731178bd371007bc7d",
      environment: "production",
      beforeSend(event) {
        if (event.exception)
          try {
            const isWebpack = event.exception.values[0].stacktrace.frames.some(
              (frame) => frame.filename.includes(WEBPACK_PATH)
            );
            return isWebpack ? event : null;
          } catch (error) {
            return null;
          }
        return event;
      },
      integrations: [new Sentry.BrowserTracing()],
      tracesSampleRate: 0.002,
    });

    Sentry.configureScope((scope) => {
      const user = {
        id: Number("") || undefined,
        email: "" || undefined,
        username: "" || undefined
      };
      if (user.id) scope.setUser(user);
    });
  </script>
<script>
  jQuery(function($) {
    $(document).ready(function() {
      var targetElement = $('.js-bs-tooltip');
      if (targetElement.length) {
        targetElement.tooltip({
          placement: 'auto bottom',
          trigger: 'hover'
        });
      }
    });
  });
</script>
<script src="/media/js/swimcloud/drawer.1673011910.js"></script>
<script type="text/javascript">
      //set csrf cookie for jquery ajax post calls
      window.onload = function (e) {
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        var csrftoken = getCookie('csrftoken');
        //set up cookie
        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
      };
    </script>
<script type="text/javascript">
      // resolving: https://github.com/select2/select2/issues/3354
      $(document).ready(function() {
        $(':input').on('select2:unselect', function(e) {
          var $el = $(this);

          if ($el.data('select2').selection.$search) {
            setTimeout(function () {
              // console.log($el.data('select2').selection.prototype);
              $el.data('select2').selection.$search.val("");
            }, 0);
          };
        });
      });
    </script>
<script src="/media/js/expandable.1673011910.js"></script>
<script src="/media/js/cs_utils.1673011910.js" type="text/javascript"></script>
<script crossorigin="anonymous" integrity="sha256-Uv9BNBucvCPipKQ2NS9wYpJmi8DTOEfTA/nH2aoJALw=" src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0/dist/Chart.min.js"></script>
<script crossorigin="anonymous" integrity="sha256-Xb6SSzhH3wEPC4Vy3W70Lqh9Y3Du/3KxPqI2JHQSpTw=" src="https://cdn.jsdelivr.net/npm/d3@5.16.0/dist/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"> </script>
<script type="text/javascript">

    function getCookie(name) {
      if (!document.cookie) {
        return null;
      }

      const xsrfCookies = document.cookie.split(';')
        .map(c => c.trim())
        .filter(c => c.startsWith(name + '='));

      if (xsrfCookies.length === 0) {
        return null;
      }
      return decodeURIComponent(xsrfCookies[0].split('=')[1]);
    }

    const csrfToken = getCookie('csrftoken');

    function makeAjaxRequest(url, container, drawChart){
      xhttp = new XMLHttpRequest();
      xhttp.open("GET", url);
      xhttp.setRequestHeader("X-CSRFToken", csrfToken);
      xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
      xhttp.setRequestHeader("Content-Type", "application/json");
      xhttp.setRequestHeader("HTTP_X_REQUESTED_WITH", "XMLHttpRequest");
      container.innerHTML = '<div class="u-relative u-height-100"><div class="c-spinner"><div class="c-spinner__item"></div></div></div>';
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          let res = this.responseText;
          timesCache[url] = res;
          container.innerHTML = res;
          if (xhttp.status === 200 && drawChart && container === document.getElementById("js-swimmer-profile-times-container")){
            initProgressChart(getMeetEventId());
          }
        }
      };
      xhttp.send()
    }

    const timesCache = {}
    const swimmerLatestTimes = document.getElementById("js-swimmer-profile-latest-times");
    const latestTimesNode = document.getElementById("js-swimmer-profile-latest-times-container");

    if(swimmerLatestTimes){
        swimmerLatestTimes.addEventListener('click', function(e) {
          var clickedMeet = (e.target ? e.target : e.srcElement);
          let url = clickedMeet.href;
          if (url && url.includes("/swimmer/")){
            e.preventDefault();
            if (timesCache[url]) {
              latestTimesNode.innerHTML = timesCache[url];
            }
            else {
              makeAjaxRequest(url, latestTimesNode, false)
            }
          }
      })
    }

    const swimmerTimes = document.getElementById("js-swimmer-profile-times");
    const timesNode = document.getElementById("js-swimmer-profile-times-container");

    if(swimmerTimes){
      swimmerTimes.addEventListener('click', function(e) {
        let clickedEvent = (e.target ? e.target : e.srcElement);
        let url = clickedEvent.href;
        let eventTab = clickedEvent.closest(".c-tabs__item");
        if (eventTab) {
          eventTab.classList.add('active');
          for (let sibling of eventTab.parentNode.children) {
              if (sibling !== eventTab) sibling.classList.remove('active');
          }
        }
        if (url && url.includes("/swimmer/")){
          e.preventDefault();
          if (timesCache[url]) {
            timesNode.innerHTML = timesCache[url];
            initProgressChart(getMeetEventId());
          }
          else {
            makeAjaxRequest(url, timesNode, true);
          }
        }
      })
    }

    
    const cache_DATA = {};
    const margin = {top: 20, right: 30, bottom: 40, left: 40}

    
    if (d3.select(".js-swimmer-profile-overall-progress").node() != null){
      draw("perf")
    }

    function initProgressChart(meet_event){
      if (d3.select(".js-progress-chart-container").node() != null){
        draw(meet_event);
      }
    }



    function draw(meet_event){
      let cached_data = cache_DATA[meet_event]
      let is_seasonPerformance = isSeasonPerformance(meet_event)
      if(cached_data){
        if(is_seasonPerformance){
          return draw_season_performance(cached_data);
        }else{
          return draw_event_record(cached_data);
        };
      }else{
        let url = getUrl(meet_event, is_seasonPerformance);
        d3.json(url).then(data => {
          if(is_seasonPerformance){
            draw_season_performance(data);
          }else{
            draw_event_record(data);
          };
          cache_DATA[meet_event] = data
        });
      };
    };

    function getMeetEvent(){
      return d3.select(".js-event-id-selector").node().value;
    }

    function getMeetEventId(){
      const eventIdTarget = document.querySelector('.js-event-id');
      if(eventIdTarget){
        return eventIdTarget.dataset.eventId
      }
    }


    function isSeasonPerformance(meet_event){
      if(meet_event == "perf"){
        return true
      }else{
        return false
      }
    }
    // construct the url for ajax request
    function getUrl(meet_event, is_seasonPerformance){
      let swimmer_id = null;
      if(is_seasonPerformance){
        swimmer_id = d3.select(".js-swimmer-profile-overall-progress").attr("data-swimmer-id");
        return  "/api/swimmers/" + swimmer_id + "/avg_perf/"
      }else{
        swimmer_id = d3.select(".js-progress-chart-container").attr("data-swimmer-id");
        return "/api/swimmers/" + swimmer_id + "/event_records/?event=" + meet_event
      }
    }

    // clear svg to redraw it
    function clear_svg_tip(){
      if(!d3.select("#progress_svg").empty()){
          d3.selectAll(".tip").remove();
        }
    }

    function style_grid(){
      d3.selectAll(".domain").remove();
      d3.selectAll(".x.axis .tick line").style("color", "white");
      d3.selectAll(".y.axis .tick line").style("color", "grey").style("opacity", "0.15");
    }

    // draw season performance chart
    function draw_season_performance(data){

      let progressContainer, widht, height, xScale, xAxis, yScale, yAxis, path, svg;

      progressContainer = d3.select(".js-swimmer-profile-overall-progress").node().getBoundingClientRect()
      width = progressContainer.width - margin.left - margin.right ; // Use the window's borderWidth
      height = width / 2;

      svg = d3.select(".js-swimmer-profile-overall-progress").append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
          .attr("id", "progress_svg")
          .attr("class", "chart")
        .append("g")
          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

      xScale = d3.scaleTime()
              .range([0,width]);

      yScale = d3.scaleLinear();

      xAxis = svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")

      yAxis = svg.append("g")
            .attr("class", "y axis")

      path = svg.append("path")
            .attr("class", "line")

      //clear legend
      d3.selectAll(".legend").remove()

      const parseTime = d3.timeParse("%Y-%Y")
      data.forEach(d => {
        d.season_year = parseTime(d.season_label)
      });

      xScale.domain(d3.extent(data, function(d){ return d.season_year; })).range([5, width]);
      yScale.domain(d3.extent(data, function(d){ return d.score; })).range([height, 0]).nice();

      let line = d3.line()
        .x(function(d){ return xScale(d.season_year); })
        .y(function(d){ return yScale(d.score); })
        .curve(d3.curveMonotoneX)

      xAxis
        .call(d3.axisBottom(xScale)
            .tickArguments([d3.timeYear.every(1)])
            .tickSizeInner(-height)
            .tickPadding(10)
            );

      yAxis
        .call(d3.axisLeft(yScale)
            .tickSizeInner(-width)
            .tickArguments([5])
            );

      path.datum(data).attr("d", line);

      //making tick lines opacity - 0.5 and removing domain
      style_grid()

      let tip = d3.tip().attr('class', 'tip')
          .direction(function(d){
            let position = "";
            //get dot dimensions -> x == svg.width " || y == svg.height
            dimensions = d.parent.getBBox()

            // get vertical sign -> y coordinates
            if(dimensions.y <= height/2){
              position = position.concat("s")
            }else {
              position = position.concat("n")
            }

            // get horizontal sign -> x coordinates
            if (dimensions.x <= width/2){
              position = position.concat("e")
            }else {
              position = position.concat("w")
            }
            return position;
          })
          .offset([0, -2])
          .html(function(d){
              let content = "<div style='margin-left: 2.5px; background-color: #212121; opacity: 0.9; border-radius: 4px; padding: 10px 15px; font-size: 14px;'><strong class='u-color-white'> Season " + d.season_label + "</strong>";

              d.fastest_times.forEach(function(time){
                content += "</br><span class='u-color-white'>" + time.event + " : " + time.time + "</span>";
              });

              content += "</div>";

              return content;
          })
      svg.call(tip);

      svg.selectAll("#sb_text").remove()

      svg.selectAll(".dot")
        .data(data)
        .exit()
        .remove()

      let dots = svg.selectAll(".dot").data(data)
      dots
        .enter()
        .append("circle")
        .merge(dots)
        .attr("class", "dot")
        .attr("cx", function(d){ return xScale(d.season_year)})
        .attr("cy", function(d){ return yScale(d.score) })
        .attr("r", 5)
        .on('mouseover',function(d){
          d.parent = this;
          tip.show(d, this);
          d3.select(this).attr("r", 10)
        })
        .on('mouseout', function(d){
          tip.hide(d)
          d3.select(this).attr("r", 5)
        });
    }




    // draw meet event chart
    function draw_event_record(data){
      let progressContainer, widht, height, xScale, xAxis, yScale, yAxis, path, svg;

      progressContainer = d3.select(".js-progress-chart-container").node().getBoundingClientRect()
      width = progressContainer.width - margin.left - margin.right ; // Use the window's borderWidth
      height = 350;

      svg = d3.select(".js-progress-chart-container").append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
          .attr("id", "progress_svg")
          .attr("class", "chart")
        .append("g")
          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

      xScale = d3.scaleTime()
              .range([0,width]);

      yScale = d3.scaleLinear();

      xAxis = svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")

      yAxis = svg.append("g")
            .attr("class", "y axis")


      path = svg.append("path")
            .attr("class", "line")

      //clear legend
      d3.selectAll(".legend").remove()

      if (data.length === 0){

        function getRandomInt(max) {
          return Math.floor(Math.random() * max);
        }

        const today = new Date();
        let fakeData = [];
        for (let i = 0; i < 10; i++) {
          let fakeDate = today.getFullYear()+"/"+(today.getMonth()+1+i)+"/"+today.getDate();
          fakeData.push(Object.create({
            "meet": {
                "id": null,
                "name": ""
            },
            "dateofswim": today.getFullYear()+"-"+(today.getMonth()+1+i)+"-"+today.getDate(),
            "swim_date": new Date(fakeDate),
            "eventtime": getRandomInt(60).toString(),
          }));
        }
        xScale.domain(d3.extent(fakeData, function(d){ return d.swim_date; }));
        yScale.domain(d3.extent(fakeData, function(d){ return +d.eventtime; })).range([0, height]).nice();

        let line = d3.line()
          .x(function(d){ return xScale(d.swim_date); })
          .y(function(d){ return yScale(d.eventtime); })
          .curve(d3.curveMonotoneX);

        xAxis
          .call(d3.axisBottom(xScale)
                .tickFormat(customTickFormat(2))
                .tickArguments([customTicks(2)])
                .tickSizeInner(-height)
                .tickPadding(10)
                );

        yAxis
          .call(d3.axisLeft(yScale)
                .tickFormat(d => decimalToSwim(d))
                .tickSizeInner(-width)
                .tickPadding(5)
                .tickArguments([6])
              );

        path.datum(fakeData).attr("d", line).style("opacity", 0.1)

        //making tick lines opacity - 0.5 and removing domain
        style_grid();

        svg.style("fill-opacity", 0.1).
        append("text").
          html("Not enough swim data")
          .attr('x', width / 2)
          .attr('y', height / 2)
          .style("font-size", "16px")
          .style("font-weight", 400)
          .style("fill-opacity", 1)
          .style("text-anchor", "middle");
        return;
      }

      let grouped_data = _.groupBy(data, "season_id")
      let pairs = _.toPairs(grouped_data).map(([key,value]) => {
        let best_time = _.minBy(value, function(d){
          return +d.eventtime;
        })
        return [key, best_time];
      })
      let dataMap = _.fromPairs(pairs)
      //pairs = {season : [events]} - events per season
      //use pairs.length to calculate approx years
      let years = pairs.length;
      let personal_best = _.minBy(data, function(d){
        return +d.eventtime
      })
      if (personal_best)
        personal_best["is_personalBest"] = true
      const parseTime = d3.timeParse("%Y-%m-%d");
      data.forEach(d => {
        d["tip_href"] = "//www.swimcloud.com/results/" + d.meet.id;
        d.swim_date = parseTime(d.dateofswim);
        if( _.includes(dataMap, d)){
          d["is_seasonBest"] = true
        }
      })

      function customTicks(years){
        if(years <= 2){
          return d3.timeMonth.every(3)
        }else{
          return d3.timeYear.every(1)
        }
      }

      function customTickFormat(years){
        if(years <= 2){
          return d3.timeFormat("%b %Y")
        }else{
          return d3.timeFormat("%Y")
        }
      }

      let legend = svg.append("g")
        .attr("class", "legend")
        .attr("x", 0)
        .attr("y", height + margin.bottom)
        .attr("height", 100)
        .attr("width", 100);

      legend.append("text")
        .attr("x", 0)
        .attr("y", height + margin.bottom)
        .text("SB: Season best")
        .attr("font-size", 13)
        .style("fill", "#9855d4");

      legend.append("text")
        .attr("x",120)
        .attr("y", height + margin.bottom)
        .text("PB: Personal best")
        .attr("font-size", 13)
        .style("fill", "#1565c0");


      xScale.domain(d3.extent(data, function(d){ return d.swim_date; }))
      yScale.domain(d3.extent(data, function(d){ return +d.eventtime; })).range([0, height]).nice()


      let line = d3.line()
        .x(function(d){ return xScale(d.swim_date); })
        .y(function(d){ return yScale(d.eventtime); })
        .curve(d3.curveMonotoneX)

      xAxis
        .call(d3.axisBottom(xScale)
              .tickFormat(customTickFormat(years))
              .tickArguments([customTicks(years)])
              .tickSizeInner(-height)
              .tickPadding(10)
              );

      yAxis
        .call(d3.axisLeft(yScale)
              .tickFormat(d => decimalToSwim(d))
              .tickSizeInner(-width)
              .tickPadding(5)
              .tickArguments([6])
            );

      path.datum(data).attr("d", line)

      //making tick lines opacity - 0.5 and removing domain
      style_grid()

      //build tip
      let tip = d3.tip().attr('class', 'tip')
        .direction(function(d){
          let position = "";
          //get dot dimensions -> x == svg.width " || y == svg.height
          dimensions = d.parent.getBBox()

          // get vertical sign -> y coordinates
          if(dimensions.y <= height/3){
            position = position.concat("s")
          }else {
            position = position.concat("n")
          }

          // get horizontal sign -> x coordinates
          if (dimensions.x <= width/2){
            position = position.concat("e")
          }else {
            position = position.concat("w")
          }
          return position;
        })
        .offset([0, -2])
        .html(d => {
          let content = ""
          if(d.dateofswim){
            const options = { year: 'numeric', month: 'long', day: 'numeric' };
            const dateOfSwim  = new Date(d.dateofswim).toLocaleDateString("en-US", options);
            content = "<div style='margin-left: 2.5px; background-color: #212121; border-radius: 4px; padding: 10px 15px; font-size: 14px;'><strong class='u-color-white'>" + decimalToSwim(d.eventtime) + "</strong> &nbsp; <a style='color: #82B1FF;' target='_blank' href="+ d.tip_href + ">" + d.meet.name + "</a>&nbsp;<strong class='u-color-white'>" + dateOfSwim + "</strong></div>";
          }else{
            content = "<div style='margin-left: 2.5px; background-color: #212121; border-radius: 4px; padding: 10px 15px; font-size: 14px;'><strong class='u-color-white'>" + decimalToSwim(d.eventtime) + "</strong> &nbsp; <a style='color: #82B1FF;' target='_blank' href="+ d.tip_href + ">" + d.meet.name + "</a></div>";
          }
          return content;
        })
      svg.call(tip);


      svg.selectAll(".dot")
        .data(data)
        .exit()
        .remove()

      let dots = svg.selectAll(".dot").data(data)
      dots
        .enter()
        .append("circle")
        .merge(dots)
        .attr("cx", function(d){ return xScale(d.swim_date) })
        .attr("cy", function(d){ return yScale(d.eventtime) })
        .attr("r", 5)
        .attr("class", "dot")
        .on('mouseover', function(d){
          d3.selectAll(".dot").attr("r", 5)
          d.parent = this
          let currentDot = d3.select(this)
          // use this to cut any other ongoing transitions associated with the d3 tip.
          d3.select(".tip").transition().on("start", function(){
              currentDot.attr("r", 8)
          })
          tip.show(d, this);
        })
        .on('mouseout', function(d){
          // using transition delay to give the user some time to reach the tooltip.
          d3.select(".tip").transition().delay(80)
            .on("end", function(){
              d3.selectAll(".dot").attr("r", 5)
              tip.hide(d)
          })
        })
        .on("wheel",function(d){
          d3.selectAll(".dot").attr("r", 5)
          tip.hide(d)
        });

      svg.selectAll("#sb_text").remove()

      //adding label for seasonBest/personalBest
      if(!svg.empty()){
        svg.append("g").selectAll("text").data(data)
          .enter()
          .append("text")
          .attr("x", function(d) { return xScale(d.swim_date) - 9})
          .attr("y", function(d) { return yScale(d.eventtime) - 7 })
          .attr("id", "sb_text")
          .style("fill", function(d){
            if(d.is_seasonBest){
              return d.is_personalBest ? "#1565c0" : "#9855d4"
            }
          })
          .text(function(d){
            if(d.is_seasonBest){
              return d.is_personalBest ? "PB" : "SB"
            }
          });
      }


      //If mouse is over the tooltip -> keep tooltip visible.
      d3.select(".tip")
        .on('mouseover', function(d){
          d3.select(this).transition().style("opacity", "1")
        })
        .on('mouseout', function(d){
          d3.select(this).transition().on("end", function(){
            d3.selectAll(".dot").attr("r", 5)
            tip.hide(d)
          })
        })
        .on("wheel", function(d){
            d3.selectAll(".dot").attr("r", 5)
            tip.hide(d)
          })
      };

    
  </script>
<script src="/media/js/imagesloaded.min.1673011910.js"></script>
<script>
  var imgLoad = imagesLoaded('.js-gallery');

  imgLoad.on("progress", function(instance, image) {
    var img = image.img
    var parent = img.parentNode;
    var span = img.previousElementSibling;
    // Calculate the value of the image width when its height is 160
    var imgWidth = (img.width * 160) / img.height;
    var spanPadding = (img.height / img.width) * 100 + '%';

    parent.style.width = imgWidth + 'px';
    parent.style.flexGrow = imgWidth;
    span.style.paddingBottom = spanPadding;
    parent.classList.remove('u-is-hidden');
  });
</script>
<script src="/media/js/jquery.mag-popup.min.1673011910.js" type="text/javascript"></script>
<script type="text/javascript">
  $('.js-gallery').each(function() {
    var $container = $(this);
    var $imageLinks = $container.find('.js-gallery-link');

    var items = [];
    $imageLinks.each(function() {
      var $item = $(this);
      var type = 'image';
      if ($item.hasClass('js-gallery-video')) {
        type = 'iframe';
      }
      var magItem = {
        src: $item.attr('href'),
        type: type
      };
      magItem.title = $item.data('title');
      items.push(magItem);
    });

    $imageLinks.magnificPopup({
      items: items,
      gallery: {
          enabled: true,
          arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir% far fa-3x fa-chevron-%dir%"></button>',
      },
      type: 'image',
      callbacks: {
        beforeOpen: function() {
          var index = $imageLinks.index(this.st.el);
          if (-1 !== index) {
            this.goTo(index);
          }
        }
      }
    });
  });
</script>
<script>
  $(document).ready(function() {
    $('.js-drawer-open, .js-drawer-backdrop, .js-drawer-close').on('click touchstart', function (e) {
      $('.js-html').toggleClass('u-overflow-hidden');
      $('.js-drawer, .js-drawer-backdrop').toggleClass('is-visible');
      e.preventDefault();
    });
  });
</script>
<script type="text/javascript">
          /*
           * Hacky fix for a bug in select2 with jQuery 3.6.0's new nested-focus "protection"
           * see: https://github.com/select2/select2/issues/5993
           * see: https://github.com/jquery/jquery/issues/4382
           *
           * TODO: Recheck with the select2 GH issue and remove once this is fixed on their side
           */
          $(document).on('select2:open', () => {
            setTimeout(() => document.querySelector('.select2-search__field').focus(), 100);
          });
      </script>
<script type="text/javascript">
  var csrf_token = "zLeH3RufMGE696G55H3ORPTFmvzfRa7DUjS7dnMjxtKsLGehWr4arcd7tOtkPUn3";
  var tz_set_endpoint = '/tz_detect/';
  var csrf_header_name = 'x-csrftoken';
  (function() {
    var tz_script = document.createElement('script');
    tz_script.src = '/media/static/tz_detect/js/tzdetect.min.cbab13600a82.js';
    tz_script.setAttribute('async', 'true');
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(tz_script, s);
  })();
</script>
</body>
</html>
