1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 3 4<meta charset="utf-8"> 5<!-- This site is hosted on Netlify. Anyone can build and deploy a site 6 like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=af4360b4-4a70-4cbe-87f6-43fa708bbace 7 Netlify hosting facts for this site: static/SSR served via Netlify Edge. --> 8<meta name="generator" content="quarto-1.9.38"> 9 10<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 11 12 13<title>About the FEWsLab â FEWsLab</title> 14<style> 15/* Default styles provided by pandoc. 16** See https://pandoc.org/MANUAL.html#variables-for-html for config info. 17*/ 18code{white-space: pre-wrap;} 19span.smallcaps{font-variant: small-caps;} 20div.columns{display: flex; gap: min(4vw, 1.5em);} 21div.column{flex: auto; overflow-x: auto;} 22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 23ul.task-list{list-style: none;} 24ul.task-list li input[type="checkbox"] { 25 width: 0.8em; 26 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 27 vertical-align: middle; 28} 29</style> 30 31
32<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-search/quarto-search.js"></script>
37 38<meta name="quarto:offset" content="./"> 39<link href="./images/favicon/favicon.ico" rel="icon">
40<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="site_libs/quarto-html/anchor.min.js"></script>
44 45<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 46<link href="site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css" rel="stylesheet" id="quarto-text-highlighting-styles">
47<script src="site_libs/bootstrap/bootstrap.min.js"></script>
47 48<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 49<link href="site_libs/bootstrap/bootstrap-22f1789df73c9a524649167e87525b34.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
50<script id="quarto-search-options" type="application/json">{ 51 "location": "navbar", 52 "copy-button": false, 53 "collapse-after": 3, 54 "panel-placement": "end", 55 "type": "overlay", 56 "limit": 50, 57 "keyboard-shortcut": [ 58 "f", 59 "/", 60 "s" 61 ], 62 "language": { 63 "search-no-results-text": "No results", 64 "search-matching-documents-text": "matching documents", 65 "search-copy-link-title": "Copy link to search", 66 "search-hide-matches-text": "Hide additional matches", 67 "search-more-match-text": "more match in this document", 68 "search-more-matches-text": "more matches in this document", 69 "search-clear-button-title": "Clear", 70 "search-text-placeholder": "", 71 "search-detached-cancel-button-title": "Cancel", 72 "search-submit-button-title": "Submit", 73 "search-label": "Search" 74 } 75}</script>
75 76<style>html{ scroll-behavior: smooth; }</style> 77<!-- academic icons --> 78 79<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css"> 80 81<!-- altmetric icons -->
82<script type="text/javascript" src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
82 83 84<!-- fontawesome icons -->
85<script src="https://kit.fontawesome.com/1392a7030f.js" crossorigin="anonymous"></script>
85 86 87 88 89 90</head> 91 92<body class="floating nav-fixed quarto-light"> 93 94<div id="quarto-search-results"></div> 95 <header id="quarto-header" class="headroom fixed-top"> 96 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 97 <div class="navbar-container container-fluid"> 98 <div class="navbar-brand-container mx-auto"> 99 <a class='navbar-brand' href='/'> 100 <span class="navbar-title">FEWsLab</span> 101 </a> 102 </div> 103 <div id="quarto-search" class="" title="Search"></div> 104 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 105 <span class="navbar-toggler-icon"></span> 106</button> 107 <div class="collapse navbar-collapse" id="navbarCollapse"> 108 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 109 <li class="nav-item"> 110 <a aria-current='page' class='nav-link active' href='/about'> 111<span class="menu-text">About</span></a> 112 </li> 113 <li class="nav-item"> 114 <a class='nav-link' href='/lab'> 115<span class="menu-text">Team</span></a> 116 </li> 117 <li class="nav-item"> 118 <a class='nav-link' href='/research'> 119<span class="menu-text">News & Publications</span></a> 120 </li> 121 <li class="nav-item"> 122 <a class='nav-link' href='/teaching'> 123<span class="menu-text">Teaching</span></a> 124 </li> 125 <li class="nav-item"> 126 <a class='nav-link' href='/projects'> 127<span class="menu-text">Projects</span></a> 128 </li> 129</ul> 130 </div> <!-- /navcollapse --> 131 <div class="quarto-navbar-tools"> 132</div> 133 </div> <!-- /container-fluid --> 134 </nav> 135</header> 136<!-- content --> 137<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar"> 138<!-- sidebar --> 139 <nav id="quarto-sidebar" class="sidebar collapse collapse-horizontal quarto-sidebar-collapse-item sidebar-navigation floating overflow-auto"> 140 <nav id="TOC" role="doc-toc" class="toc-active"> 141 <h2 id="toc-title">On this page</h2> 142 143 <ul> 144 <li><a href="#sustainability-systems-and-environmental-ethics" id="toc-sustainability-systems-and-environmental-ethics" class="nav-link active" data-scroll-target="#sustainability-systems-and-environmental-ethics">Sustainability, Systems, and Environmental Ethics</a></li> 145 <li><a href="#who-we-are" id="toc-who-we-are" class="nav-link" data-scroll-target="#who-we-are">Who We Are</a></li> 146 <li><a href="#research" id="toc-research" class="nav-link" data-scroll-target="#research">Research</a></li> 147 <li><a href="#news-and-highlights" id="toc-news-and-highlights" class="nav-link" data-scroll-target="#news-and-highlights">News and Highlights</a></li> 148 </ul> 149</nav> 150</nav> 151<div id="quarto-sidebar-glass" class="quarto-sidebar-collapse-item" data-bs-toggle="collapse" data-bs-target=".quarto-sidebar-collapse-item"></div> 152<!-- margin-sidebar --> 153 <div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom"> 154 </div> 155<!-- main --> 156<main class="content column-page-right" id="quarto-document-content"> 157 158<header id="title-block-header" class="quarto-title-block default"> 159<div class="quarto-title"> 160<h1 class="title">About the FEWsLab</h1> 161</div> 162 163 164 165<div class="quarto-title-meta column-page-right"> 166 167 168 169 170 </div> 171 172 173 174</header> 175 176 177<section id="sustainability-systems-and-environmental-ethics" class="level1"> 178<h1>Sustainability, Systems, and Environmental Ethics</h1> 179<p>The FEWsLab investigates interconnections across <strong>food</strong>, <strong>energy</strong>, and <strong>water</strong> systems. Our research integrates <strong>network modeling</strong>, <strong>socio-technical data</strong>, and <strong>ethical analysis</strong> to advance both policy and research questions in the areas of risk, resilience, and sustainability. We strive to bridge the gap between advancements in theory and useful insights for decision makers that address pressing global challenges.</p> 180<hr> 181</section> 182<section id="who-we-are" class="level1"> 183<h1>Who We Are</h1> 184<p>The FEWsLab is led by <strong>Dr. Caitlin Grady</strong>, Associate Professor of Engineering Management and Systems Engineering at George Washington University and Director of Research at the <a href="https://globalfoodinstitute.gwu.edu/">
184Global Food Institute</a>. Dr. Grady brings a combination of academic, policy, and government experience. She has previously served as a faculty member at Penn State, a Policy Analyst at the U.S. Department of State and the Department of Energy, and as a Legislative Assistant in the U.S. Congress. Our lab thrives thanks to a talented and unique team of researchers, students, and collaborators who share a commitment to thinking outside the box.</p> 185<hr> 186</section> 187<section id="research" class="level1"> 188<h1>Research</h1> 189<p>Our research is supported by the <strong>National Science Foundation</strong>, the <strong>U.S. Department of Agriculture</strong>, the <strong>McGovern Foundation</strong> and other institutional partners. We pursue interdisciplinary projects that address complex challenges through systems thinking, data-driven modeling, and policy-relevant analysis.</p> 190<hr> 191</section> 192<section id="news-and-highlights" class="level1"> 193<h1>News and Highlights</h1> 194<ul> 195<li>Sachi Nandurkar published her <a href="https://zenodo.org/records/19500205">pre-print</a> and <a href="http://formula-one-netzero.fewslab.org/">dashboard</a> analyzing Formula One Net Zero Goals.</li> 196<li>Dr. Grady was recently named the next Director of Research for the <a href="https://globalfoodinstitute.gwu.edu/">Global Food Institute</a></li> 197<li>Abbey Kollar and Ji Qi presented recent research at the 10th International Engineering Systems Symposium hosted by <a href="https://cesun.org/">CESUN</a></li> 198<li>Dr. Grady was quoted in a recent episode of NPRâs All Things Considered <a href="https://www.npr.org/2025/07/04/nx-s1-5454884/why-hydropower-faces-more-barriers-than-wind-or-solar">July 4, 2025</a></li> 199<li>Dhanyasri Bolla was invited to present our work on Adaptation in Megacities to the IDB Annual Meeting of the Chief Audit Executives of the Multilateral Financial Institutions</li> 200</ul> 201 202 203</section> 204 205</main> <!-- /main -->
206<script id="quarto-html-after-body" type="application/javascript"> 207 window.document.addEventListener("DOMContentLoaded", function (event) { 208 const icon = "î§"; 209 const anchorJS = new window.AnchorJS(); 210 anchorJS.options = { 211 placement: 'right', 212 icon: icon 213 }; 214 anchorJS.add('.anchored'); 215 const isCodeAnnotation = (el) => { 216 for (const clz of el.classList) { 217 if (clz.startsWith('code-annotation-')) { 218 return true; 219 } 220 } 221 return false; 222 } 223 const onCopySuccess = function(e) { 224 // button target 225 const button = e.trigger; 226 // don't keep focus 227 button.blur(); 228 // flash "checked" 229 button.classList.add('code-copy-button-checked'); 230 var currentTitle = button.getAttribute("title"); 231 button.setAttribute("title", "Copied!"); 232 let tooltip; 233 if (window.bootstrap) { 234 button.setAttribute("data-bs-toggle", "tooltip"); 235 button.setAttribute("data-bs-placement", "left"); 236 button.setAttribute("data-bs-title", "Copied!"); 237 tooltip = new bootstrap.Tooltip(button, 238 { trigger: "manual", 239 customClass: "code-copy-button-tooltip", 240 offset: [0, -8]}); 241 tooltip.show(); 242 } 243 setTimeout(function() { 244 if (tooltip) { 245 tooltip.hide(); 246 button.removeAttribute("data-bs-title"); 247 button.removeAttribute("data-bs-toggle"); 248 button.removeAttribute("data-bs-placement"); 249 } 250 button.setAttribute("title", currentTitle); 251 button.classList.remove('code-copy-button-checked'); 252 }, 1000); 253 // clear code selection 254 e.clearSelection(); 255 } 256 const getTextToCopy = function(trigger) { 257 const outerScaffold = trigger.parentElement.cloneNode(true); 258 const codeEl = outerScaffold.querySelector('code'); 259 for (const childEl of codeEl.children) { 260 if (isCodeAnnotation(childEl)) { 261 childEl.remove(); 262 } 263 } 264 return codeEl.innerText; 265 } 266 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 267 text: getTextToCopy 268 }); 269 clipboard.on('success', onCopySuccess); 270 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 271 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 272 text: getTextToCopy, 273 container: window.document.getElementById('quarto-embedded-source-code-modal') 274 }); 275 clipboardModal.on('success', onCopySuccess); 276 } 277 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 278 var mailtoRegex = new RegExp(/^mailto:/); 279 var filterRegex = new RegExp("https:\/\/fewslab\.netlify\.app"); 280 var isInternal = (href) => { 281 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 282 } 283 // Inspect non-navigation links and adorn them if external 284 var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)'); 285 for (var i=0; i<links.length; i++) { 286 const link = links[i]; 287 if (!isInternal(link.href)) { 288 // undo the damage that might have been done by quarto-nav.js in the case of 289 // links that we want to consider external 290 if (link.dataset.originalHref !== undefined) { 291 link.href = link.dataset.originalHref; 292 } 293 // target, if specified 294 link.setAttribute("target", "_blank"); 295 if (link.getAttribute("rel") === null) { 296 link.setAttribute("rel", "noopener"); 297 } 298 } 299 } 300 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 301 const config = { 302 allowHTML: true, 303 maxWidth: 500, 304 delay: 100, 305 arrow: false, 306 appendTo: function(el) { 307 return el.parentElement; 308 }, 309 interactive: true, 310 interactiveBorder: 10, 311 theme: 'quarto', 312 placement: 'bottom-start', 313 }; 314 if (contentFn) { 315 config.content = contentFn; 316 } 317 if (onTriggerFn) { 318 config.onTrigger = onTriggerFn; 319 } 320 if (onUntriggerFn) { 321 config.onUntrigger = onUntriggerFn; 322 } 323 window.tippy(el, config); 324 } 325 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 326 for (var i=0; i<noterefs.length; i++) { 327 const ref = noterefs[i]; 328 tippyHover(ref, function() { 329 // use id or data attribute instead here 330 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 331 try { href = new URL(href).hash; } catch {} 332 const id = href.replace(/^#\/?/, ""); 333 const note = window.document.getElementById(id); 334 if (note) { 335 return note.innerHTML; 336 } else { 337 return ""; 338 } 339 }); 340 } 341 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 342 const processXRef = (id, note) => { 343 // Strip column container classes 344 const stripColumnClz = (el) => { 345 el.classList.remove("page-full", "page-columns"); 346 if (el.children) { 347 for (const child of el.children) {
348 stripColumnClz(child); 349 } 350 } 351 } 352 stripColumnClz(note) 353 if (id === null || id.startsWith('sec-')) { 354 // Special case sections, only their first couple elements 355 const container = document.createElement("div"); 356 if (note.children && note.children.length > 2) { 357 container.appendChild(note.children[0].cloneNode(true)); 358 for (let i = 1; i < note.children.length; i++) { 359 const child = note.children[i]; 360 if (child.tagName === "P" && child.innerText === "") { 361 continue; 362 } else { 363 container.appendChild(child.cloneNode(true)); 364 break; 365 } 366 } 367 if (window.Quarto?.typesetMath) { 368 window.Quarto.typesetMath(container); 369 } 370 return container.innerHTML 371 } else { 372 if (window.Quarto?.typesetMath) { 373 window.Quarto.typesetMath(note); 374 } 375 return note.innerHTML; 376 } 377 } else { 378 // Remove any anchor links if they are present 379 const anchorLink = note.querySelector('a.anchorjs-link'); 380 if (anchorLink) { 381 anchorLink.remove(); 382 } 383 if (window.Quarto?.typesetMath) { 384 window.Quarto.typesetMath(note); 385 } 386 if (note.classList.contains("callout")) { 387 return note.outerHTML; 388 } else { 389 return note.innerHTML; 390 } 391 } 392 } 393 for (var i=0; i<xrefs.length; i++) { 394 const xref = xrefs[i]; 395 tippyHover(xref, undefined, function(instance) { 396 instance.disable(); 397 let url = xref.getAttribute('href'); 398 let hash = undefined; 399 if (url.startsWith('#')) { 400 hash = url; 401 } else { 402 try { hash = new URL(url).hash; } catch {} 403 } 404 if (hash) { 405 const id = hash.replace(/^#\/?/, ""); 406 const note = window.document.getElementById(id); 407 if (note !== null) { 408 try { 409 const html = processXRef(id, note.cloneNode(true)); 410 instance.setContent(html); 411 } finally { 412 instance.enable(); 413 instance.show(); 414 } 415 } else { 416 // See if we can fetch this 417 fetch(url.split('#')[0]) 418 .then(res => res.text()) 419 .then(html => { 420 const parser = new DOMParser(); 421 const htmlDoc = parser.parseFromString(html, "text/html"); 422 const note = htmlDoc.getElementById(id); 423 if (note !== null) { 424 const html = processXRef(id, note); 425 instance.setContent(html); 426 } 427 }).finally(() => { 428 instance.enable(); 429 instance.show(); 430 }); 431 } 432 } else { 433 // See if we can fetch a full url (with no hash to target) 434 // This is a special case and we should probably do some content thinning / targeting 435 fetch(url) 436 .then(res => res.text()) 437 .then(html => { 438 const parser = new DOMParser(); 439 const htmlDoc = parser.parseFromString(html, "text/html"); 440 const note = htmlDoc.querySelector('main.content'); 441 if (note !== null) { 442 // This should only happen for chapter cross references 443 // (since there is no id in the URL) 444 // remove the first header 445 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 446 note.children[0].remove(); 447 } 448 const html = processXRef(null, note); 449 instance.setContent(html); 450 } 451 }).finally(() => { 452 instance.enable(); 453 instance.show(); 454 }); 455 } 456 }, function(instance) { 457 }); 458 } 459 let selectedAnnoteEl; 460 const selectorForAnnotation = ( cell, annotation) => { 461 let cellAttr = 'data-code-cell="' + cell + '"'; 462 let lineAttr = 'data-code-annotation="' + annotation + '"'; 463 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 464 return selector; 465 } 466 const selectCodeLines = (annoteEl) => { 467 const doc = window.document; 468 const targetCell = annoteEl.getAttribute("data-target-cell"); 469 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 470 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 471 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 472 const lineIds = lines.map((line) => { 473 return targetCell + "-" + line; 474 }) 475 let top = null; 476 let height = null; 477 let parent = null; 478 if (lineIds.length > 0) { 479 //compute the position of the single el (top and bottom and make a div) 480 const el = window.document.getElementById(lineIds[0]); 481 top = el.offsetTop; 482 height = el.offsetHeight; 483 parent = el.parentElement.parentElement; 484 if (lineIds.length > 1) { 485 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 486 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 487 height = bottom - top; 488 } 489 if (top !== null && height !== null && parent !== null) { 490 // cook up a div (if necessary) and position it 491 let div = window.document.getElementById("code-annotation-line-highlight"); 492 if (div === null) { 493 div = window.document.createElement("div"); 494 div.setAttribute("id", "code-annotation-line-highlight"); 495 div.style.position = 'absolute'; 496 parent.appendChild(div); 497 } 498 div.style.top = top - 2 + "px"; 499 div.style.height = height + 4 + "px"; 500 div.style.left = 0; 501 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 502 if (gutterDiv === null) { 503 gutterDiv = window.document.createElement("div"); 504 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 505 gutterDiv.style.position = 'absolute'; 506 const codeCell = window.document.getElementById(targetCell); 507 const gutter = codeCell.querySelector('.code-annotation-gutter'); 508 gutter.appendChild(gutterDiv); 509 } 510 gutterDiv.style.top = top - 2 + "px"; 511 gutterDiv.style.height = height + 4 + "px"; 512 } 513 selectedAnnoteEl = annoteEl; 514 } 515 }; 516 const unselectCodeLines = () => { 517 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 518 elementsIds.forEach((elId) => { 519 const div = window.document.getElementById(elId); 520 if (div) { 521 div.remove(); 522 } 523 }); 524 selectedAnnoteEl = undefined; 525 }; 526 // Handle positioning of the toggle 527 window.addEventListener( 528 "resize", 529 throttle(() => { 530 elRect = undefined; 531 if (selectedAnnoteEl) { 532 selectCodeLines(selectedAnnoteEl); 533 } 534 }, 10) 535 ); 536 function throttle(fn, ms) { 537 let throttle = false;
538 let timer; 539 return (...args) => { 540 if(!throttle) { // first call gets through 541 fn.apply(this, args); 542 throttle = true; 543 } else { // all the others get throttled 544 if(timer) clearTimeout(timer); // cancel #2 545 timer = setTimeout(() => { 546 fn.apply(this, args); 547 timer = throttle = false; 548 }, ms); 549 } 550 }; 551 } 552 // Attach click handler to the DT 553 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 554 for (const annoteDlNode of annoteDls) { 555 annoteDlNode.addEventListener('click', (event) => { 556 const clickedEl = event.target; 557 if (clickedEl !== selectedAnnoteEl) { 558 unselectCodeLines(); 559 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 560 if (activeEl) { 561 activeEl.classList.remove('code-annotation-active'); 562 } 563 selectCodeLines(clickedEl); 564 clickedEl.classList.add('code-annotation-active'); 565 } else { 566 // Unselect the line 567 unselectCodeLines(); 568 clickedEl.classList.remove('code-annotation-active'); 569 } 570 }); 571 } 572 const findCites = (el) => { 573 const parentEl = el.parentElement; 574 if (parentEl) { 575 const cites = parentEl.dataset.cites; 576 if (cites) { 577 return { 578 el, 579 cites: cites.split(' ') 580 }; 581 } else { 582 return findCites(el.parentElement) 583 } 584 } else { 585 return undefined; 586 } 587 }; 588 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 589 for (var i=0; i<bibliorefs.length; i++) { 590 const ref = bibliorefs[i]; 591 const citeInfo = findCites(ref); 592 if (citeInfo) { 593 tippyHover(citeInfo.el, function() { 594 var popup = window.document.createElement('div'); 595 citeInfo.cites.forEach(function(cite) { 596 var citeDiv = window.document.createElement('div'); 597 citeDiv.classList.add('hanging-indent'); 598 citeDiv.classList.add('csl-entry'); 599 var biblioDiv = window.document.getElementById('ref-' + cite); 600 if (biblioDiv) { 601 citeDiv.innerHTML = biblioDiv.innerHTML; 602 } 603 popup.appendChild(citeDiv); 604 }); 605 return popup.innerHTML; 606 }); 607 } 608 } 609 }); 610 </script>
610 611</div> <!-- /content --> 612<footer class="footer"> 613 <div class="nav-footer"> 614 <div class="nav-footer-left"> 615 616 </div> 617 <div class="nav-footer-center"> 618 <ul class="footer-items list-unstyled"> 619 <li class="nav-item"> 620 Contact: <a href="mailto:[email protected]">[email protected]</a><br> 621<a href="https://www.linkedin.com/company/fews-lab" target="_blank"><i class="bi bi-linkedin"></i> FEWsLab</a> 622<a href="https://www.linkedin.com/in/caitlinagrady/" target="_blank"><i class="bi bi-linkedin"></i> Caitlin Grady</a> 623<a href="https://bsky.app/profile/caitlinagrady.bsky.social" target="_blank"><i class="fa fa-brands fa-bluesky"></i> Bluesky</a><br> 624Site made with <a href="https://quarto.org/" target="_blank"><img src="https://quarto.org/favicon.png" width="12"> Quarto</a><br> 625© 2025 FEWsLab 626 </li> 627</ul> 628 </div> 629 <div class="nav-footer-right"> 630 631 </div> 632 </div> 633</footer> 634 635 636 637
638<script src="site_libs/quarto-html/zenscroll-min.js"></script>
638 639</body></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.