| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 | <head>  <meta charset="utf-8" />  <meta name="viewport" content="width=device-width, initial-scale=1" />  <meta http-equiv="X-UA-Compatible" content="IE=edge" />  {{ $is_sponsor := site.Params.i_am_a_sponsor | default false }}  {{ $hide_generator := site.Params.power_ups.hide_generator | default false }}  {{ if not (and $is_sponsor $hide_generator) }}    <meta name="generator" content="Wowchemy {{ site.Data.wowchemy.version }} for Hugo" />  {{ end }}  {{ if site.Params.marketing.google_optimize | and hugo.IsProduction }}    <script src="https://www.googleoptimize.com/optimize.js?id={{ site.Params.marketing.google_optimize }}"></script>  {{- end -}}  {{ with site.Params.marketing.google_site_verification }}    <meta name="google-site-verification" content="{{ . }}" />  {{- end -}}  {{ with site.Params.marketing.baidu_site_verification }}    <meta name="baidu-site-verification" content="{{ . }}" />  {{- end -}}  {{ $scr := .Scratch }}  {{ $media_dir := site.Params.media_dir | default "media" }}  {{ $scr.Set "media_dir" $media_dir }}  {{/* Attempt to load superuser. */}}  {{ $superuser_name := "" }}  {{ $superuser_username := "" }}  {{ $superuser_role := "" }}  {{ range first 1 (where (where site.Pages "Section" "authors") "Params.superuser" true) }}    {{ $superuser_name = .Title }}    {{ $superuser_username = path.Base (path.Split .Path).Dir }}    {{ $superuser_role = .Params.role }}  {{ end }}  {{ $scr.Set "superuser_username" $superuser_username }}{{/* Set superuser globally for page_author.html. */}}  {{ with $superuser_name }}<meta name="author" content="{{ . }}" />{{ end }}  {{/* Generate page description. */}}  {{ $desc := "" }}  {{ if .Params.summary }}    {{ $desc = .Params.summary }}  {{ else if .Params.abstract }}    {{ $desc = .Params.abstract }}  {{ else if .IsPage }}    {{ $desc = .Summary }}  {{ else if site.Params.description }}    {{ $desc = site.Params.description }}  {{ else }}    {{ $desc = $superuser_role }}  {{ end }}  <meta name="description" content="{{ $desc }}" />  {{ range .Translations }}    <link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}" />  {{ end }}  <link rel="alternate" hreflang="{{ site.LanguageCode | default "en-us" }}" href="{{ .Permalink }}" />  {{ partial "functions/parse_theme" . }}  {{/* Pre-connect to Google Fonts if the site's Font Theme uses them. */}}  {{ with ($scr.Get "google_fonts") }}    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />  {{ end }}  {{ $css := site.Data.assets.css }}  {{ $js := site.Data.assets.js }}  {{ if ne ($scr.Get "primary") "#fff" }}    <meta name="theme-color" content="{{ $scr.Get "primary" }}" />  {{ end }}  {{/* Config LaTeX math rendering. */}}  {{ if or .Params.math site.Params.math }}    {{ $mathjax_config := resources.Get "js/mathjax-config.js" }}    <script src="{{ $mathjax_config.RelPermalink }}"></script>  {{ end }}  {{/* Attempt to load local vendor CSS, otherwise load from CDN. */}}  {{ $scr.Set "vendor_css_filename" "main.min.css" }}  {{ $scr.Set "vendor_js_filename" "main.min.js" }}  {{ if and (fileExists (printf "static/css/vendor/%s" ($scr.Get "vendor_css_filename"))) (fileExists (printf "static/js/vendor/%s" ($scr.Get "vendor_js_filename"))) }}    {{ $scr.Set "use_cdn" 0 }}    <link rel="stylesheet" href="{{ printf "/css/vendor/%s" ($scr.Get "vendor_css_filename") | relURL }}" />  {{ else }}    {{ $scr.Set "use_cdn" 1 }}    {{ if site.Params.icon.pack.ai }}      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\">" (printf $css.academicons.url $css.academicons.version) $css.academicons.sri | safeHTML }}    {{ end }}    {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\">" (printf $css.fontAwesome.url $css.fontAwesome.version) $css.fontAwesome.sri | safeHTML }}    {{/* Workaround `.HasShortcode "gallery"` detection issue on `home/` WidgetPage v1 */}}    {{ if .HasShortcode "gallery" | or (and .IsHome (site.Params.require_fancybox | default true)) }}      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" media=\"print\" onload=\"this.media='all'\">" (printf $css.fancybox.url $css.fancybox.version) $css.fancybox.sri | safeHTML }}    {{ end }}    {{/* Default to disabling highlighting, but allow the user to override it in .Params or site.Params.         Use $scr to store "highlight_enabled", so that we can read it again in footer.html. */}}    {{ $scr.Set "highlight_enabled" false }}    {{ if isset .Params "highlight" }}      {{ $scr.Set "highlight_enabled" .Params.highlight }}    {{ else if isset site.Params "highlight" }}      {{ $scr.Set "highlight_enabled" site.Params.highlight }}    {{ end }}    {{ if ($scr.Get "highlight_enabled") }}      {{ $v := $css.highlight.version }}      {{ with site.Params.highlight_style }}        {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-light\" media=\"print\" onload=\"this.media='all'\">" (printf $css.highlight.url $css.highlight.version .) | safeHTML }}        {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-dark\" media=\"print\" onload=\"this.media='all'\" disabled>" (printf $css.highlight.url $css.highlight.version .) | safeHTML }}      {{ else }}        {{ if eq ($scr.Get "light") true }}          {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-light\" media=\"print\" onload=\"this.media='all'\">" (printf $css.highlight.url $css.highlight.version "github") | safeHTML }}          {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-dark\" media=\"print\" onload=\"this.media='all'\" disabled>" (printf $css.highlight.url $css.highlight.version "dracula") | safeHTML }}        {{ else }}          {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-light\" media=\"print\" onload=\"this.media='all'\" disabled>" (printf $css.highlight.url $css.highlight.version "github") | safeHTML }}          {{ printf "<link rel=\"stylesheet\" href=\"%s\" crossorigin=\"anonymous\" title=\"hl-dark\" media=\"print\" onload=\"this.media='all'\">" (printf $css.highlight.url $css.highlight.version "dracula") | safeHTML }}        {{ end }}      {{ end }}    {{ end }}    {{/* Maps CSS. */}}    {{ $map_provider := lower site.Params.map.provider }}    {{ if in (slice "mapnik" "mapbox") $map_provider }}      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" media=\"print\" onload=\"this.media='all'\">" (printf $css.leaflet.url $css.leaflet.version) $css.leaflet.sri | safeHTML }}    {{ end }}    {{ if eq (lower site.Params.search.provider) "algolia" }}      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\">" (printf $css.instantsearch.url $css.instantsearch.version) $css.instantsearch.sri | safeHTML }}      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\">" (printf $css.instantsearchTheme.url $css.instantsearchTheme.version) $css.instantsearchTheme.sri | safeHTML }}    {{ end }}    {{/* Load async scripts. */}}    {{ range $k, $v := site.Data.assets.js }}      {{/* TODO: investigate why `where ... "async" true` does not work. */}}      {{ $load := $v.async }}      {{/* Only load MathJax if required. */}}      {{ if (eq $k "mathJax") | and (not (or $.Params.math site.Params.math)) }}        {{ $load = false }}      {{ end }}      {{ if $load }}        {{ printf "<script src=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" async></script>" (printf $v.url $v.version) $v.sri | safeHTML }}      {{ end }}    {{ end }}  {{ end }}  {{/* Load Google Fonts if the site's Font Theme uses them. */}}  {{/* Note: we cannot use SRI with Google Fonts because the CSS is dynamically generated according to the user agent. */}}  {{ with ($scr.Get "google_fonts") }}    {{ if hasPrefix . "family=" }}      {{/* If `google_fonts` starts with "family=", use API v2 (https://developers.google.com/fonts/docs/css2) */}}      <link rel="preload" as="style" {{ printf "href=\"https://fonts.googleapis.com/css2?%s&display=swap\"" . | safeHTMLAttr }}>      <link rel="stylesheet" {{ printf "href=\"https://fonts.googleapis.com/css2?%s&display=swap\"" . | safeHTMLAttr }} media="print" onload="this.media='all'">    {{ else }}      {{/* Otherwise, use API v1 */}}      {{/* Hugo's htmlEscape cannot escape "|" in Google Font URIs so we implement our own escape functionality. */}}      <link rel="stylesheet" {{ printf "href=\"https://fonts.googleapis.com/css?family=%s&display=swap\"" . | replaceRE "\\|" "%7C" | safeHTMLAttr }}>      {{ warnf "There is a new version of Google Fonts. Learn how to upgrade your font pack at https://wowchemy.com/docs/customization/#custom-font" }}    {{ end }}  {{ end }}  {{ $license := printf "/*! Wowchemy v%s | https://wowchemy.com/ */\n" site.Data.wowchemy.version }}  {{ $license := $license | printf "%s/*! Copyright 2016-present George Cushen (https://georgecushen.com/) */\n" }}  {{ $license := $license | printf "%s/*! License: https://github.com/wowchemy/wowchemy-hugo-modules/blob/main/LICENSE.md */\n" }}  {{ $css_bundle_head := $license | resources.FromString "css/bundle-head.css" }}  {{ $css_options := dict "targetPath" "css/wowchemy.css" }}  {{- if hugo.IsProduction -}}    {{- $css_options = merge $css_options (dict "outputStyle" "compressed") -}}  {{- end -}}  {{ $sass_template := resources.Get "scss/main.scss" }}  {{ $style := $sass_template | resources.ExecuteAsTemplate "main_parsed.scss" . | toCSS $css_options }}  {{- if hugo.IsProduction -}}    {{- $style = $style | minify -}}  {{- end -}}  {{ $style := slice $css_bundle_head $style | resources.Concat "css/wowchemy.css" }}  {{- if eq (getenv "WC_POST_CSS") "true" -}}    {{- $style = $style | postCSS -}}  {{- end -}}  {{- if hugo.IsProduction -}}    {{- $style = $style | fingerprint "md5" -}}  {{- end -}}  <link rel="stylesheet" href="{{ $style.RelPermalink }}" />  {{ partial "marketing/google_analytics" . }}  {{ partial "marketing/google_tag_manager" . }}  {{ partial "marketing/microsoft_clarity" . }}  {{ partial "marketing/baidu_tongji" . }}  {{/* Netlify Identity integration. */}}  {{ $use_cms := templates.Exists "wowchemycms/single.wowchemycms_config.yml" | default (site.Params.cms.netlify_cms | default false) }}  {{ if .IsHome | and $use_cms }}    <script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>  {{ end }}  {{ with .OutputFormats.Get "RSS" }}    <link rel="alternate" href="{{ .RelPermalink }}" type="application/rss+xml" title="{{ site.Title }}" />  {{ end }}  {{ if site.Home.OutputFormats.Get "WebAppManifest" }}    <link rel="manifest" href="{{ "index.webmanifest" | relLangURL }}" />  {{ end }}  <link rel="icon" type="image/png" href="{{ (partial "functions/get_icon" 32).RelPermalink }}" />  <link rel="apple-touch-icon" type="image/png" href="{{ (partial "functions/get_icon" 180).RelPermalink }}" />  <link rel="canonical" href="{{ .Permalink }}" />  {{/* Get page image for sharing. */}}  {{ $sharing_image := resources.GetMatch (path.Join "media" "sharing.*") }}  {{ $featured_image := (.Resources.ByType "image").GetMatch "*featured*" }}  {{ $avatar_image := (.Resources.ByType "image").GetMatch "avatar*" }}  {{ $has_logo := fileExists "assets/media/logo.png" | or (fileExists "assets/media/logo.svg") }}  {{ $og_image := "" }}  {{ $twitter_card := "summary_large_image" }}  {{ if (and (eq .Kind "term") $avatar_image) }}    {{/* Match image processing in About widget to prevent generating more images than necessary. */}}    {{ $og_image = ($avatar_image.Fill "270x270 Center").Permalink }}    {{ $twitter_card = "summary" }}  {{ else if $featured_image }}    {{ $og_image = $featured_image.Permalink }}  {{ else if .Params.header.image }}    {{ $og_image = printf "%s/%s" $media_dir .Params.header.image | absURL }}  {{ else if $sharing_image }}    {{ $og_image = $sharing_image.Permalink }}  {{ else if $has_logo }}    {{ $og_image = (partial "functions/get_logo" (dict "constraint" "fit" "size" 300)).Permalink }}    {{ $twitter_card = "summary" }}  {{ else }}    {{ $og_image = (partial "functions/get_icon" 512).Permalink }}    {{ $twitter_card = "summary" }}  {{ end }}  {{ $scr.Set "og_image" $og_image }}{{/* Set `og_image` globally for `rss.xml`. */}}  <meta property="twitter:card" content="{{ $twitter_card }}" />  {{ with site.Params.twitter }}    <meta property="twitter:site" content="@{{ . }}" />    <meta property="twitter:creator" content="@{{ . }}" />  {{ end }}  <meta property="og:site_name" content="{{ site.Title }}" />  <meta property="og:url" content="{{ .Permalink }}" />  <meta property="og:title" content="{{ if not .IsHome }}{{ .Title }} | {{ end }}{{ site.Title }}" />  <meta property="og:description" content="{{ $desc }}" />  {{- with $og_image -}}    <meta property="og:image" content="{{ . }}" />    <meta property="twitter:image" content="{{ . }}" />  {{- end -}}  <meta property="og:locale" content="{{ site.LanguageCode | default "en-us" }}" />  {{ if .IsPage }}    {{ if not .PublishDate.IsZero }}      <meta        property="article:published_time"        content="{{ .PublishDate.Format "2006-01-02T15:04:05-07:00" | safeHTML }}"      />    {{ else if not .Date.IsZero }}      <meta property="article:published_time" content="{{ .Date.Format "2006-01-02T15:04:05-07:00" | safeHTML }}" />    {{ end }}    {{ if not .Lastmod.IsZero }}<meta property="article:modified_time" content="{{ .Lastmod.Format "2006-01-02T15:04:05-07:00" | safeHTML }}">{{ end }}  {{ else }}    {{ if not .Date.IsZero }}      <meta property="og:updated_time" content="{{ .Date.Format "2006-01-02T15:04:05-07:00" | safeHTML }}" />    {{ end }}  {{ end }}  {{ partial "jsonld/main" (dict "page" . "summary" $desc) }}  {{ partial "cookie_consent" . }}  {{ partial "custom_head" . }}  <title>{{ if not .IsHome }}{{ .Title }} | {{ end }}{{ site.Title }}</title></head>
 |