PageSourceSearch

https://fizzics.netlify.app/projects

html fizzics.netlify.app collected 2026-10-03 10:44:13 UTC 74,938 bytes, 2,843 lines download raw bytes

1<!DOCTYPE html>
2
3<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
4
5<head>
6  <meta charset="utf-8"/>
7  <meta name="viewport" content="width=device-width, initial-scale=1"/>
8  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>
9  <meta name="generator" content="distill" />
10  <link rel="alternate" type="application/rss+xml" href="https://www.fizzics.ie/projects.xml" />
11
12  <style type="text/css">
13  /* Hide doc at startup (prevent jankiness while JS renders/transforms) */
14  body {
15    visibility: hidden;
16  }
17  </style>
18
19 <!--radix_placeholder_import_source-->
20 <!--/radix_placeholder_import_source-->
21
22<style type="text/css">code{white-space: pre;}</style>
23<style type="text/css" data-origin="pandoc">
24pre > code.sourceCode { white-space: pre; position: relative; }
25pre > code.sourceCode > span { line-height: 1.25; }
26pre > code.sourceCode > span:empty { height: 1.2em; }
27.sourceCode { overflow: visible; }
28code.sourceCode > span { color: inherit; text-decoration: inherit; }
29div.sourceCode { margin: 1em 0; }
30pre.sourceCode { margin: 0; }
31@media screen {
32div.sourceCode { overflow: auto; }
33}
34@media print {
35pre > code.sourceCode { white-space: pre-wrap; }
36pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
37}
38pre.numberSource code
39  { counter-reset: source-line 0; }
40pre.numberSource code > span
41  { position: relative; left: -4em; counter-increment: source-line; }
42pre.numberSource code > span > a:first-child::before
43  { content: counter(source-line);
44    position: relative; left: -1em; text-align: right; vertical-align: baseline;
45    border: none; display: inline-block;
46    -webkit-touch-callout: none; -webkit-user-select: none;
47    -khtml-user-select: none; -moz-user-select: none;
48    -ms-user-select: none; user-select: none;
49    padding: 0 4px; width: 4em;
50    color: #aaaaaa;
51  }
52pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
53div.sourceCode
54  { color: #00769e; background-color: #f1f3f5; }
55@media screen {
56pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
57}
58code span { color: #00769e; } /* Normal */
59code span.al { color: #ad0000; } /* Alert */
60code span.an { color: #5e5e5e; } /* Annotation */
61code span.at { color: #657422; } /* Attribute */
62code span.bn { color: #ad0000; } /* BaseN */
63code span.bu { } /* BuiltIn */
64code span.cf { color: #00769e; } /* ControlFlow */
65code span.ch { color: #20794d; } /* Char */
66code span.cn { color: #8f5902; } /* Constant */
67code span.co { color: #5e5e5e; } /* Comment */
68code span.cv { color: #5e5e5e; font-style: italic; } /* CommentVar */
69code span.do { color: #5e5e5e; font-style: italic; } /* Documentation */
70code span.dt { color: #ad0000; } /* DataType */
71code span.dv { color: #ad0000; } /* DecVal */
72code span.er { color: #ad0000; } /* Error */
73code span.ex { } /* Extension */
74code span.fl { color: #ad0000; } /* Float */
75code span.fu { color: #4758ab; } /* Function */
76code span.im { } /* Import */
77code span.in { color: #5e5e5e; } /* Information */
78code span.kw { color: #00769e; } /* Keyword */
79code span.op { color: #5e5e5e; } /* Operator */
80code span.ot { color: #00769e; } /* Other */
81code span.pp { color: #ad0000; } /* Preprocessor */
82code span.sc { color: #5e5e5e; } /* SpecialChar */
83code span.ss { color: #20794d; } /* SpecialString */
84code span.st { color: #20794d; } /* String */
85code span.va { color: #111111; } /* Variable */
86code span.vs { color: #20794d; } /* VerbatimString */
87code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */
88</style>
89
90
91  <!--radix_placeholder_meta_tags-->
92  <title>Euge: Projects</title>
93
94  <meta property="description" itemprop="description" content="Some of other stuff I&#39;m working on right now, or in the recent past"/>
95
96  <link rel="license" href="https://creativecommons.org/licenses/by/4.0/"/>
97  <link rel="icon" type="image/vnd.microsoft.icon" href="images/favicon.ico"/>
98
99
100  <!--  https://developers.facebook.com/docs/sharing/webmasters#markup -->
101  <meta property="og:title" content="Euge: Projects"/>
102  <meta property="og:type" content="article"/>
103  <meta property="og:description" content="Some of other stuff I&#39;m working on right now, or in the recent past"/>
104  <meta property="og:locale" content="en_US"/>
105  <meta property="og:site_name" content="Euge"/>
106
107  <!--  https://dev.twitter.com/cards/types/summary -->
108  <meta property="twitter:card" content="summary"/>
109  <meta property="twitter:title" content="Euge: Projects"/>
110  <meta property="twitter:description" content="Some of other stuff I&#39;m working on right now, or in the recent past"/>
111  <meta property="twitter:site" content="@eugene100hickey"/>
112
113  <!--/radix_placeholder_meta_tags-->
114  <!--radix_placeholder_rmarkdown_metadata-->
115
116  
116<script type="text/json" id="radix-rmarkdown-metadata">
117  {"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["title","description","listing"]}},"value":[{"type":"character","attributes":{},"value":["Projects"]},{"type":"character","attributes":{},"value":["Some of other stuff I'm working on right now, or in the recent past\n"]},{"type":"character","attributes":{},"value":["projects"]}]}
118  </script>
118
119  <!--/radix_placeholder_rmarkdown_metadata-->
120  <!--radix_placeholder_navigation_in_header-->
121  <meta name="distill:offset" content=""/>
122
123  
123<script type="application/javascript">
124
125    window.headroom_prevent_pin = false;
126
127    window.document.addEventListener("DOMContentLoaded", function (event) {
128
129      // initialize headroom for banner
130      var header = $('header').get(0);
131      var headerHeight = header.offsetHeight;
132      var headroom = new Headroom(header, {
133        tolerance: 5,
134        onPin : function() {
135          if (window.headroom_prevent_pin) {
136            window.headroom_prevent_pin = false;
137            headroom.unpin();
138          }
139        }
140      });
141      headroom.init();
142      if(window.location.hash)
143        headroom.unpin();
144      $(header).addClass('headroom--transition');
145
146      // offset scroll location for banner on hash change
147      // (see: https://github.com/WickyNilliams/headroom.js/issues/38)
148      window.addEventListener("hashchange", function(event) {
149        window.scrollTo(0, window.pageYOffset - (headerHeight + 25));
150      });
151
152      // responsive menu
153      $('.distill-site-header').each(function(i, val) {
154        var topnav = $(this);
155        var toggle = topnav.find('.nav-toggle');
156        toggle.on('click', function() {
157          topnav.toggleClass('responsive');
158        });
159      });
160
161      // nav dropdowns
162      $('.nav-dropbtn').click(function(e) {
163        $(this).next('.nav-dropdown-content').toggleClass('nav-dropdown-active');
164        $(this).parent().siblings('.nav-dropdown')
165           .children('.nav-dropdown-content').removeClass('nav-dropdown-active');
166      });
167      $("body").click(function(e){
168        $('.nav-dropdown-content').removeClass('nav-dropdown-active');
169      });
170      $(".nav-dropdown").click(function(e){
171        e.stopPropagation();
172      });
173    });
174  </script>
174
175
176  <style type="text/css">
177
178  /* Theme (user-documented overrideables for nav appearance) */
179
180  .distill-site-nav {
181    color: rgba(255, 255, 255, 0.8);
182    background-color: #0F2E3D;
183    font-size: 15px;
184    font-weight: 300;
185  }
186
187  .distill-site-nav a {
188    color: inherit;
189    text-decoration: none;
190  }
191
192  .distill-site-nav a:hover {
193    color: white;
194  }
195
196  @media print {
197    .distill-site-nav {
198      display: none;
199    }
200  }
201
202  .distill-site-header {
203
204  }
205
206  .distill-site-footer {
207
208  }
209
210
211  /* Site Header */
212
213  .distill-site-header {
214    width: 100%;
215    box-sizing: border-box;
216    z-index: 3;
217  }
218
219  .distill-site-header .nav-left {
220    display: inline-block;
221    margin-left: 8px;
222  }
223
224  @media screen and (max-width: 768px) {
225    .distill-site-header .nav-left {
226      margin-left: 0;
227    }
228  }
229
230
231  .distill-site-header .nav-right {
232    float: right;
233    margin-right: 8px;
234  }
235
236  .distill-site-header a,
237  .distill-site-header .title {
238    display: inline-block;
239    text-align: center;
240    padding: 14px 10px 14px 10px;
241  }
242
243  .distill-site-header .title {
244    font-size: 18px;
245    min-width: 150px;
246  }
247
248  .distill-site-header .logo {
249    padding: 0;
250  }
251
252  .distill-site-header .logo img {
253    display: none;
254    max-height: 20px;
255    width: auto;
256    margin-bottom: -4px;
257  }
258
259  .distill-site-header .nav-image img {
260    max-height: 18px;
261    width: auto;
262    display: inline-block;
263    margin-bottom: -3px;
264  }
265
266
267
268  @media screen and (min-width: 1000px) {
269    .distill-site-header .logo img {
270      display: inline-block;
271    }
272    .distill-site-header .nav-left {
273      margin-left: 20px;
274    }
275    .distill-site-header .nav-right {
276      margin-right: 20px;
277    }
278    .distill-site-header .title {
279      padding-left: 12px;
280    }
281  }
282
283
284  .distill-site-header .nav-toggle {
285    display: none;
286  }
287
288  .nav-dropdown {
289    display: inline-block;
290    position: relative;
291  }
292
293  .nav-dropdown .nav-dropbtn {
294    border: none;
295    outline: none;
296    color: rgba(255, 255, 255, 0.8);
297    padding: 16px 10px;
298    background-color: transparent;
299    font-family: inherit;
300    font-size: inherit;
301    font-weight: inherit;
302    margin: 0;
303    margin-top: 1px;
304    z-index: 2;
305  }
306
307  .nav-dropdown-content {
308    display: none;
309    position: absolute;
310    background-color: white;
311    min-width: 200px;
312    border: 1px solid rgba(0,0,0,0.15);
313    border-radius: 4px;
314    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.1);
315    z-index: 1;
316    margin-top: 2px;
317    white-space: nowrap;
318    padding-top: 4px;
319    padding-bottom: 4px;
320  }
321
322  .nav-dropdown-content hr {
323    margin-top: 4px;
324    margin-bottom: 4px;
325    border: none;
326    border-bottom: 1px solid rgba(0, 0, 0, 0.1);
327  }
328
329  .nav-dropdown-active {
330    display: block;
331  }
332
333  .nav-dropdown-content a, .nav-dropdown-content .nav-dropdown-header {
334    color: black;
335    padding: 6px 24px;
336    text-decoration: none;
337    display: block;
338    text-align: left;
339  }
340
341  .nav-dropdown-content .nav-dropdown-header {
342    display: block;
343    padding: 5px 24px;
344    padding-bottom: 0;
345    text-transform: uppercase;
346    font-size: 14px;
347    color: #999999;
348    white-space: nowrap;
349  }
350
351  .nav-dropdown:hover .nav-dropbtn {
352    color: white;
353  }
354
355  .nav-dropdown-content a:hover {
356    background-color: #ddd;
357    color: black;
358  }
359
360  .nav-right .nav-dropdown-content {
361    margin-left: -45%;
362    right: 0;
363  }
364
365  @media screen and (max-width: 768px) {
366    .distill-site-header a, .distill-site-header .nav-dropdown  {display: none;}
367    .distill-site-header a.nav-toggle {
368      float: right;
369      display: block;
370    }
371    .distill-site-header .title {
372      margin-left: 0;
373    }
374    .distill-site-header .nav-right {
375      margin-right: 0;
376    }
377    .distill-site-header {
378      overflow: hidden;
379    }
380    .nav-right .nav-dropdown-content {
381      margin-left: 0;
382    }
383  }
384
385
386  @media screen and (max-width: 768px) {
387    .distill-site-header.responsive {position: relative; min-height: 500px; }
388    .distill-site-header.responsive a.nav-toggle {
389      position: absolute;
390      right: 0;
391      top: 0;
392    }
393    .distill-site-header.responsive a,
394    .distill-site-header.responsive .nav-dropdown {
395      display: block;
396      text-align: left;
397    }
398    .distill-site-header.responsive .nav-left,
399    .distill-site-header.responsive .nav-right {
400      width: 100%;
401    }
402    .distill-site-header.responsive .nav-dropdown {float: none;}
403    .distill-site-header.responsive .nav-dropdown-content {position: relative;}
404    .distill-site-header.responsive .nav-dropdown .nav-dropbtn {
405      display: block;
406      width: 100%;
407      text-align: left;
408    }
409  }
410
411  /* Site Footer */
412
413  .distill-site-footer {
414    width: 100%;
415    overflow: hidden;
416    box-sizing: border-box;
417    z-index: 3;
418    margin-top: 30px;
419    padding-top: 30px;
420    padding-bottom: 30px;
421    text-align: center;
422  }
423
424  /* Headroom */
425
426  d-title {
427    padding-top: 6rem;
428  }
429
430  @media print {
431    d-title {
432      padding-top: 4rem;
433    }
434  }
435
436  .headroom {
437    z-index: 1000;
438    position: fixed;
439    top: 0;
440    left: 0;
441    right: 0;
442  }
443
444  .headroom--transition {
445    transition: all .4s ease-in-out;
446  }
447
448  .headroom--unpinned {
449    top: -100px;
450  }
451
452  .headroom--pinned {
453    top: 0;
454  }
455
456  /* adjust viewport for navbar height */
457  /* helps vertically center bootstrap (non-distill) content */
458  .min-vh-100 {
459    min-height: calc(100vh - 100px) !important;
460  }
461
462  </style>
463
464  
464<script src="site_libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
464
465  <link href="site_libs/font-awesome-6.5.2/css/all.min.css" rel="stylesheet"/>
466  <link href="site_libs/font-awesome-6.5.2/css/v4-shims.min.css" rel="stylesheet"/>
467  
467<script src="site_libs/headroom-0.9.4/headroom.min.js"></script>
467
468  
468<script src="site_libs/autocomplete-0.37.1/autocomplete.min.js"></script>
468
469  
469<script src="site_libs/fuse-6.4.1/fuse.min.js"></script>
469
470
471  
471<script type="application/javascript">
472
473  function getMeta(metaName) {
474    var metas = document.getElementsByTagName('meta');
475    for (let i = 0; i < metas.length; i++) {
476      if (metas[i].getAttribute('name') === metaName) {
477        return metas[i].getAttribute('content');
478      }
479    }
480    return '';
481  }
482
483  function offsetURL(url) {
484    var offset = getMeta('distill:offset');
485    return offset ? offset + '/' + url : url;
486  }
487
488  function createFuseIndex() {
489
490    // create fuse index
491    var options = {
492      keys: [
493        { name: 'title', weight: 20 },
494        { name: 'categories', weight: 15 },
495        { name: 'description', weight: 10 },
496        { name: 'contents', weight: 5 },
497      ],
498      ignoreLocation: true,
499      threshold: 0
500    };
501    var fuse = new window.Fuse([], options);
502
503    // fetch the main search.json
504    return fetch(offsetURL('search.json'))
505      .then(function(response) {
506        if (response.status == 200) {
507          return response.json().then(function(json) {
508            // index main articles
509            json.articles.forEach(function(article) {
510              fuse.add(article);
511            });
512            // download collections and index their articles
513            return Promise.all(json.collections.map(function(collection) {
514              return fetch(offsetURL(collection)).then(function(response) {
515                if (response.status === 200) {
516                  return response.json().then(function(articles) {
517                    articles.forEach(function(article) {
518                      fuse.add(article);
519                    });
520                  })
521                } else {
522                  return Promise.reject(
523                    new Error('Unexpected status from search index request: ' +
524                              response.status)
525                  );
526                }
527              });
528            })).then(function() {
529              return fuse;
530            });
531          });
532
533        } else {
534          return Promise.reject(
535            new Error('Unexpected status from search index request: ' +
536                        response.status)
537          );
538        }
539      });
540  }
541
542  window.document.addEventListener("DOMContentLoaded", function (event) {
543
544    // get search element (bail if we don't have one)
545    var searchEl = window.document.getElementById('distill-search');
546    if (!searchEl)
547      return;
548
549    createFuseIndex()
550      .then(function(fuse) {
551
552        // make search box visible
553        searchEl.classList.remove('hidden');
554
555        // initialize autocomplete
556        var options = {
557          autoselect: true,
558          hint: false,
559          minLength: 2,
560        };
561        window.autocomplete(searchEl, options, [{
562          source: function(query, callback) {
563            const searchOptions = {
564              isCaseSensitive: false,
565              shouldSort: true,
566              minMatchCharLength: 2,
567              limit: 10,
568            };
569            var results = fuse.search(query, searchOptions);
570            callback(results
571              .map(function(result) { return result.item; })
572            );
573          },
574          templates: {
575            suggestion: function(suggestion) {
576              var img = suggestion.preview && Object.keys(suggestion.preview).length > 0
577                ? `<img src="${offsetURL(suggestion.preview)}"</img>`
578                : '';
579              var html = `
580                <div class="search-item">
581                  <h3>${suggestion.title}</h3>
582                  <div class="search-item-description">
583                    ${suggestion.description || ''}
584                  </div>
585                  <div class="search-item-preview">
586                    ${img}
587                  </div>
588                </div>
589              `;
590              return html;
591            }
592          }
593        }]).on('autocomplete:selected', function(event, suggestion) {
594          window.location.href = offsetURL(suggestion.path);
595        });
596        // remove inline display style on autocompleter (we want to
597        // manage responsive display via css)
598        $('.algolia-autocomplete').css("display", "");
599      })
600      .catch(function(error) {
601        console.log(error);
602      });
603
604  });
605
606  </script>
606
607
608  <style type="text/css">
609
610  .nav-search {
611    font-size: x-small;
612  }
613
614  /* Algolioa Autocomplete */
615
616  .algolia-autocomplete {
617    display: inline-block;
618    margin-left: 10px;
619    vertical-align: sub;
620    background-color: white;
621    color: black;
622    padding: 6px;
623    padding-top: 8px;
624    padding-bottom: 0;
625    border-radius: 6px;
626    border: 1px #0F2E3D solid;
627    width: 180px;
628  }
629
630
631  @media screen and (max-width: 768px) {
632    .distill-site-nav .algolia-autocomplete {
633      display: none;
634      visibility: hidden;
635    }
636    .distill-site-nav.responsive .algolia-autocomplete {
637      display: inline-block;
638      visibility: visible;
639    }
640    .distill-site-nav.responsive .algolia-autocomplete .aa-dropdown-menu {
641      margin-left: 0;
642      width: 400px;
643      max-height: 400px;
644    }
645  }
646
647  .algolia-autocomplete .aa-input, .algolia-autocomplete .aa-hint {
648    width: 90%;
649    outline: none;
650    border: none;
651  }
652
653  .algolia-autocomplete .aa-hint {
654    color: #999;
655  }
656  .algolia-autocomplete .aa-dropdown-menu {
657    width: 550px;
658    max-height: 70vh;
659    overflow-x: visible;
660    overflow-y: scroll;
661    padding: 5px;
662    margin-top: 3px;
663    margin-left: -150px;
664    background-color: #fff;
665    border-radius: 5px;
666    border: 1px solid #999;
667    border-top: none;
668  }
669
670  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion {
671    cursor: pointer;
672    padding: 5px 4px;
673    border-bottom: 1px solid #eee;
674  }
675
676  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion:last-of-type {
677    border-bottom: none;
678    margin-bottom: 2px;
679  }
680
681  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item {
682    overflow: hidden;
683    font-size: 0.8em;
684    line-height: 1.4em;
685  }
686
687  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item h3 {
688    font-size: 1rem;
689    margin-block-start: 0;
690    margin-block-end: 5px;
691  }
692
693  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-description {
694    display: inline-block;
695    overflow: hidden;
696    height: 2.8em;
697    width: 80%;
698    margin-right: 4%;
699  }
700
701  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview {
702    display: inline-block;
703    width: 15%;
704  }
705
706  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview img {
707    height: 3em;
708    width: auto;
709    display: none;
710  }
711
712  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion .search-item-preview img[src] {
713    display: initial;
714  }
715
716  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion.aa-cursor {
717    background-color: #eee;
718  }
719  .algolia-autocomplete .aa-dropdown-menu .aa-suggestion em {
720    font-weight: bold;
721    font-style: normal;
722  }
723
724  </style>
725
726
727  <!--/radix_placeholder_navigation_in_header-->
728  <!--radix_placeholder_distill-->
729
730  <style type="text/css">
731
732  body {
733    background-color: white;
734  }
735
736  .pandoc-table {
737    width: 100%;
738  }
739
740  .pandoc-table>caption {
741    margin-bottom: 10px;
742  }
743
744  .pandoc-table th:not([align]) {
745    text-align: left;
746  }
747
748  .pagedtable-footer {
749    font-size: 15px;
750  }
751
752  d-byline .byline {
753    grid-template-columns: 2fr 2fr;
754  }
755
756  d-byline .byline h3 {
757    margin-block-start: 1.5em;
758  }
759
760  d-byline .byline .authors-affiliations h3 {
761    margin-block-start: 0.5em;
762  }
763
764  .authors-affiliations .orcid-id {
765    width: 16px;
766    height:16px;
767    margin-left: 4px;
768    margin-right: 4px;
769    vertical-align: middle;
770    padding-bottom: 2px;
771  }
772
773  d-title .dt-tags {
774    margin-top: 1em;
775    grid-column: text;
776  }
777
778  .dt-tags .dt-tag {
779    text-decoration: none;
780    display: inline-block;
781    color: rgba(0,0,0,0.6);
782    padding: 0em 0.4em;
783    margin-right: 0.5em;
784    margin-bottom: 0.4em;
785    font-size: 70%;
786    border: 1px solid rgba(0,0,0,0.2);
787    border-radius: 3px;
788    text-transform: uppercase;
789    font-weight: 500;
790  }
791
792  d-article table.gt_table td,
793  d-article table.gt_table th {
794    border-bottom: none;
795    font-size: 100%;
796  }
797
798  .html-widget {
799    margin-bottom: 2.0em;
800  }
801
802  .l-screen-inset {
803    padding-right: 16px;
804  }
805
806  .l-screen .caption {
807    margin-left: 10px;
808  }
809
810  .shaded {
811    background: rgb(247, 247, 247);
812    padding-top: 20px;
813    padding-bottom: 20px;
814    border-top: 1px solid rgba(0, 0, 0, 0.1);
815    border-bottom: 1px solid rgba(0, 0, 0, 0.1);
816  }
817
818  .shaded .html-widget {
819    margin-bottom: 0;
820    border: 1px solid rgba(0, 0, 0, 0.1);
821  }
822
823  .shaded .shaded-content {
824    background: white;
825  }
826
827  .text-output {
828    margin-top: 0;
829    line-height: 1.5em;
830  }
831
832  .hidden {
833    display: none !important;
834  }
835
836  hr.section-separator {
837    border: none;
838    border-top: 1px solid rgba(0, 0, 0, 0.1);
839    margin: 0px;
840  }
841
842
843  d-byline {
844    border-top: none;
845  }
846
847  d-article {
848    padding-top: 2.5rem;
849    padding-bottom: 30px;
850    border-top: none;
851  }
852
853  d-appendix {
854    padding-top: 30px;
855  }
856
857  d-article>p>img {
858    width: 100%;
859  }
860
861  d-article h2 {
862    margin: 1rem 0 1.5rem 0;
863  }
864
865  d-article h3 {
866    margin-top: 1.5rem;
867  }
868
869  d-article iframe {
870    border: 1px solid rgba(0, 0, 0, 0.1);
871    margin-bottom: 2.0em;
872    width: 100%;
873  }
874
875  /* Tweak code blocks */
876
877  d-article div.sourceCode code,
878  d-article pre code {
879    font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
880  }
881
882  d-article pre,
883  d-article div.sourceCode,
884  d-article div.sourceCode pre {
885    overflow: auto;
886  }
887
888  d-article div.sourceCode {
889    background-color: white;
890  }
891
892  d-article div.sourceCode pre {
893    padding-left: 10px;
894    font-size: 12px;
895    border-left: 2px solid rgba(0,0,0,0.1);
896  }
897
898  d-article pre {
899    font-size: 12px;
900    color: black;
901    background: none;
902    margin-top: 0;
903    text-align: left;
904    white-space: pre;
905    word-spacing: normal;
906    word-break: normal;
907    word-wrap: normal;
908    line-height: 1.5;
909
910    -moz-tab-size: 4;
911    -o-tab-size: 4;
912    tab-size: 4;
913
914    -webkit-hyphens: none;
915    -moz-hyphens: none;
916    -ms-hyphens: none;
917    hyphens: none;
918  }
919
920  d-article pre a {
921    border-bottom: none;
922  }
923
924  d-article pre a:hover {
925    border-bottom: none;
926    text-decoration: underline;
927  }
928
929  d-article details {
930    grid-column: text;
931    margin-bottom: 0.8em;
932  }
933
934  @media(min-width: 768px) {
935
936  d-article pre,
937  d-article div.sourceCode,
938  d-article div.sourceCode pre {
939    overflow: visible !important;
940  }
941
942  d-article div.sourceCode pre {
943    padding-left: 18px;
944    font-size: 14px;
945  }
946
947  /* tweak for Pandoc numbered line within distill */
948  d-article pre.numberSource code > span {
949      left: -2em;
950  }
951
952  d-article pre {
953    font-size: 14px;
954  }
955
956  }
957
958  figure img.external {
959    background: white;
960    border: 1px solid rgba(0, 0, 0, 0.1);
961    box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
962    padding: 18px;
963    box-sizing: border-box;
964  }
965
966  /* CSS for d-contents */
967
968  .d-contents {
969    grid-column: text;
970    color: rgba(0,0,0,0.8);
971    font-size: 0.9em;
972    padding-bottom: 1em;
973    margin-bottom: 1em;
974    padding-bottom: 0.5em;
975    margin-bottom: 1em;
976    padding-left: 0.25em;
977    justify-self: start;
978  }
979
980  @media(min-width: 1000px) {
981    .d-contents.d-contents-float {
982      height: 0;
983      grid-column-start: 1;
984      grid-column-end: 4;
985      justify-self: center;
986      padding-right: 3em;
987      padding-left: 2em;
988    }
989  }
990
991  .d-contents nav h3 {
992    font-size: 18px;
993    margin-top: 0;
994    margin-bottom: 1em;
995  }
996
997  .d-contents li {
998    list-style-type: none
999  }
1000
1001  .d-contents nav > ul {
1002    padding-left: 0;
1003  }
1004
1005  .d-contents ul {
1006    padding-left: 1em
1007  }
1008
1009  .d-contents nav ul li {
1010    margin-top: 0.6em;
1011    margin-bottom: 0.2em;
1012  }
1013
1014  .d-contents nav a {
1015    font-size: 13px;
1016    border-bottom: none;
1017    text-decoration: none
1018    color: rgba(0, 0, 0, 0.8);
1019  }
1020
1021  .d-contents nav a:hover {
1022    text-decoration: underline solid rgba(0, 0, 0, 0.6)
1023  }
1024
1025  .d-contents nav > ul > li > a {
1026    font-weight: 600;
1027  }
1028
1029  .d-contents nav > ul > li > ul {
1030    font-weight: inherit;
1031  }
1032
1033  .d-contents nav > ul > li > ul > li {
1034    margin-top: 0.2em;
1035  }
1036
1037
1038  .d-contents nav ul {
1039    margin-top: 0;
1040    margin-bottom: 0.25em;
1041  }
1042
1043  .d-article-with-toc h2:nth-child(2) {
1044    margin-top: 0;
1045  }
1046
1047
1048  /* Figure */
1049
1050  .figure {
1051    position: relative;
1052    margin-bottom: 2.5em;
1053    margin-top: 1.5em;
1054  }
1055
1056  .figure .caption {
1057    color: rgba(0, 0, 0, 0.6);
1058    font-size: 12px;
1059    line-height: 1.5em;
1060  }
1061
1062  .figure img.external {
1063    background: white;
1064    border: 1px solid rgba(0, 0, 0, 0.1);
1065    box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
1066    padding: 18px;
1067    box-sizing: border-box;
1068  }
1069
1070  .figure .caption a {
1071    color: rgba(0, 0, 0, 0.6);
1072  }
1073
1074  .figure .caption b,
1075  .figure .caption strong, {
1076    font-weight: 600;
1077    color: rgba(0, 0, 0, 1.0);
1078  }
1079
1080  /* Citations */
1081
1082  d-article .citation {
1083    color: inherit;
1084    cursor: inherit;
1085  }
1086
1087  div.hanging-indent{
1088    margin-left: 1em; text-indent: -1em;
1089  }
1090
1091  /* Citation hover box */
1092
1093  .tippy-box[data-theme~=light-border] {
1094    background-color: rgba(250, 250, 250, 0.95);
1095  }
1096
1097  .tippy-content > p {
1098    margin-bottom: 0;
1099    padding: 2px;
1100  }
1101
1102
1103  /* Tweak 1000px media break to show more text */
1104
1105  @media(min-width: 1000px) {
1106    .base-grid,
1107    distill-header,
1108    d-title,
1109    d-abstract,
1110    d-article,
1111    d-appendix,
1112    distill-appendix,
1113    d-byline,
1114    d-footnote-list,
1115    d-citation-list,
1116    distill-footer {
1117      grid-template-columns: [screen-start] 1fr [page-start kicker-start] 80px [middle-start] 50px [text-start kicker-end] 65px 65px 65px 65px 65px 65px 65px 65px [text-end gutter-start] 65px [middle-end] 65px [page-end gutter-end] 1fr [screen-end];
1118      grid-column-gap: 16px;
1119    }
1120
1121    .grid {
1122      grid-column-gap: 16px;
1123    }
1124
1125    d-article {
1126      font-size: 1.06rem;
1127      line-height: 1.7em;
1128    }
1129    figure .caption, .figure .caption, figure figcaption {
1130      font-size: 13px;
1131    }
1132  }
1133
1134  @media(min-width: 1180px) {
1135    .base-grid,
1136    distill-header,
1137    d-title,
1138    d-abstract,
1139    d-article,
1140    d-appendix,
1141    distill-appendix,
1142    d-byline,
1143    d-footnote-list,
1144    d-citation-list,
1145    distill-footer {
1146      grid-template-columns: [screen-start] 1fr [page-start kicker-start] 60px [middle-start] 60px [text-start kicker-end] 60px 60px 60px 60px 60px 60px 60px 60px [text-end gutter-start] 60px [middle-end] 60px [page-end gutter-end] 1fr [screen-end];
1147      grid-column-gap: 32px;
1148    }
1149
1150    .grid {
1151      grid-column-gap: 32px;
1152    }
1153  }
1154
1155
1156  /* Get the citation styles for the appendix (not auto-injected on render since
1157     we do our own rendering of the citation appendix) */
1158
1159  d-appendix .citation-appendix,
1160  .d-appendix .citation-appendix {
1161    font-size: 11px;
1162    line-height: 15px;
1163    border-left: 1px solid rgba(0, 0, 0, 0.1);
1164    padding-left: 18px;
1165    border: 1px solid rgba(0,0,0,0.1);
1166    background: rgba(0, 0, 0, 0.02);
1167    padding: 10px 18px;
1168    border-radius: 3px;
1169    color: rgba(150, 150, 150, 1);
1170    overflow: hidden;
1171    margin-top: -12px;
1172    white-space: pre-wrap;
1173    word-wrap: break-word;
1174  }
1175
1176  /* Include appendix styles here so they can be overridden */
1177
1178  d-appendix {
1179    contain: layout style;
1180    font-size: 0.8em;
1181    line-height: 1.7em;
1182    margin-top: 60px;
1183    margin-bottom: 0;
1184    border-top: 1px solid rgba(0, 0, 0, 0.1);
1185    color: rgba(0,0,0,0.5);
1186    padding-top: 60px;
1187    padding-bottom: 48px;
1188  }
1189
1190  d-appendix h3 {
1191    grid-column: page-start / text-start;
1192    font-size: 15px;
1193    font-weight: 500;
1194    margin-top: 1em;
1195    margin-bottom: 0;
1196    color: rgba(0,0,0,0.65);
1197  }
1198
1199  d-appendix h3 + * {
1200    margin-top: 1em;
1201  }
1202
1203  d-appendix ol {
1204    padding: 0 0 0 15px;
1205  }
1206
1207  @media (min-width: 768px) {
1208    d-appendix ol {
1209      padding: 0 0 0 30px;
1210      margin-left: -30px;
1211    }
1212  }
1213
1214  d-appendix li {
1215    margin-bottom: 1em;
1216  }
1217
1218  d-appendix a {
1219    color: rgba(0, 0, 0, 0.6);
1220  }
1221
1222  d-appendix > * {
1223    grid-column: text;
1224  }
1225
1226  d-appendix > d-footnote-list,
1227  d-appendix > d-citation-list,
1228  d-appendix > distill-appendix {
1229    grid-column: screen;
1230  }
1231
1232  /* Include footnote styles here so they can be overridden */
1233
1234  d-footnote-list {
1235    contain: layout style;
1236  }
1237
1238  d-footnote-list > * {
1239    grid-column: text;
1240  }
1241
1242  d-footnote-list a.footnote-backlink {
1243    color: rgba(0,0,0,0.3);
1244    padding-left: 0.5em;
1245  }
1246
1247
1248
1249  /* Anchor.js */
1250
1251  .anchorjs-link {
1252    /*transition: all .25s linear; */
1253    text-decoration: none;
1254    border-bottom: none;
1255  }
1256  *:hover > .anchorjs-link {
1257    margin-left: -1.125em !important;
1258    text-decoration: none;
1259    border-bottom: none;
1260  }
1261
1262  /* Social footer */
1263
1264  .social_footer {
1265    margin-top: 30px;
1266    margin-bottom: 0;
1267    color: rgba(0,0,0,0.67);
1268  }
1269
1270  .disqus-comments {
1271    margin-right: 30px;
1272  }
1273
1274  .disqus-comment-count {
1275    border-bottom: 1px solid rgba(0, 0, 0, 0.4);
1276    cursor: pointer;
1277  }
1278
1279  #disqus_thread {
1280    margin-top: 30px;
1281  }
1282
1283  .article-sharing a {
1284    border-bottom: none;
1285    margin-right: 8px;
1286  }
1287
1288  .article-sharing a:hover {
1289    border-bottom: none;
1290  }
1291
1292  .sidebar-section.subscribe {
1293    font-size: 12px;
1294    line-height: 1.6em;
1295  }
1296
1297  .subscribe p {
1298    margin-bottom: 0.5em;
1299  }
1300
1301
1302  .article-footer .subscribe {
1303    font-size: 15px;
1304    margin-top: 45px;
1305  }
1306
1307
1308  .sidebar-section.custom {
1309    font-size: 12px;
1310    line-height: 1.6em;
1311  }
1312
1313  .custom p {
1314    margin-bottom: 0.5em;
1315  }
1316
1317  /* Styles for listing layout (hide title) */
1318  .layout-listing d-title, .layout-listing .d-title {
1319    display: none;
1320  }
1321
1322  /* Styles for posts lists (not auto-injected) */
1323
1324
1325  .posts-with-sidebar {
1326    padding-left: 45px;
1327    padding-right: 45px;
1328  }
1329
1330  .posts-list .description h2,
1331  .posts-list .description p {
1332    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
1333  }
1334
1335  .posts-list .description h2 {
1336    font-weight: 700;
1337    border-bottom: none;
1338    padding-bottom: 0;
1339  }
1340
1341  .posts-list h2.post-tag {
1342    border-bottom: 1px solid rgba(0, 0, 0, 0.2);
1343    padding-bottom: 12px;
1344  }
1345  .posts-list {
1346    margin-top: 60px;
1347    margin-bottom: 24px;
1348  }
1349
1350  .posts-list .post-preview {
1351    text-decoration: none;
1352    overflow: hidden;
1353    display: block;
1354    border-bottom: 1px solid rgba(0, 0, 0, 0.1);
1355    padding: 24px 0;
1356  }
1357
1358  .post-preview-last {
1359    border-bottom: none !important;
1360  }
1361
1362  .posts-list .posts-list-caption {
1363    grid-column: screen;
1364    font-weight: 400;
1365  }
1366
1367  .posts-list .post-preview h2 {
1368    margin: 0 0 6px 0;
1369    line-height: 1.2em;
1370    font-style: normal;
1371    font-size: 24px;
1372  }
1373
1374  .posts-list .post-preview p {
1375    margin: 0 0 12px 0;
1376    line-height: 1.4em;
1377    font-size: 16px;
1378  }
1379
1380  .posts-list .post-preview .thumbnail {
1381    box-sizing: border-box;
1382    margin-bottom: 24px;
1383    position: relative;
1384    max-width: 500px;
1385  }
1386  .posts-list .post-preview img {
1387    width: 100%;
1388    display: block;
1389  }
1390
1391  .posts-list .metadata {
1392    font-size: 12px;
1393    line-height: 1.4em;
1394    margin-bottom: 18px;
1395  }
1396
1397  .posts-list .metadata > * {
1398    display: inline-block;
1399  }
1400
1401  .posts-list .metadata .publishedDate {
1402    margin-right: 2em;
1403  }
1404
1405  .posts-list .metadata .dt-authors {
1406    display: block;
1407    margin-top: 0.3em;
1408    margin-right: 2em;
1409  }
1410
1411  .posts-list .dt-tags {
1412    display: block;
1413    line-height: 1em;
1414  }
1415
1416  .posts-list .dt-tags .dt-tag {
1417    display: inline-block;
1418    color: rgba(0,0,0,0.6);
1419    padding: 0.3em 0.4em;
1420    margin-right: 0.2em;
1421    margin-bottom: 0.4em;
1422    font-size: 60%;
1423    border: 1px solid rgba(0,0,0,0.2);
1424    border-radius: 3px;
1425    text-transform: uppercase;
1426    font-weight: 500;
1427  }
1428
1429  .posts-list img {
1430    opacity: 1;
1431  }
1432
1433  .posts-list img[data-src] {
1434    opacity: 0;
1435  }
1436
1437  .posts-more {
1438    clear: both;
1439  }
1440
1441
1442  .posts-sidebar {
1443    font-size: 16px;
1444  }
1445
1446  .posts-sidebar h3 {
1447    font-size: 16px;
1448    margin-top: 0;
1449    margin-bottom: 0.5em;
1450    font-weight: 400;
1451    text-transform: uppercase;
1452  }
1453
1454  .sidebar-section {
1455    margin-bottom: 30px;
1456  }
1457
1458  .categories ul {
1459    list-style-type: none;
1460    margin: 0;
1461    padding: 0;
1462  }
1463
1464  .categories li {
1465    color: rgba(0, 0, 0, 0.8);
1466    margin-bottom: 0;
1467  }
1468
1469  .categories li>a {
1470    border-bottom: none;
1471  }
1472
1473  .categories li>a:hover {
1474    border-bottom: 1px solid rgba(0, 0, 0, 0.4);
1475  }
1476
1477  .categories .active {
1478    font-weight: 600;
1479  }
1480
1481  .categories .category-count {
1482    color: rgba(0, 0, 0, 0.4);
1483  }
1484
1485
1486  @media(min-width: 768px) {
1487    .posts-list .post-preview h2 {
1488      font-size: 26px;
1489    }
1490    .posts-list .post-preview .thumbnail {
1491      float: right;
1492      width: 30%;
1493      margin-bottom: 0;
1494    }
1495    .posts-list .post-preview .description {
1496      float: left;
1497      width: 45%;
1498    }
1499    .posts-list .post-preview .metadata {
1500      float: left;
1501      width: 20%;
1502      margin-top: 8px;
1503    }
1504    .posts-list .post-preview p {
1505      margin: 0 0 12px 0;
1506      line-height: 1.5em;
1507      font-size: 16px;
1508    }
1509    .posts-with-sidebar .posts-list {
1510      float: left;
1511      width: 75%;
1512    }
1513    .posts-with-sidebar .posts-sidebar {
1514      float: right;
1515      width: 20%;
1516      margin-top: 60px;
1517      padding-top: 24px;
1518      padding-bottom: 24px;
1519    }
1520  }
1521
1522
1523  /* Improve display for browsers without grid (IE/Edge <= 15) */
1524
1525  .downlevel {
1526    line-height: 1.6em;
1527    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
1528    margin: 0;
1529  }
1530
1531  .downlevel .d-title {
1532    padding-top: 6rem;
1533    padding-bottom: 1.5rem;
1534  }
1535
1536  .downlevel .d-title h1 {
1537    font-size: 50px;
1538    font-weight: 700;
1539    line-height: 1.1em;
1540    margin: 0 0 0.5rem;
1541  }
1542
1543  .downlevel .d-title p {
1544    font-weight: 300;
1545    font-size: 1.2rem;
1546    line-height: 1.55em;
1547    margin-top: 0;
1548  }
1549
1550  .downlevel .d-byline {
1551    padding-top: 0.8em;
1552    padding-bottom: 0.8em;
1553    font-size: 0.8rem;
1554    line-height: 1.8em;
1555  }
1556
1557  .downlevel .section-separator {
1558    border: none;
1559    border-top: 1px solid rgba(0, 0, 0, 0.1);
1560  }
1561
1562  .downlevel .d-article {
1563    font-size: 1.06rem;
1564    line-height: 1.7em;
1565    padding-top: 1rem;
1566    padding-bottom: 2rem;
1567  }
1568
1569
1570  .downlevel .d-appendix {
1571    padding-left: 0;
1572    padding-right: 0;
1573    max-width: none;
1574    font-size: 0.8em;
1575    line-height: 1.7em;
1576    margin-bottom: 0;
1577    color: rgba(0,0,0,0.5);
1578    padding-top: 40px;
1579    padding-bottom: 48px;
1580  }
1581
1582  .downlevel .footnotes ol {
1583    padding-left: 13px;
1584  }
1585
1586  .downlevel .base-grid,
1587  .downlevel .distill-header,
1588  .downlevel .d-title,
1589  .downlevel .d-abstract,
1590  .downlevel .d-article,
1591  .downlevel .d-appendix,
1592  .downlevel .distill-appendix,
1593  .downlevel .d-byline,
1594  .downlevel .d-footnote-list,
1595  .downlevel .d-citation-list,
1596  .downlevel .distill-footer,
1597  .downlevel .appendix-bottom,
1598  .downlevel .posts-container {
1599    padding-left: 40px;
1600    padding-right: 40px;
1601  }
1602
1603  @media(min-width: 768px) {
1604    .downlevel .base-grid,
1605    .downlevel .distill-header,
1606    .downlevel .d-title,
1607    .downlevel .d-abstract,
1608    .downlevel .d-article,
1609    .downlevel .d-appendix,
1610    .downlevel .distill-appendix,
1611    .downlevel .d-byline,
1612    .downlevel .d-footnote-list,
1613    .downlevel .d-citation-list,
1614    .downlevel .distill-footer,
1615    .downlevel .appendix-bottom,
1616    .downlevel .posts-container {
1617    padding-left: 150px;
1618    padding-right: 150px;
1619    max-width: 900px;
1620  }
1621  }
1622
1623  .downlevel pre code {
1624    display: block;
1625    border-left: 2px solid rgba(0, 0, 0, .1);
1626    padding: 0 0 0 20px;
1627    font-size: 14px;
1628  }
1629
1630  .downlevel code, .downlevel pre {
1631    color: black;
1632    background: none;
1633    font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
1634    text-align: left;
1635    white-space: pre;
1636    word-spacing: normal;
1637    word-break: normal;
1638    word-wrap: normal;
1639    line-height: 1.5;
1640
1641    -moz-tab-size: 4;
1642    -o-tab-size: 4;
1643    tab-size: 4;
1644
1645    -webkit-hyphens: none;
1646    -moz-hyphens: none;
1647    -ms-hyphens: none;
1648    hyphens: none;
1649  }
1650
1651  .downlevel .posts-list .post-preview {
1652    color: inherit;
1653  }
1654
1655
1656
1657  </style>
1658
1659  
1659<script type="application/javascript">
1660
1661  function is_downlevel_browser() {
1662    if (bowser.isUnsupportedBrowser({ msie: "12", msedge: "16"},
1663                                   window.navigator.userAgent)) {
1664      return true;
1665    } else {
1666      return window.load_distill_framework === undefined;
1667    }
1668  }
1669
1670  // show body when load is complete
1671  function on_load_complete() {
1672
1673    // add anchors
1674    if (window.anchors) {
1675      window.anchors.options.placement = 'left';
1676      window.anchors.add('d-article > h2, d-article > h3, d-article > h4, d-article > h5');
1677    }
1678
1679
1680    // set body to visible
1681    document.body.style.visibility = 'visible';
1682
1683    // force redraw for leaflet widgets
1684    if (window.HTMLWidgets) {
1685      var maps = window.HTMLWidgets.findAll(".leaflet");
1686      $.each(maps, function(i, el) {
1687        var map = this.getMap();
1688        map.invalidateSize();
1689        map.eachLayer(function(layer) {
1690          if (layer instanceof L.TileLayer)
1691            layer.redraw();
1692        });
1693      });
1694    }
1695
1696    // trigger 'shown' so htmlwidgets resize
1697    $('d-article').trigger('shown');
1698  }
1699
1700  function init_distill() {
1701
1702    init_common();
1703
1704    // create front matter
1705    var front_matter = $('<d-front-matter></d-front-matter>');
1706    $('#distill-front-matter').wrap(front_matter);
1707
1708    // create d-title
1709    $('.d-title').changeElementType('d-title');
1710
1711    // separator
1712    var separator = '<hr class="section-separator" style="clear: both"/>';
1713    // prepend separator above appendix
1714    $('.d-byline').before(separator);
1715    $('.d-article').before(separator);
1716
1717    // create d-byline
1718    var byline = $('<d-byline></d-byline>');
1719    $('.d-byline').replaceWith(byline);
1720
1721    // create d-article
1722    var article = $('<d-article></d-article>');
1723    $('.d-article').wrap(article).children().unwrap();
1724
1725    // move posts container into article
1726    $('.posts-container').appendTo($('d-article'));
1727
1728    // create d-appendix
1729    $('.d-appendix').changeElementType('d-appendix');
1730
1731    // flag indicating that we have appendix items
1732    var appendix = $('.appendix-bottom').children('h3').length > 0;
1733
1734    // replace footnotes with <d-footnote>
1735    $('.footnote-ref').each(function(i, val) {
1736      appendix = true;
1737      var href = $(this).attr('href');
1738      var id = href.replace('#', '');
1739      var fn = $('#' + id);
1740      var fn_p = $('#' + id + '>p');
1741      fn_p.find('.footnote-back').remove();
1742      var text = fn_p.html();
1743      var dtfn = $('<d-footnote></d-footnote>');
1744      dtfn.html(text);
1745      $(this).replaceWith(dtfn);
1746    });
1747    // remove footnotes
1748    $('.footnotes').remove();
1749
1750    // move refs into #references-listing
1751    $('#references-listing').replaceWith($('#refs'));
1752
1753    $('h1.appendix, h2.appendix').each(function(i, val) {
1754      $(this).changeElementType('h3');
1755    });
1756    $('h3.appendix').each(function(i, val) {
1757      var id = $(this).attr('id');
1758      $('.d-contents a[href="#' + id + '"]').parent().remove();
1759      appendix = true;
1760      $(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('d-appendix'));
1761    });
1762
1763    // show d-appendix if we have appendix content
1764    $("d-appendix").css('display', appendix ? 'grid' : 'none');
1765
1766    // localize layout chunks to just output
1767    $('.layout-chunk').each(function(i, val) {
1768
1769      // capture layout
1770      var layout = $(this).attr('data-layout');
1771
1772      // apply layout to markdown level block elements
1773      var elements = $(this).children().not('details, div.sourceCode, pre, script');
1774      elements.each(function(i, el) {
1775        var layout_div = $('<div class="' + layout + '"></div>');
1776        if (layout_div.hasClass('shaded')) {
1777          var shaded_content = $('<div class="shaded-content"></div>');
1778          $(this).wrap(shaded_content);
1779          $(this).parent().wrap(layout_div);
1780        } else {
1781          $(this).wrap(layout_div);
1782        }
1783      });
1784
1785
1786      // unwrap the layout-chunk div
1787      $(this).children().unwrap();
1788    });
1789
1790    // remove code block used to force  highlighting css
1791    $('.distill-force-highlighting-css').parent().remove();
1792
1793    // remove empty line numbers inserted by pandoc when using a
1794    // custom syntax highlighting theme, except when numbering line
1795    // in code chunk
1796    $('pre:not(.numberLines) code.sourceCode a:empty').remove();
1797
1798    // load distill framework
1799    load_distill_framework();
1800
1801    // wait for window.distillRunlevel == 4 to do post processing
1802    function distill_post_process() {
1803
1804      if (!window.distillRunlevel || window.distillRunlevel < 4)
1805        return;
1806
1807      // hide author/affiliations entirely if we have no authors
1808      var front_matter = JSON.parse($("#distill-front-matter").html());
1809      var have_authors = front_matter.authors && front_matter.authors.length > 0;
1810      if (!have_authors)
1811        $('d-byline').addClass('hidden');
1812
1813      // article with toc class
1814      $('.d-contents').parent().addClass('d-article-with-toc');
1815
1816      // strip links that point to #
1817      $('.authors-affiliations').find('a[href="#"]').removeAttr('href');
1818
1819      // add orcid ids
1820      $('.authors-affiliations').find('.author').each(function(i, el) {
1821        var orcid_id = front_matter.authors[i].orcidID;
1822        var author_name = front_matter.authors[i].author
1823        if (orcid_id) {
1824          var a = $('<a></a>');
1825          a.attr('href', 'https://orcid.org/' + orcid_id);
1826          var img = $('<img></img>');
1827          img.addClass('orcid-id');
1828          img.attr('alt', author_name ? 'ORCID ID for ' + author_name : 'ORCID ID');
1829          img.attr('src','data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMjA4MDI1MjA2ODExOTk0QzkzNTEzRjZEQTg1NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozM0NDOEJGNEZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozM0NDOEJGM0ZGNTcxMUUxODdBOEVCODg2RjdCQ0QwOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZDN0YxMTc0MDcyMDY4MTE5NUZFRDc5MUM2MUUwNEREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU3Q0QyMDgwMjUyMDY4MTE5OTRDOTM1MTNGNkRBODU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+84NovQAAAR1JREFUeNpiZEADy85ZJgCpeCB2QJM6AMQLo4yOL0AWZETSqACk1gOxAQN+cAGIA4EGPQBxmJA0nwdpjjQ8xqArmczw5tMHXAaALDgP1QMxAGqzAAPxQACqh4ER6uf5MBlkm0X4EGayMfMw/Pr7Bd2gRBZogMFBrv01hisv5jLsv9nLAPIOMnjy8RDDyYctyAbFM2EJbRQw+aAWw/LzVgx7b+cwCHKqMhjJFCBLOzAR6+lXX84xnHjYyqAo5IUizkRCwIENQQckGSDGY4TVgAPEaraQr2a4/24bSuoExcJCfAEJihXkWDj3ZAKy9EJGaEo8T0QSxkjSwORsCAuDQCD+QILmD1A9kECEZgxDaEZhICIzGcIyEyOl2RkgwAAhkmC+eAm0TAAAAABJRU5ErkJggg==');
1830          a.append(img);
1831          $(this).append(a);
1832        }
1833      });
1834
1835      // hide elements of author/affiliations grid that have no value
1836      function hide_byline_column(caption) {
1837        $('d-byline').find('h3:contains("' + caption + '")').parent().css('visibility', 'hidden');
1838      }
1839
1840      // affiliations
1841      var have_affiliations = false;
1842      for (var i = 0; i<front_matter.authors.length; ++i) {
1843        var author = front_matter.authors[i];
1844        if (author.affiliation !== "&nbsp;") {
1845          have_affiliations = true;
1846          break;
1847        }
1848      }
1849      if (!have_affiliations)
1850        $('d-byline').find('h3:contains("Affiliations")').css('visibility', 'hidden');
1851
1852      // published date
1853      if (!front_matter.publishedDate)
1854        hide_byline_column("Published");
1855
1856      // document object identifier
1857      var doi = $('d-byline').find('h3:contains("DOI")');
1858      var doi_p = doi.next().empty();
1859      if (!front_matter.doi) {
1860        // if we have a citation and valid citationText then link to that
1861        if ($('#citation').length > 0 && front_matter.citationText) {
1862          doi.html('Citation');
1863          $('<a href="#citation"></a>')
1864            .text(front_matter.citationText)
1865            .appendTo(doi_p);
1866        } else {
1867          hide_byline_column("DOI");
1868        }
1869      } else {
1870        $('<a></a>')
1871           .attr('href', "https://doi.org/" + front_matter.doi)
1872           .html(front_matter.doi)
1873           .appendTo(doi_p);
1874      }
1875
1876       // change plural form of authors/affiliations
1877      if (front_matter.authors.length === 1) {
1878        var grid = $('.authors-affiliations');
1879        grid.children('h3:contains("Authors")').text('Author');
1880        grid.children('h3:contains("Affiliations")').text('Affiliation');
1881      }
1882
1883      // remove d-appendix and d-footnote-list local styles
1884      $('d-appendix > style:first-child').remove();
1885      $('d-footnote-list > style:first-child').remove();
1886
1887      // move appendix-bottom entries to the bottom
1888      $('.appendix-bottom').appendTo('d-appendix').children().unwrap();
1889      $('.appendix-bottom').remove();
1890
1891      // hoverable references
1892      $('span.citation[data-cites]').each(function() {
1893        const citeChild = $(this).children()[0]
1894        // Do not process if @xyz has been used without escaping and without bibliography activated
1895        // https://github.com/rstudio/distill/issues/466
1896        if (citeChild === undefined) return true
1897
1898        if (citeChild.nodeName == "D-FOOTNOTE") {
1899          var fn = citeChild
1900          $(this).html(fn.shadowRoot.querySelector("sup"))
1901          $(this).id = fn.id
1902          fn.remove()
1903        }
1904        var refs = $(this).attr('data-cites').split(" ");
1905        var refHtml = refs.map(function(ref) {
1906          // Could use CSS.escape too here, we insure backward compatibility in navigator
1907          return "<p>" + $('div[id="ref-' + ref + '"]').html() + "</p>";
1908        }).join("\n");
1909        window.tippy(this, {
1910          allowHTML: true,
1911          content: refHtml,
1912          maxWidth: 500,
1913          interactive: true,
1914          interactiveBorder: 10,
1915          theme: 'light-border',
1916          placement: 'bottom-start'
1917        });
1918      });
1919
1920      // fix footnotes in tables (#411)
1921      // replacing broken distill.pub feature
1922      $('table d-footnote').each(function() {
1923        // we replace internal showAtNode methode which is triggered when hovering a footnote
1924        this.hoverBox.showAtNode = function(node) {
1925          // ported from https://github.com/distillpub/template/pull/105/files
1926          calcOffset = function(elem) {
1927              let x = elem.offsetLeft;
1928              let y = elem.offsetTop;
1929              // Traverse upwards until an `absolute` element is found or `elem`
1930              // becomes null.
1931              while (elem = elem.offsetParent && elem.style.position != 'absolute') {
1932                  x += elem.offsetLeft;
1933                  y += elem.offsetTop;
1934              }
1935
1936              return { left: x, top: y };
1937          }
1938          // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop
1939          const bbox = node.getBoundingClientRect();
1940          const offset = calcOffset(node);
1941          this.show([offset.left + bbox.width, offset.top + bbox.height]);
1942        }
1943      })
1944
1945      // clear polling timer
1946      clearInterval(tid);
1947
1948      // show body now that everything is ready
1949      on_load_complete();
1950    }
1951
1952    var tid = setInterval(distill_post_process, 50);
1953    distill_post_process();
1954
1955  }
1956
1957  function init_downlevel() {
1958
1959    init_common();
1960
1961     // insert hr after d-title
1962    $('.d-title').after($('<hr class="section-separator"/>'));
1963
1964    // check if we have authors
1965    var front_matter = JSON.parse($("#distill-front-matter").html());
1966    var have_authors = front_matter.authors && front_matter.authors.length > 0;
1967
1968    // manage byline/border
1969    if (!have_authors)
1970      $('.d-byline').remove();
1971    $('.d-byline').after($('<hr class="section-separator"/>'));
1972    $('.d-byline a').remove();
1973
1974    // remove toc
1975    $('.d-contents').remove();
1976
1977    // move appendix elements
1978    $('h1.appendix, h2.appendix').each(function(i, val) {
1979      $(this).changeElementType('h3');
1980    });
1981    $('h3.appendix').each(function(i, val) {
1982      $(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('.d-appendix'));
1983    });
1984
1985
1986    // inject headers into references and footnotes
1987    var refs_header = $('<h3></h3>');
1988    refs_header.text('References');
1989    $('#refs').prepend(refs_header);
1990
1991    var footnotes_header = $('<h3></h3');
1992    footnotes_header.text('Footnotes');
1993    $('.footnotes').children('hr').first().replaceWith(footnotes_header);
1994
1995    // move appendix-bottom entries to the bottom
1996    $('.appendix-bottom').appendTo('.d-appendix').children().unwrap();
1997    $('.appendix-bottom').remove();
1998
1999    // remove appendix if it's empty
2000    if ($('.d-appendix').children().length === 0)
2001      $('.d-appendix').remove();
2002
2003    // prepend separator above appendix
2004    $('.d-appendix').before($('<hr class="section-separator" style="clear: both"/>'));
2005
2006    // trim code
2007    $('pre>code').each(function(i, val) {
2008      $(this).html($.trim($(this).html()));
2009    });
2010
2011    // move posts-container right before article
2012    $('.posts-container').insertBefore($('.d-article'));
2013
2014    $('body').addClass('downlevel');
2015
2016    on_load_complete();
2017  }
2018
2019
2020  function init_common() {
2021
2022    // jquery plugin to change element types
2023    (function($) {
2024      $.fn.changeElementType = function(newType) {
2025        var attrs = {};
2026
2027        $.each(this[0].attributes, function(idx, attr) {
2028          attrs[attr.nodeName] = attr.nodeValue;
2029        });
2030
2031        this.replaceWith(function() {
2032          return $("<" + newType + "/>", attrs).append($(this).contents());
2033        });
2034      };
2035    })(jQuery);
2036
2037    // prevent underline for linked images
2038    $('a > img').parent().css({'border-bottom' : 'none'});
2039
2040    // mark non-body figures created by knitr chunks as 100% width
2041    $('.layout-chunk').each(function(i, val) {
2042      var figures = $(this).find('img, .html-widget');
2043      // ignore leaflet img layers (#106)
2044      figures = figures.filter(':not(img[class*="leaflet"])')
2045      if ($(this).attr('data-layout') !== "l-body") {
2046        figures.css('width', '100%');
2047      } else {
2048        figures.css('max-width', '100%');
2049        figures.filter("[width]").each(function(i, val) {
2050          var fig = $(this);
2051          fig.css('width', fig.attr('width') + 'px');
2052        });
2053
2054      }
2055    });
2056
2057    // auto-append index.html to post-preview links in file: protocol
2058    // and in rstudio ide preview
2059    $('.post-preview').each(function(i, val) {
2060      if (window.location.protocol === "file:")
2061        $(this).attr('href', $(this).attr('href') + "index.html");
2062    });
2063
2064    // get rid of index.html references in header
2065    if (window.location.protocol !== "file:") {
2066      $('.distill-site-header a[href]').each(function(i,val) {
2067        $(this).attr('href', $(this).attr('href').replace(/^index[.]html/, "./"));
2068      });
2069    }
2070
2071    // add class to pandoc style tables
2072    $('tr.header').parent('thead').parent('table').addClass('pandoc-table');
2073    $('.kable-table').children('table').addClass('pandoc-table');
2074
2075    // add figcaption style to table captions
2076    $('caption').parent('table').addClass("figcaption");
2077
2078    // initialize posts list
2079    if (window.init_posts_list)
2080      window.init_posts_list();
2081
2082    // implmement disqus comment link
2083    $('.disqus-comment-count').click(function() {
2084      window.headroom_prevent_pin = true;
2085      $('#disqus_thread').toggleClass('hidden');
2086      if (!$('#disqus_thread').hasClass('hidden')) {
2087        var offset = $(this).offset();
2088        $(window).resize();
2089        $('html, body').animate({
2090          scrollTop: offset.top - 35
2091        });
2092      }
2093    });
2094  }
2095
2096  document.addEventListener('DOMContentLoaded', function() {
2097    if (is_downlevel_browser())
2098      init_downlevel();
2099    else
2100      window.addEventListener('WebComponentsReady', init_distill);
2101  });
2102
2103  </script>
2103
2104
2105  <style type="text/css">
2106  /* base variables */
2107
2108  /* Edit the CSS properties in this file to create a custom
2109     Distill theme. Only edit values in the right column
2110     for each row; values shown are the CSS defaults.
2111     To return any property to the default,
2112     you may set its value to: unset
2113     All rows must end with a semi-colon.                      */
2114
2115  /* Optional: embed custom fonts here with `@import`          */
2116  /* This must remain at the top of this file.                 */
2117
2118
2119
2120  html {
2121    /*-- Main font sizes --*/
2122    --title-size:      50px;
2123    --body-size:       1.06rem;
2124    --code-size:       14px;
2125    --aside-size:      12px;
2126    --fig-cap-size:    13px;
2127    /*-- Main font colors --*/
2128    --title-color:     #000000;
2129    --header-color:    rgba(0, 0, 0, 0.8);
2130    --body-color:      rgba(0, 0, 0, 0.8);
2131    --aside-color:     rgba(0, 0, 0, 0.6);
2132    --fig-cap-color:   rgba(0, 0, 0, 0.6);
2133    /*-- Specify custom fonts ~~~ must be imported above   --*/
2134    --heading-font:    sans-serif;
2135    --mono-font:       monospace;
2136    --body-font:       sans-serif;
2137    --navbar-font:     sans-serif;  /* websites + blogs only */
2138  }
2139
2140  /*-- ARTICLE METADATA --*/
2141  d-byline {
2142    --heading-size:    0.6rem;
2143    --heading-color:   rgba(0, 0, 0, 0.5);
2144    --body-size:       0.8rem;
2145    --body-color:      rgba(0, 0, 0, 0.8);
2146  }
2147
2148  /*-- ARTICLE TABLE OF CONTENTS --*/
2149  .d-contents {
2150    --heading-size:    18px;
2151    --contents-size:   13px;
2152  }
2153
2154  /*-- ARTICLE APPENDIX --*/
2155  d-appendix {
2156    --heading-size:    15px;
2157    --heading-color:   rgba(0, 0, 0, 0.65);
2158    --text-size:       0.8em;
2159    --text-color:      rgba(0, 0, 0, 0.5);
2160  }
2161
2162  /*-- WEBSITE HEADER + FOOTER --*/
2163  /* These properties only apply to Distill sites and blogs  */
2164
2165  .distill-site-header {
2166    --title-size:       18px;
2167    --text-color:       rgba(255, 255, 255, 0.8);
2168    --text-size:        15px;
2169    --hover-color:      white;
2170    --bkgd-color:       #0F2E3D;
2171  }
2172
2173  .distill-site-footer {
2174    --text-color:       rgba(255, 255, 255, 0.8);
2175    --text-size:        15px;
2176    --hover-color:      white;
2177    --bkgd-color:       #0F2E3D;
2178  }
2179
2180  /*-- Additional custom styles --*/
2181  /* Add any additional CSS rules below                      */
2182  </style>
2183  <style type="text/css">@import url('https://fonts.googleapis.com/css2?family=Annie+Use+Your+Telescope&family=Fuzzy+Bubbles&family=Shizuru&display=swap');
2184
2185  /* Edit the CSS properties in this file to create a custom
2186     Distill theme. Only edit values in the right column
2187     for each row; values shown are the CSS defaults.
2188     To return any property to the default,
2189     you may set its value to: unset
2190     All rows must end with a semi-colon.                      */
2191
2192  /* Optional: embed custom fonts here with `@import`          */
2193  /* This must remain at the top of this file.                 */
2194
2195
2196    
2197    html {
2198      /*-- Main font sizes --*/
2199      --title-size:      50px;
2200      --text-size:       20px;
2201    /*  --body-size:       1.06rem; */
2202      --code-size:       14px;
2203      --aside-size:      12px;
2204      --fig-cap-size:    13px;
2205      /*-- Main font colors --*/
2206      --title-color:     white;
2207      --header-color:    rgba(0, 0, 0, 0.8);
2208      --body-color:      rgba(0, 0, 0, 0.8);
2209      --aside-color:     rgba(0, 0, 0, 0.6);
2210      --fig-cap-color:   rgba(0, 0, 0, 0.6);
2211      /*-- Specify custom fonts ~~~ must be imported above   --*/
2212      --heading-font:    Atma;
2213      --mono-font:       monospace;
2214      --body-font:       sans-serif;
2215      --navbar-font:     "Annie Use Your Telescope", serif;
2216    }
2217
2218    .distill-site-header {
2219      --title-size:       50px;
2220      --text-color:       #176940;
2221      --text-size:        22px;
2222      --hover-color:      black;
2223      --bkgd-color:       #eeeeee;
2224    }
2225
2226  /*-- Additional custom styles --*/
2227    /* Add any additional CSS rules below                      */
2228    
2229  .distill-site-nav  { /* shdow line under banner */
2230    border-bottom: 2px solid #DECF40;
2231    -webkit-box-shadow: 1px 1px 18px #4d4d4d;
2232    -moz-box-shadow: 1px 1px 18px #4d4d4d;
2233    box-shadow: 1px 1px 18px #4d4d4d;
2234  }
2235
2236  .distill-site-header .logo img { /* logo size */
2237     max-height: 50px;
2238     width: auto;
2239     margin-top: 10px;
2240  }
2241
2242
2243  .posts-list > h1 {
2244    color: black!important; /* prints "Test Blog" */
2245  } 
2246
2247
2248  p a { /* underlines links */
2249    text-decoration: none;
2250    color: black;
2251    border-bottom: 3px solid #9ae28f;
2252    box-shadow: inset 0 -4px 0 #9ae28f;
2253    background: transparent;
2254    transition: background 150ms ease;
2255    font-style: italic;
2256    font-family: menu;
2257    font-stretch: extra-expanded;
2258  }
2259
2260  p a:hover { /* makes links go green on hover */
2261    text-decoration: none;
2262    --bg-opacity: 1;
2263    background-color: #9ae28f;
2264    background-color: rgba(154, 226, 143, var(--bg-opacity));
2265  }
2266
2267
2268  .thumbnail {
2269      padding: 0px!important;
2270      margin: 0px!important;
2271      max-width: 25%!important;
2272      height: 10%!important;
2273      vertical-align: text-top!important;
2274  }</style>
2275  <style type="text/css">
2276  /* base style */
2277
2278  /* FONT FAMILIES */
2279
2280  :root {
2281    --heading-default: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
2282    --mono-default: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
2283    --body-default: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
2284  }
2285
2286  body,
2287  .posts-list .post-preview p,
2288  .posts-list .description p {
2289    font-family: var(--body-font), var(--body-default);
2290  }
2291
2292  h1, h2, h3, h4, h5, h6,
2293  .posts-list .post-preview h2,
2294  .posts-list .description h2 {
2295    font-family: var(--heading-font), var(--heading-default);
2296  }
2297
2298  d-article div.sourceCode code,
2299  d-article pre code {
2300    font-family: var(--mono-font), var(--mono-default);
2301  }
2302
2303
2304  /*-- TITLE --*/
2305  d-title h1,
2306  .posts-list > h1 {
2307    color: var(--title-color, black);
2308  }
2309
2310  d-title h1 {
2311    font-size: var(--title-size, 50px);
2312  }
2313
2314  /*-- HEADERS --*/
2315  d-article h1,
2316  d-article h2,
2317  d-article h3,
2318  d-article h4,
2319  d-article h5,
2320  d-article h6 {
2321    color: var(--header-color, rgba(0, 0, 0, 0.8));
2322  }
2323
2324  /*-- BODY --*/
2325  d-article > p,  /* only text inside of <p> tags */
2326  d-article > ul, /* lists */
2327  d-article > ol {
2328    color: var(--body-color, rgba(0, 0, 0, 0.8));
2329    font-size: var(--body-size, 1.06rem);
2330  }
2331
2332
2333  /*-- CODE --*/
2334  d-article div.sourceCode code,
2335  d-article pre code {
2336    font-size: var(--code-size, 14px);
2337  }
2338
2339  /*-- ASIDE --*/
2340  d-article aside {
2341    font-size: var(--aside-size, 12px);
2342    color: var(--aside-color, rgba(0, 0, 0, 0.6));
2343  }
2344
2345  /*-- FIGURE CAPTIONS --*/
2346  figure .caption,
2347  figure figcaption,
2348  .figure .caption {
2349    font-size: var(--fig-cap-size, 13px);
2350    color: var(--fig-cap-color, rgba(0, 0, 0, 0.6));
2351  }
2352
2353  /*-- METADATA --*/
2354  d-byline h3 {
2355    font-size: var(--heading-size, 0.6rem);
2356    color: var(--heading-color, rgba(0, 0, 0, 0.5));
2357  }
2358
2359  d-byline {
2360    font-size: var(--body-size, 0.8rem);
2361    color: var(--body-color, rgba(0, 0, 0, 0.8));
2362  }
2363
2364  d-byline a,
2365  d-article d-byline a {
2366    color: var(--body-color, rgba(0, 0, 0, 0.8));
2367  }
2368
2369  /*-- TABLE OF CONTENTS --*/
2370  .d-contents nav h3 {
2371    font-size: var(--heading-size, 18px);
2372  }
2373
2374  .d-contents nav a {
2375    font-size: var(--contents-size, 13px);
2376  }
2377
2378  /*-- APPENDIX --*/
2379  d-appendix h3 {
2380    font-size: var(--heading-size, 15px);
2381    color: var(--heading-color, rgba(0, 0, 0, 0.65));
2382  }
2383
2384  d-appendix {
2385    font-size: var(--text-size, 0.8em);
2386    color: var(--text-color, rgba(0, 0, 0, 0.5));
2387  }
2388
2389  d-appendix d-footnote-list a.footnote-backlink {
2390    color: var(--text-color, rgba(0, 0, 0, 0.5));
2391  }
2392
2393  /*-- WEBSITE HEADER + FOOTER --*/
2394  .distill-site-header .title {
2395    font-size: var(--title-size, 18px);
2396    font-family: var(--navbar-font), var(--heading-default);
2397  }
2398
2399  .distill-site-header a,
2400  .nav-dropdown .nav-dropbtn {
2401    font-family: var(--navbar-font), var(--heading-default);
2402  }
2403
2404  .nav-dropdown .nav-dropbtn {
2405    color: var(--text-color, rgba(255, 255, 255, 0.8));
2406    font-size: var(--text-size, 15px);
2407  }
2408
2409  .distill-site-header a:hover,
2410  .nav-dropdown:hover .nav-dropbtn {
2411    color: var(--hover-color, white);
2412  }
2413
2414  .distill-site-header {
2415    font-size: var(--text-size, 15px);
2416    color: var(--text-color, rgba(255, 255, 255, 0.8));
2417    background-color: var(--bkgd-color, #0F2E3D);
2418  }
2419
2420  .distill-site-footer {
2421    font-size: var(--text-size, 15px);
2422    color: var(--text-color, rgba(255, 255, 255, 0.8));
2423    background-color: var(--bkgd-color, #0F2E3D);
2424  }
2425
2426  .distill-site-footer a:hover {
2427    color: var(--hover-color, white);
2428  }</style>
2429  <!--/radix_placeholder_distill-->
2430  
2430<script src="site_libs/header-attrs-2.29/header-attrs.js"></script>
2430
2431  
2431<script src="site_libs/popper-2.6.0/popper.min.js"></script>
2431
2432  <link href="site_libs/tippy-6.2.7/tippy.css" rel="stylesheet" />
2433  <link href="site_libs/tippy-6.2.7/tippy-light-border.css" rel="stylesheet" />
2434  
2434<script src="site_libs/tippy-6.2.7/tippy.umd.min.js"></script>
2434
2435  
2435<script src="site_libs/anchor-4.2.2/anchor.min.js"></script>
2435
2436  
2436<script src="site_libs/bowser-1.9.3/bowser.min.js"></script>
2436
2437  
2437<script src="site_libs/webcomponents-2.0.0/webcomponents.js"></script>
2437
2438  
2438<script src="site_libs/distill-2.2.21/template.v2.js"></script>
2438
2439  <!--radix_placeholder_site_in_header-->
2440  <style type="text/css">
2441  @import url('https://fonts.googleapis.com/css2?family=Annie+Use+Your+Telescope&family=Fuzzy+Bubbles&family=Shizuru&display=swap');
2442
2443  /* Edit the CSS properties in this file to create a custom
2444     Distill theme. Only edit values in the right column
2445     for each row; values shown are the CSS defaults.
2446     To return any property to the default,
2447     you may set its value to: unset
2448     All rows must end with a semi-colon.                      */
2449
2450  /* Optional: embed custom fonts here with `@import`          */
2451  /* This must remain at the top of this file.                 */
2452
2453
2454    
2455    html {
2456      /*-- Main font sizes --*/
2457      --title-size:      50px;
2458      --text-size:       20px;
2459    /*  --body-size:       1.06rem; */
2460      --code-size:       14px;
2461      --aside-size:      12px;
2462      --fig-cap-size:    13px;
2463      /*-- Main font colors --*/
2464      --title-color:     white;
2465      --header-color:    rgba(0, 0, 0, 0.8);
2466      --body-color:      rgba(0, 0, 0, 0.8);
2467      --aside-color:     rgba(0, 0, 0, 0.6);
2468      --fig-cap-color:   rgba(0, 0, 0, 0.6);
2469      /*-- Specify custom fonts ~~~ must be imported above   --*/
2470      --heading-font:    Atma;
2471      --mono-font:       monospace;
2472      --body-font:       sans-serif;
2473      --navbar-font:     "Annie Use Your Telescope", serif;
2474    }
2475
2476    .distill-site-header {
2477      --title-size:       50px;
2478      --text-color:       #176940;
2479      --text-size:        22px;
2480      --hover-color:      black;
2481      --bkgd-color:       #eeeeee;
2482    }
2483
2484  /*-- Additional custom styles --*/
2485    /* Add any additional CSS rules below                      */
2486    
2487  .distill-site-nav  { /* shdow line under banner */
2488    border-bottom: 2px solid #DECF40;
2489    -webkit-box-shadow: 1px 1px 18px #4d4d4d;
2490    -moz-box-shadow: 1px 1px 18px #4d4d4d;
2491    box-shadow: 1px 1px 18px #4d4d4d;
2492  }
2493
2494  .distill-site-header .logo img { /* logo size */
2495     max-height: 50px;
2496     width: auto;
2497     margin-top: 10px;
2498  }
2499
2500
2501  .posts-list > h1 {
2502    color: black!important; /* prints "Test Blog" */
2503  } 
2504
2505
2506  p a { /* underlines links */
2507    text-decoration: none;
2508    color: black;
2509    border-bottom: 3px solid #9ae28f;
2510    box-shadow: inset 0 -4px 0 #9ae28f;
2511    background: transparent;
2512    transition: background 150ms ease;
2513    font-style: italic;
2514    font-family: menu;
2515    font-stretch: extra-expanded;
2516  }
2517
2518  p a:hover { /* makes links go green on hover */
2519    text-decoration: none;
2520    --bg-opacity: 1;
2521    background-color: #9ae28f;
2522    background-color: rgba(154, 226, 143, var(--bg-opacity));
2523  }
2524
2525
2526  .thumbnail {
2527      padding: 0px!important;
2528      margin: 0px!important;
2529      max-width: 25%!important;
2530      height: 10%!important;
2531      vertical-align: text-top!important;
2532  }
2533  </style>
2534  <!--/radix_placeholder_site_in_header-->
2535
2536  <link rel="stylesheet" href="theme.css" type="text/css"/>
2537
2538</head>
2539
2540<body class="layout-listing">
2541
2542<!--radix_placeholder_front_matter-->
2543
2544<script id="distill-front-matter" type="text/json">
2545{"title":"Projects","description":"Some of other stuff I'm working on right now, or in the recent past","authors":[]}
2546</script>
2546
2547
2548<!--/radix_placeholder_front_matter-->
2549<!--radix_placeholder_navigation_before_body-->
2550<header class="header header--fixed" role="banner">
2551<nav class="distill-site-nav distill-site-header">
2552<div class="nav-left">
2553<a class="logo" href="https://www.fizzics.ie/">
2554<img src="images/atlantic.png" alt="Logo"/>
2555</a>
2556<a class='title' href='/'>Euge</a>
2557<a href='/'>Home</a>
2558<a href='/projects'>Projects</a>
2559<a href='/teaching'>Teaching</a>
2560<a href='/talks'>Talks</a>
2561<a href='/publications'>Publications</a>
2562<a href='/resources'>Resources</a>
2563<a href='/about'>About</a>
2564<input id="distill-search" class="nav-search hidden" type="text" placeholder="Search..."/>
2565</div>
2566<div class="nav-right">
2567<a href="https://github.com/eugene100hickey">
2568<i class="fab fa-github" aria-hidden="true"></i>
2569</a>
2570<a href="https://mastodon.social/@eugene100hickey">
2571<i class="fab fa-mastodon" aria-hidden="true"></i>
2572</a>
2573<a href="https://www.linkedin.com/in/eugene100hickey/">
2574<i class="fab fa-linkedin" aria-hidden="true"></i>
2575</a>
2576<a href="https://orcid.org/my-orcid?orcid=0000-0001-9813-9323">
2577<i class="fab fa-orcid" aria-hidden="true"></i>
2578</a>
2579<a href="blog.xml">
2580<i class="fa fa-rss" aria-hidden="true"></i>
2581</a>
2582<a href="javascript:void(0);" class="nav-toggle">&#9776;</a>
2583</div>
2584</nav>
2585</header>
2586<!--/radix_placeholder_navigation_before_body-->
2587<!--radix_placeholder_site_before_body-->
2588<!--/radix_placeholder_site_before_body-->
2589<!--radix_placeholder_article_listing-->
2590
2591
2592<script type="application/javascript">
2593
2594function init_posts_list() {
2595
2596  function load_image(img) {
2597    var src = $(img).attr('data-src');
2598    if (src) {
2599      $(img).attr('src', src);
2600      $(img).on("load", function() {
2601        img.removeAttribute('data-src');
2602      });
2603    }
2604  }
2605
2606  function set_posts_visible(posts, visible) {
2607    if (visible) {
2608
2609      // show bottom border by default
2610      $(posts).removeClass('post-preview-last');
2611
2612      // apply limits if need be
2613      var max_posts = 25;
2614      var apply_limits = $('.posts-container').hasClass('posts-apply-limit');
2615      if (apply_limits && posts.length > max_posts) {
2616        posts = $(posts).slice(0, max_posts);
2617      } else {
2618        $('.posts-more a').addClass('hidden');
2619      }
2620
2621      // apply last style
2622      $(posts.slice(-1)[0]).addClass('post-preview-last');
2623
2624      $(posts).removeClass('hidden');
2625      $(posts).find('img[data-src]').each(function(i, img) {
2626        load_image(img);
2627      });
2628    } else {
2629      $(posts).addClass('hidden');
2630    }
2631  }
2632
2633  function apply_hash_filter() {
2634
2635    // clear active state
2636    $('.categories .active').removeClass('active');
2637
2638    // mark all posts invisible to start
2639    set_posts_visible($('.posts-list').children('a'), false);
2640
2641    // if we have a hash filter
2642    if (window.location.hash && window.location.hash.startsWith("#category:")) {
2643
2644      // mark posts that match the category visible
2645      var page_category = window.location.hash.replace(/^#category:/, "");
2646      page_category = decodeURIComponent(page_category)
2647      var posts = $('.post-metadata').map(function(idx, script) {
2648        var metadata = $.parseJSON($(script).html());
2649        var post = null;
2650        $.each(metadata.categories, function(idx, category) {
2651          category = category.replace(/ /g,"_");
2652          if ((page_category || '').toLowerCase() === "articles" || category === page_category) {
2653            post = $(script).parent().get();
2654            return false;
2655          }
2656        });
2657        return post;
2658      });
2659      set_posts_visible(posts, true);
2660
2661      // mark the hash active
2662      $('.categories li>a[href="' + decodeURIComponent(window.location.hash) + '"]').addClass('active');
2663
2664      // update the list_caption
2665      var list_caption = $('.posts-list-caption');
2666      var caption = (page_category || '').toLowerCase() === "articles"
2667        ? list_caption.attr('data-caption')
2668        : ('Category: ' + page_category.replace(/_/g," "));
2669      list_caption.text(caption);
2670
2671    } else {
2672
2673      // no hash filter, make all posts visible (subject to max display)
2674      set_posts_visible($('.posts-list').children(), true);
2675
2676      // reset list caption
2677      var list_caption = $('.posts-list-caption');
2678      list_caption.text(list_caption.attr('data-caption'));
2679
2680
2681    }
2682  }
2683
2684  // more articles
2685  function apply_post_limits(apply) {
2686    if (apply) {
2687      $('.posts-container').addClass('posts-apply-limit');
2688      $('.posts-more a').removeClass('hidden');
2689    } else {
2690      $('.posts-container').removeClass('posts-apply-limit');
2691      $('.posts-more a').addClass('hidden');
2692    }
2693  }
2694
2695  // click handling for tags
2696  $('.dt-tag').click(function(ev) {
2697    window.location.hash = '#category:' + $(this).text().replace(/ /g, "_");
2698    return false;
2699  })
2700
2701  // hash filter handling
2702  apply_hash_filter();
2703  $(window).on('hashchange',function() {
2704    apply_post_limits(true);
2705    apply_hash_filter();
2706  });
2707
2708  // more articles link
2709  $('.posts-more a').click(function(e) {
2710    e.preventDefault();
2711    apply_post_limits(false);
2712    apply_hash_filter();
2713    return false;
2714  });
2715
2716}
2717
2718</script>
2718
2719
2720
2721
2722<div class="posts-container posts-with-sidebar posts-apply-limit l-screen-inset">
2723<div class="posts-list">
2724<h1 class="posts-list-caption" data-caption="Projects">Projects</h1>
2725<a href="projects/2021-09-04-THE/" class="post-preview">
2726<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2726
2727<div class="metadata">
2728<div class="publishedDate">Sept. 4, 2021</div>
2729</div>
2730<div class="thumbnail">
2731<img src="projects/2021-09-04-THE/SDG7/img/rankings-map.png"/>
2732</div>
2733<div class="description">
2734<h2>University Rankings</h2>
2735<div class="dt-tags">
2736<div class="dt-tag">R</div>
2737<div class="dt-tag">Academia</div>
2738</div>
2739<p>Looking at the status of TU Dublin within the university rankings world</p>
2740</div>
2741</a>
2742<a href="projects/2021-04-04-DifTU/" class="post-preview">
2743<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2743
2744<div class="metadata">
2745<div class="publishedDate">April 4, 2021</div>
2746</div>
2747<div class="thumbnail">
2748<img src="projects/2021-04-04-DifTU/img/Q24.png"/>
2749</div>
2750<div class="description">
2751<h2>Data Insights for TU Dublin (DifTU)</h2>
2752<div class="dt-tags">
2753<div class="dt-tag">R</div>
2754<div class="dt-tag">Academia</div>
2755</div>
2756<p>Looking at how the COVID pandemic has impacted the use of digital technologies in TU Dublin</p>
2757</div>
2758</a>
2759<a href="projects/2020-03-20-RExams/" class="post-preview">
2760<script class="post-metadata" type="text/json">{"categories":["R","Academia"]}</script>
2760
2761<div class="metadata">
2762<div class="publishedDate">March 25, 2020</div>
2763</div>
2764<div class="thumbnail">
2765<img src="projects/2020-03-20-RExams/img/hex.png"/>
2766</div>
2767<div class="description">
2768<h2>R/Exams</h2>
2769<div class="dt-tags">
2770<div class="dt-tag">R</div>
2771<div class="dt-tag">Academia</div>
2772</div>
2773<p>Using R to improve the quality of online assessments</p>
2774</div>
2775</a>
2776</div>
2777<div class="posts-sidebar">
2778<div class="sidebar-section categories">
2779<h3>Categories</h3>
2780<ul>
2781<li>
2782<a href="#category:Articles">Articles</a>
2783<span class="category-count">(3)</span>
2784</li>
2785<li>
2786<a href="#category:Academia">Academia</a>
2787<span class="category-count">(3)</span>
2788</li>
2789<li>
2790<a href="#category:R">R</a>
2791<span class="category-count">(3)</span>
2792</li>
2793</ul>
2794</div>
2795</div>
2796<div class="posts-more">
2797<a href="#">More articles &raquo;</a>
2798</div>
2799</div>
2800<!--/radix_placeholder_article_listing-->
2801
2802<div class="d-title">
2803<h1>Projects</h1>
2804
2805<!--radix_placeholder_categories-->
2806<!--/radix_placeholder_categories-->
2807<p><p>Some of other stuff I’m working on right now, or in the recent past</p></p>
2808</div>
2809
2810
2811<div class="d-article">
2812<div class="layout-chunk" data-layout="l-body">
2813<style type="text/css">
2814.thumbnail {
2815  border: 1px solid black;
2816}
2817</style>
2818</div>
2819<div class="sourceCode" id="cb1"><pre class="sourceCode r distill-force-highlighting-css"><code class="sourceCode r"></code></pre></div>
2820<!--radix_placeholder_article_footer-->
2821<!--/radix_placeholder_article_footer-->
2822</div>
2823
2824<div class="d-appendix">
2825</div>
2826
2827
2828<!--radix_placeholder_site_after_body-->
2829<!--/radix_placeholder_site_after_body-->
2830<!--radix_placeholder_appendices-->
2831<div class="appendix-bottom">
2832<h3 id="updates-and-corrections">Corrections</h3>
2833<p>If you see mistakes or want to suggest changes, please <a href="https://github.com/eugene100hickey/fizzics/issues/new">create an issue</a> on the source repository.</p>
2834<h3 id="reuse">Reuse</h3>
2835<p>Text and figures are licensed under Creative Commons Attribution <a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>. Source code is available at <a href="https://github.com/eugene100hickey/fizzics">https://github.com/eugene100hickey/fizzics</a>, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".</p>
2836</div>
2837<!--/radix_placeholder_appendices-->
2838<!--radix_placeholder_navigation_after_body-->
2839<!--/radix_placeholder_navigation_after_body-->
2840
2841</body>
2842
2843</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.