(function(){'use strict';var PREVIEW_STEPS=2;var RESUME_KEY='rsc-lesson-v1:'+location.pathname;function ready(fn){if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',fn);else fn();} ready(function(){var content=document.getElementById('content')||document.body;var steps=Array.prototype.slice.call(content.querySelectorAll('.lesson-step'));if(!steps.length)return;var body=document.body;var ds=body.dataset||{};var access=(body.getAttribute('data-lesson-access')||'free').toLowerCase();var courseTitle=ds.courseTitle||'Course';var lessonTitle=(function(){var h=steps[0]&&steps[0].querySelector('h2');if(!h)return courseTitle;var c=h.cloneNode(true);Array.prototype.forEach.call(c.querySelectorAll('a'),function(a){if((a.textContent||'').trim()==='#')a.parentNode.removeChild(a);});var t=(c.textContent||'').trim().replace(/^#\s*/,'').replace(/\s*#$/,'').trim();return t||courseTitle;})();var lessonKind=(ds.lessonKind||'').toLowerCase();var showCounter=!!(ds.courseLesson&&ds.courseTotal)&&lessonKind!=='quiz';var landing=ds.courseLanding||'/';var nextHref=ds.courseNext||'';var total=steps.length;var courseId=ds.courseId||'';var curSlug=location.pathname.replace(/^\//,'').replace(/index\.html?$/i,'').replace(/\.html?$/i,'').replace(/\/$/,'');var COURSE_KEY='rsc-course-v1:'+courseId;var railCourse=null;var allCourses=[];var trackIndex=null;var railLevel='lessons';var curSection=null;var viewSection=null;var railWired=false;var state={furthest:0,passed:{}};try{var saved=JSON.parse(localStorage.getItem(RESUME_KEY));if(saved&&typeof saved==='object'){state.furthest=saved.furthest||0;state.passed=saved.passed||{};}}catch(e){} function save(){try{localStorage.setItem(RESUME_KEY,JSON.stringify(state));}catch(e){}} var app=document.createElement('div');app.className='lm-app';app.innerHTML='
'+esc(badge.name)+'
'+ (cardUrl?'The first lessons are free. Unlock the full '+esc(courseTitle)+' course, every interactive lesson, and your certificate with Pro.
'+'See plans →';stage.appendChild(pw);} pw.style.display='';curEl.textContent=Math.min(i+1,total);midEl.textContent='Preview complete';backBtn.disabled=false;contBtn.disabled=true;stage.scrollTop=0;} function renderPassChip(){var tr=app.querySelector('.lm-top-right');if(!tr||tr.querySelector('.lm-pass'))return;if(!passState||!passState.active||access!=='pro')return;var a=document.createElement('a');a.className='lm-pass';a.href='/pricing.html';a.textContent='Pass: '+passState.days_left+' day'+ (passState.days_left===1?'':'s')+' left';var cert=tr.querySelector('.lm-cert');if(cert){tr.insertBefore(a,cert);cert.style.display='none';} else tr.appendChild(a);try{if(typeof gtag==='function')gtag('event','pass_chip_view',{lesson:curSlug,days_left:passState.days_left});}catch(e){}} function updateGatePassCopy(){var g=stage.querySelector('.lm-gate');if(!g||body.classList.contains('pro'))return;var h=g.querySelector('h3');if(h&&h.textContent!=='Your 30-day Data Analyst pass has ended'){h.textContent='Your 30-day Data Analyst pass has ended';} if(!g.querySelector('.lm-gate-pass-note')){var n=document.createElement('p');n.className='lm-gate-pass-note';n.textContent='Everything you finished stays on your profile, and the New to R course stays free.';var pos=g.querySelector('.lm-gate-pos')||h;if(pos&&pos.parentNode)pos.parentNode.insertBefore(n,pos.nextSibling);}} function teardownGate(){var g=stage.querySelector('.lm-gate');if(g)g.style.display='none';stage.classList.remove('lm-gatelock');steps.forEach(function(s){s.classList.remove('lm-teaser','lm-teaser-quiz');});var sg=app.querySelector('.lm-segs');if(sg)sg.classList.remove('lm-gated');var sp=app.querySelector('.lm-stepper');if(sp)sp.classList.remove('lm-gated');} function fillGateFreeLink(){var a=stage.querySelector('[data-gate-free]');if(!a||!railCourse||!railCourse.lessons)return;for(var j=0;j'+pos+'
':'')+ (desc?''+esc(desc)+'
':'')+''+(isProUser?'Upgrade to All-Access →':'Unlock with Pro →')+''+'From $9/month, or $65 for a full year
'+'14-day money-back guarantee · cancel anytime
'+'The first lessons of this course are free →You have started '+esc(courseTitle)+'. It is free to continue: a free account unlocks the rest of this course, saves your progress, and lets you pick up on any device.
'+'Sign in to continue →'+'Free account, no card. Your first two lessons stay open.
'+'← Back to '+esc(exitLabel())+'';stage.appendChild(w);}else{w.style.display='';} segEls.forEach(function(e){e.className='';});curEl.textContent=Math.min(lessonOrder||(i+1),total);midEl.textContent='Free account needed';backBtn.disabled=true;contBtn.disabled=true;stage.scrollTop=0;} function render(){if(accountLocked){renderSignInWall();return;} if(locked&&!gateHold){renderProGate();return;} teardownGate();var sw=stage.querySelector('.lm-signin');if(sw)sw.style.display='none';if(showingPaywall){var p=stage.querySelector('.lm-paywall');if(p)p.style.display='none';showingPaywall=false;} steps.forEach(function(s,k){s.classList.toggle('on',k===i);});segEls.forEach(function(e,k){e.className=kstate.furthest){state.furthest=i;save();} if(window.LessonWidgets)window.LessonWidgets.mountAll(steps[i]);if(last){if(courseId)markCourseLessonDone(curSlug);showCompleteActions();} stage.scrollTop=0;} function go(delta){var target=i+delta;if(target<0||target>=total){if(target>=total&&i===total-1&&nextHref){location.href=nextHref;} return;} if(locked&&!gateHold){renderProGate();return;} i=target;render();} backBtn.addEventListener('click',function(){if(showingPaywall){render();return;} go(-1);});contBtn.addEventListener('click',function(){go(1);});document.addEventListener('keydown',function(e){var t=e.target;if(t&&(t.isContentEditable||(t.tagName&&/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))||(t.closest&&t.closest('.webr-container, .webr-editor, .webr-editor-input, [contenteditable="true"]')))){return;} if(e.key==='ArrowRight'&&!contBtn.disabled)go(1);else if(e.key==='ArrowLeft'&&!backBtn.disabled)go(-1);});function courseState(){try{return JSON.parse(localStorage.getItem(COURSE_KEY))||{};}catch(e){return{};}} function courseSave(s){try{localStorage.setItem(COURSE_KEY,JSON.stringify(s));}catch(e){}} function markCourseLessonDone(slug){if(!slug)return;var s=courseState();s.completed=s.completed||{};if(!s.completed[slug]){s.completed[slug]=true;s.last=slug;courseSave(s);renderRail();rsSignal('lesson_complete',courseId?courseId+':'+lessonOrder:slug);}} function curRoadmap(){return(railCourse&&railCourse.roadmap)||null;} function buildTrackIndex(){var rm=curRoadmap();if(!rm||!rm.track)return null;var idx={track:rm.track,trackLabel:rm.trackLabel||rm.track,sections:{}};allCourses.forEach(function(c){if(!c.roadmap||c.roadmap.track!==rm.track)return;var n=c.roadmap.section;var sec=idx.sections[n]||(idx.sections[n]={n:n,label:c.roadmap.sectionLabel||('Section '+n),courses:[]});sec.courses.push(c);});return idx;} function sectionNums(){return Object.keys(trackIndex.sections).map(Number).sort(function(a,b){return a-b;});} function railLessonRows(course,done,pro){var h='';(course.lessons||[]).forEach(function(l){var cur=l.slug===curSlug,isDone=!!done[l.slug];var lk=String(l.access||'').toLowerCase()==='pro'&&!pro;var soon=l.built===false;var cls='lm-rail-item'+(cur?' current':'')+(isDone?' done':'')+(lk?' locked':'')+(soon?' soon':'');var mk=isDone?'✓':''+(l.order||'')+'';var badge=soon?'soon':(lk?'Pro':'');var inner=mk+''+esc(l.title)+''+badge;if(cur||soon)h+='