It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: http://www.oreillynet.com/xml/blog/atom.xml

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.  
  5.  <meta charset="utf-8">
  6.  
  7.   <title>O'Reilly Media - Technology and Business Training</title>
  8. <meta name="description" content="Gain technology and business knowledge and hone your skills with learning resources created and curated by O'Reilly's experts: live online training, video, books, our platform has content from 200+ of the world's best publishers." />
  9. <meta name="date" content="2024-04-24" />
  10. <meta name="search_date" content="2021-06-24" />
  11. <meta name="search-title" content="O'Reilly Media - Technology and Business Training" />
  12. <meta name="pagename" content="O'Reilly Media - Technology and Business Training" />
  13. <meta name="site" content="O'Reilly" />
  14. <meta name="twitter:title" content="O'Reilly Media - Technology and Business Training" />
  15. <meta name="twitter:description" content="Gain technology and business knowledge and hone your skills with learning resources created and curated by O'Reilly's experts: live online training, video, books, our platform has content from 200+ of the world's best publishers." />
  16. <meta name="twitter:site" content="@OReillyMedia" />
  17. <meta property="og:type" content="website" />
  18. <meta property="og:title" content="O'Reilly Media - Technology and Business Training" />
  19. <meta name="twitter:card" content="summary" />
  20. <meta name="twitter:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" />
  21. <meta property="og:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" />
  22.  
  23.  
  24.  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  25.  <meta name="viewport" content="width=device-width, initial-scale=1">
  26.  <meta name="language_name" content="English">
  27.  <meta name="native_language_name" content="English">
  28.  <meta name="format-detection" content="telephone=no">
  29.  
  30.  
  31.  
  32.  
  33.  <link rel="icon" type="image/png" href="//www.oreilly.com/favicon.ico">
  34.  
  35.  
  36.  <!--[if lte IE 9]>
  37.  <script>
  38.    'article aside footer header main nav section time'.replace(/\w+/g,function(n){document.createElement(n)})
  39.  </script>
  40.  <![endif]-->
  41.  
  42.  <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/2018_font_face.css" />
  43.  <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/odot-layout-20240226.css" />
  44.  
  45.  <!--[if IE 9]>
  46.  <style type="text/css">
  47.    #menu-toggle:checked ~ .mobile-nav { display:block; }
  48.    .mobile-nav { display: none; }
  49.  </style>
  50.  <![endif]-->
  51.  
  52.  
  53.  
  54.  
  55. <!-- Initiate dataLayer for GA -->
  56. <script>
  57. loggedInObject = new Object();
  58. var dataLayer = window.dataLayer || [];
  59.  
  60. //Check for O'Reilly Unified logged-in status
  61. if (document.cookie.split(';').filter(function(item) {
  62.  return item.indexOf('orm-jwt=') >= 0
  63. }).length) {
  64.  loggedInObject.unifiedLoggedIn = 'yes';
  65.  loggedInObject.loggedIn = 'yes';
  66.  dataLayer.push(loggedInObject);
  67.  
  68.  //Add 'loggedIn class to html tag
  69.  const htmlTag = document.querySelector('html');
  70.  if (htmlTag !== null) {
  71.    htmlTag.classList.add('loggedIn');
  72.  }
  73. }
  74. </script>
  75.  
  76. <!-- Google Tag Manager -->
  77. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  78. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  79. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  80. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  81. })(window,document,'script','dataLayer','GTM-5P4V6Z');</script>
  82. <!-- End Google Tag Manager -->
  83.  
  84.  
  85.  
  86.  
  87.  
  88. <!-- Start VWO Async SmartCode -->
  89. <link rel="preconnect" href="https://dev.visualwebsiteoptimizer.com" />
  90. <script type='text/javascript' id='vwoCode'>
  91. window._vwo_code || (function() {
  92. var account_id=27087,
  93. version=2.1,
  94. settings_tolerance=2000,
  95. hide_element='body',
  96. hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important',
  97. /* DO NOT EDIT BELOW THIS LINE */
  98. f=false,w=window,d=document,v=d.querySelector('#vwoCode'),cK='_vwo_'+account_id+'_settings',cc={};try{var c=JSON.parse(localStorage.getItem('_vwo_'+account_id+'_config'));cc=c&&typeof c==='object'?c:{}}catch(e){}var stT=cc.stT==='session'?w.sessionStorage:w.localStorage;code={use_existing_jquery:function(){return typeof use_existing_jquery!=='undefined'?use_existing_jquery:undefined},library_tolerance:function(){return typeof library_tolerance!=='undefined'?library_tolerance:undefined},settings_tolerance:function(){return cc.sT||settings_tolerance},hide_element_style:function(){return'{'+(cc.hES||hide_element_style)+'}'},hide_element:function(){if(performance.getEntriesByName('first-contentful-paint')[0]){return''}return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(e){if(!f){f=true;var t=d.getElementById('_vis_opt_path_hides');if(t)t.parentNode.removeChild(t);if(e)(new Image).src='https://dev.visualwebsiteoptimizer.com/ee.gif?a='+account_id+e}},finished:function(){return f},addScript:function(e){var t=d.createElement('script');t.type='text/javascript';if(e.src){t.src=e.src}else{t.text=e.text}d.getElementsByTagName('head')[0].appendChild(t)},load:function(e,t){var i=this.getSettings(),n=d.createElement('script'),r=this;t=t||{};if(i){n.textContent=i;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);r.load(e)}}else{var o=new XMLHttpRequest;o.open('GET',e,true);o.withCredentials=!t.dSC;o.responseType=t.responseType||'text';o.onload=function(){if(t.onloadCb){return t.onloadCb(o,e)}if(o.status===200){_vwo_code.addScript({text:o.responseText})}else{_vwo_code.finish('&e=loading_failure:'+e)}};o.onerror=function(){if(t.onerrorCb){return t.onerrorCb(e)}_vwo_code.finish('&e=loading_failure:'+e)};o.send()}},getSettings:function(){try{var e=stT.getItem(cK);if(!e){return}e=JSON.parse(e);if(Date.now()>e.e){stT.removeItem(cK);return}return e.s}catch(e){return}},init:function(){if(d.URL.indexOf('__vwo_disable__')>-1)return;var e=this.settings_tolerance();w._vwo_settings_timer=setTimeout(function(){_vwo_code.finish();stT.removeItem(cK)},e);var t;if(this.hide_element()!=='body'){t=d.createElement('style');var i=this.hide_element(),n=i?i+this.hide_element_style():'',r=d.getElementsByTagName('head')[0];t.setAttribute('id','_vis_opt_path_hides');v&&t.setAttribute('nonce',v.nonce);t.setAttribute('type','text/css');if(t.styleSheet)t.styleSheet.cssText=n;else t.appendChild(d.createTextNode(n));r.appendChild(t)}else{t=d.getElementsByTagName('head')[0];var n=d.createElement('div');n.style.cssText='z-index: 2147483647 !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 100% !important;height: 100% !important;background: white !important;';n.setAttribute('id','_vis_opt_path_hides');n.classList.add('_vis_hide_layer');t.parentNode.insertBefore(n,t.nextSibling)}var o='https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version;if(w.location.search.indexOf('_vwo_xhr')!==-1){this.addScript({src:o})}else{this.load(o+'&x=true')}}};w._vwo_code=code;code.init();})();
  99. </script>
  100. <!-- End VWO Async SmartCode -->
  101.  
  102. </head>
  103. <body class="homepage">
  104.  
  105.  
  106. <!-- Google Tag Manager (noscript) -->
  107. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P4V6Z" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  108. <!-- End Google Tag Manager (noscript) -->
  109.  
  110.  <div class="skipToMain" id="skipToMain"><a href="#maincontent"><span class="skipToMain-text">Skip to main content</span></a></div>
  111.  
  112.  
  113.  
  114.  <header role="banner">
  115.    <div class="content">
  116.      <nav role="navigation" aria-label="site sections">
  117.        <a href="https://www.oreilly.com" class="logo" title="home page" aria-current="page"><img src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;" alt="O'Reilly home"></a>
  118.  
  119.        <button id="mobileNavButton" class="mobileNavButton mobileNavButton--collapse mobileNavButton--3dx" type="button" aria-expanded="false" aria-controls="menuList">
  120.          <span class="mobileNavButton-box">
  121.            <span class="mobileNavButton-inner"></span>
  122.          </span>
  123.        </button>
  124.  
  125.    
  126.        <ul id="menuList" class="menuList mobileHidden  ">
  127.          <li class="menuList-itemsP1">
  128.            <ul>
  129.              <li class="menuList-item menuList-signIn"><a id="nav-signIn" href="https://www.oreilly.com/member/login/">Sign In</a></li>
  130.              <li class="menuList-item menuList-tryNow"><a id="nav-tryNow" class="menuList-cta" href="https://www.oreilly.com/online-learning/try-now.html">Try Now</a></li>
  131.              <li class="menuList-item menuList-platform"><a id="nav-platform" class="menuList-cta" href="https://www.oreilly.com/member/login/">O&rsquo;Reilly Platform</a></li>
  132.            </ul>
  133.          </li>
  134.          <li class="menuList-itemsP2">
  135.            <ul>
  136.              <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/teams.html">Teams</a>
  137.                <ul class="menuList-subList">
  138.                  <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/teams.html">For business</a></li>
  139.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/government.html">For government</a></li>
  140.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/academic.html">For higher ed</a></li>
  141.                </ul>
  142.              </li>
  143.              <li class="menuList-item"><a href="https://www.oreilly.com/online-learning/individuals.html">Individuals</a></li>
  144.              <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/features.html">Features</a>
  145.                <ul class="menuList-subList">
  146.                  <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/features.html">All features</a></li>
  147.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/courses.html">Courses</a></li>
  148.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-certification.html">Certifications</a></li>
  149.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/intro-interactive-learning.html">Interactive learning</a></li>
  150.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/live-events.html">Live events</a></li>
  151.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-answers.html">Answers</a></li>
  152.                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/insights-dashboard.html">Insights reporting</a></li>
  153.                </ul>
  154.              </li>
  155.              <li class="menuList-item"><a href="https://www.oreilly.com/radar/">Blog</a></li>
  156.              <li class="menuList-item" id="nav-forMarketers"><a href="https://www.oreilly.com/content-marketing-solutions.html">Content sponsorship</a></li>
  157.              <li class="menuList-item menuList-item-search" id="nav-search">
  158.                <form id="js-searchForm" class="searchForm" action="https://www.oreilly.com/search/"><input id="search" type="search" name="query" placeholder="Explore our content" autocomplete="off" required=""><button id="js-searchCloseButton" class="navSearchCloseButton">Close</button></form>
  159.                <button id="js-searchButton" class="navSearchButton">Search</button>
  160.              </li>
  161.            </ul>
  162.          </li>
  163.        </ul>
  164.      </nav>
  165.    </div>
  166.  </header>
  167.  
  168.  <main role="main" id="maincontent">
  169.  
  170.  
  171.  
  172. <style>
  173. .menuList-item.menuList-item-search.hidden {
  174.  display: none;
  175. }
  176. body.homepage .footer-subfooter .transparencyStatement {
  177.  display: inline !important;
  178. }
  179.  
  180.  
  181. /* .plot3 */
  182. .plot3 {}
  183. .plot3 .sectionText {
  184.  margin: 0 auto;
  185.  max-width: 1050px;
  186.  text-align: center;
  187. }
  188. .plot3 h2 {
  189.  font-size: 32px;
  190.  font-size: 2rem;
  191.  line-height: 1.2em;
  192.  font-family: 'gilroy', Arial, sans-serif;
  193.  margin-bottom: 20px;
  194. }
  195. .plot3 p {
  196.  font-size: 16px;
  197.  font-size: 1rem;
  198.  line-height: 1.5em;
  199.  font-weight: 400;
  200.  margin-bottom: 20px;
  201. }
  202. .plot3 .textCTA-light,
  203. .plot3 .textCTA-dark,
  204. .plot3 .textCTA-blue {
  205.  position: relative;
  206.  display: block;
  207.  width: max-content;
  208.  padding-right: 20px;
  209.  font-size: 16px;
  210.  font-size: 1rem;
  211.  line-height: 1.3em;
  212.  font-weight: 600;
  213.  color: #222;
  214.  text-decoration: none;
  215. }
  216. .plot3 .textCTA-blue {
  217.  color: rgb(0,113,235);
  218. }
  219. .plot3 .textCTA-light {
  220.  color: #fff;
  221. }
  222. .plot3 .textCTA-light:hover,
  223. .plot3 .textCTA-light:focus,
  224. .plot3 .textCTA-dark:hover,
  225. .plot3 .textCTA-dark:focus,
  226. .plot3 .textCTA-blue:hover,
  227. .plot3 .textCTA-blue:focus {
  228.  text-decoration: underline;
  229. }
  230. .plot3 .textCTA-light .inner,
  231. .plot3 .textCTA-dark .inner,
  232. .plot3 .textCTA-blue .inner {
  233.  position: relative;
  234. }
  235. .plot3 .textCTA-light .inner:after,
  236. .plot3 .textCTA-dark .inner:after,
  237. .plot3 .textCTA-blue .inner:after {
  238.  content: "";
  239.  position: absolute;
  240.  bottom: 0;
  241.  right: -16px;
  242.  width: 8px;
  243.  height: 100%;
  244.  background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_black.svg) right center no-repeat;
  245.  background-size: contain;
  246.  opacity: 1;
  247. }
  248. .plot3 .textCTA-blue .inner:after {
  249.  background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_blue.svg) right center no-repeat;
  250. }
  251. .plot3 .textCTA-light .inner:after {
  252.  background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_white.svg) right center no-repeat;
  253. }
  254. .plot3 .btnCTA-blue {
  255.  display: block;
  256.  width: max-content;
  257.  margin-bottom: 20px;
  258.  padding: 10px 20px 8px;
  259.  border-radius: 2px;
  260.  background-color: rgb(0,113,235);
  261.  color: #fff;
  262.  font-size: 16px;
  263.  font-size: 1rem;
  264.  line-height: 1.2em;
  265.  font-weight: 600;
  266.  text-decoration: none;
  267. }
  268. .plot3 .btnCTA-blue:hover,
  269. .plot3 .btnCTA-blue:focus {
  270.  text-decoration: none;
  271.  box-shadow: 0 1px 4px rgb(0,0,0,.3);
  272. }
  273. .plot3 .btnCTA-blue:after {
  274.  content: "";
  275.  display: inline-block;
  276.  margin: -8px -2px -6px 6px;
  277.  width: 9px;
  278.  height: 22px;
  279.  vertical-align: middle;
  280.  background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_white.svg) center center no-repeat;
  281.  background-size: contain;
  282. }
  283. @media (min-width: 40em) { /* 640px */
  284.  .plot3 p {
  285.    font-size: 20px;
  286.    font-size: 1.25rem;
  287.    line-height: 1.5em;
  288.  }
  289.  .plot3 .textCTA-light,
  290.  .plot3 .textCTA-dark,
  291.  .plot3 .textCTA-blue {
  292.    font-size: 20px;
  293.    font-size: 1.25rem;
  294.    line-height: 1.3em;
  295.  }
  296.  .plot3 .textCTA-light .inner:after,
  297.  .plot3 .textCTA-dark .inner:after,
  298.  .plot3 .textCTA-blue .inner:after {
  299.    right: -20px;
  300.    width: 10px;
  301.  }
  302. }
  303. @media (min-width: 58em) { /* 928px */
  304.  .plot3 p {
  305.    font-size: 24px;
  306.    font-size: 1.5rem;
  307.    line-height: 1.4em;
  308.    font-family: 'gilroy', Arial, sans-serif;
  309.    font-weight: 300;
  310.  }
  311.  .plot3 .textCTA-light,
  312.  .plot3 .textCTA-dark,
  313.  .plot3 .textCTA-blue {
  314.    font-size: 24px;
  315.    font-size: 1.5rem;
  316.    line-height: 1.4em;
  317.    font-family: 'gilroy', Arial, sans-serif;
  318.  }
  319.  .plot3 .btnCTA-blue {
  320.    font-size: 20px;
  321.    font-size: 1.25rem;
  322.    line-height: 1.2em;
  323.    font-family: 'gilroy', Arial, sans-serif;
  324.  }
  325.  .plot3 .btnCTA-blue:after {
  326.    width: 13px;
  327.  }
  328. }
  329. @media (min-width: 65em) { /* 1040px */
  330.  .plot3 h2 {
  331.    font-size: 36px;
  332.    font-size: 2.25rem;
  333.    line-height: 1.2em;
  334.  }
  335.  .plot3 p {
  336.    font-size: 28px;
  337.    font-size: 1.75rem;
  338.    line-height: 1.3em;
  339.  }
  340.  .plot3 .textCTA-light,
  341.  .plot3 .textCTA-dark,
  342.  .plot3 .textCTA-blue {
  343.    font-size: 28px;
  344.    font-size: 1.75rem;
  345.    line-height: 1.3em;
  346.  }
  347.  .plot3 .btnCTA-blue {
  348.    font-size: 24px;
  349.    font-size: 1.5rem;
  350.    line-height: 1.2em;
  351.  }
  352. }
  353.  
  354.  
  355. .plot3-hero {
  356.  position: relative;
  357.  overflow: hidden;
  358.  background-color: transparent;
  359. }
  360. .plot3-hero .content {
  361.  position: relative;
  362.  padding: 40px 20px;
  363.  text-align: center;
  364. }
  365. .plot3-hero .content > * {
  366.  position: relative;
  367.  z-index: 2;
  368. }
  369. .plot3-hero .content:after {
  370.  content: "";
  371.  position: absolute;
  372.  z-index: 0;
  373.  right: 0;
  374.  top: 0;
  375.  width: 100%;
  376.  height: 100%;
  377.  background-image: linear-gradient(195deg, rgba(142, 34, 167, 11) 10%, rgba(0, 113, 235, 1) 40%, rgba(0, 113, 235, 0) 75%);
  378. }
  379. .plot3-hero .plot3-hero-odotAnimal {
  380.  margin: 30px auto;
  381.  width: calc(100% - 40px);
  382. }
  383. .plot3-hero .plot3-hero-odotAnimal figure {
  384.  display: block;
  385.  width: 100%;
  386.  padding-bottom: 69.42%;
  387.  background: transparent url(https://cdn.oreillystatic.com/oreilly/images/hero-odot-animal-20221104.png) 0 0 no-repeat;
  388.  background-size: contain;
  389. }
  390. .plot3-hero h1 {
  391.  margin: 0 0 20px;
  392.  max-width: 100%;
  393.  font-size: 36px;
  394.  font-size: 2.25rem;
  395.  line-height: 1.2em;
  396.  font-family: 'gilroy', Arial, sans-serif;
  397.  color: rgb(255,255,255);
  398. }
  399. .plot3-hero h1 .highlight {
  400.  color: rgb(255,255,255);
  401. }
  402. @supports (-webkit-background-clip: text) or (-moz-background-clip: text) {
  403.  .plot3-hero h1 .highlight {
  404.    background: transparent;
  405.    background-size: unset;
  406.    -webkit-background-clip: unset;
  407.    -moz-background-clip: unset;
  408.    -webkit-text-fill-color: unset;
  409.    -moz-text-fill-color: unset;
  410.    box-decoration-break: unset;
  411.    -webkit-box-decoration-break: unset;
  412.  }
  413. }
  414. .plot3-hero p {
  415.  margin: 0 0 40px 0;
  416.  max-width: 100%;
  417. }
  418. .plot3-hero-cta {
  419.  display: flex;
  420.  flex-direction: row;
  421.  flex-wrap: wrap;
  422.  align-items: center;
  423.  justify-content: center;
  424. }
  425. .plot3-hero-cta > .btnCTA-blue {
  426.  margin: 0 32px 20px 0;
  427. }
  428. .plot3-hero-cta > .textCTA-blue:last-child {
  429.  margin: 0 0 20px 0;
  430. }
  431. @media (min-width: 40em) { /* 640px */
  432.  .plot3-hero h1 {
  433.    margin: 0 0 20px;
  434.    font-size: 48px;
  435.    font-size: 3rem;
  436.    line-height: 1.1em;
  437.  }
  438.  .plot3-hero p {
  439.    margin: 0 0 40px;
  440.  }
  441.  .plot3-hero-cta > .textCTA-dark {
  442.    margin-right: 40px;
  443.  }
  444.  .plot3-hero-cta > .textCTA-dark:last-child {
  445.    margin-right: 0;
  446.  }
  447. }
  448. @media (min-width: 50em) { /* 800px */
  449.  .plot3-hero .content {
  450.    padding: 60px 20px 40px;
  451.    text-align: left;
  452.  }
  453.  .plot3-hero .content:after {
  454.    background-image: linear-gradient(225deg, rgba(142, 34, 167, 11) 3%, rgba(0, 113, 235, 1) 22%, rgba(0, 113, 235, 0) 50%);
  455.  }
  456.  .plot3-hero .plot3-hero-odotAnimal {
  457.    position: absolute;
  458.    z-index: 1;
  459.    top: 50px;
  460.    right: 20px;
  461.    margin: 0;
  462.    width: calc(50% + 40px);
  463.  }
  464.  .plot3-hero h1 {
  465.    margin: 0 0 12px;
  466.    max-width: calc(50% - 40px);
  467.    color: rgb(34,34,34);
  468.  }
  469.  .plot3-hero h1 .highlight {
  470.    color: rgb(0,113,235);
  471.    white-space: nowrap;
  472.  }
  473.  @supports (-webkit-background-clip: text) or (-moz-background-clip: text) {
  474.    .plot3-hero h1 .highlight {
  475.      background: rgb(0,113,235) linear-gradient(135deg, rgb(0,113,235) 0%, rgb(142,34,167) 100%);
  476.      background-size: 100%;
  477.      -webkit-background-clip: text;
  478.      -moz-background-clip: text;
  479.      -webkit-text-fill-color: transparent;
  480.      -moz-text-fill-color: transparent;
  481.      box-decoration-break: clone;
  482.      -webkit-box-decoration-break: clone;
  483.    }
  484.  }
  485.  .plot3-hero p {
  486.    max-width: calc(50% - 40px);
  487.    font-size: 1.25rem;
  488.    line-height: 1.5em;
  489.  }
  490.  .plot3-hero-cta {
  491.    max-width: calc(50% - 15px);
  492.    justify-content: flex-start;
  493.  }
  494. }
  495. @media (min-width: 58em) { /* 928px */
  496.  .plot3-hero .content {
  497.    padding: 60px 20px 40px;
  498.  }
  499.  .plot3-hero h1 {
  500.    font-size: 44px;
  501.    font-size: 2.75rem;
  502.    line-height: 1em;
  503.  }
  504. }
  505. @media (min-width: 65em) { /* 1040px */
  506.  .plot3-hero .content {
  507.    padding: 80px 20px 60px;
  508.  }
  509.  .plot3-hero .plot3-hero-odotAnimal {
  510.    top: 40px;
  511.  }
  512.  .plot3-hero h1 {
  513.    margin: 0 0 12px;
  514.    font-size: 54px;
  515.    font-size: 3.375rem;
  516.    line-height: 1em;
  517.  }
  518.  .plot3-hero p {
  519.    margin: 0 0 30px;
  520.  }
  521. }
  522. @media (min-width: 76em) { /* 1216px */
  523.  .plot3-hero .content {
  524.    padding: 100px 20px 80px;
  525.  }
  526.  .plot3-hero .plot3-hero-odotAnimal {
  527.    top: 65px;
  528.  }
  529. }
  530. @media (min-width: 76.5em) { /* 1224px */
  531.  .plot3-hero .content:after {
  532.    right: 20px;
  533.  }
  534.  .plot3-hero .plot3-hero-odotAnimal {
  535.    right: 40px;
  536.    margin: 0;
  537.    width: 50%;
  538.  }
  539. }
  540. @media (min-width: 84em) { /* 1344px */
  541.  .plot3-hero .content {
  542.    padding: 100px 20px 80px;
  543.  }
  544. }
  545.  
  546.  
  547.  
  548. .plot3-experts {
  549.  background-color: rgb(0,0,0,1);
  550.  background-image: linear-gradient(130deg, rgba(255,255,255,0) 45%, rgba(255,255,255,.1) 100%), linear-gradient(170deg, rgba(255,255,255,0) 70%, rgba(255,255,255,.2) 100%);
  551.  background-size: cover;
  552.  /*background: linear-gradient(80deg, rgb(20,212,216) 0%, rgb(0,113,235) 60%, rgb(0,113,235) 80%, rgb(142,34,167) 100%);*/
  553. }
  554. .plot3-experts .content {
  555.  padding: 40px 20px 44px;
  556. }
  557. .plot3-experts h2,
  558. .plot3-experts p {
  559.  color: #fff;
  560. }
  561. .plot3-experts .sectionFigure {
  562.  position: relative;
  563.  width: 100%;
  564.  padding-bottom: 200px;
  565.  margin: 0 auto;
  566. }
  567. .plot3-experts-panels {
  568.  position: absolute;
  569.  top: 0;
  570.  left: 0;
  571.  margin: 0;
  572.  display: flex;
  573.  flex-direction: row;
  574.  height: 100%;
  575.  width: 100%;
  576.  cursor: pointer;
  577. }
  578. .plot3-experts-panels a {
  579.  position: relative;
  580.  display: flex;
  581.  height: 100%;
  582.  width: 20%;
  583.  overflow: hidden;
  584.  margin-right: 1px;
  585.  background-repeat: no-repeat;
  586.  background-position: center top;
  587.  background-size: cover;
  588.  border-radius: 4px;
  589.  filter: drop-shadow(0 0 4px rgba(0,0,0,.1));
  590.  transition: width .5s;
  591.  text-decoration: none;
  592. }
  593. .plot3-experts-panels a:before {
  594.  display: block;
  595.  position: absolute;
  596.  z-index: 2;
  597.  height: 100%;
  598.  width: 100%;
  599.  content: "";
  600.  background-color: #444;
  601.  mix-blend-mode: color;
  602.  transition: opacity .5s;
  603. }
  604. .plot3-experts-panels a:hover:before,
  605. .plot3-experts-panels a:focus:before {
  606.  opacity: 0;
  607. }
  608. .plot3-experts-panels a:last-child {
  609.    margin-right: 0;
  610. }
  611. .plot3-experts-panels a:hover,
  612. .plot3-experts-panels a:focus {
  613.  width: 50%;
  614.  text-decoration: none;
  615.  outline: none;
  616. }
  617. .plot3-experts-panels a .text {
  618.  display: none;
  619. }
  620. .plot3-experts-panels a:hover .text,
  621. .plot3-experts-panels a:focus .text {
  622.  display: block;
  623.  width: 100%;
  624.  padding: 12px;
  625.  margin-top: auto;
  626.  background-color: rgba(0,0,0,.7);
  627.  color: #fff;
  628.  font-weight: 400;
  629.  font-size: .875rem;
  630.  line-height: 1.2em;
  631.  animation-name: experts-panels-showText;
  632.  animation-duration: 1s;
  633. }
  634. .plot3-experts-panels a .name {
  635.  display: block;
  636.  font-weight: bold;
  637. }
  638. @media (min-width: 40em) { /* 640px */
  639.  .plot3-experts .sectionFigure {
  640.    width: 100%;
  641.    max-width: 600px;
  642.    padding-bottom: 200px;
  643.  }
  644. }
  645. @media (min-width: 50em) { /* 800px */
  646.  .plot3-experts .content {
  647.    padding: 50px 20px;
  648.  }
  649.  .plot3-experts-panels a:hover .text,
  650.  .plot3-experts-panels a:focus .text {
  651.    font-family: 'gilroy', Arial, sans-serif;
  652.    font-weight: 300;
  653.    font-size: 1rem;
  654.    line-height: 1.2em;
  655.  }
  656. }
  657. @media (min-width: 65em) { /* 1040px */
  658.  .plot3-experts .content {
  659.    display: flex;
  660.    flex-direction: row;
  661.    justify-content: space-between;
  662.    align-items: center;
  663.  }
  664.  .plot3-experts .sectionText {
  665.    margin: 0;
  666.    width: calc(50% - 40px);
  667.    text-align: left;
  668.  }
  669.  .plot3-experts .sectionText *:last-child {
  670.    margin-bottom: 0;
  671.  }
  672.  .plot3-experts .sectionFigure {
  673.    margin: 0;
  674.    width: calc(50% - 40px);
  675.    padding-bottom: calc((50% - 40px) / 2);
  676.  }
  677. }
  678. @keyframes experts-panels-showText {
  679.  0% {opacity: 0;}
  680.  50% {opacity: 0;}
  681.  100% {opacity: 1}
  682. }
  683.  
  684.  
  685.  
  686. .plot3-live {
  687.  position: relative;
  688. }
  689. .plot3-live:after {
  690.  content: "";
  691.  position: absolute;
  692.  z-index: 0;
  693.  bottom: 0;
  694.  left: 0;
  695.  display: block;
  696.  height: 5.5rem;
  697.  width: 100%;
  698.  background-image: linear-gradient(90deg, rgb(20,212,216) 30%, rgb(0,113,235) 200%);
  699. }
  700. .plot3-live .content {
  701.  position: relative;
  702.  z-index: 1;
  703.  padding: 40px 20px 0;
  704. }
  705. .plot3-live .sectionFigure {
  706.  position: relative;
  707.  margin: 40px 0;
  708.  width: 100%;
  709.  display: flex;
  710.  flex-direction: row;
  711.  align-items: flex-end;
  712.  justify-content: center;
  713. }
  714. .plot3-live .sectionFigure img {
  715.  display: block;
  716.  margin: 0;
  717.  width: 50%;
  718.  border-radius: 50%;
  719.  box-shadow: 0 0 20px rgba(0,0,0,.2);
  720. }
  721. .plot3-live .sectionFigure p {
  722.  display: block;
  723.  margin-bottom: 20px;
  724.  font-size: 16px;
  725.  font-size: 1rem;
  726.  line-height: 1.5em;
  727.  text-align: left;
  728. }
  729. .plot3-live .textCTA-dark {
  730.  margin: 0 auto;
  731.  line-height: 5.5rem;
  732. }
  733. @media (min-width: 50em) { /* 800px */
  734.  .plot3-live:after {
  735.    background-image: linear-gradient(90deg, rgb(20,212,216) 30%, rgb(0,113,235) 70%);
  736.  }
  737.  .plot3-live .content {
  738.    padding: 80px 20px 0 20px;
  739.  }
  740.  .plot3-live .sectionText {
  741.    margin: 0;
  742.    width: calc(50% - 40px);
  743.    text-align: left;
  744.  }
  745.  .plot3-live .sectionText *:last-child {
  746.    margin-bottom: 0;
  747.  }
  748.  .plot3-live .sectionFigure {
  749.    display: block;
  750.    position: absolute;
  751.    right: 20px;
  752.    bottom: -60px;
  753.    margin: 0;
  754.    width: calc(50% - 40px);
  755.    max-width: 100%;
  756.  }
  757.  .plot3-live .sectionFigure img {
  758.    width: 100%;
  759.    margin: 0;
  760.  }
  761.  .plot3-live .sectionFigure p {
  762.    position: absolute;
  763.    bottom: 20px;
  764.    right: 80%;
  765.    margin-bottom: 0;
  766.    font-size: 20px;
  767.    font-size: 1.25rem;
  768.    line-height: 1.3em;
  769.    white-space: nowrap;
  770.  }
  771.  .plot3-live .textCTA-dark {
  772.    margin: 0;
  773.  }
  774. }
  775. @media (min-width: 78em) { /* 1248px */
  776.  .plot3-live .content {
  777.    padding: 120px 20px 0 20px;
  778.  }
  779. }
  780.  
  781.  
  782. .plot3-certification {
  783.  border-bottom: 6px solid;
  784.  border-image-slice: 1;
  785.  border-image-source: linear-gradient(90deg, rgb(20,212,216) 30%, rgb(0,113,235) 70%);
  786.  background-image: linear-gradient(0deg, rgba(20,212,216,.2) 0%, rgba(20,212,216,0) 100%);
  787. }
  788. .plot3-certification .content {
  789.  padding: 40px 20px 44px;
  790. }
  791. .plot3-certification .sectionFigure {
  792.  margin: 0 auto;
  793.  mix-blend-mode: darken;
  794.  width: 80%;
  795.  max-width: 600px;
  796. }
  797. .plot3-certification .sectionFigure img {
  798.  display: block;
  799.  max-width: 100%;
  800. }
  801. .plot3-certification .textCTA-dark {
  802.  margin: 0 auto 40px;
  803. }
  804. @media (min-width: 50em) { /* 800px */
  805.  .plot3-certification .content {
  806.    padding: 140px 20px 80px 20px;
  807.    display: flex;
  808.    flex-direction: row-reverse;
  809.    justify-content: space-between;
  810.    align-items: center;
  811.  }
  812.  .plot3-certification .sectionText {
  813.    margin: 0;
  814.    width: calc(50% - 40px);
  815.    text-align: left;
  816.  }
  817.  .plot3-certification .sectionText *:last-child {
  818.    margin-bottom: 0;
  819.  }
  820.  .plot3-certification .sectionFigure {
  821.    margin: 0;
  822.    width: calc(50% - 40px);
  823.  }
  824.  .plot3-certification .textCTA-dark {
  825.    margin: 0;
  826.  }
  827. }
  828.  
  829.  
  830. .plot3-cta .content {
  831.  padding: 40px 20px 44px;
  832. }
  833. .plot3-cta h2 {
  834.  margin-bottom: 20px;
  835. }
  836. .plot3-cta-btnGroup {
  837.  display: flex;
  838.  flex-direction: row;
  839.  justify-content: center;
  840.  align-items: center;
  841.  margin: 0 auto;
  842. }
  843. .plot3-cta .sectionText h2 {
  844.  margin: 0 0 20px;
  845. }
  846. .plot3-cta-btnGroup .btnCTA-blue {
  847.  margin: 0 32px 0 0;
  848. }
  849. .plot3-cta-btnGroup .textCta-blue {
  850.  margin: 0;
  851. }
  852. @media (min-width: 50em) { /* 800px */
  853.  .plot3-cta .content {
  854.    padding: 80px 20px;
  855.  }
  856.  .plot3-cta .sectionText h2 {
  857.    margin: 0 0 40px;
  858.  }
  859. }
  860.  
  861.  
  862.  
  863. .plot3-sectionGroup {
  864.  background-color: #000;
  865. }
  866. .plot3-sectionGroup > .content {
  867.  padding: 0;
  868. }
  869. @media (min-width: 68em) { /* 1088px */
  870.  .plot3-sectionGroup > .content {
  871.    display: flex;
  872.    flex-direction: row;
  873.    justify-content: space-between;
  874.  }
  875. }
  876.  
  877.  
  878.  
  879. /* .plot3-aiCombo */
  880. .plot3-aiCombo {
  881.  background: rgb(244,244,244);
  882.  background: linear-gradient(90deg, rgba(244,244,244,1) 0%, rgba(255,255,255,1) 50%, rgba(244,244,244,1) 100%);
  883. }
  884. .plot3-aiCombo .content {
  885.  padding: 40px 20px 20px;
  886. }
  887. .plot3-aiCombo h2,
  888. .plot3-aiCombo p {
  889.  position: relative;
  890.  color: #222;
  891. }
  892. .plot3-aiCombo h2 {
  893.  font-size: 1.25rem;
  894.  line-height: 1.5em;
  895. }
  896. .plot3-aiCombo p {
  897.  font-size: 1rem;
  898.  line-height: 1.5em;
  899. }
  900. .plot3-aiCombo a.textCTA-blue {
  901.  margin: auto auto 0;
  902.  font-size: 1rem;
  903.  line-height: 1.5em;
  904. }
  905. .plot3-aiCombo .sectionText {
  906.  position: relative;
  907.  z-index: 5;
  908.  display: block;
  909.  margin: 0 auto 20px;
  910.  padding: 20px;
  911.  width: 80%;
  912.  text-decoration: none;
  913.  border-radius: 8px;
  914. }
  915. .plot3-aiCombo .sectionText:before {
  916.  content: "";
  917.  display: block;
  918.  position: absolute;
  919.  z-index: 0;
  920.  top: 1px;
  921.  left: 1px;
  922.  width: calc(100% - 2px);
  923.  height: calc(100% - 2px);
  924.  background: #fff;
  925.  border-radius: 8px;
  926. }
  927. .plot3-aiCombo .sectionText:after {
  928.  content: "";
  929.  display: block;
  930.  position: absolute;
  931.  z-index: -1;
  932.  top: 0;
  933.  left: 0;
  934.  width: 100%;
  935.  height: 100%;
  936.  background: rgb(0,113,235) linear-gradient(135deg, rgb(0,113,235) 0%, rgb(20,212,216) 100%);
  937.  border-radius: 8px;
  938. }
  939. @media (min-width: 40em) {
  940.  .plot3-aiCombo h2 {
  941.    font-size: 1.5rem;
  942.    line-height: 1.5em;
  943.  }
  944.  .plot3-aiCombo p {
  945.    font-size: 1.25rem;
  946.    line-height: 1.5em;
  947.  }
  948.  .plot3-aiCombo a.textCTA-blue {
  949.    font-size: 1.25rem;
  950.    line-height: 1.5em;
  951.  }
  952. }
  953. @media (min-width: 50em) {
  954.  .plot3-aiCombo .content {
  955.    padding: 80px 20px;
  956.    display: flex;
  957.    flex-direction: row;
  958.    justify-content: space-between;
  959.    align-items: stretch;
  960.  }
  961.  .plot3-aiCombo .sectionText {
  962.    display: flex;
  963.    flex-direction: column;
  964.    margin: 0;
  965.    width: calc(50% - 40px);
  966.    text-align: left;
  967.  }
  968.  .plot3-aiCombo .sectionText *:last-child {
  969.    margin-bottom: 0;
  970.  }
  971.  .plot3-aiCombo .sectionFigure {
  972.    margin: 0;
  973.    width: calc(50% - 40px);
  974.  }
  975.  .plot3-aiCombo a.textCTA-blue {
  976.    margin: auto 0 0 0;
  977.  }
  978.  .plot3-aiCombo p {
  979.    font-size: 1.25rem;
  980.    line-height: 1.5em;
  981.  }
  982. }
  983. @media (min-width: 58em) {
  984.  .plot3-aiCombo h2 {
  985.    font-size: 1.5rem;
  986.    line-height: 1.4em;
  987.  }
  988.  .plot3-aiCombo p {
  989.    font-family: 'gilroy', Arial, sans-serif;
  990.    font-weight: 300;
  991.    font-size: 1.25rem;
  992.    line-height: 1.5em;
  993.  }
  994. }
  995. @media (min-width: 65em) {
  996.  .plot3-aiCombo h2 {
  997.    font-size: 1.75rem;
  998.    line-height: 1.3em;
  999.  }
  1000.  .plot3-aiCombo p {
  1001.    font-size: 1.25rem;
  1002.    line-height: 1.5em;
  1003.  }
  1004. }
  1005. /* end .plot3-aiCombo */
  1006.  
  1007.  
  1008.  
  1009. /* .plot3-courses */
  1010. .plot3-courses {
  1011.  background: rgb(0,113,235) linear-gradient(-90deg, rgb(20,212,216) -20%, rgb(0,113,235) 80%);
  1012. }
  1013. .plot3-courses .content {
  1014.  padding: 40px 20px 44px;
  1015. }
  1016. .plot3-courses h2,
  1017. .plot3-courses p {
  1018.  color: #fff;
  1019. }
  1020. .plot3-courses .sectionFigure {
  1021.  display: block;
  1022.  margin: 0 auto 40px;
  1023.  width: 80%;
  1024.  text-decoration: none;
  1025. }
  1026. .plot3-courses .sectionFigure img {
  1027.  display: block;
  1028.  max-width: 100%;
  1029. }
  1030. .plot3-courses .textCTA-light {
  1031.  margin: 0 auto 0;
  1032. }
  1033. @media (min-width: 50em) {
  1034.  .plot3-courses .content {
  1035.    padding: 80px 20px;
  1036.    display: flex;
  1037.    justify-content: space-between;
  1038.    align-items: center;
  1039.    flex-direction: row;
  1040.  }
  1041.  .plot3-courses .sectionText {
  1042.    margin: 0;
  1043.    width: calc(50% - 40px);
  1044.    text-align: left;
  1045.  }
  1046.  .plot3-courses .sectionText *:last-child {
  1047.    margin-bottom: 0;
  1048.  }
  1049.  .plot3-courses .sectionFigure {
  1050.    margin: 0;
  1051.    width: calc(50% - 40px);
  1052.  }
  1053.  .plot3-courses .textCTA-light {
  1054.    margin: 0;
  1055.  }
  1056. }
  1057. /* end .plot3-courses */
  1058.  
  1059.  
  1060.  
  1061. /* .plot3-hero.with-preheadCta */
  1062. .plot3-hero .preheadCta {
  1063.  display: block;
  1064.  margin: 0 auto 40px;
  1065.  padding: 2px 12px 0px;
  1066.  background: rgba(0,0,0,.66);
  1067.  color: #fff;
  1068.  width: 100%;
  1069.  max-width: max-content;
  1070.  border-radius: 13px;
  1071.  font-size: .875rem;
  1072.  font-weight: 600;
  1073.  font-family: 'gilroy', Arial, sans-serif;
  1074.  opacity: 1;
  1075.  text-decoration: none;
  1076.  border: 1px solid rgb(255,255,255);
  1077.  transition: box-shadow .2s;
  1078. }
  1079. .plot3-hero .preheadCta.superstream {
  1080.  background: rgb(0,0,0) linear-gradient(135deg, rgb(0,0,0) 0%, rgb(0,0,0) 80%, rgb(133, 234, 114) 100%);
  1081. }
  1082. .plot3-hero .preheadCta:hover {
  1083.  opacity: 1;
  1084.  text-decoration: none;
  1085.  box-shadow: 0 0 4px rgba(0,0,0,.3);
  1086. }
  1087. .plot3-hero .preheadCta:after {
  1088.  content: "";
  1089.  display: inline-block;
  1090.  margin: -8px -2px -6px 6px;
  1091.  width: 9px;
  1092.  height: 12px;
  1093.  vertical-align: middle;
  1094.  background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_white.svg) center center no-repeat;
  1095.  background-size: contain;
  1096. }
  1097. @media (min-width: 50em) {
  1098.  .plot3-hero.with-preheadCta .preheadCta {
  1099.    margin: 0 0 40px;
  1100.  }
  1101. }
  1102. @media (min-width: 76em) {
  1103.  .plot3-hero.with-preheadCta .content {
  1104.    padding: 80px 20px;
  1105.  }
  1106. }
  1107. @media (min-width: 84em) {
  1108.  .plot3-hero.with-preheadCta .content {
  1109.    padding: 100px 20px;
  1110.  }
  1111. }
  1112. /* end .plot3-hero.with-preheadCta */
  1113.  
  1114.  
  1115.  
  1116. /* .plot3-testimonial */
  1117. .plot3-testimonial .content {
  1118.  padding: 40px 20px 44px;
  1119. }
  1120. .plot3-testimonial h2,
  1121. .plot3-testimonial p {
  1122.  color: #222;
  1123. }
  1124. .plot3-testimonial .sectionText p {
  1125.  margin-bottom: 20px;
  1126. }
  1127. .plot3-testimonial .plot3-testimonial-figure {
  1128.  display: block;
  1129.  margin: 0 auto 40px;
  1130.  width: 80%;
  1131.  text-decoration: none;
  1132. }
  1133. .plot3-testimonial .plot3-testimonial-video {
  1134.  position: relative;
  1135.  margin: 20px auto 20px;
  1136.  width: 100%;
  1137.  padding-bottom: 56.25%;
  1138.  border-radius: 8px;
  1139.  border: 1px solid transparent;
  1140.  box-shadow: 0 0 20px rgba(0,0,0,.2);
  1141. }
  1142. .plot3-testimonial .plot3-testimonial-video:before {
  1143.  content: "";
  1144.  position: absolute;
  1145.  z-index: -1;
  1146.  top: 0;
  1147.  right: 0;
  1148.  bottom: 0;
  1149.  left: 0;
  1150.  margin: -1px;
  1151.  border-radius: inherit;
  1152.  background: rgb(0,113,235) linear-gradient(135deg, rgb(0,113,235) 0%, rgb(20,212,216) 100%);
  1153. }
  1154. .plot3-testimonial .plot3-testimonial-video iframe {
  1155.  display: block;
  1156.  max-width: 100%;
  1157. }
  1158. .plot3-testimonial .plot3-testimonial-video .kWidgetIframeContainer {
  1159.  position: absolute;
  1160.  width: 100%;
  1161.  height: 100%;
  1162.  border-radius: 7px;
  1163.  overflow: hidden;
  1164. }
  1165. .plot3-testimonial-thumbnails {
  1166.  display: flex;
  1167.  flex-direction: row;
  1168.  justify-content: space-between;
  1169.  margin-top: 8px;
  1170. }
  1171. .plot3-testimonial-thumbnails-item {
  1172.  display: block;
  1173.  padding: 0;
  1174.  margin: 0;
  1175.  width: calc((100% / 4) - (24px / 4));
  1176.  border-radius: 8px;
  1177.  border: 1px solid rgba(0,0,0,.1);
  1178.  outline: none;
  1179.  overflow: hidden;
  1180.  transition: box-shadow .2s, opacity .2s;
  1181. }
  1182. .plot3-testimonial-thumbnails-item:hover,
  1183. .plot3-testimonial-thumbnails-item:focus {
  1184.  box-shadow: 0 0 8px rgba(0,0,0,.2);
  1185.  cursor: pointer;
  1186. }
  1187. .plot3-testimonial-thumbnails-item.active {
  1188.  box-shadow: 0 0 8px rgba(0,0,0,.2);
  1189.  opacity: .5;
  1190.  cursor: default;
  1191. }
  1192. .plot3-testimonial-thumbnails-item img {
  1193.  display: block;
  1194.  width: 100%;
  1195. }
  1196. .plot3-testimonial .textCTA-blue {
  1197.  margin: 0 auto 0;
  1198. }
  1199. @media (min-width: 50em) {
  1200.  .plot3-testimonial .content {
  1201.    padding: 80px 20px;
  1202.    display: flex;
  1203.    justify-content: space-between;
  1204.    align-items: center;
  1205.    flex-direction: row-reverse;
  1206.  }
  1207.  .plot3-testimonial .sectionText {
  1208.    margin: 0;
  1209.    width: calc(50% - 40px);
  1210.    text-align: left;
  1211.  }
  1212.  .plot3-testimonial .sectionText a:last-child {
  1213.    margin-bottom: 0;
  1214.  }
  1215.  .plot3-testimonial .plot3-testimonial-figure {
  1216.    margin: 0;
  1217.    width: calc(50% - 40px);
  1218.  }
  1219.  .plot3-testimonial .plot3-testimonial-video {
  1220.    margin: 0 auto;
  1221.  }
  1222.  .plot3-testimonial .textCTA-blue {
  1223.    margin: 0;
  1224.  }
  1225. }
  1226. /* end .plot3-testimonial */
  1227.  
  1228.  
  1229. /* .plot3-awards */
  1230. .plot3-awards {
  1231.  background-color: rgb(0,0,0,1);
  1232.  background-image: linear-gradient(-70deg, rgba(226,190,110,.1), rgba(226,190,110,0)), linear-gradient(130deg, rgba(255,255,255,0) 45%, rgba(255,255,255,.1) 100%), linear-gradient(170deg, rgba(255,255,255,0) 70%, rgba(255,255,255,.2) 100%);
  1233.  background-size: cover;
  1234. }
  1235. .plot3-awards .content {
  1236.  padding: 40px 20px 44px;
  1237. }
  1238. .plot3-awards h2,
  1239. .plot3-awards p {
  1240.  color: #fff;
  1241. }
  1242. .plot3-awards .sectionFigure {
  1243.  display: block;
  1244.  margin: 0 auto 40px;
  1245.  width: 80%;
  1246.  text-decoration: none;
  1247. }
  1248. .plot3-awards .sectionFigure video {
  1249.  display: block;
  1250.  margin: 0 auto;
  1251.  max-width: 100%;
  1252. }
  1253. .plot3-awards-logos {
  1254.  display: flex;
  1255.  flex-wrap: wrap;
  1256.  align-items: center;
  1257.  margin: 0 auto 20px;
  1258.  padding: 20px 20px 0;
  1259.  max-width: 592px;
  1260.  background-color: #fff;
  1261.  border-radius: 20px;
  1262.  box-shadow: inset 0 4px 8px rgba(0,0,0,.1);
  1263. }
  1264. .plot3-awards-logos img {
  1265.  display: block;
  1266.  margin: 0 20px 20px;
  1267.  max-width: calc((100% / 3) - (20px * 3 - 20px));
  1268.  max-height: 4rem;
  1269. }
  1270. .plot3-awards .textCTA-light {
  1271.  margin: 0 auto 0;
  1272. }
  1273. @media (min-width: 50em) {
  1274.  .plot3-awards .content {
  1275.    padding: 80px 20px;
  1276.    display: flex;
  1277.    justify-content: space-between;
  1278.    align-items: center;
  1279.    flex-direction: row-reverse;
  1280.  }
  1281.  .plot3-awards .sectionText {
  1282.    margin: 0;
  1283.    width: calc(50% - 40px);
  1284.    text-align: left;
  1285.  }
  1286.  .plot3-awards-logos {
  1287.    margin: 0 0 20px;
  1288.  }
  1289.  .plot3-awards .sectionFigure {
  1290.    margin: 0;
  1291.    width: calc(50% - 40px);
  1292.  }
  1293.  .plot3-awards .textCTA-light {
  1294.    margin: 0;
  1295.  }
  1296. }
  1297. /* end .plot3-awards */
  1298.  
  1299.  
  1300. /* .plot3-deij */
  1301. .plot3-deij {
  1302.  background-color: rgb(255,255,255);
  1303. }
  1304. .plot3-deij .content {
  1305.  padding: 40px 20px 44px;
  1306. }
  1307. .plot3-deij .sectionFigure {
  1308.  display: block;
  1309.  margin: 0 auto 0;
  1310.  width: 80%;
  1311.  text-decoration: none;
  1312. }
  1313. .plot3-deij .sectionFigure img {
  1314.  display: block;
  1315.  margin: 0 0 40px auto;
  1316.  width: 86%;
  1317.  max-width: 100%;
  1318. }
  1319. .plot3-deij .textCTA-blue {
  1320.  margin: 0 auto 0;
  1321. }
  1322. @media (min-width: 50em) {
  1323.  .plot3-deij .content {
  1324.    padding: 80px 20px;
  1325.    display: flex;
  1326.    justify-content: space-between;
  1327.    align-items: center;
  1328.    flex-direction: row;
  1329.  }
  1330.  .plot3-deij .sectionText {
  1331.    margin: 0;
  1332.    width: calc(50% - 40px);
  1333.    text-align: left;
  1334.  }
  1335.  .plot3-deij .sectionText *:last-child {
  1336.    margin-bottom: 0;
  1337.  }
  1338.  .plot3-deij .sectionFigure {
  1339.    margin: 0;
  1340.    width: calc(50% - 40px);
  1341.  }
  1342.  .plot3-deij .sectionFigure img {
  1343.    margin: 0 auto 0;
  1344.    width: 100%;
  1345.  }
  1346.  .plot3-deij .textCTA-blue {
  1347.    margin: 0;
  1348.  }
  1349. }
  1350. /* end .plot3-deij */
  1351. </style>
  1352.  
  1353.  
  1354.  
  1355. <span class="plot3" id="plot3">
  1356.  
  1357.    <section class="plot3-hero"><!-- with-preheadCta -->
  1358.      <div class="content">
  1359.        <!--<a id="radar-preheadCta" class="preheadCta" href="https://www.oreilly.com/online-learning/radar-event-security-2022.html">New AI policy for O&rsquo;Reilly authors <span class="nowrap">and talent</span></a>-->
  1360.  
  1361.        <h1>Build your team&rsquo;s <span class="highlight">tech skills</span> for real <span class="nowrap">business impact</span></h1>
  1362.  
  1363.        <div class="plot3-hero-odotAnimal"><figure></figure></div>
  1364.  
  1365.        <p>More than 5,000 companies count on our digital courses and more to guide their teams through the tools and technologies that drive business outcomes. We can help <span class="nowrap">yours too.</span></p>
  1366.  
  1367.        <div class="plot3-hero-cta">
  1368.          <a id="requestDemo1-cta-c" href="https://www.oreilly.com/online-learning/teams.html" class="btnCTA-blue"><span class="inner">Request a demo</span></a>
  1369.          <a id="tryFree1-cta-c" href="https://learning.oreilly.com/start-trial/" class="textCTA-blue secondary"><span class="inner">Try it free</span></a>
  1370.        </div>
  1371.  
  1372.      </div>
  1373.    </section>
  1374.  
  1375.  
  1376.    <section class="plot3-aiCombo">
  1377.      <div class="content">
  1378.        <div class="sectionText">
  1379.          <h2>New AI policy for O&rsquo;Reilly authors <span class="nowrap">and talent</span></h2>
  1380.  
  1381.          <p>O&rsquo;Reilly president Laura Baldwin shares the company&rsquo;s ethical approach to leveraging GenAI tools and ensuring O&rsquo;Reilly experts are compensated for <span class="nowrap">their work.</span></p>
  1382.  
  1383.          <a id="aiPolicy-cta" href="https://www.oreilly.com/about/oreilly-approach-to-generative-ai.html" class="textCTA-blue"><span class="inner">See it now</span></a>
  1384.        </div>
  1385.  
  1386.  
  1387.        <div class="sectionText">
  1388.          <h2>It&rsquo;s time to upskill your teams to leverage <span class="nowrap">generative AI</span></h2>
  1389.  
  1390.          <p>LLMs aren&rsquo;t the future of work, they&rsquo;re the <em>now</em>. Every employee needs to learn how to leverage large language models for your organization to stay ahead. Fortunately, O&rsquo;Reilly has all the resources your <span class="nowrap">team needs.</span></p>
  1391.  
  1392.          <a id="llm-cta" href="https://www.oreilly.com/online-learning/generative-ai.html" class="textCTA-blue"><span class="inner">Learn more</span></a>
  1393.        </div>
  1394.      </div>
  1395.    </section>
  1396.  
  1397.  
  1398.    <section class="plot3-testimonial sectionBreak">
  1399.      <div class="content">
  1400.        <div class="plot3-testimonial-figure">
  1401.          <div id="js-testimonialVideo1" class="plot3-testimonial-video">
  1402.            <div id="kaltura_player_1689279523"></div>
  1403.          </div>
  1404.  
  1405.          <div id="js-testimonialVideo2" class="plot3-testimonial-video hidden">
  1406.            <div id="kaltura_player_1674688758"></div>
  1407.          </div>
  1408.  
  1409.          <div id="js-testimonialVideo3" class="plot3-testimonial-video hidden">
  1410.            <div id="kaltura_player_1666285022"></div>
  1411.          </div>
  1412.  
  1413.          <div id="js-testimonialVideo4" class="plot3-testimonial-video hidden">
  1414.            <div id="kaltura_player_1660838772"></div>
  1415.          </div>
  1416.  
  1417.          <div class="plot3-testimonial-thumbnails">
  1418.            <button id="js-testimonialThumbnail1" class="plot3-testimonial-thumbnails-item active"><img src="https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb1-711x400-20230201.jpg" alt="Testimonial video thumbnail 1"></button>
  1419.  
  1420.            <button id="js-testimonialThumbnail2" class="plot3-testimonial-thumbnails-item"><img src="https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb3-711x400-20230201.jpg" alt="Testimonial video thumbnail 2"></button>
  1421.  
  1422.            <button id="js-testimonialThumbnail3" class="plot3-testimonial-thumbnails-item"><img src="https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb1-711x400-20221020.jpg" alt="Testimonial video thumbnail 3"></button>
  1423.  
  1424.            <button id="js-testimonialThumbnail4" class="plot3-testimonial-thumbnails-item"><img src="https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb2-400x225-20221019.jpg" alt="Testimonial video thumbnail 4"></button>
  1425.          </div>
  1426.        </div>
  1427.  
  1428.        <div class="sectionText">
  1429.          <div id="js-testimonialText1">
  1430.            <h2>See why Jose is on O&rsquo;Reilly almost <span class="nowrap">every day</span></h2>
  1431.  
  1432.            <p>Jose, a principal software engineer, trusts our learning platform to filter what his teams need to know to <span class="nowrap">stay ahead.</span></p>
  1433.          </div>
  1434.  
  1435.          <div id="js-testimonialText2" class="hidden">
  1436.            <h2>See why Addison loves our <span class="nowrap">learning platform</span></h2>
  1437.  
  1438.            <p>Addison always appreciated O&rsquo;Reilly books, but the learning platform helped take her skills to the <span class="nowrap">next level.</span></p>
  1439.          </div>
  1440.  
  1441.          <div id="js-testimonialText3" class="hidden">
  1442.            <h2>Amir trusts O&rsquo;Reilly to find the answers he needs. <span class="nowrap">See why.</span></h2>
  1443.  
  1444.            <p>For over eight years Amir has counted on our learning platform whether he needs proven methods to learn new technologies or the latest <span class="nowrap">management tips.</span></p>
  1445.          </div>
  1446.  
  1447.          <div id="js-testimonialText4" class="hidden">
  1448.            <h2>Mark&rsquo;s been an O&rsquo;Reilly member for 13 years. <span class="nowrap">See why.</span></h2>
  1449.  
  1450.            <p>Mark credits the O&rsquo;Reilly learning platform with helping him to stay ahead at every turn throughout his <span class="nowrap">tech career.</span></p>
  1451.          </div>
  1452.  
  1453.          <a id="testimonial-cta" href="https://www.oreilly.com/online-learning/testimonials.html" class="textCTA-blue"><span class="inner">See more testimonials</span></a>
  1454.        </div>
  1455.  
  1456.  
  1457.        <script src="https://cdnapisec.kaltura.com/p/1681692/sp/168169200/embedIframeJs/uiconf_id/47268383/partner_id/1681692"></script>
  1458.  
  1459.        <script>
  1460.        kWidget.embed({
  1461.          "targetId": "kaltura_player_1689279523",
  1462.          "wid": "_1681692",
  1463.          "uiconf_id": 47268383,
  1464.          "flashvars": {
  1465.            'thumbnailUrl': 'https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb1-711x400-20230201.jpg',
  1466.            'autoMute': false,
  1467.            'autoPlay': false,
  1468.            'controlBarContainer.plugin': false,
  1469.          },
  1470.          "cache_st": 1689279523,
  1471.          "entry_id": "1_7le83llz"
  1472.        });
  1473.  
  1474.        kWidget.embed({
  1475.          "targetId": "kaltura_player_1674688758",
  1476.          "wid": "_1681692",
  1477.          "uiconf_id": 47268383,
  1478.          "flashvars": {
  1479.            'thumbnailUrl': 'https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb3-711x400-20230201.jpg',
  1480.            'autoMute': false,
  1481.            'autoPlay': false,
  1482.            'controlBarContainer.plugin': false,
  1483.          },
  1484.          "cache_st": 1674688758,
  1485.          "entry_id": "1_td7km9vj"
  1486.        });
  1487.  
  1488.        kWidget.embed({
  1489.          "targetId": "kaltura_player_1666285022",
  1490.          "wid": "_1681692",
  1491.          "uiconf_id": 47268383,
  1492.          "flashvars": {
  1493.            'thumbnailUrl': 'https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb1-711x400-20221020.jpg',
  1494.            'autoMute': false,
  1495.            'autoPlay': false,
  1496.            'controlBarContainer.plugin': false,
  1497.          },
  1498.          "cache_st": 1666285022,
  1499.          "entry_id": "1_nrvzd3wa"
  1500.        });
  1501.  
  1502.        kWidget.embed({
  1503.          "targetId": "kaltura_player_1660838772",
  1504.          "wid": "_1681692",
  1505.          "uiconf_id": 47268383,
  1506.          "flashvars": {
  1507.            'thumbnailUrl': 'https://cdn.oreillystatic.com/oreilly/images/home-video-testimonial-thumb2-400x225-20221019.jpg',
  1508.            'autoMute': false,
  1509.            'autoPlay': false,
  1510.            'controlBarContainer.plugin': false,
  1511.          },
  1512.          "cache_st": 1603408139,
  1513.          "entry_id": "1_4jl34ett"
  1514.        });
  1515.        </script>
  1516.      </div>
  1517.    </section>
  1518.  
  1519.  
  1520.    <section class="plot3-deij sectionBreak hidden" id="deijSection">
  1521.      <div class="content">
  1522.        <figure class="sectionFigure">
  1523.          <img src="https://cdn.oreillystatic.com/images/dei/deij-odot.svg" alt="">
  1524.        </figure>
  1525.  
  1526.        <div class="sectionText">
  1527.          <h2>Identity shouldn&rsquo;t hold <span class="nowrap">anyone back</span></h2>
  1528.  
  1529.          <p>To ensure more voices are heard, we&rsquo;re offering 500 people an O&rsquo;Reilly diversity scholarship to get free access to our industry-leading platform <span class="nowrap">for a year</span>.</p>
  1530.  
  1531.          <a id="deij-cta" href="https://www.oreilly.com/diversity/scholarship-program.html" class="textCTA-blue"><span class="inner">Learn more</span></a>
  1532.        </div>
  1533.      </div>
  1534.    </section>
  1535.  
  1536.  
  1537.    <section class="plot3-awards" id="awardsSection">
  1538.      <div class="content">
  1539.        <figure class="sectionFigure">
  1540.          <video playsinline autoplay muted loop poster="https://cdn.oreillystatic.com/oreilly/images/oreilly_award_2023_600x600.png">
  1541.            <source src="https://cdn.oreillystatic.com/oreilly/videos/oreilly_award_animation_alpha2_2023.webm" type="video/webm">
  1542.          </video>
  1543.        </figure>
  1544.  
  1545.        <div class="sectionText">
  1546.          <h2>The 2023 O&rsquo;Reilly Awards <span class="nowrap">winners are in!</span></h2>
  1547.  
  1548.          <p>Learn who best put the O&rsquo;Reilly learning platform to work for their organization and what the judges were looking for in <span class="nowrap">winning submissions.</span></p>
  1549.  
  1550.          <div class="plot3-awards-logos">
  1551.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_hp.svg" alt="HP logo">
  1552.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_hcl.png" alt="HCL logo">
  1553.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_tavant.png" alt="Tavant logo">
  1554.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_grubhub.png" alt="Grubhub logo">
  1555.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_dataart.svg" alt="DataArt logo">
  1556.            <img src="https://cdn.oreillystatic.com/oreilly/images/awards-2023/logo_medidata.svg" alt="Medidata logo">
  1557.          </div>
  1558.  
  1559.          <a id="awards-cta" href="https://www.oreilly.com/online-learning/oreilly-awards-winners-2023.html" class="textCTA-light"><span class="inner">See the results</span></a>
  1560.        </div>
  1561.      </div>
  1562.    </section>
  1563.  
  1564.  
  1565.  
  1566.    <section class="plot3-experts">
  1567.      <div class="content">
  1568.        <div class="sectionText">
  1569.          <h2>Sharing the knowledge of innovators for <span class="nowrap">over 40 years</span></h2>
  1570.  
  1571.          <p>From books to leading tech conferences to a groundbreaking online learning platform, we&rsquo;ve focused on creating the best technical learning content for more than four decades. Your teams can benefit from that experience.</p>
  1572.        </div>
  1573.  
  1574.        <div class="sectionFigure">
  1575.          <div class="plot3-experts-panels">
  1576.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Arianne%20Dee%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=suggestion&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/images/live-online-training/39040-720x720.jpg)">
  1577.              <div class="text">
  1578.                <span class="name">Arianne Dee</span>
  1579.                <span class="affiliation">University of British Columbia</span>
  1580.              </div>
  1581.            </a>
  1582.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Bruno%20Gon%C3%A7alves%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=user&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/images/live-online-training/39420-720x720.jpg)">
  1583.              <div class="text">
  1584.                <span class="name">Bruno Gon&ccedil;alves</span>
  1585.                <span class="affiliation">Senior Data Scientist</span>
  1586.              </div>
  1587.            </a>
  1588.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Kelsey%20Hightower%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=user&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/oreilly/images/kelsey_hightower_color_400x400.jpg)">
  1589.              <div class="text">
  1590.                <span class="name">Kelsey Hightower</span>
  1591.                <span class="affiliation">Google Cloud Platform</span>
  1592.              </div>
  1593.            </a>
  1594.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Sari%20Greene%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=user&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/images/live-online-training/38263-720x720.jpg)">
  1595.              <div class="text">
  1596.                <span class="name">Sari Greene</span>
  1597.                <span class="affiliation">Cybersecurity practitioner</span>
  1598.              </div>
  1599.            </a>
  1600.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Neal%20Ford%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=user&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/images/live-online-training/38528-720x720.jpg)">
  1601.              <div class="text">
  1602.                <span class="name">Neal Ford</span>
  1603.                <span class="affiliation">Software Architect</span>
  1604.              </div>
  1605.            </a>
  1606.            <a href="https://learning.oreilly.com/search/?query=author%3A%22Ken%20Kousen%22&extended_publisher_data=true&highlight=true&include_assessments=false&include_case_studies=true&include_courses=true&include_playlists=true&include_collections=true&include_notebooks=true&include_sandboxes=true&include_scenarios=true&is_academic_institution_account=false&source=user&sort=date_added&facet_json=true&json_facets=true&page=0&include_facets=false" style="background-image: url(https://cdn.oreillystatic.com/oreilly/images/ken-kousen-400x400.jpg)">
  1607.              <div class="text">
  1608.                <span class="name">Ken Kousen</span>
  1609.                <span class="affiliation">Java Champion</span>
  1610.              </div>
  1611.            </a>
  1612.          </div>
  1613.        </div>
  1614.  
  1615.      </div>
  1616.    </section>
  1617.  
  1618.  
  1619.    <section class="plot3-courses">
  1620.      <div class="content">
  1621.        <a id="courses-image" href="https://www.oreilly.com/online-learning/courses.html" class="sectionFigure">
  1622.          <img src="https://cdn.oreillystatic.com/oreilly/images/laptop-flat-courses-20230228.png" alt="">
  1623.        </a>
  1624.  
  1625.        <div class="sectionText">
  1626.          <h2>5,000+ courses to keep teams on the <span class="nowrap">right path</span></h2>
  1627.  
  1628.          <p>Our live and on-demand courses are organized by skill and role, so your teams can easily find exactly what they need to succeed. Plus, they&rsquo;ll earn verifiable and shareable badges that use the Open Badge 2.0 standard to show off what <span class="nowrap">they&rsquo;ve learned.</span></p>
  1629.  
  1630.          <a id="courses-cta" href="https://www.oreilly.com/online-learning/courses.html" class="textCTA-light"><span class="inner">Explore courses</span></a>
  1631.        </div>
  1632.      </div>
  1633.    </section>
  1634.  
  1635.  
  1636.    <section class="plot3-live">
  1637.      <div class="content">
  1638.        <div class="sectionText">
  1639.          <h2>Live events keep your organization ahead of <span class="nowrap">what&rsquo;s next</span></h2>
  1640.  
  1641.          <p>Your teams have access to nearly 1,000 live online courses and events every year, led by top experts in AI, software architecture, cloud, data, programming, and more. And they can ask questions along <span class="nowrap">the way.</span></p>
  1642.  
  1643.          <div class="sectionFigure">
  1644.            <img src="https://cdn.oreillystatic.com/oreilly/images/home_plot3_lot_600x600.jpg" alt="">
  1645.            <p>Kai Holnes, Thoughtworks</p>
  1646.          </div>
  1647.  
  1648.          <a href="https://www.oreilly.com/online-learning/live-online-sessions.html" class="textCTA-dark"><span class="inner">Learn from experts</span></a>
  1649.        </div>
  1650.      </div>
  1651.    </section>
  1652.  
  1653.  
  1654.    <section class="plot3-certification">
  1655.      <div class="content">
  1656.        <div class="sectionText">
  1657.          <h2>Certified teams are teams you can <span class="nowrap">count on</span></h2>
  1658.  
  1659.          <p>A certification means you can trust they&rsquo;ve mastered the skills your organization needs. We help your people prep for their exams with direct paths to the official materials and interactive <span class="nowrap">practice tests.</span></p>
  1660.  
  1661.          <a href="https://www.oreilly.com/online-learning/feature-certification.html" class="textCTA-dark"><span class="inner">Help prove their proficiency</span></a>
  1662.        </div>
  1663.  
  1664.        <div class="sectionFigure">
  1665.          <img src="https://cdn.oreillystatic.com/oreilly/images/cert-vendor-logos.png" alt="">
  1666.        </div>
  1667.      </div>
  1668.    </section>
  1669.  
  1670.  
  1671.    <section class="plot3-cta">
  1672.      <div class="content">
  1673.        <div class="sectionText">
  1674.          <h2>See how O&rsquo;Reilly can help your tech teams <span class="nowrap">stay ahead</span></h2>
  1675.  
  1676.          <div class="plot3-cta-btnGroup">
  1677.            <a id="requestDemo2-cta" href="https://www.oreilly.com/online-learning/enterprise.html" class="btnCTA-blue"><span class="inner">Request a  demo</span></a>
  1678.            <a id="tryFree2-cta" href="https://learning.oreilly.com/start-trial/" class="textCTA-blue"><span class="inner">Try it free</span></a>
  1679.          </div>
  1680.        </div>
  1681.      </div>
  1682.    </section>
  1683. </span>
  1684.  
  1685.  
  1686. <script>
  1687. kWidget.addReadyCallback(function( playerId ){
  1688.  var kdp = document.getElementById( playerId );
  1689.  kdp.sendNotification("changeVolume", 1);
  1690.  
  1691.  kdp.kBind("firstPlay", function() {
  1692.    //GA
  1693.    /*
  1694.    dataLayer.push({
  1695.      'event': 'eventTracker',
  1696.      'eventCat': 'marketing',
  1697.      'eventAct': 'video play',
  1698.      'eventLbl': 'start',
  1699.      'eventVal': 0,
  1700.      'nonInteraction': 0
  1701.    });
  1702.    */
  1703.  });
  1704.  
  1705.  kdp.kBind("playerPlayEnd", function() {
  1706.    //GA
  1707.    /*
  1708.    dataLayer.push({
  1709.      'event': 'eventTracker',
  1710.      'eventCat': 'marketing',
  1711.      'eventAct': 'video play',
  1712.      'eventLbl': 'complete',
  1713.      'eventVal': 0,
  1714.      'nonInteraction': 0
  1715.    });
  1716.    */
  1717.  });
  1718. });
  1719.  
  1720. (function() {
  1721.  //Add thumbnail button controls
  1722.  const thumbnail1 = document.getElementById('js-testimonialThumbnail1');
  1723.  const thumbnail2 = document.getElementById('js-testimonialThumbnail2');
  1724.  const thumbnail3 = document.getElementById('js-testimonialThumbnail3');
  1725.  const thumbnail4 = document.getElementById('js-testimonialThumbnail4');
  1726.  const video1 = document.getElementById('js-testimonialVideo1');
  1727.  const video2 = document.getElementById('js-testimonialVideo2');
  1728.  const video3 = document.getElementById('js-testimonialVideo3');
  1729.  const video4 = document.getElementById('js-testimonialVideo4');
  1730.  const text1 = document.getElementById('js-testimonialText1');
  1731.  const text2 = document.getElementById('js-testimonialText2');
  1732.  const text3 = document.getElementById('js-testimonialText3');
  1733.  const text4 = document.getElementById('js-testimonialText4');
  1734.  
  1735.  thumbnail1.addEventListener('click', function(e) {
  1736.    e.preventDefault();
  1737.  
  1738.    thumbnail1.classList.add('active');
  1739.    video1.classList.remove('hidden');
  1740.    text1.classList.remove('hidden');
  1741.    document.getElementById('kaltura_player_1689279523').sendNotification('doPlay');
  1742.  
  1743.    thumbnail2.classList.remove('active');
  1744.    text2.classList.add('hidden');
  1745.    video2.classList.add('hidden');
  1746.    document.getElementById('kaltura_player_1674688758').sendNotification('doPause');
  1747.  
  1748.    thumbnail3.classList.remove('active');
  1749.    text3.classList.add('hidden');
  1750.    video3.classList.add('hidden');
  1751.    document.getElementById('kaltura_player_1666285022').sendNotification('doPause');
  1752.  
  1753.    thumbnail4.classList.remove('active');
  1754.    text4.classList.add('hidden');
  1755.    video4.classList.add('hidden');
  1756.    document.getElementById('kaltura_player_1660838772').sendNotification('doPause');
  1757.  });
  1758.  
  1759.  thumbnail2.addEventListener('click', function(e) {
  1760.    e.preventDefault();
  1761.  
  1762.    thumbnail2.classList.add('active');
  1763.    video2.classList.remove('hidden');
  1764.    text2.classList.remove('hidden');
  1765.    document.getElementById('kaltura_player_1674688758').sendNotification('doPlay');
  1766.  
  1767.    thumbnail1.classList.remove('active');
  1768.    text1.classList.add('hidden');
  1769.    video1.classList.add('hidden');
  1770.    document.getElementById('kaltura_player_1689279523').sendNotification('doPause');
  1771.  
  1772.    thumbnail3.classList.remove('active');
  1773.    text3.classList.add('hidden');
  1774.    video3.classList.add('hidden');
  1775.    document.getElementById('kaltura_player_1666285022').sendNotification('doPause');
  1776.  
  1777.    thumbnail4.classList.remove('active');
  1778.    text4.classList.add('hidden');
  1779.    video4.classList.add('hidden');
  1780.    document.getElementById('kaltura_player_1660838772').sendNotification('doPause');
  1781.  });
  1782.  
  1783.  thumbnail3.addEventListener('click', function(e) {
  1784.    e.preventDefault();
  1785.  
  1786.    thumbnail3.classList.add('active');
  1787.    video3.classList.remove('hidden');
  1788.    text3.classList.remove('hidden');
  1789.    document.getElementById('kaltura_player_1666285022').sendNotification('doPlay');
  1790.  
  1791.    thumbnail1.classList.remove('active');
  1792.    text1.classList.add('hidden');
  1793.    video1.classList.add('hidden');
  1794.    document.getElementById('kaltura_player_1689279523').sendNotification('doPause');
  1795.  
  1796.    thumbnail2.classList.remove('active');
  1797.    text2.classList.add('hidden');
  1798.    video2.classList.add('hidden');
  1799.    document.getElementById('kaltura_player_1674688758').sendNotification('doPause');
  1800.  
  1801.    thumbnail4.classList.remove('active');
  1802.    text4.classList.add('hidden');
  1803.    video4.classList.add('hidden');
  1804.    document.getElementById('kaltura_player_1660838772').sendNotification('doPause');
  1805.  });
  1806.  
  1807.  thumbnail4.addEventListener('click', function(e) {
  1808.    e.preventDefault();
  1809.  
  1810.    thumbnail4.classList.add('active');
  1811.    video4.classList.remove('hidden');
  1812.    text4.classList.remove('hidden');
  1813.    document.getElementById('kaltura_player_1660838772').sendNotification('doPlay');
  1814.  
  1815.    thumbnail1.classList.remove('active');
  1816.    text1.classList.add('hidden');
  1817.    video1.classList.add('hidden');
  1818.    document.getElementById('kaltura_player_1689279523').sendNotification('doPause');
  1819.  
  1820.    thumbnail2.classList.remove('active');
  1821.    text2.classList.add('hidden');
  1822.    video2.classList.add('hidden');
  1823.    document.getElementById('kaltura_player_1674688758').sendNotification('doPause');
  1824.  
  1825.    thumbnail3.classList.remove('active');
  1826.    text3.classList.add('hidden');
  1827.    video3.classList.add('hidden');
  1828.    document.getElementById('kaltura_player_1666285022').sendNotification('doPause');
  1829.  });
  1830.  
  1831.  
  1832.  //Hide DEIJ module after April 1, 2024.
  1833.  var today = new Date();
  1834.  deijScholarshipStartDate = new Date('2024-03-08T07:00:00.000-07:00');
  1835.  deijScholarshipEndDate = new Date('2024-04-02T00:00:00.000-07:00');
  1836.  
  1837.  //if during date range,
  1838.  //show the deij scholarship section
  1839.  if (today > deijScholarshipStartDate && today < deijScholarshipEndDate) {
  1840.    // Target exit intent overlay
  1841.    const deijSection = document.getElementById('deijSection');
  1842.    deijSection.classList.remove('hidden');
  1843.  }
  1844.  
  1845. })();
  1846. </script>
  1847.  
  1848.  
  1849.  
  1850. <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  1851.  
  1852. <script>
  1853. document.addEventListener("DOMContentLoaded", function(event) {
  1854.  
  1855.  //GA event for "Let's talk CTA"
  1856.  $('#letsTalk').on('click', function(e) {
  1857.    dataLayer.push({
  1858.      'event': 'eventTracker',
  1859.      'eventCat':'marketing',
  1860.      'eventAct':'click',
  1861.      'eventLbl':'lets talk',
  1862.      'eventVal':0,
  1863.      'nonInteraction': 0,
  1864.    });
  1865.  });
  1866.  
  1867.  //GA event for "Learn more CTA"
  1868.  $('#onlineLearning-cta').on('click', function(e) {
  1869.    dataLayer.push({
  1870.      'event': 'eventTracker',
  1871.      'eventCat':'marketing',
  1872.      'eventAct':'click',
  1873.      'eventLbl':'learn more',
  1874.      'eventVal':0,
  1875.      'nonInteraction': 0,
  1876.    });
  1877.  });
  1878.  
  1879.  //GA event for business hero "Get Ahead CTA"
  1880.  $('#getAhead-cta').on('click', function(e) {
  1881.    dataLayer.push({
  1882.      'event': 'eventTracker',
  1883.      'eventCat':'marketing',
  1884.      'eventAct':'click',
  1885.      'eventLbl':'get ahead',
  1886.      'eventVal':0,
  1887.      'nonInteraction': 0,
  1888.    });
  1889.  });
  1890.  
  1891.  //GA event for "Request a demo" CTA
  1892.  $('#requestDemo1-cta-a, #requestDemo1-cta-b, #requestDemo1-cta-c, #requestDemo2-cta').on('click', function(e) {
  1893.    dataLayer.push({
  1894.      'event': 'eventTracker',
  1895.      'eventCat':'marketing',
  1896.      'eventAct':'click',
  1897.      'eventLbl':'request a demo',
  1898.      'eventVal':0,
  1899.      'nonInteraction': 0,
  1900.    });
  1901.  });
  1902.  
  1903.  //GA event for "Try it free" CTA
  1904.  $('#tryFree1-cta-a, #tryFree1-cta-b, #tryFree1-cta-c, #tryFree2-cta').on('click', function(e) {
  1905.    dataLayer.push({
  1906.      'event': 'eventTracker',
  1907.      'eventCat':'marketing',
  1908.      'eventAct':'click',
  1909.      'eventLbl':'try it free',
  1910.      'eventVal':0,
  1911.      'nonInteraction': 0,
  1912.    });
  1913.  });
  1914.  
  1915.  //GA event for "Radar event" CTA
  1916.  $('#radar-cta, #radar-image, #radar-preheadCta').on('click', function(e) {
  1917.    dataLayer.push({
  1918.      'event': 'eventTracker',
  1919.      'eventCat':'marketing',
  1920.      'eventAct':'click',
  1921.      'eventLbl':'radar register free',
  1922.      'eventVal':0,
  1923.      'nonInteraction': 0,
  1924.    });
  1925.  });
  1926.  
  1927.  //GA event for "Testimonials" CTA
  1928.  $('#testimonial-cta').on('click', function(e) {
  1929.    dataLayer.push({
  1930.      'event': 'eventTracker',
  1931.      'eventCat':'marketing',
  1932.      'eventAct':'click',
  1933.      'eventLbl':'see more testimonials',
  1934.      'eventVal':0,
  1935.      'nonInteraction': 0,
  1936.    });
  1937.  });
  1938.  
  1939.  //GA event for "Awards" CTA
  1940.  $('#awards-cta').on('click', function(e) {
  1941.    dataLayer.push({
  1942.      'event': 'eventTracker',
  1943.      'eventCat':'marketing',
  1944.      'eventAct':'click',
  1945.      'eventLbl':'awards see the results',
  1946.      'eventVal':0,
  1947.      'nonInteraction': 0,
  1948.    });
  1949.  });
  1950.  
  1951.  //GA event for "aiPolicy" CTA
  1952.  $('#aiPolicy-cta').on('click', function(e) {
  1953.    dataLayer.push({
  1954.      'event': 'eventTracker',
  1955.      'eventCat':'marketing',
  1956.      'eventAct':'click',
  1957.      'eventLbl':'ai policy: see it now',
  1958.      'eventVal':0,
  1959.      'nonInteraction': 0,
  1960.    });
  1961.  });
  1962.  
  1963.  //GA event for "llm" CTA
  1964.  $('#llm-cta').on('click', function(e) {
  1965.    dataLayer.push({
  1966.      'event': 'eventTracker',
  1967.      'eventCat':'marketing',
  1968.      'eventAct':'click',
  1969.      'eventLbl':'llm: learn more',
  1970.      'eventVal':0,
  1971.      'nonInteraction': 0,
  1972.    });
  1973.  });
  1974.  
  1975.  //GA event for "courses" CTA
  1976.  $('#courses-cta, #courses-image').on('click', function(e) {
  1977.    dataLayer.push({
  1978.      'event': 'eventTracker',
  1979.      'eventCat':'marketing',
  1980.      'eventAct':'click',
  1981.      'eventLbl':'explore courses',
  1982.      'eventVal':0,
  1983.      'nonInteraction': 0,
  1984.    });
  1985.  });
  1986.  
  1987.  //GA event for "deij" CTA
  1988.  $('#deij-cta').on('click', function(e) {
  1989.    dataLayer.push({
  1990.      'event': 'eventTracker',
  1991.      'eventCat':'marketing',
  1992.      'eventAct':'click',
  1993.      'eventLbl':'2024 deij learn more',
  1994.      'eventVal':0,
  1995.      'nonInteraction': 0,
  1996.    });
  1997.  });
  1998.  
  1999. });
  2000. </script>
  2001.  
  2002. <script>
  2003. (function() {
  2004.  //Adelphic pixel on page load
  2005.  var adelphicPixel = new Image(1,1);
  2006.  adelphicPixel.src="https://ad.ipredictive.com/d/track/cvt/pixel?acct_id=58840&cache_buster=" + Math.floor(Date.now()/1000);
  2007. })();
  2008. </script>
  2009.  
  2010.  
  2011.  
  2012.  
  2013.  </main>
  2014.  
  2015.  
  2016.  <footer id="footer" class="footer">
  2017.    <div class="content">
  2018.  
  2019.      <div class="footer-main" aria-label="company info">
  2020.        <div class="footer-mainLeft">
  2021.          <div class="footer-mainLeftOne">
  2022.            <div class="footer-approach">
  2023.              <h2 class="footer-header"><a href="/about/">About O&rsquo;Reilly</a></h2>
  2024.              <ul class="footer-links">
  2025.                <li><a href="/work-with-us.html">Teach/write/train</a></li>
  2026.                <li><a href="/careers/">Careers</a></li>
  2027.                <li><a href="/press/">O&rsquo;Reilly news</a></li>
  2028.                <li><a href="/press/media-coverage.html">Media coverage</a></li>
  2029.                <li><a href="/partner/signup.csp">Community partners</a></li>
  2030.                <li><a href="/affiliates/">Affiliate program</a></li>
  2031.                <li><a href="/online-learning/rfp.html">Submit an RFP</a></li>
  2032.                <li><a href="/diversity/">Diversity</a></li>
  2033.                <li><a href="/content-marketing-solutions.html" id="footerSponsorshipLink">O&rsquo;Reilly for marketers</a></li>
  2034.              </ul>
  2035.            </div>
  2036.          </div>
  2037.          <div class="footer-mainLeftTwo">
  2038.            <div class="footer-contact">
  2039.              <h2 class="footer-header"><a href="/online-learning/support/">Support</a></h2>
  2040.  
  2041.              <ul class="footer-links">
  2042.                <li><a href="/about/contact.html">Contact us</a></li>
  2043.                <li><a href="/emails/newsletters/">Newsletters</a></li>
  2044.                <li><a href="/privacy.html">Privacy policy</a></li>
  2045.              </ul>
  2046.  
  2047.              <a href="https://www.linkedin.com/company/oreilly-media" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>linkedin-logo</title><path class="cls-1" d="M17.43,13.53v0l0,0ZM16.12,0A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0ZM11.77,22.92H8.12v-11h3.65ZM9.94,10.44h0a1.89,1.89,0,0,1-2-1.89A1.91,1.91,0,0,1,10,6.65a1.9,1.9,0,1,1,0,3.79Zm15,12.48H21.28V17.05c0-1.48-.53-2.49-1.85-2.49a2,2,0,0,0-1.88,1.34,2.63,2.63,0,0,0-.12.89v6.13H13.79s.05-10,0-11h3.64V13.5a3.63,3.63,0,0,1,3.29-1.82c2.4,0,4.21,1.57,4.21,4.95Z"/></svg></a>
  2048.              <a href="https://www.youtube.com/user/OreillyMedia" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>youtube-logo</title><path class="cls-1" d="M18.35,18.68a.89.89,0,0,0-.86.63V16.94h-1v7.59h1v-.59a.92.92,0,0,0,.89.74c.52,0,.86-.36,1-1.07a8.56,8.56,0,0,0,.14-1.9,10.47,10.47,0,0,0-.12-1.93C19.21,19.05,18.87,18.68,18.35,18.68Zm.09,4.14c-.05.52-.2.77-.45.77s-.43-.21-.49-.63a7.22,7.22,0,0,1,0-1c0-.72,0-1.14,0-1.26.07-.58.23-.88.51-.88s.4.27.46.79c0,.09,0,.47,0,1.13S18.46,22.71,18.44,22.82ZM8.61,18.19H9.86v6.34H11V18.19H12.2V16.94H8.61Zm7.71-6.12c.27,0,.43-.22.49-.66,0-.09,0-.45,0-1.07V9.78c0-.58,0-.93,0-1-.07-.43-.23-.65-.48-.65s-.41.19-.48.57a8.79,8.79,0,0,0,0,1v.53c0,.71,0,1.09,0,1.16C15.88,11.82,16.05,12.07,16.32,12.07Zm-1.74,10.4a2.92,2.92,0,0,1-.06.71c-.07.25-.2.37-.4.37s-.32-.11-.38-.34a2.63,2.63,0,0,1-.05-.66V18.83h-1v4.48c0,.91.33,1.37,1,1.37A1,1,0,0,0,14.6,24v.57h1v-5.7h-1Zm7.1-3.79a1.35,1.35,0,0,0-1.22.59,2.48,2.48,0,0,0-.3,1.07c0,.23,0,.61,0,1.16s0,1.13,0,1.37a2.93,2.93,0,0,0,.35,1.27,1.25,1.25,0,0,0,1.14.54,1.36,1.36,0,0,0,1.13-.45,2.29,2.29,0,0,0,.37-1.43s0-.07,0-.11v-.12h-1c0,.75-.17,1.12-.51,1.12s-.38-.18-.45-.56a4.68,4.68,0,0,1-.06-.9c0-.18,0-.31,0-.37h2v-.43a4.86,4.86,0,0,0-.3-2.11A1.28,1.28,0,0,0,21.68,18.68ZM22.15,21h-1c0-.05,0-.11,0-.16v-.08a1.64,1.64,0,0,1,.11-.8.39.39,0,0,1,.38-.23.42.42,0,0,1,.43.33,2.32,2.32,0,0,1,.07.7Zm-6-21A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0Zm2.51,7.2h1V11a2.52,2.52,0,0,0,.06.66c.06.23.18.34.38.34s.34-.12.41-.37a3.76,3.76,0,0,0,.05-.71V7.2h1v5.74h-1v-.57a1,1,0,0,1-.93.72c-.66,0-1-.46-1-1.38ZM15,8a1.29,1.29,0,0,1,1.33-.92A1.3,1.3,0,0,1,17.65,8a6.77,6.77,0,0,1,.23,2.1,6.77,6.77,0,0,1-.23,2.1,1.3,1.3,0,0,1-1.32.92A1.29,1.29,0,0,1,15,12.17a6.77,6.77,0,0,1-.23-2.1A6.86,6.86,0,0,1,15,8ZM11.45,5.3l.89,2.87.88-2.87H14.4L12.88,9.7v3.24h-1.1V9.7L10.24,5.3ZM24.93,23.91a3,3,0,0,1-3,3h-12a3,3,0,0,1-3-3V18.05a3,3,0,0,1,3-3h12a3,3,0,0,1,3,3Z"/></svg></a>
  2049.            </div>
  2050.  
  2051.            <div class="footer-international">
  2052.              <h2 class="footer-header">International</h2>
  2053.              <ul class="footer-links">
  2054.                <li><a href="https://www.oreilly.com/anz/">Australia &amp; New Zealand</a></li>
  2055.                <li><a href="https://oreilly.hk/">Hong Kong &amp; Taiwan</a></li>
  2056.                <li><a href="https://oreillylearning.in/">India</a></li>
  2057.                <li><a href="https://oreilly.id/">Indonesia</a></li>
  2058.                <li><a href="https://www.oreilly.co.jp/index.shtml">Japan</a></li>
  2059.              </ul>
  2060.            </div>
  2061.          </div>
  2062.        </div>
  2063.  
  2064.        <div class="footer-download" id="download-info">
  2065.          <h2 class="footer-header">Download the O&rsquo;Reilly App</h2>
  2066.  
  2067.          <p>Take O&rsquo;Reilly with you and learn anywhere, anytime on your phone <span class="nowrap">and tablet.</span></p>
  2068.  
  2069.          <div class="footer-downloadLinks">
  2070.            <a href="https://itunes.apple.com/us/app/safari-to-go/id881697395"><img src="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png" alt="Apple app store" /></a>
  2071.            <a href="https://play.google.com/store/apps/details?id=com.safariflow.queue"><img src="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png"  alt="Google play store" /></a>
  2072.          </div>
  2073.        </div>
  2074.  
  2075.        <div class="footer-download" id="tv-info">
  2076.          <h2 class="footer-header">Watch on your big screen</h2>
  2077.  
  2078.          <p>View all O&rsquo;Reilly videos, Superstream events, and Meet the Expert sessions on your <span class="nowrap">home TV.</span></p>
  2079.  
  2080.          <div class="footer-downloadLinks">
  2081.            <a href="https://channelstore.roku.com/details/c8a2d0096693eb9455f6ac165003ee06/oreilly"><img src="https://cdn.oreillystatic.com/oreilly/images/roku-tv-logo.png" alt="Roku Players and TVs" /></a>
  2082.            <a href="https://www.amazon.com/OReilly-Media-Inc/dp/B087YYHL5C/ref=sr_1_2?dchild=1&keywords=oreilly&qid=1604964116&s=mobile-apps&sr=1-2"><img src="https://cdn.oreillystatic.com/oreilly/images/amazon-appstore-logo.png"  alt="Amazon appstore" /></a>
  2083.          </div>
  2084.        </div>
  2085.        
  2086.        <div class="footer-donotsell" id="donotsell-info">
  2087.          <h2 class="footer-header"><a href="https://www.oreilly.com/privacy.html?donotsell=show">Do not sell or share my personal information</a></h2>
  2088.  
  2089.  
  2090.        </div>
  2091.      </div>
  2092.  
  2093.      <div class="footer-subfooter">
  2094.  
  2095.        <a href="https://www.oreilly.com" title="home page" aria-current="page">
  2096.          <img
  2097.          class="footer-subfooterLogo"
  2098.          id="footer-subfooterLogo"
  2099.          src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg"
  2100.          onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;"
  2101.          alt="O'Reilly home">
  2102.        </a>
  2103.  
  2104.        <p>&copy; 2024, O&rsquo;Reilly Media, Inc.  All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.</p>
  2105.        <p><a href="/terms/">Terms of service</a> &bull; <a href="/privacy.html">Privacy policy</a> &bull; <a href="/about/editorial_independence.html">Editorial independence</a><span class="transparencyStatement" style="display:none;"> &bull; <a href="/modern-slavery-act-transparency-statement.html">Modern Slavery Act Statement</a></span></p>
  2106.      </div>
  2107.  
  2108.    </div>
  2109.  </footer>
  2110.  
  2111.  <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
  2112.  
  2113.  <script>
  2114.  $(function() {
  2115.    //Toggle isActive and mobileHidden classes for mobileNavButton
  2116.    $('nav #mobileNavButton').on('click', function() {
  2117.      var expanded = $(this).attr('aria-expanded') === 'true' || false;
  2118.      $(this).attr('aria-expanded', !expanded);
  2119.      $(this).toggleClass("isActive");
  2120.      $(this).next().toggleClass("mobileHidden");
  2121.    });
  2122.  
  2123.    //Toggle isFocused class for keyboard navigation of submenus
  2124.    $('nav #menuList .menuList-subItem a').each(function(navItem) {
  2125.      $(this).on('focus', function() {
  2126.        $(this).parent().parent().toggleClass('isFocused');
  2127.      });
  2128.      $(this).on('blur', function() {
  2129.        $(this).parent().parent().toggleClass('isFocused');
  2130.      });
  2131.    });
  2132.  
  2133.    //Toggle mobileHidden class accordian elements
  2134.    $('.mobileAccordian').each(function() {
  2135.      var $btn = $(this).find('button');
  2136.      var $target =  $(this).next();
  2137.      $btn.on('click', function() {
  2138.        var expanded = $btn.attr('aria-expanded') === 'true' || false;
  2139.  
  2140.        $btn.attr('aria-expanded', !expanded);
  2141.        $target.toggleClass("mobileHidden");  
  2142.      });
  2143.    });
  2144.  
  2145.    //Search platform form action
  2146.    function searchSubmit(e) {
  2147.      e.preventDefault();
  2148.      sParameter = searchForm.search.value;
  2149.      sParameter = encodeURIComponent(sParameter.trim());
  2150.      sURL = searchForm.action + '?query=' + sParameter;
  2151.      window.location = sURL;
  2152.  
  2153.      //GA event for search
  2154.      dataLayer.push({
  2155.        'event': 'eventTracker',
  2156.        'eventCat':'site search',
  2157.        'eventAct':'search box',
  2158.        'eventLbl':'explore our content',
  2159.        'eventVal':0,
  2160.        'nonInteraction': 0,
  2161.      });
  2162.    }
  2163.    const searchForm = document.getElementById('js-searchForm');
  2164.    searchForm.addEventListener('submit', searchSubmit);
  2165.  
  2166.  
  2167.    //Search button action
  2168.    function showNavSearch(e) {
  2169.      $('.menuList-item-search').addClass('overlay');
  2170.      $('.menuList-item-search input#search').focus();
  2171.    }
  2172.    const searchButton = document.getElementById('js-searchButton');
  2173.    searchButton.addEventListener('click', showNavSearch);
  2174.  
  2175.  
  2176.    //Close search button action
  2177.    function hideNavSearch(e) {
  2178.      $('.menuList-item-search').removeClass('overlay');
  2179.    }
  2180.    const searchCloseButton = document.getElementById('js-searchCloseButton');
  2181.    searchCloseButton.addEventListener('click', hideNavSearch);
  2182.  
  2183.    //"Try Now" nav button tracking
  2184.    $('#nav-tryNow').on('click', function() {
  2185.      dataLayer.push({
  2186.        'event': 'eventTracker',
  2187.        'eventCat':'marketing',
  2188.        'eventAct':'nav',
  2189.        'eventLbl':'try now',
  2190.        'eventVal':0,
  2191.        'nonInteraction': 0,
  2192.      });
  2193.    });
  2194.  
  2195.    //"Sign in" nav button tracking
  2196.    $('#nav-signIn').on('click', function() {
  2197.      dataLayer.push({
  2198.        'event': 'eventTracker',
  2199.        'eventCat':'marketing',
  2200.        'eventAct':'nav',
  2201.        'eventLbl':'sign in',
  2202.        'eventVal':0,
  2203.        'nonInteraction': 0,
  2204.      });
  2205.    });
  2206.  
  2207.    //"O'Reilly Platform" nav button tracking
  2208.    $('#nav-platform').on('click', function() {
  2209.      dataLayer.push({
  2210.        'event': 'eventTracker',
  2211.        'eventCat':'marketing',
  2212.        'eventAct':'nav',
  2213.        'eventLbl':'oreilly platform',
  2214.        'eventVal':0,
  2215.        'nonInteraction': 0,
  2216.      });
  2217.    });
  2218.  
  2219.  });
  2220.  
  2221.  (function(document, history, location) {
  2222.    var HISTORY_SUPPORT = !!(history && history.pushState);
  2223.    FIXED_HEADER_HEIGHT = document.querySelector('body > header').offsetHeight;
  2224.    FIXED_HEADER_HEIGHT += 20;
  2225.    var anchorScrolls = {
  2226.      ANCHOR_REGEX: /^#[^ ]+$/,
  2227.      OFFSET_HEIGHT_PX: FIXED_HEADER_HEIGHT,
  2228.  
  2229.      /**
  2230.       * Establish events, and fix initial scroll position if a hash is provided.
  2231.       */
  2232.      init: function() {
  2233.        this.scrollToCurrent();
  2234.        window.addEventListener('hashchange', this.scrollToCurrent.bind(this));
  2235.        document.body.addEventListener('click', this.delegateAnchors.bind(this));
  2236.      },
  2237.  
  2238.      /**
  2239.       * Return the offset amount to deduct from the normal scroll position.
  2240.       * Modify as appropriate to allow for dynamic calculations
  2241.       */
  2242.      getFixedOffset: function() {
  2243.        return this.OFFSET_HEIGHT_PX;
  2244.      },
  2245.  
  2246.      /**
  2247.       * If the provided href is an anchor which resolves to an element on the
  2248.       * page, scroll to it.
  2249.       * @param  {String} href
  2250.       * @return {Boolean} - Was the href an anchor.
  2251.       */
  2252.      scrollIfAnchor: function(href, pushToHistory) {
  2253.        var match, rect, anchorOffset;
  2254.  
  2255.        if(!this.ANCHOR_REGEX.test(href)) {
  2256.          return false;
  2257.        }
  2258.  
  2259.        match = document.getElementById(href.slice(1));
  2260.  
  2261.        if(match) {
  2262.          rect = match.getBoundingClientRect();
  2263.          anchorOffset = window.pageYOffset + rect.top - this.getFixedOffset();
  2264.          // Wait 1ms and scroll. It wasn't consistently scrolling immediately.
  2265.          setTimeout(function(){
  2266.            window.scroll(window.pageXOffset, anchorOffset);
  2267.          }, 1);
  2268.  
  2269.          // Add the state to history as-per normal anchor links
  2270.          if(HISTORY_SUPPORT && pushToHistory) {
  2271.            history.pushState({}, document.title, location.pathname + href);
  2272.          }
  2273.        }
  2274.  
  2275.        return !!match;
  2276.      },
  2277.  
  2278.      /**
  2279.       * Attempt to scroll to the current location's hash.
  2280.       */
  2281.      scrollToCurrent: function() {
  2282.        this.scrollIfAnchor(window.location.hash);
  2283.      },
  2284.  
  2285.      /**
  2286.       * If the click event's target was an anchor, fix the scroll position.
  2287.       */
  2288.      delegateAnchors: function(e) {
  2289.        var elem = e.target;
  2290.  
  2291.        if(
  2292.          elem.nodeName === 'A' &&
  2293.          this.scrollIfAnchor(elem.getAttribute('href'), true)
  2294.        ) {
  2295.          e.preventDefault();
  2296.        }
  2297.      }
  2298.    };
  2299.  
  2300.    window.addEventListener(
  2301.      'DOMContentLoaded', anchorScrolls.init.bind(anchorScrolls)
  2302.    );
  2303.  })(window.document, window.history, window.location);
  2304.  </script><script type="text/javascript"  src="/_-oqbO/JGd/EXg/YxeKXX87/3Q3ztGXh8mN5/WV47agRFFAY/akM/qA2B8R10"></script></body>
  2305.  
  2306.  
  2307. </html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda