(function(){window.pagespeed = window.pagespeed || {};
var pagespeed = window.pagespeed;
pagespeed.AddInstrumentation = function(a, c, b, d) {
  this.beaconUrlPrefix_ = a;
  this.event_ = c;
  this.extraParams_ = b;
  this.htmlUrl_ = d;
};
pagespeed.beaconUrl = "";
pagespeed.AddInstrumentation.prototype.sendBeacon = function() {
  var a = this.beaconUrlPrefix_, c = window.mod_pagespeed_start, b = Number(new Date) - c, a = a + (-1 == a.indexOf("?") ? "?" : "&"), a = a + "ets=" + ("load" == this.event_ ? "load:" : "unload:"), a = a + b;
  if ("beforeunload" != this.event_ || !window.mod_pagespeed_loaded) {
    a += "&r" + this.event_ + "=";
    if (window.performance) {
      var b = window.performance.timing, d = b.navigationStart, e = b.requestStart, a = a + (b[this.event_ + "EventStart"] - d), a = a + ("&nav=" + (b.fetchStart - d)), a = a + ("&dns=" + (b.domainLookupEnd - b.domainLookupStart)), a = a + ("&connect=" + (b.connectEnd - b.connectStart)), a = a + ("&req_start=" + (e - d)), a = a + ("&ttfb=" + (b.responseStart - e)), a = a + ("&dwld=" + (b.responseEnd - b.responseStart)), a = a + ("&dom_c=" + (b.domContentLoadedEventStart - d));
      window.performance.navigation && (a += "&nt=" + window.performance.navigation.type);
      d = -1;
      b.msFirstPaint ? d = b.msFirstPaint : window.chrome && window.chrome.loadTimes && (d = Math.floor(1E3 * window.chrome.loadTimes().firstPaintTime));
      d -= e;
      0 <= d && (a += "&fp=" + d);
    } else {
      a += b;
    }
    pagespeed.getResourceTimingData && window.parent == window && (a += pagespeed.getResourceTimingData());
    a += window.parent != window ? "&ifr=1" : "&ifr=0";
    "load" == this.event_ && (window.mod_pagespeed_loaded = !0, (b = window.mod_pagespeed_num_resources_prefetched) && (a += "&nrp=" + b), (b = window.mod_pagespeed_prefetch_start) && (a += "&htmlAt=" + (c - b)));
    pagespeed.panelLoader && (c = pagespeed.panelLoader.getCsiTimingsString(), "" != c && (a += "&b_csi=" + c));
    pagespeed.criticalCss && (c = pagespeed.criticalCss, a += "&ccis=" + c.total_critical_inlined_size + "&cces=" + c.total_original_external_size + "&ccos=" + c.total_overhead_size + "&ccrl=" + c.num_replaced_links + "&ccul=" + c.num_unreplaced_links);
    a += "&dpr=" + window.devicePixelRatio;
    "" != this.extraParams_ && (a += this.extraParams_);
    document.referrer && (a += "&ref=" + encodeURIComponent(document.referrer));
    a += "&url=" + encodeURIComponent(this.htmlUrl_);
    pagespeed.beaconUrl = a;
    (new Image).src = a;
  }
};
pagespeed.addInstrumentationInit = function(a, c, b, d) {
  var e = new pagespeed.AddInstrumentation(a, c, b, d);
  window.addEventListener ? window.addEventListener(c, function() {
    e.sendBeacon();
  }, !1) : window.attachEvent("on" + c, function() {
    e.sendBeacon();
  });
};
pagespeed.addInstrumentationInit = pagespeed.addInstrumentationInit;
})();
