{"version":3,"file":"min.js","sources":["../../../javascript/plugins/prefetch.js","../../../javascript/plugins/youtube-embed.js","../../../javascript/plugins/slider.js","../../../javascript/plugins/search.js","../../../javascript/plugins/animations.js","../../../javascript/plugins/google-maps.js","../../../javascript/main.js"],"sourcesContent":["\nfunction prefetch(e) {\n if (e.target.tagName != \"A\") {\n return;\n }\n if (e.target.origin != location.origin) {\n return;\n }\n /**\n * Return the given url with no fragment\n * @param {string} url potentially containing a fragment\n * @return {string} url without fragment\n */\n const removeUrlFragment = (url) => url.split(\"#\")[0];\n if (removeUrlFragment(window.location.href) === removeUrlFragment(e.target.href)) {\n return;\n }\n var l = document.createElement(\"link\");\n l.rel = \"prefetch\";\n l.href = e.target.href;\n document.head.appendChild(l);\n }\n document.documentElement.addEventListener(\"mouseover\", prefetch, {\n capture: true,\n passive: true,\n });\n document.documentElement.addEventListener(\"touchstart\", prefetch, {\n capture: true,\n passive: true,\n });","/**\n * YOUTUBE\n * \n * HTML ALTERNATE\n * https://css-tricks.com/lazy-load-embedded-youtube-videos/\n */\nwindow.addEventListener( \"load\", (e)=> {\n let YouTubeContainers = document.querySelectorAll(\".embed-youtube\");\n\n // Iterate over every YouTube container you may have\n for (let i = 0; i < YouTubeContainers.length; i++) {\n let container = YouTubeContainers[i];\n let imageSource = \"https://img.youtube.com/vi/\"+ container.dataset.videoId +\"/sddefault.jpg\"; \n\n // Load the Thumbnail Image asynchronously\n let image = new Image();\n image.src = imageSource;\n image.addEventListener(\"load\", function() {\n container.appendChild(image);\n });\n\n // When the user clicks on the container, load the embedded YouTube video\n container.addEventListener(\"click\", function() {\n let iframe = document.createElement( \"iframe\" );\n\n iframe.setAttribute(\"frameborder\", \"0\");\n iframe.setAttribute(\"allowfullscreen\", \"\");\n iframe.setAttribute(\"allow\", \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\");\n // Important: add the autoplay GET parameter, otherwise the user would need to click over the YouTube video again to play it \n iframe.setAttribute(\"src\", \"https://www.youtube.com/embed/\"+ this.dataset.videoId +\"?rel=0&showinfo=0&autoplay=1\");\n\n // Clear Thumbnail and load the YouTube iframe\n this.innerHTML = \"\";\n this.appendChild( iframe );\n });\n }\n})","\n\n/**\n * SLIDER\n */\n\n window.addEventListener(\n \"load\",\n (e)=> {\n if(! document.querySelector('.gallery')) return\n \n dynamicScriptInject(`${window.location.origin}/js/splide.min.js`)\n .then(() => {\n const main = new Splide( '#main-slider', {\n type : 'slide',\n rewind : true,\n pagination: false,\n arrows : true,\n cover : true,\n // width : '90%',\n // padding: 0,\n heightRatio: .7,\n autoplay : true,\n interval : 5000,\n pauseOnHover: true,\n })\n \n const thumbnails = new Splide( '#thumbnail-slider', {\n fixedWidth : 100,\n fixedHeight : 60,\n // width : '80%',\n // padding: 0,\n gap : 10,\n rewind : true,\n pagination : false,\n cover : true,\n isNavigation: true,\n breakpoints : {\n 600: {\n fixedWidth : 60,\n fixedHeight: 44,\n },\n },\n })\n \n main.sync( thumbnails )\n main.mount()\n thumbnails.mount()\n })\n .catch((error) => {\n console.error(error)\n })\n \n dynamicCssInject(`${window.location.origin}/css/splide/themes/splide-default.min.css`)\n .then(()=>{\n console.log('css for loaded')\n })\n .catch((error) => {\n console.error(error)\n })\n },\n /* capture */ \"true\"\n )","\n/**\n * SEARCH BAR\n */\n\n let searchApi = null;\n window.addEventListener(\"load\", async (e) => {\n if(! document.querySelector('.search')) return\n \n await dynamicScriptInject(`${window.location.origin}/js/js-search.min.js`)\n const jsonData = await fetch(`${window.location.origin}/feed/feed.json`)\n .then(response => response.json())//.then(JSON.parse)\n \n searchApi = new JsSearch.Search('id')\n searchApi.addIndex('title')\n searchApi.addIndex('content_html')\n // search.addIndex(['author', 'name'])\n \n searchApi.addDocuments(jsonData.items)\n \n const res = searchApi.search('ev')\n \n res.map( i => alert(i.title))\n \n const searchBar = document.getElementById(\"searchBar\")\n \n searchBar.addEventListener('change', function(e) {\n const res = searchApi.search(searchBar.value)\n res.map( i => alert(i.title))\n })\n \n // const res = searchApi.search('ev')\n // .then(async () => {\n // const jsonData = await fetch(`${window.location.origin}/feed/feed.json`).then(response => response.json())//.then(JSON.parse)\n \n // // const parsedJson = JSON.parse(jsonData)\n \n // searchApi = new JsSearch.Search('id')\n // searchApi.addIndex('title')\n // searchApi.addIndex('content_html')\n // // search.addIndex(['author', 'name'])\n \n // searchApi.addDocuments(jsonData.items)\n \n // const res = searchApi.search('ev')\n \n // // search.search('The'); // [theGreatGatsby, theDaVinciCode]\n // // search.search('scott'); // [theGreatGatsby]\n // // search.search('dan'); // [angelsAndDemons, theDaVinciCode]\n // // search.search('mystery') // [angelsAndDemons, theDaVinciCode]\n \n // res.map( i => alert(i.title))\n \n // })\n // .catch((error) => {\n // console.error(error)\n // })\n \n \n },\n /* capture */ \"true\"\n )","\n/**\n * ANIMATIONS\n */\n window.addEventListener('load', (event) => {\n\n const options = {\n root: null,\n threshold: 0,\n rootMargin: '0px 0px -50px 0px'\n }\n \n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n entry.target.classList.add('in-view')\n observer.unobserve(entry.target)\n }\n })\n }, options)\n \n // const sections = Array.from(document.getElementsByClassName('section'))\n // sections.map(section => {\n // const children = Array.from(section.getElementsByClassName('fade-delay'))\n // children.map((child, index ) => {\n // child.setAttribute('style', 'transition-delay: ' + index * 0.5 + 's')\n // })\n // observer.observe(section) \n // })\n \n const sections = Array.from(document.getElementsByClassName('section'))\n for (let section of sections) {\n const children = section.getElementsByClassName('fade-delay')\n for (let count = 0; count < children.length; count++) {\n children[count].setAttribute('style', 'transition-delay: ' + count * 0.5 + 's')\n }\n observer.observe(section) \n }\n })","/**\n * GOOGLE MAPS\n */\n\n window.addEventListener(\n \"load\",\n (e)=> {\n \n const map = document.getElementById('map')\n \n if (! map) return\n \n const options = {\n root: null,\n threshold: 0,\n rootMargin: '100px'\n }\n \n const observer = new IntersectionObserver( (entries, self) => {\n const isIntersecting = typeof entries[0].isIntersecting === 'boolean' ? entries[0].isIntersecting : entries[0].intersectionRatio > 0\n \n if (! isIntersecting ) return\n \n dynamicScriptInject(`https://maps.googleapis.com/maps/api/js?key=${map.dataset.key}`)\n .then(() => {\n const center = {\n lat: parseFloat(map.dataset.latitude),\n lng: parseFloat(map.dataset.longitude)\n }\n \n const googleMap = new google.maps.Map(map, {\n zoom: parseInt(map.dataset.zoom) || 15,\n center: center\n })\n \n const marker = new google.maps.Marker({\n position: center,\n map: googleMap\n })\n })\n .catch((error) => {\n console.error(error);\n })\n \n self.unobserve(map)\n },\n options\n )\n observer.observe(map)\n })","/**\n * Copyright (c) 2020 Google Inc\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nconst exposed = {};\nif (location.search) {\n var a = document.createElement(\"a\");\n a.href = location.href;\n a.search = \"\";\n history.replaceState(null, null, a.href);\n}\n\nfunction tweet_(url) {\n open(\n \"https://twitter.com/intent/tweet?url=\" + encodeURIComponent(url),\n \"_blank\"\n );\n}\nfunction tweet(anchor) {\n tweet_(anchor.getAttribute(\"href\"));\n}\nexpose(\"tweet\", tweet);\n\nfunction share(anchor) {\n var url = anchor.getAttribute(\"href\");\n event.preventDefault();\n if (navigator.share) {\n navigator.share({\n url: url,\n });\n } else if (navigator.clipboard) {\n navigator.clipboard.writeText(url);\n message(\"Article URL copied to clipboard.\");\n } else {\n tweet_(url);\n }\n}\nexpose(\"share\", share);\n\nfunction toggleMenu(e){\n document.body.classList.toggle('nav-open')\n}\nexpose(\"toggleMenu\", toggleMenu);\n\nfunction message(msg) {\n var dialog = document.getElementById(\"message\");\n dialog.textContent = msg;\n dialog.setAttribute(\"open\", \"\");\n setTimeout(function () {\n dialog.removeAttribute(\"open\");\n }, 3000);\n}\n\n\nimport \"./plugins/prefetch.js\"\n// function prefetch(e) {\n// if (e.target.tagName != \"A\") {\n// return;\n// }\n// if (e.target.origin != location.origin) {\n// return;\n// }\n// /**\n// * Return the given url with no fragment\n// * @param {string} url potentially containing a fragment\n// * @return {string} url without fragment\n// */\n// const removeUrlFragment = (url) => url.split(\"#\")[0];\n// if (removeUrlFragment(window.location.href) === removeUrlFragment(e.target.href)) {\n// return;\n// }\n// var l = document.createElement(\"link\");\n// l.rel = \"prefetch\";\n// l.href = e.target.href;\n// document.head.appendChild(l);\n// }\n// document.documentElement.addEventListener(\"mouseover\", prefetch, {\n// capture: true,\n// passive: true,\n// });\n// document.documentElement.addEventListener(\"touchstart\", prefetch, {\n// capture: true,\n// passive: true,\n// });\n\nconst GA_ID = document.documentElement.getAttribute(\"ga-id\");\nwindow.ga =\n window.ga ||\n function () {\n if (!GA_ID) {\n return;\n }\n (ga.q = ga.q || []).push(arguments);\n };\nga.l = +new Date();\nga(\"create\", GA_ID, \"auto\");\nga(\"set\", \"transport\", \"beacon\");\nvar timeout = setTimeout(\n (onload = function () {\n clearTimeout(timeout);\n ga(\"send\", \"pageview\");\n }),\n 1000\n);\n\nvar ref = +new Date();\nfunction ping(event) {\n var now = +new Date();\n if (now - ref < 1000) {\n return;\n }\n ga(\"send\", {\n hitType: \"event\",\n eventCategory: \"page\",\n eventAction: event.type,\n eventLabel: Math.round((now - ref) / 1000),\n });\n ref = now;\n}\naddEventListener(\"pagehide\", ping);\naddEventListener(\"visibilitychange\", ping);\n\n/**\n * Injects a script into document.head\n * @param {string} src path of script to be injected in \n * @return {Promise} Promise object that resolves on script load event\n */\nconst dynamicScriptInject = (src) => {\n return new Promise((resolve) => {\n const script = document.createElement(\"script\");\n script.src = src;\n script.type = \"text/javascript\";\n document.head.appendChild(script);\n script.addEventListener(\"load\", () => {\n resolve(script);\n });\n });\n};\n\n/**\n * Injects a script into document.head\n * @param {string} src path of script to be injected in \n * @return {Promise} Promise object that resolves on script load event\n */\n const dynamicCssInject = (src) => {\n return new Promise((resolve) => {\n const link = document.createElement(\"link\")\n link.rel = \"stylesheet\"\n link.type = \"text/css\"\n link.href = src\n document.head.appendChild(link)\n link.addEventListener(\"load\", () => {\n resolve(link)\n })\n })\n}\n\n// Script web-vitals.js will be injected dynamically if user opts-in to sending CWV data.\nconst sendWebVitals = document.currentScript.getAttribute(\"data-cwv-src\");\n\nif (/web-vitals.js/.test(sendWebVitals)) {\n dynamicScriptInject(`${window.location.origin}/js/web-vitals.js`)\n .then(() => {\n webVitals.getCLS(sendToGoogleAnalytics);\n webVitals.getFID(sendToGoogleAnalytics);\n webVitals.getLCP(sendToGoogleAnalytics);\n })\n .catch((error) => {\n console.error(error);\n });\n}\n\naddEventListener(\n \"click\",\n function (e) {\n var button = e.target.closest(\"button\");\n if (!button) {\n return;\n }\n ga(\"send\", {\n hitType: \"event\",\n eventCategory: \"button\",\n eventAction: button.getAttribute(\"aria-label\") || button.textContent,\n });\n },\n true\n);\nvar selectionTimeout;\naddEventListener(\n \"selectionchange\",\n function () {\n clearTimeout(selectionTimeout);\n var text = String(document.getSelection()).trim();\n if (text.split(/[\\s\\n\\r]+/).length < 3) {\n return;\n }\n selectionTimeout = setTimeout(function () {\n ga(\"send\", {\n hitType: \"event\",\n eventCategory: \"selection\",\n eventAction: text,\n });\n }, 2000);\n },\n true\n);\n\nif (window.ResizeObserver && document.querySelector(\"header nav #nav\")) {\n var progress = document.getElementById(\"reading-progress\");\n\n var timeOfLastScroll = 0;\n var requestedAniFrame = false;\n function scroll() {\n if (!requestedAniFrame) {\n requestAnimationFrame(updateProgress);\n requestedAniFrame = true;\n }\n timeOfLastScroll = Date.now();\n }\n addEventListener(\"scroll\", scroll);\n\n var winHeight = 1000;\n var bottom = 10000;\n function updateProgress() {\n requestedAniFrame = false;\n var percent = Math.min(\n (document.scrollingElement.scrollTop / (bottom - winHeight)) * 100,\n 100\n );\n progress.style.transform = `translate(-${100 - percent}vw, 0)`;\n if (Date.now() - timeOfLastScroll < 3000) {\n requestAnimationFrame(updateProgress);\n requestedAniFrame = true;\n }\n }\n\n new ResizeObserver(() => {\n bottom =\n document.scrollingElement.scrollTop +\n document.querySelector(\"#comments,footer\").getBoundingClientRect().top;\n winHeight = window.innerHeight;\n scroll();\n }).observe(document.body);\n}\n\nfunction expose(name, fn) {\n exposed[name] = fn;\n}\n\naddEventListener(\"click\", (e) => {\n const handler = e.target.closest(\"[on-click]\");\n if (!handler) {\n return;\n }\n e.preventDefault();\n const name = handler.getAttribute(\"on-click\");\n const fn = exposed[name];\n if (!fn) {\n throw new Error(\"Unknown handler\" + name);\n }\n fn(handler);\n});\n\n// There is a race condition here if an image loads faster than this JS file. But\n// - that is unlikely\n// - it only means potentially more costly layouts for that image.\n// - And so it isn't worth the querySelectorAll it would cost to synchronously check\n// load state.\ndocument.body.addEventListener(\n \"load\",\n (e) => {\n if (e.target.tagName != \"IMG\") {\n return;\n }\n // Ensure the browser doesn't try to draw the placeholder when the real image is present.\n e.target.style.backgroundImage = \"none\";\n },\n /* capture */ \"true\"\n);\n\n\nimport './plugins/youtube-embed.js';\n/**\n * YOUTUBE\n * \n * HTML ALTERNATE\n * https://css-tricks.com/lazy-load-embedded-youtube-videos/\n */\n// window.addEventListener(\n// \"load\",\n// (e)=> {\n// let YouTubeContainers = document.querySelectorAll(\".embed-youtube\");\n\n// // Iterate over every YouTube container you may have\n// for (let i = 0; i < YouTubeContainers.length; i++) {\n// let container = YouTubeContainers[i];\n// let imageSource = \"https://img.youtube.com/vi/\"+ container.dataset.videoId +\"/sddefault.jpg\"; \n\n// // Load the Thumbnail Image asynchronously\n// let image = new Image();\n// image.src = imageSource;\n// image.addEventListener(\"load\", function() {\n// container.appendChild(image);\n// });\n\n// // When the user clicks on the container, load the embedded YouTube video\n// container.addEventListener(\"click\", function() {\n// let iframe = document.createElement( \"iframe\" );\n\n// iframe.setAttribute(\"frameborder\", \"0\");\n// iframe.setAttribute(\"allowfullscreen\", \"\");\n// iframe.setAttribute(\"allow\", \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\");\n// // Important: add the autoplay GET parameter, otherwise the user would need to click over the YouTube video again to play it \n// iframe.setAttribute(\"src\", \"https://www.youtube.com/embed/\"+ this.dataset.videoId +\"?rel=0&showinfo=0&autoplay=1\");\n\n// // Clear Thumbnail and load the YouTube iframe\n// this.innerHTML = \"\";\n// this.appendChild( iframe );\n// });\n// }\n// })\n\n\n\n\n\n\n\nimport \"./plugins/slider.js\"\n/**\n * SLIDER\n */\n\n// window.addEventListener(\n// \"load\",\n// (e)=> {\n// if(! document.querySelector('.gallery')) return\n \n// dynamicScriptInject(`${window.location.origin}/js/splide.min.js`)\n// .then(() => {\n// const main = new Splide( '#main-slider', {\n// type : 'slide',\n// rewind : true,\n// pagination: false,\n// arrows : true,\n// cover : true,\n// // width : '90%',\n// // padding: 0,\n// heightRatio: .7,\n// autoplay : true,\n// interval : 5000,\n// pauseOnHover: true,\n// })\n \n// const thumbnails = new Splide( '#thumbnail-slider', {\n// fixedWidth : 100,\n// fixedHeight : 60,\n// // width : '80%',\n// // padding: 0,\n// gap : 10,\n// rewind : true,\n// pagination : false,\n// cover : true,\n// isNavigation: true,\n// breakpoints : {\n// 600: {\n// fixedWidth : 60,\n// fixedHeight: 44,\n// },\n// },\n// })\n \n// main.sync( thumbnails )\n// main.mount()\n// thumbnails.mount()\n// })\n// .catch((error) => {\n// console.error(error)\n// })\n\n// dynamicCssInject(`${window.location.origin}/css/splide/themes/splide-default.min.css`)\n// .then(()=>{\n// console.log('css for loaded')\n// })\n// .catch((error) => {\n// console.error(error)\n// })\n// },\n// /* capture */ \"true\"\n// )\n\n\n\nimport \"./plugins/search.js\"\n/**\n * SEARCH BAR\n */\n\n// let searchApi = null;\n// window.addEventListener(\"load\", async (e) => {\n// if(! document.querySelector('.search')) return\n \n// await dynamicScriptInject(`${window.location.origin}/js/js-search.min.js`)\n// const jsonData = await fetch(`${window.location.origin}/feed/feed.json`)\n// .then(response => response.json())//.then(JSON.parse)\n\n// searchApi = new JsSearch.Search('id')\n// searchApi.addIndex('title')\n// searchApi.addIndex('content_html')\n// // search.addIndex(['author', 'name'])\n\n// searchApi.addDocuments(jsonData.items)\n\n// const res = searchApi.search('ev')\n \n// res.map( i => alert(i.title))\n\n// const searchBar = document.getElementById(\"searchBar\")\n\n// searchBar.addEventListener('change', function(e) {\n// const res = searchApi.search(searchBar.value)\n// res.map( i => alert(i.title))\n// })\n\n// // const res = searchApi.search('ev')\n// // .then(async () => {\n// // const jsonData = await fetch(`${window.location.origin}/feed/feed.json`).then(response => response.json())//.then(JSON.parse)\n\n// // // const parsedJson = JSON.parse(jsonData)\n \n// // searchApi = new JsSearch.Search('id')\n// // searchApi.addIndex('title')\n// // searchApi.addIndex('content_html')\n// // // search.addIndex(['author', 'name'])\n\n// // searchApi.addDocuments(jsonData.items)\n\n// // const res = searchApi.search('ev')\n\n// // // search.search('The'); // [theGreatGatsby, theDaVinciCode]\n// // // search.search('scott'); // [theGreatGatsby]\n// // // search.search('dan'); // [angelsAndDemons, theDaVinciCode]\n// // // search.search('mystery') // [angelsAndDemons, theDaVinciCode]\n\n// // res.map( i => alert(i.title))\n\n// // })\n// // .catch((error) => {\n// // console.error(error)\n// // })\n\n\n// },\n// /* capture */ \"true\"\n// )\n\n\nimport \"./plugins/animations.js\"\n/**\n * ANIMATIONS\n */\n// window.addEventListener('load', (event) => {\n\n// const options = {\n// root: null,\n// threshold: 0,\n// rootMargin: '0px 0px -50px 0px'\n// }\n \n// const observer = new IntersectionObserver(entries => {\n// entries.forEach(entry => {\n// if (entry.isIntersecting) {\n// entry.target.classList.add('in-view')\n// observer.unobserve(entry.target)\n// }\n// })\n// }, options)\n\n// // const sections = Array.from(document.getElementsByClassName('section'))\n// // sections.map(section => {\n// // const children = Array.from(section.getElementsByClassName('fade-delay'))\n// // children.map((child, index ) => {\n// // child.setAttribute('style', 'transition-delay: ' + index * 0.5 + 's')\n// // })\n// // observer.observe(section) \n// // })\n \n// const sections = Array.from(document.getElementsByClassName('section'))\n// for (let section of sections) {\n// const children = section.getElementsByClassName('fade-delay')\n// for (let count = 0; count < children.length; count++) {\n// children[count].setAttribute('style', 'transition-delay: ' + count * 0.5 + 's')\n// }\n// observer.observe(section) \n// }\n// })\n\n\n\n\nimport \"./plugins/google-maps.js\"\n/**\n * GOOGLE MAPS\n */\n\n// window.addEventListener(\n// \"load\",\n// (e)=> {\n\n// const map = document.getElementById('map')\n\n// if (! map) return\n\n// const options = {\n// root: null,\n// threshold: 0,\n// rootMargin: '100px'\n// }\n\n// const observer = new IntersectionObserver( (entries, self) => {\n// const isIntersecting = typeof entries[0].isIntersecting === 'boolean' ? entries[0].isIntersecting : entries[0].intersectionRatio > 0\n\n// if (! isIntersecting ) return\n\n// dynamicScriptInject(`https://maps.googleapis.com/maps/api/js?key=${map.dataset.key}`)\n// .then(() => {\n// const center = {\n// lat: parseFloat(map.dataset.latitude),\n// lng: parseFloat(map.dataset.longitude)\n// }\n\n// const googleMap = new google.maps.Map(map, {\n// zoom: parseInt(map.dataset.zoom) || 15,\n// center: center\n// })\n \n// const marker = new google.maps.Marker({\n// position: center,\n// map: googleMap\n// })\n// })\n// .catch((error) => {\n// console.error(error);\n// })\n\n// self.unobserve(map)\n// },\n// options\n// )\n// observer.observe(map)\n// })"],"names":["prefetch","e","target","tagName","origin","location","removeUrlFragment","url","split","window","href","l","document","createElement","rel","head","appendChild","documentElement","addEventListener","capture","passive","YouTubeContainers","querySelectorAll","i","length","container","imageSource","dataset","videoId","image","Image","src","iframe","setAttribute","this","innerHTML","querySelector","dynamicScriptInject","then","main","Splide","type","rewind","pagination","arrows","cover","heightRatio","autoplay","interval","pauseOnHover","thumbnails","fixedWidth","fixedHeight","gap","isNavigation","breakpoints","600","sync","mount","catch","error","console","dynamicCssInject","log","searchApi","async","jsonData","fetch","response","json","JsSearch","Search","addIndex","addDocuments","items","search","map","alert","title","searchBar","getElementById","value","event","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","classList","add","unobserve","root","threshold","rootMargin","sections","Array","from","getElementsByClassName","section","children","count","observe","self","intersectionRatio","key","center","lat","parseFloat","latitude","lng","longitude","googleMap","google","maps","Map","zoom","parseInt","Marker","position","exposed","a","history","replaceState","tweet_","open","encodeURIComponent","expose","anchor","getAttribute","msg","dialog","preventDefault","navigator","share","clipboard","writeText","textContent","setTimeout","removeAttribute","body","toggle","GA_ID","ga","q","push","arguments","Date","timeout","onload","clearTimeout","ref","ping","now","hitType","eventCategory","eventAction","eventLabel","Math","round","sendWebVitals","currentScript","selectionTimeout","test","Promise","resolve","script","webVitals","getCLS","sendToGoogleAnalytics","getFID","getLCP","button","closest","text","String","getSelection","trim","ResizeObserver","progress","timeOfLastScroll","requestedAniFrame","scroll","requestAnimationFrame","updateProgress","winHeight","bottom","percent","min","scrollingElement","scrollTop","style","transform","getBoundingClientRect","top","innerHeight","name","fn","handler","Error","backgroundImage"],"mappings":"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"}