/*

 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.
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.createTemplateTagFirstArg=function(a){return a.raw=a};$jscomp.createTemplateTagFirstArgWithRaw=function(a,f){a.raw=f;return a};$jscomp.arrayIteratorImpl=function(a){var f=0;return function(){return f<a.length?{done:!1,value:a[f++]}:{done:!0}}};$jscomp.arrayIterator=function(a){return{next:$jscomp.arrayIteratorImpl(a)}};$jscomp.makeIterator=function(a){var f="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];return f?f.call(a):$jscomp.arrayIterator(a)};
$jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var f=0;f<a.length;++f){var e=a[f];if(e&&e.Math==Math)return e}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);$jscomp.checkEs6ConformanceViaProxy=function(){try{var a={},f=Object.create(new $jscomp.global.Proxy(a,{get:function(e,b,h){return e==a&&"q"==b&&h==f}}));return!0===f.q}catch(e){return!1}};
$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS=!1;$jscomp.ES6_CONFORMANCE=$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS&&$jscomp.checkEs6ConformanceViaProxy();$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,f,e){if(a==Array.prototype||a==Object.prototype)return a;a[f]=e.value;return a};
$jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(a,f){var e=$jscomp.propertyToPolyfillSymbol[f];if(null==e)return a[f];e=a[e];return void 0!==e?e:a[f]};
$jscomp.polyfill=function(a,f,e,b){f&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(a,f,e,b):$jscomp.polyfillUnisolated(a,f,e,b))};$jscomp.polyfillUnisolated=function(a,f,e,b){e=$jscomp.global;a=a.split(".");for(b=0;b<a.length-1;b++){var h=a[b];if(!(h in e))return;e=e[h]}a=a[a.length-1];b=e[a];f=f(b);f!=b&&null!=f&&$jscomp.defineProperty(e,a,{configurable:!0,writable:!0,value:f})};
$jscomp.polyfillIsolated=function(a,f,e,b){var h=a.split(".");a=1===h.length;b=h[0];b=!a&&b in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var m=0;m<h.length-1;m++){var l=h[m];if(!(l in b))return;b=b[l]}h=h[h.length-1];e=$jscomp.IS_SYMBOL_NATIVE&&"es6"===e?b[h]:null;f=f(e);null!=f&&(a?$jscomp.defineProperty($jscomp.polyfills,h,{configurable:!0,writable:!0,value:f}):f!==e&&($jscomp.propertyToPolyfillSymbol[h]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(h):$jscomp.POLYFILL_PREFIX+h,h=
$jscomp.propertyToPolyfillSymbol[h],$jscomp.defineProperty(b,h,{configurable:!0,writable:!0,value:f})))};$jscomp.initSymbol=function(){};
$jscomp.polyfill("Symbol",function(a){if(a)return a;var f=function(h,m){this.$jscomp$symbol$id_=h;$jscomp.defineProperty(this,"description",{configurable:!0,writable:!0,value:m})};f.prototype.toString=function(){return this.$jscomp$symbol$id_};var e=0,b=function(h){if(this instanceof b)throw new TypeError("Symbol is not a constructor");return new f("jscomp_symbol_"+(h||"")+"_"+e++,h)};return b},"es6","es3");$jscomp.initSymbolIterator=function(){};
$jscomp.polyfill("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");for(var f="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),e=0;e<f.length;e++){var b=$jscomp.global[f[e]];"function"===typeof b&&"function"!=typeof b.prototype[a]&&$jscomp.defineProperty(b.prototype,a,{configurable:!0,writable:!0,value:function(){return $jscomp.iteratorPrototype($jscomp.arrayIteratorImpl(this))}})}return a},"es6",
"es3");$jscomp.initSymbolAsyncIterator=function(){};$jscomp.iteratorPrototype=function(a){a={next:a};a[Symbol.iterator]=function(){return this};return a};$jscomp.owns=function(a,f){return Object.prototype.hasOwnProperty.call(a,f)};
$jscomp.polyfill("WeakMap",function(a){function f(){if(!a||!Object.seal)return!1;try{var c=Object.seal({}),g=Object.seal({}),k=new a([[c,2],[g,3]]);if(2!=k.get(c)||3!=k.get(g))return!1;k.delete(c);k.set(g,4);return!k.has(c)&&4==k.get(g)}catch(n){return!1}}function e(){}function b(c){var g=typeof c;return"object"===g&&null!==c||"function"===g}function h(c){if(!$jscomp.owns(c,l)){var g=new e;$jscomp.defineProperty(c,l,{value:g})}}function m(c){if(!$jscomp.ISOLATE_POLYFILLS){var g=Object[c];g&&(Object[c]=
function(k){if(k instanceof e)return k;Object.isExtensible(k)&&h(k);return g(k)})}}if($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS){if(a&&$jscomp.ES6_CONFORMANCE)return a}else if(f())return a;var l="$jscomp_hidden_"+Math.random();m("freeze");m("preventExtensions");m("seal");var p=0,d=function(c){this.id_=(p+=Math.random()+1).toString();if(c){c=$jscomp.makeIterator(c);for(var g;!(g=c.next()).done;)g=g.value,this.set(g[0],g[1])}};d.prototype.set=function(c,g){if(!b(c))throw Error("Invalid WeakMap key");
h(c);if(!$jscomp.owns(c,l))throw Error("WeakMap key fail: "+c);c[l][this.id_]=g;return this};d.prototype.get=function(c){return b(c)&&$jscomp.owns(c,l)?c[l][this.id_]:void 0};d.prototype.has=function(c){return b(c)&&$jscomp.owns(c,l)&&$jscomp.owns(c[l],this.id_)};d.prototype.delete=function(c){return b(c)&&$jscomp.owns(c,l)&&$jscomp.owns(c[l],this.id_)?delete c[l][this.id_]:!1};return d},"es6","es3");$jscomp.MapEntry=function(){};
$jscomp.polyfill("Map",function(a){function f(){if($jscomp.ASSUME_NO_NATIVE_MAP||!a||"function"!=typeof a||!a.prototype.entries||"function"!=typeof Object.seal)return!1;try{var d=Object.seal({x:4}),c=new a($jscomp.makeIterator([[d,"s"]]));if("s"!=c.get(d)||1!=c.size||c.get({x:4})||c.set({x:4},"t")!=c||2!=c.size)return!1;var g=c.entries(),k=g.next();if(k.done||k.value[0]!=d||"s"!=k.value[1])return!1;k=g.next();return k.done||4!=k.value[0].x||"t"!=k.value[1]||!g.next().done?!1:!0}catch(n){return!1}}
if($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS){if(a&&$jscomp.ES6_CONFORMANCE)return a}else if(f())return a;var e=new WeakMap,b=function(d){this.data_={};this.head_=l();this.size=0;if(d){d=$jscomp.makeIterator(d);for(var c;!(c=d.next()).done;)c=c.value,this.set(c[0],c[1])}};b.prototype.set=function(d,c){d=0===d?0:d;var g=h(this,d);g.list||(g.list=this.data_[g.id]=[]);g.entry?g.entry.value=c:(g.entry={next:this.head_,previous:this.head_.previous,head:this.head_,key:d,value:c},g.list.push(g.entry),
this.head_.previous.next=g.entry,this.head_.previous=g.entry,this.size++);return this};b.prototype.delete=function(d){d=h(this,d);return d.entry&&d.list?(d.list.splice(d.index,1),d.list.length||delete this.data_[d.id],d.entry.previous.next=d.entry.next,d.entry.next.previous=d.entry.previous,d.entry.head=null,this.size--,!0):!1};b.prototype.clear=function(){this.data_={};this.head_=this.head_.previous=l();this.size=0};b.prototype.has=function(d){return!!h(this,d).entry};b.prototype.get=function(d){return(d=
h(this,d).entry)&&d.value};b.prototype.entries=function(){return m(this,function(d){return[d.key,d.value]})};b.prototype.keys=function(){return m(this,function(d){return d.key})};b.prototype.values=function(){return m(this,function(d){return d.value})};b.prototype.forEach=function(d,c){for(var g=this.entries(),k;!(k=g.next()).done;)k=k.value,d.call(c,k[1],k[0],this)};b.prototype[Symbol.iterator]=b.prototype.entries;var h=function(d,c){var g=c&&typeof c;"object"==g||"function"==g?e.has(c)?g=e.get(c):
(g=""+ ++p,e.set(c,g)):g="p_"+c;var k=d.data_[g];if(k&&$jscomp.owns(d.data_,g))for(d=0;d<k.length;d++){var n=k[d];if(c!==c&&n.key!==n.key||c===n.key)return{id:g,list:k,index:d,entry:n}}return{id:g,list:k,index:-1,entry:void 0}},m=function(d,c){var g=d.head_;return $jscomp.iteratorPrototype(function(){if(g){for(;g.head!=d.head_;)g=g.previous;for(;g.next!=g.head;)return g=g.next,{done:!1,value:c(g)};g=null}return{done:!0,value:void 0}})},l=function(){var d={};return d.previous=d.next=d.head=d},p=0;
return b},"es6","es3");$jscomp.iteratorFromArray=function(a,f){a instanceof String&&(a+="");var e=0,b={next:function(){if(e<a.length){var h=e++;return{value:f(h,a[h]),done:!1}}b.next=function(){return{done:!0,value:void 0}};return b.next()}};b[Symbol.iterator]=function(){return b};return b};$jscomp.polyfill("Array.prototype.values",function(a){return a?a:function(){return $jscomp.iteratorFromArray(this,function(f,e){return e})}},"es8","es3");
(function(){var a=document.querySelector(".js-header"),f=document.querySelectorAll(".js-headerMenuButton");f.forEach(function(b){b.addEventListener("click",function(h){h.preventDefault();a.classList.toggle("is-active");b.setAttribute("aria-expanded",a.classList.contains("is-active"))})});var e=document.querySelector(".js-scrim");e&&e.hasOwnProperty("addEventListener")&&e.addEventListener("click",function(b){b.preventDefault();a.classList.remove("is-active");f.forEach(function(h){h.setAttribute("aria-expanded",
a.classList.contains("is-active"))})})})();(function(){window.dataLayer=window.dataLayer||[];window.dataLayer.push({"gtm.start":(new Date).getTime(),event:"gtm.js"})})();(function(){for(var a=function(b){window.dataLayer.push({event:"error",event_category:"Script",event_action:"uncaught error",event_label:b&&(b.stack||b.name+": "+b.message)||"(not set)"})},f=$jscomp.makeIterator(window.__err&&window.__err.p||[]),e=f.next();!e.done;e=f.next())a(e.value.error);window.addEventListener("error",function(b){a(b.error)})})();
(function(){var a=new Map,f=function(){for(var e=$jscomp.makeIterator(a.values()),b=e.next();!b.done;b=e.next())b=b.value,window.dataLayer.push({event:"error",event_category:"Script",event_action:"unhandled rejection",event_label:b&&(b.stack||b.message)||"(not set)"});a.clear()};window.addEventListener("unhandledrejection",function(e){a.set(e.promise,e.reason);"undefined"!==typeof window.requestIdleCallback?window.requestIdleCallback(function(){f()},{timeout:1E3}):window.setTimeout(function(){f()},
250)});window.addEventListener("rejectionhandled",function(e){a.delete(e.promise)})})();
