PageSourceSearch

https://marcopelliccia.com/research.html

html marcopelliccia.com collected 2026-10-08 09:31:21 UTC 25,491 bytes, 685 lines download raw bytes

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<meta name="generator" content="quarto-1.10.18">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Research – Marco Pelliccia</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15span.smallcaps{font-variant: small-caps;}
16div.columns{display: flex; gap: 1.5em;}
17div.column{flex: auto;}
18@media screen {
19div.columns{gap: min(4vw, 1.5em);}
20div.column{overflow-x: auto;}
21}
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<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 39
39
40<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/anchor.min.js"></script>
43
44<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
45<link href="site_libs/quarto-html/quarto-syntax-highlighting-dark-b85bc7c33db8c58e0ec93c3465666fed.css" rel="stylesheet" id="quarto-text-highlighting-styles">
46<script src="site_libs/bootstrap/bootstrap.min.js"></script>
46
47<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
48<link href="site_libs/bootstrap/bootstrap-9c0859bcc9b8a1b9af14519a9fc68dfa.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="dark">
49<script id="quarto-search-options" type="application/json">{
50  "location": "navbar",
51  "copy-button": false,
52  "collapse-after": 3,
53  "panel-placement": "end",
54  "type": "overlay",
55  "limit": 50,
56  "keyboard-shortcut": [
57    "f",
58    "/",
59    "s"
60  ],
61  "show-item-context": false,
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
77
78<link rel="stylesheet" href="styles.css">
79</head>
80
81<body class="nav-fixed quarto-light">
82
83<div id="quarto-search-results"></div>
84  <header id="quarto-header" class="headroom fixed-top">
85    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
86      <div class="navbar-container container-fluid">
87      <div class="navbar-brand-container mx-auto">
88    <a class="navbar-brand" href="./index.html">
89    <span class="navbar-title">Marco Pelliccia</span>
90    </a>
91  </div>
92            <div id="quarto-search" class="" title="Search"></div>
93          <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(); }">
94  <span class="navbar-toggler-icon"></span>
95</button>
96          <div class="collapse navbar-collapse" id="navbarCollapse">
97            <ul class="navbar-nav navbar-nav-scroll me-auto">
98  <li class="nav-item">
99    <a class="nav-link" href="./index.html"> 
100<span class="menu-text">Home</span></a>
101  </li>  
102  <li class="nav-item">
103    <a class="nav-link active" href="./research.html" aria-current="page"> 
104<span class="menu-text">Research</span></a>
105  </li>  
106  <li class="nav-item">
107    <a class="nav-link" href="./teaching.html"> 
108<span class="menu-text">Teaching</span></a>
109  </li>  
110  <li class="nav-item">
111    <a class="nav-link" href="./projects.html"> 
112<span class="menu-text">Projects</span></a>
113  </li>  
114</ul>
115          </div> <!-- /navcollapse -->
116            <div class="quarto-navbar-tools">
117</div>
118      </div> <!-- /container-fluid -->
119    </nav>
120</header>
121<!-- content -->
122<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
123<!-- sidebar -->
124<!-- margin-sidebar -->
125    
126<!-- main -->
127<main class="content column-page" id="quarto-document-content">
128<style>
129#nav-network {
130  position: fixed;
131  top: 0;
132  left: 0;
133  width: 100%;
134  height: 60px;
135  z-index: 1;
136  overflow: hidden;
137}
138</style>
139<div id="nav-network"></div>
140<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.3/p5.min.js"></script>
vendor: 1 bytes, line 140
140
141<script>
142const NODES = 40;
143const LINK_DISTANCE = 110;
144const SPEED = 0.35;
145const NODE_SIZE = 2;
146const LINE_BASE_ALPHA = 120;
147const LINE_MAX_THICK = 1.6;
148const LINE_MIN_THICK = 0.3;
149const FG_COLOR = [255, 255, 255];
150const BG_COLOR = [30, 30, 30];
151const HEIGHT = 60;
152let nodes = [];
153let holder;
154let c;
155function setup() {
156  holder = document.getElementById('nav-network');
157  c = createCanvas(windowWidth, HEIGHT);
158  c.parent(holder);
159  pixelDensity(1);
160  initNodes();
161}
162function windowResized() {
163  resizeCanvas(windowWidth, HEIGHT);
164}
165function initNodes() {
166  nodes = [];
167  for (let i = 0; i < NODES; i++) {
168    nodes.push({
169      x: random(width),
170      y: random(HEIGHT),
171      vx: random(-SPEED, SPEED),
172      vy: random(-SPEED, SPEED)
173    });
174  }
175}
176function draw() {
177  background(BG_COLOR[0], BG_COLOR[1], BG_COLOR[2]);
178  for (let n of nodes) {
179    n.x += n.vx;
180    n.y += n.vy;
181    n.vx += random(-0.02, 0.02);
182    n.vy += random(-0.02, 0.02);
183    n.vx = constrain(n.vx, -SPEED, SPEED);
184    n.vy = constrain(n.vy, -SPEED, SPEED);
185    if (n.x < 0) n.x += width;
186    if (n.x > width) n.x -= width;
187    if (n.y < 0) n.y += HEIGHT;
188    if (n.y > HEIGHT) n.y -= HEIGHT;
189  }
190  for (let i = 0; i < nodes.length; i++) {
191    for (let j = i + 1; j < nodes.length; j++) {
192      const a = nodes[i], b = nodes[j];
193      const d = dist(a.x, a.y, b.x, b.y);
194      if (d < LINK_DISTANCE) {
195        const t = 1 - d / LINK_DISTANCE;
196        const alpha = LINE_BASE_ALPHA * t;
197        const w = LINE_MIN_THICK + t * (LINE_MAX_THICK - LINE_MIN_THICK);
198        strokeWeight(w);
199        stroke(FG_COLOR[0], FG_COLOR[1], FG_COLOR[2], alpha);
200        line(a.x, a.y, b.x, b.y);
201      }
202    }
203  }
204  noStroke();
205  fill(FG_COLOR[0], FG_COLOR[1], FG_COLOR[2]);
206  for (let n of nodes) circle(n.x, n.y, NODE_SIZE);
207}
208</script>
208
209
210<header id="title-block-header" class="quarto-title-block default">
211<div class="quarto-title">
212<h1 class="title">Research</h1>
213</div>
214
215
216
217<div class="quarto-title-meta column-page">
218
219    
220  
221    
222  </div>
223  
224
225
226</header>
227
228
229<section id="working-papers" class="level2">
230<h2 class="anchored" data-anchor-id="working-papers">Working Papers</h2>
231<p><strong>Incentive Design on Networks</strong> (with A. Daripa and S. Kapur) <br> We design a mechanism for network formation with privately known productivities that implements the socially optimal network through transfers based on opportunity costs, ensuring ex post incentive compatibility, pairwise stability, and budget balance. <br><a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4312506">[SSRN]</a></p>
232<hr>
233<p><strong>Network Structures and Credit Rating</strong> (with A. Daripa and S. Kapur) <br> We study whether productivity-consistent credit ratings can be inferred from endogenous network structure, showing that under suitable link costs equilibrium networks separate types and sustain ratings aligned with productivity. <br><a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3446432">[SSRN]</a></p>
234<hr>
235</section>
236<section id="published-papers" class="level2">
237<h2 class="anchored" data-anchor-id="published-papers">Published Papers</h2>
238<p><strong>Too Much Finance: Mechanisms That Harm Growth and Policy Implications</strong> (with A. Daripa and S. Kapur), <em>The Manchester School</em>, 2026, 1–20. <br><a href="https://doi.org/10.1111/manc.70060">[DOI]</a></p>
239<hr>
240<p><strong>Decentralized Defence of a (Directed) Network Structure</strong>, <em>Defence and Peace Economics</em>, 2020. <br> I analyse how agents in a directed network allocate defence resources under external threats, showing that decentralised choices can be efficient with a strategic attacker but generally diverge from the social optimum under random attacks.</p>
241<hr>
242<p><strong>Centrality in Trade Networks and Investment in Security</strong> (with V. Bove and L. Elia), <em>Peace Economics, Peace Science and Public Policy</em>, 2016. <br> We show that a country’s position in global trade networks—measured by network centrality—systematically shapes and constrains its military spending decisions.</p>
243
244
245</section>
246
247</main> <!-- /main -->
248<script id="quarto-html-after-body" type="application/javascript">
249  window.document.addEventListener("DOMContentLoaded", function (event) {
250    const icon = "";
251    const anchorJS = new window.AnchorJS();
252    anchorJS.options = {
253      placement: 'right',
254      icon: icon
255    };
256    anchorJS.add('.anchored');
257    const isCodeAnnotation = (el) => {
258      for (const clz of el.classList) {
259        if (clz.startsWith('code-annotation-')) {                     
260          return true;
261        }
262      }
263      return false;
264    }
265    const onCopySuccess = function(e) {
266      // button target
267      const button = e.trigger;
268      // don't keep focus
269      button.blur();
270      // flash "checked"
271      button.classList.add('code-copy-button-checked');
272      var currentTitle = button.getAttribute("title");
273      button.setAttribute("title", "Copied!");
274      let tooltip;
275      if (window.bootstrap) {
276        button.setAttribute("data-bs-toggle", "tooltip");
277        button.setAttribute("data-bs-placement", "left");
278        button.setAttribute("data-bs-title", "Copied!");
279        tooltip = new bootstrap.Tooltip(button, 
280          { trigger: "manual", 
281            customClass: "code-copy-button-tooltip",
282            offset: [0, -8]});
283        tooltip.show();    
284      }
285      setTimeout(function() {
286        if (tooltip) {
287          tooltip.hide();
288          button.removeAttribute("data-bs-title");
289          button.removeAttribute("data-bs-toggle");
290          button.removeAttribute("data-bs-placement");
291        }
292        button.setAttribute("title", currentTitle);
293        button.classList.remove('code-copy-button-checked');
294      }, 1000);
295      // clear code selection
296      e.clearSelection();
297    }
298    const getTextToCopy = function(trigger) {
299      const outerScaffold = trigger.parentElement.cloneNode(true);
300      const codeEl = outerScaffold.querySelector('code');
301      for (const childEl of codeEl.children) {
302        if (isCodeAnnotation(childEl)) {
303          childEl.remove();
304        }
305      }
306      return codeEl.innerText;
307    }
308    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
309      text: getTextToCopy
310    });
311    clipboard.on('success', onCopySuccess);
312    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
313      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
314        text: getTextToCopy,
315        container: window.document.getElementById('quarto-embedded-source-code-modal')
316      });
317      clipboardModal.on('success', onCopySuccess);
318    }
319      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
320      var mailtoRegex = new RegExp(/^mailto:/);
321        var filterRegex = new RegExp("https:\/\/marcopelliccia\.com");
322      var isInternal = (href) => {
323          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
324      }
325      // Inspect non-navigation links and adorn them if external
326     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)');
327      for (var i=0; i<links.length; i++) {
328        const link = links[i];
329        if (!isInternal(link.href)) {
330          // undo the damage that might have been done by quarto-nav.js in the case of
331          // links that we want to consider external
332          if (link.dataset.originalHref !== undefined) {
333            link.href = link.dataset.originalHref;
334          }
335        }
336      }
337    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
338      const config = {
339        allowHTML: true,
340        maxWidth: 500,
341        delay: 100,
342        arrow: false,
343        appendTo: function(el) {
344            return el.parentElement;
345        },
346        interactive: true,
347        interactiveBorder: 10,
348        theme: 'quarto',
349        placement: 'bottom-start',
350      };
351      if (contentFn) {
352        config.content = contentFn;
353      }
354      if (onTriggerFn) {
355        config.onTrigger = onTriggerFn;
356      }
357      if (onUntriggerFn) {
358        config.onUntrigger = onUntriggerFn;
359      }
360      window.tippy(el, config); 
361    }
362    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
363    for (var i=0; i<noterefs.length; i++) {
364      const ref = noterefs[i];
365      tippyHover(ref, function() {
366        // use id or data attribute instead here
367        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
368        try { href = new URL(href).hash; } catch {}
369        const id = href.replace(/^#\/?/, "");
370        const note = window.document.getElementById(id);
371        if (note) {
372          return note.innerHTML;
373        } else {
374          return "";
375        }
376      });
377    }
378    const xrefs = window.document.querySelectorAll('a.quarto-xref');
379    const processXRef = (id, note) => {
380      // Strip column container classes
381      const stripColumnClz = (el) => {
382        el.classList.remove("page-full", "page-columns");
383        if (el.children) {
384          for (const child of el.children) {
385            stripColumnClz(child);
386          }
387        }
388      }
389      stripColumnClz(note)
390      if (id === null || id.startsWith('sec-')) {
391        // Special case sections, only their first couple elements
392        const container = document.createElement("div");
393        if (note.children && note.children.length > 2) {
394          container.appendChild(note.children[0].cloneNode(true));
395          for (let i = 1; i < note.children.length; i++) {
396            const child = note.children[i];
397            if (child.tagName === "P" && child.innerText === "") {
398              continue;
399            } else {
400              container.appendChild(child.cloneNode(true));
401              break;
402            }
403          }
404          if (window.Quarto?.typesetMath) {
405            window.Quarto.typesetMath(container);
406          }
407          return container.innerHTML
408        } else {
409          if (window.Quarto?.typesetMath) {
410            window.Quarto.typesetMath(note);
411          }
412          return note.innerHTML;
413        }
414      } else {
415        // Remove any anchor links if they are present
416        const anchorLink = note.querySelector('a.anchorjs-link');
417        if (anchorLink) {
418          anchorLink.remove();
419        }
420        if (window.Quarto?.typesetMath) {
421          window.Quarto.typesetMath(note);
422        }
423        if (note.classList.contains("callout")) {
424          return note.outerHTML;
425        } else {
426          return note.innerHTML;
427        }
428      }
429    }
430    for (var i=0; i<xrefs.length; i++) {
431      const xref = xrefs[i];
432      tippyHover(xref, undefined, function(instance) {
433        instance.disable();
434        let url = xref.getAttribute('href');
435        let hash = undefined; 
436        if (url.startsWith('#')) {
437          hash = url;
438        } else {
439          try { hash = new URL(url).hash; } catch {}
440        }
441        if (hash) {
442          const id = hash.replace(/^#\/?/, "");
443          const note = window.document.getElementById(id);
444          if (note !== null) {
445            try {
446              const html = processXRef(id, note.cloneNode(true));
447              instance.setContent(html);
448            } finally {
449              instance.enable();
450              instance.show();
451            }
452          } else {
453            // See if we can fetch this
454            fetch(url.split('#')[0])
455            .then(res => res.text())
456            .then(html => {
457              const parser = new DOMParser();
458              const htmlDoc = parser.parseFromString(html, "text/html");
459              const note = htmlDoc.getElementById(id);
460              if (note !== null) {
461                const html = processXRef(id, note);
462                instance.setContent(html);
463              } 
464            }).finally(() => {
465              instance.enable();
466              instance.show();
467            });
468          }
469        } else {
470          // See if we can fetch a full url (with no hash to target)
471          // This is a special case and we should probably do some content thinning / targeting
472          fetch(url)
473          .then(res => res.text())
474          .then(html => {
475            const parser = new DOMParser();
476            const htmlDoc = parser.parseFromString(html, "text/html");
477            const note = htmlDoc.querySelector('main.content');
478            if (note !== null) {
479              // This should only happen for chapter cross references
480              // (since there is no id in the URL)
481              // remove the first header
482              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
483                note.children[0].remove();
484              }
485              const html = processXRef(null, note);
486              instance.setContent(html);
487            } 
488          }).finally(() => {
489            instance.enable();
490            instance.show();
491          });
492        }
493      }, function(instance) {
494      });
495    }
496        let selectedAnnoteEl;
497        const selectorForAnnotation = ( cell, annotation) => {
498          let cellAttr = 'data-code-cell="' + cell + '"';
499          let lineAttr = 'data-code-annotation="' +  annotation + '"';
500          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
501          return selector;
502        }
503        const selectCodeLines = (annoteEl) => {
504          const doc = window.document;
505          const targetCell = annoteEl.getAttribute("data-target-cell");
506          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
507          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
508          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
509          const lineIds = lines.map((line) => {
510            return targetCell + "-" + line;
511          })
512          let top = null;
513          let height = null;
514          let parent = null;
515          if (lineIds.length > 0) {
516              //compute the position of the single el (top and bottom and make a div)
517              const el = window.document.getElementById(lineIds[0]);
518              top = el.offsetTop;
519              height = el.offsetHeight;
520              parent = el.parentElement.parentElement;
521            if (lineIds.length > 1) {
522              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
523              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
524              height = bottom - top;
525            }
526            if (top !== null && height !== null && parent !== null) {
527              // cook up a div (if necessary) and position it 
528              let div = window.document.getElementById("code-annotation-line-highlight");
529              if (div === null) {
530                div = window.document.createElement("div");
531                div.setAttribute("id", "code-annotation-line-highlight");
532                div.style.position = 'absolute';
533                parent.appendChild(div);
534              }
535              div.style.top = top - 2 + "px";
536              div.style.height = height + 4 + "px";
537              div.style.left = 0;
538              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
539              if (gutterDiv === null) {
540                gutterDiv = window.document.createElement("div");
541                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
542                gutterDiv.style.position = 'absolute';
543                const codeCell = window.document.getElementById(targetCell);
544                const gutter = codeCell.querySelector('.code-annotation-gutter');
545                gutter.appendChild(gutterDiv);
546              }
547              gutterDiv.style.top = top - 2 + "px";
548              gutterDiv.style.height = height + 4 + "px";
549            }
550            selectedAnnoteEl = annoteEl;
551          }
552        };
553        const unselectCodeLines = () => {
554          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
555          elementsIds.forEach((elId) => {
556            const div = window.document.getElementById(elId);
557            if (div) {
558              div.remove();
559            }
560          });
561          selectedAnnoteEl = undefined;
562        };
563          // Handle positioning of the toggle
564      window.addEventListener(
565        "resize",
566        throttle(() => {
567          elRect = undefined;
568          if (selectedAnnoteEl) {
569            selectCodeLines(selectedAnnoteEl);
570          }
571        }, 10)
572      );
573      function throttle(fn, ms) {
574      let throttle = false;
575      let timer;
576        return (...args) => {
577          if(!throttle) { // first call gets through
578              fn.apply(this, args);
579              throttle = true;
580          } else { // all the others get throttled
581              if(timer) clearTimeout(timer); // cancel #2
582              timer = setTimeout(() => {
583                fn.apply(this, args);
584                timer = throttle = false;
585              }, ms);
586          }
587        };
588      }
589        // Attach click handler to the DT
590        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
591        for (const annoteDlNode of annoteDls) {
592          annoteDlNode.addEventListener('click', (event) => {
593            const clickedEl = event.target;
594            if (clickedEl !== selectedAnnoteEl) {
595              unselectCodeLines();
596              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
597              if (activeEl) {
598                activeEl.classList.remove('code-annotation-active');
599              }
600              selectCodeLines(clickedEl);
601              clickedEl.classList.add('code-annotation-active');
602            } else {
603              // Unselect the line
604              unselectCodeLines();
605              clickedEl.classList.remove('code-annotation-active');
606            }
607          });
608        }
609    const findCites = (el) => {
610      const parentEl = el.parentElement;
611      if (parentEl) {
612        const cites = parentEl.dataset.cites;
613        if (cites) {
614          return {
615            el,
616            cites: cites.split(' ')
617          };
618        } else {
619          return findCites(el.parentElement)
620        }
621      } else {
622        return undefined;
623      }
624    };
625    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
626    for (var i=0; i<bibliorefs.length; i++) {
627      const ref = bibliorefs[i];
628      const citeInfo = findCites(ref);
629      if (citeInfo) {
630        tippyHover(citeInfo.el, function() {
631          var popup = window.document.createElement('div');
632          citeInfo.cites.forEach(function(cite) {
633            var citeDiv = window.document.createElement('div');
634            citeDiv.classList.add('hanging-indent');
635            citeDiv.classList.add('csl-entry');
636            var biblioDiv = window.document.getElementById('ref-' + cite);
637            if (biblioDiv) {
638              citeDiv.innerHTML = biblioDiv.innerHTML;
639            }
640            popup.appendChild(citeDiv);
641          });
642          return popup.innerHTML;
643        });
644      }
645    }
646  });
647  </script>
647
648</div> <!-- /content -->
649<footer class="footer">
650  <div class="nav-footer">
651    <div class="nav-footer-left">
652<p>© Marco Pelliccia</p>
653</div>   
654    <div class="nav-footer-center">
655      &nbsp;
656    </div>
657    <div class="nav-footer-right">
658      <ul class="footer-items list-unstyled">
659    <li class="nav-item compact">
660    <a class="nav-link" href="https://github.com">
661      <i class="bi bi-github" role="img">
662</i> 
663    </a>
664  </li>  
665    <li class="nav-item compact">
666    <a class="nav-link" href="https://www.linkedin.com/in/marcopelliccia">
667      <i class="bi bi-linkedin" role="img">
668</i> 
669    </a>
670  </li>  
671    <li class="nav-item compact">
672    <a class="nav-link" href="mailto:[email protected]">
673      <i class="bi bi-envelope" role="img">
674</i> 
675    </a>
676  </li>  
677</ul>
678    </div>
679  </div>
680</footer>
681
682
683
684
685</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.