PageSourceSearch

https://netninja.dev/

html netninja.dev collected 2026-09-25 14:13:52 UTC 169,871 bytes, 2,790 lines download raw bytes

1
2
3
4<!DOCTYPE html>
5<html>
6  <head>
7    <meta charset="UTF-8">
8<link href='https://static-media.hotmart.com/f5pF3gJTzHwnN0UEldmT-TGncqs=/32x32/https://uploads.teachablecdn.com/attachments/74Qen9KRSCyUt3TsZpeP_logo.png' rel='icon' type='image/png'>
9
10<link href='https://static-media.hotmart.com/pIlt26CzCpTgXUUxmBWMn6jX1jI=/72x72/https://uploads.teachablecdn.com/attachments/74Qen9KRSCyUt3TsZpeP_logo.png' rel='apple-touch-icon' type='image/png'>
11
12<link href='https://static-media.hotmart.com/j6yjpnUFlvh8yUGH54HM_N3tsh4=/144x144/https://uploads.teachablecdn.com/attachments/74Qen9KRSCyUt3TsZpeP_logo.png' rel='apple-touch-icon' type='image/png'>
13
14<link href='https://assets.teachablecdn.com/splash-images/teachable-apple-startup-image.png' rel='apple-touch-startup-image' type='image/png'>
15
16<link href='https://assets.teachablecdn.com/splash-images/teachable-apple-startup-image_2x.png' rel='apple-touch-startup-image' type='image/png'>
17
18<meta name='apple-mobile-web-app-capable' content='yes' />
19<meta name="csrf-param" content="authenticity_token" />
20<meta name="csrf-token" content="SteixyNfMhuI4A5yVd3Ic-DMISinPGzOixYEidhlxVDlrzTRACXHmzSZkJJLvulcWwX-NW1yGpZp7nx2X9X7ow" />
21<script src="https://releases.transloadit.com/uppy/v4.18.0/uppy.min.js"></script>
21<link rel="stylesheet" href="https://releases.transloadit.com/uppy/v4.18.0/uppy.min.css" />
22<style type='text/css'>:root{--brand_primary: #252525;--brand_secondary: #D91B42;--brand_heading: #dddddd;--brand_text: #bbbbbb;--brand_navbar_text: #ffffff;--brand_navbar_fixed_text: #ffffff;--brand_homepage_heading: #ffffff;--brand_course_heading: #ffffff;--brand_video_player_color: #616161;--favicon_url: https://uploads.teachablecdn.com/attachments/74Qen9KRSCyUt3TsZpeP_logo.png;--font_family:OpenSans;} @font-face {
23  font-family: 'OpenSans';
24  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Italic.eot");
25  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Italic.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Italic.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Italic.ttf") format("truetype");
26  font-weight: normal;
27  font-style: italic;
28  font-display: swap; }
29
30@font-face {
31  font-family: 'OpenSans';
32  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Light.eot");
33  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Light.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Light.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Light.ttf") format("truetype");
34  font-weight: 300;
35  font-style: normal;
36  font-display: swap; }
37
38@font-face {
39  font-family: 'OpenSans';
40  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-ExtraboldItalic.eot");
41  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-ExtraboldItalic.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-ExtraboldItalic.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-ExtraboldItalic.ttf") format("truetype");
42  font-weight: 800;
43  font-style: italic;
44  font-display: swap; }
45
46@font-face {
47  font-family: 'OpenSans';
48  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-BoldItalic.eot");
49  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-BoldItalic.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-BoldItalic.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-BoldItalic.ttf") format("truetype");
50  font-weight: bold;
51  font-style: italic;
52  font-display: swap; }
53
54@font-face {
55  font-family: 'OpenSans';
56  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-SemiboldItalic.eot");
57  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-SemiboldItalic.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-SemiboldItalic.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-SemiboldItalic.ttf") format("truetype");
58  font-weight: 600;
59  font-style: italic;
60  font-display: swap; }
61
62@font-face {
63  font-family: 'OpenSans';
64  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Bold.eot");
65  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Bold.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Bold.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Bold.ttf") format("truetype");
66  font-weight: bold;
67  font-style: normal;
68  font-display: swap; }
69
70@font-face {
71  font-family: 'OpenSans';
72  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Extrabold.eot");
73  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Extrabold.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Extrabold.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Extrabold.ttf") format("truetype");
74  font-weight: 800;
75  font-style: normal;
76  font-display: swap; }
77
78@font-face {
79  font-family: 'OpenSans';
80  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Semibold.eot");
81  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Semibold.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Semibold.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans-Semibold.ttf") format("truetype");
82  font-weight: 600;
83  font-style: normal;
84  font-display: swap; }
85
86@font-face {
87  font-family: 'OpenSans';
88  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSansLight-Italic.eot");
89  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSansLight-Italic.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSansLight-Italic.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSansLight-Italic.ttf") format("truetype");
90  font-weight: 300;
91  font-style: italic;
92  font-display: swap; }
93
94@font-face {
95  font-family: 'OpenSans';
96  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans.eot");
97  src: url("//assets.teachablecdn.com/fonts/open-sans/OpenSans.eot?#iefix") format("embedded-opentype"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans.woff") format("woff"), url("//assets.teachablecdn.com/fonts/open-sans/OpenSans.ttf") format("truetype");
98  font-weight: normal;
99  font-style: normal;
100  font-display: swap; }
101</style>
102<link rel="stylesheet" href="https://fedora.teachablecdn.com/assets/pages-ffbb57f0e392071e4b5eded8d46c3a9ab5a2e074a30cf14d403b6ff91a59ca36.css" />
103<style></style>
104<title>Net Ninja Home - Coding Courses &amp; Tutorials | Net Ninja</title>
105<link rel="canonical" href="https://netninja.dev/p/home">
106<meta property="og:image" content="https://uploads.teachablecdn.com/attachments/zSQUf9aERqjD
106of3P4l3Q_logo.png">
107<meta property="og:title" content="Net Ninja Home - Coding Courses &amp; Tutorials">
108<meta property="og:type" content="website">
109<meta property="og:url" content="https://netninja.dev/p/home">
110<meta name="brand_video_player_color" content="#616161">
111<meta name="site_title" content="Net Ninja">
112<link rel="preconnect" href="https://fast.wistia.com" crossorigin>
113<script src='https://fast.wistia.com/assets/external/E-v1.js' defer></script>
vendor: 96 bytes, lines 113-122
113
114<script
115  src='https://www.recaptcha.net/recaptcha/api.js'
116  async
117  defer></script>
118
119
120
121
122      
122<meta name="asset_host" content="https://fedora.teachablecdn.com">
123     
123<script src="https://fedora.teachablecdn.com/packs/pages--03b814707840c70a8dee.js"></script>
123
124<meta id='iris-url' data-iris-url=https://eventable.internal.teachable.com />
125<script type="text/javascript">
126  window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=document.createElement("script");r.type="text/javascript",r.async=!0,r.src="https://cdn.heapanalytics.com/js/heap-"+e+".js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(r,a);for(var n=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","resetIdentity","removeEventProperty","setEventProperties","track","unsetEventProperty"],o=0;o<p.length;o++)heap[p[o]]=n(p[o])},heap.load("318805607");
127  window.heapShouldTrackUser = true;
128</script>
128
129
130
131<script type="text/javascript">
132  var _user_id = ''; // Set to the user's ID, username, or email address, or '' if not yet known.
133  var _session_id = 'ff73cea193175ce9e527c809f2e28523'; // Set to a unique session ID for the visitor's current browsing session.
134
135  var _sift = window._sift = window._sift || [];
136  _sift.push(['_setAccount', '2e541754ec']);
137  _sift.push(['_setUserId', _user_id]);
138  _sift.push(['_setSessionId', _session_id]);
139  _sift.push(['_trackPageview']);
140
141  (function() {
142    function ls() {
143      var e = document.createElement('script');
144      e.src = 'https://cdn.sift.com/s.js';
145      document.body.appendChild(e);
146    }
147    if (window.attachEvent) {
148      window.attachEvent('onload', ls);
149    } else {
150      window.addEventListener('load', ls, false);
151    }
152  })();
153</script>
153
154
155
156<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
157<link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
158<link rel="preconnect" href="https://fonts.gstatic.com">
159
160<link rel="preconnect" href="https://fonts.googleapis.com">
161<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
162<link href="https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap" rel="stylesheet">
163
164<link href="https://res.cloudinary.com/net-ninja/raw/upload/v1685104106/Net%20Ninja%20Pro/styles/styles_2.24.css" rel="stylesheet">
165<link href="https://res.cloudinary.com/net-ninja/raw/upload/v1777459506/Net%20Ninja%20Pro/styles/product-page.v1_csehwq.css" rel="stylesheet">
166
167<script>
168window.addEventListener('DOMContentLoaded', function() {
169	// link active class
170	const path = window.location.pathname;
171	const links = document.querySelectorAll('.navbar__menu ul li > a');
172	links.forEach(link => {
173        if(link.getAttribute('href') == path){
174            link.classList.add('current-page');
175        }
176	})
177	
178    // banner button target
179    const bannerBtn = document.querySelector('.blocks-page-homepage_v2 a');
180    if (bannerBtn) {
181        bannerBtn.setAttribute('target', '_self')
182    }
183});
184</script>
184
185
186<!-- facebook meta tag -->
187<meta name="facebook-domain-verification" content="e9hxxcdfr5f3o9zm2zbkq27fg27ch4" />
188
189<!-- custom facebook event trackinh -->
190<script type="text/javascript">
191
192  document.addEventListener('DOMContentLoaded', () => {
193    
194    const pro_monthly = document.querySelector('#prosignup a[href="https://net-ninja-pro.teachable.com/purchase?product_id=3021318"]');
195    const pro_yearly = document.querySelector('#prosignup a[href="https://net-ninja-pro.teachable.com/purchase?product_id=3021316"]');
196    
197    if (pro_monthly) {
198      pro_monthly.addEventListener('click', () => {
199        
200        fbq('track', 'InitiateCheckout', {currency: "GBP", value: 7.00});
201        console.log('tracking event');
202      })
203    }
204   
205    if (pro_yearly) {
206      pro_yearly.addEventListener('click', () => {
207        fbq('track', 'InitiateCheckout', {currency: "GBP", value: 69.00});
208        console.log('tracking event');
209      })
210    }
211    
212  }, false);
213
214</script>
214
215
216
217
218
219<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 219-220
219
220<script async src="https://www.googletagmanager.com/gtag/js?id=
220G-SL8LSCXHSV
vendor: 12 bytes, line 220
220"></script>
221<script>
222  
vendor: 134 bytes, lines 222-226
222window.dataLayer = window.dataLayer || [];
223  function gtag(){dataLayer.push(arguments);}
224  gtag('js', new Date());
225
226  gtag('config', '
226G-SL8LSCXHSV
vendor: 93 bytes, lines 226-230
226', {
227    'user_id': '',
228    'school_id': '925908',
229    'school_domain': 'netninja.dev'
230  });
231</script>
231
232
233<script async src="https://www.googletagmanager.com/gtag/js"></script>
vendor: 1 bytes, line 233
233
234<script>
235  window.dataLayer = window.dataLayer || [];
236  function gtag(){dataLayer.push(arguments);}
237  gtag('set', 'linker', {'domains': ['netninja.dev', 'sso.teachable.com', 'checkout.teachable.com']});
238  gtag('js', new Date());
239
240  var gtag_integration = 'G-J0QZEBL62D'
241  gtag('config', 'G-J0QZEBL62D', { 'groups': 'GA4' });
242</script>
242
243<!-- Facebook Pixel Code -->
244<script>
245  var ownerPixelId = '1808395779552411'
246  !function(f,b,e,v,n,t,s)
247  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
248  n.callMethod.apply(n,arguments):n.queue.push(arguments)};
249  if(!f.fbq)f.fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
250  n.queue=[];t=b.createElement(e);t.async=!0;
251  t.src=v;s=b.getElementsByTagName(e)[0];
252  s.parentNode.insertBefore(t,s)}(window, document,'script',
253  'https://connect.facebook.net/en_US/fbevents.js');
254  fbq('dataProcessingOptions', ['LDU'], 0, 0);
255  fbq('init', '1808395779552411');
256  fbq('track', 'PageView');
257</script>
257
258<noscript>
259  <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1808395779552411&ev=PageView&noscript=1"/>
260</noscript>
261
262<!-- End Facebook Pixel Code -->
263
264
265  </head>
266  <body class="revamped_lecture_player">
267          <meta http-content='IE=Edge' http-equiv='X-UA-Compatible'>
268<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"NRBR-08e3a2ada38dc55a529","applicationID":"1065063193","transactionName":"dAxdTUFZXVQEQh0VBFAGQBZBWV5M","queueTime":0,"applicationTime":151,"agent":""}</script>
vendor: 1 bytes, line 268
268
269<script type="text/javascript">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:"1103368431",accountID:"4102727",trustKey:"27503",xpid:"UAcHU1FRDxABVFdXBwcEV10C",licenseKey:"NRBR-08e3a2ada38dc55a529",applicationID:"1065063193",browserID:"1103368431"};;/*! For license information please see nr-loader-spa-1.322.0.min.js.LICENSE.txt */
270(()=>{var e={8122(e,t,r){"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),s=0===Object.keys(r).length?e:r;for(let a in s)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):e[a]instanceof Map||e[a]instanceof Set||e[a]instanceof Date||e[a]instanceof RegExp?r[a]=e[a]:"object"==typeof e[a]&&null!==t[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){r[a]||(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555(e,t,r){"use strict";r.d(t,{f:()=>a});var n=r(384),i=r(8122);const s={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0};function a(e){try{return!!e.licenseKey&&!!e.errorBeacon&&!!e.applicationID}catch(e){return!1}}r.d(t,["D",0,e=>(0,i.a)(e,s)])},7699(e,t,r){"use strict";var n=r(860);const i={[n.K7.logging]:!0,[n.K7.genericEvents]:!0,[n.K7.jserrors]:!0,[n.K7.ajax]:!0};r.d(t,["It",0,1e6,"KC",0,i,"qh",0,"SESSION_ERROR"])},9324(e,t,r){"use strict";r.d(t,["A",0,"@newrelic/rrweb","x",0,"1.322.0"])},981(e,t,r){"use strict";r.d(t,["R",0,{AJAX:"AjaxRequest",PA:"PageAction",UA:"UserAction",BP:"BrowserPerformance",WS:"WebSocket",SPV:"SecurityPolicyViolation",JSE:"JavaScriptError",LOG:"Log",PVE:"PageView",PVT:"PageViewTiming",SR:"SessionReplay",ST:"SessionTrace",BI:"BrowserInteraction"}])},9752(e,t,r){"use strict";const n="newrelic-iframe-",i=n+"timing-update",s=n+"api",a=n+"api-response",o=n+"vitals-update",c=n+"ajax";r.d(t,["$8",0,o,"Gi",0,a,"KU",0,c,"Pl",0,n,"cS",0,s,"cr",0,i])},6154(e,t,r){"use strict";var n=r(1863);const i="undefined"!=typeof window&&!!window.document,s="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),o=Boolean("hidden"===a?.document?.visibilityState),c=""+a?.location,d=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=d&&"undefined"==typeof SharedWorker,l=(()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),f=Date.now()-(0,n.t)();r.d(t,["OF",0,d,"RI",0,i,"WN",0,f,"bv",0,s,"gm",0,a,"lR",0,l,"m",0,c,"mw",0,o,"sb",0,u,"zk",0,()=>{const e=a?.performance?.getEntriesByType?.("navigation")?.[0];if(e&&e.responseStart>0&&e.responseStart<a.performance.now())return e}])},7295(e,t,r){"use strict";r.d(t,{Xv:()=>a,gX:()=>i,iW:()=>s});var n=[];function i(e){if(!e||s(e))return!1;if(0===n.length)return!0;if("*"===n[0].hostname)return!1;for(var t=0;t<n.length;t++){var r=n[t];if(r.hostname.test(e.hostname)&&r.pathname.test(e.pathname))return!1}return!0}function s(e){return void 0===e.hostname}function a(e){if(n=[],e&&e.length)for(var t=0;t<e.length;t++){let r=e[t];if(!r)continue;if("*"===r)return void(n=[{hostname:"*"}]);0===r.indexOf("http://")?r=r.substring(7):0===r.indexOf("https://")&&(r=r.substring(8));const i=r.indexOf("/");let s,a;i>0?(s=r.substring(0,i),a=r.substring(i)):(s=r,a="*");let[c]=s.split(":");n.push({hostname:o(c),pathname:o(a,!0)})}}function o(e,t=!1){const r=e.replace(/[.+?^${}()|[\]\\]/g,e=>"\\"+e).replace(/\*/g,".*?");return new RegExp((t?"^":"")+r+"$")}},3241(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(6154);function i(e={}){try{n.gm.dispatchEvent(new CustomEvent("newrelic",{detail:e}))}catch(e){}}},1687(e,t,r){"use strict";r.d(t,{Ak:()=>o,Ze:()=>d,x3:()=>c});var n=r(3241),i=r(3606),s=r(860),a=r(2646);function o(e,t){if(!e)return;const r={staged:!1,priority:s.P3[t]||0};
270e.runtime.drainRegistry.get(t)||e.runtime.drainRegistry.set(t,r)}function c(e,t){if(!e)return;const r=e.runtime.drainRegistry;r&&(r.get(t)&&r.delete(t),l(e,t,!1),r.size&&u(e))}function d(e,t="feature",r=!1){if(e){if(!e.runtime.drainRegistry.get(t)||r)return l(e,t);e.runtime.drainRegistry.get(t).staged=!0,u(e)}}function u(e){if(!e)return;const t=Array.from(e.runtime.drainRegistry);t.every(([e,t])=>t.staged)&&(t.sort((e,t)=>e[1].priority-t[1].priority),t.forEach(([t])=>{e.runtime.drainRegistry.delete(t),l(e,t)}))}function l(e,t,r=!0){if(!e)return;const s=e.ee,o=i.i.handlers;if(s&&!s.aborted&&s.backlog&&o){if((0,n.W)({type:"lifecycle",name:"drain",feature:t}),r){const e=s.backlog[t],r=o[t];if(r){for(let t=0;e&&t<e.length;++t)f(e[t],r);Object.entries(r).forEach(([e,t])=>{Object.values(t||{}).forEach(t=>{t[0]?.on&&t[0].context()instanceof a.y&&!t[0].listeners(e).includes(t[1])&&t[0].on(e,t[1])})})}}s.isolatedBacklog||delete o[t],s.backlog[t]=null,s.emit("drain-"+t,[])}}function f(e,t){var r=e[1];Object.values(t[r]||{}).forEach(t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],s=e[2];n.apply(i,s)}})}},7836(e,t,r){"use strict";var n=r(384),i=r(8990),s=r(2646),a=r(5607);const o="nr@context:".concat(a.W),c=function e(t,r){var n={},a={},u={},l=!1;try{l=16===r.length&&d.initializedAgents?.[r]?.runtime.isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,s){!1!==s&&(s=!0);if(c.aborted&&!i)return;t&&s&&t.emit(e,r,n);var o=h(n);g(e).forEach(e=>{e.apply(o,r)});var d=v()[a[e]];d&&d.push([f,e,r,o]);return o},get:m,listeners:g,context:h,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach(([e,n])=>{a[n]=t,t in r||(r[t]=[])})},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach(e=>{delete f.backlog[e]})},isBuffering:function(e){return!!v()[a[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function h(e){return e&&e instanceof s.y?e:e?(0,i.I)(e,o,()=>new s.y(o)):new s.y(o)}function p(e,t){n[e]=g(e).concat(t)}function g(e){return n[e]||[]}function m(t){return u[t]=u[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),d=(0,n.Zm)();d.ee||(d.ee=c),r.d(t,["P",0,o,"ee",0,c])},2646(e,t,r){"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908(e,t,r){"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,s){s?(s.buffer([e],i),s.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606(e,t,r){"use strict";r.d(t,{i:()=>s});var n=r(9908);s.on=a;var i=s.handlers={};function s(e,t,r,s){a(s||n.d,i,e,t,r)}function a(e,t,r,i,s){s||(s="feature"),e||(e=n.d);var a=t[s]=t[s]||{};(a[r]=a[r]||[]).push([e,i])}},3878(e,t,r){"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function s(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>s,jT:()=>n,sp:()=>i})},5607(e,t,r){"use strict";const n=(0,r(9566).bz)();r.d(t,["W",0,n])},9566(e,t,r){"use strict";r.d(t,{LA:()=>a,ZF:()=>o,bz:()=>s,el:()=>c});var n=r(6154);function i(e,t){return e?15&e[t]:16*Math.random()|0}function s(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").map(e=>"x"===e?i(t,r++).toString(16):"y"===e?(3&i()|8).toString(16):e).join("")}function a(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,s=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var o=0;o<e;o++)a.push(i(r,s++).toString(16));return a.join("")}function o(){return a(16)}function c(){return a(32)}},2614(e,t,r){"use strict";r.d(t,["BB",0,18e5,"Wt",0,"NRBA_SESSION::","g",0,{OFF:0,FULL:1,ERROR:2},"iL",0,{SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},"tS",0,{STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},"wk",0,144e5])},733(e,t,r){"use strict";function n(e,t){return function(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}("".concat(String(e),":").concat(String(t)))}r.d(t,{Y:()=>n})},1863(e,t,r){"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},9119(e,t,r){"use strict";r.d(t,{L:()=>s});var n=/([^?#]*)[^#]*(#[^?]*|$).*/,i=/([^?#]*)().*/;function s(e,t){return e?e.replace(t?n:i,"$1$2"):e}},7485(e,t,r){"use strict";r.d(t,{D:()=>i});var n=r(6154);function i(e){if(0===(e||"").indexOf("data:"))return{protocol:"data"};try{const t=new URL(e,location.href),r={port:t.port,hostname:t.hostname,pathname:t.pathname,search:t.search,protocol:t.protocol.slice(0,t.protocol.indexOf(":")),sameOrigin:t.protocol===n.gm?.location?.protocol&&t.host===n.gm?.location?.host};return r.port&&""!==r.port||("http:"===t.protocol&&(r.port="80"),"https:"===t.protocol&&(r.port="443")),r.pathname&&""!==r.pathname?r.pathname.startsWith("/")||(r.pathname="/".concat(r.pathname)):r.pathname="/",r}catch(e){return{}}}},7866(e,t,r){"use strict";r.d(t,["Nc",0,/^\s*at Function code \(Function code:\d+:\d+\)\s*/i,"cn",0,/^\s*(?:([^@]*)(?:\(.*?\))?@)?((?:file|http|https|chrome|safari-extension).*?):(\d+)(?::(\d+))?\s*$/i,"fL",0,/^\s*at .+ \(eval at \S+ \((?:(?:file|http|https):[^)]+)?\)(?:, [^:]*:\d+:\d+)?\)$/i,"h3",0,/function (.+?)\s*\(/,"hB",0,/^\s*at (?:((?:\[object object\])?(?:[^(]*\([^)]*\))*[^()]*(?: \[as \S+\])?) )?\(?((?:file|http|https|chrome-extension):.*?)?:(\d+)(?::(\d+))?\)?\s*$/i])},944(e,t,r){"use strict";r.d(t,{R:()=>i});var n=r(3241);function i(e,t){"function"==typeof console.debug&&(console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t),(0,n.W)({drained:null,type:"data",name:"warn",feature:"warn",data:{code:e,secondary:t}}))}},8990(e,t,r){"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389(e,t,r){"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout(()=>{i=clearTimeout(i)},t)),n||(clearTimeout(i),i=setTimeout(()=>{e.apply(this,r)},t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},1910(e,t,r){"use strict";r.d(t,{i:()=>s});var n=r(944);const i=new Map;function s(...e){return e.every(e=>{if(i.has(e))return i.get(e);const t="function"==typeof e?e.toString():"",r=t.includes("[native code]"),s=t.includes("nrWrapper");return r||s||(0,n.R)(64,e?.name||t),i.set(e,r),r})}},3304(e,t,r){"use strict";r.d(t,{A:()=>i});var n=r(7836);function i(e){try{return JSON.stringify(e,(()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}})())??""}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}return""}}},9232(e,t,r){"use strict";r.d(t,["f",0,{MFE:"MFE",BA:"BA"}])},7560(e,t,r){"use strict";r.d(t,{N:()=>a,j:()=>c});var n=r(9119),i=r(944);const s=(0,r(6389).J)(e=>(0,i.R)(80,e));function a(e){if(!Array.isArray(e?.assets)||!e.assets.length)return;
270const t=e.assets.map(o).filter(Boolean);return t.length?{assets:t,scripts:t.filter(e=>e.isScript)}:void 0}function o(e){if(!e||"object"!=typeof e)return;const{matcher:t,type:r}=e;let i="string"==typeof t&&t.endsWith(".js");return void 0!==r&&(!function(e){return"script"===e||"asset"===e}(r)?s(r):i=function(e){return"script"===e}(r)),a=t,"[object RegExp]"===Object.prototype.toString.call(a)?{pattern:t,test:e=>(t.lastIndex=0,t.test((0,n.L)(e))),isScript:i}:"string"==typeof t&&t.length>0?{pattern:t,test:e=>(0,n.L)(e).includes(t),isScript:i}:void s(t);var a}function c(e,t,{scriptsOnly:r=!1}={}){if(!e||!t)return!1;return(r?e.scripts:e.assets).some(e=>e.test(t))}},5718(e,t,r){"use strict";r.d(t,{xo:()=>T,AZ:()=>v,cI:()=>g,Qr:()=>A,QL:()=>y});var n=r(6154),i=r(1863),s=r(9119),a=r(7866);class o{dom=new c;performance=new c;constructor(e){this.url=e,this.claimedBy=new Set}get script(){const e=Math.max(this.dom.start,this.performance.end);return{start:e,end:Math.max(this.dom.end,this.performance.end,e)}}}class c{start=0;end=0;value=void 0}function d(e=()=>{},t){return{get:()=>void 0!==t?t:e(),set:e=>{t=e}}}let u;try{u=v(y())[0]}catch(e){u=v(e)[0]}const l=new Map;let f=[];const h=new WeakMap;function p(e){let t=h.get(e);return t||(t={weighedAssetUrls:new Set,recordManifestScriptWindow:(t,r)=>{t&&(e.scriptStart=e.scriptStart>0?Math.min(e.scriptStart,t):t),r&&(e.scriptEnd=e.scriptEnd>0?Math.max(e.scriptEnd,r):r)}},h.set(e,t)),t}function g(e){return l.get(e)}function m(e){const t=g(e);
270if(t)return t;const r=new o(e);if(l.set(e,r),l.size>1e3){const e=l.keys().next().value;l.delete(e)}return r}if(n.gm.MutationObserver&&n.gm.document){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{if("SCRIPT"===e.nodeName&&e.src){const t=m((0,s.L)(e.src));t.dom.start=(0,i.t)(),t.dom.value=e;const r=()=>{t.dom.end=(0,i.t)()};["load","error"].forEach(t=>e.addEventListener(t,r,{once:!0}))}})})}).observe(n.gm.document,{childList:!0,subtree:!0})}if(n.gm.PerformanceObserver?.supportedEntryTypes.includes("resource")){new PerformanceObserver(e=>{e.getEntries().forEach(e=>{if((e=>"script"===e.initiatorType||["link","fetch"].includes(e.initiatorType)&&(0,s.L)(e.name).endsWith(".js"))(e)){const t=m((0,s.L)(e.name));t.performance.start=Math.floor(e.startTime),t.performance.end=Math.floor(e.responseEnd),t.performance.value=e}if(!f.length)return;const t=[];f.forEach(({test:r,addedAt:n},s)=>{(r(e)||(0,i.t)()-n>1e4)&&t.push(s)}),f=f.filter((e,r)=>!t.includes(r))})}).observe({type:"resource",buffered:!0})}function v(e){if(!e||"string"!=typeof e)return[];const t=new Set,r=e.split("\n");for(const e of r){const r=e.match(a.cn)||e.match(a.hB)||e.match(a.fL);if(r&&r[2])t.add((0,s.L)(r[2]));else{const r=e.match(/\(([^)]+\.js):\d+:\d+\)/)||e.match(/^\s+at\s+([^\s(]+\.js):\d+:\d+/);r&&r[1]&&t.add((0,s.L)(r[1]))}}return[...t]}function y(){let e;try{const t=Error.stackTraceLimit;Error.stackTraceLimit=50,e=(new Error).stack,Error.stackTraceLimit=t}catch(t){e=(new Error).stack}return e}function b(e,t){return(0,s.L)(e.name)===t}function E(e,t){e.fetchStart=Math.floor(t.startTime),e.fetchEnd=Math.floor(t.responseEnd),e.asset=t.name,e.type=t.initiatorType,w(e,t)}function w(e,t){const r=(0,s.L)(t.name),{weighedAssetUrls:n}=p(e);n.has(r)||(n.add(r),e.totalWeight=(e.totalWeight||0)+(t.transferSize||0),"blocking"===t.renderBlockingStatus?e.renderBlocking=!0:"non-blocking"===t.renderBlockingStatus&&!0!==e.renderBlocking&&(e.renderBlocking=!1))}function R(e,t,r,n,i){if(w(e,t),"scripts"!==i&&"all"!==i)return;if("all"===i||r.isScript){const r=Math.floor(t.startTime),n=Math.floor(t.responseEnd);e.fetchStart=e.fetchStart>0?Math.min(e.fetchStart,r):r,e.fetchEnd=e.fetchEnd>0?Math.max(e.fetchEnd,n):n}if(r.isScript){const r=g((0,s.L)(t.name));if(r){const t=()=>{const{start:t,end:n}=r.script;p(e).recordManifestScriptWindow(t,n)};t(),!r.dom.end&&r.dom.value&&["load","error"].forEach(e=>r.dom.value.addEventListener(e,t,{once:!0}))}n.resolved||(e.asset=t.name,e.type=t.initiatorType,n.resolved=!0)}}function T(e,t){const r=t?.manifest;if(!r||!r.assets.length)return;const s={resolved:!1},a=new Set(r.assets);(n.gm.performance?.getEntriesByType("resource")||[]).forEach(r=>{const n=[...a].find(e=>e.test(r.name));n&&(R(e,r,n,s,t.timingMethod),a.delete(n))}),a.size&&function(e,t,r,s){n.gm.PerformanceObserver?.supportedEntryTypes?.includes("resource")&&f.push({addedAt:(0,i.t)(),test:n=>{const i=[...t].find(e=>e.test(n.name));return i&&(R(e,n,i,r,s),t.delete(i)),0===t.size}})}(e,a,s,t.timingMethod)}function A(e){const t=e?.id,r={registeredAt:(0,i.t)(),reportedAt:void 0,fetchStart:0,fetchEnd:0,scriptStart:0,scriptEnd:0,asset:void 0,type:"unknown",totalWeight:0,renderBlocking:void 0},a=y();if(!a)return r;const o=n.gm.performance?.getEntriesByType("navigation")?.[0]?.name||"";try{const e=v(a),c=(e.length>1?e.filter(e=>u!==e):e)[0];if(!c)return r;if(o.includes(c))return r.asset=(0,s.L)(o),r.type="inline",r;r.correlation=g(c);const l=r.correlation?.performance.value||n.gm.performance?.getEntriesByType("resource")?.find(e=>b(e,c));if(l)E(r,l);else{(function(e){if(!e||!n.gm.document)return!1;try{const t=n.gm.document.querySelectorAll('link[rel="preload"][as="script"]');for(const r of t)if((0,s.L)(r.href)===e)return!0}catch(e){}return!1})(c)&&(r.asset=c,r.type="preload"),function(e,t){n.gm.PerformanceObserver?.supportedEntryTypes?.includes("resource")&&f.push({addedAt:(0,i.t)(),test:r=>!!b(r,t)&&(E(e,r),!0)})}(r,c)}const h=r.correlation,m=!!t&&!!h?.claimedBy.has(t);h&&t&&h.claimedBy.add(t);const y=()=>{const e=h?.script.start;if(!m||!e)return!1;return r.registeredAt-e>1e4};let w=0,R=0;p(r).recordManifestScriptWindow=(e,t)=>{e&&(w=w>0?Math.min(w,e):e),t&&(R=R>0?Math.max(R,t):t)},Object.defineProperty(r,"scriptStart",d(()=>{const e=y()?r.registeredAt:h?.script.start??r.fetchEnd;return w>0?Math.min(e,w):e})),Object.defineProperty(r,"scriptEnd",d(()=>{const e=y()?r.registeredAt:h?.script.end??r.registeredAt;return R>0?Math.max(e,R):e}))}catch(e){}return r}},5732(e,t,r){"use strict";r.d(t,{$5:()=>m,B5:()=>g,K6:()=>u,M$:()=>
270o,Ms:()=>d,NG:()=>c,Ux:()=>h,YA:()=>p,yx:()=>l});var n=r(5718),i=r(7560),s=r(9119),a=r(9232);function o(e){return e?.type===a.f.MFE}function c(e,t){if(!y(e,t))return;const r=t.runtime.registeredEntities;return r?.find(t=>t.metadata.target.iframeInterfaceId===e)}function d(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities;return r?.filter(t=>String(t.metadata.target.id)===String(e)).map(e=>e.metadata.target)||[]}function u(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities,n=(0,s.L)(e),a=r?.filter(t=>{const r=t.metadata.target?.manifest;return r?(0,i.j)(r,e,{scriptsOnly:!1}):!!t.metadata.timings?.asset&&(0,s.L)(t.metadata.timings.asset)===n});return f(a).map(e=>e.metadata.target)}function l(e,t){if(!y(e,t))return[];const r=t.runtime.registeredEntities,n=r?.filter(t=>{const r=t.metadata.target?.manifest;return r?(0,i.j)(r,e,{scriptsOnly:!0}):!!t.metadata.timings?.asset?.endsWith(e)});return f(n).map(e=>e.metadata.target)}function f(e){if(!e?.length)return e||[];const t=new Map,r=[];for(const n of e){const e=n.metadata?.timings?.asset;if(!e){r.push(n);continue}const i="".concat(e,"::").concat(n.metadata?.target?.id),s=t.get(i);if(s){if(s.metadata.target?.blocked&&!n.metadata.target?.blocked){const e=r.indexOf(s);-1!==e&&(r[e]=n),t.set(i,n)}}else t.set(i,n),r.push(n)}return r}function h(e,t){return v(t)?o(e)?e.attributes:t.agentRef.runtime.v2Target.attributes:{}}function p(e,t){return g(e,t)?{"child.id":e.id,"child.type":e.type,...h(void 0,t)}:{}}function g(e,t){return o(e)&&!!v(t)&&t.agentRef.init.api.register.duplicate_data_to_container}function m(e){if(!e?.runtime)return[];if(!y(!0,e)||!e.runtime.registeredEntities?.length)return[e.runtime.v2Target];const t=[];try{var r=(0,n.AZ)((0,n.QL)());let i=r.length-1;for(;r[i];)t.push(...l(r[i--],e))}catch(e){}const i=function(e){const t=new Set,r=[];for(const n of e){const e=n?.instance;t.has(e)||(t.add(e),r.push(n))}return r}(t);return i.length||i.push(e.runtime.v2Target),i}function v(e){return 2===e?.harvestEndpointVersion}function y(e,t){return!!e&&!!t?.init.api.register.enabled}},5289(e,t,r){"use strict";r.d(t,{GG:()=>a,Qr:()=>c,sB:()=>o});var n=r(3878),i=r(6389);function s(){return"undefined"==typeof document||"complete"===document.readyState}function a(e,t){if(s())return e();const r=(0,i.J)(e),a=setInterval(()=>{s()&&(clearInterval(a),r())},500);(0,n.sp)("load",r,t)}function o(e){if(s())return e();(0,n.DD)("DOMContentLoaded",e)}function c(e){if(s())return e();(0,n.sp)("popstate",e)}},384(e,t,r){"use strict";r.d(t,{Zm:()=>c,bQ:()=>u,dV:()=>d,pV:()=>l});var n=r(6154),i=r(1863),s=r(944),a=r(1910);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function c(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function d(){let e=c();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate||n.gm.setInterval,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket},(0,a.i)(...Object.values(e.o))),e}function u(e,t){let r=c();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t,2===Object.keys(r.initializedAgents).length&&(0,s.R)(69)}function l(){return function(){let e=c();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=c();const t=e.init||{};e.init={...t}}(),d(),function(){let e=c();const t=e.loader_config||{};e.loader_config={...t}}(),c()}r.d(t,["NT",0,o])},2843(e,t,r){"use strict";r.d(t,{G:()=>s,u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)},r,i)}function s(e,t,r){(0,n.sp)("pagehide",e,t,r)}},8139(e,t,r){"use strict";r.d(t,{u:()=>f});var n=r(7836),i=r(3434),s=r(8990),a=r(6154);const o={},c=a.gm.XMLHttpRequest,d="addEventListener",u="removeEventListener",l="nr@wrapped:".concat(n.P);function f(e,t){var r=function(e){return(e||n.ee).get("events")}(e);if(o[r.debugId]++)return r;o[r.debugId]=1;var f=(0,i.YM)(r,!0,t);function p(e){f.inPlace(e,[d,u],"-",g)}function g(e,t){return e[1]}return"getPrototypeOf"in Object&&(a.RI&&h(document,p),c&&h(c.prototype,p),h(a.gm,p)),r.on(d+"-start",function(e,t){var r=e[1];if(null!==r&&("function"==typeof r||"object"==typeof r)&&"newrelic"!==e[0]){var n=(0,s.I)(r,l,function(){var e={object:function(){if("function"!=typeof r.handleEvent)return;return r.handleEvent.apply(r,arguments)},function:r}[typeof r];return e?f(e,"fn-",null,e.name||"anonymous"):r});this.wrapped=e[1]=n}}),r.on(u+"-start",function(e){e[1]=this.wrapped||e[1]}),r}function h(e,t,...r){let n=e;for(;"object"==typeof n&&!Object.prototype.hasOwnProperty.call(n,d);)n=Object.getPrototypeOf(n);n&&t(n,...r)}},3434(e,t,r){"use strict";r.d(t,{YM:()=>d});var n=r(7836),i=r(5607),s=r(5732);const a="nr@original:".concat(i.W);var o=Object.prototype.hasOwnProperty,c=!1;function d(e,t,r){return e||(e=n.ee),i.inPlace=function(e,t,r,n,s,a){r||(r="");const o="-"===r.charAt(0);for(let c=0;c<t.length;c++){const d=t[c],u=e[d];l(u)||(e[d]=i(u,o?d+r:r,n,d,s,a))}},i.flag=a,i;function i(t,n,i,c,f,h){return l(t)?t:(n||(n=""),nrWrapper[a]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach(function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})}),t}catch(e){u([e],r)}for(var n in e)o.call(e,n)&&(t[n]=e[n])}
270(t,nrWrapper,e),nrWrapper);function nrWrapper(){var a,o,l,p;let g,m;try{o=this,a=[...arguments],m=h?(0,s.$5)(r):[r?.runtime?.v2Target],l="function"==typeof i?i(a,o):i||{}}catch(t){u([t,"",[a,o,c],l],e)}d(n+"start",[a,o,c,m],l,f);const v=performance.now();let y;try{return p=t.apply(o,a),y=performance.now(),p}catch(e){throw y=performance.now(),d(n+"err",[a,o,e,m],l,f),g=e,g}finally{const e=y-v,t={start:v,end:y,duration:e,isLongTask:e>=50,methodName:c,thrownError:g};t.isLongTask&&d("long-task",[t,o,m],l,f),d(n+"end",[a,o,p,m],l,f)}}}function d(r,n,i,s){if(!c||t){var a=c;c=!0;try{e.emit(r,n,i,t,s)}catch(t){u([t,r,n,i],e)}c=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[a])}r.d(t,["Jt",0,a])},9300(e,t,r){"use strict";const n=r(860).K7.ajax;r.d(t,["TZ",0,n,"f5",0,"ajaxRequest.id","mo",0,{NONE:"none",FAILURES:"failures",ALL:"all"}])},3333(e,t,r){"use strict";var n=r(981);const i=r(860).K7.genericEvents,s=[n.R.PA,n.R.UA,n.R.BP];r.d(t,["$v",0,{RESOURCES:"experimental.resources",REGISTER:"register"},"TZ",0,i,"Zp",0,["auxclick","click","copy","keydown","paste","scrollend"],"kd",0,s,"qN",0,["focus","blur"]])},6774(e,t,r){"use strict";const n=r(860).K7.jserrors;r.d(t,["T",0,n])},993(e,t,r){"use strict";const n=r(860).K7.logging;r.d(t,["A$",0,{OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,TRACE:5},"TZ",0,n,"p_",0,{ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"}])},3785(e,t,r){"use strict";r.d(t,{R:()=>c,b:()=>d});var n=r(9908),i=r(1863),s=r(860),a=r(3969),o=r(993);function c(e,t,r={},c=o.p_.INFO,d=!0,u,l=(0,i.t)()){(0,n.p)(a.xV,["API/logging/".concat(c.toLowerCase(),"/called")],void 0,s.K7.metrics,e),(0,n.p)("log",[l,t,r,c,d,u],void 0,s.K7.logging,e)}function d(e){return"string"==typeof e&&Object.values(o.p_).some(t=>t===e.toUpperCase().trim())}},3969(e,t,r){"use strict";const n=r(860).K7.metrics;r.d(t,["TZ",0,n,"XG",0,"storeEventMetrics","xV",0,"storeSupportabilityMetrics"])},6630(e,t,r){"use strict";const n=r(860).K7.pageViewEvent;r.d(t,["T",0,n])},782(e,t,r){"use strict";const n=r(860).K7.pageViewTiming;r.d(t,["T",0,n])},6344(e,t,r){"use strict";var n=r(2614);const i=r(860).K7.sessionReplay,s={[n.g.ERROR]:15e3,[n.g.FULL]:3e5,[n.g.OFF]:0}
270;r.d(t,["Qb",0,{API:"api",RESUME:"resume",SWITCH_TO_FULL:"switchToFull",INITIALIZE:"initialize",PRELOAD:"preload"},"TZ",0,i,"Vh",0,"errorDuringReplay","_s",0,{DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5},"bc",0,{RESET:{message:"Session was reset",sm:"Reset"},IMPORT:{message:"Recorder failed to import",sm:"Import"},TOO_MANY:{message:"429: Too Many Requests",sm:"Too-Many"},TOO_BIG:{message:"Payload was too large",sm:"Too-Big"},CROSS_TAB:{message:"Session Entity was set to OFF on another tab",sm:"Cross-Tab"},ENTITLEMENTS:{message:"Session Replay is not allowed and will not be started",sm:"Entitlement"}},"yP",0,s])},5270(e,t,r){"use strict";r.d(t,{Aw:()=>a,SR:()=>s,rF:()=>o});var n=r(384),i=r(7767);function s(e){return!!(0,n.dV)().o.MO&&(0,i.V)(e)&&!0===e?.session_trace.enabled}function a(e){return!0===e?.session_replay.preload&&s(e)}function o(e,t){try{if("string"==typeof t?.type&&"password"===t.type.toLowerCase())return"*".repeat(e?.length||0);if(void 0!==t?.dataset?.nrUnmask||t?.classList?.contains("nr-unmask"))return e}catch(e){}return"string"==typeof e?e.replace(/[\S]/g,"*"):"*".repeat(e?.length||0)}},3738(e,t,r){"use strict";const n=r(860).K7.sessionTrace,i="-start",s="-end",a="fn"+i,o="fn"+s;r.d(t,["He",0,"bstResource","Kp",0,s,"Lc",0,o,"Rz",0,"pushState","TZ",0,n,"bD",0,"resource","bc",0,{CROSS_TAB:{message:"Session Entity was set to OFF on another tab"},ENTITLEMENTS:{message:"Session Trace is not allowed and will not be started"},RESET:{message:"Session was reset"},SESSION_CHANGED:{message:"Session identifier changed unexpectedly"}},"d3",0,i,"uP",0,a])},3962(e,t,r){"use strict";const n=r(860).K7.softNav;r.d(t,["O2",0,{INITIAL_PAGE_LOAD:"",ROUTE_CHANGE:1,UNSPECIFIED:2},"OV",0,"popstate","Qu",0,{INTERACTION:1,AJAX:2,CUSTOM_END:3,CUSTOM_TRACER:4},"TZ",0,n,"ih",0,{IP:"in progress",PF:"pending finish",FIN:"finished",CAN:"cancelled"},"pP",0,"initialPageLoad","tC",0,["click","keydown","submit"]])},4234(e,t,r){"use strict";r.d(t,{W:()=>i});var n=r(1687);class i{constructor(e,t){this.agentRef=e,this.ee=e?.ee,this.featureName=t,this.blocked=!1}deregisterDrain(){(0,n.x3)(this.agentRef,this.featureName)}}},7767(e,t,r){"use strict";var n=r(6154);r.d(t,["V",0,e=>n.RI&&!0===e?.privacy.cookies_enabled])},8362(e,t,r){"use strict";r.d(t,{d:()=>s});var n=r(9566),i=r(1741);class s extends i.W{agentIdentifier=(0,n.LA)(16)}},1741(e,t,r){"use strict";r.d(t,{W:()=>s});var n=r(944),i=r(4261);class s{#e(e,...t){if(this[e]!==s.prototype[e])return this[e](...t);(0,n.R)(35,e)}addPageAction(e,t){return this.#e(i.hG,e,t)}register(e){return this.#e(i.eY,e)}recordCustomEvent(e,t){return this.#e(i.fF,e,t)}setPageViewName(e,t){return this.#e(i.Fw,e,t)}setCustomAttribute(e,t,r){return this.#e(i.cD,e,t,r)}noticeError(e,t){return this.#e(i.o5,e,t)}setUserId(e,t=!1){return this.#e(i.Dl,e,t)}setApplicationVersion(e){return this.#e(i.nb,e)}setErrorHandler(e){return this.#e(i.bt,e)}addRelease(e,t){return this.#e(i.k6,e,t)}log(e,t){return this.#e("log",e,t)}start(){return this.#e("start")}finished(e){return this.#e(i.BL,e)}recordReplay(){return this.#e(i.CH)}pauseReplay(){return this.#e(i.Tb)}addToTrace(e){return this.#e(i.U2,e)}setCurrentRouteName(e){return this.#e(i.PA,e)}interaction(e){return this.#e(i.dT,e)}wrapLogger(e,t,r){return this.#e(i.Wb,e,t,r)}measure(e,t){return this.#e(i.V1,e,t)}consent(e){return this.#e(i.Pv,e)}}},4261(e,t,r){"use strict";r.d(t,["BL",0,"finished","CH",0,"recordReplay","Dl",0,"setUserId","Fw",0,"setPageViewName","PA",0,"setCurrentRouteName","Pv",0,"consent","Tb",0,"pauseReplay","U2",0,"addToTrace","V1",0,"measure","Wb",0,"wrapLogger","bt",0,"setErrorHandler","cD",0,"setCustomAttribute","dT",0,"interaction","eY",0,"register","fF",0,"recordCustomEvent","hG",0,"addPageAction","hw",0,"api-ixn-","k6",0,"addRelease","nb",0,"setApplicationVersion","o5",0,"noticeError"])},1738(e,t,r){"use strict";r.d(t,{U:()=>l,Y:()=>u});var n=r(3241),i=r(9908),s=r(1863),a=r(944),o=r(3969),c=r(8362),d=r(860);function u(e,t,r,s){const u=s||r;!u||u[e]&&u[e]!==c.d.prototype[e]||(u[e]=function(){(0,i.p)(o.xV,["API/"+e+"/called"],void 0,d.K7.metrics,r.ee),(0,n.W)({drained:!!r.runtime?.activatedFeatures,type:"data",name:"api",feature:"api-"+e,data:{}});try{return t.apply(this,arguments)}catch(e){(0,a.R)(23,e)}})}function l(e,t,r,n,a){const o=e.info;null===r?delete o.jsAttributes[t]:o.jsAttributes[t]=r,(a||null===r)&&(0,i.p)("api-"+n,[(0,s.t)(),t,r],void 0,"session",e.ee)}},8374(e,t,r){r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860(e,t,r){"use strict";const n="events",i="jserrors",s="browser/blobs",a="browser/logs",o={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations"},c={[o.pageViewEvent]:1,[o.pageViewTiming]:2,[o.metrics]:3,[o.jserrors]:4,[o.softNav]:5,[o.ajax]:6,[o.sessionTrace]:7,[o.sessionReplay]:8,[o.logging]:9,[o.genericEvents]:10},d={[o.pageViewEvent]:"rum",[o.pageViewTiming]:n,[o.ajax]:n,[o.softNav]:n,[o.metrics]:i,[o.jserrors]:i,[o.sessionTrace]:s,[o.sessionReplay]:s,[o.logging]:a,[o.genericEvents]:"ins"};r.d(t,["$J",0,d,"K7",0,o,"P3",0,c,"XX",0,i,"Yy",0,a,"df",0,s,"hg",0,"connect"])}};const t={};function r(n){const i=t[n];if(void 0!==i)return i.exports;const s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}r.m=e,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var i=t[n++],s=t[n++];r.o(e,i)?0===s&&n++:0===s?Object.defineProperty(e,i,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,i,{enumerable:!0,get:s})}else for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>({212:"nr-spa-compressor",238:"nr-spa-iframe-message-handler",249:"nr-spa-recorder",478:"nr-spa"}[e]+"-1.322.0.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="NRBA-1.322.0.PROD:";r.l=(n,i,s,a)=>
270{if(e[n])return void e[n].push(i);let o,c;if(void 0!==s){const e=document.getElementsByTagName("script");for(var d=0;d<e.length;d++){const r=e[d];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+s){o=r;break}}}if(!o){c=!0;var u={478:"sha512-SARROoir04gFygxlr/+mTI+PyMeFL+epi1vnUA2G5mTQ7s3G44ItQBJKbOaIMdIE5OBzuaKhb4k5JYta0NICxg==",249:"sha512-6DKQo5WP7YlpzX6l9UfYkgGLGK2oITdoaYTcZtgl5Foa22NY63lED/0z1hBBLeD7qZCz/YdlY19/r8drlol1tg==",212:"sha512-CYxuvSpDx6ErqWJwAvpoHn54eY37YdMcFao/axOumlw3BsSL7yioOeB2LWViY/Njs818sQG10dSglUhYCMfLPw==",238:"sha512-mvbMILWa3ohYst+u6TLfNrmtY2swUIB3rbJFN/uzt3W62KhgvUVwB81UEZ1R0/it5bfrQ5EVz864pi/CAmucNQ=="};o=document.createElement("script"),o.charset="utf-8",r.nc&&o.setAttribute("nonce",r.nc),o.setAttribute("data-webpack",t+s),o.src=n,0!==o.src.indexOf(window.location.origin+"/")&&(o.crossOrigin="anonymous"),u[a]&&(o.integrity=u[a])}e[n]=[i];const l=(t,r)=>{o.onerror=o.onload=null,clearTimeout(f);const i=e[n];if(delete e[n],o.parentNode?.removeChild(o),i?.forEach(e=>e(r)),t)return t(r)},f=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),c&&document.head.appendChild(o)}})(),r.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="https://js-agent.newrelic.com/",(()=>{const e={38:0,788:0};r.f.j=(t,n)=>{let i=r.o(e,t)?e[t]:void 0;if(0!==i)if(i)n.push(i[2]);else{const s=new Promise((r,n)=>i=e[t]=[r,n]);n.push(i[2]=s);const a=r.p+r.u(t),o=new Error,c=n=>{if(r.o(e,t)&&(i=e[t],0!==i&&(e[t]=void 0),i)){const e=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;o.message="Loading chunk "+t+" failed: ("+e+": "+r+")",o.name="ChunkLoadError",o.type=e,o.request=r,i[1](o)}};r.l(a,c,"chunk-"+t,t)}};const t=(t,n)=>{let[i,s,a]=n;var o,c,d=0;if(i.some(t=>0!==e[t])){for(o in s)r.o(s,o)&&(r.m[o]=s[o]);if(a)a(r)}for(t&&t(n);d<i.length;d++)c=i[d],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0},n=self["webpackChunk:NRBA-1.322.0.PROD"]=self["webpackChunk:NRBA-1.322.0.PROD"]||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),(()=>{"use strict";r(8374);var e=r(8362),t=r(860);const n=Object.values(t.K7);var i=r(384),s=r(1741);var a=r(2555),o=r(3333),c=r(9300);const d=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var u=r(2614),l=r(944),f=r(8122);const h="[data-nr-mask]",p=e=>(0,f.a)(e,(()=>{const e={feature_flags:[],experimental:{register:!1,resources:!1,iframe_bridge:!1,iframe_domains:[]},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0,capture_payloads:c.mo.NONE},api:{register:{get enabled(){return e.feature_flags.includes(o.$v.REGISTER)||e.experimental.register},set enabled(t){e.experimental.register=t},duplicate_data_to_container:!1,get allow_iframe_bridge(){return e.feature_flags.includes(o.$v.IFRAME_BRIDGE)||e.experimental.iframe_bridge},set allow_iframe_bridge(t){e.experimental.iframe_bridge=t},get iframe_domains(){return e.experimental.iframe_domains},set iframe_domains(t){Array.isArray(t)?e.experimental.iframe_domains=t:(0,l.R)(1,t)}}},browser_consent_mode:{enabled:!1},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1,capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o.$v.RESOURCES)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:u.wk,inactiveMs:u.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inl
270ine_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){d(t)?e.mask_selector="".concat(t,",").concat(h):""===t||null===t?e.mask_selector=h:(0,l.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){d(t)?e.block_selector+=",".concat(t):""!==t&&(0,l.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,l.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]},web_sockets:{enabled:!1}}})());var g=r(6154),m=r(9324);let v=0;const y={buildEnv:"PROD",distMethod:"CDN",version:m.x,originTime:g.WN},b={consented:!1},E={activatedFeatures:void 0,appMetadata:{},configured:!1,get consented(){return this.session?.state?.consent||b.consented},set consented(e){b.consented=e},customTransaction:void 0,denyList:[],disabled:!1,drainRegistry:new Map,connector:void 0,harvester:void 0,v2Target:void 0,isolatedBacklog:!1,isRecording:!1,loaderType:void 0,maxBytes:3e4,obfuscator:void 0,onerror:void 0,ptid:void 0,releaseIds:{},session:void 0,timeKeeper:void 0,registeredEntities:[],jsAttributesMetadata:{bytes:0},get harvestCount(){return++v},listeningForIframeMessages:!1};var w=r(9232);var R=r(7836),T=r(3241);const A={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0};var S=r(9908),x=r(9752);function O(e,t={},n,o){let{init:c,info:d,loader_config:u,runtime:l={},exposed:h=!0}=t;if(!d){const e=(0,i.pV)();c=e.init,d=e.info,u=e.loader_config}var m;e.init=p(c||{}),e.loader_config=(m=u||{},(0,f.a)(m,A)),d.jsAttributes??={},g.bv&&(d.jsAttributes.isWorker=!0),e.info=(0,a.D)(d);const v=e.init;e.runtime??=(e=>{const t=(0,f.a)(e,E),r=Object.keys(y).reduce((e,t)=>(e[t]={value:y[t],writable:!1,configurable:!0,enumerable:!0},e),{});return Object.defineProperties(t,r)})(l),e.runtime.v2Target??={type:w.f.BA,instance:e.agentIdentifier,get id(){return e.runtime.appMetadata?.agents?.[0]?.entityGuid},get attributes(){return{"entity.guid":this.id,appId:e.info.applicationID}}},v.proxy.assets&&(e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e})(v.proxy.assets),e.runtime.configured||(Object.defineProperty(e,"beacons",{get:()=>[e.info.beacon,e.info.errorBeacon,e.init.proxy.assets,e.init.proxy.beacon].filter(Boolean)}),Object.defineProperty(e.runtime,"denyList",{get:()=>[...e.init.ajax.deny_list||[],...e.init.ajax.block_internal?e.beacons:[]]}),e.runtime.ptid=e.agentIdentifier,function(e){const t=(0,i.pV)();Object.getOwnPropertyNames(s.W.prototype).forEach(r=>{const n=s.W.prototype[r];if("function"!=typeof n||"constructor"===n)return;let i=t[r];e[r]&&!1!==e.exposed&&"micro-agent"!==e.runtime?.loaderType&&(t[r]=(...t)=>{const n=e[r](...t);return i?i(...t):n})})}(e),e.runtime.loaderType=n,e.ee=R.ee.get(e.agentIdentifier),e.exposed=h,(0,T.W)({drained:!!e.runtime.activatedFeatures,type:"lifecycle",name:"initialize",feature:void 0,data:e.config}),e.init.api.register.allow_iframe_bridge&&g.gm.addEventListener("message",t=>{"string"==typeof t.data?.type&&t.data.type.startsWith(x.Pl)&&(0,S.p)("iframe-message",[t],void 0,"IFRAME",e.ee)}),e.runtime.configured=!0)}var _=r(1863),k=r(4261),N=r(1738);var L=r(1687),M=r(4234),P=r(5289),I=r(5270),j=r(7767),C=r(6389),D=r(7699);const B=new WeakSet,H=new WeakMap;class W extends M.W{constructor(e,t){super(e,t),this.abortHandler=void 0,this.featAggregate=void 0,this.loadedSuccessfully=void 0,this.onAggregateImported=new Promise(e=>{this.loadedSuccessfully=e}),this.deferred=Promise.resolve(),!1===e.init[this.featureName].autoStart?this.deferred=new Promise((t,r)=>{this.ee.on("manual-start-all",(0,C.J)(()=>{(0,L.Ak)(e,this.featureName),t()}))}):(0,L.Ak)(e,t)}importAggregator(e,t,n={}){if(this.featAggregate)return;const i=async()=>{if(await this.deferred,this.#t(e),!(0,a.f)(e.info))return(0,l.R)(43),e.ee.abort(),void this.loadedSuccessfully(!1);try{await async function(e,t,n){if(H.has(e))return H.get(e);const i=(async()=>
270{if((0,j.V)(e.init))try{const{setupAgentSession:t}=await r.e(478).then(r.bind(r,8766));t(e)}catch(e){(0,l.R)(20,e),t.emit("internal-error",[e]),(0,S.p)(D.qh,[e],void 0,n,t)}if(e.init.api.register.allow_iframe_bridge)try{const{setupIframeMFEMessageListener:t}=await r.e(238).then(r.bind(r,6417));t(e)}catch(e){(0,l.R)(23,e)}const[{Connector:i},{Harvester:s}]=await Promise.all([r.e(478).then(r.bind(r,6589)),r.e(478).then(r.bind(r,5237))]);e.runtime.connector=new i(e),e.runtime.harvester=new s(e);const a=Object.values(e.features).filter(t=>e.runtime.drainRegistry.has(t.featureName));Promise.all(a.map(e=>e.onAggregateImported)).then(()=>e.runtime.harvester.startTimer())})();H.set(e,i),await i}(e,this.ee,this.featureName)}catch(e){return(0,l.R)(79,e),this.ee.abort(),void this.loadedSuccessfully(!1)}try{if(!this.#r(this.featureName,e.runtime.session,e.init))return this.abortHandler?.(),(0,L.Ze)(this.agentRef,this.featureName),void this.loadedSuccessfully(!1);const{Aggregate:r}=await t();this.featAggregate=new r(e,n),e.runtime.harvester.initializedAggregates.push(this.featAggregate),this.loadedSuccessfully(!0)}catch(e){(0,l.R)(34,e),this.abortHandler?.(),(0,L.Ze)(this.agentRef,this.featureName,!0),this.loadedSuccessfully(!1)}};g.RI?(0,P.GG)(()=>i(),!0):i()}#r(e,r,n){if(this.blocked)return!1;switch(e){case t.K7.sessionReplay:return(0,I.SR)(n)&&!!r;case t.K7.sessionTrace:return!!r;default:return!0}}#t(e){if(!B.has(e)&&(B.add(e),!(0,a.f)(e.info))){const t=(0,i.pV)();let r={...t.info?.jsAttributes};try{r={...r,...e.info?.jsAttributes}}catch(e){}O(e,{...t,info:{...t.info,jsAttributes:r},runtime:e.runtime},e.runtime.loaderType)}}}var U=r(6630);class K extends W{static featureName=U.T;constructor(e){var t;super(e,U.T),this.setupInspectionEvents(),t=e,(0,N.Y)(k.Fw,function(e,r){"string"==typeof e&&("/"!==e.charAt(0)&&(e="/"+e),t.runtime.customTransaction=(r||"http://custom.transaction")+e,(0,S.p)("api-"+k.Fw,[(0,_.t)()],void 0,void 0,t.ee))},t),this.importAggregator(e,()=>e.init.feature_flags.includes("rum_v2")?r.e(478).then(r.bind(r,908)):r.e(478).then(r.bind(r,7927)))}setupInspectionEvents(){const e=(e,t)=>{e&&(0,T.W)({timeStamp:e.timeStamp,loaded:"complete"===e.target.readyState,type:"window",name:t,data:e.target.location+""})};(0,P.sB)(t=>{e(t,"DOMContentLoaded")}),(0,P.GG)(t=>{e(t,"load")}),(0,P.Qr)(t=>{e(t,"navigate")}),this.ee.on(u.tS.UPDATE,(e,t)=>{(0,T.W)({type:"lifecycle",name:"session",data:t})})}}class F extends e.d{constructor(e){var t;(super(),g.gm)?(this.features={},(0,i.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(K),O(this,e,e.loaderType||"agent"),t=this,(0,N.Y)(k.cD,function(e,r,n=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof r)||null===r)return(0,N.U)(t,e,r,k.cD,n);(0,l.R)(40,typeof r)}else(0,l.R)(39,typeof e)},t),function(e){(0,N.Y)(k.Dl,function(t,r=!1){if("string"!=typeof t&&null!==t)return void(0,l.R)(41,typeof t);const n=e.info.jsAttributes["enduser.id"];r&&null!=n&&n!==t?(0,S.p)("api-setUserIdAndResetSession",[t],void 0,"session",e.ee):(0,N.U)(e,"enduser.id",t,k.Dl,!0)},e)}(this),function(e){(0,N.Y)(k.nb,function(t){if("string"==typeof t||null===t)return(0,N.U)(e,"application.version",t,k.nb,!1);(0,l.R)(42,typeof t)},e)}(this),function(e){(0,N.Y)("start",function(){e.ee.emit("manual-start-all")},e)}(this),function(e){(0,N.Y)(k.Pv,function(t=!0){if("boolean"==typeof t){if((0,S.p)("api-"+k.Pv,[t],void 0,"session",e.ee),e.runtime.consented=t,t){const t=e.features.page_view_event;t.onAggregateImported.then(e=>{const r=t.featAggregate;e&&!r.sentRum&&r.sendRum?.()})}}else(0,l.R)(65,typeof t)},e)}(this),this.run()):(0,l.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}get api(){return this}run(){try{const e=function(e){const t={};return n.forEach(r=>{t[r]=!!e[r]?.enabled}),t}(this.init),r=[...this.desiredFeatures],i=this.init.feature_flags.includes("rum_v2");r.sort((e,r)=>t.P3[e.featureName]-t.P3[r.featureName]),r.forEach(r=>{if(!e[r.featureName]&&(i||r.featureName!==t.K7.pageViewEvent))return;const n=function(e){switch(e){case t.K7.ajax:return[t.K7.jserrors];case t.K7.sessionTrace:return[t.K7.ajax,t.K7.pageViewEvent];case t.K7.sessionReplay:return[t.K7.sessionTrace];case t.K7.pageViewTiming:return[t.K7.pageViewEvent];default:return[]}}(r.featureName).filter(e=>!(e in this.features));n.length>0&&(0,l.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)})}catch(e){(0,l.R)(22,e);for(const e in this.features)this.features[e].abortHandler?.();const t=(0,i.Zm)();delete t.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return t.ee.get(this.agentIdentifier).abort(),!1}}}var V=r(2843),z=r(782);class G extends W{static featureName=z.T;constructor(e){super(e,z.T),g.RI&&((0,V.u)(()=>(0,S.p)("docHidden",[(0,_.t)()],void 0,z.T,this.ee),!0),(0,V.G)(()=>(0,S.p)("winPagehide",[(0,_.t)()],void 0,z.T,this.ee)),this.importAggregator(e,()=>r.e(478).then(r.bind(r,9917))))}}var q=r(3969);class Y extends W{static featureName=q.TZ;constructor(e){super(e,q.TZ),this.importAggregator(e,()=>r.e(478).then(r.bind(r,6555)))}}var Z=r(6774),J=r(3878),X=r(3304);class Q{constructor(e,t,r,n,i){this.name="UncaughtError",this.message="string"==typeof e?e:(0,X.A)(e),this.sourceURL=t,this.line=r,this.column=n,this.__newrelic=i}}function ee(e){return ne(e)?e:new Q(void 0!==e?.message?e.message:e,e?.filename||e?.sourceURL,e?.lineno||e?.line,e?.colno||e?.col,e?.__newrelic,e?.cause)}function te(e){const t="Unhandled Promise Rejection: ";if(!e?.reason)return;if(ne(e.reason)){try{e.reason.message.startsWith(t)||(e.reason.message=t+e.reason.message)}catch(e){}return ee(e.reason)}const r=ee(e.reason);return(r.message||"").startsWith(t)||(r.message=t+r.message),r}function re(e){if(e.error instanceof SyntaxError&&!/:\d+$/.test(e.error.stack?.trim())){const t=new Q(e.message,e.filename,e.lineno,e.colno,e.error.__newrelic,e.cause);return t.name=SyntaxError.name,t}return ne(e.error)?e.error:ee(e)}function ne(e){return e instanceof Error&&!!e.stack}function ie(e,r,n,i,s=(0,_.t)()){"string"==typeof e&&(e=new Error(e)),(0,S.p)("err",[e,s,!1,r,n.runtime.isRecording,void 0,i],void 0,t.K7.jserrors,n.ee),(0,S.p)("uaErr",[],void 0,t.K7.genericEvents,n.ee)}var se=r(993),ae=r(3785);function oe(e,{customAttributes:t={},level:r=se.p_.INFO}={},n,i,s=(0,_.t)()){(0,ae.R)(n.ee,e,t,r,!1,i,s)}function ce(e,r,n,i,s=(0,_.t)()){(0,S.p)("api-"+k.hG,[s,e,r,i],void 0,t.K7.genericEvents,n.ee)}function de(e,r,n,i,s=(0,_.t)()){const{start:a,end:o,customAttributes:c}=r||{},d={customAttributes:c||{}};if("object"!=typeof d.customAttributes||"string"!=typeof e||0===e.length)return void(0,l.R)(57);const u=(e,t)=>
270null==e?t:"number"==typeof e?e:e instanceof PerformanceMark?e.startTime:Number.NaN;if(d.start=u(a,0),d.end=u(o,s),Number.isNaN(d.start)||Number.isNaN(d.end))(0,l.R)(57);else{if(d.duration=d.end-d.start,!(d.duration<0))return(0,S.p)("api-"+k.V1,[d,e,i],void 0,t.K7.genericEvents,n.ee),d;(0,l.R)(58)}}function ue(e,r={},n,i,s=(0,_.t)()){(0,S.p)("api-"+k.fF,[s,e,r,i],void 0,t.K7.genericEvents,n.ee)}var le=r(5718);const fe=(e,t)=>e?.nrMfeId===t.id&&(!e?.nrMfeObserved||e?.nrMfeObserved===t.instance),he=e=>{try{return g.gm.CSS.escape(e)}catch(t){return e}},pe=(e,t={})=>{const r=t.id,n=t.instance;if(!e||!r||!n)return!1;try{let r=1===e.nodeType?e:e.parentElement;for(;r?.tagName;){if(fe(r.dataset,t))return r.dataset.nrMfeObserved=n,!0;r=r.parentNode}}catch(e){}return!1},ge=(e,t)=>{const r=g.gm.document?.querySelectorAll('[data-nr-mfe-id="'.concat(he(e.id),'"]')),n=(Array.from(r)||[]).find(t=>fe(t.dataset,e));let i=!!n;i&&(n.dataset.nrMfeObserved??=e.instance);const s=new g.gm.MutationObserver(r=>{r.forEach(r=>{r.addedNodes.forEach(r=>{const n=1===r.nodeType?r:null;!i&&fe(n?.dataset,e)&&(s.disconnect(),s.observe(n,{childList:!0,subtree:!0}),i=!0,n.dataset.nrMfeObserved=e.instance),(e=>{try{return e?.textContent?.trim()||["img","video","canvas","svg"].includes(e?.nodeName?.toLowerCase())}catch(e){return!1}})(r)&&(i||pe(r,e))&&t(r,s)})})});return s.observe(n||g.gm.document,{childList:!0,subtree:!0}),s},me=(e,t,r)=>{try{const n=new g.gm.PerformanceObserver(e=>{e.getEntries().forEach(r)});return n.observe(t),e.push(n),n}catch(e){return null}};function ve(e,t){let r,n,i=!1;const s=e=>null==e?e:e-(t?.scriptStart||t?.registeredAt||0),a={fcp:{get value(){const e=s(r);return e>1e4?void 0:e},set value(e){i||(r=e)}},lcp:{get value(){if(void 0!==a.fcp.value)return s(n)},set value(e){i||(n=e)}},cls:{value:void 0},inp:{value:void 0},disconnect:()=>{}};if(!(e&&g.RI&&g.gm.MutationObserver&&g.gm.PerformanceObserver))return a;const o=[];setTimeout(()=>{r||a.disconnect()},1e4);const c=()=>{if(!i){if(null==r){const e=(0,_.t)();if(s(e)>1e4)return void a.disconnect();r=e}n??=(0,_.t)(),a.cls.value??=0}},d=ge(e,(e,t)=>{c(),t.disconnect()});o.push(d);let u=0,l=null;const f=new Set;try{l=new g.gm.ResizeObserver(e=>{i||e.forEach(e=>{try{const t=e.contentRect.width*e.contentRect.height;t>u&&(u=t,a.lcp.value=(0,_.t)()),l.unobserve(e.target)}catch(e){}})})}catch(e){}const h=ge(e,e=>{if(c(),l)try{const t=1===e.nodeType?e:e.parentElement;t&&!f.has(t)&&(f.add(t),"IMG"===t.tagName?t.complete?l.observe(t):t.addEventListener("load",()=>{l.observe(t)},{once:!0}):"VIDEO"===t.tagName?t.readyState>=2?l.observe(t):t.addEventListener("loadeddata",()=>{l.observe(t)},{once:!0}):l.observe(t))}catch(e){}});l&&o.push(l),o.push(h),me(o,{type:"layout-shift",buffered:!0},t=>{i||t.hadRecentInput||(t.sources||[]).some(r=>!!pe(r.node,e)&&(c(),a.cls.value+=t.value,!0))}),me(o,{type:"event",buffered:!0,durationThreshold:40},t=>{!i&&t.interactionId&&pe(t.target,e)&&(void 0===a.inp.value||t.duration>a.inp.value)&&(c(),a.inp.value=t.duration)});const p=["pointerdown","keydown"],m=()=>{p.forEach(e=>{g.gm.removeEventListener(e,v,{passive:!0})})};a.disconnect=()=>{i=!0,o.forEach(e=>{try{e?.disconnect()}catch(e){}}),m(),["visibilitychange","pagehide"].forEach(e=>{g.gm.removeEventListener(e,a.disconnect,{once:!0,passive:!0})})};const v=t=>{pe(t?.target,e)&&((()=>{try{h?.disconnect(),l?.disconnect()}catch(e){}})(),m())};p.forEach(e=>{g.gm.addEventListener(e,v,{passive:!0})}),["visibilitychange","pagehide"].forEach(e=>{g.gm.addEventListener(e,a.disconnect,{once:!0,passive:!0})});const y=g.gm.document?.querySelectorAll('[data-nr-mfe-id="'.concat(he(e.id),'"]'));return Array.from(y||[]).some(t=>fe(t.dataset,e))&&c(),a}var ye=r(9566),be=r(7560),Ee=r(9119);const we=["entry","scripts","all"],Re=["name","id","type"],Te=new Map([[ce,"addPageAction"],[oe,"log"],[de,"measure"],[ie,"noticeError"],[ue,"recordCustomEvent"]]),Ae={experimental:(0,C.J)(()=>(0,l.R)(54,"newrelic.register")),disabled:(0,C.J)(()=>(0,l.R)(55)),invalidTarget:(0,C.J)(e=>(0,l.R)(48,e)),deregistered:(0,C.J)(()=>(0,l.R)(68)),invalidTimingMethod:(0,C.J)(e=>(0,l.R)(80,e)),duplicateName:(0,C.J)(e=>(0,l.R)(81,e)),duplicateId:(0,C.J)(e=>(0,l.R)(82,e))};function Se(e){(0,N.Y)(k.eY,function(t){return xe(e,t)},e)}function xe(e,r){Ae.experimental(),r||={},r.instance=(0,ye.LA)(8),r.type=w.f.MFE,r.licenseKey||=e.info.licenseKey,r.blocked=!1,("object"!=typeof r.tags||null===r.tags||Array.isArray(r.tags))&&(r.tags={}),r.parent??={get id(){return e.runtime.appMetadata.agents?.[0].entityGuid},type:w.f.BA},r.manifest=(0,be.N)(r.manifest),void 0===r.timingMethod||we.includes(r.timingMethod)||(Ae.invali
270dTimingMethod(r.timingMethod),r.timingMethod=void 0);const n=(0,le.Qr)(r);r.manifest&&(0,le.xo)(n,r);const i=ve(r,n),s=(0,Ee.L)(""+location),a={};Object.prototype.hasOwnProperty.call(r,"attributes")||Object.defineProperty(r,"attributes",{get:()=>({...a,"source.id":r.id,"source.name":r.name,"source.type":r.type,"parent.type":r.parent?.type||w.f.BA,"parent.id":r.parent?.id})}),Object.entries(r.tags).forEach(([e,t])=>{Re.includes(e)||(a["source.".concat(e)]=t)});let o=()=>{};const c=e.runtime.registeredEntities,d=e=>{r.blocked=!0,o=e};function u(e){return"string"==typeof e&&!!e.trim()&&e.trim().length<501}e.init.api.register.enabled||d(Ae.disabled),u(r.id)&&u(r.name)||d(()=>Ae.invalidTarget(r)),c.forEach(e=>{try{const{name:t,id:n}=e.metadata.target;t===r.name&&n!==r.id&&Ae.duplicateName(r),n===r.id&&t!==r.name&&Ae.duplicateId(r)}catch(e){}});const f={addPageAction:(t,n={})=>m(ce,[t,{...a,...n},e],r),deregister:()=>{p(),d(Ae.deregistered)},log:(t,n={})=>m(oe,[t,{...n,customAttributes:{...a,...n.customAttributes||{}}},e],r),measure:(t,n={})=>m(de,[t,{...n,customAttributes:{...a,...n.customAttributes||{}}},e],r),noticeError:(t,n={})=>m(ie,[t,{...a,...n},e],r),recordCustomEvent:(t,n={})=>m(ue,[t,{...a,...n},e],r),setApplicationVersion:e=>g("application.version",e),setCustomAttribute:(e,t)=>g(e,t),setUserId:e=>g("enduser.id",e),metadata:{get customAttributes(){return a},target:r,timings:n,vitals:i,events:{latestTimestamp:void 0}}},h=()=>(r.blocked&&o(),r.blocked);function p(){if(n.reportedAt)return;n.reportedAt=(0,_.t)(),i.disconnect(),n.fcp=i.fcp,n.lcp=i.lcp,n.cls=i.cls,n.inp=i.inp;const e=n.fetchEnd-n.fetchStart,t=n.scriptEnd-n.scriptStart,r={assetUrl:n.asset,assetType:n.type,registerUrl:s,deregisterUrl:(0,Ee.L)(""+location),pageUrl:void 0,currentUrl:void 0,timeAlive:n.reportedAt-n.registeredAt,timeToBeRequested:n.fetchStart,timeToExecute:t,timeToFetch:e,timeToLoad:e+t,t
270imeToRegister:n.registeredAt,totalWeight:n.totalWeight,...void 0!==n.renderBlocking&&{renderBlocking:n.renderBlocking},...i.fcp.value>=0&&{"vitals.fcp.value":i.fcp.value},...i.lcp.value>=0&&{"vitals.lcp.value":i.lcp.value},...i.cls.value>=0&&{"vitals.cls.value":i.cls.value},...i.inp.value>=0&&{"vitals.inp.value":i.inp.value}};f.recordCustomEvent("MicroFrontEndTiming",r)}h()||(c.push(f),(0,V.G)(p));const g=(e,t)=>{h()||(a[e]=t)},m=(r,n,i)=>{if(h()&&r!==xe)return;const s=f.metadata.events.latestTimestamp??(0,_.t)();f.metadata.events.latestTimestamp=void 0;const a=Te.get(r)||"unknown";(0,S.p)(q.xV,["API/register/".concat(a,"/called")],void 0,t.K7.metrics,e.ee);try{return r(...n,i,s)}catch(e){(0,l.R)(50,e)}};return f}class Oe extends W{static featureName=Z.T;constructor(e){var t;super(e,Z.T),t=e,(0,N.Y)(k.o5,(e,r)=>ie(e,r,t),t),function(e){(0,N.Y)(k.bt,function(t){e.runtime.onerror=t},e)}(e),function(e){let t=0;(0,N.Y)(k.k6,function(e,r){++t>10||(this.runtime.releaseIds[e.slice(-200)]=(""+r).slice(-200))},e)}(e),Se(e);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on("internal-error",(t,r)=>{this.abortHandler&&(0,S.p)("ierr",[ee(t),(0,_.t)(),!0,{},e.runtime.isRecording,r],void 0,this.featureName,this.ee)}),g.gm.addEventListener("unhandledrejection",t=>{this.abortHandler&&(0,S.p)("err",[te(t),(0,_.t)(),!1,{unhandledPromiseRejection:1},e.runtime.isRecording],void 0,this.featureName,this.ee)},(0,J.jT)(!1,this.removeOnAbort?.signal)),g.gm.addEventListener("error",t=>{this.abortHandler&&(0,S.p)("err",[re(t),(0,_.t)(),!1,{},e.runtime.isRecording],void 0,this.featureName,this.ee)},(0,J.jT)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#n,this.importAggregator(e,()=>r.e(478).then(r.bind(r,9377)))}#n(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}var _e=r(8990);let ke=1;function Ne(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===g.gm?0:(0,_e.I)(e,"nr@id",function(){return ke++})}function Le(e){if("string"==typeof e)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,X.A)(e).length}catch(e){return}}}var Me=r(8139),Pe=r(3434),Ie=r(5732);const je={},Ce=["open","send","setRequestHeader"];function De(e,t){var r=e||R.ee;const n=function(e){return(e||R.ee).get("xhr")}(r);if(void 0===g.gm.XMLHttpRequest)return n;if(je[n.debugId]++)return n;je[n.debugId]=1,(0,Me.u)(r,t);var i=(0,Pe.YM)(n,void 0,t),s=g.gm.XMLHttpRequest,a=g.gm.MutationObserver,o=g.gm.Promise,c=g.gm.setInterval,d="readystatechange",u=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],f=[],h=g.gm.XMLHttpRequest=function(e){const r=new s(e),a=n.context(r);a.targets=(0,Ie.$5)(t);try{n.emit("new-xhr",[r],a),r.addEventListener(d,(o=a,function(){var e=this;e.readyState>3&&!o.resolved&&(o.resolved=!0,n.emit("xhr-resolved",[],e)),i.inPlace(e,u,"fn-",E)}),(0,J.jT)(!1))}catch(e){(0,l.R)(15,e);try{n.emit("internal-error",[e])}catch(e){}}var o;return r};function p(e,t){i.inPlace(t,["onreadystatechange"],"fn-",E)}if(function(e,t){for(var r in e)t[r]=e[r]}(s,h),h.prototype=s.prototype,i.inPlace(h.prototype,Ce,"-xhr-",E),n.on("send-xhr-start",function(e,t){p(e,t),function(e){f.push(e),a&&(m?m.then(b):c?c(b):(v=-v,y.data=v))}(t)}),n.on("open-xhr-start",p),a){var m=o&&o.resolve();if(!c&&!o){var v=1,y=document.createTextNode(v);new a(b).observe(y,{characterData:!0})}}else r.on("fn-end",function(e){e[0]&&e[0].type===d||b()});function b(){for(var e=0;e<f.length;e++)p(0,f[e]);f.length&&(f=[])}function E(e,t){return t}return n}var Be="fetch-",He=Be+"body-",We=["arrayBuffer","blob","json","text","formData"],Ue=g.gm.Request,Ke=g.gm.Response,Fe="prototype";const Ve={};function ze(e,t){const r=function(e){return(e||R.ee).get("fetch")}(e);if(!(Ue&&Ke&&g.gm.fetch))return r;if(Ve[r.debugId]++)return r;function n(e,n,i){var s=e[n];"function"==typeof s&&(e[n]=function(){var e=[...arguments];const n={},a=(0,Ie.$5)(t);var o;r.emit(i+"before-start",[e],n),n[R.P]&&n[R.P].dt&&(o=n[R.P].dt);var c=s.apply(this,e);return r.emit(i+"start",[e,o],c),c.then(function(e){return r.emit(i+"end",[null,e,a],c),e},function(e){throw r.emit(i+"end",[e,void 0,a],c),e})})}
270return Ve[r.debugId]=1,We.forEach(e=>{n(Ue[Fe],e,He),n(Ke[Fe],e,He)}),n(g.gm,"fetch",Be),r.on(Be+"end",function(e,n,i){var s=this;if(s.targets=i||[t.runtime.v2Target],n){var a=n.headers.get("content-length");null!==a&&(s.rxSize=a),r.emit(Be+"done",[null,n],s)}else r.emit(Be+"done",[e],s)}),r}var Ge=r(7485);class qe{constructor(e){this.agentRef=e}generateTracePayload(e){const t=this.agentRef.loader_config;if(!this.shouldGenerateTrace(e)||!t)return null;var r=(t.accountID||"").toString()||null,n=(t.agentID||"").toString()||null,i=(t.trustKey||"").toString()||null;if(!r||!n)return null;var s=(0,ye.ZF)(),a=(0,ye.el)(),o=Date.now(),c={spanId:s,traceId:a,timestamp:o};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(c.traceContextParentHeader=this.generateTraceContextParentHeader(s,a),c.traceContextStateHeader=this.generateTraceContextStateHeader(s,o,r,n,i)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(c.newrelicHeader=this.generateTraceHeader(s,a,o,r,n,i)),c}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,s){if(!("function"==typeof g.gm?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return s&&n!==s&&(a.d.tk=s),btoa((0,X.A)(a))}shouldGenerateTrace(e){return this.agentRef.init?.distributed_tracing?.enabled&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1;const r=this.agentRef.init?.distributed_tracing;if(e.sameOrigin)t=!0;else if(r?.allowed_origins instanceof Array)for(var n=0;n<r.allowed_origins.length;n++){var i=(0,Ge.D)(r.allowed_origins[n]);if(e.hostname===i.hostname&&e.protocol===i.protocol&&e.port===i.port){t=!0;break}}return t}excludeNewrelicHeader(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=this.agentRef.init?.distributed_tracing;return!!e&&!!e.cors_use_tracecontext_headers}}var Ye=r(7295);function Ze(e){return"string"==typeof e?e:e instanceof(0,i.dV)().o.REQ?e.url:g.gm?.URL&&e instanceof URL?e.href:void 0}function $e(e,t){var r=(0,Ge.D)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}var Je=["load","error","abort","timeout"],Xe=Je.length,Qe=(0,i.dV)().o.REQ,et=(0,i.dV)().o.XHR;const tt="X-NewRelic-App-Data",rt="internal-error";class nt extends W{static featureName=c.TZ;constructor(e){super(e,c.TZ),this.dt=new qe(e),this.handler=(e,t,r,n)=>(0,S.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:"xhr",fetch:"fetch",beacon:"beacon"};g.gm?.performance?.getEntriesByType("resource").forEach(r=>{if(r.initiatorType in e&&0!==r.responseStatus){const n={status:r.responseStatus},i={rxSize:r.transferSize,duration:Math.floor(r.duration),cbTime:0};$e(n,r.name),this.handler("xhr",[n,i,r.startTime,r.responseEnd,e[r.initiatorType]],void 0,t.K7.ajax)}})}catch(e){}ze(this.ee,e),De(this.ee,e),function(e,r,n,i){const s=[c.mo.ALL,c.mo.FAILURES].includes(e.init.ajax?.capture_payloads);function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=A,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},t.latestLongtaskEnd=0,e.addEventListener("load",function(r){O(t,e)},(0,J.jT)(!1)),g.lR||e.addEventListener("progress",function(e){t.lastSize=e.loaded},(0,J.jT)(!1))}function o(e){this.params={method:e[0]},$e(this,e[1]),this.metrics={}}function d(t,r){e.loader_config.xpid&&this.sameOrigin&&r.setRequestHeader("X-NewRelic-ID",e.loader_config.xpid);var n=i.generateTracePayload(this.parsedOrigin);if(n){var s=!1;n.newrelicHeader&&(r.setRequestHeader("newrelic",n.newrelicHeader),s=!0),n.traceContextParentHeader&&(r.setRequestHeader("traceparent",n.traceContextParentHeader),n.traceContextStateHeader&&r.setRequestHeader("tracestate",n.traceContextStateHeader),s=!0),s&&(this.dt=n)}}function u(e,t){s&&e.length>=2&&(this.requestHeaders??={},this.requestHeaders[e[0].toLowerCase()]=e[1])}function l(e,t){var n=this.metrics,i=e[0],s=this;if(n&&i){var a=Le(i);a&&(n.txSize=a)}this.startTime=(0,_.t)(),this.requestBody=i,this.listener=function(e){try{"abort"!==e.type||s.loadCaptureCalled||(s.params.aborted=!0),("load"
270!==e.type||s.called===s.totalCbs&&(s.onloadCalled||"function"!=typeof t.onload)&&"function"==typeof s.end)&&s.end(t)}catch(e){try{r.emit(rt,[e])}catch(e){}}};for(var o=0;o<Xe;o++)t.addEventListener(Je[o],this.listener,(0,J.jT)(!1))}function f(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function h(e,t){var r=""+Ne(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function p(e,t){var r=""+Ne(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function m(){this.endTime=(0,_.t)()}function v(e,t){t instanceof et&&"load"===e[0]&&r.emit("xhr-load-added",[e[1],e[2]],t)}function y(e,t){t instanceof et&&"load"===e[0]&&r.emit("xhr-load-removed",[e[1],e[2]],t)}function b(e,t,r){t instanceof et&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,_.t)()))}function E(e,t){this.xhrCbStart&&r.emit("xhr-cb-time",[(0,_.t)()-this.xhrCbStart,this.onload,t],t)}function w(e){var t,r=e[1]||{};if("string"==typeof e[0]?0===(t=e[0]).length&&g.RI&&(t=""+g.gm.location.href):e[0]&&e[0].url?t=e[0].url:g.gm?.URL&&e[0]&&e[0]instanceof URL?t=e[0].href:"function"==typeof e[0].toString&&(t=e[0].toString()),"string"==typeof t&&0!==t.length){t&&(this.parsedOrigin=(0,Ge.D)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var n=i.generateTracePayload(this.parsedOrigin);if(n&&(n.newrelicHeader||n.traceContextParentHeader))if(e[0]&&e[0].headers)o(e[0].headers,n)&&(this.dt=n);else{var s={};for(var a in r)s[a]=r[a];s.headers=new Headers(r.headers||{}),o(s.headers,n)&&(this.dt=n),e.length>1?e[1]=s:e.push(s)}}function o(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function R(e,t){this.params={},this.metrics={},this.startTime=(0,_.t)(),this.dt=t;let[r,n={}]=e;$e(this,Ze(r));const i=(""+(r&&r instanceof Qe&&r.method||n.method||"GET")).toUpperCase();this.params.method=i,this.txSize=Le(n.body||r?.body)||0;try{var a=n.headers||r?.headers;if(s&&a)if(this.requestHeaders??={},a instanceof Headers)a.forEach(function(e,t){this.requestHeaders[t.toLowerCase()]=e}.bind(this));else if("object"==typeof a)for(var o in a)this.requestHeaders[o.toLowerCase()]=a[o]}catch(e){}this.requestBody=n.body||r?.body}function T(e,t){if(this.endTime=(0,_.t)(),this.params||(this.params={}),(0,Ye.iW)(this.params))return;this.params.status=t?t.status:0;const n=()=>{const e=+this.rxSize,t=null==this.rxSize||isNaN(e)?void 0:e,r={txSize:this.txSize,rxSize:t,duration:this.endTime-this.startTime},n=[this.params,r,this.startTime,this.endTime,"fetch"];this.targets.forEach(e=>x(n,this,e))};t&&s?t.clone().text().then(e=>{this.responseBody=e,this.rxSize&&"0"!==this.rxSize&&0!==this.rxSize||void 0===e||0===this.params.status||(this.rxSize=Le(e)),t?.headers&&(this.responseHeaders={},t.headers.forEach(function(e,t){this.responseHeaders[t.toLowerCase()]=e}.bind(this)))}).catch(e=>{r.emit(rt,[e])}).finally(()=>{n()}):n()}function A(e){const t=this.params,n=this.metrics;if(this.ended)return;this.ended=!0;for(let t=0;t<Xe;t++)e.removeEventListener(Je[t],this.listener,!1);if(t.aborted)return;if((0,Ye.iW)(t))return;if(n.duration=this.endTime-this.startTime,this.loadCaptureCalled||4!==e.readyState?null==t.status&&(t.status=0):O(this,e),n.cbTime=this.cbTime,s){try{this.responseBody=e.responseText}catch(t){this.responseBody=e.response}if((!n.rxSize||0===n.rxSize)&&void 0!==this.responseBody&&0!==t.status){const e=Le(this.responseBody);void 0!==e&&(n.rxSize=e)}try{this.responseHeaders=function(e){const t={};return e?(e.split("\r\n").forEach(function(e){const r=e.indexOf(": ");if(r>0){const n=e.substring(0,r),i=e.substring(r+2);t[n.toLowerCase()]=i}}),t):t}(e.getAllResponseHeaders())}catch(e){r.emit(rt,[e])}}const i=[t,n,this.startTime,this.endTime,"xhr"];this.targets.forEach(e=>x(i,this,e))}function x(e,r,i){n("xhr",[...e,i],r,t.K7.ajax)}function O(e,n){e.params.status=n.status;var i=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?Le(e.response):"text"===r||""===r||void 0===r?Le(e.responseText):void 0}(n,e.lastSize);if(void 0!==i&&0!==n.status&&(e.metrics.rxSize=i),e.sameOrigin&&n.getAllResponseHeaders().indexOf(tt)>=0){var s=n.getResponseHeader(tt);s&&((0,S.p)("sm",["Ajax/CrossApplicationTracing/Header/Seen"],void 0,t.K7.metrics,r),e.params.cat=s.split(", ").pop())}e.loadCaptureCalled=!0}r.on("new-xhr",a),r.on("open-xhr-start",o),r.on("open-xhr-end",d),r.on("send-xhr-start",l),r.on("setRequestHeader-xhr-start",u),r.on("xhr-cb-time",f),r.on("xhr-load-added",h),r.on("xhr-load-removed",p),r.on("xhr-resolved",m),r.on("addEventListener-end",v),r.on("removeEventListener-end",y),r.on("fn-end",E),r.on("fetch-before-start",w),r.on("fetch-start",R),r.on("fn-start",b),r.on("fetch-done",T)}(e,this.ee,this.handler,this.dt),this.importAggregator(e,()=>r.e(478).then(r.bind(r,3845)))}}const it={},st=["pushState","replaceState"];function at(e,t){const r=function(e){return(e||R.ee).get("history")}(e);return!g.RI||it[r.debugId]++||(it[r.debugId]=1,(0,Pe.YM)(r,void 0,t).inPlace(window.history,st,"-")),r}var ot=r(3738);function ct(e){(0,N.Y)(k.BL,function(r=Date.now()){const n=r-g.WN;n<0&&(0,l.R)(62,r),(0,S.p)(q.XG,[k.BL,{time:n}],void 0,t.K7.metrics,e.ee),e.addToTrace({name:k.BL,start:r,origin:"nr"}),(0,S.p)("api-"+k.hG,[n,k.BL],void 0,t.K7.genericEvents,e.ee)},e)}const{He:dt,bD:ut,d3:lt,Kp:ft,TZ:ht,Lc:pt,uP:gt,Rz:mt}=ot;class vt extends W{static featureName=ht;constructor(e){var n;super(e,ht),n=e,(0,N.Y)(k.U2,function(e){if(!(e&&"object"==typeof e&&e.name&&e.start))return;const r={n:e.name,s:e.start-g.WN,e:(e.end||e.start)-g.WN,o:e.origin||"",t:"api"};r.s<0||r.e<0||r.e<r.s?(0,l.R)(61,{start:r.s,end:r.e}):(0,S.p)("bstApi",[r],void 0,t.K7.sessionTrace,n.ee)},n),ct(e);
270if(!(0,j.V)(e.init))return void this.deregisterDrain();const i=this.ee;let s;at(i,e),this.eventsEE=(0,Me.u)(i,e),this.eventsEE.on(gt,function(e,t){this.bstStart=(0,_.t)()}),this.eventsEE.on(pt,function(e,r){(0,S.p)("bst",[e[0],r,this.bstStart,(0,_.t)()],void 0,t.K7.sessionTrace,i)}),i.on(mt+lt,function(e){this.time=(0,_.t)(),this.startPath=location.pathname+location.hash}),i.on(mt+ft,function(e){(0,S.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,t.K7.sessionTrace,i)});try{s=new PerformanceObserver(e=>{const r=e.getEntries();(0,S.p)(dt,[r],void 0,t.K7.sessionTrace,i)}),s.observe({type:ut,buffered:!0})}catch(e){}this.importAggregator(e,()=>r.e(478).then(r.bind(r,6974)),{resourceObserver:s})}}var yt=r(733),bt=r(6344);class Et extends W{static featureName=bt.TZ;#i;recorder;constructor(e){var n;let i;super(e,bt.TZ),n=e,(0,N.Y)(k.CH,function(){(0,S.p)(k.CH,[],void 0,t.K7.sessionReplay,n.ee)},n),function(e){(0,N.Y)(k.Tb,function(){(0,S.p)(k.Tb,[],void 0,t.K7.sessionReplay,e.ee)},e)}(e);const s="".concat(u.Wt).concat((0,yt.Y)(e.info.licenseKey,e.info.applicationID));try{i=JSON.parse(localStorage.getItem(s))}catch(e){}(0,I.SR)(e.init)&&this.ee.on(k.CH,()=>this.#s()),this.#a(i)&&this.importRecorder().then(e=>{e.startRecording(bt.Qb.PRELOAD,i?.sessionReplayMode)}),this.abortHandler=this.#n,this.importAggregator(this.agentRef,()=>r.e(478).then(r.bind(r,6167)),this),this.ee.on("err",e=>{this.blocked||this.agentRef.runtime.isRecording&&(this.errorNoticed=!0,(0,S.p)(bt.Vh,[e],void 0,this.featureName,this.ee))})}#a(e){return e&&(e.sessionReplayMode===u.g.FULL||e.sessionReplayMode===u.g.ERROR)||(0,I.Aw)(this.agentRef.init)}importRecorder(){return this.recorder?Promise.resolve(this.recorder):(this.#i??=Promise.all([r.e(478),r.e(249)]).then(r.bind(r,4866)).then(({Recorder:e})=>(this.recorder=new e(this),this.recorder)).catch(e=>{throw this.ee.emit("internal-error",[e]),this.blocked=!0,e}),this.#i)}#s(){this.blocked||(this.featAggregate?this.featAggregate.mode!==u.g.FULL&&this.featAggregate.initializeRecording(u.g.FULL,!0,bt.Qb.API):this.importRecorder().then(()=>{this.recorder.startRecording(bt.Qb.API,u.g.FULL)}))}#n(){this.recorder?.stopRecording()}}var wt=r(3962);class Rt extends W{static featureName=wt.TZ;constructor(e){if(super(e,wt.TZ),function(e){const r=e.ee.get("tracer");function n(){}(0,N.Y)(k.dT,function(e){return(new n).get("object"==typeof e?e:{})},e);const i=n.prototype={createTracer:function(n,i){var s={},a=this,o="function"==typeof i;return(0,S.p)(q.xV,["API/createTracer/called"],void 0,t.K7.metrics,e.ee),function(){if(r.emit((o?"":"no-")+"fn-start",[(0,_.t)(),a,o],s),o)try{return i.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw r.emit("fn-err",[arguments,this,t],s),t}finally{r.emit("fn-end",[(0,_.t)()],s)}}}};["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach(r=>{N.Y.apply(this,[r,function(){return(0,S.p)(k.hw+r,[performance.now(),...arguments],this,t.K7.softNav,e.ee),this},e,i])}),(0,N.Y)(k.PA,function(){(0,S.p)(k.hw+"routeName",[performance.now(),...arguments],void 0,t.K7.softNav,e.ee)},e)}(e),!g.RI||!(0,i.dV)().o.MO)return;const n=at(this.ee,e);try{this.removeOnAbort=new AbortController}catch(e){}wt.tC.forEach(e=>{(0,J.sp)(e,e=>{c(e)},!0,this.removeOnAbort?.signal)}
270);const s=()=>(0,S.p)("newURL",[(0,_.t)(),""+window.location],void 0,this.featureName,this.ee);n.on("pushState-end",s),n.on("replaceState-end",s),(0,J.sp)(wt.OV,e=>{c(e),(0,S.p)("newURL",[e.timeStamp,""+window.location],void 0,this.featureName,this.ee)},!0,this.removeOnAbort?.signal);let a=!1;const o=new((0,i.dV)().o.MO)((e,t)=>{a||(a=!0,requestAnimationFrame(()=>{(0,S.p)("newDom",[(0,_.t)()],void 0,this.featureName,this.ee),a=!1}))}),c=(0,C.s)(e=>{"loading"!==document.readyState&&((0,S.p)("newUIEvent",[e],void 0,this.featureName,this.ee),o.observe(document.body,{attributes:!0,childList:!0,subtree:!0,characterData:!0}))},100,{leading:!0});this.abortHandler=function(){this.removeOnAbort?.abort(),o.disconnect(),this.abortHandler=void 0},this.importAggregator(e,()=>r.e(478).then(r.bind(r,4393)),{domObserver:o})}}var Tt=r(981);const At={},St=new Set;function xt(e){return"string"==typeof e?{type:"string",size:(new TextEncoder).encode(e).length}:e instanceof ArrayBuffer?{type:"ArrayBuffer",size:e.byteLength}:e instanceof Blob?{type:"Blob",size:e.size}:e instanceof DataView?{type:"DataView",size:e.byteLength}:ArrayBuffer.isView(e)?{type:"TypedArray",size:e.byteLength}:{type:"unknown",size:0}}class Ot{constructor(e,t){this.timestamp=(0,_.t)(),this.currentUrl=(0,Ee.L)(window.location.href),this.socketId=(0,ye.LA)(8),this.requestedUrl=(0,Ee.L)(e),this.requestedProtocols=Array.isArray(t)?t.join(","):t||"",this.openedAt=void 0,this.protocol=void 0,this.extensions=void 0,this.binaryType=void 0,this.messageOrigin=void 0,this.messageCount=0,this.messageBytes=0,this.messageBytesMin=0,this.messageBytesMax=0,this.messageTypes=void 0,this.sendCount=0,this.sendBytes=0,this.sendBytesMin=0,this.sendBytesMax=0,this.sendTypes=void 0,this.closedAt=void 0,this.closeCode=void 0,this.closeReason="unknown",this.closeWasClean=void 0,this.connectedDuration=0,this.hasErrors=void 0}}class _t extends W{static featureName=o.TZ;constructor(e){super(e,o.TZ);const n=e.init.feature_flags.includes("websockets")||e.init.web_sockets?.enabled,s=!e.init.feature_flags.includes("no_spv"),a=[e.init.page_action.enabled,e.init.performance.capture_marks,e.init.performance.capture_measures,e.init.performance.resources.enabled,e.init.user_actions.enabled,n,s];var c;let d;if(c=e,(0,N.Y)(k.hG,(e,t)=>ce(e,t,c),c),function(e){(0,N.Y)(k.fF,(t,r)=>ue(t,r,e),e)}(e),ct(e),Se(e),function(e){(0,N.Y)(k.V1,(t,r)=>de(t,r,e),e)}(e),this.removeOnAbort=new AbortController,this.abortHandler=()=>{this.removeOnAbort.abort(),this.abortHandler=void 0},n){const u=function(e,t){if(!(0,i.dV)().o.WS)return e;const r=e.get("websockets");if(At[r.debugId]++)return r;At[r.debugId]=1,(0,V.G)(()=>{const e=(0,_.t)();St.forEach(t=>{t.nrData.closedAt=e,t.nrData.closeCode=1001,t.nrData.closeReason="Page navigating away",t.nrData.closeWasClean=!1,t.nrData.openedAt&&(t.nrData.connectedDuration=e-t.nrData.openedAt),r.emit("ws",[t.nrData,t.targets],t)})});
270class n extends WebSocket{static name=Tt.R.WS;static toString(){return"function WebSocket() { [native code] }"}toString(){return"[object WebSocket]"}get[Symbol.toStringTag](){return n.name}#o(e){(e.__newrelic??={}).socketId=this.nrData.socketId,this.nrData.hasErrors??=!0}constructor(...e){super(...e),this.nrData=new Ot(e[0],e[1]),this.targets=(0,Ie.$5)(t),this.addEventListener("open",()=>{this.nrData.openedAt=(0,_.t)(),["protocol","extensions","binaryType"].forEach(e=>{this.nrData[e]=this[e]}),St.add(this)}),this.addEventListener("message",e=>{const{type:t,size:r}=xt(e.data);this.nrData.messageOrigin??=(0,Ee.L)(e.origin),this.nrData.messageCount++,this.nrData.messageBytes+=r,this.nrData.messageBytesMin=Math.min(this.nrData.messageBytesMin||1/0,r),this.nrData.messageBytesMax=Math.max(this.nrData.messageBytesMax,r),(this.nrData.messageTypes??"").includes(t)||(this.nrData.messageTypes=this.nrData.messageTypes?"".concat(this.nrData.messageTypes,",").concat(t):t)}),this.addEventListener("close",e=>{this.nrData.closedAt=(0,_.t)(),this.nrData.closeCode=e.code,e.reason&&(this.nrData.closeReason=e.reason),this.nrData.closeWasClean=e.wasClean,this.nrData.connectedDuration=this.nrData.closedAt-this.nrData.openedAt,St.delete(this),r.emit("ws",[this.nrData,this.targets],this)})}addEventListener(e,t,...r){const n=this,i="function"==typeof t?function(...e){try{return t.apply(this,e)}catch(e){throw n.#o(e),e}}:t?.handleEvent?{handleEvent:function(...e){try{return t.handleEvent.apply(t,e)}catch(e){throw n.#o(e),e}}}:t;return super.addEventListener(e,i,...r)}send(e){if(this.readyState===WebSocket.OPEN){const{type:t,size:r}=xt(e);this.nrData.sendCount++,this.nrData.sendBytes+=r,this.nrData.sendBytesMin=Math.min(this.nrData.sendBytesMin||1/0,r),this.nrData.sendBytesMax=Math.max(this.nrData.sendBytesMax,r),(this.nrData.sendTypes??"").includes(t)||(this.nrData.sendTypes=this.nrData.sendTypes?"".concat(this.nrData.sendTypes,",").concat(t):t)}try{return super.send(e)}catch(e){throw this.#o(e),e}}close(...e){try{super.close(...e)}catch(e){throw this.#o(e),e}}}return g.gm.WebSocket=n,r}(this.ee,e);u.on("ws",(e,t)=>{(0,S.p)("ws-complete",[e,t],void 0,this.featureName,this.ee)})}if(s){if("function"==typeof g.gm.ReportingObserver){const l=new g.gm.ReportingObserver(e=>{e.forEach(e=>{(0,S.p)("spv",[kt(e),(0,_.t)()],void 0,t.K7.genericEvents,this.ee)}),l.disconnect()},{types:["csp-violation"],buffered:!0});l.observe()}g.gm.addEventListener("securitypolicyviolation",e=>{(0,S.p)("spv",[kt(e),e.timeStamp],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(!1,this.removeOnAbort.signal))}if(g.RI){if(ze(this.ee,e),De(this.ee,e),d=at(this.ee,e),e.init.user_actions.enabled){function f(t){const r=(0,Ge.D)(t);return e.beacons.includes(r.hostname+":"+r.port)}function h(){d.emit("navChange")}o.Zp.forEach(e=>(0,J.sp)(e,e=>(0,S.p)("ua",[e],void 0,this.featureName,this.ee),!0)),o.qN.forEac
270h(e=>{const t=(0,C.s)(e=>{(0,S.p)("ua",[e],void 0,this.featureName,this.ee)},500,{leading:!0});(0,J.sp)(e,t)}),g.gm.addEventListener("error",()=>{(0,S.p)("uaErr",[],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(!1,this.removeOnAbort.signal)),this.ee.on("open-xhr-start",(e,r)=>{f(e[1])||r.addEventListener("readystatechange",()=>{2===r.readyState&&(0,S.p)("uaXhr",[],void 0,t.K7.genericEvents,this.ee)},(0,J.jT)(void 0,this.removeOnAbort.signal))}),this.ee.on("fetch-start",e=>{e.length>=1&&!f(Ze(e[0]))&&(0,S.p)("uaXhr",[],void 0,t.K7.genericEvents,this.ee)}),d.on("pushState-end",h),d.on("replaceState-end",h),window.addEventListener("hashchange",h,(0,J.jT)(!0,this.removeOnAbort.signal)),window.addEventListener("popstate",h,(0,J.jT)(!0,this.removeOnAbort.signal))}if(e.init.performance.resources.enabled&&g.gm.PerformanceObserver?.supportedEntryTypes.includes("resource")){new PerformanceObserver(e=>{e.getEntries().forEach(e=>{(0,S.p)("browserPerformance.resource",[e],void 0,this.featureName,this.ee)})}).observe({type:"resource",buffered:!0})}}a.some(e=>e)?this.importAggregator(e,()=>r.e(478).then(r.bind(r,8019))):this.deregisterDrain()}}function kt(e){const t=e.body??e;return{blockedUrl:t.blockedURL??e.blockedURI,documentUrl:t.documentURL??e.documentURI,effectiveDirective:t.effectiveDirective,originalPolicy:t.originalPolicy,sourceFile:t.sourceFile,statusCode:t.statusCode,lineNumber:t.lineNumber,columnNumber:t.columnNumber,disposition:"reporting"===t.disposition?"report":t.disposition,sample:t.sample,referrer:t.referrer}}var Nt=r(2646);const Lt=new Map;function Mt(e,t,r,n,i=!0,s){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const a=function(e){return(e||R.ee).get("logger")}(e),o=(0,Pe.YM)(a,void 0,s),c=new Nt.y(R.P);c.level=n.level,c.customAttributes=n.customAttributes,c.autoCaptured=i;const d=t[r]?.[Pe.Jt]||t[r];return Lt.set(d,c),o.inPlace(t,[r],"wrap-logger-",()=>Lt.get(d),void 0,!0),a}var Pt=r(1910);class It extends W{static featureName=se.TZ;constructor(e){var t;super(e,se.TZ),t=e,(0,N.Y)("log",(e,r)=>oe(e,r,t),t),function(e){(0,N.Y)(k.Wb,(t,r,{customAttributes:n={},level:i=se.p_.INFO}={})=>{Mt(e.ee,t,r,{customAttributes:n,level:i},!1,e)},e)}(e),Se(e);const n=this.ee;["log","error","warn","info","debug","trace"].forEach(t=>{(0,Pt.i)(g.gm.console[t]),Mt(n,g.gm.console,t,{level:"log"===t?"info":t},void 0,e)}),this.ee.on("wrap-logger-end",function([t],r,i,s=[e.runtime.v2Target]){const{level:a,customAttributes:o,autoCaptured:c}=this;s.forEach(e=>{(0,ae.R)(n,t,o,a,c,e)})}),this.importAggregator(e,()=>r.e(478).then(r.bind(r,5288)))}}new F({features:[nt,K,G,vt,Et,Y,Oe,_t,It,Rt],loaderType:"spa"})})()})();</script>
270
271      <meta content='width=device-width,initial-scale=1.0' name='viewport'>
272<meta id="fedora-keys" data-commit-sha="b7f3b108249a569398fa2381339400203cff1e26" data-env="production" data-sentry-public-dsn="https://[email protected]/120346" data-stripe="pk_live_hkgvgSBxG4TAl3zGlXiB1KUX" data-track-all-ahoy="false" data-track-changes-ahoy="false" data-track-clicks-ahoy="false" data-track-sumbits-ahoy="false" data-iris-url="https://eventable.internal.teachable.com" /><meta id="fedora-data" data-report-card="{}" data-course-ids="[]" data-completed-lecture-ids="[]" data-school-id="925908" data-school-launched="true" data-preview="logged_out" data-turn-off-fedora-branding="true" data-plan-supports-whitelabeling="true" data-powered-by-text="Powered by" data-asset-path="//assets.teachablecdn.com/teachable-branding-2025/logos/teachable-logomark-white.svg" data-school-preferences="{&quot;ssl_forced&quot;:&quot;true&quot;,&quot;bnpl_allowed&quot;:&quot;true&quot;,&quot;anonymize_ips&quot;:&quot;false&quot;,&quot;phone_enabled&quot;:&quot;false&quot;,&quot;paypal_enabled&quot;:&quot;true&quot;,&quot;phone_required&quot;:&quot;false&quot;,&quot;gifting_enabled&quot;:&quot;true&quot;,&quot;adaptive_pricing&quot;:&quot;false&quot;,&quot;autoplay_lectures&quot;:&quot;true&quot;,&quot;clickwrap_enabled&quot;:&quot;false&quot;,&quot;comments_threaded&quot;:&quot;true&quot;,&quot;community_enabled&quot;:&quot;true&quot;,&quot;course_blocks_beta&quot;:&quot;true&quot;,&quot;eu_vat_tax_enabled&quot;:&quot;false&quot;,&quot;legacy_back_office&quot;:&quot;false&quot;,&quot;themeable_disabled&quot;:&quot;false&quot;,&quot;back_office_enabled&quot;:&quot;true&quot;,&quot;comments_moderation&quot;:&quot;false&quot;,&quot;eu_vat_tax_eligible&quot;:&quot;true&quot;,&quot;charge_exclusive_tax&quot;:&quot;true&quot;,&quot;checkout_submit_type&quot;:null,&quot;send_receipts_emails&quot;:&quot;true&quot;,&quot;autocomplete_lectures&quot;:&quot;true&quot;,&quot;class_periods_enabled&quot;:&quot;false&quot;,&quot;custom_fields_enabled&quot;:&quot;false&quot;,&quot;tax_inclusive_pricing&quot;:&quot;false&quot;,&quot;authors_can_manage_pbc&quot;:&quot;true&quot;,&quot;css_properties_enabled&quot;:&quot;false&quot;,&quot;preenrollments_enabled&quot;:&quot;false&quot;,&quot;checkout_tax_id_enabled&quot;:&quot;false&quot;,&quot;new_text_editor_enabled&quot;:&quot;true&quot;,&quot;require_terms_agreement&quot;:&quot;true&quot;,&quot;send_new_comment_emails&quot;:&quot;false&quot;,&quot;author_affiliate_payouts&quot;:&quot;false&quot;,&quot;checkout_tax_id_required&quot;:&quot;false&quot;,&quot;send_drip_content_emails&quot;:&quot;false&quot;,&quot;ssl_forced_from_creation&quot;:&quot;true&quot;,&quot;turn_off_fedora_branding&quot;:&quot;true&quot;,&quot;allow_comment_attachments&quot;:&quot;true&quot;,&quot;authors_can_email_students&quot;:&quot;false&quot;,&quot;authors_can_manage_coupons&quot;:&quot;false&quot;,&quot;custom_email_limit_applied&quot;:&quot;false&quot;,&quot;send_abandoned_cart_emails&quot;:&quot;true&quot;,&quot;teachable_accounts_enabled&quot;:&quot;false&quot;,&quot;teachable_payments_enabled&quot;:&quot;true&quot;,&quot;authors_can_import_students&quot;:&quot;false&quot;,&quot;authors_can_publish_courses&quot;:&quot;false&quot;,&quot;internal_subscriptions_beta&quot;:&quot;true&quot;,&quot;recaptcha_enabled_on_signup&quot;:&quot;true&quot;,&quot;display_vat_inclusive_prices&quot;:&quot;false&quot;,&quot;single_page_checkout_enabled&quot;:&quot;true&quot;,&quot;authors_can_set_course_prices&quot;:&quot;false&quot;,&quot;dynamic_tax_inclusive_pricing&quot;:&quot;false&quot;,&quot;send_lead_confirmation_emails&quot;:&quot;true&quot;,&quot;affiliate_cookie_duration_days&quot;:&quot;30&quot;,&quot;authors_can_issue_certificates&quot;:&quot;false&quot;,&quot;store_student_cards_separately&quot;:&quot;true&quot;,&quot;affiliate_external_urls_enabled&quot;:&quot;true&quot;,&quot;authors_can_manage_certificates&quot;:&quot;false&quot;,&quot;authors_can_manage_course_pages&quot;:&quot;false&quot;,&quot;prevent_new_coupon_applications&quot;:&quot;true&quot;,&quot;checkout_promotion_codes_enabled&quot;:&quot;false&quot;,&quot;disable_js_course_event_tracking&quot;:&quot;false&quot;,&quot;exclusive_vat_on_custom_gateways&quot;:&quot;true&quot;,&quot;is_edit_site_onboarding_complete&quot;:&quot;false&quot;,&quot;send_certificate_issuance_emails&quot;:&quot;true&quot;,&quot;
272owner_teachable_accounts_required&quot;:&quot;true&quot;,&quot;prevent_payment_plan_cancellation&quot;:&quot;false&quot;,&quot;send_subscription_reminder_emails&quot;:&quot;true&quot;,&quot;automatically_add_disqus_attachments&quot;:&quot;true&quot;,&quot;recalc_course_pct_on_lecture_publish&quot;:&quot;false&quot;,&quot;send_confirmation_instructions_emails&quot;:&quot;true&quot;,&quot;send_limited_time_unenrollment_emails&quot;:&quot;true&quot;,&quot;turn_off_myteachable_sign_up_branding&quot;:&quot;true&quot;,&quot;checkout_customer_tos_acceptance_required&quot;:&quot;false&quot;}" data-accessible-features="[&quot;bulk_importing_users&quot;,&quot;bulk_enroll_students&quot;,&quot;manually_importing_users&quot;,&quot;native_certificates&quot;,&quot;admin_seats&quot;,&quot;custom_roles&quot;,&quot;earnings_statements&quot;,&quot;teachable_payments&quot;,&quot;teachable_u&quot;,&quot;course_compliance&quot;,&quot;page_editor_v2&quot;,&quot;page_editor_v2_only&quot;,&quot;certificates_editor_v2&quot;,&quot;drip_content&quot;,&quot;custom_domain&quot;,&quot;coupons&quot;,&quot;graded_quizzes&quot;,&quot;power_editor&quot;,&quot;email&quot;,&quot;course_reports&quot;,&quot;webhooks&quot;,&quot;integrations&quot;,&quot;zapier_action_create_user&quot;,&quot;teachable_payments_payout_view&quot;,&quot;upsells&quot;,&quot;facebook_pixel&quot;,&quot;user_search_filters&quot;,&quot;user_tags&quot;,&quot;multiple_course_pages&quot;,&quot;proration_upgrade_flow&quot;,&quot;cross_border_payments&quot;,&quot;limited_time_enrollments&quot;,&quot;sales_tax_on_student_checkout&quot;,&quot;warroom_jan_22_blocks&quot;,&quot;paid_integrations&quot;,&quot;sales_analytics_retool&quot;,&quot;new_device_confirmation&quot;,&quot;elasticsearch_users&quot;,&quot;elasticsearch_transactions&quot;,&quot;reset_progress&quot;,&quot;fraud_warnings&quot;,&quot;paypal_through_tp&quot;,&quot;new_creator_checkout&quot;,&quot;circle_oauth&quot;]" data-course-data="{}" /><meta id="analytics-keys" name="analytics" data-analytics="{}" />
273    
274    <div class="root" onclick="offMenu(event)">
275      
276        
277        <!-- Preview bar -->
278        
279
280
281
282
283
284      
285      
286        <!-- HEADER -->
287<a id="top"></a>
288
289<style id="ncs">
290  :root {
291    
292    --header_width: 960px;
293  }
294</style>
295
296<header id="header" class="header header-sticky">
297  <!-- HEADER for Free Plan -->
298
299
300
301
302
303
304  <!-- Navbar -->
305  <nav
306    class="navbar is-not-signed-in is-homepage  at-top"
307    id='navbar'
308    role='navigation'>
309    <div class='navbar__header'>
310      <!-- Site logo -->
311      
312        <a class='navbar__header__logolink' href='https://netninja.dev'>
313          <img src="https://static-media.hotmart.com/AxV9C7jWUhDpJd_ejDijLp7WuYk=/0x60/https://uploads.teachablecdn.com/attachments/zSQUf9aERqjDof3P4l3Q_logo.png" alt="Net Ninja" srcset="https://static-media.hotmart.com/0LEWb7kIGQT6aSWCMaQecQYrnp8=/0x120/https://uploads.teachablecdn.com/attachments/zSQUf9aERqjDof3P4l3Q_logo.png 2x" />
314        </a>
315        
316      <!-- Header Menu -->
317      <div class="navbar__menu">
318          <button for="f-toggle" tabindex="0" role="button" id="hamburger" class="hamburger" aria-label="Toggle navigation"
319          onclick="toggleMenu('hamburger-menu')">
320          <span></span>
321          </button>
322          <ul class='navbar__menu__list menu hidden' id="hamburger-menu" role="menu" aria-describedby="hamburger" tabindex="0">
323  
324  
325  <li>
326    
327    <a href='/p/net-ninja-pro/' target=''>
328      Net Ninja Pro
329    </a>
330    
331  </li>
332  
333  <li>
334    
335    <a href='/courses' target=''>
336      All Courses
337    </a>
338    
339  </li>
340  
341  <li>
342    
343    <a href='https://net-ninja1.community.teachable.com/' target='_blank'>
344      Community
345    </a>
346    
347  </li>
348  
349  <li>
350    
351    <a href='https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg' target='_blank'>
352      YouTube Channel
353    </a>
354    
355  </li>
356  
357
358  <!-- If more than 5 links, collapse the rest in a dropdown -->
359  
360  
361    
362      <li>
363        <a href='/sign_in'>
364          Login
365        </a>
366      </li>
367    
368    
369      <li>
370        <a href='/sign_up'>
371          Sign Up
372        </a>
373      </li>
374    
375  
376</ul>
377
378      </div>
379    </div>
380  </nav>
381</header>
382
383      
384      <main class='view-school page-layout-v2 main'>
385        
386  
387
388  
389
390  
391
392  
393    <div id="blocks" data-ss-school-id='925908' class="blocks-page blocks-page-blank_page_v2 ">
394  
395  
396    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
397
398  
399    
400
401      
402
403      
404        <div class="course-block block custom_html  " id="block-217670058">
405      
406
407        <!-- if no liquid block data saved we render a default state -->
408
409<style>
410  .blank-template-body {
411  color: #36414D;
412  font-size: 16px;
413  font-weight: 400;
414  line-height: 24px;
415  opacity: 0.6;
416  width: 750px;
417  text-align: left;
418  }
419</style>
420
421
422  
423    <div class="pro-bar">
424  <p>Get instant access to <strong>every course</strong> with a <strong>Net Ninja Pro subscription</strong>. <strong>Just $9/mo.</strong> <a href="/p/net-ninja-pro/">Learn More</a></p>
425</div>
426
427<style>
428.pro-bar {
429  width: 100%;
430  padding: 10px;
431  background-color: #C39939;
432  color: white;
433  position: relative;
434  font-size: 1.5rem;
435  text-align: center;
436  line-height: 2.5rem;
437}
438.pro-bar a {
439  background-color: #AA8531;
440  color: white;
441  padding: 10px 20px;
442  border-radius: 5px;
443  text-decoration: none;
444  font-weight: 500;
445  margin-left: 20px;
446  display: inline-block;
447}
448.pro-bar a::after {
449  content: '>';
450  display: inline-block;
451  margin-left: 15px;
452  position: relative;
453  top: 0.5px;
454  transform: scaleY(1.1);
455}
456
457@media screen and (max-width: 760px) {
458  
459.pro-bar a {
460  background-color: transparent;
461  color: white;
462  padding: 0;
463  text-decoration: underline;
464}
465.pro-bar a::after {
466  display: none;
467}
468  
469}
470</style>
471  
472
473
474
475      
476        </div>
477      
478
479    
480  
481
482
483  
484    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
485
486  
487    
488
489      
490
491      
492        <div class="course-block block custom_html  " id="block-217670059">
493      
494
495        <!-- if no liquid block data saved we render a default state -->
496
497<style>
498  .blank-template-body {
499  color: #36414D;
500  font-size: 16px;
501  font-weight: 400;
502  line-height: 24px;
503  opacity: 0.6;
504  width: 750px;
505  text-align: left;
506  }
507</style>
508
509
510  
511    <div class="main-banner-block">
512  <h2>
513    <div>Black-Belt</div>
514    <div>Your coding skills</div>
515  </h2>
516
517  <p class="leading-text">Get access to <span class="highlight">over 2,000</span> premium coding tutorials.</p>
518
519  <a href="/courses" class="cta-btn">Browse All Courses</a>
520  <a href="/courses/category/masterclass" class="cta-btn" style="background-color: #c39939;">Masterclass Courses</a>
521</div>
522
523
524<style>
525@import url('https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap');
526
527.course-block.block.custom_html {
528  padding: 0;
529}
530.main-banner-block * {
531  font-family: "Rubik", sans-serif;
532}
533.main-banner-block {
534  background: rgb(33,33,33);
535  background: linear-gradient(139deg, rgba(33,33,33,1) 0%, rgba(38,38,38,1) 50%, rgba(42,42,42,1) 50%, rgba(34,34,34,1) 100%);
536  text-align: center;
537  padding: 80px 20px;
538}
539.main-banner-block h2 {
540  font-weight: bold;
541  display: inline-block;
542  color: white;
543  padding: 0 10px;
544  position: relative;
545  z-index: 1;
546  margin-bottom: 30px;
547}
548.main-banner-block h2::after {
549  content: '';
550  display: block;
551  width: calc(100% + 20px);
552  height: 9em;
553  background-color: black;
554  margin-top: -8.5em;
555  margin-left: 0px;
556  padding: 0 20px;
557  position: relative;
558  left: -10px;
559  z-index: -1;
560}
561.main-banner-block h2 div:first-child {
562  font-size: 8rem;
563}
564.main-banner-block h2 div:nth-child(2) {
565  font-size: 4.6rem;
566}
567.main-banner-block .highlight {
568  color: #C39939;
569}
570.main-banner-block p.leading-text {
571  font-weight: 600;
572  font-size: 1.8rem;
573  color: white;
574}
575.main-banner-block .cta-btn {
576  display: inline-block;
577  background-color: #2AC17F;
578  color: white;
579  padding: 15px 20px;
580  border-radius: 5px;
581  text-decoration: none;
582  font-weight: 500;
583  font-size: 2rem;
584  margin: 30px 10px 0;
585}
586.cta-btn::after {
587  content: '>';
588  display: inline-block;
589  margin-left: 15px;
590  position: relative;
591  top: 0.5px;
592  transform: scaleY(1.1);
593}
594
595@media screen and (max-width: 720px) {
596
597.main-banner-block h2::after {
598
599  height: 5em;
600  background-color: black;
601  margin-top: -4.5em;
602  margin-left: 0px;
603}
604.main-banner-block h2 div:first-child {
605  font-size: 4rem;
606}
607.main-banner-block h2 div:nth-child(2) {
608  font-size: 2.3rem;
609}
610.main-banner-block p.leading-text {
611
612  line-height: 1.5em;
613}
614
615}
616</style>
617  
618
619
620
621      
622        </div>
623      
624
625    
626  
627
628
629  
630    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
631
632  
633    
634
635      
636
637      
638        <div class="course-block block custom_html  " id="block-217670060">
639      
640
641        <!-- if no liquid block data saved we render a default state -->
642
643<style>
644  .blank-template-body {
645  color: #36414D;
646  font-size: 16px;
647  font-weight: 400;
648  line-height: 24px;
649  opacity: 0.6;
650  width: 750px;
651  text-align: left;
652  }
653</style>
654
655
656  
657    <div class="new-to-web-dev-block">
658  <div class="grid-section">
659    <div>
660      <h3>New to Web Dev?</h3>
661      <p class="initial">We have you covered! Get up to speed quickly with HTML, CSS, JavaScript & TypeScript by grabbing the <a href="/p/new-coder-bundle"><span class="highlight">New Coder bundle for just $10</span></a>, normally $21 when bought separately!</p>
662      <a href="/p/new-coder-bundle" class="cta-btn">Learn More</a>
663      <p>You can also check our 🎯 <a href="/p/new-developer-roadmap">New Developer Roadmap</a> to help you decide what to learn next, or check out our most ❤️ <a href="#popular-courses-section">popular courses</a> down below.</p>
664    </div>
665    <img src="https://res.cloudinary.com/net-ninja/image/upload/v1713357087/Net%20Ninja%20Pro/images/bundle_nwitkx.svg" alt="html & css course image">
666  </div>
667</div>
668
669<style>
670  .new-to-web-dev-block * {
671    font-family: "Rubik", sans-serif;
672  }
673  .new-to-web-dev-block {
674    background: #2A2A2A;
675    color: white;
676    padding: 60px 20px;
677  }
678  .new-to-web-dev-block p {
679    font-size: 1.6rem;
680    max-width: 640px;
681    line-height: 1.5em;
682  }
683  .new-to-web-dev-block p.initial a {
684    text-decoration: none;
685  }
686  .new-to-web-dev-block img{
687    max-width: 100%;
688  }
689  .new-to-web-dev-block .grid-section {
690    display: grid;
691    grid-template-columns: 3fr 2fr;
692    gap: 30px;
693    max-width: 1200px;
694    margin: 0 auto;
695    align-items: center;
696  }
697  .new-to-web-dev-block h3 {
698    font-size: 3rem;
699    font-weight: bold;
700    display: inline-block;
701    color: white;
702    padding: 0 10px;
703    position: relative;
704    z-index: 1;
705    margin-bottom: 30px;
706  }
707  .new-to-web-dev-block h3::after {
708    content: '';
709    display: block;
710    width: calc(100% + 20px);
711    height: 1em;
712    background-color: black;
713    margin-top: -0.5em;
714    margin-left: 0px;
715    padding: 0 20px;
716    position: relative;
717    left: -10px;
718    z-index: -1;
719  }
720  .new-to-web-dev-block .highlight {
721    color: #C39939;
722    text-decoration: none !important;
723  }
724  .main-banner-block p.leading-text {
725    font-weight: 600;
726    font-size: 1.8rem;
727    color: white;
728  }
729  .new-to-web-dev-block .cta-btn {
730    display: inline-block;
731    background-color: #2AC17F;
732    color: white;
733    padding: 15px 20px;
734    border-radius: 5px;
735    text-decoration: none;
736    font-weight: 500;
737    font-size: 1.5rem;
738    margin: 30px 0;
739  }
740  .new-to-web-dev-block .cta-btn::after {
741    content: '>';
742    display: inline-block;
743    margin-left: 15px;
744    position: relative;
745    top: 0.5px;
746    transform: scaleY(1.1);
747  }
748  .new-to-web-dev-block p a {
749    text-decoration: underline;
750    color: white;
751  }
752   
753@media screen and (max-width: 720px) {
754
755.new-to-web-dev-block .grid-section {
756  grid-template-columns: 1fr;
757}
758.new-to-web-dev-block .grid-section img {
759  max-width: 300px;
760  margin: 0 auto;
761}
762.new-to-web-dev-block h3 {
763  font-size: 2rem;
764}
765
766
767}
768</style>
769  
770
771
772
773      
774        </div>
775      
776
777    
778  
779
780
781  
782    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
783
784  
785    
786
787      
788
789      
790        <div class="course-block block custom_html  " id="block-217670061">
791      
792
793        <!-- if no liquid block data saved we render a default state -->
794
795<style>
796  .blank-template-body {
797  color: #36414D;
798  font-size: 16px;
799  font-weight: 400;
800  line-height: 24px;
801  opacity: 0.6;
802  width: 750px;
803  text-align: left;
804  }
805</style>
806
807
808  
809    <div class="welcome-to-dojo">
810  <h3>Welcome to the Coding Dojo</h3>
811  <p>Where aspiring coding ninjas train in the art of web development.</p>
812  <div class="tech-icon-row">
813    <ul>
814        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616073951/Net%20Ninja%20Pro/svg/icons/html-logo_lfmuid.svg"></li>
815        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074126/Net%20Ninja%20Pro/svg/icons/js-logo_gvosxg.svg"></li>
816        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074122/Net%20Ninja%20Pro/svg/icons/flutter-logo_gl5iyt.svg"></li>
817        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074128/Net%20Ninja%20Pro/svg/icons/react-logo_q2iuni.svg"></li>
818        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074131/Net%20Ninja%20Pro/svg/icons/svelte-logo_lgisl0.svg"></li>
819        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074127/Net%20Ninja%20Pro/svg/icons/node-logo_runwwy.svg"></li>
820        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074133/Net%20Ninja%20Pro/svg/icons/typescript-logo_oldkpo.svg"></li>
821        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074129/Net%20Ninja%20Pro/svg/icons/sapper-logo_pqplkk.svg"></li>
822        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074124/Net%20Ninja%20Pro/svg/icons/gatsby-logo_chwupz.svg"></li>
823        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074125/Net%20Ninja%20Pro/svg/icons/graphql-logo_xfmygj.svg"></li>
824        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074123/Net%20Ninja%20Pro/svg/icons/framer-logo_joymgk.svg"></li>
825        <li><img src="https://res.cloudinary.com/net-ninja/image/upload/v1616074121/Net%20Ninja%20Pro/svg/icons/firebase-logo_kkewft.svg"></li>
826    </ul>
827  </div>
828</div>
829
830<style>
831.tech-icon-row{
832  padding: 20px 20px 0;
833}
834.tech-icon-row ul {
835  text-align: center;
836  margin: 0 auto;
837}
838.tech-icon-row li {
839  display: inline-block;
840  margin: 10px;
841  height: 40px;
842}
843.tech-icon-row ul img {
844  height: 100%;
845}
846.tech-icon-row li:hover {
847  animation: bounce 0.8s ease;
848}
849.welcome-to-dojo {
850  text-align: center;
851  padding: 40px 20px;
852  background: #242424;
853}
854.welcome-to-dojo h3 {
855  font-weight: bold;
856  font-size: 3rem;
857  display: inline-block;
858  color: white;
859  padding: 0 10px;
860  position: relative;
861  z-index: 1;
862}
863.welcome-to-dojo h3::after {
864  content: '';
865  display: block;
866  width: calc(100% + 20px);
867  height: 1em;
868  background-color: black;
869  margin-top: -0.5em;
870  margin-left: 0px;
871  padding: 0 20px;
872  position: relative;
873  left: -10px;
874  z-index: -1;
875}
876.welcome-to-dojo p {
877  margin: 20px 0;
878  color: white;
879  font-size: 1.5rem;
880  line-height: 1.5em;
881}
882
883@media screen and (max-width: 720px) {
884
885.welcome-to-dojo h3 {
886  font-size: 2rem;
887}
888
889
890}
891
892@keyframes bounce {
893  0% {
894      transform: scale(1, 1) translateY(0);
895  }
896
897  10% {
898      transform: scale(1.1, .9) translateY(0);
899  }
900
901  30% {
902      transform: scale(0.9, 1.1) translateY(-30px);
903  }
904
905  50% {
906      transform: scale(1, 1) translateY(0);
907  }
908
909  100% {
910      transform: scale(1, 1) translateY(0);
911  }
912}
913</style>
914  
915
916
917
918      
919        </div>
920      
921
922    
923  
924
925
926  
927    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
928
929  
930    
931
932      
933
934      
935        <div class="course-block block custom_html  " id="block-217670062">
936      
937
938        <!-- if no liquid block data saved we render a default state -->
939
940<style>
941  .blank-template-body {
942  color: #36414D;
943  font-size: 16px;
944  font-weight: 400;
945  line-height: 24px;
946  opacity: 0.6;
947  width: 750px;
948  text-align: left;
949  }
950</style>
951
952
953  
954    <div class="new-to-web-dev-block">
955  <div class="grid-section">
956    <div>
957      <h3>Become a Full-Stack Nuxt Ninja</h3>
958      <p class="initial">Learn how to become a full-stack Nuxt developer by grabbing the Full-Stack Nuxt course bundle, including how to integrate Pinia, a Firestore database and Firebase authentication 🧠</p>
959      <a href="/p/full-stack-nuxt-bundle" class="cta-btn">Start Learning</a>
960      <p>This bundle contains 6 courses for <strong style="color: #c39a3a">just $8</strong>, compared to $18 if bought separately 🤯</p>
961    </div>
962    <img class="nuxt" src="https://res.cloudinary.com/net-ninja/image/upload/v1728055036/Net%20Ninja%20Pro/images/nuxt-bundle-img_nafsxi.svg" alt="html & css course image">
963  </div>
964</div>
965
966<style>
967  .new-to-web-dev-block * {
968    font-family: "Rubik", sans-serif;
969  }
970  .new-to-web-dev-block {
971    background: #2A2A2A;
972    color: white;
973    padding: 60px 20px;
974  }
975  .new-to-web-dev-block p {
976    font-size: 1.6rem;
977    max-width: 640px;
978    line-height: 1.5em;
979  }
980  .new-to-web-dev-block p.initial a {
981    text-decoration: none;
982  }
983  .new-to-web-dev-block img.nuxt{
984    max-width: 100%;
985  }
986  .new-to-web-dev-block .grid-section {
987    display: grid;
988    grid-template-columns: 3fr 2fr;
989    gap: 30px;
990    max-width: 1200px;
991    margin: 0 auto;
992    align-items: center;
993  }
994  .new-to-web-dev-block h3 {
995    font-size: 3rem;
996    font-weight: bold;
997    display: inline-block;
998    color: white;
999    padding: 0 10px;
1000    position: relative;
1001    z-index: 1;
1002    margin-bottom: 30px;
1003  }
1004  .new-to-web-dev-block h3::after {
1005    content: '';
1006    display: block;
1007    width: calc(100% + 20px);
1008    height: 1em;
1009    background-color: black;
1010    margin-top: -0.5em;
1011    margin-left: 0px;
1012    padding: 0 20px;
1013    position: relative;
1014    left: -10px;
1015    z-index: -1;
1016  }
1017  .new-to-web-dev-block .highlight {
1018    color: #C39939;
1019    text-decoration: none !important;
1020  }
1021  .main-banner-block p.leading-text {
1022    font-weight: 600;
1023    font-size: 1.8rem;
1024    color: white;
1025  }
1026  .new-to-web-dev-block .cta-btn {
1027    display: inline-block;
1028    background-color: #2AC17F;
1029    color: white;
1030    padding: 15px 20px;
1031    border-radius: 5px;
1032    text-decoration: none;
1033    font-weight: 500;
1034    font-size: 1.5rem;
1035    margin: 30px 0;
1036  }
1037  .new-to-web-dev-block .cta-btn::after {
1038    content: '>';
1039    display: inline-block;
1040    margin-left: 15px;
1041    position: relative;
1042    top: 0.5px;
1043    transform: scaleY(1.1);
1044  }
1045  .new-to-web-dev-block p a {
1046    text-decoration: underline;
1047    color: white;
1048  }
1049   
1050@media screen and (max-width: 720px) {
1051
1052.new-to-web-dev-block .grid-section {
1053  grid-template-columns: 1fr;
1054}
1055.new-to-web-dev-block .grid-section img {
1056  max-width: 300px;
1057  margin: 0 auto;
1058}
1059.new-to-web-dev-block h3 {
1060  font-size: 2rem;
1061}
1062
1063
1064}
1065</style>
1066  
1067
1068
1069
1070      
1071        </div>
1072      
1073
1074    
1075  
1076
1077
1078  
1079    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
1080
1081  
1082    
1083
1084      <style type='text/css'>
1084.b-217670063-top { padding-top: 0.0px; } .b-217670063-bottom { padding-bottom: 33.6px; } .b-217670063-content_width { width: 960px; } .b-217670063-heading_color { color: #36414D; } .b-217670063-background_color { background-color: #FFFFFF; } .b-217670063-description_color { color: #36414D; }</style>
1085
1086      
1087        <div class="course-block block video  " id="block-217670063">
1088      
1089
1090        
1091
1092
1093<style>
1094  @media screen and (min-width: 768px) {
1095    .b-217670063-top {
1096      padding-top: 0px;
1097    }
1098    .b-217670063-bottom {
1099      padding-bottom: 60px;
1100    }
1101  }
1102</style>
1103
1104<section class="container bl b-217670063-top b-217670063-bottom b-217670063-background_color">
1105  <div class="block__video b-217670063-content_width">
1106    <div class="block__video__text-wrapper rich-text">
1107      
1108        <div class="block__video__heading_text b-217670063-heading_color">
1109          <p><br class="softbreak"></p>
1110        </div>
1111      
1112      
1113        <div class="b-217670063-description_color">
1114          <p><br class="softbreak"></p>
1115        </div>
1116    
1117    </div>
1118    
1119            <div class='wistia_responsive_padding'>
1120        <div class='wistia_responsive_wrapper'>
1121          <div class='hotmart_video_player public-hotmart-video' data-asset-id='1106418' data-asset-type='video_asset' data-page-id='15899977'>
1122          </div>
1123        </div>
1124      </div>
1125
1126    
1127  </div>
1128</section>
1129
1130
1131      
1132        </div>
1133      
1134
1135    
1136  
1137
1138
1139  
1140    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
1141
1142  
1143    
1144
1145      
1146
1147      
1148        <div class="course-block block custom_html  " id="block-217670064">
1149      
1150
1151        <!-- if no liquid block data saved we render a default state -->
1152
1153<style>
1154  .blank-template-body {
1155  color: #36414D;
1156  font-size: 16px;
1157  font-weight: 400;
1158  line-height: 24px;
1159  opacity: 0.6;
1160  width: 750px;
1161  text-align: left;
1162  }
1163</style>
1164
1165
1166  
1167    <div class="page-section pro-banner-offer">
1168  <div class="offer-container">
1169    <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616239606/Net%20Ninja%20Pro/pro-images/pro-logo_uhyz4k.svg" alt="net ninja pro logo">
1170    <p>Get instant access to <strong>Every Single Course</strong> by subscribing to <span class="highlight">Net Ninja Pro for just <strong>$9/month</strong></span>.</p>
1171    <div><a href="https://sso.teachable.com/secure/925908/checkout/3021318/net-ninja-pro" class="cta-btn cta-gold">Join Now</a></div>
1172  </div>
1173  <div class="promo-offer">
1174    <p><strong>First month <span class="highlight">HALF PRICE</span> with promo code <span class="highlight">NEWNINJA</span></strong></p>
1175    <p>That's a whole month of goodness for the price of a 🍕</p>  
1176  </div>
1177</div>
1178
1179<style>
1180/* pro offer section */
1181.pro-banner-offer p, 
1182.pro-banner-offer a{
1183  color: #e4e4e4;
1184  line-height: 1.7em;
1185  font-size: 1.6rem;
1186}
1187.pro-banner-offer span.highlight {
1188  color: #C39939;
1189}
1190.page-section.pro-banner-offer {
1191  background-color: #2A2A2A;
1192  padding-top: 120px;
1193  padding: 120px 20px 40px;
1194}
1195.pro-banner-offer .offer-container {
1196  position: relative;
1197  max-width: 680px;
1198  margin: 0 auto;
1199  padding: 10px 20px;
1200  border: 4px solid #C39939;
1201  border-radius: 8px;
1202  display: grid;
1203  grid-template-columns: 3fr 1fr;
1204  gap: 20px;
1205  align-items: center;
1206  justify-content: space-between;
1207}
1208.pro-banner-offer .offer-container img {
1209  position: absolute;
1210  top: -74px;
1211  left: calc(50% - 70px);
1212  transform: rotate(180deg);
1213}
1214.pro-banner-offer .promo-offer {
1215  max-width: 680px;
1216  margin: 20px auto;
1217}
1218.pro-banner-offer .promo-offer p {
1219  margin: 0;
1220  text-align: center
1221}
1222.cta-btn {
1223  display: inline-block;
1224  background-color: #2AC17F;
1225  color: white;
1226  padding: 10px 20px;
1227  border-radius: 5px;
1228  text-decoration: none;
1229  font-weight: 500;
1230}
1231.cta-btn::after {
1232  content: '>';
1233  display: inline-block;
1234  margin-left: 15px;
1235  position: relative;
1236  top: 0.5px;
1237  transform: scaleY(1.1);
1238}
1239.cta-gold {
1240  background-color: #C39939;
1241}
1242
1243@media screen and (max-width: 890px) {
1244
1245  .pro-banner-offer .offer-container {
1246    text-align: center;
1247    grid-template-columns: 1fr;
1248    align-items: center;
1249    justify-content: center;
1250  }
1251
1252}
1253</style>
1254  
1255
1256
1257
1258      
1259        </div>
1260      
1261
1262    
1263  
1264
1265
1266  
1267    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
1268
1269  
1270    
1271
1272      
1273
1274      
1275        <div class="course-block block custom_html  " id="block-217670065">
1276      
1277
1278        <!-- if no liquid block data saved we render a default state -->
1279
1280<style>
1281  .blank-template-body {
1282  color: #36414D;
1283  font-size: 16px;
1284  font-weight: 400;
1285  line-height: 24px;
1286  opacity: 0.6;
1287  width: 750px;
1288  text-align: left;
1289  }
1290</style>
1291
1292
1293  
1294    <div id="popular-courses-section"></div>
1295  
1296
1297
1298
1299      
1300        </div>
1301      
1302
1303    
1304  
1305
1306
1307  
1308    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
1309
1310  
1311    
1312
1313      <style type='text/css'>.b-217670066-top { padding-top: 22.400000000000002px; } .b-217670066-bottom { padding-bottom: 22.400000000000002px; } .b-217670066-card_style { --card_style: grid; } .b-217670066-gutter_width { --gutter-width: 24px; } .b-217670066-content_width { max-width: 960px; } .b-217670066-heading_color { color: #F2F2F2; } .b-217670066-background_color { background-color: #212121; } .b-217670066-card_border_color { border-color: #000000; } .b-217670066-card_border_width { border-width: 0px; } .b-217670066-card_border_radius { border-radius: 4px; } .b-217670066-card_text_alignment { text-align: left; } .b-217670066-button_border_radius { border-radius: 4px; } .b-217670066-card_background_color { background-color: #2E2E2E; }</style>
1314
1315      
1316        <div class="course-block block featured_products  " id="block-217670066">
1317      
1318
1319        
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336<style>
1337  .block__featured-products__heading_text.b-217670066-heading_color {
1338    color: #F2F2F2;
1339  }
1340  .block__featured-products.b-217670066-background_color {
1341    background-color: #212121;
1342  }
1343  .block__featured-products .b-217670066-card_border_color,
1344  .block__featured-products .b-217670066-card_border_width {
1345    border: 0px solid #000000;
1346  }
1347  .block__featured-products .b-217670066-card_text_alignment .featured-product-card__content__title,
1348  .block__featured-products .b-217670066-card_text_alignment .course-card__content__subtitle {
1349    text-align: left;
1350  }
1351  .featured-product-card.b-217670066-card_background_color {
1352    background-color: #2E2E2E;
1353  }
1354  .block__featured-products__button .b-217670066-button_border_radius {
1355    border-radius: 4px;
1356  }
1357  @media screen and (min-width: 768px) {
1358    .b-217670066-top {
1359      padding-top: 40px;
1360    }
1361    .b-217670066-bottom {
1362      padding-bottom: 40px;
1363    }
1364    
1365    .b-217670066-gutter_width .block__columns, .b-217670066-gutter_width .block__columns__fixed {
1366        grid-column-gap: 24px;
1367    }
1368    
1369  }
1370</style>
1371
1372
1373
1374  <section class="bl block__featured-products block__featured-products__cards block__columns-per-row--3 b-217670066-top b-217670066-bottom b-217670066-gutter_width b-217670066-background_color">
1375    <div class="block__featured-products__heading_text b-217670066-heading_color rich-text"><h4>❤️ <strong>Popular Courses</strong><br class="softbreak">
1376</h4></div>
1377    <div class="block__columns b-217670066-content_width">
1378      
1379        
1380
1381
1382
1383<!-- Featured Product Listing -->
1384<div
1385  data-featured-product-type="Course" data-featured-product-id="1341437" class="featured-product-card card-style-grid block__column b-217670066-card_background_color b-217670066-card_border_color b-217670066-card_border_width b-217670066-card_border_radius b-217670066-card_text_alignment">
1386  <a href="/p/net-ninja-pro">
1387    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1388    <div class="featured-product-card__image-container">
1389      
1390        <img src="https://static-media.hotmart.com/dW0BphGvVFGctWD0aUc-5S7yPPI=/705x0/https://uploads.teachablecdn.com/attachments/MoegpvuSSqeA1kfeT2rQ_net-ninja-pro-thumb.png" role="presentation" />
1391      
1392    </div>
1393    <div class="featured-product-card__content">
1394      <h3 class="featured-product-card__content__title" title="Net Ninja Pro">
1395        
1396          Net Ninja Pro
1397        
1398      </h3>
1399
1400      
1401        <!-- Progress bar (enrolled users) -->
1402        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1403          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-1341437" class="featured-product-card__progressbar-fill"></div>
1404        </div>
1405      
1406
1407      <!-- Subtitle (unenrolled users) -->
1408      <h4 class="featured-product-card__content__subtitle" title="Access all courses in the Net Ninja Pro library - Including all Masterclass Courses, all Pro-Exclusive courses, and early access to every free course too.">
1409        
1410          Access all courses in the Net Ninja Pro library - Including all Masterclass Courses, all Pro-Exclusive courses, and early access to every free course too.
1411        
1412      </h4>
1413      <div class="featured-product-card__meta">
1414        <!-- Bundle v1 Info (everyone) -->
1415        
1416          <p class="featured-product-card__meta__item featured-product-card__bundle">
1417            118 Course Bundle
1418          </p>
1419        
1420
1421        
1422          <!-- Progress percentage (enrolled users) -->
1423          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1424            <span class="featured-product-card__percentage" id="percent-complete-1341437" data-featured-product-id="1341437">
1425              %
1426            </span>
1427            COMPLETE
1428          </div>
1429        
1430
1431        <!-- Price (unenrolled users) -->
1432        <p data-include-vat-price=3021318 class="featured-product-card__meta__item featured-product-card__price">
1433          
1434            $9/month
1435          
1436        </p>
1437      </div>
1438    </div>
1439  </a>
1440</div>
1441
1442      
1443        
1444
1445
1446
1447<!-- Featured Product Listing -->
1448<div
1449  data-featured-product-type="Course" data-featured-product-id="2931538" class="featured-product-card card-style-grid block__column b-217670066-card_background_color b-217670066-card_border_color b-217670066-card_border_width b-217670066-card_border_radius b-217670066-card_text_alignment">
1450  <a href="/p/claude-code-masterclass">
1451    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1452    <div class="featured-product-card__image-container">
1453      
1454        <img src="https://static-media.hotmart.com/N9A6TeIkIak4W7gMbQNCbJClyG8=/705x0/https://uploads.teachablecdn.com/attachments/f0c895929a3f4dfa8889d2c1435842f4.png" role="presentation" />
1455      
1456    </div>
1457    <div class="featured-product-card__content">
1458      <h3 class="featured-product-card__content__title" title="Claude Code Masterclass">
1459        
1460          Claude Code Masterclass
1461        
1462      </h3>
1463
1464      
1465        <!-- Progress bar (enrolled users) -->
1466        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1467          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2931538" class="featured-product-card__progressbar-fill"></div>
1468        </div>
1469      
1470
1471      <!-- Subtitle (unenrolled users) -->
1472      <h4 class="featured-product-card__content__subtitle" title="Master AI-driven development with Claude Code &amp; supercharge your productivity.">
1473        
1474          Master AI-driven development with Claude Code &amp; supercharge your productivity.
1475        
1476      </h4>
1477      <div class="featured-product-card__meta">
1478        <!-- Bundle v1 Info (everyone) -->
1479        
1480          <!-- Author Image and Name (everyone) -->
1481          <div class="featured-product-card__meta__item featured-product-card__author">
1482            
1483              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1484            
1485            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1486              
1487                Net Ninja (Shaun)
1488              
1489            </p>
1490          </div>
1491        
1492
1493        
1494          <!-- Progress percentage (enrolled users) -->
1495          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1496            <span class="featured-product-card__percentage" id="percent-complete-2931538" data-featured-product-id="2931538">
1497              %
1498            </span>
1499            COMPLETE
1500          </div>
1501        
1502
1503        <!-- Price (unenrolled users) -->
1504        <p data-include-vat-price=6603178 class="featured-product-card__meta__item featured-product-card__price">
1505          
1506            $15
1507          
1508        </p>
1509      </div>
1510    </div>
1511  </a>
1512</div>
1513
1514      
1515        
1516
1517
1518
1519<!-- Featured Product Listing -->
1520<div
1521  data-featured-product-type="Course" data-featured-product-id="2480514" class="featured-product-card card-style-grid block__column b-217670066-card_background_color b-217670066-card_border_color b-217670066-card_border_width b-217670066-card_border_radius b-217670066-card_text_alignment">
1522  <a href="/p/flutter-masterclass">
1523    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1524    <div class="featured-product-card__image-container">
1525      
1526        <img src="https://static-media.hotmart.com/88d9CYU5socbtzhDGCc1ksv3Iiw=/705x0/https://uploads.teachablecdn.com/attachments/le48KOtRcKhv0gayr0JA_flutter-masterclass-cover-with-banner.png" role="presentation" />
1527      
1528    </div>
1529    <div class="featured-product-card__content">
1530      <h3 class="featured-product-card__content__title" title="Flutter Masterclass">
1531        
1532          Flutter Masterclass
1533        
1534      </h3>
1535
1536      
1537        <!-- Progress bar (enrolled users) -->
1538        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1539          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2480514" class="featured-product-card__progressbar-fill"></div>
1540        </div>
1541      
1542
1543      <!-- Subtitle (unenrolled users) -->
1544      <h4 class="featured-product-card__content__subtitle" title="Learn how to make Flutter Applications like a ninja (from scratch).">
1545        
1546          Learn how to make Flutter Applications like a ninja (from scratch).
1547        
1548      </h4>
1549      <div class="featured-product-card__meta">
1550        <!-- Bundle v1 Info (everyone) -->
1551        
1552          <!-- Author Image and Name (everyone) -->
1553          <div class="featured-product-card__meta__item featured-product-card__author">
1554            
1555              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1556            
1557            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1558              
1559                Net Ninja (Shaun)
1560              
1561            </p>
1562          </div>
1563        
1564
1565        
1566          <!-- Progress percentage (enrolled users) -->
1567          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1568            <span class="featured-product-card__percentage" id="percent-complete-2480514" data-featured-product-id="2480514">
1569              %
1570            </span>
1571            COMPLETE
1572          </div>
1573        
1574
1575        <!-- Price (unenrolled users) -->
1576        <p data-include-vat-price=5391534 class="featured-product-card__meta__item featured-product-card__price">
1577          
1578            $10
1579          
1580        </p>
1581      </div>
1582    </div>
1583  </a>
1584</div>
1585
1586      
1587        
1588
1589
1590
1591<!-- Featured Product Listing -->
1592<div
1593  data-featured-product-type="Course" data-featured-product-id="2154826" class="featured-product-card card-style-grid block__column b-217670066-card_background_color b-217670066-card_border_color b-217670066-card_border_width b-217670066-card_border_radius b-217670066-card_text_alignment">
1594  <a href="/p/next-13-masterclass">
1595    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1596    <div class="featured-product-card__image-container">
1597      
1598        <img src="https://static-media.hotmart.com/F0DndoQfp0C9trSXHmTpCCHNq4g=/705x0/https://uploads.teachablecdn.com/attachments/g2pC1d3GTwCrWwu3PalW_next-13-masterclass-cover-pro.png" role="presentation" />
1599      
1600    </div>
1601    <div class="featured-product-card__content">
1602      <h3 class="featured-product-card__content__title" title="Next 13 Masterclass">
1603        
1604          Next 13 Masterclass
1605        
1606      </h3>
1607
1608      
1609        <!-- Progress bar (enrolled users) -->
1610        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1611          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2154826" class="featured-product-card__progressbar-fill"></div>
1612        </div>
1613      
1614
1615      <!-- Subtitle (unenrolled users) -->
1616      <h4 class="featured-product-card__content__subtitle" title="Learn how to use Next.js 13 from thr ground up to make a ticketing helpdesk site.">
1617        
1618          Learn how to use Next.js 13 from thr ground up to make a ticketing helpdesk site.
1619        
1620      </h4>
1621      <div class="featured-product-card__meta">
1622        <!-- Bundle v1 Info (everyone) -->
1623        
1624          <!-- Author Image and Name (everyone) -->
1625          <div class="featured-product-card__meta__item featured-product-card__author">
1626            
1627              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1628            
1629            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1630              
1631                Net Ninja (Shaun)
1632              
1633            </p>
1634          </div>
1635        
1636
1637        
1638          <!-- Progress percentage (enrolled users) -->
1639          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1640            <span class="featured-product-card__percentage" id="percent-complete-2154826" data-featured-product-id="2154826">
1641              %
1642            </span>
1643            COMPLETE
1644          </div>
1645        
1646
1647        <!-- Price (unenrolled users) -->
1648        <p data-include-vat-price=4927245 class="featured-product-card__meta__item featured-product-card__price">
1649          
1650            $10
1651          
1652        </p>
1653      </div>
1654    </div>
1655  </a>
1656</div>
1657
1658      
1659    </div>
1660    
1661      <div class="block__featured-products__button">
1662        <a href="/courses">
1663          <button class="base-button b-217670066-button_border_radius">
1664            View All Courses
1665          </button>
1666        </a>
1667      </div>
1668    
1669  </section>
1670
1671
1672
1673      
1674        </div>
1675      
1676
1677    
1678  
1679
1680
1681  
1682    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
1683
1684  
1685    
1686
1687      <style type='text/css'>.b-217670067-top { padding-top: 22.400000000000002px; } .b-217670067-bottom { padding-bottom: 22.400000000000002px; } .b-217670067-card_style { --card_style: grid; } .b-217670067-gutter_width { --gutter-width: 24px; } .b-217670067-content_width { max-width: 960px; } .b-217670067-heading_color { color: #F2F2F2; } .b-217670067-background_color { background-color: #232323; } .b-217670067-card_border_color { border-color: #000000; } .b-217670067-card_border_width { border-width: 0px; } .b-217670067-card_border_radius { border-radius: 4px; } .b-217670067-card_text_alignment { text-align: left; } .b-217670067-button_border_radius { border-radius: 4px; } .b-217670067-card_background_color { background-color: #2E2E2E; }</style>
1688
1689      
1690        <div class="course-block block featured_products  " id="block-217670067">
1691      
1692
1693        
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710<style>
1711  .block__featured-products__heading_text.b-217670067-heading_color {
1712    color: #F2F2F2;
1713  }
1714  .block__featured-products.b-217670067-background_color {
1715    background-color: #232323;
1716  }
1717  .block__featured-products .b-217670067-card_border_color,
1718  .block__featured-products .b-217670067-card_border_width {
1719    border: 0px solid #000000;
1720  }
1721  .block__featured-products .b-217670067-card_text_alignment .featured-product-card__content__title,
1722  .block__featured-products .b-217670067-card_text_alignment .course-card__content__subtitle {
1723    text-align: left;
1724  }
1725  .featured-product-card.b-217670067-card_background_color {
1726    background-color: #2E2E2E;
1727  }
1728  .block__featured-products__button .b-217670067-button_border_radius {
1729    border-radius: 4px;
1730  }
1731  @media screen and (min-width: 768px) {
1732    .b-217670067-top {
1733      padding-top: 40px;
1734    }
1735    .b-217670067-bottom {
1736      padding-bottom: 40px;
1737    }
1738    
1739    .b-217670067-gutter_width .block__columns, .b-217670067-gutter_width .block__columns__fixed {
1740        grid-column-gap: 24px;
1741    }
1742    
1743  }
1744</style>
1745
1746
1747
1748  <section class="bl block__featured-products block__featured-products__cards block__columns-per-row--3 b-217670067-top b-217670067-bottom b-217670067-gutter_width b-217670067-background_color">
1749    <div class="block__featured-products__heading_text b-217670067-heading_color rich-text"><h4>🔥 <strong>New Courses</strong><br class="softbreak">
1750</h4></div>
1751    <div class="block__columns b-217670067-content_width">
1752      
1753        
1754
1755
1756
1757<!-- Featured Product Listing -->
1758<div
1759  data-featured-product-type="Course" data-featured-product-id="2931538" class="featured-product-card card-style-grid block__column b-217670067-card_background_color b-217670067-card_border_color b-217670067-card_border_width b-217670067-card_border_radius b-217670067-card_text_alignment">
1760  <a href="/p/claude-code-masterclass">
1761    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1762    <div class="featured-product-card__image-container">
1763      
1764        <img src="https://static-media.hotmart.com/N9A6TeIkIak4W7gMbQNCbJClyG8=/705x0/https://uploads.teachablecdn.com/attachments/f0c895929a3f4dfa8889d2c1435842f4.png" role="presentation" />
1765      
1766    </div>
1767    <div class="featured-product-card__content">
1768      <h3 class="featured-product-card__content__title" title="Claude Code Masterclass">
1769        
1770          Claude Code Masterclass
1771        
1772      </h3>
1773
1774      
1775        <!-- Progress bar (enrolled users) -->
1776        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1777          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2931538" class="featured-product-card__progressbar-fill"></div>
1778        </div>
1779      
1780
1781      <!-- Subtitle (unenrolled users) -->
1782      <h4 class="featured-product-card__content__subtitle" title="Master AI-driven development with Claude Code &amp; supercharge your productivity.">
1783        
1784          Master AI-driven development with Claude Code &amp; supercharge your productivity.
1785        
1786      </h4>
1787      <div class="featured-product-card__meta">
1788        <!-- Bundle v1 Info (everyone) -->
1789        
1790          <!-- Author Image and Name (everyone) -->
1791          <div class="featured-product-card__meta__item featured-product-card__author">
1792            
1793              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1794            
1795            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1796              
1797                Net Ninja (Shaun)
1798              
1799            </p>
1800          </div>
1801        
1802
1803        
1804          <!-- Progress percentage (enrolled users) -->
1805          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1806            <span class="featured-product-card__percentage" id="percent-complete-2931538" data-featured-product-id="2931538">
1807              %
1808            </span>
1809            COMPLETE
1810          </div>
1811        
1812
1813        <!-- Price (unenrolled users) -->
1814        <p data-include-vat-price=6603178 class="featured-product-card__meta__item featured-product-card__price">
1815          
1816            $15
1817          
1818        </p>
1819      </div>
1820    </div>
1821  </a>
1822</div>
1823
1824      
1825        
1826
1827
1828
1829<!-- Featured Product Listing -->
1830<div
1831  data-featured-product-type="Course" data-featured-product-id="2860383" class="featured-product-card card-style-grid block__column b-217670067-card_background_color b-217670067-card_border_color b-217670067-card_border_width b-217670067-card_border_radius b-217670067-card_text_alignment">
1832  <a href="/p/git-github-masterclass">
1833    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1834    <div class="featured-product-card__image-container">
1835      
1836        <img src="https://static-media.hotmart.com/fhDtl4EB-VJF5mD8XrbO78mJ6qI=/705x0/https://uploads.teachablecdn.com/attachments/3a6ca5816bb748c6a4d0c45fc0d82fa6.png" role="presentation" />
1837      
1838    </div>
1839    <div class="featured-product-card__content">
1840      <h3 class="featured-product-card__content__title" title="Git &amp; GitHub Masterclass">
1841        
1842          Git &amp; GitHub Masterclass
1843        
1844      </h3>
1845
1846      
1847        <!-- Progress bar (enrolled users) -->
1848        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1849          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2860383" class="featured-product-card__progressbar-fill"></div>
1850        </div>
1851      
1852
1853      <!-- Subtitle (unenrolled users) -->
1854      <h4 class="featured-product-card__content__subtitle" title="Learn how to implement Git &amp; GitHub into your development workflows like a pro.">
1855        
1856          Learn how to implement Git &amp; GitHub into your development workflows like a pro.
1857        
1858      </h4>
1859      <div class="featured-product-card__meta">
1860        <!-- Bundle v1 Info (everyone) -->
1861        
1862          <!-- Author Image and Name (everyone) -->
1863          <div class="featured-product-card__meta__item featured-product-card__author">
1864            
1865              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1866            
1867            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1868              
1869                Net Ninja (Shaun)
1870              
1871            </p>
1872          </div>
1873        
1874
1875        
1876          <!-- Progress percentage (enrolled users) -->
1877          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1878            <span class="featured-product-card__percentage" id="percent-complete-2860383" data-featured-product-id="2860383">
1879              %
1880            </span>
1881            COMPLETE
1882          </div>
1883        
1884
1885        <!-- Price (unenrolled users) -->
1886        <p data-include-vat-price=6442515 class="featured-product-card__meta__item featured-product-card__price">
1887          
1888            $10
1889          
1890        </p>
1891      </div>
1892    </div>
1893  </a>
1894</div>
1895
1896      
1897        
1898
1899
1900
1901<!-- Featured Product Listing -->
1902<div
1903  data-featured-product-type="Course" data-featured-product-id="2703596" class="featured-product-card card-style-grid block__column b-217670067-card_background_color b-217670067-card_border_color b-217670067-card_border_width b-217670067-card_border_radius b-217670067-card_text_alignment">
1904  <a href="/p/foundations-of-algorithms-masterclass">
1905    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1906    <div class="featured-product-card__image-container">
1907      
1908        <img src="https://static-media.hotmart.com/-4oPlIRkjcqrlVICTtoSDWrEvWQ=/705x0/https://uploads.teachablecdn.com/attachments/tDjupcdXTuia8SgGbi9M_next-13-masterclass-cover+%E2%80%93+1.png" role="presentation" />
1909      
1910    </div>
1911    <div class="featured-product-card__content">
1912      <h3 class="featured-product-card__content__title" title="Foundations of Algorithms Masterclass">
1913        
1914          Foundations of Algorithms Masterclass
1915        
1916      </h3>
1917
1918      
1919        <!-- Progress bar (enrolled users) -->
1920        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1921          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-2703596" class="featured-product-card__progressbar-fill"></div>
1922        </div>
1923      
1924
1925      <!-- Subtitle (unenrolled users) -->
1926      <h4 class="featured-product-card__content__subtitle" title="Learn how to beat the coding interview and make efficient algorithms from the ground-up.">
1927        
1928          Learn how to beat the coding interview and make efficient algorithms from the ground-up.
1929        
1930      </h4>
1931      <div class="featured-product-card__meta">
1932        <!-- Bundle v1 Info (everyone) -->
1933        
1934          <!-- Author Image and Name (everyone) -->
1935          <div class="featured-product-card__meta__item featured-product-card__author">
1936            
1937              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
1938            
1939            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
1940              
1941                Net Ninja (Shaun)
1942              
1943            </p>
1944          </div>
1945        
1946
1947        
1948          <!-- Progress percentage (enrolled users) -->
1949          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
1950            <span class="featured-product-card__percentage" id="percent-complete-2703596" data-featured-product-id="2703596">
1951              %
1952            </span>
1953            COMPLETE
1954          </div>
1955        
1956
1957        <!-- Price (unenrolled users) -->
1958        <p data-include-vat-price=6000356 class="featured-product-card__meta__item featured-product-card__price">
1959          
1960            $10
1961          
1962        </p>
1963      </div>
1964    </div>
1965  </a>
1966</div>
1967
1968      
1969        
1970
1971
1972
1973<!-- Featured Product Listing -->
1974<div
1975  data-featured-product-type="Course" data-featured-product-id="3004750" class="featured-product-card card-style-grid block__column b-217670067-card_background_color b-217670067-card_border_color b-217670067-card_border_width b-217670067-card_border_radius b-217670067-card_text_alignment">
1976  <a href="/p/firebase-crash-course-auth-firestore">
1977    <!-- Featured Product Image, Name & Subtitle (everyone) -->
1978    <div class="featured-product-card__image-container">
1979      
1980        <img src="https://static-media.hotmart.com/OUUmdWqfqgkekDngwVCAzV4zPsk=/705x0/https://uploads.teachablecdn.com/attachments/35eb85a937a24b75b829ee0401faf775.png" role="presentation" />
1981      
1982    </div>
1983    <div class="featured-product-card__content">
1984      <h3 class="featured-product-card__content__title" title="Firebase Crash Course (Auth &amp; Firestore)">
1985        
1986          Firebase Crash Course (Auth &amp; Firestore)
1987        
1988      </h3>
1989
1990      
1991        <!-- Progress bar (enrolled users) -->
1992        <div aria-hidden="true" class="featured-product-card__progressbar hidden">
1993          <div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-labelledby="percent-complete-3004750" class="featured-product-card__progressbar-fill"></div>
1994        </div>
1995      
1996
1997      <!-- Subtitle (unenrolled users) -->
1998      <h4 class="featured-product-card__content__subtitle" title="Learn how to add Firebase backend services (like authentication and a real-time database) to your web apps.">
1999        
2000          Learn how to add Firebase backend services (like authentication and a real-time database) to your web apps.
2001        
2002      </h4>
2003      <div class="featured-product-card__meta">
2004        <!-- Bundle v1 Info (everyone) -->
2005        
2006          <!-- Author Image and Name (everyone) -->
2007          <div class="featured-product-card__meta__item featured-product-card__author">
2008            
2009              <img src="https://static-media.hotmart.com/XI2S9nTRay7J0vvRx3zA8sEknZA=/30x30/https://uploads.teachablecdn.com/attachments/539S2BoKR5KRXETzDS2k_tachable_profile_pic.PNG" alt="Net Ninja (Shaun)" />
2010            
2011            <p class="featured-product-card__author__name" title="Net Ninja (Shaun)">
2012              
2013                Net Ninja (Shaun)
2014              
2015            </p>
2016          </div>
2017        
2018
2019        
2020          <!-- Progress percentage (enrolled users) -->
2021          <div class="featured-product-card__meta__item featured-product-card__progress hidden" aria-hidden="true">
2022            <span class="featured-product-card__percentage" id="percent-complete-3004750" data-featured-product-id="3004750">
2023              %
2024            </span>
2025            COMPLETE
2026          </div>
2027        
2028
2029        <!-- Price (unenrolled users) -->
2030        <p data-include-vat-price=6802887 class="featured-product-card__meta__item featured-product-card__price">
2031          
2032            $3
2033          
2034        </p>
2035      </div>
2036    </div>
2037  </a>
2038</div>
2039
2040      
2041    </div>
2042    
2043      <div class="block__featured-products__button">
2044        <a href="/courses">
2045          <button class="base-button b-217670067-button_border_radius">
2046            View All Courses
2047          </button>
2048        </a>
2049      </div>
2050    
2051  </section>
2052
2053
2054
2055      
2056        </div>
2057      
2058
2059    
2060  
2061
2062
2063  
2064    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
2065
2066  
2067    
2068
2069      
2070
2071      
2072        <div class="course-block block custom_html  " id="block-217670068">
2073      
2074
2075        <!-- if no liquid block data saved we render a default state -->
2076
2077<style>
2078  .blank-template-body {
2079  color: #36414D;
2080  font-size: 16px;
2081  font-weight: 400;
2082  line-height: 24px;
2083  opacity: 0.6;
2084  width: 750px;
2085  text-align: left;
2086  }
2087</style>
2088
2089
2090  
2091    <div class="pro-membership-cards">
2092    <h2>Net Ninja <span>Pro</span></h2>
2093    <p class="lead">Get <span>instant access</span> to all courses with a <span>Net Ninja Pro</span> membership.</strong></p>
2094    <div class="pro-cards">
2095        <div class="card-wrapper">
2096            <div class="pro-card popular">
2097                <!--<img src="https://res.cloudinary.com/net-ninja/image/upload/v1616239606/Net%20Ninja%20Pro/pro-images/pro-logo_uhyz4k.svg">-->
2098                <div class="popular"><span>Most popular</span></div>
2099                <h3>Monthly Membership</h3>
2100                <p class="price"><span>$9</span>/mo</p>
2101                <ul>
2102                    <li>Instant access to all courses</li>
2103                    <li>Early access to new courses</li>
2104                    <li>Access to premium & Udemy courses</li>
2105                    <li>Cancel at any time</li>
2106                </ul>
2107                <a href="https://net-ninja-pro.teachable.com/purchase?product_id=3021318">Join Now</a>
2108            </div>
2109        </div>
2110        <div class="card-wrapper">
2111            <div class="pro-card">
2112                <!--<img src="https://res.cloudinary.com/net-ninja/image/upload/v1616239606/Net%20Ninja%20Pro/pro-images/pro-logo_uhyz4k.svg">-->
2113                <h3>Yearly Membership</h3>
2114                <p class="price"><span>$79</span>/yr</p>
2115                <ul>
2116                    <li>Instant access to all courses</li>
2117                    <li>Early access to new courses</li>
2118                    <li>Access to premium & Udemy courses</li>
2119                    <li>Save over 25%!</li>
2120                </ul>
2121                <a href="https://net-ninja-pro.teachable.com/purchase?product_id=3021316">Join Now</a>
2122            </div>
2123        </div>
2124    </div>
2125    <p>Get your first month half price when you use the code <strong><span>NEWNINJA</span></strong>. (monthly plan only).</p>
2126</div>
2127<style>
2128.pro-membership-cards {
2129    padding: 80px 60px 80px;
2130    background: #282828;
2131    font-family: "Rubik", sans-serif;
2132}
2133.pro-membership-cards h2 {
2134    text-align: center;
2135    color: white;
2136    font-size: 6em;
2137    font-weight: bold;
2138    letter-spacing: 4px;
2139}
2140.pro-membership-cards h2 span {
2141    color: #c39a3a;
2142}
2143.pro-membership-cards p.lead {
2144    font-size: 2em;
2145    margin-bottom: 40px
2146}
2147.pro-membership-cards p {
2148    text-align: center;
2149    font-size: 1.6em;
2150    letter-spacing: 1px;
2151    margin: 20px auto;
2152    line-height: 1.6em;
2153    max-width: 860px;
2154}
2155.pro-membership-cards p span {
2156    color: white;
2157    font-weight: bold
2158}
2159.pro-cards {
2160    display: grid;
2161    grid-template-columns: 1fr 1fr;
2162    grid-gap: 80px;
2163    max-width: 900px;
2164    margin: 70px auto;
2165}
2166.pro-card {
2167    background: #333;
2168    padding: 10px 20px;
2169    border-radius: 4px;
2170    box-shadow: 3px 5px 14px rgba(0, 0, 0, 0.1);
2171    position: relative;
2172}
2173.pro-card.popular {
2174    border: 3px solid #c39a3a;
2175}
2176
2177.pro-card h3 {
2178    font-size: 3em !important;
2179    max-width: 80%;
2180    text-align: center;
2181    margin: 60px auto 20px;
2182    font-size: 4.2em;
2183    font-weight: bold;
2184    color: #eee;
2185}
2186
2187.pro-card .price {
2188    margin-top: 40px;
2189    line-height: 2.5em;
2190    padding-bottom: 30px;
2191    border-bottom: 1px solid #424242;
2192    max-width: 200px;
2193}
2194
2195.pro-card .price span {
2196    font-size: 3.5em;
2197    margin: 0 12px;
2198}
2199
2200.pro-card .price::before {
2201    content: 'only'
2202}
2203
2204.pro-card ul {
2205    max-width: 330px;
2206    margin: 40px auto;
2207}
2208
2209.pro-card ul li {
2210    display: block;
2211    margin: 20px auto;
2212    text-align: left;
2213    height: auto;
2214    font-size: 1.4em;
2215    animation: none !important;
2216}
2217
2218.pro-card ul li::before {
2219    content: "whatshot";
2220    font-family: "Material Icons";
2221    font-size: 1.6em;
2222    position: relative;
2223    top: 5px;
2224    font-weight: normal;
2225    color: #f5c14a;
2226    margin-right: 10px;
2227}
2228
2229.pro-card a {
2230    background: #c39a3b;
2231    text-align: center;
2232    display: block;
2233    width: 200px;
2234    font-size: 2em;
2235    padding: 10px;
2236    color: white;
2237    margin: 45px auto 30px;
2238    border-radius: 4px;
2239    font-weight: 500;
2240    letter-spacing: 1px;
2241}
2242
2243.pro-card .popular {
2244    position: absolute;
2245    top: 20px;
2246    right: -47px;
2247    background: #c39a3a;
2248    color: white;
2249    font-size: 1.4em;
2250    width: 160px;
2251    border-radius: 2px 2px 0 0;
2252    padding: 8px;
2253    transform: rotate(45deg);
2254    text-align: center;
2255    font-weight: 500;
2256}
2257
2258.pro-card .popular::before {
2259    content: '';
2260    width: 0px;
2261    height: 0px;
2262    border-left: 8px solid transparent;
2263    border-right: 8px solid transparent;
2264    border-bottom: 8px solid #5d4b21;
2265    position: absolute;
2266    bottom: 0;
2267    left: 0;
2268    transform: rotate(-45deg) translateX(-8px) translateY(1px);
2269}
2270
2271.pro-card .popular::after {
2272    content: '';
2273    width: 0px;
2274    height: 0px;
2275    border-top: 8px solid transparent;
2276    border-bottom: 8px solid transparent;
2277    border-left: 8px solid #5d4b21;
2278    position: absolute;
2279    bottom: 0;
2280    right: 0;
2281    transform: rotate(-45deg) translateX(-9px) translateY(6px);
2282}
2283
2284.card-wrapper {
2285    padding: 8px;
2286    overflow: hidden;
2287}
2288
2289@media screen and (max-width: 900px) {
2290    .pro-membership-cards {
2291        padding-top: 60px;
2292    }
2293    .card-wrapper {
2294        max-width: 476px;
2295        margin: 0 auto;
2296    }
2297    .pro-cards {
2298        grid-template-columns: 1fr !important;
2299        grid-gap: 20px !important;
2300    }
2301    .pro-cards .pro-card {
2302        max-width: 460px;
2303        margin: 0 auto;
2304    }
2305    .pro-cards .pro-card h3 {
2306        font-size: 2em;
2307    }
2308    .pro-membership-cards p.lead {
2309        font-size: 1.5em !important;
2310        margin: 10px;
2311    }
2312}
2313
2314@media screen and (max-width: 767px) {
2315    .pro-membership-cards {
2316        padding: 60px 20px 30px;
2317    }
2318    .pro-membership-cards h3 {
2319        font-size: 2.8em !important;
2320    }
2321    
2322    .pro-membership-cards h2 {
2323        font-size: 3.5em;
2324    }
2325}
2326
2327</style>
2328  
2329
2330
2331
2332      
2333        </div>
2334      
2335
2336    
2337  
2338
2339
2340  
2341    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
2342
2343  
2344    
2345
2346      
2347
2348      
2349        <div class="course-block block custom_html  " id="block-217670069">
2350      
2351
2352        <!-- if no liquid block data saved we render a default state -->
2353
2354<style>
2355  .blank-template-body {
2356  color: #36414D;
2357  font-size: 16px;
2358  font-weight: 400;
2359  line-height: 24px;
2360  opacity: 0.6;
2361  width: 750px;
2362  text-align: left;
2363  }
2364</style>
2365
2366
2367  
2368    <div class="reviews-section">
2369  <h3>What Other Students (Ninjas) Say...</h3>
2370
2371  <div class="reviews-grid">
2372    
2373    <div class="review-card">
2374      <div class="review-heading">
2375        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616418710/Net%20Ninja%20Pro/testimonials/brian_wjtvzd.png" alt="ninja-head" />
2376        <div class="review-name-stars">
2377          <p>
2377Brian.</p>
2378          <div>⭐⭐⭐⭐⭐</div>
2379        </div>
2380      </div>
2381      <div class="review-body">
2382        <p>Shaun's ability to explain complex programming in an approachable, easy to understand, and fun way is truly unmatched by any youtuber or even any college professor I've ever had. He is a treasure.</p>
2383      </div>
2384    </div>
2385    <div class="review-card">
2386      <div class="review-heading">
2387        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616313565/Net%20Ninja%20Pro/testimonials/ph-av_mzdbkx.png" alt="ninja-head" />
2388        <div class="review-name-stars">
2389          <p>Istan L.</p>
2390          <div>⭐⭐⭐⭐⭐</div>
2391        </div>
2392      </div>
2393      <div class="review-body">
2394        <p>Shaun is a genuine teacher! He makes complex subjects easy to understand, and learning subjects I previously struggled with feels like playtime with him.</p>
2395      </div>
2396    </div>
2397    <div class="review-card">
2398      <div class="review-heading">
2399        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616313565/Net%20Ninja%20Pro/testimonials/ph-av_mzdbkx.png" alt="ninja-head" />
2400        <div class="review-name-stars">
2401          <p>Jim W.</p>
2402          <div>⭐⭐⭐⭐⭐</div>
2403        </div>
2404      </div>
2405      <div class="review-body">
2406        <p>The explanations are well thought out and are presented in a logical progression, at a comfortable pace. Shaun is one of the best instructors that I've ever experienced.</p>
2407      </div>
2408    </div>
2409    <div class="review-card">
2410      <div class="review-heading">
2411        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616313565/Net%20Ninja%20Pro/testimonials/ph-av_mzdbkx.png" alt="ninja-head" />
2412        <div class="review-name-stars">
2413          <p>Paulo N.</p>
2414          <div>⭐⭐⭐⭐⭐</div>
2415        </div>
2416      </div>
2417      <div class="review-body">
2418        <p>Clear concise and straightforward instructions. The instructor does a great job of making the lessons fun and enjoyable while keeping up with the learning objectives.</p>
2419      </div>
2420    </div>
2421    <div class="review-card">
2422      <div class="review-heading">
2423        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616418706/Net%20Ninja%20Pro/testimonials/last_cf2bnh.png" alt="ninja-head" />
2424        <div class="review-name-stars">
2425          <p>Сюлея.</p>
2426          <div>⭐⭐⭐⭐⭐</div>
2427        </div>
2428      </div>
2429      <div class="review-body">
2430        <p>Whenever I can't understand something in the programming courses I take or at uni, I turn to The Net Ninja - and whatever I need to know, he has an awesome and understandable video on it. So thank you! You're the best!</p>
2431      </div>
2432    </div>
2433    <div class="review-card">
2434      <div class="review-heading">
2435        <img src="https://res.cloudinary.com/net-ninja/image/upload/v1616313566/Net%20Ninja%20Pro/testimonials/samha_x4gvpa.png" alt="ninja-head" />
2436        <div class="review-name-stars">
2437          <p>Samha.</p>
2438          <div>⭐⭐⭐⭐⭐</div>
2439        </div>
2440      </div>
2441      <div class="review-body">
2442        <p>Net Ninja > Netflix 🤤</p>
2443      </div>
2444    </div>
2445
2446  </div><!-- end reviews grid-->
2447
2448  <p class="ending-text">But don't just take their word for it. Check out <a href="https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg" target="_blank ">Net Ninja on YouTube</a> for some free coding tutorials yourself 📺</p>
2449</div>
2450
2451<style>
2452
2453.reviews-section {
2454  padding: 40px 20px;
2455  text-align: center;
2456}
2457.reviews-section h3 {
2458  font-size: 2.4rem;
2459  font-weight: bold;
2460  display: inline-block;
2461  color: white;
2462  padding: 0 10px;
2463  position: relative;
2464  z-index: 1;
2465  margin-bottom: 40px;
2466}
2467.reviews-section h3::after {
2468  content: '';
2469  display: block;
2470  width: calc(100% + 20px);
2471  height: 1em;
2472  background-color: black;
2473  margin-top: -0.5em;
2474  margin-left: 0px;
2475  padding: 0 20px;
2476  position: relative;
2477  left: -10px;
2478  z-index: -1;
2479  
2480}
2481.reviews-section .reviews-grid {
2482  display: grid;
2483  grid-template-columns: 1fr 1fr;
2484  padding: 0 40px;
2485  max-width: 1200px;
2486  margin: 0 auto;
2487  gap: 30px;
2488}
2489.reviews-section .review-card {
2490  background: #333;
2491  color: white;
2492  padding: 20px;
2493  border-radius: 5px;
2494  text-align: left;
2495}
2496.reviews-section .review-heading {
2497  display: flex;
2498  align-items: center;
2499  gap: 20px;
2500}
2501.reviews-section .review-heading img {
2502  max-width: 50px;
2503}
2504.reviews-section .review-heading p {
2505  margin-bottom: 10px;
2506  font-size: 1.8rem;
2507}
2508.reviews-section .review-body {
2509  font-size: 1.4rem;
2510  color: #eaeaea;
2511  margin-top: 20px;
2512  line-height: 1.5em;
2513}
2514.reviews-section p.ending-text {
2515  margin: 80px 40px;
2516  font-size: 1.5rem;
2517  line-height: 2.5rem;
2518}
2519.reviews-section p.ending-text a {
2520  color: white;
2521  text-decoration: underline;
2522}
2523
2524@media screen and (max-width: 720px) {
2525
2526.reviews-section .reviews-grid {
2527  grid-template-columns: 1fr;
2528}
2529.reviews-section h3 {
2530  font-size: 1.5rem;
2531
2532}
2533
2534}
2535
2536</style>
2537  
2538
2539
2540
2541      
2542        </div>
2543      
2544
2545    
2546  
2547
2548
2549  
2550    <!-- in live preview mode we add an extra wrapper around each block, and remove the `block.show` check -->
2551
2552  
2553    
2554
2555      
2556
2557      
2558        <div class="course-block block custom_html  " id="block-217670070">
2559      
2560
2561        <!-- if no liquid block data saved we render a default state -->
2562
2563<style>
2564  .blank-template-body {
2565  color: #36414D;
2566  font-size: 16px;
2567  font-weight: 400;
2568  line-height: 24px;
2569  opacity: 0.6;
2570  width: 750px;
2571  text-align: left;
2572  }
2573</style>
2574
2575
2576  
2577    <div class="license-section">
2578  <h3>Want to License our Courses?</h3>
2579  <p>Get in touch at <strong>[email protected]</strong> to talk about it 👋</p>
2580</div>
2581
2582<style>
2583
2584.license-section{
2585  padding: 40px 20px;
2586  text-align: center;
2587  background: #282828;
2588}
2589.license-section p{
2590  font-size: 1.8em;
2591}
2592.license-section strong{
2593  color: white;
2594}
2595.license-section h3 {
2596  font-size: 2.4rem;
2597  font-weight: bold;
2598  display: inline-block;
2599  color: white;
2600  padding: 0 10px;
2601  position: relative;
2602  z-index: 1;
2603  margin-bottom: 40px;
2604}
2605.license-section h3::after {
2606  content: '';
2607  display: block;
2608  width: calc(100% + 20px);
2609  height: 1em;
2610  background-color: black;
2611  margin-top: -0.5em;
2612  margin-left: 0px;
2613  padding: 0 20px;
2614  position: relative;
2615  left: -10px;
2616  z-index: -1;
2617  
2618}
2619
2620</style>
2621  
2622
2623
2624
2625      
2626        </div>
2627      
2628
2629    
2630  
2631
2632
2633  
2634
2635  
2636    </div>
2637  
2638
2639
2640
2641
2642
2643
2644
2645
2646      </main>
2647      
2648        
2649<style id="footerStyles">
2650  :root {
2651    --footer_width: 960px;
2652  }
2653</style>
2654<footer class=''>
2655  <div class="footer">
2656    <div class='footer__wrapper'>
2657      <div class='footer__inner'>
2658        <ul class="footer__list">
2659          <li class="footer__copyright">
2660            ©
2661            Net Ninja
2662            2026
2663          </li>
2664          
2665              
2666                  <li>
2667                      <a href='https://twitter.com/thenetninjauk' target='_blank'>
2668                      Net Ninja on Twitter
2669                      </a>
2670                  </li>
2671              
2672                  <li>
2673                      <a href='https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg' target='_blank'>
2674                      Net Ninja on YouTube
2675                      </a>
2676                  </li>
2677              
2678                  <li>
2679                      <a href='https://net-ninja-pro.teachable.com/p/net-ninja-pro/' target=''>
2680                      Get Net Ninja Pro
2681                      </a>
2682                  </li>
2683              
2684          
2685        </ul>
2686        <ul class="footer__list legal-links">
2687          <li>
2688            <a href="/p/terms">
2689            Terms of Use
2690            </a>
2691          </li>
2692          <li>
2693            <a href="/p/privacy">
2694            Privacy Policy
2695            </a>
2696          </li>
2697          
2698          </ul>
2699        </div>
2700      </div>
2701    </div>
2702  </div>
2703</footer>
2704
2705
2706
2707      
2708    </div>
2709    
2709<script>
2710      if (!Element.prototype.closest) {
2711        Element.prototype.closest = function(s) {
2712          let el = this;
2713          do {
2714            if (el.matches(s))
2715              return el;
2716
2717
2718            el = el.parentElement || el.parentNode;
2719          } while (el !== null && el.nodeType === 1);
2720          return null;
2721        };
2722      }
2723      const offMenu = event => {
2724        if (event.target.closest('.navbar__menu'))
2725          return
2726
2727
2728
2729        document.querySelectorAll('.menu').forEach(item => {
2730          item.classList.add('hidden')
2731          item.setAttribute('aria-hidden', 'true')
2732        })
2733      }
2734      const toggleMenu = id => {
2735  const el = document.getElementById(id)
2736  if (el.classList.contains('hidden')) {
2737    document
2738      .querySelectorAll('.inner-menu')
2739      .forEach(item => {
2740        item.classList.add('hidden')
2741        item.setAttribute('aria-hidden', 'true')
2742      })
2743    el.classList.remove('hidden')
2744    el.setAttribute('aria-hidden', 'false')
2745  } else {
2746    el.classList.add('hidden')
2747    el.setAttribute('aria-hidden', 'true')
2748  }
2749  !el.classList.contains('hidden') && el.focus()
2750}
2751
2752
2753// toggle open class for v2 preview bar dropdown menu
2754      const v2Dropdown = document.getElementsByClassName('v2-dropdown')[0]
2755      const v2DropdownTrigger = document.querySelector('.v2-dropdown .menu-trigger')
2756
2757// if the preview bar dropdown exists, add event listener to toggle preview menu
2758      if (!! v2Dropdown) {
2759        v2DropdownTrigger.addEventListener('click', () => {
2760          v2Dropdown.classList.toggle('open')
2761        })
2762      }
2763
2764      const domBody = document.body
2765      const usingMouse = 'using-mouse'
2766      domBody.addEventListener('mousedown', () => {
2767        domBody.classList.add(usingMouse)
2768      })
2769      domBody.addEventListener('keydown', () => {
2770        domBody.classList.remove(usingMouse)
2771      })
2772
2773      const headerEl = document.querySelector('#navbar')
2774      const topHook = document.querySelector('#top')
2775      if ("IntersectionObserver" in window) {
2776        const observer = new IntersectionObserver(entries => {
2777          if (entries[0].boundingClientRect.y < 0) {
2778            headerEl.classList.remove('at-top')
2779          } else {
2780            headerEl.classList.add('at-top')
2781          }
2782        }, {threshold: 1});
2783        observer.observe(topHook)
2784      }
2785    </script>
2785
2786
2787    
2788
2789  </body>
2790</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.