/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
;!function(d,c){"object"==typeof module&&"object"==typeof module.exports?module.exports=d.document?c(d,!0):function(b){if(!b.document){throw new Error("jQuery requires a window with a document")}return c(b)}:c(d)}("undefined"!=typeof window?window:this,function(bP,bO){var bN=[],bM=bP.document,bL=Object.getPrototypeOf,bJ=bN.slice,bH=bN.concat,bG=bN.push,bF=bN.indexOf,bE={},bD=bE.toString,bC=bE.hasOwnProperty,bB=bC.toString,bA=bB.call(Object),bz={};function by(e,d){d=d||bM;var f=d.createElement("script");f.text=e,d.head.appendChild(f).parentNode.removeChild(f)}var bw="3.1.1",bv=function(d,c){return new bv.fn.init(d,c)},bu=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bt=/^-ms-/,bs=/-([a-z])/g,br=function(d,c){return c.toUpperCase()};bv.fn=bv.prototype={jquery:bw,constructor:bv,length:0,toArray:function(){return bJ.call(this)},get:function(b){return null==b?bJ.call(this):b<0?this[b+this.length]:this[b]},pushStack:function(d){var c=bv.merge(this.constructor(),d);return c.prevObject=this,c},each:function(b){return bv.each(this,b)},map:function(b){return this.pushStack(bv.map(this,function(a,d){return b.call(a,d,a)}))},slice:function(){return this.pushStack(bJ.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var d=this.length,f=+e+(e<0?d:0);return this.pushStack(f>=0&&f<d?[this[f]]:[])},end:function(){return this.prevObject||this.constructor()},push:bG,sort:bN.sort,splice:bN.splice},bv.extend=bv.fn.extend=function(){var t,s,r,q,p,o,n=arguments[0]||{},m=1,l=arguments.length,k=!1;for("boolean"==typeof n&&(k=n,n=arguments[m]||{},m++),"object"==typeof n||bv.isFunction(n)||(n={}),m===l&&(n=this,m--);m<l;m++){if(null!=(t=arguments[m])){for(s in t){r=n[s],q=t[s],n!==q&&(k&&q&&(bv.isPlainObject(q)||(p=bv.isArray(q)))?(p?(p=!1,o=r&&bv.isArray(r)?r:[]):o=r&&bv.isPlainObject(r)?r:{},n[s]=bv.extend(k,o,q)):void 0!==q&&(n[s]=q))}}}return n},bv.extend({expando:"jQuery"+(bw+Math.random()).replace(/\D/g,""),isReady:!0,error:function(b){throw new Error(b)},noop:function(){},isFunction:function(b){return"function"===bv.type(b)},isArray:Array.isArray,isWindow:function(b){return null!=b&&b===b.window},isNumeric:function(d){var c=bv.type(d);return("number"===c||"string"===c)&&!isNaN(d-parseFloat(d))},isPlainObject:function(e){var d,f;return !(!e||"[object Object]"!==bD.call(e))&&(!(d=bL(e))||(f=bC.call(d,"constructor")&&d.constructor,"function"==typeof f&&bB.call(f)===bA))},isEmptyObject:function(d){var c;for(c in d){return !1}return !0},type:function(b){return null==b?b+"":"object"==typeof b||"function"==typeof b?bE[bD.call(b)]||"object":typeof b},globalEval:function(b){by(b)},camelCase:function(b){return b.replace(bt,"ms-").replace(bs,br)},nodeName:function(d,c){return d.nodeName&&d.nodeName.toLowerCase()===c.toLowerCase()},each:function(f,e){var h,g=0;if(bq(f)){for(h=f.length;g<h;g++){if(e.call(f[g],g,f[g])===!1){break}}}else{for(g in f){if(e.call(f[g],g,f[g])===!1){break}}}return f},trim:function(b){return null==b?"":(b+"").replace(bu,"")},makeArray:function(e,d){var f=d||[];return null!=e&&(bq(Object(e))?bv.merge(f,"string"==typeof e?[e]:e):bG.call(f,e)),f},inArray:function(e,d,f){return null==d?-1:bF.call(d,e,f)},merge:function(g,f){for(var j=+f.length,i=0,h=g.length;i<j;i++){g[h++]=f[i]}return g.length=h,g},grep:function(j,i,p){for(var o,n=[],m=0,l=j.length,k=!p;m<l;m++){o=!i(j[m],m),o!==k&&n.push(j[m])}return n},map:function(i,g,n){var m,l,k=0,j=[];if(bq(i)){for(m=i.length;k<m;k++){l=g(i[k],k,n),null!=l&&j.push(l)}}else{for(k in i){l=g(i[k],k,n),null!=l&&j.push(l)}}return bH.apply([],j)},guid:1,proxy:function(g,f){var j,i,h;if("string"==typeof f&&(j=g[f],f=g,g=j),bv.isFunction(g)){return i=bJ.call(arguments,2),h=function(){return g.apply(f||this,i.concat(bJ.call(arguments)))},h.guid=g.guid=g.guid||bv.guid++,h}},now:Date.now,support:bz}),"function"==typeof Symbol&&(bv.fn[Symbol.iterator]=bN[Symbol.iterator]),bv.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(d,c){bE["[object "+c+"]"]=c.toLowerCase()});function bq(e){var d=!!e&&"length" in e&&e.length,f=bv.type(e);return"function"!==f&&!bv.isWindow(e)&&("array"===f||0===d||"number"==typeof d&&d>0&&d-1 in e)}var bp=function(dl){var dk,dj,dh,dg,df,de,dd,db,c9,c8,c7,c6,c4,c3,c2,c1,c0,cZ,cY,cX="sizzle"+1*new Date,cW=dl.document,cV=0,cU=0,cT=dH(),cS=dH(),dR=dH(),dQ=function(d,c){return d===c&&(c7=!0),0},dP={}.hasOwnProperty,dO=[],dM=dO.pop,dL=dO.push,dK=dO.push,dJ=dO.slice,dI=function(f,e){for(var h=0,g=f.length;h<g;h++){if(f[h]===e){return h}}return -1},dG="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",dF="[\\x20\\t\\r\\n\\f]",dE="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",dD="\\["+dF+"*("+dE+")(?:"+dF+"*([*^$|!~]?=)"+dF+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+dE+"))|)"+dF+"*\\]",dC=":("+dE+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+dD+")*)|.*)\\)|)",dB=new RegExp(dF+"+","g"),dz=new RegExp("^"+dF+"+|((?:^|[^\\\\])(?:\\\\.)*)"+dF+"+$","g"),dy=new RegExp("^"+dF+"*,"+dF+"*"),dx=new RegExp("^"+dF+"*([>+~]|"+dF+")"+dF+"*"),dw=new RegExp("="+dF+"*([^\\]'\"]*?)"+dF+"*\\]","g"),dv=new RegExp(dC),du=new RegExp("^"+dE+"$"),dt={ID:new RegExp("^#("+dE+")"),CLASS:new RegExp("^\\.("+dE+")"),TAG:new RegExp("^("+dE+"|[*])"),ATTR:new RegExp("^"+dD),PSEUDO:new RegExp("^"+dC),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+dF+"*(even|odd|(([+-]|)(\\d*)n|)"+dF+"*(?:([+-]|)"+dF+"*(\\d+)|))"+dF+"*\\)|)","i"),bool:new RegExp("^(?:"+dG+")$","i"),needsContext:new RegExp("^"+dF+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+dF+"*((?:-\\d)?\\d*)"+dF+"*\\)|)(?=[^-]|$)","i")},ds=/^(?:input|select|textarea|button)$/i,dr=/^h\d$/i,dq=/^[^{]+\{\s*\[native \w/,dp=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,dX=/[+~]/,dn=new RegExp("\\\\([\\da-f]{1,6}"+dF+"?|("+dF+")|.)","ig"),dU=function(f,e,h){var g="0x"+e-65536;return g!==g||h?e:g<0?String.fromCharCode(g+65536):String.fromCharCode(g>>10|55296,1023&g|56320)},dA=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,c5=function(d,c){return c?"\0"===d?"\ufffd":d.slice(0,-1)+"\\"+d.charCodeAt(d.length-1).toString(16)+" ":"\\"+d},cO=function(){c6()},bb=dS(function(b){return b.disabled===!0&&("form" in b||"label" in b)},{dir:"parentNode",next:"legend"});try{dK.apply(dO=dJ.call(cW.childNodes),cW.childNodes),dO[cW.childNodes.length].nodeType}catch(d0){dK={apply:dO.length?function(d,c){dL.apply(d,dJ.call(c))}:function(f,e){var h=f.length,g=0;while(f[h++]=e[g++]){}f.length=h-1}}}function dV(z,v,u,t){var q,p,n,m,i,g,c,B=v&&v.ownerDocument,A=v?v.nodeType:9;if(u=u||[],"string"!=typeof z||!z||1!==A&&9!==A&&11!==A){return u}if(!t&&((v?v.ownerDocument||v:cW)!==c4&&c6(v),v=v||c4,c2)){if(11!==A&&(i=dp.exec(z))){if(q=i[1]){if(9===A){if(!(n=v.getElementById(q))){return u}if(n.id===q){return u.push(n),u}}else{if(B&&(n=B.getElementById(q))&&cY(v,n)&&n.id===q){return u.push(n),u}}}else{if(i[2]){return dK.apply(u,v.getElementsByTagName(z)),u}if((q=i[3])&&dj.getElementsByClassName&&v.getElementsByClassName){return dK.apply(u,v.getElementsByClassName(q)),u}}}if(dj.qsa&&!dR[z+" "]&&(!c1||!c1.test(z))){if(1!==A){B=v,c=z}else{if("object"!==v.nodeName.toLowerCase()){(m=v.getAttribute("id"))?m=m.replace(dA,c5):v.setAttribute("id",m=cX),g=de(z),p=g.length;while(p--){g[p]="#"+m+" "+dY(g[p])}c=g.join(","),B=dX.test(z)&&cM(v.parentNode)||v}}if(c){try{return dK.apply(u,B.querySelectorAll(c)),u}catch(y){}finally{m===cX&&v.removeAttribute("id")}}}}return db(z.replace(dz,"$1"),v,u,t)}function dH(){var d=[];function c(b,a){return d.push(b+" ")>dh.cacheLength&&delete c[d.shift()],c[b+" "]=a}return c}function dc(b){return b[cX]=!0,b}function cP(e){var d=c4.createElement("fieldset");try{return !!e(d)}catch(f){return !1}finally{d.parentNode&&d.parentNode.removeChild(d),d=null}}function cb(f,d){var h=f.split("|"),g=h.length;while(g--){dh.attrHandle[h[g]]=d}}function d1(f,e){var h=e&&f,g=h&&1===f.nodeType&&1===e.nodeType&&f.sourceIndex-e.sourceIndex;if(g){return g}if(h){while(h=h.nextSibling){if(h===e){return -1}}}return f?1:-1}function dW(b){return function(a){var d=a.nodeName.toLowerCase();return"input"===d&&a.type===b}}function dN(b){return function(a){var d=a.nodeName.toLowerCase();return("input"===d||"button"===d)&&a.type===b}}function di(b){return function(a){return"form" in a?a.parentNode&&a.disabled===!1?"label" in a?"label" in a.parentNode?a.parentNode.disabled===b:a.disabled===b:a.isDisabled===b||a.isDisabled!==!b&&bb(a)===b:a.disabled===b:"label" in a&&a.disabled===b}}function cQ(b){return dc(function(a){return a=+a,dc(function(l,k){var j,i=b([],l.length,a),h=i.length;while(h--){l[j=i[h]]&&(l[j]=!(k[j]=l[j]))}})})}function cM(b){return b&&"undefined"!=typeof b.getElementsByTagName&&b}dj=dV.support={},df=dV.isXML=function(d){var c=d&&(d.ownerDocument||d).documentElement;return !!c&&"HTML"!==c.nodeName},c6=dV.setDocument=function(d){var c,h,f=d?d.ownerDocument||d:cW;return f!==c4&&9===f.nodeType&&f.documentElement?(c4=f,c3=c4.documentElement,c2=!df(c4),cW!==c4&&(h=c4.defaultView)&&h.top!==h&&(h.addEventListener?h.addEventListener("unload",cO,!1):h.attachEvent&&h.attachEvent("onunload",cO)),dj.attributes=cP(function(b){return b.className="i",!b.getAttribute("className")}),dj.getElementsByTagName=cP(function(b){return b.appendChild(c4.createComment("")),!b.getElementsByTagName("*").length}),dj.getElementsByClassName=dq.test(c4.getElementsByClassName),dj.getById=cP(function(b){return c3.appendChild(b).id=cX,!c4.getElementsByName||!c4.getElementsByName(cX).length}),dj.getById?(dh.filter.ID=function(g){var e=g.replace(dn,dU);return function(b){return b.getAttribute("id")===e}},dh.find.ID=function(g,e){if("undefined"!=typeof e.getElementById&&c2){var i=e.getElementById(g);return i?[i]:[]}}):(dh.filter.ID=function(g){var e=g.replace(dn,dU);return function(b){var i="undefined"!=typeof b.getAttributeNode&&b.getAttributeNode("id");return i&&i.value===e}},dh.find.ID=function(i,g){if("undefined"!=typeof g.getElementById&&c2){var m,l,k,j=g.getElementById(i);if(j){if(m=j.getAttributeNode("id"),m&&m.value===i){return[j]}k=g.getElementsByName(i),l=0;while(j=k[l++]){if(m=j.getAttributeNode("id"),m&&m.value===i){return[j]}}}return[]}}),dh.find.TAG=dj.getElementsByTagName?function(g,e){return"undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(g):dj.qsa?e.querySelectorAll(g):void 0}:function(i,g){var m,l=[],k=0,j=g.getElementsByTagName(i);if("*"===i){while(m=j[k++]){1===m.nodeType&&l.push(m)}return l}return j},dh.find.CLASS=dj.getElementsByClassName&&function(g,e){if("undefined"!=typeof e.getElementsByClassName&&c2){return e.getElementsByClassName(g)}},c0=[],c1=[],(dj.qsa=dq.test(c4.querySelectorAll))&&(cP(function(b){c3.appendChild(b).innerHTML="<a id='"+cX+"'></a><select id='"+cX+"-\r\\' msallowcapture=''><option selected=''></option></select>",b.querySelectorAll("[msallowcapture^='']").length&&c1.push("[*^$]="+dF+"*(?:''|\"\")"),b.querySelectorAll("[selected]").length||c1.push("\\["+dF+"*(?:value|"+dG+")"),b.querySelectorAll("[id~="+cX+"-]").length||c1.push("~="),b.querySelectorAll(":checked").length||c1.push(":checked"),b.querySelectorAll("a#"+cX+"+*").length||c1.push(".#.+[+~]")}),cP(function(g){g.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var e=c4.createElement("input");e.setAttribute("type","hidden"),g.appendChild(e).setAttribute("name","D"),g.querySelectorAll("[name=d]").length&&c1.push("name"+dF+"*[*^$|!~]?="),2!==g.querySelectorAll(":enabled").length&&c1.push(":enabled",":disabled"),c3.appendChild(g).disabled=!0,2!==g.querySelectorAll(":disabled").length&&c1.push(":enabled",":disabled"),g.querySelectorAll("*,:x"),c1.push(",.*:")})),(dj.matchesSelector=dq.test(cZ=c3.matches||c3.webkitMatchesSelector||c3.mozMatchesSelector||c3.oMatchesSelector||c3.msMatchesSelector))&&cP(function(b){dj.disconnectedMatch=cZ.call(b,"*"),cZ.call(b,"[s!='']:x"),c0.push("!=",dC)}),c1=c1.length&&new RegExp(c1.join("|")),c0=c0.length&&new RegExp(c0.join("|")),c=dq.test(c3.compareDocumentPosition),cY=c||dq.test(c3.contains)?function(g,e){var j=9===g.nodeType?g.documentElement:g,i=e&&e.parentNode;return g===i||!(!i||1!==i.nodeType||!(j.contains?j.contains(i):g.compareDocumentPosition&&16&g.compareDocumentPosition(i)))}:function(g,e){if(e){while(e=e.parentNode){if(e===g){return !0}}}return !1},dQ=c?function(g,e){if(g===e){return c7=!0,0}var i=!g.compareDocumentPosition-!e.compareDocumentPosition;return i?i:(i=(g.ownerDocument||g)===(e.ownerDocument||e)?g.compareDocumentPosition(e):1,1&i||!dj.sortDetached&&e.compareDocumentPosition(g)===i?g===c4||g.ownerDocument===cW&&cY(cW,g)?-1:e===c4||e.ownerDocument===cW&&cY(cW,e)?1:c8?dI(c8,g)-dI(c8,e):0:4&i?-1:1)}:function(j,i){if(j===i){return c7=!0,0}var p,o=0,n=j.parentNode,m=i.parentNode,l=[j],k=[i];if(!n||!m){return j===c4?-1:i===c4?1:n?-1:m?1:c8?dI(c8,j)-dI(c8,i):0}if(n===m){return d1(j,i)}p=j;while(p=p.parentNode){l.unshift(p)}p=i;while(p=p.parentNode){k.unshift(p)}while(l[o]===k[o]){o++}return o?d1(l[o],k[o]):l[o]===cW?-1:k[o]===cW?1:0},c4):c4},dV.matches=function(d,c){return dV(d,null,null,c)},dV.matchesSelector=function(f,c){if((f.ownerDocument||f)!==c4&&c6(f),c=c.replace(dw,"='$1']"),dj.matchesSelector&&c2&&!dR[c+" "]&&(!c0||!c0.test(c))&&(!c1||!c1.test(c))){try{var h=cZ.call(f,c);if(h||dj.disconnectedMatch||f.document&&11!==f.document.nodeType){return h}}catch(g){}}return dV(c,c4,null,[f]).length>0},dV.contains=function(d,c){return(d.ownerDocument||d)!==c4&&c6(d),cY(d,c)},dV.attr=function(d,c){(d.ownerDocument||d)!==c4&&c6(d);var h=dh.attrHandle[c.toLowerCase()],g=h&&dP.call(dh.attrHandle,c.toLowerCase())?h(d,c,!c2):void 0;return void 0!==g?g:dj.attributes||!c2?d.getAttribute(c):(g=d.getAttributeNode(c))&&g.specified?g.value:null},dV.escape=function(b){return(b+"").replace(dA,c5)},dV.error=function(b){throw new Error("Syntax error, unrecognized expression: "+b)},dV.uniqueSort=function(g){var c,j=[],i=0,h=0;if(c7=!dj.detectDuplicates,c8=!dj.sortStable&&g.slice(0),g.sort(dQ),c7){while(c=g[h++]){c===g[h]&&(i=j.push(h))}while(i--){g.splice(j[i],1)}}return c8=null,g},dg=dV.getText=function(g){var e,j="",i=0,h=g.nodeType;if(h){if(1===h||9===h||11===h){if("string"==typeof g.textContent){return g.textContent}for(g=g.firstChild;g;g=g.nextSibling){j+=dg(g)}}else{if(3===h||4===h){return g.nodeValue}}}else{while(e=g[i++]){j+=dg(e)}}return j},dh=dV.selectors={cacheLength:50,createPseudo:dc,match:dt,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(b){return b[1]=b[1].replace(dn,dU),b[3]=(b[3]||b[4]||b[5]||"").replace(dn,dU),"~="===b[2]&&(b[3]=" "+b[3]+" "),b.slice(0,4)},CHILD:function(b){return b[1]=b[1].toLowerCase(),"nth"===b[1].slice(0,3)?(b[3]||dV.error(b[0]),b[4]=+(b[4]?b[5]+(b[6]||1):2*("even"===b[3]||"odd"===b[3])),b[5]=+(b[7]+b[8]||"odd"===b[3])):b[3]&&dV.error(b[0]),b},PSEUDO:function(e){var d,f=!e[6]&&e[2];return dt.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":f&&dv.test(f)&&(d=de(f,!0))&&(d=f.indexOf(")",f.length-d)-f.length)&&(e[0]=e[0].slice(0,d),e[2]=f.slice(0,d)),e.slice(0,3))}},filter:{TAG:function(d){var c=d.replace(dn,dU).toLowerCase();return"*"===d?function(){return !0}:function(b){return b.nodeName&&b.nodeName.toLowerCase()===c}},CLASS:function(d){var c=cT[d+" "];return c||(c=new RegExp("(^|"+dF+")"+d+"("+dF+"|$)"))&&cT(d,function(b){return c.test("string"==typeof b.className&&b.className||"undefined"!=typeof b.getAttribute&&b.getAttribute("class")||"")})},ATTR:function(e,d,f){return function(b){var a=dV.attr(b,e);return null==a?"!="===d:!d||(a+="","="===d?a===f:"!="===d?a!==f:"^="===d?f&&0===a.indexOf(f):"*="===d?f&&a.indexOf(f)>-1:"$="===d?f&&a.slice(-f.length)===f:"~="===d?(" "+a.replace(dB," ")+" ").indexOf(f)>-1:"|="===d&&(a===f||a.slice(0,f.length+1)===f+"-"))}},CHILD:function(j,i,p,o,n){var m="nth"!==j.slice(0,3),l="last"!==j.slice(-4),k="of-type"===i;return 1===o&&0===n?function(b){return !!b.parentNode}:function(z,y,x){var w,v,u,h,g,f,e=m!==l?"nextSibling":"previousSibling",d=z.parentNode,a=k&&z.nodeName.toLowerCase(),B=!x&&!k,A=!1;if(d){if(m){while(e){h=z;while(h=h[e]){if(k?h.nodeName.toLowerCase()===a:1===h.nodeType){return !1}}f=e="only"===j&&!f&&"nextSibling"}return !0}if(f=[l?d.firstChild:d.lastChild],l&&B){h=d,u=h[cX]||(h[cX]={}),v=u[h.uniqueID]||(u[h.uniqueID]={}),w=v[j]||[],g=w[0]===cV&&w[1],A=g&&w[2],h=g&&d.childNodes[g];while(h=++g&&h&&h[e]||(A=g=0)||f.pop()){if(1===h.nodeType&&++A&&h===z){v[j]=[cV,g,A];break}}}else{if(B&&(h=z,u=h[cX]||(h[cX]={}),v=u[h.uniqueID]||(u[h.uniqueID]={}),w=v[j]||[],g=w[0]===cV&&w[1],A=g),A===!1){while(h=++g&&h&&h[e]||(A=g=0)||f.pop()){if((k?h.nodeName.toLowerCase()===a:1===h.nodeType)&&++A&&(B&&(u=h[cX]||(h[cX]={}),v=u[h.uniqueID]||(u[h.uniqueID]={}),v[j]=[cV,A]),h===z)){break}}}}return A-=n,A===o||A%o===0&&A/o>=0}}},PSEUDO:function(f,d){var h,g=dh.pseudos[f]||dh.setFilters[f.toLowerCase()]||dV.error("unsupported pseudo: "+f);return g[cX]?g(d):g.length>1?(h=[f,f,"",d],dh.setFilters.hasOwnProperty(f.toLowerCase())?dc(function(b,k){var j,i=g(b,d),e=i.length;while(e--){j=dI(b,i[e]),b[j]=!(k[j]=i[e])}}):function(b){return g(b,0,h)}):g}},pseudos:{not:dc(function(f){var e=[],h=[],g=dd(f.replace(dz,"$1"));return g[cX]?dc(function(i,d,n,m){var l,k=g(i,null,m,[]),j=i.length;while(j--){(l=k[j])&&(i[j]=!(d[j]=l))}}):function(b,d,c){return e[0]=b,g(e,null,c,h),e[0]=null,!h.pop()}}),has:dc(function(b){return function(a){return dV(b,a).length>0}}),contains:dc(function(b){return b=b.replace(dn,dU),function(a){return(a.textContent||a.innerText||dg(a)).indexOf(b)>-1}}),lang:dc(function(b){return du.test(b||"")||dV.error("unsupported lang: "+b),b=b.replace(dn,dU).toLowerCase(),function(a){var d;do{if(d=c2?a.lang:a.getAttribute("xml:lang")||a.getAttribute("lang")){return d=d.toLowerCase(),d===b||0===d.indexOf(b+"-")}}while((a=a.parentNode)&&1===a.nodeType);return !1}}),target:function(a){var d=dl.location&&dl.location.hash;return d&&d.slice(1)===a.id},root:function(b){return b===c3},focus:function(b){return b===c4.activeElement&&(!c4.hasFocus||c4.hasFocus())&&!!(b.type||b.href||~b.tabIndex)},enabled:di(!1),disabled:di(!0),checked:function(d){var c=d.nodeName.toLowerCase();return"input"===c&&!!d.checked||"option"===c&&!!d.selected},selected:function(b){return b.parentNode&&b.parentNode.selectedIndex,b.selected===!0},empty:function(b){for(b=b.firstChild;b;b=b.nextSibling){if(b.nodeType<6){return !1}}return !0},parent:function(b){return !dh.pseudos.empty(b)},header:function(b){return dr.test(b.nodeName)},input:function(b){return ds.test(b.nodeName)},button:function(d){var c=d.nodeName.toLowerCase();return"input"===c&&"button"===d.type||"button"===c},text:function(d){var c;return"input"===d.nodeName.toLowerCase()&&"text"===d.type&&(null==(c=d.getAttribute("type"))||"text"===c.toLowerCase())},first:cQ(function(){return[0]}),last:cQ(function(d,c){return[c-1]}),eq:cQ(function(e,d,f){return[f<0?f+d:f]}),even:cQ(function(e,d){for(var f=0;f<d;f+=2){e.push(f)}return e}),odd:cQ(function(e,d){for(var f=1;f<d;f+=2){e.push(f)}return e}),lt:cQ(function(f,e,h){for(var g=h<0?h+e:h;--g>=0;){f.push(g)}return f}),gt:cQ(function(f,e,h){for(var g=h<0?h+e:h;++g<e;){f.push(g)}return f})}},dh.pseudos.nth=dh.pseudos.eq;for(dk in {radio:!0,checkbox:!0,file:!0,password:!0,image:!0}){dh.pseudos[dk]=dW(dk)}for(dk in {submit:!0,reset:!0}){dh.pseudos[dk]=dN(dk)}function d2(){}d2.prototype=dh.filters=dh.pseudos,dh.setFilters=new d2,de=dV.tokenize=function(t,s){var r,q,p,o,n,m,l,d=cS[t+" "];if(d){return s?0:d.slice(0)}n=t,m=[],l=dh.preFilter;while(n){r&&!(q=dy.exec(n))||(q&&(n=n.slice(q[0].length)||n),m.push(p=[])),r=!1,(q=dx.exec(n))&&(r=q.shift(),p.push({value:r,type:q[0].replace(dz," ")}),n=n.slice(r.length));for(o in dh.filter){!(q=dt[o].exec(n))||l[o]&&!(q=l[o](q))||(r=q.shift(),p.push({value:r,type:o,matches:q}),n=n.slice(r.length))}if(!r){break}}return s?n.length:n?dV.error(t):cS(t,m).slice(0)};function dY(f){for(var e=0,h=f.length,g="";e<h;e++){g+=f[e].value}return g}function dS(j,i,p){var o=i.dir,n=i.next,m=n||o,l=p&&"parentNode"===m,k=cU++;return i.first?function(a,f,d){while(a=a[o]){if(1===a.nodeType||l){return j(a,f,d)}}return !1}:function(d,q,h){var g,f,e,a=[cV,k];if(h){while(d=d[o]){if((1===d.nodeType||l)&&j(d,q,h)){return !0}}}else{while(d=d[o]){if(1===d.nodeType||l){if(e=d[cX]||(d[cX]={}),f=e[d.uniqueID]||(e[d.uniqueID]={}),n&&n===d.nodeName.toLowerCase()){d=d[o]||d}else{if((g=f[m])&&g[0]===cV&&g[1]===k){return a[2]=g[2]}if(f[m]=a,a[2]=j(d,q,h)){return !0}}}}}return !1}}function dm(b){return b.length>1?function(a,h,g){var f=b.length;while(f--){if(!b[f](a,h,g)){return !1}}return !0}:b[0]}function cR(g,f,j){for(var i=0,h=f.length;i<h;i++){dV(g,f[i],j)}return j}function cN(t,s,r,q,p){for(var o,n=[],m=0,l=t.length,k=null!=s;m<l;m++){(o=t[m])&&(r&&!r(o,q,p)||(n.push(o),k&&s.push(m)))}return n}function ab(h,g,l,k,j,i){return k&&!k[cX]&&(k=ab(k)),j&&!j[cX]&&(j=ab(j,i)),dc(function(z,y,x,w){var v,u,t,s=[],e=[],d=y.length,c=z||cR(g||"*",x.nodeType?[x]:x,[]),b=!h||!z&&g?c:cN(c,s,h,x,w),a=l?j||(z?h:d||k)?[]:y:b;if(l&&l(b,a,x,w),k){v=cN(a,e),k(v,[],x,w),u=v.length;while(u--){(t=v[u])&&(a[e[u]]=!(b[e[u]]=t))}}if(z){if(j||h){if(j){v=[],u=a.length;while(u--){(t=a[u])&&v.push(b[u]=t)}j(null,a=[],v,w)}u=a.length;while(u--){(t=a[u])&&(v=j?dI(z,t):s[u])>-1&&(z[v]=!(y[v]=t))}}}else{a=cN(a===y?a.splice(d,a.length):a),j?j(null,y,a,w):dK.apply(y,a)}})}function dZ(v){for(var u,t,s,r=v.length,q=dh.relative[v[0].type],p=q||dh.relative[" "],o=q?1:0,n=dS(function(b){return b===u},p,!0),j=dS(function(b){return dI(u,b)>-1},p,!0),d=[function(b,h,g){var f=!q&&(g||h!==c9)||((u=h).nodeType?n(b,h,g):j(b,h,g));return u=null,f}];o<r;o++){if(t=dh.relative[v[o].type]){d=[dS(dm(d),t)]}else{if(t=dh.filter[v[o].type].apply(null,v[o].matches),t[cX]){for(s=++o;s<r;s++){if(dh.relative[v[s].type]){break}}return ab(o>1&&dm(d),o>1&&dY(v.slice(0,o-1).concat({value:" "===v[o-2].type?"*":""})).replace(dz,"$1"),t,o<s&&dZ(v.slice(o,s)),s<r&&dZ(v=v.slice(s)),s<r&&dY(v))}d.push(t)}}return dm(d)}function dT(g,d){var j=d.length>0,i=g.length>0,h=function(A,w,p,n,m){var e,c,b,a=0,H="0",G=A&&[],F=[],E=c9,D=A||i&&dh.find.TAG("*",m),C=cV+=null==E?1:Math.random()||0.1,B=D.length;for(m&&(c9=w===c4||w||m);H!==B&&null!=(e=D[H]);H++){if(i&&e){c=0,w||e.ownerDocument===c4||(c6(e),p=!c2);while(b=g[c++]){if(b(e,w||c4,p)){n.push(e);break}}m&&(cV=C)}j&&((e=!b&&e)&&a--,A&&G.push(e))}if(a+=H,j&&H!==a){c=0;while(b=d[c++]){b(G,F,w,p)}if(A){if(a>0){while(H--){G[H]||F[H]||(F[H]=dM.call(n))}}F=cN(F)}dK.apply(n,F),m&&!A&&F.length>0&&a+d.length>1&&dV.uniqueSort(n)}return m&&(cV=C,c9=E),G};return j?dc(h):h}return dd=dV.compile=function(h,g){var l,k=[],j=[],i=dR[h+" "];if(!i){g||(g=de(h)),l=g.length;while(l--){i=dZ(g[l]),i[cX]?k.push(i):j.push(i)}i=dR(h,dT(j,k)),i.selector=h}return i},db=dV.select=function(v,u,t,s){var r,q,p,o,h,g="function"==typeof v&&v,d=!s&&de(v=g.selector||v);if(t=t||[],1===d.length){if(q=d[0]=d[0].slice(0),q.length>2&&"ID"===(p=q[0]).type&&9===u.nodeType&&c2&&dh.relative[q[1].type]){if(u=(dh.find.ID(p.matches[0].replace(dn,dU),u)||[])[0],!u){return t}g&&(u=u.parentNode),v=v.slice(q.shift().value.length)}r=dt.needsContext.test(v)?0:q.length;while(r--){if(p=q[r],dh.relative[o=p.type]){break}if((h=dh.find[o])&&(s=h(p.matches[0].replace(dn,dU),dX.test(q[0].type)&&cM(u.parentNode)||u))){if(q.splice(r,1),v=s.length&&dY(q),!v){return dK.apply(t,s),t}break}}}return(g||dd(v,d))(s,u,!c2,t,!u||dX.test(v)&&cM(u.parentNode)||u),t},dj.sortStable=cX.split("").sort(dQ).join("")===cX,dj.detectDuplicates=!!c7,c6(),dj.sortDetached=cP(function(b){return 1&b.compareDocumentPosition(c4.createElement("fieldset"))}),cP(function(b){return b.innerHTML="<a href='#'></a>","#"===b.firstChild.getAttribute("href")})||cb("type|href|height|width",function(e,d,f){if(!f){return e.getAttribute(d,"type"===d.toLowerCase()?1:2)}}),dj.attributes&&cP(function(b){return b.innerHTML="<input/>",b.firstChild.setAttribute("value",""),""===b.firstChild.getAttribute("value")})||cb("value",function(e,d,f){if(!f&&"input"===e.nodeName.toLowerCase()){return e.defaultValue}}),cP(function(b){return null==b.getAttribute("disabled")})||cb(dG,function(f,e,h){var g;if(!h){return f[e]===!0?e.toLowerCase():(g=f.getAttributeNode(e))&&g.specified?g.value:null}}),dV}(bP);bv.find=bp,bv.expr=bp.selectors,bv.expr[":"]=bv.expr.pseudos,bv.uniqueSort=bv.unique=bp.uniqueSort,bv.text=bp.getText,bv.isXMLDoc=bp.isXML,bv.contains=bp.contains,bv.escapeSelector=bp.escape;var bo=function(g,f,j){var i=[],h=void 0!==j;while((g=g[f])&&9!==g.nodeType){if(1===g.nodeType){if(h&&bv(g).is(j)){break}i.push(g)}}return i},bm=function(e,d){for(var f=[];e;e=e.nextSibling){1===e.nodeType&&e!==d&&f.push(e)}return f},cp=bv.expr.match.needsContext,co=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,cn=/^.[^:#\[\.,]*$/;function cm(e,d,f){return bv.isFunction(d)?bv.grep(e,function(b,c){return !!d.call(b,c,b)!==f}):d.nodeType?bv.grep(e,function(b){return b===d!==f}):"string"!=typeof d?bv.grep(e,function(b){return bF.call(d,b)>-1!==f}):cn.test(d)?bv.filter(d,e,f):(d=bv.filter(d,e),bv.grep(e,function(b){return bF.call(d,b)>-1!==f&&1===b.nodeType}))}bv.filter=function(f,e,h){var g=e[0];return h&&(f=":not("+f+")"),1===e.length&&1===g.nodeType?bv.find.matchesSelector(g,f)?[g]:[]:bv.find.matches(f,bv.grep(e,function(b){return 1===b.nodeType}))},bv.fn.extend({find:function(g){var f,j,i=this.length,h=this;if("string"!=typeof g){return this.pushStack(bv(g).filter(function(){for(f=0;f<i;f++){if(bv.contains(h[f],this)){return !0}}}))}for(j=this.pushStack([]),f=0;f<i;f++){bv.find(g,h[f],j)}return i>1?bv.uniqueSort(j):j},filter:function(b){return this.pushStack(cm(this,b||[],!1))},not:function(b){return this.pushStack(cm(this,b||[],!0))},is:function(b){return !!cm(this,"string"==typeof b&&cp.test(b)?bv(b):b||[],!1).length}});var cl,ck=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,ci=bv.fn.init=function(g,d,j){var i,h;if(!g){return this}if(j=j||cl,"string"==typeof g){if(i="<"===g[0]&&">"===g[g.length-1]&&g.length>=3?[null,g,null]:ck.exec(g),!i||!i[1]&&d){return !d||d.jquery?(d||j).find(g):this.constructor(d).find(g)}if(i[1]){if(d=d instanceof bv?d[0]:d,bv.merge(this,bv.parseHTML(i[1],d&&d.nodeType?d.ownerDocument||d:bM,!0)),co.test(i[1])&&bv.isPlainObject(d)){for(i in d){bv.isFunction(this[i])?this[i](d[i]):this.attr(i,d[i])}}return this}return h=bM.getElementById(i[2]),h&&(this[0]=h,this.length=1),this}return g.nodeType?(this[0]=g,this.length=1,this):bv.isFunction(g)?void 0!==j.ready?j.ready(g):g(bv):bv.makeArray(g,this)};ci.prototype=bv.fn,cl=bv(bM);var cg=/^(?:parents|prev(?:Until|All))/,cf={children:!0,contents:!0,next:!0,prev:!0};bv.fn.extend({has:function(e){var d=bv(e,this),f=d.length;return this.filter(function(){for(var b=0;b<f;b++){if(bv.contains(this,d[b])){return !0}}})},closest:function(i,h){var n,m=0,l=this.length,k=[],j="string"!=typeof i&&bv(i);if(!cp.test(i)){for(;m<l;m++){for(n=this[m];n&&n!==h;n=n.parentNode){if(n.nodeType<11&&(j?j.index(n)>-1:1===n.nodeType&&bv.find.matchesSelector(n,i))){k.push(n);break}}}}return this.pushStack(k.length>1?bv.uniqueSort(k):k)},index:function(b){return b?"string"==typeof b?bF.call(bv(b),this[0]):bF.call(this,b.jquery?b[0]:b):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(d,c){return this.pushStack(bv.uniqueSort(bv.merge(this.get(),bv(d,c))))},addBack:function(b){return this.add(null==b?this.prevObject:this.prevObject.filter(b))}});function ce(d,c){while((d=d[c])&&1!==d.nodeType){}return d}bv.each({parent:function(d){var c=d.parentNode;return c&&11!==c.nodeType?c:null},parents:function(b){return bo(b,"parentNode")},parentsUntil:function(e,d,f){return bo(e,"parentNode",f)},next:function(b){return ce(b,"nextSibling")},prev:function(b){return ce(b,"previousSibling")},nextAll:function(b){return bo(b,"nextSibling")},prevAll:function(b){return bo(b,"previousSibling")},nextUntil:function(e,d,f){return bo(e,"nextSibling",f)},prevUntil:function(e,d,f){return bo(e,"previousSibling",f)},siblings:function(b){return bm((b.parentNode||{}).firstChild,b)},children:function(b){return bm(b.firstChild)},contents:function(b){return b.contentDocument||bv.merge([],b.childNodes)}},function(d,c){bv.fn[d]=function(f,b){var a=bv.map(this,c,f);return"Until"!==d.slice(-5)&&(b=f),b&&"string"==typeof b&&(a=bv.filter(b,a)),this.length>1&&(cf[d]||bv.uniqueSort(a),cg.test(d)&&a.reverse()),this.pushStack(a)}});var cd=/[^\x20\t\r\n\f]+/g;function cc(d){var c={};return bv.each(d.match(cd)||[],function(b,e){c[e]=!0}),c}bv.Callbacks=function(t){t="string"==typeof t?cc(t):bv.extend({},t);var s,r,q,p,o=[],n=[],m=-1,l=function(){for(p=t.once,q=s=!0;n.length;m=-1){r=n.shift();while(++m<o.length){o[m].apply(r[0],r[1])===!1&&t.stopOnFalse&&(m=o.length,r=!1)}}t.memory||(r=!1),s=!1,p&&(o=r?[]:"")},k={add:function(){return o&&(r&&!s&&(m=o.length-1,n.push(r)),function a(c){bv.each(c,function(d,e){bv.isFunction(e)?t.unique&&k.has(e)||o.push(e):e&&e.length&&"string"!==bv.type(e)&&a(e)})}(arguments),r&&!s&&l()),this},remove:function(){return bv.each(arguments,function(e,d){var f;while((f=bv.inArray(d,o,f))>-1){o.splice(f,1),f<=m&&m--}}),this},has:function(b){return b?bv.inArray(b,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return p=n=[],o=r="",this},disabled:function(){return !o},lock:function(){return p=n=[],r||s||(o=r=""),this},locked:function(){return !!p},fireWith:function(b,d){return p||(d=d||[],d=[b,d.slice?d.slice():d],n.push(d),s||l()),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return !!q}};return k};function b9(b){return b}function b8(b){throw b}function b7(f,e,h){var g;try{f&&bv.isFunction(g=f.promise)?g.call(f).done(e).fail(h):f&&bv.isFunction(g=f.then)?g.call(f,e,h):e.call(void 0,f)}catch(f){h.call(void 0,f)}}bv.extend({Deferred:function(a){var j=[["notify","progress",bv.Callbacks("memory"),bv.Callbacks("memory"),2],["resolve","done",bv.Callbacks("once memory"),bv.Callbacks("once memory"),0,"resolved"],["reject","fail",bv.Callbacks("once memory"),bv.Callbacks("once memory"),1,"rejected"]],i="pending",h={state:function(){return i},always:function(){return g.done(arguments).fail(arguments),this},"catch":function(b){return h.then(null,b)},pipe:function(){var b=arguments;return bv.Deferred(function(c){bv.each(j,function(l,k){var f=bv.isFunction(b[k[4]])&&b[k[4]];g[k[1]](function(){var d=f&&f.apply(this,arguments);d&&bv.isFunction(d.promise)?d.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[k[0]+"With"](this,f?[d]:arguments)})}),b=null}).promise()},then:function(c,n,m){var l=0;function k(f,q,p,o){return function(){var r=this,e=arguments,d=function(){var s,t;if(!(f<l)){if(s=p.apply(r,e),s===q.promise()){throw new TypeError("Thenable self-resolution")}t=s&&("object"==typeof s||"function"==typeof s)&&s.then,bv.isFunction(t)?o?t.call(s,k(l,q,b9,o),k(l,q,b8,o)):(l++,t.call(s,k(l,q,b9,o),k(l,q,b8,o),k(l,q,b9,q.notifyWith))):(p!==b9&&(r=void 0,e=[s]),(o||q.resolveWith)(r,e))}},b=o?d:function(){try{d()}catch(s){bv.Deferred.exceptionHook&&bv.Deferred.exceptionHook(s,b.stackTrace),f+1>=l&&(p!==b8&&(r=void 0,e=[s]),q.rejectWith(r,e))}};f?b():(bv.Deferred.getStackHook&&(b.stackTrace=bv.Deferred.getStackHook()),bP.setTimeout(b))}}return bv.Deferred(function(b){j[0][3].add(k(0,b,bv.isFunction(m)?m:b9,b.notifyWith)),j[1][3].add(k(0,b,bv.isFunction(c)?c:b9)),j[2][3].add(k(0,b,bv.isFunction(n)?n:b8))}).promise()},promise:function(b){return null!=b?bv.extend(b,h):h}},g={};return bv.each(j,function(d,c){var f=c[2],e=c[5];h[c[1]]=f.add,e&&f.add(function(){i=e},j[3-d][2].disable,j[0][2].lock),f.add(c[3].fire),g[c[0]]=function(){return g[c[0]+"With"](this===g?void 0:this,arguments),this},g[c[0]+"With"]=f.fireWith}),h.promise(g),a&&a.call(g,g),g},when:function(i){var f=arguments.length,n=f,m=Array(n),l=bJ.call(arguments),k=bv.Deferred(),j=function(b){return function(a){m[b]=this,l[b]=arguments.length>1?bJ.call(arguments):a,--f||k.resolveWith(m,l)}};if(f<=1&&(b7(i,k.done(j(n)).resolve,k.reject),"pending"===k.state()||bv.isFunction(l[n]&&l[n].then))){return k.then()}while(n--){b7(l[n],j(n),k.reject)}return k.promise()}});var b6=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;bv.Deferred.exceptionHook=function(a,d){bP.console&&bP.console.warn&&a&&b6.test(a.name)&&bP.console.warn("jQuery.Deferred exception: "+a.message,a.stack,d)},bv.readyException=function(a){bP.setTimeout(function(){throw a})};var b5=bv.Deferred();bv.fn.ready=function(b){return b5.then(b)["catch"](function(c){bv.readyException(c)}),this},bv.extend({isReady:!1,readyWait:1,holdReady:function(b){b?bv.readyWait++:bv.ready(!0)},ready:function(b){(b===!0?--bv.readyWait:bv.isReady)||(bv.isReady=!0,b!==!0&&--bv.readyWait>0||b5.resolveWith(bM,[bv]))}}),bv.ready.then=b5.then;function b3(){bM.removeEventListener("DOMContentLoaded",b3),bP.removeEventListener("load",b3),bv.ready()}"complete"===bM.readyState||"loading"!==bM.readyState&&!bM.documentElement.doScroll?bP.setTimeout(bv.ready):(bM.addEventListener("DOMContentLoaded",b3),bP.addEventListener("load",b3));var b2=function(t,s,r,q,p,o,n){var m=0,l=t.length,k=null==r;if("object"===bv.type(r)){p=!0;for(m in r){b2(t,s,m,r[m],!0,o,n)}}else{if(void 0!==q&&(p=!0,bv.isFunction(q)||(n=!0),k&&(n?(s.call(t,q),s=null):(k=s,s=function(e,d,f){return k.call(bv(e),f)})),s)){for(;m<l;m++){s(t[m],r,n?q:q.call(t[m],m,s(t[m],r)))}}}return p?t:k?s.call(t):l?s(t[0],r):o},b1=function(b){return 1===b.nodeType||9===b.nodeType||!+b.nodeType};function b0(){this.expando=bv.expando+b0.uid++}b0.uid=1,b0.prototype={cache:function(d){var c=d[this.expando];return c||(c={},b1(d)&&(d.nodeType?d[this.expando]=c:Object.defineProperty(d,this.expando,{value:c,configurable:!0}))),c},set:function(g,f,j){var i,h=this.cache(g);if("string"==typeof f){h[bv.camelCase(f)]=j}else{for(i in f){h[bv.camelCase(i)]=f[i]}}return h},get:function(d,c){return void 0===c?this.cache(d):d[this.expando]&&d[this.expando][bv.camelCase(c)]},access:function(e,d,f){return void 0===d||d&&"string"==typeof d&&void 0===f?this.get(e,d):(this.set(e,d,f),void 0!==f?f:d)},remove:function(f,e){var h,g=f[this.expando];if(void 0!==g){if(void 0!==e){bv.isArray(e)?e=e.map(bv.camelCase):(e=bv.camelCase(e),e=e in g?[e]:e.match(cd)||[]),h=e.length;while(h--){delete g[e[h]]}}(void 0===e||bv.isEmptyObject(g))&&(f.nodeType?f[this.expando]=void 0:delete f[this.expando])}},hasData:function(d){var c=d[this.expando];return void 0!==c&&!bv.isEmptyObject(c)}};var bZ=new b0,bY=new b0,bX=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,bW=/[A-Z]/g;function bV(b){return"true"===b||"false"!==b&&("null"===b?null:b===+b+""?+b:bX.test(b)?JSON.parse(b):b)}function cB(g,f,j){var i;if(void 0===j&&1===g.nodeType){if(i="data-"+f.replace(bW,"-$&").toLowerCase(),j=g.getAttribute(i),"string"==typeof j){try{j=bV(j)}catch(h){}bY.set(g,f,j)}else{j=void 0}}return j}bv.extend({hasData:function(b){return bY.hasData(b)||bZ.hasData(b)},data:function(e,d,f){return bY.access(e,d,f)},removeData:function(d,c){bY.remove(d,c)},_data:function(e,d,f){return bZ.access(e,d,f)},_removeData:function(d,c){bZ.remove(d,c)}}),bv.fn.extend({data:function(i,h){var n,m,l,k=this[0],j=k&&k.attributes;if(void 0===i){if(this.length&&(l=bY.get(k),1===k.nodeType&&!bZ.get(k,"hasDataAttrs"))){n=j.length;while(n--){j[n]&&(m=j[n].name,0===m.indexOf("data-")&&(m=bv.camelCase(m.slice(5)),cB(k,m,l[m])))}bZ.set(k,"hasDataAttrs",!0)}return l}return"object"==typeof i?this.each(function(){bY.set(this,i)}):b2(this,function(a){var d;if(k&&void 0===a){if(d=bY.get(k,i),void 0!==d){return d}if(d=cB(k,i),void 0!==d){return d}}else{this.each(function(){bY.set(this,i,a)})}},null,h,arguments.length>1,null,!0)},removeData:function(b){return this.each(function(){bY.remove(this,b)})}}),bv.extend({queue:function(f,e,h){var g;if(f){return e=(e||"fx")+"queue",g=bZ.get(f,e),h&&(!g||bv.isArray(h)?g=bZ.access(f,e,bv.makeArray(h)):g.push(h)),g||[]}},dequeue:function(i,h){h=h||"fx";var n=bv.queue(i,h),m=n.length,l=n.shift(),k=bv._queueHooks(i,h),j=function(){bv.dequeue(i,h)};"inprogress"===l&&(l=n.shift(),m--),l&&("fx"===h&&n.unshift("inprogress"),delete k.stop,l.call(i,j,k)),!m&&k&&k.empty.fire()},_queueHooks:function(e,d){var f=d+"queueHooks";return bZ.get(e,f)||bZ.access(e,f,{empty:bv.Callbacks("once memory").add(function(){bZ.remove(e,[d+"queue",f])})})}}),bv.fn.extend({queue:function(e,d){var f=2;return"string"!=typeof e&&(d=e,e="fx",f--),arguments.length<f?bv.queue(this[0],e):void 0===d?this:this.each(function(){var a=bv.queue(this,e,d);bv._queueHooks(this,e),"fx"===e&&"inprogress"!==a[0]&&bv.dequeue(this,e)})},dequeue:function(b){return this.each(function(){bv.dequeue(this,b)})},clearQueue:function(b){return this.queue(b||"fx",[])},promise:function(j,i){var p,o=1,n=bv.Deferred(),m=this,l=this.length,k=function(){--o||n.resolveWith(m,[m])};"string"!=typeof j&&(i=j,j=void 0),j=j||"fx";while(l--){p=bZ.get(m[l],j+"queueHooks"),p&&p.empty&&(o++,p.empty.add(k))}return k(),n.promise(i)}});var bQ=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,cA=new RegExp("^(?:([+-])=|)("+bQ+")([a-z%]*)$","i"),cj=["Top","Right","Bottom","Left"],bK=function(d,c){return d=c||d,"none"===d.style.display||""===d.style.display&&bv.contains(d.ownerDocument,d)&&"none"===bv.css(d,"display")},bi=function(i,h,n,m){var l,k,j={};for(k in h){j[k]=i.style[k],i.style[k]=h[k]}l=n.apply(i,m||[]);for(k in h){i.style[k]=j[k]}return l};function a9(v,u,t,s){var r,q=1,p=20,o=s?function(){return s.cur()}:function(){return bv.css(v,u,"")},n=o(),m=t&&t[3]||(bv.cssNumber[u]?"":"px"),l=(bv.cssNumber[u]||"px"!==m&&+n)&&cA.exec(bv.css(v,u));if(l&&l[3]!==m){m=m||l[3],t=t||[],l=+n||1;do{q=q||".5",l/=q,bv.style(v,u,l+m)}while(q!==(q=o()/n)&&1!==q&&--p)}return t&&(l=+l||+n||0,r=t[1]?l+(t[1]+1)*t[2]:+t[2],s&&(s.unit=m,s.start=l,s.end=r)),r}var a2={};function aT(g){var f,j=g.ownerDocument,i=g.nodeName,h=a2[i];return h?h:(f=j.body.appendChild(j.createElement(i)),h=bv.css(f,"display"),f.parentNode.removeChild(f),"none"===h&&(h="block"),a2[i]=h,h)}function aL(i,h){for(var n,m,l=[],k=0,j=i.length;k<j;k++){m=i[k],m.style&&(n=m.style.display,h?("none"===n&&(l[k]=bZ.get(m,"display")||null,l[k]||(m.style.display="")),""===m.style.display&&bK(m)&&(l[k]=aT(m))):"none"!==n&&(l[k]="none",bZ.set(m,"display",n)))}for(k=0;k<j;k++){null!=l[k]&&(i[k].style.display=l[k])}return i}bv.fn.extend({show:function(){return aL(this,!0)},hide:function(){return aL(this)},toggle:function(b){return"boolean"==typeof b?b?this.show():this.hide():this.each(function(){bK(this)?bv(this).show():bv(this).hide()})}});var aD=/^(?:checkbox|radio)$/i,av=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,am=/^$|\/(?:java|ecma)script/i,ad={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ad.optgroup=ad.option,ad.tbody=ad.tfoot=ad.colgroup=ad.caption=ad.thead,ad.th=ad.td;function cF(e,d){var f;return f="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(d||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(d||"*"):[],void 0===d||d&&bv.nodeName(e,d)?bv.merge([e],f):f}function cu(f,e){for(var h=0,g=f.length;h<g;h++){bZ.set(f[h],"globalEval",!e||bZ.get(e[h],"globalEval"))}}var bU=/<|&#?\w+;/;function bn(D,C,B,A,z){for(var y,x,w,v,u,t,s=C.createDocumentFragment(),r=[],q=0,p=D.length;q<p;q++){if(y=D[q],y||0===y){if("object"===bv.type(y)){bv.merge(r,y.nodeType?[y]:y)}else{if(bU.test(y)){x=x||s.appendChild(C.createElement("div")),w=(av.exec(y)||["",""])[1].toLowerCase(),v=ad[w]||ad._default,x.innerHTML=v[1]+bv.htmlPrefilter(y)+v[2],t=v[0];while(t--){x=x.lastChild}bv.merge(r,x.childNodes),x=s.firstChild,x.textContent=""}else{r.push(C.createTextNode(y))}}}}s.textContent="",q=0;while(y=r[q++]){if(A&&bv.inArray(y,A)>-1){z&&z.push(y)}else{if(u=bv.contains(y.ownerDocument,y),x=cF(s.appendChild(y),"script"),u&&cu(x),B){t=0;while(y=x[t++]){am.test(y.type||"")&&B.push(y)}}}}return s}!function(){var e=bM.createDocumentFragment(),d=e.appendChild(bM.createElement("div")),f=bM.createElement("input");f.setAttribute("type","radio"),f.setAttribute("checked","checked"),f.setAttribute("name","t"),d.appendChild(f),bz.checkClone=d.cloneNode(!0).cloneNode(!0).lastChild.checked,d.innerHTML="<textarea>x</textarea>",bz.noCloneChecked=!!d.cloneNode(!0).lastChild.defaultValue}();var bf=bM.documentElement,a6=/^key/,aX=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,aP=/^([^.]*)(?:\.(.+)|)/;function aH(){return !0}function az(){return !1}function aq(){try{return bM.activeElement}catch(b){}}function ah(j,i,p,o,n,m){var l,k;if("object"==typeof i){"string"!=typeof p&&(o=o||p,p=void 0);for(k in i){ah(j,k,p,o,i[k],m)}return j}if(null==o&&null==n?(n=p,o=p=void 0):null==n&&("string"==typeof p?(n=o,o=void 0):(n=o,o=p,p=void 0)),n===!1){n=az}else{if(!n){return j}}return 1===m&&(l=n,n=function(b){return bv().off(b),l.apply(this,arguments)},n.guid=l.guid||(l.guid=bv.guid++)),j.each(function(){bv.event.add(this,i,n,o,p)})}bv.event={global:{},add:function(H,G,F,E,D){var C,B,A,z,y,x,w,v,u,t,s,r=bZ.get(H);if(r){F.handler&&(C=F,F=C.handler,D=C.selector),D&&bv.find.matchesSelector(bf,D),F.guid||(F.guid=bv.guid++),(z=r.events)||(z=r.events={}),(B=r.handle)||(B=r.handle=function(a){return"undefined"!=typeof bv&&bv.event.triggered!==a.type?bv.event.dispatch.apply(H,arguments):void 0}),G=(G||"").match(cd)||[""],y=G.length;while(y--){A=aP.exec(G[y])||[],u=s=A[1],t=(A[2]||"").split(".").sort(),u&&(w=bv.event.special[u]||{},u=(D?w.delegateType:w.bindType)||u,w=bv.event.special[u]||{},x=bv.extend({type:u,origType:s,data:E,handler:F,guid:F.guid,selector:D,needsContext:D&&bv.expr.match.needsContext.test(D),namespace:t.join(".")},C),(v=z[u])||(v=z[u]=[],v.delegateCount=0,w.setup&&w.setup.call(H,E,t,B)!==!1||H.addEventListener&&H.addEventListener(u,B)),w.add&&(w.add.call(H,x),x.handler.guid||(x.handler.guid=F.guid)),D?v.splice(v.delegateCount++,0,x):v.push(x),bv.event.global[u]=!0)}}},remove:function(H,G,F,E,D){var C,B,A,z,y,x,w,v,u,t,s,r=bZ.hasData(H)&&bZ.get(H);if(r&&(z=r.events)){G=(G||"").match(cd)||[""],y=G.length;while(y--){if(A=aP.exec(G[y])||[],u=s=A[1],t=(A[2]||"").split(".").sort(),u){w=bv.event.special[u]||{},u=(E?w.delegateType:w.bindType)||u,v=z[u]||[],A=A[2]&&new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"),B=C=v.length;while(C--){x=v[C],!D&&s!==x.origType||F&&F.guid!==x.guid||A&&!A.test(x.namespace)||E&&E!==x.selector&&("**"!==E||!x.selector)||(v.splice(C,1),x.selector&&v.delegateCount--,w.remove&&w.remove.call(H,x))}B&&!v.length&&(w.teardown&&w.teardown.call(H,t,r.handle)!==!1||bv.removeEvent(H,u,r.handle),delete z[u])}else{for(u in z){bv.event.remove(H,u+G[y],F,E,!0)}}}bv.isEmptyObject(z)&&bZ.remove(H,"handle events")}},dispatch:function(v){var u=bv.event.fix(v),t,s,r,q,p,o,n=new Array(arguments.length),m=(bZ.get(this,"events")||{})[u.type]||[],l=bv.event.special[u.type]||{};for(n[0]=u,t=1;t<arguments.length;t++){n[t]=arguments[t]}if(u.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,u)!==!1){o=bv.event.handlers.call(this,u,m),t=0;while((q=o[t++])&&!u.isPropagationStopped()){u.currentTarget=q.elem,s=0;while((p=q.handlers[s++])&&!u.isImmediatePropagationStopped()){u.rnamespace&&!u.rnamespace.test(p.namespace)||(u.handleObj=p,u.data=p.data,r=((bv.event.special[p.origType]||{}).handle||p.handler).apply(q.elem,n),void 0!==r&&(u.result=r)===!1&&(u.preventDefault(),u.stopPropagation()))}}return l.postDispatch&&l.postDispatch.call(this,u),u.result}},handlers:function(t,s){var r,q,p,o,n,m=[],l=s.delegateCount,k=t.target;if(l&&k.nodeType&&!("click"===t.type&&t.button>=1)){for(;k!==this;k=k.parentNode||this){if(1===k.nodeType&&("click"!==t.type||k.disabled!==!0)){for(o=[],n={},r=0;r<l;r++){q=s[r],p=q.selector+" ",void 0===n[p]&&(n[p]=q.needsContext?bv(p,this).index(k)>-1:bv.find(p,this,null,[k]).length),n[p]&&o.push(q)}o.length&&m.push({elem:k,handlers:o})}}}return k=this,l<s.length&&m.push({elem:k,handlers:s.slice(l)}),m},addProp:function(d,c){Object.defineProperty(bv.Event.prototype,d,{enumerable:!0,configurable:!0,get:bv.isFunction(c)?function(){if(this.originalEvent){return c(this.originalEvent)}}:function(){if(this.originalEvent){return this.originalEvent[d]}},set:function(a){Object.defineProperty(this,d,{enumerable:!0,configurable:!0,writable:!0,value:a})}})},fix:function(b){return b[bv.expando]?b:new bv.Event(b)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==aq()&&this.focus){return this.focus(),!1}},delegateType:"focusin"},blur:{trigger:function(){if(this===aq()&&this.blur){return this.blur(),!1}},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&bv.nodeName(this,"input")){return this.click(),!1}},_default:function(b){return bv.nodeName(b.target,"a")}},beforeunload:{postDispatch:function(b){void 0!==b.result&&b.originalEvent&&(b.originalEvent.returnValue=b.result)}}}},bv.removeEvent=function(e,d,f){e.removeEventListener&&e.removeEventListener(d,f)},bv.Event=function(d,c){return this instanceof bv.Event?(d&&d.type?(this.originalEvent=d,this.type=d.type,this.isDefaultPrevented=d.defaultPrevented||void 0===d.defaultPrevented&&d.returnValue===!1?aH:az,this.target=d.target&&3===d.target.nodeType?d.target.parentNode:d.target,this.currentTarget=d.currentTarget,this.relatedTarget=d.relatedTarget):this.type=d,c&&bv.extend(this,c),this.timeStamp=d&&d.timeStamp||bv.now(),void (this[bv.expando]=!0)):new bv.Event(d,c)},bv.Event.prototype={constructor:bv.Event,isDefaultPrevented:az,isPropagationStopped:az,isImmediatePropagationStopped:az,isSimulated:!1,preventDefault:function(){var b=this.originalEvent;this.isDefaultPrevented=aH,b&&!this.isSimulated&&b.preventDefault()},stopPropagation:function(){var b=this.originalEvent;this.isPropagationStopped=aH,b&&!this.isSimulated&&b.stopPropagation()},stopImmediatePropagation:function(){var b=this.originalEvent;this.isImmediatePropagationStopped=aH,b&&!this.isSimulated&&b.stopImmediatePropagation(),this.stopPropagation()}},bv.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(d){var c=d.button;return null==d.which&&a6.test(d.type)?null!=d.charCode?d.charCode:d.keyCode:!d.which&&void 0!==c&&aX.test(d.type)?1&c?1:2&c?3:4&c?2:0:d.which}},bv.event.addProp),bv.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(d,c){bv.event.special[d]={delegateType:c,bindType:c,handle:function(b){var j,i=this,h=b.relatedTarget,g=b.handleObj;return h&&(h===i||bv.contains(i,h))||(b.type=g.origType,j=g.handler.apply(this,arguments),b.type=c),j}}}),bv.fn.extend({on:function(f,e,h,g){return ah(this,f,e,h,g)},one:function(f,e,h,g){return ah(this,f,e,h,g,1)},off:function(g,f,j){var i,h;if(g&&g.preventDefault&&g.handleObj){return i=g.handleObj,bv(g.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this}if("object"==typeof g){for(h in g){this.off(h,f,g[h])}return this}return f!==!1&&"function"!=typeof f||(j=f,f=void 0),j===!1&&(j=az),this.each(function(){bv.event.remove(this,g,j,f)})}});var cJ=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,cy=/<script|<style|<link/i,a0=/checked\s*(?:[^=]|=\s*.checked.)/i,aR=/^true\/(.*)/,aJ=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function aB(d,c){return bv.nodeName(d,"table")&&bv.nodeName(11!==c.nodeType?c:c.firstChild,"tr")?d.getElementsByTagName("tbody")[0]||d:d}function at(b){return b.type=(null!==b.getAttribute("type"))+"/"+b.type,b}function ak(d){var c=aR.exec(d.type);return c?d.type=c[1]:d.removeAttribute("type"),d}function cL(t,s){var r,q,p,o,n,m,l,k;if(1===s.nodeType){if(bZ.hasData(t)&&(o=bZ.access(t),n=bZ.set(s,o),k=o.events)){delete n.handle,n.events={};for(p in k){for(r=0,q=k[p].length;r<q;r++){bv.event.add(s,p,k[p][r])}}}bY.hasData(t)&&(m=bY.access(t),l=bv.extend({},m),bY.set(s,l))}}function cD(e,d){var f=d.nodeName.toLowerCase();"input"===f&&aD.test(e.type)?d.checked=e.checked:"input"!==f&&"textarea"!==f||(d.defaultValue=e.defaultValue)}function cs(C,B,A,z){B=bH.apply([],B);var y,x,w,v,u,t,r=0,p=C.length,o=p-1,g=B[0],D=bv.isFunction(g);if(D||p>1&&"string"==typeof g&&!bz.checkClone&&a0.test(g)){return C.each(function(b){var a=C.eq(b);D&&(B[0]=g.call(this,b,a.html())),cs(a,B,A,z)})}if(p&&(y=bn(B,C[0].ownerDocument,!1,C,z),x=y.firstChild,1===y.childNodes.length&&(y=x),x||z)){for(w=bv.map(cF(y,"script"),at),v=w.length;r<p;r++){u=y,r!==o&&(u=bv.clone(u,!0,!0),v&&bv.merge(w,cF(u,"script"))),A.call(C[r],u,r)}if(v){for(t=w[w.length-1].ownerDocument,bv.map(w,ak),r=0;r<v;r++){u=w[r],am.test(u.type||"")&&!bZ.access(u,"globalEval")&&bv.contains(t,u)&&(u.src?bv._evalUrl&&bv._evalUrl(u.src):by(u.textContent.replace(aJ,""),t))}}}return C}function bS(h,g,l){for(var k,j=g?bv.filter(g,h):h,i=0;null!=(k=j[i]);i++){l||1!==k.nodeType||bv.cleanData(cF(k)),k.parentNode&&(l&&bv.contains(k.ownerDocument,k)&&cu(cF(k,"script")),k.parentNode.removeChild(k))}return h}bv.extend({htmlPrefilter:function(b){return b.replace(cJ,"<$1></$2>")},clone:function(r,q,p){var o,n,m,l,k=r.cloneNode(!0),j=bv.contains(r.ownerDocument,r);if(!(bz.noCloneChecked||1!==r.nodeType&&11!==r.nodeType||bv.isXMLDoc(r))){for(l=cF(k),m=cF(r),o=0,n=m.length;o<n;o++){cD(m[o],l[o])}}if(q){if(p){for(m=m||cF(r),l=l||cF(k),o=0,n=m.length;o<n;o++){cL(m[o],l[o])}}else{cL(r,k)}}return l=cF(k,"script"),l.length>0&&cu(l,!j&&cF(r,"script")),k},cleanData:function(h){for(var g,l,k,j=bv.event.special,i=0;void 0!==(l=h[i]);i++){if(b1(l)){if(g=l[bZ.expando]){if(g.events){for(k in g.events){j[k]?bv.event.remove(l,k):bv.removeEvent(l,k,g.handle)}}l[bZ.expando]=void 0}l[bY.expando]&&(l[bY.expando]=void 0)}}}}),bv.fn.extend({detach:function(b){return bS(this,b,!0)},remove:function(b){return bS(this,b)},text:function(b){return b2(this,function(c){return void 0===c?bv.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=c)})},null,b,arguments.length)},append:function(){return cs(this,arguments,function(d){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var c=aB(this,d);c.appendChild(d)}})},prepend:function(){return cs(this,arguments,function(d){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var c=aB(this,d);c.insertBefore(d,c.firstChild)}})},before:function(){return cs(this,arguments,function(b){this.parentNode&&this.parentNode.insertBefore(b,this)})},after:function(){return cs(this,arguments,function(b){this.parentNode&&this.parentNode.insertBefore(b,this.nextSibling)})},empty:function(){for(var d,c=0;null!=(d=this[c]);c++){1===d.nodeType&&(bv.cleanData(cF(d,!1)),d.textContent="")}return this},clone:function(d,c){return d=null!=d&&d,c=null==c?d:c,this.map(function(){return bv.clone(this,d,c)})},html:function(b){return b2(this,function(g){var f=this[0]||{},j=0,i=this.length;if(void 0===g&&1===f.nodeType){return f.innerHTML}if("string"==typeof g&&!cy.test(g)&&!ad[(av.exec(g)||["",""])[1].toLowerCase()]){g=bv.htmlPrefilter(g);try{for(;j<i;j++){f=this[j]||{},1===f.nodeType&&(bv.cleanData(cF(f,!1)),f.innerHTML=g)}f=0}catch(h){}}f&&this.empty().append(g)},null,b,arguments.length)},replaceWith:function(){var b=[];return cs(this,arguments,function(a){var d=this.parentNode;bv.inArray(this,b)<0&&(bv.cleanData(cF(this)),d&&d.replaceChild(a,this))},b)}}),bv.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(d,c){bv.fn[d]=function(b){for(var l,k=[],j=bv(b),i=j.length-1,h=0;h<=i;h++){l=h===i?this:this.clone(!0),bv(j[h])[c](l),bG.apply(k,l.get())}return this.pushStack(k)}});var bk=/^margin/,bd=new RegExp("^("+bQ+")(?!px)[a-z%]+$","i"),a4=function(a){var d=a.ownerDocument.defaultView;return d&&d.opener||(d=bP),d.getComputedStyle(a)};!function(){function a(){if(d){d.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",d.innerHTML="",bf.appendChild(j);var c=bP.getComputedStyle(d);n="1%"!==c.top,k="2px"===c.marginLeft,m="4px"===c.width,d.style.marginRight="50%",l="4px"===c.marginRight,bf.removeChild(j),d=null}}var n,m,l,k,j=bM.createElement("div"),d=bM.createElement("div");d.style&&(d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",bz.clearCloneStyle="content-box"===d.style.backgroundClip,j.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.appendChild(d),bv.extend(bz,{pixelPosition:function(){return a(),n},boxSizingReliable:function(){return a(),m},pixelMarginRight:function(){return a(),l},reliableMarginLeft:function(){return a(),k}}))}();function aV(j,i,p){var o,n,m,l,k=j.style;return p=p||a4(j),p&&(l=p.getPropertyValue(i)||p[i],""!==l||bv.contains(j.ownerDocument,j)||(l=bv.style(j,i)),!bz.pixelMarginRight()&&bd.test(l)&&bk.test(i)&&(o=k.width,n=k.minWidth,m=k.maxWidth,k.minWidth=k.maxWidth=k.width=l,l=p.width,k.width=o,k.minWidth=n,k.maxWidth=m)),void 0!==l?l+"":l}function aN(d,c){return{get:function(){return d()?void delete this.get:(this.get=c).apply(this,arguments)}}}var aF=/^(none|table(?!-c[ea]).+)/,ax={position:"absolute",visibility:"hidden",display:"block"},ao={letterSpacing:"0",fontWeight:"400"},af=["Webkit","Moz","ms"],cH=bM.createElement("div").style;function cw(e){if(e in cH){return e}var d=e[0].toUpperCase()+e.slice(1),f=af.length;while(f--){if(e=af[f]+d,e in cH){return e}}}function b4(f,e,h){var g=cA.exec(e);return g?Math.max(0,g[2]-(h||0))+(g[3]||"px"):e}function bx(i,h,n,m,l){var k,j=0;for(k=n===(m?"border":"content")?4:"width"===h?1:0;k<4;k+=2){"margin"===n&&(j+=bv.css(i,n+cj[k],!0,l)),m?("content"===n&&(j-=bv.css(i,"padding"+cj[k],!0,l)),"margin"!==n&&(j-=bv.css(i,"border"+cj[k]+"Width",!0,l))):(j+=bv.css(i,"padding"+cj[k],!0,l),"padding"!==n&&(j+=bv.css(i,"border"+cj[k]+"Width",!0,l)))}return j}function bg(i,h,n){var m,l=!0,k=a4(i),j="border-box"===bv.css(i,"boxSizing",!1,k);if(i.getClientRects().length&&(m=i.getBoundingClientRect()[h]),m<=0||null==m){if(m=aV(i,h,k),(m<0||null==m)&&(m=i.style[h]),bd.test(m)){return m}l=j&&(bz.boxSizingReliable()||m===i.style[h]),m=parseFloat(m)||0}return m+bx(i,h,n||(j?"border":"content"),l,k)+"px"}bv.extend({cssHooks:{opacity:{get:function(e,d){if(d){var f=aV(e,"opacity");return""===f?"1":f}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(r,q,p,o){if(r&&3!==r.nodeType&&8!==r.nodeType&&r.style){var n,m,l,k=bv.camelCase(q),j=r.style;return q=bv.cssProps[k]||(bv.cssProps[k]=cw(k)||k),l=bv.cssHooks[q]||bv.cssHooks[k],void 0===p?l&&"get" in l&&void 0!==(n=l.get(r,!1,o))?n:j[q]:(m=typeof p,"string"===m&&(n=cA.exec(p))&&n[1]&&(p=a9(r,q,n),m="number"),null!=p&&p===p&&("number"===m&&(p+=n&&n[3]||(bv.cssNumber[k]?"":"px")),bz.clearCloneStyle||""!==p||0!==q.indexOf("background")||(j[q]="inherit"),l&&"set" in l&&void 0===(p=l.set(r,p,o))||(j[q]=p)),void 0)}},css:function(j,i,p,o){var n,m,l,k=bv.camelCase(i);return i=bv.cssProps[k]||(bv.cssProps[k]=cw(k)||k),l=bv.cssHooks[i]||bv.cssHooks[k],l&&"get" in l&&(n=l.get(j,!0,p)),void 0===n&&(n=aV(j,i,o)),"normal"===n&&i in ao&&(n=ao[i]),""===p||p?(m=parseFloat(n),p===!0||isFinite(m)?m||0:n):n}}),bv.each(["height","width"],function(d,c){bv.cssHooks[c]={get:function(b,f,e){if(f){return !aF.test(bv.css(b,"display"))||b.getClientRects().length&&b.getBoundingClientRect().width?bg(b,c,e):bi(b,ax,function(){return bg(b,c,e)})}},set:function(b,l,k){var j,i=k&&a4(b),h=k&&bx(b,c,k,"border-box"===bv.css(b,"boxSizing",!1,i),i);return h&&(j=cA.exec(l))&&"px"!==(j[3]||"px")&&(b.style[c]=l,l=bv.css(b,c)),b4(b,l,h)}}}),bv.cssHooks.marginLeft=aN(bz.reliableMarginLeft,function(d,c){if(c){return(parseFloat(aV(d,"marginLeft"))||d.getBoundingClientRect().left-bi(d,{marginLeft:0},function(){return d.getBoundingClientRect().left}))+"px"}}),bv.each({margin:"",padding:"",border:"Width"},function(d,c){bv.cssHooks[d+c]={expand:function(h){for(var g=0,b={},a="string"==typeof h?h.split(" "):[h];g<4;g++){b[d+cj[g]+c]=a[g]||a[g-2]||a[0]}return b}},bk.test(d)||(bv.cssHooks[d+c].set=b4)}),bv.fn.extend({css:function(d,c){return b2(this,function(i,h,n){var m,l,k={},j=0;if(bv.isArray(h)){for(m=a4(i),l=h.length;j<l;j++){k[h[j]]=bv.css(i,h[j],!1,m)}return k}return void 0!==n?bv.style(i,h,n):bv.css(i,h)},d,c,arguments.length>1)}});function a7(g,f,j,i,h){return new a7.prototype.init(g,f,j,i,h)}bv.Tween=a7,a7.prototype={constructor:a7,init:function(h,g,l,k,j,i){this.elem=h,this.prop=l,this.easing=j||bv.easing._default,this.options=g,this.start=this.now=this.cur(),this.end=k,this.unit=i||(bv.cssNumber[l]?"":"px")},cur:function(){var b=a7.propHooks[this.prop];return b&&b.get?b.get(this):a7.propHooks._default.get(this)},run:function(e){var d,f=a7.propHooks[this.prop];return this.options.duration?this.pos=d=bv.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=d=e,this.now=(this.end-this.start)*d+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),f&&f.set?f.set(this):a7.propHooks._default.set(this),this}},a7.prototype.init.prototype=a7.prototype,a7.propHooks={_default:{get:function(d){var c;return 1!==d.elem.nodeType||null!=d.elem[d.prop]&&null==d.elem.style[d.prop]?d.elem[d.prop]:(c=bv.css(d.elem,d.prop,""),c&&"auto"!==c?c:0)},set:function(b){bv.fx.step[b.prop]?bv.fx.step[b.prop](b):1!==b.elem.nodeType||null==b.elem.style[bv.cssProps[b.prop]]&&!bv.cssHooks[b.prop]?b.elem[b.prop]=b.now:bv.style(b.elem,b.prop,b.now+b.unit)}}},a7.propHooks.scrollTop=a7.propHooks.scrollLeft={set:function(b){b.elem.nodeType&&b.elem.parentNode&&(b.elem[b.prop]=b.now)}},bv.easing={linear:function(b){return b},swing:function(b){return 0.5-Math.cos(b*Math.PI)/2},_default:"swing"},bv.fx=a7.prototype.init,bv.fx.step={};var aY,cq,ai=/^(?:toggle|show|hide)$/,cz=/queueHooks$/;function ch(){cq&&(bP.requestAnimationFrame(ch),bv.fx.tick())}function bI(){return bP.setTimeout(function(){aY=void 0}),aY=bv.now()}function bh(g,f){var j,i=0,h={height:g};for(f=f?1:0;i<4;i+=2-f){j=cj[i],h["margin"+j]=h["padding"+j]=g}return f&&(h.opacity=h.width=g),h}function a8(i,h,n){for(var m,l=(aK.tweeners[h]||[]).concat(aK.tweeners["*"]),k=0,j=l.length;k<j;k++){if(m=l[k].call(n,h,i)){return m}}}function a1(H,G,F){var E,D,C,B,A,z,y,x,w="width" in G||"height" in G,v=this,u={},t=H.style,s=H.nodeType&&bK(H),r=bZ.get(H,"fxshow");F.queue||(B=bv._queueHooks(H,"fx"),null==B.unqueued&&(B.unqueued=0,A=B.empty.fire,B.empty.fire=function(){B.unqueued||A()}),B.unqueued++,v.always(function(){v.always(function(){B.unqueued--,bv.queue(H,"fx").length||B.empty.fire()})}));for(E in G){if(D=G[E],ai.test(D)){if(delete G[E],C=C||"toggle"===D,D===(s?"hide":"show")){if("show"!==D||!r||void 0===r[E]){continue}s=!0}u[E]=r&&r[E]||bv.style(H,E)}}if(z=!bv.isEmptyObject(G),z||!bv.isEmptyObject(u)){w&&1===H.nodeType&&(F.overflow=[t.overflow,t.overflowX,t.overflowY],y=r&&r.display,null==y&&(y=bZ.get(H,"display")),x=bv.css(H,"display"),"none"===x&&(y?x=y:(aL([H],!0),y=H.style.display||y,x=bv.css(H,"display"),aL([H]))),("inline"===x||"inline-block"===x&&null!=y)&&"none"===bv.css(H,"float")&&(z||(v.done(function(){t.display=y}),null==y&&(x=t.display,y="none"===x?"":x)),t.display="inline-block")),F.overflow&&(t.overflow="hidden",v.always(function(){t.overflow=F.overflow[0],t.overflowX=F.overflow[1],t.overflowY=F.overflow[2]})),z=!1;for(E in u){z||(r?"hidden" in r&&(s=r.hidden):r=bZ.access(H,"fxshow",{display:y}),C&&(r.hidden=!s),s&&aL([H],!0),v.done(function(){s||aL([H]),bZ.remove(H,"fxshow");for(E in u){bv.style(H,E,u[E])}})),z=a8(s?r[E]:0,E,v),E in r||(r[E]=z.start,s&&(z.end=z.start,z.start=0))}}}function aS(i,h){var n,m,l,k,j;for(n in i){if(m=bv.camelCase(n),l=h[m],k=i[n],bv.isArray(k)&&(l=k[1],k=i[n]=k[0]),n!==m&&(i[m]=k,delete i[n]),j=bv.cssHooks[m],j&&"expand" in j){k=j.expand(k),delete i[m];for(n in k){n in i||(i[n]=k[n],h[n]=l)}}else{h[m]=l}}}function aK(v,u,t){var s,r,q=0,p=aK.prefilters.length,o=bv.Deferred().always(function(){delete n.elem}),n=function(){if(r){return !1}for(var a=aY||bI(),w=Math.max(0,m.startTime+m.duration-a),k=w/m.duration||0,j=1-k,h=0,e=m.tweens.length;h<e;h++){m.tweens[h].run(j)}return o.notifyWith(v,[m,j,w]),j<1&&e?w:(o.resolveWith(v,[m]),!1)},m=o.promise({elem:v,props:bv.extend({},u),opts:bv.extend(!0,{specialEasing:{},easing:bv.easing._default},t),originalProperties:u,originalOptions:t,startTime:aY||bI(),duration:t.duration,tweens:[],createTween:function(a,f){var e=bv.Tween(v,m.opts,a,f,m.opts.specialEasing[a]||m.opts.easing);return m.tweens.push(e),e},stop:function(a){var f=0,e=a?m.tweens.length:0;if(r){return this}for(r=!0;f<e;f++){m.tweens[f].run(1)}return a?(o.notifyWith(v,[m,1,0]),o.resolveWith(v,[m,a])):o.rejectWith(v,[m,a]),this}}),l=m.props;for(aS(l,m.opts.specialEasing);q<p;q++){if(s=aK.prefilters[q].call(m,v,l,m.opts)){return bv.isFunction(s.stop)&&(bv._queueHooks(m.elem,m.opts.queue).stop=bv.proxy(s.stop,s)),s}}return bv.map(l,a8,m),bv.isFunction(m.opts.start)&&m.opts.start.call(v,m),bv.fx.timer(bv.extend(n,{elem:v,anim:m,queue:m.opts.queue})),m.progress(m.opts.progress).done(m.opts.done,m.opts.complete).fail(m.opts.fail).always(m.opts.always)}bv.Animation=bv.extend(aK,{tweeners:{"*":[function(e,d){var f=this.createTween(e,d);return a9(f.elem,e,cA.exec(d),f),f}]},tweener:function(g,f){bv.isFunction(g)?(f=g,g=["*"]):g=g.match(cd);for(var j,i=0,h=g.length;i<h;i++){j=g[i],aK.tweeners[j]=aK.tweeners[j]||[],aK.tweeners[j].unshift(f)}},prefilters:[a1],prefilter:function(d,c){c?aK.prefilters.unshift(d):aK.prefilters.push(d)}}),bv.speed=function(f,d,h){var g=f&&"object"==typeof f?bv.extend({},f):{complete:h||!h&&d||bv.isFunction(f)&&f,duration:f,easing:h&&d||d&&!bv.isFunction(d)&&d};return bv.fx.off||bM.hidden?g.duration=0:"number"!=typeof g.duration&&(g.duration in bv.fx.speeds?g.duration=bv.fx.speeds[g.duration]:g.duration=bv.fx.speeds._default),null!=g.queue&&g.queue!==!0||(g.queue="fx"),g.old=g.complete,g.complete=function(){bv.isFunction(g.old)&&g.old.call(this),g.queue&&bv.dequeue(this,g.queue)},g},bv.fn.extend({fadeTo:function(f,e,h,g){return this.filter(bK).css("opacity",0).show().end().animate({opacity:e},f,h,g)},animate:function(i,h,n,m){var l=bv.isEmptyObject(i),k=bv.speed(h,n,m),j=function(){var a=aK(this,bv.extend({},i),k);(l||bZ.get(this,"finish"))&&a.stop(!0)};return j.finish=j,l||k.queue===!1?this.each(j):this.queue(k.queue,j)},stop:function(f,e,h){var g=function(d){var c=d.stop;delete d.stop,c(h)};return"string"!=typeof f&&(h=e,e=f,f=void 0),e&&f!==!1&&this.queue(f||"fx",[]),this.each(function(){var a=!0,i=null!=f&&f+"queueHooks",d=bv.timers,c=bZ.get(this);if(i){c[i]&&c[i].stop&&g(c[i])}else{for(i in c){c[i]&&c[i].stop&&cz.test(i)&&g(c[i])}}for(i=d.length;i--;){d[i].elem!==this||null!=f&&d[i].queue!==f||(d[i].anim.stop(h),a=!1,d.splice(i,1))}!a&&h||bv.dequeue(this,f)})},finish:function(b){return b!==!1&&(b=b||"fx"),this.each(function(){var a,l=bZ.get(this),k=l[b+"queue"],j=l[b+"queueHooks"],i=bv.timers,h=k?k.length:0;for(l.finish=!0,bv.queue(this,b,[]),j&&j.stop&&j.stop.call(this,!0),a=i.length;a--;){i[a].elem===this&&i[a].queue===b&&(i[a].anim.stop(!0),i.splice(a,1))}for(a=0;a<h;a++){k[a]&&k[a].finish&&k[a].finish.call(this)}delete l.finish})}}),bv.each(["toggle","show","hide"],function(e,d){var f=bv.fn[d];bv.fn[d]=function(b,g,c){return null==b||"boolean"==typeof b?f.apply(this,arguments):this.animate(bh(d,!0),b,g,c)}}),bv.each({slideDown:bh("show"),slideUp:bh("hide"),slideToggle:bh("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(d,c){bv.fn[d]=function(b,f,e){return this.animate(c,b,f,e)}}),bv.timers=[],bv.fx.tick=function(){var e,d=0,f=bv.timers;for(aY=bv.now();d<f.length;d++){e=f[d],e()||f[d]!==e||f.splice(d--,1)}f.length||bv.fx.stop(),aY=void 0},bv.fx.timer=function(b){bv.timers.push(b),b()?bv.fx.start():bv.timers.pop()},bv.fx.interval=13,bv.fx.start=function(){cq||(cq=bP.requestAnimationFrame?bP.requestAnimationFrame(ch):bP.setInterval(bv.fx.tick,bv.fx.interval))},bv.fx.stop=function(){bP.cancelAnimationFrame?bP.cancelAnimationFrame(cq):bP.clearInterval(cq),cq=null},bv.fx.speeds={slow:600,fast:200,_default:400},bv.fn.delay=function(a,d){return a=bv.fx?bv.fx.speeds[a]||a:a,d=d||"fx",this.queue(d,function(g,f){var b=bP.setTimeout(g,a);f.stop=function(){bP.clearTimeout(b)}})},function(){var e=bM.createElement("input"),d=bM.createElement("select"),f=d.appendChild(bM.createElement("option"));e.type="checkbox",bz.checkOn=""!==e.value,bz.optSelected=f.selected,e=bM.createElement("input"),e.value="t",e.type="radio",bz.radioValue="t"===e.value}();var aC,au=bv.expr.attrHandle;bv.fn.extend({attr:function(d,c){return b2(this,bv.attr,d,c,arguments.length>1)},removeAttr:function(b){return this.each(function(){bv.removeAttr(this,b)})}}),bv.extend({attr:function(h,g,l){var k,j,i=h.nodeType;if(3!==i&&8!==i&&2!==i){return"undefined"==typeof h.getAttribute?bv.prop(h,g,l):(1===i&&bv.isXMLDoc(h)||(j=bv.attrHooks[g.toLowerCase()]||(bv.expr.match.bool.test(g)?aC:void 0)),void 0!==l?null===l?void bv.removeAttr(h,g):j&&"set" in j&&void 0!==(k=j.set(h,l,g))?k:(h.setAttribute(g,l+""),l):j&&"get" in j&&null!==(k=j.get(h,g))?k:(k=bv.find.attr(h,g),null==k?void 0:k))}},attrHooks:{type:{set:function(e,d){if(!bz.radioValue&&"radio"===d&&bv.nodeName(e,"input")){var f=e.value;return e.setAttribute("type",d),f&&(e.value=f),d}}}},removeAttr:function(g,f){var j,i=0,h=f&&f.match(cd);if(h&&1===g.nodeType){while(j=h[i++]){g.removeAttribute(j)}}}}),aC={set:function(e,d,f){return d===!1?bv.removeAttr(e,f):e.setAttribute(f,f),f}},bv.each(bv.expr.match.bool.source.match(/\w+/g),function(e,d){var f=au[d]||bv.find.attr;au[d]=function(h,c,l){var k,j,i=c.toLowerCase();return l||(j=au[i],au[i]=k,k=null!=f(h,c,l)?i:null,au[i]=j),k}});var al=/^(?:input|select|textarea|button)$/i,ac=/^(?:a|area)$/i;bv.fn.extend({prop:function(d,c){return b2(this,bv.prop,d,c,arguments.length>1)},removeProp:function(b){return this.each(function(){delete this[bv.propFix[b]||b]})}}),bv.extend({prop:function(h,g,l){var k,j,i=h.nodeType;if(3!==i&&8!==i&&2!==i){return 1===i&&bv.isXMLDoc(h)||(g=bv.propFix[g]||g,j=bv.propHooks[g]),void 0!==l?j&&"set" in j&&void 0!==(k=j.set(h,l,g))?k:h[g]=l:j&&"get" in j&&null!==(k=j.get(h,g))?k:h[g]}},propHooks:{tabIndex:{get:function(d){var c=bv.find.attr(d,"tabindex");return c?parseInt(c,10):al.test(d.nodeName)||ac.test(d.nodeName)&&d.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),bz.optSelected||(bv.propHooks.selected={get:function(d){var c=d.parentNode;return c&&c.parentNode&&c.parentNode.selectedIndex,null},set:function(d){var c=d.parentNode;c&&(c.selectedIndex,c.parentNode&&c.parentNode.selectedIndex)}}),bv.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bv.propFix[this.toLowerCase()]=this});function cE(d){var c=d.match(cd)||[];return c.join(" ")}function ct(b){return b.getAttribute&&b.getAttribute("class")||""}bv.fn.extend({addClass:function(r){var q,p,o,n,m,l,k,j=0;if(bv.isFunction(r)){return this.each(function(a){bv(this).addClass(r.call(this,a,ct(this)))})}if("string"==typeof r&&r){q=r.match(cd)||[];while(p=this[j++]){if(n=ct(p),o=1===p.nodeType&&" "+cE(n)+" "){l=0;while(m=q[l++]){o.indexOf(" "+m+" ")<0&&(o+=m+" ")}k=cE(o),n!==k&&p.setAttribute("class",k)}}}return this},removeClass:function(r){var q,p,o,n,m,l,k,j=0;if(bv.isFunction(r)){return this.each(function(a){bv(this).removeClass(r.call(this,a,ct(this)))})}if(!arguments.length){return this.attr("class","")}if("string"==typeof r&&r){q=r.match(cd)||[];while(p=this[j++]){if(n=ct(p),o=1===p.nodeType&&" "+cE(n)+" "){l=0;while(m=q[l++]){while(o.indexOf(" "+m+" ")>-1){o=o.replace(" "+m+" "," ")}}k=cE(o),n!==k&&p.setAttribute("class",k)}}}return this},toggleClass:function(e,d){var f=typeof e;return"boolean"==typeof d&&"string"===f?d?this.addClass(e):this.removeClass(e):bv.isFunction(e)?this.each(function(a){bv(this).toggleClass(e.call(this,a,ct(this),d),d)}):this.each(function(){var a,h,g,c;if("string"===f){h=0,g=bv(this),c=e.match(cd)||[];while(a=c[h++]){g.hasClass(a)?g.removeClass(a):g.addClass(a)}}else{void 0!==e&&"boolean"!==f||(a=ct(this),a&&bZ.set(this,"__className__",a),this.setAttribute&&this.setAttribute("class",a||e===!1?"":bZ.get(this,"__className__")||""))}})},hasClass:function(f){var e,h,g=0;e=" "+f+" ";while(h=this[g++]){if(1===h.nodeType&&(" "+cE(ct(h))+" ").indexOf(e)>-1){return !0}}return !1}});var bT=/\r/g;bv.fn.extend({val:function(g){var f,j,i,h=this[0];if(arguments.length){return i=bv.isFunction(g),this.each(function(b){var a;1===this.nodeType&&(a=i?g.call(this,b,bv(this).val()):g,null==a?a="":"number"==typeof a?a+="":bv.isArray(a)&&(a=bv.map(a,function(c){return null==c?"":c+""})),f=bv.valHooks[this.type]||bv.valHooks[this.nodeName.toLowerCase()],f&&"set" in f&&void 0!==f.set(this,a,"value")||(this.value=a))})}if(h){return f=bv.valHooks[h.type]||bv.valHooks[h.nodeName.toLowerCase()],f&&"get" in f&&void 0!==(j=f.get(h,"value"))?j:(j=h.value,"string"==typeof j?j.replace(bT,""):null==j?"":j)}}}),bv.extend({valHooks:{option:{get:function(d){var c=bv.find.attr(d,"value");return null!=c?c:cE(bv.text(d))}},select:{get:function(r){var q,p,o,n=r.options,m=r.selectedIndex,l="select-one"===r.type,k=l?null:[],j=l?m+1:n.length;for(o=m<0?j:l?m:0;o<j;o++){if(p=n[o],(p.selected||o===m)&&!p.disabled&&(!p.parentNode.disabled||!bv.nodeName(p.parentNode,"optgroup"))){if(q=bv(p).val(),l){return q}k.push(q)}}return k},set:function(i,h){var n,m,l=i.options,k=bv.makeArray(h),j=l.length;while(j--){m=l[j],(m.selected=bv.inArray(bv.valHooks.option.get(m),k)>-1)&&(n=!0)}return n||(i.selectedIndex=-1),k}}}}),bv.each(["radio","checkbox"],function(){bv.valHooks[this]={set:function(d,c){if(bv.isArray(c)){return d.checked=bv.inArray(bv(d).val(),c)>-1}}},bz.checkOn||(bv.valHooks[this].get=function(b){return null===b.getAttribute("value")?"on":b.value})});var bl=/^(?:focusinfocus|focusoutblur)$/;bv.extend(bv.event,{trigger:function(B,A,z,y){var x,w,v,u,t,s,r,l=[z||bM],d=bC.call(B,"type")?B.type:B,a=bC.call(B,"namespace")?B.namespace.split("."):[];if(w=v=z=z||bM,3!==z.nodeType&&8!==z.nodeType&&!bl.test(d+bv.event.triggered)&&(d.indexOf(".")>-1&&(a=d.split("."),d=a.shift(),a.sort()),t=d.indexOf(":")<0&&"on"+d,B=B[bv.expando]?B:new bv.Event(d,"object"==typeof B&&B),B.isTrigger=y?2:3,B.namespace=a.join("."),B.rnamespace=B.namespace?new RegExp("(^|\\.)"+a.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,B.result=void 0,B.target||(B.target=z),A=null==A?[B]:bv.makeArray(A,[B]),r=bv.event.special[d]||{},y||!r.trigger||r.trigger.apply(z,A)!==!1)){if(!y&&!r.noBubble&&!bv.isWindow(z)){for(u=r.delegateType||d,bl.test(u+d)||(w=w.parentNode);w;w=w.parentNode){l.push(w),v=w}v===(z.ownerDocument||bM)&&l.push(v.defaultView||v.parentWindow||bP)}x=0;while((w=l[x++])&&!B.isPropagationStopped()){B.type=x>1?u:r.bindType||d,s=(bZ.get(w,"events")||{})[B.type]&&bZ.get(w,"handle"),s&&s.apply(w,A),s=t&&w[t],s&&s.apply&&b1(w)&&(B.result=s.apply(w,A),B.result===!1&&B.preventDefault())}return B.type=d,y||B.isDefaultPrevented()||r._default&&r._default.apply(l.pop(),A)!==!1||!b1(z)||t&&bv.isFunction(z[d])&&!bv.isWindow(z)&&(v=z[t],v&&(z[t]=null),bv.event.triggered=d,z[d](),bv.event.triggered=void 0,v&&(z[t]=v)),B.result}},simulate:function(f,e,h){var g=bv.extend(new bv.Event,h,{type:f,isSimulated:!0});bv.event.trigger(g,null,e)}}),bv.fn.extend({trigger:function(d,c){return this.each(function(){bv.event.trigger(d,c,this)})},triggerHandler:function(e,d){var f=this[0];if(f){return bv.event.trigger(e,d,f,!0)}}}),bv.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(d,c){bv.fn[c]=function(b,e){return arguments.length>0?this.on(c,null,b,e):this.trigger(c)}}),bv.fn.extend({hover:function(d,c){return this.mouseenter(d).mouseleave(c||d)}}),bz.focusin="onfocusin" in bP,bz.focusin||bv.each({focus:"focusin",blur:"focusout"},function(e,d){var f=function(b){bv.event.simulate(d,b.target,bv.event.fix(b))};bv.event.special[d]={setup:function(){var b=this.ownerDocument||this,a=bZ.access(b,d);a||b.addEventListener(e,f,!0),bZ.access(b,d,(a||0)+1)},teardown:function(){var b=this.ownerDocument||this,a=bZ.access(b,d)-1;a?bZ.access(b,d,a):(b.removeEventListener(e,f,!0),bZ.remove(b,d))}}});var be=bP.location,a5=bv.now(),aW=/\?/;bv.parseXML=function(a){var f;if(!a||"string"!=typeof a){return null}try{f=(new bP.DOMParser).parseFromString(a,"text/xml")}catch(e){f=void 0}return f&&!f.getElementsByTagName("parsererror").length||bv.error("Invalid XML: "+a),f};var aO=/\[\]$/,aG=/\r?\n/g,ay=/^(?:submit|button|image|reset|file)$/i,ap=/^(?:input|select|textarea|keygen)/i;function ag(g,f,j,i){var h;if(bv.isArray(f)){bv.each(f,function(a,c){j||aO.test(g)?i(g,c):ag(g+"["+("object"==typeof c&&null!=c?a:"")+"]",c,j,i)})}else{if(j||"object"!==bv.type(f)){i(g,f)}else{for(h in f){ag(g+"["+h+"]",f[h],j,i)}}}}bv.param=function(g,f){var j,i=[],h=function(e,d){var k=bv.isFunction(d)?d():d;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==k?"":k)};if(bv.isArray(g)||g.jquery&&!bv.isPlainObject(g)){bv.each(g,function(){h(this.name,this.value)})}else{for(j in g){ag(j,g[j],f,h)}}return i.join("&")},bv.fn.extend({serialize:function(){return bv.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var b=bv.prop(this,"elements");return b?bv.makeArray(b):this}).filter(function(){var b=this.type;return this.name&&!bv(this).is(":disabled")&&ap.test(this.nodeName)&&!ay.test(b)&&(this.checked||!aD.test(b))}).map(function(e,d){var f=bv(this).val();return null==f?null:bv.isArray(f)?bv.map(f,function(b){return{name:d.name,value:b.replace(aG,"\r\n")}}):{name:d.name,value:f.replace(aG,"\r\n")}}).get()}});var cI=/%20/g,cx=/#.*$/,aZ=/([?&])_=[^&]*/,aQ=/^(.*?):[ \t]*([^\r\n]*)$/gm,aI=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,aA=/^(?:GET|HEAD)$/,ar=/^\/\//,aj={},cK={},cC="*/".concat("*"),cr=bM.createElement("a");cr.href=be.href;function bR(b){return function(a,j){"string"!=typeof a&&(j=a,a="*");var i,h=0,g=a.toLowerCase().match(cd)||[];if(bv.isFunction(j)){while(i=g[h++]){"+"===i[0]?(i=i.slice(1)||"*",(b[i]=b[i]||[]).unshift(j)):(b[i]=b[i]||[]).push(j)}}}}function bj(i,h,n,m){var l={},k=i===cK;function j(b){var a;return l[b]=!0,bv.each(i[b]||[],function(c,e){var d=e(h,n,m);return"string"!=typeof d||k||l[d]?k?!(a=d):void 0:(h.dataTypes.unshift(d),j(d),!1)}),a}return j(h.dataTypes[0])||!l["*"]&&j("*")}function bc(g,f){var j,i,h=bv.ajaxSettings.flatOptions||{};for(j in f){void 0!==f[j]&&((h[j]?g:i||(i={}))[j]=f[j])}return i&&bv.extend(!0,g,i),g}function a3(r,q,p){var o,n,m,l,k=r.contents,j=r.dataTypes;while("*"===j[0]){j.shift(),void 0===o&&(o=r.mimeType||q.getResponseHeader("Content-Type"))}if(o){for(n in k){if(k[n]&&k[n].test(o)){j.unshift(n);break}}}if(j[0] in p){m=j[0]}else{for(n in p){if(!j[0]||r.converters[n+" "+j[0]]){m=n;break}l||(l=n)}m=m||l}if(m){return m!==j[0]&&j.unshift(m),p[m]}}function aU(x,w,v,u){var t,s,r,q,p,o={},n=x.dataTypes.slice();if(n[1]){for(r in x.converters){o[r.toLowerCase()]=x.converters[r]}}s=n.shift();while(s){if(x.responseFields[s]&&(v[x.responseFields[s]]=w),!p&&u&&x.dataFilter&&(w=x.dataFilter(w,x.dataType)),p=s,s=n.shift()){if("*"===s){s=p}else{if("*"!==p&&p!==s){if(r=o[p+" "+s]||o["* "+s],!r){for(t in o){if(q=t.split(" "),q[1]===s&&(r=o[p+" "+q[0]]||o["* "+q[0]])){r===!0?r=o[t]:o[t]!==!0&&(s=q[0],n.unshift(q[1]));break}}}if(r!==!0){if(r&&x["throws"]){w=r(w)}else{try{w=r(w)}catch(m){return{state:"parsererror",error:r?m:"No conversion from "+p+" to "+s}}}}}}}}return{state:"success",data:w}}bv.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:be.href,type:"GET",isLocal:aI.test(be.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":cC,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":bv.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(d,c){return c?bc(bc(d,bv.ajaxSettings),c):bc(bv.ajaxSettings,d)},ajaxPrefilter:bR(aj),ajaxTransport:bR(cK),ajax:function(V,U){"object"==typeof V&&(U=V,V=void 0),U=U||{};var T,S,R,Q,P,O,N,M,L,K,J=bv.ajaxSetup({},U),I=J.context||J,G=J.context&&(I.nodeType||I.jquery)?bv(I):bv.event,F=bv.Deferred(),E=bv.Callbacks("once memory"),D=J.statusCode||{},C={},B={},r="canceled",d={readyState:0,getResponseHeader:function(e){var c;if(N){if(!Q){Q={};while(c=aQ.exec(R)){Q[c[1].toLowerCase()]=c[2]}}c=Q[e.toLowerCase()]}return null==c?null:c},getAllResponseHeaders:function(){return N?R:null},setRequestHeader:function(e,c){return null==N&&(e=B[e.toLowerCase()]=B[e.toLowerCase()]||e,C[e]=c),this},overrideMimeType:function(b){return null==N&&(J.mimeType=b),this},statusCode:function(e){var c;if(e){if(N){d.always(e[d.status])}else{for(c in e){D[c]=[D[c],e[c]]}}}return this},abort:function(e){var c=e||r;return T&&T.abort(c),H(0,c),this}};if(F.promise(d),J.url=((V||J.url||be.href)+"").replace(ar,be.protocol+"//"),J.type=U.method||U.type||J.method||J.type,J.dataTypes=(J.dataType||"*").toLowerCase().match(cd)||[""],null==J.crossDomain){O=bM.createElement("a");try{O.href=J.url,O.href=O.href,J.crossDomain=cr.protocol+"//"+cr.host!=O.protocol+"//"+O.host}catch(a){J.crossDomain=!0}}if(J.data&&J.processData&&"string"!=typeof J.data&&(J.data=bv.param(J.data,J.traditional)),bj(aj,J,U,d),N){return d}M=bv.event&&J.global,M&&0===bv.active++&&bv.event.trigger("ajaxStart"),J.type=J.type.toUpperCase(),J.hasContent=!aA.test(J.type),S=J.url.replace(cx,""),J.hasContent?J.data&&J.processData&&0===(J.contentType||"").indexOf("application/x-www-form-urlencoded")&&(J.data=J.data.replace(cI,"+")):(K=J.url.slice(S.length),J.data&&(S+=(aW.test(S)?"&":"?")+J.data,delete J.data),J.cache===!1&&(S=S.replace(aZ,"$1"),K=(aW.test(S)?"&":"?")+"_="+a5+++K),J.url=S+K),J.ifModified&&(bv.lastModified[S]&&d.setRequestHeader("If-Modified-Since",bv.lastModified[S]),bv.etag[S]&&d.setRequestHeader("If-None-Match",bv.etag[S])),(J.data&&J.hasContent&&J.contentType!==!1||U.contentType)&&d.setRequestHeader("Content-Type",J.contentType),d.setRequestHeader("Accept",J.dataTypes[0]&&J.accepts[J.dataTypes[0]]?J.accepts[J.dataTypes[0]]+("*"!==J.dataTypes[0]?", "+cC+"; q=0.01":""):J.accepts["*"]);for(L in J.headers){d.setRequestHeader(L,J.headers[L])}if(J.beforeSend&&(J.beforeSend.call(I,d,J)===!1||N)){return d.abort()}if(r="abort",E.add(J.complete),d.done(J.success),d.fail(J.error),T=bj(cK,J,U,d)){if(d.readyState=1,M&&G.trigger("ajaxSend",[d,J]),N){return d}J.async&&J.timeout>0&&(P=bP.setTimeout(function(){d.abort("timeout")},J.timeout));try{N=!1,T.send(C,H)}catch(a){if(N){throw a}H(-1,a)}}else{H(-1,"No Transport")}function H(o,l,k,i){var g,f,e,s,q,p=l;N||(N=!0,P&&bP.clearTimeout(P),T=void 0,R=i||"",d.readyState=o>0?4:0,g=o>=200&&o<300||304===o,k&&(s=a3(J,d,k)),s=aU(J,s,d,g),g?(J.ifModified&&(q=d.getResponseHeader("Last-Modified"),q&&(bv.lastModified[S]=q),q=d.getResponseHeader("etag"),q&&(bv.etag[S]=q)),204===o||"HEAD"===J.type?p="nocontent":304===o?p="notmodified":(p=s.state,f=s.data,e=s.error,g=!e)):(e=p,!o&&p||(p="error",o<0&&(o=0))),d.status=o,d.statusText=(l||p)+"",g?F.resolveWith(I,[f,p,d]):F.rejectWith(I,[d,p,e]),d.statusCode(D),D=void 0,M&&G.trigger(g?"ajaxSuccess":"ajaxError",[d,J,g?f:e]),E.fireWith(I,[d,p]),M&&(G.trigger("ajaxComplete",[d,J]),--bv.active||bv.event.trigger("ajaxStop")))}return d},getJSON:function(e,d,f){return bv.get(e,d,f,"json")},getScript:function(d,c){return bv.get(d,void 0,c,"script")}}),bv.each(["get","post"],function(d,c){bv[c]=function(b,h,g,f){return bv.isFunction(h)&&(f=f||g,g=h,h=void 0),bv.ajax(bv.extend({url:b,type:c,dataType:f,data:h,success:g},bv.isPlainObject(b)&&b))}}),bv._evalUrl=function(b){return bv.ajax({url:b,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},bv.fn.extend({wrapAll:function(d){var c;return this[0]&&(bv.isFunction(d)&&(d=d.call(this[0])),c=bv(d,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&c.insertBefore(this[0]),c.map(function(){var b=this;while(b.firstElementChild){b=b.firstElementChild}return b}).append(this)),this},wrapInner:function(b){return bv.isFunction(b)?this.each(function(a){bv(this).wrapInner(b.call(this,a))}):this.each(function(){var a=bv(this),d=a.contents();d.length?d.wrapAll(b):a.append(b)})},wrap:function(d){var c=bv.isFunction(d);return this.each(function(a){bv(this).wrapAll(c?d.call(this,a):d)})},unwrap:function(b){return this.parent(b).not("body").each(function(){bv(this).replaceWith(this.childNodes)}),this}}),bv.expr.pseudos.hidden=function(b){return !bv.expr.pseudos.visible(b)},bv.expr.pseudos.visible=function(b){return !!(b.offsetWidth||b.offsetHeight||b.getClientRects().length)},bv.ajaxSettings.xhr=function(){try{return new bP.XMLHttpRequest}catch(a){}};var aM={0:200,1223:204},aE=bv.ajaxSettings.xhr();bz.cors=!!aE&&"withCredentials" in aE,bz.ajax=aE=!!aE,bv.ajaxTransport(function(a){var f,e;if(bz.cors||aE&&!a.crossDomain){return{send:function(k,j){var d,c=a.xhr();if(c.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields){for(d in a.xhrFields){c[d]=a.xhrFields[d]}}a.mimeType&&c.overrideMimeType&&c.overrideMimeType(a.mimeType),a.crossDomain||k["X-Requested-With"]||(k["X-Requested-With"]="XMLHttpRequest");for(d in k){c.setRequestHeader(d,k[d])}f=function(g){return function(){f&&(f=e=c.onload=c.onerror=c.onabort=c.onreadystatechange=null,"abort"===g?c.abort():"error"===g?"number"!=typeof c.status?j(0,"error"):j(c.status,c.statusText):j(aM[c.status]||c.status,c.statusText,"text"!==(c.responseType||"text")||"string"!=typeof c.responseText?{binary:c.response}:{text:c.responseText},c.getAllResponseHeaders()))}},c.onload=f(),e=c.onerror=f("error"),void 0!==c.onabort?c.onabort=e:c.onreadystatechange=function(){4===c.readyState&&bP.setTimeout(function(){f&&e()})},f=f("abort");try{c.send(a.hasContent&&a.data||null)}catch(b){if(f){throw b}}},abort:function(){f&&f()}}}}),bv.ajaxPrefilter(function(b){b.crossDomain&&(b.contents.script=!1)}),bv.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(b){return bv.globalEval(b),b}}}),bv.ajaxPrefilter("script",function(b){void 0===b.cache&&(b.cache=!1),b.crossDomain&&(b.type="GET")}),bv.ajaxTransport("script",function(e){if(e.crossDomain){var d,f;return{send:function(b,a){d=bv("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",f=function(c){d.remove(),f=null,c&&a("error"===c.type?404:200,c.type)}),bM.head.appendChild(d[0])},abort:function(){f&&f()}}}});var aw=[],an=/(=)\?(?=&|$)|\?\?/;bv.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var b=aw.pop()||bv.expando+"_"+a5++;return this[b]=!0,b}}),bv.ajaxPrefilter("json jsonp",function(a,n,m){var l,k,j,i=a.jsonp!==!1&&(an.test(a.url)?"url":"string"==typeof a.data&&0===(a.contentType||"").indexOf("application/x-www-form-urlencoded")&&an.test(a.data)&&"data");if(i||"jsonp"===a.dataTypes[0]){return l=a.jsonpCallback=bv.isFunction(a.jsonpCallback)?a.jsonpCallback():a.jsonpCallback,i?a[i]=a[i].replace(an,"$1"+l):a.jsonp!==!1&&(a.url+=(aW.test(a.url)?"&":"?")+a.jsonp+"="+l),a.converters["script json"]=function(){return j||bv.error(l+" was not called"),j[0]},a.dataTypes[0]="json",k=bP[l],bP[l]=function(){j=arguments},m.always(function(){void 0===k?bv(bP).removeProp(l):bP[l]=k,a[l]&&(a.jsonpCallback=n.jsonpCallback,aw.push(l)),j&&bv.isFunction(k)&&k(j[0]),j=k=void 0}),"script"}}),bz.createHTMLDocument=function(){var b=bM.implementation.createHTMLDocument("").body;return b.innerHTML="<form></form><form></form>",2===b.childNodes.length}(),bv.parseHTML=function(h,d,l){if("string"!=typeof h){return[]}"boolean"==typeof d&&(l=d,d=!1);var k,j,i;return d||(bz.createHTMLDocument?(d=bM.implementation.createHTMLDocument(""),k=d.createElement("base"),k.href=bM.location.href,d.head.appendChild(k)):d=bM),j=co.exec(h),i=!l&&[],j?[d.createElement(j[1])]:(j=bn([h],d,i),i&&i.length&&bv(i).remove(),bv.merge([],j.childNodes))},bv.fn.load=function(j,i,p){var o,n,m,l=this,k=j.indexOf(" ");return k>-1&&(o=cE(j.slice(k)),j=j.slice(0,k)),bv.isFunction(i)?(p=i,i=void 0):i&&"object"==typeof i&&(n="POST"),l.length>0&&bv.ajax({url:j,type:n||"GET",dataType:"html",data:i}).done(function(b){m=arguments,l.html(o?bv("<div>").append(bv.parseHTML(b)).find(o):b)}).always(p&&function(d,c){l.each(function(){p.apply(this,m||[d.responseText,c,d])})}),this},bv.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(d,c){bv.fn[c]=function(b){return this.on(c,b)}}),bv.expr.pseudos.animated=function(b){return bv.grep(bv.timers,function(a){return b===a.elem}).length};function ae(b){return bv.isWindow(b)?b:9===b.nodeType&&b.defaultView}bv.offset={setOffset:function(z,y,x){var w,v,u,t,s,r,q,p=bv.css(z,"position"),o=bv(z),n={};"static"===p&&(z.style.position="relative"),s=o.offset(),u=bv.css(z,"top"),r=bv.css(z,"left"),q=("absolute"===p||"fixed"===p)&&(u+r).indexOf("auto")>-1,q?(w=o.position(),t=w.top,v=w.left):(t=parseFloat(u)||0,v=parseFloat(r)||0),bv.isFunction(y)&&(y=y.call(z,x,bv.extend({},s))),null!=y.top&&(n.top=y.top-s.top+t),null!=y.left&&(n.left=y.left-s.left+v),"using" in y?y.using.call(z,n):o.css(n)}},bv.fn.extend({offset:function(h){if(arguments.length){return void 0===h?this:this.each(function(a){bv.offset.setOffset(this,h,a)})}var g,l,k,j,i=this[0];if(i){return i.getClientRects().length?(k=i.getBoundingClientRect(),k.width||k.height?(j=i.ownerDocument,l=ae(j),g=j.documentElement,{top:k.top+l.pageYOffset-g.clientTop,left:k.left+l.pageXOffset-g.clientLeft}):k):{top:0,left:0}}},position:function(){if(this[0]){var f,e,h=this[0],g={top:0,left:0};return"fixed"===bv.css(h,"position")?e=h.getBoundingClientRect():(f=this.offsetParent(),e=this.offset(),bv.nodeName(f[0],"html")||(g=f.offset()),g={top:g.top+bv.css(f[0],"borderTopWidth",!0),left:g.left+bv.css(f[0],"borderLeftWidth",!0)}),{top:e.top-g.top-bv.css(h,"marginTop",!0),left:e.left-g.left-bv.css(h,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var b=this.offsetParent;while(b&&"static"===bv.css(b,"position")){b=b.offsetParent}return b||bf})}}),bv.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,d){var f="pageYOffset"===d;bv.fn[e]=function(a){return b2(this,function(b,h,g){var c=ae(b);return void 0===g?c?c[d]:b[h]:void (c?c.scrollTo(f?c.pageXOffset:g,f?g:c.pageYOffset):b[h]=g)},e,a,arguments.length)}}),bv.each(["top","left"],function(d,c){bv.cssHooks[c]=aN(bz.pixelPosition,function(b,e){if(e){return e=aV(b,c),bd.test(e)?bv(b).position()[c]+"px":e}})}),bv.each({Height:"height",Width:"width"},function(d,c){bv.each({padding:"inner"+d,content:c,"":"outer"+d},function(b,a){bv.fn[a]=function(l,k){var j=arguments.length&&(b||"boolean"!=typeof l),i=b||(l===!0||k===!0?"margin":"border");return b2(this,function(g,n,m){var h;return bv.isWindow(g)?0===a.indexOf("outer")?g["inner"+d]:g.document.documentElement["client"+d]:9===g.nodeType?(h=g.documentElement,Math.max(g.body["scroll"+d],h["scroll"+d],g.body["offset"+d],h["offset"+d],h["client"+d])):void 0===m?bv.css(g,n,i):bv.style(g,n,m,i)},c,j?l:void 0,j)}})}),bv.fn.extend({bind:function(e,d,f){return this.on(e,null,d,f)},unbind:function(d,c){return this.off(d,null,c)},delegate:function(f,e,h,g){return this.on(e,f,h,g)},undelegate:function(e,d,f){return 1===arguments.length?this.off(e,"**"):this.off(d,e||"**",f)}}),bv.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return bv});var cG=bP.jQuery,cv=bP.$;return bv.noConflict=function(a){return bP.$===bv&&(bP.$=cv),a&&bP.jQuery===bv&&(bP.jQuery=cG),bv},bO||(bP.jQuery=bP.$=bv),bv});
/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under the MIT license
 */
;if(typeof jQuery==="undefined"){throw new Error("Bootstrap's JavaScript requires jQuery")}+function(b){var a=b.fn.jquery.split(" ")[0].split(".");if((a[0]<2&&a[1]<9)||(a[0]==1&&a[1]==9&&a[2]<1)||(a[0]>3)){throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}}(jQuery);+function(b){function a(){var e=document.createElement("bootstrap");var d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in d){if(e.style[c]!==undefined){return{end:d[c]}}}return false}b.fn.emulateTransitionEnd=function(e){var d=false;var c=this;b(this).one("bsTransitionEnd",function(){d=true});var f=function(){if(!d){b(c).trigger(b.support.transition.end)}};setTimeout(f,e);return this};b(function(){b.support.transition=a();if(!b.support.transition){return}b.event.special.bsTransitionEnd={bindType:b.support.transition.end,delegateType:b.support.transition.end,handle:function(c){if(b(c.target).is(this)){return c.handleObj.handler.apply(this,arguments)}}}})}(jQuery);+function(e){var d='[data-dismiss="alert"]';var b=function(f){e(f).on("click",d,this.close)};b.VERSION="3.3.7";b.TRANSITION_DURATION=150;b.prototype.close=function(j){var i=e(this);var g=i.attr("data-target");if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}var h=e(g==="#"?[]:g);if(j){j.preventDefault()}if(!h.length){h=i.closest(".alert")}h.trigger(j=e.Event("close.bs.alert"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.detach().trigger("closed.bs.alert").remove()}e.support.transition&&h.hasClass("fade")?h.one("bsTransitionEnd",f).emulateTransitionEnd(b.TRANSITION_DURATION):f()};function c(f){return this.each(function(){var h=e(this);var g=h.data("bs.alert");if(!g){h.data("bs.alert",(g=new b(this)))}if(typeof f=="string"){g[f].call(h)}})}var a=e.fn.alert;e.fn.alert=c;e.fn.alert.Constructor=b;e.fn.alert.noConflict=function(){e.fn.alert=a;return this};e(document).on("click.bs.alert.data-api",d,b.prototype.close)}(jQuery);+function(d){var b=function(f,e){this.$element=d(f);this.options=d.extend({},b.DEFAULTS,e);this.isLoading=false};b.VERSION="3.3.7";b.DEFAULTS={loadingText:"loading..."};b.prototype.setState=function(g){var i="disabled";var e=this.$element;var h=e.is("input")?"val":"html";var f=e.data();g+="Text";if(f.resetText==null){e.data("resetText",e[h]())}setTimeout(d.proxy(function(){e[h](f[g]==null?this.options[g]:f[g]);if(g=="loadingText"){this.isLoading=true;e.addClass(i).attr(i,i).prop(i,true)}else{if(this.isLoading){this.isLoading=false;e.removeClass(i).removeAttr(i).prop(i,false)}}},this),0)};b.prototype.toggle=function(){var f=true;var e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var g=this.$element.find("input");if(g.prop("type")=="radio"){if(g.prop("checked")){f=false}e.find(".active").removeClass("active");this.$element.addClass("active")}else{if(g.prop("type")=="checkbox"){if((g.prop("checked"))!==this.$element.hasClass("active")){f=false}this.$element.toggleClass("active")}}g.prop("checked",this.$element.hasClass("active"));if(f){g.trigger("change")}}else{this.$element.attr("aria-pressed",!this.$element.hasClass("active"));this.$element.toggleClass("active")}};function c(e){return this.each(function(){var h=d(this);var g=h.data("bs.button");var f=typeof e=="object"&&e;if(!g){h.data("bs.button",(g=new b(this,f)))}if(e=="toggle"){g.toggle()}else{if(e){g.setState(e)}}})}var a=d.fn.button;d.fn.button=c;d.fn.button.Constructor=b;d.fn.button.noConflict=function(){d.fn.button=a;return this};d(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(g){var f=d(g.target).closest(".btn");c.call(f,"toggle");if(!(d(g.target).is('input[type="radio"], input[type="checkbox"]'))){g.preventDefault();if(f.is("input,button")){f.trigger("focus")}else{f.find("input:visible,button:visible").first().trigger("focus")}}}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(f){d(f.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(f.type))})}(jQuery);+function(c){var d=function(g,f){this.$element=c(g);this.$indicators=this.$element.find(".carousel-indicators");this.options=f;this.paused=null;this.sliding=null;this.interval=null;this.$active=null;this.$items=null;this.options.keyboard&&this.$element.on("keydown.bs.carousel",c.proxy(this.keydown,this));this.options.pause=="hover"&&!("ontouchstart" in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",c.proxy(this.pause,this)).on("mouseleave.bs.carousel",c.proxy(this.cycle,this))};d.VERSION="3.3.7";d.TRANSITION_DURATION=600;d.DEFAULTS={interval:5000,pause:"hover",wrap:true,keyboard:true};d.prototype.keydown=function(f){if(/input|textarea/i.test(f.target.tagName)){return}switch(f.which){case 37:this.prev();break;case 39:this.next();break;default:return}f.preventDefault()};d.prototype.cycle=function(f){f||(this.paused=false);this.interval&&clearInterval(this.interval);this.options.interval&&!this.paused&&(this.interval=setInterval(c.proxy(this.next,this),this.options.interval));return this};d.prototype.getItemIndex=function(f){this.$items=f.parent().children(".item");return this.$items.index(f||this.$active)};d.prototype.getItemForDirection=function(j,i){var f=this.getItemIndex(i);var g=(j=="prev"&&f===0)||(j=="next"&&f==(this.$items.length-1));if(g&&!this.options.wrap){return i}var k=j=="prev"?-1:1;var h=(f+k)%this.$items.length;return this.$items.eq(h)};d.prototype.to=function(h){var g=this;var f=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(h>(this.$items.length-1)||h<0){return}if(this.sliding){return this.$element.one("slid.bs.carousel",function(){g.to(h)})}if(f==h){return this.pause().cycle()}return this.slide(h>f?"next":"prev",this.$items.eq(h))};d.prototype.pause=function(f){f||(this.paused=true);if(this.$element.find(".next, .prev").length&&c.support.transition){this.$element.trigger(c.support.transition.end);this.cycle(true)}this.interval=clearInterval(this.interval);return this};d.prototype.next=function(){if(this.sliding){return}return this.slide("next")};d.prototype.prev=function(){if(this.sliding){return}return this.slide("prev")};d.prototype.slide=function(m,i){var p=this.$element.find(".item.active");var g=i||this.getItemForDirection(m,p);var k=this.interval;var n=m=="next"?"left":"right";var j=this;if(g.hasClass("active")){return(this.sliding=false)}var l=g[0];var f=c.Event("slide.bs.carousel",{relatedTarget:l,direction:n});this.$element.trigger(f);if(f.isDefaultPrevented()){return}this.sliding=true;k&&this.pause();if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");var h=c(this.$indicators.children()[this.getItemIndex(g)]);h&&h.addClass("active")}var o=c.Event("slid.bs.carousel",{relatedTarget:l,direction:n});if(c.support.transition&&this.$element.hasClass("slide")){g.addClass(m);g[0].offsetWidth;p.addClass(n);g.addClass(n);p.one("bsTransitionEnd",function(){g.removeClass([m,n].join(" ")).addClass("active");p.removeClass(["active",n].join(" "));j.sliding=false;setTimeout(function(){j.$element.trigger(o)},0)}).emulateTransitionEnd(d.TRANSITION_DURATION)}else{p.removeClass("active");g.addClass("active");this.sliding=false;this.$element.trigger(o)}k&&this.cycle();return this};function b(f){return this.each(function(){var j=c(this);var i=j.data("bs.carousel");var g=c.extend({},d.DEFAULTS,j.data(),typeof f=="object"&&f);var h=typeof f=="string"?f:g.slide;if(!i){j.data("bs.carousel",(i=new d(this,g)))}if(typeof f=="number"){i.to(f)}else{if(h){i[h]()}else{if(g.interval){i.pause().cycle()}}}})}var a=c.fn.carousel;c.fn.carousel=b;c.fn.carousel.Constructor=d;c.fn.carousel.noConflict=function(){c.fn.carousel=a;return this};var e=function(k){var g;var j=c(this);var f=c(j.attr("data-target")||(g=j.attr("href"))&&g.replace(/.*(?=#[^\s]+$)/,""));if(!f.hasClass("carousel")){return}var h=c.extend({},f.data(),j.data());var i=j.attr("data-slide-to");if(i){h.interval=false}b.call(f,h);if(i){f.data("bs.carousel").to(i)}k.preventDefault()};c(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e);c(window).on("load",function(){c('[data-ride="carousel"]').each(function(){var f=c(this);b.call(f,f.data())})})}(jQuery);+function(d){var e=function(g,f){this.$element=d(g);this.options=d.extend({},e.DEFAULTS,f);this.$trigger=d('[data-toggle="collapse"][href="#'+g.id+'"],[data-toggle="collapse"][data-target="#'+g.id+'"]');this.transitioning=null;if(this.options.parent){this.$parent=this.getParent()}else{this.addAriaAndCollapsedClass(this.$element,this.$trigger)}if(this.options.toggle){this.toggle()}};e.VERSION="3.3.7";e.TRANSITION_DURATION=350;e.DEFAULTS={toggle:true};e.prototype.dimension=function(){var f=this.$element.hasClass("width");return f?"width":"height"};e.prototype.show=function(){if(this.transitioning||this.$element.hasClass("in")){return}var h;var j=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(j&&j.length){h=j.data("bs.collapse");if(h&&h.transitioning){return}}var g=d.Event("show.bs.collapse");this.$element.trigger(g);if(g.isDefaultPrevented()){return}if(j&&j.length){b.call(j,"hide");h||j.data("bs.collapse",null)}var k=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[k](0).attr("aria-expanded",true);this.$trigger.removeClass("collapsed").attr("aria-expanded",true);this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[k]("");this.transitioning=0;this.$element.trigger("shown.bs.collapse")};if(!d.support.transition){return f.call(this)}var i=d.camelCase(["scroll",k].join("-"));this.$element.one("bsTransitionEnd",d.proxy(f,this)).emulateTransitionEnd(e.TRANSITION_DURATION)[k](this.$element[0][i])};e.prototype.hide=function(){if(this.transitioning||!this.$element.hasClass("in")){return}var g=d.Event("hide.bs.collapse");this.$element.trigger(g);if(g.isDefaultPrevented()){return}var h=this.dimension();this.$element[h](this.$element[h]())[0].offsetHeight;this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",false);this.$trigger.addClass("collapsed").attr("aria-expanded",false);this.transitioning=1;var f=function(){this.transitioning=0;this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!d.support.transition){return f.call(this)}this.$element[h](0).one("bsTransitionEnd",d.proxy(f,this)).emulateTransitionEnd(e.TRANSITION_DURATION)};e.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};e.prototype.getParent=function(){return d(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(d.proxy(function(h,g){var f=d(g);this.addAriaAndCollapsedClass(c(f),f)},this)).end()};e.prototype.addAriaAndCollapsedClass=function(g,f){var h=g.hasClass("in");g.attr("aria-expanded",h);f.toggleClass("collapsed",!h).attr("aria-expanded",h)};function c(f){var g;var h=f.attr("data-target")||(g=f.attr("href"))&&g.replace(/.*(?=#[^\s]+$)/,"");return d(h)}function b(f){return this.each(function(){var i=d(this);var h=i.data("bs.collapse");var g=d.extend({},e.DEFAULTS,i.data(),typeof f=="object"&&f);if(!h&&g.toggle&&/show|hide/.test(f)){g.toggle=false}if(!h){i.data("bs.collapse",(h=new e(this,g)))}if(typeof f=="string"){h[f]()}})}var a=d.fn.collapse;d.fn.collapse=b;d.fn.collapse.Constructor=e;d.fn.collapse.noConflict=function(){d.fn.collapse=a;return this};d(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(j){var i=d(this);if(!i.attr("data-target")){j.preventDefault()}var f=c(i);var h=f.data("bs.collapse");var g=h?"toggle":i.data();b.call(f,g)})}(jQuery);+function(h){var e=".dropdown-backdrop";var b='[data-toggle="dropdown"]';var a=function(i){h(i).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.7";function f(k){var i=k.attr("data-target");if(!i){i=k.attr("href");i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,"")}var j=i&&h(i);return j&&j.length?j:k.parent()}function d(i){if(i&&i.which===3){return}h(e).remove();h(b).each(function(){var l=h(this);var k=f(l);var j={relatedTarget:this};if(!k.hasClass("open")){return}if(i&&i.type=="click"&&/input|textarea/i.test(i.target.tagName)&&h.contains(k[0],i.target)){return}k.trigger(i=h.Event("hide.bs.dropdown",j));if(i.isDefaultPrevented()){return}l.attr("aria-expanded","false");k.removeClass("open").trigger(h.Event("hidden.bs.dropdown",j))})}a.prototype.toggle=function(m){var l=h(this);if(l.is(".disabled, :disabled")){return}var k=f(l);var j=k.hasClass("open");d();if(!j){if("ontouchstart" in document.documentElement&&!k.closest(".navbar-nav").length){h(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(h(this)).on("click",d)}var i={relatedTarget:this};k.trigger(m=h.Event("show.bs.dropdown",i));if(m.isDefaultPrevented()){return}l.trigger("focus").attr("aria-expanded","true");k.toggleClass("open").trigger(h.Event("shown.bs.dropdown",i))}return false};a.prototype.keydown=function(m){if(!/(38|40|27|32)/.test(m.which)||/input|textarea/i.test(m.target.tagName)){return}var l=h(this);m.preventDefault();m.stopPropagation();if(l.is(".disabled, :disabled")){return}var k=f(l);var j=k.hasClass("open");if(!j&&m.which!=27||j&&m.which==27){if(m.which==27){k.find(b).trigger("focus")}return l.trigger("click")}var n=" li:not(.disabled):visible a";var o=k.find(".dropdown-menu"+n);if(!o.length){return}var i=o.index(m.target);if(m.which==38&&i>0){i--}if(m.which==40&&i<o.length-1){i++}if(!~i){i=0}o.eq(i).trigger("focus")};function g(i){return this.each(function(){var k=h(this);var j=k.data("bs.dropdown");if(!j){k.data("bs.dropdown",(j=new a(this)))}if(typeof i=="string"){j[i].call(k)}})}var c=h.fn.dropdown;h.fn.dropdown=g;h.fn.dropdown.Constructor=a;h.fn.dropdown.noConflict=function(){h.fn.dropdown=c;return this};h(document).on("click.bs.dropdown.data-api",d).on("click.bs.dropdown.data-api",".dropdown form",function(i){i.stopPropagation()}).on("click.bs.dropdown.data-api",b,a.prototype.toggle).on("keydown.bs.dropdown.data-api",b,a.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",a.prototype.keydown)}(jQuery);+function(d){var b=function(f,e){this.options=e;this.$body=d(document.body);this.$element=d(f);this.$dialog=this.$element.find(".modal-dialog");this.$backdrop=null;this.isShown=null;this.originalBodyPad=null;this.scrollbarWidth=0;this.ignoreBackdropClick=false;if(this.options.remote){this.$element.find(".modal-content").load(this.options.remote,d.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))}};b.VERSION="3.3.7";b.TRANSITION_DURATION=300;b.BACKDROP_TRANSITION_DURATION=150;b.DEFAULTS={backdrop:true,keyboard:true,show:true};b.prototype.toggle=function(e){return this.isShown?this.hide():this.show(e)};b.prototype.show=function(h){var f=this;var g=d.Event("show.bs.modal",{relatedTarget:h});this.$element.trigger(g);if(this.isShown||g.isDefaultPrevented()){return}this.isShown=true;this.checkScrollbar();this.setScrollbar();this.$body.addClass("modal-open");this.escape();this.resize();this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',d.proxy(this.hide,this));this.$dialog.on("mousedown.dismiss.bs.modal",function(){f.$element.one("mouseup.dismiss.bs.modal",function(i){if(d(i.target).is(f.$element)){f.ignoreBackdropClick=true}})});this.backdrop(function(){var j=d.support.transition&&f.$element.hasClass("fade");if(!f.$element.parent().length){f.$element.appendTo(f.$body)}f.$element.show().scrollTop(0);f.adjustDialog();if(j){f.$element[0].offsetWidth}f.$element.addClass("in");f.enforceFocus();var i=d.Event("shown.bs.modal",{relatedTarget:h});j?f.$dialog.one("bsTransitionEnd",function(){f.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(b.TRANSITION_DURATION):f.$element.trigger("focus").trigger(i)})};b.prototype.hide=function(f){if(f){f.preventDefault()}f=d.Event("hide.bs.modal");this.$element.trigger(f);if(!this.isShown||f.isDefaultPrevented()){return}this.isShown=false;this.escape();this.resize();d(document).off("focusin.bs.modal");this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal");this.$dialog.off("mousedown.dismiss.bs.modal");d.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",d.proxy(this.hideModal,this)).emulateTransitionEnd(b.TRANSITION_DURATION):this.hideModal()};b.prototype.enforceFocus=function(){d(document).off("focusin.bs.modal").on("focusin.bs.modal",d.proxy(function(f){if(document!==f.target&&this.$element[0]!==f.target&&!this.$element.has(f.target).length){this.$element.trigger("focus")}},this))};b.prototype.escape=function(){if(this.isShown&&this.options.keyboard){this.$element.on("keydown.dismiss.bs.modal",d.proxy(function(f){f.which==27&&this.hide()},this))}else{if(!this.isShown){this.$element.off("keydown.dismiss.bs.modal")}}};b.prototype.resize=function(){if(this.isShown){d(window).on("resize.bs.modal",d.proxy(this.handleUpdate,this))}else{d(window).off("resize.bs.modal")}};b.prototype.hideModal=function(){var e=this;this.$element.hide();this.backdrop(function(){e.$body.removeClass("modal-open");e.resetAdjustments();e.resetScrollbar();e.$element.trigger("hidden.bs.modal")})};b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove();this.$backdrop=null};b.prototype.backdrop=function(i){var h=this;var f=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=d.support.transition&&f;this.$backdrop=d(document.createElement("div")).addClass("modal-backdrop "+f).appendTo(this.$body);this.$element.on("click.dismiss.bs.modal",d.proxy(function(j){if(this.ignoreBackdropClick){this.ignoreBackdropClick=false;return}if(j.target!==j.currentTarget){return}this.options.backdrop=="static"?this.$element[0].focus():this.hide()},this));if(e){this.$backdrop[0].offsetWidth}this.$backdrop.addClass("in");if(!i){return}e?this.$backdrop.one("bsTransitionEnd",i).emulateTransitionEnd(b.BACKDROP_TRANSITION_DURATION):i()}else{if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){h.removeBackdrop();i&&i()};d.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(b.BACKDROP_TRANSITION_DURATION):g()}else{if(i){i()}}}};b.prototype.handleUpdate=function(){this.adjustDialog()};b.prototype.adjustDialog=function(){var e=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})};b.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})};b.prototype.checkScrollbar=function(){var f=window.innerWidth;if(!f){var e=document.documentElement.getBoundingClientRect();f=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<f;this.scrollbarWidth=this.measureScrollbar()};b.prototype.setScrollbar=function(){var e=parseInt((this.$body.css("padding-right")||0),10);this.originalBodyPad=document.body.style.paddingRight||"";if(this.bodyIsOverflowing){this.$body.css("padding-right",e+this.scrollbarWidth)}};b.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)};b.prototype.measureScrollbar=function(){var f=document.createElement("div");f.className="modal-scrollbar-measure";this.$body.append(f);var e=f.offsetWidth-f.clientWidth;this.$body[0].removeChild(f);return e};function c(e,f){return this.each(function(){var i=d(this);var h=i.data("bs.modal");var g=d.extend({},b.DEFAULTS,i.data(),typeof e=="object"&&e);if(!h){i.data("bs.modal",(h=new b(this,g)))}if(typeof e=="string"){h[e](f)}else{if(g.show){h.show(f)}}})}var a=d.fn.modal;d.fn.modal=c;d.fn.modal.Constructor=b;d.fn.modal.noConflict=function(){d.fn.modal=a;return this};d(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(j){var i=d(this);var g=i.attr("href");var f=d(i.attr("data-target")||(g&&g.replace(/.*(?=#[^\s]+$)/,"")));var h=f.data("bs.modal")?"toggle":d.extend({remote:!/#/.test(g)&&g},f.data(),i.data());if(i.is("a")){j.preventDefault()}f.one("show.bs.modal",function(e){if(e.isDefaultPrevented()){return}f.one("hidden.bs.modal",function(){i.is(":visible")&&i.trigger("focus")})});c.call(f,h,this)})}(jQuery);+function(d){var c=function(f,e){this.type=null;this.options=null;this.enabled=null;this.timeout=null;this.hoverState=null;this.$element=null;this.inState=null;this.init("tooltip",f,e)};c.VERSION="3.3.7";c.TRANSITION_DURATION=150;c.DEFAULTS={animation:true,placement:"top",selector:false,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:false,container:false,viewport:{selector:"body",padding:0}};c.prototype.init=function(l,j,g){this.enabled=true;this.type=l;this.$element=d(j);this.options=this.getOptions(g);this.$viewport=this.options.viewport&&d(d.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):(this.options.viewport.selector||this.options.viewport));this.inState={click:false,hover:false,focus:false};if(this.$element[0] instanceof document.constructor&&!this.options.selector){throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!")}var k=this.options.trigger.split(" ");for(var h=k.length;h--;){var f=k[h];if(f=="click"){this.$element.on("click."+this.type,this.options.selector,d.proxy(this.toggle,this))}else{if(f!="manual"){var m=f=="hover"?"mouseenter":"focusin";var e=f=="hover"?"mouseleave":"focusout";this.$element.on(m+"."+this.type,this.options.selector,d.proxy(this.enter,this));this.$element.on(e+"."+this.type,this.options.selector,d.proxy(this.leave,this))}}}this.options.selector?(this._options=d.extend({},this.options,{trigger:"manual",selector:""})):this.fixTitle()};c.prototype.getDefaults=function(){return c.DEFAULTS};c.prototype.getOptions=function(e){e=d.extend({},this.getDefaults(),this.$element.data(),e);if(e.delay&&typeof e.delay=="number"){e.delay={show:e.delay,hide:e.delay}}return e};c.prototype.getDelegateOptions=function(){var e={};var f=this.getDefaults();this._options&&d.each(this._options,function(g,h){if(f[g]!=h){e[g]=h}});return e};c.prototype.enter=function(f){var e=f instanceof this.constructor?f:d(f.currentTarget).data("bs."+this.type);if(!e){e=new this.constructor(f.currentTarget,this.getDelegateOptions());d(f.currentTarget).data("bs."+this.type,e)}if(f instanceof d.Event){e.inState[f.type=="focusin"?"focus":"hover"]=true}if(e.tip().hasClass("in")||e.hoverState=="in"){e.hoverState="in";return}clearTimeout(e.timeout);e.hoverState="in";if(!e.options.delay||!e.options.delay.show){return e.show()}e.timeout=setTimeout(function(){if(e.hoverState=="in"){e.show()}},e.options.delay.show)};c.prototype.isInStateTrue=function(){for(var e in this.inState){if(this.inState[e]){return true}}return false};c.prototype.leave=function(f){var e=f instanceof this.constructor?f:d(f.currentTarget).data("bs."+this.type);if(!e){e=new this.constructor(f.currentTarget,this.getDelegateOptions());d(f.currentTarget).data("bs."+this.type,e)}if(f instanceof d.Event){e.inState[f.type=="focusout"?"focus":"hover"]=false}if(e.isInStateTrue()){return}clearTimeout(e.timeout);e.hoverState="out";if(!e.options.delay||!e.options.delay.hide){return e.hide()}e.timeout=setTimeout(function(){if(e.hoverState=="out"){e.hide()}},e.options.delay.hide)};c.prototype.show=function(){var o=d.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(o);var p=d.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(o.isDefaultPrevented()||!p){return}var n=this;var l=this.tip();var h=this.getUID(this.type);this.setContent();l.attr("id",h);this.$element.attr("aria-describedby",h);if(this.options.animation){l.addClass("fade")}var k=typeof this.options.placement=="function"?this.options.placement.call(this,l[0],this.$element[0]):this.options.placement;var s=/\s?auto?\s?/i;var t=s.test(k);if(t){k=k.replace(s,"")||"top"}l.detach().css({top:0,left:0,display:"block"}).addClass(k).data("bs."+this.type,this);this.options.container?l.appendTo(this.options.container):l.insertAfter(this.$element);this.$element.trigger("inserted.bs."+this.type);var q=this.getPosition();var f=l[0].offsetWidth;var m=l[0].offsetHeight;if(t){var j=k;var r=this.getPosition(this.$viewport);k=k=="bottom"&&q.bottom+m>r.bottom?"top":k=="top"&&q.top-m<r.top?"bottom":k=="right"&&q.right+f>r.width?"left":k=="left"&&q.left-f<r.left?"right":k;l.removeClass(j).addClass(k)}var i=this.getCalculatedOffset(k,q,f,m);this.applyPlacement(i,k);var g=function(){var e=n.hoverState;n.$element.trigger("shown.bs."+n.type);n.hoverState=null;if(e=="out"){n.leave(n)}};d.support.transition&&this.$tip.hasClass("fade")?l.one("bsTransitionEnd",g).emulateTransitionEnd(c.TRANSITION_DURATION):g()}};c.prototype.applyPlacement=function(j,k){var l=this.tip();var g=l[0].offsetWidth;var q=l[0].offsetHeight;var f=parseInt(l.css("margin-top"),10);var i=parseInt(l.css("margin-left"),10);if(isNaN(f)){f=0}if(isNaN(i)){i=0}j.top+=f;j.left+=i;d.offset.setOffset(l[0],d.extend({using:function(r){l.css({top:Math.round(r.top),left:Math.round(r.left)})}},j),0);l.addClass("in");var e=l[0].offsetWidth;var m=l[0].offsetHeight;if(k=="top"&&m!=q){j.top=j.top+q-m}var p=this.getViewportAdjustedDelta(k,j,e,m);if(p.left){j.left+=p.left}else{j.top+=p.top}var n=/top|bottom/.test(k);var h=n?p.left*2-g+e:p.top*2-q+m;var o=n?"offsetWidth":"offsetHeight";l.offset(j);this.replaceArrow(h,l[0][o],n)};c.prototype.replaceArrow=function(g,e,f){this.arrow().css(f?"left":"top",50*(1-g/e)+"%").css(f?"top":"left","")};c.prototype.setContent=function(){var f=this.tip();var e=this.getTitle();f.find(".tooltip-inner")[this.options.html?"html":"text"](e);f.removeClass("fade in top bottom left right")};c.prototype.hide=function(j){var g=this;var i=d(this.$tip);var h=d.Event("hide.bs."+this.type);function f(){if(g.hoverState!="in"){i.detach()}if(g.$element){g.$element.removeAttr("aria-describedby").trigger("hidden.bs."+g.type)}j&&j()}this.$element.trigger(h);if(h.isDefaultPrevented()){return}i.removeClass("in");d.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f();this.hoverState=null;return this};c.prototype.fixTitle=function(){var e=this.$element;if(e.attr("title")||typeof e.attr("data-original-title")!="string"){e.attr("data-original-title",e.attr("title")||"").attr("title","")}};c.prototype.hasContent=function(){return this.getTitle()};c.prototype.getPosition=function(g){g=g||this.$element;var i=g[0];var f=i.tagName=="BODY";var h=i.getBoundingClientRect();if(h.width==null){h=d.extend({},h,{width:h.right-h.left,height:h.bottom-h.top})}var k=window.SVGElement&&i instanceof window.SVGElement;var l=f?{top:0,left:0}:(k?null:g.offset());var e={scroll:f?document.documentElement.scrollTop||document.body.scrollTop:g.scrollTop()};var j=f?{width:d(window).width(),height:d(window).height()}:null;return d.extend({},h,e,j,l)};c.prototype.getCalculatedOffset=function(e,h,f,g){return e=="bottom"?{top:h.top+h.height,left:h.left+h.width/2-f/2}:e=="top"?{top:h.top-g,left:h.left+h.width/2-f/2}:e=="left"?{top:h.top+h.height/2-g/2,left:h.left-f}:{top:h.top+h.height/2-g/2,left:h.left+h.width}};c.prototype.getViewportAdjustedDelta=function(h,k,e,j){var m={top:0,left:0};if(!this.$viewport){return m}var g=this.options.viewport&&this.options.viewport.padding||0;var l=this.getPosition(this.$viewport);if(/right|left/.test(h)){var n=k.top-g-l.scroll;var i=k.top+g-l.scroll+j;if(n<l.top){m.top=l.top-n}else{if(i>l.top+l.height){m.top=l.top+l.height-i}}}else{var o=k.left-g;var f=k.left+g+e;if(o<l.left){m.left=l.left-o}else{if(f>l.right){m.left=l.left+l.width-f}}}return m};c.prototype.getTitle=function(){var g;var e=this.$element;var f=this.options;g=e.attr("data-original-title")||(typeof f.title=="function"?f.title.call(e[0]):f.title);return g};c.prototype.getUID=function(e){do{e+=~~(Math.random()*1000000)}while(document.getElementById(e));return e};c.prototype.tip=function(){if(!this.$tip){this.$tip=d(this.options.template);if(this.$tip.length!=1){throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!")}}return this.$tip};c.prototype.arrow=function(){return(this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow"))};c.prototype.enable=function(){this.enabled=true};c.prototype.disable=function(){this.enabled=false};c.prototype.toggleEnabled=function(){this.enabled=!this.enabled};c.prototype.toggle=function(g){var f=this;if(g){f=d(g.currentTarget).data("bs."+this.type);if(!f){f=new this.constructor(g.currentTarget,this.getDelegateOptions());d(g.currentTarget).data("bs."+this.type,f)}}if(g){f.inState.click=!f.inState.click;if(f.isInStateTrue()){f.enter(f)}else{f.leave(f)}}else{f.tip().hasClass("in")?f.leave(f):f.enter(f)}};c.prototype.destroy=function(){var e=this;clearTimeout(this.timeout);this.hide(function(){e.$element.off("."+e.type).removeData("bs."+e.type);if(e.$tip){e.$tip.detach()}e.$tip=null;e.$arrow=null;e.$viewport=null;e.$element=null})};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.tooltip");var f=typeof e=="object"&&e;if(!g&&/destroy|hide/.test(e)){return}if(!g){h.data("bs.tooltip",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.tooltip;d.fn.tooltip=b;d.fn.tooltip.Constructor=c;d.fn.tooltip.noConflict=function(){d.fn.tooltip=a;return this}}(jQuery);+function(d){var c=function(f,e){this.init("popover",f,e)};if(!d.fn.tooltip){throw new Error("Popover requires tooltip.js")}c.VERSION="3.3.7";c.DEFAULTS=d.extend({},d.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'});c.prototype=d.extend({},d.fn.tooltip.Constructor.prototype);c.prototype.constructor=c;c.prototype.getDefaults=function(){return c.DEFAULTS};c.prototype.setContent=function(){var g=this.tip();var f=this.getTitle();var e=this.getContent();g.find(".popover-title")[this.options.html?"html":"text"](f);g.find(".popover-content").children().detach().end()[this.options.html?(typeof e=="string"?"html":"append"):"text"](e);g.removeClass("fade top bottom left right in");if(!g.find(".popover-title").html()){g.find(".popover-title").hide()}};c.prototype.hasContent=function(){return this.getTitle()||this.getContent()};c.prototype.getContent=function(){var e=this.$element;var f=this.options;return e.attr("data-content")||(typeof f.content=="function"?f.content.call(e[0]):f.content)};c.prototype.arrow=function(){return(this.$arrow=this.$arrow||this.tip().find(".arrow"))};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.popover");var f=typeof e=="object"&&e;if(!g&&/destroy|hide/.test(e)){return}if(!g){h.data("bs.popover",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.popover;d.fn.popover=b;d.fn.popover.Constructor=c;d.fn.popover.noConflict=function(){d.fn.popover=a;return this}}(jQuery);+function(d){function c(f,e){this.$body=d(document.body);this.$scrollElement=d(f).is(document.body)?d(window):d(f);this.options=d.extend({},c.DEFAULTS,e);this.selector=(this.options.target||"")+" .nav li > a";this.offsets=[];this.targets=[];this.activeTarget=null;this.scrollHeight=0;this.$scrollElement.on("scroll.bs.scrollspy",d.proxy(this.process,this));this.refresh();this.process()}c.VERSION="3.3.7";c.DEFAULTS={offset:10};c.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)};c.prototype.refresh=function(){var g=this;var e="offset";var f=0;this.offsets=[];this.targets=[];this.scrollHeight=this.getScrollHeight();if(!d.isWindow(this.$scrollElement[0])){e="position";f=this.$scrollElement.scrollTop()}this.$body.find(this.selector).map(function(){var i=d(this);var h=i.data("target")||i.attr("href");var j=/^#./.test(h)&&d(h);return(j&&j.length&&j.is(":visible")&&[[j[e]().top+f,h]])||null}).sort(function(i,h){return i[0]-h[0]}).each(function(){g.offsets.push(this[0]);g.targets.push(this[1])})};c.prototype.process=function(){var k=this.$scrollElement.scrollTop()+this.options.offset;var g=this.getScrollHeight();var j=this.options.offset+g-this.$scrollElement.height();var h=this.offsets;var e=this.targets;var l=this.activeTarget;var f;if(this.scrollHeight!=g){this.refresh()}if(k>=j){return l!=(f=e[e.length-1])&&this.activate(f)}if(l&&k<h[0]){this.activeTarget=null;return this.clear()}for(f=h.length;f--;){l!=e[f]&&k>=h[f]&&(h[f+1]===undefined||k<h[f+1])&&this.activate(e[f])}};c.prototype.activate=function(g){this.activeTarget=g;this.clear();var e=this.selector+'[data-target="'+g+'"],'+this.selector+'[href="'+g+'"]';var f=d(e).parents("li").addClass("active");if(f.parent(".dropdown-menu").length){f=f.closest("li.dropdown").addClass("active")}f.trigger("activate.bs.scrollspy")};c.prototype.clear=function(){d(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.scrollspy");var f=typeof e=="object"&&e;if(!g){h.data("bs.scrollspy",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.scrollspy;d.fn.scrollspy=b;d.fn.scrollspy.Constructor=c;d.fn.scrollspy.noConflict=function(){d.fn.scrollspy=a;return this};d(window).on("load.bs.scrollspy.data-api",function(){d('[data-spy="scroll"]').each(function(){var e=d(this);b.call(e,e.data())})})}(jQuery);+function(d){var b=function(f){this.element=d(f)};b.VERSION="3.3.7";b.TRANSITION_DURATION=150;b.prototype.show=function(){var l=this.element;var h=l.closest("ul:not(.dropdown-menu)");var g=l.data("target");if(!g){g=l.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}if(l.parent("li").hasClass("active")){return}var j=h.find(".active:last a");var k=d.Event("hide.bs.tab",{relatedTarget:l[0]});var i=d.Event("show.bs.tab",{relatedTarget:j[0]});j.trigger(k);l.trigger(i);if(i.isDefaultPrevented()||k.isDefaultPrevented()){return}var f=d(g);this.activate(l.closest("li"),h);this.activate(f,f.parent(),function(){j.trigger({type:"hidden.bs.tab",relatedTarget:l[0]});l.trigger({type:"shown.bs.tab",relatedTarget:j[0]})})};b.prototype.activate=function(h,g,k){var f=g.find("> .active");var j=k&&d.support.transition&&(f.length&&f.hasClass("fade")||!!g.find("> .fade").length);function i(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",false);h.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",true);if(j){h[0].offsetWidth;h.addClass("in")}else{h.removeClass("fade")}if(h.parent(".dropdown-menu").length){h.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",true)}k&&k()}f.length&&j?f.one("bsTransitionEnd",i).emulateTransitionEnd(b.TRANSITION_DURATION):i();f.removeClass("in")};function c(f){return this.each(function(){var h=d(this);var g=h.data("bs.tab");if(!g){h.data("bs.tab",(g=new b(this)))}if(typeof f=="string"){g[f]()}})}var a=d.fn.tab;d.fn.tab=c;d.fn.tab.Constructor=b;d.fn.tab.noConflict=function(){d.fn.tab=a;return this};var e=function(f){f.preventDefault();c.call(d(this),"show")};d(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery);+function(d){var c=function(f,e){this.options=d.extend({},c.DEFAULTS,e);this.$target=d(this.options.target).on("scroll.bs.affix.data-api",d.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",d.proxy(this.checkPositionWithEventLoop,this));this.$element=d(f);this.affixed=null;this.unpin=null;this.pinnedOffset=null;this.checkPosition()};c.VERSION="3.3.7";c.RESET="affix affix-top affix-bottom";c.DEFAULTS={offset:0,target:window};c.prototype.getState=function(n,m,f,g){var e=this.$target.scrollTop();var i=this.$element.offset();var j=this.$target.height();if(f!=null&&this.affixed=="top"){return e<f?"top":false}if(this.affixed=="bottom"){if(f!=null){return(e+this.unpin<=i.top)?false:"bottom"}return(e+j<=n-g)?false:"bottom"}var h=this.affixed==null;var l=h?e:i.top;var k=h?j:m;if(f!=null&&e<=f){return"top"}if(g!=null&&(l+k>=n-g)){return"bottom"}return false};c.prototype.getPinnedOffset=function(){if(this.pinnedOffset){return this.pinnedOffset}this.$element.removeClass(c.RESET).addClass("affix");var f=this.$target.scrollTop();var e=this.$element.offset();return(this.pinnedOffset=e.top-f)};c.prototype.checkPositionWithEventLoop=function(){setTimeout(d.proxy(this.checkPosition,this),1)};c.prototype.checkPosition=function(){if(!this.$element.is(":visible")){return}var f=this.$element.height();var l=this.options.offset;var j=l.top;var h=l.bottom;var i=Math.max(d(document).height(),d(document.body).height());if(typeof l!="object"){h=j=l}if(typeof j=="function"){j=l.top(this.$element)}if(typeof h=="function"){h=l.bottom(this.$element)}var g=this.getState(i,f,j,h);if(this.affixed!=g){if(this.unpin!=null){this.$element.css("top","")}var m="affix"+(g?"-"+g:"");var k=d.Event(m+".bs.affix");this.$element.trigger(k);if(k.isDefaultPrevented()){return}this.affixed=g;this.unpin=g=="bottom"?this.getPinnedOffset():null;this.$element.removeClass(c.RESET).addClass(m).trigger(m.replace("affix","affixed")+".bs.affix")}if(g=="bottom"){this.$element.offset({top:i-f-h})}};function b(e){return this.each(function(){var h=d(this);var g=h.data("bs.affix");var f=typeof e=="object"&&e;if(!g){h.data("bs.affix",(g=new c(this,f)))}if(typeof e=="string"){g[e]()}})}var a=d.fn.affix;d.fn.affix=b;d.fn.affix.Constructor=c;d.fn.affix.noConflict=function(){d.fn.affix=a;return this};d(window).on("load",function(){d('[data-spy="affix"]').each(function(){var f=d(this);var e=f.data();e.offset=e.offset||{};if(e.offsetBottom!=null){e.offset.bottom=e.offsetBottom}if(e.offsetTop!=null){e.offset.top=e.offsetTop}b.call(f,e)})})}(jQuery);jQuery(document).ready(function(a){a('a[rel="tooltip"]').tooltip()});