(function(){var f=this;
function g(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 h(a,b,c){return a.call.apply(a.bind,arguments)}function k(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 n(a,b,c){n=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?h:k;return n.apply(null,arguments)}var p=Date.now||function(){return+new Date};function r(a,b){function c(){}c.prototype=b.prototype;a.A=b.prototype;a.prototype=new c;a.w=function(a,c,l){for(var q=Array(arguments.length-2),m=2;m<arguments.length;m++)q[m-2]=arguments[m];return b.prototype[c].apply(a,q)}};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 u(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")}function v(a,b){return-1!=a.indexOf(b)};function w(a,b){b.unshift(a);t.call(this,u.apply(null,b));b.shift()}r(w,t);w.prototype.name="AssertionError";function x(a,b){throw new w("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1));};var y;a:{var z=f.navigator;if(z){var A=z.userAgent;if(A){y=A;break a}}y=""};var B=v(y,"Opera")||v(y,"OPR"),C=v(y,"Trident")||v(y,"MSIE"),D=v(y,"Edge"),E=v(y,"Gecko")&&!(v(y.toLowerCase(),"webkit")&&!v(y,"Edge"))&&!(v(y,"Trident")||v(y,"MSIE"))&&!v(y,"Edge"),aa=v(y.toLowerCase(),"webkit")&&!v(y,"Edge");function ba(){var a=y;if(E)return/rv\:([^\);]+)(\)|;)/.exec(a);if(D)return/Edge\/([\d\.]+)/.exec(a);if(C)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(aa)return/WebKit\/(\S+)/.exec(a)}
(function(){if(B&&f.opera){var a;var b=f.opera.version;try{a=b()}catch(c){a=b}return a}a="";(b=ba())&&(a=b?b[1]:"");return C&&(b=(b=f.document)?b.documentMode:void 0,b>parseFloat(a))?String(b):a})();function F(a,b,c,d,e){this.reset(a,b,c,d,e)}F.prototype.j=null;var ca=0;F.prototype.reset=function(a,b,c,d,e){"number"==typeof e||ca++;d||p();this.c=a;this.u=b;delete this.j};F.prototype.m=function(a){this.c=a};F.prototype.getMessage=function(){return this.u};function G(a){this.v=a;this.l=this.h=this.c=this.f=null}function H(a,b){this.name=a;this.value=b}H.prototype.toString=function(){return this.name};var I=new H("WARNING",900),da=new H("CONFIG",700);G.prototype.getParent=function(){return this.f};G.prototype.getChildren=function(){this.h||(this.h={});return this.h};G.prototype.m=function(a){this.c=a};function J(a){if(a.c)return a.c;if(a.f)return J(a.f);x("Root logger has no level set.");return null}
G.prototype.log=function(a,b,c){if(a.value>=J(this).value)for("function"==g(b)&&(b=b()),a=new F(a,String(b),this.v),c&&(a.j=c),c="log:"+a.getMessage(),f.console&&(f.console.timeStamp?f.console.timeStamp(c):f.console.markTimeline&&f.console.markTimeline(c)),f.msWriteProfilerMark&&f.msWriteProfilerMark(c),c=this;c;){b=c;var d=a;if(b.l)for(var e=0,l=void 0;l=b.l[e];e++)l(d);c=c.getParent()}};var K={},L=null;
function M(a){L||(L=new G(""),K[""]=L,L.m(da));var b;if(!(b=K[a])){b=new G(a);var c=a.lastIndexOf("."),d=a.substr(c+1),c=M(a.substr(0,c));c.getChildren()[d]=b;b.f=c;K[a]=b}return b};function N(a){this.i=a;this.i._wect=this;this.b={};this.a={};this.g={}}N.prototype.s=M("wireless.events.ListenerCoalescer");function ea(a){a._wect||new N(a);return a._wect}N.prototype.o=function(a,b){void 0==this.b[a]&&(this.b[a]=0);this.b[a]++;for(var c=this.a[a],d=c.length,e,l=0;l<d;l++)try{c[l](b)}catch(m){var q=this.s;q&&q.log(I,"Exception during event processing.",m);e=e||m}this.b[a]--;if(e)throw e;};function O(a,b){a.g[b]||(a.g[b]=n(a.o,a,b));return a.g[b]}
function P(a,b,c){var d=b+":capture";a.a[d]||(a.a[d]=[],a.i.addEventListener(b,O(a,d),!0));a.a[d].push(c)};function fa(){var a=Q,b=document,c=ga,d=ea(b);P(d,c,a);ha(b,function(){P(d,c,a)},function(){var b=c+":capture";if(d.a[b]){d.b[b]&&(d.a[b]=d.a[b].slice(0));var l=d.a[b].indexOf(a);-1!=l&&d.a[b].splice(l,1);0==d.a[b].length&&(d.a[b]=void 0,d.i.removeEventListener(c,O(d,b),!0))}})}function ha(a,b,c){a.addEventListener("DOMFocusIn",function(a){a.target&&"TEXTAREA"==a.target.tagName&&b()},!1);a.addEventListener("DOMFocusOut",function(a){a.target&&"TEXTAREA"==a.target.tagName&&c()},!1)};function R(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b?b:0}R.prototype.toString=function(){return"("+this.x+", "+this.y+")"};var ia=/Mac OS X.+Silk\//,ja=/Chrome\/([0-9.]+)/;var S=/iPhone|iPod|iPad/.test(navigator.userAgent)||v(navigator.userAgent,"Android")||ia.test(navigator.userAgent),T=window.navigator.msPointerEnabled,ga=S?"touchstart":T?"MSPointerDown":"mousedown",ka=S?"touchend":T?"MSPointerUp":"mouseup";function la(){var a=Q;return function(b){b.touches=[];b.targetTouches=[];b.changedTouches=[];b.type!=ka&&(b.touches[0]=b,b.targetTouches[0]=b);b.changedTouches[0]=b;a(b)}}
function U(a){var b;if(b=v(navigator.userAgent,"Android")&&v(navigator.userAgent,"Chrome/"))b=ja.exec(navigator.userAgent),b=18==+(b?b[1]:"").split(".")[0];return b?new R(a.clientX,a.pageY-window.scrollY):new R(a.clientX,a.clientY)};var V,W,X,Y=M("wireless.events.clickbuster");function ma(a){if(!(2500<p()-W)){var b=U(a);if(1>b.x&&1>b.y)Y&&Y.log(I,"Not busting click on label elem at ("+b.x+", "+b.y+")",void 0);else{for(var c=0;c<V.length;c+=2)if(25>Math.abs(b.x-V[c])&&25>Math.abs(b.y-V[c+1])){V.splice(c,c+2);return}Y&&Y.log(I,"busting click at "+b.x+", "+b.y,void 0);a.stopPropagation();a.preventDefault();(a=X)&&a()}}}
function na(a){var b=U((a.touches||[a])[0]);V.push(b.x,b.y);window.setTimeout(function(){for(var a=b.x,d=b.y,e=0;e<V.length;e+=2)if(V[e]==a&&V[e+1]==d){V.splice(e,e+2);break}X=void 0},2500)};X=void 0;if(!V){document.addEventListener("click",ma,!0);var Q=na;S||T||(Q=la());fa();V=[]}W=p();for(var Z=0;Z<V.length;Z+=2)if(25>Math.abs(0-V[Z])&&25>Math.abs(0-V[Z+1])){V.splice(Z,Z+2);break};})();
