(function(){var aa=aa||{},k=this;function ba(){}
function l(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function ca(a){var b=l(a);return"array"==b||"object"==b&&"number"==typeof a.length}function m(a){return"string"==typeof a}function p(a){return"function"==l(a)}var da="closure_uid_"+(1E9*Math.random()>>>0),ea=0;function fa(a,b,c){return a.call.apply(a.bind,arguments)}
function ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}}function q(a,b,c){q=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?fa:ga;return q.apply(null,arguments)}var ha=Date.now||function(){return+new Date};
function r(a,b){function c(){}c.prototype=b.prototype;a.Z=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.$=function(a,c,f){for(var g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h];return b.prototype[c].apply(a,g)}};function t(a){if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))}r(t,Error);t.prototype.name="CustomError";function ia(a,b,c,d,e){this.reset(a,b,c,d,e)}ia.prototype.a=null;var ja=0;ia.prototype.reset=function(a,b,c,d,e){"number"==typeof e||ja++;d||ha();this.b=b;delete this.a};function ka(){0!=la&&(this[da]||(this[da]=++ea));this.A=this.A;this.T=this.T}var la=0;ka.prototype.A=!1;function u(a,b){this.type=a;this.a=this.target=b}u.prototype.b=function(){};var w="closure_listenable_"+(1E6*Math.random()|0),ma=0;function na(a,b,c,d,e){this.listener=a;this.a=null;this.src=b;this.type=c;this.C=!!d;this.F=e;++ma;this.v=this.B=!1}function x(a){a.v=!0;a.listener=null;a.a=null;a.src=null;a.F=null};function oa(){}oa.prototype.a=null;function pa(a){var b;(b=a.a)||(b={},qa(a)&&(b[0]=!0,b[1]=!0),b=a.a=b);return b};function ra(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function sa(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b}var ta="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function ua(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var f=0;f<ta.length;f++)c=ta[f],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};function va(a){va[" "](a);return a}va[" "]=ba;function wa(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")}var xa=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")};function ya(a,b){return a<b?-1:a>b?1:0};function za(a,b){b.unshift(a);t.call(this,wa.apply(null,b));b.shift()}r(za,t);za.prototype.name="AssertionError";function Aa(a,b){throw new za("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));};var y=Array.prototype,Ba=y.indexOf?function(a,b,c){return y.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},Ca=y.forEach?function(a,b,c){y.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=m(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)};
function Da(a){var b;a:{b=Ea;for(var c=a.length,d=m(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:m(a)?a.charAt(b):a[b]}function Fa(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]};function z(a){this.src=a;this.a={};this.b=0}function Ga(a,b,c,d,e){var f=b.toString();b=a.a[f];b||(b=a.a[f]=[],a.b++);var g=Ha(b,c,d,e);-1<g?(a=b[g],a.B=!1):(a=new na(c,a.src,f,!!d,e),a.B=!1,b.push(a));return a}function Ia(a,b){var c=b.type;if(c in a.a){var d=a.a[c],e=Ba(d,b),f;(f=0<=e)&&y.splice.call(d,e,1);f&&(x(b),0==a.a[c].length&&(delete a.a[c],a.b--))}}
z.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.a)if(!a||c==a){for(var d=this.a[c],e=0;e<d.length;e++)++b,x(d[e]);delete this.a[c];this.b--}return b};function Ha(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e];if(!f.v&&f.listener==b&&f.C==!!c&&f.F==d)return e}return-1};var B;a:{var Ja=k.navigator;if(Ja){var Ka=Ja.userAgent;if(Ka){B=Ka;break a}}B=""};var La;function Ma(){}r(Ma,oa);function Na(a){return(a=qa(a))?new ActiveXObject(a):new XMLHttpRequest}function qa(a){if(!a.b&&"undefined"==typeof XMLHttpRequest&&"undefined"!=typeof ActiveXObject){for(var b=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],c=0;c<b.length;c++){var d=b[c];try{return new ActiveXObject(d),a.b=d}catch(e){}}throw Error("Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed");}return a.b}La=new Ma;function C(a,b){this.b={};this.a=[];this.g=this.f=0;var c=arguments.length;if(1<c){if(c%2)throw Error("Uneven number of arguments");for(var d=0;d<c;d+=2)D(this,arguments[d],arguments[d+1])}else if(a){a instanceof C?(c=a.w(),d=a.D()):(c=sa(a),d=ra(a));for(var e=0;e<c.length;e++)D(this,c[e],d[e])}}C.prototype.D=function(){Oa(this);for(var a=[],b=0;b<this.a.length;b++)a.push(this.b[this.a[b]]);return a};C.prototype.w=function(){Oa(this);return this.a.concat()};
C.prototype.clear=function(){this.b={};this.g=this.f=this.a.length=0};function Oa(a){if(a.f!=a.a.length){for(var b=0,c=0;b<a.a.length;){var d=a.a[b];Object.prototype.hasOwnProperty.call(a.b,d)&&(a.a[c++]=d);b++}a.a.length=c}if(a.f!=a.a.length){for(var e={},c=b=0;b<a.a.length;)d=a.a[b],Object.prototype.hasOwnProperty.call(e,d)||(a.a[c++]=d,e[d]=1),b++;a.a.length=c}}function D(a,b,c){Object.prototype.hasOwnProperty.call(a.b,b)||(a.f++,a.a.push(b),a.g++);a.b[b]=c}
C.prototype.forEach=function(a,b){for(var c=this.w(),d=0;d<c.length;d++){var e=c[d];a.call(b,Object.prototype.hasOwnProperty.call(this.b,e)?this.b[e]:void 0,e,this)}};C.prototype.clone=function(){return new C(this)};function Pa(a){if("function"==typeof a.D)return a.D();if(m(a))return a.split("");if(ca(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return ra(a)}
function Qa(a,b){if("function"==typeof a.forEach)a.forEach(b,void 0);else if(ca(a)||m(a))Ca(a,b,void 0);else{var c;if("function"==typeof a.w)c=a.w();else if("function"!=typeof a.D)if(ca(a)||m(a)){c=[];for(var d=a.length,e=0;e<d;e++)c.push(e)}else c=sa(a);else c=void 0;for(var d=Pa(a),e=d.length,f=0;f<e;f++)b.call(void 0,d[f],c&&c[f],a)}};var Ra=-1!=B.indexOf("Opera")||-1!=B.indexOf("OPR"),E=-1!=B.indexOf("Trident")||-1!=B.indexOf("MSIE"),F=-1!=B.indexOf("Gecko")&&-1==B.toLowerCase().indexOf("webkit")&&!(-1!=B.indexOf("Trident")||-1!=B.indexOf("MSIE")),G=-1!=B.toLowerCase().indexOf("webkit");function Sa(){var a=k.document;return a?a.documentMode:void 0}
var Ta=function(){var a="",b;if(Ra&&k.opera)return a=k.opera.version,p(a)?a():a;F?b=/rv\:([^\);]+)(\)|;)/:E?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:G&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(B))?a[1]:"");return E&&(b=Sa(),b>parseFloat(a))?String(b):a}(),Ua={};
function H(a){var b;if(!(b=Ua[a])){b=0;for(var c=xa(String(Ta)).split("."),d=xa(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var g=c[f]||"",h=d[f]||"",n=RegExp("(\\d*)(\\D*)","g"),A=RegExp("(\\d*)(\\D*)","g");do{var v=n.exec(g)||["","",""],L=A.exec(h)||["","",""];if(0==v[0].length&&0==L[0].length)break;b=ya(0==v[1].length?0:parseInt(v[1],10),0==L[1].length?0:parseInt(L[1],10))||ya(0==v[2].length,0==L[2].length)||ya(v[2],L[2])}while(0==b)}b=Ua[a]=0<=b}return b}
var Va=k.document,Wa=Va&&E?Sa()||("CSS1Compat"==Va.compatMode?parseInt(Ta,10):5):void 0;function Xa(a){this.g=a;this.b=this.f=this.a=null}function I(a,b){this.name=a;this.value=b}I.prototype.toString=function(){return this.name};var Ya=new I("SEVERE",1E3),Za=new I("CONFIG",700),$a=new I("FINE",500);function ab(a){if(a.f)return a.f;if(a.a)return ab(a.a);Aa("Root logger has no level set.");return null}
Xa.prototype.log=function(a,b,c){if(a.value>=ab(this).value)for(p(b)&&(b=b()),a=new ia(a,String(b),this.g),c&&(a.a=c),c="log:"+a.b,k.console&&(k.console.timeStamp?k.console.timeStamp(c):k.console.markTimeline&&k.console.markTimeline(c)),k.msWriteProfilerMark&&k.msWriteProfilerMark(c),c=this;c;)c=c.a};var bb={},cb=null;
function db(a){cb||(cb=new Xa(""),bb[""]=cb,cb.f=Za);var b;if(!(b=bb[a])){b=new Xa(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=db(a.substr(0,c));c.b||(c.b={});c.b[d]=b;b.a=c;bb[a]=b}return b};var eb;(eb=!E)||(eb=E&&9<=Wa);var fb=eb,gb=E&&!H("9");!G||H("528");F&&H("1.9b")||E&&H("8")||Ra&&H("9.5")||G&&H("528");F&&!H("8")||E&&H("9");function J(a,b){u.call(this,a?a.type:"");this.f=this.a=this.target=null;if(a){this.type=a.type;this.target=a.target||a.srcElement;this.a=b;var c=a.relatedTarget;if(c&&F)try{va(c.nodeName)}catch(d){}this.f=a;a.defaultPrevented&&this.b()}}r(J,u);J.prototype.b=function(){J.Z.b.call(this);var a=this.f;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,gb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var hb="closure_lm_"+(1E6*Math.random()|0),ib={},jb=0;function K(a,b,c,d,e){if("array"==l(b))for(var f=0;f<b.length;f++)K(a,b[f],c,d,e);else if(c=kb(c),a&&a[w])Ga(a.m,String(b),c,d,e);else{if(!b)throw Error("Invalid event type");var f=!!d,g=lb(a);g||(a[hb]=g=new z(a));c=Ga(g,b,c,d,e);c.a||(d=mb(),c.a=d,d.src=a,d.listener=c,a.addEventListener?a.addEventListener(b.toString(),d,f):a.attachEvent(nb(b.toString()),d),jb++)}}
function mb(){var a=ob,b=fb?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function pb(a,b,c,d,e){if("array"==l(b))for(var f=0;f<b.length;f++)pb(a,b[f],c,d,e);else(c=kb(c),a&&a[w])?(a=a.m,b=String(b).toString(),b in a.a&&(f=a.a[b],c=Ha(f,c,d,e),-1<c&&(x(f[c]),y.splice.call(f,c,1),0==f.length&&(delete a.a[b],a.b--)))):a&&(a=lb(a))&&(b=a.a[b.toString()],a=-1,b&&(a=Ha(b,c,!!d,e)),(c=-1<a?b[a]:null)&&qb(c))}
function qb(a){if("number"!=typeof a&&a&&!a.v){var b=a.src;if(b&&b[w])Ia(b.m,a);else{var c=a.type,d=a.a;b.removeEventListener?b.removeEventListener(c,d,a.C):b.detachEvent&&b.detachEvent(nb(c),d);jb--;(c=lb(b))?(Ia(c,a),0==c.b&&(c.src=null,b[hb]=null)):x(a)}}}function nb(a){return a in ib?ib[a]:ib[a]="on"+a}function rb(a,b,c,d){var e=!0;if(a=lb(a))if(b=a.a[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.C==c&&!f.v&&(f=sb(f,d),e=e&&!1!==f)}return e}
function sb(a,b){var c=a.listener,d=a.F||a.src;a.B&&qb(a);return c.call(d,b)}
function ob(a,b){if(a.v)return!0;if(!fb){var c;if(!(c=b))a:{c=["window","event"];for(var d=k,e;e=c.shift();)if(null!=d[e])d=d[e];else{c=null;break a}c=d}e=c;c=new J(e,this);d=!0;if(!(0>e.keyCode||void 0!=e.returnValue)){a:{var f=!1;if(0==e.keyCode)try{e.keyCode=-1;break a}catch(n){f=!0}if(f||void 0==e.returnValue)e.returnValue=!0}e=[];for(f=c.a;f;f=f.parentNode)e.push(f);for(var f=a.type,g=e.length-1;0<=g;g--){c.a=e[g];var h=rb(e[g],f,!0,c),d=d&&h}for(g=0;g<e.length;g++)c.a=e[g],h=rb(e[g],f,!1,c),
d=d&&h}return d}return sb(a,new J(b,this))}function lb(a){a=a[hb];return a instanceof z?a:null}var tb="__closure_events_fn_"+(1E9*Math.random()>>>0);function kb(a){if(p(a))return a;a[tb]||(a[tb]=function(b){return a.handleEvent(b)});return a[tb]};function M(){ka.call(this);this.m=new z(this);this.O=this}r(M,ka);M.prototype[w]=!0;M.prototype.addEventListener=function(a,b,c,d){K(this,a,b,c,d)};M.prototype.removeEventListener=function(a,b,c,d){pb(this,a,b,c,d)};function N(a,b){var c=a.O,d=b,e=d.type||d;if(m(d))d=new u(d,c);else if(d instanceof u)d.target=d.target||c;else{var f=d,d=new u(e,c);ua(d,f)}c=d.a=c;ub(c,e,!0,d);ub(c,e,!1,d)}M.prototype.removeAllListeners=function(a){return this.m?this.m.removeAll(a):0};
function ub(a,b,c,d){if(b=a.m.a[String(b)]){b=b.concat();for(var e=!0,f=0;f<b.length;++f){var g=b[f];if(g&&!g.v&&g.C==c){var h=g.listener,n=g.F||g.src;g.B&&Ia(a.m,g);e=!1!==h.call(n,d)&&e}}}};function O(a,b){a&&a.log($a,b,void 0)};function vb(a,b,c){if(p(a))c&&(a=q(a,c));else if(a&&"function"==typeof a.handleEvent)a=q(a.handleEvent,a);else throw Error("Invalid listener argument");return 2147483647<b?-1:k.setTimeout(a,b||0)};var wb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#(.*))?$/;function xb(a){if(yb){yb=!1;var b=k.location;if(b){var c=b.href;if(c&&(c=(c=xb(c)[3]||null)?decodeURI(c):c)&&c!=b.hostname)throw yb=!0,Error();}}return a.match(wb)}var yb=G;function P(a){M.call(this);this.S=new C;this.u=a||null;this.b=!1;this.s=this.c=null;this.a=this.M=this.j="";this.f=this.I=this.i=this.H=!1;this.g=0;this.l=null;this.J=zb;this.o=this.V=!1}r(P,M);var zb="",Ab=P.prototype,Bb=db("goog.net.XhrIo");Ab.h=Bb;var Cb=/^https?$/i,Db=["POST","PUT"];
P.prototype.send=function(a,b,c,d){if(this.c)throw Error("[goog.net.XhrIo] Object is active with another request="+this.j+"; newUri="+a);b=b?b.toUpperCase():"GET";this.j=a;this.a="";this.M=b;this.H=!1;this.b=!0;this.c=this.u?Na(this.u):Na(La);this.s=this.u?pa(this.u):pa(La);this.c.onreadystatechange=q(this.N,this);try{O(this.h,Q(this,"Opening Xhr")),this.I=!0,this.c.open(b,String(a),!0),this.I=!1}catch(f){O(this.h,Q(this,"Error opening Xhr: "+f.message));Eb(this,f);return}a=c||"";var e=this.S.clone();
d&&Qa(d,function(a,b){D(e,b,a)});d=Da(e.w());c=k.FormData&&a instanceof k.FormData;!(0<=Ba(Db,b))||d||c||D(e,"Content-Type","application/x-www-form-urlencoded;charset=utf-8");e.forEach(function(a,b){this.c.setRequestHeader(b,a)},this);this.J&&(this.c.responseType=this.J);"withCredentials"in this.c&&(this.c.withCredentials=this.V);try{Fb(this),0<this.g&&(this.o=Gb(this.c),O(this.h,Q(this,"Will abort after "+this.g+"ms if incomplete, xhr2 "+this.o)),this.o?(this.c.timeout=this.g,this.c.ontimeout=q(this.K,
this)):this.l=vb(this.K,this.g,this)),O(this.h,Q(this,"Sending request")),this.i=!0,this.c.send(a),this.i=!1}catch(f){O(this.h,Q(this,"Send error: "+f.message)),Eb(this,f)}};function Gb(a){return E&&H(9)&&"number"==typeof a.timeout&&void 0!==a.ontimeout}function Ea(a){return"content-type"==a.toLowerCase()}
P.prototype.K=function(){"undefined"!=typeof aa&&this.c&&(this.a="Timed out after "+this.g+"ms, aborting",O(this.h,Q(this,this.a)),N(this,"timeout"),this.c&&this.b&&(O(this.h,Q(this,"Aborting")),this.b=!1,this.f=!0,this.c.abort(),this.f=!1,N(this,"complete"),N(this,"abort"),Hb(this)))};function Eb(a,b){a.b=!1;a.c&&(a.f=!0,a.c.abort(),a.f=!1);a.a=b;Ib(a);Hb(a)}function Ib(a){a.H||(a.H=!0,N(a,"complete"),N(a,"error"))}P.prototype.N=function(){this.A||(this.I||this.i||this.f?Jb(this):this.U())};
P.prototype.U=function(){Jb(this)};function Jb(a){if(a.b&&"undefined"!=typeof aa)if(a.s[1]&&4==R(a)&&2==Kb(a))O(a.h,Q(a,"Local request error detected and ignored"));else if(a.i&&4==R(a))vb(a.N,0,a);else if(N(a,"readystatechange"),4==R(a)){O(a.h,Q(a,"Request complete"));a.b=!1;try{if(Lb(a))N(a,"complete"),N(a,"success");else{var b;try{b=2<R(a)?a.c.statusText:""}catch(c){O(a.h,"Can not get status: "+c.message),b=""}a.a=b+" ["+Kb(a)+"]";Ib(a)}}finally{Hb(a)}}}
function Hb(a){if(a.c){Fb(a);var b=a.c,c=a.s[0]?ba:null;a.c=null;a.s=null;N(a,"ready");try{b.onreadystatechange=c}catch(d){(a=a.h)&&a.log(Ya,"Problem encountered resetting onreadystatechange: "+d.message,void 0)}}}function Fb(a){a.c&&a.o&&(a.c.ontimeout=null);"number"==typeof a.l&&(k.clearTimeout(a.l),a.l=null)}
function Lb(a){var b=Kb(a),c;a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:c=!0;break a;default:c=!1}if(!c){if(b=0===b)a=xb(String(a.j))[1]||null,!a&&self.location&&(a=self.location.protocol,a=a.substr(0,a.length-1)),b=!Cb.test(a?a.toLowerCase():"");c=b}return c}function R(a){return a.c?a.c.readyState:0}function Kb(a){try{return 2<R(a)?a.c.status:-1}catch(b){return-1}}function Q(a,b){return b+" ["+a.M+" "+a.j+" "+Kb(a)+"]"};google.load("visualization","1",{packages:["table","corechart","annotatedtimeline"]});
function S(a){this.b=a||new P;this.a=[];this.l=this.o=this.f=!1;this.g={};for(var b in T)document.getElementById(T[b]).className="pagespeed-hidden-offscreen";a=document.createElement("table");a.id="nav-bar";a.className="pagespeed-sub-tabs";a.innerHTML='<tr><td><a id="'+Mb+'" href="javascript:void(0);">Per application cache stats</a> - </td><td><a id="'+Nb+'" href="javascript:void(0);">Per type cache stats</a> - </td><td><a id="'+Ob+'" href="javascript:void(0);">IPRO status</a> - </td><td><a id="'+
Pb+'" href="javascript:void(0);">Image rewriting</a> - </td><td><a id="'+Qb+'" href="javascript:void(0);">Realtime</a></td></tr>';b=document.createElement("div");b.id="ui-div";b.innerHTML='<table id="ui-table" border=1 style="border-collapse: collapse;border-color:silver;"><tr valign="center"><td>Auto refresh (every 5 seconds): <input type="checkbox" id="auto-refresh" '+(this.f?"checked":"")+"></td></tr></table>";document.body.insertBefore(b,document.getElementById(U));document.body.insertBefore(a,
document.getElementById("ui-div"))}S.prototype.i=function(a){for(var b in T){var c=T[b];document.getElementById(c).className=c==a?"":"pagespeed-hidden-offscreen"}c=document.getElementById(a+"_mode");for(b in Rb){var d=document.getElementById(Rb[b]);d.className=d==c?"pagespeed-underline-link":""}location.href=location.href.split("#")[0]+"#"+a};S.prototype.s=function(){var a=location.hash.substr(1);if(""==a)this.i(U);else{var b;a:{b=T;for(var c in b)if(b[c]==a){b=!0;break a}b=!1}b&&this.i(a)}};
var Mb="cache_applied_mode",Nb="cache_type_mode",Ob="ipro_mode",Pb="image_rewriting_mode",Qb="realtime_mode",Rb={P:Mb,R:Nb,W:Ob,Y:Pb,X:Qb},U="cache_applied",T={P:U,R:"cache_type",W:"ipro",Y:"image_rewriting",X:"realtime"};S.prototype.A=function(){this.f=!this.f};
S.prototype.j=function(){if(!this.b.c)if(!this.o){this.o=!0;var a=new Date,b;b="?json&start_time="+(new Date(a-864E5)).getTime();b+="&end_time="+a.getTime();this.b.send(b+"&granularity=5000")}else if(!this.l||this.f)this.l=!0,a=location.pathname,b=a.lastIndexOf("/",a.length-2),this.b.send(0<b?a.substring(0,b)+"/stats_json":a+"/stats_json")};
S.prototype.u=function(){if(Lb(this.b)){var a;var b=this.b;try{a=b.c?b.c.responseText:""}catch(f){O(b.h,"Can not get responseText: "+f.message),a=""}if(this.l){var c=JSON.parse(a).variables;a=[];for(var d in c)a.push({name:d,value:c[d]});this.a.push({G:a,L:new Date});17280<this.a.length&&this.a.shift();V(this,"pcache-cohorts-dom","Property cache dom cohorts",U);V(this,"pcache-cohorts-beacon","Property cache beacon cohorts",U);V(this,"rewrite_cached_output","Rewrite cached output",U);V(this,"url_input",
"URL Input",U);V(this,"cache","Cache","cache_type");V(this,"file_cache","File Cache","cache_type");V(this,"memcached","Memcached","cache_type");V(this,"lru_cache","LRU","cache_type");V(this,"shm_cache","Shared Memory","cache_type");V(this,"ipro","In place resource optimization","ipro");V(this,"image_rewrite","Image rewrite","image_rewriting");V(this,"image_rewrites_dropped","Image rewrites dropped","image_rewriting");W(this,"http","Http");W(this,"file_cache","File Cache RT");W(this,"lru_cache","LRU Cache RT");
W(this,"serf_fetch","Serf stats RT");W(this,"rewrite","Rewrite stats RT")}else{a=JSON.parse(a);d=a.timestamps;a=a.variables;for(b=0;b<d.length;++b){var e=[];for(c in a)e.push({name:c,value:a[c][b]});this.a.push({G:e,L:new Date(d[b])})}window.setTimeout(q(this.j,this),0)}}else c=this.b,console.log(m(c.a)?c.a:String(c.a))};
function Sb(a,b){var c=!0;0!=b.indexOf(a)?c=!1:0<=b.indexOf("cache_flush_timestamp_ms")?c=!1:0<=b.indexOf("cache_flush_count")?c=!1:0<=b.indexOf("cache_time_us")&&(c=!1);return c}
function Tb(a,b,c,d,e){if(a.g[c])d=a.g[c];else{e=document.getElementById(e);"Loading Charts..."==e.textContent&&(e.textContent="");var f=document.createElement("div");"AnnotatedTimeLine"==d&&(f.className="pagespeed-graphs-chart");f.id=b;b=document.createElement("p");b.textContent=c;b.className="pagespeed-graphs-title";e.appendChild(b);e.appendChild(f);d=new google.visualization[d](f);a.g[c]=d}return d}
function V(a,b,c,d){var e="pagespeed-graphs-"+b;b+="_";c=Tb(a,e,c,"BarChart",d);e=document.getElementById(e);d=[];for(var f=new google.visualization.DataTable,g=Fa(a.a[a.a.length-1].G),h=a=0;h<g.length;++h)if(Sb(b,g[h].name)){++a;var n=g[h].name.substring(b.length),n=n.replace(/_/g," ");d.push([n,Number(g[h].value)])}f.addColumn("string","Name");f.addColumn("number","Value");f.addRows(d);b=new google.visualization.DataView(f);b.setColumns([0,1,{calc:function(a,b){for(var c=0,d=0;d<a.getNumberOfRows();++d)c+=
a.getValue(d,1);d=a.getValue(b,1);return d.toString()+" ("+(100*d/(0==c?1:c)).toFixed(2).toString()+"%)"},type:"string",role:"annotation"}]);a=40*a+10;e.style.height=a+20;c.draw(b,{annotations:{alwaysOutside:!0,highContrast:!0,textStyle:{fontSize:12,color:"black"}},hAxis:{direction:1},vAxis:{textPosition:"out"},legend:{position:"none"},width:800,height:a,chartArea:{left:225,top:0,width:"60%",height:"80%"}})}
function W(a,b,c){var d=b+"_";b=Tb(a,"pagespeed-graphs-"+b,c,"AnnotatedTimeLine","realtime");c=[];var e=new google.visualization.DataTable;e.addColumn("datetime","Time");for(var f=!0,g=0;g<a.a.length;++g){var h=Fa(a.a[g].G),n=[];n.push(a.a[g].L);for(var A=0;A<h.length;++A)if(Sb(d,h[A].name)&&(n.push(Number(h[A].value)),f)){var v=h[A].name.substring(d.length),v=v.replace(/_/g," ");e.addColumn("number",v)}f=!1;c.push(n)}e.addRows(c);b.draw(e,Ub)}var Ub={thickness:1,displayExactValues:!0,legendPosition:"newRow"};
function Vb(){K(window,"load",function(){var a=new S;a.s();for(var b in T)K(document.getElementById(Rb[b]),"click",q(a.i,a,T[b]));K(window,"hashchange",q(a.s,a));K(document.getElementById("auto-refresh"),"change",q(a.A,a));K(a.b,"complete",q(a.u,a));setInterval(q(a.j,a),5E3);a.j()})}var X=["pagespeed","Graphs","Start"],Y=k;X[0]in Y||!Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===Vb?Y[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Vb;})();
