function linkbrowser(){var M='',nb='" for "gwt:onLoadErrorFn"',lb='" for "gwt:onPropertyErrorFn"',Y='"><\/script>',$='#',wb='&',Vb='.cache.html',ab='/',Nb='0A3F2DF0F25E00AFC73FEF40850F607F',Ob='2B056295F43F0346CC029B0582C06209',Pb='3E3EC61CD418108F6E6D72167ED45135',Qb='57B950BF69368BE421F3D18D964E3CCC',Rb='5AF03B89F64D8C85BD046C4F4AE169CE',Sb='657FED7548BF14C8C9BDF2A43FE36267',Tb='73CD56192F1D68FCABF917A82D3AA41B',Ub='93CDFACAA545D1A6171500FCDF3C52A4',Xb='<script defer="defer">linkbrowser.onInjectionDone(\'linkbrowser\')<\/script>',X='<script id="',ib='=',_='?',kb='Bad handler "',Wb='DOMContentLoaded',Z='SCRIPT',zb='Unexpected exception in locale detection, using default: ',yb='_',xb='__gwt_Locale',W='__gwt_marker_linkbrowser',bb='base',Q='begin',P='bootstrap',db='clear.cache.gif'/*tpa=http://10.20.160.198/wiki/s/en/2166/34/3.5.9/_/download/resources/com.atlassian.confluence.plugins.linkbrowser:linkbrowser-resources/war/linkbrowser/clear.cache.gif*/,hb='content',ub='default',tb='en',V='end',Hb='gecko',Ib='gecko1_8',R='gwt.codesvr=',S='gwt.hosted=',T='gwt.hybrid',mb='gwt:onLoadErrorFn',jb='gwt:onPropertyErrorFn',gb='gwt:property',Lb='http://10.20.160.198/wiki/s/en/2166/34/3.5.9/_/download/resources/com.atlassian.confluence.plugins.linkbrowser:linkbrowser-resources/war/linkbrowser/hosted.html?linkbrowser',Gb='ie6',Fb='ie8',ob='iframe',cb='img',pb="javascript:''",N='linkbrowser',Kb='loadExternalRefs',sb='locale',vb='locale=',eb='meta',rb='moduleRequested',U='moduleStartup',Eb='msie',fb='name',Bb='opera',qb='position:absolute;width:0;height:0;border:none',Db='safari',Mb='selectingPermutation',O='startup',Jb='unknown',Ab='user.agent',Cb='webkit';var k=window,l=document,m=k.__gwtStatsEvent?function(a){return k.__gwtStatsEvent(a)}:null,n=k.__gwtStatsSessionId?k.__gwtStatsSessionId:null,o,p,q,r=M,s={},t=[],u=[],v=[],w,x;m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:P,millis:(new Date).getTime(),type:Q});if(!k.__gwt_stylesLoaded){k.__gwt_stylesLoaded={}}if(!k.__gwt_scriptsLoaded){k.__gwt_scriptsLoaded={}}function y(){var b=false;try{var c=k.location.search;return (c.indexOf(R)!=-1||(c.indexOf(S)!=-1||k.external&&k.external.gwtOnLoad))&&c.indexOf(T)==-1}catch(a){}y=function(){return b};return b}
function z(){if(o&&p){var b=l.getElementById(N);var c=b.contentWindow;if(y()){c.__gwt_getProperty=function(a){return F(a)}}linkbrowser=null;c.gwtOnLoad(w,N,r);m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:U,millis:(new Date).getTime(),type:V})}}
function A(){var e,f=W,g;l.write(X+f+Y);g=l.getElementById(f);e=g&&g.previousSibling;while(e&&e.tagName!=Z){e=e.previousSibling}function h(a){var b=a.lastIndexOf($);if(b==-1){b=a.length}var c=a.indexOf(_);if(c==-1){c=a.length}var d=a.lastIndexOf(ab,Math.min(c,b));return d>=0?a.substring(0,d+1):M}
;if(e&&e.src){r=h(e.src)}if(r==M){var i=l.getElementsByTagName(bb);if(i.length>0){r=i[i.length-1].href}else{r=h(l.location.href)}}else if(r.match(/^\w+:\/\//)){}else{var j=l.createElement(cb);j.src=r+db;r=h(j.src)}if(g){g.parentNode.removeChild(g)}}
function B(){var b=document.getElementsByTagName(eb);for(var c=0,d=b.length;c<d;++c){var e=b[c],f=e.getAttribute(fb),g;if(f){if(f==gb){g=e.getAttribute(hb);if(g){var h,i=g.indexOf(ib);if(i>=0){f=g.substring(0,i);h=g.substring(i+1)}else{f=g;h=M}s[f]=h}}else if(f==jb){g=e.getAttribute(hb);if(g){try{x=eval(g)}catch(a){alert(kb+g+lb)}}}else if(f==mb){g=e.getAttribute(hb);if(g){try{w=eval(g)}catch(a){alert(kb+g+nb)}}}}}}
function C(a,b){return b in t[a]}
function D(a){var b=s[a];return b==null?null:b}
function E(a,b){var c=v;for(var d=0,e=a.length-1;d<e;++d){c=c[a[d]]||(c[a[d]]=[])}c[a[e]]=b}
function F(a){var b=u[a](),c=t[a];if(b in c){return b}var d=[];for(var e in c){d[c[e]]=e}if(x){x(a,d,b)}throw null}
var G;function H(){if(!G){G=true;var a=l.createElement(ob);a.src=pb;a.id=N;a.style.cssText=qb;a.tabIndex=-1;l.body.appendChild(a);m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:U,millis:(new Date).getTime(),type:rb});a.contentWindow.location.replace(r+J)}}
u[sb]=function(){try{var b;var c=tb||ub;if(b==null){var d=location.search;var e=d.indexOf(vb);if(e>=0){var f=d.substring(e);var g=f.indexOf(ib)+1;var h=f.indexOf(wb);if(h==-1){h=f.length}b=f.substring(g,h)}}if(b==null){b=D(sb)}if(b==null){b=k[xb]}else{k[xb]=b||c}if(b==null){return c}while(!C(sb,b)){var i=b.lastIndexOf(yb);if(i==-1){b=c;break}else{b=b.substring(0,i)}}return b}catch(a){alert(zb+a);return ub}};t[sb]={'default':0,en:1};u[Ab]=function(){var b=navigator.userAgent.toLowerCase();var c=function(a){return parseInt(a[1])*1000+parseInt(a[2])};if(b.indexOf(Bb)!=-1){return Bb}else if(b.indexOf(Cb)!=-1){return Db}else if(b.indexOf(Eb)!=-1){if(document.documentMode>=8){return Fb}else{var d=/msie ([0-9]+)\.([0-9]+)/.exec(b);if(d&&d.length==3){var e=c(d);if(e>=6000){return Gb}}}}else if(b.indexOf(Hb)!=-1){var d=/rv:([0-9]+)\.([0-9]+)/.exec(b);if(d&&d.length==3){if(c(d)>=1008)return Ib}return Hb}return Jb};t[Ab]={gecko:0,gecko1_8:1,ie6:2,ie8:3,opera:4,safari:5};linkbrowser.onScriptLoad=function(){if(G){p=true;z()}};linkbrowser.onInjectionDone=function(){o=true;m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:Kb,millis:(new Date).getTime(),type:V});z()};A();var I;var J;if(y()){if(k.external&&(k.external.initModule&&k.external.initModule(N))){k.location.reload();return}J=Lb;I=M}B();m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:P,millis:(new Date).getTime(),type:Mb});if(!y()){try{E([ub,Hb],Nb);E([tb,Hb],Nb);E([tb,Fb],Ob);E([ub,Db],Pb);E([tb,Db],Pb);E([tb,Gb],Qb);E([ub,Ib],Rb);E([tb,Ib],Rb);E([ub,Gb],Sb);E([ub,Fb],Tb);E([ub,Bb],Ub);E([tb,Bb],Ub);I=v[F(sb)][F(Ab)];J=I+Vb}catch(a){return}}var K;function L(){if(!q){q=true;z();if(l.removeEventListener){l.removeEventListener(Wb,L,false)}if(K){clearInterval(K)}}}
if(l.addEventListener){l.addEventListener(Wb,function(){H();L()},false)}var K=setInterval(function(){if(/loaded|complete/.test(l.readyState)){H();L()}},50);m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:P,millis:(new Date).getTime(),type:V});m&&m({moduleName:N,sessionId:n,subSystem:O,evtGroup:Kb,millis:(new Date).getTime(),type:Q});l.write(Xb)}
linkbrowser();