1<!DOCTYPE html> 2<html lang="en"> 3 <head>
4<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"1f10a867da","applicationID":"1687898942","transactionName":"el9aEUVZDlRdEBkAR1BDWwFSRU1eSgdT","queueTime":1,"applicationTime":135,"agent":""}</script>
vendor: 1 bytes, line 4
4
5<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:"1834886665",accountID:"515039",trustKey:"515039",xpid:"UQcCUVVaGwIGXFZaDgkOUlY=",licenseKey:"1f10a867da",applicationID:"1687898942",browserID:"1834886665"};;/*! For license information please see nr-loader-spa-1.323.0.min.js.LICENSE.txt */ 6(()=>{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.323.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};
6e.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;
6const 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);
6if(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$:()=>
6o,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])}
6(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}
6;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.323.0.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="NRBA-1.323.0.PROD:";r.l=(n,i,s,a)=>
6{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-ORjtmy+nQMgxbu0os8+oTRa5sPzbinyuWSvpZrrstVLIaHofRRlfODdH+oUmkIgeQpM+vPf3vG/4RzvCsFVh1A==",249:"sha512-o7+K6xC0z3TqynjVxpd+jgiSgqy8rrPeRcUSqt5J0Rqg5Su5CycLMYfpwiM3WBCHiNDrG5aZoXJQ6HRc335XYQ==",212:"sha512-kRvBt1IYQDBnClTEWNaE8sDFqbXXM3Vdyf972Uf4MFbJxl7u3KmdO+jdB1H4achPEoT9YtNXHswaESey6sCH0A==",238:"sha512-U5EGmyYbFVR2UMNAuZJ7fTgVVtPa5b8RPMySDwXo7z3frRdkUJ2x1VAQTLQCeBab8VlGVGRV8FiSHIn/pwN72A=="};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.323.0.PROD"]=self["webpackChunk:NRBA-1.323.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
6ine_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()=>
6{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)=>
6null==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
6dTimingMethod(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
6imeToRegister: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})})}
6return 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,a=(0,ye.ZF)(),o=(0,ye.el)(),c=Date.now();this.agentRef.runtime?.timeKeeper?.ready&&(s=Math.floor(this.agentRef.runtime.timeKeeper.correctAbsoluteTimestamp(c)));var d={spanId:a,traceId:o,timestamp:c,timestampCorrected:s};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(d.traceContextParentHeader=this.generateTraceContextParentHeader(a,o),d.traceContextStateHeader=this.generateTraceContextStateHeader(a,s??c,r,n,i)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(d.newrelicHeader=this.generateTraceHeader(a,o,s??c,r,n,i)),d}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"
6!==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);
6if(!(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)}
6);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)})});
6class 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
6h(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>
6 7 <meta name="csrf-param" content="authenticity_token" /> 8<meta name="csrf-token" content="L40EmDyc_2knHOUdghTaQpn1WphiXfedUoCHNhjdDOTcaNyR_fUYaOwM4aQkCourTESCgh-dF3fr7aPz_BUgiQ" /> 9 <title> 10 NSScreencast: Bite-sized Screencasts for iOS Development 11 12 </title> 13 14 <link rel="stylesheet" href="/assets/application-a72913f4c604bc8f97dd576fc8777bf029401f6af0e14b6a6c9d3874acfe73e4.css" media="all" /> 15 <link rel="stylesheet" href="/assets/packs/css/173-2f07b8d1.css" media="all" /> 16<link rel="stylesheet" href="/assets/packs/css/application-43a41ef3.css" media="all" /> 17 18
18<script src="/assets/application-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.js" defer="defer"></script>
18 19
19<script src="/assets/packs/js/runtime-2691a3333ef6d2740e9c.js" defer="defer"></script>
vendor: 1 bytes, line 19
19
20<script src="/assets/packs/js/156-a9a450186a011b96a70f.js" defer="defer"></script>
vendor: 1 bytes, line 20
20
21<script src="/assets/packs/js/551-279eb89a4ceb85f0a4ef.js" defer="defer"></script>
vendor: 1 bytes, line 21
21
22<script src="/assets/packs/js/173-06c8d1a860ccba5feff4.js" defer="defer"></script>
vendor: 1 bytes, line 22
22
23<script src="/assets/packs/js/application-57282e05d5fed284668b.js" defer="defer"></script>
23 24
24<script src="https://plausible.ficklebits.com/js/script.pageview-props.revenue.tagged-events.js" defer="defer" data_domain="nsscreencast.com"></script>
24 25 26 <link rel="apple-touch-icon" href="/apple-touch-icon.png" /> 27<link rel="apple-touch-icon" href="/apple-touch-icon-57.png" sizes="57x57" /> 28<link rel="apple-touch-icon" href="/apple-touch-icon-60.png" sizes="60x60" /> 29<link rel="apple-touch-icon" href="/apple-touch-icon-72.png" sizes="72x72" /> 30<link rel="apple-touch-icon" href="/apple-touch-icon-76.png" sizes="76x76" /> 31<link rel="apple-touch-icon" href="/apple-touch-icon-114.png" sizes="114x114" /> 32<link rel="apple-touch-icon" href="/apple-touch-icon-120.png" sizes="120x120" /> 33<link rel="apple-touch-icon" href="/apple-touch-icon-144.png" sizes="144x144" /> 34<link rel="apple-touch-icon" href="/apple-touch-icon-152.png" sizes="152x152" /> 35<link rel="apple-touch-icon" href="/apple-touch-icon-180.png" sizes="180x180" /> 36
36<script src="https://js.stripe.com/v3/"></script>
36 37 <meta name="stripe_key" content="pk_We8Xa8ofwc203oH6aBvNiCisYsKNX" /> 38 39 <link rel="alternate" type="application/atom+xml" title="ATOM" href="/feed" /> 40 <link rel="shortcut icon" href="/favicon.gif" type="image/x-icon" /> 41 <link rel="mask-icon" href="/pinned-tab-icon.svg" color="#222222" /> 42 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> 43 <meta name="charset" content="UTF-8" /> 44 <meta name="google-site-verification" content="gOINAMQF7VDCKPren-Z3TjIbiDQ1iPYVMGPCrwK1p40" /> 45 <meta name="msvalidate.01" content="69848A080E92F9FF4285C34700A35DB4" /> 46 47 <meta name="apple-itunes-app" content="app-id=1130799278,affiliate-data=10l34415,app-argument=https://nsscreencast.com/episodes/free" /> 48 49 <meta name="description" content="A vast collection of topics for Swift Developers, updated regularly" /> 50 <meta property="og:description" content="A vast collection of topics for Swift Developers, updated regularly" /> 51 52 <link rel="canonical" href="https://nsscreencast.com/episodes/free" /> 53 54 </head> 55 56 <body class="hero"> 57 <div style="height: 68px;"></div> 58<nav id="topNav" class="bg-gray-800 fixed z-50 w-full " data-controller="menu" data-menu-open-value="false"> 59 <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> 60 <div class="flex items-center justify-between h-16"> 61 <div class="flex items-center"> 62 <div class="flex-shrink-0 -mt-4"> 63 <a href="/"> 64 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 459 136" class="text-white h-14 hidden md:block"> 65<g fill="#fff" fill-rule="evenodd"> 66<polygon points="119.02 78.025 119.02 111.58 112.46 111.58 112.46 65.25 121.6 65.25 129.08 92.984 129.08 65.25 135.56 65.25 135.56 111.58 128.08 111.58"></polygon> 67<g transform="translate(26.374 29.528)"> 68<path d="m122.76 35.193c7.082 0 10.723 4.236 10.723 11.65v1.456h-6.884v-1.92c0-3.309-1.324-4.567-3.64-4.567-2.317 0-3.641 1.258-3.641 4.567 0 9.532 14.231 11.32 14.231 24.558 0 7.413-3.707 11.65-10.855 11.65-7.149 0-10.856-4.237-10.856-11.65v-2.847h6.884v3.31c0 3.31 1.456 4.501 3.773 4.501s3.773-1.191 3.773-4.501c0-9.532-14.231-11.319-14.231-24.557 0-7.414 3.64-11.65 10.723-11.65"></path> 69<path d="m172.55 50.55c-0.241-4.1 0.582-7.344 2.469-9.728 1.405-1.758 2.75-2.637 4.035-2.637 2.69 0 4.036 1.821 4.036 5.461 0 1.674-0.763 3.536-2.289 5.586-1.968 2.595-4.637 4.289-8.011 5.084 0 0.125-0.081-1.13-0.24-3.766m11.263 1.538c3.091-2.825 4.637-5.701 4.637-8.63 0-3.222-1.084-5.628-3.252-7.218-1.768-1.339-3.815-1.924-6.144-1.757-4.336 0.293-7.99 1.904-10.961 4.832-3.414 3.348-5.522 8.097-6.324 14.247-4.096-1.421-6.646-3.64-7.65-6.653l-0.843-2.573c-0.402-0.836-1.045-1.255-1.927-1.255-0.241 0-0.482 0.022-0.723 0.063-0.924 0.168-1.385 0.816-1.385 1.946 0 1.255 0.501 2.678 1.505 4.267 2.208 3.557 5.782 6.089 10.721 7.595v1.757c0 7.867-0.722 13.097-2.168 15.691-1.285 2.259-3.915 3.619-7.89 4.079-0.402 0.043-0.783 0.063-1.145 0.063-2.81 0-4.215-1.422-4.215-4.268 0-0.878 0.24-1.632 0.722-2.259l2.048-2.511c0.401-0.543 0.602-1.213 0.602-2.008 0-1.339-0.502-2.532-1.505-3.578-1.165-1.129-2.59-1.631-4.277-1.506-2.249 0.168-4.035 1.234-5.36 3.201-1.205 1.757-1.807 3.787-1.807 6.088 0 2.846 0.904 5.272 2.71 7.28 2.57 2.846 6.545 4.268 11.926 4.268 9.796 0 16.563-4.1 20.297-12.301 1.285-2.845 1.807-7.281 1.566-13.306 4.135-0.878 7.749-2.73 10.842-5.554"></path> 70<path d="m366.91 76.721c-0.281 0-0.563-0.062-0.843-0.188-0.763-0.418-1.144-1.004-1.144-1.758 0-0.585 0.321-1.087 0.963-1.506 0.362-0.251 1.887-0.208 4.578 0.126-1.045 2.218-2.229 3.326-3.554 3.326m-20.056-9.414c-0.843 1.297-1.867 2.615-3.072 3.954-1.606 1.716-2.831 2.573-3.674 2.573-0.723 0-1.084-0.46-1.084-1.381 0-1.38 1.144-3.744 3.433-7.092 2.971-4.309 4.999-6.465 6.083-6.465 0.803 0 1.205 0.502 1.205 1.507 0 1.548-0.964 3.85-2.891 6.904m-109.32-4.833c1.967-2.72 3.332-4.079 4.095-4.079 0.482 0 0.723 0.335 0.723 1.003 0 1.507-0.623 2.95-1.867 4.331-2.088 2.302-3.454 3.452-4.096 3.452-0.602 0-0.903-0.272-0.903-0.816 0-0.878 0.682-2.175 2.048-3.891m24.453 0c1.966-2.72 3.332-4.079 4.095-4.079 0.482 0 0.723 0.335 0.723 1.003 0 1.507-0.623 2.95-1.867 4.331-2.088 2.302-3.454 3.452-4.096 3.452-0.602 0-0.903-0.272-0.903-0.816 0-0.878 0.682-2.175 2.048-3.891m142.5-9.226c0.441-0.92 0.662-1.359 0.662-1.318 0.562-1.256 0.844-2.385 0.844-3.39 0-0.919-0.282-1.798-0.844-2.635l-1.505-1.883c-0.643-0.753-1.205-1.13-1.687-1.13-0.522 0-1.004 0.37
707-1.445 1.13l-4.458 7.72c-0.251 0.335-0.627 0.795-1.128 1.38-2.763 0-4.364 0.399-4.806 1.193-0.201 0.419-0.301 0.795-0.301 1.13 0 1.046 0.642 1.569 1.927 1.569l-9.918 12.136c-0.593 0.599-1.21 1.056-1.854 1.357 0-1.087-0.241-2.259-0.723-3.514l-1.325-3.452c-0.481-1.715-0.722-2.865-0.722-3.452 0-0.586 0.22-1.108 0.662-1.569 0.441-0.46 1.265-0.523 2.47-0.188 0.2 0.042 0.4 0.063 0.602 0.063 0.762 0 1.485-0.335 2.168-1.005 0.682-0.669 1.024-1.443 1.024-2.322 0-2.385-1.346-3.577-4.036-3.577-1.526 0-3.353 0.627-5.48 1.882-2.129 1.256-4.096 2.887-5.903 4.896 0 0-10.328 12.324-11.925 13.682-1.482 1.26-2.37 1.799-2.65 1.632-0.282-0.166-0.422-0.606-0.422-1.318 0-1.088 0.401-2.406 1.205-3.954l4.758-9.477c0.923-1.841 1.385-3.159 1.385-3.954 0-1.13-0.542-2.301-1.626-3.515-1.366-1.506-2.37-2.175-3.012-2.009-0.924 0.251-1.686 1.089-2.288 2.511 0 0.042-0.402 0.9-1.205 2.573-1.325-0.794-3.093-1.192-5.3-1.192-1.245 0-2.39 0.168-3.433 0.502-2.329 0.712-4.377 1.904-6.144 3.577-0.963 0.963-2.068 2.365-3.312 4.206-4.966 6.629-11.015 12.122-13.33 13.494-1.744 1.033-3.171 1.548-4.302 1.506-1.617-0.041-2.425-1.046-2.425-3.013 0-1.84 0.806-4.393 2.417-7.657 2.537-5.104 4.751-7.657 6.645-7.657 0.533 0 1.027 0.189 1.478 0.565-1.026 0.168-1.765 0.67-2.217 1.506-0.329 0.587-0.493 1.193-0.493 1.82 0 1.883 0.985 2.825 2.957 2.825 1.355 0 2.608-0.753 3.758-2.26 0.944-1.255 1.416-2.573 1.416-3.954s-0.472-2.636-1.416-3.766c-0.288-0.376-0.884-0.753-1.787-1.129-1.232-0.502-2.525-0.753-3.88-0.753-2.897 0-5.673 1.192-8.329 3.577-2.133 1.883-4.326 4.301-6.752 7.092-4.114 4.733-9.677 9.791-10.721 9.791-0.321 0-0.482-0.209-0.482-0.627 0-0.92 1.326-4.017 3.975-9.289 1.887-3.766 2.831-6.151 2.831-7.156 0-0.376-0.08-0.689-0.241-0.941-1.004-1.422-2.047-2.134-3.132-2.134-0.683 0-1.485 0.294-2.409 0.879l-2.71 1.757c-1.365 0.838-3.473 2.616-6.324 5.335l-3.915 3.829c1.284-1.966 2.027-3.327 2.228-4.08 0.362-1.296 0.362-2.761 0-4.393-0.16-0.753-0.612-1.527-1.355-2.322s-1.475-1.276-2.198-1.444c-1.045-0.251-3.052 2.008-6.023 6.778 0 0-13.22 17.365-18.851 17.323-1.807-0.014-2.611-1.213-2.41-3.515 4.337-1.422 8.171-3.975 11.505-7.657 2.409-2.677 3.613-5.021 3.613-7.029 0-1.339-0.562-2.594-1.686-3.766-1.004-1.045-2.349-1.569-4.036-1.569-2.57 0-5.501 1.297-8.793 3.891-2.329 1.8-4.627 4.063-6.836 6.841-3.126 3.931-9.968 10.293-11.534 11.298-1.727 1.046-3.152 1.548-4.276 1.506-1.807-0.041-2.61-1.213-2.409-3.515 4.336-1.422 8.17-3.975 11.504-7.657 2.409-2.677 3.613-5.021 3.613-7.029 0-1.339-0.562-2.594-1.686-3.766-1.004-1.045-2.349-1.569-4.035-1.569-2.571 0-5.502 1.297-8.794 3.891-2.329 1.8-4.514 4.165-6.836 6.841-4.946 5.702-8.604 9.694-9.485 9.226-0.482-0.292-0.482-1.129 0-2.51l4.456-10.168 1.205-2.447c0.401-0.879 0.603-1.673 0.603-2.385 0-0.335-0.041-0.669-0.121-1.005-0.201-0.962-0.843-1.443-1.927-1.443-0.723 0-1.968 0.314-3.734 0.941-2.089 0.712-3.655 0.753-4.699 0.126 0.482-1.045 0.723-2.009 0.723-2.887 0-0.879-0.256-1.527-0.77-1.946-0.514-0.418-1.141-0.628-1.881-0.628-1.993 0-3.508 1.005-4.545 3.013-0.623 1.255-0.935 2.365-0.935 3.327 0 1.171 0.477 2.155 1.432 2.95-1.206 1.945-8.372 13.249-13.979 16.632-1.736 1.048-3.171 1.548-4.302 1.506-1.617-0.041-2.424-1.046-2.424-3.013 0-1.84 0.805-4.393 2.416-7.657 2.537-5.104 4.752-7.657 6.646-7.657 0.533 0 1.026 0.189 1.478 0.565-1.027 0.168-1.766 0.67-2.217 1.506-0.33 0.587-0.494 1.193-0.494 1.82 0 1.883 0.986 2.825 2.958 2.825 1.354 0 2.607-0.753 3.757-2.26 0.944-1.255 1.416-2.573 1.416-3.954s-0.472-2.636-1.416-3.766c-0.288-0.376-0.883-0.753-1.787-1.129-1.232-0.502-2.525-0.753-3.88-0.753-2.897 0-5.673 1.192-8.329 3.577-2.132 1.883-9.273 10.534-10.004 17.323-0.105 0.971 0.171 2.33 0.814 3.711 0.762 1.674 1.715 2.712 3.04 3.506 1.044 0.628 2.229 0.942 3.554 0.942 4.378 0 9.141-2.511 14.288-7.532 2.673-2.609 8.589-10.747 11.791-15.126 1.727 0 2.59 0.524 2.59 1.569 0 1.089-0.768 2.595-2.304 4.52-3.845 4.979-5.908 8.786-6.188 11.422-0.121 1.214 0.271 2.385 1.174 3.515 0.904 1.13 2.118 1.695 3.644 1.695 1.053 0 2.147-0.292 3.282-0.879 3.844-1.926 7.594-5.089 11.251-9.49 0.24-0.174-0.16 1.604-0.319 2.649-0.161 0.963 0.08 2.134 0.723 3.515 0.762 1.673 1.826 2.908 3.191 3.702 1.004 0.586 2.169 0.879 3.494 0.879 4.296 0 9.034-2.489 14.214-7.469 1.277-1.235 2.26-2.282 2.957-3.146 0.284-0.18 0.033 1.474-0.126 2.519-0.162 0.963 0.079 2.134 0.722 3.515 0.763 1.673 1.827 2.908 3.192 3.702 1.004 0.586 2.169 0.879 3.494 0.879 4.296 0 9.034-2.489 14.214-7.469 2.631-2.545 7.39
706-8.846 9.696-11.674l-5.3 11.047c-0.04 0.125-0.563 1.046-1.566 2.761-0.643 1.089-0.964 1.988-0.964 2.699 0 1.549 0.723 2.322 2.169 2.322 1.083 0 2.348-0.533 3.794-1.6s2.65-2.312 3.614-3.734c0.963-1.423 2.71-3.661 5.24-6.716 2.207-2.677 3.704-4.425 4.487-5.241s1.515-1.224 2.198-1.224c0.281 0 0.422 0.105 0.422 0.314 0 0.21-0.081 0.461-0.241 0.753-3.936 7.657-5.762 12.407-5.481 14.247 0.281 1.883 1.586 2.825 3.915 2.825 1.084 0 2.118-0.22 3.102-0.659 0.983-0.44 2.84-1.873 5.571-4.299 2.409-2.135 4.085-3.786 5.09-4.896 0.661-0.73 1.154-0.573 0.993-0.126-0.121 0.336-0.262 1.026-0.422 2.072-0.161 0.963 0.08 2.133 0.723 3.514 0.762 1.674 1.807 2.909 3.132 3.703 1.044 0.628 2.228 0.942 3.554 0.942 4.377 0 9.14-2.511 14.288-7.532 0.809-0.79 1.499-1.5 2.077-2.137-0.669 1.521-1.007 2.987-1.007 4.397 0 1.506 0.482 2.741 1.445 3.703 0.964 0.963 2.188 1.443 3.674 1.443 1.485 0 2.971-0.439 4.458-1.318 1.485-0.878 3.352-2.301 5.601-4.268-0.202 0.754-0.301 1.444-0.301 2.072 0 1.255 0.411 2.186 1.234 2.792 0.823 0.608 1.737 0.911 2.741 0.911 1.285 0 2.61-0.44 3.975-1.318 0.762-0.503 2.238-1.726 4.427-3.672 2.188-1.946 3.704-3.399 4.547-4.362 0 0 3.555-3.976 6.769-7.824 2.479-2.982 4.298-4.831 5.458-5.545-0.362 1.255-0.522 3.055-0.482 5.398 0.08 2.636 0.02 4.478-0.181 5.523-2.088-0.292-3.514-0.439-4.276-0.439-1.325 0-2.631 0.314-3.915 0.941-1.566 0.796-2.349 2.239-2.349 4.331 0 1.255 0.341 2.51 1.024 3.765 1.084 2.051 3.533 3.076 7.348 3.076 1.686 0 3.332-0.48 4.939-1.444 2.369-1.421 4.095-3.702 5.18-6.841 1.966-0.334 3.573-1.276 4.818-2.824 0.375-0.456 4.28-5.442 5.584-7.187-3.333 5.911-5.179 10.303-5.541 13.176-0.161 1.166 0.201 2.269 1.084 3.309 0.964 1.208 2.229 1.811 3.795 1.811 1.903 0 4.78-1.444 8.629-4.331 3.332-2.51 5.802-4.77 7.408-6.778 0.723-0.879 1.084-1.506 1.084-1.883 0-0.794-0.421-1.193-1.265-1.193-0.642 0-1.204 0.273-1.686 0.817l-5.3 4.581c-0.322 0.336-0.782 0.596-1.383 0.785-0.6 0.188-0.998 0.219-1.196 0.094-0.632-0.377-0.691-1.276-0.177-2.699 0.157-0.502 1.076-2.405 2.756-5.711l1.93-3.875c0.475-0.79 1.377-2.406 2.708-4.849 0.561 0 1.274 0.021 2.138 0.063 0.863 0.041 1.435 0.062 1.716 0.062 0.883 0 1.466-0.125 1.747-0.376l1.084-1.632c0.201-0.335 0.301-0.607 0.301-0.816 0-0.711-1.686-1.067-5.059-1.067"></path> 71<path d="m33.16 26.726c0.542 0 0.902-0.202 1.072-0.598 0.3-0.702-0.186-1.559-0.912-2.699-2.015-3.072 0.512-6.268 3.188-9.653 2.718-3.437 5.799-7.334 3.254-11.212-0.931-1.463-3.559-2.564-4.809-2.564-0.543 0-0.903 0.202-1.073 0.598-0.299 0.703 0.186 1.559 0.913 2.699 2.015 3.073-0.512 6.269-3.189 9.653-2.717 3.437-5.798 7.334-3.253 11.212 0.931 1.463 3.559 2.564 4.809 2.564" fill-opacity=".5"></path> 72<path d="m40.781 24.162c0.931 1.463 3.559 2.564 4.809 2.564 0.542 0 0.903-0.202 1.072-0.598 0.3-0.703-0.186-1.559-0.912-2.699-2.015-3.073 0.512-6.269 3.189-9.653 2.717-3.437 5.798-7.334 3.253-11.212-0.931-1.463-3.559-2.564-4.809-2.564-0.542 0-0.905 0.202-1.075 0.598-0.299 0.703 0.166 1.522 0.915 2.699 2.015 3.072-0.512 6.268-3.189 9.653-2.717 3.437-5.798 7.334-3.253 11.212" fill-opacity=".5"></path> 73<path d="m61.49 35.722v37.335c0 4.95-4.049 9-9 9h-26.519c-4.95 0-9-4.05-9-9v-3.797c-1.306 0.529-2.701 0.83-4.158 0.83-7.065 0-12.813-6.755-12.813-15.059s5.748-15.059 12.813-15.059c1.457 0 2.852 0.301 4.158 0.83v-5.08h44.519zm-27.723 11.534h-6.267c-1.005 0-1.795 0.821-1.795 1.826v17.74c0 1.004 0.79 1.825 1.795 1.825h6.267c0.79 0 1.46-0.669 1.46-1.46 0-0.79-0.67-1.429-1.46-1.429h-4.533v-15.611h4.533c0.79 0 1.46-0.639 1.46-1.43s-0.67-1.461-1.46-1.461zm17.246 5e-4h-6.268c-0.791 0-1.43 0.67-1.43 1.46 0 0.792 0.639 1.431 1.43 1.431h4.563v15.61h-4.563c-0.791 0-1.43 0.639-1.43 1.429 0 0.792 0.639 1.461 1.43 1.461h6.268c1.003 0 1.824-0.822 1.824-1.826v-17.74c0-1.004-0.821-1.825-1.824-1.825zm-38.2-1.2849c-3.693 0-6.812 4.148-6.812 9.059s3.119 9.059 6.812 9.059c1.551 0 2.997-0.739 4.158-1.952v-14.215c-1.161-1.213-2.607-1.951-4.158-1.951z"></path> 74</g> 75</g> 76</svg> 77 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 136 136" class="fill-current text-white h-14 w-14 md:hidden" version="1.1"> 78 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 79 <g transform="translate(26.374500, 29.527800)" fill="currentColor"> 80 <path d="M33.1597,26.726 C33.7017,26.726 34.0617,26.524 34.2317,26.128 C34.5317,25.426 34.0457,24.569 33.3197,23.429 C31.3047,20.357 33.8317,17.161 36.5077,13.776 C39.2257,10.339 42.3067,6.442 39.7617,2.564 C38.8307,1.101 36.2027,7.10542736e-15 34.9527,7.10542736e-15 C34.4097,7.10542736e-15 34.0497,0.202 33.8797,0.598 C33.5807,1.301 34.0657,2.157 34.7927,3.297 C36.8077,6.37 34.2807,9.566 31.6037,12.95 C28.8867,16.387 25.8057,20.284 28.3507,24.162 C29.2817,25.625 31.9097,26.726 33.1597,26.726" id="Fill-8" fill-opacity="0.5"></path> 81 <path d="M40.7811,24.1623 C41.7121,25.6253 44.3401,26.7263 45.5901,26.7263 C46.1321,26.7263 46.4931,26.5243 46.6621,26.1283 C46.9621,25.4253 46.4761,24.5693 45.7501,23.4293 C43.7351,20.3563 46.2621,17.1603 48.9391,13.7763 C51.6561,10.3393 54.7371,6.4423 52.1921,2.5643 C51.2611,1.1013 48.6331,0.0003 47.3831,0.0003 C46.8411,0.0003 46.4781,0.2023 46.3081,0.5983 C46.0091,1.3013 46.4741,2.1203 47.2231,3.2973 C49.2381,6.3693 46.7111,9.5653 44.0341,12.9503 C41.3171,16.3873 38.2361,20.2843 40.7811,24.1623" id="Fill-10" fill-opacity="0.5"></path> 82 <path d="M61.49,35.7222 L61.49,73.0572 C61.49,78.0072 57.441,82.0572 52.49,82.0572 L52.49,82.0572 L25.971,82.0572 C21.021,82.0572 16.971,78.0072 16.971,73.0572 L16.971,73.0572 L16.971,69.2602 C15.665,69.7892 14.27,70.0902 12.813,70.0902 C5.748,70.0902 -2.06057393e-13,63.3352 -2.06057393e-13,55.0312 C-2.060
8257393e-13,46.7272 5.748,39.9722 12.813,39.9722 C14.27,39.9722 15.665,40.2732 16.971,40.8022 L16.971,40.8022 L16.971,35.7222 L61.49,35.7222 Z M33.7674,47.2566 L27.5004,47.2566 C26.4954,47.2566 25.7054,48.0776 25.7054,49.0826 L25.7054,49.0826 L25.7054,66.8226 C25.7054,67.8266 26.4954,68.6476 27.5004,68.6476 L27.5004,68.6476 L33.7674,68.6476 C34.5574,68.6476 35.2274,67.9786 35.2274,67.1876 C35.2274,66.3976 34.5574,65.7586 33.7674,65.7586 L33.7674,65.7586 L29.2344,65.7586 L29.2344,50.1476 L33.7674,50.1476 C34.5574,50.1476 35.2274,49.5086 35.2274,48.7176 C35.2274,47.9266 34.5574,47.2566 33.7674,47.2566 L33.7674,47.2566 Z M51.0132,47.2571 L44.7452,47.2571 C43.9542,47.2571 43.3152,47.9271 43.3152,48.7171 C43.3152,49.5091 43.9542,50.1481 44.7452,50.1481 L44.7452,50.1481 L49.3082,50.1481 L49.3082,65.7581 L44.7452,65.7581 C43.9542,65.7581 43.3152,66.3971 43.3152,67.1871 C43.3152,67.9791 43.9542,68.6481 44.7452,68.6481 L44.7452,68.6481 L51.0132,68.6481 C52.0162,68.6481 52.8372,67.8261 52.8372,66.8221 L52.8372,66.8221 L52.8372,49.0821 C52.8372,48.0781 52.0162,47.2571 51.0132,47.2571 L51.0132,47.2571 Z M12.813,45.9722 C9.12,45.9722 6.001,50.1202 6.001,55.0312 C6.001,59.9422 9.12,64.0902 12.813,64.0902 C14.364,64.0902 15.81,63.3512 16.971,62.1382 L16.971,62.1382 L16.971,47.9232 C15.81,46.7102 14.364,45.9722 12.813,45.9722 Z" id="Combined-Shape"></path> 83 </g> 84 </g> 85</svg> 86</a> </div> 87 88 <div class="hidden md:block"> 89 <div class="ml-10 flex items-baseline space-x-4"> 90 <a class="js-scroll-link nav-link" href="/episodes#episodes">Episodes</a> 91 <a class=" nav-link" href="/series">Series</a> 92 <a class=" nav-link" href="/pricing">Pricing</a> 93 </div> 94 </div> 95 </div> 96 97 <div class="flex-1 px-2 flex justify-center lg:ml-6 lg:justify-end"> 98 <div class="max-w-lg w-full lg:max-w-xs"> 99 <label for="search" class="sr-only">Search</label> 100 <div class="relative text-gray-400 focus-within:text-gray-600"> 101 <div class="pointer-events-none absolute inset-y-0 left-0 pl-3 flex items-center"> 102 <!-- Heroicon name: solid/search --> 103 <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> 104 <path fill-rule="evenodd" d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z" clip-rule="evenodd" /> 105 </svg> 106 </div> 107 <form action="/episodes#episodes" accept-charset="UTF-8" method="get"> 108 <input type="search" name="query" id="query" placeholder="Find a subject" class="block w-full bg-gray-700 py-2 pl-10 pr-3 border border-transparent rounded-md leading-5 text-gray-300 placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-gray-400 sm:text-sm" /> 109</form> </div> 110 </div> 111 </div> 112 113 <div class="flex md:hidden ml-2"> 114 <!-- Mobile menu button --> 115 <button data-menu-target="button" data-action="menu#toggle" type="button" class="bg-gray-800 p-2 rounded-md inline-flex items-center justify-center text-gray-400 hover:text-white hover:bg-gray-700 hover:bg-opacity-75 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-violet-600 focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> 116 <span class="sr-only">Open main menu</span> 117 <svg data-menu-target="svgOpen" class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 118 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> 119 </svg> 120 <svg data-menu-target="svgClose" class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 121 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> 122 </svg> 123 </button> 124 </div> 125 126 <div class="hidden md:block"> 127 <div class="ml-4 flex items-center md:ml-6"> 128 <div> 129 130 <div class="flex-shrink-0"> 131 <div class="ml-3 relative"> 132 <a class=" nav-link" href="/login">Sign In</a> 133 </div> 134 </div> 135 </div> 136 </div> 137 </div> 138 </div> 139 </div> 140 141 142 <!-- Mobile menu, show/hide based on menu state. --> 143 <div class="hidden md:hidden" id="mobile-menu" data-menu-target="menu"> 144 <div class="px-2 pt-2 pb-3 space-y-1 sm:px-3"> 145 <!-- Current: "bg-gray-900 text-white", Default: "text-gray-300 hover:bg-gray-700 hover:text-white" --> 146 <a class=" nav-link" href="/episodes#episodes">
146Episodes</a> 147 <a class=" nav-link" href="/series">Series</a> 148 <a class=" nav-link" href="/pricing">Pricing</a> 149 <a class=" nav-link" href="/login">Sign In</a> 150 </div> 151 152 153</nav> 154 155 156 <div class="alert-container z-40"> 157
158<script id="alert-icon-success" type="text/template"> 159 <svg class="h-6 w-6 text-teal-400 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg> 160</script>
160 161
162<script id="alert-icon-error" type="text/template"> 163 <svg class="w-6 h-6 text-red-400" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg> 164</script>
164 165
166<script id="alert-template" type="text/template"> 167 <div aria-live="assertive" class="z-49 mt-12 fixed inset-0 flex items-end justify-center px-4 py-6 pointer-events-none sm:p-6 sm:items-start sm:justify-end"> 168 <div data-controller="notice" 169 data-notice-auto-close-after="4000" 170 class="hidden max-w-sm w-full bg-white shadow-lg rounded-lg pointer-events-auto ring-1 ring-black ring-opacity-5 overflow-hidden"> 171 <div class="p-4"> 172 <div class="flex items-center"> 173 <div class="flex-shrink-0"> 174 {{icon}} 175 </div> 176 <div class="ml-3 w-0 flex-1"> 177 <p class="text-sm text-gray-600 font-medium cursor-default"> 178 {{message}} 179 </p> 180 </div> 181 <div class="ml-4 flex-shrink-0 flex"> 182 <button data-action="notice#close" class="bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-violet-500"> 183 <span class="sr-only">Close</span> 184 <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> 185 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd" /> 186 </svg> 187 </button> 188 </div> 189 </div> 190 </div> 191 </div> 192 </div> 193</script>
193 194 </div> 195 196 <div class="main bg-gray-200"> 197 198 199<div class="bg-white"> 200 <div class="bg-white"> 201 <div class="relative"> 202 <div class="ns-hero flex justify-center items-center overflow-hidden"> 203 <div class="flex flex-col items-center py-10 md:py-20"> 204 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 136 136" class="fill-current hidden md:block md:w-40 md:h-40" version="1.1"> 205 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 206 <g transform="translate(26.374500, 29.527800)" fill="currentColor"> 207 <path d="M33.1597,26.726 C33.7017,26.726 34.0617,26.524 34.2317,26.128 C34.5317,25.426 34.0457,24.569 33.3197,23.429 C31.3047,20.357 33.8317,17.161 36.5077,13.776 C39.2257,10.339 42.3067,6.442 39.7617,2.564 C38.8307,1.101 36.2027,7.10542736e-15 34.9527,7.10542736e-15 C34.4097,7.10542736e-15 34.0497,0.202 33.8797,0.598 C33.5807,1.301 34.0657,2.157 34.7927,3.297 C36.8077,6.37 34.2807,9.566 31.6037,12.95 C28.8867,16.387 25.8057,20.284 28.3507,24.162 C29.2817,25.625 31.9097,26.726 33.1597,26.726" id="Fill-8" fill-opacity="0.5"></path> 208 <path d="M40.7811,24.1623 C41.7121,25.6253 44.3401,26.7263 45.5901,26.7263 C46.1321,26.7263 46.4931,26.5243 46.6621,26.1283 C46.9621,25.4253 46.4761,24.5693 45.7501,23.4293 C43.7351,20.3563 46.2621,17.1603 48.9391,13.7763 C51.6561,10.3393 54.7371,6.4423 52.1921,2.5643 C51.2611,1.1013 48.6331,0.0003 47.3831,0.0003 C46.8411,0.0003 46.4781,0.2023 46.3081,0.5983 C46.0091,1.3013 46.4741,2.1203 47.2231,3.2973 C49.2381,6.3693 46.7111,9.5653 44.0341,12.9503 C41.3171,16.3873 38.2361,20.2843 40.7811,24.1623" id="Fill-10" fill-opacity="0.5"></path> 209 <path d="M61.49,35.7222 L61.49,73.0572 C61.49,78.0072 57.441,82.0572 52.49,82.0572 L52.49,82.0572 L25.971,82.0572 C21.021,82.0572 16.971,78.0072 16.971,73.0572 L16.971,73.0572 L16.971,69.2602 C15.665,69.7892 14.27,70.0902 12.813,70.0902 C5.748,70.0902 -2.06057393e-13,63.3352 -2.06057393e-13,55.0312 C-2.06057393e-13,46.7272 5.748,39.9722 12.813,39.9722 C14.27,39.9722 15.665,40.2732 16.971,40.8022 L16.971,40.8022 L16.971,35.7222 L61.49,35.7222 Z M33.7674,47.2566 L27.5004,47.2566 C26.4954,47.2566 25.7054,48.0776 25.7054,49.0826 L25.7054,49.0826 L25.7054,66.8226 C25.7054,67.8266 26.4954,68.6476 27.5004,68.6476 L27.5004,68.6476 L33.7674,68.6476 C34.5574,68.6476 35.2274,67.9786 35.2274,67.1876 C35.2274,66.3976 34.5574,65.7586 33.7674,65.7586 L33.7674,65.7586 L29.2344,65.7586 L29.2344,50.1476 L33.7674,50.1476 C34.5574,50.1476 35.2274,49.5086 35.2274,48.7176 C35.2274,47.9266 34.5574,47.2566 33.7674,47.2566 L33.7674,47.2566 Z M51.0132,47.2571 L44.7452,47.2571 C43.9542,47.2571 43.3152,47.9271 43.3152,48.7171 C43.3152,49.5091 43.9542,50.1481 44.7452,50.1481 L44.7452,50.1481 L49.3082,50.1481 L49.3082,65.7581 L44.7452,65.7581 C43.9542,65.7581 43.3152,66.3971 43.3152,67.1871 C43.3152,67.9791 43.9542,68.6481 44.7452,68.6481 L44.7452,68.6481 L51.0132,68.6481 C52.0162,68.6481 52.8372,67.8261 52.8372,66.8221 L52.8372,66.8221 L52.8372,49.0821 C52.8372,48.0781 52.0162,47.2571 51.0132,47.2571 L51.0132,47.2571 Z M12.813,45.9722 C9.12,45.9722 6.001,50.1202 6.001,55.0312 C6.001,59.9422 9.12,64.0902 12.813,64.0902 C14.364,64.0902 15.81,63.3512 16.971,62.1382 L16.971,62.1382 L16.971,47.9232 C15.81,46.7102 14.364,45.9722 12.813,45.9722 Z" id="Combined-Shape"></path> 210 </g> 211 </g> 212</svg> 213 214 <h1 215 class="mt-4 mx-2 text-4xl tracking-tight font-extrabold text-white sm:mt-5 sm:text-5xl lg:mt-6 xl:text-6xl text-center"> 216 <span class="block">Top-notch video tutorials for </span> 217 <span class="block text-teal-200">Swift developers</span> 218 </h1> 219 220 <div class="mt-5 mb-8 sm:mt-20 sm:flex sm:justify-center lg:justify-start"> 221 <div class="rounded-shadow"> 222 <a href="#episodes" 223 class="js-scroll-link w-full flex items-center justify-center px-8 py-3 border border-transparent text-base font-medium rounded-md text-violet-700 bg-violet-100 hover:bg-violet-200 md:py-4 md:px-10"> 224 Browse the Catalog 225 </a> 226 </div> 227 <div class="mt-3 sm:mt-0 sm:ml-3 rounded-md shadow-lg "> 228 <a class="w-full flex items-center border-b-4 border-violet-900 px-8 py-3 text-base font-medium rounded-md text-white bg-violet-600 hover:bg-violet-700 md:py-4 md:text-lg md:px-10" href="/pricing"> 229 <div class="flex flex-row justify-between items-center w-full md:justify-center">
230 <span>Get started</span> 231 <span class="md:ml-2 md:-mr-2 opacity-50"> 232 <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" 233 xmlns="http://www.w3.org/2000/svg"> 234 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path> 235 </svg> 236 </span> 237 </div> 238</a> </div> 239 </div> 240 </div> 241 </div> 242 </div> 243 244 <section class="mb-8 bg-gray-800 flex flex-wrap items-center justify-around px-8 py-4"> 245 <div class="max-w-7xl mx-auto py-16 px-4 sm:py-24 sm:px-6 lg:px-8"> 246 <h2 class="text-center text-gray-400 text-base font-semibold uppercase tracking-wide"> 247 Thousands of developers use NSScreencast to stay on top of iOS development. 248 </h2> 249 <div class="mt-8 grid grid-cols-2 gap-8 md:grid-cols-6 lg:grid-cols-6"> 250 <div class="col-span-1 flex justify-center items-center md:col-span-2 lg:col-span-1"> 251 <img class="h-20 opacity-40" alt="ExxonMobil" src="/assets/xom-98d70f094d1a33dc3833c34a46b46ce4b0fee540acac6f652f3663f53c39684d.png" /> 252 </div> 253 <div class="col-span-1 flex justify-center items-center md:col-span-2 lg:col-span-1"> 254 <img class="h-20 opacity-40" alt="Venmo" src="/assets/venmo-d786d37f6730e48c661e23370e76f6b3f788c4d956914a2c74dcf23b632179b4.png" /> 255 </div> 256 <div class="col-span-1 flex justify-center items-center md:col-span-2 lg:col-span-1"> 257 <img class="h-20 opacity-40" alt="Thoughtbot" src="/assets/tb-19cb211a5c10e2aaaa9487e9e5b98b71dffd25af5382daac7a9b421d0a3c8ae6.png" /> 258 </div> 259 <div class="col-span-1 flex justify-center items-center md:col-span-3 lg:col-span-1"> 260 <svg style="max-width: 100px;" class="h-20 text-white opacity-40 fill-current" viewBox="0 0 1911 400" 261 focusable="false"> 262 <g fill="currentColor"> 263 <path 264 d="M1460.4 148.6h77.8l22.5 73.7c7.5 24.4 20.1 70.2 20.1 70.2a.6.6 0 0 0 1.1 0s13-46.7 20.5-70.2l23.6-73.7h57.4l23.3 73.7c7.8 25.2 20 70.2 20 70.2a.6.6 0 0 0 1.1 0s12.7-45.6 20-70.2l22.6-73.7h72.3L1764.5 392h-71.1l-19.4-61c-7.5-24-20.6-70.6-20.6-70.6a.6.6 0 0 0-1.1 0s-13.1 45.7-21 70.2l-19.7 61.6h-72.4zM936.8 19.9h78.7v372.2h-78.7zM1073.8 19.9h78.7v372.2h-78.7zM1380.7 271.2c0-36.3-25.9-61-56.5-61-31.3 0-57.2 24.7-57.2 61 0 36.5 25.9 60.9 57.2 60.9 30.6 0 56.5-24.4 56.5-61m-189.2 0c0-74 59.7-128.7 132.7-128.7 72.3 0 132 54.8 132 128.8 0 74.2-59.7 129-132 129-73 0-132.7-54.8-132.7-129M481.5 54.4V126h139c.7 0 .9.5.6 1L481.4 364.5c-3.4 6.2-4.2 7.5-4.2 13.6v14h271v-71.6H597.7a.6.6 0 0 1-.5-1L738.5 79c1.1-2.3 2.3-4 2.3-9.6v-15zM798.4 148.6H877V392h-78.7zm39.3-122c24.6 0 44.8 19.8 44.8 44.2S862.3 115 837.7 115 793 95.2 793 70.8s20.3-44.2 44.8-44.2 "> 265 </path> 266 <path 267 d="M242.2 106.3c1.8-.4 2.6.2 3.7 1.4 6.1 7 26 31.1 31.4 37.7a2.1 2.1 0 0 1-.5 3.2 714.8 714.8 0 0 0-109.3 107c-.5.6-.1.7.2.5 43.3-18.6 144.7-48.2 190.5-56.6v-57.9L179.2.2.2 141.6V205c55.5-33 183.9-84.1 242-98.6z"> 268 </path> 269 <path 270 d="M96.6 349.5a3 3 0 0 1-3.8-.6l-33.5-39.8c-.9-1-1-1.6.2-3.4C85.3 268 138 209 171.5 184.1c.7-.5.5-1-.2-.7C136.3 195 37 237.6 0 258.4v135.2h358.2V263.5c-49 8.3-195.1 51.8-261.6 86z"> 271 </path> 272 <path 273 d="M1895.2 113.9c0-7-4.9-12-11.7-12H1871v34h5.6v-10.1h5.5l6.2 10.2h6.4l-6.7-11c4.3-1.7 7.2-5.8 7.2-11.1zm-12 6.9h-6.6V107h6.6c3.7 0 6.4 3 6.4 7s-2.7 6.8-6.4 6.8z"> 274 </path> 275 <path 276 d="M1881.8 90.2a29.4 29.4 0 1 0 29.4 29.3 29.4 29.4 0 0 0-29.4-29.3zm0 53a23.7 23.7 0 1 1 23.8-23.7 23.8 23.8 0 0 1-23.8 23.8z"> 277 </path> 278 </g> 279 </svg> 280 </div> 281 <div class="col-span-1 flex justify-center items-center md:col-span-3 lg:col-span-1"> 282 <img class="h-20 opacity-40" alt="The Working Group" src="/assets/twg-2bccebe38f879627b8179d6195221f146fe81420355eb531eda071ed57a205e8.png" /> 283 </div> 284 <div class="col-span-1 flex justify-center items-center md:col-span-3 lg:col-span-1"> 285 <img class="h-20 opacity-40" alt="Medium" src="/assets/medium-e7a85cd9f73c78120b68773c165bdd874d67debfbe1483de864285db846635f2.png" /> 286 </div> 287 </div> 288 </div> 289 </section> 290 291 <section class="features"> 292 <!-- features --> 293 <div class="max-w-7xl mx-auto py-16 px-4 sm:px-6 lg:py-24 lg:px-8 lg:grid lg:grid-cols-3 lg:gap-x-8"> 294 <div> 295 <h2 class="text-base font-semibold text-violet-600 uppercase tracking-wide"> 296 Updated Regularly 297 <p class="mt-2 text-3xl font-extrabold text-gray-900">Bite-sized videos on iOS development.</p> 298 <p class="mt-4 text-lg text-gray-500"> 299 The iOS landscape is large and changes often. With short, bite-sized videos released on a steady schedule, 300 NSScreencast helps keep you continually up to date. 301 </p> 302 </div> 303 <div class="mt-12 lg:mt-0 lg:col-span-2"> 304 <dl 305 class="space-y-10 sm:space-y-0 sm:grid sm:grid-cols-2 sm:grid-rows-4 sm:grid-flow-col sm:gap-x-6 sm:gap-y-10 lg:gap-x-8"> 306 <div class="relative"> 307 <dt> 308 <!-- Heroicon name: outline/check --> 309 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none"
310 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 311 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 312 </svg> 313 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 314 Up to date with Xcode 15 and iOS 17 315 </p> 316 </dt> 317 <dd class="mt-2 ml-9 text-base text-gray-500"> 318 We cover the latest and greatest to get you up to speed quickly. 319 </dd> 320 </div> 321 <div class="relative"> 322 <dt> 323 <!-- Heroicon name: outline/check --> 324 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none" 325 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 326 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 327 </svg> 328 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 329 UIKit, SwiftUI, SwiftData, and macOS 330 </p> 331 </dt> 332 <dd class="mt-2 ml-9 text-base text-gray-500"> 333 In our catalog you'll find a wide variety of topics and UI frameworks. 334 </dd> 335 </div> 336 <div class="relative"> 337 <dt> 338 <!-- Heroicon name: outline/check --> 339 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none"
340 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 341 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 342 </svg> 343 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 344 Swift Language 345 </p> 346 </dt> 347 <dd class="mt-2 ml-9 text-base text-gray-500"> 348 Increase your knowledge of the Swift language and take advantage of new Swift language features as they are developed. 349 </dd> 350 </div> 351 <div class="relative"> 352 <dt> 353 <!-- Heroicon name: outline/check --> 354 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none" 355 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 356 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 357 </svg> 358 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 359 High Quality Videos 360 </p> 361 </dt> 362 <dd class="mt-2 ml-9 text-base text-gray-500"> 363 We stress the details. Each screencast is carefully produced in HD quality. 364 </dd> 365 </div> 366 <div class="relative"> 367 <dt> 368 <!-- Heroicon name: outline/check --> 369 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none"
370 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 371 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 372 </svg> 373 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 374 Short and Focused 375 </p> 376 </dt> 377 <dd class="mt-2 ml-9 text-base text-gray-500"> 378 We don't want to waste your time. Most videos are between 10 and 20 minutes long. 379 </dd> 380 </div> 381 <div class="relative"> 382 <dt> 383 <!-- Heroicon name: outline/check --> 384 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none" 385 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 386 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 387 </svg> 388 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 389 Any Device 390 </p> 391 </dt> 392 <dd class="mt-2 ml-9 text-base text-gray-500"> 393 Stream on the web or use our native apps for iOS or the tv. 394 </dd> 395 </div> 396 <div class="relative"> 397 <dt> 398 <!-- Heroicon name: outline/check --> 399 <svg class="absolute h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none"
400 viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> 401 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> 402 </svg> 403 <p class="ml-9 text-lg leading-6 font-medium text-gray-900"> 404 Team Plans 405 </p> 406 </dt> 407 <dd class="mt-2 ml-9 text-base text-gray-500"> 408 Get NSScreencast for your whole team. Discounts start at 5 seats 409 </dd> 410 </div> 411 </dl> 412 </div> 413 </div> 414 </section> <!-- features --> 415 416 <section class="testimonials"> 417 <div data-controller="carousel" data-carousel-index-value="0" data-carousel-auto-change-value="true" data-carousel-auto-change-after-value="5500" class="relative py-16 mx-auto px-4 sm:px-6 lg:py-24 lg:px-8 overflow-x-hidden"> 418 <div 419 class="transition transform duration-500 flex flex-nowrap max-w-7xl"> 420 421 <div data-carousel-target="page" class="w-9/12 flex flex-col justify-between flex-shrink-0 pager"> 422 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 423 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 424 <div class="flex-shrink-0 relative"> 425 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 426 <div 427 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 428 <img class="object-cover" alt="Steven Tolton" src="/assets/stolton-db8e9706f6d5679146b97453cb759f2e7333640145bd7cca1ed44c187df1f3a4.jpg" /> 429 </div> 430 </div> 431 </div> 432 <div class="lg:m-0 lg:pl-8"> 433 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 434 <blockquote> 435 <div> 436 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 437 <path 438 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 439 </svg> 440 <p class="mt-4 text-xl font-medium text-gray-800"> 441 Have I mentioned lately how awesome NSScreencast is? No? Worth the subscription. Check it out if youâre an iOS developer. Or even if youâre not and you want an example of how to do coding screencasts well. 442 </p> 443 </div> 444 <footer class="mt-4"> 445 <p class="text-base font-medium text-gray-400"> 446 Steven Tolton 447 </p> 448 <p class="text-base font-medium text-teal-500"> 449 <a href="https://twitter.com/stolton/">@stolton</a> 450 </p> 451 </footer> 452 </blockquote> 453 </div> 454 </div> 455 </div> 456 </div> 457 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 458 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 459 <div class="flex-shrink-0 relative"> 460 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 461 <div 462 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 463 <img class="object-cover" alt="Foster Bass" src="/assets/fosterbass-dd4f7c5d5242a4af2d7727c726062e6b343c623f0eb3994eba5ac72853914c32.jpg" /> 464 </div> 465 </div> 466 </div> 467 <div class="lg:m-0 lg:pl-8"> 468 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 469 <blockquote> 470 <div> 471 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 472 <path 473 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 474 </svg> 475 <p class="mt-4 text-xl font-medium text-gray-800"> 476 Got tired of dead-end googling so I checked to see if @NSScreencast had covered what I was looking for. Of course he had, 4 years ago. Should have checked there first. 477 </p> 478 </div> 479 <footer class="mt-4"> 480 <p class="text-base font-medium text-gray-400"> 481 Foster Bass 482 </p> 483 <p class="text-base font-medium text-teal-500"> 484 <a href="https://twitter.com/fosterbass/status/1034437503959408641">@fosterbass</a> 485 </p> 486 </footer> 487 </blockquote> 488 </div> 489 </div> 490 </div> 491 </div> 492 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 493 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 494 <div class="flex-shrink-0 relative"> 495 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 496 <div 497 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 498 <img class="object-cover" alt="Aijaz Ansari" src="/assets/_aijaz_-b040cb1b7b4781a567544cdc491bc166990e09443873fe1620cf6193598eafde.jpg" /> 499 </div> 500 </div> 501 </div> 502 <div class="lg:m-0 lg:pl-8"> 503 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 504 <blockquote> 505 <div> 506 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 507 <path 508 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 509 </svg> 510 <p class="mt-4 text-xl font-medium text-gray-800"> 511 One 13-minute episode of @NSScreencast just paid for the yearly subscription fee in amount of time saved. Do it. 512 </p> 513 </div> 514 <footer class="mt-4"> 515 <p class="text-base font-medium text-gray-400"> 516 Aijaz Ansari 517 </p> 518 <p class="text-base font-medium text-teal-500"> 519 <a href="https://twitter.com/_aijaz_/status/588109492895768579">@_aijaz_</a> 520 </p> 521 </footer> 522 </blockquote> 523 </div> 524 </div> 525 </div> 526 </div> 527 </div> 528 <div data-carousel-target="page" class="w-9/12 flex flex-col justify-between flex-shrink-0 pager"> 529 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 530 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 531 <div class="flex-shrink-0 relative"> 532 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 533 <div 534 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 535 <img class="object-cover" alt="Sam Soffes" src="/assets/soffes-199fdc065880887adbbb3b359e2ace1eaf73540f3064fc26fb7f6497dac8dcec.jpeg" /> 536 </div> 537 </div> 538 </div> 539 <div class="lg:m-0 lg:pl-8"> 540 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 541 <blockquote> 542 <div> 543 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 544 <path 545 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 546 </svg> 547 <p class="mt-4 text-xl font-medium text-gray-800"> 548 Seriously great stuff even for seasoned developers. Iâve learned a good amount from Benâs videos. 549 </p> 550 </div> 551 <footer class="mt-4"> 552 <p class="text-base font-medium text-gray-400"> 553 Sam Soffes 554 </p> 555 <p class="text-base font-medium text-teal-500"> 556 <a href="https://twitter.com/soffes">@soffes</a> 557 </p> 558 </footer> 559 </blockquote> 560 </div> 561 </div> 562 </div> 563 </div> 564 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 565 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 566 <div class="flex-shrink-0 relative"> 567 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 568 <div 569 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 570 <img class="object-cover" alt="James Dempsey" src="/assets/jamesdempsey-24dbf9f8e3dc629ef2d40c9e4abab4739fdc06341fd8073670b108ff0579da6a.jpg" /> 571 </div> 572 </div> 573 </div> 574 <div class="lg:m-0 lg:pl-8"> 575 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 576 <blockquote> 577 <div> 578 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 579 <path 580 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 581 </svg> 582 <p class="mt-4 text-xl font-medium text-gray-800"> 583 You can really expand your development horizons in just a few minutes a week with NSScreencast. 584 </p> 585 </div> 586 <footer class="mt-4"> 587 <p class="text-base font-medium text-gray-400"> 588 James Dempsey 589 </p> 590 <p class="text-base font-medium text-teal-500"> 591 <a href="https://twitter.com/jamesdempsey">@jamesdempsey</a> 592 </p> 593 </footer> 594 </blockquote> 595 </div> 596 </div> 597 </div> 598 </div> 599 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 600 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 601 <div class="flex-shrink-0 relative"> 602 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 603 <div 604 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 605 <img class="object-cover" alt="Alexis Gallagher" src="/assets/alexisgallagher-eb274cede2d0fefb6b0a188240481e0d1f0a1a21b1a3baebf9d11e2c723e5bfc.jpg" /> 606 </div> 607 </div> 608 </div> 609 <div class="lg:m-0 lg:pl-8"> 610 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 611 <blockquote> 612 <div> 613 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 614 <path 615 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 616 </svg> 617 <p class="mt-4 text-xl font-medium text-gray-800"> 618 Random PSA for iOS developers: @NSScreencast is a great resource, and worth every penny. Itâs high quality, practical, and honest. 619 </p> 620 </div> 621 <footer class="mt-4"> 622 <p class="text-base font-medium text-gray-400"> 623 Alexis Gallagher 624 </p> 625 <p class="text-base font-medium text-teal-500"> 626 <a href="https://twitter.com/alexisgallagher/status/623184485392125954">@alexisgallagher</a> 627 </p> 628 </footer> 629 </blockquote> 630 </div> 631 </div> 632 </div> 633 </div> 634 </div> 635 <div data-carousel-target="page" class="w-9/12 flex flex-col justify-between flex-shrink-0 pager"> 636 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 637 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 638 <div class="flex-shrink-0 relative"> 639 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 640 <div 641 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 642 <img class="object-cover" alt="Nate Armstrong" src="/assets/N8Armstrong-12fc23724679e4a105
642df7397582b90a7ddc879c0d7ec78bd16568dcb816fca14.jpg" /> 643 </div> 644 </div> 645 </div> 646 <div class="lg:m-0 lg:pl-8"> 647 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 648 <blockquote> 649 <div> 650 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 651 <path 652 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 653 </svg> 654 <p class="mt-4 text-xl font-medium text-gray-800"> 655 Canât say enough good things about @NSScreencast There is gold in the Road Trip DJ Series. 656 </p> 657 </div> 658 <footer class="mt-4"> 659 <p class="text-base font-medium text-gray-400"> 660 Nate Armstrong 661 </p> 662 <p class="text-base font-medium text-teal-500"> 663 <a href="https://twitter.com/N8Armstrong/status/601123080660881408">@N8Armstrong</a> 664 </p> 665 </footer> 666 </blockquote> 667 </div> 668 </div> 669 </div> 670 </div> 671 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 672 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 673 <div class="flex-shrink-0 relative"> 674 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 675 <div 676 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 677 <img class="object-cover" alt="Karl Oscar Weber" src="/assets/KarlO
677scarWeber-6903cd55cbe48999298703a8254a2afa2d131263ae482e845f9d8b3252c62590.jpg" /> 678 </div> 679 </div> 680 </div> 681 <div class="lg:m-0 lg:pl-8"> 682 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 683 <blockquote> 684 <div> 685 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 686 <path 687 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 688 </svg> 689 <p class="mt-4 text-xl font-medium text-gray-800"> 690 I just reuppped my subscription to @NSScreencast. [An] indespensible resource if youâre into iOS or Mac Development. 691 </p> 692 </div> 693 <footer class="mt-4"> 694 <p class="text-base font-medium text-gray-400"> 695 Karl Oscar Weber 696 </p> 697 <p class="text-base font-medium text-teal-500"> 698 <a href="https://twitter.com/KarlOscarWeber/status/553663010016071682">@KarlOscarWeber</a> 699 </p> 700 </footer> 701 </blockquote> 702 </div> 703 </div> 704 </div> 705 </div> 706 <div class="pb-8 lg:pb-0 lg:z-10 lg:relative"> 707 <div class="lg:mx-auto md:max-w-4xl lg:px-8 flex flex-col sm:flex-row"> 708 <div class="flex-shrink-0 relative"> 709 <div class="mx-auto px-4 sm:px-6 lg:p-0"> 710 <div 711 class="mx-auto rounded-full h-20 w-20 sm:h-auto sm:rounded-xl sm:aspect-w-5 sm:aspect-h-6 shadow-xl overflow-hidden lg:aspect-none lg:w-40"> 712 <img class="object-cover" alt="Marcus Ziadé" src="/assets/ziade-7798228f6a85ff270fe948532bf0ca6dacb5cbc5b8d051bd6bd4bdb5795f5566.jpg" /> 713 </div> 714 </div> 715 </div> 716 <div class="lg:m-0 lg:pl-8"> 717 <div class="mx-auto max-w-md px-4 sm:max-w-2xl sm:px-6 lg:px-0 lg:pb-8 lg:max-w-none"> 718 <blockquote> 719 <div> 720 <svg class="h-8 w-8 text-teal-500 opacity-25" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true"> 721 <path 722 d="M9.352 4C4.456 7.456 1 13.12 1 19.36c0 5.088 3.072 8.064 6.624 8.064 3.36 0 5.856-2.688 5.856-5.856 0-3.168-2.208-5.472-5.088-5.472-.576 0-1.344.096-1.536.192.48-3.264 3.552-7.104 6.624-9.024L9.352 4zm16.512 0c-4.8 3.456-8.256 9.12-8.256 15.36 0 5.088 3.072 8.064 6.624 8.064 3.264 0 5.856-2.688 5.856-5.856 0-3.168-2.304-5.472-5.184-5.472-.576 0-1.248.096-1.44.192.48-3.264 3.456-7.104 6.528-9.024L25.864 4z" /> 723 </svg> 724 <p class="mt-4 text-xl font-medium text-gray-800"> 725 Just finished @NSScreencast series on Modern CollectionViews. Strongly recommended. Programmatic UI, nicely structured code, easily approachable explanation style. ð 726 </p> 727 </div> 728 <footer class="mt-4"> 729 <p class="text-base font-medium text-gray-400"> 730 Marcus Ziadé 731 </p> 732 <p class="text-base font-medium text-teal-500"> 733 <a href="https://twitter.com/ZiadeMarcus/status/1294565117414256640">@ZiadeMarcus</a> 734 </p> 735 </footer> 736 </blockquote> 737 </div> 738 </div> 739 </div> 740 </div> 741 </div> 742 </div> 743 <div class="flex justify-center space-x-4"> 744 <a data-carousel-target="indicator" data-action="carousel#setPage" href="#" data-page="0" class="inline-block transition duration-100 bg-gray-300 w-3 h-3 rounded-full hover:bg-violet-400"></a> 745 <a data-carousel-target="indicator" data-action="carousel#setPage" href="#" data-page="1" class="inline-block transition duration-100 bg-gray-300 w-3 h-3 rounded-full hover:bg-violet-400"></a> 746 <a data-carousel-target="indicator" data-action="carousel#setPage" href="#" data-page="2" class="inline-block transition duration-100 bg-gray-300 w-3 h-3 rounded-full hover:bg-violet-400"></a> 747 </div> 748</div> 749 750 751 </section> 752
753 <section class="bg-gray-800 mb-20"> 754 <div class="max-w-7xl mx-auto text-center py-12 px-4 sm:px-6 lg:py-16 lg:px-8"> 755 <h2 class="text-3xl font-extrabold tracking-tight text-gray-300 sm:text-4xl"> 756 <span class="block">Ready to level up?</span> 757 </h2> 758 <div class="mt-8 flex justify-center"> 759 <div class="inline-flex rounded-md"> 760 <a class="inline-flex items-center justify-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-violet-700 bg-gray-200 hover:bg-violet-300" href="/pricing#team"> 761 Team Plans 762</a> </div> 763 <div class="ml-3 inline-flex rounded-md shadow"> 764 <a class="inline-flex items-center justify-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-white bg-violet-600 hover:bg-violet-700" href="/pricing"> 765 Set up My Account 766</a> </div> 767 </div> 768 </div> 769 </section> 770 771</div> 772 773</div> 774<div class="bg-white"> 775 776 <div id="episodes" class="block mb-20"></div> 777 778 <div class="max-w-6xl lg:max-w-7xl mx-auto w-full sm:px-4 md:px-10"> 779 <div class="flex md:justify-between flex-col md:flex-row"> 780 <div class="text-3xl font-extrabold"> 781 Episodes 782 </div> 783 <div class="pt-4 md:pt-0"> 784 <nav class="flex sm:space-x-4 flex-col sm:flex-row" aria-label="Tabs"> 785 <a class="px-3 py-2 flex items-center flex-row font-medium text-smrounded-md text-gray-500 hover:text-gray-700 " href="/episodes#episodes"> 786 <svg class="w-6 h-6 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path></svg> 787 All Episodes 788</a> 789 <a class="px-3 py-2 flex items-center flex-row font-medium text-smrounded-md bg-violet-100 text-violet-700" href="/episodes/free#episodes"> 790 <svg class="w-6 h-6 mr-2" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"></path></svg> 791 Free Episodes 792</a> </nav> 793 </div> 794 </div> 795 796 <div data-controller="watched-status" class="my-12"> 797 <ul role="list" class="grid grid-cols-1 gap-x-4 gap-y-8 sm:grid-cols-2 sm:gap-x-6 lg:grid-cols-3 xl:grid-cols-4 xl:gap-x-8"> 798 <li class="relative sm:rounded-lg sm:shadow bg-white"> 799 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 800 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 801 <div class="relative sm:rounded-lg overflow-hidden z-10"> 802 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 803 <span class="sr-only">View episode Profiling and Removing Splits</span> 804 </button> 805 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 806 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt=" Profiling and Removing Splits" srcset="https://nsscreencast.imgix.net/605-brc-part2/605-brc-part2.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/605-brc-part2/605-brc-part2.png?w=400&h=225&fit=crop" /> 807 </div> 808 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25">
809 <span></span> 810 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#605</p> 811 </div> 812 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 813 Billion Row Challenge 814 </span> 815 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 816 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 817 <div data-watched-status-target="episode" class="js-episode-info" data-id="1062"> 818 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 819 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 820 <a href="/episodes/605-brc-part2"> Profiling and Removing Splits</a> 821 </h3> 822 </div> 823 </div> 824 <p class="block text-sm text-gray-700 pointer-events-none">The initial, naive solution for the 1 Billion Row Challenge, which involved splitting strings by separator and semicolon, parsing cities and temperatures, and then collecting and outputting data, ran in approximately 11 minutes. This time we profile our solution to see where the time is spent. We find some quick wins for optimization and drastically improve the run time.</p> 825 </div> 826 </div> 827 </div> 828 </li> 829 830 <li class="relative sm:rounded-lg sm:shadow bg-white"> 831 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 832 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 833 <div class="relative sm:rounded-lg overflow-hidden z-10"> 834 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 835 <span class="sr-only">View episode Billion Row Challenge - Intro</span> 836 </button> 837 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 838 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Billion Row Challenge - Intro" srcset="https://nsscreencast.imgix.net/604-brc-part1/604-brc-part1.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/604-brc-part1/604-brc-part1.png?w=400&h=225&fit=crop" /> 839 </div> 840 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 841 <span></span> 842 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#604</p> 843 </div> 844 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 845 Billion Row Challenge 846 </span> 847 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 848 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 849 <div data-watched-status-target="episode" class="js-episode-info" data-id="1061"> 850 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 851 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span>
852 <a href="/episodes/604-brc-part1">Billion Row Challenge - Intro</a> 853 </h3> 854 </div> 855 </div> 856 <p class="block text-sm text-gray-700 pointer-events-none">In this episode, I am thrilled to be joined by Matt Massicotte to kick off the "1 Billion Row Challenge" in Swift. The goal is to efficiently parse a massive file containing weather station data and calculate the min, max, and mean temperatures for each city. We set up a Swift package, explore basic file I/O methods, memory mapping, chunked reading, and implement a naive solution that processes the data and sets the stage for significant optimization in upcoming episodes.</p> 857 </div> 858 </div> 859 </div> 860 </li> 861 862 <li class="relative sm:rounded-lg sm:shadow bg-white"> 863 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 864 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 865 <div class="relative sm:rounded-lg overflow-hidden z-10"> 866 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 867 <span class="sr-only">View episode Getting Started with AudioKit</span> 868 </button> 869 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 870 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Getting Started with AudioKit" srcset="https://nsscreencast.imgix.net/591-audiokit-2/591-audiokit-2.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/591-audiokit-2/591-audiokit-2.png?w=400&h=225&fit=crop" /> 871 </div> 872 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 873 <span></span> 874 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#591</p> 875 </div> 876 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 877 Learn AudioKit 878 </span> 879 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 880 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 881 <div data-watched-status-target="episode" class="js-episode-info" data-id="1048"> 882 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 883 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 884 <a href="/episodes/591-audiokit-2">Getting Started with AudioKit</a> 885 </h3> 886 </div> 887 </div> 888 <p class="block text-sm text-gray-700 pointer-events-none">We'll first take a look at the AudioKit Cookbook application, which is a great way to see what is possible. Once we've seen some of the capabilities we can look at the code to get an idea of how to build things with AudioKit. 889 890We'll then add a package collection in Xcode to make bringing in the various AudioKit package dependencies a little easier.</p> 891 </div> 892 </div> 893 </div> 894 </li> 895 896 <li class="relative sm:rounded-lg sm:shadow bg-white"> 897 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 898 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 899 <div class="relative sm:rounded-lg overflow-hidden z-10"> 900 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 901 <span class="sr-only">View episode Audio Fundamentals</span> 902 </button> 903 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 904 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object c
904over pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Audio Fundamentals" srcset="https://nsscreencast.imgix.net/590-audiokit-1/590-audiokit-1.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/590-audiokit-1/590-audiokit-1.png?w=400&h=225&fit=crop" /> 905 </div> 906 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 907 <span></span> 908 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#590</p> 909 </div> 910 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 911 Learn AudioKit 912 </span> 913 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 914 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 915 <div data-watched-status-target="episode" class="js-episode-info" data-id="1047"> 916 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 917 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 918 <a href="/episodes/590-audiokit-1">Audio Fundamentals</a> 919 </h3> 920 </div> 921 </div> 922 <p class="block text-sm text-gray-700 pointer-events-none">We kick off a new series on audio programming for iOS using AudioKit. Before we jump into code, however, it is important to get a foundational understanding of how audio works and how it is represented by the audio hardware (sound cards, etc) that the software integrates with. In this episode we will talk about the fundamentals of audio, learn some essential terminology, and look at some real world audio equipment so we can better understand the mental model behind AudioKit.</p> 923 </div> 924 </div> 925 </div> 926 </li> 927 928 <li class="relative sm:rounded-lg sm:shadow bg-white"> 929 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 930 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 931 <div class="relative sm:rounded-lg overflow-hidden z-10"> 932 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 933 <span class="sr-only">View episode Mastodon Post UI and HTML Parsing</span> 934 </button> 935 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 936 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Mastodon Post UI and HTML Parsing" srcset="https://nsscreencast.imgix.net/553-mastodon-app-post-ui/553-mastodon-app-post-ui.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/553-mastodon-app-post-ui/553-mastodon-app-post-ui.png?w=400&h=225&fit=crop" /> 937 </div> 938 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 939 <span></span> 940 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#553</p> 941 </div> 942 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 943 macOS Mastodon Client 944 </span> 945 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 946 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 947 <div data-watched-status-target="episode" class="js-episode-info" data-id="1010"> 948 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 949 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 950 <a href="/episodes/553-mastodon-app-post-ui">Mastodon Post UI and HTML Parsing</a> 951 </h3> 952 </div> 953 </div> 954 <p class="block text-sm text-gray-700 pointer-events-none">In this episode we tackle showing a list of posts, which requires us to convert the network models into models more fit for the UI, parsing HTML in order to display as an AttributedString, and displaying the author information.</p> 955 </div> 956 </div> 957 </div> 958 </li> 959 960 <li class="relative sm:rounded-lg sm:shadow bg-white"> 961 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 962 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 963 <div class="relative sm:rounded-lg overflow-hidden z-10"> 964 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()">
965 <span class="sr-only">View episode SwiftUI Escape Hatch</span> 966 </button> 967 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 968 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="SwiftUI Escape Hatch" srcset="https://nsscreencast.imgix.net/531-swiftui-escape-hatch/531-swiftui-escape-hatch.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/531-swiftui-escape-hatch/531-swiftui-escape-hatch.png?w=400&h=225&fit=crop" /> 969 </div> 970 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 971 <span></span> 972 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#531</p> 973 </div> 974 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 975 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 976 <div data-watched-status-target="episode" class="js-episode-info" data-id="987"> 977 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 978 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 979 <a href="/episodes/531-swiftui-escape-hatch">SwiftUI Escape Hatch</a> 980 </h3> 981 </div> 982 </div> 983 <p class="block text-sm text-gray-700 pointer-events-none">Sometimes we run into issues where SwiftUI doesn't quite do what we need. In some cases, SwiftUI views are powered by UIKit under the hood. Wouldn't it be great (and devious) to dig into the underlying UIKit views to customize things when vanilla SwiftUI just won't cut it? In this episode we'll look at a technique for discovering the UIKit underneath SwiftUI views.</p> 984 </div> 985 </div> 986 </div> 987 </li> 988 989 <li class="relative sm:rounded-lg sm:shadow bg-white"> 990 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 991 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 992 <div class="relative sm:rounded-lg overflow-hidden z-10"> 993 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 994 <span class="sr-only">View episode Hot Reloading with Inject</span> 995 </button> 996 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 997 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Hot Reloading with Inject" srcset="https://nsscreencast.imgix.net/526-hot-reloading-with-inject/526-hot-reloading-with-inject.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/526-hot-reloading-with-inject/526-hot-reloading-with-inject.png?w=400&h=225&fit=crop" /> 998 </div> 999 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1000 <span></span> 1001 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#526</p> 1002 </div> 1003 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1004 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1005 <div data-watched-status-target="episode" class="js-episode-info" data-id="982"> 1006 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1007 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1008 <a href="/episodes/526-hot-reloading-with-inject">Hot Reloading with Inject</a> 1009 </h3> 1010 </div> 1011 </div> 1012 <p class="block text-sm text-gray-700 pointer-events-none">One of the most impactful things you can do to improve productivity is to improve turnaround time when iterating on features. Playgrounds and Xcode Live Previews are great, but both have their limitations. In this episode we will explore how to utilize hot module reloading to have the simulator automatically reflect your changes when you save. It's magic, and will blow your mind!</p> 1013 </div> 1014 </div> 1015 </div> 1016 </li> 1017 1018 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1019 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1020 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1021 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1022 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()">
1023 <span class="sr-only">View episode Nested Xcode Projects</span> 1024 </button> 1025 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1026 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Nested Xcode Projects" srcset="https://nsscreencast.imgix.net/501-modularization-nested-xcode-projects/501-modularization-nested-xcode-projects.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/501-modularization-nested-xcode-projects/501-modularization-nested-xcode-projects.png?w=400&h=225&fit=crop" /> 1027 </div> 1028 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1029 <span></span> 1030 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#501</p> 1031 </div> 1032 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1033 Modular Project Architecture 1034 </span> 1035 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1036 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1037 <div data-watched-status-target="episode" class="js-episode-info" data-id="861"> 1038 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1039 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1040 <a href="/episodes/501-modularization-nested-xcode-projects">Nested Xcode Projects</a> 1041 </h3> 1042 </div> 1043 </div> 1044 <p class="block text-sm text-gray-700 pointer-events-none">One way of achieving modularization is to build frameworks using nested Xcode projects. This has the benefit of having everything in one place and can easily build the entire thing. You can also zero-in on a single project and just work from there if you want. Each sub-project can have its own tests, sample application, etc.</p> 1045 </div> 1046 </div> 1047 </div> 1048 </li> 1049 1050 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1051 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1052 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1053 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1054 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1055 <span class="sr-only">View episode Motivation for Modular Project Architecture</span> 1056 </button> 1057 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1058 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Motivation for Modular Project Architecture" srcset="https://nsscreencast.imgix.net/500-modularization-motivation/500-modularization-motivation.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/500-modularization-motivation/500-modularization-motivation.png?w=400&h=225&fit=crop" /> 1059 </div> 1060 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1061 <span></span> 1062 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#500</p> 1063 </div> 1064 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1065 Modular Project Architecture 1066 </span> 1067 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1068 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1069 <div data-watched-status-target="episode" class="js-episode-info" data-id="860"> 1070 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600">
1071 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1072 <a href="/episodes/500-modularization-motivation">Motivation for Modular Project Architecture</a> 1073 </h3> 1074 </div> 1075 </div> 1076 <p class="block text-sm text-gray-700 pointer-events-none">In this episode we will talk about the overview and motivation for a modular project architecture. Why split things up? I'll talk about the problems we face, what benefits we may achieve, and how can we approach the problem.</p> 1077 </div> 1078 </div> 1079 </div> 1080 </li> 1081 1082 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1083 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1084 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1085 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1086 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1087 <span class="sr-only">View episode Xcode 13 Vim Mode</span> 1088 </button> 1089 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1090 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Xcode 13 Vim Mode" srcset="https://nsscreencast.imgix.net/491-xcode-13-vim/491-xcode-13-vim.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/491-xcode-13-vim/491-xcode-13-vim.png?w=400&h=225&fit=crop" /> 1091 </div> 1092 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1093 <span></span> 1094 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#491</p> 1095 </div> 1096 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1097 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1098 <div data-watched-status-target="episode" class="js-episode-info" data-id="819"> 1099 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1100 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1101 <a href="/episodes/491-xcode-13-vim">Xcode 13 Vim Mode</a> 1102 </h3> 1103 </div> 1104 </div> 1105 <p class="block text-sm text-gray-700 pointer-events-none">One of my favorite new features of Xcode 13 is support for Vim key bindings. In this episode we will see how to enable this and I'll give a quick tour of how to get around using Vim.</p> 1106 </div> 1107 </div> 1108 </div> 1109 </li> 1110 1111 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1112 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1113 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1114 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1115 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1116 <span class="sr-only">View episode Intro to Protocol Witnesses</span> 1117 </button> 1118 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1119 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Intro to Protocol Witnesses" srcset="https://nsscreencast.imgix.net/486-codable-witnesses-1/486-codable-witnesses-1.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/486-codable-witnesses-1/486-codable-witnesses-1.png?w=400&h=225&fit=crop" /> 1120 </div> 1121 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25">
1122 <span></span> 1123 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#486</p> 1124 </div> 1125 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1126 Codable Witnesses 1127 </span> 1128 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1129 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1130 <div data-watched-status-target="episode" class="js-episode-info" data-id="782"> 1131 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1132 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1133 <a href="/episodes/486-codable-witnesses-1">Intro to Protocol Witnesses</a> 1134 </h3> 1135 </div> 1136 </div> 1137 <p class="block text-sm text-gray-700 pointer-events-none">In the next few episodes we will explore the concept of Protocol Witnesses. This is an advanced topic that can be somewhat hard to approach, but in learning about Protocol Witnesses you will see how we can leverage the Swift language and functional programming to do some really cool things.</p> 1138 </div> 1139 </div> 1140 </div> 1141 </li> 1142 1143 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1144 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1145 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1146 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1147 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1148 <span class="sr-only">View episode Basic Context Menus</span> 1149 </button> 1150 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1151 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Basic Context Menus" srcset="https://nsscreencast.imgix.net/482-context-menus-the-basics/482-context-menus-the-basics.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/482-context-menus-the-basics/482-context-menus-the-basics.png?w=400&h=225&fit=crop" /> 1152 </div> 1153 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1154 <span></span> 1155 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#482</p> 1156 </div> 1157 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1158 Working with Context Menus 1159 </span> 1160 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1161 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1162 <div data-watched-status-target="episode" class="js-episode-info" data-id="746"> 1163 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1164 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1165 <a href="/episodes/482-context-menus-the-basics">Basic Context Menus</a> 1166 </h3> 1167 </div> 1168 </div> 1169 <p class="block text-sm text-gray-700 pointer-events-none">Context menus are a great affordance for performing related actions to a UI element. Users can tap and hold to view the context menu, and the gesture is consistent across the OS so users will likely already be familiar with it. In this episode we'll show how to set up a basic context menu with a custom preview with normal and destructive actions.</p> 1170 </div> 1171 </div> 1172 </div> 1173 </li> 1174 1175 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1176 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1177 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1178 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1179 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()">
1180 <span class="sr-only">View episode Mapping Models with Antoine van der Lee</span> 1181 </button> 1182 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1183 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Mapping Models with Antoine van der Lee" srcset="https://nsscreencast.imgix.net/481-mapping-models-with-avanderlee/481-mapping-models-with-avanderlee.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/481-mapping-models-with-avanderlee/481-mapping-models-with-avanderlee.png?w=400&h=225&fit=crop" /> 1184 </div> 1185 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1186 <span></span> 1187 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#481</p> 1188 </div> 1189 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1190 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1191 <div data-watched-status-target="episode" class="js-episode-info" data-id="745"> 1192 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1193 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1194 <a href="/episodes/481-mapping-models-with-avanderlee">Mapping Models with Antoine van der Lee</a> 1195 </h3> 1196 </div> 1197 </div> 1198 <p class="block text-sm text-gray-700 pointer-events-none">This is a discussion and code overview of another implementation of mapping models using key paths with a special guest, Antoine van der Lee! In this episode we talk about his initial goals and constraints, and some of the design tradeoffs he made while designing a solution that would give him a bidirectional mapping between Core Data entities and other model types.</p> 1199 </div> 1200 </div> 1201 </div> 1202 </li> 1203 1204 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1205 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1206 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1207 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1208 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1209 <span class="sr-only">View episode Compositional Layout</span> 1210 </button> 1211 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1212 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Compositional Layout" srcset="https://nsscreencast.imgix.net/453-modern-collection-views-04-compositional-layout/453-modern-collection-views-04-compositional-layout.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/453-modern-collection-views-04-compositional-layout/453-modern-collection-views-04-compositional-layout.png?w=400&h=225&fit=crop" /> 1213 </div> 1214 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1215 <span></span> 1216 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#453</p> 1217 </div> 1218 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1219 Working with Modern Collection Views 1220 </span> 1221 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1222 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1223 <div data-watched-status-target="episode" class="js-episode-info" data-id="653"> 1224 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600">
1225 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1226 <a href="/episodes/453-modern-collection-views-04-compositional-layout">Compositional Layout</a> 1227 </h3> 1228 </div> 1229 </div> 1230 <p class="block text-sm text-gray-700 pointer-events-none">First introduced in iOS 13, UICollectionViewCompositionalLayout is an amazing and powerful addition that gives you lots of flexibility when describing layouts. There are a few new types to get used to (namely sections, groups, and items) but they all work together allowing you to keep layout separate from your views and your data.</p> 1231 </div> 1232 </div> 1233 </div> 1234 </li> 1235 1236 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1237 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1238 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1239 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1240 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1241 <span class="sr-only">View episode Collection View List Layout</span> 1242 </button> 1243 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1244 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Collection View List Layout" srcset="https://nsscreencast.imgix.net/452-modern-collection-views-03-list-layout/452-modern-collection-views-03-list-layout.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/452-modern-collection-views-03-list-layout/452-modern-collection-views-03-list-layout.png?w=400&h=225&fit=crop" /> 1245 </div> 1246 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1247 <span></span> 1248 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#452</p> 1249 </div> 1250 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1251 Working with Modern Collection Views 1252 </span> 1253 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1254 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1255 <div data-watched-status-target="episode" class="js-episode-info" data-id="652"> 1256 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1257 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1258 <a href="/episodes/452-modern-collection-views-03-list-layout">Collection View List Layout</a> 1259 </h3> 1260 </div> 1261 </div> 1262 <p class="block text-sm text-gray-700 pointer-events-none">With UITableView no longer being encouraged for use, we need to replace this behavior with UICollectionView. This is where UICollectionViewListLayout comes into play. Using this layout we can get the familiar table view appearance in plain and grouped styles (as well as additional styles to support sidebars on iPad and macOS). This includes support for sticky headers and footers, swipe actions, and other UITableView behaviors that we've come to rely on.</p> 1263 </div> 1264 </div> 1265 </div> 1266 </li> 1267 1268 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1269 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1270 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1271 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1272 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()">
1273 <span class="sr-only">View episode Cell Registration</span> 1274 </button> 1275 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1276 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Cell Registration" srcset="https://nsscreencast.imgix.net/451-modern-collection-views-02-cell-registration/451-modern-collection-views-02-cell-registration.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/451-modern-collection-views-02-cell-registration/451-modern-collection-views-02-cell-registration.png?w=400&h=225&fit=crop" /> 1277 </div> 1278 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1279 <span></span> 1280 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#451</p> 1281 </div> 1282 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1283 Working with Modern Collection Views 1284 </span> 1285 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1286 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1287 <div data-watched-status-target="episode" class="js-episode-info" data-id="651"> 1288 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1289 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1290 <a href="/episodes/451-modern-collection-views-02-cell-registration">Cell Registration</a> 1291 </h3> 1292 </div> 1293 </div> 1294 <p class="block text-sm text-gray-700 pointer-events-none">In this episode we migrate our collection view to use the new cell registration API. Using this API we no longer need to cast dequeued cell types to our custom types. Instead, we set up the registration object with the cell type and the data we'll be passing to each cell. This further reduces the code we have to write in our datasource implementation and gives us more flexibility on how and where cells are configured.</p> 1295 </div> 1296 </div> 1297 </div> 1298 </li> 1299 1300 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1301 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1302 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1303 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1304 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1305 <span class="sr-only">View episode Setting Up</span> 1306 </button> 1307 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1308 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Setting Up" srcset="https://nsscreencast.imgix.net/450-modern-collection-views-01-setup/450-modern-collection-views-01-setup.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/450-modern-collection-views-01-setup/450-modern-collection-views-01-setup.png?w=400&h=225&fit=crop" /> 1309 </div> 1310 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1311 <span></span> 1312 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#450</p> 1313 </div> 1314 <span class="block text-xs font-medium px-2 py-1 bg-gray-800 text-gray-400 tracking-tight uppercase"> 1315 Working with Modern Collection Views 1316 </span> 1317 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1318 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1319 <div data-watched-status-target="episode" class="js-episode-info" data-id="650"> 1320 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600">
1321 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1322 <a href="/episodes/450-modern-collection-views-01-setup">Setting Up</a> 1323 </h3> 1324 </div> 1325 </div> 1326 <p class="block text-sm text-gray-700 pointer-events-none">In this episode we review the basic example app and start setting up our collection view in code. We start with the basic flow layout which is most common. Later we'll refactor this to use the newer style, but this episode introduces the series and sets up the foundation we'll build upon.</p> 1327 </div> 1328 </div> 1329 </div> 1330 </li> 1331 1332 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1333 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1334 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1335 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1336 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1337 <span class="sr-only">View episode Rendering Waveforms in SwiftUI</span> 1338 </button> 1339 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1340 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Rendering Waveforms in SwiftUI" srcset="https://nsscreencast.imgix.net/447-rendering-waveforms-in-swiftui/447-rendering-waveforms-in-swiftui.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/447-rendering-waveforms-in-swiftui/447-rendering-waveforms-in-swiftui.png?w=400&h=225&fit=crop" /> 1341 </div> 1342 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1343 <span></span> 1344 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#447</p> 1345 </div> 1346 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1347 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1348 <div data-watched-status-target="episode" class="js-episode-info" data-id="647"> 1349 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1350 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1351 <a href="/episodes/447-rendering-waveforms-in-swiftui">Rendering Waveforms in SwiftUI</a> 1352 </h3> 1353 </div> 1354 </div> 1355 <p class="block text-sm text-gray-700 pointer-events-none">I've been working on rendering waveforms using mathematical functions and have found the experience to be both fun and enlightening. In this episode we will develop a method to render arbitrary functions using a Shape, then explore some mathematical concepts that can help us render a nice looking waveform that could be use to indicate activity in sound, speech, or other effects.</p> 1356 </div> 1357 </div> 1358 </div> 1359 </li> 1360 1361 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1362 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1363 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1364 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1365 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1366 <span class="sr-only">
1366View episode SwiftUI Grids</span> 1367 </button> 1368 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1369 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="SwiftUI Grids" srcset="https://nsscreencast.imgix.net/445-swiftui-grids/445-swiftui-grids.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/445-swiftui-grids/445-swiftui-grids.png?w=400&h=225&fit=crop" /> 1370 </div> 1371 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1372 <span></span> 1373 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#445</p> 1374 </div> 1375 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1376 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1377 <div data-watched-status-target="episode" class="js-episode-info" data-id="645"> 1378 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1379 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1380 <a href="/episodes/445-swiftui-grids">SwiftUI Grids</a> 1381 </h3> 1382 </div> 1383 </div> 1384 <p class="block text-sm text-gray-700 pointer-events-none">With the introduction of LazyVGrid and LazyHGrid In iOS 14 we now have access to much more powerful grid-based layouts in SwiftUI. In this episode We will examine the different types of layouts we can accomplish with flexible, fixed, and adaptive sizing for our rows and columns. We'll look at how animations work between different layouts, and how to consider larger screen sizes.</p> 1385 </div> 1386 </div> 1387 </div> 1388 </li> 1389 1390 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1391 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1392 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1393 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1394 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1395 <span class="sr-only">
1395View episode SwiftUI Native Progress Views</span> 1396 </button> 1397 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1398 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="SwiftUI Native Progress Views" srcset="https://nsscreencast.imgix.net/444-swiftui-native-progress-views/444-swiftui-native-progress-views.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/444-swiftui-native-progress-views/444-swiftui-native-progress-views.png?w=400&h=225&fit=crop" /> 1399 </div> 1400 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1401 <span></span> 1402 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#444</p> 1403 </div> 1404 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1405 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1406 <div data-watched-status-target="episode" class="js-episode-info" data-id="644"> 1407 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1408 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1409 <a href="/episodes/444-swiftui-native-progress-views">SwiftUI Native Progress Views</a> 1410 </h3> 1411 </div> 1412 </div> 1413 <p class="block text-sm text-gray-700 pointer-events-none">A few episodes back we covered how to wrap a UIActivityIndicatorView to show loading progress in SwiftUI. Now in iOS 14 this is built in. In this episode we'll cover the various styles, how to hook it up to a Progress instance, and how to create your own custom progress visualizations.</p> 1414 </div> 1415 </div> 1416 </div> 1417 </li> 1418 1419 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1420 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1421 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1422 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1423 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1424 <span class="sr-only">
1424View episode SwiftUI Lazy Stacks in iOS 14</span> 1425 </button> 1426 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1427 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="SwiftUI Lazy Stacks in iOS 14" srcset="https://nsscreencast.imgix.net/443-swiftui-lazy-stacks/443-swiftui-lazy-stacks.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/443-swiftui-lazy-stacks/443-swiftui-lazy-stacks.png?w=400&h=225&fit=crop" /> 1428 </div> 1429 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1430 <span></span> 1431 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#443</p> 1432 </div> 1433 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1434 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1435 <div data-watched-status-target="episode" class="js-episode-info" data-id="643"> 1436 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1437 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1438 <a href="/episodes/443-swiftui-lazy-stacks">SwiftUI Lazy Stacks in iOS 14</a> 1439 </h3> 1440 </div> 1441 </div> 1442 <p class="block text-sm text-gray-700 pointer-events-none">iOS 14 Beta is now available and one of the new features is Lazy stacks. With a normal stack, all the layout happened at once, which meant poor performance for large lists of content, grids, etc. With Lazy stacks the views are only created when they first come on screen, greatly increasing the usefulness of stacks for large or infinite collections of content.</p> 1443 </div> 1444 </div> 1445 </div> 1446 </li> 1447 1448 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1449 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1450 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1451 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1452 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1453 <span class="sr-only">View episode Swift 5's Result Type</span> 1454 </button> 1455 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1456 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Swift 5's Result Type" srcset="https://nsscreencast.imgix.net/417-swift-5-result-type/417-swift-5-result-type.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/417-swift-5-result-type/417-swift-5-result-type.png?w=400&h=225&fit=crop" /> 1457 </div> 1458 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1459 <span></span> 1460 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#417</p> 1461 </div> 1462 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1463 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1464 <div data-watched-status-target="episode" class="js-episode-info" data-id="521"> 1465 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1466 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1467 <a href="/episodes/417-swift-5-result-type">Swift 5's Result Type</a> 1468 </h3> 1469 </div> 1470 </div> 1471 <p class="block text-sm text-gray-700 pointer-events-none">
1471Before Swift 5 we used to write our own Result type to contain a value or an error (but never both). A lot of 3rd party libraries brought along their own as well. Then Swift 5 came and brought us Result. Not only is it slightly different than the ones we might be familiar with, Swift's Result type also has some useful functionality up its sleeve.</p> 1472 </div> 1473 </div> 1474 </div> 1475 </li> 1476 1477 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1478 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1479 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1480 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1481 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1482 <span class="sr-only">View episode Tinting an Image Using Masks</span> 1483 </button> 1484 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1485 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="Tinting an Image Using Masks" srcset="https://nsscreencast.imgix.net/406-tinting-an-image-using-masks/406-tinting-an-image-using-masks.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/406-tinting-an-image-using-masks/406-tinting-an-image-using-masks.png?w=400&h=225&fit=crop" /> 1486 </div> 1487 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1488 <span></span> 1489 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#406</p> 1490 </div> 1491 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1492 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1493 <div data-watched-status-target="episode" class="js-episode-info" data-id="510"> 1494 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1495 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1496 <a href="/episodes/406-tinting-an-image-using-masks">Tinting an Image Using Masks</a> 1497 </h3> 1498 </div> 1499 </div> 1500 <p class="block text-sm text-gray-700 pointer-events-none">Sometimes we need to create variants of our icons. This can be done by using template images and using a UIImageView with a tintColor change, however sometimes this isn't feasible. We can use our icons along with a mask to create new images of whatever color we want. In this episode we'll use UIGraphicsImageRenderer to quickly draw a new dimmed image for a highlighted button state.</p> 1501 </div> 1502 </div> 1503 </div> 1504 </li> 1505 1506 <li class="relative sm:rounded-lg sm:shadow bg-white"> 1507 <div class="hidden sm:block absolute bottom-0 left-0 right-0 h-10 sm:rounded-b-lg z-20" style="background: linear-gradient( rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 98%);"> </div> 1508 <div class="focus-within:ring-2 focus-within:ring-offset-2 rounded-lg focus-within:ring-violet-500 group block w-full"> 1509 <div class="relative sm:rounded-lg overflow-hidden z-10"> 1510 <button type="button" class="absolute inset-0 w-full h-full" onclick="this.closest('li').querySelector('.episode-link a').click()"> 1511 <span class="sr-only">
1511View episode SwiftUI Gestures</span> 1512 </button> 1513 <div class="aspect-w-16 aspect-h-9 pointer-events-none"> 1514 <img class="transition duration-300 ease-in-out group-hover:opacity-75 object cover pointer-events-none" loading="lazy" intrinsicsize="400 x 225" width="400" alt="SwiftUI Gestures" srcset="https://nsscreencast.imgix.net/400-swiftui-gestures/400-swiftui-gestures.png?w=800&h=450 2x" src="https://nsscreencast.imgix.net/400-swiftui-gestures/400-swiftui-gestures.png?w=400&h=225&fit=crop" /> 1515 </div> 1516 <div class="absolute top-0 left-0 right-0 bg-black flex items-center justify-between px-2 py-1 bg-opacity-25"> 1517 <span></span> 1518 <p class="block text-sm tracking-tight font-medium text-gray-100 pointer-events-none">#400</p> 1519 </div> 1520 <div class="px-5 pt-1 pb-3 sm:max-h-40"> 1521 <div class="mt-2 block text-base font-medium text-gray-900 truncate-y"> 1522 <div data-watched-status-target="episode" class="js-episode-info" data-id="504"> 1523 <h3 class="episode-link text-lg transition duration-300 ease-in-out group-hover:text-violet-600"> 1524 <span class="opacity-0 text-violet-200 inline-block -ml-4 font-extrabold indicator text-xl">â¢</span> 1525 <a href="/episodes/400-swiftui-gestures">SwiftUI Gestures</a> 1526 </h3> 1527 </div> 1528 </div> 1529 <p class="block text-sm text-gray-700 pointer-events-none">Attaching gestures works quite a bit differently in SwiftUI than in UIKit. In this episode we will look at the @DragGesture property wrapper and how we can use gestures to update custom state that we can then use to transform our UI.</p> 1530 </div> 1531 </div> 1532 </div> 1533 </li> 1534 1535 </ul> 1536 1537 <!-- because we cache the episode rows, add user data here for javascript to decorate post render --> 1538 <div class="pagination-container"> 1539 <div role="navigation" aria-label="Pagination" class="pagination"><span class="previous_page disabled" aria-label="Previous page">← Previous</span> <em class="current" aria-label="Page 1" aria-current="page">1</em> <a rel="next" aria-label="Page 2" href="/episodes/free?page=2#episodes">2</a> <a aria-label="Page 3" href="/episodes/free?page=3#episodes">3</a> <a class="next_page" aria-label="Next page" rel="next" href="/episodes/free?page=2#episodes">Next →</a></div> 1540 </div> 1541 </div> 1542 </div> 1543 1544</div> 1545 1546 </div> 1547 <footer id="mainFooter" class="bg-gray-800" aria-labelledby="footerHeading"> 1548 <h2 id="footerHeading" class="sr-only">Footer</h2> 1549 <div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:py-16 lg:px-8"> 1550 <div class="xl:grid xl:grid-cols-3 xl:gap-8"> 1551 <div class="grid grid-cols-2 gap-8 xl:col-span-2"> 1552 <div class="md:grid md:grid-cols-2 md:gap-8"> 1553 <div> 1554 <h3 class="text-sm font-semibold text-gray-400 tracking-wider uppercase"> 1555 iOS App 1556 </h3> 1557 <ul class="mt-4 space-y-4"> 1558 <li> 1559 <a target="_blank" rel="noopener noreferrer" href="https://itunes.apple.com/us/app/nsscreencast-screencasts-on-ios-development/id1130799278?mt=8"> 1560 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 1561<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="US_UK_Download_on_the" x="0px" y="0px" width="135px" height="40px" viewBox="0 0 135 40" enable-background="new 0 0 135 40" xml:space="preserve"> 1562<g> 1563 <path fill="#A6A6A6" d="M130.197,40H4.729C2.122,40,0,37.872,0,35.267V4.726C0,2.12,2.122,0,4.729,0h125.468 C132.803,0,135,2.12,135,4.726v30.541C135,37.872,132.803,40,130.197,40L130.197,40z"></path> 1564 <path d="M134.032,35.268c0,2.116-1.714,3.83-3.834,3.83H4.729c-2.119,0-3.839-1.714-3.839-3.83V4.725 c0-2.115,1.72-3.835,3.839-3.835h125.468c2.121,0,3.834,1.72,3.834,3.835L134.032,35.268L134.032,35.268z"></path> 1565 <g> 1566 <g> 1567 <path fill="#FFFFFF" d="M30.128,19.784c-0.029-3.223,2.639-4.791,2.761-4.864c-1.511-2.203-3.853-2.504-4.676-2.528 c-1.967-0.207-3.875,1.177-4.877,1.177c-1.022,0-2.565-1.157-4.228-1.123c-2.14,0.033-4.142,1.272-5.24,3.196 c-2.266,3.923-0.576,9.688,1.595,12.859c1.086,1.553,2.355,3.287,4.016,3.226c1.625-0.067,2.232-1.036,4.193-1.036 c1.943,0,2.513,1.036,4.207,0.997c1.744-0.028,2.842-1.56,3.89-3.127c1.255-1.78,1.759-3.533,1.779-3.623 C33.507,24.924,30.161,23.647,30.128,19.784z"></path> 1568 <path fill="#FFFFFF" d="M26.928,10.306c0.874-1.093,1.472-2.58,1.306-4.089c-1.265,0.056-2.847,0.875-3.758,1.944 c-0.806,0.942-1.526,2.486-1.34,3.938C24.557,12.205,26.016,11.382,26.928,10.306z"></path> 1569 </g> 1570 </g> 1571 <g> 1572 <path fill="#FFFFFF" d="M53.645,31.504h-2.271l-1.244-3.909h-4.324l-1.185,3.909h-2.211l4.284-13.308h2.646L53.645,31.504z M49.755,25.955L48.63,22.48c-0.119-0.355-0.342-1.191-0.671-2.507h-0.04c-0.131,0.566-0.342,1.402-0.632,2.507l-1.105,3.475 H49.755z"></path> 1573 <path fill="#FFFFFF" d="M64.662,26.588c0,1.632-0.441,2.922-1.323,3.869c-0.79,0.843-1.771,1.264-2.942,1.264 c-1.264,0-2.172-0.454-2.725-1.362h-0.04v5.055h-2.132V25.067c0-1.026-0.027-2.079-0.079-3.159h1.875l0.119,1.521h0.04 c0.711-1.146,1.79-1.718,3.238-1.718c1.132,0,2.077,0.447,2.833,1.342C64.284,23.949,64.662,25.127,64.662,26.588z M62.49,26.666 c0-0.934-0.21-1.704-0.632-2.31c-0.461-0.632-1.
157308-0.948-1.856-0.948c-0.526,0-1.004,0.176-1.431,0.523 c-0.428,0.35-0.708,0.807-0.839,1.373c-0.066,0.264-0.099,0.48-0.099,0.65v1.6c0,0.698,0.214,1.287,0.642,1.768 s0.984,0.721,1.668,0.721c0.803,0,1.428-0.31,1.875-0.928C62.266,28.496,62.49,27.68,62.49,26.666z"></path> 1574 <path fill="#FFFFFF" d="M75.699,26.588c0,1.632-0.441,2.922-1.324,3.869c-0.789,0.843-1.77,1.264-2.941,1.264 c-1.264,0-2.172-0.454-2.724-1.362H68.67v5.055h-2.132V25.067c0-1.026-0.027-2.079-0.079-3.159h1.875l0.119,1.521h0.04 c0.71-1.146,1.789-1.718,3.238-1.718c1.131,0,2.076,0.447,2.834,1.342C75.32,23.949,75.699,25.127,75.699,26.588z M73.527,26.666 c0-0.934-0.211-1.704-0.633-2.31c-0.461-0.632-1.078-0.948-1.855-0.948c-0.527,0-1.004,0.176-1.432,0.523 c-0.428,0.35-0.707,0.807-0.838,1.373c-0.065,0.264-0.099,0.48-0.099,0.65v1.6c0,0.698,0.214,1.287,0.64,1.768 c0.428,0.48,0.984,0.721,1.67,0.721c0.803,0,1.428-0.31,1.875-0.928C73.303,28.496,73.527,27.68,73.527,26.666z"></path> 1575 <path fill="#FFFFFF" d="M88.039,27.772c0,1.132-0.393,2.053-1.182,2.764c-0.867,0.777-2.074,1.165-3.625,1.165 c-1.432,0-2.58-0.276-3.449-0.829l0.494-1.777c0.936,0.566,1.963,0.85,3.082,0.85c0.803,0,1.428-0.182,1.877-0.544 c0.447-0.362,0.67-0.848,0.67-1.454c0-0.54-0.184-0.995-0.553-1.364c-0.367-0.369-0.98-0.712-1.836-1.029 c-2.33-0.869-3.494-2.142-3.494-3.816c0-1.094,0.408-1.991,1.225-2.689c0.814-0.699,1.9-1.048,3.258-1.048 c1.211,0,2.217,0.211,3.02,0.632l-0.533,1.738c-0.75-0.408-1.598-0.612-2.547-0.612c-0.75,0-1.336,0.185-1.756,0.553 c-0.355,0.329-0.533,0.73-0.533,1.205c0,0.526,0.203,0.961,0.611,1.303c0.355,0.316,1,0.658,1.936,1.027 c1.145,0.461,1.986,1,2.527,1.618C87.77,26.081,88.039,26.852,88.039,27.772z"></path> 1576 <path fill="#FFFFFF" d="M95.088,23.508h-2.35v4.659c0,1.185,0.414,1.777,1.244,1.777c0.381,0,0.697-0.033,0.947-0.099l0.059,1.619 c-0.42,0.157-0.973,0.236-1.658,0.236c-0.842,0-1.5-0.257-1.975-0.77c-0.473-0.514-0.711-1.376-0.711-2.587v-4.837h-1.4v-1.6h1.4 v-1.757l2.094-0.632v2.389h2.35V23.508z"></path> 1577 <path fill="#FFFFFF" d="M105.691,26.627c0,1.475-0.422,2.686-1.264,3.633c-0.883,0.975-2.055,1.461-3.516,1.461 c-1.408,0-2.529-0.467-3.365-1.401s-1.254-2.113-1.254-3.534c0-1.487,0.43-2.705,1.293-3.652c0.861-0.948,2.023-1.422,3.484-1.422 c1.408,0,2.541,0.467,3.396,1.402C105.283,24.021,105.691,25.192,105.691,26.627z M103.479,26.696 c0-0.885-0.189-1.644-0.572-2.277c-0.447-0.766-1.086-1.148-1.914-1.148c-0.857,0-1.508,0.383-1.955,1.148 c-0.383,0.634-0.572,1.405-0.572,2.317c0,0.885,0.189,1.644,0.572,2.276c0.461,0.766,1.105,1.148,1.936,1.148 c0.814,0,1.453-0.39,1.914-1.168C103.281,28.347,103.479,27.58,103.479,26.696z"></path> 1578 <path fill="#FFFFFF" d="M112.621,23.783c-0.211-0.039-0.436-0.059-0.672-0.059c-0.75,0-1.33,0.283-1.738,0.85 c-0.355,0.5-0.533,1.132-0.533,1.895v5.035h-2.131l0.02-6.574c0-1.106-0.027-2.113-0.08-3.021h1.857l0.078,1.836h0.059 c0.225-0.631,0.58-1.139,1.066-1.52c0.475-0.343,0.988-0.514,1.541-0.514c0.197,0,0.375,0.014,0.533,0.039V23.783z"></path> 1579 <path fill="#FFFFFF" d="M122.156,26.252c0,0.382-0.025,0.704-0.078,0.967h-6.396c0.025,0.948,0.334,1.673,0.928,2.173 c0.539,0.447,1.236,0.671,2.092,0.671c0.947,0,1.811-0.151,2.588-0.454l0.334,1.48c-0.908,0.396-1.98,0.593-3.217,0.593 c-1.488,0-2.656-0.438-3.506-1.313c-0.848-0.875-1.273-2.05-1.273-3.524c0-1.447,0.395-2.652,1.186-3.613 c0.828-1.026,1.947-1.539,3.355-1.539c1.383,0,2.43,0.513,3.141,1.539C121.873,24.047,122.156,25.055,122.156,26.252z M120.123,25.699c0.014-0.632-0.125-1.178-0.414-1.639c-0.369-0.593-0.936-0.889-1.699-0.889c-0.697,0-1.264,0.289-1.697,0.869 c-0.355,0.461-0.566,1.014-0.631,1.658H120.123z"></path> 1580 </g> 1581 <g> 1582 <g> 1583 <path fill="#FFFFFF" d="M49.05,10.009c0,1.177-0.353,2.063-1.058,2.658c-0.653,0.549-1.581,0.824-2.783,0.824 c-0.596,0-1.106-0.026-1.533-0.078V6.982c0.557-0.09,1.157-0.136,1.805-0.136c1.145,0,2.008,0.249,2.59,0.747 C48.723,8.156,49.05,8.961,49.05,10.009z M47.945,10.038c0-0.763-0.202-1.348-0.606-1.756c-0.404-0.407-0.994-0.611-1.771-0.611 c-0.33,0-0.611,0.022-0.844,0.068v4.889c0.129,0.02,0.365,0.029,0.708,0.029c0.802,0,1.421-0.223,1.857-0.669 S47.945,10.892,47.945,
158310.038z"></path> 1584 <path fill="#FFFFFF" d="M54.909,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.009,0.718-1.727,0.718 c-0.692,0-1.243-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.712-0.698 c0.692,0,1.248,0.229,1.669,0.688C54.708,9.757,54.909,10.333,54.909,11.037z M53.822,11.071c0-0.435-0.094-0.808-0.281-1.119 c-0.22-0.376-0.533-0.564-0.94-0.564c-0.421,0-0.741,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138 c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.714-0.191,0.94-0.574 C53.725,11.882,53.822,11.506,53.822,11.071z"></path> 1585 <path fill="#FFFFFF" d="M62.765,8.719l-1.475,4.714h-0.96l-0.611-2.047c-0.155-0.511-0.281-1.019-0.379-1.523h-0.019 c-0.091,0.518-0.217,1.025-0.379,1.523l-0.649,2.047h-0.971l-1.387-4.714h1.077l0.533,2.241c0.129,0.53,0.235,1.035,0.32,1.513 h0.019c0.078-0.394,0.207-0.896,0.389-1.503l0.669-2.25h0.854l0.641,2.202c0.155,0.537,0.281,1.054,0.378,1.552h0.029 c0.071-0.485,0.178-1.002,0.32-1.552l0.572-2.202H62.765z"></path> 1586 <path fill="#FFFFFF" d="M68.198,13.433H67.15v-2.7c0-0.832-0.316-1.248-0.95-1.248c-0.311,0-0.562,0.114-0.757,0.343 c-0.193,0.229-0.291,0.499-0.291,0.808v2.796h-1.048v-3.366c0-0.414-0.013-0.863-0.038-1.349h0.921l0.049,0.737h0.029 c0.122-0.229,0.304-0.418,0.543-0.569c0.284-0.176,0.602-0.265,0.95-0.265c0.44,0,0.806,0.142,1.097,0.427 c0.362,0.349,0.543,0.87,0.543,1.562V13.433z"></path> 1587 <path fill="#FFFFFF" d="M71.088,13.433h-1.047V6.556h1.047V13.433z"></path> 1588 <path fill="#FFFFFF" d="M77.258,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.01,0.718-1.727,0.718 c-0.693,0-1.244-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.711-0.698 c0.693,0,1.248,0.229,1.67,0.688C77.057,9.757,77.258,10.333,77.258,11.037z M76.17,11.071c0-0.435-0.094-0.808-0.281-1.119 c-0.219-0.376-0.533-0.564-0.939-0.564c-0.422,0-0.742,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138 c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.713-0.191,0.939-0.574 C76.074,11.882,76.17,11.506,76.17,11.071z"></path> 1589 <path fill="#FFFFFF" d="M82.33,13.433h-0.941l-0.078-0.543h-0.029c-0.322,0.433-0.781,0.65-1.377,0.65 c-0.445,0-0.805-0.143-1.076-0.427c-0.246-0.258-0.369-0.579-0.369-0.96c0-0.576,0.24-1.015,0.723-1.319 c0.482-0.304,1.16-0.453,2.033-0.446V10.3c0-0.621-0.326-0.931-0.979-0.931c-0.465,0-0.875,0.117-1.229,0.349l-0.213-0.688 c0.438-0.271,0.979-0.407,1.617-0.407c1.232,0,1.85,0.65,1.85,1.95v1.736C82.262,12.78,82.285,13.155,82.33,13.433z M81.242,11.813v-0.727c-1.156-0.02-1.734,0.297-1.734,0.95c0,0.246,0.066,0.43,0.201,0.553c0.135,0.123,0.307,0.184,0.512,0.184 c0.23,0,0.445-0.073,0.641-0.218c0.197-0.146,0.318-0.331,0.363-0.558C81.236,11.946,81.242,11.884,81.242,11.813z"></path> 1590 <path fill="#FFFFFF" d="M88.285,13.433h-0.93l-0.049-0.757h-0.029c-0.297,0.576-0.803,0.864-1.514,0.864 c-0.568,0-1.041-0.223-1.416-0.669s-0.562-1.025-0.562-1.736c0-0.763,0.203-1.381,0.611-1.853c0.395-0.44,0.879-0.66,1.455-0.66 c0.633,0,1.076,0.213,1.328,0.64h0.02V6.556h1.049v5.607C88.248,12.622,88.26,13.045,88.285,13.433z M87.199,11.445v-0.786 c0-0.136-0.01-0.246-0.029-0.33c-0.059-0.252-0.186-0.464-0.379-0.635c-0.195-0.171-0.43-0.257-0.701-0.257 c-0.391,0-0.697,0.155-0.922,0.466c-0.223,0.311-0.336,0.708-0.336,1.193c0,0.466,0.107,0.844,0.322,1.135 c0.227,0.31,0.533,0.465,0.916,0.465c0.344,0,0.619-0.129,0.828-0.388C87.1,12.069,87.199,11.781,87.199,11.445z"></path> 1591 <path fill="#FFFFFF" d="M97.248,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.008,0.718-1.727,0.718 c-0.691,0-1.242-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.713-0.698 c0.691,0,1.248,0.229,1.668,0.688C97.047,9.757,97.248,10.333,97.248,11.037z M96.162,11.071c0-0.435-0.094-0.808-0.281-1.119 c-0.221-0.376-0.533-0.564-0.941-0.564c-0.42,0-0.74,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138 c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.715-0.191,0.941-0.574 C96.064,11.882,96.162,11.506,96.162,11.071z"></path> 1592 <path fill="#FFFFFF" d="M102.883,13.433h-1.047v-2.7c0-0.832-0.316-1.248-0.951-1.248c-0.311,0-0.562,0.114-0.756,0.343 s-0.291,0.499-0.291,0.808v2.796h-1.049v-3.366c0-0.414-0.012-0.863-0.037-1.349h0.92l0.049,0.737h0.029 c0.123-0.229,0.305-0.418,0.543-0.569c0.285-0.176,0.602-0.265,0.951-0.265c0.439,0,0.805,0.142,1.096,0.427 c0.363,0.349,0.543,0.87,0.543,1.562V13.433z"></path> 1593 <path fill="#FFFFFF" d="M109.936,9.504h-1.154v2.29c0,0.582,0.205,0.873,0.611,0.873c0.188,0,0.344-0.016,0.467-0.049 l0.027,0.795c-0.207,0.078-0.479,0.117-0.814,0.117c-0.414,0-0.736-0.126-0.969-0.378c-0.234-0.252-0.35-0.676-0.35-1.271V9.504 h-0.689V8.719h0.689V7.855l1.027-0.31v1.173h1.154V9.504z"></path> 1594 <path fill="#FFFFFF" d="M115.484,13.433h-1.049v-2.68c0-0.845-0.316-1.268-0.949-1.268c-0.486,0-0.818,0.245-1,0.735 c-0.031,0.103-0.049,0.229-0.049,0.377v2.835h-1.047V6.556h1.047v2.841h0.02c0.33-0.517,0.803-0.775,1.416-0.775 c0.434,0,0.793,0.142,1.078,0.427c0.355,0.355,0.533,0.883,0.533,1.581V13.433z"></path> 1595 <path fill="#FFFFFF" d="M121.207,10.853c0,0.188-0.014,0.346-0.039,0.475h-3.143c0.014,0.466,0.164,0.821,0.455,1.067 c0.266,0.22,0.609,0.33,1.029,0.33c0.465,0,0.889-0.074,1.271-0.223l0.164,0.728c-0.447,0.194-0.973,0.291-1.582,0.291 c-0.73,0-1.305-0.215-1.721-0.645c-0.418-0.43-0.625-1.007-0.625-1.731c0-0.711,0.193-1.303,0.582-1.775 c0.406-0.504,0.955-0.756,1.648-0.756c0.678,0,1.193,0.252,1.541,0.756C121.068,9.77,121.207,10.265,121.207,10.853z M120.207,10.582c0.008-0.311-0.061-0.579-0.203-0.805c-0.182-0.291-0.459-0.437-0.834-0.437c-0.342,0-0.621,0.142-0.834,0.427 c-0.174,0.227-0.277,0.498-0.311,0.815H120.207z"></path> 1596 </g> 1597 </g> 1598</g> 1599</svg> 1600</a> </li> 1601 </ul> 1602 </div> 1603 <div class="mt-12 md:mt-0"> 1604 <h3 class="text-sm font-semibold text-gray-400 tracking-wider up
1604percase"> 1605 Contact 1606 </h3> 1607 <ul class="mt-4 space-y-4"> 1608 <li> 1609 <a href="https://nsscreencast.helpscoutdocs.com/article/6-send-feedback" target="_blank" rel="noopener noreferrer" class="text-base text-gray-300 hover:text-white"> 1610 Send Feedback 1611 </a> 1612 </li> 1613 <li> 1614 <a href="https://nsscreencast.helpscoutdocs.com/article/5-get-help" target="_blank" rel="noopener noreferrer" class="text-base text-gray-300 hover:text-white"> 1615 Get Help 1616 </a> 1617 </li> 1618 <li> 1619 <a href="https://nsscreencast.helpscoutdocs.com/article/7-suggest-an-episode" target="_blank" rel="noopener noreferrer" class="text-base text-gray-300 hover:text-white"> 1620 Suggest an Episode 1621 </a> 1622 </li> 1623 </ul> 1624 </div> 1625 </div> 1626 <div class="md:grid md:grid-cols-2 md:gap-8"> 1627 <div class="mt-12 md:mt-0"> 1628 <h3 class="text-sm font-semibold text-gray-400 tracking-wider uppercase"> 1629 Legal 1630 </h3> 1631 <ul class="mt-4 space-y-4"> 1632 <li> 1633 <a href="/privacy" class="text-base text-gray-300 hover:text-white"> 1634 Privacy 1635 </a> 1636 </li> 1637 1638 <li> 1639 <a href="/terms" class="text-base text-gray-300 hover:text-white"> 1640 Terms 1641 </a> 1642 </li> 1643 </ul> 1644 </div> 1645 </div> 1646 </div> 1647 </div> 1648 <div class="mt-8 border-t border-gray-700 pt-8 md:flex md:items-center md:justify-between"> 1649 <div class="flex space-x-6 md:order-2"> 1650 <a rel="me" href="https://mas.to/@nsscreencast" class="text-gray-400 hover:text-gray-300"> 1651 <span class="sr-only">Mastodon</span> 1652 <svg><!-- SVG file not found: 'mastodon' (Try adding .svg to your filename) --></svg> 1653 </a> 1654 1655 <a href="https://github.com/nsscreencast" class="text-gray-400 hover:text-gray-300"> 1656 <span class="sr-only">GitHub</span> 1657 <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1658 <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" /> 1659 </svg> 1660 </a> 1661 1662 </div> 1663 <p class="mt-8 text-base text-gray-400 md:mt-0 md:order-1"> 1664 © 2026 Fickle Bits, LLC. All rights reserved. 1665 </p> 1666 </div> 1667 </div> 1668</footer> 1669 1670 1671 1672
1672<script> 1673//<![CDATA[
vendor: 349 bytes, lines 1673-1679
1673 1674 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 1675 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 1676 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 1677 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 1678 1679 ga('create', '
1679UA-57850928-2
vendor: 40 bytes, lines 1679-1680
1679', 'auto'); 1680 ga('send', 'pageview');
1681//]]> 1682</script>
1682 1683 1684 1685 1686 </body> 1687</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.