static: regenerate minified assetss

Change-Id: I2878b6189ce0b1c18a8a0e74bf2227afe5d70c0e
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/344400
Trust: Jamal Carvalho <jamal@golang.org>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/static/frontend/badge/badge.min.css b/static/frontend/badge/badge.min.css
new file mode 100644
index 0000000..31ed2e8
--- /dev/null
+++ b/static/frontend/badge/badge.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.Badge label,.Badge input{width:100%}.Badge-badgeIcon{height:1.25rem;width:5.625rem}.Badge-snippetContainer{background-color:var(--color-background-accented);display:flex;flex-direction:column;gap:1rem;margin-top:1rem;padding:1rem}.Badge-gopherLanding{height:12.25rem;text-align:center}.Badge-gopherLanding img{height:7.8125rem;width:auto}
+/*# sourceMappingURL=badge.min.css.map */
diff --git a/static/frontend/badge/badge.min.css.map b/static/frontend/badge/badge.min.css.map
new file mode 100644
index 0000000..054dee8
--- /dev/null
+++ b/static/frontend/badge/badge.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["badge.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.Badge label,\n.Badge input {\n  width: 100%;\n}\n.Badge-badgeIcon {\n  height: 1.25rem;\n  width: 5.625rem;\n}\n.Badge-snippetContainer {\n  background-color: var(--color-background-accented);\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  margin-top: 1rem;\n  padding: 1rem;\n}\n.Badge-gopherLanding {\n  height: 12.25rem;\n  text-align: center;\n}\n.Badge-gopherLanding img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
+  "mappings": ";;;;;AAMA,0BAEE,WAEF,iBACE,eACA,eAEF,wBACE,kDACA,aACA,sBACA,SACA,gBAnBF,aAsBA,qBACE,gBACA,kBAEF,yBACE,iBACA",
+  "names": []
+}
diff --git a/static/frontend/badge/badge.tmpl b/static/frontend/badge/badge.tmpl
index 474eb3e..a6b9411 100644
--- a/static/frontend/badge/badge.tmpl
+++ b/static/frontend/badge/badge.tmpl
@@ -11,7 +11,7 @@
 {{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/badge/badge.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/badge/badge.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/error/error.min.css b/static/frontend/error/error.min.css
new file mode 100644
index 0000000..76366fb
--- /dev/null
+++ b/static/frontend/error/error.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.Error-message{text-align:center}
+/*# sourceMappingURL=error.min.css.map */
diff --git a/static/frontend/error/error.min.css.map b/static/frontend/error/error.min.css.map
new file mode 100644
index 0000000..30f9517
--- /dev/null
+++ b/static/frontend/error/error.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["error.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.Error-message {\n  text-align: center;\n}\n"],
+  "mappings": ";;;;;AAMA,eACE",
+  "names": []
+}
diff --git a/static/frontend/error/error.tmpl b/static/frontend/error/error.tmpl
index a94290b..2f89fe9 100644
--- a/static/frontend/error/error.tmpl
+++ b/static/frontend/error/error.tmpl
@@ -7,7 +7,7 @@
 {{define "title"}}<title>{{.HTMLTitle}} · pkg.go.dev</title>{{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/error/error.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/error/error.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/fetch/fetch.js b/static/frontend/fetch/fetch.js
index 24e40d0..8435fa8 100644
--- a/static/frontend/fetch/fetch.js
+++ b/static/frontend/fetch/fetch.js
@@ -1,4 +1,4 @@
-(()=>{var a=document.querySelector(".js-fetchButton");a&&a.addEventListener("click",e=>{e.preventDefault(),l()});async function l(){let e=document.querySelector(".js-fetchMessage"),t=document.querySelector(".js-fetchMessageSecondary"),o=document.querySelector(".js-fetchButton"),n=document.querySelector(".js-fetchLoading");if(!(e&&t&&o&&n))return;e.textContent=`Fetching ${e.dataset.path}`,t.textContent="Feel free to navigate away and check back later, we\u2019ll keep working on it!",o.style.display="none",n.style.display="block";let c=await fetch(`/fetch${window.location.pathname}`,{method:"POST"});if(c.ok){window.location.reload();return}let s=await c.text();n.style.display="none",t.textContent="";let r=new DOMParser().parseFromString(s,"text/html");e.innerHTML=r.documentElement.textContent??""}})();
+(()=>{var s=document.querySelector(".js-fetchButton");s&&s.addEventListener("click",e=>{e.preventDefault(),i()});async function i(){var a;let e=document.querySelector(".js-fetchMessage"),t=document.querySelector(".js-fetchMessageSecondary"),o=document.querySelector(".js-fetchButton"),n=document.querySelector(".js-fetchLoading");if(!(e&&t&&o&&n))return;e.textContent=`Fetching ${e.dataset.path}`,t.textContent="Feel free to navigate away and check back later, we\u2019ll keep working on it!",o.style.display="none",n.style.display="block";let c=await fetch(`/fetch${window.location.pathname}`,{method:"POST"});if(c.ok){window.location.reload();return}let r=await c.text();n.style.display="none",t.textContent="";let l=new DOMParser().parseFromString(r,"text/html");e.innerHTML=(a=l.documentElement.textContent)!=null?a:""}})();
 /*!
  * @license
  * Copyright 2020 The Go Authors. All rights reserved.
diff --git a/static/frontend/fetch/fetch.js.map b/static/frontend/fetch/fetch.js.map
index 69f5e99..49c5927 100644
--- a/static/frontend/fetch/fetch.js.map
+++ b/static/frontend/fetch/fetch.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["fetch.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nconst fetchButton = document.querySelector('.js-fetchButton');\nif (fetchButton) {\n  fetchButton.addEventListener('click', e => {\n    e.preventDefault();\n    fetchPath();\n  });\n}\n\nasync function fetchPath() {\n  const fetchMessageEl = document.querySelector<HTMLHeadingElement>('.js-fetchMessage');\n  const fetchMessageSecondary = document.querySelector<HTMLParagraphElement>(\n    '.js-fetchMessageSecondary'\n  );\n  const fetchButton = document.querySelector<HTMLButtonElement>('.js-fetchButton');\n  const fetchLoading = document.querySelector<HTMLDivElement>('.js-fetchLoading');\n  if (!(fetchMessageEl && fetchMessageSecondary && fetchButton && fetchLoading)) {\n    return;\n  }\n  fetchMessageEl.textContent = `Fetching ${fetchMessageEl.dataset.path}`;\n  fetchMessageSecondary.textContent =\n    'Feel free to navigate away and check back later, we\u2019ll keep working on it!';\n  fetchButton.style.display = 'none';\n  fetchLoading.style.display = 'block';\n\n  const response = await fetch(`/fetch${window.location.pathname}`, { method: 'POST' });\n  if (response.ok) {\n    window.location.reload();\n    return;\n  }\n  const responseText = await response.text();\n  fetchLoading.style.display = 'none';\n  fetchMessageSecondary.textContent = '';\n  const responseTextParsedDOM = new DOMParser().parseFromString(responseText, 'text/html');\n  fetchMessageEl.innerHTML = responseTextParsedDOM.documentElement.textContent ?? '';\n}\n"],
-  "mappings": "MAAA,AAOA,GAAM,GAAc,SAAS,cAAc,mBAC3C,AAAI,GACF,EAAY,iBAAiB,QAAS,GAAK,CACzC,EAAE,iBACF,MAIJ,kBAA2B,CACzB,GAAM,GAAiB,SAAS,cAAkC,oBAC5D,EAAwB,SAAS,cACrC,6BAEI,EAAc,SAAS,cAAiC,mBACxD,EAAe,SAAS,cAA8B,oBAC5D,GAAI,CAAE,IAAkB,GAAyB,GAAe,GAC9D,OAEF,EAAe,YAAc,YAAY,EAAe,QAAQ,OAChE,EAAsB,YACpB,kFACF,EAAY,MAAM,QAAU,OAC5B,EAAa,MAAM,QAAU,QAE7B,GAAM,GAAW,KAAM,OAAM,SAAS,OAAO,SAAS,WAAY,CAAE,OAAQ,SAC5E,GAAI,EAAS,GAAI,CACf,OAAO,SAAS,SAChB,OAEF,GAAM,GAAe,KAAM,GAAS,OACpC,EAAa,MAAM,QAAU,OAC7B,EAAsB,YAAc,GACpC,GAAM,GAAwB,GAAI,aAAY,gBAAgB,EAAc,aAC5E,EAAe,UAAY,EAAsB,gBAAgB,aAAe",
+  "mappings": "MAAA,AAOA,GAAM,GAAc,SAAS,cAAc,mBAC3C,AAAI,GACF,EAAY,iBAAiB,QAAS,GAAK,CACzC,EAAE,iBACF,MAIJ,kBAA2B,CAf3B,MAgBE,GAAM,GAAiB,SAAS,cAAkC,oBAC5D,EAAwB,SAAS,cACrC,6BAEI,EAAc,SAAS,cAAiC,mBACxD,EAAe,SAAS,cAA8B,oBAC5D,GAAI,CAAE,IAAkB,GAAyB,GAAe,GAC9D,OAEF,EAAe,YAAc,YAAY,EAAe,QAAQ,OAChE,EAAsB,YACpB,kFACF,EAAY,MAAM,QAAU,OAC5B,EAAa,MAAM,QAAU,QAE7B,GAAM,GAAW,KAAM,OAAM,SAAS,OAAO,SAAS,WAAY,CAAE,OAAQ,SAC5E,GAAI,EAAS,GAAI,CACf,OAAO,SAAS,SAChB,OAEF,GAAM,GAAe,KAAM,GAAS,OACpC,EAAa,MAAM,QAAU,OAC7B,EAAsB,YAAc,GACpC,GAAM,GAAwB,GAAI,aAAY,gBAAgB,EAAc,aAC5E,EAAe,UAAY,KAAsB,gBAAgB,cAAtC,OAAqD",
   "names": []
 }
diff --git a/static/frontend/fetch/fetch.min.css b/static/frontend/fetch/fetch.min.css
new file mode 100644
index 0000000..ce435dd
--- /dev/null
+++ b/static/frontend/fetch/fetch.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.Fetch-button{align-self:center}@keyframes blink{0%{opacity:.2}20%{opacity:1}to{opacity:.2}}.Fetch-dot{animation-duration:1.4s;animation-fill-mode:both;animation-iteration-count:infinite;animation-name:blink;background-color:var(--color-brand-primary);border-radius:50%;display:inline-block;height:.5rem;width:.5rem}.Fetch-loading{display:none;text-align:center}.Fetch-loading:nth-child(2){animation-delay:.2s}.Fetch-loading:nth-child(3){animation-delay:.4s}.Fetch-message,.Fetch-messageSecondary{text-align:center}
+/*# sourceMappingURL=fetch.min.css.map */
diff --git a/static/frontend/fetch/fetch.min.css.map b/static/frontend/fetch/fetch.min.css.map
new file mode 100644
index 0000000..083a20c
--- /dev/null
+++ b/static/frontend/fetch/fetch.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["fetch.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.Fetch-button {\n  align-self: center;\n}\n@keyframes blink {\n  0% {\n    opacity: 0.2;\n  }\n  20% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0.2;\n  }\n}\n.Fetch-dot {\n  animation-duration: 1.4s;\n  animation-fill-mode: both;\n  animation-iteration-count: infinite;\n  animation-name: blink;\n  background-color: var(--color-brand-primary);\n  border-radius: 50%;\n  display: inline-block;\n  height: 0.5rem;\n  width: 0.5rem;\n}\n.Fetch-loading {\n  display: none;\n  text-align: center;\n}\n.Fetch-loading:nth-child(2) {\n  animation-delay: 0.2s;\n}\n.Fetch-loading:nth-child(3) {\n  animation-delay: 0.4s;\n}\n.Fetch-message,\n.Fetch-messageSecondary {\n  text-align: center;\n}\n"],
+  "mappings": ";;;;;AAMA,cACE,kBAEF,oBAEI,eAGA,aAGA,YAGJ,WACE,wBACA,yBACA,mCACA,qBACA,4CAzBF,kBA2BE,qBACA,aACA,YAEF,eACE,aACA,kBAEF,4BACE,oBAEF,4BACE,oBAEF,uCAEE",
+  "names": []
+}
diff --git a/static/frontend/fetch/fetch.tmpl b/static/frontend/fetch/fetch.tmpl
index 2a60738..33f972a 100644
--- a/static/frontend/fetch/fetch.tmpl
+++ b/static/frontend/fetch/fetch.tmpl
@@ -7,7 +7,7 @@
 {{define "title"}}<title>{{.MessageData}} · pkg.go.dev</title>{{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/fetch/fetch.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/fetch/fetch.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/frontend.js b/static/frontend/frontend.js
index 019db68..f0f4d8a 100644
--- a/static/frontend/frontend.js
+++ b/static/frontend/frontend.js
@@ -1,4 +1,4 @@
-(()=>{var _=Object.defineProperty;var N=e=>_(e,"__esModule",{value:!0});var I=(e,t)=>()=>(t||(t={exports:{}},e(t.exports,t)),t.exports),M=(e,t)=>{for(var o in t)_(e,o,{get:t[o],enumerable:!0})};var C=I(j=>{N(j);M(j,{default:()=>B});var d=window.CustomEvent;(!d||typeof d=="object")&&(d=function(t,o){o=o||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,!!o.bubbles,!!o.cancelable,o.detail||null),n},d.prototype=window.Event.prototype);function K(e){for(;e&&e!==document.body;){var t=window.getComputedStyle(e),o=function(n,a){return!(t[n]===void 0||t[n]===a)};if(t.opacity<1||o("zIndex","auto")||o("transform","none")||o("mixBlendMode","normal")||o("filter","none")||o("perspective","none")||t.isolation==="isolate"||t.position==="fixed"||t.webkitOverflowScrolling==="touch")return!0;e=e.parentElement}return!1}function f(e){for(;e;){if(e.localName==="dialog")return e;e=e.parentElement}return null}function T(e){e&&e.blur&&e!==document.body&&e.blur()}function F(e,t){for(var o=0;o<e.length;++o)if(e[o]===t)return!0;return!1}function p(e){return!e||!e.hasAttribute("method")?!1:e.getAttribute("method").toLowerCase()==="dialog"}function L(e){if(this.dialog_=e,this.replacedStyleTop_=!1,this.openAsModal_=!1,e.hasAttribute("role")||e.setAttribute("role","dialog"),e.show=this.show.bind(this),e.showModal=this.showModal.bind(this),e.close=this.close.bind(this),"returnValue"in e||(e.returnValue=""),"MutationObserver"in window){var t=new MutationObserver(this.maybeHideModal.bind(this));t.observe(e,{attributes:!0,attributeFilter:["open"]})}else{var o=!1,n=function(){o?this.downgradeModal():this.maybeHideModal(),o=!1}.bind(this),a,r=function(l){if(l.target===e){var c="DOMNodeRemoved";o|=l.type.substr(0,c.length)===c,window.clearTimeout(a),a=window.setTimeout(n,0)}};["DOMAttrModified","DOMNodeRemoved","DOMNodeRemovedFromDocument"].forEach(function(l){e.addEventListener(l,r)})}Object.defineProperty(e,"open",{set:this.setOpen.bind(this),get:e.hasAttribute.bind(e,"open")}),this.backdrop_=document.createElement("div"),this.backdrop_.className="backdrop",this.backdrop_.addEventListener("click",this.backdropClick_.bind(this))}L.prototype={get dialog(){return this.dialog_},maybeHideModal:function(){this.dialog_.hasAttribute("open")&&document.body.contains(this.dialog_)||this.downgradeModal()},downgradeModal:function(){!this.openAsModal_||(this.openAsModal_=!1,this.dialog_.style.zIndex="",this.replacedStyleTop_&&(this.dialog_.style.top="",this.replacedStyleTop_=!1),this.backdrop_.parentNode&&this.backdrop_.parentNode.removeChild(this.backdrop_),i.dm.removeDialog(this))},setOpen:function(e){e?this.dialog_.hasAttribute("open")||this.dialog_.setAttribute("open",""):(this.dialog_.removeAttribute("open"),this.maybeHideModal())},backdropClick_:function(e){if(this.dialog_.hasAttribute("tabindex"))this.dialog_.focus();else{var t=document.createElement("div");this.dialog_.insertBefore(t,this.dialog_.firstChild),t.tabIndex=-1,t.focus(),this.dialog_.removeChild(t)}var o=document.createEvent("MouseEvents");o.initMouseEvent(e.type,e.bubbles,e.cancelable,window,e.detail,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget),this.dialog_.dispatchEvent(o),e.stopPropagation()},focus_:function(){var e=this.dialog_.querySelector("[autofocus]:not([disabled])");if(!e&&this.dialog_.tabIndex>=0&&(e=this.dialog_),!e){var t=["button","input","keygen","select","textarea"],o=t.map(function(n){return n+":not([disabled])"});o.push('[tabindex]:not([disabled]):not([tabindex=""])'),e=this.dialog_.querySelector(o.join(", "))}T(document.activeElement),e&&e.focus()},updateZIndex:function(e,t){if(e<t)throw new Error("dialogZ should never be < backdropZ");this.dialog_.style.zIndex=e,this.backdrop_.style.zIndex=t},show:function(){this.dialog_.open||(this.setOpen(!0),this.focus_())},showModal:function(){if(this.dialog_.hasAttribute("open"))throw new Error("Failed to execute 'showModal' on dialog: The element is already open, and therefore cannot be opened modally.");if(!document.body.contains(this.dialog_))throw new Error("Failed to execute 'showModal' on dialog: The element is not in a Document.");if(!i.dm.pushDialog(this))throw new Error("Failed to execute 'showModal' on dialog: There are too many open modal dialogs.");K(this.dialog_.parentElement)&&console.warn("A dialog is being shown inside a stacking context. This may cause it to be unusable. For more information, see this link: https://github.com/GoogleChrome/dialog-polyfill/#stacking-context"),this.setOpen(!0),this.openAsModal_=!0,i.needsCentering(this.dialog_)?(i.reposition(this.dialog_),this.replacedStyleTop_=!0):this.replacedStyleTop_=!1,this.dialog_.parentNode.insertBefore(this.backdrop_,this.dialog_.nextSibling),this.focus_()},close:function(e){if(!this.dialog_.hasAttribute("open"))throw new Error("Failed to execute 'close' on dialog: The element does not have an 'open' attribute, and therefore cannot be closed.");this.setOpen(!1),e!==void 0&&(this.dialog_.returnValue=e);var t=new d("close",{bubbles:!1,cancelable:!1});this.dialog_.dispatchEvent(t)}};var i={};i.reposition=function(e){var t=document.body.scrollTop||document.documentElement.scrollTop,o=t+(window.innerHeight-e.offsetHeight)/2;e.style.top=Math.max(t,o)+"px"};i.isInlinePositionSetByStylesheet=function(e){for(var t=0;t<document.styleSheets.length;++t){var o=document.styleSheets[t],n=null;try{n=o.cssRules}catch(O){}if(!!n)for(var a=0;a<n.length;++a){var r=n[a],l=null;try{l=document.querySelectorAll(r.selectorText)}catch(O){}if(!(!l||!F(l,e))){var c=r.style.getPropertyValue("top"),E=r.style.getPropertyValue("bottom");if(c&&c!=="auto"||E&&E!=="auto")return!0}}}return!1};i.needsCentering=function(e){var t=window.getComputedStyle(e);return t.position!=="absolute"||e.style.top!=="auto"&&e.style.top!==""||e.style.bottom!=="auto"&&e.style.bottom!==""?!1:!i.isInlinePositionSetByStylesheet(e)};i.forceRegisterDialog=function(e){if((window.HTMLDialogElement||e.showModal)&&console.warn("This browser already supports <dialog>, the polyfill may not work correctly",e),e.localName!=="dialog")throw new Error("Failed to register dialog: The element is not a dialog.");new L(e)};i.registerDialog=function(e){e.showModal||i.forceRegisterDialog(e)};i.DialogManager=function(){this.pendingDialogStack=[];var e=this.checkDOM_.bind(this);this.overlay=document.createElement("div"),this.overlay.className="_dialog_overlay",this.overlay.addEventListener("click",function(t){this.forwardTab_=void 0,t.stopPropagation(),e([])}.bind(this)),this.handleKey_=this.handleKey_.bind(this),this.handleFocus_=this.handleFocus_.bind(this),this.zIndexLow_=1e5,this.zIndexHigh_=1e5+150,this.forwardTab_=void 0,"MutationObserver"in window&&(this.mo_=new MutationObserver(function(t){var o=[];t.forEach(function(n){for(var a=0,r;r=n.removedNodes[a];++a){if(r instanceof Element)r.localName==="dialog"&&o.push(r);else continue;o=o.concat(r.querySelectorAll("dialog"))}}),o.length&&e(o)}))};i.DialogManager.prototype.blockDocument=function(){document.documentElement.addEventListener("focus",this.handleFocus_,!0),document.addEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.observe(document,{childList:!0,subtree:!0})};i.DialogManager.prototype.unblockDocument=function(){document.documentElement.removeEventListener("focus",this.handleFocus_,!0),document.removeEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.disconnect()};i.DialogManager.prototype.updateStacking=function(){for(var e=this.zIndexHigh_,t=0,o;o=this.pendingDialogStack[t];++t)o.updateZIndex(--e,--e),t===0&&(this.overlay.style.zIndex=--e);var n=this.pendingDialogStack[0];if(n){var a=n.dialog.parentNode||document.body;a.appendChild(this.overlay)}else this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)};i.DialogManager.prototype.containedByTopDialog_=function(e){for(;e=f(e);){for(var t=0,o;o=this.pendingDialogStack[t];++t)if(o.dialog===e)return t===0;e=e.parentElement}return!1};i.DialogManager.prototype.handleFocus_=function(e){if(!this.containedByTopDialog_(e.target)&&document.activeElement!==document.documentElement&&(e.preventDefault(),e.stopPropagation(),T(e.target),this.forwardTab_!==void 0)){var t=this.pendingDialogStack[0],o=t.dialog,n=o.compareDocumentPosition(e.target);return n&Node.DOCUMENT_POSITION_PRECEDING&&(this.forwardTab_?t.focus_():e.target!==document.documentElement&&document.documentElement.focus()),!1}};i.DialogManager.prototype.handleKey_=function(e){if(this.forwardTab_=void 0,e.keyCode===27){e.preventDefault(),e.stopPropagation();var t=new d("cancel",{bubbles:!1,cancelable:!0}),o=this.pendingDialogStack[0];o&&o.dialog.dispatchEvent(t)&&o.dialog.close()}else e.keyCode===9&&(this.forwardTab_=!e.shiftKey)};i.DialogManager.prototype.checkDOM_=function(e){var t=this.pendingDialogStack.slice();t.forEach(function(o){e.indexOf(o.dialog)!==-1?o.downgradeModal():o.maybeHideModal()})};i.DialogManager.prototype.pushDialog=function(e){var t=(this.zIndexHigh_-this.zIndexLow_)/2-1;return this.pendingDialogStack.length>=t?!1:(this.pendingDialogStack.unshift(e)===1&&this.blockDocument(),this.updateStacking(),!0)};i.DialogManager.prototype.removeDialog=function(e){var t=this.pendingDialogStack.indexOf(e);t!==-1&&(this.pendingDialogStack.splice(t,1),this.pendingDialogStack.length===0&&this.unblockDocument(),this.updateStacking())};i.dm=new i.DialogManager;i.formSubmitter=null;i.useValue=null;window.HTMLDialogElement===void 0&&(v=document.createElement("form"),v.setAttribute("method","dialog"),v.method!=="dialog"&&(s=Object.getOwnPropertyDescriptor(HTMLFormElement.prototype,"method"),s&&(S=s.get,s.get=function(){return p(this)?"dialog":S.call(this)},k=s.set,s.set=function(e){return typeof e=="string"&&e.toLowerCase()==="dialog"?this.setAttribute("method",e):k.call(this,e)},Object.defineProperty(HTMLFormElement.prototype,"method",s))),document.addEventListener("click",function(e){if(i.formSubmitter=null,i.useValue=null,!e.defaultPrevented){var t=e.target;if(!(!t||!p(t.form))){var o=t.type==="submit"&&["button","input"].indexOf(t.localName)>-1;if(!o){if(!(t.localName==="input"&&t.type==="image"))return;i.useValue=e.offsetX+","+e.offsetY}var n=f(t);!n||(i.formSubmitter=t)}}},!1),D=HTMLFormElement.prototype.submit,x=function(){if(!p(this))return D.call(this);var e=f(this);e&&e.close()},HTMLFormElement.prototype.submit=x,document.addEventListener("submit",function(e){if(!e.defaultPrevented){var t=e.target;if(!!p(t)){e.preventDefault();var o=f(t);if(!!o){var n=i.formSubmitter;n&&n.form===t?o.close(i.useValue||n.value):o.close(),i.formSubmitter=null}}}},!1));var v,s,S,k,D,x,B=i});function P(){let e=document.querySelector(".js-header"),t=document.querySelectorAll(".js-headerMenuButton");t.forEach(n=>{n.addEventListener("click",a=>{a.preventDefault(),e?.classList.toggle("is-active"),n.setAttribute("aria-expanded",String(e?.classList.contains("is-active")))})}),document.querySelector(".js-scrim")?.addEventListener("click",n=>{n.preventDefault(),e?.classList.remove("is-active"),t.forEach(a=>{a.setAttribute("aria-expanded",String(e?.classList.contains("is-active")))})})}function q(){let e=document.querySelector(".js-searchForm"),t=document.querySelector(".js-expandSearch"),o=e?.querySelector("input"),n=document.querySelector(".js-headerLogo"),a=document.querySelector(".js-headerMenuButton");t?.addEventListener("click",()=>{e?.classList.add("go-SearchForm--expanded"),n?.classList.add("go-Header-logo--hidden"),a?.classList.add("go-Header-navOpen--hidden"),o?.focus()}),document?.addEventListener("click",r=>{e?.contains(r.target)||(e?.classList.remove("go-SearchForm--expanded"),n?.classList.remove("go-Header-logo--hidden"),a?.classList.remove("go-Header-navOpen--hidden"))})}P();q();var g=class{constructor(t){this.el=t;this.data=t.dataset.toCopy??t.innerText,!this.data&&t.parentElement?.classList.contains("go-InputGroup")&&(this.data=(this.data||t.parentElement?.querySelector("input")?.value)??""),t.addEventListener("click",o=>this.handleCopyClick(o))}handleCopyClick(t){t.preventDefault();let o=1e3;if(!navigator.clipboard){this.showTooltipText("Unable to copy",o);return}navigator.clipboard.writeText(this.data).then(()=>{this.showTooltipText("Copied!",o)}).catch(()=>{this.showTooltipText("Unable to copy",o)})}showTooltipText(t,o){this.el.setAttribute("data-tooltip",t),setTimeout(()=>this.el.setAttribute("data-tooltip",""),o)}};var m=class{constructor(t){this.el=t;document.addEventListener("click",o=>{this.el.contains(o.target)||this.el.removeAttribute("open")})}};var y=class{constructor(t){this.el=t;this.el.addEventListener("change",o=>{let n=o.target,a=n.value;n.value.startsWith("/")||(a="/"+a),window.location.href=a})}};var b=class{constructor(t){this.el=t;!window.HTMLDialogElement&&!t.showModal&&Promise.resolve().then(()=>C()).then(({default:a})=>{a.registerDialog(t)});let o=t.id,n=document.querySelector(`[aria-controls="${o}"]`);n&&n.addEventListener("click",()=>{this.el.showModal?this.el.showModal():this.el.open=!0,t.querySelector("input")?.focus()});for(let a of this.el.querySelectorAll("[data-modal-close]"))a.addEventListener("click",()=>{this.el.close?this.el.close():this.el.open=!1})}};var u={};M(u,{func:()=>R,track:()=>w});function w(e,t,o,n){window.dataLayer??=[],typeof e=="string"?window.dataLayer.push({event:e,event_category:t,event_action:o,event_label:n}):window.dataLayer.push(e)}function R(e){window.dataLayer??=[],window.dataLayer.push(e)}var H=class{constructor(){this.handlers={},document.addEventListener("keydown",t=>this.handleKeyPress(t))}on(t,o,n,a){return this.handlers[t]??=new Set,this.handlers[t].add({description:o,callback:n,...a}),this}handleKeyPress(t){for(let o of this.handlers[t.key.toLowerCase()]??new Set){if(o.target&&o.target!==t.target)return;let n=t.target;if(!o.target&&(n?.tagName==="INPUT"||n?.tagName==="SELECT"||n?.tagName==="TEXTAREA")||n?.isContentEditable||o.withMeta&&!(t.ctrlKey||t.metaKey)||!o.withMeta&&(t.ctrlKey||t.metaKey))return;w("keypress","hotkeys",`${t.key} pressed`,o.description),o.callback(t)}}},h=new H;for(let e of document.querySelectorAll(".js-clipboard"))new g(e);for(let e of document.querySelectorAll(".js-modal"))new b(e);for(let e of document.querySelectorAll(".js-tooltip"))new m(e);for(let e of document.querySelectorAll(".js-selectNav"))new y(e);h.on("t","toggle theme",()=>{let e="dark",t=document.documentElement.getAttribute("data-theme");t==="dark"?e="light":t==="light"&&(e="auto"),document.documentElement.setAttribute("data-theme",e),document.cookie=`prefers-color-scheme=${e};path=/;max-age=31536000;`});h.on("/","focus search",e=>{let t=Array.from(document.querySelectorAll(".js-searchFocus")).pop();t&&!window.navigator.userAgent.includes("Firefox")&&(e.preventDefault(),t.focus())});h.on("y","set canonical url",()=>{let e=document.querySelector(".js-canonicalURLPath")?.dataset.canonicalUrlPath;e&&e!==""&&window.history.replaceState(null,"",e)});(function(){u.track({"gtm.start":new Date().getTime(),event:"gtm.js"})})();function A(){let e=new URLSearchParams(window.location.search),t=e.get("utm_source");if(t!=="gopls"&&t!=="godoc"&&t!=="pkggodev")return;let o=new URL(window.location.href);e.delete("utm_source"),o.search=e.toString(),window.history.replaceState(null,"",o.toString())}document.querySelector(".js-gtmID")?.dataset.gtmid&&window.dataLayer?u.func(function(){A()}):A();})();
+(()=>{var _=Object.defineProperty;var P=e=>_(e,"__esModule",{value:!0});var q=(e,t)=>()=>(e&&(t=e(e=0)),t);var M=(e,t)=>{P(e);for(var o in t)_(e,o,{get:t[o],enumerable:!0})};var C={};M(C,{default:()=>z});function R(e){for(;e&&e!==document.body;){var t=window.getComputedStyle(e),o=function(n,i){return!(t[n]===void 0||t[n]===i)};if(t.opacity<1||o("zIndex","auto")||o("transform","none")||o("mixBlendMode","normal")||o("filter","none")||o("perspective","none")||t.isolation==="isolate"||t.position==="fixed"||t.webkitOverflowScrolling==="touch")return!0;e=e.parentElement}return!1}function f(e){for(;e;){if(e.localName==="dialog")return e;e=e.parentElement}return null}function T(e){e&&e.blur&&e!==document.body&&e.blur()}function U(e,t){for(var o=0;o<e.length;++o)if(e[o]===t)return!0;return!1}function p(e){return!e||!e.hasAttribute("method")?!1:e.getAttribute("method").toLowerCase()==="dialog"}function L(e){if(this.dialog_=e,this.replacedStyleTop_=!1,this.openAsModal_=!1,e.hasAttribute("role")||e.setAttribute("role","dialog"),e.show=this.show.bind(this),e.showModal=this.showModal.bind(this),e.close=this.close.bind(this),"returnValue"in e||(e.returnValue=""),"MutationObserver"in window){var t=new MutationObserver(this.maybeHideModal.bind(this));t.observe(e,{attributes:!0,attributeFilter:["open"]})}else{var o=!1,n=function(){o?this.downgradeModal():this.maybeHideModal(),o=!1}.bind(this),i,r=function(l){if(l.target===e){var s="DOMNodeRemoved";o|=l.type.substr(0,s.length)===s,window.clearTimeout(i),i=window.setTimeout(n,0)}};["DOMAttrModified","DOMNodeRemoved","DOMNodeRemovedFromDocument"].forEach(function(l){e.addEventListener(l,r)})}Object.defineProperty(e,"open",{set:this.setOpen.bind(this),get:e.hasAttribute.bind(e,"open")}),this.backdrop_=document.createElement("div"),this.backdrop_.className="backdrop",this.backdrop_.addEventListener("click",this.backdropClick_.bind(this))}var c,a,y,d,S,k,D,x,z,H=q(()=>{c=window.CustomEvent;(!c||typeof c=="object")&&(c=function(t,o){o=o||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(t,!!o.bubbles,!!o.cancelable,o.detail||null),n},c.prototype=window.Event.prototype);L.prototype={get dialog(){return this.dialog_},maybeHideModal:function(){this.dialog_.hasAttribute("open")&&document.body.contains(this.dialog_)||this.downgradeModal()},downgradeModal:function(){!this.openAsModal_||(this.openAsModal_=!1,this.dialog_.style.zIndex="",this.replacedStyleTop_&&(this.dialog_.style.top="",this.replacedStyleTop_=!1),this.backdrop_.parentNode&&this.backdrop_.parentNode.removeChild(this.backdrop_),a.dm.removeDialog(this))},setOpen:function(e){e?this.dialog_.hasAttribute("open")||this.dialog_.setAttribute("open",""):(this.dialog_.removeAttribute("open"),this.maybeHideModal())},backdropClick_:function(e){if(this.dialog_.hasAttribute("tabindex"))this.dialog_.focus();else{var t=document.createElement("div");this.dialog_.insertBefore(t,this.dialog_.firstChild),t.tabIndex=-1,t.focus(),this.dialog_.removeChild(t)}var o=document.createEvent("MouseEvents");o.initMouseEvent(e.type,e.bubbles,e.cancelable,window,e.detail,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget),this.dialog_.dispatchEvent(o),e.stopPropagation()},focus_:function(){var e=this.dialog_.querySelector("[autofocus]:not([disabled])");if(!e&&this.dialog_.tabIndex>=0&&(e=this.dialog_),!e){var t=["button","input","keygen","select","textarea"],o=t.map(function(n){return n+":not([disabled])"});o.push('[tabindex]:not([disabled]):not([tabindex=""])'),e=this.dialog_.querySelector(o.join(", "))}T(document.activeElement),e&&e.focus()},updateZIndex:function(e,t){if(e<t)throw new Error("dialogZ should never be < backdropZ");this.dialog_.style.zIndex=e,this.backdrop_.style.zIndex=t},show:function(){this.dialog_.open||(this.setOpen(!0),this.focus_())},showModal:function(){if(this.dialog_.hasAttribute("open"))throw new Error("Failed to execute 'showModal' on dialog: The element is already open, and therefore cannot be opened modally.");if(!document.body.contains(this.dialog_))throw new Error("Failed to execute 'showModal' on dialog: The element is not in a Document.");if(!a.dm.pushDialog(this))throw new Error("Failed to execute 'showModal' on dialog: There are too many open modal dialogs.");R(this.dialog_.parentElement)&&console.warn("A dialog is being shown inside a stacking context. This may cause it to be unusable. For more information, see this link: https://github.com/GoogleChrome/dialog-polyfill/#stacking-context"),this.setOpen(!0),this.openAsModal_=!0,a.needsCentering(this.dialog_)?(a.reposition(this.dialog_),this.replacedStyleTop_=!0):this.replacedStyleTop_=!1,this.dialog_.parentNode.insertBefore(this.backdrop_,this.dialog_.nextSibling),this.focus_()},close:function(e){if(!this.dialog_.hasAttribute("open"))throw new Error("Failed to execute 'close' on dialog: The element does not have an 'open' attribute, and therefore cannot be closed.");this.setOpen(!1),e!==void 0&&(this.dialog_.returnValue=e);var t=new c("close",{bubbles:!1,cancelable:!1});this.dialog_.dispatchEvent(t)}};a={};a.reposition=function(e){var t=document.body.scrollTop||document.documentElement.scrollTop,o=t+(window.innerHeight-e.offsetHeight)/2;e.style.top=Math.max(t,o)+"px"};a.isInlinePositionSetByStylesheet=function(e){for(var t=0;t<document.styleSheets.length;++t){var o=document.styleSheets[t],n=null;try{n=o.cssRules}catch(I){}if(!!n)for(var i=0;i<n.length;++i){var r=n[i],l=null;try{l=document.querySelectorAll(r.selectorText)}catch(I){}if(!(!l||!U(l,e))){var s=r.style.getPropertyValue("top"),E=r.style.getPropertyValue("bottom");if(s&&s!=="auto"||E&&E!=="auto")return!0}}}return!1};a.needsCentering=function(e){var t=window.getComputedStyle(e);return t.position!=="absolute"||e.style.top!=="auto"&&e.style.top!==""||e.style.bottom!=="auto"&&e.style.bottom!==""?!1:!a.isInlinePositionSetByStylesheet(e)};a.forceRegisterDialog=function(e){if((window.HTMLDialogElement||e.showModal)&&console.warn("This browser already supports <dialog>, the polyfill may not work correctly",e),e.localName!=="dialog")throw new Error("Failed to register dialog: The element is not a dialog.");new L(e)};a.registerDialog=function(e){e.showModal||a.forceRegisterDialog(e)};a.DialogManager=function(){this.pendingDialogStack=[];var e=this.checkDOM_.bind(this);this.overlay=document.createElement("div"),this.overlay.className="_dialog_overlay",this.overlay.addEventListener("click",function(t){this.forwardTab_=void 0,t.stopPropagation(),e([])}.bind(this)),this.handleKey_=this.handleKey_.bind(this),this.handleFocus_=this.handleFocus_.bind(this),this.zIndexLow_=1e5,this.zIndexHigh_=1e5+150,this.forwardTab_=void 0,"MutationObserver"in window&&(this.mo_=new MutationObserver(function(t){var o=[];t.forEach(function(n){for(var i=0,r;r=n.removedNodes[i];++i){if(r instanceof Element)r.localName==="dialog"&&o.push(r);else continue;o=o.concat(r.querySelectorAll("dialog"))}}),o.length&&e(o)}))};a.DialogManager.prototype.blockDocument=function(){document.documentElement.addEventListener("focus",this.handleFocus_,!0),document.addEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.observe(document,{childList:!0,subtree:!0})};a.DialogManager.prototype.unblockDocument=function(){document.documentElement.removeEventListener("focus",this.handleFocus_,!0),document.removeEventListener("keydown",this.handleKey_),this.mo_&&this.mo_.disconnect()};a.DialogManager.prototype.updateStacking=function(){for(var e=this.zIndexHigh_,t=0,o;o=this.pendingDialogStack[t];++t)o.updateZIndex(--e,--e),t===0&&(this.overlay.style.zIndex=--e);var n=this.pendingDialogStack[0];if(n){var i=n.dialog.parentNode||document.body;i.appendChild(this.overlay)}else this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)};a.DialogManager.prototype.containedByTopDialog_=function(e){for(;e=f(e);){for(var t=0,o;o=this.pendingDialogStack[t];++t)if(o.dialog===e)return t===0;e=e.parentElement}return!1};a.DialogManager.prototype.handleFocus_=function(e){if(!this.containedByTopDialog_(e.target)&&document.activeElement!==document.documentElement&&(e.preventDefault(),e.stopPropagation(),T(e.target),this.forwardTab_!==void 0)){var t=this.pendingDialogStack[0],o=t.dialog,n=o.compareDocumentPosition(e.target);return n&Node.DOCUMENT_POSITION_PRECEDING&&(this.forwardTab_?t.focus_():e.target!==document.documentElement&&document.documentElement.focus()),!1}};a.DialogManager.prototype.handleKey_=function(e){if(this.forwardTab_=void 0,e.keyCode===27){e.preventDefault(),e.stopPropagation();var t=new c("cancel",{bubbles:!1,cancelable:!0}),o=this.pendingDialogStack[0];o&&o.dialog.dispatchEvent(t)&&o.dialog.close()}else e.keyCode===9&&(this.forwardTab_=!e.shiftKey)};a.DialogManager.prototype.checkDOM_=function(e){var t=this.pendingDialogStack.slice();t.forEach(function(o){e.indexOf(o.dialog)!==-1?o.downgradeModal():o.maybeHideModal()})};a.DialogManager.prototype.pushDialog=function(e){var t=(this.zIndexHigh_-this.zIndexLow_)/2-1;return this.pendingDialogStack.length>=t?!1:(this.pendingDialogStack.unshift(e)===1&&this.blockDocument(),this.updateStacking(),!0)};a.DialogManager.prototype.removeDialog=function(e){var t=this.pendingDialogStack.indexOf(e);t!==-1&&(this.pendingDialogStack.splice(t,1),this.pendingDialogStack.length===0&&this.unblockDocument(),this.updateStacking())};a.dm=new a.DialogManager;a.formSubmitter=null;a.useValue=null;window.HTMLDialogElement===void 0&&(y=document.createElement("form"),y.setAttribute("method","dialog"),y.method!=="dialog"&&(d=Object.getOwnPropertyDescriptor(HTMLFormElement.prototype,"method"),d&&(S=d.get,d.get=function(){return p(this)?"dialog":S.call(this)},k=d.set,d.set=function(e){return typeof e=="string"&&e.toLowerCase()==="dialog"?this.setAttribute("method",e):k.call(this,e)},Object.defineProperty(HTMLFormElement.prototype,"method",d))),document.addEventListener("click",function(e){if(a.formSubmitter=null,a.useValue=null,!e.defaultPrevented){var t=e.target;if(!(!t||!p(t.form))){var o=t.type==="submit"&&["button","input"].indexOf(t.localName)>-1;if(!o){if(!(t.localName==="input"&&t.type==="image"))return;a.useValue=e.offsetX+","+e.offsetY}var n=f(t);!n||(a.formSubmitter=t)}}},!1),D=HTMLFormElement.prototype.submit,x=function(){if(!p(this))return D.call(this);var e=f(this);e&&e.close()},HTMLFormElement.prototype.submit=x,document.addEventListener("submit",function(e){if(!e.defaultPrevented){var t=e.target;if(!!p(t)){e.preventDefault();var o=f(t);if(!!o){var n=a.formSubmitter;n&&n.form===t?o.close(a.useValue||n.value):o.close(),a.formSubmitter=null}}}},!1));z=a});function j(){let e=document.querySelector(".js-header"),t=document.querySelectorAll(".js-headerMenuButton");t.forEach(n=>{n.addEventListener("click",i=>{i.preventDefault(),e==null||e.classList.toggle("is-active"),n.setAttribute("aria-expanded",String(e==null?void 0:e.classList.contains("is-active")))})});let o=document.querySelector(".js-scrim");o==null||o.addEventListener("click",n=>{n.preventDefault(),e==null||e.classList.remove("is-active"),t.forEach(i=>{i.setAttribute("aria-expanded",String(e==null?void 0:e.classList.contains("is-active")))})})}function K(){let e=document.querySelector(".js-searchForm"),t=document.querySelector(".js-expandSearch"),o=e==null?void 0:e.querySelector("input"),n=document.querySelector(".js-headerLogo"),i=document.querySelector(".js-headerMenuButton");t==null||t.addEventListener("click",()=>{e==null||e.classList.add("go-SearchForm--expanded"),n==null||n.classList.add("go-Header-logo--hidden"),i==null||i.classList.add("go-Header-navOpen--hidden"),o==null||o.focus()}),document==null||document.addEventListener("click",r=>{(e==null?void 0:e.contains(r.target))||(e==null||e.classList.remove("go-SearchForm--expanded"),n==null||n.classList.remove("go-Header-logo--hidden"),i==null||i.classList.remove("go-Header-navOpen--hidden"))})}j();K();var g=class{constructor(t){this.el=t;var o,n,i,r,l;this.data=(o=t.dataset.toCopy)!=null?o:t.innerText,!this.data&&((n=t.parentElement)==null?void 0:n.classList.contains("go-InputGroup"))&&(this.data=(l=this.data||((r=(i=t.parentElement)==null?void 0:i.querySelector("input"))==null?void 0:r.value))!=null?l:""),t.addEventListener("click",s=>this.handleCopyClick(s))}handleCopyClick(t){t.preventDefault();let o=1e3;if(!navigator.clipboard){this.showTooltipText("Unable to copy",o);return}navigator.clipboard.writeText(this.data).then(()=>{this.showTooltipText("Copied!",o)}).catch(()=>{this.showTooltipText("Unable to copy",o)})}showTooltipText(t,o){this.el.setAttribute("data-tooltip",t),setTimeout(()=>this.el.setAttribute("data-tooltip",""),o)}};var m=class{constructor(t){this.el=t;document.addEventListener("click",o=>{this.el.contains(o.target)||this.el.removeAttribute("open")})}};var v=class{constructor(t){this.el=t;this.el.addEventListener("change",o=>{let n=o.target,i=n.value;n.value.startsWith("/")||(i="/"+i),window.location.href=i})}};var b=class{constructor(t){this.el=t;!window.HTMLDialogElement&&!t.showModal&&Promise.resolve().then(()=>(H(),C)).then(({default:i})=>{i.registerDialog(t)});let o=t.id,n=document.querySelector(`[aria-controls="${o}"]`);n&&n.addEventListener("click",()=>{var i;this.el.showModal?this.el.showModal():this.el.open=!0,(i=t.querySelector("input"))==null||i.focus()});for(let i of this.el.querySelectorAll("[data-modal-close]"))i.addEventListener("click",()=>{this.el.close?this.el.close():this.el.open=!1})}};var u={};M(u,{func:()=>B,track:()=>w});function w(e,t,o,n){var i;(i=window.dataLayer)!=null||(window.dataLayer=[]),typeof e=="string"?window.dataLayer.push({event:e,event_category:t,event_action:o,event_label:n}):window.dataLayer.push(e)}function B(e){var t;(t=window.dataLayer)!=null||(window.dataLayer=[]),window.dataLayer.push(e)}var A=class{constructor(){this.handlers={},document.addEventListener("keydown",t=>this.handleKeyPress(t))}on(t,o,n,i){var r,l;return(l=(r=this.handlers)[t])!=null||(r[t]=new Set),this.handlers[t].add({description:o,callback:n,...i}),this}handleKeyPress(t){var o;for(let n of(o=this.handlers[t.key.toLowerCase()])!=null?o:new Set){if(n.target&&n.target!==t.target)return;let i=t.target;if(!n.target&&((i==null?void 0:i.tagName)==="INPUT"||(i==null?void 0:i.tagName)==="SELECT"||(i==null?void 0:i.tagName)==="TEXTAREA")||(i==null?void 0:i.isContentEditable)||n.withMeta&&!(t.ctrlKey||t.metaKey)||!n.withMeta&&(t.ctrlKey||t.metaKey))return;w("keypress","hotkeys",`${t.key} pressed`,n.description),n.callback(t)}}},h=new A;for(let e of document.querySelectorAll(".js-clipboard"))new g(e);for(let e of document.querySelectorAll(".js-modal"))new b(e);for(let e of document.querySelectorAll(".js-tooltip"))new m(e);for(let e of document.querySelectorAll(".js-selectNav"))new v(e);h.on("t","toggle theme",()=>{let e="dark",t=document.documentElement.getAttribute("data-theme");t==="dark"?e="light":t==="light"&&(e="auto"),document.documentElement.setAttribute("data-theme",e),document.cookie=`prefers-color-scheme=${e};path=/;max-age=31536000;`});h.on("/","focus search",e=>{let t=Array.from(document.querySelectorAll(".js-searchFocus")).pop();t&&!window.navigator.userAgent.includes("Firefox")&&(e.preventDefault(),t.focus())});h.on("y","set canonical url",()=>{var t;let e=(t=document.querySelector(".js-canonicalURLPath"))==null?void 0:t.dataset.canonicalUrlPath;e&&e!==""&&window.history.replaceState(null,"",e)});(function(){u.track({"gtm.start":new Date().getTime(),event:"gtm.js"})})();function O(){let e=new URLSearchParams(window.location.search),t=e.get("utm_source");if(t!=="gopls"&&t!=="godoc"&&t!=="pkggodev")return;let o=new URL(window.location.href);e.delete("utm_source"),o.search=e.toString(),window.history.replaceState(null,"",o.toString())}var N;((N=document.querySelector(".js-gtmID"))==null?void 0:N.dataset.gtmid)&&window.dataLayer?u.func(function(){O()}):O();})();
 /*!
  * @license
  * Copyright 2019-2020 The Go Authors. All rights reserved.
diff --git a/static/frontend/frontend.js.map b/static/frontend/frontend.js.map
index d916b71..59d2bde 100644
--- a/static/frontend/frontend.js.map
+++ b/static/frontend/frontend.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["../../third_party/dialog-polyfill/dialog-polyfill.esm.js", "../shared/header/header.ts", "../shared/clipboard/clipboard.ts", "../shared/tooltip/tooltip.ts", "../shared/outline/select.ts", "../shared/modal/modal.ts", "../shared/analytics/analytics.ts", "../shared/keyboard/keyboard.ts", "../shared/shared.ts", "frontend.ts"],
   "sourcesContent": ["// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n  supportCustomEvent = function CustomEvent(event, x) {\n    x = x || {};\n    var ev = document.createEvent('CustomEvent');\n    ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n    return ev;\n  };\n  supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n  while (el && el !== document.body) {\n    var s = window.getComputedStyle(el);\n    var invalid = function(k, ok) {\n      return !(s[k] === undefined || s[k] === ok);\n    };\n\n    if (s.opacity < 1 ||\n        invalid('zIndex', 'auto') ||\n        invalid('transform', 'none') ||\n        invalid('mixBlendMode', 'normal') ||\n        invalid('filter', 'none') ||\n        invalid('perspective', 'none') ||\n        s['isolation'] === 'isolate' ||\n        s.position === 'fixed' ||\n        s.webkitOverflowScrolling === 'touch') {\n      return true;\n    }\n    el = el.parentElement;\n  }\n  return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n  while (el) {\n    if (el.localName === 'dialog') {\n      return /** @type {HTMLDialogElement} */ (el);\n    }\n    el = el.parentElement;\n  }\n  return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n  if (el && el.blur && el !== document.body) {\n    el.blur();\n  }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n  for (var i = 0; i < nodeList.length; ++i) {\n    if (nodeList[i] === node) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n  if (!el || !el.hasAttribute('method')) {\n    return false;\n  }\n  return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n  this.dialog_ = dialog;\n  this.replacedStyleTop_ = false;\n  this.openAsModal_ = false;\n\n  // Set a11y role. Browsers that support dialog implicitly know this already.\n  if (!dialog.hasAttribute('role')) {\n    dialog.setAttribute('role', 'dialog');\n  }\n\n  dialog.show = this.show.bind(this);\n  dialog.showModal = this.showModal.bind(this);\n  dialog.close = this.close.bind(this);\n\n  if (!('returnValue' in dialog)) {\n    dialog.returnValue = '';\n  }\n\n  if ('MutationObserver' in window) {\n    var mo = new MutationObserver(this.maybeHideModal.bind(this));\n    mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n  } else {\n    // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n    // seem to fire even if the element was removed as part of a parent removal. Use the removed\n    // events to force downgrade (useful if removed/immediately added).\n    var removed = false;\n    var cb = function() {\n      removed ? this.downgradeModal() : this.maybeHideModal();\n      removed = false;\n    }.bind(this);\n    var timeout;\n    var delayModel = function(ev) {\n      if (ev.target !== dialog) { return; }  // not for a child element\n      var cand = 'DOMNodeRemoved';\n      removed |= (ev.type.substr(0, cand.length) === cand);\n      window.clearTimeout(timeout);\n      timeout = window.setTimeout(cb, 0);\n    };\n    ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n      dialog.addEventListener(name, delayModel);\n    });\n  }\n  // Note that the DOM is observed inside DialogManager while any dialog\n  // is being displayed as a modal, to catch modal removal from the DOM.\n\n  Object.defineProperty(dialog, 'open', {\n    set: this.setOpen.bind(this),\n    get: dialog.hasAttribute.bind(dialog, 'open')\n  });\n\n  this.backdrop_ = document.createElement('div');\n  this.backdrop_.className = 'backdrop';\n  this.backdrop_.addEventListener('click', this.backdropClick_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = {\n\n  get dialog() {\n    return this.dialog_;\n  },\n\n  /**\n   * Maybe remove this dialog from the modal top layer. This is called when\n   * a modal dialog may no longer be tenable, e.g., when the dialog is no\n   * longer open or is no longer part of the DOM.\n   */\n  maybeHideModal: function() {\n    if (this.dialog_.hasAttribute('open') && document.body.contains(this.dialog_)) { return; }\n    this.downgradeModal();\n  },\n\n  /**\n   * Remove this dialog from the modal top layer, leaving it as a non-modal.\n   */\n  downgradeModal: function() {\n    if (!this.openAsModal_) { return; }\n    this.openAsModal_ = false;\n    this.dialog_.style.zIndex = '';\n\n    // This won't match the native <dialog> exactly because if the user set top on a centered\n    // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n    // possible to polyfill this perfectly.\n    if (this.replacedStyleTop_) {\n      this.dialog_.style.top = '';\n      this.replacedStyleTop_ = false;\n    }\n\n    // Clear the backdrop and remove from the manager.\n    this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n    dialogPolyfill.dm.removeDialog(this);\n  },\n\n  /**\n   * @param {boolean} value whether to open or close this dialog\n   */\n  setOpen: function(value) {\n    if (value) {\n      this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n    } else {\n      this.dialog_.removeAttribute('open');\n      this.maybeHideModal();  // nb. redundant with MutationObserver\n    }\n  },\n\n  /**\n   * Handles clicks on the fake .backdrop element, redirecting them as if\n   * they were on the dialog itself.\n   *\n   * @param {!Event} e to redirect\n   */\n  backdropClick_: function(e) {\n    if (!this.dialog_.hasAttribute('tabindex')) {\n      // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n      // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n      // would not be needed - clicks would move the implicit cursor there.\n      var fake = document.createElement('div');\n      this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n      fake.tabIndex = -1;\n      fake.focus();\n      this.dialog_.removeChild(fake);\n    } else {\n      this.dialog_.focus();\n    }\n\n    var redirectedEvent = document.createEvent('MouseEvents');\n    redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n        e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n        e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n    this.dialog_.dispatchEvent(redirectedEvent);\n    e.stopPropagation();\n  },\n\n  /**\n   * Focuses on the first focusable element within the dialog. This will always blur the current\n   * focus, even if nothing within the dialog is found.\n   */\n  focus_: function() {\n    // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n    var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n    if (!target && this.dialog_.tabIndex >= 0) {\n      target = this.dialog_;\n    }\n    if (!target) {\n      // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n      // alternative involves stepping through and trying to focus everything.\n      var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n      var query = opts.map(function(el) {\n        return el + ':not([disabled])';\n      });\n      // TODO(samthor): tabindex values that are not numeric are not focusable.\n      query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])');  // tabindex != \"\", not disabled\n      target = this.dialog_.querySelector(query.join(', '));\n    }\n    safeBlur(document.activeElement);\n    target && target.focus();\n  },\n\n  /**\n   * Sets the zIndex for the backdrop and dialog.\n   *\n   * @param {number} dialogZ\n   * @param {number} backdropZ\n   */\n  updateZIndex: function(dialogZ, backdropZ) {\n    if (dialogZ < backdropZ) {\n      throw new Error('dialogZ should never be < backdropZ');\n    }\n    this.dialog_.style.zIndex = dialogZ;\n    this.backdrop_.style.zIndex = backdropZ;\n  },\n\n  /**\n   * Shows the dialog. If the dialog is already open, this does nothing.\n   */\n  show: function() {\n    if (!this.dialog_.open) {\n      this.setOpen(true);\n      this.focus_();\n    }\n  },\n\n  /**\n   * Show this dialog modally.\n   */\n  showModal: function() {\n    if (this.dialog_.hasAttribute('open')) {\n      throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n    }\n    if (!document.body.contains(this.dialog_)) {\n      throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n    }\n    if (!dialogPolyfill.dm.pushDialog(this)) {\n      throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n    }\n\n    if (createsStackingContext(this.dialog_.parentElement)) {\n      console.warn('A dialog is being shown inside a stacking context. ' +\n          'This may cause it to be unusable. For more information, see this link: ' +\n          'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n    }\n\n    this.setOpen(true);\n    this.openAsModal_ = true;\n\n    // Optionally center vertically, relative to the current viewport.\n    if (dialogPolyfill.needsCentering(this.dialog_)) {\n      dialogPolyfill.reposition(this.dialog_);\n      this.replacedStyleTop_ = true;\n    } else {\n      this.replacedStyleTop_ = false;\n    }\n\n    // Insert backdrop.\n    this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n    // Focus on whatever inside the dialog.\n    this.focus_();\n  },\n\n  /**\n   * Closes this HTMLDialogElement. This is optional vs clearing the open\n   * attribute, however this fires a 'close' event.\n   *\n   * @param {string=} opt_returnValue to use as the returnValue\n   */\n  close: function(opt_returnValue) {\n    if (!this.dialog_.hasAttribute('open')) {\n      throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n    }\n    this.setOpen(false);\n\n    // Leave returnValue untouched in case it was set directly on the element\n    if (opt_returnValue !== undefined) {\n      this.dialog_.returnValue = opt_returnValue;\n    }\n\n    // Triggering \"close\" event for any attached listeners on the <dialog>.\n    var closeEvent = new supportCustomEvent('close', {\n      bubbles: false,\n      cancelable: false\n    });\n    this.dialog_.dispatchEvent(closeEvent);\n  }\n\n};\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n  var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n  var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n  element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n  for (var i = 0; i < document.styleSheets.length; ++i) {\n    var styleSheet = document.styleSheets[i];\n    var cssRules = null;\n    // Some browsers throw on cssRules.\n    try {\n      cssRules = styleSheet.cssRules;\n    } catch (e) {}\n    if (!cssRules) { continue; }\n    for (var j = 0; j < cssRules.length; ++j) {\n      var rule = cssRules[j];\n      var selectedNodes = null;\n      // Ignore errors on invalid selector texts.\n      try {\n        selectedNodes = document.querySelectorAll(rule.selectorText);\n      } catch(e) {}\n      if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n        continue;\n      }\n      var cssTop = rule.style.getPropertyValue('top');\n      var cssBottom = rule.style.getPropertyValue('bottom');\n      if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n        return true;\n      }\n    }\n  }\n  return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n  var computedStyle = window.getComputedStyle(dialog);\n  if (computedStyle.position !== 'absolute') {\n    return false;\n  }\n\n  // We must determine whether the top/bottom specified value is non-auto.  In\n  // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n  // Firefox returns the used value. So we do this crazy thing instead: check\n  // the inline style and then go through CSS rules.\n  if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n      (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n    return false;\n  }\n  return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n  if (window.HTMLDialogElement || element.showModal) {\n    console.warn('This browser already supports <dialog>, the polyfill ' +\n        'may not work correctly', element);\n  }\n  if (element.localName !== 'dialog') {\n    throw new Error('Failed to register dialog: The element is not a dialog.');\n  }\n  new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n  if (!element.showModal) {\n    dialogPolyfill.forceRegisterDialog(element);\n  }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n  /** @type {!Array<!dialogPolyfillInfo>} */\n  this.pendingDialogStack = [];\n\n  var checkDOM = this.checkDOM_.bind(this);\n\n  // The overlay is used to simulate how a modal dialog blocks the document.\n  // The blocking dialog is positioned on top of the overlay, and the rest of\n  // the dialogs on the pending dialog stack are positioned below it. In the\n  // actual implementation, the modal dialog stacking is controlled by the\n  // top layer, where z-index has no effect.\n  this.overlay = document.createElement('div');\n  this.overlay.className = '_dialog_overlay';\n  this.overlay.addEventListener('click', function(e) {\n    this.forwardTab_ = undefined;\n    e.stopPropagation();\n    checkDOM([]);  // sanity-check DOM\n  }.bind(this));\n\n  this.handleKey_ = this.handleKey_.bind(this);\n  this.handleFocus_ = this.handleFocus_.bind(this);\n\n  this.zIndexLow_ = 100000;\n  this.zIndexHigh_ = 100000 + 150;\n\n  this.forwardTab_ = undefined;\n\n  if ('MutationObserver' in window) {\n    this.mo_ = new MutationObserver(function(records) {\n      var removed = [];\n      records.forEach(function(rec) {\n        for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n          if (!(c instanceof Element)) {\n            continue;\n          } else if (c.localName === 'dialog') {\n            removed.push(c);\n          }\n          removed = removed.concat(c.querySelectorAll('dialog'));\n        }\n      });\n      removed.length && checkDOM(removed);\n    });\n  }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n  document.documentElement.addEventListener('focus', this.handleFocus_, true);\n  document.addEventListener('keydown', this.handleKey_);\n  this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n  document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n  document.removeEventListener('keydown', this.handleKey_);\n  this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n  var zIndex = this.zIndexHigh_;\n\n  for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n    dpi.updateZIndex(--zIndex, --zIndex);\n    if (i === 0) {\n      this.overlay.style.zIndex = --zIndex;\n    }\n  }\n\n  // Make the overlay a sibling of the dialog itself.\n  var last = this.pendingDialogStack[0];\n  if (last) {\n    var p = last.dialog.parentNode || document.body;\n    p.appendChild(this.overlay);\n  } else if (this.overlay.parentNode) {\n    this.overlay.parentNode.removeChild(this.overlay);\n  }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n  while (candidate = findNearestDialog(candidate)) {\n    for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n      if (dpi.dialog === candidate) {\n        return i === 0;  // only valid if top-most\n      }\n    }\n    candidate = candidate.parentElement;\n  }\n  return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n  if (this.containedByTopDialog_(event.target)) { return; }\n\n  if (document.activeElement === document.documentElement) { return; }\n\n  event.preventDefault();\n  event.stopPropagation();\n  safeBlur(/** @type {Element} */ (event.target));\n\n  if (this.forwardTab_ === undefined) { return; }  // move focus only from a tab key\n\n  var dpi = this.pendingDialogStack[0];\n  var dialog = dpi.dialog;\n  var position = dialog.compareDocumentPosition(event.target);\n  if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n    if (this.forwardTab_) {\n      // forward\n      dpi.focus_();\n    } else if (event.target !== document.documentElement) {\n      // backwards if we're not already focused on <html>\n      document.documentElement.focus();\n    }\n  }\n\n  return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n  this.forwardTab_ = undefined;\n  if (event.keyCode === 27) {\n    event.preventDefault();\n    event.stopPropagation();\n    var cancelEvent = new supportCustomEvent('cancel', {\n      bubbles: false,\n      cancelable: true\n    });\n    var dpi = this.pendingDialogStack[0];\n    if (dpi && dpi.dialog.dispatchEvent(cancelEvent)) {\n      dpi.dialog.close();\n    }\n  } else if (event.keyCode === 9) {\n    this.forwardTab_ = !event.shiftKey;\n  }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n  // This operates on a clone because it may cause it to change. Each change also calls\n  // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n  // at a time?!\n  var clone = this.pendingDialogStack.slice();\n  clone.forEach(function(dpi) {\n    if (removed.indexOf(dpi.dialog) !== -1) {\n      dpi.downgradeModal();\n    } else {\n      dpi.maybeHideModal();\n    }\n  });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n  var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n  if (this.pendingDialogStack.length >= allowed) {\n    return false;\n  }\n  if (this.pendingDialogStack.unshift(dpi) === 1) {\n    this.blockDocument();\n  }\n  this.updateStacking();\n  return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n  var index = this.pendingDialogStack.indexOf(dpi);\n  if (index === -1) { return; }\n\n  this.pendingDialogStack.splice(index, 1);\n  if (this.pendingDialogStack.length === 0) {\n    this.unblockDocument();\n  }\n  this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.useValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n  /**\n   * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n   * one that returns the correct value.\n   */\n  var testForm = document.createElement('form');\n  testForm.setAttribute('method', 'dialog');\n  if (testForm.method !== 'dialog') {\n    var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n    if (methodDescriptor) {\n      // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n      // and don't bother to update the element.\n      var realGet = methodDescriptor.get;\n      methodDescriptor.get = function() {\n        if (isFormMethodDialog(this)) {\n          return 'dialog';\n        }\n        return realGet.call(this);\n      };\n      var realSet = methodDescriptor.set;\n      methodDescriptor.set = function(v) {\n        if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n          return this.setAttribute('method', v);\n        }\n        return realSet.call(this, v);\n      };\n      Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n    }\n  }\n\n  /**\n   * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n   * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n   * document.activeElement.\n   */\n  document.addEventListener('click', function(ev) {\n    dialogPolyfill.formSubmitter = null;\n    dialogPolyfill.useValue = null;\n    if (ev.defaultPrevented) { return; }  // e.g. a submit which prevents default submission\n\n    var target = /** @type {Element} */ (ev.target);\n    if (!target || !isFormMethodDialog(target.form)) { return; }\n\n    var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n    if (!valid) {\n      if (!(target.localName === 'input' && target.type === 'image')) { return; }\n      // this is a <input type=\"image\">, which can submit forms\n      dialogPolyfill.useValue = ev.offsetX + ',' + ev.offsetY;\n    }\n\n    var dialog = findNearestDialog(target);\n    if (!dialog) { return; }\n\n    dialogPolyfill.formSubmitter = target;\n\n  }, false);\n\n  /**\n   * Replace the native HTMLFormElement.submit() method, as it won't fire the\n   * submit event and give us a chance to respond.\n   */\n  var nativeFormSubmit = HTMLFormElement.prototype.submit;\n  var replacementFormSubmit = function () {\n    if (!isFormMethodDialog(this)) {\n      return nativeFormSubmit.call(this);\n    }\n    var dialog = findNearestDialog(this);\n    dialog && dialog.close();\n  };\n  HTMLFormElement.prototype.submit = replacementFormSubmit;\n\n  /**\n   * Global form 'dialog' method handler. Closes a dialog correctly on submit\n   * and possibly sets its return value.\n   */\n  document.addEventListener('submit', function(ev) {\n    if (ev.defaultPrevented) { return; }  // e.g. a submit which prevents default submission\n\n    var form = /** @type {HTMLFormElement} */ (ev.target);\n    if (!isFormMethodDialog(form)) { return; }\n    ev.preventDefault();\n\n    var dialog = findNearestDialog(form);\n    if (!dialog) { return; }\n\n    // Forms can only be submitted via .submit() or a click (?), but anyway: sanity-check that\n    // the submitter is correct before using its value as .returnValue.\n    var s = dialogPolyfill.formSubmitter;\n    if (s && s.form === form) {\n      dialog.close(dialogPolyfill.useValue || s.value);\n    } else {\n      dialog.close();\n    }\n    dialogPolyfill.formSubmitter = null;\n\n  }, false);\n}\n\nexport default dialogPolyfill;\n", "function registerHeaderListeners() {\n  const header = document.querySelector('.js-header');\n  const menuButtons = document.querySelectorAll('.js-headerMenuButton');\n  menuButtons.forEach(button => {\n    button.addEventListener('click', e => {\n      e.preventDefault();\n      header?.classList.toggle('is-active');\n      button.setAttribute('aria-expanded', String(header?.classList.contains('is-active')));\n    });\n  });\n\n  const scrim = document.querySelector('.js-scrim');\n  scrim?.addEventListener('click', e => {\n    e.preventDefault();\n    header?.classList.remove('is-active');\n    menuButtons.forEach(button => {\n      button.setAttribute('aria-expanded', String(header?.classList.contains('is-active')));\n    });\n  });\n}\n\nfunction registerSearchFormListeners() {\n  const searchForm = document.querySelector('.js-searchForm');\n  const expandSearch = document.querySelector('.js-expandSearch');\n  const input = searchForm?.querySelector('input');\n  const headerLogo = document.querySelector('.js-headerLogo');\n  const menuButton = document.querySelector('.js-headerMenuButton');\n  expandSearch?.addEventListener('click', () => {\n    searchForm?.classList.add('go-SearchForm--expanded');\n    headerLogo?.classList.add('go-Header-logo--hidden');\n    menuButton?.classList.add('go-Header-navOpen--hidden');\n    input?.focus();\n  });\n  document?.addEventListener('click', e => {\n    if (!searchForm?.contains(e.target as Node)) {\n      searchForm?.classList.remove('go-SearchForm--expanded');\n      headerLogo?.classList.remove('go-Header-logo--hidden');\n      menuButton?.classList.remove('go-Header-navOpen--hidden');\n    }\n  });\n}\n\nregisterHeaderListeners();\nregisterSearchFormListeners();\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This class decorates an element to copy arbitrary data attached via a data-\n * attribute to the clipboard.\n */\nexport class ClipboardController {\n  /**\n   * The data to be copied to the clipboard.\n   */\n  private data: string;\n\n  /**\n   * @param el The element that will trigger copying text to the clipboard. The text is\n   * expected to be within its data-to-copy attribute.\n   */\n  constructor(private el: HTMLButtonElement) {\n    this.data = el.dataset['toCopy'] ?? el.innerText;\n    // if data-to-copy is empty and the button is part of an input group\n    // capture the value of the input.\n    if (!this.data && el.parentElement?.classList.contains('go-InputGroup')) {\n      this.data = (this.data || el.parentElement?.querySelector('input')?.value) ?? '';\n    }\n    el.addEventListener('click', e => this.handleCopyClick(e));\n  }\n\n  /**\n   * Handles when the primary element is clicked.\n   */\n  handleCopyClick(e: MouseEvent): void {\n    e.preventDefault();\n    const TOOLTIP_SHOW_DURATION_MS = 1000;\n\n    // This API is not available on iOS.\n    if (!navigator.clipboard) {\n      this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      return;\n    }\n    navigator.clipboard\n      .writeText(this.data)\n      .then(() => {\n        this.showTooltipText('Copied!', TOOLTIP_SHOW_DURATION_MS);\n      })\n      .catch(() => {\n        this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      });\n  }\n\n  /**\n   * Shows the given text in a tooltip for a specified amount of time, in milliseconds.\n   */\n  showTooltipText(text: string, durationMs: number): void {\n    this.el.setAttribute('data-tooltip', text);\n    setTimeout(() => this.el.setAttribute('data-tooltip', ''), durationMs);\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * ToolTipController handles closing tooltips on external clicks.\n */\nexport class ToolTipController {\n  constructor(private el: HTMLDetailsElement) {\n    document.addEventListener('click', e => {\n      const insideTooltip = this.el.contains(e.target as Element);\n      if (!insideTooltip) {\n        this.el.removeAttribute('open');\n      }\n    });\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * ModalController registers a dialog element with the polyfill if\n * necessary for the current browser, add adds event listeners to\n * close and open modals.\n */\nexport class ModalController {\n  constructor(private el: HTMLDialogElement) {\n    // Only load the dialog polyfill if necessary for the environment.\n    if (!window.HTMLDialogElement && !el.showModal) {\n      import('../../../third_party/dialog-polyfill/dialog-polyfill.esm.js').then(\n        ({ default: polyfill }) => {\n          polyfill.registerDialog(el);\n        }\n      );\n    }\n    const id = el.id;\n    const button = document.querySelector<HTMLButtonElement>(`[aria-controls=\"${id}\"]`);\n    if (button) {\n      button.addEventListener('click', () => {\n        if (this.el.showModal) {\n          this.el.showModal();\n        } else {\n          this.el.open = true;\n        }\n        el.querySelector('input')?.focus();\n      });\n    }\n    for (const close of this.el.querySelectorAll<HTMLButtonElement>('[data-modal-close]')) {\n      close.addEventListener('click', () => {\n        if (this.el.close) {\n          this.el.close();\n        } else {\n          this.el.open = false;\n        }\n      });\n    }\n  }\n}\n", "interface TagManagerEvent {\n  /**\n   * event is the name of the event, used to filter events in\n   * Google Analytics.\n   */\n  event: string;\n\n  /**\n   * event_category is a name that you supply as a way to group objects\n   * that to analyze. Typically, you will use the same category name\n   * multiple times over related UI elements (buttons, links, etc).\n   */\n  event_category?: string;\n\n  /**\n   * event_action is used to name the type of event or interaction you\n   * want to measure for a particular web object. For example, with a\n   * single \"form\" category, you can analyze a number of specific events\n   * with this parameter, such as: form entered, form submitted.\n   */\n  event_action?: string;\n\n  /**\n   * event_label provide additional information for events that you want\n   * to analyze, such as the text label of a link.\n   */\n  event_label?: string;\n\n  /**\n   * gtm.start is used to initialize Google Tag Manager.\n   */\n  'gtm.start'?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ndeclare global {\n  interface Window {\n    dataLayer?: (TagManagerEvent | VoidFunction)[];\n    ga?: unknown;\n  }\n}\n\n/**\n * track sends events to Google Tag Manager.\n */\nexport function track(\n  event: string | TagManagerEvent,\n  category?: string,\n  action?: string,\n  label?: string\n): void {\n  window.dataLayer ??= [];\n  if (typeof event === 'string') {\n    window.dataLayer.push({\n      event,\n      event_category: category,\n      event_action: action,\n      event_label: label,\n    });\n  } else {\n    window.dataLayer.push(event);\n  }\n}\n\n/**\n * func adds functions to run sequentionally after\n * Google Tag Manager is ready.\n */\nexport function func(fn: () => void): void {\n  window.dataLayer ??= [];\n  window.dataLayer.push(fn);\n}\n", "/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { track } from '../analytics/analytics';\n\n/**\n * Options are keyhandler callback options.\n */\ninterface Options {\n  /**\n   * target is the element the key event should filter on. The\n   * default target is the document.\n   */\n  target?: Element;\n\n  /**\n   * withMeta specifies if the event callback should fire when\n   * the key is pressed with a meta key (ctrl, alt, etc). By\n   * default meta keypresses are ignored.\n   */\n  withMeta?: boolean;\n}\n\n/**\n * KeyHandler is the config for a keyboard event callback.\n */\ninterface KeyHandler extends Options {\n  description: string;\n  callback: (e: KeyboardEvent) => void;\n}\n\n/**\n * KeyboardController controls event callbacks for sitewide\n * keyboard events. Multiple callbacks can be registered for\n * a single key and by default the controller ignores events\n * for text input targets.\n */\nclass KeyboardController {\n  handlers: Record<string, Set<KeyHandler>>;\n\n  constructor() {\n    this.handlers = {};\n    document.addEventListener('keydown', e => this.handleKeyPress(e));\n  }\n\n  /**\n   * on registers keyboard event callbacks.\n   * @param key the key to register.\n   * @param description name of the event.\n   * @param callback event callback.\n   * @param options set target and withMeta options to override the default behaviors.\n   */\n  on(key: string, description: string, callback: (e: KeyboardEvent) => void, options?: Options) {\n    this.handlers[key] ??= new Set();\n    this.handlers[key].add({ description, callback, ...options });\n    return this;\n  }\n\n  private handleKeyPress(e: KeyboardEvent) {\n    for (const handler of this.handlers[e.key.toLowerCase()] ?? new Set()) {\n      if (handler.target && handler.target !== e.target) {\n        return;\n      }\n      const t = e.target as HTMLElement | null;\n      if (\n        !handler.target &&\n        (t?.tagName === 'INPUT' || t?.tagName === 'SELECT' || t?.tagName === 'TEXTAREA')\n      ) {\n        return;\n      }\n      if (t?.isContentEditable) {\n        return;\n      }\n      if (\n        (handler.withMeta && !(e.ctrlKey || e.metaKey)) ||\n        (!handler.withMeta && (e.ctrlKey || e.metaKey))\n      ) {\n        return;\n      }\n      track('keypress', 'hotkeys', `${e.key} pressed`, handler.description);\n      handler.callback(e);\n    }\n  }\n}\n\nexport const keyboard = new KeyboardController();\n", "/**\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport './header/header';\nimport { ClipboardController } from './clipboard/clipboard';\nimport { ToolTipController } from './tooltip/tooltip';\nimport { SelectNavController } from './outline/select';\nimport { ModalController } from './modal/modal';\n\nexport { keyboard } from './keyboard/keyboard';\nexport * as analytics from './analytics/analytics';\n\nfor (const el of document.querySelectorAll<HTMLButtonElement>('.js-clipboard')) {\n  new ClipboardController(el);\n}\n\nfor (const el of document.querySelectorAll<HTMLDialogElement>('.js-modal')) {\n  new ModalController(el);\n}\n\nfor (const t of document.querySelectorAll<HTMLDetailsElement>('.js-tooltip')) {\n  new ToolTipController(t);\n}\n\nfor (const el of document.querySelectorAll<HTMLSelectElement>('.js-selectNav')) {\n  new SelectNavController(el);\n}\n", "/**\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { analytics, keyboard } from '../shared/shared';\n\n// Temporary shortcut for testing out the dark theme.\nkeyboard.on('t', 'toggle theme', () => {\n  let nextTheme = 'dark';\n  const theme = document.documentElement.getAttribute('data-theme');\n  if (theme === 'dark') {\n    nextTheme = 'light';\n  } else if (theme === 'light') {\n    nextTheme = 'auto';\n  }\n  document.documentElement.setAttribute('data-theme', nextTheme);\n  document.cookie = `prefers-color-scheme=${nextTheme};path=/;max-age=31536000;`;\n});\n\n// Pressing '/' focuses the search box\nkeyboard.on('/', 'focus search', e => {\n  const searchInput = Array.from(\n    document.querySelectorAll<HTMLInputElement>('.js-searchFocus')\n  ).pop();\n  // Favoring the Firefox quick find feature over search input\n  // focus. See: https://github.com/golang/go/issues/41093.\n  if (searchInput && !window.navigator.userAgent.includes('Firefox')) {\n    e.preventDefault();\n    searchInput.focus();\n  }\n});\n\n// Pressing 'y' changes the browser URL to the canonical URL\n// without triggering a reload.\nkeyboard.on('y', 'set canonical url', () => {\n  const canonicalURLPath = document.querySelector<HTMLDivElement>('.js-canonicalURLPath')?.dataset[\n    'canonicalUrlPath'\n  ];\n  if (canonicalURLPath && canonicalURLPath !== '') {\n    window.history.replaceState(null, '', canonicalURLPath);\n  }\n});\n\n/**\n * setupGoogleTagManager intializes Google Tag Manager.\n */\n(function setupGoogleTagManager() {\n  analytics.track({\n    'gtm.start': new Date().getTime(),\n    event: 'gtm.js',\n  });\n})();\n\n/**\n * removeUTMSource removes the utm_source GET parameter if present.\n * This is done using JavaScript, so that the utm_source is still\n * captured by Google Analytics.\n */\nfunction removeUTMSource() {\n  const urlParams = new URLSearchParams(window.location.search);\n  const utmSource = urlParams.get('utm_source');\n  if (utmSource !== 'gopls' && utmSource !== 'godoc' && utmSource !== 'pkggodev') {\n    return;\n  }\n\n  /** Strip the utm_source query parameter and replace the URL. **/\n  const newURL = new URL(window.location.href);\n  urlParams.delete('utm_source');\n  newURL.search = urlParams.toString();\n  window.history.replaceState(null, '', newURL.toString());\n}\n\nif (document.querySelector<HTMLElement>('.js-gtmID')?.dataset.gtmid && window.dataLayer) {\n  analytics.func(function () {\n    removeUTMSource();\n  });\n} else {\n  removeUTMSource();\n}\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/frontend/frontend.min.css b/static/frontend/frontend.min.css
new file mode 100644
index 0000000..559bdc4
--- /dev/null
+++ b/static/frontend/frontend.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+html,body,button,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,hr,input,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,dialog,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}*,:before,:after{box-sizing:border-box}body{color:var(--color-text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1rem;line-height:normal}h1{font-size:1.5rem}h2{font-size:1.375rem}h3{font-size:1.25rem}h4{font-size:1.125rem}h5{font-size:1rem}h6{font-size:.875rem}h1,h2,h3,h4{font-weight:600;line-height:1.25em;word-break:break-word}h5,h6{font-weight:500;line-height:1.3em;word-break:break-word}hr{border:none;border-bottom:var(--border);margin:0;width:100%}p{font-size:1rem;line-height:1.5rem;max-width:60rem}strong{font-weight:600}.go-textSubtle{color:var(--color-text-subtle)}.go-textTitle{font-size:1.125rem;font-weight:600;line-height:1.25rem}.go-textLabel{font-size:.875rem;font-weight:600;line-height:1rem}.go-textPagination{font-size:.875rem;line-height:1rem}code,pre,textarea.code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.875rem;line-height:1.5em}pre,textarea.code{background-color:var(--color-background-accented);border:var(--border);border-radius:var(--border-radius);color:var(--color-text);overflow-x:auto;padding:.625rem;tab-size:4;white-space:pre}button,input,select,textarea{font:inherit}a,a:link,a:visited{color:var(--color-brand-primary);text-decoration:none}a:hover,a:hover>*{color:var(--color-brand-primary);text-decoration:underline}button:focus:not([disabled]){border-color:var(--color-brand-primary);-webkit-box-shadow:var(--focus-box-shadow);box-shadow:var(--focus-box-shadow);outline:transparent}.go-Button{align-items:center;background-color:var(--color-button);border:.0625rem solid transparent;border-radius:var(--border-radius);color:var(--color-button-text);cursor:pointer;display:inline-flex;font-weight:500;gap:.25rem}.go-Button:not(.go-Button--inline){padding:.5rem}.go-Button--accented{background-color:var(--color-button-accented);color:var(--color-button-accented-text)}.go-Button--inverted,.go-Button--text,.go-Button--inline{background-color:var(--color-button-inverted);color:var(--color-button-inverted-text)}.go-Button--inline{background-color:transparent}.go-Button--inverted{border:var(--border)}.go-Button:hover{box-shadow:var(--focus-box-shadow);filter:contrast(.95)}.go-Button--inline:hover{box-shadow:none;text-decoration:underline var(--color-button-inverted-text)}.go-Button:focus{filter:contrast(.95)}.go-Button--inverted:focus{border-color:var(--color-button-inverted-text)}.go-Button:active{box-shadow:none;filter:contrast(.85)}.go-Button:disabled{background-color:var(--color-button-disabled);box-shadow:none;color:var(--color-button-text-disabled);cursor:initial;filter:none;text-decoration:none}.go-Button--accented:disabled{background-color:var(--color-button-accented-disabled);color:var(--color-button-accented-text-disabled)}.go-Button--inverted:disabled,.go-Button--text:disabled,.go-Button--inline:disabled{background-color:var(--color-button-inverted-disabled);color:var(--color-button-inverted-text-disabled)}.go-Button--inline:disabled{background-color:transparent}.go-Breadcrumb ol{line-height:1.5rem;white-space:initial}.go-Breadcrumb li{align-items:center;color:var(--color-text-subtle);display:inline-flex;font-size:.875rem}.go-Breadcrumb li:not(:last-child):after{content:">";padding:0 .5rem}.go-Breadcrumb li:last-child>a{color:var(--color-text-subtle)}.go-Breadcrumb li>.go-Clipboard{margin:0 .5rem}.go-Chip{background:var(--color-button);border:.0625rem solid var(--color-button);border-radius:1.25rem;color:var(--color-button-text);font-size:.75rem;padding:.125rem .625rem}.go-Chip--accented{background:var(--color-button-accented);border:.0625rem solid var(--color-button-accented);color:var(--color-button-accented-text)}.go-Chip--inverted{background:var(--color-button-inverted);border:var(--border);color:var(--color-text)}.go-Chip--highlighted{background:var(--color-background-highlighted-link);border-color:var(--color-background-highlighted-link);color:var(--color-brand-primary)}.go-Chip--alert{background:var(--pink);border:.0625rem solid var(--pink);color:var(--color-text-inverted)}.go-Chip--subtle{background-color:var(--color-background-accented);border-color:transparent;color:var(--color-text-subtle)}.go-Clipboard{position:relative}.go-Clipboard:before{background-color:var(--color-background-inverted);border-radius:var(--border-radius);color:var(--color-text-inverted);content:attr(data-tooltip);display:block;font-size:.9em;left:calc(100% + .125rem);padding:.25rem .3rem;position:absolute;text-transform:uppercase;top:.125rem;white-space:nowrap;z-index:1000}.go-Clipboard:after{border-bottom:.25rem solid transparent;border-left:0;border-right:.25rem solid var(--color-background-inverted);border-top:.25rem solid transparent;content:"";display:block;position:absolute;right:-.125rem;top:.5625rem;z-index:1000}.go-Clipboard:not([data-tooltip]):before,.go-Clipboard:not([data-tooltip]):after,.go-Clipboard[data-tooltip=""]:before,.go-Clipboard[data-tooltip=""]:after{display:none}:root{--gray-1: #202224;--gray-2: #3e4042;--gray-3: #555759;--gray-4: #6e7072;--gray-5: #848688;--gray-6: #aaacae;--gray-7: #c6c8ca;--gray-8: #dcdee0;--gray-9: #f0f1f2;--gray-10: #f8f8f8;--turq-light: #5dc9e2;--turq-med: #50b7e0;--turq-dark: #007d9c;--blue: #bfeaf4;--blue-light: #f2fafd;--black: #000;--green: #3a6e11;--green-light: #5fda64;--pink: #ce3262;--pink-light: #fdecf1;--purple: #542c7d;--slate: #253443;--white: #fff;--yellow: #fddd00;--yellow-light: #fff8cc;--color-brand-primary: var(--turq-dark);--color-background: var(--white);--color-background-inverted: var(--slate);--color-background-accented: var(--gray-10);--color-background-highlighted: var(--blue);--color-background-highlighted-link: var(--blue-light);--color-background-info: var(--gray-9);--color-background-warning: var(--yellow-light);--color-background-alert: var(--pink-light);--color-border: var(--gray-7);--color-text: var(--gray-1);--color-text-subtle: var(--gray-4);--color-text-inverted: var(--white);--color-code-comment: var(--green);--color-input: var(--color-background);--color-input-text: var(--color-text);--color-button: var(--turq-dark);--color-button-disabled: var(--gray-9);--color-button-text: var(--white);--color-button-text-disabled: var(--gray-3);--color-button-inverted: var(--color-background);--color-button-inverted-disabled: var(--color-background);--color-button-inverted-text: var(--color-brand-primary);--color-button-inverted-text-disabled: var(--color-text-subtle);--color-button-accented: var(--yellow);--color-button-accented-disabled: var(--gray-9);--color-button-accented-text: var(--gray-1);--color-button-accented-text-disabled: var(--gray-3)}[data-theme=dark]{--color-brand-primary: var(--turq-med);--color-background: var(--gray-1);--color-background-accented: var(--gray-2);--color-background-highlighted: var(--gray-2);--color-background-highlighted-link: var(--gray-2);--color-background-info: var(--gray-3);--color-background-warning: var(--yellow);--color-background-alert: var(--pink);--color-border: var(--gray-4);--color-text: var(--gray-9);--color-text-subtle: var(--gray-7);--color-code-comment: var(--green-light)}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--color-brand-primary: var(--turq-med);--color-background: var(--gray-1);--color-background-accented: var(--gray-2);--color-background-highlighted: var(--gray-2);--color-background-highlighted-link: var(--gray-2);--color-background-info: var(--gray-3);--color-background-warning: var(--yellow);--color-background-alert: var(--pink);--color-border: var(--gray-4);--color-text: var(--gray-9);--color-text-subtle: var(--gray-7);--color-code-comment: var(--green-light)}}.go-Footer{background-color:var(--color-background-inverted);color:var(--color-text-inverted);font-size:.875rem;width:100%}.go-Footer-links{display:flex;flex-wrap:wrap;justify-content:space-between;margin:auto;max-width:75.75rem;padding:2rem 1.5rem 2.625rem}.go-Footer-linkColumn{flex:0 0 9.5rem}.go-Footer .go-Footer-link{color:var(--color-text-inverted);display:flex;flex:1;font-size:.875rem;line-height:2rem}.go-Footer .go-Footer-link--primary{font-size:1.125rem;line-height:1.75rem;margin-bottom:.5rem;margin-top:.75rem}.go-Footer-bottom{align-items:center;border-top:var(--border);display:flex;margin:0 1.5rem;min-height:4.125rem}.go-Footer-gopher{align-self:flex-end;height:3.147rem;width:5rem}.go-Footer-listRow{display:flex;flex:1;flex-wrap:wrap;list-style:none;margin:0;padding:0;text-align:center}.go-Footer-listItem{align-items:center;display:flex;flex:1 100%;justify-content:center;margin:.4rem 0;padding:0 1rem}.go-Footer-listItem a:link,.go-Footer-listItem a:visited{color:var(--color-text-inverted)}.go-Footer-googleLogo{align-self:flex-end;height:1.5rem;margin-bottom:1.3rem;text-align:right}.go-Footer-googleLogoImg{height:1.5rem;width:4.529rem}@media only screen and (min-width: 52rem){.go-Footer-listItem{flex:initial}.go-Footer-listItem+.go-Footer-listItem{border-left:var(--border)}}select:focus:not([disabled]),input:focus:not([disabled]){border-color:var(--color-brand-primary);-webkit-box-shadow:var(--focus-box-shadow);box-shadow:var(--focus-box-shadow);outline:transparent;z-index:2}input::placeholder{color:var(--color-text-subtle)}.go-Form{align-items:start;display:flex;flex-direction:column;gap:1rem}.go-Label{display:flex;flex-direction:column;gap:.5rem}.go-Label--inline{align-items:center;flex-direction:row}.go-Label legend{margin-bottom:.5rem}.go-Label--inline legend{float:left;margin-bottom:0}.go-Input,.go-Select{background:var(--color-input);border:var(--border);border-radius:var(--border-radius);color:var(--color-input-text)}.go-Input{padding:.40625rem .5rem}.go-Select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:url(/static/shared/icon/arrow_drop_down_gm_grey_24dp.svg) right no-repeat;background-color:var(--color-background);background-position:right center;border-radius:var(--border-radius);margin:0;padding:.34375rem 1.25rem .34375rem .5rem}.go-InputGroup{display:flex}.go-InputGroup .go-Input{flex:1}.go-InputGroup>:not(:first-child,:last-child){border-radius:0;margin-left:-.0625rem}.go-InputGroup>:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.go-InputGroup>:last-child{border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-.0625rem}.go-InputGroup>*:hover,.go-InputGroup>*:focus{z-index:1}.go-GopherMessage img{display:block;height:15rem;margin:0 auto;padding:1.25rem 0;width:15rem}.go-GopherMessage p{font-weight:600;margin:auto;text-align:center}.go-Banner{background-color:var(--gray-1);display:none}.go-Banner-inner{align-items:center;display:flex;justify-content:space-between;margin:0 auto;max-width:75.75rem;min-height:2.5rem;padding:.5rem var(--gutter)}.Site--wide .go-Banner-inner{max-width:98rem}.go-Banner--full .go-Banner-inner{max-width:unset}.go-Banner-message{color:var(--white);margin-right:1.25rem}.go-Banner-action:link,.go-Banner-action:visited{color:var(--white);text-decoration:underline;white-space:nowrap}@media only screen and (min-width: 52rem){.go-Banner{display:block}}.go-Header{background:#007d9c;border-bottom:none;box-shadow:0 .0625rem .125rem #ababab4d;top:0;width:100%;z-index:10}.go-Header-inner{margin:0 auto;max-width:75.75rem;padding:0 var(--gutter)}.Site--wide .go-Header-inner{max-width:98rem}.go-Header--full .go-Header-inner{max-width:initial}.go-Header-nav{align-items:center;display:flex;height:3.5rem;justify-content:space-between}.go-Header-rightContent{align-items:center;display:flex;height:100%;justify-content:flex-end;width:100%}.go-Header-rightContent form{flex-grow:1}.go-Header-inner--dark{border-bottom:none;color:var(--white)}.go-Header-logo{display:block;height:2rem;margin-right:2.25rem;width:5.125rem}.go-Header-logo--hidden{display:none}.go-Header-menuItem{display:none}.go-Header-menu{align-items:stretch;display:flex;height:100%;list-style:none;margin:0;padding:0}@media only screen and (min-width: 57.7rem){.go-Header-menuItem{align-items:stretch;display:inline-flex;flex:none}.go-Header-menu{justify-content:flex-end}.go-Header-navOpen{display:none}}.go-Header-menuItem a:link,.go-Header-menuItem a:visited{align-items:center;border-bottom:.1875rem solid transparent;border-top:.1875rem solid transparent;color:var(--gray-2);display:inline-flex;margin:0 .3125rem;padding:0 .9375rem;text-align:center;text-decoration:none;width:100%}.go-Header-menuItem--active a:link,.go-Header-menuItem--active a:visited{border-bottom-color:var(--turq-med);font-weight:bold}.go-Header-menuItem a:hover{border-bottom-color:var(--white);color:var(--gray-2)}.go-NavigationDrawer-listItem a:link,.go-NavigationDrawer-listItem a:visited{display:block;margin:0 1rem;padding:.5rem}.go-Header-inner--dark .go-Header-menuItem a:link,.go-Header-inner--dark .go-Header-menuItem a:visited{color:var(--white)}.go-Header-navOpen{background:no-repeat center/2rem url(/images/menu-24px.svg);border:none;height:2.5rem;margin-left:1rem;width:2.5rem}.go-Header-navOpen--hidden{display:none}.go-Header-navOpen--white{background:no-repeat center/2rem url(/static/shared/icon/menu_gm_grey_24dp.svg);filter:brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg) brightness(103%) contrast(107%)}.go-SearchForm--expanded{flex-grow:1}.go-SearchForm-form{display:none}.go-SearchForm--expanded .go-SearchForm-form{display:flex}.go-SearchForm-expandSearch{appearance:none;background:none;font-size:1.5rem}.go-SearchForm--expanded .go-SearchForm-expandSearch{display:none}@media only screen and (min-width: 32rem){.go-Header-rightContent{width:100%}.go-SearchForm{flex:1}.go-SearchForm-form{display:flex}.go-SearchForm-expandSearch{display:none}.go-Header-logo--hidden{display:initial}}.go-NavigationDrawer{background:var(--white);height:100%;left:auto;max-width:27rem;position:fixed;right:0;top:0;transform:translate(100%);transition:transform .1s ease-in-out;width:85%;z-index:30}@media only screen and (min-width: 50rem){.go-NavigationDrawer{display:none}}.go-NavigationDrawer.is-active{transform:translate(0)}.go-NavigationDrawer-header{align-items:center;display:flex;justify-content:space-between}.go-NavigationDrawer-logo{display:block;height:2rem;margin:1rem;width:5.125rem}.go-NavigationDrawer-list{list-style:none;margin:0;padding:0}.go-NavigationDrawer-listItem{font-size:1.125rem;margin:0 .5rem}.go-NavigationDrawer-listItem--active{background-color:var(--blue);border-radius:.4rem}.go-NavigationDrawer-scrim{display:none;height:100%;left:0;position:fixed;top:0;width:100%;z-index:20}.go-NavigationDrawer.is-active+.go-NavigationDrawer-scrim{background-color:var(--gray-1);display:block;opacity:.32}.go-Icon{filter:none;height:1.125em;vertical-align:text-bottom;width:auto}.go-Icon--accented{filter:brightness(0) invert(45%) sepia(94%) saturate(6735%) hue-rotate(176deg) brightness(94%) contrast(101%)}.go-Icon--inverted{filter:brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg) brightness(103%) contrast(107%)}[data-theme=dark] .go-Icon:not(.go-Icon--accented){filter:brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg) brightness(103%) contrast(107%)}[data-theme=dark] .go-Icon--accented{filter:brightness(0) invert(69%) sepia(46%) saturate(466%) hue-rotate(153deg) brightness(90%) contrast(88%)}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .go-Icon:not(.go-Icon--accented){filter:brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg) brightness(103%) contrast(107%)}:root:not([data-theme="light"]) .go-Icon--accented{filter:brightness(0) invert(57%) sepia(63%) saturate(4864%) hue-rotate(160deg) brightness(100%) contrast(101%)}}.go-Message{color:var(--color-text);font-size:.875rem;line-height:1.5rem;padding:0 var(--gutter);width:100%}.go-Message--notice{background-color:var(--color-background-info)}.go-Message--warning{background-color:var(--color-background-warning);color:var(--gray-1)}.go-Message--alert{background-color:var(--color-background-alert)}.go-Message>.go-Icon{vertical-align:text-top}[data-theme=dark] .go-Message--warning .go-Icon{filter:none}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .go-Message--warning .go-Icon{filter:none}}dialog{position:absolute;left:0;right:0;width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;height:-moz-fit-content;height:-webkit-fit-content;height:fit-content;margin:auto;border:solid;padding:1em;background:white;color:#000;display:block}dialog:not([open]){display:none}dialog+.backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.1)}._dialog_overlay{position:fixed;top:0;right:0;bottom:0;left:0}dialog.fixed{position:fixed;top:50%;transform:translateY(-50%)}.go-Modal{background:var(--color-background);border:var(--border);border-radius:var(--border-radius);bottom:0;box-shadow:var(--box-shadow);color:var(--color-text);display:flex;flex-direction:column;gap:1rem;max-height:100%;max-width:100%;position:fixed;top:0}.go-Modal>form{display:contents}.go-Modal--small{width:20rem}.go-Modal--md{width:30rem}.go-Modal--lg{width:40rem}.go-Modal-header{display:flex;justify-content:space-between}.go-Modal-header h2{font-size:1.15rem;line-height:1.25rem}.go-Modal-body{flex-grow:1;min-height:2rem;min-width:18rem}.go-Modal-actions{text-align:right}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){.go-Modal{padding-bottom:0}}}.go-Tree{--js-tree-height: 0;display:flex;flex-direction:column}.go-Tree ul{list-style:none;padding-left:0}.go-Tree li:last-of-type{padding-bottom:.25rem}.go-Tree a+ul{display:none}.go-Tree a[aria-expanded=true]+ul[role=group]{display:block}.go-Tree a[aria-level="1"]+ul[role=group]{max-height:calc(100vh - var(--js-tree-height, 0) - var(--js-sticky-header-height, 3.5rem) - 5rem);overflow-y:auto;padding:.5rem .25rem 0}.go-Tree a{color:var(--color-text-subtle);display:block;line-height:1.5rem;overflow:hidden;padding:.125rem 0 .125rem 1.25rem;position:relative;text-overflow:ellipsis;user-select:none;white-space:nowrap}.go-Tree>li>a,.go-Tree a[aria-level="1"]{display:block;font-size:1rem;font-weight:500;line-height:2.5rem;padding:0 1rem}.go-Tree a:focus,.go-Tree a:hover{text-decoration:underline;z-index:1}.go-Tree a[aria-selected=true]{color:var(--color-text);font-weight:500}.go-Tree a[aria-level="1"][aria-selected=true],.go-Tree a[aria-level="1"][aria-expanded=true]{background-color:var(--color-background-accented)}.go-Tree a[aria-level="3"][aria-expanded=true]{margin-bottom:.375em}.go-Tree a[aria-level="2"]{margin-bottom:.25rem;position:relative}.go-Tree a[aria-level="3"]{padding-left:2.5rem}.go-Tree a[aria-level="4"]{border-left:.125rem solid var(--color-background-accented);margin-left:2.5rem;padding-left:.5rem}.go-Tree a[aria-selected=true][aria-level="2"]:not([aria-expanded]):before,.go-Tree a[aria-selected=true][aria-level="3"]:not([aria-expanded]):before{background-color:var(--color-brand-primary);border-radius:50%;content:"";display:block;height:.3125rem;left:.4688rem;position:absolute;top:.75rem;width:.3125rem}.go-Tree a[aria-expanded][aria-owns][aria-level="2"]:before,.go-Tree a[aria-expanded][aria-owns][aria-level="3"]:before{border-bottom:.25rem solid transparent;border-left:.25rem solid var(--color-border);border-right:0;border-top:.25rem solid transparent;content:"";display:block;height:0;left:.5rem;position:absolute;top:.625rem;transition:transform .1s linear;width:0}.go-Tree a[aria-expanded=true][aria-level="2"]:before,.go-Tree a[aria-expanded=true][aria-level="3"]:before{transform:rotate(90deg)}.go-Tree a[aria-expanded][aria-level="3"]:not([empty]):before,.go-Tree a[aria-selected][aria-level="3"]:not([empty]):before{left:1.5rem;top:.75rem}.go-Tree a[aria-selected=true][aria-level="4"]{border-left:.125rem solid var(--color-brand-primary)}.go-Tooltip{border-radius:var(--border-radius);cursor:pointer;display:inline-block;position:relative}.go-Tooltip>summary{list-style:none}.go-Tooltip>summary::-webkit-details-marker,.go-Tooltip>summary::marker{display:none}.go-Tooltip>summary>img{vertical-align:text-bottom}.go-Tooltip p{background:var(--color-background) 80%;border:var(--border);border-radius:var(--border-radius);color:var(--color-text);font-size:.75rem;letter-spacing:.01875rem;line-height:1rem;padding:.5rem;position:absolute;top:1.5rem;white-space:normal;width:12rem;z-index:100}:root{--gutter: 1rem;--gap: 1rem;--scroll-margin: calc( var(--js-sticky-header-height, 3.5rem) + var(--js-sticky-nav-height, 0) + 2rem );--border: .0625rem solid var(--color-border);--border-radius: .25rem;--box-shadow: 0 0 .375rem 0 rgb(0 0 0 / 25%);--focus-box-shadow: 0 0 .0625rem .0625rem rgba(0, 112, 210, .6)}[data-theme=dark]{--box-shadow: 0 .3125rem .9375rem rgb(0 0 0 / 45%)}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--box-shadow: 0 .3125rem .9375rem rgb(0 0 0 / 45%)}}@media (min-width: 50rem){:root{--gutter: 1.5rem;--gap: 2rem;--scroll-margin: calc( var(--js-sticky-header-height, 3.5rem) + var(--js-sticky-nav-height, 0) + 1rem )}}@media (min-width: 80rem){:root{--gutter: 2rem}}@media (min-width: 112rem){:root{--gutter: 2.5rem}}*:target{scroll-margin-top:var(--scroll-margin)}body{background-color:var(--color-background);display:flex;flex-direction:column;min-height:100vh;min-width:23.5rem;-webkit-overflow-scrolling:touch}.go-Container{display:flex;flex-direction:column;flex-grow:1;height:100%;margin-bottom:5rem}.go-Content{display:flex;flex-flow:column;gap:1rem;margin:0 auto;max-width:63rem;min-height:32rem;padding:2rem var(--gutter);width:100%}.go-Content--center{justify-content:center;margin:auto}
+/*# sourceMappingURL=frontend.min.css.map */
diff --git a/static/frontend/frontend.min.css.map b/static/frontend/frontend.min.css.map
new file mode 100644
index 0000000..61cb864
--- /dev/null
+++ b/static/frontend/frontend.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["../shared/reset.css", "../shared/typography/typography.css", "../shared/button/button.css", "../shared/breadcrumb/breadcrumb.css", "../shared/chip/chip.css", "../shared/clipboard/clipboard.css", "../shared/color/color.css", "../shared/footer/footer.css", "../shared/form/form.css", "../shared/gopher/gopher.css", "../shared/header/header.css", "../shared/icon/icon.css", "../shared/message/message.css", "../../third_party/dialog-polyfill/dialog-polyfill.css", "../shared/modal/modal.css", "../shared/outline/tree.css", "../shared/tooltip/tooltip.css", "../shared/shared.css"],
+  "sourcesContent": ["/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/*!\n * http://meyerweb.com/eric/tools/css/reset/\n * v2.0 | 20110126\n * License: none (public domain)\n */\n\nhtml,\nbody,\nbutton,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\ninput,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\ndialog,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n  border: 0;\n  font: inherit;\n  font-size: 100%;\n  margin: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n  display: block;\n}\nbody {\n  line-height: 1;\n}\nol,\nul {\n  list-style: none;\n}\nblockquote,\nq {\n  quotes: none;\n}\nblockquote::before,\nblockquote::after,\nq::before,\nq::after {\n  content: '';\n  content: none;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n*,\n::before,\n::after {\n  box-sizing: border-box;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nbody {\n  color: var(--color-text);\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif,\n    'Apple Color Emoji', 'Segoe UI Emoji';\n  font-size: 1rem;\n  line-height: normal;\n}\nh1 {\n  font-size: 1.5rem;\n}\nh2 {\n  font-size: 1.375rem;\n}\nh3 {\n  font-size: 1.25rem;\n}\nh4 {\n  font-size: 1.125rem;\n}\nh5 {\n  font-size: 1rem;\n}\nh6 {\n  font-size: 0.875rem;\n}\n\nh1,\nh2,\nh3,\nh4 {\n  font-weight: 600;\n  line-height: 1.25em;\n  word-break: break-word;\n}\nh5,\nh6 {\n  font-weight: 500;\n  line-height: 1.3em;\n  word-break: break-word;\n}\n\nhr {\n  border: none;\n  border-bottom: var(--border);\n  margin: 0;\n  width: 100%;\n}\n\np {\n  font-size: 1rem;\n  line-height: 1.5rem;\n  max-width: 60rem;\n}\nstrong {\n  font-weight: 600;\n}\n\n.go-textSubtle {\n  color: var(--color-text-subtle);\n}\n.go-textTitle {\n  font-size: 1.125rem;\n  font-weight: 600;\n  line-height: 1.25rem;\n}\n.go-textLabel {\n  font-size: 0.875rem;\n  font-weight: 600;\n  line-height: 1rem;\n}\n.go-textPagination {\n  font-size: 0.875rem;\n  line-height: 1rem;\n}\ncode,\npre,\ntextarea.code {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.875rem;\n  line-height: 1.5em;\n}\npre,\ntextarea.code {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: var(--border-radius);\n  color: var(--color-text);\n  overflow-x: auto;\n  padding: 0.625rem;\n  tab-size: 4;\n  white-space: pre;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  font: inherit;\n}\n\na,\na:link,\na:visited {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\na:hover,\na:hover > * {\n  color: var(--color-brand-primary);\n  text-decoration: underline;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nbutton:focus:not([disabled]) {\n  border-color: var(--color-brand-primary);\n  -webkit-box-shadow: var(--focus-box-shadow);\n  box-shadow: var(--focus-box-shadow);\n  outline: transparent;\n}\n\n.go-Button {\n  align-items: center;\n  background-color: var(--color-button);\n  border: 0.0625rem solid transparent;\n  border-radius: var(--border-radius);\n  color: var(--color-button-text);\n  cursor: pointer;\n  display: inline-flex;\n  font-weight: 500;\n  gap: 0.25rem;\n}\n.go-Button:not(.go-Button--inline) {\n  padding: 0.5rem;\n}\n\n.go-Button--accented {\n  background-color: var(--color-button-accented);\n  color: var(--color-button-accented-text);\n}\n.go-Button--inverted,\n.go-Button--text,\n.go-Button--inline {\n  background-color: var(--color-button-inverted);\n  color: var(--color-button-inverted-text);\n}\n.go-Button--inline {\n  background-color: transparent;\n}\n\n.go-Button--inverted {\n  border: var(--border);\n}\n\n.go-Button:hover {\n  box-shadow: var(--focus-box-shadow);\n  filter: contrast(0.95);\n}\n.go-Button--inline:hover {\n  box-shadow: none;\n  text-decoration: underline var(--color-button-inverted-text);\n}\n.go-Button:focus {\n  filter: contrast(0.95);\n}\n.go-Button--inverted:focus {\n  border-color: var(--color-button-inverted-text);\n}\n.go-Button:active {\n  box-shadow: none;\n  filter: contrast(0.85);\n}\n\n.go-Button:disabled {\n  background-color: var(--color-button-disabled);\n  box-shadow: none;\n  color: var(--color-button-text-disabled);\n  cursor: initial;\n  filter: none;\n  text-decoration: none;\n}\n.go-Button--accented:disabled {\n  background-color: var(--color-button-accented-disabled);\n  color: var(--color-button-accented-text-disabled);\n}\n.go-Button--inverted:disabled,\n.go-Button--text:disabled,\n.go-Button--inline:disabled {\n  background-color: var(--color-button-inverted-disabled);\n  color: var(--color-button-inverted-text-disabled);\n}\n.go-Button--inline:disabled {\n  background-color: transparent;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Breadcrumb ol {\n  line-height: 1.5rem;\n  white-space: initial;\n}\n.go-Breadcrumb li {\n  align-items: center;\n  color: var(--color-text-subtle);\n  display: inline-flex;\n  font-size: 0.875rem;\n}\n.go-Breadcrumb li:not(:last-child)::after {\n  content: '>';\n  padding: 0 0.5rem;\n}\n.go-Breadcrumb li:last-child > a {\n  color: var(--color-text-subtle);\n}\n.go-Breadcrumb li > .go-Clipboard {\n  margin: 0 0.5rem;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Chip {\n  background: var(--color-button);\n  border: 0.0625rem solid var(--color-button);\n  border-radius: 1.25rem;\n  color: var(--color-button-text);\n  font-size: 0.75rem;\n  padding: 0.125rem 0.625rem;\n}\n.go-Chip--accented {\n  background: var(--color-button-accented);\n  border: 0.0625rem solid var(--color-button-accented);\n  color: var(--color-button-accented-text);\n}\n.go-Chip--inverted {\n  background: var(--color-button-inverted);\n  border: var(--border);\n  color: var(--color-text);\n}\n.go-Chip--highlighted {\n  background: var(--color-background-highlighted-link);\n  border-color: var(--color-background-highlighted-link);\n  color: var(--color-brand-primary);\n}\n.go-Chip--alert {\n  background: var(--pink);\n  border: 0.0625rem solid var(--pink);\n  color: var(--color-text-inverted);\n}\n.go-Chip--subtle {\n  background-color: var(--color-background-accented);\n  border-color: transparent;\n  color: var(--color-text-subtle);\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Clipboard {\n  position: relative;\n}\n.go-Clipboard::before {\n  background-color: var(--color-background-inverted);\n  border-radius: var(--border-radius);\n  color: var(--color-text-inverted);\n  content: attr(data-tooltip);\n  display: block;\n  font-size: 0.9em;\n  left: calc(100% + 0.125rem);\n  padding: 0.25rem 0.3rem;\n  position: absolute;\n  text-transform: uppercase;\n  top: 0.125rem;\n  white-space: nowrap;\n  z-index: 1000;\n}\n.go-Clipboard::after {\n  border-bottom: 0.25rem solid transparent;\n  border-left: 0;\n  border-right: 0.25rem solid var(--color-background-inverted);\n  border-top: 0.25rem solid transparent;\n  content: '';\n  display: block;\n  position: absolute;\n  right: -0.125rem;\n  top: 0.5625rem;\n  z-index: 1000;\n}\n.go-Clipboard:not([data-tooltip])::before,\n.go-Clipboard:not([data-tooltip])::after,\n.go-Clipboard[data-tooltip='']::before,\n.go-Clipboard[data-tooltip='']::after {\n  display: none;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n:root {\n  /* Colors */\n  --gray-1: #202224;\n  --gray-2: #3e4042;\n  --gray-3: #555759;\n  --gray-4: #6e7072;\n  --gray-5: #848688;\n  --gray-6: #aaacae;\n  --gray-7: #c6c8ca;\n  --gray-8: #dcdee0;\n  --gray-9: #f0f1f2;\n  --gray-10: #f8f8f8;\n  --turq-light: #5dc9e2;\n  --turq-med: #50b7e0;\n  --turq-dark: #007d9c;\n  --blue: #bfeaf4;\n  --blue-light: #f2fafd;\n  --black: #000;\n  --green: #3a6e11;\n  --green-light: #5fda64;\n  --pink: #ce3262;\n  --pink-light: #fdecf1;\n  --purple: #542c7d;\n  --slate: #253443; /* Footer background. */\n  --white: #fff;\n  --yellow: #fddd00;\n  --yellow-light: #fff8cc;\n\n  /* Color Intents */\n  --color-brand-primary: var(--turq-dark);\n  --color-background: var(--white);\n  --color-background-inverted: var(--slate);\n  --color-background-accented: var(--gray-10);\n  --color-background-highlighted: var(--blue);\n  --color-background-highlighted-link: var(--blue-light);\n  --color-background-info: var(--gray-9);\n  --color-background-warning: var(--yellow-light);\n  --color-background-alert: var(--pink-light);\n  --color-border: var(--gray-7);\n  --color-text: var(--gray-1);\n  --color-text-subtle: var(--gray-4);\n  --color-text-inverted: var(--white);\n  --color-code-comment: var(--green);\n\n  /* Interactive Colors */\n  --color-input: var(--color-background);\n  --color-input-text: var(--color-text);\n  --color-button: var(--turq-dark);\n  --color-button-disabled: var(--gray-9);\n  --color-button-text: var(--white);\n  --color-button-text-disabled: var(--gray-3);\n  --color-button-inverted: var(--color-background);\n  --color-button-inverted-disabled: var(--color-background);\n  --color-button-inverted-text: var(--color-brand-primary);\n  --color-button-inverted-text-disabled: var(--color-text-subtle);\n  --color-button-accented: var(--yellow);\n  --color-button-accented-disabled: var(--gray-9);\n  --color-button-accented-text: var(--gray-1);\n  --color-button-accented-text-disabled: var(--gray-3);\n}\n\n[data-theme='dark'] {\n  --color-brand-primary: var(--turq-med);\n  --color-background: var(--gray-1);\n  --color-background-accented: var(--gray-2);\n  --color-background-highlighted: var(--gray-2);\n  --color-background-highlighted-link: var(--gray-2);\n  --color-background-info: var(--gray-3);\n  --color-background-warning: var(--yellow);\n  --color-background-alert: var(--pink);\n  --color-border: var(--gray-4);\n  --color-text: var(--gray-9);\n  --color-text-subtle: var(--gray-7);\n  --color-code-comment: var(--green-light);\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme='light']) {\n    --color-brand-primary: var(--turq-med);\n    --color-background: var(--gray-1);\n    --color-background-accented: var(--gray-2);\n    --color-background-highlighted: var(--gray-2);\n    --color-background-highlighted-link: var(--gray-2);\n    --color-background-info: var(--gray-3);\n    --color-background-warning: var(--yellow);\n    --color-background-alert: var(--pink);\n    --color-border: var(--gray-4);\n    --color-text: var(--gray-9);\n    --color-text-subtle: var(--gray-7);\n    --color-code-comment: var(--green-light);\n  }\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Footer {\n  background-color: var(--color-background-inverted);\n  color: var(--color-text-inverted);\n  font-size: 0.875rem;\n  width: 100%;\n}\n.go-Footer-links {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  margin: auto;\n  max-width: 75.75rem;\n  padding: 2rem 1.5rem 2.625rem 1.5rem;\n}\n.go-Footer-linkColumn {\n  flex: 0 0 9.5rem;\n}\n.go-Footer .go-Footer-link {\n  color: var(--color-text-inverted);\n  display: flex;\n  flex: 1;\n  font-size: 0.875rem;\n  line-height: 2rem;\n}\n.go-Footer .go-Footer-link--primary {\n  font-size: 1.125rem;\n  line-height: 1.75rem;\n  margin-bottom: 0.5rem;\n  margin-top: 0.75rem;\n}\n.go-Footer-bottom {\n  align-items: center;\n  border-top: var(--border);\n  display: flex;\n  margin: 0 1.5rem;\n  min-height: 4.125rem;\n}\n.go-Footer-gopher {\n  align-self: flex-end;\n  height: 3.147rem;\n  width: 5rem;\n}\n.go-Footer-listRow {\n  display: flex;\n  flex: 1;\n  flex-wrap: wrap;\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  text-align: center;\n}\n.go-Footer-listItem {\n  align-items: center;\n  display: flex;\n  flex: 1 100%;\n  justify-content: center;\n  margin: 0.4rem 0;\n  padding: 0 1rem;\n}\n.go-Footer-listItem a:link,\n.go-Footer-listItem a:visited {\n  color: var(--color-text-inverted);\n}\n\n.go-Footer-googleLogo {\n  align-self: flex-end;\n  height: 1.5rem;\n  margin-bottom: 1.3rem;\n  text-align: right;\n}\n.go-Footer-googleLogoImg {\n  height: 1.5rem;\n  width: 4.529rem;\n}\n\n@media only screen and (min-width: 52rem) {\n  .go-Footer-listItem {\n    flex: initial;\n  }\n  .go-Footer-listItem + .go-Footer-listItem {\n    border-left: var(--border);\n  }\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nselect:focus:not([disabled]),\ninput:focus:not([disabled]) {\n  border-color: var(--color-brand-primary);\n  -webkit-box-shadow: var(--focus-box-shadow);\n  box-shadow: var(--focus-box-shadow);\n  outline: transparent;\n  z-index: 2;\n}\n\ninput::placeholder {\n  color: var(--color-text-subtle);\n}\n\n.go-Form {\n  align-items: start;\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n.go-Label {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n.go-Label--inline {\n  align-items: center;\n  flex-direction: row;\n}\n.go-Label legend {\n  margin-bottom: 0.5rem;\n}\n.go-Label--inline legend {\n  float: left;\n  margin-bottom: 0;\n}\n.go-Input,\n.go-Select {\n  background: var(--color-input);\n  border: var(--border);\n  border-radius: var(--border-radius);\n  color: var(--color-input-text);\n}\n.go-Input {\n  padding: 0.40625rem 0.5rem;\n}\n.go-Select {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background: url('/static/shared/icon/arrow_drop_down_gm_grey_24dp.svg') right no-repeat;\n  background-color: var(--color-background);\n  background-position: right center;\n  border-radius: var(--border-radius);\n  margin: 0;\n  padding: 0.34375rem 1.25rem 0.34375rem 0.5rem;\n}\n\n.go-InputGroup {\n  display: flex;\n}\n.go-InputGroup .go-Input {\n  flex: 1;\n}\n.go-InputGroup > :not(:first-child, :last-child) {\n  border-radius: 0;\n  margin-left: -0.0625rem;\n}\n.go-InputGroup > :first-child {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.go-InputGroup > :last-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n  margin-left: -0.0625rem;\n}\n.go-InputGroup > *:hover,\n.go-InputGroup > *:focus {\n  z-index: 1;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-GopherMessage img {\n  display: block;\n  height: 15rem;\n  margin: 0 auto;\n  padding: 1.25rem 0;\n  width: 15rem;\n}\n.go-GopherMessage p {\n  font-weight: 600;\n  margin: auto;\n  text-align: center;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Banner {\n  background-color: var(--gray-1);\n\n  /**\n   * Only show on wide viewports so the\n   * text never wraps or gets cut off.\n   */\n  display: none;\n}\n.go-Banner-inner {\n  align-items: center;\n  display: flex;\n  justify-content: space-between;\n  margin: 0 auto;\n  max-width: 75.75rem;\n  min-height: 2.5rem;\n  padding: 0.5rem var(--gutter);\n}\n.Site--wide .go-Banner-inner {\n  max-width: 98rem;\n}\n.go-Banner--full .go-Banner-inner {\n  max-width: unset;\n}\n.go-Banner-message {\n  color: var(--white);\n  margin-right: 1.25rem;\n}\n.go-Banner-action:link,\n.go-Banner-action:visited {\n  color: var(--white);\n  text-decoration: underline;\n  white-space: nowrap;\n}\n@media only screen and (min-width: 52rem) {\n  .go-Banner {\n    display: block;\n  }\n}\n\n.go-Header {\n  background: #007d9c;\n  border-bottom: none;\n  box-shadow: 0 0.0625rem 0.125rem rgba(171, 171, 171, 0.3);\n  top: 0;\n  width: 100%;\n  z-index: 10;\n}\n.go-Header-inner {\n  margin: 0 auto;\n  max-width: 75.75rem;\n  padding: 0 var(--gutter);\n}\n.Site--wide .go-Header-inner {\n  max-width: 98rem;\n}\n.go-Header--full .go-Header-inner {\n  max-width: initial;\n}\n.go-Header-nav {\n  align-items: center;\n  display: flex;\n  height: 3.5rem;\n  justify-content: space-between;\n}\n.go-Header-rightContent {\n  align-items: center;\n  display: flex;\n  height: 100%;\n  justify-content: flex-end;\n  width: 100%;\n}\n.go-Header-rightContent form {\n  flex-grow: 1;\n}\n.go-Header-inner--dark {\n  border-bottom: none;\n  color: var(--white);\n}\n.go-Header-logo {\n  display: block;\n  height: 2rem;\n  margin-right: 2.25rem;\n  width: 5.125rem;\n}\n.go-Header-logo--hidden {\n  display: none;\n}\n.go-Header-menuItem {\n  display: none;\n}\n.go-Header-menu {\n  align-items: stretch;\n  display: flex;\n  height: 100%;\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n@media only screen and (min-width: 57.7rem) {\n  .go-Header-menuItem {\n    align-items: stretch;\n    display: inline-flex;\n    flex: none;\n  }\n  .go-Header-menu {\n    justify-content: flex-end;\n  }\n  .go-Header-navOpen {\n    display: none;\n  }\n}\n.go-Header-menuItem a:link,\n.go-Header-menuItem a:visited {\n  align-items: center;\n  border-bottom: 0.1875rem solid transparent;\n  border-top: 0.1875rem solid transparent; /* To ensure the text remains centered. */\n  color: var(--gray-2);\n  display: inline-flex;\n  margin: 0 0.3125rem;\n  padding: 0 0.9375rem;\n  text-align: center;\n  text-decoration: none;\n  width: 100%;\n}\n.go-Header-menuItem--active a:link,\n.go-Header-menuItem--active a:visited {\n  border-bottom-color: var(--turq-med);\n  font-weight: bold;\n}\n.go-Header-menuItem a:hover {\n  border-bottom-color: var(--white);\n  color: var(--gray-2);\n}\n.go-NavigationDrawer-listItem a:link,\n.go-NavigationDrawer-listItem a:visited {\n  display: block;\n  margin: 0 1rem;\n  padding: 0.5rem;\n}\n.go-Header-inner--dark .go-Header-menuItem a:link,\n.go-Header-inner--dark .go-Header-menuItem a:visited {\n  color: var(--white);\n}\n\n.go-Header-navOpen {\n  background: no-repeat center/2rem url('/images/menu-24px.svg');\n  border: none;\n  height: 2.5rem;\n  margin-left: 1rem;\n  width: 2.5rem;\n}\n.go-Header-navOpen--hidden {\n  display: none;\n}\n.go-Header-navOpen--white {\n  background: no-repeat center/2rem url('/static/shared/icon/menu_gm_grey_24dp.svg');\n  filter: brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg)\n    brightness(103%) contrast(107%);\n}\n\n.go-SearchForm--expanded {\n  flex-grow: 1;\n}\n.go-SearchForm-form {\n  display: none;\n}\n.go-SearchForm--expanded .go-SearchForm-form {\n  display: flex;\n}\n.go-SearchForm-expandSearch {\n  appearance: none;\n  background: none;\n  font-size: 1.5rem;\n}\n.go-SearchForm--expanded .go-SearchForm-expandSearch {\n  display: none;\n}\n\n@media only screen and (min-width: 32rem) {\n  .go-Header-rightContent {\n    width: 100%;\n  }\n  .go-SearchForm {\n    flex: 1;\n  }\n  .go-SearchForm-form {\n    display: flex;\n  }\n  .go-SearchForm-expandSearch {\n    display: none;\n  }\n  .go-Header-logo--hidden {\n    display: initial;\n  }\n}\n\n.go-NavigationDrawer {\n  background: var(--white);\n  height: 100%;\n  left: auto;\n  max-width: 27rem;\n  position: fixed;\n  right: 0;\n  top: 0;\n  transform: translateX(100%);\n  transition: transform 100ms ease-in-out;\n  width: 85%;\n  z-index: 30;\n}\n@media only screen and (min-width: 50rem) {\n  .go-NavigationDrawer {\n    display: none;\n  }\n}\n.go-NavigationDrawer.is-active {\n  transform: translateX(0);\n}\n.go-NavigationDrawer-header {\n  align-items: center;\n  display: flex;\n  justify-content: space-between;\n}\n.go-NavigationDrawer-logo {\n  display: block;\n  height: 2rem;\n  margin: 1rem 1rem;\n  width: 5.125rem;\n}\n.go-NavigationDrawer-list {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.go-NavigationDrawer-listItem {\n  font-size: 1.125rem;\n  margin: 0 0.5rem;\n}\n.go-NavigationDrawer-listItem--active {\n  background-color: var(--blue);\n  border-radius: 0.4rem;\n}\n.go-NavigationDrawer-scrim {\n  display: none;\n  height: 100%;\n  left: 0;\n  position: fixed;\n  top: 0;\n  width: 100%;\n  z-index: 20;\n}\n.go-NavigationDrawer.is-active + .go-NavigationDrawer-scrim {\n  background-color: var(--gray-1);\n  display: block;\n  opacity: 0.32;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Icon {\n  filter: none;\n  height: 1.125em;\n  vertical-align: text-bottom;\n  width: auto;\n}\n.go-Icon--accented {\n  filter: brightness(0) invert(45%) sepia(94%) saturate(6735%) hue-rotate(176deg) brightness(94%)\n    contrast(101%);\n}\n.go-Icon--inverted {\n  filter: brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg)\n    brightness(103%) contrast(107%);\n}\n\n[data-theme='dark'] .go-Icon:not(.go-Icon--accented) {\n  filter: brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg)\n    brightness(103%) contrast(107%);\n}\n[data-theme='dark'] .go-Icon--accented {\n  filter: brightness(0) invert(69%) sepia(46%) saturate(466%) hue-rotate(153deg) brightness(90%)\n    contrast(88%);\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme='light']) .go-Icon:not(.go-Icon--accented) {\n    filter: brightness(0) saturate(100%) invert(100%) sepia(97%) saturate(13%) hue-rotate(245deg)\n      brightness(103%) contrast(107%);\n  }\n  :root:not([data-theme='light']) .go-Icon--accented {\n    filter: brightness(0) invert(57%) sepia(63%) saturate(4864%) hue-rotate(160deg) brightness(100%)\n      contrast(101%);\n  }\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Message {\n  color: var(--color-text);\n  font-size: 0.875rem;\n  line-height: 1.5rem;\n  padding: 0 var(--gutter);\n  width: 100%;\n}\n.go-Message--notice {\n  background-color: var(--color-background-info);\n}\n.go-Message--warning {\n  background-color: var(--color-background-warning);\n  color: var(--gray-1);\n}\n.go-Message--alert {\n  background-color: var(--color-background-alert);\n}\n\n.go-Message > .go-Icon {\n  vertical-align: text-top;\n}\n\n[data-theme='dark'] .go-Message--warning .go-Icon {\n  filter: none;\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme='light']) .go-Message--warning .go-Icon {\n    filter: none;\n  }\n}\n", "dialog {\n  position: absolute;\n  left: 0; right: 0;\n  width: -moz-fit-content;\n  width: -webkit-fit-content;\n  width: fit-content;\n  height: -moz-fit-content;\n  height: -webkit-fit-content;\n  height: fit-content;\n  margin: auto;\n  border: solid;\n  padding: 1em;\n  background: white;\n  color: black;\n  display: block;\n}\n\ndialog:not([open]) {\n  display: none;\n}\n\ndialog + .backdrop {\n  position: fixed;\n  top: 0; right: 0; bottom: 0; left: 0;\n  background: rgba(0,0,0,0.1);\n}\n\n._dialog_overlay {\n  position: fixed;\n  top: 0; right: 0; bottom: 0; left: 0;\n}\n\ndialog.fixed {\n  position: fixed;\n  top: 50%;\n  transform: translate(0, -50%);\n}", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('../../../third_party/dialog-polyfill/dialog-polyfill.css');\n\n.go-Modal {\n  background: var(--color-background);\n  border: var(--border);\n  border-radius: var(--border-radius);\n  bottom: 0;\n  box-shadow: var(--box-shadow);\n  color: var(--color-text);\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  max-height: 100%;\n  max-width: 100%;\n  position: fixed;\n  top: 0;\n}\n.go-Modal > form {\n  display: contents;\n}\n.go-Modal--small {\n  width: 20rem;\n}\n.go-Modal--md {\n  width: 30rem;\n}\n.go-Modal--lg {\n  width: 40rem;\n}\n.go-Modal-header {\n  display: flex;\n  justify-content: space-between;\n}\n.go-Modal-header h2 {\n  font-size: 1.15rem;\n  line-height: 1.25rem;\n}\n.go-Modal-body {\n  flex-grow: 1;\n  min-height: 2rem;\n  min-width: 18rem;\n}\n.go-Modal-actions {\n  text-align: right;\n}\n\n/* Safari only */\n@media not all and (min-resolution: 0.001dpcm) {\n  @supports (-webkit-appearance: none) {\n    .go-Modal {\n      padding-bottom: 0;\n    }\n  }\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Tree {\n  --js-tree-height: 0;\n\n  display: flex;\n  flex-direction: column;\n}\n\n.go-Tree ul {\n  list-style: none;\n  padding-left: 0;\n}\n.go-Tree li:last-of-type {\n  padding-bottom: 0.25rem;\n}\n.go-Tree a + ul {\n  display: none;\n}\n.go-Tree a[aria-expanded='true'] + ul[role='group'] {\n  display: block;\n}\n.go-Tree a[aria-level='1'] + ul[role='group'] {\n  max-height: calc(\n    100vh - var(--js-tree-height, 0) - var(--js-sticky-header-height, 3.5rem) - 5rem\n  );\n  overflow-y: auto;\n  padding: 0.5rem 0.25rem 0 0.25rem;\n}\n.go-Tree a {\n  color: var(--color-text-subtle);\n  display: block;\n  line-height: 1.5rem;\n  overflow: hidden;\n  padding: 0.125rem 0 0.125rem 1.25rem;\n  position: relative;\n  text-overflow: ellipsis;\n  user-select: none;\n  white-space: nowrap;\n}\n.go-Tree > li > a,\n.go-Tree a[aria-level='1'] {\n  display: block;\n  font-size: 1rem;\n  font-weight: 500;\n  line-height: 2.5rem;\n  padding: 0 1rem;\n}\n.go-Tree a:focus,\n.go-Tree a:hover {\n  text-decoration: underline;\n  z-index: 1;\n}\n.go-Tree a[aria-selected='true'] {\n  color: var(--color-text);\n  font-weight: 500;\n}\n.go-Tree a[aria-level='1'][aria-selected='true'],\n.go-Tree a[aria-level='1'][aria-expanded='true'] {\n  background-color: var(--color-background-accented);\n}\n.go-Tree a[aria-level='3'][aria-expanded='true'] {\n  margin-bottom: 0.375em;\n}\n.go-Tree a[aria-level='2'] {\n  margin-bottom: 0.25rem;\n  position: relative;\n}\n.go-Tree a[aria-level='3'] {\n  padding-left: 2.5rem;\n}\n.go-Tree a[aria-level='4'] {\n  border-left: 0.125rem solid var(--color-background-accented);\n  margin-left: 2.5rem;\n  padding-left: 0.5rem;\n}\n.go-Tree a[aria-selected='true'][aria-level='2']:not([aria-expanded])::before,\n.go-Tree a[aria-selected='true'][aria-level='3']:not([aria-expanded])::before {\n  background-color: var(--color-brand-primary);\n  border-radius: 50%;\n  content: '';\n  display: block;\n  height: 0.3125rem;\n  left: 0.4688rem;\n  position: absolute;\n  top: 0.75rem;\n  width: 0.3125rem;\n}\n.go-Tree a[aria-expanded][aria-owns][aria-level='2']::before,\n.go-Tree a[aria-expanded][aria-owns][aria-level='3']::before {\n  border-bottom: 0.25rem solid transparent;\n  border-left: 0.25rem solid var(--color-border);\n  border-right: 0;\n  border-top: 0.25rem solid transparent;\n  content: '';\n  display: block;\n  height: 0;\n  left: 0.5rem;\n  position: absolute;\n  top: 0.625rem;\n  transition: transform 0.1s linear;\n  width: 0;\n}\n.go-Tree a[aria-expanded='true'][aria-level='2']::before,\n.go-Tree a[aria-expanded='true'][aria-level='3']::before {\n  transform: rotate(90deg);\n}\n.go-Tree a[aria-expanded][aria-level='3']:not([empty])::before,\n.go-Tree a[aria-selected][aria-level='3']:not([empty])::before {\n  left: 1.5rem;\n  top: 0.75rem;\n}\n.go-Tree a[aria-selected='true'][aria-level='4'] {\n  border-left: 0.125rem solid var(--color-brand-primary);\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.go-Tooltip {\n  border-radius: var(--border-radius);\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n}\n.go-Tooltip > summary {\n  list-style: none;\n}\n.go-Tooltip > summary::-webkit-details-marker,\n.go-Tooltip > summary::marker {\n  display: none;\n}\n.go-Tooltip > summary > img {\n  vertical-align: text-bottom;\n}\n.go-Tooltip p {\n  background: var(--color-background) 80%;\n  border: var(--border);\n  border-radius: var(--border-radius);\n  color: var(--color-text);\n  font-size: 0.75rem;\n  letter-spacing: 0.01875rem;\n  line-height: 1rem;\n  padding: 0.5rem;\n  position: absolute;\n  top: 1.5rem;\n  white-space: normal;\n  width: 12rem;\n  z-index: 100;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./reset.css');\n\n/**\n * Typography should be imported first in the list below to ensure expected\n * CSS rule inheritance on text elements.\n */\n@import url('./typography/typography.css');\n@import url('./button/button.css');\n@import url('./breadcrumb/breadcrumb.css');\n@import url('./chip/chip.css');\n@import url('./clipboard/clipboard.css');\n@import url('./color/color.css');\n@import url('./footer/footer.css');\n@import url('./form/form.css');\n@import url('./gopher/gopher.css');\n@import url('./header/header.css');\n@import url('./icon/icon.css');\n@import url('./message/message.css');\n@import url('./modal/modal.css');\n@import url('./outline/tree.css');\n@import url('./tooltip/tooltip.css');\n\n:root {\n  /* Padding at the left and right of the viewport. */\n  --gutter: 1rem;\n\n  /* Margin between containers in the grid layout. */\n  --gap: 1rem;\n\n  /* The margin placed above elements scrolled to by clicking hash links. */\n  --scroll-margin: calc(\n    var(--js-sticky-header-height, 3.5rem) + var(--js-sticky-nav-height, 0) + 2rem\n  );\n\n  /* Default styles for page elements. */\n  --border: 0.0625rem solid var(--color-border);\n  --border-radius: 0.25rem;\n  --box-shadow: 0 0 0.375rem 0 rgb(0 0 0 / 25%);\n  --focus-box-shadow: 0 0 0.0625rem 0.0625rem rgba(0, 112, 210, 0.6);\n}\n\n[data-theme='dark'] {\n  --box-shadow: 0 0.3125rem 0.9375rem rgb(0 0 0 / 45%);\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme='light']) {\n    --box-shadow: 0 0.3125rem 0.9375rem rgb(0 0 0 / 45%);\n  }\n}\n@media (min-width: 50rem) {\n  :root {\n    --gutter: 1.5rem;\n    --gap: 2rem;\n    --scroll-margin: calc(\n      var(--js-sticky-header-height, 3.5rem) + var(--js-sticky-nav-height, 0) + 1rem\n    );\n  }\n}\n@media (min-width: 80rem) {\n  :root {\n    --gutter: 2rem;\n  }\n}\n@media (min-width: 112rem) {\n  :root {\n    --gutter: 2.5rem;\n  }\n}\n\n*:target {\n  scroll-margin-top: var(--scroll-margin);\n}\n\nbody {\n  background-color: var(--color-background);\n  display: flex;\n  flex-direction: column;\n  min-height: 100vh;\n  min-width: 23.5rem;\n\n  /**\n   * This is used to programatically detect whether overflow needs to be altered\n   * to prevent jitter when focusing within fixed elements on iOS.\n   * It also must be set to 'touch' for the fix to work.\n   */\n  -webkit-overflow-scrolling: touch;\n}\n\n.go-Container {\n  display: flex;\n  flex-direction: column;\n  flex-grow: 1;\n  height: 100%;\n  margin-bottom: 5rem;\n}\n.go-Content {\n  display: flex;\n  flex-flow: column;\n  gap: 1rem;\n  margin: 0 auto;\n  max-width: 63rem;\n  min-height: 32rem;\n  padding: 2rem var(--gutter);\n  width: 100%;\n}\n.go-Content--center {\n  justify-content: center;\n  margin: auto;\n}\n"],
+  "mappings": ";;;;;AAYA,kbAqFE,SACA,aACA,eAnGF,mBAsGE,wBAIF,8EAWE,cAEF,KACE,cAEF,MAEE,gBAEF,aAEE,YAEF,oDAIE,WACA,aAEF,MACE,yBACA,iBAGF,iBAGE,sBC3IF,KACE,wBACA,wHAEA,eACA,mBAEF,GACE,iBAEF,GACE,mBAEF,GACE,kBAEF,GACE,mBAEF,GACE,eAEF,GACE,kBAGF,YAIE,gBACA,mBACA,sBAEF,MAEE,gBACA,kBACA,sBAGF,GACE,YACA,4BAjDF,SAmDE,WAGF,EACE,eACA,mBACA,gBAEF,OACE,gBAGF,eACE,+BAEF,cACE,mBACA,gBACA,oBAEF,cACE,kBACA,gBACA,iBAEF,mBACE,kBACA,iBAEF,uBAGE,oEACA,kBACA,kBAEF,kBAEE,kDACA,qBACA,mCACA,wBACA,gBA7FF,gBA+FE,WACA,gBAGF,6BAIE,aAGF,mBAGE,iCACA,qBAEF,kBAEE,iCACA,0BC7GF,6BACE,wCACA,2CACA,mCACA,oBAGF,WACE,mBACA,qCACA,kCACA,mCACA,+BACA,eACA,oBACA,gBACA,WAEF,mCAxBA,cA4BA,qBACE,8CACA,wCAEF,yDAGE,8CACA,wCAEF,mBACE,6BAGF,qBACE,qBAGF,iBACE,mCACA,qBAEF,yBACE,gBACA,4DAEF,iBACE,qBAEF,2BACE,+CAEF,kBACE,gBACA,qBAGF,oBACE,8CACA,gBACA,wCACA,eACA,YACA,qBAEF,8BACE,uDACA,iDAEF,oFAGE,uDACA,iDAEF,4BACE,6BC9EF,kBACE,mBACA,oBAEF,kBACE,mBACA,+BACA,oBACA,kBAEF,yCACE,YAjBF,gBAoBA,+BACE,+BAEF,gCAvBA,eCMA,SACE,+BACA,0CARF,sBAUE,+BACA,iBAXF,wBAcA,mBACE,wCACA,mDACA,wCAEF,mBACE,wCACA,qBACA,wBAEF,sBACE,oDACA,sDACA,iCAEF,gBACE,uBACA,kCACA,iCAEF,iBACE,kDACA,yBACA,+BC/BF,cACE,kBAEF,qBACE,kDACA,mCACA,iCACA,2BACA,cACA,eACA,0BAhBF,qBAkBE,kBACA,yBACA,YACA,mBACA,aAEF,oBACE,uCACA,cACA,2DACA,oCACA,WACA,cACA,kBACA,eACA,aACA,aAEF,4JAIE,aClCF,MAEE,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBACA,sBACA,oBACA,qBACA,gBACA,sBACA,cACA,iBACA,uBACA,gBACA,sBACA,kBACA,iBACA,cACA,kBACA,wBAGA,wCACA,iCACA,0CACA,4CACA,4CACA,uDACA,uCACA,gDACA,4CACA,8BACA,4BACA,mCACA,oCACA,mCAGA,uCACA,sCACA,iCACA,uCACA,kCACA,4CACA,iDACA,0DACA,yDACA,gEACA,uCACA,gDACA,4CACA,qDAGF,kBACE,uCACA,kCACA,2CACA,8CACA,mDACA,uCACA,0CACA,sCACA,8BACA,4BACA,mCACA,yCAEF,oCACE,gCACE,uCACA,kCACA,2CACA,8CACA,mDACA,uCACA,0CACA,sCACA,8BACA,4BACA,mCACA,0CCxFJ,WACE,kDACA,iCACA,kBACA,WAEF,iBACE,aACA,eACA,8BAfF,YAiBE,mBAjBF,6BAoBA,sBACE,gBAEF,2BACE,iCACA,aACA,OACA,kBACA,iBAEF,oCACE,mBACA,oBACA,oBACA,kBAEF,kBACE,mBACA,yBACA,aAvCF,gBAyCE,oBAEF,kBACE,oBACA,gBACA,WAEF,mBACE,aACA,OACA,eACA,gBApDF,mBAuDE,kBAEF,oBACE,mBACA,aACA,YACA,uBA7DF,8BAiEA,yDAEE,iCAGF,sBACE,oBACA,cACA,qBACA,iBAEF,yBACE,cACA,eAGF,0CACE,oBACE,aAEF,wCACE,2BChFJ,yDAEE,wCACA,2CACA,mCACA,oBACA,UAGF,mBACE,+BAGF,SACE,kBACA,aACA,sBACA,SAGF,UACE,aACA,sBACA,UAEF,kBACE,mBACA,mBAEF,iBACE,oBAEF,yBACE,WACA,gBAEF,qBAEE,8BACA,qBACA,mCACA,8BAEF,UAjDA,wBAoDA,WACE,wBACA,qBACA,gBACA,qFACA,yCACA,iCACA,mCA3DF,mDAgEA,eACE,aAEF,yBACE,OAEF,8CAtEA,gBAwEE,sBAEF,4BACE,6BACA,0BAEF,2BACE,4BACA,yBACA,sBAEF,8CAEE,UC/EF,sBACE,cACA,aARF,gCAWE,YAEF,oBACE,gBAdF,YAgBE,kBCVF,WACE,+BAMA,aAEF,iBACE,mBACA,aACA,8BAlBF,cAoBE,mBACA,kBACA,4BAEF,6BACE,gBAEF,kCACE,gBAEF,mBACE,mBACA,qBAEF,iDAEE,mBACA,0BACA,mBAEF,0CACE,WACE,eAIJ,WACE,mBACA,mBACA,wCACA,MACA,WACA,WAEF,iBAtDA,cAwDE,mBACA,wBAEF,6BACE,gBAEF,kCACE,kBAEF,eACE,mBACA,aACA,cACA,8BAEF,wBACE,mBACA,aACA,YACA,yBACA,WAEF,6BACE,YAEF,uBACE,mBACA,mBAEF,gBACE,cACA,YACA,qBACA,eAEF,wBACE,aAEF,oBACE,aAEF,gBACE,oBACA,aACA,YACA,gBArGF,mBAyGA,4CACE,oBACE,oBACA,oBACA,UAEF,gBACE,yBAEF,mBACE,cAGJ,yDAEE,mBACA,yCACA,sCACA,oBACA,oBA5HF,qCA+HE,kBACA,qBACA,WAEF,yEAEE,oCACA,iBAEF,4BACE,iCACA,oBAEF,6EAEE,cA9IF,4BAkJA,uGAEE,mBAGF,mBACE,4DACA,YACA,cACA,iBACA,aAEF,2BACE,aAEF,0BACE,gFACA,6HAIF,yBACE,YAEF,oBACE,aAEF,6CACE,aAEF,4BACE,gBACA,gBACA,iBAEF,qDACE,aAGF,0CACE,wBACE,WAEF,eACE,OAEF,oBACE,aAEF,4BACE,aAEF,wBACE,iBAIJ,qBACE,wBACA,YACA,UACA,gBACA,eACA,QACA,MACA,0BACA,qCACA,UACA,WAEF,0CACE,qBACE,cAGJ,+BACE,uBAEF,4BACE,mBACA,aACA,8BAEF,0BACE,cACA,YAvOF,YAyOE,eAEF,0BACE,gBA5OF,mBAgPA,8BACE,mBAjPF,eAoPA,sCACE,6BArPF,oBAwPA,2BACE,aACA,YACA,OACA,eACA,MACA,WACA,WAEF,0DACE,+BACA,cACA,YC9PF,SACE,YACA,eACA,2BACA,WAEF,mBACE,8GAGF,mBACE,6HAIF,mDACE,6HAGF,qCACE,4GAGF,oCACE,iEACE,6HAGF,mDACE,gHC7BJ,YACE,wBACA,kBACA,mBACA,wBACA,WAEF,oBACE,8CAEF,qBACE,iDACA,oBAEF,mBACE,+CAGF,qBACE,wBAGF,gDACE,YAEF,oCACE,8DACE,aCjCJ,OACE,kBACA,OAAS,QACT,uBACA,0BACA,kBACA,wBACA,2BACA,mBARF,YAUE,aAVF,YAYE,iBACA,WACA,cAGF,mBACE,aAGF,iBACE,eACA,MAAQ,QAAU,SAAW,OAC7B,0BAGF,iBACE,eACA,MAAQ,QAAU,SAAW,OAG/B,aACE,eACA,QACA,2BC3BF,UACE,mCACA,qBACA,mCACA,SACA,6BACA,wBACA,aACA,sBACA,SACA,gBACA,eACA,eACA,MAEF,eACE,iBAEF,iBACE,YAEF,cACE,YAEF,cACE,YAEF,iBACE,aACA,8BAEF,oBACE,kBACA,oBAEF,eACE,YACA,gBACA,gBAEF,kBACE,iBAIF,8CACE,qCACE,UACE,mBClDN,SACE,oBAEA,aACA,sBAGF,YACE,gBACA,eAEF,yBACE,sBAEF,cACE,aAEF,8CACE,cAEF,0CACE,kGAGA,gBA9BF,uBAiCA,WACE,+BACA,cACA,mBACA,gBArCF,kCAuCE,kBACA,uBACA,iBACA,mBAEF,yCAEE,cACA,eACA,gBACA,mBAjDF,eAoDA,kCAEE,0BACA,UAEF,+BACE,wBACA,gBAEF,8FAEE,kDAEF,+CACE,qBAEF,2BACE,qBACA,kBAEF,2BACE,oBAEF,2BACE,2DACA,mBACA,mBAEF,sJAEE,4CAlFF,kBAoFE,WACA,cACA,gBACA,cACA,kBACA,WACA,eAEF,wHAEE,uCACA,6CACA,eACA,oCACA,WACA,cACA,SACA,WACA,kBACA,YACA,gCACA,QAEF,4GAEE,wBAEF,4HAEE,YACA,WAEF,+CACE,qDC/GF,YACE,mCACA,eACA,qBACA,kBAEF,oBACE,gBAEF,wEAEE,aAEF,wBACE,2BAEF,cACE,uCACA,qBACA,mCACA,wBACA,iBACA,yBACA,iBA7BF,cA+BE,kBACA,WACA,mBACA,YACA,YCPF,MAEE,eAGA,YAGA,wGAKA,6CACA,wBACA,6CACA,gEAGF,kBACE,mDAEF,oCACE,gCACE,oDAGJ,0BACE,MACE,iBACA,YACA,yGAKJ,0BACE,MACE,gBAGJ,2BACE,MACE,kBAIJ,SACE,uCAGF,KACE,yCACA,aACA,sBACA,iBACA,kBAOA,iCAGF,cACE,aACA,sBACA,YACA,YACA,mBAEF,YACE,aACA,iBACA,SAxGF,cA0GE,gBACA,iBACA,2BACA,WAEF,oBACE,uBAhHF",
+  "names": []
+}
diff --git a/static/frontend/frontend.tmpl b/static/frontend/frontend.tmpl
index 32e4f8a..09cd2fe 100644
--- a/static/frontend/frontend.tmpl
+++ b/static/frontend/frontend.tmpl
@@ -29,8 +29,7 @@
     <meta class="js-gtmID" data-gtmid="{{.GoogleTagManagerID}}">
     <link rel="shortcut icon" href="/static/shared/icon/favicon.ico">
     {{block "canonical" .}}{{end}}
-    <link href="/static/shared/reset.css?version={{.AppVersionLabel}}" rel="stylesheet">
-    <link href="/static/frontend/frontend.css?version={{.AppVersionLabel}}" rel="stylesheet">
+    <link href="/static/frontend/frontend.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
     {{block "title" .}}
       <title>pkg.go.dev</title>
     {{end}}
diff --git a/static/frontend/homepage/homepage.min.css b/static/frontend/homepage/homepage.min.css
new file mode 100644
index 0000000..cfbb207
--- /dev/null
+++ b/static/frontend/homepage/homepage.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.go-SearchForm{display:none}.Homepage-logo{border-radius:var(--border-radius);display:block;height:10rem;margin:3.125rem auto;width:auto}[data-theme=dark] .Homepage-logo{mix-blend-mode:difference}@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .Homepage-logo{mix-blend-mode:difference}}@media only screen and (min-width: 52rem){.Homepage{margin:2rem auto}.Homepage-logo{margin:3.5rem auto}}.Homepage-search{--border-radius: .5rem;height:3rem;margin:2.5rem auto 0;max-width:45.0625rem;position:relative;width:100%}.Homepage-search:before{background:url(/static/shared/icon/search_gm_grey_24dp.svg) left no-repeat;content:"";height:3rem;left:.75rem;position:absolute;width:1.5rem;z-index:3}.Homepage-search .go-Select{padding-left:2.5rem}.Homepage-search .go-Input{padding-left:2.5rem}.Homepage-search--symbol .go-Input{border-bottom-right-radius:var(--border-radius);border-top-right-radius:var(--border-radius);padding-left:1rem}.Homepage-search .go-Button{justify-content:center;width:7.375rem}.Homepage-search--symbol .go-Button{display:none}@media only screen and (min-width: 30rem){.Homepage-search--symbol .go-Input{border-bottom-right-radius:0;border-top-right-radius:0}.Homepage-search--symbol .go-Button{display:inline-flex}}.Homepage-searchHelp{align-items:center;display:block;justify-content:space-between;margin:0 auto;max-width:45.0625rem;text-align:center;width:100%}@media only screen and (min-width: 30rem){.Homepage-searchHelp{display:flex}}a.Homepage-helpLink{align-items:center;display:inline-flex;font-size:1em;font-weight:initial;margin-right:.5rem;white-space:nowrap}.Homepage-helpLink img{height:1rem;margin-left:.25rem;position:relative;top:.1875rem;width:1rem}.Homepage-exampleSearches{align-items:center;color:var(--color-text-subtle);display:block;font-size:.875rem;font-weight:500;text-align:center;width:100%}@media only screen and (min-width: 30rem){.Homepage-exampleSearches{display:flex}}.Homepage-exampleSearchesLabel{display:block;margin-bottom:1rem;text-transform:uppercase}@media only screen and (min-width: 30rem){.Homepage-exampleSearchesLabel{display:inline;margin-bottom:-.1rem}}.Homepage-exampleSearch{color:var(--color-brand-primary);font-size:1rem;font-weight:initial;padding:0 .625rem}.Questions{background:var(--color-background-accented);color:var(--color-text);display:flex;padding-bottom:1rem;padding-top:.5rem}.Questions-header{color:var(--color-text);font-weight:bold;margin:1rem 0}.Questions-content{flex-grow:1;margin:0 auto;max-width:75.75rem;padding:0 1.5rem}.Questions-content ul{list-style:none;padding-inline-start:0}.Questions-content ul>li{font-size:.875rem;line-height:1.75rem}
+/*# sourceMappingURL=homepage.min.css.map */
diff --git a/static/frontend/homepage/homepage.min.css.map b/static/frontend/homepage/homepage.min.css.map
new file mode 100644
index 0000000..622d1a2
--- /dev/null
+++ b/static/frontend/homepage/homepage.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["homepage.css"],
+  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* Hide the search form in the header. */\n.go-SearchForm {\n  display: none;\n}\n\n.Homepage-logo {\n  border-radius: var(--border-radius);\n  display: block;\n  height: 10rem;\n  margin: 3.125rem auto;\n  width: auto;\n}\n[data-theme='dark'] .Homepage-logo {\n  mix-blend-mode: difference;\n}\n@media (prefers-color-scheme: dark) {\n  :root:not([data-theme='light']) .Homepage-logo {\n    mix-blend-mode: difference;\n  }\n}\n@media only screen and (min-width: 52rem) {\n  .Homepage {\n    margin: 2rem auto;\n  }\n  .Homepage-logo {\n    margin: 3.5rem auto;\n  }\n}\n.Homepage-search {\n  --border-radius: 0.5rem;\n\n  height: 3rem;\n  margin: 2.5rem auto 0 auto;\n  max-width: 45.0625rem;\n  position: relative;\n  width: 100%;\n}\n.Homepage-search::before {\n  background: url('/static/shared/icon/search_gm_grey_24dp.svg') left no-repeat;\n  content: '';\n  height: 3rem;\n  left: 0.75rem;\n  position: absolute;\n  width: 1.5rem;\n  z-index: 3;\n}\n.Homepage-search .go-Select {\n  padding-left: 2.5rem;\n}\n.Homepage-search .go-Input {\n  padding-left: 2.5rem;\n}\n.Homepage-search--symbol .go-Input {\n  border-bottom-right-radius: var(--border-radius);\n  border-top-right-radius: var(--border-radius);\n  padding-left: 1rem;\n}\n.Homepage-search .go-Button {\n  justify-content: center;\n  width: 7.375rem;\n}\n.Homepage-search--symbol .go-Button {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .Homepage-search--symbol .go-Input {\n    border-bottom-right-radius: 0;\n    border-top-right-radius: 0;\n  }\n  .Homepage-search--symbol .go-Button {\n    display: inline-flex;\n  }\n}\n.Homepage-searchHelp {\n  align-items: center;\n  display: block;\n  justify-content: space-between;\n  margin: 0 auto;\n  max-width: 45.0625rem;\n  text-align: center;\n  width: 100%;\n}\n@media only screen and (min-width: 30rem) {\n  .Homepage-searchHelp {\n    display: flex;\n  }\n}\na.Homepage-helpLink {\n  align-items: center;\n  display: inline-flex;\n  font-size: 1em;\n  font-weight: initial;\n  margin-right: 0.5rem;\n  white-space: nowrap;\n}\n.Homepage-helpLink img {\n  height: 1rem;\n  margin-left: 0.25rem;\n  position: relative;\n  top: 0.1875rem;\n  width: 1rem;\n}\n.Homepage-exampleSearches {\n  align-items: center;\n  color: var(--color-text-subtle);\n  display: block;\n  font-size: 0.875rem;\n  font-weight: 500;\n  text-align: center;\n  width: 100%;\n}\n@media only screen and (min-width: 30rem) {\n  .Homepage-exampleSearches {\n    display: flex;\n  }\n}\n.Homepage-exampleSearchesLabel {\n  display: block;\n  margin-bottom: 1rem;\n  text-transform: uppercase;\n}\n@media only screen and (min-width: 30rem) {\n  .Homepage-exampleSearchesLabel {\n    display: inline;\n    margin-bottom: -0.1rem;\n  }\n}\n.Homepage-exampleSearch {\n  color: var(--color-brand-primary);\n  font-size: 1rem;\n  font-weight: initial;\n  padding: 0 0.625rem;\n}\n.Questions {\n  background: var(--color-background-accented);\n  color: var(--color-text);\n  display: flex;\n  padding-bottom: 1rem;\n  padding-top: 0.5rem;\n}\n.Questions-header {\n  color: var(--color-text);\n  font-weight: bold;\n  margin: 1rem 0;\n}\n.Questions-content {\n  flex-grow: 1;\n  margin: 0 auto;\n  max-width: 75.75rem;\n  padding: 0 1.5rem;\n}\n.Questions-content ul {\n  list-style: none;\n  padding-inline-start: 0;\n}\n.Questions-content ul > li {\n  font-size: 0.875rem;\n  line-height: 1.75rem;\n}\n"],
+  "mappings": ";;;;;AAOA,eACE,aAGF,eACE,mCACA,cACA,aAdF,qBAgBE,WAEF,iCACE,0BAEF,oCACE,+CACE,2BAGJ,0CACE,UA3BF,iBA8BE,eA9BF,oBAkCA,iBACE,uBAEA,YArCF,qBAuCE,qBACA,kBACA,WAEF,wBACE,2EACA,WACA,YACA,YACA,kBACA,aACA,UAEF,4BACE,oBAEF,2BACE,oBAEF,mCACE,gDACA,6CACA,kBAEF,4BACE,uBACA,eAEF,oCACE,aAEF,0CACE,mCACE,6BACA,0BAEF,oCACE,qBAGJ,qBACE,mBACA,cACA,8BAlFF,cAoFE,qBACA,kBACA,WAEF,0CACE,qBACE,cAGJ,oBACE,mBACA,oBACA,cACA,oBACA,mBACA,mBAEF,uBACE,YACA,mBACA,kBACA,aACA,WAEF,0BACE,mBACA,+BACA,cACA,kBACA,gBACA,kBACA,WAEF,0CACE,0BACE,cAGJ,+BACE,cACA,mBACA,yBAEF,0CACE,+BACE,eACA,sBAGJ,wBACE,iCACA,eACA,oBAxIF,kBA2IA,WACE,4CACA,wBACA,aACA,oBACA,kBAEF,kBACE,wBACA,iBApJF,cAuJA,mBACE,YAxJF,cA0JE,mBA1JF,iBA6JA,sBACE,gBACA,uBAEF,yBACE,kBACA",
+  "names": []
+}
diff --git a/static/frontend/homepage/homepage.tmpl b/static/frontend/homepage/homepage.tmpl
index 415974e..e5056ba 100644
--- a/static/frontend/homepage/homepage.tmpl
+++ b/static/frontend/homepage/homepage.tmpl
@@ -5,7 +5,7 @@
 -->
 
 {{define "pre-content"}}
-  <link href="/static/frontend/homepage/homepage.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/homepage/homepage.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/legacy_search/legacy_search.min.css b/static/frontend/legacy_search/legacy_search.min.css
new file mode 100644
index 0000000..9eb036f
--- /dev/null
+++ b/static/frontend/legacy_search/legacy_search.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.SearchResults{margin:0 auto;max-width:60em;padding:2rem 0}.SearchResults-header{font-size:1.875rem}.SearchResults-resultCount{display:flex;justify-content:space-between}.SearchResults-footer{display:flex;justify-content:flex-end}.SearchResults-emptyContentMessage{text-align:center}.LegacySearchSnippet{border-top:var(--border);padding:1rem 0}.LegacySearchSnippet-header{font-size:1.5rem;margin:0 0 .3125rem}.SearchSnippet{padding:1rem 0}.SearchSnippet:only-of-type,.SearchSnippet:last-of-type{border-bottom:var(--border);margin-bottom:1rem}.SearchSnippet-synopsis{-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;margin:0 0 1rem;overflow:hidden;text-overflow:ellipsis}.SearchSnippet-infoLabel{font-size:.875rem;line-height:1.375rem}.SearchSnippet-infoLabelDivider{margin-left:2rem}.SearchSnippet-sub{font-size:.875rem;margin-top:.3125rem}.SearchSnippet-breadcrumb{color:var(--color-text-subtle);font-size:.75rem}.SearchSnippet-version{font-size:.75rem}.SearchSnippet-headerContainer{align-items:baseline;display:flex;justify-content:space-between}.SearchSnippet-header{font-size:1.5rem;margin:0 0 .3125rem}.SearchSnippet-symbol{background:var(--blue);border-radius:1rem;padding:0 .375rem}.Pagination-nav{display:flex}.Pagination-navInner{display:flex;flex:1;justify-content:space-between}.Pagination-previous[aria-disabled=true],.Pagination-next[aria-disabled=true]{color:var(--color-text-subtle)}.Pagination-number{color:var(--color-text);padding:0 .375rem}.SearchResults .Pagination-nav,.SearchResults-help,.SearchResults-resultCount{flex-wrap:wrap;font-size:.875rem}@media only screen and (min-width: 50rem){.SearchResults .Pagination-nav,.SearchResults-help,.SearchResults-resultCount{flex-wrap:wrap;font-size:1.125rem}.Pagination-navInner{max-width:25rem}.Pagination-previous{margin-right:.75rem}.Pagination-next{margin-left:.75rem}}
+/*# sourceMappingURL=legacy_search.min.css.map */
diff --git a/static/frontend/legacy_search/legacy_search.min.css.map b/static/frontend/legacy_search/legacy_search.min.css.map
new file mode 100644
index 0000000..eda4a0f
--- /dev/null
+++ b/static/frontend/legacy_search/legacy_search.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["legacy_search.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.SearchResults {\n  margin: 0 auto;\n  max-width: 60em;\n  padding: 2rem 0;\n}\n.SearchResults-header {\n  font-size: 1.875rem;\n}\n.SearchResults-resultCount {\n  display: flex;\n  justify-content: space-between;\n}\n.SearchResults-footer {\n  display: flex;\n  justify-content: flex-end;\n}\n.SearchResults-emptyContentMessage {\n  text-align: center;\n}\n.LegacySearchSnippet {\n  border-top: var(--border);\n  padding: 1rem 0;\n}\n.LegacySearchSnippet-header {\n  font-size: 1.5rem;\n  margin: 0 0 0.3125rem;\n}\n.SearchSnippet {\n  padding: 1rem 0;\n}\n.SearchSnippet:only-of-type,\n.SearchSnippet:last-of-type {\n  border-bottom: var(--border);\n  margin-bottom: 1rem;\n}\n.SearchSnippet-synopsis {\n  -webkit-box-orient: vertical;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  margin: 0 0 1rem;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.SearchSnippet-infoLabel {\n  font-size: 0.875rem;\n  line-height: 1.375rem;\n}\n.SearchSnippet-infoLabelDivider {\n  margin-left: 2rem;\n}\n.SearchSnippet-sub {\n  font-size: 0.875rem;\n  margin-top: 0.3125rem;\n}\n.SearchSnippet-breadcrumb {\n  color: var(--color-text-subtle);\n  font-size: 0.75rem;\n}\n.SearchSnippet-version {\n  font-size: 0.75rem;\n}\n.SearchSnippet-headerContainer {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n.SearchSnippet-header {\n  font-size: 1.5rem;\n  margin: 0 0 0.3125rem 0;\n}\n.SearchSnippet-symbol {\n  background: var(--blue);\n  border-radius: 1rem;\n  padding: 0 0.375rem;\n}\n\n.Pagination-nav {\n  display: flex;\n}\n.Pagination-navInner {\n  display: flex;\n  flex: 1;\n  justify-content: space-between;\n}\n.Pagination-previous[aria-disabled='true'],\n.Pagination-next[aria-disabled='true'] {\n  color: var(--color-text-subtle);\n}\n.Pagination-number {\n  color: var(--color-text);\n  padding: 0 0.375rem;\n}\n\n.SearchResults .Pagination-nav,\n.SearchResults-help,\n.SearchResults-resultCount {\n  flex-wrap: wrap;\n  font-size: 0.875rem;\n}\n@media only screen and (min-width: 50rem) {\n  .SearchResults .Pagination-nav,\n  .SearchResults-help,\n  .SearchResults-resultCount {\n    flex-wrap: wrap;\n    font-size: 1.125rem;\n  }\n  .Pagination-navInner {\n    max-width: 25rem;\n  }\n  .Pagination-previous {\n    margin-right: 0.75rem;\n  }\n  .Pagination-next {\n    margin-left: 0.75rem;\n  }\n}\n"],
+  "mappings": ";;;;;AAMA,eANA,cAQE,eARF,eAWA,sBACE,mBAEF,2BACE,aACA,8BAEF,sBACE,aACA,yBAEF,mCACE,kBAEF,qBACE,yBA1BF,eA6BA,4BACE,iBA9BF,oBAiCA,eAjCA,eAoCA,wDAEE,4BACA,mBAEF,wBACE,4BACA,oBACA,qBA5CF,gBA8CE,gBACA,uBAEF,yBACE,kBACA,qBAEF,gCACE,iBAEF,mBACE,kBACA,oBAEF,0BACE,+BACA,iBAEF,uBACE,iBAEF,+BACE,qBACA,aACA,8BAEF,sBACE,iBAzEF,oBA4EA,sBACE,uBA7EF,qCAkFA,gBACE,aAEF,qBACE,aACA,OACA,8BAEF,8EAEE,+BAEF,mBACE,wBA/FF,kBAmGA,8EAGE,eACA,kBAEF,0CACE,8EAGE,eACA,mBAEF,qBACE,gBAEF,qBACE,oBAEF,iBACE",
+  "names": []
+}
diff --git a/static/frontend/legacy_search/legacy_search.tmpl b/static/frontend/legacy_search/legacy_search.tmpl
index 7347763..164996d 100644
--- a/static/frontend/legacy_search/legacy_search.tmpl
+++ b/static/frontend/legacy_search/legacy_search.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/legacy_search/legacy_search.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/legacy_search/legacy_search.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/search/search.min.css b/static/frontend/search/search.min.css
new file mode 100644
index 0000000..e7923f9
--- /dev/null
+++ b/static/frontend/search/search.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.SearchResults{font-size:.875rem}.SearchResults-instead{font-size:1.25rem;margin-top:-.5rem}.SearchResults-insteadPrefix{color:var(--color-text)}.SearchResults-summary{color:var(--color-text-subtle);display:flex;flex-direction:column;gap:1rem;justify-content:space-between;line-height:1.5rem;margin-top:.5rem}@media only screen and (min-width: 64rem){.SearchResults-summary{align-items:baseline;flex-direction:row}}.SearchResults-emptyContentMessage{text-align:center}.SearchSnippet{display:flex;flex-direction:column;gap:.5rem;padding:0 0 2.5rem}.SearchSnippet h2{font-size:1.25rem}.SearchSnippet:last-of-type{padding:0 0 1rem}.SearchSnippet-synopsis{-webkit-box-orient:vertical;display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.SearchSnippet-infoLabel{display:flex;flex-wrap:wrap;gap:.5rem 1rem}.SearchSnippet-sub{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-symbolCode{font-size:.75rem;margin:.25rem 0}.SearchSnippet-sub a[data-hidden]{display:none}.SearchSnippet-sub a{color:var(--color-text-subtle)}.SearchSnippet-sub a:hover{color:var(--color-brand-primary)}.SearchSnippet-headerContainer{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem}.SearchSnippet-header-name{color:var(--color-text)}.SearchSnippet-header-dash{color:var(--color-text-subtle)}.SearchSnippet-symbolKind{color:var(--color-text)}.SearchPagination{height:1.5rem}
+/*# sourceMappingURL=search.min.css.map */
diff --git a/static/frontend/search/search.min.css.map b/static/frontend/search/search.min.css.map
new file mode 100644
index 0000000..f38574d
--- /dev/null
+++ b/static/frontend/search/search.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["search.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.SearchResults {\n  font-size: 0.875rem;\n}\n.SearchResults-instead {\n  font-size: 1.25rem;\n  margin-top: -0.5rem;\n}\n.SearchResults-insteadPrefix {\n  color: var(--color-text);\n}\n.SearchResults-summary {\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  justify-content: space-between;\n  line-height: 1.5rem;\n  margin-top: 0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .SearchResults-summary {\n    align-items: baseline;\n    flex-direction: row;\n  }\n}\n.SearchResults-emptyContentMessage {\n  text-align: center;\n}\n\n.SearchSnippet {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n  padding: 0 0 2.5rem 0;\n}\n.SearchSnippet h2 {\n  font-size: 1.25rem;\n}\n.SearchSnippet:last-of-type {\n  padding: 0 0 1rem 0;\n}\n.SearchSnippet-synopsis {\n  -webkit-box-orient: vertical;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.SearchSnippet-infoLabel {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem 1rem;\n}\n.SearchSnippet-sub {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-symbolCode {\n  font-size: 0.75rem;\n  margin: 0.25rem 0;\n}\n.SearchSnippet-sub a[data-hidden] {\n  display: none;\n}\n.SearchSnippet-sub a {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-sub a:hover {\n  color: var(--color-brand-primary);\n}\n.SearchSnippet-headerContainer {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n.SearchSnippet-header-name {\n  color: var(--color-text);\n}\n.SearchSnippet-header-dash {\n  color: var(--color-text-subtle);\n}\n.SearchSnippet-symbolKind {\n  color: var(--color-text);\n}\n.SearchPagination {\n  height: 1.5rem;\n}\n"],
+  "mappings": ";;;;;AAMA,eACE,kBAEF,uBACE,kBACA,kBAEF,6BACE,wBAEF,uBACE,+BACA,aACA,sBACA,SACA,8BACA,mBACA,iBAEF,0CACE,uBACE,qBACA,oBAGJ,mCACE,kBAGF,eACE,aACA,sBACA,UAtCF,mBAyCA,kBACE,kBAEF,4BA5CA,iBA+CA,wBACE,4BACA,oBACA,qBACA,gBACA,uBAEF,yBACE,aACA,eACA,eAEF,mBACE,mBACA,aACA,eACA,UAEF,0BACE,iBAlEF,gBAqEA,kCACE,aAEF,qBACE,+BAEF,2BACE,iCAEF,+BACE,mBACA,aACA,eACA,UAEF,2BACE,wBAEF,2BACE,+BAEF,0BACE,wBAEF,kBACE",
+  "names": []
+}
diff --git a/static/frontend/search/search.tmpl b/static/frontend/search/search.tmpl
index aa54c09..456a113 100644
--- a/static/frontend/search/search.tmpl
+++ b/static/frontend/search/search.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/search/search.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/search/search.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/styleguide/styleguide.js b/static/frontend/styleguide/styleguide.js
index a311841..9c16fcb 100644
--- a/static/frontend/styleguide/styleguide.js
+++ b/static/frontend/styleguide/styleguide.js
@@ -1,18 +1,18 @@
-(()=>{var d=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function c(r){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},l;for(let n of r.treeitems){if(Number(n.depth)>4)continue;n.groupTreeitem?(l=s[n.groupTreeitem.label],l||(l=s[n.groupTreeitem.label]=document.createElement("optgroup"),l.label=n.groupTreeitem.label,t.appendChild(l))):l=i;let a=document.createElement("option");a.label=n.label,a.textContent=n.label,a.value=n.el.href.replace(window.location.origin,"").replace("/",""),l.appendChild(a)}return r.addObserver(n=>{let a=n.el.hash,h=t.querySelector(`[value$="${a}"]`)?.value;h&&(t.value=h)},50),e}var o=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,l]of e)if(l){let n=this.treeitems.find(a=>a.el?.href.endsWith(`#${s}`));if(n)for(let a of this.observerCallbacks)a(n);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),l=document.getElementById(s);l&&t.observe(l)}}addObserver(e,t=200){this.observerCallbacks.push(m(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){for(let t of this.el.querySelectorAll('[aria-expanded="true"]'))t!==e.el&&(t.nextElementSibling?.contains(e.el)||t.setAttribute("aria-expanded","false"));for(let t of this.el.querySelectorAll("[aria-selected]"))t!==e.el&&t.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,l=t.firstElementChild;for(;l;)(l.tagName==="A"||l.tagName==="SPAN")&&(s=new u(l,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),l.firstElementChild&&e(l,s),l=l.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},u=class{constructor(e,t,i){e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=e.textContent?.trim()??"",this.tree=t,this.depth=(i?.depth||0)+1,this.index=0;let s=e.parentElement;s?.tagName.toLowerCase()==="li"&&s?.setAttribute("role","none"),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=e?.getAttribute("aria-label")?.trim()??""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let l=e.nextElementSibling;for(;l;){if(l.tagName.toLowerCase()=="ul"){let n=`${i?.label??""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",n),e.setAttribute("aria-expanded","false"),l.setAttribute("role","group"),l.setAttribute("id",n),this.isExpandable=!0;break}l=l.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.add("focus")}handleBlur(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function m(r,e){let t;return(...i)=>{let s=()=>{t=null,r(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}window.addEventListener("load",()=>{let r=document.querySelector(".js-tree");if(r){let t=new o(r),i=c(t);document.querySelector(".js-mainNavMobile")?.appendChild(i)}let e=document.querySelector(".Outline .js-tree");if(e){let t=new o(e),i=c(t);document.querySelector(".Outline .js-select")?.appendChild(i)}for(let t of document.querySelectorAll(".js-toggleTheme"))t.addEventListener("click",i=>{let s=i.currentTarget.getAttribute("data-value");document.documentElement.setAttribute("data-theme",String(s))});for(let t of document.querySelectorAll(".js-toggleLayout"))t.addEventListener("click",i=>{let s=i.currentTarget.getAttribute("data-value");document.documentElement.setAttribute("data-layout",String(s))});for(let t of document.querySelectorAll(".js-selectNav"))new d(t)});customElements.define("go-color",class extends HTMLElement{constructor(){super();this.style.setProperty("display","contents");let r=this.id;this.removeAttribute("id"),this.innerHTML=`
-        <div style="--color: var(${r});" class="GoColor-circle"></div>
+(()=>{var h=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function u(l){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},r;for(let n of l.treeitems){if(Number(n.depth)>4)continue;n.groupTreeitem?(r=s[n.groupTreeitem.label],r||(r=s[n.groupTreeitem.label]=document.createElement("optgroup"),r.label=n.groupTreeitem.label,t.appendChild(r))):r=i;let a=document.createElement("option");a.label=n.label,a.textContent=n.label,a.value=n.el.href.replace(window.location.origin,"").replace("/",""),r.appendChild(a)}return l.addObserver(n=>{var d;let a=n.el.hash,o=(d=t.querySelector(`[value$="${a}"]`))==null?void 0:d.value;o&&(t.value=o)},50),e}var c=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,r]of e)if(r){let n=this.treeitems.find(a=>{var o;return(o=a.el)==null?void 0:o.href.endsWith(`#${s}`)});if(n)for(let a of this.observerCallbacks)a(n);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(b(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&(((t=i.nextElementSibling)==null?void 0:t.contains(e.el))||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new f(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},f=class{constructor(e,t,i){var n,a,o,d,m;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(n=e.textContent)==null?void 0:n.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(d=(o=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:o.trim())!=null?d:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){let p=`${(m=i==null?void 0:i.label)!=null?m:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",p),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",p),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function b(l,e){let t;return(...i)=>{let s=()=>{t=null,l(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}window.addEventListener("load",()=>{var t,i;let l=document.querySelector(".js-tree");if(l){let s=new c(l),r=u(s);(t=document.querySelector(".js-mainNavMobile"))==null||t.appendChild(r)}let e=document.querySelector(".Outline .js-tree");if(e){let s=new c(e),r=u(s);(i=document.querySelector(".Outline .js-select"))==null||i.appendChild(r)}for(let s of document.querySelectorAll(".js-toggleTheme"))s.addEventListener("click",r=>{let n=r.currentTarget.getAttribute("data-value");document.documentElement.setAttribute("data-theme",String(n))});for(let s of document.querySelectorAll(".js-toggleLayout"))s.addEventListener("click",r=>{let n=r.currentTarget.getAttribute("data-value");document.documentElement.setAttribute("data-layout",String(n))});for(let s of document.querySelectorAll(".js-selectNav"))new h(s)});customElements.define("go-color",class extends HTMLElement{constructor(){super();var e;this.style.setProperty("display","contents");let l=this.id;this.removeAttribute("id"),this.innerHTML=`
+        <div style="--color: var(${l});" class="GoColor-circle"></div>
         <span>
-          <div id="${r}" class="go-textLabel GoColor-title">${r.replace("--color-","").replaceAll("-"," ")}</div>
-          <pre class="StringifyElement-markup">var(${r})</pre>
+          <div id="${l}" class="go-textLabel GoColor-title">${l.replace("--color-","").replaceAll("-"," ")}</div>
+          <pre class="StringifyElement-markup">var(${l})</pre>
         </span>
-      `,this.querySelector("pre")?.addEventListener("click",()=>{navigator.clipboard.writeText(`var(${r})`)})}});customElements.define("go-icon",class extends HTMLElement{constructor(){super();this.style.setProperty("display","contents");let r=this.getAttribute("name");this.innerHTML=`<p id="icon-${r}" class="go-textLabel GoIcon-title">${r.replaceAll("_"," ")}</p>
+      `,(e=this.querySelector("pre"))==null||e.addEventListener("click",()=>{navigator.clipboard.writeText(`var(${l})`)})}});customElements.define("go-icon",class extends HTMLElement{constructor(){super();this.style.setProperty("display","contents");let l=this.getAttribute("name");this.innerHTML=`<p id="icon-${l}" class="go-textLabel GoIcon-title">${l.replaceAll("_"," ")}</p>
         <stringify-el>
-          <img class="go-Icon" height="24" width="24" src="/static/shared/icon/${r}_gm_grey_24dp.svg" alt="">
+          <img class="go-Icon" height="24" width="24" src="/static/shared/icon/${l}_gm_grey_24dp.svg" alt="">
         </stringify-el>
-      `}});customElements.define("clone-el",class extends HTMLElement{constructor(){super();this.style.setProperty("display","contents");let r=this.getAttribute("selector");if(!r)return;let e="    "+document.querySelector(r)?.outerHTML;this.innerHTML=`
+      `}});customElements.define("clone-el",class extends HTMLElement{constructor(){super();var t;this.style.setProperty("display","contents");let l=this.getAttribute("selector");if(!l)return;let e="    "+((t=document.querySelector(l))==null?void 0:t.outerHTML);this.innerHTML=`
         <stringify-el collapsed>${e}</stringify-el>
-      `}});customElements.define("stringify-el",class extends HTMLElement{constructor(){super();this.style.setProperty("display","contents");let r=this.innerHTML,e=this.id?` id="${this.id}"`:"";this.removeAttribute("id");let t='<pre class="StringifyElement-markup">'+f(p(r))+"</pre>";this.hasAttribute("collapsed")&&(t=`<details class="StringifyElement-details"><summary>Markup</summary>${t}</details>`),this.innerHTML=`<span${e}>${r}</span>${t}`,this.querySelector("pre")?.addEventListener("click",()=>{navigator.clipboard.writeText(r)})}});function p(r){return r.split(`
+      `}});customElements.define("stringify-el",class extends HTMLElement{constructor(){super();var i;this.style.setProperty("display","contents");let l=this.innerHTML,e=this.id?` id="${this.id}"`:"";this.removeAttribute("id");let t='<pre class="StringifyElement-markup">'+g(T(l))+"</pre>";this.hasAttribute("collapsed")&&(t=`<details class="StringifyElement-details"><summary>Markup</summary>${t}</details>`),this.innerHTML=`<span${e}>${l}</span>${t}`,(i=this.querySelector("pre"))==null||i.addEventListener("click",()=>{navigator.clipboard.writeText(l)})}});function T(l){return l.split(`
 `).reduce((e,t)=>{if(e.result.length===0){let i=t.indexOf("<");e.start=i===-1?0:i}return t=t.slice(e.start),t&&e.result.push(t),e},{result:[],start:0}).result.join(`
-`)}function f(r){return r?.replaceAll("<","&lt;")?.replaceAll(">","&gt;")}})();
+`)}function g(l){var e;return(e=l==null?void 0:l.replaceAll("<","&lt;"))==null?void 0:e.replaceAll(">","&gt;")}})();
 /**
  * @license
  * Copyright 2021 The Go Authors. All rights reserved.
diff --git a/static/frontend/styleguide/styleguide.js.map b/static/frontend/styleguide/styleguide.js.map
index 5d1a7b5..b39c445 100644
--- a/static/frontend/styleguide/styleguide.js.map
+++ b/static/frontend/styleguide/styleguide.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["../../shared/outline/select.ts", "../../shared/outline/tree.ts", "styleguide.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { SelectNavController, makeSelectNav } from '../../shared/outline/select';\nimport { TreeNavController } from '../../shared/outline/tree';\n\nwindow.addEventListener('load', () => {\n  const tree = document.querySelector<HTMLElement>('.js-tree');\n  if (tree) {\n    const treeCtrl = new TreeNavController(tree);\n    const select = makeSelectNav(treeCtrl);\n    document.querySelector('.js-mainNavMobile')?.appendChild(select);\n  }\n\n  const guideTree = document.querySelector<HTMLElement>('.Outline .js-tree');\n  if (guideTree) {\n    const treeCtrl = new TreeNavController(guideTree);\n    const select = makeSelectNav(treeCtrl);\n    document.querySelector('.Outline .js-select')?.appendChild(select);\n  }\n\n  for (const el of document.querySelectorAll('.js-toggleTheme')) {\n    el.addEventListener('click', e => {\n      const value = (e.currentTarget as HTMLButtonElement).getAttribute('data-value');\n      document.documentElement.setAttribute('data-theme', String(value));\n    });\n  }\n  for (const el of document.querySelectorAll('.js-toggleLayout')) {\n    el.addEventListener('click', e => {\n      const value = (e.currentTarget as HTMLButtonElement).getAttribute('data-value');\n      document.documentElement.setAttribute('data-layout', String(value));\n    });\n  }\n\n  for (const el of document.querySelectorAll<HTMLSelectElement>('.js-selectNav')) {\n    new SelectNavController(el);\n  }\n});\n\ncustomElements.define(\n  'go-color',\n  class extends HTMLElement {\n    constructor() {\n      super();\n      this.style.setProperty('display', 'contents');\n      // The current version of TypeScript is not aware of String.replaceAll.\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const name = this.id as any;\n      this.removeAttribute('id');\n      this.innerHTML = `\n        <div style=\"--color: var(${name});\" class=\"GoColor-circle\"></div>\n        <span>\n          <div id=\"${name}\" class=\"go-textLabel GoColor-title\">${name\n        .replace('--color-', '')\n        .replaceAll('-', ' ')}</div>\n          <pre class=\"StringifyElement-markup\">var(${name})</pre>\n        </span>\n      `;\n      this.querySelector('pre')?.addEventListener('click', () => {\n        navigator.clipboard.writeText(`var(${name})`);\n      });\n    }\n  }\n);\n\ncustomElements.define(\n  'go-icon',\n  class extends HTMLElement {\n    constructor() {\n      super();\n      this.style.setProperty('display', 'contents');\n      // The current version of TypeScript is not aware of String.replaceAll.\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const name = this.getAttribute('name') as any;\n      this.innerHTML = `<p id=\"icon-${name}\" class=\"go-textLabel GoIcon-title\">${name.replaceAll(\n        '_',\n        ' '\n      )}</p>\n        <stringify-el>\n          <img class=\"go-Icon\" height=\"24\" width=\"24\" src=\"/static/shared/icon/${name}_gm_grey_24dp.svg\" alt=\"\">\n        </stringify-el>\n      `;\n    }\n  }\n);\n\ncustomElements.define(\n  'clone-el',\n  class extends HTMLElement {\n    constructor() {\n      super();\n      this.style.setProperty('display', 'contents');\n      const selector = this.getAttribute('selector');\n      if (!selector) return;\n      const html = '    ' + document.querySelector(selector)?.outerHTML;\n      this.innerHTML = `\n        <stringify-el collapsed>${html}</stringify-el>\n      `;\n    }\n  }\n);\n\ncustomElements.define(\n  'stringify-el',\n  class extends HTMLElement {\n    constructor() {\n      super();\n      this.style.setProperty('display', 'contents');\n      const html = this.innerHTML;\n      const idAttr = this.id ? ` id=\"${this.id}\"` : '';\n      this.removeAttribute('id');\n      let markup = `<pre class=\"StringifyElement-markup\">` + escape(trim(html)) + `</pre>`;\n      if (this.hasAttribute('collapsed')) {\n        markup = `<details class=\"StringifyElement-details\"><summary>Markup</summary>${markup}</details>`;\n      }\n      this.innerHTML = `<span${idAttr}>${html}</span>${markup}`;\n      this.querySelector('pre')?.addEventListener('click', () => {\n        navigator.clipboard.writeText(html);\n      });\n    }\n  }\n);\n\n/**\n * trim removes excess indentation from html markup by\n * measuring the number of spaces in the first line of\n * the given string and removing that number of spaces\n * from the beginning of each line.\n */\nfunction trim(html: string) {\n  return html\n    .split('\\n')\n    .reduce<{ result: string[]; start: number }>(\n      (acc, val) => {\n        if (acc.result.length === 0) {\n          const start = val.indexOf('<');\n          acc.start = start === -1 ? 0 : start;\n        }\n        val = val.slice(acc.start);\n        if (val) {\n          acc.result.push(val);\n        }\n        return acc;\n      },\n      { result: [], start: 0 }\n    )\n    .result.join('\\n');\n}\n\nfunction escape(html: string) {\n  // The current version of TypeScript is not aware of String.replaceAll.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return (html as any)?.replaceAll('<', '&lt;')?.replaceAll('>', '&gt;');\n}\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/frontend/styleguide/styleguide.min.css b/static/frontend/styleguide/styleguide.min.css
new file mode 100644
index 0000000..04b4f2a
--- /dev/null
+++ b/static/frontend/styleguide/styleguide.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.StyleGuide{background-color:var(--color-background)}.StyleGuide>section{align-items:center;display:grid;gap:1rem 2rem;grid-template-columns:100%;margin-bottom:1rem}.StyleGuide>section>header{border-bottom:var(--border);grid-column:1/-1;margin-bottom:1rem;padding-bottom:1rem}.StyleGuide>section>h2{grid-column:1/-1;width:max-content}.StyleGuide>section>hr{grid-column:1/-1}.StyleGuide>section>h3{grid-column:1/-1;margin:1rem 0}.StyleGuide>section>p{grid-column:1/-1}.StyleGuide .Color,.StyleGuide .ColorIntent{grid-template-columns:repeat(auto-fit,5rem [col-start] minmax(12rem,auto) [col-end])}.StyleGuide .Outline{align-items:flex-start}.StyleGuide .Outline>span{margin-top:.5rem}@media (min-width: 80rem){.StyleGuide .Icon{grid-template-columns:10rem 8rem auto}.StyleGuide .Typography,.StyleGuide .Button,.StyleGuide .Form,.StyleGuide .Modal,.StyleGuide .Message,.StyleGuide .Breadcrumb,.StyleGuide .Chip,.StyleGuide .Tooltip,.StyleGuide .Outline,.StyleGuide .Clipboard{grid-template-columns:20rem auto}}@media (min-width: 112rem){.StyleGuide .Icon{grid-template-columns:10rem auto 50%}.StyleGuide .Typography,.StyleGuide .Button,.StyleGuide .Form,.StyleGuide .Modal,.StyleGuide .Message,.StyleGuide .Breadcrumb,.StyleGuide .Chip,.StyleGuide .Tooltip,.StyleGuide .Outline,.StyleGuide .Clipboard{grid-template-columns:auto 50%}}.StringifyElement{align-items:baseline;display:flex;flex-direction:column;gap:1rem;padding:.25rem}.ElementMarkup>pre,.StringifyElement-markup{color:var(--color-text-subtle);font-size:.875rem;margin-top:.5rem;max-width:100%;padding-left:2rem;position:relative}.ElementMarkup>pre:before,.StringifyElement-markup:before{background:url(/static/shared/icon/content_copy_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:contain;content:" ";left:.5rem;padding-left:1rem;position:absolute;width:1rem}.StringifyElement-markup:active{filter:contrast(.9)}.StringifyElement-details{color:var(--color-text-subtle);font-size:.8125rem;overflow-x:auto}.GoColor-circle{background-color:var(--color);border:var(--border);border-radius:2rem;height:3rem;margin:auto auto .5rem;width:3rem}.GoIcon-title,.GoColor-title{text-transform:capitalize}.go-Main-navDesktop a+ul{text-transform:capitalize}.MainHeader-toggle{display:flex}
+/*# sourceMappingURL=styleguide.min.css.map */
diff --git a/static/frontend/styleguide/styleguide.min.css.map b/static/frontend/styleguide/styleguide.min.css.map
new file mode 100644
index 0000000..5d5bfb5
--- /dev/null
+++ b/static/frontend/styleguide/styleguide.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["../unit/main/_meta.css", "styleguide.css"],
+  "sourcesContent": ["/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n}\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('../unit/main/_meta.css');\n\n.StyleGuide {\n  background-color: var(--color-background);\n}\n.StyleGuide > section {\n  align-items: center;\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: 100%;\n  margin-bottom: 1rem;\n}\n.StyleGuide > section > header {\n  border-bottom: var(--border);\n  grid-column: 1/-1;\n  margin-bottom: 1rem;\n  padding-bottom: 1rem;\n}\n.StyleGuide > section > h2 {\n  grid-column: 1/-1;\n  width: max-content;\n}\n.StyleGuide > section > hr {\n  grid-column: 1/-1;\n}\n.StyleGuide > section > h3 {\n  grid-column: 1/-1;\n  margin: 1rem 0;\n}\n.StyleGuide > section > p {\n  grid-column: 1/-1;\n}\n.StyleGuide .Color,\n.StyleGuide .ColorIntent {\n  grid-template-columns: repeat(auto-fit, 5rem [col-start] minmax(12rem, auto) [col-end]);\n}\n.StyleGuide .Outline {\n  align-items: flex-start;\n}\n.StyleGuide .Outline > span {\n  margin-top: 0.5rem;\n}\n@media (min-width: 80rem) {\n  .StyleGuide .Icon {\n    grid-template-columns: 10rem 8rem auto;\n  }\n  .StyleGuide .Typography,\n  .StyleGuide .Button,\n  .StyleGuide .Form,\n  .StyleGuide .Modal,\n  .StyleGuide .Message,\n  .StyleGuide .Breadcrumb,\n  .StyleGuide .Chip,\n  .StyleGuide .Tooltip,\n  .StyleGuide .Outline,\n  .StyleGuide .Clipboard {\n    grid-template-columns: 20rem auto;\n  }\n}\n@media (min-width: 112rem) {\n  .StyleGuide .Icon {\n    grid-template-columns: 10rem auto 50%;\n  }\n  .StyleGuide .Typography,\n  .StyleGuide .Button,\n  .StyleGuide .Form,\n  .StyleGuide .Modal,\n  .StyleGuide .Message,\n  .StyleGuide .Breadcrumb,\n  .StyleGuide .Chip,\n  .StyleGuide .Tooltip,\n  .StyleGuide .Outline,\n  .StyleGuide .Clipboard {\n    grid-template-columns: auto 50%;\n  }\n}\n\n.StringifyElement {\n  align-items: baseline;\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n  padding: 0.25rem;\n}\n.ElementMarkup > pre,\n.StringifyElement-markup {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n  margin-top: 0.5rem;\n  max-width: 100%;\n  padding-left: 2rem;\n  position: relative;\n}\n.ElementMarkup > pre::before,\n.StringifyElement-markup::before {\n  background: url(/static/shared/icon/content_copy_gm_grey_24dp.svg);\n  background-repeat: no-repeat;\n  background-size: contain;\n  content: ' ';\n  left: 0.5rem;\n  padding-left: 1rem;\n  position: absolute;\n  width: 1rem;\n}\n.StringifyElement-markup:active {\n  filter: contrast(0.9);\n}\n.StringifyElement-details {\n  color: var(--color-text-subtle);\n  font-size: 0.8125rem;\n  overflow-x: auto;\n}\n.GoColor-circle {\n  background-color: var(--color);\n  border: var(--border);\n  border-radius: 2rem;\n  height: 3rem;\n  margin: auto;\n  margin-bottom: 0.5rem;\n  width: 3rem;\n}\n.GoIcon-title,\n.GoColor-title {\n  text-transform: capitalize;\n}\n\n.go-Main-navDesktop a + ul {\n  text-transform: capitalize;\n}\n\n.MainHeader-toggle {\n  display: flex;\n}\n"],
+  "mappings": ";;;;;AAMA,UACE,aACA,cACA,uCACA,mBAEF,kCAEE,aACA,eACA,mBACA,cAEF,eACE,mBACA,aAEF,iBACE,gBACA,uBAEF,0BACE,UACE,uCAEF,kCAEE,oBAGJ,2BACE,wCACE,2BAEF,8FAEE,sBACA,oBAGJ,uBACE,WAEF,0BACE,uBACE,eC3CJ,YACE,yCAEF,oBACE,mBACA,aACA,cACA,2BACA,mBAEF,2BACE,4BACA,iBACA,mBACA,oBAEF,uBACE,iBACA,kBAEF,uBACE,iBAEF,uBACE,iBAhCF,cAmCA,sBACE,iBAEF,4CAEE,qFAEF,qBACE,uBAEF,0BACE,iBAEF,0BACE,kBACE,sCAEF,iNAUE,kCAGJ,2BACE,kBACE,qCAEF,iNAUE,gCAIJ,kBACE,qBACA,aACA,sBACA,SAvFF,eA0FA,4CAEE,+BACA,kBACA,iBACA,eACA,kBACA,kBAEF,0DAEE,kEACA,4BACA,wBACA,YACA,WACA,kBACA,kBACA,WAEF,gCACE,oBAEF,0BACE,+BACA,mBACA,gBAEF,gBACE,8BACA,qBAxHF,mBA0HE,YA1HF,uBA6HE,WAEF,6BAEE,0BAGF,yBACE,0BAGF,mBACE",
+  "names": []
+}
diff --git a/static/frontend/styleguide/styleguide.tmpl b/static/frontend/styleguide/styleguide.tmpl
index 67c5a59..baf0423 100644
--- a/static/frontend/styleguide/styleguide.tmpl
+++ b/static/frontend/styleguide/styleguide.tmpl
@@ -7,8 +7,8 @@
 {{define "title"}}<title>Style Guide · pkg.go.dev</title>{{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/unit/unit.css" rel="stylesheet">
-  <link href="/static/frontend/styleguide/styleguide.css" rel="stylesheet">
+  <link href="/static/frontend/unit/unit.min.css" rel="stylesheet">
+  <link href="/static/frontend/styleguide/styleguide.min.css" rel="stylesheet">
 {{end}}
 
 {{define "post-content"}}
diff --git a/static/frontend/subrepo/subrepo.min.css b/static/frontend/subrepo/subrepo.min.css
new file mode 100644
index 0000000..b6932ce
--- /dev/null
+++ b/static/frontend/subrepo/subrepo.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.SubRepo-links{line-height:1.5rem}
+/*# sourceMappingURL=subrepo.min.css.map */
diff --git a/static/frontend/subrepo/subrepo.min.css.map b/static/frontend/subrepo/subrepo.min.css.map
new file mode 100644
index 0000000..20d1a64
--- /dev/null
+++ b/static/frontend/subrepo/subrepo.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["subrepo.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.SubRepo-links {\n  line-height: 1.5rem;\n}\n"],
+  "mappings": ";;;;;AAMA,eACE",
+  "names": []
+}
diff --git a/static/frontend/subrepo/subrepo.tmpl b/static/frontend/subrepo/subrepo.tmpl
index c1e539f..cf9a431 100644
--- a/static/frontend/subrepo/subrepo.tmpl
+++ b/static/frontend/subrepo/subrepo.tmpl
@@ -12,7 +12,7 @@
 {{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/subrepo/subrepo.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/subrepo/subrepo.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main"}}
diff --git a/static/frontend/unit/importedby/importedby.min.css b/static/frontend/unit/importedby/importedby.min.css
new file mode 100644
index 0000000..f46ea73
--- /dev/null
+++ b/static/frontend/unit/importedby/importedby.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.ImportedBy-heading{margin-bottom:1rem}.ImportedBy-list{list-style:none;padding:0}.ImportedBy .Pagination-nav,.ImportedBy .Pagination-navInner{justify-content:flex-start}.ImportedBy-details{margin:.5rem 0}.ImportedBy-detailsContent{margin-left:2.5rem}.ImportedBy-detailsIndent{margin-bottom:.5rem;margin-left:1.1rem;margin-top:.5rem}
+/*# sourceMappingURL=importedby.min.css.map */
diff --git a/static/frontend/unit/importedby/importedby.min.css.map b/static/frontend/unit/importedby/importedby.min.css.map
new file mode 100644
index 0000000..5406a49
--- /dev/null
+++ b/static/frontend/unit/importedby/importedby.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["importedby.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.ImportedBy-heading {\n  margin-bottom: 1rem;\n}\n.ImportedBy-list {\n  list-style: none;\n  padding: 0;\n}\n.ImportedBy .Pagination-nav,\n.ImportedBy .Pagination-navInner {\n  justify-content: flex-start;\n}\n.ImportedBy-details {\n  margin: 0.5rem 0;\n}\n.ImportedBy-detailsContent {\n  margin-left: 2.5rem;\n}\n.ImportedBy-detailsIndent {\n  margin-bottom: 0.5rem;\n  margin-left: 1.1rem;\n  margin-top: 0.5rem;\n}\n"],
+  "mappings": ";;;;;AAMA,oBACE,mBAEF,iBACE,gBAVF,UAaA,6DAEE,2BAEF,oBAjBA,eAoBA,2BACE,mBAEF,0BACE,oBACA,mBACA",
+  "names": []
+}
diff --git a/static/frontend/unit/importedby/importedby.tmpl b/static/frontend/unit/importedby/importedby.tmpl
index 2066868..30ebe77 100644
--- a/static/frontend/unit/importedby/importedby.tmpl
+++ b/static/frontend/unit/importedby/importedby.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "main-styles"}}
-  <link href="/static/frontend/unit/importedby/importedby.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/importedby/importedby.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main-header"}}
diff --git a/static/frontend/unit/imports/imports.min.css b/static/frontend/unit/imports/imports.min.css
new file mode 100644
index 0000000..7be061c
--- /dev/null
+++ b/static/frontend/unit/imports/imports.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.Imports-listItem{line-height:1.125rem}.Imports-list{margin:1rem 0}
+/*# sourceMappingURL=imports.min.css.map */
diff --git a/static/frontend/unit/imports/imports.min.css.map b/static/frontend/unit/imports/imports.min.css.map
new file mode 100644
index 0000000..97b61ac
--- /dev/null
+++ b/static/frontend/unit/imports/imports.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["imports.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.Imports-listItem {\n  line-height: 1.125rem;\n}\n.Imports-list {\n  margin: 1rem 0;\n}\n"],
+  "mappings": ";;;;;AAMA,kBACE,qBAEF,cATA",
+  "names": []
+}
diff --git a/static/frontend/unit/imports/imports.tmpl b/static/frontend/unit/imports/imports.tmpl
index 8227525..62cd3df 100644
--- a/static/frontend/unit/imports/imports.tmpl
+++ b/static/frontend/unit/imports/imports.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "main-styles"}}
-  <link href="/static/frontend/unit/imports/imports.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/imports/imports.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main-header"}}
diff --git a/static/frontend/unit/licenses/licenses.min.css b/static/frontend/unit/licenses/licenses.min.css
new file mode 100644
index 0000000..d610e3d
--- /dev/null
+++ b/static/frontend/unit/licenses/licenses.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.License{margin-bottom:1rem}.License>h2{margin-bottom:1rem}.License>p{margin-bottom:.5rem}.License-contents{border:var(--border);border-radius:.1875rem;font-size:.875rem;line-height:1.375rem;margin:0;overflow-x:auto;padding:1.5rem;tab-size:4}.License-source{font-size:.875rem;padding-top:.5rem}.Disclaimer-link{font-style:italic}
+/*# sourceMappingURL=licenses.min.css.map */
diff --git a/static/frontend/unit/licenses/licenses.min.css.map b/static/frontend/unit/licenses/licenses.min.css.map
new file mode 100644
index 0000000..3eecc6c
--- /dev/null
+++ b/static/frontend/unit/licenses/licenses.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["licenses.css"],
+  "sourcesContent": ["/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.License {\n  margin-bottom: 1rem;\n}\n\n.License > h2 {\n  margin-bottom: 1rem;\n}\n.License > p {\n  margin-bottom: 0.5rem;\n}\n.License-contents {\n  border: var(--border);\n  border-radius: 0.1875rem;\n  font-size: 0.875rem;\n  line-height: 1.375rem;\n  margin: 0;\n  overflow-x: auto;\n  padding: 1.5rem;\n  tab-size: 4;\n}\n.License-source {\n  font-size: 0.875rem;\n  padding-top: 0.5rem;\n}\n.Disclaimer-link {\n  font-style: italic;\n}\n"],
+  "mappings": ";;;;;AAMA,SACE,mBAGF,YACE,mBAEF,WACE,oBAEF,kBACE,qBAjBF,uBAmBE,kBACA,qBApBF,SAsBE,gBAtBF,eAwBE,WAEF,gBACE,kBACA,kBAEF,iBACE",
+  "names": []
+}
diff --git a/static/frontend/unit/licenses/licenses.tmpl b/static/frontend/unit/licenses/licenses.tmpl
index 70c9ae4..e3a23528 100644
--- a/static/frontend/unit/licenses/licenses.tmpl
+++ b/static/frontend/unit/licenses/licenses.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "main-styles"}}
-  <link href="/static/frontend/unit/licenses/licenses.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/licenses/licenses.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main-header"}}
diff --git a/static/frontend/unit/main/main.js b/static/frontend/unit/main/main.js
index e169123..07ba302 100644
--- a/static/frontend/unit/main/main.js
+++ b/static/frontend/unit/main/main.js
@@ -1,4 +1,4 @@
-(()=>{var T=document.querySelector(".JumpDialog"),u=T?.querySelector(".JumpDialog-body"),o=T?.querySelector(".JumpDialog-list"),h=T?.querySelector(".JumpDialog-input"),A=document.querySelector(".js-documentation"),p;function q(){let s=[];if(!!A){for(let e of A.querySelectorAll("[data-kind]"))s.push(P(e));for(let e of s)e.link.addEventListener("click",function(){T?.close()});return s.sort(function(e,t){return e.lower.localeCompare(t.lower)}),s}}function P(s){let e=document.createElement("a"),t=s.getAttribute("id");e.setAttribute("href","#"+t),e.setAttribute("tabindex","-1"),e.setAttribute("data-gtmc","jump to link");let i=s.getAttribute("data-kind");return{link:e,name:t??"",kind:i??"",lower:t?.toLowerCase()??""}}var k,f=-1;function g(s){for(k=s,p||(p=q()),b(-1);o?.firstChild;)o.firstChild.remove();if(s){let e=s.toLowerCase(),t=[],i=[],r=[],n=(l,a,d)=>l.name.substring(0,a)+"<b>"+l.name.substring(a,d)+"</b>"+l.name.substring(d);for(let l of p??[]){let a=l.name.toLowerCase();if(a===e)l.link.innerHTML=n(l,0,l.name.length),t.push(l);else if(a.startsWith(e))l.link.innerHTML=n(l,0,s.length),i.push(l);else{let d=a.indexOf(e);d>-1&&(l.link.innerHTML=n(l,d,d+s.length),r.push(l))}}for(let l of t.concat(i).concat(r))o?.appendChild(l.link)}else{if(!p||p.length===0){let e=document.createElement("i");e.innerHTML="There are no symbols on this page.",o?.appendChild(e)}for(let e of p??[])e.link.innerHTML=e.name+" <i>"+e.kind+"</i>",o?.appendChild(e.link)}u&&(u.scrollTop=0),p?.length&&o&&o.children.length>0&&b(0)}function b(s){let e=o?.children;if(!(!e||!u)){if(f>=0&&e[f].classList.remove("JumpDialog-active"),s>=e.length&&(s=e.length-1),s>=0){e[s].classList.add("JumpDialog-active");let t=e[s].offsetTop-e[0].offsetTop,i=t+e[s].clientHeight;t<u.scrollTop?u.scrollTop=t:i>u.scrollTop+u.clientHeight&&(u.scrollTop=i-u.clientHeight)}f=s}}function C(s){if(f<0)return;let e=f+s;e<0&&(e=0),b(e)}h?.addEventListener("keyup",function(){h.value.toUpperCase()!=k.toUpperCase()&&g(h.value)});h?.addEventListener("keydown",function(s){let e=38,t=40,i=13;switch(s.which){case e:C(-1),s.preventDefault();break;case t:C(1),s.preventDefault();break;case i:f>=0&&o&&(o.children[f].click(),s.preventDefault());break}});var I=document.querySelector(".ShortcutsDialog");document.addEventListener("keypress",function(s){if(T?.open||I?.open)return;let e=s.target,t=e?.tagName;if(t=="INPUT"||t=="SELECT"||t=="TEXTAREA"||e?.contentEditable=="true"||s.metaKey||s.ctrlKey)return;switch(String.fromCharCode(s.which)){case"f":case"F":s.preventDefault(),h&&(h.value=""),T?.showModal(),h?.focus(),g("");break;case"?":I?.showModal();break}});var w=document.querySelector(".js-jumpToInput");w&&w.addEventListener("click",()=>{h&&(h.value=""),g("")});var m={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},S=class{constructor(e){this.exampleEl=e;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(m.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(m.PLAY_BUTTON),this.shareButtonEl=e.querySelector(m.SHARE_BUTTON),this.formatButtonEl=e.querySelector(m.FORMAT_BUTTON),this.runButtonEl=e.querySelector(m.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(m.EXAMPLE_INPUT)),this.outputEl=e.querySelector(m.EXAMPLE_OUTPUT),this.playButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.shareButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.formatButtonEl?.addEventListener("click",()=>this.handleFormatButtonClick()),this.runButtonEl?.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",t=>this.onKeydown(t)))}makeTextArea(e){let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=e?.textContent??"",e?.parentElement?.replaceChild(t,e),t}getAnchorHash(){return this.anchorEl?.hash}expand(){this.exampleEl.open=!0}resize(){if(this.inputEl?.value){let e=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+e*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:this.inputEl?.value}).then(t=>t.text()).then(t=>{let i=e+t;this.setOutputText(`<a href="${i}">${i}</a>`),window.open(i)}).catch(t=>{this.setErrorText(t)})}handleFormatButtonClick(){this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",this.inputEl?.value??""),fetch("/play/fmt",{method:"POST",body:e}).then(t=>t.json()).then(({Body:t,Error:i})=>{this.setOutputText(i||"Done."),t&&(this.setInputText(t),this.resize())}).catch(t=>{this.setErrorText(t)})}handleRunButtonClick(){this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:this.inputEl?.value,version:2})}).then(e=>e.json()).then(async({Events:e,Errors:t})=>{this.setOutputText(t||"");for(let i of e||[])this.setOutputText(i.Message),await new Promise(r=>setTimeout(r,i.Delay/1e6))}).catch(e=>{this.setErrorText(e)})}},M=location.hash.match(/^#(example-.*)$/);if(M){let s=document.getElementById(M[1]);s&&(s.open=!0)}var j=[...document.querySelectorAll(m.PLAY_HREF)],U=s=>j.find(e=>e.hash===s.getAnchorHash());for(let s of document.querySelectorAll(m.PLAY_CONTAINER)){let e=new S(s),t=U(e);t?t.addEventListener("click",()=>{e.expand()}):console.warn("example href not found")}var v=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,r=i.value;i.value.startsWith("/")||(r="/"+r),window.location.href=r})}};function H(s){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let r={},n;for(let l of s.treeitems){if(Number(l.depth)>4)continue;l.groupTreeitem?(n=r[l.groupTreeitem.label],n||(n=r[l.groupTreeitem.label]=document.createElement("optgroup"),n.label=l.groupTreeitem.label,t.appendChild(n))):n=i;let a=document.createElement("option");a.label=l.label,a.textContent=l.label,a.value=l.el.href.replace(window.location.origin,"").replace("/",""),n.appendChild(a)}return s.addObserver(l=>{let a=l.el.hash,d=t.querySelector(`[value$="${a}"]`)?.value;d&&(t.value=d)},50),e}var x=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let r of i)e.set(r.target.id,r.isIntersecting||r.intersectionRatio===1);for(let[r,n]of e)if(n){let l=this.treeitems.find(a=>a.el?.href.endsWith(`#${r}`));if(l)for(let a of this.observerCallbacks)a(l);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(r=>r.el.getAttribute("href")))if(i){let r=i.replace(window.location.origin,"").replace("/","").replace("#",""),n=document.getElementById(r);n&&t.observe(n)}}addObserver(e,t=200){this.observerCallbacks.push(_(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let r=this.treeitems[i];if(r.isVisible){t=r;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let r=this.treeitems[i];if(r.isVisible){t=r;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){for(let t of this.el.querySelectorAll('[aria-expanded="true"]'))t!==e.el&&(t.nextElementSibling?.contains(e.el)||t.setAttribute("aria-expanded","false"));for(let t of this.el.querySelectorAll("[aria-selected]"))t!==e.el&&t.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,r;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),r=this.getIndexFirstChars(i,t),r===-1&&(r=this.getIndexFirstChars(0,t)),r>-1&&this.setFocusToItem(this.treeitems[r])}findTreeItems(){let e=(t,i)=>{let r=i,n=t.firstElementChild;for(;n;)(n.tagName==="A"||n.tagName==="SPAN")&&(r=new O(n,this,i),this.treeitems.push(r),this.firstChars.push(r.label.substring(0,1).toLowerCase())),n.firstElementChild&&e(n,r),n=n.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},O=class{constructor(e,t,i){e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=e.textContent?.trim()??"",this.tree=t,this.depth=(i?.depth||0)+1,this.index=0;let r=e.parentElement;r?.tagName.toLowerCase()==="li"&&r?.setAttribute("role","none"),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=e?.getAttribute("aria-label")?.trim()??""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let n=e.nextElementSibling;for(;n;){if(n.tagName.toLowerCase()=="ul"){let l=`${i?.label??""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",l),e.setAttribute("aria-expanded","false"),n.setAttribute("role","group"),n.setAttribute("id",l),this.isExpandable=!0;break}n=n.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.add("focus")}handleBlur(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function _(s,e){let t;return(...i)=>{let r=()=>{t=null,s(...i)};t&&clearTimeout(t),t=setTimeout(r,e)}}var L=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{t.setAttribute(e.replace("data-",""),t.getAttribute(e)??""),t.removeAttribute(e)})}attachEventListeners(){this.rows.forEach(e=>{e.addEventListener("click",t=>{this.handleToggleClick(t)})}),this.toggleAll?.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;t?.hasAttribute("aria-expanded")||(t=this.table.querySelector(`button[aria-controls="${t?.getAttribute("aria-controls")}"]`));let i=t?.getAttribute("aria-expanded")==="true";t?.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{let t=e?.getAttribute("aria-expanded")==="true";e?.getAttribute("aria-controls")?.trimEnd().split(" ")?.map(r=>{let n=document.getElementById(`${r}`);t?(n?.classList.add("visible"),n?.classList.remove("hidden")):(n?.classList.add("hidden"),n?.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};var B=document.querySelector(".js-expandableTable");if(B){let s=new L(B,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&s.expandAllItems()}var N=document.querySelector(".js-tree");if(N){let s=new x(N),e=H(s),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&t?.replaceChild(e,t.firstElementChild),e.firstElementChild&&new v(e.firstElementChild)}var c=document.querySelector(".js-readme"),y=document.querySelector(".js-readmeContent"),D=document.querySelector(".js-readmeOutline"),E=document.querySelectorAll(".js-readmeExpand"),F=document.querySelector(".js-readmeCollapse"),V=document.querySelector(".DocNavMobile-select");c&&y&&D&&E.length&&F&&(window.location.hash.includes("readme")&&c.classList.add("UnitReadme--expanded"),V?.addEventListener("change",s=>{s.target.value.startsWith("readme-")&&c.classList.add("UnitReadme--expanded")}),E.forEach(s=>s.addEventListener("click",e=>{e.preventDefault(),c.classList.add("UnitReadme--expanded"),c.scrollIntoView()})),F.addEventListener("click",s=>{s.preventDefault(),c.classList.remove("UnitReadme--expanded"),E[1]&&E[1].scrollIntoView({block:"center"})}),y.addEventListener("keyup",()=>{c.classList.add("UnitReadme--expanded")}),y.addEventListener("click",()=>{c.classList.add("UnitReadme--expanded")}),D.addEventListener("click",()=>{c.classList.add("UnitReadme--expanded")}),document.addEventListener("keydown",s=>{(s.ctrlKey||s.metaKey)&&s.key==="f"&&c.classList.add("UnitReadme--expanded")}));function R(){if(!location.hash)return;let e=document.querySelector(location.hash)?.parentElement?.parentElement;e?.nodeName==="DETAILS"&&(e.open=!0)}R();window.addEventListener("hashchange",()=>R());document.querySelectorAll(".js-buildContextSelect").forEach(s=>{s.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});})();
+(()=>{var c=document.querySelector(".JumpDialog"),p=c==null?void 0:c.querySelector(".JumpDialog-body"),o=c==null?void 0:c.querySelector(".JumpDialog-list"),u=c==null?void 0:c.querySelector(".JumpDialog-input"),S=document.querySelector(".js-documentation"),h;function V(){let s=[];if(!!S){for(let e of S.querySelectorAll("[data-kind]"))s.push(J(e));for(let e of s)e.link.addEventListener("click",function(){c==null||c.close()});return s.sort(function(e,t){return e.lower.localeCompare(t.lower)}),s}}function J(s){var r;let e=document.createElement("a"),t=s.getAttribute("id");e.setAttribute("href","#"+t),e.setAttribute("tabindex","-1"),e.setAttribute("data-gtmc","jump to link");let i=s.getAttribute("data-kind");return{link:e,name:t!=null?t:"",kind:i!=null?i:"",lower:(r=t==null?void 0:t.toLowerCase())!=null?r:""}}var M,T=-1;function x(s){for(M=s,h||(h=V()),g(-1);o==null?void 0:o.firstChild;)o.firstChild.remove();if(s){let e=s.toLowerCase(),t=[],i=[],r=[],l=(n,a,d)=>n.name.substring(0,a)+"<b>"+n.name.substring(a,d)+"</b>"+n.name.substring(d);for(let n of h!=null?h:[]){let a=n.name.toLowerCase();if(a===e)n.link.innerHTML=l(n,0,n.name.length),t.push(n);else if(a.startsWith(e))n.link.innerHTML=l(n,0,s.length),i.push(n);else{let d=a.indexOf(e);d>-1&&(n.link.innerHTML=l(n,d,d+s.length),r.push(n))}}for(let n of t.concat(i).concat(r))o==null||o.appendChild(n.link)}else{if(!h||h.length===0){let e=document.createElement("i");e.innerHTML="There are no symbols on this page.",o==null||o.appendChild(e)}for(let e of h!=null?h:[])e.link.innerHTML=e.name+" <i>"+e.kind+"</i>",o==null||o.appendChild(e.link)}p&&(p.scrollTop=0),(h==null?void 0:h.length)&&o&&o.children.length>0&&g(0)}function g(s){let e=o==null?void 0:o.children;if(!(!e||!p)){if(T>=0&&e[T].classList.remove("JumpDialog-active"),s>=e.length&&(s=e.length-1),s>=0){e[s].classList.add("JumpDialog-active");let t=e[s].offsetTop-e[0].offsetTop,i=t+e[s].clientHeight;t<p.scrollTop?p.scrollTop=t:i>p.scrollTop+p.clientHeight&&(p.scrollTop=i-p.clientHeight)}T=s}}function H(s){if(T<0)return;let e=T+s;e<0&&(e=0),g(e)}u==null||u.addEventListener("keyup",function(){u.value.toUpperCase()!=M.toUpperCase()&&x(u.value)});u==null||u.addEventListener("keydown",function(s){let e=38,t=40,i=13;switch(s.which){case e:H(-1),s.preventDefault();break;case t:H(1),s.preventDefault();break;case i:T>=0&&o&&(o.children[T].click(),s.preventDefault());break}});var E=document.querySelector(".ShortcutsDialog");document.addEventListener("keypress",function(s){if((c==null?void 0:c.open)||(E==null?void 0:E.open))return;let e=s.target,t=e==null?void 0:e.tagName;if(t=="INPUT"||t=="SELECT"||t=="TEXTAREA"||(e==null?void 0:e.contentEditable)=="true"||s.metaKey||s.ctrlKey)return;switch(String.fromCharCode(s.which)){case"f":case"F":s.preventDefault(),u&&(u.value=""),c==null||c.showModal(),u==null||u.focus(),x("");break;case"?":E==null||E.showModal();break}});var O=document.querySelector(".js-jumpToInput");O&&O.addEventListener("click",()=>{u&&(u.value=""),x("")});var f={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},B=class{constructor(e){this.exampleEl=e;var t,i,r,l;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(f.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(f.PLAY_BUTTON),this.shareButtonEl=e.querySelector(f.SHARE_BUTTON),this.formatButtonEl=e.querySelector(f.FORMAT_BUTTON),this.runButtonEl=e.querySelector(f.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(f.EXAMPLE_INPUT)),this.outputEl=e.querySelector(f.EXAMPLE_OUTPUT),(t=this.playButtonEl)==null||t.addEventListener("click",()=>this.handleShareButtonClick()),(i=this.shareButtonEl)==null||i.addEventListener("click",()=>this.handleShareButtonClick()),(r=this.formatButtonEl)==null||r.addEventListener("click",()=>this.handleFormatButtonClick()),(l=this.runButtonEl)==null||l.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",n=>this.onKeydown(n)))}makeTextArea(e){var i,r;let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=(i=e==null?void 0:e.textContent)!=null?i:"",(r=e==null?void 0:e.parentElement)==null||r.replaceChild(t,e),t}getAnchorHash(){var e;return(e=this.anchorEl)==null?void 0:e.hash}expand(){this.exampleEl.open=!0}resize(){var e;if((e=this.inputEl)==null?void 0:e.value){let t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){var t;let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:(t=this.inputEl)==null?void 0:t.value}).then(i=>i.text()).then(i=>{let r=e+i;this.setOutputText(`<a href="${r}">${r}</a>`),window.open(r)}).catch(i=>{this.setErrorText(i)})}handleFormatButtonClick(){var t,i;this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",(i=(t=this.inputEl)==null?void 0:t.value)!=null?i:""),fetch("/play/fmt",{method:"POST",body:e}).then(r=>r.json()).then(({Body:r,Error:l})=>{this.setOutputText(l||"Done."),r&&(this.setInputText(r),this.resize())}).catch(r=>{this.setErrorText(r)})}handleRunButtonClick(){var e;this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:(e=this.inputEl)==null?void 0:e.value,version:2})}).then(t=>t.json()).then(async({Events:t,Errors:i})=>{this.setOutputText(i||"");for(let r of t||[])this.setOutputText(r.Message),await new Promise(l=>setTimeout(l,r.Delay/1e6))}).catch(t=>{this.setErrorText(t)})}},R=location.hash.match(/^#(example-.*)$/);if(R){let s=document.getElementById(R[1]);s&&(s.open=!0)}var K=[...document.querySelectorAll(f.PLAY_HREF)],$=s=>K.find(e=>e.hash===s.getAnchorHash());for(let s of document.querySelectorAll(f.PLAY_CONTAINER)){let e=new B(s),t=$(e);t?t.addEventListener("click",()=>{e.expand()}):console.warn("example href not found")}var L=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,r=i.value;i.value.startsWith("/")||(r="/"+r),window.location.href=r})}};function N(s){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let r={},l;for(let n of s.treeitems){if(Number(n.depth)>4)continue;n.groupTreeitem?(l=r[n.groupTreeitem.label],l||(l=r[n.groupTreeitem.label]=document.createElement("optgroup"),l.label=n.groupTreeitem.label,t.appendChild(l))):l=i;let a=document.createElement("option");a.label=n.label,a.textContent=n.label,a.value=n.el.href.replace(window.location.origin,"").replace("/",""),l.appendChild(a)}return s.addObserver(n=>{var b;let a=n.el.hash,d=(b=t.querySelector(`[value$="${a}"]`))==null?void 0:b.value;d&&(t.value=d)},50),e}var y=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let r of i)e.set(r.target.id,r.isIntersecting||r.intersectionRatio===1);for(let[r,l]of e)if(l){let n=this.treeitems.find(a=>{var d;return(d=a.el)==null?void 0:d.href.endsWith(`#${r}`)});if(n)for(let a of this.observerCallbacks)a(n);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(r=>r.el.getAttribute("href")))if(i){let r=i.replace(window.location.origin,"").replace("/","").replace("#",""),l=document.getElementById(r);l&&t.observe(l)}}addObserver(e,t=200){this.observerCallbacks.push(G(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let r=this.treeitems[i];if(r.isVisible){t=r;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let r=this.treeitems[i];if(r.isVisible){t=r;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&(((t=i.nextElementSibling)==null?void 0:t.contains(e.el))||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,r;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),r=this.getIndexFirstChars(i,t),r===-1&&(r=this.getIndexFirstChars(0,t)),r>-1&&this.setFocusToItem(this.treeitems[r])}findTreeItems(){let e=(t,i)=>{let r=i,l=t.firstElementChild;for(;l;)(l.tagName==="A"||l.tagName==="SPAN")&&(r=new q(l,this,i),this.treeitems.push(r),this.firstChars.push(r.label.substring(0,1).toLowerCase())),l.firstElementChild&&e(l,r),l=l.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},q=class{constructor(e,t,i){var n,a,d,b,w;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(n=e.textContent)==null?void 0:n.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let r=e.parentElement;(r==null?void 0:r.tagName.toLowerCase())==="li"&&(r==null||r.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(b=(d=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:d.trim())!=null?b:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let l=e.nextElementSibling;for(;l;){if(l.tagName.toLowerCase()=="ul"){let I=`${(w=i==null?void 0:i.label)!=null?w:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",I),e.setAttribute("aria-expanded","false"),l.setAttribute("role","group"),l.setAttribute("id",I),this.isExpandable=!0;break}l=l.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function G(s,e){let t;return(...i)=>{let r=()=>{t=null,s(...i)};t&&clearTimeout(t),t=setTimeout(r,e)}}var A=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{var i;t.setAttribute(e.replace("data-",""),(i=t.getAttribute(e))!=null?i:""),t.removeAttribute(e)})}attachEventListeners(){var e;this.rows.forEach(t=>{t.addEventListener("click",i=>{this.handleToggleClick(i)})}),(e=this.toggleAll)==null||e.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;(t==null?void 0:t.hasAttribute("aria-expanded"))||(t=this.table.querySelector(`button[aria-controls="${t==null?void 0:t.getAttribute("aria-controls")}"]`));let i=(t==null?void 0:t.getAttribute("aria-expanded"))==="true";t==null||t.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{var r;let t=(e==null?void 0:e.getAttribute("aria-expanded"))==="true",i=(r=e==null?void 0:e.getAttribute("aria-controls"))==null?void 0:r.trimEnd().split(" ");i==null||i.map(l=>{let n=document.getElementById(`${l}`);t?(n==null||n.classList.add("visible"),n==null||n.classList.remove("hidden")):(n==null||n.classList.add("hidden"),n==null||n.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};var F=document.querySelector(".js-expandableTable");if(F){let s=new A(F,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&s.expandAllItems()}var P=document.querySelector(".js-tree");if(P){let s=new y(P),e=N(s),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&(t==null||t.replaceChild(e,t.firstElementChild)),e.firstElementChild&&new L(e.firstElementChild)}var m=document.querySelector(".js-readme"),C=document.querySelector(".js-readmeContent"),U=document.querySelector(".js-readmeOutline"),v=document.querySelectorAll(".js-readmeExpand"),D=document.querySelector(".js-readmeCollapse"),k=document.querySelector(".DocNavMobile-select");m&&C&&U&&v.length&&D&&(window.location.hash.includes("readme")&&m.classList.add("UnitReadme--expanded"),k==null||k.addEventListener("change",s=>{s.target.value.startsWith("readme-")&&m.classList.add("UnitReadme--expanded")}),v.forEach(s=>s.addEventListener("click",e=>{e.preventDefault(),m.classList.add("UnitReadme--expanded"),m.scrollIntoView()})),D.addEventListener("click",s=>{s.preventDefault(),m.classList.remove("UnitReadme--expanded"),v[1]&&v[1].scrollIntoView({block:"center"})}),C.addEventListener("keyup",()=>{m.classList.add("UnitReadme--expanded")}),C.addEventListener("click",()=>{m.classList.add("UnitReadme--expanded")}),U.addEventListener("click",()=>{m.classList.add("UnitReadme--expanded")}),document.addEventListener("keydown",s=>{(s.ctrlKey||s.metaKey)&&s.key==="f"&&m.classList.add("UnitReadme--expanded")}));function _(){var t;if(!location.hash)return;let s=document.querySelector(location.hash),e=(t=s==null?void 0:s.parentElement)==null?void 0:t.parentElement;(e==null?void 0:e.nodeName)==="DETAILS"&&(e.open=!0)}_();window.addEventListener("hashchange",()=>_());document.querySelectorAll(".js-buildContextSelect").forEach(s=>{s.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});})();
 /*!
  * @license
  * Copyright 2019-2020 The Go Authors. All rights reserved.
diff --git a/static/frontend/unit/main/main.js.map b/static/frontend/unit/main/main.js.map
index 023102e..5352335 100644
--- a/static/frontend/unit/main/main.js.map
+++ b/static/frontend/unit/main/main.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["../../../shared/jump/jump.ts", "../../../shared/playground/playground.ts", "../../../shared/outline/select.ts", "../../../shared/outline/tree.ts", "../../../shared/table/table.ts", "main.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the behavior of the \"jump to symbol\" dialog for Go\n// package documentation, as well as the simple dialog that displays keyboard\n// shortcuts.\n\n// The DOM for the dialogs is at the bottom of static/frontend/unit/main/_modals.tmpl.\n// The CSS is in static/frontend/unit/main/_modals.css.\n\n// The dialog is activated by pressing the 'f' key. It presents a list\n// (#JumpDialog-list) of all Go symbols displayed in the documentation.\n// Entering text in the dialog's text box (#JumpDialog-filter) restricts the\n// list to symbols containing the text. Clicking on an symbol jumps to\n// its documentation.\n\n// This code is based on\n// https://go.googlesource.com/gddo/+/refs/heads/master/gddo-server/assets/site.js.\n// It was modified to remove the dependence on jquery and bootstrap.\n\nconst jumpDialog = document.querySelector<HTMLDialogElement>('.JumpDialog');\nconst jumpBody = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-body');\nconst jumpList = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-list');\nconst jumpFilter = jumpDialog?.querySelector<HTMLInputElement>('.JumpDialog-input');\nconst doc = document.querySelector<HTMLDivElement>('.js-documentation');\n\ninterface JumpListItem {\n  link: HTMLAnchorElement;\n  name: string;\n  kind: string;\n  lower: string;\n}\n\nlet jumpListItems: JumpListItem[] | undefined; // All the symbols in the doc; computed only once.\n\n// collectJumpListItems returns a list of items, one for each symbol in the\n// documentation on the current page.\n//\n// It uses the data-kind attribute generated in the documentation HTML to find\n// the symbols and their id attributes.\n//\n// If there are no data-kind attributes, then we have older doc; fall back to\n// a less precise method.\nfunction collectJumpListItems() {\n  const items = [];\n  if (!doc) return;\n  for (const el of doc.querySelectorAll('[data-kind]')) {\n    items.push(newJumpListItem(el));\n  }\n\n  // Clicking on any of the links closes the dialog.\n  for (const item of items) {\n    item.link.addEventListener('click', function () {\n      jumpDialog?.close();\n    });\n  }\n  // Sort case-insensitively by symbol name.\n  items.sort(function (a, b) {\n    return a.lower.localeCompare(b.lower);\n  });\n  return items;\n}\n\n// newJumpListItem creates a new item for the DOM element el.\n// An item is an object with:\n// - name: the element's id (which is the symbol name)\n// - kind: the element's kind (function, variable, etc.),\n// - link: a link ('a' tag) to the element\n// - lower: the name in lower case, just for sorting\nfunction newJumpListItem(el: Element): JumpListItem {\n  const a = document.createElement('a');\n  const name = el.getAttribute('id');\n  a.setAttribute('href', '#' + name);\n  a.setAttribute('tabindex', '-1');\n  a.setAttribute('data-gtmc', 'jump to link');\n  const kind = el.getAttribute('data-kind');\n  return {\n    link: a,\n    name: name ?? '',\n    kind: kind ?? '',\n    lower: name?.toLowerCase() ?? '', // for sorting\n  };\n}\n\nlet lastFilterValue: string; // The last contents of the filter text box.\nlet activeJumpItem = -1; // The index of the currently active item in the list.\n\n// updateJumpList sets the elements of the dialog list to\n// everything whose name contains filter.\nfunction updateJumpList(filter: string) {\n  lastFilterValue = filter;\n  if (!jumpListItems) {\n    jumpListItems = collectJumpListItems();\n  }\n  setActiveJumpItem(-1);\n\n  // Remove all children from list.\n  while (jumpList?.firstChild) {\n    jumpList.firstChild.remove();\n  }\n\n  if (filter) {\n    // A filter is set. We treat the filter as a substring that can appear in\n    // an item name (case insensitive), and find the following matches - in\n    // order of priority:\n    //\n    // 1. Exact matches (the filter matches the item's name exactly)\n    // 2. Prefix matches (the item's name starts with filter)\n    // 3. Infix matches (the filter is a substring of the item's name)\n    const filterLowerCase = filter.toLowerCase();\n\n    const exactMatches = [];\n    const prefixMatches = [];\n    const infixMatches = [];\n\n    // makeLinkHtml creates the link name HTML for a list item. item is the DOM\n    // item. item.name.substr(boldStart, boldEnd) will be bolded.\n    const makeLinkHtml = (item: JumpListItem, boldStart: number, boldEnd: number) => {\n      return (\n        item.name.substring(0, boldStart) +\n        '<b>' +\n        item.name.substring(boldStart, boldEnd) +\n        '</b>' +\n        item.name.substring(boldEnd)\n      );\n    };\n\n    for (const item of jumpListItems ?? []) {\n      const nameLowerCase = item.name.toLowerCase();\n\n      if (nameLowerCase === filterLowerCase) {\n        item.link.innerHTML = makeLinkHtml(item, 0, item.name.length);\n        exactMatches.push(item);\n      } else if (nameLowerCase.startsWith(filterLowerCase)) {\n        item.link.innerHTML = makeLinkHtml(item, 0, filter.length);\n        prefixMatches.push(item);\n      } else {\n        const index = nameLowerCase.indexOf(filterLowerCase);\n        if (index > -1) {\n          item.link.innerHTML = makeLinkHtml(item, index, index + filter.length);\n          infixMatches.push(item);\n        }\n      }\n    }\n\n    for (const item of exactMatches.concat(prefixMatches).concat(infixMatches)) {\n      jumpList?.appendChild(item.link);\n    }\n  } else {\n    if (!jumpListItems || jumpListItems.length === 0) {\n      const msg = document.createElement('i');\n      msg.innerHTML = 'There are no symbols on this page.';\n      jumpList?.appendChild(msg);\n    }\n    // No filter set; display all items in their existing order.\n    for (const item of jumpListItems ?? []) {\n      item.link.innerHTML = item.name + ' <i>' + item.kind + '</i>';\n      jumpList?.appendChild(item.link);\n    }\n  }\n\n  if (jumpBody) {\n    jumpBody.scrollTop = 0;\n  }\n  if (jumpListItems?.length && jumpList && jumpList.children.length > 0) {\n    setActiveJumpItem(0);\n  }\n}\n\n// Set the active jump item to n.\nfunction setActiveJumpItem(n: number) {\n  const cs = jumpList?.children as HTMLCollectionOf<HTMLElement> | null | undefined;\n  if (!cs || !jumpBody) {\n    return;\n  }\n  if (activeJumpItem >= 0) {\n    cs[activeJumpItem].classList.remove('JumpDialog-active');\n  }\n  if (n >= cs.length) {\n    n = cs.length - 1;\n  }\n  if (n >= 0) {\n    cs[n].classList.add('JumpDialog-active');\n\n    // Scroll so the active item is visible.\n    // For some reason cs[n].scrollIntoView() doesn't behave as I'd expect:\n    // it moves the entire dialog box in the viewport.\n\n    // Get the top and bottom of the active item relative to jumpBody.\n    const activeTop = cs[n].offsetTop - cs[0].offsetTop;\n    const activeBottom = activeTop + cs[n].clientHeight;\n    if (activeTop < jumpBody.scrollTop) {\n      // Off the top; scroll up.\n      jumpBody.scrollTop = activeTop;\n    } else if (activeBottom > jumpBody.scrollTop + jumpBody.clientHeight) {\n      // Off the bottom; scroll down.\n      jumpBody.scrollTop = activeBottom - jumpBody.clientHeight;\n    }\n  }\n  activeJumpItem = n;\n}\n\n// Increment the activeJumpItem by delta.\nfunction incActiveJumpItem(delta: number) {\n  if (activeJumpItem < 0) {\n    return;\n  }\n  let n = activeJumpItem + delta;\n  if (n < 0) {\n    n = 0;\n  }\n  setActiveJumpItem(n);\n}\n\n// Pressing a key in the filter updates the list (if the filter actually changed).\njumpFilter?.addEventListener('keyup', function () {\n  if (jumpFilter.value.toUpperCase() != lastFilterValue.toUpperCase()) {\n    updateJumpList(jumpFilter.value);\n  }\n});\n\n// Pressing enter in the filter selects the first element in the list.\njumpFilter?.addEventListener('keydown', function (event) {\n  const upArrow = 38;\n  const downArrow = 40;\n  const enterKey = 13;\n  switch (event.which) {\n    case upArrow:\n      incActiveJumpItem(-1);\n      event.preventDefault();\n      break;\n    case downArrow:\n      incActiveJumpItem(1);\n      event.preventDefault();\n      break;\n    case enterKey:\n      if (activeJumpItem >= 0) {\n        if (jumpList) {\n          (jumpList.children[activeJumpItem] as HTMLElement).click();\n          event.preventDefault();\n        }\n      }\n      break;\n  }\n});\n\nconst shortcutsDialog = document.querySelector<HTMLDialogElement>('.ShortcutsDialog');\n\n// Keyboard shortcuts:\n// - Pressing '/' focuses the search box\n// - Pressing 'f' or 'F' opens the jump-to-symbol dialog.\n// - Pressing '?' opens up the shortcut dialog.\n// Ignore a keypress if a dialog is already open, or if it is pressed on a\n// component that wants to consume it.\ndocument.addEventListener('keypress', function (e) {\n  if (jumpDialog?.open || shortcutsDialog?.open) {\n    return;\n  }\n  const target = e.target as HTMLElement | null;\n  const t = target?.tagName;\n  if (t == 'INPUT' || t == 'SELECT' || t == 'TEXTAREA') {\n    return;\n  }\n  if (target?.contentEditable == 'true') {\n    return;\n  }\n  if (e.metaKey || e.ctrlKey) {\n    return;\n  }\n  const ch = String.fromCharCode(e.which);\n  switch (ch) {\n    case 'f':\n    case 'F':\n      e.preventDefault();\n      if (jumpFilter) {\n        jumpFilter.value = '';\n      }\n      jumpDialog?.showModal();\n      jumpFilter?.focus();\n      updateJumpList('');\n      break;\n    case '?':\n      shortcutsDialog?.showModal();\n      break;\n  }\n});\n\nconst jumpOutlineInput = document.querySelector('.js-jumpToInput');\nif (jumpOutlineInput) {\n  jumpOutlineInput.addEventListener('click', () => {\n    if (jumpFilter) {\n      jumpFilter.value = '';\n    }\n    updateJumpList('');\n  });\n}\n", "/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accomodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.inputEl?.value,\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputText(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.setOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nconst exampleHashRegex = location.hash.match(/^#(example-.*)$/);\nif (exampleHashRegex) {\n  const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n  if (exampleHashEl) {\n    exampleHashEl.open = true;\n  }\n}\n\n// We use a spread operator to convert a nodelist into an array of elements.\nconst exampleHrefs = [\n  ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n];\n\n/**\n * Sometimes exampleHrefs and playContainers are in different order, so we\n * find an exampleHref from a common hash.\n * @param playContainer - playground container\n */\nconst findExampleHash = (playContainer: PlaygroundExampleController) =>\n  exampleHrefs.find(ex => {\n    return ex.hash === playContainer.getAnchorHash();\n  });\n\nfor (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n  // There should be the same amount of hrefs referencing examples as example containers.\n  const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n  const exampleHref = findExampleHash(playContainer);\n  if (exampleHref) {\n    exampleHref.addEventListener('click', () => {\n      playContainer.expand();\n    });\n  } else {\n    console.warn('example href not found');\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n", "import '../../../shared/jump/jump';\nimport '../../../shared/playground/playground';\n\nimport { SelectNavController, makeSelectNav } from '../../../shared/outline/select';\nimport { TreeNavController } from '../../../shared/outline/tree';\nimport { ExpandableRowsTableController } from '../../../shared/table/table';\n\nconst directories = document.querySelector<HTMLTableElement>('.js-expandableTable');\nif (directories) {\n  const table = new ExpandableRowsTableController(\n    directories,\n    document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n  );\n  // Expand directories on page load with expand-directories query param.\n  if (window.location.search.includes('expand-directories')) {\n    table.expandAllItems();\n  }\n}\n\nconst treeEl = document.querySelector<HTMLElement>('.js-tree');\nif (treeEl) {\n  const treeCtrl = new TreeNavController(treeEl);\n  const select = makeSelectNav(treeCtrl);\n  const mobileNav = document.querySelector('.js-mainNavMobile');\n  if (mobileNav && mobileNav.firstElementChild) {\n    mobileNav?.replaceChild(select, mobileNav.firstElementChild);\n  }\n  if (select.firstElementChild) {\n    new SelectNavController(select.firstElementChild);\n  }\n}\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (window.location.hash.includes('readme')) {\n    readme.classList.add('UnitReadme--expanded');\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      readme.classList.add('UnitReadme--expanded');\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      readme.classList.add('UnitReadme--expanded');\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  readmeContent.addEventListener('click', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  readmeOutline.addEventListener('click', () => {\n    readme.classList.add('UnitReadme--expanded');\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      readme.classList.add('UnitReadme--expanded');\n    }\n  });\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfunction openDeprecatedSymbol() {\n  if (!location.hash) return;\n  const heading = document.querySelector(location.hash);\n  const grandParent = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (grandParent?.nodeName === 'DETAILS') {\n    grandParent.open = true;\n  }\n}\nopenDeprecatedSymbol();\nwindow.addEventListener('hashchange', () => openDeprecatedSymbol());\n\n/**\n * Listen for changes in the build context dropdown.\n */\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/frontend/unit/main/main.min.css b/static/frontend/unit/main/main.min.css
new file mode 100644
index 0000000..62dba4f
--- /dev/null
+++ b/static/frontend/unit/main/main.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.UnitBuildContext-titleContext label,.UnitBuildContext-singleContext{color:var(--color-text-subtle);font-size:.875rem}.UnitBuildContext-singleContext{padding:.35rem 0}.UnitBuildContext-titleContext select{border-color:var(--color-border);color:var(--color-text-subtle);margin-left:.25rem;min-width:6rem}.UnitBuildContext-titleContext option{color:var(--color-text-subtle)}.UnitBuildContext-link{display:none}@media only screen and (min-width: 30rem){.UnitBuildContext-link{display:initial}}.UnitDoc .UnitBuildContext-titleContext{position:relative}.UnitDoc .UnitBuildContext-titleContext label,.UnitDoc .UnitBuildContext-singleContext{bottom:.875rem;position:absolute;right:0}.UnitDirectories{margin-bottom:2rem}.UnitDirectories h2 a.UnitDirectories-idLink,.UnitDirectories summary a{opacity:0}.UnitDirectories h2:hover a,.UnitDirectories summary:focus a{opacity:1}.UnitDirectories-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitDirectories-title img{margin:auto 1rem auto 0}.UnitDirectories-table{border-collapse:collapse;height:0;table-layout:auto;width:100%}.UnitDirectories-table--tree{margin-top:-2rem}.UnitDirectories-tableHeader{background-color:var(--color-background-accented)}.UnitDirectories-tableHeader--tree{visibility:hidden}.UnitDirectories td{border-bottom:var(--border);max-width:32rem;min-width:12rem;padding:.25rem 1rem;vertical-align:middle;word-break:break-word}.UnitDirectories th{padding:.5rem 1rem;text-align:left}.UnitDirectories tr.hidden{display:none}.UnitDirectories tr[aria-controls]{cursor:pointer}.UnitDirectories tr[aria-controls]:hover{background-color:var(--color-background-accented)}.UnitDirectories th.UnitDirectories-toggleHead{font-size:0;max-width:.625rem;padding:0;width:.625rem}.UnitDirectories td.UnitDirectories-toggleCell,th.UnitDirectories-toggleCell{background-color:var(--background);border:var(--white);max-width:.625rem;padding:0;width:.625rem}.UnitDirectories-toggleButton{font-size:1.25rem;left:-.75rem;margin:0 0 -1rem -.875rem;padding:0;position:absolute;vertical-align:top}.UnitDirectories-subSpacer{border-right:var(--border);display:inline;margin-right:.875rem;width:.0625rem}.UnitDirectories-toggleButton[aria-expanded=true] img{transform:rotate(90deg)}.UnitDirectories-pathCell{align-items:flex-start;display:flex;flex-direction:column;line-height:1.75rem;word-break:break-all}.UnitDirectories-pathCell>div{position:relative}.UnitDirectories-subdirectory{border-left:var(--border);display:flex;flex-direction:column;margin-left:.375rem;padding:.5rem 1rem}.UnitDirectories-mobileSynopsis{display:none;line-height:1.25rem;margin-top:.25rem;word-break:keep-all}@media only screen and (max-width: 52rem){.UnitDirectories-mobileSynopsis{display:initial}.UnitDirectories-table th.UnitDirectories-desktopSynopsis,.UnitDirectories-table td.UnitDirectories-desktopSynopsis{display:none}}.UnitDirectories-expandButton{position:relative}.UnitDirectories-expandButton button{background-color:transparent;border:none;bottom:1rem;color:var(--color-brand-primary);cursor:pointer;display:none;font-size:.875rem;position:absolute;right:0;text-decoration:none}.UnitDirectories-badge{border:.0625rem solid var(--color-text-subtle);border-radius:.125rem;font-size:.6875rem;font-weight:500;line-height:1rem;margin-left:.5rem;margin-top:.125rem;padding:0 .35rem;text-align:center}.UnitDoc{margin-bottom:2rem;word-break:break-word}.UnitDoc h2 a.UnitDoc-idLink,.UnitDoc summary a{opacity:0}.UnitDoc h2:hover a,.UnitDoc summary:focus a{opacity:1}.UnitDoc-title{border-bottom:var(--border);padding-bottom:1rem}.UnitDoc-title img{margin:auto 1rem auto 0}.UnitDoc-emptySection{background-color:var(--color-background-accented);color:var(--gray-2);height:12.25rem;margin-top:1.5rem;text-align:center}.UnitDoc-emptySection img{height:7.8125rem;width:auto}.UnitDoc .Documentation h4{margin-top:1.5rem}.Documentation{display:block}.Documentation p{margin:1rem 0}.Documentation h2,.Documentation h3{margin-top:1.5rem}.Documentation a{text-decoration:none}.Documentation a:hover{text-decoration:underline}.Documentation h2 a,.Documentation h3 a,.Documentation h4 a.Documentation-idLink,.Documentation summary a{opacity:0}.Documentation a:focus{opacity:1}.Documentation h3 a.Documentation-source{opacity:1}.Documentation h2:hover a,.Documentation h3:hover a,.Documentation h4:hover a,.Documentation summary:hover a,.Documentation summary:focus a{opacity:1}.Documentation ul{line-height:1.5rem;list-style:none;padding-left:0}.Documentation ul ul{padding-left:2em}.Documentation pre+pre{margin-top:.625rem}.Documentation .Documentation-declarationLink+pre{border-radius:0 0 .3em .3em;border-top:var(--border);margin-top:0}.Documentation pre .comment{color:var(--color-code-comment)}.Documentation-toc,.Documentation-overview,.Documentation-index,.Documentation-examples{padding-bottom:0}.Documentation-empty{color:var(--color-text-subtle);margin-top:-.5rem}@media only screen and (min-width: 64rem){.Documentation-toc{margin-left:2rem;white-space:nowrap}.Documentation-toc-columns{columns:2}}.Documentation-toc:empty{display:none}.Documentation-tocItem{overflow:hidden;text-overflow:ellipsis}.Documentation-tocItem--constants,.Documentation-tocItem--funcsAndTypes,.Documentation-tocItem--functions,.Documentation-tocItem--types,.Documentation-tocItem--variables,.Documentation-tocItem--notes{display:none}.Documentation-overviewHeader,.Documentation-indexHeader,.Documentation-constantsHeader,.Documentation-variablesHeader,.Documentation-examplesHeader,.Documentation-filesHeader,.Documentation-functionHeader,.Documentation-typeHeader,.Documentation-typeMethodHeader,.Documentation-typeFuncHeader{margin-bottom:.5rem}.Documentation-function h4,.Documentation-type h4,.Documentation-typeFunc h4,.Documentation-typeMethod h4{align-items:baseline;display:flex;justify-content:space-between}.Documentation-sinceVersion{color:var(--color-text-subtle);font-size:.9375rem;font-weight:400}.Documentation-constants br:last-of-type,.Documentation-variables br:last-of-type{display:none}.Documentation-build{color:var(--color-text-subtle);padding-top:1.5rem;text-align:right}.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem)}@media only screen and (min-width: 64rem){.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + .75rem)}}.Documentation-declaration+.Documentation-declaration{margin-top:.625rem}.Documentation-declarationLink{background-color:var(--color-background-accented);border:var(--border);border-bottom:none;border-radius:.3em .3em 0 0;display:block;font-size:.75rem;line-height:.5rem;padding:.375rem;text-align:right}.Documentation-exampleButtonsContainer{align-items:center;display:flex;justify-content:flex-end;margin-top:.5rem}.Documentation-examplePlayButton{background-color:var(--white);border:.15rem solid var(--turq-med);color:var(--turq-med);cursor:pointer;flex-shrink:0;height:2.5rem;width:4.125rem}.Documentation-exampleRunButton,.Documentation-exampleShareButton,.Documentation-exampleFormatButton{border:.0625rem solid var(--turq-dark);border-radius:.25rem;cursor:pointer;height:2rem;margin-left:.5rem;padding:0 1rem}.Documentation-exampleRunButton{background-color:var(--turq-dark);color:var(--white)}.Documentation-exampleShareButton,.Documentation-exampleFormatButton{background-color:var(--white);color:var(--turq-dark)}.Documentation-exampleDetails{margin-top:1rem}.Documentation-exampleDetailsBody pre{border-radius:0 0 .3rem .3rem;margin-bottom:1rem;margin-top:-.25rem}.Documentation-exampleDetailsBody textarea{height:100%;outline:none;overflow-x:auto;resize:none;white-space:pre;width:100%}.Documentation-exampleDetailsBody .Documentation-exampleCode{border-bottom-left-radius:0;border-bottom-right-radius:0;margin:0}.Documentation-exampleDetailsBody .Documentation-exampleOutput{border-top-left-radius:0;border-top-right-radius:0;margin:0 0 .5rem}.Documentation-exampleDetailsHeader{color:var(--color-brand-primary);cursor:pointer;margin-bottom:2rem;outline:none;text-decoration:none}.Documentation-exampleOutputLabel{color:var(--color-text-subtle)}.Documentation-exampleError{color:var(--pink);margin-right:.4rem;padding-right:.5rem}.Documentation-function pre,.Documentation-typeFunc pre,.Documentation-typeMethod pre{white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.Documentation-indexDeprecated{margin-left:.5rem}.Documentation-deprecatedBody{color:var(--color-text-subtle);font-size:.87rem;font-weight:400;margin-left:.25rem;margin-right:.5rem}.Documentation-deprecatedTag{background-color:var(--color-border);border-radius:.125rem;color:var(--color-text-inverted);font-size:.75rem;font-weight:normal;line-height:1.375;padding:.125rem .25rem;text-transform:uppercase;vertical-align:middle}.Documentation-deprecatedTitle{align-items:center;display:flex;gap:.5rem}.Documentation-deprecatedDetails{color:var(--color-text-subtle)}.Documentation-deprecatedDetails a{color:var(--color-text-subtle)}.Documentation-deprecatedDetails[open]{color:var(--color-text)}.Documentation-deprecatedDetails[open] a{color:var(--color-brand-primary)}.Documentation-deprecatedDetails .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Show"}.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Hide"}.Documentation-deprecatedDetails>summary{list-style:none;opacity:1}.Documentation-deprecatedDetails .Documentation-source{opacity:1}.Documentation-deprecatedItemBody{padding:1rem 1rem .5rem}.Documentation-deprecatedMessage{align-items:center;display:flex;gap:.5rem;margin-bottom:1rem}.UnitFiles{margin-bottom:2rem}.UnitFiles-titleLink{position:relative}.UnitFiles-titleLink a{bottom:1rem;font-size:.875rem;position:absolute;right:0}.UnitFiles-titleLink a:after{background-image:url(/static/shared/icon/launch_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:.875rem 1.25rem;content:"";display:inline-block;height:1rem;left:.3125rem;position:relative;top:.125rem;width:1rem}.UnitFiles h2 a.UnitFiles-idLink,.UnitFiles summary a{opacity:0}.UnitFiles h2:hover a,.UnitFiles summary:focus a{opacity:1}.UnitFiles-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitFiles-title img{margin:auto 1rem auto 0}.UnitFiles-fileList{column-count:5;column-width:12.5rem;line-height:1.5rem;list-style:none;margin-top:1rem;padding-left:0;word-break:break-all}.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.JumpDialog-body{height:12rem;overflow-y:auto}.JumpDialog-list{display:flex;flex-direction:column}.JumpDialog-input{width:100%}.JumpDialog a{padding:.25rem;text-decoration:none}.JumpDialog .JumpDialog-active{background-color:var(--color-brand-primary);color:var(--white)}.ShortcutsDialog-key{text-align:right}.ShortcutsDialog table{padding:0 1rem}.ShortcutsDialog td{padding-bottom:.5rem;padding-left:.5rem}.ShortcutsDialog-theme span{display:none}[data-theme=light] .ShortcutsDialog-themeLight{display:initial}[data-theme=dark] .ShortcutsDialog-themeDark{display:initial}[data-theme=""] .ShortcutsDialog-themeAuto,[data-theme=auto] .ShortcutsDialog-themeAuto{display:initial}.UnitOutline-jumpTo{display:flex;margin-bottom:1rem}.UnitOutline-jumpTo button{background-color:var(--color-background);border:var(--border);border-radius:.25rem;color:var(--color-text-subtle);cursor:pointer;height:2rem;padding-left:1rem;text-align:left;width:100%}.UnitOutline-jumpTo button:hover:not([disabled]){border-color:var(--color-border)}.UnitOutline-jumpTo:after{align-self:center;background-color:var(--color-background-accented);border-radius:.5rem;color:var(--gray-6);content:"f";content:"f" / "find";font-size:.75rem;padding:.0625rem 0;position:absolute;right:.75rem;text-align:center;width:1.5rem}.UnitOutline-jumpToInput:disabled{background-color:var(--gray-9)}.Overview-readmeContent details{display:block}.Overview-readmeContent summary{display:list-item}.Overview-readmeContent a{background-color:initial}.Overview-readmeContent a:active,.Overview-readmeContent a:hover{outline-width:0}.Overview-readmeContent strong{font-weight:inherit;font-weight:bolder}.Overview-readmeContent h3{font-size:2em;margin:.67em 0}.Overview-readmeContent img{border-style:none}.Overview-readmeContent code,.Overview-readmeContent kbd,.Overview-readmeContent pre{font-family:monospace,monospace;font-size:1em}.Overview-readmeContent hr{box-sizing:initial;height:0;overflow:visible}.Overview-readmeContent input{font:inherit;margin:0}.Overview-readmeContent input{overflow:visible}.Overview-readmeContent [type=checkbox]{box-sizing:border-box;padding:0}.Overview-readmeContent *{box-sizing:border-box}.Overview-readmeContent input{font-family:inherit;font-size:inherit;line-height:inherit}.Overview-readmeContent a{color:var(--color-brand-primary);text-decoration:none}.Overview-readmeContent a:hover{text-decoration:underline}.Overview-readmeContent strong{font-weight:600}.Overview-readmeContent hr{height:0;margin:.9375rem 0;overflow:hidden;background:transparent;border:0;border-bottom:var(--border)}.Overview-readmeContent hr:after,.Overview-readmeContent hr:before{display:table;content:""}.Overview-readmeContent hr:after{clear:both}.Overview-readmeContent table{border-spacing:0;border-collapse:collapse}.Overview-readmeContent td,.Overview-readmeContent th{padding:0}.Overview-readmeContent details summary{cursor:pointer}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--border)}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:0;margin-bottom:0}.Overview-readmeContent h3{font-size:2rem}.Overview-readmeContent h3,.Overview-readmeContent h4{font-weight:600}.Overview-readmeContent h4{font-size:1.5rem}.Overview-readmeContent h5{font-size:1.25rem}.Overview-readmeContent h5,.Overview-readmeContent h6{font-weight:600}.Overview-readmeContent h6{font-size:1rem}.Overview-readmeContent div[aria-level="7"]{font-size:.875rem}.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{font-weight:600}.Overview-readmeContent div[aria-level="8"]{font-size:.75rem}.Overview-readmeContent p{margin-top:0;margin-bottom:.625rem}.Overview-readmeContent blockquote{margin:0}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:0;margin-top:0;margin-bottom:0}.Overview-readmeContent ol ol,.Overview-readmeContent ul ol{list-style-type:lower-roman}.Overview-readmeContent ol ol ol,.Overview-readmeContent ol ul ol,.Overview-readmeContent ul ol ol,.Overview-readmeContent ul ul ol{list-style-type:lower-alpha}.Overview-readmeContent dd{margin-left:0}.Overview-readmeContent code,.Overview-readmeContent pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75rem}.Overview-readmeContent pre{margin-top:0;margin-bottom:0}.Overview-readmeContent input::-webkit-inner-spin-button,.Overview-readmeContent input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.Overview-readmeContent :checked+.radio-label{position:relative;z-index:1;border-color:var(--color-brand-primary)}.Overview-readmeContent hr{border-bottom-color:var(--color-border)}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--color-border)}.Overview-readmeContent a:not([href]){color:inherit;text-decoration:none}.Overview-readmeContent blockquote,.Overview-readmeContent details,.Overview-readmeContent dl,.Overview-readmeContent ol,.Overview-readmeContent p,.Overview-readmeContent pre,.Overview-readmeContent table,.Overview-readmeContent ul{margin-top:0;margin-bottom:1rem}.Overview-readmeContent hr{height:.25em;padding:0;margin:1.5rem 0;background-color:var(--color-border);border:0}.Overview-readmeContent blockquote{padding:0 1em;color:var(--color-text-subtle);border-left:.25em solid var(--color-border)}.Overview-readmeContent blockquote>:first-child{margin-top:0}.Overview-readmeContent blockquote>:last-child{margin-bottom:0}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:1.5rem;margin-bottom:1rem;font-weight:600;line-height:1.25}.Overview-readmeContent h3{font-size:2em}.Overview-readmeContent h3,.Overview-readmeContent h4{padding-bottom:.3em;border-bottom:var(--border)}.Overview-readmeContent h4{font-size:1.5em}.Overview-readmeContent h5{font-size:1.25em}.Overview-readmeContent h6{font-size:1em}.Overview-readmeContent div[aria-level="7"]{font-size:.875em}.Overview-readmeContent div[aria-level="8"]{font-size:.85em;color:var(--color-text-subtle)}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:2em}.Overview-readmeContent ol ol,.Overview-readmeContent ol ul,.Overview-readmeContent ul ol,.Overview-readmeContent ul ul{margin-top:0;margin-bottom:0}.Overview-readmeContent li{word-wrap:break-all}.Overview-readmeContent li>p{margin-top:1rem}.Overview-readmeContent li+li{margin-top:.25em}.Overview-readmeContent dl{padding:0}.Overview-readmeContent dl dt{padding:0;margin-top:1rem;font-size:1em;font-style:italic;font-weight:600}.Overview-readmeContent dl dd{padding:0 1rem;margin-bottom:1rem}.Overview-readmeContent table{display:block;width:100%;overflow:auto}.Overview-readmeContent table th{font-weight:600}.Overview-readmeContent table td,.Overview-readmeContent table th{padding:.375rem .8125rem;border:var(--border)}.Overview-readmeContent table tr{background-color:var(--color-background);border-top:var(--border)}.Overview-readmeContent table tr:nth-child(2n){background-color:var(--color-background-accented)}.Overview-readmeContent img{max-width:100%;box-sizing:initial;background-color:var(--color-background)}.Overview-readmeContent img[align=right]{padding-left:1.25rem}.Overview-readmeContent img[align=left]{padding-right:1.25rem}.Overview-readmeContent code{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre{word-wrap:normal}.Overview-readmeContent pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.Overview-readmeContent pre{padding:1rem;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}.UnitReadme{margin-bottom:2rem}.UnitReadme ul,.UnitReadme ol{list-style:circle}.UnitReadme h2 a.UnitReadme-idLink,.UnitReadme summary a{opacity:0}.UnitReadme h2:hover a,.UnitReadme summary:focus a{opacity:1}.UnitReadme-title{border-bottom:var(--border);font-size:1.375rem;padding-bottom:1rem}.UnitReadme-title img{margin:auto 1rem auto 0}.UnitReadme-content{-webkit-mask-image:linear-gradient(to bottom,black 75%,transparent 100%);mask-image:linear-gradient(to bottom,black 75%,transparent 100%);max-height:20rem;overflow:hidden;position:relative}.UnitReadme-content ul{line-height:1.5rem}.UnitReadme-expandLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;padding:0}.UnitReadme-collapseLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;padding:0}.UnitReadme--expanded .UnitReadme-content{-webkit-mask-image:none;mask-image:none;max-height:initial;overflow:initial}.UnitReadme--expanded .UnitReadme-expandLink{display:none}.UnitReadme--expanded .UnitReadme-collapseLink{display:block}.Overview-readmeContent{overflow-wrap:break-word}.UnitDetails{column-gap:2rem;display:grid;grid-template-columns:minmax(0,auto);margin:auto;min-height:32rem}@media only screen and (min-width: 64rem){.UnitDetails{grid-template-columns:15.5rem minmax(30.5rem,43.125rem) minmax(10rem,15.5rem)}}@media only screen and (min-width: 80rem){.UnitDetails{grid-template-columns:15.5rem minmax(43.125rem,60rem) 15.5rem;justify-content:center}}.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 2.15)}@media only screen and (min-width: 64rem){.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 1.25)}}.UnitDetails :target:not(details,h2){background-color:var(--color-background-highlighted);padding:.25rem}.UnitDetails-meta{order:-1}@media only screen and (min-width: 64rem){.UnitDetails-meta{display:block;margin-top:2rem;order:initial}}.UnitDetails-contentEmpty{align-items:center;background-color:var(--color-background-accented);color:var(--color-text-subtle);display:flex;flex-direction:column;height:15rem;padding-top:1rem;text-align:center}.UnitDetails-contentEmpty img{height:7.8125rem;width:auto}
+/*# sourceMappingURL=main.min.css.map */
diff --git a/static/frontend/unit/main/main.min.css.map b/static/frontend/unit/main/main.min.css.map
new file mode 100644
index 0000000..c4c0914
--- /dev/null
+++ b/static/frontend/unit/main/main.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["_build-context.css", "_directories.css", "_doc.css", "_files.css", "_meta.css", "_modals.css", "_outline.css", "_readme_gen.css", "_readme.css", "main.css"],
+  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitBuildContext-titleContext label,\n.UnitBuildContext-singleContext {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n}\n.UnitBuildContext-singleContext {\n  padding: 0.35rem 0;\n}\n.UnitBuildContext-titleContext select {\n  border-color: var(--color-border);\n  color: var(--color-text-subtle);\n  margin-left: 0.25rem;\n  min-width: 6rem;\n}\n.UnitBuildContext-titleContext option {\n  color: var(--color-text-subtle);\n}\n.UnitBuildContext-link {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .UnitBuildContext-link {\n    display: initial;\n  }\n}\n\n.UnitDoc .UnitBuildContext-titleContext {\n  position: relative;\n}\n.UnitDoc .UnitBuildContext-titleContext label,\n.UnitDoc .UnitBuildContext-singleContext {\n  bottom: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitDirectories {\n  margin-bottom: 2rem;\n}\n.UnitDirectories h2 a.UnitDirectories-idLink,\n.UnitDirectories summary a {\n  opacity: 0;\n}\n.UnitDirectories h2:hover a,\n.UnitDirectories summary:focus a {\n  opacity: 1;\n}\n.UnitDirectories-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitDirectories-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDirectories-table {\n  border-collapse: collapse;\n  height: 0;\n  table-layout: auto;\n  width: 100%;\n}\n.UnitDirectories-table--tree {\n  margin-top: -2rem;\n}\n.UnitDirectories-tableHeader {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories-tableHeader--tree {\n  visibility: hidden;\n}\n.UnitDirectories td {\n  border-bottom: var(--border);\n  max-width: 32rem;\n  min-width: 12rem;\n  padding: 0.25rem 1rem;\n  vertical-align: middle;\n  word-break: break-word;\n}\n.UnitDirectories th {\n  padding: 0.5rem 1rem;\n  text-align: left;\n}\n.UnitDirectories tr.hidden {\n  display: none;\n}\n.UnitDirectories tr[aria-controls] {\n  cursor: pointer;\n}\n.UnitDirectories tr[aria-controls]:hover {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories th.UnitDirectories-toggleHead {\n  font-size: 0;\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories td.UnitDirectories-toggleCell,\nth.UnitDirectories-toggleCell {\n  background-color: var(--background);\n  border: var(--white);\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories-toggleButton {\n  font-size: 1.25rem;\n  left: -0.75rem;\n  margin: 0 0 -1rem -0.875rem;\n  padding: 0;\n  position: absolute;\n  vertical-align: top;\n}\n.UnitDirectories-subSpacer {\n  border-right: var(--border);\n  display: inline;\n  margin-right: 0.875rem;\n  width: 0.0625rem;\n}\n.UnitDirectories-toggleButton[aria-expanded='true'] img {\n  transform: rotate(90deg);\n}\n.UnitDirectories-pathCell {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  line-height: 1.75rem;\n  word-break: break-all;\n}\n.UnitDirectories-pathCell > div {\n  position: relative;\n}\n.UnitDirectories-subdirectory {\n  border-left: var(--border);\n  display: flex;\n  flex-direction: column;\n  margin-left: 0.375rem;\n  padding: 0.5rem 1rem;\n}\n.UnitDirectories-mobileSynopsis {\n  display: none;\n  line-height: 1.25rem;\n  margin-top: 0.25rem;\n  word-break: keep-all;\n}\n@media only screen and (max-width: 52rem) {\n  .UnitDirectories-mobileSynopsis {\n    display: initial;\n  }\n  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,\n  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {\n    display: none;\n  }\n}\n.UnitDirectories-expandButton {\n  position: relative;\n}\n.UnitDirectories-expandButton button {\n  background-color: transparent;\n  border: none;\n  bottom: 1rem;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n  text-decoration: none;\n}\n.UnitDirectories-badge {\n  border: 0.0625rem solid var(--color-text-subtle);\n  border-radius: 0.125rem;\n  font-size: 0.6875rem;\n  font-weight: 500;\n  line-height: 1rem;\n  margin-left: 0.5rem;\n  margin-top: 0.125rem;\n  padding: 0 0.35rem;\n  text-align: center;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* stylelint-disable no-descending-specificity */\n.UnitDoc {\n  margin-bottom: 2rem;\n  word-break: break-word;\n}\n.UnitDoc h2 a.UnitDoc-idLink,\n.UnitDoc summary a {\n  opacity: 0;\n}\n.UnitDoc h2:hover a,\n.UnitDoc summary:focus a {\n  opacity: 1;\n}\n.UnitDoc-title {\n  border-bottom: var(--border);\n  padding-bottom: 1rem;\n}\n.UnitDoc-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDoc-emptySection {\n  background-color: var(--color-background-accented);\n  color: var(--gray-2);\n  height: 12.25rem;\n  margin-top: 1.5rem;\n  text-align: center;\n}\n.UnitDoc-emptySection img {\n  height: 7.8125rem;\n  width: auto;\n}\n.UnitDoc .Documentation h4 {\n  margin-top: 1.5rem;\n}\n.Documentation {\n  display: block;\n}\n.Documentation p {\n  margin: 1rem 0;\n}\n.Documentation h2,\n.Documentation h3 {\n  margin-top: 1.5rem;\n}\n.Documentation a {\n  text-decoration: none;\n}\n.Documentation a:hover {\n  text-decoration: underline;\n}\n.Documentation h2 a,\n.Documentation h3 a,\n.Documentation h4 a.Documentation-idLink,\n.Documentation summary a {\n  opacity: 0;\n}\n.Documentation a:focus {\n  opacity: 1;\n}\n.Documentation h3 a.Documentation-source {\n  opacity: 1;\n}\n.Documentation h2:hover a,\n.Documentation h3:hover a,\n.Documentation h4:hover a,\n.Documentation summary:hover a,\n.Documentation summary:focus a {\n  opacity: 1;\n}\n.Documentation ul {\n  line-height: 1.5rem;\n  list-style: none;\n  padding-left: 0;\n}\n.Documentation ul ul {\n  padding-left: 2em;\n}\n\n.Documentation pre + pre {\n  margin-top: 0.625rem;\n}\n\n.Documentation .Documentation-declarationLink + pre {\n  border-radius: 0 0 0.3em 0.3em;\n  border-top: var(--border);\n  margin-top: 0;\n}\n.Documentation pre .comment {\n  color: var(--color-code-comment);\n}\n\n.Documentation-toc,\n.Documentation-overview,\n.Documentation-index,\n.Documentation-examples {\n  padding-bottom: 0;\n}\n.Documentation-empty {\n  color: var(--color-text-subtle);\n  margin-top: -0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-toc {\n    margin-left: 2rem;\n    white-space: nowrap;\n  }\n  .Documentation-toc-columns {\n    columns: 2;\n  }\n}\n.Documentation-toc:empty {\n  display: none;\n}\n.Documentation-tocItem {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.Documentation-tocItem--constants,\n.Documentation-tocItem--funcsAndTypes,\n.Documentation-tocItem--functions,\n.Documentation-tocItem--types,\n.Documentation-tocItem--variables,\n.Documentation-tocItem--notes {\n  display: none;\n}\n\n.Documentation-overviewHeader,\n.Documentation-indexHeader,\n.Documentation-constantsHeader,\n.Documentation-variablesHeader,\n.Documentation-examplesHeader,\n.Documentation-filesHeader,\n.Documentation-functionHeader,\n.Documentation-typeHeader,\n.Documentation-typeMethodHeader,\n.Documentation-typeFuncHeader {\n  margin-bottom: 0.5rem;\n}\n\n.Documentation-function h4,\n.Documentation-type h4,\n.Documentation-typeFunc h4,\n.Documentation-typeMethod h4 {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n.Documentation-sinceVersion {\n  color: var(--color-text-subtle);\n  font-size: 0.9375rem;\n  font-weight: 400;\n}\n\n.Documentation-constants br:last-of-type,\n.Documentation-variables br:last-of-type {\n  display: none;\n}\n\n.Documentation-build {\n  color: var(--color-text-subtle);\n  padding-top: 1.5rem;\n  text-align: right;\n}\n.Documentation-declaration pre {\n  scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem);\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-declaration pre {\n    scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 0.75rem);\n  }\n}\n.Documentation-declaration + .Documentation-declaration {\n  margin-top: 0.625rem;\n}\n.Documentation-declarationLink {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-bottom: none;\n  border-radius: 0.3em 0.3em 0 0;\n  display: block;\n  font-size: 0.75rem;\n  line-height: 0.5rem;\n  padding: 0.375rem;\n  text-align: right;\n}\n.Documentation-exampleButtonsContainer {\n  align-items: center;\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 0.5rem;\n}\n.Documentation-examplePlayButton {\n  background-color: var(--white);\n  border: 0.15rem solid var(--turq-med);\n  color: var(--turq-med);\n  cursor: pointer;\n  flex-shrink: 0;\n  height: 2.5rem;\n  width: 4.125rem;\n}\n.Documentation-exampleRunButton,\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  border: 0.0625rem solid var(--turq-dark);\n  border-radius: 0.25rem;\n  cursor: pointer;\n  height: 2rem;\n  margin-left: 0.5rem;\n  padding: 0 1rem;\n}\n.Documentation-exampleRunButton {\n  background-color: var(--turq-dark);\n  color: var(--white);\n}\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  background-color: var(--white);\n  color: var(--turq-dark);\n}\n.Documentation-exampleDetails {\n  margin-top: 1rem;\n}\n.Documentation-exampleDetailsBody pre {\n  border-radius: 0 0 0.3rem 0.3rem;\n  margin-bottom: 1rem;\n  margin-top: -0.25rem;\n}\n.Documentation-exampleDetailsBody textarea {\n  height: 100%;\n  outline: none;\n  overflow-x: auto;\n  resize: none;\n  white-space: pre;\n  width: 100%;\n}\n\n/**\n * We add another selector here to these two classes to increase CSS specificity,\n * the selector .Documentation pre + pre overrides .Documentation-exampleCode\n * and .Documentation-exampleOutput by itself and would replace the styles.\n */\n.Documentation-exampleDetailsBody .Documentation-exampleCode {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  margin: 0;\n}\n.Documentation-exampleDetailsBody .Documentation-exampleOutput {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  margin: 0 0 0.5rem;\n}\n.Documentation-exampleDetailsHeader {\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  margin-bottom: 2rem;\n  outline: none;\n  text-decoration: none;\n}\n.Documentation-exampleOutputLabel {\n  color: var(--color-text-subtle);\n}\n.Documentation-exampleError {\n  color: var(--pink);\n  margin-right: 0.4rem;\n  padding-right: 0.5rem;\n}\n\n/* See https://golang.org/issue/43368 for context. */\n.Documentation-function pre,\n.Documentation-typeFunc pre,\n.Documentation-typeMethod pre {\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n}\n\n.Documentation-indexDeprecated {\n  margin-left: 0.5rem;\n}\n.Documentation-deprecatedBody {\n  color: var(--color-text-subtle);\n  font-size: 0.87rem;\n  font-weight: 400;\n  margin-left: 0.25rem;\n  margin-right: 0.5rem;\n}\n.Documentation-deprecatedTag {\n  background-color: var(--color-border);\n  border-radius: 0.125rem;\n  color: var(--color-text-inverted);\n  font-size: 0.75rem;\n  font-weight: normal;\n  line-height: 1.375;\n  padding: 0.125rem 0.25rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n}\n.Documentation-deprecatedTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n}\n.Documentation-deprecatedDetails {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails a {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails[open] {\n  color: var(--color-text);\n}\n.Documentation-deprecatedDetails[open] a {\n  color: var(--color-brand-primary);\n}\n.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Show';\n}\n.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Hide';\n}\n.Documentation-deprecatedDetails > summary {\n  list-style: none;\n  opacity: 1;\n}\n.Documentation-deprecatedDetails .Documentation-source {\n  opacity: 1;\n}\n.Documentation-deprecatedItemBody {\n  padding: 1rem 1rem 0.5rem 1rem;\n}\n.Documentation-deprecatedMessage {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  margin-bottom: 1rem;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitFiles {\n  margin-bottom: 2rem;\n}\n.UnitFiles-titleLink {\n  position: relative;\n}\n.UnitFiles-titleLink a {\n  bottom: 1rem;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n.UnitFiles-titleLink a::after {\n  background-image: url(/static/shared/icon/launch_gm_grey_24dp.svg);\n  background-repeat: no-repeat;\n  background-size: 0.875rem 1.25rem;\n  content: '';\n  display: inline-block;\n  height: 1rem;\n  left: 0.3125rem;\n  position: relative;\n  top: 0.125rem;\n  width: 1rem;\n}\n.UnitFiles h2 a.UnitFiles-idLink,\n.UnitFiles summary a {\n  opacity: 0;\n}\n.UnitFiles h2:hover a,\n.UnitFiles summary:focus a {\n  opacity: 1;\n}\n.UnitFiles-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitFiles-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitFiles-fileList {\n  column-count: 5;\n  column-width: 12.5rem;\n  line-height: 1.5rem;\n  list-style: none;\n  margin-top: 1rem;\n  padding-left: 0;\n  word-break: break-all;\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n}\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n* Copyright 2021 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.JumpDialog-body {\n  height: 12rem;\n  overflow-y: auto;\n}\n.JumpDialog-list {\n  display: flex;\n  flex-direction: column;\n}\n.JumpDialog-input {\n  width: 100%;\n}\n.JumpDialog a {\n  padding: 0.25rem;\n  text-decoration: none;\n}\n.JumpDialog .JumpDialog-active {\n  background-color: var(--color-brand-primary);\n  color: var(--white);\n}\n\n.ShortcutsDialog-key {\n  text-align: right;\n}\n.ShortcutsDialog table {\n  padding: 0 1rem;\n}\n\n.ShortcutsDialog td {\n  padding-bottom: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.ShortcutsDialog-theme span {\n  display: none;\n}\n[data-theme='light'] .ShortcutsDialog-themeLight {\n  display: initial;\n}\n[data-theme='dark'] .ShortcutsDialog-themeDark {\n  display: initial;\n}\n[data-theme=''] .ShortcutsDialog-themeAuto,\n[data-theme='auto'] .ShortcutsDialog-themeAuto {\n  display: initial;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitOutline-jumpTo {\n  display: flex;\n  margin-bottom: 1rem;\n}\n.UnitOutline-jumpTo button {\n  background-color: var(--color-background);\n  border: var(--border);\n  border-radius: 0.25rem;\n  color: var(--color-text-subtle);\n  cursor: pointer;\n  height: 2rem;\n  padding-left: 1rem;\n  text-align: left;\n  width: 100%;\n}\n.UnitOutline-jumpTo button:hover:not([disabled]) {\n  border-color: var(--color-border);\n}\n.UnitOutline-jumpTo::after {\n  align-self: center;\n  background-color: var(--color-background-accented);\n  border-radius: 0.5rem;\n  color: var(--gray-6);\n  content: 'f';\n  content: 'f' / 'find';\n  font-size: 0.75rem;\n  padding: 0.0625rem 0;\n  position: absolute;\n  right: 0.75rem;\n  text-align: center;\n  width: 1.5rem;\n}\n.UnitOutline-jumpToInput:disabled {\n  background-color: var(--gray-9);\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n/* ---------- */\n/*\n/* The CSS classes below are generated using devtools/cmd/css/main.go\n/* If the generated CSS already exists, the file is overwritten\n/*\n/* ---------- */\n\n.Overview-readmeContent details {\n  display: block;\n}\n.Overview-readmeContent summary {\n  display: list-item;\n}\n.Overview-readmeContent a {\n  background-color: initial;\n}\n.Overview-readmeContent a:active,\n.Overview-readmeContent a:hover {\n  outline-width: 0;\n}\n.Overview-readmeContent strong {\n  font-weight: inherit;\n  font-weight: bolder;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.Overview-readmeContent img {\n  border-style: none;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent kbd,\n.Overview-readmeContent pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n.Overview-readmeContent hr {\n  box-sizing: initial;\n  height: 0;\n  overflow: visible;\n}\n.Overview-readmeContent input {\n  font: inherit;\n  margin: 0;\n}\n.Overview-readmeContent input {\n  overflow: visible;\n}\n.Overview-readmeContent [type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.Overview-readmeContent * {\n  box-sizing: border-box;\n}\n.Overview-readmeContent input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.Overview-readmeContent a {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\n.Overview-readmeContent a:hover {\n  text-decoration: underline;\n}\n.Overview-readmeContent strong {\n  font-weight: 600;\n}\n.Overview-readmeContent hr {\n  height: 0;\n  margin: 0.9375rem 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent hr:after,\n.Overview-readmeContent hr:before {\n  display: table;\n  content: '';\n}\n.Overview-readmeContent hr:after {\n  clear: both;\n}\n.Overview-readmeContent table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n.Overview-readmeContent td,\n.Overview-readmeContent th {\n  padding: 0;\n}\n.Overview-readmeContent details summary {\n  cursor: pointer;\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--border);\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3 {\n  font-size: 2rem;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  font-weight: 600;\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5rem;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25rem;\n}\n.Overview-readmeContent h5,\n.Overview-readmeContent h6 {\n  font-weight: 600;\n}\n.Overview-readmeContent h6 {\n  font-size: 1rem;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875rem;\n}\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  font-weight: 600;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.75rem;\n}\n.Overview-readmeContent p {\n  margin-top: 0;\n  margin-bottom: 0.625rem;\n}\n.Overview-readmeContent blockquote {\n  margin: 0;\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ul ol {\n  list-style-type: lower-roman;\n}\n.Overview-readmeContent ol ol ol,\n.Overview-readmeContent ol ul ol,\n.Overview-readmeContent ul ol ol,\n.Overview-readmeContent ul ul ol {\n  list-style-type: lower-alpha;\n}\n.Overview-readmeContent dd {\n  margin-left: 0;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent pre {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.75rem;\n}\n.Overview-readmeContent pre {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent input::-webkit-inner-spin-button,\n.Overview-readmeContent input::-webkit-outer-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n.Overview-readmeContent :checked + .radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: var(--color-brand-primary);\n}\n.Overview-readmeContent hr {\n  border-bottom-color: var(--color-border);\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--color-border);\n}\n.Overview-readmeContent a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n.Overview-readmeContent blockquote,\n.Overview-readmeContent details,\n.Overview-readmeContent dl,\n.Overview-readmeContent ol,\n.Overview-readmeContent p,\n.Overview-readmeContent pre,\n.Overview-readmeContent table,\n.Overview-readmeContent ul {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 1.5rem 0;\n  background-color: var(--color-border);\n  border: 0;\n}\n.Overview-readmeContent blockquote {\n  padding: 0 1em;\n  color: var(--color-text-subtle);\n  border-left: 0.25em solid var(--color-border);\n}\n.Overview-readmeContent blockquote > :first-child {\n  margin-top: 0;\n}\n.Overview-readmeContent blockquote > :last-child {\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 1.5rem;\n  margin-bottom: 1rem;\n  font-weight: 600;\n  line-height: 1.25;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  padding-bottom: 0.3em;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5em;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25em;\n}\n.Overview-readmeContent h6 {\n  font-size: 1em;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875em;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.85em;\n  color: var(--color-text-subtle);\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 2em;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ol ul,\n.Overview-readmeContent ul ol,\n.Overview-readmeContent ul ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent li {\n  word-wrap: break-all;\n}\n.Overview-readmeContent li > p {\n  margin-top: 1rem;\n}\n.Overview-readmeContent li + li {\n  margin-top: 0.25em;\n}\n.Overview-readmeContent dl {\n  padding: 0;\n}\n.Overview-readmeContent dl dt {\n  padding: 0;\n  margin-top: 1rem;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n.Overview-readmeContent dl dd {\n  padding: 0 1rem;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n.Overview-readmeContent table th {\n  font-weight: 600;\n}\n.Overview-readmeContent table td,\n.Overview-readmeContent table th {\n  padding: 0.375rem 0.8125rem;\n  border: var(--border);\n}\n.Overview-readmeContent table tr {\n  background-color: var(--color-background);\n  border-top: var(--border);\n}\n.Overview-readmeContent table tr:nth-child(2n) {\n  background-color: var(--color-background-accented);\n}\n.Overview-readmeContent img {\n  max-width: 100%;\n  box-sizing: initial;\n  background-color: var(--color-background);\n}\n.Overview-readmeContent img[align='right'] {\n  padding-left: 1.25rem;\n}\n.Overview-readmeContent img[align='left'] {\n  padding-right: 1.25rem;\n}\n.Overview-readmeContent code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre {\n  word-wrap: normal;\n}\n.Overview-readmeContent pre > code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n.Overview-readmeContent pre {\n  padding: 1rem;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: initial;\n  border: 0;\n}\n\n/* ---------- */\n/*\n/* End output from devtools/cmd/css/main.go\n/*\n/* ---------- */\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitReadme {\n  margin-bottom: 2rem;\n}\n.UnitReadme ul,\n.UnitReadme ol {\n  list-style: circle;\n}\n.UnitReadme h2 a.UnitReadme-idLink,\n.UnitReadme summary a {\n  opacity: 0;\n}\n.UnitReadme h2:hover a,\n.UnitReadme summary:focus a {\n  opacity: 1;\n}\n.UnitReadme-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  padding-bottom: 1rem;\n}\n.UnitReadme-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitReadme-content {\n  -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  max-height: 20rem;\n  overflow: hidden;\n  position: relative;\n}\n.UnitReadme-content ul {\n  line-height: 1.5rem;\n}\n.UnitReadme-expandLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  padding: 0;\n}\n.UnitReadme-collapseLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  padding: 0;\n}\n.UnitReadme--expanded .UnitReadme-content {\n  -webkit-mask-image: none;\n  mask-image: none;\n  max-height: initial;\n  overflow: initial;\n}\n.UnitReadme--expanded .UnitReadme-expandLink {\n  display: none;\n}\n.UnitReadme--expanded .UnitReadme-collapseLink {\n  display: block;\n}\n\n.Overview-readmeContent {\n  overflow-wrap: break-word;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_build-context.css');\n@import url('./_directories.css');\n@import url('./_doc.css');\n@import url('./_files.css');\n@import url('./_meta.css');\n@import url('./_modals.css');\n@import url('./_outline.css');\n@import url('./_readme_gen.css');\n@import url('./_readme.css');\n\n.UnitDetails {\n  column-gap: 2rem;\n  display: grid;\n  grid-template-columns: minmax(0, auto);\n  margin: auto;\n  min-height: 32rem;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);\n  }\n}\n@media only screen and (min-width: 80rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;\n    justify-content: center;\n  }\n}\n.UnitDetails :target {\n  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails :target {\n    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);\n  }\n}\n\n.UnitDetails :target:not(details, h2) {\n  background-color: var(--color-background-highlighted);\n  padding: 0.25rem;\n}\n.UnitDetails-meta {\n  order: -1;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails-meta {\n    display: block;\n    margin-top: 2rem;\n    order: initial;\n  }\n}\n.UnitDetails-contentEmpty {\n  align-items: center;\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  height: 15rem;\n  padding-top: 1rem;\n  text-align: center;\n}\n.UnitDetails-contentEmpty img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
+  "mappings": ";;;;;AAMA,qEAEE,+BACA,kBAEF,gCAXA,iBAcA,sCACE,iCACA,+BACA,mBACA,eAEF,sCACE,+BAEF,uBACE,aAEF,0CACE,uBACE,iBAIJ,wCACE,kBAEF,uFAEE,eACA,kBACA,QCjCF,iBACE,mBAEF,wEAEE,UAEF,6DAEE,UAEF,uBACE,4BACA,mBAnBF,iBAqBE,oBAEF,2BAvBA,wBA0BA,uBACE,yBACA,SACA,kBACA,WAEF,6BACE,iBAEF,6BACE,kDAEF,mCACE,kBAEF,oBACE,4BACA,gBACA,gBA5CF,oBA8CE,sBACA,sBAEF,oBAjDA,mBAmDE,gBAEF,2BACE,aAEF,mCACE,eAEF,yCACE,kDAEF,+CACE,YACA,kBAhEF,UAkEE,cAEF,6EAEE,mCACA,oBACA,kBAxEF,UA0EE,cAEF,8BACE,kBACA,aA9EF,oCAiFE,kBACA,mBAEF,2BACE,2BACA,eACA,qBACA,eAEF,sDACE,wBAEF,0BACE,uBACA,aACA,sBACA,oBACA,qBAEF,8BACE,kBAEF,8BACE,0BACA,aACA,sBACA,oBA3GF,mBA8GA,gCACE,aACA,oBACA,kBACA,oBAEF,0CACE,gCACE,gBAEF,oHAEE,cAGJ,8BACE,kBAEF,qCACE,6BACA,YACA,YACA,iCACA,eACA,aACA,kBACA,kBACA,QACA,qBAEF,uBACE,+CA7IF,sBA+IE,mBACA,gBACA,iBACA,kBACA,mBAnJF,iBAqJE,kBC9IF,SACE,mBACA,sBAEF,gDAEE,UAEF,6CAEE,UAEF,eACE,4BACA,oBAEF,mBAvBA,wBA0BA,sBACE,kDACA,oBACA,gBACA,kBACA,kBAEF,0BACE,iBACA,WAEF,2BACE,kBAEF,eACE,cAEF,iBA3CA,cA8CA,oCAEE,kBAEF,iBACE,qBAEF,uBACE,0BAEF,0GAIE,UAEF,uBACE,UAEF,yCACE,UAEF,4IAKE,UAEF,kBACE,mBACA,gBACA,eAEF,qBACE,iBAGF,uBACE,mBAGF,kDAxFA,4BA0FE,yBACA,aAEF,4BACE,gCAGF,wFAIE,iBAEF,qBACE,+BACA,kBAEF,0CACE,mBACE,iBACA,mBAEF,2BACE,WAGJ,yBACE,aAEF,uBACE,gBACA,uBAGF,wMAME,aAGF,sSAUE,oBAGF,0GAIE,qBACA,aACA,8BAEF,4BACE,+BACA,mBACA,gBAGF,kFAEE,aAGF,qBACE,+BACA,mBACA,iBAEF,+BACE,0EAEF,0CACE,+BACE,0EAGJ,sDACE,mBAEF,+BACE,kDACA,qBACA,mBAxLF,4BA0LE,cACA,iBACA,kBA5LF,gBA8LE,iBAEF,uCACE,mBACA,aACA,yBACA,iBAEF,iCACE,8BACA,oCACA,sBACA,eACA,cACA,cACA,eAEF,qGAGE,uCAlNF,qBAoNE,eACA,YACA,kBAtNF,eAyNA,gCACE,kCACA,mBAEF,qEAEE,8BACA,uBAEF,8BACE,gBAEF,sCArOA,8BAuOE,mBACA,mBAEF,2CACE,YACA,aACA,gBACA,YACA,gBACA,WAQF,6DACE,4BACA,6BA1PF,SA6PA,+DACE,yBACA,0BA/PF,iBAkQA,oCACE,iCACA,eACA,mBACA,aACA,qBAEF,kCACE,+BAEF,4BACE,kBACA,mBACA,oBAIF,sFAGE,qBACA,qBACA,qBAGF,+BACE,kBAEF,8BACE,+BACA,iBACA,gBACA,mBACA,mBAEF,6BACE,qCAtSF,sBAwSE,iCACA,iBACA,mBACA,kBA3SF,uBA6SE,yBACA,sBAEF,+BACE,mBACA,aACA,UAEF,iCACE,+BAEF,mCACE,+BAEF,uCACE,wBAEF,yCACE,iCAEF,qEACE,iCACA,eAEF,2EACE,iCACA,eAEF,yCACE,gBACA,UAEF,uDACE,UAEF,kCAhVA,wBAmVA,iCACE,mBACA,aACA,UACA,mBCjVF,WACE,mBAEF,qBACE,kBAEF,uBACE,YACA,kBACA,kBACA,QAEF,6BACE,kEACA,4BACA,gCACA,WACA,qBACA,YACA,cACA,kBACA,YACA,WAEF,sDAEE,UAEF,iDAEE,UAEF,iBACE,4BACA,mBAxCF,iBA0CE,oBAEF,qBA5CA,wBA+CA,oBACE,eACA,qBACA,mBACA,gBACA,gBACA,eACA,qBChDF,UACE,aACA,cACA,uCACA,mBAEF,kCAEE,aACA,eACA,mBACA,cAEF,eACE,mBACA,aAEF,iBACE,gB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",
+  "names": []
+}
diff --git a/static/frontend/unit/main/main.tmpl b/static/frontend/unit/main/main.tmpl
index 00924b7..c0258f3 100644
--- a/static/frontend/unit/main/main.tmpl
+++ b/static/frontend/unit/main/main.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "main-styles"}}
-  <link href="/static/frontend/unit/main/main.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/main/main.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main-banner"}}
diff --git a/static/frontend/unit/unit.js b/static/frontend/unit/unit.js
index f31ceb3..57bb097 100644
--- a/static/frontend/unit/unit.js
+++ b/static/frontend/unit/unit.js
@@ -1,4 +1,4 @@
-(()=>{var r=3.5,h=2.5,o=class{constructor(e,t,d){this.mainHeader=e;this.mainNav=t;this.mainAside=d;this.handleDoubleClick=e=>{e.target===this.mainHeader?.lastElementChild&&(window.getSelection()?.removeAllRanges(),window.scrollTo({top:0,behavior:"smooth"}))};this.handleResize=()=>{let e=(t,d)=>document.documentElement.style.setProperty(t,d);e("--js-unit-header-height","0"),setTimeout(()=>{let t=(this.mainHeader?.getBoundingClientRect().height??0)/16;e("--js-unit-header-height",`${t}rem`),e("--js-sticky-header-height",`${r}rem`),e("--js-unit-header-top",`${(t-r)*-1}rem`)})};this.headerObserver=new IntersectionObserver(([i])=>{if(i.intersectionRatio<1)for(let s of document.querySelectorAll('[class^="go-Main-header"'))s.setAttribute("data-fixed","true");else{for(let s of document.querySelectorAll('[class^="go-Main-header"'))s.removeAttribute("data-fixed");this.handleResize()}},{threshold:1,rootMargin:`${h*16}px`}),this.navObserver=new IntersectionObserver(([i])=>{i.intersectionRatio<1?(this.mainNav?.classList.add("go-Main-nav--fixed"),this.mainNav?.setAttribute("data-fixed","true")):(this.mainNav?.classList.remove("go-Main-nav--fixed"),this.mainNav?.removeAttribute("data-fixed"))},{threshold:1,rootMargin:`-${r*16+10}px`}),this.asideObserver=new IntersectionObserver(([i])=>{i.intersectionRatio<1?this.mainHeader?.setAttribute("data-raised","true"):this.mainHeader?.removeAttribute("data-raised")},{threshold:1,rootMargin:`-${r*16+20}px 0px 0px 0px`}),this.init()}init(){if(this.handleResize(),window.addEventListener("resize",this.handleResize),this.mainHeader?.addEventListener("dblclick",this.handleDoubleClick),this.mainHeader?.hasChildNodes()){let e=document.createElement("div");this.mainHeader.prepend(e),this.headerObserver.observe(e)}if(this.mainNav?.hasChildNodes()){let e=document.createElement("div");this.mainNav.prepend(e),this.navObserver.observe(e)}if(this.mainAside){let e=document.createElement("div");this.mainAside.prepend(e),this.asideObserver.observe(e)}}},n=a=>document.querySelector(a);new o(n(".js-mainHeader"),n(".js-mainNav"),n(".js-mainAside"));})();
+(()=>{var a=3.5,c=2.5,v=class{constructor(i,r,t){this.mainHeader=i;this.mainNav=r;this.mainAside=t;this.handleDoubleClick=i=>{var t,e;i.target===((t=this.mainHeader)==null?void 0:t.lastElementChild)&&((e=window.getSelection())==null||e.removeAllRanges(),window.scrollTo({top:0,behavior:"smooth"}))};this.handleResize=()=>{let i=(r,t)=>document.documentElement.style.setProperty(r,t);i("--js-unit-header-height","0"),setTimeout(()=>{var t,e;let r=((e=(t=this.mainHeader)==null?void 0:t.getBoundingClientRect().height)!=null?e:0)/16;i("--js-unit-header-height",`${r}rem`),i("--js-sticky-header-height",`${a}rem`),i("--js-unit-header-top",`${(r-a)*-1}rem`)})};this.headerObserver=new IntersectionObserver(([e])=>{if(e.intersectionRatio<1)for(let s of document.querySelectorAll('[class^="go-Main-header"'))s.setAttribute("data-fixed","true");else{for(let s of document.querySelectorAll('[class^="go-Main-header"'))s.removeAttribute("data-fixed");this.handleResize()}},{threshold:1,rootMargin:`${c*16}px`}),this.navObserver=new IntersectionObserver(([e])=>{var s,n,h,l;e.intersectionRatio<1?((s=this.mainNav)==null||s.classList.add("go-Main-nav--fixed"),(n=this.mainNav)==null||n.setAttribute("data-fixed","true")):((h=this.mainNav)==null||h.classList.remove("go-Main-nav--fixed"),(l=this.mainNav)==null||l.removeAttribute("data-fixed"))},{threshold:1,rootMargin:`-${a*16+10}px`}),this.asideObserver=new IntersectionObserver(([e])=>{var s,n;e.intersectionRatio<1?(s=this.mainHeader)==null||s.setAttribute("data-raised","true"):(n=this.mainHeader)==null||n.removeAttribute("data-raised")},{threshold:1,rootMargin:`-${a*16+20}px 0px 0px 0px`}),this.init()}init(){var i,r,t;if(this.handleResize(),window.addEventListener("resize",this.handleResize),(i=this.mainHeader)==null||i.addEventListener("dblclick",this.handleDoubleClick),(r=this.mainHeader)==null?void 0:r.hasChildNodes()){let e=document.createElement("div");this.mainHeader.prepend(e),this.headerObserver.observe(e)}if((t=this.mainNav)==null?void 0:t.hasChildNodes()){let e=document.createElement("div");this.mainNav.prepend(e),this.navObserver.observe(e)}if(this.mainAside){let e=document.createElement("div");this.mainAside.prepend(e),this.asideObserver.observe(e)}}},d=o=>document.querySelector(o);new v(d(".js-mainHeader"),d(".js-mainNav"),d(".js-mainAside"));})();
 /**
  * @license
  * Copyright 2021 The Go Authors. All rights reserved.
diff --git a/static/frontend/unit/unit.js.map b/static/frontend/unit/unit.js.map
index 6ae232d..979853c 100644
--- a/static/frontend/unit/unit.js.map
+++ b/static/frontend/unit/unit.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["unit.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nconst headerHeight = 3.5;\nconst breadcumbHeight = 2.5;\n\n/**\n * MainLayoutController calculates dynamic height values for header elements\n * to support variable size sticky positioned elements in the header so that\n * banners and breadcumbs may overflow to multiple lines.\n */\nexport class MainLayoutController {\n  private headerObserver: IntersectionObserver;\n  private navObserver: IntersectionObserver;\n  private asideObserver: IntersectionObserver;\n\n  constructor(\n    private mainHeader?: Element | null,\n    private mainNav?: Element | null,\n    private mainAside?: Element | null\n  ) {\n    this.headerObserver = new IntersectionObserver(\n      ([e]) => {\n        if (e.intersectionRatio < 1) {\n          for (const x of document.querySelectorAll('[class^=\"go-Main-header\"')) {\n            x.setAttribute('data-fixed', 'true');\n          }\n        } else {\n          for (const x of document.querySelectorAll('[class^=\"go-Main-header\"')) {\n            x.removeAttribute('data-fixed');\n          }\n          this.handleResize();\n        }\n      },\n      { threshold: 1, rootMargin: `${breadcumbHeight * 16}px` }\n    );\n    this.navObserver = new IntersectionObserver(\n      ([e]) => {\n        if (e.intersectionRatio < 1) {\n          this.mainNav?.classList.add('go-Main-nav--fixed');\n          this.mainNav?.setAttribute('data-fixed', 'true');\n        } else {\n          this.mainNav?.classList.remove('go-Main-nav--fixed');\n          this.mainNav?.removeAttribute('data-fixed');\n        }\n      },\n      { threshold: 1, rootMargin: `-${headerHeight * 16 + 10}px` }\n    );\n    this.asideObserver = new IntersectionObserver(\n      ([e]) => {\n        if (e.intersectionRatio < 1) {\n          this.mainHeader?.setAttribute('data-raised', 'true');\n        } else {\n          this.mainHeader?.removeAttribute('data-raised');\n        }\n      },\n      { threshold: 1, rootMargin: `-${headerHeight * 16 + 20}px 0px 0px 0px` }\n    );\n    this.init();\n  }\n\n  private init() {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.mainHeader?.addEventListener('dblclick', this.handleDoubleClick);\n    if (this.mainHeader?.hasChildNodes()) {\n      const headerSentinel = document.createElement('div');\n      this.mainHeader.prepend(headerSentinel);\n      this.headerObserver.observe(headerSentinel);\n    }\n    if (this.mainNav?.hasChildNodes()) {\n      const navSentinel = document.createElement('div');\n      this.mainNav.prepend(navSentinel);\n      this.navObserver.observe(navSentinel);\n    }\n    if (this.mainAside) {\n      const asideSentinel = document.createElement('div');\n      this.mainAside.prepend(asideSentinel);\n      this.asideObserver.observe(asideSentinel);\n    }\n  }\n\n  private handleDoubleClick: EventListener = e => {\n    const target = e.target;\n    if (target === this.mainHeader?.lastElementChild) {\n      window.getSelection()?.removeAllRanges();\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    }\n  };\n\n  private handleResize = () => {\n    const setProp = (name: string, value: string) =>\n      document.documentElement.style.setProperty(name, value);\n    setProp('--js-unit-header-height', '0');\n    setTimeout(() => {\n      const mainHeaderHeight = (this.mainHeader?.getBoundingClientRect().height ?? 0) / 16;\n      setProp('--js-unit-header-height', `${mainHeaderHeight}rem`);\n      setProp('--js-sticky-header-height', `${headerHeight}rem`);\n      setProp('--js-unit-header-top', `${(mainHeaderHeight - headerHeight) * -1}rem`);\n    });\n  };\n}\n\nconst el = <T extends HTMLElement>(selector: string) => document.querySelector<T>(selector);\nnew MainLayoutController(el('.js-mainHeader'), el('.js-mainNav'), el('.js-mainAside'));\n"],
-  "mappings": "MAAA,AAOA,GAAM,GAAe,IACf,EAAkB,IAOjB,OAA2B,CAKhC,YACU,EACA,EACA,EACR,CAHQ,kBACA,eACA,iBA+DF,uBAAmC,GAAK,CAE9C,AAAI,AADW,EAAE,SACF,KAAK,YAAY,kBAC9B,QAAO,gBAAgB,kBACvB,OAAO,SAAS,CAAE,IAAK,EAAG,SAAU,aAIhC,kBAAe,IAAM,CAC3B,GAAM,GAAU,CAAC,EAAc,IAC7B,SAAS,gBAAgB,MAAM,YAAY,EAAM,GACnD,EAAQ,0BAA2B,KACnC,WAAW,IAAM,CACf,GAAM,GAAoB,MAAK,YAAY,wBAAwB,QAAU,GAAK,GAClF,EAAQ,0BAA2B,GAAG,QACtC,EAAQ,4BAA6B,GAAG,QACxC,EAAQ,uBAAwB,GAAI,GAAmB,GAAgB,YA7EzE,KAAK,eAAiB,GAAI,sBACxB,CAAC,CAAC,KAAO,CACP,GAAI,EAAE,kBAAoB,EACxB,OAAW,KAAK,UAAS,iBAAiB,4BACxC,EAAE,aAAa,aAAc,YAE1B,CACL,OAAW,KAAK,UAAS,iBAAiB,4BACxC,EAAE,gBAAgB,cAEpB,KAAK,iBAGT,CAAE,UAAW,EAAG,WAAY,GAAG,EAAkB,SAEnD,KAAK,YAAc,GAAI,sBACrB,CAAC,CAAC,KAAO,CACP,AAAI,EAAE,kBAAoB,EACxB,MAAK,SAAS,UAAU,IAAI,sBAC5B,KAAK,SAAS,aAAa,aAAc,SAEzC,MAAK,SAAS,UAAU,OAAO,sBAC/B,KAAK,SAAS,gBAAgB,gBAGlC,CAAE,UAAW,EAAG,WAAY,IAAI,EAAe,GAAK,SAEtD,KAAK,cAAgB,GAAI,sBACvB,CAAC,CAAC,KAAO,CACP,AAAI,EAAE,kBAAoB,EACxB,KAAK,YAAY,aAAa,cAAe,QAE7C,KAAK,YAAY,gBAAgB,gBAGrC,CAAE,UAAW,EAAG,WAAY,IAAI,EAAe,GAAK,qBAEtD,KAAK,OAGC,MAAO,CAIb,GAHA,KAAK,eACL,OAAO,iBAAiB,SAAU,KAAK,cACvC,KAAK,YAAY,iBAAiB,WAAY,KAAK,mBAC/C,KAAK,YAAY,gBAAiB,CACpC,GAAM,GAAiB,SAAS,cAAc,OAC9C,KAAK,WAAW,QAAQ,GACxB,KAAK,eAAe,QAAQ,GAE9B,GAAI,KAAK,SAAS,gBAAiB,CACjC,GAAM,GAAc,SAAS,cAAc,OAC3C,KAAK,QAAQ,QAAQ,GACrB,KAAK,YAAY,QAAQ,GAE3B,GAAI,KAAK,UAAW,CAClB,GAAM,GAAgB,SAAS,cAAc,OAC7C,KAAK,UAAU,QAAQ,GACvB,KAAK,cAAc,QAAQ,MAyB3B,EAAK,AAAwB,GAAqB,SAAS,cAAiB,GAClF,GAAI,GAAqB,EAAG,kBAAmB,EAAG,eAAgB,EAAG",
+  "mappings": "MAAA,AAOA,GAAM,GAAe,IACf,EAAkB,IAOjB,OAA2B,CAKhC,YACU,EACA,EACA,EACR,CAHQ,kBACA,eACA,iBA+DF,uBAAmC,GAAK,CAtFlD,QAwFI,AAAI,AADW,EAAE,SACF,SAAK,aAAL,cAAiB,mBAC9B,WAAO,iBAAP,QAAuB,kBACvB,OAAO,SAAS,CAAE,IAAK,EAAG,SAAU,aAIhC,kBAAe,IAAM,CAC3B,GAAM,GAAU,CAAC,EAAc,IAC7B,SAAS,gBAAgB,MAAM,YAAY,EAAM,GACnD,EAAQ,0BAA2B,KACnC,WAAW,IAAM,CAlGrB,QAmGM,GAAM,GAAoB,YAAK,aAAL,cAAiB,wBAAwB,SAAzC,OAAmD,GAAK,GAClF,EAAQ,0BAA2B,GAAG,QACtC,EAAQ,4BAA6B,GAAG,QACxC,EAAQ,uBAAwB,GAAI,GAAmB,GAAgB,YA7EzE,KAAK,eAAiB,GAAI,sBACxB,CAAC,CAAC,KAAO,CACP,GAAI,EAAE,kBAAoB,EACxB,OAAW,KAAK,UAAS,iBAAiB,4BACxC,EAAE,aAAa,aAAc,YAE1B,CACL,OAAW,KAAK,UAAS,iBAAiB,4BACxC,EAAE,gBAAgB,cAEpB,KAAK,iBAGT,CAAE,UAAW,EAAG,WAAY,GAAG,EAAkB,SAEnD,KAAK,YAAc,GAAI,sBACrB,CAAC,CAAC,KAAO,CAzCf,YA0CQ,AAAI,EAAE,kBAAoB,EACxB,SAAK,UAAL,QAAc,UAAU,IAAI,sBAC5B,QAAK,UAAL,QAAc,aAAa,aAAc,SAEzC,SAAK,UAAL,QAAc,UAAU,OAAO,sBAC/B,QAAK,UAAL,QAAc,gBAAgB,gBAGlC,CAAE,UAAW,EAAG,WAAY,IAAI,EAAe,GAAK,SAEtD,KAAK,cAAgB,GAAI,sBACvB,CAAC,CAAC,KAAO,CArDf,QAsDQ,AAAI,EAAE,kBAAoB,EACxB,QAAK,aAAL,QAAiB,aAAa,cAAe,QAE7C,QAAK,aAAL,QAAiB,gBAAgB,gBAGrC,CAAE,UAAW,EAAG,WAAY,IAAI,EAAe,GAAK,qBAEtD,KAAK,OAGC,MAAO,CAjEjB,UAqEI,GAHA,KAAK,eACL,OAAO,iBAAiB,SAAU,KAAK,cACvC,QAAK,aAAL,QAAiB,iBAAiB,WAAY,KAAK,mBAC/C,QAAK,aAAL,cAAiB,gBAAiB,CACpC,GAAM,GAAiB,SAAS,cAAc,OAC9C,KAAK,WAAW,QAAQ,GACxB,KAAK,eAAe,QAAQ,GAE9B,GAAI,QAAK,UAAL,cAAc,gBAAiB,CACjC,GAAM,GAAc,SAAS,cAAc,OAC3C,KAAK,QAAQ,QAAQ,GACrB,KAAK,YAAY,QAAQ,GAE3B,GAAI,KAAK,UAAW,CAClB,GAAM,GAAgB,SAAS,cAAc,OAC7C,KAAK,UAAU,QAAQ,GACvB,KAAK,cAAc,QAAQ,MAyB3B,EAAK,AAAwB,GAAqB,SAAS,cAAiB,GAClF,GAAI,GAAqB,EAAG,kBAAmB,EAAG,eAAgB,EAAG",
   "names": []
 }
diff --git a/static/frontend/unit/unit.min.css b/static/frontend/unit/unit.min.css
new file mode 100644
index 0000000..88a7605
--- /dev/null
+++ b/static/frontend/unit/unit.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.UnitHeader-titleHeading{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.UnitHeader-overflowContainer{display:none;height:1.5rem;position:absolute;right:0;width:1.5rem}.go-Main-header[data-fixed] .UnitHeader-overflowContainer{display:block}@media screen and (min-width: 80rem){.go-Main-header[data-fixed] .UnitHeader-overflowContainer{display:none}}.UnitHeader-overflowImage{fill:var(--gray-3);height:100%;left:0;position:absolute;top:0;width:100%}.UnitHeader-overflowSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:transparent;cursor:pointer;font-size:1rem;height:100%;left:0;position:absolute;top:0;width:100%}.UnitHeader-overflowSelect option{color:var(--color-text)}.UnitHeader-versionBadge,.DetailsHeader-badge{border-radius:unset;color:var(--color-text-inverted);font-size:.7rem;line-height:.85rem;margin:-1rem 0 -1rem .5rem;padding:.25rem .5rem;text-transform:uppercase;top:-.0625rem}.UnitHeader-versionBadge--unknown,.DetailsHeader-badge--unknown{display:none}a.UnitHeader-backLink{color:var(--color-text);display:block;font-size:1rem}.UnitHeader-backLink img{vertical-align:middle}.DetailsHeader-badge--notAtLatest a{display:none}.DetailsHeader-badge--notAtLatest span.DetailsHeader-span--latest{display:none}.DetailsHeader-badge--notAtLatest .UnitMetaDetails-icon{z-index:1}.DetailsHeader-badge--notAtLatest .UnitMetaDetails-toggletipBubble{color:var(--black);text-transform:none}.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip{height:0}.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip button{height:.8125rem;line-height:0}.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip img{vertical-align:middle}.DetailsHeader-badge--goToLatest span{display:none}.DetailsHeader-badge--goToLatest span.DetailsHeader-span--goToLatest{display:initial}.DetailsHeader-badge--unknown a{display:none}.DetailsHeader-badge--unknown span{display:none}.DetailsHeader-badge{border-radius:1rem;display:inline-block;font-size:.75rem;padding:.25rem .75rem;position:relative;top:-.125rem}.DetailsHeader-badge--latest a{display:none}.DetailsHeader-badge--latest span.DetailsHeader-span--notAtLatest{display:none}.DetailsHeader-badge--goToLatest,.DetailsHeader-badge--latest,.DetailsHeader-badge--notAtLatest{margin-left:.25rem}.go-Main{background-color:var(--color-background);color:var(--color-text);display:grid;flex-grow:1;grid-template-areas:"banner" "header" "aside" "nav" "article" "footer";grid-template-columns:100%;grid-template-rows:repeat(6,min-content);min-height:32rem}.go-Main-banner{grid-area:banner}.go-Main-header{background-color:var(--color-background);border-bottom:var(--border);font-size:.875rem;grid-area:header;min-height:var(--js-unit-header-height);padding:0 var(--gutter);position:sticky;top:var(--js-unit-header-top, 0);transition:box-shadow .25s linear;z-index:10}.go-Main-header[data-fixed]{border-bottom:none}.go-Main-header[data-raised]{border-bottom:var(--border)}.go-Main-nav{background-color:var(--color-background);border-bottom:var(--border);font-size:.875rem;grid-area:nav;padding:0 var(--gutter)}.go-Main-article{background-color:var(--color-background);grid-area:article;margin:var(--gap) 0 5rem 0;min-height:32rem;padding:0 var(--gutter)}.go-Main-aside{background-color:var(--color-background-accented);border-bottom:var(--border);font-size:.875rem;grid-area:aside;padding:1rem var(--gutter)}.go-Main-aside--empty{border-bottom:none;padding:0}.go-Main-footer{background-color:var(--color-background);grid-area:footer;padding:0 var(--gutter)}.go-Main>*:empty{border:none;margin:0;padding:0}.go-Main-headerBreadcrumb{margin-top:1rem}.go-Main-headerContent{margin-bottom:1rem;position:sticky;top:0}.go-Main-headerContent[data-fixed]{align-items:center;display:flex;margin-bottom:0;min-height:0}@media screen and (min-width: 80rem){.go-Main-headerContent[data-fixed]{justify-content:space-between}}.go-Main-headerTitle{align-items:center;display:flex;gap:.5rem;height:3.5rem;max-width:100%;padding-right:1.5rem}@media screen and (min-width: 80rem){.go-Main-headerTitle[data-fixed]{max-width:40%}}.go-Main-headerTitle .go-Clipboard{display:none}.go-Main-headerTitle[data-fixed] .go-Clipboard{display:initial}.go-Main-headerLogo{--logo-height: 1.75rem;--logo-width: calc(var(--logo-height) / .3768);align-items:center;display:flex;margin-right:-.5rem;opacity:0;transition:opacity .25s ease-in-out,width .25s ease-out;visibility:hidden;width:0}.go-Main-headerLogo img{height:var(--logo-height);margin:-1rem 0;width:var(--logo-width)}.go-Main-headerLogo[data-fixed]{margin-right:0;opacity:1;visibility:visible;width:var(--logo-width)}.go-Main-headerDetails{display:flex;flex-direction:row;flex-wrap:wrap;gap:0 1rem;white-space:nowrap}.go-Main-headerDetails[data-fixed]{display:none}@media screen and (min-width: 80rem){:root:not([data-layout="compact"]) .go-Main-headerDetails[data-fixed]{display:flex}}.go-Main-headerDetailItem{color:var(--color-text-subtle);display:inline;font-size:.875rem;height:1.75rem;line-height:1.75rem}.go-Main-headerDetailItem:not(:last-of-type):after{content:"|";padding-left:1rem}.go-Main-nav--sticky{position:sticky;top:var(--js-sticky-header-height, 3.5rem);transition:box-shadow .25s linear;z-index:1}.go-Main-nav--fixed{border-top:initial;box-shadow:var(--box-shadow)}.go-Main-navDesktop{display:none;margin-top:var(--gap);overflow-y:auto;padding:.25rem;position:sticky;top:calc(var(--js-sticky-header-height, 3.5rem) + 1rem)}.go-Main-navMobile{display:flex;margin:.5rem 0}.go-Main-navMobile .go-Label{flex-grow:1;position:relative}.go-Main-navMobile .go-Select{padding-left:1.75rem;width:100%}.go-Main-navMobile .go-Label:before{background:url(/static/shared/icon/list_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:contain;content:" ";height:1.25rem;left:.5rem;padding-left:1rem;position:absolute;top:.375rem;width:1.25rem}@media not all and (min-resolution: .001dpcm){@supports (-webkit-appearance: none){.go-Main-navMobile .go-Select{-webkit-appearance:none;appearance:none}}}@media screen and (min-width: 80rem){:root[data-layout=responsive] .go-Main{grid-template-areas:"banner  banner" "header  header" "aside   aside" "nav     article" "footer  footer";grid-template-columns:21.5% minmax(0,auto);grid-template-rows:repeat(5,min-content)}:root[data-layout=responsive] .go-Main-nav{border-bottom:none;border-top:none;padding:0 0 0 var(--gutter)}:root:not([data-layout="stacked"]) .go-Main-header[data-raised]{box-shadow:var(--box-shadow)}:root[data-layout=responsive] .go-Main-article{border-bottom:none;border-top:none;margin:var(--gap) 0 5rem var(--gap);padding:0 var(--gutter) 0 0}:root[data-layout=responsive] .go-Main-aside{border-bottom:var(--border)}:root[data-layout=responsive] .go-Main-nav--sticky{position:initial}:root[data-layout=responsive] .go-Main-nav--fixed{box-shadow:none}:root[data-layout=responsive] .go-Main-navDesktop{display:block}:root[data-layout=responsive] .go-Main-navMobile{display:none}}@media screen and (min-width: 112rem){:root[data-layout=responsive] .go-Main{grid-template-areas:"banner banner  banner" "header header  header" "nav    article aside" "footer footer  footer";grid-template-columns:minmax(17.5%,1fr) minmax(0,4fr) minmax(17.5%,1fr);grid-template-rows:repeat(4,min-content)}:root[data-layout=responsive] .go-Main-article{margin:var(--gap) var(--gap) 5rem;padding:0}:root[data-layout=responsive] .go-Main-aside{background-color:var(--color-background);border-bottom:none;margin:var(--gap) 0 0 0;padding:0 var(--gutter) 0 0}}@media screen and (min-width: 80rem){:root[data-layout=compact] .go-Main{grid-template-areas:"banner  banner" "header  ." "header  nav" "aside   aside" "article article" "footer  footer";grid-template-columns:1fr auto;grid-template-rows:repeat(6,min-content)}:root[data-layout=compact] .go-Main-nav{align-items:center;border-bottom:var(--border);display:flex;top:calc((var(--js-main-header-height, 0) - var(--js-sticky-header-height, 3.5rem)) * -1)}:root[data-layout=compact] .go-Main-header[data-fixed]{box-shadow:none}:root[data-layout=compact] .go-Main-nav--sticky{height:var(--js-sticky-header-height, 3.5rem);position:sticky;top:0}:root[data-layout=compact] .go-Main-nav--fixed{box-shadow:none}:root[data-layout=compact] .go-Main-navDesktop{display:none}:root[data-layout=compact] .go-Main-navMobile{display:flex}}@media print{.go-Main-header--sticky,.go-Main-header--sticky>:last-child,.go-Main-nav--sticky,.go-Main-navDesktop{position:initial}}
+/*# sourceMappingURL=unit.min.css.map */
diff --git a/static/frontend/unit/unit.min.css.map b/static/frontend/unit/unit.min.css.map
new file mode 100644
index 0000000..d8cbc19
--- /dev/null
+++ b/static/frontend/unit/unit.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["_header.css", "unit.css"],
+  "sourcesContent": ["/*!\n * Copyright 2020-2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitHeader-titleHeading {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.UnitHeader-overflowContainer {\n  display: none;\n  height: 1.5rem;\n  position: absolute;\n  right: 0;\n  width: 1.5rem;\n}\n.go-Main-header[data-fixed] .UnitHeader-overflowContainer {\n  display: block;\n}\n@media screen and (min-width: 80rem) {\n  .go-Main-header[data-fixed] .UnitHeader-overflowContainer {\n    display: none;\n  }\n}\n.UnitHeader-overflowImage {\n  fill: var(--gray-3);\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.UnitHeader-overflowSelect {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background: transparent;\n  border: 0;\n  color: transparent;\n  cursor: pointer;\n  font-size: 1rem;\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.UnitHeader-overflowSelect option {\n  color: var(--color-text);\n}\n\n.UnitHeader-versionBadge,\n.DetailsHeader-badge {\n  border-radius: unset;\n  color: var(--color-text-inverted);\n  font-size: 0.7rem;\n  line-height: 0.85rem;\n  margin: -1rem 0 -1rem 0.5rem;\n  padding: 0.25rem 0.5rem;\n  text-transform: uppercase;\n  top: -0.0625rem;\n}\n.UnitHeader-versionBadge--unknown,\n.DetailsHeader-badge--unknown {\n  display: none;\n}\n\na.UnitHeader-backLink {\n  color: var(--color-text);\n  display: block;\n  font-size: 1rem;\n}\n.UnitHeader-backLink img {\n  vertical-align: middle;\n}\n\n.DetailsHeader-badge--notAtLatest a {\n  display: none;\n}\n.DetailsHeader-badge--notAtLatest span.DetailsHeader-span--latest {\n  display: none;\n}\n.DetailsHeader-badge--notAtLatest .UnitMetaDetails-icon {\n  z-index: 1;\n}\n.DetailsHeader-badge--notAtLatest .UnitMetaDetails-toggletipBubble {\n  color: var(--black);\n  text-transform: none;\n}\n.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip {\n  height: 0;\n}\n.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip button {\n  height: 0.8125rem;\n  line-height: 0;\n}\n.DetailsHeader-span--notAtLatest .UnitMetaDetails-toggletip img {\n  vertical-align: middle;\n}\n\n.DetailsHeader-badge--goToLatest span {\n  display: none;\n}\n.DetailsHeader-badge--goToLatest span.DetailsHeader-span--goToLatest {\n  display: initial;\n}\n.DetailsHeader-badge--unknown a {\n  display: none;\n}\n.DetailsHeader-badge--unknown span {\n  display: none;\n}\n\n.DetailsHeader-badge {\n  border-radius: 1rem;\n  display: inline-block;\n  font-size: 0.75rem;\n  padding: 0.25rem 0.75rem;\n  position: relative;\n  top: -0.125rem;\n}\n\n.DetailsHeader-badge--latest a {\n  display: none;\n}\n.DetailsHeader-badge--latest span.DetailsHeader-span--notAtLatest {\n  display: none;\n}\n\n.DetailsHeader-badge--goToLatest,\n.DetailsHeader-badge--latest,\n.DetailsHeader-badge--notAtLatest {\n  margin-left: 0.25rem;\n}\n", "/*!\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_header.css');\n\n.go-Main {\n  background-color: var(--color-background);\n  color: var(--color-text);\n  display: grid;\n  flex-grow: 1;\n  grid-template-areas:\n    'banner'\n    'header'\n    'aside'\n    'nav'\n    'article'\n    'footer';\n  grid-template-columns: 100%;\n  grid-template-rows: repeat(6, min-content);\n  min-height: 32rem;\n}\n\n.go-Main-banner {\n  grid-area: banner;\n}\n.go-Main-header {\n  background-color: var(--color-background);\n  border-bottom: var(--border);\n  font-size: 0.875rem;\n  grid-area: header;\n  min-height: var(--js-unit-header-height);\n  padding: 0 var(--gutter);\n  position: sticky;\n  top: var(--js-unit-header-top, 0);\n  transition: box-shadow 0.25s linear;\n  z-index: 10;\n}\n.go-Main-header[data-fixed] {\n  border-bottom: none;\n}\n.go-Main-header[data-raised] {\n  border-bottom: var(--border);\n}\n.go-Main-nav {\n  background-color: var(--color-background);\n  border-bottom: var(--border);\n  font-size: 0.875rem;\n  grid-area: nav;\n  padding: 0 var(--gutter);\n}\n.go-Main-article {\n  background-color: var(--color-background);\n  grid-area: article;\n  margin: var(--gap) 0 5rem 0;\n  min-height: 32rem;\n  padding: 0 var(--gutter);\n}\n.go-Main-aside {\n  background-color: var(--color-background-accented);\n  border-bottom: var(--border);\n  font-size: 0.875rem;\n  grid-area: aside;\n  padding: 1rem var(--gutter);\n}\n.go-Main-aside--empty {\n  border-bottom: none;\n  padding: 0;\n}\n.go-Main-footer {\n  background-color: var(--color-background);\n  grid-area: footer;\n  padding: 0 var(--gutter);\n}\n\n.go-Main > *:empty {\n  border: none;\n  margin: 0;\n  padding: 0;\n}\n\n.go-Main-headerBreadcrumb {\n  margin-top: 1rem;\n}\n.go-Main-headerContent {\n  margin-bottom: 1rem;\n  position: sticky;\n  top: 0;\n}\n.go-Main-headerContent[data-fixed] {\n  align-items: center;\n  display: flex;\n  margin-bottom: 0;\n  min-height: 0;\n}\n@media screen and (min-width: 80rem) {\n  .go-Main-headerContent[data-fixed] {\n    justify-content: space-between;\n  }\n}\n\n.go-Main-headerTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  height: 3.5rem;\n  max-width: 100%;\n  padding-right: 1.5rem;\n}\n@media screen and (min-width: 80rem) {\n  .go-Main-headerTitle[data-fixed] {\n    max-width: 40%;\n  }\n}\n.go-Main-headerTitle .go-Clipboard {\n  display: none;\n}\n.go-Main-headerTitle[data-fixed] .go-Clipboard {\n  display: initial;\n}\n\n.go-Main-headerLogo {\n  --logo-height: 1.75rem;\n  --logo-width: calc(var(--logo-height) / 0.3768);\n\n  align-items: center;\n  display: flex;\n  margin-right: -0.5rem;\n  opacity: 0;\n  transition: opacity 0.25s ease-in-out, width 0.25s ease-out;\n  visibility: hidden;\n  width: 0;\n}\n.go-Main-headerLogo img {\n  height: var(--logo-height);\n  margin: -1rem 0;\n  width: var(--logo-width);\n}\n.go-Main-headerLogo[data-fixed] {\n  margin-right: 0;\n  opacity: 1;\n  visibility: visible;\n  width: var(--logo-width);\n}\n\n.go-Main-headerDetails {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  gap: 0 1rem;\n  white-space: nowrap;\n}\n.go-Main-headerDetails[data-fixed] {\n  display: none;\n}\n@media screen and (min-width: 80rem) {\n  :root:not([data-layout='compact']) .go-Main-headerDetails[data-fixed] {\n    display: flex;\n  }\n}\n.go-Main-headerDetailItem {\n  color: var(--color-text-subtle);\n  display: inline;\n  font-size: 0.875rem;\n  height: 1.75rem;\n  line-height: 1.75rem;\n}\n.go-Main-headerDetailItem:not(:last-of-type)::after {\n  content: '|';\n  padding-left: 1rem;\n}\n\n.go-Main-nav--sticky {\n  position: sticky;\n  top: var(--js-sticky-header-height, 3.5rem);\n  transition: box-shadow 0.25s linear;\n  z-index: 1;\n}\n.go-Main-nav--fixed {\n  border-top: initial;\n  box-shadow: var(--box-shadow);\n}\n\n.go-Main-navDesktop {\n  display: none;\n  margin-top: var(--gap);\n  overflow-y: auto;\n  padding: 0.25rem;\n  position: sticky;\n  top: calc(var(--js-sticky-header-height, 3.5rem) + 1rem);\n}\n.go-Main-navMobile {\n  display: flex;\n  margin: 0.5rem 0;\n}\n.go-Main-navMobile .go-Label {\n  flex-grow: 1;\n  position: relative;\n}\n.go-Main-navMobile .go-Select {\n  padding-left: 1.75rem;\n  width: 100%;\n}\n.go-Main-navMobile .go-Label::before {\n  background: url(/static/shared/icon/list_gm_grey_24dp.svg);\n  background-repeat: no-repeat;\n  background-size: contain;\n  content: ' ';\n  height: 1.25rem;\n  left: 0.5rem;\n  padding-left: 1rem;\n  position: absolute;\n  top: 0.375rem;\n  width: 1.25rem;\n}\n\n/* Safari only */\n@media not all and (min-resolution: 0.001dpcm) {\n  @supports (-webkit-appearance: none) {\n    .go-Main-navMobile .go-Select {\n      -webkit-appearance: none;\n      appearance: none;\n    }\n  }\n}\n\n@media screen and (min-width: 80rem) {\n  :root[data-layout='responsive'] .go-Main {\n    grid-template-areas:\n      'banner  banner'\n      'header  header'\n      'aside   aside'\n      'nav     article'\n      'footer  footer';\n    grid-template-columns: 21.5% minmax(0, auto);\n    grid-template-rows: repeat(5, min-content);\n  }\n  :root[data-layout='responsive'] .go-Main-nav {\n    border-bottom: none;\n    border-top: none;\n    padding: 0 0 0 var(--gutter);\n  }\n  :root:not([data-layout='stacked']) .go-Main-header[data-raised] {\n    box-shadow: var(--box-shadow);\n  }\n  :root[data-layout='responsive'] .go-Main-article {\n    border-bottom: none;\n    border-top: none;\n    margin: var(--gap) 0 5rem var(--gap);\n    padding: 0 var(--gutter) 0 0;\n  }\n  :root[data-layout='responsive'] .go-Main-aside {\n    border-bottom: var(--border);\n  }\n  :root[data-layout='responsive'] .go-Main-nav--sticky {\n    position: initial;\n  }\n  :root[data-layout='responsive'] .go-Main-nav--fixed {\n    box-shadow: none;\n  }\n  :root[data-layout='responsive'] .go-Main-navDesktop {\n    display: block;\n  }\n  :root[data-layout='responsive'] .go-Main-navMobile {\n    display: none;\n  }\n}\n\n@media screen and (min-width: 112rem) {\n  :root[data-layout='responsive'] .go-Main {\n    grid-template-areas:\n      'banner banner  banner'\n      'header header  header'\n      'nav    article aside'\n      'footer footer  footer';\n    grid-template-columns: minmax(17.5%, 1fr) minmax(0, 4fr) minmax(17.5%, 1fr);\n    grid-template-rows: repeat(4, min-content);\n  }\n  :root[data-layout='responsive'] .go-Main-article {\n    margin: var(--gap) var(--gap) 5rem;\n    padding: 0;\n  }\n  :root[data-layout='responsive'] .go-Main-aside {\n    background-color: var(--color-background);\n    border-bottom: none;\n    margin: var(--gap) 0 0 0;\n    padding: 0 var(--gutter) 0 0;\n  }\n}\n\n@media screen and (min-width: 80rem) {\n  :root[data-layout='compact'] .go-Main {\n    grid-template-areas:\n      'banner  banner'\n      'header  .'\n      'header  nav'\n      'aside   aside'\n      'article article'\n      'footer  footer';\n    grid-template-columns: 1fr auto;\n    grid-template-rows: repeat(6, min-content);\n  }\n  :root[data-layout='compact'] .go-Main-nav {\n    align-items: center;\n    border-bottom: var(--border);\n    display: flex;\n    top: calc((var(--js-main-header-height, 0) - var(--js-sticky-header-height, 3.5rem)) * -1);\n  }\n  :root[data-layout='compact'] .go-Main-header[data-fixed] {\n    box-shadow: none;\n  }\n  :root[data-layout='compact'] .go-Main-nav--sticky {\n    height: var(--js-sticky-header-height, 3.5rem);\n    position: sticky;\n    top: 0;\n  }\n  :root[data-layout='compact'] .go-Main-nav--fixed {\n    box-shadow: none;\n  }\n  :root[data-layout='compact'] .go-Main-navDesktop {\n    display: none;\n  }\n  :root[data-layout='compact'] .go-Main-navMobile {\n    display: flex;\n  }\n}\n\n@media print {\n  .go-Main-header--sticky,\n  .go-Main-header--sticky > :last-child,\n  .go-Main-nav--sticky,\n  .go-Main-navDesktop {\n    position: initial;\n  }\n}\n"],
+  "mappings": ";;;;;AAMA,yBACE,gBACA,uBACA,mBAEF,8BACE,aACA,cACA,kBACA,QACA,aAEF,0DACE,cAEF,qCACE,0DACE,cAGJ,0BACE,mBACA,YACA,OACA,kBACA,MACA,WAEF,2BACE,wBACA,qBACA,gBACA,uBACA,SACA,kBACA,eACA,eACA,YACA,OACA,kBACA,MACA,WAEF,kCACE,wBAGF,8CArDA,oBAwDE,iCACA,gBACA,mBA1DF,gDA6DE,yBACA,cAEF,gEAEE,aAGF,sBACE,wBACA,cACA,eAEF,yBACE,sBAGF,oCACE,aAEF,kEACE,aAEF,wDACE,UAEF,mEACE,mBACA,oBAEF,4DACE,SAEF,mEACE,gBACA,cAEF,gEACE,sBAGF,sCACE,aAEF,qEACE,gBAEF,gCACE,aAEF,mCACE,aAGF,qBAnHA,mBAqHE,qBACA,iBAtHF,sBAwHE,kBACA,aAGF,+BACE,aAEF,kEACE,aAGF,gGAGE,mBC9HF,SACE,yCACA,wBACA,aACA,YACA,uEAOA,2BACA,yCACA,iBAGF,gBACE,iBAEF,gBACE,yCACA,4BACA,kBACA,iBACA,wCACA,wBACA,gBACA,iCACA,kCACA,WAEF,4BACE,mBAEF,6BACE,4BAEF,aACE,yCACA,4BACA,kBACA,cACA,wBAEF,iBACE,yCACA,kBACA,2BACA,iBACA,wBAEF,eACE,kDACA,4BACA,kBACA,gBACA,2BAEF,sBACE,mBApEF,UAuEA,gBACE,yCACA,iBACA,wBAGF,iBACE,YA9EF,mBAmFA,0BACE,gBAEF,uBACE,mBACA,gBACA,MAEF,mCACE,mBACA,aACA,gBACA,aAEF,qCACE,mCACE,+BAIJ,qBACE,mBACA,aACA,UACA,cACA,eACA,qBAEF,qCACE,iCACE,eAGJ,mCACE,aAEF,+CACE,gBAGF,oBACE,uBACA,+CAEA,mBACA,aACA,oBACA,UACA,wDACA,kBACA,QAEF,wBACE,0BAxIF,eA0IE,wBAEF,gCACE,eACA,UACA,mBACA,wBAGF,uBACE,aACA,mBACA,eACA,WACA,mBAEF,mCACE,aAEF,qCACE,sEACE,cAGJ,0BACE,+BACA,eACA,kBACA,eACA,oBAEF,mDACE,YACA,kBAGF,qBACE,gBACA,2CACA,kCACA,UAEF,oBACE,mBACA,6BAGF,oBACE,aACA,sBACA,gBA5LF,eA8LE,gBACA,wDAEF,mBACE,aAlMF,eAqMA,6BACE,YACA,kBAEF,8BACE,qBACA,WAEF,oCACE,0DACA,4BACA,wBACA,YACA,eACA,WACA,kBACA,kBACA,YACA,cAIF,8CACE,qCACE,8BACE,wBACA,kBAKN,qCACE,uCACE,yGAMA,2CACA,yCAEF,2CACE,mBACA,gBACA,4BAEF,gEACE,6BAEF,+CACE,mBACA,gBACA,oCACA,4BAEF,6CACE,4BAEF,mDACE,iBAEF,kDACE,gBAEF,kDACE,cAEF,iDACE,cAIJ,sCACE,uCACE,mHAKA,wEACA,yCAEF,+CACE,kCAzRJ,UA4RE,6CACE,yCACA,mBACA,wBACA,6BAIJ,qCACE,oCACE,kHAOA,+BACA,yCAEF,wCACE,mBACA,4BACA,aACA,0FAEF,uDACE,gBAEF,gDACE,8CACA,gBACA,MAEF,+CACE,gBAEF,+CACE,aAEF,8CACE,cAIJ,aACE,qGAIE",
+  "names": []
+}
diff --git a/static/frontend/unit/unit.tmpl b/static/frontend/unit/unit.tmpl
index 364e190..c976866 100644
--- a/static/frontend/unit/unit.tmpl
+++ b/static/frontend/unit/unit.tmpl
@@ -9,7 +9,7 @@
 {{define "description"}}{{.MetaDescription}}{{end}}
 
 {{define "pre-content"}}
-  <link href="/static/frontend/unit/unit.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/unit.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
   {{block "main-styles".}}{{end}}
 {{end}}
 
diff --git a/static/frontend/unit/versions/versions.js b/static/frontend/unit/versions/versions.js
index da12a71..aeabd83 100644
--- a/static/frontend/unit/versions/versions.js
+++ b/static/frontend/unit/versions/versions.js
@@ -1,4 +1,4 @@
-(()=>{var n=class{constructor(){this.expand=document.querySelector(".js-versionsExpand");this.collapse=document.querySelector(".js-versionsCollapse");this.details=[...document.querySelectorAll(".js-versionDetails")];if(!!this.expand?.parentElement){this.details.some(e=>e.tagName==="DETAILS")&&(this.expand.parentElement.style.display="block");for(let e of this.details)e.addEventListener("click",()=>{this.updateButtons()});this.expand?.addEventListener("click",()=>{this.details.map(e=>e.open=!0),this.updateButtons()}),this.collapse?.addEventListener("click",()=>{this.details.map(e=>e.open=!1),this.updateButtons()}),this.updateButtons(),this.setCurrent()}}setCurrent(){let e=document.querySelector(".js-canonicalURLPath")?.dataset?.canonicalUrlPath,t=document.querySelector(`.js-versionLink[href="${e}"]`);t&&(t.style.fontWeight="bold")}updateButtons(){setTimeout(()=>{if(!this.expand||!this.collapse)return;let e,t;for(let s of this.details)e=e||s.open,t=t||!s.open;this.expand.style.display=t?"inline-block":"none",this.collapse.style.display=t?"none":"inline-block"})}};new n;})();
+(()=>{var i=class{constructor(){this.expand=document.querySelector(".js-versionsExpand");this.collapse=document.querySelector(".js-versionsCollapse");this.details=[...document.querySelectorAll(".js-versionDetails")];var n,e,s;if(!!((n=this.expand)==null?void 0:n.parentElement)){this.details.some(t=>t.tagName==="DETAILS")&&(this.expand.parentElement.style.display="block");for(let t of this.details)t.addEventListener("click",()=>{this.updateButtons()});(e=this.expand)==null||e.addEventListener("click",()=>{this.details.map(t=>t.open=!0),this.updateButtons()}),(s=this.collapse)==null||s.addEventListener("click",()=>{this.details.map(t=>t.open=!1),this.updateButtons()}),this.updateButtons(),this.setCurrent()}}setCurrent(){var s,t;let n=(t=(s=document.querySelector(".js-canonicalURLPath"))==null?void 0:s.dataset)==null?void 0:t.canonicalUrlPath,e=document.querySelector(`.js-versionLink[href="${n}"]`);e&&(e.style.fontWeight="bold")}updateButtons(){setTimeout(()=>{if(!this.expand||!this.collapse)return;let n,e;for(let s of this.details)n=n||s.open,e=e||!s.open;this.expand.style.display=e?"inline-block":"none",this.collapse.style.display=e?"none":"inline-block"})}};new i;})();
 /*!
  * @license
  * Copyright 2021 The Go Authors. All rights reserved.
diff --git a/static/frontend/unit/versions/versions.js.map b/static/frontend/unit/versions/versions.js.map
index ddef02f..0f54cab 100644
--- a/static/frontend/unit/versions/versions.js.map
+++ b/static/frontend/unit/versions/versions.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["versions.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * VersionsController encapsulates event listeners and UI updates\n * for the versions page. As the the expandable sections containing\n * the symbol history for a package are opened and closed it toggles\n * visiblity of the buttons to expand or collapse them. On page load\n * it adds an indicator to the version that matches the version request\n * by the user for the page or the canonical url path.\n */\nclass VersionsController {\n  private expand = document.querySelector<HTMLButtonElement>('.js-versionsExpand');\n  private collapse = document.querySelector<HTMLButtonElement>('.js-versionsCollapse');\n  private details = [...document.querySelectorAll<HTMLDetailsElement>('.js-versionDetails')];\n\n  constructor() {\n    if (!this.expand?.parentElement) return;\n    if (this.details.some(d => d.tagName === 'DETAILS')) {\n      this.expand.parentElement.style.display = 'block';\n    }\n\n    for (const d of this.details) {\n      d.addEventListener('click', () => {\n        this.updateButtons();\n      });\n    }\n\n    this.expand?.addEventListener('click', () => {\n      this.details.map(d => (d.open = true));\n      this.updateButtons();\n    });\n\n    this.collapse?.addEventListener('click', () => {\n      this.details.map(d => (d.open = false));\n      this.updateButtons();\n    });\n\n    this.updateButtons();\n    this.setCurrent();\n  }\n\n  /**\n   * setCurrent applies the active style to the version dot\n   * for the version that matches the canonical URL path.\n   */\n  private setCurrent() {\n    const canonicalPath = document.querySelector<HTMLElement>('.js-canonicalURLPath')?.dataset\n      ?.canonicalUrlPath;\n    const versionLink = document.querySelector<HTMLElement>(\n      `.js-versionLink[href=\"${canonicalPath}\"]`\n    );\n    if (versionLink) {\n      versionLink.style.fontWeight = 'bold';\n    }\n  }\n\n  private updateButtons() {\n    setTimeout(() => {\n      if (!this.expand || !this.collapse) return;\n      let someOpen, someClosed;\n      for (const d of this.details) {\n        someOpen = someOpen || d.open;\n        someClosed = someClosed || !d.open;\n      }\n      this.expand.style.display = someClosed ? 'inline-block' : 'none';\n      this.collapse.style.display = someClosed ? 'none' : 'inline-block';\n    });\n  }\n}\n\nnew VersionsController();\n"],
-  "mappings": "MAAA,AAeA,WAAyB,CAKvB,aAAc,CAJN,YAAS,SAAS,cAAiC,sBACnD,cAAW,SAAS,cAAiC,wBACrD,aAAU,CAAC,GAAG,SAAS,iBAAqC,uBAGlE,GAAI,EAAC,KAAK,QAAQ,cAClB,CAAI,KAAK,QAAQ,KAAK,GAAK,EAAE,UAAY,YACvC,MAAK,OAAO,cAAc,MAAM,QAAU,SAG5C,OAAW,KAAK,MAAK,QACnB,EAAE,iBAAiB,QAAS,IAAM,CAChC,KAAK,kBAIT,KAAK,QAAQ,iBAAiB,QAAS,IAAM,CAC3C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,KAAK,UAAU,iBAAiB,QAAS,IAAM,CAC7C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,KAAK,gBACL,KAAK,cAOC,YAAa,CACnB,GAAM,GAAgB,SAAS,cAA2B,yBAAyB,SAC/E,iBACE,EAAc,SAAS,cAC3B,yBAAyB,OAE3B,AAAI,GACF,GAAY,MAAM,WAAa,QAI3B,eAAgB,CACtB,WAAW,IAAM,CACf,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SAAU,OACpC,GAAI,GAAU,EACd,OAAW,KAAK,MAAK,QACnB,EAAW,GAAY,EAAE,KACzB,EAAa,GAAc,CAAC,EAAE,KAEhC,KAAK,OAAO,MAAM,QAAU,EAAa,eAAiB,OAC1D,KAAK,SAAS,MAAM,QAAU,EAAa,OAAS,mBAK1D,GAAI",
+  "mappings": "MAAA,AAeA,WAAyB,CAKvB,aAAc,CAJN,YAAS,SAAS,cAAiC,sBACnD,cAAW,SAAS,cAAiC,wBACrD,aAAU,CAAC,GAAG,SAAS,iBAAqC,uBAlBtE,UAqBI,GAAI,EAAC,SAAK,SAAL,cAAa,eAClB,CAAI,KAAK,QAAQ,KAAK,GAAK,EAAE,UAAY,YACvC,MAAK,OAAO,cAAc,MAAM,QAAU,SAG5C,OAAW,KAAK,MAAK,QACnB,EAAE,iBAAiB,QAAS,IAAM,CAChC,KAAK,kBAIT,QAAK,SAAL,QAAa,iBAAiB,QAAS,IAAM,CAC3C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,QAAK,WAAL,QAAe,iBAAiB,QAAS,IAAM,CAC7C,KAAK,QAAQ,IAAI,GAAM,EAAE,KAAO,IAChC,KAAK,kBAGP,KAAK,gBACL,KAAK,cAOC,YAAa,CAlDvB,QAmDI,GAAM,GAAgB,eAAS,cAA2B,0BAApC,cAA6D,UAA7D,cAClB,iBACE,EAAc,SAAS,cAC3B,yBAAyB,OAE3B,AAAI,GACF,GAAY,MAAM,WAAa,QAI3B,eAAgB,CACtB,WAAW,IAAM,CACf,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SAAU,OACpC,GAAI,GAAU,EACd,OAAW,KAAK,MAAK,QACnB,EAAW,GAAY,EAAE,KACzB,EAAa,GAAc,CAAC,EAAE,KAEhC,KAAK,OAAO,MAAM,QAAU,EAAa,eAAiB,OAC1D,KAAK,SAAS,MAAM,QAAU,EAAa,OAAS,mBAK1D,GAAI",
   "names": []
 }
diff --git a/static/frontend/unit/versions/versions.min.css b/static/frontend/unit/versions/versions.min.css
new file mode 100644
index 0000000..cd47334
--- /dev/null
+++ b/static/frontend/unit/versions/versions.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+.Versions table{border-spacing:0}.Versions th{text-align:left}.Versions td{padding-bottom:1rem}.Versions td:nth-child(1){padding-right:3rem;vertical-align:top}.Versions td:nth-child(2){border-right:var(--border);padding-right:1rem;text-align:right;vertical-align:top;white-space:nowrap}.Versions td:nth-child(3){padding-left:1rem}.Versions-commitTime{font-size:1rem;font-weight:400}.Versions-major{font-weight:600}.Versions-symbols{margin-left:2rem}.Versions-symbolBulletNew{color:var(--color-text-subtle);padding-right:.5rem}.Versions-symbolBuilds,.Versions-symbolBuildsDash,.Versions-symbolOld{color:var(--color-text-subtle)}.Versions-symbolChild{padding-left:2rem}.Versions-symbolSection,.Versions-symbolType{margin-bottom:.625rem}.Versions-symbolsHeader{margin:.625rem 0}.Versions-title{align-items:center;display:flex;flex-wrap:wrap;gap:1rem 2.5rem;margin-bottom:1rem}.Versions-titleButtonGroup{display:none}.Versions-titleButtonGroup button{font-size:.875rem}.Versions-modulesTitle{font-size:1rem;margin:1rem 0}.Versions-list{gap:0 1rem;line-height:2.25rem}@media only screen and (min-width: 37.5rem){.Versions-list{display:grid;grid-template-columns:fit-content(8rem) fit-content(20rem) min-content auto}}.Version-major{align-items:baseline;display:flex;gap:1rem;margin-bottom:1rem;min-width:4rem}@media only screen and (min-width: 37.5rem){.Version-major{margin-bottom:0}}.Version-tag{text-align:left}@media only screen and (min-width: 37.5rem){.Version-tag{text-align:right}}.Version-dot{border:var(--border);color:var(--gray-7);display:none;font-size:2.75rem;justify-content:center;line-height:1.75rem;-webkit-text-stroke:.125rem var(--color-background);width:0}.Version-dot:before{content:"\2022"}@media only screen and (min-width: 37.5rem){.Version-dot{display:flex}}.Version-dot--minor{color:var(--color-brand-primary)}.Version-commitTime{align-items:center;display:flex;gap:.75rem;margin-left:1rem;white-space:nowrap}.Version-details{line-height:1.25rem}.Version-summary{align-items:center;cursor:pointer;line-height:2.25rem;padding-right:.5rem;white-space:nowrap;width:min-content}.Version-summary .go-Chip{margin-left:.5rem}
+/*# sourceMappingURL=versions.min.css.map */
diff --git a/static/frontend/unit/versions/versions.min.css.map b/static/frontend/unit/versions/versions.min.css.map
new file mode 100644
index 0000000..18469a1
--- /dev/null
+++ b/static/frontend/unit/versions/versions.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["versions.css"],
+  "sourcesContent": ["/*\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.Versions table {\n  border-spacing: 0;\n}\n.Versions th {\n  text-align: left;\n}\n.Versions td {\n  padding-bottom: 1rem;\n}\n.Versions td:nth-child(1) {\n  padding-right: 3rem;\n  vertical-align: top;\n}\n.Versions td:nth-child(2) {\n  border-right: var(--border);\n  padding-right: 1rem;\n  text-align: right;\n  vertical-align: top;\n  white-space: nowrap;\n}\n.Versions td:nth-child(3) {\n  padding-left: 1rem;\n}\n.Versions-commitTime {\n  font-size: 1rem;\n  font-weight: 400;\n}\n.Versions-major {\n  font-weight: 600;\n}\n.Versions-symbols {\n  margin-left: 2rem;\n}\n.Versions-symbolBulletNew {\n  color: var(--color-text-subtle);\n  padding-right: 0.5rem;\n}\n.Versions-symbolBuilds,\n.Versions-symbolBuildsDash,\n.Versions-symbolOld {\n  color: var(--color-text-subtle);\n}\n.Versions-symbolChild {\n  padding-left: 2rem;\n}\n.Versions-symbolSection,\n.Versions-symbolType {\n  margin-bottom: 0.625rem;\n}\n.Versions-symbolsHeader {\n  margin: 0.625rem 0;\n}\n\n.Versions-title {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 1rem 2.5rem;\n  margin-bottom: 1rem;\n}\n.Versions-titleButtonGroup {\n  display: none;\n}\n.Versions-titleButtonGroup button {\n  font-size: 0.875rem;\n}\n.Versions-modulesTitle {\n  font-size: 1rem;\n  margin: 1rem 0;\n}\n.Versions-list {\n  gap: 0 1rem;\n  line-height: 2.25rem;\n}\n@media only screen and (min-width: 37.5rem) {\n  .Versions-list {\n    display: grid;\n    grid-template-columns: fit-content(8rem) fit-content(20rem) min-content auto;\n  }\n}\n.Version-major {\n  align-items: baseline;\n  display: flex;\n  gap: 1rem;\n  margin-bottom: 1rem;\n  min-width: 4rem;\n}\n@media only screen and (min-width: 37.5rem) {\n  .Version-major {\n    margin-bottom: 0;\n  }\n}\n.Version-tag {\n  text-align: left;\n}\n@media only screen and (min-width: 37.5rem) {\n  .Version-tag {\n    text-align: right;\n  }\n}\n.Version-dot {\n  border: var(--border);\n  color: var(--gray-7);\n  display: none;\n  font-size: 2.75rem;\n  justify-content: center;\n  line-height: 1.75rem;\n  -webkit-text-stroke: 0.125rem var(--color-background);\n  width: 0;\n}\n.Version-dot::before {\n  content: '\u2022';\n}\n@media only screen and (min-width: 37.5rem) {\n  .Version-dot {\n    display: flex;\n  }\n}\n.Version-dot--minor {\n  color: var(--color-brand-primary);\n}\n.Version-commitTime {\n  align-items: center;\n  display: flex;\n  gap: 0.75rem;\n  margin-left: 1rem;\n  white-space: nowrap;\n}\n.Version-details {\n  line-height: 1.25rem;\n}\n.Version-summary {\n  align-items: center;\n  cursor: pointer;\n  line-height: 2.25rem;\n  padding-right: 0.5rem;\n  white-space: nowrap;\n  width: min-content;\n}\n.Version-summary .go-Chip {\n  margin-left: 0.5rem;\n}\n"],
+  "mappings": ";;;;;AAMA,gBACE,iBAEF,aACE,gBAEF,aACE,oBAEF,0BACE,mBACA,mBAEF,0BACE,2BACA,mBACA,iBACA,mBACA,mBAEF,0BACE,kBAEF,qBACE,eACA,gBAEF,gBACE,gBAEF,kBACE,iBAEF,0BACE,+BACA,oBAEF,sEAGE,+BAEF,sBACE,kBAEF,6CAEE,sBAEF,wBAvDA,iBA2DA,gBACE,mBACA,aACA,eACA,gBACA,mBAEF,2BACE,aAEF,kCACE,kBAEF,uBACE,eAzEF,cA4EA,eACE,WACA,oBAEF,4CACE,eACE,aACA,6EAGJ,eACE,qBACA,aACA,SACA,mBACA,eAEF,4CACE,eACE,iBAGJ,aACE,gBAEF,4CACE,aACE,kBAGJ,aACE,qBACA,oBACA,aACA,kBACA,uBACA,oBACA,oDACA,QAEF,oBACE,gBAEF,4CACE,aACE,cAGJ,oBACE,iCAEF,oBACE,mBACA,aACA,WACA,iBACA,mBAEF,iBACE,oBAEF,iBACE,mBACA,eACA,oBACA,oBACA,mBACA,kBAEF,0BACE",
+  "names": []
+}
diff --git a/static/frontend/unit/versions/versions.tmpl b/static/frontend/unit/versions/versions.tmpl
index 02b28c9..4b8827b 100644
--- a/static/frontend/unit/versions/versions.tmpl
+++ b/static/frontend/unit/versions/versions.tmpl
@@ -9,7 +9,7 @@
 {{end}}
 
 {{define "main-styles"}}
-  <link href="/static/frontend/unit/versions/versions.css?version={{.AppVersionLabel}}" rel="stylesheet">
+  <link href="/static/frontend/unit/versions/versions.min.css?version={{.AppVersionLabel}}" rel="stylesheet">
 {{end}}
 
 {{define "main-header"}}
diff --git a/static/shared/analytics/analytics.js b/static/shared/analytics/analytics.js
index 3e7ec48..3d6672f 100644
--- a/static/shared/analytics/analytics.js
+++ b/static/shared/analytics/analytics.js
@@ -1,2 +1,2 @@
-export function track(n,a,t,e){window.dataLayer??=[],typeof n=="string"?window.dataLayer.push({event:n,event_category:a,event_action:t,event_label:e}):window.dataLayer.push(n)}export function func(n){window.dataLayer??=[],window.dataLayer.push(n)}
+export function track(n,a,e,r){var t;(t=window.dataLayer)!=null||(window.dataLayer=[]),typeof n=="string"?window.dataLayer.push({event:n,event_category:a,event_action:e,event_label:r}):window.dataLayer.push(n)}export function func(n){var a;(a=window.dataLayer)!=null||(window.dataLayer=[]),window.dataLayer.push(n)}
 //# sourceMappingURL=analytics.js.map
diff --git a/static/shared/analytics/analytics.js.map b/static/shared/analytics/analytics.js.map
index 7c619fb..9ac8123 100644
--- a/static/shared/analytics/analytics.js.map
+++ b/static/shared/analytics/analytics.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["analytics.ts"],
   "sourcesContent": ["interface TagManagerEvent {\n  /**\n   * event is the name of the event, used to filter events in\n   * Google Analytics.\n   */\n  event: string;\n\n  /**\n   * event_category is a name that you supply as a way to group objects\n   * that to analyze. Typically, you will use the same category name\n   * multiple times over related UI elements (buttons, links, etc).\n   */\n  event_category?: string;\n\n  /**\n   * event_action is used to name the type of event or interaction you\n   * want to measure for a particular web object. For example, with a\n   * single \"form\" category, you can analyze a number of specific events\n   * with this parameter, such as: form entered, form submitted.\n   */\n  event_action?: string;\n\n  /**\n   * event_label provide additional information for events that you want\n   * to analyze, such as the text label of a link.\n   */\n  event_label?: string;\n\n  /**\n   * gtm.start is used to initialize Google Tag Manager.\n   */\n  'gtm.start'?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ndeclare global {\n  interface Window {\n    dataLayer?: (TagManagerEvent | VoidFunction)[];\n    ga?: unknown;\n  }\n}\n\n/**\n * track sends events to Google Tag Manager.\n */\nexport function track(\n  event: string | TagManagerEvent,\n  category?: string,\n  action?: string,\n  label?: string\n): void {\n  window.dataLayer ??= [];\n  if (typeof event === 'string') {\n    window.dataLayer.push({\n      event,\n      event_category: category,\n      event_action: action,\n      event_label: label,\n    });\n  } else {\n    window.dataLayer.push(event);\n  }\n}\n\n/**\n * func adds functions to run sequentionally after\n * Google Tag Manager is ready.\n */\nexport function func(fn: () => void): void {\n  window.dataLayer ??= [];\n  window.dataLayer.push(fn);\n}\n"],
-  "mappings": "AA6CO,sBACL,EACA,EACA,EACA,EACM,CACN,OAAO,YAAc,GACrB,AAAI,MAAO,IAAU,SACnB,OAAO,UAAU,KAAK,CACpB,QACA,eAAgB,EAChB,aAAc,EACd,YAAa,IAGf,OAAO,UAAU,KAAK,GAQnB,qBAAc,EAAsB,CACzC,OAAO,YAAc,GACrB,OAAO,UAAU,KAAK",
+  "mappings": "AA6CO,sBACL,EACA,EACA,EACA,EACM,CAlDR,MAmDE,UAAO,YAAP,cAAO,UAAc,IACrB,AAAI,MAAO,IAAU,SACnB,OAAO,UAAU,KAAK,CACpB,QACA,eAAgB,EAChB,aAAc,EACd,YAAa,IAGf,OAAO,UAAU,KAAK,GAQnB,qBAAc,EAAsB,CApE3C,MAqEE,UAAO,YAAP,cAAO,UAAc,IACrB,OAAO,UAAU,KAAK",
   "names": []
 }
diff --git a/static/shared/clipboard/clipboard.js b/static/shared/clipboard/clipboard.js
index 64497f0..2de595f 100644
--- a/static/shared/clipboard/clipboard.js
+++ b/static/shared/clipboard/clipboard.js
@@ -3,5 +3,5 @@
  * Copyright 2021 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */export class ClipboardController{constructor(t){this.el=t;this.data=t.dataset.toCopy??t.innerText,!this.data&&t.parentElement?.classList.contains("go-InputGroup")&&(this.data=(this.data||t.parentElement?.querySelector("input")?.value)??""),t.addEventListener("click",e=>this.handleCopyClick(e))}handleCopyClick(t){t.preventDefault();const e=1e3;if(!navigator.clipboard){this.showTooltipText("Unable to copy",e);return}navigator.clipboard.writeText(this.data).then(()=>{this.showTooltipText("Copied!",e)}).catch(()=>{this.showTooltipText("Unable to copy",e)})}showTooltipText(t,e){this.el.setAttribute("data-tooltip",t),setTimeout(()=>this.el.setAttribute("data-tooltip",""),e)}}
+ */export class ClipboardController{constructor(t){this.el=t;var e,o,i,a,s;this.data=(e=t.dataset.toCopy)!=null?e:t.innerText,!this.data&&((o=t.parentElement)==null?void 0:o.classList.contains("go-InputGroup"))&&(this.data=(s=this.data||((a=(i=t.parentElement)==null?void 0:i.querySelector("input"))==null?void 0:a.value))!=null?s:""),t.addEventListener("click",n=>this.handleCopyClick(n))}handleCopyClick(t){t.preventDefault();const e=1e3;if(!navigator.clipboard){this.showTooltipText("Unable to copy",e);return}navigator.clipboard.writeText(this.data).then(()=>{this.showTooltipText("Copied!",e)}).catch(()=>{this.showTooltipText("Unable to copy",e)})}showTooltipText(t,e){this.el.setAttribute("data-tooltip",t),setTimeout(()=>this.el.setAttribute("data-tooltip",""),e)}}
 //# sourceMappingURL=clipboard.js.map
diff --git a/static/shared/clipboard/clipboard.js.map b/static/shared/clipboard/clipboard.js.map
index f443a4e..d29f136 100644
--- a/static/shared/clipboard/clipboard.js.map
+++ b/static/shared/clipboard/clipboard.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["clipboard.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * This class decorates an element to copy arbitrary data attached via a data-\n * attribute to the clipboard.\n */\nexport class ClipboardController {\n  /**\n   * The data to be copied to the clipboard.\n   */\n  private data: string;\n\n  /**\n   * @param el The element that will trigger copying text to the clipboard. The text is\n   * expected to be within its data-to-copy attribute.\n   */\n  constructor(private el: HTMLButtonElement) {\n    this.data = el.dataset['toCopy'] ?? el.innerText;\n    // if data-to-copy is empty and the button is part of an input group\n    // capture the value of the input.\n    if (!this.data && el.parentElement?.classList.contains('go-InputGroup')) {\n      this.data = (this.data || el.parentElement?.querySelector('input')?.value) ?? '';\n    }\n    el.addEventListener('click', e => this.handleCopyClick(e));\n  }\n\n  /**\n   * Handles when the primary element is clicked.\n   */\n  handleCopyClick(e: MouseEvent): void {\n    e.preventDefault();\n    const TOOLTIP_SHOW_DURATION_MS = 1000;\n\n    // This API is not available on iOS.\n    if (!navigator.clipboard) {\n      this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      return;\n    }\n    navigator.clipboard\n      .writeText(this.data)\n      .then(() => {\n        this.showTooltipText('Copied!', TOOLTIP_SHOW_DURATION_MS);\n      })\n      .catch(() => {\n        this.showTooltipText('Unable to copy', TOOLTIP_SHOW_DURATION_MS);\n      });\n  }\n\n  /**\n   * Shows the given text in a tooltip for a specified amount of time, in milliseconds.\n   */\n  showTooltipText(text: string, durationMs: number): void {\n    this.el.setAttribute('data-tooltip', text);\n    setTimeout(() => this.el.setAttribute('data-tooltip', ''), durationMs);\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWO,gCAA0B,CAU/B,YAAoB,EAAuB,CAAvB,UAClB,KAAK,KAAO,EAAG,QAAQ,QAAa,EAAG,UAGnC,CAAC,KAAK,MAAQ,EAAG,eAAe,UAAU,SAAS,kBACrD,MAAK,KAAQ,MAAK,MAAQ,EAAG,eAAe,cAAc,UAAU,QAAU,IAEhF,EAAG,iBAAiB,QAAS,GAAK,KAAK,gBAAgB,IAMzD,gBAAgB,EAAqB,CACnC,EAAE,iBACF,KAAM,GAA2B,IAGjC,GAAI,CAAC,UAAU,UAAW,CACxB,KAAK,gBAAgB,iBAAkB,GACvC,OAEF,UAAU,UACP,UAAU,KAAK,MACf,KAAK,IAAM,CACV,KAAK,gBAAgB,UAAW,KAEjC,MAAM,IAAM,CACX,KAAK,gBAAgB,iBAAkB,KAO7C,gBAAgB,EAAc,EAA0B,CACtD,KAAK,GAAG,aAAa,eAAgB,GACrC,WAAW,IAAM,KAAK,GAAG,aAAa,eAAgB,IAAK",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWO,gCAA0B,CAU/B,YAAoB,EAAuB,CAAvB,UArBtB,cAsBI,KAAK,KAAO,KAAG,QAAQ,SAAX,OAAwB,EAAG,UAGnC,CAAC,KAAK,MAAQ,MAAG,gBAAH,cAAkB,UAAU,SAAS,mBACrD,MAAK,KAAQ,QAAK,MAAQ,SAAG,gBAAH,cAAkB,cAAc,WAAhC,cAA0C,SAAvD,OAAiE,IAEhF,EAAG,iBAAiB,QAAS,GAAK,KAAK,gBAAgB,IAMzD,gBAAgB,EAAqB,CACnC,EAAE,iBACF,KAAM,GAA2B,IAGjC,GAAI,CAAC,UAAU,UAAW,CACxB,KAAK,gBAAgB,iBAAkB,GACvC,OAEF,UAAU,UACP,UAAU,KAAK,MACf,KAAK,IAAM,CACV,KAAK,gBAAgB,UAAW,KAEjC,MAAM,IAAM,CACX,KAAK,gBAAgB,iBAAkB,KAO7C,gBAAgB,EAAc,EAA0B,CACtD,KAAK,GAAG,aAAa,eAAgB,GACrC,WAAW,IAAM,KAAK,GAAG,aAAa,eAAgB,IAAK",
   "names": []
 }
diff --git a/static/shared/header/header.js b/static/shared/header/header.js
index 3383989..32def56 100644
--- a/static/shared/header/header.js
+++ b/static/shared/header/header.js
@@ -1,2 +1,2 @@
-function registerHeaderListeners(){const e=document.querySelector(".js-header"),r=document.querySelectorAll(".js-headerMenuButton");r.forEach(t=>{t.addEventListener("click",s=>{s.preventDefault(),e?.classList.toggle("is-active"),t.setAttribute("aria-expanded",String(e?.classList.contains("is-active")))})}),document.querySelector(".js-scrim")?.addEventListener("click",t=>{t.preventDefault(),e?.classList.remove("is-active"),r.forEach(s=>{s.setAttribute("aria-expanded",String(e?.classList.contains("is-active")))})})}function registerSearchFormListeners(){const e=document.querySelector(".js-searchForm"),r=document.querySelector(".js-expandSearch"),c=e?.querySelector("input"),t=document.querySelector(".js-headerLogo"),s=document.querySelector(".js-headerMenuButton");r?.addEventListener("click",()=>{e?.classList.add("go-SearchForm--expanded"),t?.classList.add("go-Header-logo--hidden"),s?.classList.add("go-Header-navOpen--hidden"),c?.focus()}),document?.addEventListener("click",n=>{e?.contains(n.target)||(e?.classList.remove("go-SearchForm--expanded"),t?.classList.remove("go-Header-logo--hidden"),s?.classList.remove("go-Header-navOpen--hidden"))})}registerHeaderListeners(),registerSearchFormListeners();
+function registerHeaderListeners(){const e=document.querySelector(".js-header"),n=document.querySelectorAll(".js-headerMenuButton");n.forEach(t=>{t.addEventListener("click",s=>{s.preventDefault(),e==null||e.classList.toggle("is-active"),t.setAttribute("aria-expanded",String(e==null?void 0:e.classList.contains("is-active")))})});const c=document.querySelector(".js-scrim");c==null||c.addEventListener("click",t=>{t.preventDefault(),e==null||e.classList.remove("is-active"),n.forEach(s=>{s.setAttribute("aria-expanded",String(e==null?void 0:e.classList.contains("is-active")))})})}function registerSearchFormListeners(){const e=document.querySelector(".js-searchForm"),n=document.querySelector(".js-expandSearch"),c=e==null?void 0:e.querySelector("input"),t=document.querySelector(".js-headerLogo"),s=document.querySelector(".js-headerMenuButton");n==null||n.addEventListener("click",()=>{e==null||e.classList.add("go-SearchForm--expanded"),t==null||t.classList.add("go-Header-logo--hidden"),s==null||s.classList.add("go-Header-navOpen--hidden"),c==null||c.focus()}),document==null||document.addEventListener("click",i=>{(e==null?void 0:e.contains(i.target))||(e==null||e.classList.remove("go-SearchForm--expanded"),t==null||t.classList.remove("go-Header-logo--hidden"),s==null||s.classList.remove("go-Header-navOpen--hidden"))})}registerHeaderListeners(),registerSearchFormListeners();
 //# sourceMappingURL=header.js.map
diff --git a/static/shared/header/header.js.map b/static/shared/header/header.js.map
index 6a62054..e2684d2 100644
--- a/static/shared/header/header.js.map
+++ b/static/shared/header/header.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["header.ts"],
   "sourcesContent": ["function registerHeaderListeners() {\n  const header = document.querySelector('.js-header');\n  const menuButtons = document.querySelectorAll('.js-headerMenuButton');\n  menuButtons.forEach(button => {\n    button.addEventListener('click', e => {\n      e.preventDefault();\n      header?.classList.toggle('is-active');\n      button.setAttribute('aria-expanded', String(header?.classList.contains('is-active')));\n    });\n  });\n\n  const scrim = document.querySelector('.js-scrim');\n  scrim?.addEventListener('click', e => {\n    e.preventDefault();\n    header?.classList.remove('is-active');\n    menuButtons.forEach(button => {\n      button.setAttribute('aria-expanded', String(header?.classList.contains('is-active')));\n    });\n  });\n}\n\nfunction registerSearchFormListeners() {\n  const searchForm = document.querySelector('.js-searchForm');\n  const expandSearch = document.querySelector('.js-expandSearch');\n  const input = searchForm?.querySelector('input');\n  const headerLogo = document.querySelector('.js-headerLogo');\n  const menuButton = document.querySelector('.js-headerMenuButton');\n  expandSearch?.addEventListener('click', () => {\n    searchForm?.classList.add('go-SearchForm--expanded');\n    headerLogo?.classList.add('go-Header-logo--hidden');\n    menuButton?.classList.add('go-Header-navOpen--hidden');\n    input?.focus();\n  });\n  document?.addEventListener('click', e => {\n    if (!searchForm?.contains(e.target as Node)) {\n      searchForm?.classList.remove('go-SearchForm--expanded');\n      headerLogo?.classList.remove('go-Header-logo--hidden');\n      menuButton?.classList.remove('go-Header-navOpen--hidden');\n    }\n  });\n}\n\nregisterHeaderListeners();\nregisterSearchFormListeners();\n"],
-  "mappings": "AAAA,kCAAmC,CACjC,KAAM,GAAS,SAAS,cAAc,cAChC,EAAc,SAAS,iBAAiB,wBAC9C,EAAY,QAAQ,GAAU,CAC5B,EAAO,iBAAiB,QAAS,GAAK,CACpC,EAAE,iBACF,GAAQ,UAAU,OAAO,aACzB,EAAO,aAAa,gBAAiB,OAAO,GAAQ,UAAU,SAAS,mBAK3E,AADc,SAAS,cAAc,cAC9B,iBAAiB,QAAS,GAAK,CACpC,EAAE,iBACF,GAAQ,UAAU,OAAO,aACzB,EAAY,QAAQ,GAAU,CAC5B,EAAO,aAAa,gBAAiB,OAAO,GAAQ,UAAU,SAAS,mBAK7E,sCAAuC,CACrC,KAAM,GAAa,SAAS,cAAc,kBACpC,EAAe,SAAS,cAAc,oBACtC,EAAQ,GAAY,cAAc,SAClC,EAAa,SAAS,cAAc,kBACpC,EAAa,SAAS,cAAc,wBAC1C,GAAc,iBAAiB,QAAS,IAAM,CAC5C,GAAY,UAAU,IAAI,2BAC1B,GAAY,UAAU,IAAI,0BAC1B,GAAY,UAAU,IAAI,6BAC1B,GAAO,UAET,UAAU,iBAAiB,QAAS,GAAK,CACvC,AAAK,GAAY,SAAS,EAAE,SAC1B,IAAY,UAAU,OAAO,2BAC7B,GAAY,UAAU,OAAO,0BAC7B,GAAY,UAAU,OAAO,gCAKnC,0BACA",
+  "mappings": "AAAA,kCAAmC,CACjC,KAAM,GAAS,SAAS,cAAc,cAChC,EAAc,SAAS,iBAAiB,wBAC9C,EAAY,QAAQ,GAAU,CAC5B,EAAO,iBAAiB,QAAS,GAAK,CACpC,EAAE,iBACF,WAAQ,UAAU,OAAO,aACzB,EAAO,aAAa,gBAAiB,OAAO,iBAAQ,UAAU,SAAS,mBAI3E,KAAM,GAAQ,SAAS,cAAc,aACrC,WAAO,iBAAiB,QAAS,GAAK,CACpC,EAAE,iBACF,WAAQ,UAAU,OAAO,aACzB,EAAY,QAAQ,GAAU,CAC5B,EAAO,aAAa,gBAAiB,OAAO,iBAAQ,UAAU,SAAS,mBAK7E,sCAAuC,CACrC,KAAM,GAAa,SAAS,cAAc,kBACpC,EAAe,SAAS,cAAc,oBACtC,EAAQ,iBAAY,cAAc,SAClC,EAAa,SAAS,cAAc,kBACpC,EAAa,SAAS,cAAc,wBAC1C,WAAc,iBAAiB,QAAS,IAAM,CAC5C,WAAY,UAAU,IAAI,2BAC1B,WAAY,UAAU,IAAI,0BAC1B,WAAY,UAAU,IAAI,6BAC1B,WAAO,UAET,yBAAU,iBAAiB,QAAS,GAAK,CACvC,AAAK,kBAAY,SAAS,EAAE,UAC1B,YAAY,UAAU,OAAO,2BAC7B,WAAY,UAAU,OAAO,0BAC7B,WAAY,UAAU,OAAO,gCAKnC,0BACA",
   "names": []
 }
diff --git a/static/shared/jump/jump.js b/static/shared/jump/jump.js
index fbb804a..0ba869e 100644
--- a/static/shared/jump/jump.js
+++ b/static/shared/jump/jump.js
@@ -3,5 +3,5 @@
  * Copyright 2019-2020 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */const jumpDialog=document.querySelector(".JumpDialog"),jumpBody=jumpDialog?.querySelector(".JumpDialog-body"),jumpList=jumpDialog?.querySelector(".JumpDialog-list"),jumpFilter=jumpDialog?.querySelector(".JumpDialog-input"),doc=document.querySelector(".js-documentation");let jumpListItems;function collectJumpListItems(){const t=[];if(!!doc){for(const e of doc.querySelectorAll("[data-kind]"))t.push(newJumpListItem(e));for(const e of t)e.link.addEventListener("click",function(){jumpDialog?.close()});return t.sort(function(e,n){return e.lower.localeCompare(n.lower)}),t}}function newJumpListItem(t){const e=document.createElement("a"),n=t.getAttribute("id");e.setAttribute("href","#"+n),e.setAttribute("tabindex","-1"),e.setAttribute("data-gtmc","jump to link");const o=t.getAttribute("data-kind");return{link:e,name:n??"",kind:o??"",lower:n?.toLowerCase()??""}}let lastFilterValue,activeJumpItem=-1;function updateJumpList(t){for(lastFilterValue=t,jumpListItems||(jumpListItems=collectJumpListItems()),setActiveJumpItem(-1);jumpList?.firstChild;)jumpList.firstChild.remove();if(t){const e=t.toLowerCase(),n=[],o=[],l=[],c=(i,s,r)=>i.name.substring(0,s)+"<b>"+i.name.substring(s,r)+"</b>"+i.name.substring(r);for(const i of jumpListItems??[]){const s=i.name.toLowerCase();if(s===e)i.link.innerHTML=c(i,0,i.name.length),n.push(i);else if(s.startsWith(e))i.link.innerHTML=c(i,0,t.length),o.push(i);else{const r=s.indexOf(e);r>-1&&(i.link.innerHTML=c(i,r,r+t.length),l.push(i))}}for(const i of n.concat(o).concat(l))jumpList?.appendChild(i.link)}else{if(!jumpListItems||jumpListItems.length===0){const e=document.createElement("i");e.innerHTML="There are no symbols on this page.",jumpList?.appendChild(e)}for(const e of jumpListItems??[])e.link.innerHTML=e.name+" <i>"+e.kind+"</i>",jumpList?.appendChild(e.link)}jumpBody&&(jumpBody.scrollTop=0),jumpListItems?.length&&jumpList&&jumpList.children.length>0&&setActiveJumpItem(0)}function setActiveJumpItem(t){const e=jumpList?.children;if(!(!e||!jumpBody)){if(activeJumpItem>=0&&e[activeJumpItem].classList.remove("JumpDialog-active"),t>=e.length&&(t=e.length-1),t>=0){e[t].classList.add("JumpDialog-active");const n=e[t].offsetTop-e[0].offsetTop,o=n+e[t].clientHeight;n<jumpBody.scrollTop?jumpBody.scrollTop=n:o>jumpBody.scrollTop+jumpBody.clientHeight&&(jumpBody.scrollTop=o-jumpBody.clientHeight)}activeJumpItem=t}}function incActiveJumpItem(t){if(activeJumpItem<0)return;let e=activeJumpItem+t;e<0&&(e=0),setActiveJumpItem(e)}jumpFilter?.addEventListener("keyup",function(){jumpFilter.value.toUpperCase()!=lastFilterValue.toUpperCase()&&updateJumpList(jumpFilter.value)}),jumpFilter?.addEventListener("keydown",function(t){const e=38,n=40,o=13;switch(t.which){case e:incActiveJumpItem(-1),t.preventDefault();break;case n:incActiveJumpItem(1),t.preventDefault();break;case o:activeJumpItem>=0&&jumpList&&(jumpList.children[activeJumpItem].click(),t.preventDefault());break}});const shortcutsDialog=document.querySelector(".ShortcutsDialog");document.addEventListener("keypress",function(t){if(jumpDialog?.open||shortcutsDialog?.open)return;const e=t.target,n=e?.tagName;if(n=="INPUT"||n=="SELECT"||n=="TEXTAREA"||e?.contentEditable=="true"||t.metaKey||t.ctrlKey)return;switch(String.fromCharCode(t.which)){case"f":case"F":t.preventDefault(),jumpFilter&&(jumpFilter.value=""),jumpDialog?.showModal(),jumpFilter?.focus(),updateJumpList("");break;case"?":shortcutsDialog?.showModal();break}});const jumpOutlineInput=document.querySelector(".js-jumpToInput");jumpOutlineInput&&jumpOutlineInput.addEventListener("click",()=>{jumpFilter&&(jumpFilter.value=""),updateJumpList("")});
+ */const jumpDialog=document.querySelector(".JumpDialog"),jumpBody=jumpDialog==null?void 0:jumpDialog.querySelector(".JumpDialog-body"),jumpList=jumpDialog==null?void 0:jumpDialog.querySelector(".JumpDialog-list"),jumpFilter=jumpDialog==null?void 0:jumpDialog.querySelector(".JumpDialog-input"),doc=document.querySelector(".js-documentation");let jumpListItems;function collectJumpListItems(){const t=[];if(!!doc){for(const e of doc.querySelectorAll("[data-kind]"))t.push(newJumpListItem(e));for(const e of t)e.link.addEventListener("click",function(){jumpDialog==null||jumpDialog.close()});return t.sort(function(e,n){return e.lower.localeCompare(n.lower)}),t}}function newJumpListItem(t){var s;const e=document.createElement("a"),n=t.getAttribute("id");e.setAttribute("href","#"+n),e.setAttribute("tabindex","-1"),e.setAttribute("data-gtmc","jump to link");const c=t.getAttribute("data-kind");return{link:e,name:n!=null?n:"",kind:c!=null?c:"",lower:(s=n==null?void 0:n.toLowerCase())!=null?s:""}}let lastFilterValue,activeJumpItem=-1;function updateJumpList(t){for(lastFilterValue=t,jumpListItems||(jumpListItems=collectJumpListItems()),setActiveJumpItem(-1);jumpList==null?void 0:jumpList.firstChild;)jumpList.firstChild.remove();if(t){const e=t.toLowerCase(),n=[],c=[],s=[],l=(o,i,r)=>o.name.substring(0,i)+"<b>"+o.name.substring(i,r)+"</b>"+o.name.substring(r);for(const o of jumpListItems!=null?jumpListItems:[]){const i=o.name.toLowerCase();if(i===e)o.link.innerHTML=l(o,0,o.name.length),n.push(o);else if(i.startsWith(e))o.link.innerHTML=l(o,0,t.length),c.push(o);else{const r=i.indexOf(e);r>-1&&(o.link.innerHTML=l(o,r,r+t.length),s.push(o))}}for(const o of n.concat(c).concat(s))jumpList==null||jumpList.appendChild(o.link)}else{if(!jumpListItems||jumpListItems.length===0){const e=document.createElement("i");e.innerHTML="There are no symbols on this page.",jumpList==null||jumpList.appendChild(e)}for(const e of jumpListItems!=null?jumpListItems:[])e.link.innerHTML=e.name+" <i>"+e.kind+"</i>",jumpList==null||jumpList.appendChild(e.link)}jumpBody&&(jumpBody.scrollTop=0),(jumpListItems==null?void 0:jumpListItems.length)&&jumpList&&jumpList.children.length>0&&setActiveJumpItem(0)}function setActiveJumpItem(t){const e=jumpList==null?void 0:jumpList.children;if(!(!e||!jumpBody)){if(activeJumpItem>=0&&e[activeJumpItem].classList.remove("JumpDialog-active"),t>=e.length&&(t=e.length-1),t>=0){e[t].classList.add("JumpDialog-active");const n=e[t].offsetTop-e[0].offsetTop,c=n+e[t].clientHeight;n<jumpBody.scrollTop?jumpBody.scrollTop=n:c>jumpBody.scrollTop+jumpBody.clientHeight&&(jumpBody.scrollTop=c-jumpBody.clientHeight)}activeJumpItem=t}}function incActiveJumpItem(t){if(activeJumpItem<0)return;let e=activeJumpItem+t;e<0&&(e=0),setActiveJumpItem(e)}jumpFilter==null||jumpFilter.addEventListener("keyup",function(){jumpFilter.value.toUpperCase()!=lastFilterValue.toUpperCase()&&updateJumpList(jumpFilter.value)}),jumpFilter==null||jumpFilter.addEventListener("keydown",function(t){const e=38,n=40,c=13;switch(t.which){case e:incActiveJumpItem(-1),t.preventDefault();break;case n:incActiveJumpItem(1),t.preventDefault();break;case c:activeJumpItem>=0&&jumpList&&(jumpList.children[activeJumpItem].click(),t.preventDefault());break}});const shortcutsDialog=document.querySelector(".ShortcutsDialog");document.addEventListener("keypress",function(t){if((jumpDialog==null?void 0:jumpDialog.open)||(shortcutsDialog==null?void 0:shortcutsDialog.open))return;const e=t.target,n=e==null?void 0:e.tagName;if(n=="INPUT"||n=="SELECT"||n=="TEXTAREA"||(e==null?void 0:e.contentEditable)=="true"||t.metaKey||t.ctrlKey)return;switch(String.fromCharCode(t.which)){case"f":case"F":t.preventDefault(),jumpFilter&&(jumpFilter.value=""),jumpDialog==null||jumpDialog.showModal(),jumpFilter==null||jumpFilter.focus(),updateJumpList("");break;case"?":shortcutsDialog==null||shortcutsDialog.showModal();break}});const jumpOutlineInput=document.querySelector(".js-jumpToInput");jumpOutlineInput&&jumpOutlineInput.addEventListener("click",()=>{jumpFilter&&(jumpFilter.value=""),updateJumpList("")});
 //# sourceMappingURL=jump.js.map
diff --git a/static/shared/jump/jump.js.map b/static/shared/jump/jump.js.map
index 8e16031..bb09039 100644
--- a/static/shared/jump/jump.js.map
+++ b/static/shared/jump/jump.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["jump.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the behavior of the \"jump to symbol\" dialog for Go\n// package documentation, as well as the simple dialog that displays keyboard\n// shortcuts.\n\n// The DOM for the dialogs is at the bottom of static/frontend/unit/main/_modals.tmpl.\n// The CSS is in static/frontend/unit/main/_modals.css.\n\n// The dialog is activated by pressing the 'f' key. It presents a list\n// (#JumpDialog-list) of all Go symbols displayed in the documentation.\n// Entering text in the dialog's text box (#JumpDialog-filter) restricts the\n// list to symbols containing the text. Clicking on an symbol jumps to\n// its documentation.\n\n// This code is based on\n// https://go.googlesource.com/gddo/+/refs/heads/master/gddo-server/assets/site.js.\n// It was modified to remove the dependence on jquery and bootstrap.\n\nconst jumpDialog = document.querySelector<HTMLDialogElement>('.JumpDialog');\nconst jumpBody = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-body');\nconst jumpList = jumpDialog?.querySelector<HTMLDivElement>('.JumpDialog-list');\nconst jumpFilter = jumpDialog?.querySelector<HTMLInputElement>('.JumpDialog-input');\nconst doc = document.querySelector<HTMLDivElement>('.js-documentation');\n\ninterface JumpListItem {\n  link: HTMLAnchorElement;\n  name: string;\n  kind: string;\n  lower: string;\n}\n\nlet jumpListItems: JumpListItem[] | undefined; // All the symbols in the doc; computed only once.\n\n// collectJumpListItems returns a list of items, one for each symbol in the\n// documentation on the current page.\n//\n// It uses the data-kind attribute generated in the documentation HTML to find\n// the symbols and their id attributes.\n//\n// If there are no data-kind attributes, then we have older doc; fall back to\n// a less precise method.\nfunction collectJumpListItems() {\n  const items = [];\n  if (!doc) return;\n  for (const el of doc.querySelectorAll('[data-kind]')) {\n    items.push(newJumpListItem(el));\n  }\n\n  // Clicking on any of the links closes the dialog.\n  for (const item of items) {\n    item.link.addEventListener('click', function () {\n      jumpDialog?.close();\n    });\n  }\n  // Sort case-insensitively by symbol name.\n  items.sort(function (a, b) {\n    return a.lower.localeCompare(b.lower);\n  });\n  return items;\n}\n\n// newJumpListItem creates a new item for the DOM element el.\n// An item is an object with:\n// - name: the element's id (which is the symbol name)\n// - kind: the element's kind (function, variable, etc.),\n// - link: a link ('a' tag) to the element\n// - lower: the name in lower case, just for sorting\nfunction newJumpListItem(el: Element): JumpListItem {\n  const a = document.createElement('a');\n  const name = el.getAttribute('id');\n  a.setAttribute('href', '#' + name);\n  a.setAttribute('tabindex', '-1');\n  a.setAttribute('data-gtmc', 'jump to link');\n  const kind = el.getAttribute('data-kind');\n  return {\n    link: a,\n    name: name ?? '',\n    kind: kind ?? '',\n    lower: name?.toLowerCase() ?? '', // for sorting\n  };\n}\n\nlet lastFilterValue: string; // The last contents of the filter text box.\nlet activeJumpItem = -1; // The index of the currently active item in the list.\n\n// updateJumpList sets the elements of the dialog list to\n// everything whose name contains filter.\nfunction updateJumpList(filter: string) {\n  lastFilterValue = filter;\n  if (!jumpListItems) {\n    jumpListItems = collectJumpListItems();\n  }\n  setActiveJumpItem(-1);\n\n  // Remove all children from list.\n  while (jumpList?.firstChild) {\n    jumpList.firstChild.remove();\n  }\n\n  if (filter) {\n    // A filter is set. We treat the filter as a substring that can appear in\n    // an item name (case insensitive), and find the following matches - in\n    // order of priority:\n    //\n    // 1. Exact matches (the filter matches the item's name exactly)\n    // 2. Prefix matches (the item's name starts with filter)\n    // 3. Infix matches (the filter is a substring of the item's name)\n    const filterLowerCase = filter.toLowerCase();\n\n    const exactMatches = [];\n    const prefixMatches = [];\n    const infixMatches = [];\n\n    // makeLinkHtml creates the link name HTML for a list item. item is the DOM\n    // item. item.name.substr(boldStart, boldEnd) will be bolded.\n    const makeLinkHtml = (item: JumpListItem, boldStart: number, boldEnd: number) => {\n      return (\n        item.name.substring(0, boldStart) +\n        '<b>' +\n        item.name.substring(boldStart, boldEnd) +\n        '</b>' +\n        item.name.substring(boldEnd)\n      );\n    };\n\n    for (const item of jumpListItems ?? []) {\n      const nameLowerCase = item.name.toLowerCase();\n\n      if (nameLowerCase === filterLowerCase) {\n        item.link.innerHTML = makeLinkHtml(item, 0, item.name.length);\n        exactMatches.push(item);\n      } else if (nameLowerCase.startsWith(filterLowerCase)) {\n        item.link.innerHTML = makeLinkHtml(item, 0, filter.length);\n        prefixMatches.push(item);\n      } else {\n        const index = nameLowerCase.indexOf(filterLowerCase);\n        if (index > -1) {\n          item.link.innerHTML = makeLinkHtml(item, index, index + filter.length);\n          infixMatches.push(item);\n        }\n      }\n    }\n\n    for (const item of exactMatches.concat(prefixMatches).concat(infixMatches)) {\n      jumpList?.appendChild(item.link);\n    }\n  } else {\n    if (!jumpListItems || jumpListItems.length === 0) {\n      const msg = document.createElement('i');\n      msg.innerHTML = 'There are no symbols on this page.';\n      jumpList?.appendChild(msg);\n    }\n    // No filter set; display all items in their existing order.\n    for (const item of jumpListItems ?? []) {\n      item.link.innerHTML = item.name + ' <i>' + item.kind + '</i>';\n      jumpList?.appendChild(item.link);\n    }\n  }\n\n  if (jumpBody) {\n    jumpBody.scrollTop = 0;\n  }\n  if (jumpListItems?.length && jumpList && jumpList.children.length > 0) {\n    setActiveJumpItem(0);\n  }\n}\n\n// Set the active jump item to n.\nfunction setActiveJumpItem(n: number) {\n  const cs = jumpList?.children as HTMLCollectionOf<HTMLElement> | null | undefined;\n  if (!cs || !jumpBody) {\n    return;\n  }\n  if (activeJumpItem >= 0) {\n    cs[activeJumpItem].classList.remove('JumpDialog-active');\n  }\n  if (n >= cs.length) {\n    n = cs.length - 1;\n  }\n  if (n >= 0) {\n    cs[n].classList.add('JumpDialog-active');\n\n    // Scroll so the active item is visible.\n    // For some reason cs[n].scrollIntoView() doesn't behave as I'd expect:\n    // it moves the entire dialog box in the viewport.\n\n    // Get the top and bottom of the active item relative to jumpBody.\n    const activeTop = cs[n].offsetTop - cs[0].offsetTop;\n    const activeBottom = activeTop + cs[n].clientHeight;\n    if (activeTop < jumpBody.scrollTop) {\n      // Off the top; scroll up.\n      jumpBody.scrollTop = activeTop;\n    } else if (activeBottom > jumpBody.scrollTop + jumpBody.clientHeight) {\n      // Off the bottom; scroll down.\n      jumpBody.scrollTop = activeBottom - jumpBody.clientHeight;\n    }\n  }\n  activeJumpItem = n;\n}\n\n// Increment the activeJumpItem by delta.\nfunction incActiveJumpItem(delta: number) {\n  if (activeJumpItem < 0) {\n    return;\n  }\n  let n = activeJumpItem + delta;\n  if (n < 0) {\n    n = 0;\n  }\n  setActiveJumpItem(n);\n}\n\n// Pressing a key in the filter updates the list (if the filter actually changed).\njumpFilter?.addEventListener('keyup', function () {\n  if (jumpFilter.value.toUpperCase() != lastFilterValue.toUpperCase()) {\n    updateJumpList(jumpFilter.value);\n  }\n});\n\n// Pressing enter in the filter selects the first element in the list.\njumpFilter?.addEventListener('keydown', function (event) {\n  const upArrow = 38;\n  const downArrow = 40;\n  const enterKey = 13;\n  switch (event.which) {\n    case upArrow:\n      incActiveJumpItem(-1);\n      event.preventDefault();\n      break;\n    case downArrow:\n      incActiveJumpItem(1);\n      event.preventDefault();\n      break;\n    case enterKey:\n      if (activeJumpItem >= 0) {\n        if (jumpList) {\n          (jumpList.children[activeJumpItem] as HTMLElement).click();\n          event.preventDefault();\n        }\n      }\n      break;\n  }\n});\n\nconst shortcutsDialog = document.querySelector<HTMLDialogElement>('.ShortcutsDialog');\n\n// Keyboard shortcuts:\n// - Pressing '/' focuses the search box\n// - Pressing 'f' or 'F' opens the jump-to-symbol dialog.\n// - Pressing '?' opens up the shortcut dialog.\n// Ignore a keypress if a dialog is already open, or if it is pressed on a\n// component that wants to consume it.\ndocument.addEventListener('keypress', function (e) {\n  if (jumpDialog?.open || shortcutsDialog?.open) {\n    return;\n  }\n  const target = e.target as HTMLElement | null;\n  const t = target?.tagName;\n  if (t == 'INPUT' || t == 'SELECT' || t == 'TEXTAREA') {\n    return;\n  }\n  if (target?.contentEditable == 'true') {\n    return;\n  }\n  if (e.metaKey || e.ctrlKey) {\n    return;\n  }\n  const ch = String.fromCharCode(e.which);\n  switch (ch) {\n    case 'f':\n    case 'F':\n      e.preventDefault();\n      if (jumpFilter) {\n        jumpFilter.value = '';\n      }\n      jumpDialog?.showModal();\n      jumpFilter?.focus();\n      updateJumpList('');\n      break;\n    case '?':\n      shortcutsDialog?.showModal();\n      break;\n  }\n});\n\nconst jumpOutlineInput = document.querySelector('.js-jumpToInput');\nif (jumpOutlineInput) {\n  jumpOutlineInput.addEventListener('click', () => {\n    if (jumpFilter) {\n      jumpFilter.value = '';\n    }\n    updateJumpList('');\n  });\n}\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/shared/keyboard/keyboard.js b/static/shared/keyboard/keyboard.js
index 0079ef3..ae436bc 100644
--- a/static/shared/keyboard/keyboard.js
+++ b/static/shared/keyboard/keyboard.js
@@ -3,5 +3,5 @@
  * Copyright 2019-2020 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */import{track as n}from"../analytics/analytics";class s{constructor(){this.handlers={},document.addEventListener("keydown",e=>this.handleKeyPress(e))}on(e,t,r,a){return this.handlers[e]??=new Set,this.handlers[e].add({description:t,callback:r,...a}),this}handleKeyPress(e){for(const t of this.handlers[e.key.toLowerCase()]??new Set){if(t.target&&t.target!==e.target)return;const r=e.target;if(!t.target&&(r?.tagName==="INPUT"||r?.tagName==="SELECT"||r?.tagName==="TEXTAREA")||r?.isContentEditable||t.withMeta&&!(e.ctrlKey||e.metaKey)||!t.withMeta&&(e.ctrlKey||e.metaKey))return;n("keypress","hotkeys",`${e.key} pressed`,t.description),t.callback(e)}}}export const keyboard=new s;
+ */import{track as i}from"../analytics/analytics";class o{constructor(){this.handlers={},document.addEventListener("keydown",e=>this.handleKeyPress(e))}on(e,a,r,t){var n,s;return(s=(n=this.handlers)[e])!=null||(n[e]=new Set),this.handlers[e].add({description:a,callback:r,...t}),this}handleKeyPress(e){var a;for(const r of(a=this.handlers[e.key.toLowerCase()])!=null?a:new Set){if(r.target&&r.target!==e.target)return;const t=e.target;if(!r.target&&((t==null?void 0:t.tagName)==="INPUT"||(t==null?void 0:t.tagName)==="SELECT"||(t==null?void 0:t.tagName)==="TEXTAREA")||(t==null?void 0:t.isContentEditable)||r.withMeta&&!(e.ctrlKey||e.metaKey)||!r.withMeta&&(e.ctrlKey||e.metaKey))return;i("keypress","hotkeys",`${e.key} pressed`,r.description),r.callback(e)}}}export const keyboard=new o;
 //# sourceMappingURL=keyboard.js.map
diff --git a/static/shared/keyboard/keyboard.js.map b/static/shared/keyboard/keyboard.js.map
index 68fb4c2..3f256b5 100644
--- a/static/shared/keyboard/keyboard.js.map
+++ b/static/shared/keyboard/keyboard.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["keyboard.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { track } from '../analytics/analytics';\n\n/**\n * Options are keyhandler callback options.\n */\ninterface Options {\n  /**\n   * target is the element the key event should filter on. The\n   * default target is the document.\n   */\n  target?: Element;\n\n  /**\n   * withMeta specifies if the event callback should fire when\n   * the key is pressed with a meta key (ctrl, alt, etc). By\n   * default meta keypresses are ignored.\n   */\n  withMeta?: boolean;\n}\n\n/**\n * KeyHandler is the config for a keyboard event callback.\n */\ninterface KeyHandler extends Options {\n  description: string;\n  callback: (e: KeyboardEvent) => void;\n}\n\n/**\n * KeyboardController controls event callbacks for sitewide\n * keyboard events. Multiple callbacks can be registered for\n * a single key and by default the controller ignores events\n * for text input targets.\n */\nclass KeyboardController {\n  handlers: Record<string, Set<KeyHandler>>;\n\n  constructor() {\n    this.handlers = {};\n    document.addEventListener('keydown', e => this.handleKeyPress(e));\n  }\n\n  /**\n   * on registers keyboard event callbacks.\n   * @param key the key to register.\n   * @param description name of the event.\n   * @param callback event callback.\n   * @param options set target and withMeta options to override the default behaviors.\n   */\n  on(key: string, description: string, callback: (e: KeyboardEvent) => void, options?: Options) {\n    this.handlers[key] ??= new Set();\n    this.handlers[key].add({ description, callback, ...options });\n    return this;\n  }\n\n  private handleKeyPress(e: KeyboardEvent) {\n    for (const handler of this.handlers[e.key.toLowerCase()] ?? new Set()) {\n      if (handler.target && handler.target !== e.target) {\n        return;\n      }\n      const t = e.target as HTMLElement | null;\n      if (\n        !handler.target &&\n        (t?.tagName === 'INPUT' || t?.tagName === 'SELECT' || t?.tagName === 'TEXTAREA')\n      ) {\n        return;\n      }\n      if (t?.isContentEditable) {\n        return;\n      }\n      if (\n        (handler.withMeta && !(e.ctrlKey || e.metaKey)) ||\n        (!handler.withMeta && (e.ctrlKey || e.metaKey))\n      ) {\n        return;\n      }\n      track('keypress', 'hotkeys', `${e.key} pressed`, handler.description);\n      handler.callback(e);\n    }\n  }\n}\n\nexport const keyboard = new KeyboardController();\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,+CAkCA,OAAyB,CAGvB,aAAc,CACZ,KAAK,SAAW,GAChB,SAAS,iBAAiB,UAAW,GAAK,KAAK,eAAe,IAUhE,GAAG,EAAa,EAAqB,EAAsC,EAAmB,CAC5F,YAAK,SAAS,KAAS,GAAI,KAC3B,KAAK,SAAS,GAAK,IAAI,CAAE,cAAa,cAAa,IAC5C,KAGD,eAAe,EAAkB,CACvC,SAAW,KAAW,MAAK,SAAS,EAAE,IAAI,gBAAkB,GAAI,KAAO,CACrE,GAAI,EAAQ,QAAU,EAAQ,SAAW,EAAE,OACzC,OAEF,KAAM,GAAI,EAAE,OAUZ,GARE,CAAC,EAAQ,QACR,IAAG,UAAY,SAAW,GAAG,UAAY,UAAY,GAAG,UAAY,aAInE,GAAG,mBAIJ,EAAQ,UAAY,CAAE,GAAE,SAAW,EAAE,UACrC,CAAC,EAAQ,UAAa,GAAE,SAAW,EAAE,SAEtC,OAEF,EAAM,WAAY,UAAW,GAAG,EAAE,cAAe,EAAQ,aACzD,EAAQ,SAAS,KAKhB,YAAM,UAAW,GAAI",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,+CAkCA,OAAyB,CAGvB,aAAc,CACZ,KAAK,SAAW,GAChB,SAAS,iBAAiB,UAAW,GAAK,KAAK,eAAe,IAUhE,GAAG,EAAa,EAAqB,EAAsC,EAAmB,CAxDhG,QAyDI,iBAAK,UAAL,iBAAuB,GAAI,MAC3B,KAAK,SAAS,GAAK,IAAI,CAAE,cAAa,cAAa,IAC5C,KAGD,eAAe,EAAkB,CA9D3C,MA+DI,SAAW,KAAW,QAAK,SAAS,EAAE,IAAI,iBAApB,OAAsC,GAAI,KAAO,CACrE,GAAI,EAAQ,QAAU,EAAQ,SAAW,EAAE,OACzC,OAEF,KAAM,GAAI,EAAE,OAUZ,GARE,CAAC,EAAQ,QACR,mBAAG,WAAY,SAAW,kBAAG,WAAY,UAAY,kBAAG,WAAY,aAInE,kBAAG,oBAIJ,EAAQ,UAAY,CAAE,GAAE,SAAW,EAAE,UACrC,CAAC,EAAQ,UAAa,GAAE,SAAW,EAAE,SAEtC,OAEF,EAAM,WAAY,UAAW,GAAG,EAAE,cAAe,EAAQ,aACzD,EAAQ,SAAS,KAKhB,YAAM,UAAW,GAAI",
   "names": []
 }
diff --git a/static/shared/modal/modal.js b/static/shared/modal/modal.js
index 1f31c16..8bf31ad 100644
--- a/static/shared/modal/modal.js
+++ b/static/shared/modal/modal.js
@@ -3,5 +3,5 @@
  * Copyright 2021 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */export class ModalController{constructor(e){this.el=e;!window.HTMLDialogElement&&!e.showModal&&import("../../../third_party/dialog-polyfill/dialog-polyfill.esm.js").then(({default:l})=>{l.registerDialog(e)});const t=e.id,o=document.querySelector(`[aria-controls="${t}"]`);o&&o.addEventListener("click",()=>{this.el.showModal?this.el.showModal():this.el.open=!0,e.querySelector("input")?.focus()});for(const l of this.el.querySelectorAll("[data-modal-close]"))l.addEventListener("click",()=>{this.el.close?this.el.close():this.el.open=!1})}}
+ */export class ModalController{constructor(l){this.el=l;!window.HTMLDialogElement&&!l.showModal&&import("../../../third_party/dialog-polyfill/dialog-polyfill.esm.js").then(({default:e})=>{e.registerDialog(l)});const t=l.id,o=document.querySelector(`[aria-controls="${t}"]`);o&&o.addEventListener("click",()=>{var e;this.el.showModal?this.el.showModal():this.el.open=!0,(e=l.querySelector("input"))==null||e.focus()});for(const e of this.el.querySelectorAll("[data-modal-close]"))e.addEventListener("click",()=>{this.el.close?this.el.close():this.el.open=!1})}}
 //# sourceMappingURL=modal.js.map
diff --git a/static/shared/modal/modal.js.map b/static/shared/modal/modal.js.map
index 98bba02..631ebb9 100644
--- a/static/shared/modal/modal.js.map
+++ b/static/shared/modal/modal.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["modal.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * ModalController registers a dialog element with the polyfill if\n * necessary for the current browser, add adds event listeners to\n * close and open modals.\n */\nexport class ModalController {\n  constructor(private el: HTMLDialogElement) {\n    // Only load the dialog polyfill if necessary for the environment.\n    if (!window.HTMLDialogElement && !el.showModal) {\n      import('../../../third_party/dialog-polyfill/dialog-polyfill.esm.js').then(\n        ({ default: polyfill }) => {\n          polyfill.registerDialog(el);\n        }\n      );\n    }\n    const id = el.id;\n    const button = document.querySelector<HTMLButtonElement>(`[aria-controls=\"${id}\"]`);\n    if (button) {\n      button.addEventListener('click', () => {\n        if (this.el.showModal) {\n          this.el.showModal();\n        } else {\n          this.el.open = true;\n        }\n        el.querySelector('input')?.focus();\n      });\n    }\n    for (const close of this.el.querySelectorAll<HTMLButtonElement>('[data-modal-close]')) {\n      close.addEventListener('click', () => {\n        if (this.el.close) {\n          this.el.close();\n        } else {\n          this.el.open = false;\n        }\n      });\n    }\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYO,4BAAsB,CAC3B,YAAoB,EAAuB,CAAvB,UAElB,AAAI,CAAC,OAAO,mBAAqB,CAAC,EAAG,WACnC,AAAO,sEAA+D,KACpE,CAAC,CAAE,QAAS,KAAe,CACzB,EAAS,eAAe,KAI9B,KAAM,GAAK,EAAG,GACR,EAAS,SAAS,cAAiC,mBAAmB,OAC5E,AAAI,GACF,EAAO,iBAAiB,QAAS,IAAM,CACrC,AAAI,KAAK,GAAG,UACV,KAAK,GAAG,YAER,KAAK,GAAG,KAAO,GAEjB,EAAG,cAAc,UAAU,UAG/B,SAAW,KAAS,MAAK,GAAG,iBAAoC,sBAC9D,EAAM,iBAAiB,QAAS,IAAM,CACpC,AAAI,KAAK,GAAG,MACV,KAAK,GAAG,QAER,KAAK,GAAG,KAAO",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYO,4BAAsB,CAC3B,YAAoB,EAAuB,CAAvB,UAElB,AAAI,CAAC,OAAO,mBAAqB,CAAC,EAAG,WACnC,OAAO,+DAA+D,KACpE,CAAC,CAAE,QAAS,KAAe,CACzB,EAAS,eAAe,KAI9B,KAAM,GAAK,EAAG,GACR,EAAS,SAAS,cAAiC,mBAAmB,OAC5E,AAAI,GACF,EAAO,iBAAiB,QAAS,IAAM,CAzB7C,MA0BQ,AAAI,KAAK,GAAG,UACV,KAAK,GAAG,YAER,KAAK,GAAG,KAAO,GAEjB,KAAG,cAAc,WAAjB,QAA2B,UAG/B,SAAW,KAAS,MAAK,GAAG,iBAAoC,sBAC9D,EAAM,iBAAiB,QAAS,IAAM,CACpC,AAAI,KAAK,GAAG,MACV,KAAK,GAAG,QAER,KAAK,GAAG,KAAO",
   "names": []
 }
diff --git a/static/shared/outline/select.js b/static/shared/outline/select.js
index 034d952..df21f0b 100644
--- a/static/shared/outline/select.js
+++ b/static/shared/outline/select.js
@@ -3,5 +3,5 @@
  * Copyright 2021 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */export class SelectNavController{constructor(n){this.el=n;this.el.addEventListener("change",t=>{const o=t.target;let a=o.value;o.value.startsWith("/")||(a="/"+a),window.location.href=a})}}export function makeSelectNav(c){const n=document.createElement("label");n.classList.add("go-Label"),n.setAttribute("aria-label","Menu");const t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),n.appendChild(t);const o=document.createElement("optgroup");o.label="Outline",t.appendChild(o);const a={};let l;for(const e of c.treeitems){if(Number(e.depth)>4)continue;e.groupTreeitem?(l=a[e.groupTreeitem.label],l||(l=a[e.groupTreeitem.label]=document.createElement("optgroup"),l.label=e.groupTreeitem.label,t.appendChild(l))):l=o;const r=document.createElement("option");r.label=e.label,r.textContent=e.label,r.value=e.el.href.replace(window.location.origin,"").replace("/",""),l.appendChild(r)}return c.addObserver(e=>{const r=e.el.hash,s=t.querySelector(`[value$="${r}"]`)?.value;s&&(t.value=s)},50),n}
+ */export class SelectNavController{constructor(n){this.el=n;this.el.addEventListener("change",t=>{const o=t.target;let a=o.value;o.value.startsWith("/")||(a="/"+a),window.location.href=a})}}export function makeSelectNav(c){const n=document.createElement("label");n.classList.add("go-Label"),n.setAttribute("aria-label","Menu");const t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),n.appendChild(t);const o=document.createElement("optgroup");o.label="Outline",t.appendChild(o);const a={};let l;for(const e of c.treeitems){if(Number(e.depth)>4)continue;e.groupTreeitem?(l=a[e.groupTreeitem.label],l||(l=a[e.groupTreeitem.label]=document.createElement("optgroup"),l.label=e.groupTreeitem.label,t.appendChild(l))):l=o;const r=document.createElement("option");r.label=e.label,r.textContent=e.label,r.value=e.el.href.replace(window.location.origin,"").replace("/",""),l.appendChild(r)}return c.addObserver(e=>{var i;const r=e.el.hash,s=(i=t.querySelector(`[value$="${r}"]`))==null?void 0:i.value;s&&(t.value=s)},50),n}
 //# sourceMappingURL=select.js.map
diff --git a/static/shared/outline/select.js.map b/static/shared/outline/select.js.map
index f573fb3..b65f06a 100644
--- a/static/shared/outline/select.js.map
+++ b/static/shared/outline/select.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["select.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASO,gCAA0B,CAC/B,YAAoB,EAAa,CAAb,UAClB,KAAK,GAAG,iBAAiB,SAAU,GAAK,CACtC,KAAM,GAAS,EAAE,OACjB,GAAI,GAAO,EAAO,MAClB,AAAK,EAAO,MAAM,WAAW,MAC3B,GAAO,IAAM,GAEf,OAAO,SAAS,KAAO,KAKtB,8BAAuB,EAA2C,CACvE,KAAM,GAAQ,SAAS,cAAc,SACrC,EAAM,UAAU,IAAI,YACpB,EAAM,aAAa,aAAc,QACjC,KAAM,GAAS,SAAS,cAAc,UACtC,EAAO,UAAU,IAAI,YAAa,gBAClC,EAAM,YAAY,GAClB,KAAM,GAAU,SAAS,cAAc,YACvC,EAAQ,MAAQ,UAChB,EAAO,YAAY,GACnB,KAAM,GAAgD,GACtD,GAAI,GACJ,SAAW,KAAK,GAAK,UAAW,CAC9B,GAAI,OAAO,EAAE,OAAS,EAAG,SACzB,AAAI,EAAE,cACJ,GAAQ,EAAS,EAAE,cAAc,OAC5B,GACH,GAAQ,EAAS,EAAE,cAAc,OAAS,SAAS,cAAc,YACjE,EAAM,MAAQ,EAAE,cAAc,MAC9B,EAAO,YAAY,KAGrB,EAAQ,EAEV,KAAM,GAAI,SAAS,cAAc,UACjC,EAAE,MAAQ,EAAE,MACZ,EAAE,YAAc,EAAE,MAClB,EAAE,MAAS,EAAE,GAAyB,KAAK,QAAQ,OAAO,SAAS,OAAQ,IAAI,QAAQ,IAAK,IAC5F,EAAM,YAAY,GAEpB,SAAK,YAAY,GAAK,CACpB,KAAM,GAAQ,EAAE,GAAyB,KACnC,EAAQ,EAAO,cAAiC,YAAY,QAAW,MAC7E,AAAI,GACF,GAAO,MAAQ,IAEhB,IACI",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASO,gCAA0B,CAC/B,YAAoB,EAAa,CAAb,UAClB,KAAK,GAAG,iBAAiB,SAAU,GAAK,CACtC,KAAM,GAAS,EAAE,OACjB,GAAI,GAAO,EAAO,MAClB,AAAK,EAAO,MAAM,WAAW,MAC3B,GAAO,IAAM,GAEf,OAAO,SAAS,KAAO,KAKtB,8BAAuB,EAA2C,CACvE,KAAM,GAAQ,SAAS,cAAc,SACrC,EAAM,UAAU,IAAI,YACpB,EAAM,aAAa,aAAc,QACjC,KAAM,GAAS,SAAS,cAAc,UACtC,EAAO,UAAU,IAAI,YAAa,gBAClC,EAAM,YAAY,GAClB,KAAM,GAAU,SAAS,cAAc,YACvC,EAAQ,MAAQ,UAChB,EAAO,YAAY,GACnB,KAAM,GAAgD,GACtD,GAAI,GACJ,SAAW,KAAK,GAAK,UAAW,CAC9B,GAAI,OAAO,EAAE,OAAS,EAAG,SACzB,AAAI,EAAE,cACJ,GAAQ,EAAS,EAAE,cAAc,OAC5B,GACH,GAAQ,EAAS,EAAE,cAAc,OAAS,SAAS,cAAc,YACjE,EAAM,MAAQ,EAAE,cAAc,MAC9B,EAAO,YAAY,KAGrB,EAAQ,EAEV,KAAM,GAAI,SAAS,cAAc,UACjC,EAAE,MAAQ,EAAE,MACZ,EAAE,YAAc,EAAE,MAClB,EAAE,MAAS,EAAE,GAAyB,KAAK,QAAQ,OAAO,SAAS,OAAQ,IAAI,QAAQ,IAAK,IAC5F,EAAM,YAAY,GAEpB,SAAK,YAAY,GAAK,CApDxB,MAqDI,KAAM,GAAQ,EAAE,GAAyB,KACnC,EAAQ,KAAO,cAAiC,YAAY,SAApD,cAA+D,MAC7E,AAAI,GACF,GAAO,MAAQ,IAEhB,IACI",
   "names": []
 }
diff --git a/static/shared/outline/tree.js b/static/shared/outline/tree.js
index 8329f5b..edfe534 100644
--- a/static/shared/outline/tree.js
+++ b/static/shared/outline/tree.js
@@ -3,5 +3,5 @@
  * Copyright 2021 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */export class TreeNavController{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});const e=new Map,t=new IntersectionObserver(i=>{for(const s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(const[s,r]of e)if(r){const l=this.treeitems.find(n=>n.el?.href.endsWith(`#${s}`));if(l)for(const n of this.observerCallbacks)n(l);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(const i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){const s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(h(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){const s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){const s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){for(const t of this.el.querySelectorAll('[aria-expanded="true"]'))t!==e.el&&(t.nextElementSibling?.contains(e.el)||t.setAttribute("aria-expanded","false"));for(const t of this.el.querySelectorAll("[aria-selected]"))t!==e.el&&t.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(const t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){const e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new o(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(const e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(const i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}}class o{constructor(e,t,i){e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=e.textContent?.trim()??"",this.tree=t,this.depth=(i?.depth||0)+1,this.index=0;const s=e.parentElement;s?.tagName.toLowerCase()==="li"&&s?.setAttribute("role","none"),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=e?.getAttribute("aria-label")?.trim()??""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){const l=`${i?.label??""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",l),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",l),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.add("focus")}handleBlur(){let e=this.el;this.isExpandable&&(e=e.firstElementChild??e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}}function h(a,e){let t;return(...i)=>{const s=()=>{t=null,a(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}
+ */export class TreeNavController{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});const e=new Map,t=new IntersectionObserver(i=>{for(const s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(const[s,r]of e)if(r){const a=this.treeitems.find(l=>{var n;return(n=l.el)==null?void 0:n.href.endsWith(`#${s}`)});if(a)for(const l of this.observerCallbacks)l(a);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(const i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){const s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(f(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){const s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){const s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(const i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&(((t=i.nextElementSibling)==null?void 0:t.contains(e.el))||i.setAttribute("aria-expanded","false"));for(const i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(const t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){const e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new u(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(const e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(const i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}}class u{constructor(e,t,i){var a,l,n,h,d;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(l=(a=e.textContent)==null?void 0:a.trim())!=null?l:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;const s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(h=(n=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:n.trim())!=null?h:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){const m=`${(d=i==null?void 0:i.label)!=null?d:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",m),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",m),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}}function f(o,e){let t;return(...i)=>{const s=()=>{t=null,o(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}
 //# sourceMappingURL=tree.js.map
diff --git a/static/shared/outline/tree.js.map b/static/shared/outline/tree.js.map
index 664be8b..fcf4957 100644
--- a/static/shared/outline/tree.js.map
+++ b/static/shared/outline/tree.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["tree.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/shared/playground/playground.js b/static/shared/playground/playground.js
index 595e0bc..620c9a0 100644
--- a/static/shared/playground/playground.js
+++ b/static/shared/playground/playground.js
@@ -3,5 +3,5 @@
  * Copyright 2021 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */const n={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"};export class PlaygroundExampleController{constructor(t){this.exampleEl=t;this.exampleEl=t,this.anchorEl=t.querySelector("a"),this.errorEl=t.querySelector(n.EXAMPLE_ERROR),this.playButtonEl=t.querySelector(n.PLAY_BUTTON),this.shareButtonEl=t.querySelector(n.SHARE_BUTTON),this.formatButtonEl=t.querySelector(n.FORMAT_BUTTON),this.runButtonEl=t.querySelector(n.RUN_BUTTON),this.inputEl=this.makeTextArea(t.querySelector(n.EXAMPLE_INPUT)),this.outputEl=t.querySelector(n.EXAMPLE_OUTPUT),this.playButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.shareButtonEl?.addEventListener("click",()=>this.handleShareButtonClick()),this.formatButtonEl?.addEventListener("click",()=>this.handleFormatButtonClick()),this.runButtonEl?.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",e=>this.onKeydown(e)))}makeTextArea(t){const e=document.createElement("textarea");return e.classList.add("Documentation-exampleCode","code"),e.spellcheck=!1,e.value=t?.textContent??"",t?.parentElement?.replaceChild(e,t),e}getAnchorHash(){return this.anchorEl?.hash}expand(){this.exampleEl.open=!0}resize(){if(this.inputEl?.value){const t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(t){t.key==="Tab"&&(document.execCommand("insertText",!1,"	"),t.preventDefault())}setInputText(t){this.inputEl&&(this.inputEl.value=t)}setOutputText(t){this.outputEl&&(this.outputEl.textContent=t)}setErrorText(t){this.errorEl&&(this.errorEl.textContent=t),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){const t="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:this.inputEl?.value}).then(e=>e.text()).then(e=>{const r=t+e;this.setOutputText(`<a href="${r}">${r}</a>`),window.open(r)}).catch(e=>{this.setErrorText(e)})}handleFormatButtonClick(){this.setOutputText("Waiting for remote server\u2026");const t=new FormData;t.append("body",this.inputEl?.value??""),fetch("/play/fmt",{method:"POST",body:t}).then(e=>e.json()).then(({Body:e,Error:r})=>{this.setOutputText(r||"Done."),e&&(this.setInputText(e),this.resize())}).catch(e=>{this.setErrorText(e)})}handleRunButtonClick(){this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:this.inputEl?.value,version:2})}).then(t=>t.json()).then(async({Events:t,Errors:e})=>{this.setOutputText(e||"");for(const r of t||[])this.setOutputText(r.Message),await new Promise(a=>setTimeout(a,r.Delay/1e6))}).catch(t=>{this.setErrorText(t)})}}const l=location.hash.match(/^#(example-.*)$/);if(l){const o=document.getElementById(l[1]);o&&(o.open=!0)}const i=[...document.querySelectorAll(n.PLAY_HREF)],s=o=>i.find(t=>t.hash===o.getAnchorHash());for(const o of document.querySelectorAll(n.PLAY_CONTAINER)){const t=new PlaygroundExampleController(o),e=s(t);e?e.addEventListener("click",()=>{t.expand()}):console.warn("example href not found")}
+ */const o={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"};export class PlaygroundExampleController{constructor(t){this.exampleEl=t;var e,r,n,l;this.exampleEl=t,this.anchorEl=t.querySelector("a"),this.errorEl=t.querySelector(o.EXAMPLE_ERROR),this.playButtonEl=t.querySelector(o.PLAY_BUTTON),this.shareButtonEl=t.querySelector(o.SHARE_BUTTON),this.formatButtonEl=t.querySelector(o.FORMAT_BUTTON),this.runButtonEl=t.querySelector(o.RUN_BUTTON),this.inputEl=this.makeTextArea(t.querySelector(o.EXAMPLE_INPUT)),this.outputEl=t.querySelector(o.EXAMPLE_OUTPUT),(e=this.playButtonEl)==null||e.addEventListener("click",()=>this.handleShareButtonClick()),(r=this.shareButtonEl)==null||r.addEventListener("click",()=>this.handleShareButtonClick()),(n=this.formatButtonEl)==null||n.addEventListener("click",()=>this.handleFormatButtonClick()),(l=this.runButtonEl)==null||l.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",s=>this.onKeydown(s)))}makeTextArea(t){var r,n;const e=document.createElement("textarea");return e.classList.add("Documentation-exampleCode","code"),e.spellcheck=!1,e.value=(r=t==null?void 0:t.textContent)!=null?r:"",(n=t==null?void 0:t.parentElement)==null||n.replaceChild(e,t),e}getAnchorHash(){var t;return(t=this.anchorEl)==null?void 0:t.hash}expand(){this.exampleEl.open=!0}resize(){var t;if((t=this.inputEl)==null?void 0:t.value){const e=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+e*20+12+2)/16}rem`}}onKeydown(t){t.key==="Tab"&&(document.execCommand("insertText",!1,"	"),t.preventDefault())}setInputText(t){this.inputEl&&(this.inputEl.value=t)}setOutputText(t){this.outputEl&&(this.outputEl.textContent=t)}setErrorText(t){this.errorEl&&(this.errorEl.textContent=t),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){var e;const t="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:(e=this.inputEl)==null?void 0:e.value}).then(r=>r.text()).then(r=>{const n=t+r;this.setOutputText(`<a href="${n}">${n}</a>`),window.open(n)}).catch(r=>{this.setErrorText(r)})}handleFormatButtonClick(){var e,r;this.setOutputText("Waiting for remote server\u2026");const t=new FormData;t.append("body",(r=(e=this.inputEl)==null?void 0:e.value)!=null?r:""),fetch("/play/fmt",{method:"POST",body:t}).then(n=>n.json()).then(({Body:n,Error:l})=>{this.setOutputText(l||"Done."),n&&(this.setInputText(n),this.resize())}).catch(n=>{this.setErrorText(n)})}handleRunButtonClick(){var t;this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:(t=this.inputEl)==null?void 0:t.value,version:2})}).then(e=>e.json()).then(async({Events:e,Errors:r})=>{this.setOutputText(r||"");for(const n of e||[])this.setOutputText(n.Message),await new Promise(l=>setTimeout(l,n.Delay/1e6))}).catch(e=>{this.setErrorText(e)})}}const i=location.hash.match(/^#(example-.*)$/);if(i){const a=document.getElementById(i[1]);a&&(a.open=!0)}const u=[...document.querySelectorAll(o.PLAY_HREF)],h=a=>u.find(t=>t.hash===a.getAnchorHash());for(const a of document.querySelectorAll(o.PLAY_CONTAINER)){const t=new PlaygroundExampleController(a),e=h(t);e?e.addEventListener("click",()=>{t.expand()}):console.warn("example href not found")}
 //# sourceMappingURL=playground.js.map
diff --git a/static/shared/playground/playground.js.map b/static/shared/playground/playground.js.map
index 713b2e7..dd6db06 100644
--- a/static/shared/playground/playground.js.map
+++ b/static/shared/playground/playground.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["playground.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accomodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.inputEl?.value,\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputText(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.setOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nconst exampleHashRegex = location.hash.match(/^#(example-.*)$/);\nif (exampleHashRegex) {\n  const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n  if (exampleHashEl) {\n    exampleHashEl.open = true;\n  }\n}\n\n// We use a spread operator to convert a nodelist into an array of elements.\nconst exampleHrefs = [\n  ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n];\n\n/**\n * Sometimes exampleHrefs and playContainers are in different order, so we\n * find an exampleHref from a common hash.\n * @param playContainer - playground container\n */\nconst findExampleHash = (playContainer: PlaygroundExampleController) =>\n  exampleHrefs.find(ex => {\n    return ex.hash === playContainer.getAnchorHash();\n  });\n\nfor (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n  // There should be the same amount of hrefs referencing examples as example containers.\n  const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n  const exampleHref = findExampleHash(playContainer);\n  if (exampleHref) {\n    exampleHref.addEventListener('click', () => {\n      playContainer.expand();\n    });\n  } else {\n    console.warn('example href not found');\n  }\n}\n"],
-  "mappings": "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",
+  "mappings": "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",
   "names": []
 }
diff --git a/static/shared/shared.css b/static/shared/shared.css
index 1574791..3c1e1c2 100644
--- a/static/shared/shared.css
+++ b/static/shared/shared.css
@@ -4,12 +4,13 @@
  * license that can be found in the LICENSE file.
  */
 
+@import url('./reset.css');
+
 /**
- * Typography should be imported first to ensure expected CSS
- * inheritance on text elements.
+ * Typography should be imported first in the list below to ensure expected
+ * CSS rule inheritance on text elements.
  */
 @import url('./typography/typography.css');
-
 @import url('./button/button.css');
 @import url('./breadcrumb/breadcrumb.css');
 @import url('./chip/chip.css');
diff --git a/static/shared/shared.js b/static/shared/shared.js
index 5cdf8f9..feeb20a 100644
--- a/static/shared/shared.js
+++ b/static/shared/shared.js
@@ -3,5 +3,5 @@
  * Copyright 2020 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */import"./header/header";import{ClipboardController as e}from"./clipboard/clipboard";import{ToolTipController as l}from"./tooltip/tooltip";import{SelectNavController as t}from"./outline/select";import{ModalController as r}from"./modal/modal";export{keyboard}from"./keyboard/keyboard";export*as analytics from"./analytics/analytics";for(const o of document.querySelectorAll(".js-clipboard"))new e(o);for(const o of document.querySelectorAll(".js-modal"))new r(o);for(const o of document.querySelectorAll(".js-tooltip"))new l(o);for(const o of document.querySelectorAll(".js-selectNav"))new t(o);
+ */import"./header/header";import{ClipboardController as e}from"./clipboard/clipboard";import{ToolTipController as l}from"./tooltip/tooltip";import{SelectNavController as t}from"./outline/select";import{ModalController as r}from"./modal/modal";export{keyboard}from"./keyboard/keyboard";import*as n from"./analytics/analytics";export{n as analytics};for(const o of document.querySelectorAll(".js-clipboard"))new e(o);for(const o of document.querySelectorAll(".js-modal"))new r(o);for(const o of document.querySelectorAll(".js-tooltip"))new l(o);for(const o of document.querySelectorAll(".js-selectNav"))new t(o);
 //# sourceMappingURL=shared.js.map
diff --git a/static/shared/shared.js.map b/static/shared/shared.js.map
index 4d0e805..08fda56 100644
--- a/static/shared/shared.js.map
+++ b/static/shared/shared.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["shared.ts"],
   "sourcesContent": ["/**\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport './header/header';\nimport { ClipboardController } from './clipboard/clipboard';\nimport { ToolTipController } from './tooltip/tooltip';\nimport { SelectNavController } from './outline/select';\nimport { ModalController } from './modal/modal';\n\nexport { keyboard } from './keyboard/keyboard';\nexport * as analytics from './analytics/analytics';\n\nfor (const el of document.querySelectorAll<HTMLButtonElement>('.js-clipboard')) {\n  new ClipboardController(el);\n}\n\nfor (const el of document.querySelectorAll<HTMLDialogElement>('.js-modal')) {\n  new ModalController(el);\n}\n\nfor (const t of document.querySelectorAll<HTMLDetailsElement>('.js-tooltip')) {\n  new ToolTipController(t);\n}\n\nfor (const el of document.querySelectorAll<HTMLSelectElement>('.js-selectNav')) {\n  new SelectNavController(el);\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,wBACA,4DACA,sDACA,uDACA,gDAEA,0CACA,gDAEA,SAAW,KAAM,UAAS,iBAAoC,iBAC5D,GAAI,GAAoB,GAG1B,SAAW,KAAM,UAAS,iBAAoC,aAC5D,GAAI,GAAgB,GAGtB,SAAW,KAAK,UAAS,iBAAqC,eAC5D,GAAI,GAAkB,GAGxB,SAAW,KAAM,UAAS,iBAAoC,iBAC5D,GAAI,GAAoB",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOA,wBACA,4DACA,sDACA,uDACA,gDAEA,0CACA,+DAEA,SAAW,KAAM,UAAS,iBAAoC,iBAC5D,GAAI,GAAoB,GAG1B,SAAW,KAAM,UAAS,iBAAoC,aAC5D,GAAI,GAAgB,GAGtB,SAAW,KAAK,UAAS,iBAAqC,eAC5D,GAAI,GAAkB,GAGxB,SAAW,KAAM,UAAS,iBAAoC,iBAC5D,GAAI,GAAoB",
   "names": []
 }
diff --git a/static/shared/table/table.js b/static/shared/table/table.js
index 9a90f6b..c631ed3 100644
--- a/static/shared/table/table.js
+++ b/static/shared/table/table.js
@@ -3,5 +3,5 @@
  * Copyright 2020 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
- */export class ExpandableRowsTableController{constructor(t,e){this.table=t;this.toggleAll=e;this.expandAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(t.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(const t of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${t}]`).forEach(e=>{e.setAttribute(t.replace("data-",""),e.getAttribute(t)??""),e.removeAttribute(t)})}attachEventListeners(){this.rows.forEach(t=>{t.addEventListener("click",e=>{this.handleToggleClick(e)})}),this.toggleAll?.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(t){let e=t.currentTarget;e?.hasAttribute("aria-expanded")||(e=this.table.querySelector(`button[aria-controls="${e?.getAttribute("aria-controls")}"]`));const l=e?.getAttribute("aria-expanded")==="true";e?.setAttribute("aria-expanded",l?"false":"true"),t.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(t=>{const e=t?.getAttribute("aria-expanded")==="true";t?.getAttribute("aria-controls")?.trimEnd().split(" ")?.map(s=>{const a=document.getElementById(`${s}`);e?(a?.classList.add("visible"),a?.classList.remove("hidden")):(a?.classList.add("hidden"),a?.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(e=>e.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(e=>e.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}}
+ */export class ExpandableRowsTableController{constructor(t,e){this.table=t;this.toggleAll=e;this.expandAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(t=>t.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(t.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(const t of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${t}]`).forEach(e=>{var a;e.setAttribute(t.replace("data-",""),(a=e.getAttribute(t))!=null?a:""),e.removeAttribute(t)})}attachEventListeners(){var t;this.rows.forEach(e=>{e.addEventListener("click",a=>{this.handleToggleClick(a)})}),(t=this.toggleAll)==null||t.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="f"&&this.expandAllItems()})}handleToggleClick(t){let e=t.currentTarget;(e==null?void 0:e.hasAttribute("aria-expanded"))||(e=this.table.querySelector(`button[aria-controls="${e==null?void 0:e.getAttribute("aria-controls")}"]`));const a=(e==null?void 0:e.getAttribute("aria-expanded"))==="true";e==null||e.setAttribute("aria-expanded",a?"false":"true"),t.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(t=>{var s;const e=(t==null?void 0:t.getAttribute("aria-expanded"))==="true",a=(s=t==null?void 0:t.getAttribute("aria-controls"))==null?void 0:s.trimEnd().split(" ");a==null||a.map(i=>{const l=document.getElementById(`${i}`);e?(l==null||l.classList.add("visible"),l==null||l.classList.remove("hidden")):(l==null||l.classList.add("hidden"),l==null||l.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(e=>e.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(e=>e.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}}
 //# sourceMappingURL=table.js.map
diff --git a/static/shared/table/table.js.map b/static/shared/table/table.js.map
index b54ebc2..f6ef914 100644
--- a/static/shared/table/table.js.map
+++ b/static/shared/table/table.js.map
@@ -2,6 +2,6 @@
   "version": 3,
   "sources": ["table.ts"],
   "sourcesContent": ["/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n"],
-  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoBO,0CAAoC,CAQzC,YAAoB,EAAiC,EAAsC,CAAvE,aAAiC,iBAmDrD,oBAAiB,IAAY,CAC3B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,SACtD,KAAK,UAGC,sBAAmB,IAAM,CAC/B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,UACtD,KAAK,UAGC,YAAS,IAAM,CACrB,KAAK,qBACL,WAAW,IAAM,KAAK,uBA9DtB,KAAK,KAAO,MAAM,KAAK,EAAM,iBAAsC,yBACnE,KAAK,QAAU,MAAM,KAAK,KAAK,MAAM,iBAAiB,oBACtD,KAAK,gBACL,KAAK,uBACL,KAAK,SAOC,eAAgB,CACtB,SAAW,KAAK,CAAC,qBAAsB,uBAAwB,WAC7D,KAAK,MAAM,iBAAiB,IAAI,MAAM,QAAQ,GAAK,CACjD,EAAE,aAAa,EAAE,QAAQ,QAAS,IAAK,EAAE,aAAa,IAAM,IAC5D,EAAE,gBAAgB,KAKhB,sBAAuB,CAC7B,KAAK,KAAK,QAAQ,GAAK,CACrB,EAAE,iBAAiB,QAAS,GAAK,CAC/B,KAAK,kBAAkB,OAG3B,KAAK,WAAW,iBAAiB,QAAS,IAAM,CAC9C,KAAK,mBAGP,SAAS,iBAAiB,UAAW,GAAK,CACxC,AAAK,GAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,KACxC,KAAK,mBAKH,kBAAkB,EAAe,CACvC,GAAI,GAAS,EAAE,cACf,AAAK,GAAQ,aAAa,kBACxB,GAAS,KAAK,MAAM,cAClB,yBAAyB,GAAQ,aAAa,uBAGlD,KAAM,GAAa,GAAQ,aAAa,mBAAqB,OAC7D,GAAQ,aAAa,gBAAiB,EAAa,QAAU,QAC7D,EAAE,kBACF,KAAK,SAkBC,oBAAqB,CAC3B,KAAK,KAAK,IAAI,GAAK,CACjB,KAAM,GAAa,GAAG,aAAa,mBAAqB,OAExD,AADe,GAAG,aAAa,kBAAkB,UAAU,MAAM,MACzD,IAAI,GAAM,CAChB,KAAM,GAAS,SAAS,eAAe,GAAG,KAC1C,AAAI,EACF,IAAQ,UAAU,IAAI,WACtB,GAAQ,UAAU,OAAO,WAEzB,IAAQ,UAAU,IAAI,UACtB,GAAQ,UAAU,OAAO,gBAMzB,oBAAqB,CAC3B,GAAI,CAAC,KAAK,UAAW,OACrB,AAAI,KAAK,KAAK,KAAK,GAAK,EAAE,aAAa,mBACrC,MAAK,UAAU,MAAM,QAAU,SAGjC,AADsB,KAAK,QAAQ,KAAK,GAAM,EAAG,aAAa,mBAAqB,SAEjF,MAAK,UAAU,UAAY,aAC3B,KAAK,UAAU,QAAU,KAAK,gBAE9B,MAAK,UAAU,UAAY,eAC3B,KAAK,UAAU,QAAU,KAAK",
+  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoBO,0CAAoC,CAQzC,YAAoB,EAAiC,EAAsC,CAAvE,aAAiC,iBAmDrD,oBAAiB,IAAY,CAC3B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,SACtD,KAAK,UAGC,sBAAmB,IAAM,CAC/B,KAAK,QAAQ,IAAI,GAAK,EAAE,aAAa,gBAAiB,UACtD,KAAK,UAGC,YAAS,IAAM,CACrB,KAAK,qBACL,WAAW,IAAM,KAAK,uBA9DtB,KAAK,KAAO,MAAM,KAAK,EAAM,iBAAsC,yBACnE,KAAK,QAAU,MAAM,KAAK,KAAK,MAAM,iBAAiB,oBACtD,KAAK,gBACL,KAAK,uBACL,KAAK,SAOC,eAAgB,CACtB,SAAW,KAAK,CAAC,qBAAsB,uBAAwB,WAC7D,KAAK,MAAM,iBAAiB,IAAI,MAAM,QAAQ,GAAK,CA1CzD,MA2CQ,EAAE,aAAa,EAAE,QAAQ,QAAS,IAAK,KAAE,aAAa,KAAf,OAAqB,IAC5D,EAAE,gBAAgB,KAKhB,sBAAuB,CAjDjC,MAkDI,KAAK,KAAK,QAAQ,GAAK,CACrB,EAAE,iBAAiB,QAAS,GAAK,CAC/B,KAAK,kBAAkB,OAG3B,QAAK,YAAL,QAAgB,iBAAiB,QAAS,IAAM,CAC9C,KAAK,mBAGP,SAAS,iBAAiB,UAAW,GAAK,CACxC,AAAK,GAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,KACxC,KAAK,mBAKH,kBAAkB,EAAe,CACvC,GAAI,GAAS,EAAE,cACf,AAAK,kBAAQ,aAAa,mBACxB,GAAS,KAAK,MAAM,cAClB,yBAAyB,iBAAQ,aAAa,uBAGlD,KAAM,GAAa,kBAAQ,aAAa,oBAAqB,OAC7D,WAAQ,aAAa,gBAAiB,EAAa,QAAU,QAC7D,EAAE,kBACF,KAAK,SAkBC,oBAAqB,CAC3B,KAAK,KAAK,IAAI,GAAK,CA/FvB,MAgGM,KAAM,GAAa,kBAAG,aAAa,oBAAqB,OAClD,EAAS,oBAAG,aAAa,mBAAhB,cAAkC,UAAU,MAAM,KACjE,WAAQ,IAAI,GAAM,CAChB,KAAM,GAAS,SAAS,eAAe,GAAG,KAC1C,AAAI,EACF,YAAQ,UAAU,IAAI,WACtB,WAAQ,UAAU,OAAO,WAEzB,YAAQ,UAAU,IAAI,UACtB,WAAQ,UAAU,OAAO,gBAMzB,oBAAqB,CAC3B,GAAI,CAAC,KAAK,UAAW,OACrB,AAAI,KAAK,KAAK,KAAK,GAAK,EAAE,aAAa,mBACrC,MAAK,UAAU,MAAM,QAAU,SAGjC,AADsB,KAAK,QAAQ,KAAK,GAAM,EAAG,aAAa,mBAAqB,SAEjF,MAAK,UAAU,UAAY,aAC3B,KAAK,UAAU,QAAU,KAAK,gBAE9B,MAAK,UAAU,UAAY,eAC3B,KAAK,UAAU,QAAU,KAAK",
   "names": []
 }
diff --git a/static/worker/versions.tmpl b/static/worker/versions.tmpl
index dbe0f56..1e70bef 100644
--- a/static/worker/versions.tmpl
+++ b/static/worker/versions.tmpl
@@ -40,7 +40,7 @@
 <!DOCTYPE html>
 <html lang="en">
 <meta charset="utf-8">
-<link href="/static/worker/worker.css" rel="stylesheet">
+<link href="/static/worker/worker.min.css" rel="stylesheet">
 <title>{{.Env}} Worker</title>
 
 <body>
diff --git a/static/worker/worker.min.css b/static/worker/worker.min.css
new file mode 100644
index 0000000..bde5ea9
--- /dev/null
+++ b/static/worker/worker.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Copyright 2021 The Go Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+:root{--white: #eee;--gray: #ccc;--red: red}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Helvetica Neue",Arial,sans-serif}label{display:inline-block;text-align:right;width:12.5rem}input{width:12.5rem}button{background-color:var(--white);border:.0625rem solid var(--gray);border-radius:.125rem;width:16rem}table{border-spacing:.625rem .125rem;font-size:.75rem;padding:.1875rem 0 .125rem}td{border-top:.0625rem solid var(--gray)}.Experiments input{width:auto}.Experiments input:invalid{border:.0625rem dotted var(--red);border-radius:.25rem}.Experiments input:valid{border:.0625rem solid var(--gray);border-radius:.25rem}.Experiments button{width:auto}.Experiments-updateResult{border:none;height:2rem;width:100%}
+/*# sourceMappingURL=worker.min.css.map */
diff --git a/static/worker/worker.min.css.map b/static/worker/worker.min.css.map
new file mode 100644
index 0000000..0485e58
--- /dev/null
+++ b/static/worker/worker.min.css.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["worker.css"],
+  "sourcesContent": ["/*\n * Copyright 2019-2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n:root {\n  --white: #eee;\n  --gray: #ccc;\n  --red: red;\n}\n\nbody {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',\n    'Helvetica Neue', Arial, sans-serif;\n}\nlabel {\n  display: inline-block;\n  text-align: right;\n  width: 12.5rem;\n}\ninput {\n  width: 12.5rem;\n}\nbutton {\n  background-color: var(--white);\n  border: 0.0625rem solid var(--gray);\n  border-radius: 0.125rem;\n  width: 16rem;\n}\ntable {\n  border-spacing: 0.625rem 0.125rem;\n  font-size: 0.75rem;\n  padding: 0.1875rem 0 0.125rem 0;\n}\ntd {\n  border-top: 0.0625rem solid var(--gray);\n}\n\n.Experiments input {\n  width: auto;\n}\n.Experiments input:invalid {\n  border: 0.0625rem dotted var(--red);\n  border-radius: 0.25rem;\n}\n.Experiments input:valid {\n  border: 0.0625rem solid var(--gray);\n  border-radius: 0.25rem;\n}\n.Experiments button {\n  width: auto;\n}\n\n.Experiments-updateResult {\n  border: none;\n  height: 2rem;\n  width: 100%;\n}\n"],
+  "mappings": ";;;;;AAMA,MACE,cACA,aACA,WAGF,KACE,qHAGF,MACE,qBACA,iBACA,cAEF,MACE,cAEF,OACE,8BACA,kCA1BF,sBA4BE,YAEF,MACE,+BACA,iBAhCF,2BAmCA,GACE,sCAGF,mBACE,WAEF,2BACE,kCA3CF,qBA8CA,yBACE,kCA/CF,qBAkDA,oBACE,WAGF,0BACE,YACA,YACA",
+  "names": []
+}