(function(){var CRITICAL_DATA_LOADED = "cdl", NON_CRITICAL_LOADED = "ncl";
window.pagespeed = window.pagespeed || {};
var pagespeed = window.pagespeed;
pagespeed.PanelLoader = function() {
  this.readyToLoadNonCritical = !1;
  this.delayedNonCriticalData = null;
  this.nonCriticalData = {};
  this.nonCriticalDataPresent = !1;
  this.nonCacheablePanelInstances = {};
  this.pageManager = new PageManager;
  this.dashboardDisplayTime = 0;
  this.csiTimings = {time:{}, size:{}};
  this.contentSizeKb = 0;
  this.debugIp = !1;
  this.timeStart = window.performance ? window.performance.timing.navigationStart : window.mod_pagespeed_start;
  this.changePageLoadState(CRITICAL_DATA_LOADED, 0);
};
pagespeed.PanelLoader.prototype.loadData = function() {
  if (this.nonCriticalDataPresent && this.readyToLoadNonCritical && this.state != NON_CRITICAL_LOADED) {
    this.pageManager.instantiatePage(this.nonCriticalData);
    for (var a in this.nonCacheablePanelInstances) {
      if (this.nonCacheablePanelInstances.hasOwnProperty(a)) {
        for (var b = this.nonCacheablePanelInstances[a], c = 0;c < b.length;++c) {
          b[c][DONT_BIND] = !1;
        }
      }
    }
    this.pageManager.instantiatePage(this.nonCacheablePanelInstances);
    this.changePageLoadState(NON_CRITICAL_LOADED);
    (a = window.location.hash) && "#" == a[0] && document.getElementById(a.slice(1)) && window.location.replace(a);
    window.pagespeed && window.pagespeed.deferJs && (window.pagespeed.deferJs.registerScriptTags(), setTimeout(function() {
      window.pagespeed.deferJs.run();
    }, 1));
  }
};
pagespeed.PanelLoader.prototype.loadData = pagespeed.PanelLoader.prototype.loadData;
pagespeed.PanelLoader.prototype.isStateInCriticalPath = function(a) {
  return a == CRITICAL_DATA_LOADED;
};
pagespeed.PanelLoader.prototype.getCsiTimingsString = function() {
  var a = "", b;
  for (b in this.csiTimings.time) {
    a += b + "." + this.csiTimings.time[b] + ",";
  }
  for (b in this.csiTimings.size) {
    a += b + "_sz." + this.csiTimings.size[b] + ",";
  }
  return a;
};
pagespeed.PanelLoader.prototype.getCsiTimingsString = pagespeed.PanelLoader.prototype.getCsiTimingsString;
pagespeed.PanelLoader.prototype.updateDashboard = function() {
  var a = new Date, b = document.getElementById("dashboard_area") || window.dashboard_area;
  if (this.debugIp || window.localStorage && "1" == window.localStorage.psa_debug) {
    b || (b = document.createElement("div"), b.id = "dashboard_area", b.style.color = "gray", b.style.fontSize = "10px", b.style.fontFace = "Arial", b.style.backgroundColor = "white", document.body.insertBefore(b, document.body.childNodes[0]));
    var c = "TIME:\n" + JSON.stringify(this.csiTimings.time).replace(/["{}]/g, "").replace(/,/g, " "), c = c + ("\nSIZE:\n" + JSON.stringify(this.csiTimings.size).replace(/["{}]/g, "").replace(/,/g, " "));
    b.innerHTML = '<span title="' + c + '">' + this.dashboardDisplayTime + "ms; " + this.contentSizeKb.toFixed() + "KB;" + a.toGMTString() + "</span>";
  }
};
pagespeed.PanelLoader.prototype.changePageLoadState = function(a, b) {
  this.state = a;
  var c = new Date - this.timeStart;
  this.addCsiTiming(a, c, b);
  this.isStateInCriticalPath(a) && (this.contentSizeKb += b ? b / 1024 : 0, this.dashboardDisplayTime = c);
  this.updateDashboard();
};
pagespeed.PanelLoader.prototype.executeATFScripts = function() {
  if (window.pagespeed && window.pagespeed.deferJs) {
    var a = this;
    window.pagespeed.deferJs.registerScriptTags(function() {
      a.criticalScriptsDone();
    }, pagespeed.lastScriptIndexBeforePanelStub);
    window.pagespeed.deferJs.run();
  }
};
pagespeed.PanelLoader.prototype.setRequestFromInternalIp = function() {
  this.debugIp = !0;
};
pagespeed.PanelLoader.prototype.setRequestFromInternalIp = pagespeed.PanelLoader.prototype.setRequestFromInternalIp;
pagespeed.PanelLoader.prototype.addCsiTiming = function(a, b, c) {
  this.csiTimings.time[a] = b;
  c && (this.csiTimings.size[a] = c);
};
pagespeed.PanelLoader.prototype.loadCookies = function(a) {
  for (var b = 0;b < a.length;b++) {
    document.cookie = a[b];
  }
};
pagespeed.PanelLoader.prototype.loadCookies = pagespeed.PanelLoader.prototype.loadCookies;
pagespeed.PanelLoader.prototype.loadNonCacheableObject = function(a) {
  if (this.state != NON_CRITICAL_LOADED) {
    for (var b in a) {
      a.hasOwnProperty(b) && (this.nonCacheablePanelInstances[b] = this.nonCacheablePanelInstances[b] || [], this.nonCacheablePanelInstances[b].push(a[b]), 0 < getPanelStubs(getDocument().documentElement, getDocument().documentElement, b).length ? (this.pageManager.instantiatePage(this.nonCacheablePanelInstances), this.nonCacheablePanelInstances[b].pop(), this.nonCacheablePanelInstances[b].push({})) : a[b][DONT_BIND] = !0);
    }
  }
};
pagespeed.PanelLoader.prototype.loadNonCacheableObject = pagespeed.PanelLoader.prototype.loadNonCacheableObject;
pagespeed.PanelLoader.prototype.criticalScriptsDone = function() {
  this.readyToLoadNonCritical = !0;
  this.loadData();
};
pagespeed.PanelLoader.prototype.criticalScriptsDone = pagespeed.PanelLoader.prototype.criticalScriptsDone;
pagespeed.PanelLoader.prototype.bufferNonCriticalData = function(a, b) {
  b ? this.delayedNonCriticalData = a : (this.delayedNonCriticalData && (a = this.delayedNonCriticalData), this.state != NON_CRITICAL_LOADED && (this.nonCriticalData = a, this.nonCriticalDataPresent = !0, this.loadData()));
};
pagespeed.PanelLoader.prototype.bufferNonCriticalData = pagespeed.PanelLoader.prototype.bufferNonCriticalData;
pagespeed.panelLoaderInit = function() {
  if (!pagespeed.panelLoader) {
    var a = new pagespeed.PanelLoader;
    pagespeed.panelLoader = a;
    a.executeATFScripts();
  }
};
pagespeed.panelLoaderInit = pagespeed.panelLoaderInit;
var PANEL_ID = "panel-id", PANEL_STUBSTART = "GooglePanel begin ", PANEL_STUBEND = "GooglePanel end ", INSTANCE_HTML = "instance_html", CONTIGUOUS = "contiguous", XPATH = "xpath", DONT_BIND = "dont_bind", IMAGES = "images", BLINK_SRC = "data-pagespeed-high-res-src", PANEL_MARKER = "psa_disabled";
function CHECK(a) {
  if (!a) {
    throw "CHECK failed";
  }
}
var getDocument = function() {
  return document;
};
function isInternetExplorer() {
  return "Microsoft Internet Explorer" == navigator.appName;
}
function createInnerHtmlElements(a, b) {
  "HEAD" == a && (a = "div");
  var c;
  !isInternetExplorer() || "TABLE" != a && "TBODY" != a ? (c = getDocument().createElement(a), c.innerHTML = b) : (c = getDocument().createElement("div"), c.innerHTML = "<table>" + b + "</table>", c = c.getElementsByTagName("tbody")[0]);
  for (var d = getDocument().createDocumentFragment();0 < c.childNodes.length;) {
    c.childNodes[0].tagName && (c.setAttribute("psa_not_processed", ""), c.setAttribute("priority_psa_not_processed", "")), d.appendChild(c.childNodes[0]);
  }
  return d;
}
function getMatchingXPathInDom(a, b) {
  for (var c = getDocument().evaluate(b, a, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null), d = [], e;e = c.iterateNext();d.push(e)) {
  }
  return d;
}
function getElementsByTagAndAttribute(a, b) {
  for (var c = getDocument().documentElement.getElementsByTagName(a), d = [], e = 0;e < c.length;e++) {
    var f = c[e];
    f.hasAttribute(b) && d.push(f);
  }
  return d;
}
function insertPanelContents(a, b) {
  var c = createInnerHtmlElements(a.parentNode.tagName, b);
  a.parentNode.insertBefore(c, a);
}
function isComment(a) {
  return 8 == a.nodeType;
}
function getPanelStubs(a, b, c) {
  CHECK(a.parentNode == b.parentNode);
  for (var d = [];a != b.nextSibling;a = a.nextSibling) {
    isComment(a) && endsWith(a.data, PANEL_STUBEND + c) ? d.push(a) : a.tagName && a.firstChild && (d = d.concat(getPanelStubs(a.firstChild, a.lastChild, c)));
  }
  return d;
}
function insertStubAtIndex(a, b, c) {
  CHECK(a && 0 < b);
  b = a.children[b - 1] || null;
  var d = getDocument().createComment(PANEL_STUBSTART + c);
  a.insertBefore(d, b);
  c = getDocument().createComment(PANEL_STUBEND + c);
  a.insertBefore(c, b);
  return c;
}
function insertMissingStubUsingXpath(a, b) {
  for (var c = a.split("/"), d = /(?:.*\[@id=")(.*)(?:"\])/, e = /(?:.*\[)(\d+)(?:\])/, f = getDocument().body, g = 2;g < c.length;++g) {
    var h = d.exec(c[g]);
    if (h) {
      f = getDocument().getElementById(h[1]), CHECK(f);
    } else {
      if (h = e.exec(c[g])) {
        if (g == c.length - 1) {
          return insertStubAtIndex(f, Number(h[1]), b);
        }
        f = f.children[h[1] - 1];
        CHECK(f);
      } else {
        CHECK(0);
      }
    }
  }
}
function endsWith(a, b) {
  return (new RegExp(b + "$")).test(a);
}
function instantiateChildPanels(a, b, c) {
  for (var d in c) {
    if (c.hasOwnProperty(d) && d != XPATH && d != DONT_BIND && d != INSTANCE_HTML && d != IMAGES && d != CONTIGUOUS) {
      var e = c[d], f = getPanelStubs(a, b, d);
      CHECK(!e.length || !e[0][CONTIGUOUS]);
      for (var g = 0, h = 0;g < e.length;g++) {
        0 < g && !e[g][CONTIGUOUS] && h++, instantiatePanel(f[h], e[g], d);
      }
    }
  }
}
function instantiatePanel(a, b, c) {
  if (b && !b[DONT_BIND]) {
    if (a || (CHECK(b[XPATH]), a = insertMissingStubUsingXpath(b[XPATH], c), CHECK(a)), b[INSTANCE_HTML]) {
      c = createInnerHtmlElements(a.parentNode.tagName, b[INSTANCE_HTML]);
      var d = c.firstChild, e = c.lastChild;
      a.parentNode.insertBefore(c, a);
      instantiateChildPanels(d, e, b);
    } else {
      instantiateChildPanels(a.parentNode, a.parentNode, b);
    }
  }
}
function instantiatePanelsInPage(a) {
  var b = getDocument().documentElement;
  instantiateChildPanels(b.firstChild, b.lastChild, a);
  return getElementsByTagAndAttribute("img", BLINK_SRC);
}
function collectCriticalImages(a) {
  var b = {};
  if (!a) {
    return b;
  }
  for (var c = 0;c < a.length;c++) {
    var d = a[c], e = d.getAttribute(BLINK_SRC);
    e && (void 0 == b[e] && (b[e] = []), b[e].push(d));
  }
  return b;
}
function PageManager() {
}
PageManager.prototype.instantiatePage = function(a) {
  a = instantiatePanelsInPage(a);
  return collectCriticalImages(a);
};
})();
