/*
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version 1.09
 */
var Cufon=(function(){var m=function(){return m.replace.apply(null,arguments)};var x=m.DOM={ready:(function(){var C=false,E={loaded:1,complete:1};var B=[],D=function(){if(C){return}C=true;for(var F;F=B.shift();F()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",D,false);window.addEventListener("pageshow",D,false)}if(!window.opera&&document.readyState){(function(){E[document.readyState]?D():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");D()}catch(F){setTimeout(arguments.callee,1)}})()}q(window,"load",D);return function(F){if(!arguments.length){D()}else{C?F():B.push(F)}}})(),root:function(){return document.documentElement||document.body}};var n=m.CSS={Size:function(C,B){this.value=parseFloat(C);this.unit=String(C).match(/[a-z%]*$/)[0]||"px";this.convert=function(D){return D/B*this.value};this.convertFrom=function(D){return D/this.value*B};this.toString=function(){return this.value+this.unit}},addClass:function(C,B){var D=C.className;C.className=D+(D&&" ")+B;return C},color:j(function(C){var B={};B.color=C.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(E,D,F){B.opacity=parseFloat(F);return"rgb("+D+")"});return B}),fontStretch:j(function(B){if(typeof B=="number"){return B}if(/%$/.test(B)){return parseFloat(B)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[B]||1}),getStyle:function(C){var B=document.defaultView;if(B&&B.getComputedStyle){return new a(B.getComputedStyle(C,null))}if(C.currentStyle){return new a(C.currentStyle)}return new a(C.style)},gradient:j(function(F){var G={id:F,type:F.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},C=F.substr(F.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var E=0,B=C.length,D;E<B;++E){D=C[E].split("=",2).reverse();G.stops.push([D[1]||E/(B-1),D[0]])}return G}),quotedList:j(function(E){var D=[],C=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,B;while(B=C.exec(E)){D.push(B[3]||B[1])}return D}),recognizesMedia:j(function(G){var E=document.createElement("style"),D,C,B;E.type="text/css";E.media=G;try{E.appendChild(document.createTextNode("/**/"))}catch(F){}C=g("head")[0];C.insertBefore(E,C.firstChild);D=(E.sheet||E.styleSheet);B=D&&!D.disabled;C.removeChild(E);return B}),removeClass:function(D,C){var B=RegExp("(?:^|\\s+)"+C+"(?=\\s|$)","g");D.className=D.className.replace(B,"");return D},supports:function(D,C){var B=document.createElement("span").style;if(B[D]===undefined){return false}B[D]=C;return B[D]===C},textAlign:function(E,D,B,C){if(D.get("textAlign")=="right"){if(B>0){E=" "+E}}else{if(B<C-1){E+=" "}}return E},textShadow:j(function(F){if(F=="none"){return null}var E=[],G={},B,C=0;var D=/(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;while(B=D.exec(F)){if(B[0]==","){E.push(G);G={};C=0}else{if(B[1]){G.color=B[1]}else{G[["offX","offY","blur"][C++]]=B[2]}}}E.push(G);return E}),textTransform:(function(){var B={uppercase:function(C){return C.toUpperCase()},lowercase:function(C){return C.toLowerCase()},capitalize:function(C){return C.replace(/\b./g,function(D){return D.toUpperCase()})}};return function(E,D){var C=B[D.get("textTransform")];return C?C(E):E}})(),whiteSpace:(function(){var D={inline:1,"inline-block":1,"run-in":1};var C=/^\s+/,B=/\s+$/;return function(H,F,G,E){if(E){if(E.nodeName.toLowerCase()=="br"){H=H.replace(C,"")}}if(D[F.get("display")]){return H}if(!G.previousSibling){H=H.replace(C,"")}if(!G.nextSibling){H=H.replace(B,"")}return H}})()};n.ready=(function(){var B=!n.recognizesMedia("all"),E=false;var D=[],H=function(){B=true;for(var K;K=D.shift();K()){}};var I=g("link"),J=g("style");function C(K){return K.disabled||G(K.sheet,K.media||"screen")}function G(M,P){if(!n.recognizesMedia(P||"all")){return true}if(!M||M.disabled){return false}try{var Q=M.cssRules,O;if(Q){search:for(var L=0,K=Q.length;O=Q[L],L<K;++L){switch(O.type){case 2:break;case 3:if(!G(O.styleSheet,O.media.mediaText)){return false}break;default:break search}}}}catch(N){}return true}function F(){if(document.createStyleSheet){return true}var L,K;for(K=0;L=I[K];++K){if(L.rel.toLowerCase()=="stylesheet"&&!C(L)){return false}}for(K=0;L=J[K];++K){if(!C(L)){return false}}return true}x.ready(function(){if(!E){E=n.getStyle(document.body).isUsable()}if(B||(E&&F())){H()}else{setTimeout(arguments.callee,10)}});return function(K){if(B){K()}else{D.push(K)}}})();function s(D){var C=this.face=D.face,B={"\u0020":1,"\u00a0":1,"\u3000":1};this.glyphs=D.glyphs;this.w=D.w;this.baseSize=parseInt(C["units-per-em"],10);this.family=C["font-family"].toLowerCase();this.weight=C["font-weight"];this.style=C["font-style"]||"normal";this.viewBox=(function(){var F=C.bbox.split(/\s+/);var E={minX:parseInt(F[0],10),minY:parseInt(F[1],10),maxX:parseInt(F[2],10),maxY:parseInt(F[3],10)};E.width=E.maxX-E.minX;E.height=E.maxY-E.minY;E.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")};return E})();this.ascent=-parseInt(C.ascent,10);this.descent=-parseInt(C.descent,10);this.height=-this.ascent+this.descent;this.spacing=function(L,N,E){var O=this.glyphs,M,K,G,P=[],F=0,J=-1,I=-1,H;while(H=L[++J]){M=O[H]||this.missingGlyph;if(!M){continue}if(K){F-=G=K[H]||0;P[I]-=G}F+=P[++I]=~~(M.w||this.w)+N+(B[H]?E:0);K=M.k}P.total=F;return P}}function f(){var C={},B={oblique:"italic",italic:"oblique"};this.add=function(D){(C[D.style]||(C[D.style]={}))[D.weight]=D};this.get=function(H,I){var G=C[H]||C[B[H]]||C.normal||C.italic||C.oblique;if(!G){return null}I={normal:400,bold:700}[I]||parseInt(I,10);if(G[I]){return G[I]}var E={1:1,99:0}[I%100],K=[],F,D;if(E===undefined){E=I>400}if(I==500){I=400}for(var J in G){if(!k(G,J)){continue}J=parseInt(J,10);if(!F||J<F){F=J}if(!D||J>D){D=J}K.push(J)}if(I<F){I=F}if(I>D){I=D}K.sort(function(M,L){return(E?(M>=I&&L>=I)?M<L:M>L:(M<=I&&L<=I)?M>L:M<L)?-1:1});return G[K[0]]}}function r(){function D(F,G){if(F.contains){return F.contains(G)}return F.compareDocumentPosition(G)&16}function B(G){var F=G.relatedTarget;if(!F||D(this,F)){return}C(this,G.type=="mouseover")}function E(F){C(this,F.type=="mouseenter")}function C(F,G){setTimeout(function(){var H=d.get(F).options;m.replace(F,G?h(H,H.hover):H,true)},10)}this.attach=function(F){if(F.onmouseenter===undefined){q(F,"mouseover",B);q(F,"mouseout",B)}else{q(F,"mouseenter",E);q(F,"mouseleave",E)}}}function u(){var C=[],D={};function B(H){var E=[],G;for(var F=0;G=H[F];++F){E[F]=C[D[G]]}return E}this.add=function(F,E){D[F]=C.push(E)-1};this.repeat=function(){var E=arguments.length?B(arguments):C,F;for(var G=0;F=E[G++];){m.replace(F[0],F[1],true)}}}function A(){var D={},B=0;function C(E){return E.cufid||(E.cufid=++B)}this.get=function(E){var F=C(E);return D[F]||(D[F]={})}}function a(B){var D={},C={};this.extend=function(E){for(var F in E){if(k(E,F)){D[F]=E[F]}}return this};this.get=function(E){return D[E]!=undefined?D[E]:B[E]};this.getSize=function(F,E){return C[F]||(C[F]=new n.Size(this.get(F),E))};this.isUsable=function(){return !!B}}function q(C,B,D){if(C.addEventListener){C.addEventListener(B,D,false)}else{if(C.attachEvent){C.attachEvent("on"+B,function(){return D.call(C,window.event)})}}}function v(C,B){var D=d.get(C);if(D.options){return C}if(B.hover&&B.hoverables[C.nodeName.toLowerCase()]){b.attach(C)}D.options=B;return C}function j(B){var C={};return function(D){if(!k(C,D)){C[D]=B.apply(null,arguments)}return C[D]}}function c(F,E){var B=n.quotedList(E.get("fontFamily").toLowerCase()),D;for(var C=0;D=B[C];++C){if(i[D]){return i[D].get(E.get("fontStyle"),E.get("fontWeight"))}}return null}function g(B){return document.getElementsByTagName(B)}function k(C,B){return C.hasOwnProperty(B)}function h(){var C={},B,F;for(var E=0,D=arguments.length;B=arguments[E],E<D;++E){for(F in B){if(k(B,F)){C[F]=B[F]}}}return C}function o(E,M,C,N,F,D){var K=document.createDocumentFragment(),H;if(M===""){return K}var L=N.separate;var I=M.split(p[L]),B=(L=="words");if(B&&t){if(/^\s/.test(M)){I.unshift("")}if(/\s$/.test(M)){I.push("")}}for(var J=0,G=I.length;J<G;++J){H=z[N.engine](E,B?n.textAlign(I[J],C,J,G):I[J],C,N,F,D,J<G-1);if(H){K.appendChild(H)}}return K}function l(D,M){var C=D.nodeName.toLowerCase();if(M.ignore[C]){return}var E=!M.textless[C];var B=n.getStyle(v(D,M)).extend(M);var F=c(D,B),G,K,I,H,L,J;if(!F){return}for(G=D.firstChild;G;G=I){K=G.nodeType;I=G.nextSibling;if(E&&K==3){if(H){H.appendData(G.data);D.removeChild(G)}else{H=G}if(I){continue}}if(H){D.replaceChild(o(F,n.whiteSpace(H.data,B,H,J),B,M,G,D),H);H=null}if(K==1){if(G.firstChild){if(G.nodeName.toLowerCase()=="cufon"){z[M.engine](F,null,B,M,G,D)}else{arguments.callee(G,M)}}J=G}}}var t=" ".split(/\s+/).length==0;var d=new A();var b=new r();var y=new u();var e=false;var z={},i={},w={autoDetect:false,engine:null,forceHitArea:false,hover:false,hoverables:{a:true},ignore:{applet:1,canvas:1,col:1,colgroup:1,head:1,iframe:1,map:1,optgroup:1,option:1,script:1,select:1,style:1,textarea:1,title:1,pre:1},printable:true,selector:(window.Sizzle||(window.jQuery&&function(B){return jQuery(B)})||(window.dojo&&dojo.query)||(window.Ext&&Ext.query)||(window.YAHOO&&YAHOO.util&&YAHOO.util.Selector&&YAHOO.util.Selector.query)||(window.$$&&function(B){return $$(B)})||(window.$&&function(B){return $(B)})||(document.querySelectorAll&&function(B){return document.querySelectorAll(B)})||g),separate:"words",textless:{dl:1,html:1,ol:1,table:1,tbody:1,thead:1,tfoot:1,tr:1,ul:1},textShadow:"none"};var p={words:/\s/.test("\u00a0")?/[^\S\u00a0]+/:/\s+/,characters:"",none:/^/};m.now=function(){x.ready();return m};m.refresh=function(){y.repeat.apply(y,arguments);return m};m.registerEngine=function(C,B){if(!B){return m}z[C]=B;return m.set("engine",C)};m.registerFont=function(D){if(!D){return m}var B=new s(D),C=B.family;if(!i[C]){i[C]=new f()}i[C].add(B);return m.set("fontFamily",'"'+C+'"')};m.replace=function(D,C,B){C=h(w,C);if(!C.engine){return m}if(!e){n.addClass(x.root(),"cufon-active cufon-loading");n.ready(function(){n.addClass(n.removeClass(x.root(),"cufon-loading"),"cufon-ready")});e=true}if(C.hover){C.forceHitArea=true}if(C.autoDetect){delete C.fontFamily}if(typeof C.textShadow=="string"){C.textShadow=n.textShadow(C.textShadow)}if(typeof C.color=="string"&&/^-/.test(C.color)){C.textGradient=n.gradient(C.color)}else{delete C.textGradient}if(!B){y.add(D,arguments)}if(D.nodeType||typeof D=="string"){D=[D]}n.ready(function(){for(var F=0,E=D.length;F<E;++F){var G=D[F];if(typeof G=="string"){m.replace(C.selector(G),C,true)}else{l(G,C)}}});return m};m.set=function(B,C){w[B]=C;return m};return m})();Cufon.registerEngine("canvas",(function(){var b=document.createElement("canvas");if(!b||!b.getContext||!b.getContext.apply){return}b=null;var a=Cufon.CSS.supports("display","inline-block");var e=!a&&(document.compatMode=="BackCompat"||/frameset|transitional/i.test(document.doctype.publicId));var f=document.createElement("style");f.type="text/css";f.appendChild(document.createTextNode(("cufon{text-indent:0;}@media screen,projection{cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;"+(e?"":"font-size:1px;line-height:1px;")+"}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}"+(a?"cufon canvas{position:relative;}":"cufon canvas{position:absolute;}")+"}@media print{cufon{padding:0;}cufon canvas{display:none;}}").replace(/;/g,"!important;")));document.getElementsByTagName("head")[0].appendChild(f);function d(p,h){var n=0,m=0;var g=[],o=/([mrvxe])([^a-z]*)/g,k;generate:for(var j=0;k=o.exec(p);++j){var l=k[2].split(",");switch(k[1]){case"v":g[j]={m:"bezierCurveTo",a:[n+~~l[0],m+~~l[1],n+~~l[2],m+~~l[3],n+=~~l[4],m+=~~l[5]]};break;case"r":g[j]={m:"lineTo",a:[n+=~~l[0],m+=~~l[1]]};break;case"m":g[j]={m:"moveTo",a:[n=~~l[0],m=~~l[1]]};break;case"x":g[j]={m:"closePath"};break;case"e":break generate}h[g[j].m].apply(h,g[j].a)}return g}function c(m,k){for(var j=0,h=m.length;j<h;++j){var g=m[j];k[g.m].apply(k,g.a)}}return function(V,w,P,t,C,W){var k=(w===null);if(k){w=C.getAttribute("alt")}var A=V.viewBox;var m=P.getSize("fontSize",V.baseSize);var B=0,O=0,N=0,u=0;var z=t.textShadow,L=[];if(z){for(var U=z.length;U--;){var F=z[U];var K=m.convertFrom(parseFloat(F.offX));var I=m.convertFrom(parseFloat(F.offY));L[U]=[K,I];if(I<B){B=I}if(K>O){O=K}if(I>N){N=I}if(K<u){u=K}}}var Z=Cufon.CSS.textTransform(w,P).split("");var E=V.spacing(Z,~~m.convertFrom(parseFloat(P.get("letterSpacing"))||0),~~m.convertFrom(parseFloat(P.get("wordSpacing"))||0));if(!E.length){return null}var h=E.total;O+=A.width-E[E.length-1];u+=A.minX;var s,n;if(k){s=C;n=C.firstChild}else{s=document.createElement("cufon");s.className="cufon cufon-canvas";s.setAttribute("alt",w);n=document.createElement("canvas");s.appendChild(n);if(t.printable){var S=document.createElement("cufontext");S.appendChild(document.createTextNode(w));s.appendChild(S)}}var aa=s.style;var H=n.style;var j=m.convert(A.height);var Y=Math.ceil(j);var M=Y/j;var G=M*Cufon.CSS.fontStretch(P.get("fontStretch"));var J=h*G;var Q=Math.ceil(m.convert(J+O-u));var o=Math.ceil(m.convert(A.height-B+N));n.width=Q;n.height=o;H.width=Q+"px";H.height=o+"px";B+=A.minY;H.top=Math.round(m.convert(B-V.ascent))+"px";H.left=Math.round(m.convert(u))+"px";var r=Math.max(Math.ceil(m.convert(J)),0)+"px";if(a){aa.width=r;aa.height=m.convert(V.height)+"px"}else{aa.paddingLeft=r;aa.paddingBottom=(m.convert(V.height)-1)+"px"}var X=n.getContext("2d"),D=j/A.height;X.scale(D,D*M);X.translate(-u,-B);X.save();function T(){var x=V.glyphs,ab,l=-1,g=-1,y;X.scale(G,1);while(y=Z[++l]){var ab=x[Z[l]]||V.missingGlyph;if(!ab){continue}if(ab.d){X.beginPath();if(ab.code){c(ab.code,X)}else{ab.code=d("m"+ab.d,X)}X.fill()}X.translate(E[++g],0)}X.restore()}if(z){for(var U=z.length;U--;){var F=z[U];X.save();X.fillStyle=F.color;X.translate.apply(X,L[U]);T()}}var q=t.textGradient;if(q){var v=q.stops,p=X.createLinearGradient(0,A.minY,0,A.maxY);for(var U=0,R=v.length;U<R;++U){p.addColorStop.apply(p,v[U])}X.fillStyle=p}else{X.fillStyle=P.get("color")}T();return s}})());Cufon.registerEngine("vml",(function(){var e=document.namespaces;if(!e){return}e.add("cvml","urn:schemas-microsoft-com:vml");e=null;var b=document.createElement("cvml:shape");b.style.behavior="url(#default#VML)";if(!b.coordsize){return}b=null;var h=(document.documentMode||0)<8;document.write(('<style type="text/css">cufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}</style>").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;m<l;++m){i.push(n[m][0]*100+"% "+n[m][1])}o.colors=i.join(",");o.color2=n[l][1];g[q]=o}return g[q]}return function(ac,G,Y,C,K,ad,W){var n=(G===null);if(n){G=K.alt}var I=ac.viewBox;var p=Y.computedFontSize||(Y.computedFontSize=new Cufon.CSS.Size(c(ad,Y.get("fontSize"))+"px",ac.baseSize));var y,q;if(n){y=K;q=K.firstChild}else{y=document.createElement("cufon");y.className="cufon cufon-vml";y.alt=G;q=document.createElement("cufoncanvas");y.appendChild(q);if(C.printable){var Z=document.createElement("cufontext");Z.appendChild(document.createTextNode(G));y.appendChild(Z)}if(!W){y.appendChild(document.createElement("cvml:shape"))}}var ai=y.style;var R=q.style;var l=p.convert(I.height),af=Math.ceil(l);var V=af/l;var P=V*Cufon.CSS.fontStretch(Y.get("fontStretch"));var U=I.minX,T=I.minY;R.height=af;R.top=Math.round(p.convert(T-ac.ascent));R.left=Math.round(p.convert(U));ai.height=p.convert(ac.height)+"px";var F=Y.get("color");var ag=Cufon.CSS.textTransform(G,Y).split("");var L=ac.spacing(ag,f(ad,Y,p,"letterSpacing"),f(ad,Y,p,"wordSpacing"));if(!L.length){return null}var k=L.total;var x=-U+k+(I.width-L[L.length-1]);var ah=p.convert(x*P),X=Math.round(ah);var O=x+","+I.height,m;var J="r"+O+"ns";var u=C.textGradient&&d(C.textGradient);var o=ac.glyphs,S=0;var H=C.textShadow;var ab=-1,aa=0,w;while(w=ag[++ab]){var D=o[ag[ab]]||ac.missingGlyph,v;if(!D){continue}if(n){v=q.childNodes[aa];while(v.firstChild){v.removeChild(v.firstChild)}}else{v=document.createElement("cvml:shape");q.appendChild(v)}v.stroked="f";v.coordsize=O;v.coordorigin=m=(U-S)+","+T;v.path=(D.d?"m"+D.d+"xe":"")+"m"+m+J;v.fillcolor=F;if(u){v.appendChild(u.cloneNode(false))}var ae=v.style;ae.width=X;ae.height=af;if(H){var s=H[0],r=H[1];var B=Cufon.CSS.color(s.color),z;var N=document.createElement("cvml:shadow");N.on="t";N.color=B.color;N.offset=s.offX+","+s.offY;if(r){z=Cufon.CSS.color(r.color);N.type="double";N.color2=z.color;N.offset2=r.offX+","+r.offY}N.opacity=B.opacity||(z&&z.opacity)||1;v.appendChild(N)}S+=L[aa++]}var M=v.nextSibling,t,A;if(C.forceHitArea){if(!M){M=document.createElement("cvml:rect");M.stroked="f";M.className="cufon-vml-cover";t=document.createElement("cvml:fill");t.opacity=0;M.appendChild(t);q.appendChild(M)}A=M.style;A.width=X;A.height=af}else{if(M){q.removeChild(M)}}ai.width=Math.max(Math.ceil(p.convert(k*P)),0);if(h){var Q=Y.computedYAdjust;if(Q===undefined){var E=Y.get("lineHeight");if(E=="normal"){E="1em"}else{if(!isNaN(E)){E+="em"}}Y.computedYAdjust=Q=0.5*(a(ad,E)-parseFloat(ai.height))}if(Q){ai.marginTop=Math.ceil(Q)+"px";ai.marginBottom=Q+"px"}}return y}})());/*  Prototype JavaScript framework, version 1.6.0
 *  (c) 2005-2007 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.6.0',

  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      document.createElement('div').__proto__ &&
      document.createElement('div').__proto__ !==
        document.createElement('form').__proto__
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
};

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;

if (Prototype.Browser.WebKit)
  Prototype.BrowserFeatures.XPath = false;

/* Based on Alex Arnell's inheritance implementation. */
var Class = {
  create: function() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

    function klass() {
      this.initialize.apply(this, arguments);
    }

    Object.extend(klass, Class.Methods);
    klass.superclass = parent;
    klass.subclasses = [];

    if (parent) {
      var subclass = function() { };
      subclass.prototype = parent.prototype;
      klass.prototype = new subclass;
      parent.subclasses.push(klass);
    }

    for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);

    if (!klass.prototype.initialize)
      klass.prototype.initialize = Prototype.emptyFunction;

    klass.prototype.constructor = klass;

    return klass;
  }
};

Class.Methods = {
  addMethods: function(source) {
    var ancestor   = this.superclass && this.superclass.prototype;
    var properties = Object.keys(source);

    if (!Object.keys({ toString: true }).length)
      properties.push("toString", "valueOf");

    for (var i = 0, length = properties.length; i < length; i++) {
      var property = properties[i], value = source[property];
      if (ancestor && Object.isFunction(value) &&
          value.argumentNames().first() == "$super") {
        var method = value, value = Object.extend((function(m) {
          return function() { return ancestor[m].apply(this, arguments) };
        })(property).wrap(method), {
          valueOf:  function() { return method },
          toString: function() { return method.toString() }
        });
      }
      this.prototype[property] = value;
    }

    return this;
  }
};

var Abstract = { };

Object.extend = function(destination, source) {
  for (var property in source)
    destination[property] = source[property];
  return destination;
};

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (object === undefined) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch (type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }

    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (Object.isElement(object)) return;

    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (value !== undefined)
        results.push(property.toJSON() + ': ' + value);
    }

    return '{' + results.join(', ') + '}';
  },

  toQueryString: function(object) {
    return $H(object).toQueryString();
  },

  toHTML: function(object) {
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({ }, object);
  },

  isElement: function(object) {
    return object && object.nodeType == 1;
  },

  isArray: function(object) {
    return object && object.constructor === Array;
  },

  isHash: function(object) {
    return object instanceof Hash;
  },

  isFunction: function(object) {
    return typeof object == "function";
  },

  isString: function(object) {
    return typeof object == "string";
  },

  isNumber: function(object) {
    return typeof object == "number";
  },

  isUndefined: function(object) {
    return typeof object == "undefined";
  }
});

Object.extend(Function.prototype, {
  argumentNames: function() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
    return names.length == 1 && !names[0] ? [] : names;
  },

  bind: function() {
    if (arguments.length < 2 && arguments[0] === undefined) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  },

  bindAsEventListener: function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function(event) {
      return __method.apply(object, [event || window.event].concat(args));
    }
  },

  curry: function() {
    if (!arguments.length) return this;
    var __method = this, args = $A(arguments);
    return function() {
      return __method.apply(this, args.concat($A(arguments)));
    }
  },

  delay: function() {
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  },

  wrap: function(wrapper) {
    var __method = this;
    return function() {
      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
    }
  },

  methodize: function() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      return __method.apply(null, [this].concat($A(arguments)));
    };
  }
});

Function.prototype.defer = Function.prototype.delay.curry(0.01);

Date.prototype.toJSON = function() {
  return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  execute: function() {
    this.callback(this);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
});
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return String(this);
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(this);
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = new Element('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return { };

    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  times: function(count) {
    return count < 1 ? '' : new Array(count + 1).join(this);
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  isJSON: function() {
    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  },

  interpolate: function(object, pattern) {
    return new Template(this, pattern).evaluate(object);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (Object.isFunction(replacement)) return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
};

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

with (String.prototype.escapeHTML) div.appendChild(text);

var Template = Class.create({
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    if (Object.isFunction(object.toTemplateReplacements))
      object = object.toTemplateReplacements();

    return this.template.gsub(this.pattern, function(match) {
      if (object == null) return '';

      var before = match[1] || '';
      if (before == '\\') return match[2];

      var ctx = object, expr = match[3];
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
      if (match == null) return before;

      while (match != null) {
        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
        ctx = ctx[comp];
        if (null == ctx || '' == match[3]) break;
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
        match = pattern.exec(expr);
      }

      return before + String.interpret(ctx);
    }.bind(this));
  }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

var Enumerable = {
  each: function(iterator, context) {
    var index = 0;
    iterator = iterator.bind(context);
    try {
      this._each(function(value) {
        iterator(value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var index = -number, slices = [], array = this.toArray();
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.collect(iterator, context);
  },

  all: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var result = true;
    this.each(function(value, index) {
      result = result && !!iterator(value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator(value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var results = [];
    this.each(function(value, index) {
      results.push(iterator(value, index));
    });
    return results;
  },

  detect: function(iterator, context) {
    iterator = iterator.bind(context);
    var result;
    this.each(function(value, index) {
      if (iterator(value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator, context) {
    iterator = iterator.bind(context);
    var results = [];
    this.each(function(value, index) {
      if (iterator(value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(filter, iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var results = [];

    if (Object.isString(filter))
      filter = new RegExp(filter);

    this.each(function(value, index) {
      if (filter.match(value))
        results.push(iterator(value, index));
    });
    return results;
  },

  include: function(object) {
    if (Object.isFunction(this.indexOf))
      if (this.indexOf(object) != -1) return true;

    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = fillWith === undefined ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator, context) {
    iterator = iterator.bind(context);
    this.each(function(value, index) {
      memo = iterator(memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator(value, index);
      if (result == undefined || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator, context) {
    iterator = iterator ? iterator.bind(context) : Prototype.K;
    var trues = [], falses = [];
    this.each(function(value, index) {
      (iterator(value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator, context) {
    iterator = iterator.bind(context);
    var results = [];
    this.each(function(value, index) {
      if (!iterator(value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator, context) {
    iterator = iterator.bind(context);
    return this.map(function(value, index) {
      return {value: value, criteria: iterator(value, index)};
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (Object.isFunction(args.last()))
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
};

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  filter:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray,
  every:   Enumerable.all,
  some:    Enumerable.any
});
function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

if (Prototype.Browser.WebKit) {
  function $A(iterable) {
    if (!iterable) return [];
    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
        iterable.toArray) return iterable.toArray();
    var length = iterable.length, results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
  }
}

Array.from = $A;

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(Object.isArray(value) ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

  intersect: function(array) {
    return this.uniq().findAll(function(item) {
      return array.detect(function(value) { return item === value });
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  },

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (value !== undefined) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

// use native browser JS 1.6 implementation if available
if (Object.isFunction(Array.prototype.forEach))
  Array.prototype._each = Array.prototype.forEach;

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
  i || (i = 0);
  var length = this.length;
  if (i < 0) i = length + i;
  for (; i < length; i++)
    if (this[i] === item) return i;
  return -1;
};

if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
  var n = this.slice(0, i).reverse().indexOf(item);
  return (n < 0) ? n : i - n - 1;
};

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
  if (!Object.isString(string)) return [];
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.Opera){
  Array.prototype.concat = function() {
    var array = [];
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for (var i = 0, length = arguments.length; i < length; i++) {
      if (Object.isArray(arguments[i])) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  };
}
Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator) {
    $R(0, this, true).each(iterator);
    return this;
  },

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

$w('abs round ceil floor').each(function(method){
  Number.prototype[method] = Math[method].methodize();
});
function $H(object) {
  return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {
  if (function() {
    var i = 0, Test = function(value) { this.key = value };
    Test.prototype.key = 'foo';
    for (var property in new Test('bar')) i++;
    return i > 1;
  }()) {
    function each(iterator) {
      var cache = [];
      for (var key in this._object) {
        var value = this._object[key];
        if (cache.include(key)) continue;
        cache.push(key);
        var pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    }
  } else {
    function each(iterator) {
      for (var key in this._object) {
        var value = this._object[key], pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    }
  }

  function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

  return {
    initialize: function(object) {
      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
    },

    _each: each,

    set: function(key, value) {
      return this._object[key] = value;
    },

    get: function(key) {
      return this._object[key];
    },

    unset: function(key) {
      var value = this._object[key];
      delete this._object[key];
      return value;
    },

    toObject: function() {
      return Object.clone(this._object);
    },

    keys: function() {
      return this.pluck('key');
    },

    values: function() {
      return this.pluck('value');
    },

    index: function(value) {
      var match = this.detect(function(pair) {
        return pair.value === value;
      });
      return match && match.key;
    },

    merge: function(object) {
      return this.clone().update(object);
    },

    update: function(object) {
      return new Hash(object).inject(this, function(result, pair) {
        result.set(pair.key, pair.value);
        return result;
      });
    },

    toQueryString: function() {
      return this.map(function(pair) {
        var key = encodeURIComponent(pair.key), values = pair.value;

        if (values && typeof values == 'object') {
          if (Object.isArray(values))
            return values.map(toQueryPair.curry(key)).join('&');
        }
        return toQueryPair(key, values);
      }).join('&');
    },

    inspect: function() {
      return '#<Hash:{' + this.map(function(pair) {
        return pair.map(Object.inspect).join(': ');
      }).join(', ') + '}>';
    },

    toJSON: function() {
      return Object.toJSON(this.toObject());
    },

    clone: function() {
      return new Hash(this);
    }
  }
})());

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
};

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
};

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (Object.isFunction(responder[callback])) {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) { }
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate:   function() { Ajax.activeRequestCount++ },
  onComplete: function() { Ajax.activeRequestCount-- }
});

Ajax.Base = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();
    if (Object.isString(this.options.parameters))
      this.options.parameters = this.options.parameters.toQueryParams();
  }
});

Ajax.Request = Class.create(Ajax.Base, {
  _complete: false,

  initialize: function($super, url, options) {
    $super(options);
    this.transport = Ajax.getTransport();
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Object.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      var response = new Ajax.Response(this);
      if (this.options.onCreate) this.options.onCreate(response);
      Ajax.Responders.dispatch('onCreate', this, response);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (Object.isFunction(extras.push))
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + response.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(response, response.headerJSON);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = response.getHeader('Content-type');
      if (this.options.evalJS == 'force'
          || (this.options.evalJS && contentType
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
        this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name);
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Response = Class.create({
  initialize: function(request){
    this.request = request;
    var transport  = this.transport  = request.transport,
        readyState = this.readyState = transport.readyState;

    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }

    if(readyState == 4) {
      var xml = transport.responseXML;
      this.responseXML  = xml === undefined ? null : xml;
      this.responseJSON = this._getResponseJSON();
    }
  },

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

  getStatusText: function() {
    try {
      return this.transport.statusText || '';
    } catch (e) { return '' }
  },

  getHeader: Ajax.Request.prototype.getHeader,

  getAllHeaders: function() {
    try {
      return this.getAllResponseHeaders();
    } catch (e) { return null }
  },

  getResponseHeader: function(name) {
    return this.transport.getResponseHeader(name);
  },

  getAllResponseHeaders: function() {
    return this.transport.getAllResponseHeaders();
  },

  _getHeaderJSON: function() {
    var json = this.getHeader('X-JSON');
    if (!json) return null;
    json = decodeURIComponent(escape(json));
    try {
      return json.evalJSON(this.request.options.sanitizeJSON);
    } catch (e) {
      this.request.dispatchException(e);
    }
  },

  _getResponseJSON: function() {
    var options = this.request.options;
    if (!options.evalJSON || (options.evalJSON != 'force' &&
      !(this.getHeader('Content-type') || '').include('application/json')))
        return null;
    try {
      return this.transport.responseText.evalJSON(options.sanitizeJSON);
    } catch (e) {
      this.request.dispatchException(e);
    }
  }
});

Ajax.Updater = Class.create(Ajax.Request, {
  initialize: function($super, container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    };

    options = options || { };
    var onComplete = options.onComplete;
    options.onComplete = (function(response, param) {
      this.updateContent(response.responseText);
      if (Object.isFunction(onComplete)) onComplete(response, param);
    }).bind(this);

    $super(url, options);
  },

  updateContent: function(responseText) {
    var receiver = this.container[this.success() ? 'success' : 'failure'],
        options = this.options;

    if (!options.evalScripts) responseText = responseText.stripScripts();

    if (receiver = $(receiver)) {
      if (options.insertion) {
        if (Object.isString(options.insertion)) {
          var insertion = { }; insertion[options.insertion] = responseText;
          receiver.insert(insertion);
        }
        else options.insertion(receiver, responseText);
      }
      else receiver.update(responseText);
    }

    if (this.success()) {
      if (this.onComplete) this.onComplete.bind(this).defer();
    }
  }
});

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

/*--------------------------------------------------------------------------*/

if (!window.Node) var Node = { };

if (!Node.ELEMENT_NODE) {
  // DOM level 2 ECMAScript Language Binding
  Object.extend(Node, {
    ELEMENT_NODE: 1,
    ATTRIBUTE_NODE: 2,
    TEXT_NODE: 3,
    CDATA_SECTION_NODE: 4,
    ENTITY_REFERENCE_NODE: 5,
    ENTITY_NODE: 6,
    PROCESSING_INSTRUCTION_NODE: 7,
    COMMENT_NODE: 8,
    DOCUMENT_NODE: 9,
    DOCUMENT_TYPE_NODE: 10,
    DOCUMENT_FRAGMENT_NODE: 11,
    NOTATION_NODE: 12
  });
}

(function() {
  var element = this.Element;
  this.Element = function(tagName, attributes) {
    attributes = attributes || { };
    tagName = tagName.toLowerCase();
    var cache = Element.cache;
    if (Prototype.Browser.IE && attributes.name) {
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
      delete attributes.name;
      return Element.writeAttribute(document.createElement(tagName), attributes);
    }
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
  };
  Object.extend(this.Element, element || { });
}).call(window);

Element.cache = { };

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    $(element).style.display = 'none';
    return element;
  },

  show: function(element) {
    $(element).style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element.innerHTML = content.stripScripts();
    content.evalScripts.bind(content).defer();
    return element;
  },

  replace: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    else if (!Object.isElement(content)) {
      content = Object.toHTML(content);
      var range = element.ownerDocument.createRange();
      range.selectNode(element);
      content.evalScripts.bind(content).defer();
      content = range.createContextualFragment(content.stripScripts());
    }
    element.parentNode.replaceChild(content, element);
    return element;
  },

  insert: function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = {bottom:insertions};

    var content, t, range;

    for (position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      t = Element._insertionTranslations[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        t.insert(element, content);
        continue;
      }

      content = Object.toHTML(content);

      range = element.ownerDocument.createRange();
      t.initializeRange(element, range);
      t.insert(element, range.createContextualFragment(content.stripScripts()));

      content.evalScripts.bind(content).defer();
    }

    return element;
  },

  wrap: function(element, wrapper, attributes) {
    element = $(element);
    if (Object.isElement(wrapper))
      $(wrapper).writeAttribute(attributes || { });
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
    else wrapper = new Element('div', wrapper);
    if (element.parentNode)
      element.parentNode.replaceChild(wrapper, element);
    wrapper.appendChild(element);
    return wrapper;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $A($(element).getElementsByTagName('*')).each(Element.extend);
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (Object.isString(selector))
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return expression ? Selector.findElement(ancestors, expression, index) :
      ancestors[index || 0];
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    var descendants = element.descendants();
    return expression ? Selector.findElement(descendants, expression, index) :
      descendants[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return expression ? Selector.findElement(previousSiblings, expression, index) :
      previousSiblings[index || 0];
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return expression ? Selector.findElement(nextSiblings, expression, index) :
      nextSiblings[index || 0];
  },

  select: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  adjacent: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element.parentNode, args).without(element);
  },

  identify: function(element) {
    element = $(element);
    var id = element.readAttribute('id'), self = arguments.callee;
    if (id) return id;
    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
    element.writeAttribute('id', id);
    return id;
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      var t = Element._attributeTranslations.read;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name]) name = t.names[name];
      if (name.include(':')) {
        return (!element.attributes || !element.attributes[name]) ? null :
         element.attributes[name].value;
      }
    }
    return element.getAttribute(name);
  },

  writeAttribute: function(element, name, value) {
    element = $(element);
    var attributes = { }, t = Element._attributeTranslations.write;

    if (typeof name == 'object') attributes = name;
    else attributes[name] = value === undefined ? true : value;

    for (var attr in attributes) {
      var name = t.names[attr] || attr, value = attributes[attr];
      if (t.values[attr]) name = t.values[attr](element, value);
      if (value === false || value === null)
        element.removeAttribute(name);
      else if (value === true)
        element.setAttribute(name, name);
      else element.setAttribute(name, value);
    }
    return element;
  },

  getHeight: function(element) {
    return $(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!element.hasClassName(className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    return element[element.hasClassName(className) ?
      'removeClassName' : 'addClassName'](className);
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);

    if (element.compareDocumentPosition)
      return (element.compareDocumentPosition(ancestor) & 8) === 8;

    if (element.sourceIndex && !Prototype.Browser.Opera) {
      var e = element.sourceIndex, a = ancestor.sourceIndex,
       nextAncestor = ancestor.nextSibling;
      if (!nextAncestor) {
        do { ancestor = ancestor.parentNode; }
        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
      }
      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
    }

    while (element = element.parentNode)
      if (element == ancestor) return true;
    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = element.cumulativeOffset();
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value) {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
            property] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = $(element).getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (window.opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if (element.tagName == 'BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  absolutize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'absolute') return;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    var offsets = element.positionedOffset();
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
    return element;
  },

  relativize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'relative') return;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
    return element;
  },

  cumulativeScrollOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  getOffsetParent: function(element) {
    if (element.offsetParent) return $(element.offsetParent);
    if (element == document.body) return $(element);

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return $(element);

    return $(document.body);
  },

  viewportOffset: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent == document.body &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return Element._returnOffset(valueL, valueT);
  },

  clonePosition: function(element, source) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || { });

    // find page position of source
    source = $(source);
    var p = source.viewportOffset();

    // find coordinate system to use
    element = $(element);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(element, 'position') == 'absolute') {
      parent = element.getOffsetParent();
      delta = parent.viewportOffset();
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Element.Methods.identify.counter = 1;

Object.extend(Element.Methods, {
  getElementsBySelector: Element.Methods.select,
  childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
  write: {
    names: {
      className: 'class',
      htmlFor:   'for'
    },
    values: { }
  }
};


if (!document.createRange || Prototype.Browser.Opera) {
  Element.Methods.insert = function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = { bottom: insertions };

    var t = Element._insertionTranslations, content, position, pos, tagName;

    for (position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      pos      = t[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        pos.insert(element, content);
        continue;
      }

      content = Object.toHTML(content);
      tagName = ((position == 'before' || position == 'after')
        ? element.parentNode : element).tagName.toUpperCase();

      if (t.tags[tagName]) {
        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
        if (position == 'top' || position == 'after') fragments.reverse();
        fragments.each(pos.insert.curry(element));
      }
      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());

      content.evalScripts.bind(content).defer();
    }

    return element;
  };
}

if (Prototype.Browser.Opera) {
  Element.Methods._getStyle = Element.Methods.getStyle;
  Element.Methods.getStyle = function(element, style) {
    switch(style) {
      case 'left':
      case 'top':
      case 'right':
      case 'bottom':
        if (Element._getStyle(element, 'position') == 'static') return null;
      default: return Element._getStyle(element, style);
    }
  };
  Element.Methods._readAttribute = Element.Methods.readAttribute;
  Element.Methods.readAttribute = function(element, attribute) {
    if (attribute == 'title') return element.title;
    return Element._readAttribute(element, attribute);
  };
}

else if (Prototype.Browser.IE) {
  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
    Element.Methods[method] = Element.Methods[method].wrap(
      function(proceed, element) {
        element = $(element);
        var position = element.getStyle('position');
        if (position != 'static') return proceed(element);
        element.setStyle({ position: 'relative' });
        var value = proceed(element);
        element.setStyle({ position: position });
        return value;
      }
    );
  });

  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset' + style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    function stripAlpha(filter){
      return filter.replace(/alpha\([^\)]*\)/gi,'');
    }
    element = $(element);
    var currentStyle = element.currentStyle;
    if ((currentStyle && !currentStyle.hasLayout) ||
      (!currentStyle && element.style.zoom == 'normal'))
        element.style.zoom = 1;

    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      (filter = stripAlpha(filter)) ?
        style.filter = filter : style.removeAttribute('filter');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = stripAlpha(filter) +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  Element._attributeTranslations = {
    read: {
      names: {
        'class': 'className',
        'for':   'htmlFor'
      },
      values: {
        _getAttr: function(element, attribute) {
          return element.getAttribute(attribute, 2);
        },
        _getAttrNode: function(element, attribute) {
          var node = element.getAttributeNode(attribute);
          return node ? node.value : "";
        },
        _getEv: function(element, attribute) {
          var attribute = element.getAttribute(attribute);
          return attribute ? attribute.toString().slice(23, -2) : null;
        },
        _flag: function(element, attribute) {
          return $(element).hasAttribute(attribute) ? attribute : null;
        },
        style: function(element) {
          return element.style.cssText.toLowerCase();
        },
        title: function(element) {
          return element.title;
        }
      }
    }
  };

  Element._attributeTranslations.write = {
    names: Object.clone(Element._attributeTranslations.read.names),
    values: {
      checked: function(element, value) {
        element.checked = !!value;
      },

      style: function(element, value) {
        element.style.cssText = value ? value : '';
      }
    }
  };

  Element._attributeTranslations.has = {};

  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
      'encType maxLength readOnly longDesc').each(function(attr) {
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
  });

  (function(v) {
    Object.extend(v, {
      href:        v._getAttr,
      src:         v._getAttr,
      type:        v._getAttr,
      action:      v._getAttrNode,
      disabled:    v._flag,
      checked:     v._flag,
      readonly:    v._flag,
      multiple:    v._flag,
      onload:      v._getEv,
      onunload:    v._getEv,
      onclick:     v._getEv,
      ondblclick:  v._getEv,
      onmousedown: v._getEv,
      onmouseup:   v._getEv,
      onmouseover: v._getEv,
      onmousemove: v._getEv,
      onmouseout:  v._getEv,
      onfocus:     v._getEv,
      onblur:      v._getEv,
      onkeypress:  v._getEv,
      onkeydown:   v._getEv,
      onkeyup:     v._getEv,
      onsubmit:    v._getEv,
      onreset:     v._getEv,
      onselect:    v._getEv,
      onchange:    v._getEv
    });
  })(Element._attributeTranslations.read.values);
}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

else if (Prototype.Browser.WebKit) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;

    if (value == 1)
      if(element.tagName == 'IMG' && element.width) {
        element.width++; element.width--;
      } else try {
        var n = document.createTextNode(' ');
        element.appendChild(n);
        element.removeChild(n);
      } catch (e) { }

    return element;
  };

  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
  // KHTML/WebKit only.
  Element.Methods.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return Element._returnOffset(valueL, valueT);
  };
}

if (Prototype.Browser.IE || Prototype.Browser.Opera) {
  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
  Element.Methods.update = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);

    content = Object.toHTML(content);
    var tagName = element.tagName.toUpperCase();

    if (tagName in Element._insertionTranslations.tags) {
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
        .each(function(node) { element.appendChild(node) });
    }
    else element.innerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

if (document.createElement('div').outerHTML) {
  Element.Methods.replace = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) {
      element.parentNode.replaceChild(content, element);
      return element;
    }

    content = Object.toHTML(content);
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

    if (Element._insertionTranslations.tags[tagName]) {
      var nextSibling = element.next();
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
      parent.removeChild(element);
      if (nextSibling)
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
      else
        fragments.each(function(node) { parent.appendChild(node) });
    }
    else element.outerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

Element._returnOffset = function(l, t) {
  var result = [l, t];
  result.left = l;
  result.top = t;
  return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
  div.innerHTML = t[0] + html + t[1];
  t[2].times(function() { div = div.firstChild });
  return $A(div.childNodes);
};

Element._insertionTranslations = {
  before: {
    adjacency: 'beforeBegin',
    insert: function(element, node) {
      element.parentNode.insertBefore(node, element);
    },
    initializeRange: function(element, range) {
      range.setStartBefore(element);
    }
  },
  top: {
    adjacency: 'afterBegin',
    insert: function(element, node) {
      element.insertBefore(node, element.firstChild);
    },
    initializeRange: function(element, range) {
      range.selectNodeContents(element);
      range.collapse(true);
    }
  },
  bottom: {
    adjacency: 'beforeEnd',
    insert: function(element, node) {
      element.appendChild(node);
    }
  },
  after: {
    adjacency: 'afterEnd',
    insert: function(element, node) {
      element.parentNode.insertBefore(node, element.nextSibling);
    },
    initializeRange: function(element, range) {
      range.setStartAfter(element);
    }
  },
  tags: {
    TABLE:  ['<table>',                '</table>',                   1],
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
    SELECT: ['<select>',               '</select>',                  1]
  }
};

(function() {
  this.bottom.initializeRange = this.top.initializeRange;
  Object.extend(this.tags, {
    THEAD: this.tags.TBODY,
    TFOOT: this.tags.TBODY,
    TH:    this.tags.TD
  });
}).call(Element._insertionTranslations);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    attribute = Element._attributeTranslations.has[attribute] || attribute;
    var node = $(element).getAttributeNode(attribute);
    return node && node.specified;
  }
};

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
    document.createElement('div').__proto__) {
  window.HTMLElement = { };
  window.HTMLElement.prototype = document.createElement('div').__proto__;
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.extend = (function() {
  if (Prototype.BrowserFeatures.SpecificElementExtensions)
    return Prototype.K;

  var Methods = { }, ByTag = Element.Methods.ByTag;

  var extend = Object.extend(function(element) {
    if (!element || element._extendedByPrototype ||
        element.nodeType != 1 || element == window) return element;

    var methods = Object.clone(Methods),
      tagName = element.tagName, property, value;

    // extend methods for specific tags
    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);

    for (property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in element))
        element[property] = value.methodize();
    }

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

  }, {
    refresh: function() {
      // extend methods for all tags (Safari doesn't need this)
      if (!Prototype.BrowserFeatures.ElementExtensions) {
        Object.extend(Methods, Element.Methods);
        Object.extend(Methods, Element.Methods.Simulated);
      }
    }
  });

  extend.refresh();
  return extend;
})();

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || { });
  else {
    if (Object.isArray(tagName)) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = { };
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    for (var property in methods) {
      var value = methods[property];
      if (!Object.isFunction(value)) continue;
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = value.methodize();
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = { };
    window[klass].prototype = document.createElement(tagName).__proto__;
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (Object.isUndefined(klass)) continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;

  if (Element.extend.refresh) Element.extend.refresh();
  Element.cache = { };
};

document.viewport = {
  getDimensions: function() {
    var dimensions = { };
    $w('width height').each(function(d) {
      var D = d.capitalize();
      dimensions[d] = self['inner' + D] ||
       (document.documentElement['client' + D] || document.body['client' + D]);
    });
    return dimensions;
  },

  getWidth: function() {
    return this.getDimensions().width;
  },

  getHeight: function() {
    return this.getDimensions().height;
  },

  getScrollOffsets: function() {
    return Element._returnOffset(
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
  }
};
/* Portions of the Selector class are derived from Jack Slocumâ€™s DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create({
  initialize: function(expression) {
    this.expression = expression.strip();
    this.compileMatcher();
  },

  compileMatcher: function() {
    // Selectors with namespaced attributes can't use the XPath version
    if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
      return this.compileXPathMatcher();

    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e];
      return;
    }

    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
    	      new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le, m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
    return this.matcher(root);
  },

  match: function(element) {
    this.tokens = [];

    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
    var le, p, m;

    while (e && le !== e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          // use the Selector.assertions methods unless the selector
          // is too complex.
          if (as[i]) {
            this.tokens.push([i, Object.clone(m)]);
            e = e.replace(m[0], '');
          } else {
            // reluctantly do a document-wide search
            // and look for a match in the array
            return this.findElements(document).include(element);
          }
        }
      }
    }

    var match = true, name, matches;
    for (var i = 0, token; token = this.tokens[i]; i++) {
      name = token[0], matches = token[1];
      if (!Selector.assertions[name](element, matches)) {
        match = false; break;
      }
    }

    return match;
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
});

Object.extend(Selector, {
  _cache: { },

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: "[@#{1}]",
    attr: function(m) {
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (Object.isFunction(h)) return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
      'checked':     "[@checked]",
      'disabled':    "[@disabled]",
      'enabled':     "[not(@disabled)]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, m, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
    className:    'n = h.className(n, r, "#{1}", c); c = false;',
    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
    },
    pseudo: function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
    attrPresence: /^\[([\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
  },

  // for Selector.match and Element#match
  assertions: {
    tagName: function(element, matches) {
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
    },

    className: function(element, matches) {
      return Element.hasClassName(element, matches[1]);
    },

    id: function(element, matches) {
      return element.id === matches[1];
    },

    attrPresence: function(element, matches) {
      return Element.hasAttribute(element, matches[1]);
    },

    attr: function(element, matches) {
      var nodeValue = Element.readAttribute(element, matches[1]);
      return Selector.operators[matches[2]](nodeValue, matches[3]);
    }
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._counted = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._counted = true;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          var node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._counted) {
          n._counted = true;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
	      if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      tagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() == tagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!targetNode) return [];
      if (!nodes && root == document) return [targetNode];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._counted) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._counted) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled) results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv.startsWith(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
  },

  matchElements: function(elements, expression) {
    var matches = new Selector(expression).findElements(), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._counted) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (Object.isNumber(expression)) {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    var exprs = expressions.join(','), expressions = [];
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements, options) {
    if (typeof options != 'object') options = { hash: !!options };
    else if (options.hash === undefined) options.hash = true;
    var key, value, submitted = false, submit = options.submit;

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            // a key is already present; construct an array of values
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return options.hash ? data : Object.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, options) {
    return Form.serializeElements(Form.getElements(form), options);
  },

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    var elements = $(form).getElements().findAll(function(element) {
      return 'hidden' != element.type && !element.disabled;
    });
    var firstByIndex = elements.findAll(function(element) {
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
    }).sortBy(function(element) { return element.tabIndex }).first();

    return firstByIndex ? firstByIndex : elements.find(function(element) {
      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || { });

    var params = options.parameters, action = form.readAttribute('action') || '';
    if (action.blank()) action = window.location.href;
    options.parameters = form.serialize(true);

    if (params) {
      if (Object.isString(params)) params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(action, options);
  }
};

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
};

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = { };
        pair[element.name] = value;
        return Object.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  setValue: function(element, value) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    Form.Element.Serializers[method](element, value);
    return element;
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
          !['button', 'reset', 'submit'].include(element.type)))
        element.select();
    } catch (e) { }
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.blur();
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
};

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element, value);
      default:
        return Form.Element.Serializers.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (value === undefined) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (value === undefined) return element.value;
    else element.value = value;
  },

  select: function(element, index) {
    if (index === undefined)
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, value, single = !Object.isArray(index);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        value = this.optionValue(opt);
        if (single) {
          if (value == index) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = index.include(value);
      }
    }
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
};

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  initialize: function($super, element, frequency, callback) {
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },

  execute: function() {
    var value = this.getValue();
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
});

Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = Class.create({
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback, this);
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
});

Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) var Event = { };

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,
  KEY_INSERT:   45,

  cache: { },

  relatedTarget: function(event) {
    var element;
    switch(event.type) {
      case 'mouseover': element = event.fromElement; break;
      case 'mouseout':  element = event.toElement;   break;
      default: return null;
    }
    return Element.extend(element);
  }
});

Event.Methods = (function() {
  var isButton;

  if (Prototype.Browser.IE) {
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
    isButton = function(event, code) {
      return event.button == buttonMap[code];
    };

  } else if (Prototype.Browser.WebKit) {
    isButton = function(event, code) {
      switch (code) {
        case 0: return event.which == 1 && !event.metaKey;
        case 1: return event.which == 1 && event.metaKey;
        default: return false;
      }
    };

  } else {
    isButton = function(event, code) {
      return event.which ? (event.which === code + 1) : (event.button === code);
    };
  }

  return {
    isLeftClick:   function(event) { return isButton(event, 0) },
    isMiddleClick: function(event) { return isButton(event, 1) },
    isRightClick:  function(event) { return isButton(event, 2) },

    element: function(event) {
      var node = Event.extend(event).target;
      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
    },

    findElement: function(event, expression) {
      var element = Event.element(event);
      return element.match(expression) ? element : element.up(expression);
    },

    pointer: function(event) {
      return {
        x: event.pageX || (event.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft)),
        y: event.pageY || (event.clientY +
          (document.documentElement.scrollTop || document.body.scrollTop))
      };
    },

    pointerX: function(event) { return Event.pointer(event).x },
    pointerY: function(event) { return Event.pointer(event).y },

    stop: function(event) {
      Event.extend(event);
      event.preventDefault();
      event.stopPropagation();
      event.stopped = true;
    }
  };
})();

Event.extend = (function() {
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
    m[name] = Event.Methods[name].methodize();
    return m;
  });

  if (Prototype.Browser.IE) {
    Object.extend(methods, {
      stopPropagation: function() { this.cancelBubble = true },
      preventDefault:  function() { this.returnValue = false },
      inspect: function() { return "[object Event]" }
    });

    return function(event) {
      if (!event) return false;
      if (event._extendedByPrototype) return event;

      event._extendedByPrototype = Prototype.emptyFunction;
      var pointer = Event.pointer(event);
      Object.extend(event, {
        target: event.srcElement,
        relatedTarget: Event.relatedTarget(event),
        pageX:  pointer.x,
        pageY:  pointer.y
      });
      return Object.extend(event, methods);
    };

  } else {
    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
    Object.extend(Event.prototype, methods);
    return Prototype.K;
  }
})();

Object.extend(Event, (function() {
  var cache = Event.cache;

  function getEventID(element) {
    if (element._eventID) return element._eventID;
    arguments.callee.id = arguments.callee.id || 1;
    return element._eventID = ++arguments.callee.id;
  }

  function getDOMEventName(eventName) {
    if (eventName && eventName.include(':')) return "dataavailable";
    return eventName;
  }

  function getCacheForID(id) {
    return cache[id] = cache[id] || { };
  }

  function getWrappersForEventName(id, eventName) {
    var c = getCacheForID(id);
    return c[eventName] = c[eventName] || [];
  }

  function createWrapper(element, eventName, handler) {
    var id = getEventID(element);
    var c = getWrappersForEventName(id, eventName);
    if (c.pluck("handler").include(handler)) return false;

    var wrapper = function(event) {
      if (!Event || !Event.extend ||
        (event.eventName && event.eventName != eventName))
          return false;

      Event.extend(event);
      handler.call(element, event)
    };

    wrapper.handler = handler;
    c.push(wrapper);
    return wrapper;
  }

  function findWrapper(id, eventName, handler) {
    var c = getWrappersForEventName(id, eventName);
    return c.find(function(wrapper) { return wrapper.handler == handler });
  }

  function destroyWrapper(id, eventName, handler) {
    var c = getCacheForID(id);
    if (!c[eventName]) return false;
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
  }

  function destroyCache() {
    for (var id in cache)
      for (var eventName in cache[id])
        cache[id][eventName] = null;
  }

  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }

  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }

      return element;
    },

    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);

      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;

      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }

      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;

      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }

      destroyWrapper(id, eventName, handler);

      return element;
    },

    fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;

      if (document.createEvent) {
        var event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        var event = document.createEventObject();
        event.eventType = "ondataavailable";
      }

      event.eventName = eventName;
      event.memo = memo || { };

      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }

      return event;
    }
  };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
  fire:          Event.fire,
  observe:       Event.observe,
  stopObserving: Event.stopObserving
});

Object.extend(document, {
  fire:          Element.Methods.fire.methodize(),
  observe:       Element.Methods.observe.methodize(),
  stopObserving: Element.Methods.stopObserving.methodize()
});

(function() {
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
     Matthias Miller, Dean Edwards and John Resig. */

  var timer, fired = false;

  function fireContentLoadedEvent() {
    if (fired) return;
    if (timer) window.clearInterval(timer);
    document.fire("dom:loaded");
    fired = true;
  }

  if (document.addEventListener) {
    if (Prototype.Browser.WebKit) {
      timer = window.setInterval(function() {
        if (/loaded|complete/.test(document.readyState))
          fireContentLoadedEvent();
      }, 0);

      Event.observe(window, "load", fireContentLoadedEvent);

    } else {
      document.addEventListener("DOMContentLoaded",
        fireContentLoadedEvent, false);
    }

  } else {
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
    $("__onDOMContentLoaded").onreadystatechange = function() {
      if (this.readyState == "complete") {
        this.onreadystatechange = null;
        fireContentLoadedEvent();
      }
    };
  }
})();
/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
  Before: function(element, content) {
    return Element.insert(element, {before:content});
  },

  Top: function(element, content) {
    return Element.insert(element, {top:content});
  },

  Bottom: function(element, content) {
    return Element.insert(element, {bottom:content});
  },

  After: function(element, content) {
    return Element.insert(element, {after:content});
  }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

// This should be moved to script.aculo.us; notice the deprecated methods
// further below, that map to the newer Element methods.
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = Element.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = Element.cumulativeScrollOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = Element.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  // Deprecation layer -- use newer Element methods now (1.5.2).

  cumulativeOffset: Element.Methods.cumulativeOffset,

  positionedOffset: Element.Methods.positionedOffset,

  absolutize: function(element) {
    Position.prepare();
    return Element.absolutize(element);
  },

  relativize: function(element) {
    Position.prepare();
    return Element.relativize(element);
  },

  realOffset: Element.Methods.cumulativeScrollOffset,

  offsetParent: Element.Methods.getOffsetParent,

  page: Element.Methods.viewportOffset,

  clone: function(source, target, options) {
    options = options || { };
    return Element.clonePosition(target, source, options);
  }
};

/*--------------------------------------------------------------------------*/

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  function iter(name) {
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
  }

  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  function(element, className) {
    className = className.toString().strip();
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  } : function(element, className) {
    className = className.toString().strip();
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
    if (!classNames && !className) return elements;

    var nodes = $(element).getElementsByTagName('*');
    className = ' ' + className + ' ';

    for (var i = 0, child, cn; child = nodes[i]; i++) {
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
          (classNames && classNames.all(function(name) {
            return !name.toString().blank() && cn.include(' ' + name + ' ');
          }))))
        elements.push(Element.extend(child));
    }
    return elements;
  };

  return function(className, parentElement) {
    return $(parentElement || document.body).getElementsByClassName(className);
  };
}(Element.Methods);

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);

/*--------------------------------------------------------------------------*/

Element.addMethods();/**
 * Generates a browser-specific Flash tag. Create a new instance, set whatever
 * properties you need, then call either toString() to get the tag as a string, or
 * call write() to write the tag out.
 */

/**
 * Creates a new instance of the FlashTag.
 * src: The path to the SWF file.
 * width: The width of your Flash content.
 * height: the height of your Flash content.
 */
function FlashTag(src, width, height, protocol, id, flashVars)
{
    this.src       = src;
    this.width     = width;
    this.height    = height;
    this.version   = '7,0,14,0';
    this.id        = id;
    this.bgcolor   = 'ffffff';
    this.flashVars = flashVars
    this.protocol  = protocol;
}

/**
 * Sets the Flash version used in the Flash tag.
 */
FlashTag.prototype.setVersion = function(v)
{
    this.version = v;
}

/**
 * Sets the ID used in the Flash tag.
 */
FlashTag.prototype.setId = function(id)
{
    this.id = id;
}

/**
 * Sets the background color used in the Flash tag.
 */
FlashTag.prototype.setBgcolor = function(bgc)
{
    this.bgcolor = bgc;
}

/**
 * Sets any variables to be passed into the Flash content.
 */
FlashTag.prototype.setFlashvars = function(fv)
{
    this.flashVars = fv;
}

/**
 * Get the Flash tag as a string.
 */
FlashTag.prototype.toString = function()
{
    var ie = (navigator.appName.indexOf ("Microsoft") != -1) ? 1 : 0;
    var flashTag = new String();
    if (ie)
    {
        flashTag += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';
        if (this.id != null)
        {
            flashTag += 'id="'+this.id+'" name="'+this.id+'" ';
        }
        flashTag += 'codebase="' + this.protocol + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='+this.version+'" ';
        flashTag += 'width="'+this.width+'" ';
        flashTag += 'height="'+this.height+'">';
        flashTag += '<param name="movie" value="'+this.src+'"/>';
		flashTag += '<param name="wmode" value="opaque"/>';
        flashTag += '<param name="quality" value="best"/>';
        flashTag += '<param name="bgcolor" value="#'+this.bgcolor+'"/>';
        if (this.flashVars != null)
        {
			// flashTag += '<param name="flashvars" value="'+this.flashVars+'"/>';
			flashTag += "<param name='flashvars' value='"+this.flashVars+"'/>";
        }
        flashTag += '</object>';
    }
    else
    {
        flashTag += '<embed src="'+this.src+'" ';
		flashTag += 'wmode="opaque" ';
        flashTag += 'quality="best" ';
        flashTag += 'bgcolor="#'+this.bgcolor+'" ';
        flashTag += 'width="'+this.width+'" ';
        flashTag += 'height="'+this.height+'" ';
        flashTag += 'type="application/x-shockwave-flash" ';
        if (this.flashVars != null)
        {
            //flashTag += 'flashvars="'+this.flashVars+'" ';
			flashTag += "flashvars='"+this.flashVars+"' ";
        }
        if (this.id != null)
        {
             flashTag += 'id="'+this.id+'" name="'+this.id+'" ';
        }
        flashTag += 'pluginspage="' + this.protocol + 'www.macromedia.com/go/getflashplayer">';
        flashTag += '</embed>';
    }
    return flashTag;
}

/**
 * Write the Flash tag out. Pass in a reference to the document to write to.
 */
FlashTag.prototype.write = function(doc)
{
    doc.write(this.toString());
}
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright © 1990, 2002 Adobe Systems Incorporated.  All Rights Reserved. ©
 * 1981, 2002 Heidelberger Druckmaschinen AG. All rights reserved.
 * 
 * Trademark:
 * Helvetica is a trademark of Heidelberger Druckmaschinen AG, exclusively
 * licensed through Linotype Library GmbH, and may be registered in certain
 * jurisdictions.
 * 
 * Full name:
 * HelveticaNeueLTStd-Cn
 * 
 * Designer:
 * Linotype Staff
 * 
 * Vendor URL:
 * http://www.adobe.com/type
 * 
 * License information:
 * http://www.adobe.com/type/legal.html
 */
Cufon.registerFont({"w":166,"face":{"font-family":"Helvetica Neue 57","font-weight":400,"font-stretch":"condensed","units-per-em":"360","panose-1":"2 11 5 6 3 5 2 3 2 4","ascent":"257","descent":"-103","x-height":"5","bbox":"-59 -336 360 76.2302","underline-thickness":"18","underline-position":"-18","stemh":"24","stemv":"30","unicode-range":"U+0020-U+FB02"},"glyphs":{" ":{"w":86,"k":{"\u201c":13,"\u2018":13,"T":13,"V":13,"W":13,"Y":13,"\u00dd":13,"\u0178":13,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13}},"!":{"d":"36,-67r-6,-190r33,0r-6,190r-21,0xm30,0r0,-35r33,0r0,35r-33,0","w":92},"\"":{"d":"31,-166r0,-91r24,0r0,91r-24,0xm91,-166r0,-91r24,0r0,91r-24,0","w":146},"#":{"d":"28,0r10,-74r-30,0r0,-24r33,0r7,-55r-32,0r0,-24r35,0r9,-73r24,0r-9,73r38,0r9,-73r23,0r-9,73r29,0r0,24r-32,0r-7,55r30,0r0,24r-33,0r-9,74r-24,0r10,-74r-38,0r-10,74r-24,0xm71,-153r-7,55r39,0r6,-55r-38,0","w":172},"$":{"d":"93,-110r0,89v22,-2,39,-18,39,-43v0,-27,-17,-38,-39,-46xm78,-146r0,-83v-22,3,-34,17,-34,40v0,24,15,35,34,43xm78,-255r0,-21r15,0r0,21v44,2,64,26,65,70r-32,0v0,-24,-8,-41,-33,-44r0,88v33,11,72,20,72,72v0,54,-37,72,-72,74r0,34r-15,0r0,-34v-54,-2,-70,-32,-70,-83r31,0v0,26,2,53,39,57r0,-94v-32,-10,-67,-22,-67,-71v0,-23,9,-65,67,-69","w":172},"%":{"d":"64,-136v20,0,21,-20,21,-50v0,-30,-1,-49,-21,-49v-20,0,-22,19,-22,49v0,30,2,50,22,50xm67,5r112,-260r25,0r-112,260r-25,0xm210,-14v20,0,21,-20,21,-50v0,-30,-1,-50,-21,-50v-20,0,-22,20,-22,50v0,30,2,50,22,50xm64,-117v-43,0,-47,-33,-47,-69v0,-36,4,-69,47,-69v43,0,47,33,47,69v0,36,-4,69,-47,69xm210,5v-43,0,-48,-33,-48,-69v0,-36,5,-69,48,-69v43,0,47,33,47,69v0,36,-4,69,-47,69","w":273},"&":{"d":"80,-172v4,8,8,10,13,2v24,-13,36,-63,-3,-63v-35,0,-29,42,-10,61xm134,-46r-57,-81v-21,12,-36,31,-36,58v0,56,70,60,93,23xm99,-144r51,73v5,-13,8,-27,10,-50r28,0v0,19,-11,62,-21,75r33,46r-34,0r-17,-24v-20,19,-36,29,-64,29v-63,0,-76,-48,-76,-71v-1,-37,28,-64,54,-81v-10,-18,-27,-36,-27,-60v0,-30,24,-50,53,-50v32,0,55,14,55,49v0,30,-26,47,-45,64","w":200},"\u2019":{"d":"27,-219r0,-38r33,0v-1,42,8,79,-33,91r0,-17v16,-7,15,-17,15,-36r-15,0","w":86,"k":{"\u2019":30,"s":20,"\u0161":20}},"(":{"d":"68,-257r17,0v-54,98,-51,225,0,323r-17,0v-70,-93,-70,-229,0,-323","w":86},")":{"d":"19,66r-18,0v56,-98,52,-225,0,-323r18,0v69,93,69,229,0,323","w":86},"*":{"d":"53,-214r0,-43r21,0r0,43r39,-15r8,21r-41,12r27,34r-18,13r-26,-36r-26,36r-18,-13r28,-34r-41,-12r8,-21","w":126},"+":{"d":"96,0r0,-79r-79,0r0,-24r79,0r0,-79r24,0r0,79r79,0r0,24r-79,0r0,79r-24,0","w":216},",":{"d":"27,0r0,-38r33,0v-1,42,8,79,-33,91r0,-17v16,-7,15,-17,15,-36r-15,0","w":86,"k":{"\u201d":13,"\u2019":13," ":13}},"-":{"d":"19,-88r0,-28r88,0r0,28r-88,0","w":126},".":{"d":"27,0r0,-38r33,0r0,38r-33,0","w":86,"k":{" ":13}},"\/":{"d":"-4,5r84,-267r24,0r-84,267r-24,0","w":100},"0":{"d":"86,5v-69,0,-72,-69,-72,-129v0,-56,3,-131,72,-131v69,0,73,68,73,131v0,54,-4,129,-73,129xm45,-124v0,54,2,105,41,105v39,0,41,-51,41,-105v0,-56,-2,-107,-41,-107v-39,0,-41,51,-41,107","w":172},"1":{"d":"24,-192r0,-21v32,-2,62,-6,63,-42r22,0r0,255r-31,0r0,-192r-54,0","w":172},"2":{"d":"158,-28r0,28r-143,0v0,-61,41,-93,76,-122v21,-18,34,-33,34,-61v0,-22,-10,-46,-37,-46v-39,0,-40,41,-40,55r-32,0v0,-48,20,-81,72,-81v59,0,69,46,69,68v3,80,-91,94,-109,159r110,0","w":172},"3":{"d":"65,-120r0,-24v36,4,56,-13,55,-45v0,-23,-10,-42,-34,-42v-33,0,-36,31,-36,50r-32,0v0,-44,21,-74,68,-74v53,0,65,38,65,66v1,27,-14,48,-39,56v29,6,47,24,47,59v0,46,-24,79,-73,79v-69,0,-72,-58,-72,-74r32,0v0,23,11,50,40,50v19,0,41,-9,41,-52v1,-36,-21,-53,-62,-49","w":172},"4":{"d":"103,-205v-24,37,-43,79,-65,118r65,0r0,-118xm11,-90r92,-165r30,0r0,168r29,0r0,25r-29,0r0,62r-30,0r0,-62r-92,0r0,-28","w":172},"5":{"d":"21,-119r14,-131r114,0r0,28r-90,0v-2,24,-9,52,-9,75v43,-42,108,-11,108,65v0,48,-21,87,-74,87v-60,0,-70,-50,-70,-71r32,0v0,13,5,47,39,47v36,0,42,-40,42,-66v0,-28,-11,-58,-43,-58v-22,0,-36,19,-36,25","w":172},"6":{"d":"154,-194r-31,0v0,-21,-12,-37,-34,-37v-49,0,-47,66,-44,97v5,-9,21,-29,49,-29v44,0,66,33,66,81v0,49,-24,87,-72,87v-71,0,-75,-68,-75,-121v0,-58,3,-139,77,-139v59,0,64,49,64,61xm48,-78v0,27,8,59,40,59v32,0,41,-32,41,-59v0,-27,-7,-59,-41,-59v-34,0,-40,32,-40,59","w":172},"7":{"d":"159,-224v-36,48,-78,136,-85,224r-35,0v12,-86,46,-163,91,-222r-116,0r0,-28r145,0r0,26","w":172},"8":{"d":"86,5v-93,0,-95,-121,-28,-141v-63,-19,-41,-127,28,-119v69,-8,92,100,28,119v67,21,64,141,-28,141xm86,-231v-23,0,-33,18,-33,42v0,24,10,41,33,41v23,0,34,-17,34,-41v0,-24,-11,-42,-34,-42xm45,-71v0,30,11,52,41,52v30,0,42,-22,42,-52v0,-30,-12,-53,-42,-53v-30,0,-41,23,-41,53","w":172},"9":{"d":"18,-56r32,0v0,21,12,37,34,37v49,0,47,-66,44,-97v-5,9,-21,29,-49,29v-44,0,-66,-33,-66,-81v0,-49,24,-87,72,-87v71,0,75,68,75,121v0,58,-3,139,-77,139v-59,0,-65,-49,-65,-61xm125,-172v0,-27,-8,-59,-40,-59v-32,0,-41,32,-41,59v0,27,7,59,41,59v34,0,40,-32,40,-59","w":172},":":{"d":"27,-144r0,-38r33,0r0,38r-33,0xm27,0r0,-38r33,0r0,38r-33,0","w":86,"k":{" ":13}},";":{"d":"27,0r0,-38r33,0v-1,42,8,79,-33,91r0,-17v16,-7,15,-17,15,-36r-15,0xm27,-144r0,-38r33,0r0,38r-33,0","w":86},"<":{"d":"17,-80r0,-22r182,-83r0,24r-154,70r154,70r0,24","w":216},"=":{"d":"17,-116r0,-24r182,0r0,24r-182,0xm17,-42r0,-24r182,0r0,24r-182,0","w":216},">":{"d":"17,3r0,-24r154,-70r-154,-70r0,-24r182,83r0,22","w":216},"?":{"d":"62,-67v-9,-63,55,-72,54,-127v0,-21,-12,-40,-35,-40v-35,0,-38,35,-38,53r-30,0v0,-42,21,-79,67,-79v43,0,67,29,67,68v0,55,-62,69,-57,125r-28,0xm59,0r0,-35r34,0r0,35r-34,0","w":159},"@":{"d":"86,-105v0,20,15,34,34,34v33,0,56,-49,56,-76v0,-16,-11,-36,-29,-36v-35,0,-61,45,-61,78xm188,-175v5,-6,5,-16,9,-23r20,0r-34,118v0,5,4,9,11,9v33,0,60,-38,60,-78v0,-54,-48,-91,-110,-91v-62,0,-110,48,-110,111v0,64,48,112,110,112v44,0,79,-14,98,-40r22,0v-23,40,-65,62,-120,62v-74,0,-134,-60,-134,-134v0,-74,60,-133,134,-133v78,0,134,46,134,111v0,62,-51,102,-93,102v-14,0,-24,-7,-26,-22v-26,37,-96,24,-96,-32v0,-50,33,-102,84,-102v18,0,33,8,41,30","w":288},"A":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"B":{"d":"53,-122r0,96r43,0v33,0,45,-22,45,-47v-1,-50,-40,-51,-88,-49xm21,0r0,-257v72,2,143,-17,145,66v1,24,-17,45,-38,54v32,8,46,32,46,64v0,79,-75,75,-153,73xm53,-231r0,85v42,-2,72,13,79,-43v5,-41,-36,-45,-79,-42","w":186},"C":{"d":"145,-88r33,0v-3,49,-22,93,-78,93v-73,0,-83,-69,-83,-134v0,-65,12,-133,83,-133v53,0,75,30,76,80r-33,0v-1,-29,-10,-54,-43,-54v-44,0,-50,48,-50,107v0,59,6,108,50,108v39,0,44,-36,45,-67","w":186},"D":{"d":"56,-231r0,205r33,0v55,0,61,-56,61,-102v0,-50,-3,-103,-61,-103r-33,0xm24,0r0,-257r69,0v80,0,90,57,90,128v0,65,-16,129,-87,129r-72,0","w":200,"k":{"Y":7,"\u00dd":7,"\u0178":7}},"E":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,92r105,0r0,28r-137,0"},"F":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,120r-32,0","w":159,"k":{"\u00eb":9,"\u00e3":7,"\u00e0":7,"\u00e4":7,"a":7,"\u00e6":7,"\u00e1":7,"\u00e2":7,"\u00e5":7,"A":19,"\u00c6":19,"\u00c1":19,"\u00c2":19,"\u00c4":19,"\u00c0":19,"\u00c5":19,"\u00c3":19,"e":9,"\u00e9":9,"\u00ea":9,"\u00e8":9,"i":6,"\u00ed":6,"\u00ee":6,"\u00ef":6,"\u00ec":6,"o":7,"\u00f8":7,"\u0153":7,"\u00f3":7,"\u00f4":7,"\u00f6":7,"\u00f2":7,"\u00f5":7,"r":7,",":40,".":40}},"G":{"d":"176,-186r-33,0v-1,-27,-12,-50,-43,-50v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,47,-53,47,-87r-51,0r0,-26r80,0r0,134r-24,0r0,-35v-7,22,-28,40,-56,40v-67,0,-79,-65,-79,-134v0,-65,12,-133,83,-133v74,0,76,63,76,76","w":193},"H":{"d":"172,-257r0,257r-31,0r0,-124r-88,0r0,124r-32,0r0,-257r32,0r0,105r88,0r0,-105r31,0","w":193},"I":{"d":"21,0r0,-257r32,0r0,257r-32,0","w":73},"J":{"d":"132,-257r0,183v0,46,-11,79,-64,79v-51,0,-63,-34,-60,-80r30,0v-2,29,2,55,30,54v29,0,33,-19,33,-54r0,-182r31,0","w":153},"K":{"d":"21,0r0,-257r32,0r0,125r89,-125r35,0r-77,107r84,150r-35,0r-70,-124r-26,37r0,87r-32,0","w":180,"k":{"y":4,"\u00fd":4,"\u00ff":4,"o":7,"\u00f8":7,"\u0153":7,"\u00f3":7,"\u00f4":7,"\u00f6":7,"\u00f2":7,"\u00f5":7,"u":7,"\u00fa":7,"\u00fb":7,"\u00fc":7,"\u00f9":7}},"L":{"d":"21,0r0,-257r32,0r0,229r104,0r0,28r-136,0","w":159,"k":{"T":34,"V":27,"W":27,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":33,"\u2019":33,"y":13,"\u00fd":13,"\u00ff":13}},"M":{"d":"22,0r0,-257r53,0r52,204r52,-204r53,0r0,257r-32,0r-1,-225r-56,225r-32,0r-58,-225r0,225r-31,0","w":253},"N":{"d":"21,0r0,-257r41,0r86,215r0,-215r31,0r0,257r-43,0r-83,-208r0,208r-32,0","w":200},"O":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"P":{"d":"21,0r0,-257r65,0v22,0,80,0,80,74v0,63,-47,80,-113,74r0,109r-32,0xm53,-231r0,96v46,2,78,1,80,-50v2,-42,-35,-50,-80,-46","w":173,"k":{"\u00e4":6,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13,"e":6,"\u00e9":6,"\u00ea":6,"\u00eb":6,"\u00e8":6,"o":6,"\u00f8":6,"\u0153":6,"\u00f3":6,"\u00f4":6,"\u00f6":6,"\u00f2":6,"\u00f5":6,",":46,".":46}},"Q":{"d":"170,15r-26,-23v-11,8,-26,13,-44,13v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133v71,0,83,68,83,133v0,37,-4,76,-21,102r26,24xm123,-27r-24,-22r17,-20r24,22v15,-51,26,-189,-40,-189v-44,0,-50,48,-50,107v0,69,15,127,73,102","w":200},"R":{"d":"21,0r0,-257v71,-1,149,-10,149,64v0,29,-12,57,-40,66v57,-1,24,105,53,127r-39,0v-10,-15,-7,-52,-10,-77v-6,-53,-39,-33,-81,-37r0,114r-32,0xm53,-231r0,91v45,-3,78,14,84,-50v3,-39,-41,-44,-84,-41","w":186,"k":{"T":6,"W":-7,"Y":6,"\u00dd":6,"\u0178":6,"U":-7,"\u00da":-7,"\u00db":-7,"\u00dc":-7,"\u00d9":-7}},"S":{"d":"162,-190r-32,0v0,-27,-10,-46,-40,-46v-27,0,-42,15,-42,42v0,72,121,29,121,123v0,59,-44,76,-80,76v-60,0,-78,-31,-78,-86r32,0v0,29,2,60,48,60v25,0,45,-18,45,-45v0,-73,-122,-31,-122,-125v0,-24,11,-71,76,-71v49,0,71,25,72,72","w":180},"T":{"d":"99,-229r0,229r-32,0r0,-229r-64,0r0,-28r161,0r0,28r-65,0","k":{"\u00fc":27,"\u00f2":27,"\u00f6":27,"\u00ec":6,"\u00ee":6,"\u00ed":6,"\u00e8":27,"\u00eb":27,"\u00ea":27,"\u00e3":27,"\u00e5":27,"\u00e0":27,"\u00e4":27,"\u00e2":27,"w":27,"y":20,"\u00fd":20,"\u00ff":20,"a":27,"\u00e6":27,"\u00e1":27,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,"e":27,"\u00e9":27,"i":6,"\u00ef":6,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f5":27,"r":27,",":33,".":33,"u":27,"\u00fa":27,"\u00fb":27,"\u00f9":27,"-":20,":":27,";":27}},"U":{"d":"18,-76r0,-181r32,0r0,181v0,38,12,55,43,55v34,0,44,-19,44,-55r0,-181r32,0r0,181v0,49,-26,81,-76,81v-51,0,-75,-28,-75,-81","w":186},"V":{"d":"62,0r-63,-257r33,0r52,221r50,-221r33,0r-65,257r-40,0","k":{"\u00f6":6,"\u00f4":6,"\u00e8":6,"\u00eb":6,"\u00ea":6,"\u00e3":6,"\u00e5":6,"\u00e0":6,"\u00e4":6,"\u00e2":6,"a":6,"\u00e6":6,"\u00e1":6,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13,"e":6,"\u00e9":6,"o":6,"\u00f8":6,"\u0153":6,"\u00f3":6,"\u00f2":6,"\u00f5":6,",":33,".":33,"u":6,"\u00fa":6,"\u00fb":6,"\u00fc":6,"\u00f9":6,"-":6,":":6,";":6}},"W":{"d":"54,0r-51,-257r32,0r40,210r36,-210r38,0r37,210r39,-210r32,0r-53,257r-38,0r-36,-208r-37,208r-39,0","w":259,"k":{"\u00f6":6,"\u00ea":6,"\u00e4":6,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,"e":6,"\u00e9":6,"\u00eb":6,"\u00e8":6,"o":6,"\u00f8":6,"\u0153":6,"\u00f3":6,"\u00f4":6,"\u00f2":6,"\u00f5":6,",":27,".":27,"-":6}},"X":{"d":"69,-131r-63,-126r35,0r47,96r47,-96r33,0r-64,126r68,131r-35,0r-51,-103r-52,103r-33,0","w":173},"Y":{"d":"67,-101r-68,-156r35,0r49,120r51,-120r33,0r-68,156r0,101r-32,0r0,-101","k":{"\u00fc":22,"\u00f6":27,"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"i":11,"\u00ed":11,"\u00ee":11,"\u00ef":11,"\u00ec":11,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f2":27,"\u00f5":27,",":40,".":40,"u":22,"\u00fa":22,"\u00fb":22,"\u00f9":22,"-":27,":":13,";":13}},"Z":{"d":"8,0r0,-27r116,-202r-109,0r0,-28r142,0r0,29r-116,200r117,0r0,28r-150,0"},"[":{"d":"28,66r0,-323r65,0r0,24r-37,0r0,275r37,0r0,24r-65,0","w":93},"\\":{"d":"80,5r-84,-267r24,0r84,267r-24,0","w":100},"]":{"d":"65,-257r0,323r-64,0r0,-24r36,0r0,-275r-36,0r0,-24r64,0","w":93},"^":{"d":"17,-94r82,-156r18,0r82,156r-24,0r-67,-130r-67,130r-24,0","w":216},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"\u2018":{"d":"60,-204r0,38r-33,0v1,-42,-8,-79,33,-91r0,17v-15,7,-16,17,-16,36r16,0","w":86,"k":{"\u2018":30}},"a":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86","w":159},"b":{"d":"48,-96v0,40,7,75,39,75v28,0,35,-31,35,-75v0,-46,-7,-76,-35,-76v-32,0,-39,39,-39,76xm20,0r0,-257r30,0r1,86v7,-17,25,-27,44,-27v52,0,59,62,59,102v0,54,-18,101,-63,101v-21,0,-38,-15,-42,-29r0,24r-29,0"},"c":{"d":"142,-134r-30,0v0,-19,-8,-40,-31,-40v-19,0,-38,9,-38,80v0,25,1,75,37,75v26,0,32,-27,32,-48r30,0v0,31,-16,72,-64,72v-47,0,-66,-33,-66,-99v0,-48,9,-104,68,-104v53,0,62,42,62,64","w":153,"k":{"l":7,"\u0142":7,"y":7,"\u00fd":7,"\u00ff":7}},"d":{"d":"44,-96v0,46,8,75,36,75v33,0,38,-31,38,-75v0,-37,-6,-76,-38,-76v-28,0,-36,30,-36,76xm147,-257r0,257r-29,0v-1,-7,2,-18,-1,-24v-4,14,-20,29,-41,29v-46,0,-63,-40,-63,-101v0,-40,6,-102,60,-102v18,-1,35,12,44,27r0,-86r30,0","k":{"y":-4,"\u00fd":-4,"\u00ff":-4}},"e":{"d":"46,-117r69,0v1,-28,-3,-57,-34,-57v-35,0,-35,38,-35,57xm147,-93r-102,0v0,30,0,74,37,74v29,0,33,-30,33,-44r30,0v0,21,-12,68,-65,68v-47,0,-67,-33,-67,-99v0,-48,10,-104,69,-104v64,0,65,56,65,105","w":159},"f":{"d":"29,0r0,-169r-28,0r0,-24r28,0v-5,-49,12,-74,64,-67r0,26v-18,-1,-34,-1,-34,18r0,23r33,0r0,24r-33,0r0,169r-30,0","w":93,"k":{"\u201d":-6,"\u2019":-6}},"g":{"d":"80,-172v-28,0,-36,30,-36,76v0,31,5,70,35,70v33,0,39,-30,39,-70v0,-37,-6,-76,-38,-76xm147,-193r0,181v0,58,-27,78,-66,78v-12,0,-58,0,-63,-48r30,0v1,18,15,24,31,24v50,0,38,-36,37,-68v-6,16,-25,26,-44,26v-56,0,-59,-70,-59,-96v0,-52,14,-102,63,-102v22,-1,36,17,42,30r0,-25r29,0","k":{"y":-4,"\u00fd":-4,"\u00ff":-4}},"h":{"d":"20,0r0,-257r30,0r1,86v8,-16,29,-27,46,-27v50,0,50,38,50,61r0,137r-30,0r0,-133v0,-15,-2,-39,-29,-39v-16,0,-38,11,-38,39r0,133r-30,0"},"i":{"d":"22,0r0,-193r30,0r0,193r-30,0xm22,-222r0,-35r30,0r0,35r-30,0","w":73},"j":{"d":"52,-193r0,212v2,37,-22,51,-60,46r0,-26v23,5,30,-7,30,-31r0,-201r30,0xm52,-257r0,35r-30,0r0,-35r30,0","w":73},"k":{"d":"95,-120r69,120r-35,0r-54,-95r-25,30r0,65r-30,0r0,-257r30,0r1,153r67,-89r36,0","w":159},"l":{"d":"22,0r0,-257r30,0r0,257r-30,0","w":73,"k":{"w":-4}},"m":{"d":"23,0r0,-193r28,0v1,7,-2,18,1,23v15,-35,80,-41,89,3v9,-17,25,-31,45,-31v51,0,51,38,51,61r0,137r-30,0r0,-133v0,-15,-1,-39,-26,-39v-14,0,-36,9,-36,39r0,133r-30,0r0,-133v0,-15,-1,-39,-26,-39v-14,0,-36,9,-36,39r0,133r-30,0","w":259},"n":{"d":"20,0r0,-193r29,0r0,23v8,-18,28,-28,47,-28v51,0,51,38,51,61r0,137r-30,0r0,-133v0,-15,-2,-39,-29,-39v-16,0,-38,11,-38,39r0,133r-30,0","k":{"y":-4,"\u00fd":-4,"\u00ff":-4}},"o":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"p":{"d":"48,-96v0,37,7,75,39,75v28,0,35,-29,35,-79v0,-42,-7,-72,-35,-72v-33,0,-39,32,-39,76xm20,63r0,-256r29,0r0,24v4,-14,21,-29,42,-29v46,0,63,41,63,98v0,44,-13,105,-63,105v-18,1,-32,-12,-41,-27r0,85r-30,0"},"q":{"d":"118,-96v0,-44,-5,-76,-38,-76v-28,0,-36,30,-36,72v0,50,8,79,36,79v32,0,38,-38,38,-75xm117,63r-1,-85v-7,17,-23,27,-40,27v-50,0,-63,-52,-63,-105v0,-57,17,-98,63,-98v22,-1,36,17,42,29r0,-24r29,0r0,256r-30,0"},"r":{"d":"20,0r0,-193r30,0v1,9,-2,22,1,29v10,-22,27,-40,55,-32r0,30v-26,-7,-56,5,-56,44r0,122r-30,0","w":106,"k":{"v":-6,"y":-6,"\u00fd":-6,"\u00ff":-6,",":27,".":27,"-":13}},"s":{"d":"107,-51v0,-56,-94,-21,-94,-94v0,-36,28,-53,61,-53v56,0,59,39,59,62r-30,0v0,-24,-7,-38,-29,-38v-10,0,-31,2,-31,29v0,50,95,21,95,90v0,41,-27,60,-63,60v-66,0,-66,-48,-66,-68r30,0v0,23,6,44,36,44v10,0,32,-5,32,-32","w":146,"k":{"w":-4}},"t":{"d":"29,-193r0,-56r30,0r0,56r34,0r0,24r-34,0r0,124v-3,21,16,23,33,20r0,25v-29,6,-72,-1,-63,-36r0,-133r-28,0r0,-24r28,0","w":93},"u":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-8,18,-27,28,-46,28v-51,0,-51,-38,-51,-61r0,-137r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0"},"v":{"d":"56,0r-52,-193r33,0r36,155r36,-155r34,0r-53,193r-34,0","w":146,"k":{",":20,".":20}},"w":{"d":"49,0r-45,-193r31,0r32,158r33,-158r35,0r33,158r30,-158r32,0r-46,193r-33,0r-35,-158r-32,158r-35,0","w":233,"k":{",":13,".":13}},"x":{"d":"55,-100r-49,-93r33,0r35,69r35,-69r33,0r-50,93r52,100r-33,0r-39,-76r-37,76r-33,0","w":146},"y":{"d":"60,4r-56,-197r33,0r39,155r33,-155r34,0r-56,206v-4,35,-31,57,-74,49r0,-23v28,7,45,-11,47,-35","w":146,"k":{"a":-4,"\u00e6":-4,"\u00e1":-4,"\u00e2":-4,"\u00e4":-4,"\u00e0":-4,"\u00e5":-4,"\u00e3":-4,",":20,".":20}},"z":{"d":"14,-167r0,-26r116,0r0,25r-86,142r86,0r0,26r-120,0r0,-24r87,-143r-83,0","w":140},"{":{"d":"1,-85r0,-21v57,-1,-6,-160,66,-151r26,0r0,24v-53,-11,-37,46,-37,91v0,37,-25,43,-32,47v8,1,32,11,32,46r0,62v-4,22,12,33,37,29r0,24v-40,1,-63,1,-65,-47v-1,-39,9,-104,-27,-104","w":93},"|":{"d":"28,5r0,-267r24,0r0,267r-24,0","w":79},"}":{"d":"93,-106r0,21v-58,0,5,160,-67,151r-25,0r0,-24v52,10,36,-47,36,-91v0,-37,25,-43,32,-47v-8,-1,-32,-11,-32,-46r0,-62v4,-21,-11,-33,-36,-29r0,-24v39,-1,62,-1,64,47v1,40,-8,104,28,104","w":93},"~":{"d":"147,-66v-25,0,-54,-27,-76,-27v-17,0,-30,16,-36,26r-15,-16v11,-15,26,-34,49,-34v25,0,53,28,76,28v17,0,30,-17,36,-27r15,17v-11,15,-26,33,-49,33","w":216},"\u00a1":{"d":"57,-127r6,190r-33,0r6,-190r21,0xm63,-194r0,35r-33,0r0,-35r33,0","w":92},"\u00a2":{"d":"82,-19r0,-155v-15,4,-29,20,-29,80v0,24,1,69,29,75xm82,36r0,-31v-42,-3,-61,-35,-61,-99v0,-46,9,-99,61,-104r0,-25r15,0r0,25v46,3,55,42,55,64r-31,0v0,-18,-6,-37,-24,-40r0,155v20,-5,24,-28,24,-48r31,0v0,30,-14,68,-55,72r0,31r-15,0","w":172},"\u00a3":{"d":"37,-24v40,-22,79,20,116,-13r13,24v-15,10,-32,18,-50,18v-35,0,-65,-27,-95,-3r-14,-23v28,-20,58,-55,37,-95r-34,0r0,-22r25,0v-8,-14,-18,-34,-18,-52v0,-41,33,-65,73,-65v42,0,71,23,71,73r-30,0v0,-27,-10,-49,-41,-49v-61,0,-41,58,-21,93r59,0r0,22r-51,0v19,40,-12,70,-40,92","w":172},"\u2044":{"d":"-59,11r157,-272r21,0r-156,272r-22,0","w":60},"\u00a5":{"d":"72,0r0,-55r-53,0r0,-22r53,0v0,-11,1,-23,-4,-29r-49,0r0,-22r40,0r-56,-122r35,0r49,117r51,-117r32,0r-54,122r39,0r0,22r-49,0v-5,6,-4,18,-4,29r53,0r0,22r-53,0r0,55r-30,0","w":172},"\u0192":{"d":"-6,62r5,-24v24,5,40,2,46,-31r28,-144r-37,0r4,-21r37,0v9,-53,18,-114,89,-98r-5,24v-45,-11,-46,36,-53,74r39,0r-4,21r-39,0r-29,148v-7,41,-35,57,-81,51","w":172},"\u00a7":{"d":"149,-208r-32,0v0,-19,-15,-30,-32,-30v-21,0,-30,15,-30,27v14,52,108,49,108,113v0,23,-15,41,-32,53v44,31,14,100,-42,100v-54,0,-66,-38,-66,-62r30,0v0,22,12,39,36,39v52,0,31,-57,1,-69v-28,-21,-79,-36,-79,-78v0,-26,14,-38,35,-51v-14,-9,-23,-27,-23,-44v0,-35,31,-52,62,-52v58,0,63,40,64,54xm41,-119v7,32,50,41,71,61v7,-4,20,-16,20,-35v0,-33,-45,-44,-67,-61v-10,7,-24,18,-24,35","w":173},"\u00a4":{"d":"33,-125v0,31,23,56,53,56v30,0,54,-25,54,-56v0,-31,-24,-55,-54,-55v-30,0,-53,24,-53,55xm6,-60r17,-17v-21,-25,-21,-70,0,-95r-17,-17r16,-16r17,17v25,-21,70,-21,95,0r17,-17r15,16r-17,17v22,25,22,70,0,95r17,17r-15,15r-17,-17v-25,21,-70,21,-95,0r-17,17","w":172},"'":{"d":"31,-166r0,-91r24,0r0,91r-24,0","w":86},"\u201c":{"d":"118,-204r0,38r-33,0v1,-42,-8,-79,33,-91r0,17v-15,7,-16,17,-16,36r16,0xm62,-204r0,38r-34,0v1,-43,-7,-79,34,-91r0,17v-15,7,-16,17,-16,36r16,0","w":146},"\u00ab":{"d":"71,-88r0,-28r51,-52r0,32r-33,34r33,34r0,31xm18,-88r0,-28r51,-52r0,32r-34,34r34,34r0,31","w":140},"\u2039":{"d":"18,-88r0,-28r51,-52r0,32r-34,34r34,34r0,31","w":86},"\u203a":{"d":"69,-116r0,28r-51,51r0,-31r33,-34r-33,-34r0,-32","w":86},"\u2013":{"d":"0,-89r0,-26r180,0r0,26r-180,0","w":180},"\u2020":{"d":"72,-183r0,-74r30,0r0,74r62,0r0,26r-62,0r0,207r-30,0r0,-207r-62,0r0,-26r62,0","w":173},"\u2021":{"d":"72,-188r0,-69r30,0r0,69r62,0r0,26r-62,0r0,114r62,0r0,26r-62,0r0,72r-30,0r0,-72r-62,0r0,-26r62,0r0,-114r-62,0r0,-26r62,0","w":173},"\u00b7":{"d":"23,-118v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":86},"\u00b6":{"d":"148,50r0,-288r-36,0r0,288r-24,0r0,-166v-44,0,-75,-30,-75,-67v-2,-75,80,-79,159,-74r0,307r-24,0","w":200},"\u2022":{"d":"26,-129v0,-35,29,-64,64,-64v35,0,64,29,64,64v0,35,-29,65,-64,65v-35,0,-64,-30,-64,-65","w":180},"\u201a":{"d":"27,0r0,-38r33,0v-1,42,8,79,-33,91r0,-17v16,-7,15,-17,15,-36r-15,0","w":86},"\u201e":{"d":"118,-38v-1,42,8,79,-33,91r0,-17v16,-7,16,-17,16,-36r-16,0r0,-38r33,0xm62,-38v-1,43,7,79,-34,91r0,-17v16,-7,16,-17,16,-36r-16,0r0,-38r34,0","w":146},"\u201d":{"d":"118,-257v-1,42,8,79,-33,91r0,-17v16,-7,16,-17,16,-36r-16,0r0,-38r33,0xm62,-257v-1,43,7,79,-34,91r0,-17v16,-7,16,-17,16,-36r-16,0r0,-38r34,0","w":146,"k":{" ":13}},"\u00bb":{"d":"122,-116r0,28r-51,51r0,-31r34,-34r-34,-34r0,-32xm69,-116r0,28r-51,51r0,-31r33,-34r-33,-34r0,-32","w":140},"\u2026":{"d":"44,0r0,-38r33,0r0,38r-33,0xm163,0r0,-38r34,0r0,38r-34,0xm283,0r0,-38r33,0r0,38r-33,0","w":360},"\u2030":{"d":"310,-14v20,0,21,-20,21,-50v0,-30,-1,-50,-21,-50v-20,0,-22,20,-22,50v0,30,2,50,22,50xm61,5r111,-260r26,0r-112,260r-25,0xm64,-136v20,0,21,-20,21,-50v0,-30,-1,-49,-21,-49v-20,0,-22,19,-22,49v0,30,2,50,22,50xm310,5v-43,0,-48,-33,-48,-69v0,-36,5,-69,48,-69v43,0,47,33,47,69v0,36,-4,69,-47,69xm64,-117v-43,0,-47,-33,-47,-69v0,-36,4,-69,47,-69v43,0,47,33,47,69v0,36,-4,69,-47,69xm198,-14v20,0,22,-20,22,-50v0,-30,-2,-50,-22,-50v-20,0,-21,20,-21,50v0,30,1,50,21,50xm198,5v-43,0,-47,-33,-47,-69v0,-36,4,-69,47,-69v43,0,48,33,48,69v0,36,-5,69,-48,69","w":373},"\u00bf":{"d":"98,-127v8,63,-54,73,-54,127v0,21,12,40,35,40v35,0,38,-34,38,-52r30,0v0,42,-21,78,-67,78v-43,0,-67,-28,-67,-67v0,-55,62,-69,57,-126r28,0xm100,-194r0,35r-33,0r0,-35r33,0","w":159},"`":{"d":"-6,-271r36,0r25,51r-22,0","w":73},"\u00b4":{"d":"19,-220r25,-51r35,0r-39,51r-21,0","w":73},"\u02c6":{"d":"-13,-220r36,-51r28,0r36,51r-28,0r-22,-31r-22,31r-28,0","w":73},"\u02dc":{"d":"17,-264v18,0,50,30,53,-2r20,0v0,18,-10,40,-31,40v-24,0,-51,-29,-56,2r-19,0v0,-21,14,-40,33,-40","w":73},"\u00af":{"d":"-11,-236r0,-19r95,0r0,19r-95,0","w":73},"\u02d8":{"d":"-8,-268r17,0v1,30,54,31,55,0r18,0v0,15,-9,46,-45,46v-36,0,-45,-31,-45,-46","w":73},"\u02d9":{"d":"23,-228r0,-37r28,0r0,37r-28,0","w":73},"\u00a8":{"d":"-6,-228r0,-37r28,0r0,37r-28,0xm52,-228r0,-37r28,0r0,37r-28,0","w":73},"\u02da":{"d":"1,-248v0,-20,16,-36,36,-36v20,0,35,16,35,36v0,20,-15,35,-35,35v-20,0,-36,-15,-36,-35xm16,-248v0,11,10,20,21,20v11,0,20,-9,20,-20v0,-11,-9,-21,-20,-21v-11,0,-21,10,-21,21","w":73},"\u00b8":{"d":"0,69r5,-12v10,4,48,7,43,-11v1,-21,-34,-3,-36,-17r21,-31r15,0v-4,7,-14,15,-14,22v18,-6,39,1,40,25v1,31,-50,38,-74,24","w":73},"\u02dd":{"d":"-18,-220r25,-51r35,0r-38,51r-22,0xm41,-220r25,-51r36,0r-39,51r-22,0","w":73},"\u02db":{"d":"1,48v0,-19,23,-51,64,-50v-31,23,-38,35,-38,47v0,22,26,17,39,9r6,12v-23,17,-71,14,-71,-18","w":73},"\u02c7":{"d":"87,-271r-37,51r-27,0r-36,-51r28,0r22,32r22,-32r28,0","w":73},"\u2014":{"d":"0,-89r0,-26r360,0r0,26r-360,0","w":360},"\u00c6":{"d":"116,-231r-50,135r54,0r0,-135r-4,0xm-3,0r99,-257r151,0r0,28r-96,0r0,81r90,0r0,28r-90,0r0,92r100,0r0,28r-131,0r0,-71r-63,0r-27,71r-33,0","w":259},"\u00aa":{"d":"52,-255v64,0,29,51,38,98v-2,8,5,12,11,9r0,15v-12,2,-34,2,-32,-16v-14,28,-71,19,-66,-17v-3,-28,28,-35,52,-40v26,-5,15,-34,-6,-32v-22,1,-21,16,-21,23r-22,0v0,-28,13,-40,46,-40xm69,-197v-12,11,-43,6,-42,30v0,9,4,18,16,18v25,-1,28,-21,26,-48","w":104},"\u0141":{"d":"-3,-71r0,-26r24,-17r0,-143r32,0r0,121r69,-50r0,25r-69,50r0,83r104,0r0,28r-136,0r0,-88","w":159,"k":{"T":34,"V":27,"W":27,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":33,"\u2019":33,"y":13,"\u00fd":13,"\u00ff":13}},"\u00d8":{"d":"58,-55r71,-170v-7,-7,-16,-11,-29,-11v-64,-4,-54,126,-42,181xm142,-202r-70,170v7,7,16,11,28,11v64,4,54,-127,42,-181xm32,9r12,-29v-22,-26,-27,-68,-27,-109v0,-65,12,-133,83,-133v17,0,30,4,40,10r9,-21r19,8r-11,27v22,26,26,68,26,109v0,65,-12,134,-83,134v-16,0,-30,-4,-40,-10r-9,22","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u0152":{"d":"180,-120r0,92r98,0r0,28r-129,0v-1,-7,2,-18,-1,-23v-6,17,-26,28,-48,28v-71,0,-83,-65,-83,-134v0,-65,12,-133,83,-133v18,0,42,8,50,25r0,-20r124,0r0,28r-94,0r0,81r88,0r0,28r-88,0xm100,-21v70,-1,48,-84,48,-146v0,-36,-1,-69,-48,-69v-45,0,-51,48,-51,107v0,59,6,108,51,108","w":286,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u00ba":{"d":"51,-255v38,0,47,30,47,61v0,32,-10,62,-47,62v-37,0,-45,-30,-45,-62v0,-31,8,-61,45,-61xm51,-149v33,-1,33,-88,0,-89v-31,1,-29,88,0,89","w":104},"\u00e6":{"d":"134,-117r65,0v1,-28,-4,-57,-32,-57v-33,0,-33,38,-33,57xm199,-63r30,0v0,21,-12,68,-61,68v-42,0,-48,-29,-52,-35v-9,21,-26,35,-54,35v-62,0,-71,-98,-16,-109v22,-11,58,-4,58,-42v0,-18,-8,-28,-28,-28v-31,1,-31,30,-31,39r-31,0v0,-44,20,-63,64,-63v26,-1,41,13,47,27v6,-16,27,-27,45,-27v59,2,62,56,61,105r-99,0v0,30,0,74,34,74v29,0,33,-30,33,-44xm104,-100v-17,15,-63,7,-63,48v0,18,8,33,27,33v50,-10,33,-41,36,-81","w":240},"\u0131":{"d":"22,0r0,-193r30,0r0,193r-30,0","w":73,"k":{"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u0142":{"d":"22,0r0,-99r-22,23r0,-28r22,-23r0,-130r30,0r0,98r21,-23r0,28r-21,23r0,131r-30,0","w":73,"k":{"w":-4}},"\u00f8":{"d":"112,-147r-52,121v38,24,58,-19,58,-70v0,-18,-1,-37,-6,-51xm48,-45r52,-122v-40,-24,-58,19,-58,71v0,19,1,37,6,51xm23,14r12,-27v-50,-53,-29,-224,75,-179r10,-21r17,7r-11,26v47,57,28,223,-76,179r-10,22","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u0153":{"d":"185,-198v59,2,62,56,61,105r-98,0v0,30,-1,74,33,74v29,0,33,-30,33,-44r30,0v0,21,-11,68,-60,68v-41,0,-51,-30,-52,-33v-9,21,-27,33,-50,33v-54,0,-68,-49,-68,-101v0,-52,14,-102,68,-102v27,0,41,11,53,33v9,-20,29,-33,50,-33xm120,-96v0,-40,-6,-78,-38,-78v-30,0,-36,38,-36,78v0,40,6,77,36,77v31,0,38,-37,38,-77xm182,-174v-33,0,-33,38,-33,57r65,0v1,-28,-4,-57,-32,-57","w":259,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00df":{"d":"17,0r0,-184v0,-45,14,-76,64,-76v65,0,87,97,24,112v34,0,51,31,51,67v1,46,-25,89,-85,81r0,-26v41,8,55,-26,54,-55v-1,-38,-18,-60,-53,-53r0,-24v24,2,40,-10,41,-38v0,-18,-6,-40,-32,-40v-31,0,-33,24,-33,47r0,189r-31,0","k":{"w":-4}},"\u00b9":{"d":"46,-101r0,-112r-34,0r0,-18v21,0,39,-2,40,-24r18,0r0,154r-24,0","w":112},"\u00ac":{"d":"175,-38r0,-78r-158,0r0,-24r182,0r0,102r-24,0","w":216},"\u00b5":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-10,24,-42,36,-67,23r0,63r-30,0r0,-256r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0"},"\u2122":{"d":"67,-109r0,-126r-48,0r0,-22r118,0r0,22r-47,0r0,126r-23,0xm305,-109r0,-122r-50,122r-15,0r-50,-122r0,122r-24,0r0,-148r35,0r47,114r46,-114r35,0r0,148r-24,0","w":356},"\u00d0":{"d":"24,0r0,-122r-21,0r0,-24r21,0r0,-111r69,0v80,0,90,57,90,128v0,65,-16,129,-87,129r-72,0xm56,-26r33,0v55,0,61,-56,61,-102v0,-50,-3,-103,-61,-103r-33,0r0,85r48,0r0,24r-48,0r0,96","w":200,"k":{"Y":7,"\u00dd":7,"\u0178":7}},"\u00bd":{"d":"27,11r156,-272r21,0r-156,272r-21,0xm11,-213r0,-18v21,0,39,-2,40,-24r18,0r0,154r-24,0r0,-112r-34,0xm245,0r-94,0v-3,-57,72,-63,72,-111v0,-13,-7,-21,-24,-21v-21,0,-22,18,-22,27r-26,0v0,-28,13,-49,50,-49v58,0,61,71,19,92v-13,11,-34,25,-40,40r65,0r0,22","w":259},"\u00b1":{"d":"17,-106r0,-24r79,0r0,-52r24,0r0,52r79,0r0,24r-79,0r0,52r-24,0r0,-52r-79,0xm17,0r0,-24r182,0r0,24r-182,0","w":216},"\u00de":{"d":"21,0r0,-257r32,0r0,50r33,0v22,0,80,0,80,74v0,63,-47,81,-113,75r0,58r-32,0xm53,-181r0,97v46,2,78,1,80,-50v2,-42,-35,-51,-80,-47","w":173},"\u00bc":{"d":"163,-55r41,0v-1,-22,2,-47,-1,-67xm144,-57r58,-97r26,0r0,99r16,0r0,19r-16,0r0,36r-24,0r0,-36r-60,0r0,-21xm33,11r157,-272r21,0r-156,272r-22,0xm12,-213r0,-18v21,0,39,-2,40,-24r18,0r0,154r-24,0r0,-112r-34,0","w":259},"\u00f7":{"d":"17,-79r0,-24r182,0r0,24r-182,0xm88,-167v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20xm88,-15v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":216},"\u00a6":{"d":"28,5r0,-106r24,0r0,106r-24,0xm28,-156r0,-106r24,0r0,106r-24,0","w":79},"\u00b0":{"d":"18,-201v0,-31,23,-54,54,-54v31,0,54,23,54,54v0,31,-23,53,-54,53v-31,0,-54,-22,-54,-53xm38,-201v0,19,15,34,34,34v19,0,34,-15,34,-34v0,-19,-15,-34,-34,-34v-19,0,-34,15,-34,34","w":144},"\u00fe":{"d":"48,-96v0,37,7,75,39,75v28,0,35,-29,35,-79v0,-42,-7,-72,-35,-72v-33,0,-39,32,-39,76xm20,63r0,-320r30,0r1,86v5,-17,24,-27,40,-27v46,0,63,41,63,98v0,44,-13,105,-63,105v-18,1,-32,-12,-41,-27r0,85r-30,0"},"\u00be":{"d":"171,-55r41,0v-1,-22,2,-47,-1,-67xm152,-57r58,-97r25,0r0,99r17,0r0,19r-17,0r0,36r-23,0r0,-36r-60,0r0,-21xm52,11r156,-272r22,0r-156,272r-22,0xm43,-171r0,-19v35,9,50,-45,15,-45v-20,0,-22,16,-22,24r-26,0v0,-26,13,-44,49,-44v59,2,58,63,14,73v18,6,35,13,35,37v0,28,-16,47,-49,47v-49,0,-52,-34,-52,-45r26,0v0,11,7,25,25,25v10,0,24,-5,24,-26v1,-19,-15,-29,-39,-27","w":259},"\u00b2":{"d":"102,-101r-94,0v-2,-56,71,-63,71,-111v0,-13,-7,-21,-24,-21v-21,0,-22,18,-22,27r-26,0v0,-28,13,-49,50,-49v58,0,61,71,19,92v-13,11,-34,26,-39,41r65,0r0,21","w":112},"\u00ae":{"d":"91,-50r0,-156v52,0,113,-8,113,46v0,28,-18,40,-42,43r45,67r-24,0r-43,-65r-26,0r0,65r-23,0xm114,-137v29,-2,68,8,67,-24v-1,-32,-38,-21,-67,-23r0,47xm10,-129v0,-74,60,-133,134,-133v74,0,134,59,134,133v0,74,-60,134,-134,134v-74,0,-134,-60,-134,-134xm144,-17v61,0,110,-50,110,-112v0,-62,-49,-111,-110,-111v-61,0,-110,49,-110,111v0,62,49,112,110,112","w":288},"\u2212":{"d":"17,-79r0,-24r182,0r0,24r-182,0","w":216},"\u00f0":{"d":"79,-169v-31,0,-37,38,-37,73v0,42,6,77,37,77v32,0,39,-35,39,-77v0,-35,-7,-73,-39,-73xm43,-214r-13,-15r25,-15v-8,-8,-18,-16,-28,-24r23,-10v9,8,18,15,26,22r27,-15r14,15r-26,14v37,37,58,78,58,146v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101v0,-60,31,-114,92,-91v-10,-15,-21,-29,-33,-42","w":159},"\u00d7":{"d":"173,-11r-65,-65r-65,65r-15,-15r65,-65r-65,-65r15,-15r65,64r65,-64r15,15r-65,65r65,65","w":216},"\u00b3":{"d":"42,-171r0,-19v21,2,34,-8,34,-25v0,-11,-6,-20,-19,-20v-20,0,-23,16,-23,24r-26,0v0,-26,13,-44,49,-44v59,1,59,63,15,73v18,6,35,13,35,37v0,28,-16,47,-49,47v-49,0,-52,-34,-52,-45r26,0v0,11,7,25,25,25v10,0,24,-5,24,-26v1,-19,-15,-29,-39,-27","w":112},"\u00a9":{"d":"195,-100r22,0v-5,37,-35,55,-71,55v-49,0,-79,-33,-79,-82v0,-92,137,-115,150,-27r-22,0v-19,-62,-104,-34,-104,27v0,34,21,61,55,61v27,0,45,-15,49,-34xm10,-129v0,-74,60,-133,134,-133v74,0,134,59,134,133v0,74,-60,134,-134,134v-74,0,-134,-60,-134,-134xm144,-17v61,0,110,-50,110,-112v0,-62,-49,-111,-110,-111v-61,0,-110,49,-110,111v0,62,49,112,110,112","w":288},"\u00c1":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm75,-271r25,-51r35,0r-39,51r-21,0","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c2":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm42,-271r37,-51r28,0r36,51r-29,0r-21,-32r-22,32r-29,0","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c4":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm49,-280r0,-36r28,0r0,36r-28,0xm108,-280r0,-36r28,0r0,36r-28,0","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c0":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm50,-322r35,0r26,51r-22,0","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c5":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm57,-300v0,-20,16,-36,36,-36v20,0,35,16,35,36v0,20,-15,36,-35,36v-20,0,-36,-16,-36,-36xm72,-300v0,11,10,21,21,21v11,0,20,-10,20,-21v0,-11,-9,-20,-20,-20v-11,0,-21,9,-21,20","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c3":{"d":"-3,0r74,-257r43,0r69,257r-33,0r-19,-71r-82,0r-19,71r-33,0xm92,-221v-15,39,-23,84,-36,125r69,0xm73,-315v19,0,49,28,53,-3r19,0v0,18,-10,40,-31,40v-24,0,-50,-28,-55,3r-19,0v0,-21,14,-40,33,-40","w":180,"k":{"p":-4,"Q":-4,"T":20,"V":7,"W":7,"Y":20,"\u00dd":20,"\u0178":20,"\u201d":20,"\u2019":20}},"\u00c7":{"d":"77,36v-13,-10,7,-21,11,-32v-62,-8,-71,-72,-71,-133v0,-65,12,-133,83,-133v53,0,75,30,76,80r-33,0v-1,-29,-10,-54,-43,-54v-44,0,-50,48,-50,107v0,59,6,108,50,108v39,0,44,-36,45,-67r33,0v-3,48,-21,92,-75,93v-2,5,-10,10,-9,15v18,-6,37,1,39,25v1,32,-49,38,-74,24r5,-12v10,4,48,7,43,-11v2,-13,-24,-15,-30,-10","w":186},"\u00c9":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,92r105,0r0,28r-137,0xm70,-271r25,-51r35,0r-39,51r-21,0"},"\u00ca":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,92r105,0r0,28r-137,0xm38,-271r36,-51r28,0r36,51r-28,0r-22,-32r-22,32r-28,0"},"\u00cb":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,92r105,0r0,28r-137,0xm45,-280r0,-36r28,0r0,36r-28,0xm103,-280r0,-36r28,0r0,36r-28,0"},"\u00c8":{"d":"21,0r0,-257r133,0r0,28r-101,0r0,81r95,0r0,28r-95,0r0,92r105,0r0,28r-137,0xm45,-322r36,0r25,51r-22,0"},"\u00cd":{"d":"21,0r0,-257r32,0r0,257r-32,0xm19,-271r25,-51r35,0r-39,51r-21,0","w":73},"\u00ce":{"d":"21,0r0,-257r32,0r0,257r-32,0xm-13,-271r36,-51r28,0r36,51r-28,0r-22,-32r-22,32r-28,0","w":73},"\u00cf":{"d":"21,0r0,-257r32,0r0,257r-32,0xm-6,-280r0,-36r28,0r0,36r-28,0xm52,-280r0,-36r28,0r0,36r-28,0","w":73},"\u00cc":{"d":"21,0r0,-257r32,0r0,257r-32,0xm-6,-322r36,0r25,51r-22,0","w":73},"\u00d1":{"d":"21,0r0,-257r41,0r86,215r0,-215r31,0r0,257r-43,0r-83,-208r0,208r-32,0xm81,-315v19,0,49,28,53,-3r19,0v0,18,-10,40,-31,40v-24,0,-50,-28,-55,3r-20,0v0,-21,15,-40,34,-40","w":200},"\u00d3":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107xm82,-271r25,-51r36,0r-39,51r-22,0","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u00d4":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107xm50,-271r36,-51r28,0r36,51r-28,0r-22,-32r-22,32r-28,0","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u00d6":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107xm57,-280r0,-36r28,0r0,36r-28,0xm115,-280r0,-36r28,0r0,36r-28,0","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u00d2":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107xm58,-322r35,0r25,51r-22,0","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u00d5":{"d":"100,-262v71,0,83,68,83,133v0,65,-12,134,-83,134v-71,0,-83,-69,-83,-134v0,-65,12,-133,83,-133xm100,-236v-44,0,-50,48,-50,107v0,59,6,108,50,108v44,0,50,-49,50,-108v0,-59,-6,-107,-50,-107xm81,-315v19,0,49,28,53,-3r19,0v0,18,-10,40,-31,40v-24,0,-50,-28,-55,3r-20,0v0,-21,15,-40,34,-40","w":200,"k":{"Y":9,"\u00dd":9,"\u0178":9,"X":9}},"\u0160":{"d":"162,-190r-32,0v0,-27,-10,-46,-40,-46v-27,0,-42,15,-42,42v0,72,121,29,121,123v0,59,-44,76,-80,76v-60,0,-78,-31,-78,-86r32,0v0,29,2,60,48,60v25,0,45,-18,45,-45v0,-73,-122,-31,-122,-125v0,-24,11,-71,76,-71v49,0,71,25,72,72xm140,-322r-36,51r-28,0r-36,-51r28,0r22,31r22,-31r28,0","w":180},"\u00da":{"d":"18,-76r0,-181r32,0r0,181v0,38,12,55,43,55v34,0,44,-19,44,-55r0,-181r32,0r0,181v0,49,-26,81,-76,81v-51,0,-75,-28,-75,-81xm76,-271r25,-51r35,0r-39,51r-21,0","w":186},"\u00db":{"d":"18,-76r0,-181r32,0r0,181v0,38,12,55,43,55v34,0,44,-19,44,-55r0,-181r32,0r0,181v0,49,-26,81,-76,81v-51,0,-75,-28,-75,-81xm44,-271r36,-51r28,0r36,51r-28,0r-22,-32r-22,32r-28,0","w":186},"\u00dc":{"d":"18,-76r0,-181r32,0r0,181v0,38,12,55,43,55v34,0,44,-19,44,-55r0,-181r32,0r0,181v0,49,-26,81,-76,81v-51,0,-75,-28,-75,-81xm50,-280r0,-36r28,0r0,36r-28,0xm109,-280r0,-36r28,0r0,36r-28,0","w":186},"\u00d9":{"d":"18,-76r0,-181r32,0r0,181v0,38,12,55,43,55v34,0,44,-19,44,-55r0,-181r32,0r0,181v0,49,-26,81,-76,81v-51,0,-75,-28,-75,-81xm51,-322r35,0r26,51r-22,0","w":186},"\u00dd":{"d":"67,-101r-68,-156r35,0r49,120r51,-120r33,0r-68,156r0,101r-32,0r0,-101xm65,-271r25,-51r36,0r-39,51r-22,0","k":{"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"i":11,"\u00ed":11,"\u00ee":11,"\u00ef":11,"\u00ec":11,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f6":27,"\u00f2":27,"\u00f5":27,",":40,".":40,"u":22,"\u00fa":22,"\u00fb":22,"\u00fc":22,"\u00f9":22,"-":27,":":13,";":13}},"\u0178":{"d":"67,-101r-68,-156r35,0r49,120r51,-120r33,0r-68,156r0,101r-32,0r0,-101xm40,-280r0,-36r28,0r0,36r-28,0xm98,-280r0,-36r28,0r0,36r-28,0","k":{"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"i":11,"\u00ed":11,"\u00ee":11,"\u00ef":11,"\u00ec":11,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f6":27,"\u00f2":27,"\u00f5":27,",":40,".":40,"u":22,"\u00fa":22,"\u00fb":22,"\u00fc":22,"\u00f9":22,"-":27,":":13,";":13}},"\u017d":{"d":"8,0r0,-27r116,-202r-109,0r0,-28r142,0r0,29r-116,200r117,0r0,28r-150,0xm134,-322r-37,51r-28,0r-36,-51r29,0r22,31r21,-31r29,0"},"\u00e1":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm62,-220r25,-51r35,0r-38,51r-22,0","w":159},"\u00e2":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm30,-220r36,-51r28,0r36,51r-28,0r-22,-31r-22,31r-28,0","w":159},"\u00e4":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm37,-228r0,-37r28,0r0,37r-28,0xm95,-228r0,-37r28,0r0,37r-28,0","w":159},"\u00e0":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm37,-271r36,0r25,51r-22,0","w":159},"\u00e5":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm44,-248v0,-20,16,-36,36,-36v20,0,36,16,36,36v0,20,-16,35,-36,35v-20,0,-36,-15,-36,-35xm59,-248v0,11,10,20,21,20v11,0,20,-9,20,-20v0,-11,-9,-21,-20,-21v-11,0,-21,10,-21,21","w":159},"\u00e3":{"d":"45,-136v-7,3,-21,0,-30,1v0,-44,19,-63,65,-63v59,0,59,35,59,55r0,108v-3,12,7,20,16,14r0,21v-19,3,-43,7,-46,-23v-23,46,-99,33,-99,-28v0,-46,41,-57,77,-66v39,-10,25,-57,-9,-57v-33,0,-33,31,-33,38xm108,-105v-19,21,-66,11,-66,53v0,19,6,33,27,33v40,0,42,-43,39,-86xm60,-264v18,0,50,30,53,-2r20,0v0,18,-10,40,-31,40v-24,0,-51,-29,-56,2r-19,0v0,-21,14,-40,33,-40","w":159},"\u00e7":{"d":"60,36v-13,-9,6,-21,11,-31v-42,-4,-59,-36,-59,-99v0,-48,9,-104,68,-104v53,0,62,42,62,64r-30,0v0,-19,-8,-40,-31,-40v-19,0,-38,9,-38,80v0,25,1,75,37,75v26,0,32,-27,32,-48r30,0v0,29,-14,67,-56,72v-2,5,-10,10,-9,15v18,-6,37,1,39,25v1,32,-49,38,-74,24r6,-12v9,4,48,7,42,-11v2,-13,-24,-15,-30,-10","w":153,"k":{"l":7,"\u0142":7,"y":7,"\u00fd":7,"\u00ff":7}},"\u00e9":{"d":"46,-117r69,0v1,-28,-3,-57,-34,-57v-35,0,-35,38,-35,57xm147,-93r-102,0v0,30,0,74,37,74v29,0,33,-30,33,-44r30,0v0,21,-12,68,-65,68v-47,0,-67,-33,-67,-99v0,-48,10,-104,69,-104v64,0,65,56,65,105xm62,-220r25,-51r35,0r-38,51r-22,0","w":159},"\u00ea":{"d":"46,-117r69,0v1,-28,-3,-57,-34,-57v-35,0,-35,38,-35,57xm147,-93r-102,0v0,30,0,74,37,74v29,0,33,-30,33,-44r30,0v0,21,-12,68,-65,68v-47,0,-67,-33,-67,-99v0,-48,10,-104,69,-104v64,0,65,56,65,105xm30,-220r36,-51r28,0r36,51r-28,0r-22,-31r-22,31r-28,0","w":159},"\u00eb":{"d":"46,-117r69,0v1,-28,-3,-57,-34,-57v-35,0,-35,38,-35,57xm147,-93r-102,0v0,30,0,74,37,74v29,0,33,-30,33,-44r30,0v0,21,-12,68,-65,68v-47,0,-67,-33,-67,-99v0,-48,10,-104,69,-104v64,0,65,56,65,105xm37,-228r0,-37r28,0r0,37r-28,0xm95,-228r0,-37r28,0r0,37r-28,0","w":159},"\u00e8":{"d":"46,-117r69,0v1,-28,-3,-57,-34,-57v-35,0,-35,38,-35,57xm147,-93r-102,0v0,30,0,74,37,74v29,0,33,-30,33,-44r30,0v0,21,-12,68,-65,68v-47,0,-67,-33,-67,-99v0,-48,10,-104,69,-104v64,0,65,56,65,105xm37,-271r36,0r25,51r-22,0","w":159},"\u00ed":{"d":"22,0r0,-193r30,0r0,193r-30,0xm19,-220r25,-51r35,0r-39,51r-21,0","w":73},"\u00ee":{"d":"22,0r0,-193r30,0r0,193r-30,0xm-13,-220r36,-51r28,0r36,51r-28,0r-22,-31r-22,31r-28,0","w":73},"\u00ef":{"d":"22,0r0,-193r30,0r0,193r-30,0xm-6,-228r0,-37r28,0r0,37r-28,0xm52,-228r0,-37r28,0r0,37r-28,0","w":73},"\u00ec":{"d":"22,0r0,-193r30,0r0,193r-30,0xm-6,-271r36,0r25,51r-22,0","w":73},"\u00f1":{"d":"20,0r0,-193r29,0r0,23v8,-18,28,-28,47,-28v51,0,51,38,51,61r0,137r-30,0r0,-133v0,-15,-2,-39,-29,-39v-16,0,-38,11,-38,39r0,133r-30,0xm64,-264v18,1,49,29,53,-2r19,0v0,18,-10,40,-31,40v-24,0,-50,-28,-55,2r-19,0v0,-21,14,-40,33,-40","k":{"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00f3":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77xm62,-220r25,-51r35,0r-38,51r-22,0","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00f4":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77xm30,-220r36,-51r28,0r36,51r-28,0r-22,-31r-22,31r-28,0","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00f6":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77xm37,-228r0,-37r28,0r0,37r-28,0xm95,-228r0,-37r28,0r0,37r-28,0","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00f2":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77xm37,-271r36,0r25,51r-22,0","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u00f5":{"d":"10,-96v0,-54,15,-102,70,-102v56,0,69,48,69,102v0,54,-14,101,-69,101v-56,0,-70,-47,-70,-101xm79,-19v32,0,39,-35,39,-77v0,-42,-7,-78,-39,-78v-31,0,-37,36,-37,78v0,42,6,77,37,77xm60,-264v18,0,50,30,53,-2r20,0v0,18,-10,40,-31,40v-24,0,-51,-29,-56,2r-19,0v0,-21,14,-40,33,-40","w":159,"k":{"w":-4,"y":-4,"\u00fd":-4,"\u00ff":-4}},"\u0161":{"d":"107,-51v0,-56,-94,-21,-94,-94v0,-36,28,-53,61,-53v56,0,59,39,59,62r-30,0v0,-24,-7,-38,-29,-38v-10,0,-31,2,-31,29v0,50,95,21,95,90v0,41,-27,60,-63,60v-66,0,-66,-48,-66,-68r30,0v0,23,6,44,36,44v10,0,32,-5,32,-32xm123,-271r-36,51r-28,0r-36,-51r28,0r22,32r22,-32r28,0","w":146,"k":{"w":-4}},"\u00fa":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-8,18,-27,28,-46,28v-51,0,-51,-38,-51,-61r0,-137r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0xm66,-220r25,-51r35,0r-39,51r-21,0"},"\u00fb":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-8,18,-27,28,-46,28v-51,0,-51,-38,-51,-61r0,-137r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0xm33,-220r37,-51r28,0r36,51r-29,0r-21,-31r-22,31r-29,0"},"\u00fc":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-8,18,-27,28,-46,28v-51,0,-51,-38,-51,-61r0,-137r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0xm40,-228r0,-37r28,0r0,37r-28,0xm99,-228r0,-37r28,0r0,37r-28,0"},"\u00f9":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-8,18,-27,28,-46,28v-51,0,-51,-38,-51,-61r0,-137r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0xm41,-271r35,0r26,51r-22,0"},"\u00fd":{"d":"60,4r-56,-197r33,0r39,155r33,-155r34,0r-56,206v-4,35,-31,57,-74,49r0,-23v28,7,45,-11,47,-35xm55,-220r25,-51r36,0r-39,51r-22,0","w":146,"k":{"a":-4,"\u00e6":-4,"\u00e1":-4,"\u00e2":-4,"\u00e4":-4,"\u00e0":-4,"\u00e5":-4,"\u00e3":-4,",":20,".":20}},"\u00ff":{"d":"60,4r-56,-197r33,0r39,155r33,-155r34,0r-56,206v-4,35,-31,57,-74,49r0,-23v28,7,45,-11,47,-35xm30,-228r0,-37r28,0r0,37r-28,0xm88,-228r0,-37r28,0r0,37r-28,0","w":146,"k":{"a":-4,"\u00e6":-4,"\u00e1":-4,"\u00e2":-4,"\u00e4":-4,"\u00e0":-4,"\u00e5":-4,"\u00e3":-4,",":20,".":20}},"\u017e":{"d":"14,-167r0,-26r116,0r0,25r-86,142r86,0r0,26r-120,0r0,-24r87,-143r-83,0xm120,-271r-36,51r-28,0r-36,-51r28,0r22,32r22,-32r28,0","w":140},"\u2206":{"d":"10,0r0,-18r77,-239r31,0r75,238r0,19r-183,0xm37,-23r128,0r-63,-198r-2,0","w":203},"\u2126":{"d":"15,-23v14,-1,33,2,45,-1v-22,-24,-41,-63,-41,-112v0,-70,40,-119,93,-119v56,0,90,55,90,117v0,52,-22,91,-42,115r46,0r0,23r-75,0r0,-17v50,-28,69,-213,-20,-213v-40,0,-65,43,-65,99v0,52,22,97,44,114r0,17r-75,0r0,-23","w":221},"\u03bc":{"d":"147,-193r0,193r-29,0v-1,-7,2,-18,-1,-23v-10,24,-42,36,-67,23r0,63r-30,0r0,-256r30,0r0,133v0,15,1,39,28,39v16,0,39,-11,39,-39r0,-133r30,0"},"\u03c0":{"d":"172,-162r-24,0v1,48,-4,126,5,162r-27,0v-9,-34,-4,-115,-5,-162r-54,0v-1,45,-10,126,-22,162r-27,0v12,-40,22,-115,23,-162v-19,0,-28,2,-34,4r-4,-19v35,-18,118,-7,172,-10","w":181},"\u20ac":{"d":"167,-238r-11,26v-13,-11,-25,-19,-42,-19v-40,0,-48,36,-51,69r82,0r-7,21r-76,0r0,20r70,0r-8,22r-62,0v1,33,7,80,50,80v21,0,37,-10,52,-23r0,32v-17,11,-34,15,-55,15v-64,0,-77,-50,-80,-104r-22,0r7,-22r14,0r1,-20r-23,0r8,-21r16,0v5,-50,24,-94,82,-94v22,0,37,6,55,18","w":172},"\u2113":{"d":"135,-50r13,11v-14,28,-34,42,-59,42v-41,0,-54,-32,-54,-71v-5,5,-12,10,-18,15r-8,-15r26,-25r0,-97v0,-63,25,-85,50,-85v26,0,40,24,40,57v0,44,-25,87,-64,129v-3,39,11,70,33,70v19,0,33,-16,41,-31xm86,-254v-30,0,-25,93,-25,137v26,-32,46,-67,46,-101v0,-22,-6,-36,-21,-36","w":154},"\u212e":{"d":"65,-49v36,61,143,59,185,4r20,0v-26,30,-68,50,-114,50v-80,0,-144,-58,-144,-130v0,-72,64,-130,144,-130v81,1,147,58,145,134r-236,1r0,71xm248,-202v-36,-57,-135,-58,-179,-7v-8,18,-5,59,-2,81r179,0v6,-20,0,-51,2,-74","w":313},"\u2202":{"d":"33,-240r-9,-22v64,-44,134,-9,134,116v0,91,-29,149,-83,149v-41,0,-61,-39,-61,-82v0,-57,32,-93,68,-93v27,0,44,20,49,30v10,-82,-44,-147,-98,-98xm41,-78v0,35,13,57,37,57v28,0,47,-44,51,-93v-5,-15,-20,-34,-43,-34v-25,0,-45,32,-45,70","w":174},"\u220f":{"d":"212,-225r-33,0r0,260r-26,0r0,-260r-85,0r0,260r-26,0r0,-260r-33,0r0,-26r203,0r0,26","w":221},"\u2211":{"d":"168,35r-160,0r0,-20r83,-123r-80,-123r0,-20r151,0r0,24v-37,2,-81,-4,-114,2r74,112r-81,121r127,0r0,27","w":174},"\u2219":{"d":"23,-118v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,20,-20,20v-11,0,-20,-9,-20,-20","w":86},"\u221a":{"d":"184,-299r-71,352r-23,0r-50,-166r-24,9r-5,-17r46,-18r38,127v3,10,3,24,7,29r62,-316r20,0","w":184},"\u221e":{"d":"240,-104v0,33,-24,54,-51,54v-21,0,-37,-12,-60,-39v-17,20,-36,39,-63,39v-27,0,-50,-23,-50,-53v0,-31,22,-53,52,-53v25,0,44,18,62,39v16,-18,33,-39,61,-39v28,0,49,21,49,52xm34,-102v0,19,14,35,35,35v21,0,36,-20,50,-35v-15,-18,-29,-38,-52,-38v-21,0,-33,18,-33,38xm189,-140v-22,0,-39,24,-50,36v21,24,33,37,51,37v21,0,32,-19,32,-36v0,-23,-14,-37,-33,-37","w":255},"\u222b":{"d":"45,-216v0,-63,19,-101,68,-86r-4,19v-36,-9,-38,22,-38,70v0,57,4,121,4,180v0,67,-18,101,-69,86r5,-21v33,10,39,-14,39,-65v0,-60,-5,-125,-5,-183","w":120},"\u2248":{"d":"58,-152v40,0,72,52,95,0r12,9v-8,18,-22,33,-42,33v-22,0,-46,-24,-67,-25v-15,0,-22,12,-30,25r-12,-9v9,-20,25,-33,44,-33xm58,-95v40,0,72,51,95,0r12,9v-9,18,-22,33,-42,33v-21,0,-44,-25,-66,-25v-15,0,-23,12,-31,25r-12,-9v9,-20,25,-33,44,-33","w":178},"\u2260":{"d":"128,-175r-14,32r48,0r0,18r-55,0r-21,47r76,0r0,18r-82,0r-17,37r-14,-5r14,-32r-47,0r0,-18r54,0r21,-47r-75,0r0,-18r82,0r16,-37","w":178},"\u2264":{"d":"161,-37r-143,-76r0,-19r143,-76r0,22r-125,64r125,63r0,22xm162,-5r-145,0r0,-19r145,0r0,19","w":178},"\u2265":{"d":"19,-208r143,76r0,19r-143,76r0,-22r124,-64r-124,-63r0,-22xm162,-5r-145,0r0,-19r145,0r0,19","w":178},"\u25ca":{"d":"167,-125r-64,139r-22,0r-63,-139r64,-140r22,0xm142,-125r-50,-115v-12,42,-34,76,-50,114v16,39,38,73,49,116","w":185},"\u00a0":{"w":86},"\u00ad":{"d":"19,-88r0,-28r88,0r0,28r-88,0","w":126},"\u02c9":{"d":"-11,-236r0,-19r95,0r0,19r-95,0","w":73},"\u03a9":{"d":"15,-23v14,-1,33,2,45,-1v-22,-24,-41,-63,-41,-112v0,-70,40,-119,93,-119v56,0,90,55,90,117v0,52,-22,91,-42,115r46,0r0,23r-75,0r0,-17v50,-28,69,-213,-20,-213v-40,0,-65,43,-65,99v0,52,22,97,44,114r0,17r-75,0r0,-23","w":221},"\u2215":{"d":"-59,11r157,-272r21,0r-156,272r-22,0","w":60}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright © 1990, 2002 Adobe Systems Incorporated.  All Rights Reserved. ©
 * 1981, 2002 Heidelberger Druckmaschinen AG. All rights reserved.
 * 
 * Trademark:
 * Helvetica is a trademark of Heidelberger Druckmaschinen AG, exclusively
 * licensed through Linotype Library GmbH, and may be registered in certain
 * jurisdictions.
 * 
 * Full name:
 * HelveticaNeueLTStd-HvCn
 * 
 * Designer:
 * Linotype Staff
 * 
 * Vendor URL:
 * http://www.adobe.com/type
 * 
 * License information:
 * http://www.adobe.com/type/legal.html
 */
Cufon.registerFont({"w":93,"face":{"font-family":"Helvetica Neue 87","font-weight":750,"font-stretch":"condensed","units-per-em":"360","panose-1":"2 11 8 6 4 7 2 4 2 4","ascent":"257","descent":"-103","x-height":"5","bbox":"-60 -351 396 82.6813","underline-thickness":"18","underline-position":"-18","stemh":"45","stemv":"58","unicode-range":"U+0020-U+FB02"},"glyphs":{" ":{"k":{"\u201c":13,"\u2018":13}},"!":{"d":"31,-173r0,-84r58,0v1,64,-2,125,-6,184r-45,0xm32,0r0,-54r57,0r0,54r-57,0","w":120},"\"":{"d":"100,-131r0,-126r47,0r0,126r-47,0xm26,-131r0,-126r47,0r0,126r-47,0","w":173},"#":{"d":"24,0r8,-62r-26,0r0,-40r32,0r6,-46r-26,0r0,-40r32,0r8,-62r40,0r-8,62r26,0r8,-62r40,0r-9,62r26,0r0,40r-32,0r-6,46r26,0r0,40r-32,0r-8,62r-40,0r9,-62r-26,0r-9,62r-39,0xm103,-102r7,-46r-26,0r-7,46r26,0","w":187},"$":{"d":"117,-181v0,-20,-5,-34,-24,-34v-15,0,-24,9,-24,26v0,53,111,26,111,114v0,53,-28,76,-74,80r0,32r-28,0r0,-32v-42,-1,-76,-25,-70,-81r58,0v-1,23,2,41,26,41v21,0,27,-16,27,-29v0,-54,-110,-23,-110,-117v0,-38,18,-70,69,-74r0,-27r28,0r0,27v52,5,70,32,69,74r-58,0","w":187},"%":{"d":"49,-186v0,28,4,39,15,39v13,0,14,-10,14,-41v0,-32,-4,-37,-14,-37v-13,0,-15,17,-15,39xm66,5r113,-260r36,0r-113,260r-36,0xm202,-64v0,28,3,39,14,39v13,0,15,-10,15,-41v0,-32,-5,-37,-15,-37v-13,0,-14,17,-14,39xm7,-186v0,-41,11,-69,57,-69v51,0,57,31,57,69v0,38,-6,69,-57,69v-51,0,-57,-31,-57,-69xm159,-64v0,-41,11,-69,57,-69v51,0,57,31,57,69v0,38,-5,69,-56,69v-51,0,-58,-31,-58,-69","w":280},"&":{"d":"100,-226v-29,3,-18,41,-1,55v22,-11,34,-52,1,-55xm123,-53r-38,-52v-33,17,-27,63,11,65v10,0,20,-5,27,-13xm125,-135r33,45v7,-10,9,-22,10,-34r52,0v-2,29,-9,54,-30,76r35,48r-64,0r-11,-16v-19,13,-38,21,-64,21v-59,0,-79,-40,-79,-72v0,-37,20,-54,50,-76v-10,-14,-25,-38,-25,-57v0,-40,31,-60,70,-60v37,0,68,19,68,58v0,32,-21,49,-45,67","w":226},"\u2019":{"d":"75,-257v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0r0,-63r56,0","k":{"\u2019":13,"r":13,"s":20,"\u0161":20}},"(":{"d":"115,66r-47,0v-27,-44,-50,-101,-50,-161v0,-60,23,-118,50,-162r47,0v-51,70,-53,253,0,323","w":113},")":{"d":"-2,-257r47,0v27,44,51,102,51,162v0,60,-24,117,-51,161r-47,0v22,-37,42,-95,42,-161v0,-66,-20,-125,-42,-162","w":113},"*":{"d":"3,-195r10,-31r45,18r-1,-49r33,0r-1,49r44,-18r11,31r-45,15r29,39r-26,19r-29,-39r-28,39r-26,-19r29,-39","w":146},"+":{"d":"85,0r0,-68r-68,0r0,-46r68,0r0,-68r46,0r0,68r68,0r0,46r-68,0r0,68r-46,0","w":216},",":{"d":"19,-2r0,-63r56,0v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0","k":{"\u201d":27,"\u2019":27," ":13}},"-":{"d":"12,-80r0,-49r109,0r0,49r-109,0","w":133},".":{"d":"19,0r0,-65r56,0r0,65r-56,0","k":{"\u201d":27,"\u2019":27," ":13}},"\/":{"d":"-2,5r82,-267r49,0r-82,267r-49,0","w":126},"0":{"d":"70,-125v0,72,3,92,24,92v21,0,23,-20,23,-92v0,-73,-2,-92,-23,-92v-21,0,-24,19,-24,92xm177,-125v0,73,-7,130,-83,130v-76,0,-84,-48,-84,-130v0,-73,8,-130,84,-130v76,0,83,48,83,130","w":187},"1":{"d":"71,0r0,-177r-49,0r0,-38v46,3,67,-22,67,-40r42,0r0,255r-60,0","w":187},"2":{"d":"12,0v-7,-94,102,-129,102,-183v0,-20,-4,-34,-21,-34v-23,0,-23,28,-23,47r-56,0v-2,-57,24,-85,82,-85v62,0,79,31,79,71v12,58,-77,104,-90,137r90,0r0,47r-163,0","w":187},"3":{"d":"14,-180v0,-53,28,-75,82,-75v50,0,74,21,74,70v1,27,-15,45,-36,52v30,6,42,25,42,61v0,55,-36,77,-81,77v-50,0,-83,-15,-83,-80r58,0v0,23,4,42,22,42v15,0,23,-9,23,-38v1,-40,-13,-41,-46,-40r0,-38v31,3,44,-6,43,-39v0,-20,-7,-29,-21,-29v-13,0,-23,8,-23,37r-54,0","w":187},"4":{"d":"99,-96r0,-85r-43,85r43,0xm8,-49r0,-47r83,-154r65,0r0,154r23,0r0,47r-23,0r0,49r-57,0r0,-49r-91,0","w":187},"5":{"d":"10,-75r58,0v-1,21,1,42,22,42v19,0,23,-20,23,-55v0,-30,-6,-44,-22,-44v-11,0,-20,5,-22,20r-56,0r8,-138r142,0r0,47r-96,0v0,16,-4,35,-2,49v6,-13,26,-21,42,-21v46,0,67,27,67,89v0,65,-27,91,-84,91v-57,-1,-83,-28,-80,-80","w":187},"6":{"d":"114,-190v1,-15,-4,-27,-18,-27v-19,0,-28,20,-25,72v8,-15,23,-22,45,-22v39,0,61,22,61,79v0,51,-16,93,-83,93v-75,0,-84,-48,-84,-124v0,-85,6,-136,88,-136v46,0,73,19,74,65r-58,0xm95,-33v17,0,22,-16,22,-44v0,-31,-4,-45,-23,-45v-18,0,-22,17,-22,40v0,30,5,49,23,49","w":187},"7":{"d":"116,-199r-104,0r0,-51r162,0r0,45v-39,59,-66,148,-69,205r-63,0v4,-59,37,-151,74,-199","w":187},"8":{"d":"94,-255v57,0,77,26,77,66v0,28,-13,49,-36,54v27,4,43,26,43,60v0,43,-15,80,-84,80v-69,0,-85,-34,-85,-80v0,-28,12,-56,42,-60v-22,-6,-35,-24,-35,-54v0,-39,21,-66,78,-66xm94,-152v14,0,21,-8,21,-33v0,-18,-5,-32,-21,-32v-16,0,-22,14,-22,32v0,25,8,33,22,33xm94,-114v-19,0,-25,17,-25,40v0,23,6,41,25,41v19,0,24,-18,24,-41v0,-23,-5,-40,-24,-40","w":187},"9":{"d":"73,-60v0,14,4,27,18,27v19,0,28,-20,25,-72v-8,15,-23,22,-45,22v-39,0,-61,-22,-61,-79v0,-51,16,-93,83,-93v75,0,84,48,84,124v0,85,-6,136,-88,136v-46,0,-73,-19,-74,-65r58,0xm93,-127v18,0,22,-18,22,-41v0,-30,-4,-49,-22,-49v-17,0,-23,17,-23,45v0,31,4,45,23,45","w":187},":":{"d":"19,0r0,-65r56,0r0,65r-56,0xm19,-127r0,-65r56,0r0,65r-56,0"},";":{"d":"19,-2r0,-63r56,0v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0xm19,-127r0,-65r56,0r0,65r-56,0"},"<":{"d":"17,-68r0,-46r182,-71r0,47r-122,47r122,47r0,47","w":216},"=":{"d":"17,-107r0,-47r182,0r0,47r-182,0xm17,-28r0,-47r182,0r0,47r-182,0","w":216},">":{"d":"199,-114r0,46r-182,71r0,-47r122,-47r-122,-47r0,-47","w":216},"?":{"d":"60,-73v-9,-71,50,-69,50,-125v0,-17,-5,-26,-20,-26v-15,0,-22,13,-22,47r-54,0v-2,-54,21,-85,75,-85v49,0,77,26,77,70v-1,68,-59,68,-52,119r-54,0xm59,0r0,-54r56,0r0,54r-56,0","w":180},"@":{"d":"134,-86v41,3,61,-75,15,-78v-40,-3,-62,74,-15,78xm189,-176r5,-18r31,0r-23,104v0,5,3,8,7,8v15,0,37,-24,37,-63v0,-53,-43,-83,-96,-83v-61,0,-101,44,-101,100v0,57,45,99,104,99v32,0,59,-10,78,-22r32,0v-65,103,-253,52,-253,-78v0,-76,63,-133,140,-133v66,0,128,43,128,109v0,76,-67,103,-90,103v-13,0,-22,-6,-23,-19v-30,34,-97,21,-97,-42v0,-62,79,-125,121,-65","w":288},"A":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"B":{"d":"19,0r0,-257v75,1,167,-15,167,63v0,31,-19,52,-41,59v19,3,48,11,48,64v0,30,-13,71,-85,71r-89,0xm79,-212r0,58v28,3,48,-6,46,-31v3,-19,-19,-31,-46,-27xm79,-114r0,69v31,3,52,-7,51,-33v-2,-34,-20,-38,-51,-36","w":206},"C":{"d":"185,-168r-59,0v0,-37,-4,-54,-24,-54v-24,0,-26,24,-26,91v0,76,2,96,27,96v22,0,26,-26,26,-66r58,0v1,62,-12,106,-91,106v-77,0,-83,-58,-83,-135v0,-66,3,-132,89,-132v57,0,86,28,83,94","w":193},"D":{"d":"19,0r0,-257r89,0v60,0,86,31,86,120v0,93,-12,137,-92,137r-83,0xm79,-212r0,167v47,1,54,-1,54,-88v0,-73,-5,-81,-54,-79","w":206,"k":{"V":6,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9}},"E":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,59r92,0r0,49r-152,0","w":180},"F":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,108r-60,0","w":173,"k":{"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13,",":40,".":40}},"G":{"d":"186,-179r-59,0v0,-17,-2,-43,-24,-43v-25,0,-27,26,-27,94v0,70,3,93,27,93v24,0,29,-28,28,-63r-28,0r0,-40r84,0r0,138r-41,0r-2,-24v-9,23,-33,29,-56,29v-64,0,-75,-48,-75,-128v0,-84,5,-139,91,-139v78,0,82,54,82,83","w":200,"k":{".":9}},"H":{"d":"19,0r0,-257r60,0r0,96r48,0r0,-96r61,0r0,257r-61,0r0,-110r-48,0r0,110r-60,0","w":206},"I":{"d":"20,0r0,-257r60,0r0,257r-60,0","w":100},"J":{"d":"101,-77r0,-180r60,0r0,180v0,48,-19,82,-79,82v-60,0,-79,-31,-76,-87r56,0v0,21,-3,46,20,47v17,0,19,-18,19,-42","w":180,"k":{",":9,".":9,"a":4,"\u00e6":4,"\u00e1":4,"\u00e2":4,"\u00e4":4,"\u00e0":4,"\u00e5":4,"\u00e3":4,"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2}},"K":{"d":"19,0r0,-257r60,0r1,101r56,-101r66,0r-68,111r76,146r-68,0r-47,-97r-16,25r0,72r-60,0","w":206,"k":{"y":11,"\u00fd":11,"\u00ff":11,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4}},"L":{"d":"19,0r0,-257r60,0r0,208r88,0r0,49r-148,0","w":166,"k":{"y":20,"\u00fd":20,"\u00ff":20,"T":27,"V":27,"W":27,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":33,"\u2019":33}},"M":{"d":"21,0r0,-257r88,0r32,169r31,-169r88,0r0,257r-57,0r0,-200r-40,200r-46,0r-42,-200r0,200r-54,0","w":280},"N":{"d":"19,0r0,-257r69,0r51,167r0,-167r56,0r0,257r-69,0r-53,-177r0,177r-54,0","w":213},"O":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"P":{"d":"19,0r0,-257r93,0v64,0,76,46,76,78v0,55,-38,86,-109,79r0,100r-60,0xm79,-212r0,67v30,4,50,-8,47,-32v2,-26,-16,-39,-47,-35","w":200,"k":{"\u00e4":13,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,",":58,".":58,"a":13,"\u00e6":13,"\u00e1":13,"\u00e2":13,"\u00e0":13,"\u00e5":13,"\u00e3":13,"e":13,"\u00e9":13,"\u00ea":13,"\u00eb":13,"\u00e8":13,"o":13,"\u00f8":13,"\u0153":13,"\u00f3":13,"\u00f4":13,"\u00f6":13,"\u00f2":13,"\u00f5":13}},"Q":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm134,1v-8,2,-19,5,-31,4v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133v0,41,-1,79,-19,104r29,30r-36,32","w":206},"R":{"d":"79,-215r0,66v30,4,53,-11,50,-33v3,-26,-19,-36,-50,-33xm19,0r0,-257r101,0v87,-6,88,118,26,130v39,5,42,29,42,64v0,55,4,52,11,63r-65,0v-5,-9,-7,-23,-7,-52v0,-59,-9,-54,-48,-54r0,106r-60,0","w":206,"k":{"T":6,"Y":11,"\u00dd":11,"\u0178":11}},"S":{"d":"120,-186v0,-22,-4,-36,-24,-36v-15,0,-24,9,-24,28v0,54,111,26,111,117v0,58,-33,82,-88,82v-50,0,-92,-19,-85,-83r59,0v-1,23,2,43,26,43v21,0,27,-16,27,-31v0,-55,-110,-24,-110,-120v0,-41,22,-76,84,-76v62,0,83,30,82,76r-58,0","w":193},"T":{"d":"56,0r0,-208r-54,0r0,-49r169,0r0,49r-54,0r0,208r-61,0","w":172,"k":{"\u00fc":27,"\u00f2":27,"\u00f6":27,"\u00ec":6,"\u00ee":6,"\u00ed":6,"\u00e8":27,"\u00eb":27,"\u00ea":27,"\u00e3":27,"\u00e5":27,"\u00e0":27,"\u00e4":27,"\u00e2":27,"w":27,"y":27,"\u00fd":27,"\u00ff":27,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"A":20,"\u00c6":20,"\u00c1":20,"\u00c2":20,"\u00c4":20,"\u00c0":20,"\u00c5":20,"\u00c3":20,",":33,".":33,"a":27,"\u00e6":27,"\u00e1":27,"e":27,"\u00e9":27,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f5":27,"-":27,"i":6,"\u00ef":6,"r":27,"u":27,"\u00fa":27,"\u00fb":27,"\u00f9":27,":":27,";":27}},"U":{"d":"185,-257r0,172v0,50,-15,90,-85,90v-70,0,-85,-40,-85,-90r0,-172r61,0r0,190v0,20,8,32,24,32v16,0,24,-12,24,-32r0,-190r61,0","w":200,"k":{"A":4,"\u00c6":4,"\u00c1":4,"\u00c2":4,"\u00c4":4,"\u00c0":4,"\u00c5":4,"\u00c3":4}},"V":{"d":"57,0r-56,-257r65,0r31,199r31,-199r65,0r-59,257r-77,0","w":193,"k":{"\u00f6":6,"\u00f4":6,"\u00e8":6,"\u00eb":6,"\u00ea":6,"\u00e3":11,"\u00e5":11,"\u00e0":11,"\u00e4":11,"\u00e2":11,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13,",":33,".":33,"a":11,"\u00e6":11,"\u00e1":11,"e":6,"\u00e9":6,"o":6,"\u00f8":6,"\u0153":6,"\u00f3":6,"\u00f2":6,"\u00f5":6,"-":6,"u":6,"\u00fa":6,"\u00fb":6,"\u00fc":6,"\u00f9":6,":":6,";":6}},"W":{"d":"48,0r-46,-257r61,0r23,183r26,-183r56,0r30,183r22,-183r58,0r-45,257r-67,0r-27,-183r-25,183r-66,0","w":280,"k":{"\u00f6":6,"\u00ea":6,"\u00e4":6,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13,",":27,".":27,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"e":6,"\u00e9":6,"\u00eb":6,"\u00e8":6,"o":6,"\u00f8":6,"\u0153":6,"\u00f3":6,"\u00f4":6,"\u00f2":6,"\u00f5":6,"-":6}},"X":{"d":"1,0r63,-131r-57,-126r67,0r27,79r26,-79r67,0r-59,126r64,131r-69,0r-31,-85r-31,85r-67,0","w":200},"Y":{"d":"66,0r0,-101r-65,-156r67,0r30,95r29,-95r65,0r-65,156r0,101r-61,0","w":192,"k":{"\u00fc":20,"\u00f6":27,"O":13,"\u00d8":13,"\u0152":13,"\u00d3":13,"\u00d4":13,"\u00d6":13,"\u00d2":13,"\u00d5":13,"A":33,"\u00c6":33,"\u00c1":33,"\u00c2":33,"\u00c4":33,"\u00c0":33,"\u00c5":33,"\u00c3":33,",":40,".":40,"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f2":27,"\u00f5":27,"-":27,"i":9,"\u00ed":9,"\u00ee":9,"\u00ef":9,"\u00ec":9,"u":20,"\u00fa":20,"\u00fb":20,"\u00f9":20,":":13,";":13,"S":9,"\u0160":9}},"Z":{"d":"8,0r0,-45r87,-163r-80,0r0,-49r150,0r0,42r-88,166r88,0r0,49r-157,0","w":173},"[":{"d":"30,66r0,-323r91,0r0,40r-37,0r0,243r37,0r0,40r-91,0","w":119},"\\":{"d":"80,5r-82,-267r49,0r82,267r-49,0","w":126},"]":{"d":"-1,66r0,-40r37,0r0,-243r-37,0r0,-40r91,0r0,323r-91,0","w":119},"^":{"d":"20,-111r67,-139r42,0r67,139r-45,0r-43,-90r-43,90r-45,0","w":216},"_":{"d":"0,45r0,-18r180,0r0,18r-180,0","w":180},"\u2018":{"d":"19,-131v2,-62,-14,-120,56,-126r0,28v-16,0,-22,11,-22,35r22,0r0,63r-56,0","k":{"\u2018":13,"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13}},"a":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61","w":180},"b":{"d":"16,0r0,-257r59,0r0,83v10,-21,28,-26,44,-26v48,0,56,44,56,104v0,73,-21,101,-60,101v-27,1,-37,-18,-43,-29r0,24r-56,0xm73,-96v0,38,4,59,21,59v22,0,23,-31,23,-62v0,-35,-1,-58,-22,-58v-20,0,-22,26,-22,61","w":186,"k":{"v":4,"y":6,"\u00fd":6,"\u00ff":6}},"c":{"d":"166,-121r-54,0v0,-28,-7,-41,-22,-41v-19,0,-22,25,-22,65v0,44,3,64,22,64v17,0,21,-12,22,-46r54,0v0,60,-24,84,-77,84v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v61,0,77,33,77,79","w":173,"k":{"y":6,"\u00fd":6,"\u00ff":6}},"d":{"d":"114,0r0,-24v-4,13,-16,29,-42,29v-39,0,-60,-28,-60,-101v0,-60,8,-104,56,-104v16,0,34,5,44,26r0,-83r59,0r0,257r-57,0xm113,-96v0,-35,-1,-61,-21,-61v-21,0,-22,23,-22,58v0,31,1,62,23,62v17,0,20,-21,20,-59","w":186},"e":{"d":"166,-88r-98,0v-1,29,0,57,21,57v15,0,21,-12,22,-36r54,0v-1,48,-28,72,-76,72v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v72,0,77,46,77,112xm68,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42","w":173},"f":{"d":"24,0r0,-154r-24,0r0,-41r24,0v-9,-56,24,-73,85,-66r0,39v-23,-2,-31,4,-27,27r27,0r0,41r-27,0r0,154r-58,0","w":106,"k":{"\u201d":-6,"\u2019":-6}},"g":{"d":"71,12v2,10,8,17,20,16v22,4,24,-27,23,-61v-8,22,-26,28,-46,28v-42,0,-55,-41,-55,-95v0,-46,6,-100,57,-100v27,-1,38,16,47,32r0,-27r54,0r0,188v0,44,-19,73,-81,73v-57,0,-73,-25,-73,-54r54,0xm71,-101v0,41,6,54,22,54v16,0,21,-12,21,-56v0,-36,-4,-52,-21,-52v-19,0,-22,22,-22,54","w":186},"h":{"d":"16,0r0,-257r59,0r0,83v21,-44,96,-33,96,28r0,146r-59,0r0,-133v0,-14,-6,-22,-17,-22v-11,0,-20,9,-20,28r0,127r-59,0","w":186},"i":{"d":"18,0r0,-195r58,0r0,195r-58,0xm18,-215r0,-45r58,0r0,45r-58,0"},"j":{"d":"18,-2r0,-193r58,0r0,200v6,50,-29,62,-84,58r0,-40v20,1,26,-5,26,-25xm18,-215r0,-45r58,0r0,45r-58,0"},"k":{"d":"16,0r0,-257r59,0r0,132r44,-70r64,0r-56,79r63,116r-64,0r-36,-73r-15,20r0,53r-59,0","w":186,"k":{"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4}},"l":{"d":"18,0r0,-257r58,0r0,257r-58,0"},"m":{"d":"18,0r0,-195r56,0v1,7,-2,18,1,23v16,-33,77,-45,95,2v23,-49,99,-38,99,24r0,146r-59,0r0,-133v0,-14,-6,-22,-17,-22v-11,0,-21,9,-21,28r0,127r-58,0r0,-133v0,-14,-6,-22,-17,-22v-11,0,-21,9,-21,28r0,127r-58,0","w":286},"n":{"d":"16,0r0,-195r56,0v1,7,-2,18,1,23v18,-43,98,-38,98,26r0,146r-59,0r0,-133v0,-14,-6,-22,-17,-22v-11,0,-20,9,-20,28r0,127r-59,0","w":186},"o":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"p":{"d":"16,63r0,-258r56,0v1,7,-2,18,1,24v4,-13,16,-29,42,-29v39,0,60,28,60,101v0,60,-8,104,-56,104v-16,0,-34,-5,-44,-26r0,84r-59,0xm73,-99v0,35,2,62,22,62v21,0,22,-24,22,-59v0,-31,-1,-61,-23,-61v-17,0,-21,20,-21,58","w":186,"k":{"y":4,"\u00fd":4,"\u00ff":4}},"q":{"d":"112,63r0,-84v-10,21,-28,26,-44,26v-48,0,-56,-44,-56,-104v0,-73,21,-101,60,-101v26,0,38,16,42,29r0,-24r57,0r0,258r-59,0xm113,-99v0,-38,-3,-58,-20,-58v-22,0,-23,30,-23,61v0,35,1,59,22,59v20,0,21,-27,21,-62","w":186},"r":{"d":"16,0r0,-195r56,0v1,9,-2,21,1,28v9,-19,27,-37,56,-32r0,55v-28,-6,-54,1,-54,33r0,111r-59,0","w":133,"k":{",":27,".":27,"a":4,"\u00e6":4,"\u00e1":4,"\u00e2":4,"\u00e4":4,"\u00e0":4,"\u00e5":4,"\u00e3":4,"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4,"c":4,"\u00e7":4,"d":4,"\u0131":4,"g":4,"q":6,"-":13}},"s":{"d":"61,-62v-9,34,43,41,43,11v0,-9,-5,-18,-23,-24v-48,-16,-71,-25,-71,-66v0,-39,28,-59,75,-59v58,0,71,26,70,61r-52,0v1,-18,-6,-26,-19,-25v-15,0,-20,8,-20,18v0,35,94,11,94,87v0,39,-27,64,-75,64v-56,-1,-76,-20,-74,-67r52,0","w":166,"k":{"w":2}},"t":{"d":"76,2v-80,0,-44,-94,-52,-156r-24,0r0,-41r24,0r0,-57r58,0r0,57r27,0r0,41r-27,0r0,98v-2,17,12,20,27,17r0,39v-11,1,-22,2,-33,2","w":113},"u":{"d":"171,-195r0,195r-57,0r0,-23v-18,43,-98,38,-98,-26r0,-146r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0","w":186},"v":{"d":"52,0r-48,-195r60,0r24,144r23,-144r58,0r-48,195r-69,0","w":173,"k":{",":20,".":20,"a":2,"\u00e6":2,"\u00e1":2,"\u00e2":2,"\u00e4":2,"\u00e0":2,"\u00e5":2,"\u00e3":2,"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2,"o":2,"\u00f8":2,"\u0153":2,"\u00f3":2,"\u00f4":2,"\u00f6":2,"\u00f2":2,"\u00f5":2}},"w":{"d":"44,0r-41,-195r59,0r19,144r22,-144r63,0r21,144r20,-144r57,0r-43,195r-65,0r-22,-144r-23,144r-67,0","w":266,"k":{",":13,".":13,"a":2,"\u00e6":2,"\u00e1":2,"\u00e2":2,"\u00e4":2,"\u00e0":2,"\u00e5":2,"\u00e3":2,"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2,"o":2,"\u00f8":2,"\u0153":2,"\u00f3":2,"\u00f4":2,"\u00f6":2,"\u00f2":2,"\u00f5":2}},"x":{"d":"1,0r53,-101r-49,-94r58,0r23,58r24,-58r58,0r-48,94r52,101r-59,0r-26,-63r-27,63r-59,0","w":173,"k":{"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2}},"y":{"d":"59,1r-55,-196r60,0r25,137r22,-137r59,0r-53,196v-13,60,-39,64,-97,62r0,-41v20,3,34,1,39,-21","w":173,"k":{",":20,".":20,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e4":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4}},"z":{"d":"11,0r0,-45r74,-105r-71,0r0,-45r140,0r0,45r-76,105r78,0r0,45r-145,0","w":166,"k":{"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2,"o":2,"\u00f8":2,"\u0153":2,"\u00f3":2,"\u00f4":2,"\u00f6":2,"\u00f2":2,"\u00f5":2}},"{":{"d":"84,66v-58,5,-53,-58,-51,-113v0,-18,-15,-33,-34,-33r0,-31v44,2,34,-55,34,-97v0,-45,39,-53,88,-49r0,40v-71,-13,2,115,-70,122v44,3,36,51,36,95v0,21,11,29,34,26r0,40r-37,0","w":119},"|":{"d":"17,5r0,-267r46,0r0,267r-46,0","w":79},"}":{"d":"-1,26v75,9,-5,-111,70,-122v-43,-3,-37,-50,-36,-94v1,-21,-11,-30,-34,-27r0,-40v48,-3,88,1,88,49v0,42,-10,97,34,97r0,31v-44,-2,-34,56,-34,98v0,45,-40,52,-88,48r0,-40","w":119},"~":{"d":"69,-127v32,-1,50,23,77,25v14,0,28,-16,32,-25r13,41v-10,18,-23,31,-44,31v-32,1,-50,-23,-77,-25v-14,0,-28,16,-32,25r-13,-41v10,-18,23,-31,44,-31","w":216},"\u00a1":{"d":"89,-23r0,84r-58,0v-1,-64,2,-124,6,-183r45,0xm88,-196r0,54r-56,0r0,-54r56,0","w":120},"\u00a2":{"d":"82,5v-57,-5,-67,-50,-67,-109v0,-52,14,-92,67,-96r0,-29r28,0r0,29v49,5,62,36,62,79r-54,0v0,-28,-7,-41,-22,-41v-19,0,-22,25,-22,65v0,44,3,64,22,64v17,0,21,-12,22,-46r54,0v0,55,-20,79,-62,84r0,33r-28,0r0,-33","w":187},"\u00a3":{"d":"22,3r-16,-34v35,-27,47,-43,40,-74r-38,0r0,-34r24,0v-34,-53,-12,-117,61,-116v64,0,84,29,84,74r-54,0v8,-43,-47,-50,-49,-9v0,11,3,19,18,51r62,0r0,34r-50,0v9,28,-13,44,-34,65v19,-10,36,5,57,5v13,0,28,-8,37,-14r17,37v-57,44,-103,-17,-159,15","w":187},"\u2044":{"d":"-60,11r144,-272r36,0r-144,272r-36,0","w":60},"\u00a5":{"d":"66,0r0,-48r-53,0r0,-33r53,0v0,-10,1,-21,-3,-27r-50,0r0,-34r36,0r-47,-108r62,0r31,93r31,-93r59,0r-46,108r35,0r0,34r-49,0v-4,6,-3,17,-3,27r52,0r0,33r-52,0r0,48r-56,0","w":187},"\u0192":{"d":"-7,60r8,-36v25,3,36,1,42,-31r21,-111r-38,0r6,-34r39,0v9,-53,16,-109,82,-105v9,0,18,1,30,2r-8,37v-39,-14,-43,32,-49,66r40,0r-7,34r-39,0v-22,79,-5,206,-127,178","w":187},"\u00a7":{"d":"15,-15r57,0v-1,18,6,32,21,32v12,0,19,-9,19,-25v0,-39,-103,-27,-103,-100v0,-23,15,-42,31,-51v-48,-36,-8,-109,53,-103v60,6,78,24,77,63r-54,0v2,-17,-7,-26,-21,-25v-15,0,-20,10,-20,18v0,36,102,22,102,99v0,24,-10,39,-27,53v11,10,20,26,20,46v0,49,-36,63,-78,63v-60,0,-79,-28,-77,-70xm131,-99v0,-24,-39,-29,-56,-41v-12,6,-19,16,-19,24v0,24,31,23,60,42v6,-5,15,-15,15,-25","w":186},"\u00a4":{"d":"50,-125v0,25,17,46,44,46v27,0,44,-21,44,-46v0,-25,-17,-46,-44,-46v-27,0,-44,21,-44,46xm1,-56r19,-19v-19,-27,-20,-72,0,-100r-19,-19r23,-24r20,20v28,-20,71,-19,99,0r20,-20r23,24r-19,19v20,28,20,71,0,99r19,20r-23,24r-20,-19v-27,20,-72,20,-99,-1r-20,20","w":187},"'":{"d":"23,-131r0,-126r47,0r0,126r-47,0"},"\u201c":{"d":"18,-131v2,-63,-13,-120,57,-126r0,28v-16,0,-23,11,-23,35r23,0r0,63r-57,0xm99,-131v2,-62,-14,-120,56,-126r0,28v-16,0,-23,11,-23,35r23,0r0,63r-56,0","w":173,"k":{"A":13,"\u00c6":13,"\u00c1":13,"\u00c2":13,"\u00c4":13,"\u00c0":13,"\u00c5":13,"\u00c3":13}},"\u00ab":{"d":"17,-69r0,-70r56,-40r0,54r-30,21r30,20r0,54xm87,-69r0,-70r56,-40r0,54r-30,21r30,20r0,54","w":159},"\u2039":{"d":"19,-69r0,-70r56,-40r0,54r-30,21r30,20r0,54"},"\u203a":{"d":"19,-30r0,-54r30,-20r-30,-21r0,-54r56,40r0,70"},"\u2013":{"d":"0,-82r0,-44r180,0r0,44r-180,0","w":180},"\u2020":{"d":"64,50r0,-191r-60,0r0,-47r60,0r0,-69r59,0r0,69r60,0r0,47r-60,0r0,191r-59,0","w":187},"\u2021":{"d":"64,50r0,-69r-60,0r0,-47r60,0r0,-75r-60,0r0,-47r60,0r0,-69r59,0r0,69r60,0r0,47r-60,0r0,75r60,0r0,47r-60,0r0,69r-59,0","w":187},"\u00b7":{"d":"10,-98v0,-21,16,-37,37,-37v21,0,37,16,37,37v0,21,-16,37,-37,37v-21,0,-37,-16,-37,-37"},"\u00b6":{"d":"69,50r0,-171v-27,0,-56,-25,-56,-67v0,-43,26,-69,65,-69r109,0r0,307r-47,0r0,-271r-24,0r0,271r-47,0","w":216},"\u2022":{"d":"26,-129v0,-35,29,-64,64,-64v35,0,64,29,64,64v0,35,-29,65,-64,65v-35,0,-64,-30,-64,-65","w":180},"\u201a":{"d":"19,-2r0,-63r56,0v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0"},"\u201e":{"d":"18,-2r0,-63r57,0v-2,63,13,120,-57,126r0,-28v16,0,23,-11,23,-35r-23,0xm99,-2r0,-63r56,0v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0","w":173},"\u201d":{"d":"18,-194r0,-63r57,0v-2,63,13,120,-57,126r0,-28v16,0,23,-11,23,-35r-23,0xm99,-194r0,-63r56,0v-2,62,14,120,-56,126r0,-28v16,0,22,-11,22,-35r-22,0","w":173,"k":{" ":13}},"\u00bb":{"d":"17,-30r0,-54r29,-19r-29,-22r0,-54r56,40r0,70xm87,-30r0,-54r30,-19r-30,-22r0,-54r56,40r0,70","w":159},"\u2026":{"d":"32,0r0,-65r56,0r0,65r-56,0xm152,0r0,-65r56,0r0,65r-56,0xm272,0r0,-65r56,0r0,65r-56,0","w":360},"\u2030":{"d":"325,-64v0,28,3,39,14,39v13,0,15,-10,15,-41v0,-32,-5,-37,-15,-37v-13,0,-14,17,-14,39xm63,5r113,-260r36,0r-113,260r-36,0xm46,-186v0,28,4,39,15,39v13,0,14,-10,14,-41v0,-32,-4,-37,-14,-37v-13,0,-15,17,-15,39xm282,-64v0,-41,11,-69,57,-69v51,0,57,31,57,69v0,38,-6,69,-57,69v-51,0,-57,-31,-57,-69xm4,-186v0,-41,11,-69,57,-69v51,0,57,31,57,69v0,38,-6,69,-57,69v-51,0,-57,-31,-57,-69xm199,-64v0,28,3,39,14,39v13,0,15,-10,15,-41v0,-32,-5,-37,-15,-37v-13,0,-14,17,-14,39xm157,-64v0,-41,10,-69,56,-69v51,0,57,31,57,69v0,38,-5,69,-56,69v-51,0,-57,-31,-57,-69","w":399},"\u00bf":{"d":"120,-122v9,71,-50,68,-50,124v0,17,5,26,20,26v15,0,22,-13,22,-47r54,0v2,54,-21,85,-75,85v-49,0,-77,-26,-77,-70v1,-68,58,-68,52,-118r54,0xm121,-196r0,54r-56,0r0,-54r56,0","w":180},"`":{"d":"31,-215r-36,-51r56,0r18,51r-38,0"},"\u00b4":{"d":"25,-215r18,-51r56,0r-36,51r-38,0"},"\u02c6":{"d":"-9,-215r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0"},"\u02dc":{"d":"22,-265v20,-2,47,23,54,0r29,0v-1,21,-10,49,-36,49v-25,0,-45,-23,-53,0r-28,0v1,-23,12,-47,34,-49"},"\u00af":{"d":"-9,-225r0,-32r112,0r0,32r-112,0"},"\u02d8":{"d":"21,-266v4,30,48,30,52,0r26,0v0,28,-16,51,-52,51v-36,0,-52,-23,-52,-51r26,0"},"\u02d9":{"d":"24,-264r45,0r0,47r-45,0r0,-47"},"\u00a8":{"d":"-7,-217r0,-47r44,0r0,47r-44,0xm56,-217r0,-47r45,0r0,47r-45,0"},"\u02da":{"d":"3,-255v0,-24,20,-44,44,-44v24,0,43,20,43,44v0,24,-19,43,-43,43v-24,0,-44,-19,-44,-43xm25,-255v0,12,10,21,22,21v12,0,21,-9,21,-21v0,-12,-9,-22,-21,-22v-12,0,-22,10,-22,22"},"\u00b8":{"d":"5,76r7,-19v10,7,45,10,43,-8v-1,-17,-30,-4,-35,-16r19,-33r21,0r-13,22v22,-8,45,9,42,26v6,35,-60,41,-84,28"},"\u02dd":{"d":"-11,-215r18,-51r56,0r-36,51r-38,0xm61,-215r18,-51r56,0r-36,51r-38,0"},"\u02db":{"d":"77,57r8,16v-24,15,-80,16,-80,-22v0,-25,26,-55,70,-51v-25,17,-36,33,-36,46v-1,20,25,20,38,11"},"\u02c7":{"d":"17,-215r-26,-51r43,0r13,29r13,-29r43,0r-26,51r-60,0"},"\u2014":{"d":"0,-82r0,-44r360,0r0,44r-360,0","w":360},"\u00c6":{"d":"3,0r97,-257r173,0r0,49r-81,0r0,51r75,0r0,49r-75,0r0,59r84,0r0,49r-140,0r0,-49r-54,0r-16,49r-63,0xm136,-96r0,-112r-3,0r-36,112r39,0","w":286},"\u00aa":{"d":"5,-215v1,-34,18,-38,54,-40v77,-5,36,67,54,120r-42,0v-3,-4,-1,-10,-4,-13v-9,27,-70,20,-63,-18v0,-29,27,-37,52,-40v16,-2,16,-22,2,-23v-9,0,-13,5,-13,14r-40,0xm68,-191v-14,9,-23,4,-23,20v0,7,4,13,10,13v13,1,14,-18,13,-33","w":117},"\u0141":{"d":"19,0r0,-82r-23,15r0,-51r23,-15r0,-124r60,0r0,85r43,-28r0,51r-43,28r0,72r88,0r0,49r-148,0","w":166,"k":{"y":20,"\u00fd":20,"\u00ff":20,"T":27,"V":27,"W":27,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":33,"\u2019":33}},"\u00d8":{"d":"131,-158v-18,34,-31,73,-48,109v4,10,10,14,20,14v24,0,28,-23,28,-94r0,-29xm28,10r12,-26v-23,-22,-27,-62,-27,-113v0,-82,10,-133,90,-133v17,0,30,2,41,7r10,-23r24,11r-11,26v25,24,27,66,27,112v0,71,-5,134,-91,134v-17,0,-31,-2,-41,-7r-10,23xm76,-99v18,-34,31,-73,48,-109v-4,-10,-11,-14,-21,-14v-24,0,-27,22,-27,93r0,30","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u0152":{"d":"138,0r0,-13v-10,12,-28,18,-46,18v-72,0,-79,-60,-79,-134v0,-54,0,-133,78,-133v17,0,33,5,46,18r0,-13r134,0r0,49r-83,0r0,51r78,0r0,49r-78,0r0,59r86,0r0,49r-136,0xm131,-129v-4,-45,13,-93,-27,-93v-28,0,-28,37,-28,93v0,56,0,94,28,94v41,0,22,-49,27,-94","w":280,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u00ba":{"d":"46,-194v0,26,4,36,13,36v10,0,12,-9,12,-35v0,-26,-2,-36,-12,-36v-9,0,-13,10,-13,35xm113,-194v0,35,-8,62,-54,62v-49,0,-55,-26,-55,-61v0,-35,8,-62,55,-62v49,0,54,26,54,61","w":117},"\u00e6":{"d":"15,-135v-1,-49,29,-65,72,-65v36,0,48,16,51,22v12,-17,31,-22,52,-22v49,0,72,39,69,112r-98,0v-1,29,0,57,21,57v15,0,20,-12,21,-36r54,0v-1,48,-28,72,-76,72v-37,0,-52,-12,-60,-32v-17,47,-111,48,-111,-27v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm161,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42","w":266},"\u0131":{"d":"18,0r0,-195r58,0r0,195r-58,0"},"\u0142":{"d":"18,0r0,-91r-18,12r0,-49r18,-12r0,-117r58,0r0,80r18,-12r0,49r-18,11r0,129r-58,0"},"\u00f8":{"d":"15,10r15,-25v-17,-18,-20,-48,-20,-83v0,-45,4,-102,80,-102v17,0,30,2,40,7r14,-25r21,13r-15,26v17,18,20,47,20,82v0,45,-4,102,-80,102v-17,0,-30,-2,-40,-7r-14,25xm112,-111v-15,20,-25,45,-38,67v3,7,8,11,16,11v22,0,22,-41,22,-78xm68,-84v15,-20,25,-45,38,-67v-3,-7,-8,-11,-16,-11v-22,0,-22,41,-22,78","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u0153":{"d":"260,-67v-2,46,-23,72,-70,72v-30,0,-45,-11,-53,-26v-12,21,-32,26,-55,26v-49,0,-72,-27,-72,-100v0,-58,12,-105,77,-105v27,0,42,8,53,25v13,-19,29,-25,52,-25v62,0,72,49,70,112r-96,0v-1,28,1,57,20,57v14,0,19,-12,20,-36r54,0xm68,-97v0,44,3,64,22,64v19,0,22,-25,22,-64v0,-45,-3,-65,-22,-65v-19,0,-22,25,-22,65xm166,-122r40,0v0,-27,-4,-42,-19,-42v-18,0,-21,16,-21,42","w":266,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u00df":{"d":"18,0r0,-180v0,-59,22,-82,82,-82v57,0,75,25,75,64v1,28,-12,44,-34,53v22,2,40,18,40,64v1,78,-35,88,-91,81r0,-39v25,4,33,-7,33,-44v0,-34,-9,-41,-33,-40r0,-41v21,3,27,-13,27,-30v0,-23,-8,-30,-21,-30v-14,0,-20,11,-20,31r0,193r-58,0","w":193,"k":{"w":2}},"\u00b9":{"d":"42,-101r0,-103r-29,0r0,-28v29,2,44,-13,44,-23r32,0r0,154r-47,0","w":121},"\u00ac":{"d":"152,-35r0,-72r-135,0r0,-47r182,0r0,119r-47,0","w":216},"\u00b5":{"d":"171,-195r0,195r-57,0r0,-23v-8,15,-20,32,-39,27r0,59r-59,0r0,-258r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0","w":186},"\u2122":{"d":"301,-109r-1,-101r-33,101r-36,0r-34,-101r0,101r-40,0r0,-148r63,0r29,90r30,-90r62,0r0,148r-40,0xm48,-109r0,-112r-37,0r0,-36r121,0r0,36r-37,0r0,112r-47,0","w":356},"\u00d0":{"d":"79,-114r0,69v47,1,54,-1,54,-88v0,-73,-5,-81,-54,-79r0,58r23,0r0,40r-23,0xm19,0r0,-114r-19,0r0,-40r19,0r0,-103r88,0v60,0,87,31,87,120v0,93,-13,137,-93,137r-82,0","w":206,"k":{"V":6,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9}},"\u00bd":{"d":"40,11r144,-272r35,0r-144,272r-35,0xm35,-101r0,-103r-29,0r0,-28v29,2,44,-13,44,-23r32,0r0,154r-47,0xm199,-102r-42,0v-2,-36,14,-52,57,-52v46,0,57,18,57,44v0,19,-2,32,-34,54v-14,10,-20,16,-24,22r57,0r0,34r-114,0v1,-26,15,-48,39,-68v28,-23,29,-29,29,-41v0,-9,-3,-17,-12,-17v-13,0,-13,16,-13,24","w":280},"\u00b1":{"d":"85,-60r0,-38r-68,0r0,-46r68,0r0,-38r46,0r0,38r68,0r0,46r-68,0r0,38r-46,0xm17,0r0,-47r182,0r0,47r-182,0","w":216},"\u00de":{"d":"19,0r0,-257r60,0r0,46r33,0v64,0,76,46,76,78v0,55,-38,86,-109,79r0,54r-60,0xm79,-166r0,67v30,4,50,-8,47,-32v2,-26,-16,-39,-47,-35","w":200},"\u00bc":{"d":"211,-60v-1,-15,2,-34,-1,-47r-24,47r25,0xm153,-27r0,-33r51,-91r51,0r0,91r16,0r0,33r-16,0r0,27r-44,0r0,-27r-58,0xm40,11r144,-272r35,0r-144,272r-35,0xm35,-101r0,-103r-29,0r0,-28v29,2,44,-13,44,-23r32,0r0,154r-47,0","w":280},"\u00f7":{"d":"17,-68r0,-46r182,0r0,46r-182,0xm73,-15v0,-19,16,-35,35,-35v19,0,35,16,35,35v0,19,-16,35,-35,35v-19,0,-35,-16,-35,-35xm73,-167v0,-19,16,-35,35,-35v19,0,35,16,35,35v0,19,-16,35,-35,35v-19,0,-35,-16,-35,-35","w":216},"\u00a6":{"d":"17,5r0,-98r46,0r0,98r-46,0xm17,-165r0,-97r46,0r0,97r-46,0","w":79},"\u00b0":{"d":"45,-200v0,15,12,26,27,26v15,0,27,-11,27,-26v0,-15,-12,-27,-27,-27v-15,0,-27,12,-27,27xm17,-200v0,-30,25,-55,55,-55v30,0,55,25,55,55v0,30,-25,55,-55,55v-30,0,-55,-25,-55,-55","w":144},"\u00fe":{"d":"16,63r0,-320r59,0r0,86v4,-13,16,-29,40,-29v39,0,60,28,60,101v0,60,-8,104,-56,104v-16,0,-34,-5,-44,-26r0,84r-59,0xm73,-99v0,35,2,62,22,62v21,0,22,-24,22,-59v0,-31,-1,-61,-23,-61v-17,0,-21,20,-21,58","w":186,"k":{"v":4,"y":6,"\u00fd":6,"\u00ff":6}},"\u00be":{"d":"222,-60r0,-47r-24,47r24,0xm165,-27r0,-33r51,-91r51,0r0,91r16,0r0,33r-16,0r0,27r-45,0r0,-27r-57,0xm54,11r144,-272r36,0r-144,272r-36,0xm46,-149v-3,23,25,34,25,4v0,-20,-11,-22,-30,-21r0,-28v26,8,37,-26,17,-33v-6,0,-13,5,-13,19r-42,0v0,-37,16,-47,57,-47v60,0,75,62,27,74v23,4,31,15,31,34v0,35,-23,49,-58,49v-39,0,-61,-9,-61,-51r47,0","w":280},"\u00b2":{"d":"46,-202r-42,0v-2,-37,15,-53,58,-53v46,0,56,18,56,44v0,19,-1,32,-33,54v-14,10,-21,16,-25,22r57,0r0,34r-114,0v1,-26,16,-48,40,-68v28,-23,29,-29,29,-41v0,-9,-3,-17,-12,-17v-13,0,-14,17,-14,25","w":121},"\u00ae":{"d":"87,-54r0,-149v53,-2,116,-5,116,47v0,25,-17,39,-36,42r37,60r-37,0r-33,-59r-13,0r0,59r-34,0xm120,-177r0,38v22,-2,50,7,49,-19v-1,-25,-27,-18,-49,-19xm49,-129v0,55,43,98,95,98v52,0,95,-43,95,-98v0,-56,-43,-97,-95,-97v-52,0,-95,41,-95,97xm10,-129v0,-74,60,-133,134,-133v74,0,134,59,134,133v0,74,-60,134,-134,134v-74,0,-134,-60,-134,-134","w":288},"\u2212":{"d":"17,-68r0,-46r182,0r0,46r-182,0","w":216},"\u00f0":{"d":"112,-92v0,-44,-4,-59,-22,-59v-17,0,-22,16,-22,59v0,43,5,59,22,59v18,0,22,-15,22,-59xm36,-204r-18,-18r30,-17v-7,-7,-14,-13,-21,-19r37,-29r25,23r27,-16r20,16r-29,17v41,42,63,80,63,154v0,55,-13,98,-80,98v-71,0,-80,-42,-80,-97v0,-44,8,-97,62,-97v10,0,20,6,28,7v-10,-13,-22,-27,-35,-40","w":180},"\u00d7":{"d":"21,-36r55,-55r-55,-55r32,-33r55,56r55,-56r32,33r-55,55r55,55r-32,32r-55,-55r-55,55","w":216},"\u00b3":{"d":"48,-149v-3,23,25,34,25,4v0,-20,-11,-22,-30,-21r0,-28v27,9,38,-26,17,-33v-6,0,-13,5,-13,19r-42,0v0,-37,17,-47,58,-47v39,0,54,13,54,43v0,15,-8,28,-27,31v23,4,30,15,30,34v0,35,-23,49,-58,49v-39,0,-61,-9,-61,-51r47,0","w":121},"\u00a9":{"d":"178,-106r38,0v-5,37,-36,57,-67,57v-48,0,-76,-35,-76,-80v0,-87,130,-111,141,-23r-35,0v-14,-41,-75,-22,-70,23v-6,44,59,65,69,23xm49,-129v0,55,43,98,95,98v52,0,95,-43,95,-98v0,-56,-43,-97,-95,-97v-52,0,-95,41,-95,97xm10,-129v0,-74,60,-133,134,-133v74,0,134,59,134,133v0,74,-60,134,-134,134v-74,0,-134,-60,-134,-134","w":288},"\u00c1":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm81,-273r18,-51r57,0r-36,51r-39,0","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c2":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm48,-273r25,-51r61,0r25,51r-42,0r-14,-29r-13,29r-42,0","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c4":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm49,-275r0,-47r45,0r0,47r-45,0xm113,-275r0,-47r44,0r0,47r-44,0","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c0":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm87,-273r-36,-51r56,0r18,51r-38,0","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c5":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm60,-307v0,-24,19,-44,43,-44v24,0,44,20,44,44v0,24,-20,43,-44,43v-24,0,-43,-19,-43,-43xm82,-307v0,12,9,21,21,21v12,0,22,-9,22,-21v0,-12,-10,-22,-22,-22v-12,0,-21,10,-21,22","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c3":{"d":"125,-96r-23,-114r-21,114r44,0xm1,0r65,-257r76,0r64,257r-63,0r-9,-49r-62,0r-9,49r-62,0xm79,-323v21,-2,47,25,54,0r29,0v-1,21,-10,49,-36,49v-24,1,-46,-24,-53,0r-28,0v1,-23,12,-47,34,-49","w":206,"k":{"v":9,"w":6,"y":9,"\u00fd":9,"\u00ff":9,"C":6,"\u00c7":6,"G":6,"O":6,"\u00d8":6,"\u0152":6,"\u00d3":6,"\u00d4":6,"\u00d6":6,"\u00d2":6,"\u00d5":6,"Q":6,"T":20,"U":4,"\u00da":4,"\u00db":4,"\u00dc":4,"\u00d9":4,"V":11,"W":13,"Y":33,"\u00dd":33,"\u0178":33,"\u201d":20,"\u2019":20}},"\u00c7":{"d":"72,33r16,-28v-69,-5,-75,-60,-75,-135v0,-66,3,-132,89,-132v57,0,86,28,83,94r-59,0v0,-37,-4,-54,-24,-54v-24,0,-26,24,-26,91v0,76,1,96,28,96v21,0,25,-26,25,-66r58,0v1,58,-11,99,-78,105r-10,18v22,-8,45,9,42,26v6,35,-60,41,-84,28r7,-19v10,7,45,10,43,-8v-1,-17,-30,-4,-35,-16","w":193},"\u00c9":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,59r92,0r0,49r-152,0xm68,-273r18,-51r56,0r-36,51r-38,0","w":180},"\u00ca":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,59r92,0r0,49r-152,0xm34,-273r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":180},"\u00cb":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,59r92,0r0,49r-152,0xm36,-275r0,-47r45,0r0,47r-45,0xm99,-275r0,-47r45,0r0,47r-45,0","w":180},"\u00c8":{"d":"19,0r0,-257r148,0r0,49r-88,0r0,51r83,0r0,49r-83,0r0,59r92,0r0,49r-152,0xm74,-273r-36,-51r56,0r18,51r-38,0","w":180},"\u00cd":{"d":"20,0r0,-257r60,0r0,257r-60,0xm28,-273r18,-51r56,0r-36,51r-38,0","w":100},"\u00ce":{"d":"20,0r0,-257r60,0r0,257r-60,0xm-6,-273r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":100},"\u00cf":{"d":"20,0r0,-257r60,0r0,257r-60,0xm-4,-275r0,-47r45,0r0,47r-45,0xm59,-275r0,-47r45,0r0,47r-45,0","w":100},"\u00cc":{"d":"20,0r0,-257r60,0r0,257r-60,0xm34,-273r-36,-51r56,0r18,51r-38,0","w":100},"\u00d1":{"d":"19,0r0,-257r69,0r51,167r0,-167r56,0r0,257r-69,0r-53,-177r0,177r-54,0xm82,-323v21,-2,47,25,54,0r29,0v-1,21,-10,49,-36,49v-25,0,-45,-23,-53,0r-27,0v1,-24,11,-47,33,-49","w":213},"\u00d3":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133xm81,-273r18,-51r57,0r-36,51r-39,0","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u00d4":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133xm48,-273r25,-51r61,0r25,51r-42,0r-14,-29r-13,29r-42,0","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u00d6":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133xm49,-275r0,-47r45,0r0,47r-45,0xm113,-275r0,-47r44,0r0,47r-44,0","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u00d2":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133xm87,-273r-36,-51r56,0r18,51r-38,0","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u00d5":{"d":"76,-129v0,71,3,94,27,94v24,0,28,-23,28,-94v0,-71,-4,-93,-28,-93v-24,0,-27,22,-27,93xm194,-129v0,71,-5,134,-91,134v-80,0,-90,-52,-90,-134v0,-82,10,-133,90,-133v86,0,91,62,91,133xm79,-323v21,-2,47,25,54,0r29,0v-1,21,-10,49,-36,49v-24,1,-46,-24,-53,0r-28,0v1,-23,12,-47,34,-49","w":206,"k":{"T":6,"V":4,"W":4,"Y":20,"\u00dd":20,"\u0178":20,"A":6,"\u00c6":6,"\u00c1":6,"\u00c2":6,"\u00c4":6,"\u00c0":6,"\u00c5":6,"\u00c3":6,",":9,".":9,"X":9}},"\u0160":{"d":"120,-186v0,-22,-4,-36,-24,-36v-15,0,-24,9,-24,28v0,54,111,26,111,117v0,58,-33,82,-88,82v-50,0,-92,-19,-85,-83r59,0v-1,23,2,43,26,43v21,0,27,-16,27,-31v0,-55,-110,-24,-110,-120v0,-41,22,-76,84,-76v62,0,83,30,82,76r-58,0xm67,-273r-26,-51r43,0r13,29r13,-29r43,0r-26,51r-60,0","w":193},"\u00da":{"d":"185,-257r0,172v0,50,-15,90,-85,90v-70,0,-85,-40,-85,-90r0,-172r61,0r0,190v0,20,8,32,24,32v16,0,24,-12,24,-32r0,-190r61,0xm78,-273r18,-51r56,0r-36,51r-38,0","w":200,"k":{"A":4,"\u00c6":4,"\u00c1":4,"\u00c2":4,"\u00c4":4,"\u00c0":4,"\u00c5":4,"\u00c3":4}},"\u00db":{"d":"185,-257r0,172v0,50,-15,90,-85,90v-70,0,-85,-40,-85,-90r0,-172r61,0r0,190v0,20,8,32,24,32v16,0,24,-12,24,-32r0,-190r61,0xm44,-273r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":200,"k":{"A":4,"\u00c6":4,"\u00c1":4,"\u00c2":4,"\u00c4":4,"\u00c0":4,"\u00c5":4,"\u00c3":4}},"\u00dc":{"d":"185,-257r0,172v0,50,-15,90,-85,90v-70,0,-85,-40,-85,-90r0,-172r61,0r0,190v0,20,8,32,24,32v16,0,24,-12,24,-32r0,-190r61,0xm46,-275r0,-47r45,0r0,47r-45,0xm109,-275r0,-47r45,0r0,47r-45,0","w":200,"k":{"A":4,"\u00c6":4,"\u00c1":4,"\u00c2":4,"\u00c4":4,"\u00c0":4,"\u00c5":4,"\u00c3":4}},"\u00d9":{"d":"185,-257r0,172v0,50,-15,90,-85,90v-70,0,-85,-40,-85,-90r0,-172r61,0r0,190v0,20,8,32,24,32v16,0,24,-12,24,-32r0,-190r61,0xm84,-273r-36,-51r56,0r18,51r-38,0","w":200,"k":{"A":4,"\u00c6":4,"\u00c1":4,"\u00c2":4,"\u00c4":4,"\u00c0":4,"\u00c5":4,"\u00c3":4}},"\u00dd":{"d":"66,0r0,-101r-65,-156r67,0r30,95r29,-95r65,0r-65,156r0,101r-61,0xm75,-273r18,-51r56,0r-36,51r-38,0","w":192,"k":{"O":13,"\u00d8":13,"\u0152":13,"\u00d3":13,"\u00d4":13,"\u00d6":13,"\u00d2":13,"\u00d5":13,"A":33,"\u00c6":33,"\u00c1":33,"\u00c2":33,"\u00c4":33,"\u00c0":33,"\u00c5":33,"\u00c3":33,",":40,".":40,"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f6":27,"\u00f2":27,"\u00f5":27,"-":27,"i":9,"\u00ed":9,"\u00ee":9,"\u00ef":9,"\u00ec":9,"u":20,"\u00fa":20,"\u00fb":20,"\u00fc":20,"\u00f9":20,":":13,";":13,"S":9,"\u0160":9}},"\u0178":{"d":"66,0r0,-101r-65,-156r67,0r30,95r29,-95r65,0r-65,156r0,101r-61,0xm42,-275r0,-47r45,0r0,47r-45,0xm106,-275r0,-47r44,0r0,47r-44,0","w":192,"k":{"O":13,"\u00d8":13,"\u0152":13,"\u00d3":13,"\u00d4":13,"\u00d6":13,"\u00d2":13,"\u00d5":13,"A":33,"\u00c6":33,"\u00c1":33,"\u00c2":33,"\u00c4":33,"\u00c0":33,"\u00c5":33,"\u00c3":33,",":40,".":40,"a":27,"\u00e6":27,"\u00e1":27,"\u00e2":27,"\u00e4":27,"\u00e0":27,"\u00e5":27,"\u00e3":27,"e":27,"\u00e9":27,"\u00ea":27,"\u00eb":27,"\u00e8":27,"o":27,"\u00f8":27,"\u0153":27,"\u00f3":27,"\u00f4":27,"\u00f6":27,"\u00f2":27,"\u00f5":27,"-":27,"i":9,"\u00ed":9,"\u00ee":9,"\u00ef":9,"\u00ec":9,"u":20,"\u00fa":20,"\u00fb":20,"\u00fc":20,"\u00f9":20,":":13,";":13,"S":9,"\u0160":9}},"\u017d":{"d":"8,0r0,-45r87,-163r-80,0r0,-49r150,0r0,42r-88,166r88,0r0,49r-157,0xm57,-273r-26,-51r43,0r13,29r13,-29r43,0r-26,51r-60,0","w":173},"\u00e1":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm68,-215r18,-51r56,0r-36,51r-38,0","w":180},"\u00e2":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm34,-215r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":180},"\u00e4":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm36,-217r0,-47r45,0r0,47r-45,0xm99,-217r0,-47r45,0r0,47r-45,0","w":180},"\u00e0":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm74,-215r-36,-51r56,0r18,51r-38,0","w":180},"\u00e5":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm46,-255v0,-24,20,-44,44,-44v24,0,44,20,44,44v0,24,-20,43,-44,43v-24,0,-44,-19,-44,-43xm68,-255v0,12,10,21,22,21v12,0,22,-9,22,-21v0,-12,-10,-22,-22,-22v-12,0,-22,10,-22,22","w":180},"\u00e3":{"d":"15,-135v0,-51,28,-65,76,-65v48,0,70,17,70,58v0,47,-7,106,6,142r-56,0v-3,-6,-1,-16,-4,-22v-22,44,-97,36,-97,-32v0,-49,37,-61,76,-66v30,-4,27,-41,2,-42v-16,0,-21,10,-21,27r-52,0xm107,-96v-28,16,-41,6,-41,36v0,15,6,25,17,25v24,6,24,-41,24,-61xm66,-265v20,-1,46,23,54,0r28,0v-1,21,-10,49,-36,49v-25,0,-45,-23,-53,0r-27,0v0,-24,12,-48,34,-49","w":180},"\u00e7":{"d":"62,33r16,-29v-63,-5,-68,-53,-68,-108v0,-55,16,-96,79,-96v61,0,77,33,77,79r-54,0v0,-28,-7,-41,-22,-41v-19,0,-22,25,-22,65v0,44,3,64,22,64v17,0,21,-12,22,-46r54,0v0,56,-21,80,-67,83r-10,18v22,-8,45,9,42,26v6,35,-60,41,-84,28r7,-19v10,7,45,10,43,-8v-1,-17,-30,-4,-35,-16","w":173,"k":{"y":6,"\u00fd":6,"\u00ff":6}},"\u00e9":{"d":"166,-88r-98,0v-1,29,0,57,21,57v15,0,21,-12,22,-36r54,0v-1,48,-28,72,-76,72v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v72,0,77,46,77,112xm68,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42xm67,-215r18,-51r56,0r-36,51r-38,0","w":173},"\u00ea":{"d":"166,-88r-98,0v-1,29,0,57,21,57v15,0,21,-12,22,-36r54,0v-1,48,-28,72,-76,72v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v72,0,77,46,77,112xm68,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42xm33,-215r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":173},"\u00eb":{"d":"166,-88r-98,0v-1,29,0,57,21,57v15,0,21,-12,22,-36r54,0v-1,48,-28,72,-76,72v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v72,0,77,46,77,112xm68,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42xm35,-217r0,-47r45,0r0,47r-45,0xm98,-217r0,-47r45,0r0,47r-45,0","w":173},"\u00e8":{"d":"166,-88r-98,0v-1,29,0,57,21,57v15,0,21,-12,22,-36r54,0v-1,48,-28,72,-76,72v-73,0,-79,-51,-79,-109v0,-55,16,-96,79,-96v72,0,77,46,77,112xm68,-122r42,0v0,-27,-4,-42,-20,-42v-19,0,-22,16,-22,42xm73,-215r-36,-51r56,0r18,51r-38,0","w":173},"\u00ed":{"d":"18,0r0,-195r58,0r0,195r-58,0xm25,-215r18,-51r56,0r-36,51r-38,0"},"\u00ee":{"d":"18,0r0,-195r58,0r0,195r-58,0xm-9,-215r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0"},"\u00ef":{"d":"18,0r0,-195r58,0r0,195r-58,0xm-7,-217r0,-47r44,0r0,47r-44,0xm56,-217r0,-47r45,0r0,47r-45,0"},"\u00ec":{"d":"18,0r0,-195r58,0r0,195r-58,0xm31,-215r-36,-51r56,0r18,51r-38,0"},"\u00f1":{"d":"16,0r0,-195r56,0v1,7,-2,18,1,23v18,-43,98,-38,98,26r0,146r-59,0r0,-133v0,-14,-6,-22,-17,-22v-11,0,-20,9,-20,28r0,127r-59,0xm69,-265v20,-2,47,23,54,0r29,0v-1,21,-10,49,-36,49v-24,1,-46,-24,-53,0r-28,0v1,-23,12,-47,34,-49","w":186},"\u00f3":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103xm68,-215r18,-51r56,0r-36,51r-38,0","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u00f4":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103xm34,-215r26,-51r60,0r26,51r-43,0r-13,-29r-13,29r-43,0","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u00f6":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103xm36,-217r0,-47r45,0r0,47r-45,0xm99,-217r0,-47r45,0r0,47r-45,0","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u00f2":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103xm74,-215r-36,-51r56,0r18,51r-38,0","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u00f5":{"d":"112,-97v0,-48,-4,-65,-22,-65v-17,0,-22,17,-22,64v0,48,5,65,22,65v18,0,22,-16,22,-64xm90,5v-71,0,-80,-44,-80,-102v0,-58,13,-103,80,-103v71,0,80,44,80,102v0,58,-13,103,-80,103xm66,-265v20,-1,46,23,54,0r28,0v-1,21,-10,49,-36,49v-25,0,-45,-23,-53,0r-27,0v0,-24,12,-48,34,-49","w":180,"k":{"v":2,"y":4,"\u00fd":4,"\u00ff":4}},"\u0161":{"d":"61,-62v-9,34,43,41,43,11v0,-9,-5,-18,-23,-24v-48,-16,-71,-25,-71,-66v0,-39,28,-59,75,-59v58,0,71,26,70,61r-52,0v1,-18,-6,-26,-19,-25v-15,0,-20,8,-20,18v0,35,94,11,94,87v0,39,-27,64,-75,64v-56,-1,-76,-20,-74,-67r52,0xm53,-215r-25,-51r43,0r13,29r13,-29r42,0r-25,51r-61,0","w":166,"k":{"w":2}},"\u00fa":{"d":"171,-195r0,195r-57,0r0,-23v-18,43,-98,38,-98,-26r0,-146r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0xm72,-215r18,-51r56,0r-36,51r-38,0","w":186},"\u00fb":{"d":"171,-195r0,195r-57,0r0,-23v-18,43,-98,38,-98,-26r0,-146r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0xm38,-215r25,-51r61,0r25,51r-42,0r-13,-29r-13,29r-43,0","w":186},"\u00fc":{"d":"171,-195r0,195r-57,0r0,-23v-18,43,-98,38,-98,-26r0,-146r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0xm40,-217r0,-47r44,0r0,47r-44,0xm103,-217r0,-47r45,0r0,47r-45,0","w":186},"\u00f9":{"d":"171,-195r0,195r-57,0r0,-23v-18,43,-98,38,-98,-26r0,-146r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0xm77,-215r-36,-51r57,0r18,51r-39,0","w":186},"\u00fd":{"d":"59,1r-55,-196r60,0r25,137r22,-137r59,0r-53,196v-13,60,-39,64,-97,62r0,-41v20,3,34,1,39,-21xm65,-215r18,-51r56,0r-36,51r-38,0","w":173,"k":{",":20,".":20,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e4":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4}},"\u00ff":{"d":"59,1r-55,-196r60,0r25,137r22,-137r59,0r-53,196v-13,60,-39,64,-97,62r0,-41v20,3,34,1,39,-21xm33,-217r0,-47r44,0r0,47r-44,0xm96,-217r0,-47r45,0r0,47r-45,0","w":173,"k":{",":20,".":20,"a":6,"\u00e6":6,"\u00e1":6,"\u00e2":6,"\u00e4":6,"\u00e0":6,"\u00e5":6,"\u00e3":6,"e":4,"\u00e9":4,"\u00ea":4,"\u00eb":4,"\u00e8":4,"o":4,"\u00f8":4,"\u0153":4,"\u00f3":4,"\u00f4":4,"\u00f6":4,"\u00f2":4,"\u00f5":4}},"\u017e":{"d":"11,0r0,-45r74,-105r-71,0r0,-45r140,0r0,45r-76,105r78,0r0,45r-145,0xm53,-215r-25,-51r43,0r13,29r13,-29r42,0r-25,51r-61,0","w":166,"k":{"e":2,"\u00e9":2,"\u00ea":2,"\u00eb":2,"\u00e8":2,"o":2,"\u00f8":2,"\u0153":2,"\u00f3":2,"\u00f4":2,"\u00f6":2,"\u00f2":2,"\u00f5":2}},"\u2206":{"d":"9,0r0,-29r74,-226r58,0r72,225r0,30r-204,0xm59,-41r102,0r-32,-93r-19,-64v-13,48,-34,109,-51,157","w":221},"\u2126":{"d":"11,-41v14,-1,31,2,43,-1v-19,-21,-38,-54,-38,-98v0,-61,40,-115,102,-115v116,0,118,158,60,214r44,0r0,41r-91,0r0,-30v18,-13,36,-44,36,-102v0,-44,-17,-80,-50,-80v-73,0,-55,168,-16,182r0,30r-90,0r0,-41","w":233},"\u03bc":{"d":"171,-195r0,195r-57,0r0,-23v-8,15,-20,32,-39,27r0,59r-59,0r0,-258r59,0r0,133v0,14,5,22,16,22v11,0,21,-8,21,-27r0,-128r59,0","w":186},"\u03c0":{"d":"199,-146r-23,0v1,46,-3,110,5,146r-48,0v-11,-31,-4,-102,-6,-146r-41,0v-1,35,-9,106,-21,146r-48,0v12,-44,20,-110,20,-146v-15,0,-24,1,-31,3r-5,-33v38,-23,140,-10,202,-13","w":206},"\u20ac":{"d":"113,5v-48,0,-87,-35,-88,-82r-34,0r15,-34r17,0r0,-27r-32,0r15,-33r18,0v3,-21,11,-51,34,-67v42,-30,97,-20,129,5r-19,43v-8,-20,-46,-35,-69,-17v-10,8,-14,23,-14,36r77,0r-14,33r-65,0r0,27r56,0r-14,34r-40,0v-3,57,80,47,96,10r0,51v-12,12,-42,21,-68,21","w":187},"\u2113":{"d":"152,-67r19,21v-27,75,-136,60,-135,-11v-5,4,-12,9,-18,13r-11,-26v10,-9,20,-16,28,-25r0,-89v0,-62,29,-91,64,-91v34,0,48,29,48,65v0,41,-24,80,-64,121v-3,28,6,53,28,53v17,0,31,-16,41,-31xm83,-182r0,47v21,-26,35,-56,35,-78v0,-17,-4,-26,-16,-26v-9,0,-19,12,-19,57","w":175},"\u212e":{"d":"65,-49v36,61,143,59,185,4r20,0v-26,30,-68,50,-114,50v-80,0,-144,-58,-144,-130v0,-72,64,-130,144,-130v81,1,147,58,145,134r-236,1r0,71xm248,-202v-36,-57,-135,-58,-179,-7v-8,18,-5,59,-2,81r179,0v6,-20,0,-51,2,-74","w":313},"\u2202":{"d":"36,-224r-13,-39v68,-46,158,-9,158,116v0,93,-36,150,-97,150v-48,0,-71,-46,-71,-85v0,-87,83,-120,120,-70v2,-45,-17,-89,-54,-90v-20,0,-34,10,-43,18xm61,-80v0,22,11,42,29,41v30,0,65,-95,6,-97v-21,0,-35,27,-35,56","w":198},"\u220f":{"d":"238,-204r-33,0r0,239r-49,0r0,-239r-65,0r0,239r-49,0r0,-239r-33,0r0,-47r229,0r0,47","w":247},"\u2211":{"d":"182,35r-174,0r0,-33r79,-111r-76,-106r0,-36r166,0r0,43r-101,1r66,89r-75,106r115,0r0,47","w":188},"\u2219":{"d":"10,-98v0,-21,16,-37,37,-37v21,0,37,16,37,37v0,21,-16,37,-37,37v-21,0,-37,-16,-37,-37"},"\u221a":{"d":"207,-302r-76,350r-39,0r-48,-153r-25,10r-8,-28r62,-26r39,139r61,-292r34,0","w":204},"\u221e":{"d":"254,-103v0,72,-80,85,-118,23v-18,23,-36,39,-64,39v-29,0,-56,-24,-56,-60v0,-36,26,-61,59,-61v26,0,44,14,62,37v13,-15,30,-37,62,-37v31,0,55,23,55,59xm44,-101v0,18,13,33,32,33v18,0,32,-15,45,-32v-14,-19,-24,-36,-46,-36v-19,0,-31,14,-31,35xm227,-101v0,-20,-12,-35,-31,-35v-21,0,-35,20,-46,33v21,26,31,35,48,35v18,0,29,-18,29,-33","w":270},"\u222b":{"d":"46,-211v0,-72,26,-110,87,-96r-5,34v-37,-8,-37,22,-37,66v0,96,48,299,-82,265r6,-36v33,9,37,-11,37,-58v0,-68,-6,-112,-6,-175","w":142},"\u2248":{"d":"62,-163v29,0,42,25,64,25v13,0,21,-11,30,-25r16,16v-10,22,-27,37,-46,37v-22,0,-45,-24,-66,-25v-15,0,-22,13,-30,25r-18,-16v10,-21,28,-37,50,-37xm62,-96v31,0,41,25,64,25v13,0,21,-11,30,-25r16,16v-10,21,-26,37,-46,37v-22,0,-44,-25,-66,-26v-15,0,-22,13,-30,25r-18,-15v10,-21,28,-37,50,-37","w":185},"\u2260":{"d":"138,-183r-13,30r44,0r0,28r-54,0r-19,47r73,0r0,28r-83,0r-17,38r-21,-8r12,-30r-44,0r0,-28r55,0r19,-47r-74,0r0,-28r84,0r16,-38","w":185},"\u2264":{"d":"168,-35r-150,-78r0,-31r150,-78r0,33r-123,60r123,60r0,34xm170,6r-153,0r0,-29r153,0r0,29","w":185},"\u2265":{"d":"19,-222r150,78r0,31r-150,78r0,-34r123,-61r-123,-59r0,-33xm169,6r-152,0r0,-29r152,0r0,29","w":185},"\u25ca":{"d":"187,-125r-67,143r-39,0r-64,-143r66,-143r40,0xm144,-124v-14,-34,-32,-66,-42,-103v-9,37,-28,68,-42,101v13,34,33,64,40,103","w":203},"\u00a0":{},"\u00ad":{"d":"12,-80r0,-49r109,0r0,49r-109,0","w":133},"\u02c9":{"d":"-9,-225r0,-32r112,0r0,32r-112,0"},"\u03a9":{"d":"11,-41v14,-1,31,2,43,-1v-19,-21,-38,-54,-38,-98v0,-61,40,-115,102,-115v116,0,118,158,60,214r44,0r0,41r-91,0r0,-30v18,-13,36,-44,36,-102v0,-44,-17,-80,-50,-80v-73,0,-55,168,-16,182r0,30r-90,0r0,-41","w":233},"\u2215":{"d":"-60,11r144,-272r36,0r-144,272r-36,0","w":60}}});
var gPopupWinOnload = false;

function displayNotification(url) {
    var callback = function() { showPopWin(url, 860, 800, function() {}); };
    openModalWithAuthRequired(callback);
}

function ackNotification(noteId) {
    var ackNotice = $('ackNotice');
    var checked = ackNotice.checked;

    if (checked) {
        var params = { id: noteId };
        ajaxRequest(BASE_URL + '/notifications/acknowledge', function() {}, params, true, false, false, false, true);
        ackNotice.disabled = true;
    }
}

function popupWinOnload(popupWinFnCall) {
    gPopupWinOnload = popupWinFnCall;
}

function displayInviteMe() {
    showPopWin(BASE_URL + '/inviteme?modal=true', 860, 500, function() {}, 'friendModal');
}

function showIfHidden(itemid) {
    var item = $(itemid);
    if (item && item.style && item.style.display == 'none') {
        item.style.display = 'inline';
    }
}

function hideIfShowing(itemid) {
    var item = $(itemid);
    if (item && item.style && item.style.display != 'none') {
        item.style.display = 'none';
    }
}

function showProgressAnim(progressIconId) {
    if (progressIconId) {
        showIfHidden(progressIconId);
    }
    else {
        showIfHidden('infoloaderdiv');
    }
}

function hideProgressAnim(progressIconId) {
    if (progressIconId) {
        hideIfShowing(progressIconId);
    }
    else {
        hideIfShowing('infoloaderdiv');
    }
}

function promptAuthForPage(reloadUrl) {
    displayAuthDialog(function() { window.location = reloadUrl; }, true);
}

function displayAuthDialog(logonCallback, noReloadAfterAuth) {
    var width = 860;
    var height = 600;

    if (Prototype.Browser.IE) {
        width = 870;
        height = 600;
    }

    if (!logonCallback) {
        logonCallback = function() {};
    }

    if (noReloadAfterAuth) {
        var callback = logonCallback;
    }
    else {
        var callback = function() {
            logonCallback();
            document.body.style.cursor = "wait";
             var regex = new RegExp(HOSTBASE + '\/?(logon)?$', 'i');
            if (regex.test(window.location)) {
                window.location = SECBASE_URL;
            }
            else {
                window.location.reload(true);
            }
        };
    }

    showPopWin(BASE_URL + '/logon/modal?modal=true', width, height, callback);
}

// Checks for errors and redirects to an error page if necessary. Also checks that we do not need to logon to proceed.
function ajaxResponse(transport, progressIconId, onsuccess, logonCallback, noReloadAfterAuth, requestFromModal) {
    hideProgressAnim(progressIconId);

    var json = transport.responseText.evalJSON();

    if (json.length < 1) {
        return null;
    }

    // json[0] is true if this function requires authentication AND we are logged in, or if
    // no authentication is required at all
    if (!json[0]) {

        if (requestFromModal) {
            alert('Your session has expired for your protection, and this window will now automatically close. Please reopen it and you will be prompted to logon.');
            closeThis();
        }
        else {
            if (! logonCallback) {
                logonCallback = function() {};
            }

            displayAuthDialog(logonCallback, noReloadAfterAuth);
        }

        return null;
    }

    return onsuccess(json[1]);
}

// Makes a generic AJAX request to a URL. Calls 'onsuccess' on success or handleRequestFailure on failure
// Automatically passes the security token in the parameters of each request
function ajaxRequest(url, onsuccess, params, noAnimation, progressIconId, logonCallback, noReloadAfterAuth, requestFromModal) {
    if (!noAnimation) {
        showProgressAnim(progressIconId);
    }

    if (!logonCallback) {
        logonCallback = function() {
            ajaxRequest(url, onsuccess, params, noAnimation, progressIconId, logonCallback, noReloadAfterAuth, requestFromModal);
        };
    }

    params.stk = Cookie.get('CKTRKID');

    if (!params.stk) {
        params.stk = Cookie.get('CKTRKIDDBG');
    }

    var callback = function(transport) { ajaxResponse(transport, progressIconId, onsuccess, logonCallback, noReloadAfterAuth, requestFromModal)};

    new Ajax.Request(url, {
        method: 'post',
        onSuccess: callback,
        onFailure: function() {},
        parameters: params
    });
}

function openModalWithAuthRequired(modalFunction) {
    ajaxRequest(BASE_URL + '/mainajax/authcheck', modalFunction, {}, false, false, modalFunction, true);
}


function logEvent(eventCode, eventInformation, site) {
    var params = { eventCode: eventCode };

    if (eventInformation)
        params.eventInformation = eventInformation;
    if (site)
        params.site = site;

    ajaxRequest(BASE_URL + '/events/fire/', function() {}, params, true);
}

function logAndOpenUrl(eventCode, eventInformation, url) {
    logEvent(eventCode, eventInformation, url);
    window.open(url);
}

function logBankrateAd(subnavLink, requestUri, title, width, height, adId) {
    params = {
        subnavLink: subnavLink,
        requestUri: requestUri,
        title: title,
        width: width,
        height: height,
        adId: adId
    };
    ajaxRequest(BASE_URL + '/mainajax/bankrateads', function() {}, params, true);
}

// Adapted from DOM Ready extension by Dan Webb
// http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
// which was based on work by Matthias Miller, Dean Edwards and John Resig
// Usage: Event.onReady(callbackFunction);
Object.extend(Event, {
  _domReady : function() {
    if (arguments.callee.done) return;
    arguments.callee.done = true;

    if (Event._timer)  clearInterval(Event._timer);

    Event._readyCallbacks.each(function(f) { f() });
    Event._readyCallbacks = null;

  },
  onReady : function(f) {
    if (!this._readyCallbacks) {
      var domReady = this._domReady;

      if (domReady.done) return f();

      if (document.addEventListener)
        document.addEventListener("DOMContentLoaded", domReady, false);

        /*@cc_on @*/
        /*@if (@_win32)
            var dummy = location.protocol == "https:" ?  "https://javascript:void(0)" : "javascript:void(0)";
            document.write("<script id=__ie_onload defer src='" + dummy + "'><\/script>");
            document.getElementById("__ie_onload").onreadystatechange = function() {
                if (this.readyState == "complete") { domReady(); }
            };
        /*@end @*/

        if (/WebKit/i.test(navigator.userAgent)) {
          this._timer = setInterval(function() {
            if (/loaded|complete/.test(document.readyState)) domReady();
          }, 10);
        }

        Event.observe(window, 'load', domReady);
        Event._readyCallbacks =  [];
    }
    Event._readyCallbacks.push(f);
  }
});

function addElement(parent, element) {
    parent.appendChild(element);
    return element;
}

// Returns the element you added
function addElementWithText(parent, text, element) {
    element.appendChild(document.createTextNode(text));
    parent.appendChild(element);
    return element;
}

// Returns the element that was added
function addStrongWithText(parent, text) {
    var newstrong = new Element('strong');
    addElementWithText(parent, text, newstrong);
    return newstrong;
}

// Adds text as a child to a node
function addtxt(element, text) {
    element.appendChild(document.createTextNode(text));
}

//add text with different styles
//function addStyledText(jsonStr){
function addStyledText(parent, jsonStr){
	/* usage:
	var jsonStr = {"items": [
			{"text": "text 1", "color": "black"},
			{"text": "text 2", "color": "blue"},
			{"text": "text 3", "color": "green"}
		]
	};
	*/
	var _jsonObj = eval(jsonStr);

	for(var i=0; i<_jsonObj.items.length; i++){
		var _txt = _jsonObj.items[i].text;
		var _color = _jsonObj.items[i].color;

		var _txt_element = new Element('span', { id: '_txt'+i});
			if(Prototype.Browser.IE)
				_txt_element.style.color = _color;
			else
				_txt_element.setAttribute('style', 'color:'+_color+';');

			parent.appendChild(_txt_element);
			_txt_element.appendChild(document.createTextNode(_txt));
	}

}

function formatDate(utctime) {
    var dateObj = new Date(utctime * 1000);
    var allDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

    var date = dateObj.getDate().toString();
    return allDays[dateObj.getDay()] + ' ' + translateMonth(dateObj.getMonth()) + ' ' + date + ', ' + dateObj.getFullYear() + ' ' + formatTime(dateObj);
}

function translateMonth(monthInt) {
    var allMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
                 'September', 'October', 'November', 'December'];
    return allMonths[monthInt];
}

function formatTime(dateObj) {
    var hours = dateObj.getHours();

    var timeofday = 'AM';
    if (hours >= 12) {
        timeofday = 'PM';
        hours -= 12;
    }

    if (hours == 0) {
        hours = '12';
    }

    var minutes = dateObj.getMinutes();

    if (minutes < 10) {
        minutes = "0" + minutes;
    }

    return hours + ':' + minutes + ' ' + timeofday;
}

// Retrieves a set of content for this page
function getContent(callback, contentPg, category, nocount, url, toggledTab) {
    var params = {};

    deselectAllTabs();

    if (contentPg) {
        params.pg = contentPg;
    }
    if (category) {
        params.concat = category;
    }
    if (nocount) {
        params.nocount = true;
    }
    params.isajax = true;

    var responseHandler = function(response) { callback(response); };
    ajaxRequest(BASE_URL + url, responseHandler, params);
}

// Checks if we're authed; if we're not authed, then the handler will display the auth dialog instead
function sendToFriend(contentId, type) {
    var stfCallback = function() {
        showPopWin(BASE_URL + '/shareoffer?modal=true&content=' + contentId + "&type=" + type, 860, 650, function() {}, 'friendModal');
    };
    openModalWithAuthRequired(stfCallback);
}

function toggleAlert(contentId, type) {

    var toggleCallback = function(response) {

        if (!response) {
            alert('A problem occurred. Please try again later.');
            return;
        }

        var data = eval(response);
        var alertExists = data.alertExists;

        // switch the state for the main (last) checkbox
        var p = $('commentAlert0');
        if (p != null) {
            // remove the two possible classes which would conflict
            p.removeClassName('articleDeleteCommentAlert')
            p.removeClassName('articleAddCommentAlert')
            // add the correct class back on
            p.addClassName( alertExists == 'true' ? 'articleDeleteCommentAlert' : 'articleAddCommentAlert' );
        }

        // switch the check marks for all the nested reply boxes
        for (var i=1; i<11; i++) {
            var c = $('commentAlert'+i);
            if (c != null) {
                c.removeClassName('alertNotChecked')
                c.removeClassName('alertChecked')
                // add the correct class back on
                c.addClassName( alertExists == 'true' ? 'alertChecked' : 'alertNotChecked' );
            }
        }

    };

    var progressIconId = false;
    var url = '/mainajax/comments/alert';
    var params = {content: contentId, type: type};
    ajaxRequest(BASE_URL + url, toggleCallback, params, false, progressIconId);
}

/**
 * Verifies that the 'retype' fields in the form are all correct.
 * form: the form to submit on success
 * comparisons: an array of objects that have members id1, id2, and errSubject, where
 *      the values of the elements id1 and id2 are to be compared and errSubject is to be
 *      used in the error message if applicable.
 */
function verifyValues(formId, comparisons) {
    for (var i = 0; i < comparisons.length; i++) {
        var curelement = comparisons[i];
        if ($(curelement.id1).value != $(curelement.id2).value) {
            alert('The ' + curelement.errSubject + ' and Retype ' + curelement.errSubject + ' fields must be the same.');
            return false;
        }
    }
}

function showMenu(menuElement, linkElement) {
    $(menuElement).style.display = 'block';
    linkElement.onclick = function() { hideMenu(menuElement, linkElement); return false; };
}

function hideMenu(menuElement, linkElement) {
    $(menuElement).style.display = 'none';
    linkElement.onclick = function() { showMenu(menuElement, linkElement); return false; };
}
function makeTooltip(id, tooltipId, disableOnclick) {
    var targetElement = $(id);
    var tipElement = $(tooltipId);
    tipElement.style.display = 'none';

    tipElement.style.zindex = 1000;

    if (disableOnclick) {
        targetElement.onclick = function() { return false; };
        targetElement.style.cursor = 'help';
    }

    Event.observe(targetElement, 'mouseover', function() { tipElement.style.display = 'block';});
    Event.observe(targetElement, 'mouseout', function() { tipElement.style.display = 'none';});
}

function setupHoverAction(hoverId, appearId) {
    var hoverElement = $(hoverId);
    var appearElement = $(appearId);
    if (!hoverElement) {
        return;
    }

    hoverElement.onmouseover = function() { appearElement.style.display = 'block'; };
    hoverElement.onmouseout = function() { appearElement.style.display = 'none'; };
}

function showConfirmAuth(formId, updateButton, action, isSears) {

    if (isSears) {
        isAgreed = $('tocagree').checked;
        if (!isAgreed) {
            alert('You must accept the Terms and Conditions to access your credit score.');
            return false;
        }
    }

    var callback = function() {
        $(formId).action = action;
        $(formId).submit();

        if (updateButton) {
            //  If its the ssn form, gray out the submit button and indicate we are working on getting the score
            $('updateScoreButton').onclick = function () {return false;};
            $('updateScoreButton').className = 'updateScoreWorking';
        }
    };

    showPopWin(BASE_URL + '/mainajax/confirmauth?modal=true', 860, 400, callback, 'confirmAuth');
}

function showCreditErr(url, btnToDisable, alertMsg) {
    popupWinOnload(function() {
        showPopWin(BASE_URL + url, 860, 500, function() {});

        if (btnToDisable && alertMsg) {
            $(btnToDisable).onclick = function() {
                alert(alertMsg);
                return false;
            };
        }
    });
}

function getSelected(dropdownId) {
    var dropdown = $(dropdownId);
    return dropdown.options[dropdown.selectedIndex];
}

function getCheckedRadio(radioGroupName) {
    return $A(document.getElementsByName(radioGroupName)).find(function(element) {
        if (element.checked) {
            return true;
        }
        else {
            return false;
        }
    });
}

function getNumber(elementId) {
    var val = $(elementId).value;
    val = val.toString().replace(/\$|\,|%/g, '');
    val = new Number(val);
    if (val == 0 || isNaN(val)) {
        return false;
    }
    return val;
}

var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};

function getMostCommentedContent(contentPg, category, nocount, contentType) {
    var callback = function(response) { updateContent(response, contentType, 'mostcmntli'); };
    getContent(callback, contentPg, category, nocount, '/all/' + contentType + '/mostcommented', 'mostcmntli');
    setSeeAllLink(contentType, 'mostcommented', 'See all most commented ' + contentType + '...');
    return false;
}

function getHighestRatedContent(contentPg, category, nocount, contentType) {
    var callback = function(response) { updateContent(response, contentType, 'highrateli'); };
    getContent(callback, contentPg, category, nocount, '/all/' + contentType + '/highestrated', 'highrateli');
    setSeeAllLink(contentType, 'highestrated', 'See all highest rated ' + contentType + '...');
    return false;
}

function getPopularContent(contentPg, category, nocount, contentType) {
    var callback = function(response) { updateContent(response, contentType, 'popularli'); };
    getContent(callback, contentPg, category, nocount, '/all/' + contentType + '/mostviewed', 'popularli');
    setSeeAllLink(contentType, 'mostviewed', 'See all most popular ' + contentType + '...');
    return false;
}

function getRecentContent(contentPg, category, nocount, contentType) {
    var callback = function(response) { updateContent(response, contentType, 'recentli'); };
    getContent(callback, contentPg, category, nocount, '/all/' + contentType + '/recent', 'recentli');
    setSeeAllLink(contentType, 'recent', 'See all recent ' + contentType + '...');
    return false;
}

function setSeeAllLink(contentType, urlSuffix, message) {
    var seeAllLink = $('seeAllLink');

    url = INSECBASE_URL + '/all/' + contentType + '/';

    seeAllLink.update(message);

    url += urlSuffix;
    seeAllLink.href = url;
}

function deselectAllTabs() {
    var elements = [ $('recentli'), $('popularli'), $('mostcmntli'), $('highrateli') ];
    elements.invoke('removeClassName', 'selected');
}

function deselectAllHomeTabs() {
    var ids = [ 'karmaOffers', 'newsArticles', 'creditTools', 'qa' ];

    ids.each(function(id) {
        $(id + 'Li').removeClassName('selected');
        $(id + 'Container').style.display = 'none';
    });
}

function chooseHomeTab(tabId, linkText, linkUri) {
    deselectAllHomeTabs();
    $(tabId + 'Li').addClassName('selected');
    $(tabId + 'Container').style.display = 'block';

    var seeAllLink = $('seeAllLink');
    seeAllLink.href = INSECBASE_URL + linkUri;
    seeAllLink.update(linkText);
}

function updateContent(response, contentType, toggledTab) {
    var contentList = $(contentType);
    contentList.innerHTML = response;
    var scriptElements = contentList.getElementsByTagName('script');

    for (var i = 0; i < scriptElements.length; i++) {
        eval(scriptElements[i].innerHTML);
    }

    hideProgressAnim();
	$(toggledTab).addClassName('selected');
}

/** Replaces the class(es) on an element with className */
function setClassAttribute(element, className) {
	element = $(element);
	element.setAttribute('class', className);
	element.setAttribute('className', className);
}

// On load, fetch the first page of content
function setupRecentContent(contentType) {
    getRecentContent(1, false, true, contentType);
}

function setupHighestRatedContent(contentType) {
    getHighestRatedContent(1, false, true, contentType);
}

function showRatings() {
    return toggleRatings('block', 'Collapse', hideRatings);
}

function hideRatings() {
    return toggleRatings('none', 'Expand', showRatings);
}

function toggleRatings(display, linkText, onclick) {
    $('ratingExpand').style.display = display;
    var lnk = $('ratingToggleLnk');
    lnk.onclick = onclick;
    lnk.update(linkText);
    return false;
}

function printHeader() {
    var newWindow = window.open('', '', 'width=665,height=600');

    var html = '<html><head><link rel="stylesheet" type="text/css" href="' + BASE_URL + '/res/css/global.css" /> <!--[if IE]> <link rel="stylesheet" type="text/css" href="' + BASE_URL + '/res/css/ie.css" /><![endif]--></head><body><div id="printWindowArea">';
    if (showCkLogo) {
        html += '<img id="printWindowLogo" src="' + BASE_URL + '/res/img/ck_logo.png" alt="Credit Karma" />';
    }
    html += '<div class="content-top-round"></div><div id="mainContent"><h2>' + $('itemTitle').innerHTML + '</h2>';

    newWindow.document.write(html);

    return newWindow;
}

function closePrint(newWindow) {
    newWindow.document.write('</div><div class="content-bottom-gray"></div></div></body></html>');
    newWindow.document.close();
    newWindow.print();
}

function printItem() {
    var newWindow = printHeader();
    newWindow.document.write($('itemContent').innerHTML);
    closePrint(newWindow);
}

function printFactor() {
    var newWindow = printHeader();
    newWindow.document.write('<p>' + $('itemContent').innerHTML + '</p>');
    newWindow.document.write('<h2>How to Fix</h2>');
    newWindow.document.write('<p>' + $('fixContent').innerHTML + '</p>');
    closePrint(newWindow);
}

function printQuestion() {
    var newWindow = printHeader();
    newWindow.document.write($('qaAnswer').innerHTML);
    closePrint(newWindow);
}

function trim(str) {
    if (str) {
        return str.replace(/^\s+|\s+$/g, '');
    }
    else {
        return '';
    }
}

function selectNav(subnavLink) {
    if (subnavLink) {
        Element.addClassName(subnavLink, 'active');
    }

    return true;
}

function checkRequiredPref(changed, required) {
    if (changed.checked) {
        $(required).checked = true;
    }
}

function toggleSubPref(changed, subprefs) {
	for (var subpref in subprefs) {
	    $(subprefs[subpref]).checked = changed.checked;		
	}
}

function placeDropdown(menuId) {
    var catLink = $('catLink' + menuId);
    var catMenu = $('catMenu' + menuId);

    if (!catLink || !catMenu) {
        return;
    }

    Element.clonePosition(catMenu, catLink, { offsetLeft: -10, offsetTop: 17, setWidth: false, setHeight: false });
}

function chooseTab(tab, aClass, selElementPrefix, selElementSuffix, divClass, tabSuffix) {
    $$('a.' + aClass).invoke('removeClassName', 'selected');
    $(selElementPrefix + tab + selElementSuffix).addClassName('selected');
    $$('div.' + divClass).each(function(thistab) { thistab.style.display = 'none';});
    $(tab + tabSuffix).style.display = 'block';
}

function chooseQuestionTab(tab) {
    chooseTab(tab, 'questionA', '', 'Li', 'questionTabDiv', 'Tab');
}

function chooseCcTab(tab) {
    chooseTab(tab, 'ccSplashNav', 'ccSplashNav_', '', 'ccTabData', 'Tab');
}

function sortCCOffers(sortKey, pg) {
    var sortKeyField = $('sortKeyField');

    if (sortKeyField.value == sortKey) {
        if (sortDirection == 'sortAscending') {
            sortDirection = 'sortDescending';
        }
        else {
            sortDirection = 'sortAscending';
        }
    }
    else if (sortKey) {
        sortKeyField.value = sortKey;
    }

    var url = BASE_URL + '/all/creditcards/' + sortDirection;

    if (pg) {
        document.forms.ccSortForm.action = url + '/pg/' + pg;
    }
    else {
        document.forms.ccSortForm.action = url;
    }

    document.forms.ccSortForm.submit();
}

function updateCardRec(img, title, link, takeLink, summary, tabId) {
    var cardImg = $('cardImg');
    cardImg.src = img;
    cardImg.setAttribute('alt', title + ' Credit Card');

    var cardTitleLink = $('cardTitleLink');
    cardTitleLink.update(title);
    cardTitleLink.href = takeLink;
    $('cardImgLink').href = takeLink;
    $('cardDetailsLink').href = link;
    $('recCardSummary').update(summary);

    var tab = $(tabId);

    if (tab && !tab.hasClassName('selected')) {
    	deselectIfNotChosen(tabId, 'cctab', 0);
    	deselectIfNotChosen(tabId, 'cctab', 1);
    	deselectIfNotChosen(tabId, 'cctab', 2);

        tab.addClassName('selected');
    }
}
    
function deselectIfNotChosen(tabId, tabPrefix, i) {
	var toDeselect = tabPrefix + i;
	
	if (tabId != toDeselect) {
		var toDeselectEle = $(toDeselect);
		if (toDeselectEle) {
			toDeselectEle.removeClassName('selected');
		}
	}
}

/*
*  BEGIN SURVEY JAVASCRIPT ******************************
*/
function submitSurvey() {
    var callback = function() {
        displaySurveyResults($('survey').value);
    };

    var params = {};

    var answerValues = new Array();
    var form = $('survey_form');

    var foundCounter = 0;
    for (var i = 0; i < form.elements.length; i++ ) {
        if (form.elements[i].type == 'checkbox') {
            if (form.elements[i].checked == true) {
                answerValues[foundCounter] = form.elements[i].value;
                foundCounter++;
            }
        }
        if (form.elements[i].type == 'radio') {
            if (form.elements[i].checked == true) {
                answerValues[foundCounter] = form.elements[i].value;
                foundCounter++;
            }
        }
    }

    if (foundCounter == 0) {
        alert('Please select an answer to complete the survey.');
        hideSurveyProgressAnim();
        return false;
    }

    params.answer = answerValues.toString();
    params.survey = $('survey').value;

    var url = '/mainajax/surveys/save';
    showSurveyProgressAnim();
    ajaxRequest(BASE_URL + url, callback, params, false, false, false, true);
}

function displaySurveyResults(surveyId) {

    var callback = function(json) {
        if (!json) {
            return;
        }

        // get the unordered list object
        var list = $('result_list');
        // remove all existing <li>
        while (list.hasChildNodes()) {
            list.removeChild(list.firstChild);
        }
        var showScoresValue = json['survey'].showScores;
        var showScores = showScoresValue == 1 ? true : false;

        var min = 850;
        var max =0;
        var factor = 0;
        if (showScores) {
            for (var i = 0; i < json['answers'].length; i++) {
                if(json['answers'][i].avgScore > max) {
                    max = json['answers'][i].avgScore;
                }
                if (json['answers'][i].avgScore < min) {
                    min = json['answers'][i].avgScore;
                }
            }
            min = min - 40;
            factor = 195/(max-min);
            $('scoreExpl').style.display = 'block';
        }
        else{
            $('scoreExpl').style.display = 'none';
        }

        for (var i = 0; i < json['answers'].length; i++) {
            var _answerId = json['answers'][i].answerId;
            var _cnt = json['answers'][i].cnt;
            var _avgScore = json['answers'][i].avgScore;
            var _percent = json['answers'][i].percent;
            var _answer = json['answers'][i].answer;

            // our new list item
            var li = document.createElement('li');
            var newP = document.createElement('p');
            newP.className = 'surveyResult';

            var span = document.createElement('span');
            span.className = 'surveyResultBar';

            if (showScores) {
                span.style.width = ((_avgScore-min) * factor) + 'px';
            }
            else {
                span.style.width = (_percent * 1.95) + 'px';
            }


            newP.appendChild(span);

            var newS = document.createElement('strong');

            if (showScores) {
                if (_avgScore == 0) {
                    _avgScore = 'N/A';
                }
                newS.appendChild(document.createTextNode(' ' + _avgScore));
            }
            else {
                newS.appendChild(document.createTextNode(' ' + _percent + '%'));
            }

            newP.appendChild(newS);

            li.appendChild(newP);

            var newP2 = document.createElement('p');
            newP2.className = 'surveyAnswer';
            newP2.appendChild(document.createTextNode(_answer));
            li.appendChild(newP2);
            list.appendChild(li);
        }


        $('question').innerHTML = json['survey'].question;
        $('surveyVotesCounter').innerHTML = "(Total Votes: " + json['total'] + ")";
        $('survey').value = json['survey'].surveyId;

        var showNextLink = json['surveyCount'] > 1 ? true : false;

        // if the survey id is zero, they have answered all the surveys
        if (surveyId == 0 || !showNextLink) {
            $('all_done').style.display = 'block';
        }

        toggleSurveyVisible('results', showNextLink);
    };

    var url = '/mainajax/surveys/getresults';

    // if the surveyId is zero, it will get a random survey
    // and we dont want it to get the current survey again, so pass the current survey
    // as surveyDontget
    var params = {survey: surveyId, surveyDontget: $('survey').value};

    ajaxRequest(BASE_URL + url, callback, params, false);
}

function nextSurvey() {
    var callback = function displayNextSurvey(json) {
        if (!json) {
            return;
        }

        // if there is no survey returned, they have completed all the surveys
        // so display the results of a random survey

        if(json['survey'] == undefined) {
            displaySurveyResults(0);
            return;
        }

        // get the survey Id and question string
        var surveyId = json['survey'].surveyId;
        var question = json['survey'].question;

        var isMultiSelect = json['survey'].multiSelect == 1 ? true : false;
        var inputType = isMultiSelect ? "checkbox" : "radio";

        // get the unordered list object
        var list = $('answer_list');

        // remove all existing <li>
        while (list.hasChildNodes()) {
            list.removeChild(list.firstChild);
        }

        // go through each answer and add it to the <li>
        for(var i=0; i<json['answers'].length; i++){
            var _answerId = json['answers'][i].answerId;
            var _answer = json['answers'][i].answer;

            // find out if the checkbox behaves like a radio button (only for multiselect)
            var isRadio = json['answers'][i].isRadio == 1 ? true : false;;

            // our new list item
            var li = document.createElement('li');

            var inputNamePostfix = '';
            if (isMultiSelect) {
                if (isRadio) {
                    // append radio to the name so we can identify it when unchecking selections
                    inputNamePostfix += '_radio';
                }
                inputNamePostfix += '_' + _answerId;
            }

            try{
                // for IE
                var onclickString = '';
                if (isMultiSelect) {
                    if (isRadio) {
                        // acts like a radio button, so uncheck all others
                        onclickString = 'onclick="uncheckOtherAnswers(' + _answerId + ')"';
                    }
                    else{
                        // is a normal checkbox so unselect all the other "radio" like boxes
                        onclickString = 'onclick="uncheckRadioAnswers(' + _answerId + ')"';
                    }
                }
                newInput = document.createElement('<input type="' + inputType + '" id="answer'  + inputNamePostfix + '" name="answer'  + inputNamePostfix + '" value="' + _answerId + '" ' + onclickString + ' />');
            } catch (err) {
                // for ff
                newInput = document.createElement('input');

                newInput.setAttribute('type', inputType);
                newInput.setAttribute('name','answer' + inputNamePostfix);
                newInput.setAttribute('id','answer' + inputNamePostfix);
                newInput.setAttribute('value',_answerId);
                if (isMultiSelect) {
                    if (isRadio) {
                        // acts like a radio button, so uncheck all others
                        newInput.setAttribute('onclick','uncheckOtherAnswers(' + _answerId + ')');
                    }
                    else {
                        // is a normal checkbox so unselect all the other "radio" like boxes
                        newInput.setAttribute('onclick','uncheckRadioAnswers(' + _answerId + ')');
                    }
                }
            }

            li.appendChild(newInput);

            var answerString = document.createTextNode(' ' + _answer);
            // add radio and answer text to li
            var answerSpan = document.createElement('span')
			answerSpan.appendChild(answerString);
			li.appendChild(answerSpan);

            // add li to list
            list.appendChild(li);
        }

        // set the question name to the next question
        $('question').innerHTML = question;
        // change survey id
        $('survey').value = surveyId;

        toggleSurveyVisible('survey');
    }

    showSurveyProgressAnim();
    var url = '/mainajax/surveys/getnext';

    var params = {};
    ajaxRequest(BASE_URL + url, callback, params, false);
}

function uncheckOtherAnswers(answerId) {
    var thisInput = $('answer_radio_' + answerId);
    if (!thisInput.checked) {
        return;
    }

    var form = $('survey_form');
    for (var i = 0; i < form.elements.length; i++ ) {
        if (form.elements[i].type == 'checkbox' && form.elements[i].value != answerId && form.elements[i].checked == true) {
            form.elements[i].checked =false;
        }
    }
}
function uncheckRadioAnswers(answerId) {
    var thisInput = $('answer_' + answerId);
    if (!thisInput.checked) {
        return;
    }

    var form = $('survey_form');
    for (var i = 0; i < form.elements.length; i++ ) {
        if (form.elements[i].type == 'checkbox' && form.elements[i].value != answerId && form.elements[i].checked == true) {
            if (form.elements[i].name.substring(0,12) == 'answer_radio') {
                form.elements[i].checked =false;
            }
        }
    }
}
function toggleSurveyVisible(showThis, showNextLink) {
    if (showThis == 'results') {
        $('submitButton').style.display = 'none';
        //$('mapButton').style.display = 'block';
        if (showNextLink) {
            $('nextSurvey').style.display = 'block';
        }
        $('surveyOptions').style.display = 'none';
        $('surveyResults').style.display = 'block';
        $('surveyVotesCounter').style.display = 'block';
    }
    else {
        $('submitButton').style.display = 'block';
        //$('mapButton').style.display = 'none';
        $('nextSurvey').style.display = 'none';
        $('surveyOptions').style.display = 'block';
        $('surveyResults').style.display = 'none';
        $('surveyVotesCounter').style.display = 'none';
        $('scoreExpl').style.display = 'none';
    }
    hideSurveyProgressAnim();
    hideProgressAnim();
}


function showSurveyProgressAnim() {
    showIfHidden('infoloaderdiv_survey');
    showIfHidden('infoloader_survey');
}

function hideSurveyProgressAnim() {
    hideIfShowing('infoloaderdiv_survey');
    hideIfShowing('infoloader_survey');
}

/*
*  END SURVEY JAVASCRIPT ******************************
*/

function updateOvernightAvgs(listItems, tabId) {
    $('ratesWidget').innerHTML = listItems;

    var tab = $(tabId);

    $('tabOneNOA').removeClassName('selected');
    $('tabTwoNOA').removeClassName('selected');
    $('tabThreeNOA').removeClassName('selected');

    tab.addClassName('selected');
}
function showScoreDetails() {
    $('offerScoreExpand').style.display = 'block';
    var lnk = $('offerScoreToggle');
    lnk.onclick = hideScoreDetails;
    lnk.update('Close Score Details');
    return false;
}
function hideScoreDetails() {
    $('offerScoreExpand').style.display = 'none';
    var lnk = $('offerScoreToggle');
    lnk.onclick = showScoreDetails;
    lnk.update('Score Details');
    return false;
}

function toggleAll(selector, checked) {
    $$(selector).each(function(chkbox) { chkbox.checked = checked } );
}

function cancelBubble(e) {
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}
var axel = Math.random() + "";
var ord = axel * 1000000000000000000;
//PNG fix for the IE Versions 5.5 and 6.0
Event.observe(window, 'load', function(){
	// this will iterate with each element with the class 'ie-fix-opacity' and add an IE filter,
	// replacing the background-image for the filter of that image
	var version = parseFloat(navigator.appVersion.split('MSIE')[1]);
	if ((version >= 5.5) && (version < 7) && (document.body.filters)) {
		document.getElementsByClassName('ie-fix-opacity').each(function(poElement){
			// if IE5.5+ on win32, then display PNGs with AlphaImageLoader
			var cBGImg = poElement.currentStyle.backgroundImage;
			var cImage = cBGImg.substring(cBGImg.indexOf('"') + 1, cBGImg.lastIndexOf('"'));
			poElement.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + cImage + "', sizingMethod='scale')";
			poElement.style.backgroundImage = "none";
		});
	}
}, false);
// Generic function to format currency for display
function formatCurrency(num, prependDollar) {
    if (num == null) {
        num = 0;
    }

    num = num.toString().replace(/\$|\,/g,'');

    if (isNaN(num)) {
        num = 0;
    }

    num = Math.round(num).toString();

    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
        num = num.substring(0,num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3));
    }
    
    var prefix = '';
    if (!isDefined(prependDollar) || prependDollar) {
        prefix = '$';
    }
    return prefix + num;
}
function activateTwitter() {
    $('twitterLink').style.textDecoration = 'underline';
    return false;
}
function deactivateTwitter() {
    $('twitterLink').style.textDecoration = 'none';
    return false;
}

function isDefined (variable) {
    return (typeof(variable) == "undefined") ? false: true;
}
function showBlock(itemid, cancellink, replylink) {
    var item = $(itemid);
    var cancellink = $(cancellink);
    var replylink = $(replylink);
    if (item && item.style && item.style.display == 'none') {
        item.style.display = 'block';
    }
    if (cancellink && cancellink.style && cancellink.style.display == 'none') {
        cancellink.style.display = 'inline';
    }
    if (replylink && replylink.style && replylink.style.display != 'none') {
        replylink.style.display = 'none';
    }
}
function hideBlock(itemid, cancellink, replylink) {
    var item = $(itemid);
    var cancellink = $(cancellink);
    var replylink = $(replylink);
    if (item && item.style && item.style.display != 'none') {
        item.style.display = 'none';
    }
    if (cancellink && cancellink.style && cancellink.style.display != 'none') {
        cancellink.style.display = 'none';
    }
    if (replylink && replylink.style && replylink.style.display == 'none') {
        replylink.style.display = 'inline';
    }
}

/** Searches through questions, based on a phrase. */
function searchQuestions(validator) {
	var params = { 'search': $('search').value };
	ajaxRequest(BASE_URL + '/search/question', searchQuestionsResponse, params);
}

/** Response includes error handling */
function searchQuestionsResponse(response) {
	if (response) {
		$('searchResults').innerHTML = response;
	}
}// This is called from the Submit button - checks auth, then the auth handler kicks off the comment submission
function submitComment(contentId, type, isQuestion, replyTo) {
    
    var progressIconId = false;
    if (!replyTo){
        var valid = new Validation('commentForm', {onSubmit:false});
        if (!valid.validate()) {
            return false;
        }
        var params = { body: $('cBody').value };
    }
    else {
        var progressIconId = 'infoloaderdiv' + replyTo;
        setupReplyCommentValidation(replyTo);

        var valid = new Validation('commentForm' + replyTo, {onSubmit:false});
        if (!valid.validate()) {
            return false;
        }
        var params = { body: $('cBody' + replyTo).value, replyTo: replyTo };
    }

    if (!isQuestion) {
        params.content = contentId;
        params.type = type;
        var url = '/mainajax/comments/add';
    }
    else {
        var url = '/mainajax/ask/submit';
        var progressIconId = 'questioninfoloaderdiv';
    }

    var commentCallback = function(response) {
        clearCommentFields(replyTo);
        hideProgressAnim();

        if (!response) {
            alert('A problem occurred while submitting your comment. Please try again later.');
            return;
        }

        if (!isQuestion) {
            displayCommentSubmitted();
        }
        else {
            displayQuestionSubmitted();
        }
    };

    if (!TC) {
        ajaxRequest(BASE_URL + url, commentCallback, params, false, progressIconId, false, true);
    }
    else {
        params.sname = $('sname').value;
        ajaxRequest(BASE_URL + url, commentCallback, params, false, progressIconId);
    }

    return false;
}

function displayCommentSubmitted() {
    showPopWin(BASE_URL + '/mainajax/modal/commentsubmit?modal=true', 860, 460, null, 'confirmComment');
    clearCommentFields();
}
function displayQuestionSubmitted() {
    showPopWin(BASE_URL + '/mainajax/modal/questionsubmit?modal=true', 860, 460, null, 'confirmComment');
    clearCommentFields();
}

function clearCommentFields(replyTo) {
    if (replyTo) {
        $('cBody' + replyTo).value = '';
    }
    else {
        $('cBody').value = '';
    }
    
    return false;
}

function setupCommentValidation() {
    var valid = new Validation('commentForm', {onSubmit:true});
    Validation.add('len-cbody', 'Comments must not exceed 65,536 characters.', {
        maxLength: 65536 });

    hideProgressAnim();
}

function setupReplyCommentValidation(replyTo) {
    var valid = new Validation('commentForm' + replyTo, {onSubmit:true});

    Validation.add('len-cbody' + replyTo, 'Comments must not exceed 65,536 characters.', {
        maxLength: 65536 });

    hideProgressAnim();
}
/** 
 * This function is called from a content list, such as /creditcards or /news, to vote for a particular item in the list.
 * Other functions are used to vote from other designs (like sidebars or the comment area).
 * 
 * This function relies on genericVote as the engine for the actual voting.
 * 
 * @param contentId used to make the AJAX request, NOT to locate elements on the page
 * @param elementId this is used to locate elements in the DOM. all elements will have this as a prefix or suffix
 * @param userVote 'yes' or 'no'
 * @param type content type, from FormConstants
 * @param classSuffix extra class suffix, to distinguish between various styles of voting block
 * @return void
 */
function voteFromBlock(contentId, elementId, userVote, type, classSuffix) {
    genericVote(contentId, elementId, userVote, buildVotesOnBlock, function() {}, type, 'voteInfoloaderdiv' + contentId, classSuffix);
}

/**
 * After a vote has been recorded on an item in a content list (like /news or /creditcards), this function will update
 * that item's voting statistics with the number of yes votes, no votes, how this user voted, and so on.
 * 
 * @param elementId unique prefix or suffix for this content item on the page
 * @param userRating unused in this function (not displayed)
 * @param yesVotes number of votes for this item
 * @param noVotes number of votes against this item
 * @param userVote how thiis user voted ('yes' or 'no')
 * @return void
 */
function buildVotesOnBlock(elementId, userRating, yesVotes, noVotes, userVote, classSuffix) {

    if (!classSuffix) {
        classSuffix = '';
    }

    // See what the user voted for
    if (userVote.toUpperCase() == 'YES') {
        var yesSuffix = 'Active';
        var noSuffix = 'Inactive';
    }
    else {
        var yesSuffix = 'Inactive';
        var noSuffix = 'Active';
    }

    // Disable the voting buttons
    var yesAnchor = $('yesVote' + elementId);
    var noAnchor = $('noVote' + elementId);
    yesAnchor.className = 'yes' + classSuffix + yesSuffix + ' fl';
    noAnchor.className = 'no' + classSuffix + noSuffix + ' fl';
    yesAnchor.onclick = noAnchor.onclick = function() { return false; };

    // Finally, update the 'X members think this is a good card' thing if it exists
    var goodOfferCount = $('goodOfferCount' + elementId);
    if (goodOfferCount) {
        if (yesVotes == 1) {
            var yesPl = 'member';
            var yesP2 = 'thinks';
        }
        else {
            var yesPl = 'members';
            var yesP2 = 'think';
        }
        goodOfferCount.replace(yesVotes + ' ' + yesPl + ' ' + yesP2 + ' this is a good card');
    }
}

/**
 * This is the basic vote driver that will fire off the AJAX request.
 * 
 * @param contentId
 * @param userVote 'yes' or 'no'
 * @param voteCallback on success, call this function
 * @param voteElementCleanup this cleanup function is run after the callback function runs
 * @param type content type from FormConstants
 * @param progressIcon id of any progress icons that should be used
 * @return
 */
function genericVote(contentId, elementId, userVote, voteCallback, voteElementCleanup, type, progressIcon, classSuffix) {
    ajaxOnSuccess = function(response) { handleVoteResponse(elementId, userVote, voteCallback,
                                                            voteElementCleanup, response, classSuffix); };

    if (!progressIcon) {
        progressIcon = 'voteInfoloaderdiv';
    }

    ajaxRequest(BASE_URL + '/mainajax/vote', ajaxOnSuccess, { content: contentId, vote: userVote, type: type }, false, progressIcon, false, true);
    return false;
}

/**
 * Wrapper for the callback on a successful vote - also calls the voteElementCleanup function, after the callback
 * 
 * @param contentId
 * @param userVote
 * @param voteCallback
 * @param voteElementCleanup
 * @param response
 * @param type
 * @param dontRepopRating
 * @return
 */
function handleVoteResponse(elementId, userVote, voteCallback, voteElementCleanup, response, classSuffix) {
    if (!response) {
        return;
    }

    var voteFor = 'No';
    if (userVote == 1) {
        voteFor = 'Yes';
    }

    var p_feedback = voteCallback(elementId, response[0], response[1], response[2], voteFor, classSuffix);

    if (voteElementCleanup) {
        voteElementCleanup(p_feedback);
    }
}


// Runs an AJAX vote request. This is used specifically for sidebars
function sidevote(contentId, userVote, type, progressIcon) {
    genericVote(contentId, userVote, buildVoteElementsSidebar, null, type, progressIcon);
}

function buildVoteElementsSidebar(contentId, userRating, yesVotes, noVotes, userVote, type, dontRepopRating) {
    yesVotes = (yesVotes > 0) ? yesVotes : '0';
    userRating = (userRating > 0) ? userRating : '0';

    var totalVotes = parseInt(yesVotes) + parseInt(noVotes);

    var totalUsers = $('totalUsers');

    if (totalVotes > 0) {
        if (totalVotes == 1) {
            var usersPl = ' user';
        }
        else {
            var usersPl = ' users';
        }

        if (totalUsers) {
            totalUsers.update(" from " + totalVotes + usersPl);
        }
        $('userRating').update(userRating);
    }
    else {
        if (totalUsers) {
            $('totalUsers').update(" - be the first to vote!");
        }
        $('userRating').update('NA');
    }

    var div_votearea = new Element('div');
    $('votediv').replaceChild(div_votearea, $('votearea'));
    div_votearea.id = 'votearea';

    addVoteElements(div_votearea, userVote, contentId, type, sidevote);

    // any page with a sidebar vote will also have the vote option
    // with the comments, so build those out as well.
    if (yesVotes == 1) {
        var yesPl = ' member';
        var yesP2 = ' says';
    }
    else {
        var yesPl = ' members';
        var yesP2 = ' say';
    }
    $('memberPollResults').update('<strong>' + yesVotes + '</strong> ' + yesPl + ' ' + yesP2 + ' <span style="color: green; font-weight: bold;">Yes</span>');

    var div_votearea = new Element('div', { style: 'display:inline'});
    $('recommendBar').replaceChild(div_votearea, $('recommendBarVotearea'));
    div_votearea.id = 'recommendBarVotearea';

    addVoteElements(div_votearea, userVote, contentId, type, sidevote, 'infoloaderdiv');

    return div_votearea;
}

function addVoteElements(parent, userVote, contentId, type, onclick, progressIcon) {
    if (!userVote || userVote == 'false') {
        var div_question = new Element('div', { className: 'question'} );

        var a_yes = new Element('a', { className: 'yes', href: '#' });
        a_yes.onclick = function() { onclick(contentId, 1, type, progressIcon); return false; };
        a_yes.update('&nbsp;');
        div_question.appendChild(a_yes);

        div_question.appendChild(document.createTextNode('\u00a0'));

        var a_no = new Element('a', { className: 'no', href: "#" });
        a_no.onclick = function() { onclick(contentId, 0, type, progressIcon); return false; };
        a_no.update('&nbsp;');
        div_question.appendChild(a_no);

        parent.appendChild(div_question);
    }

    else {
        var p_youVoted = new Element('p');

        if (userVote.toUpperCase() == 'YES') {
            var span_vote = new Element('span', { className: 'yes result' });
            var txt_vote = ' Yes';
        }
        else {
            var span_vote = new Element('span', { className: 'no result' });
            var txt_vote = ' No';
        }

        parent.appendChild(span_vote);
        span_vote.appendChild(document.createTextNode(txt_vote));
    }

    return parent;
}
function expand(offerId) {
    $('summary' + offerId).style.display = 'block';

    var toggleId = $('toggle' + offerId);
    toggleId.removeClassName('expand');
    toggleId.addClassName('contract');
    toggleId.onclick = function(idProxy) { return function() { hideSummary(idProxy); return false; }; }(offerId);
    toggleId.update('Hide Summary');
}

function hideSummary(offerId) {
    $('summary' + offerId).style.display = 'none';

    var toggleId = $('toggle' + offerId);
    toggleId.removeClassName('contract');
    toggleId.addClassName('expand');
    toggleId.onclick = function(idProxy) { return function() { expand(idProxy); return false; }; }(offerId);
    toggleId.update('Expand Offer');
}

function toggleAllExpand(selector, expanded) {
    $$(selector).each(
        function(item) {
            if (expanded) expand(item.getAttribute('name'));
            else hideSummary(item.getAttribute('name'));
        }
    );
}








function submitChangeEmail() {
    var params = { new_email: $('new_email').value,
                   old_email: $('old_email').value
                 };

    var changeEmailCallback = function(response) { getChangeEmailStatus(response); };
    ajaxRequest(BASE_URL + '/signup/changeemail', changeEmailCallback, params);
}

function getChangeEmailStatus(response) {
    if (!response) {
        printGeneralError();
    }

    var status = response.status;
    var email = response.newEmail;
    
    if (status == 'success') {
    	hideAllConfirmationPrompts();
    	$('emailChanged').style.display = 'block';
        
    	$('new_email').value = '';
        $('old_email').value = email;
        $('email').value = email;
    }
    else if (status == 'no_code'){
    	printGeneralError();
        $('new_email').value = '';
    }
    else if (status == 'email_exists'){
    	hideAllConfirmationPrompts();
    	$('emailInUse').style.display = 'block';
    }
    else if (status == 'bad_email'){
        // do nothing, client side validation pops up
    }
    else {
    	printGeneralError();
    }
}

function printGeneralError() {
	hideAllConfirmationPrompts();
	$('genericError').style.display = 'block';
	
	$('new_email').value = '';
}

function resendEmail() {
    var callback = function(json) {
        if (!json) {
            return;
        }
        if (json.success) {
        	hideAllConfirmationPrompts();
        	$('resentEmail').style.display = 'block';
        }
        else {
        	hideAllConfirmationPrompts();
        	$('resendError').style.display = 'block';
        }
    };

    //showSurveyProgressAnim();
    var url = '/signup/resend';

    var params = { email: $('email').value };
    ajaxRequest(BASE_URL + url, callback, params, false, 'resendinfoloaderdiv', false, true);
}

function hideAllConfirmationPrompts() {
	var promptIds = [ 'clickToActivate', 'emailChanged', 'emailInUse', 'genericError', 'resentEmail', 'resendError' ];
	
	promptIds.each(
			function(thisId) {
				var thisEle = $(thisId);
				thisEle.style.display = 'none';
			}
	);
}
var isNN = (navigator.appName.indexOf("Netscape")!=-1);

function autoTab(input,len, e) {
  var keyCode = (isNN) ? e.which : e.keyCode;
  var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];
  if(input.value.length >= len && !containsElement(filter,keyCode)) {
    input.value = input.value.slice(0, len);
    input.form[(getIndex(input)+1) % input.form.length].focus();
  }

  function containsElement(arr, ele) {
    var found = false, index = 0;
    while(!found && index < arr.length)
    if(arr[index] == ele)
    found = true;
    else
    index++;
    return found;
  }

  function getIndex(input) {
    var index = -1, i = 0, found = false;
    while (i < input.form.length && index == -1)
    if (input.form[i] == input)index = i;
    else i++;
    return index;
  }
  return true;
}


var monthDays = new Array();
monthDays[0] = 31; // Jan
monthDays[1] = 28; // Feb
monthDays[2] = 31; // Mar
monthDays[3] = 30; // Apr
monthDays[4] = 31; // May
monthDays[5] = 30; // Jun
monthDays[6] = 31; // Jul
monthDays[7] = 31; // Aug
monthDays[8] = 30; // Sep
monthDays[9] = 31; // Oct
monthDays[10] = 30; // Nov
monthDays[11] = 31; // Dec


function printOptions(upperLimit, idPrefix, selected) {
    for (var i = 0; i < upperLimit; i++) {
        var curVal = i+1;
        var dispVal = curVal;

        if (dispVal < 10) {
            dispVal = '0' + dispVal;
        }
        selectedString = '';
        if (selected == curVal) {
            selectedString = "selected='selected'";
        }
    	document.writeln("<option id=" + idPrefix + "-" + curVal
                             + " value='" + curVal + "' " + selectedString + ">" + dispVal + "</option>");
    }
}

function populateMonths(selected) {
    printOptions(monthDays.length, "month", selected);
}

function populateDays(formId, selected) {
    printOptions(31, "day", selected);
    updateDays(formId);
}

function populateYears(selected) {
    for(var i = 2008; i > 1900; i--) {
        selectedString = '';
        if (selected == i) {
            selectedString = "selected='selected'";
        }
        document.writeln("<option value='" + i + "' " + selectedString + ">" + i);
    }
}

function updateDays(formId) {
    var form = $(formId);

    var numDays = monthDays[form.months.selectedIndex-1];
    var leapYrInc = 0;

    if (numDays == 28) {
        var year = parseInt(form.years.value);
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            numDays++;
        }
    }

    for (var i = 29; i <= 31; i++) {
        var dayOption = $('day-' + i);
        if (numDays < i) {
            dayOption.style.display = 'none';
        }
        else {
            dayOption.style.display = 'block';
        }
    }
}/*!
 * SUBMODAL v1.5
 * Used for displaying DHTML only popups instead of using buggy modal windows.
 *
 * By Seth Banks
 * http://www.subimage.com/
 *
 * Contributions by:
 * 	Eric Angel - tab index code
 * 	Scott - hiding/showing selects for IE users
 *	Todd Huss - inserting modal dynamically and anchor classes
 *
 * Up to date code can be found at http://www.subimage.com/dhtml/subModal
 *
 *
 * This code is free for you to use anywhere, just keep this comment block.
 */

// Popup code
var gPopupMask = null;
var gPopupContainer = null;
var gPopFrame = null;
var gReturnFunc;
var gPopupIsShown = false;
var gDefaultPage = BASE_URL + "/res/html/loading.html";
var gHideSelects = false;
var gReturnVal = null;

var gIframeClass = false;

var gTabIndexes = new Array();
// Pre-defined list of tags we want to disable/enable tabbing into
var gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME");

// If using Mozilla or Firefox, use Tab-key trap.
if (!document.all) {
	document.onkeypress = keyDownHandler;
}

// necessary for IE to call events in the correct order
function setupOnload() {
    if (gPopupWinOnload)
        var onloadfn = function() { initPopUp(); gPopupWinOnload(); };
    else
        var onloadfn = initPopUp;

    Event.observe(window, "load", onloadfn);
}

/**
 * Initializes popup code on load.
 */
function initPopUp() {
	// Add the HTML to the body
	popmask = document.createElement('div');
	popmask.id = 'popupMask';
	popcont = document.createElement('div');
	popcont.id = 'popupContainer';
	popcont.innerHTML = '' +
		'<div id="popupInner">' +
			'<iframe src="'+ gDefaultPage +'" style="background-color:transparent;" frameborder="0" allowtransparency="true" id="popupFrame" name="popupFrame"></iframe>' +
		'</div>';

    var theBody = document.getElementsByTagName("BODY")[0];
	theBody.appendChild(popmask);

    var container = $('container');
    if (container)
        container.appendChild(popcont);

	gPopupMask = $('popupMask');
	gPopupContainer = $('popupContainer');
	gPopFrame = $('popupFrame');

	// check to see if this is IE version 6 or lower. hide select boxes if so
	// maybe they'll fix this in version 7?
	var brsVersion = parseInt(window.navigator.appVersion.charAt(0), 10);
	if (brsVersion <= 6 && window.navigator.userAgent.indexOf("MSIE") > -1) {
		gHideSelects = true;
	}

	// Add onclick handlers to 'a' elements of class submodal or submodal-width-height
	var elms = document.getElementsByTagName('a');
	for (i = 0; i < elms.length; i++) {
		if (elms[i].className.indexOf("submodal") == 0) {
			elms[i].onclick = function(){
				// default width and height
				var width = 400;
				var height = 200;
				// Parse out optional width and height from className
				params = this.className.split('-');
				if (params.length == 3) {
					width = parseInt(params[1]);
					height = parseInt(params[2]);
				}
				showPopWin(this.href,width,height,null); return false;
			}
		}
	}
}

/**
  * @argument width - int in pixels
  * @argument height - int in pixels
  * @argument url - url to display
  * @argument returnFunc - function to call when returning true from the window.
  * @argument showCloseBox - show the close box - default true
  */
function showPopWin(url, width, height, returnFunc, classNm, showCloseBox) {
    if (classNm) {
        gIframeClass = classNm;
        Element.addClassName(gPopFrame, classNm);
    }

	gPopupIsShown = true;
	disableTabIndexes();

    setMaskSize();
	gPopupMask.style.display = "block";

    gPopupContainer.style.width = width + "px";
    gPopupContainer.style.height = height + "px";
    gPopFrame.style.height = height + "px";
    centerPopWin(width, height);
	gPopupContainer.style.display = "block";

    gReturnFunc = returnFunc;
    // for IE
    if (gHideSelects == true) {
            hideSelectBoxes();
    }

    gPopFrame.src = url;
}

var gi = 0;
function centerPopWin(width, height) {
	if (gPopupIsShown == true) {
		if (width == null || isNaN(width)) {
			width = gPopupContainer.offsetWidth;
		}
		if (height == null) {
			height = gPopupContainer.offsetHeight;
		}

		//var theBody = document.documentElement;
		var theBody = document.getElementsByTagName("BODY")[0];
		//theBody.style.overflow = "hidden";
		var scTop = parseInt(getScrollTop(document),10);
		var scLeft = parseInt(theBody.scrollLeft,10);

		setMaskSize();

        var fullHeight = getViewportHeight();
        var fullWidth = getViewportWidth();

		/* if height is less than 75px the top of modals will not be viewable */
		var newHeight = (scTop + ((fullHeight - height) / 2))  > 157 ? (scTop + ((fullHeight - height) / 2)) : 157;
		gPopupContainer.style.top = newHeight + "px";
		gPopupContainer.style.left =  (scLeft + ((fullWidth - width) / 2)) + "px";
	}
}
Event.observe(window, "resize", centerPopWin);

/**
 * Sets the size of the popup mask.
 *
 */
function setMaskSize() {
    var dimensions = Element.getDimensions(document.getElementsByTagName("HTML")[0]);
	var fullHeight = dimensions.height;
	var fullWidth = dimensions.width;

    var theBody = document.getElementsByTagName("BODY")[0];

	// Determine what's bigger, scrollHeight or fullHeight / width
	if (fullHeight > theBody.scrollHeight) {
		popHeight = fullHeight;
	} else {
		popHeight = theBody.scrollHeight;
	}

	if (fullWidth > theBody.scrollWidth) {
		popWidth = fullWidth;
	} else {
		popWidth = theBody.scrollWidth;
	}

	gPopupMask.style.height = popHeight + "px";
	gPopupMask.style.width = popWidth + "px";
}

/**
 * @argument callReturnFunc - bool - determines if we call the return function specified
 * @argument returnVal - anything - return value
 */
function hidePopWin(callReturnFunc) {
	gPopupIsShown = false;
	var theBody = document.getElementsByTagName("BODY")[0];
	theBody.style.overflow = "";
	restoreTabIndexes();

    if (gIframeClass) {
        Element.removeClassName(gPopFrame, gIframeClass);
        gIframeClass = false;
    }

	if (gPopupMask == null) {
		return;
	}

    gPopupMask.style.display = "none";
	gPopupContainer.style.display = "none";

    gPopFrame.src = gDefaultPage;

    // display all select boxes
	if (gHideSelects == true) {
		displaySelectBoxes();
	}

    if (callReturnFunc == true && gReturnFunc != null) {
		// Set the return code to run in a timeout.
		// Was having issues using with an Ajax.Request();
		gReturnVal = window.frames["popupFrame"].returnVal;
		window.setTimeout('gReturnFunc(gReturnVal);', 1);
	}
}

// Tab key trap. iff popup is shown and key was [TAB], suppress it.
// @argument e - event - keyboard event that caused this function to be called.
function keyDownHandler(e) {
    if (gPopupIsShown && e.keyCode == 9)  return false;
}

// For IE.  Go through predefined tags and disable tabbing into them.
function disableTabIndexes() {
	if (document.all) {
		var i = 0;
		for (var j = 0; j < gTabbableTags.length; j++) {
			var tagElements = document.getElementsByTagName(gTabbableTags[j]);
			for (var k = 0 ; k < tagElements.length; k++) {
				gTabIndexes[i] = tagElements[k].tabIndex;
				tagElements[k].tabIndex="-1";
				i++;
			}
		}
	}
}

// For IE. Restore tab-indexes.
function restoreTabIndexes() {
	if (document.all) {
		var i = 0;
		for (var j = 0; j < gTabbableTags.length; j++) {
			var tagElements = document.getElementsByTagName(gTabbableTags[j]);
			for (var k = 0 ; k < tagElements.length; k++) {
				tagElements[k].tabIndex = gTabIndexes[i];
				tagElements[k].tabEnabled = true;
				i++;
			}
		}
	}
}


/**
* Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*
* Thanks for the code Scott!
*/
function hideSelectBoxes() {
	var x = document.getElementsByTagName("SELECT");

    for (i=0;x && i < x.length; i++) {
      x[i].style.visibility = "hidden";
    }
}

/**
* Makes all drop down form select boxes on the screen visible so they do not reappear after the dialog is closed.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*/
function displaySelectBoxes() {
	var x = document.getElementsByTagName("SELECT");

    for (i=0;x && i < x.length; i++){
      x[i].style.visibility = "visible";
    }
}

function getViewportHeight() {
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight;

	return window.undefined;
}
function getViewportWidth() {
	var offset = 17;
	var width = null;
	if (window.innerWidth!=window.undefined) return window.innerWidth;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth;
	if (document.body) return document.body.clientWidth;
}

/**
 * Gets the real scroll top
 */
function getScrollTop(currentDoc) {
	if (currentDoc.defaultView && currentDoc.defaultView.pageYOffset) // all except Explorer
	{
		return currentDoc.defaultView.pageYOffset;
	}
	else if (currentDoc.documentElement && currentDoc.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		return currentDoc.documentElement.scrollTop;
	}
	else if (currentDoc.body) // all other Explorers
	{
		return currentDoc.body.scrollTop;
	}
}

function getScrollLeft(currentDoc) {
	if (currentDoc.defaultView && currentDoc.defaultView.pageXOffset) // all except Explorer
	{
		return currentDoc.defaultView.pageXOffset;
	}
	else if (currentDoc.documentElement && currentDoc.documentElement.scrollLeft)
		// Explorer 6 Strict
	{
		return currentDoc.documentElement.scrollLeft;
	}
	else if (currentDoc.body) // all other Explorers
	{
		return currentDoc.body.scrollLeft;
	}
}

//
// getPageSize()
// Returns object with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize(currentDoc){
	var xScroll, yScroll;

	if (currentDoc.defaultView && currentDoc.defaultView.innerHeight && currentDoc.defaultView.scrollMaxY) {
		xScroll = currentDoc.body.scrollWidth;
		yScroll = currentDoc.defaultView.innerHeight + currentDoc.defaultView.scrollMaxY;
	} else if (currentDoc.body.scrollHeight > currentDoc.body.offsetHeight){ // all but Explorer Mac
		xScroll = currentDoc.body.scrollWidth;
		yScroll = currentDoc.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = currentDoc.body.offsetWidth;
		yScroll = currentDoc.body.offsetHeight;
	}

	var windowWidth, windowHeight;
	if (currentDoc.defaultView && currentDoc.defaultView.innerHeight) {	// all except Explorer
		windowWidth = currentDoc.defaultView.innerWidth;
		windowHeight = currentDoc.defaultView.innerHeight;
	} else if (currentDoc.documentElement && currentDoc.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = currentDoc.documentElement.clientWidth;
		windowHeight = currentDoc.documentElement.clientHeight;
	} else if (currentDoc.body) { // other Explorers
		windowWidth = currentDoc.body.clientWidth;
		windowHeight = currentDoc.body.clientHeight;
	}

    var pageWidth = windowWidth + xScroll;
    var pageHeight = windowHeight + yScroll;

    return { pageWidth: pageWidth, pageHeight: pageHeight, windowWidth: windowWidth, windowHeight: windowHeight };
}

function closeThis(useCallback) {
    parent.popupFrame.frameElement.style.border = "none";
    parent.hidePopWin(useCallback);
    return false;
}

function parentRedir(url) {
    parent.location.href = url;
}/*!
* Copyright (c) 2007 Andrew Tetlaw
*/
/*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
var Validator = Class.create();

Validator.prototype = {
	initialize : function(className, error, test, options) {
		if(typeof test == 'function'){
			this.options = $H(options);
			this._test = test;
		} else {
			this.options = $H(test);
			this._test = function(){return true};
		}
		this.error = error || 'Validation failed.';
		this.className = className;
	},
	test : function(v, elm) {
		return (this._test(v,elm) && this.options.all(function(p){
			return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
		}));
	}
}
Validator.methods = {
	pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
	minLength : function(v,elm,opt) {return v.length >= opt},
	maxLength : function(v,elm,opt) {return v.length <= opt},
	min : function(v,elm,opt) {return v >= parseFloat(opt)},
	max : function(v,elm,opt) {return v <= parseFloat(opt)},
	notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
		return v != value;
	})},
	oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
		return v == value;
	})},
	is : function(v,elm,opt) {return v == opt},
	isNot : function(v,elm,opt) {return v != opt},
	equalToField : function(v,elm,opt) {return v == $F(opt)},
	notEqualToField : function(v,elm,opt) {return v != $F(opt)},
	include : function(v,elm,opt) {return $A(opt).all(function(value) {
		return Validation.get(value).test(v,elm);
	})}
}

var Validation = Class.create();

Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			onSubmit : true,
			stopOnFirst : false,
			immediate : true,
			focusOnError : true,
			useTitles : false,
                        eventBlur: false,
			onFormValidate : function(result, form) {},
			onElementValidate : function(result, elm) {}
		}, options || {});
		this.form = $(form);
		if(this.options.onSubmit){
		  Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		}
		if(this.options.immediate) {
			var useTitles = this.options.useTitles;
			var callback = this.options.onElementValidate;
			Form.getElements(this.form).each(function(input) {
				Event.observe(input, 'keyup', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback, keyup : true}); });
                                Event.observe(input, 'blur', function(ev) { Validation.validate(Event.element(ev),{useTitle : useTitles, onElementValidate : callback, keyup : false}); });
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) Event.stop(ev);
	},
	validate : function() {
		var result = false;
		var useTitles = this.options.useTitles;
		var callback = this.options.onElementValidate;
		if(this.options.stopOnFirst) {
			result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
		} else {
			result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
		}
		if(!result && this.options.focusOnError) {
			Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
		}
		this.options.onFormValidate(result, this.form);
		return result;
	},
	reset : function() {
		Form.getElements(this.form).each(Validation.reset);
	}
}

Object.extend(Validation, {
	validate : function(elm, options){
		options = Object.extend({
			useTitle : false,
			onElementValidate : function(result, elm) {}
		}, options || {});
		elm = $(elm);
		var cn = elm.classNames();
		return result = cn.all(function(value) {
			var test = Validation.test(value,elm,options.useTitle,options.keyup);
			options.onElementValidate(test, elm);
			return test;
		});
	},
	test : function(name, elm, useTitle, keyup) {
		var v = Validation.get(name);

		try {
		if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
                        if (keyup) {
                            return true;
                        }

                        var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
                        var elmID = Validation.getElmID(elm);

                        var errImg = Validation.getErrImg(elm);
                        if (errImg) errImg.style.display = 'inline'; //new Effect.Appear(errImg, {duration: 1});

                        var helper = Validation.getHelper(elm);
                        if (helper) helper.style.display = 'block';

                        var advice = Validation.getAdvice(elm);
                        if (advice) advice.update(errorMsg);

                        var lbl = Validation.getLbl(elm);
                        if (lbl) lbl.style.color = '#EF0E12';

			elm.removeClassName('validation-passed');
			elm.addClassName('validation-failed');
			return false;
		} else {
                        var helper = Validation.getHelper(elm);
                        if (helper) helper.style.display = 'block';

			var advice = Validation.getAdvice(elm);
			if(advice) advice.update('');

                        var errImg = Validation.getErrImg(elm);
                        if(errImg) errImg.hide();

                        var lbl = Validation.getLbl(elm);
                        if (lbl) lbl.style.color = '#000000';

			elm.removeClassName('validation-failed');
			elm.addClassName('validation-passed');
			return true;
		}
		} catch(e) {
			throw(e)
		}
	},
	isVisible : function(elm) {
		while(elm.tagName != 'BODY') {
			if(!$(elm).visible()) return false;
			elm = elm.parentNode;
		}
		return true;
	},
	getAdvice : function(elm) {
		return $('advice-' + Validation.getElmID(elm));
	},
        getErrImg : function(elm) {
                return $('errImg-' + Validation.getElmID(elm));
        },
        getLbl : function(elm) {
                return $('lbl-' + Validation.getElmID(elm));
        },
        getHelper : function(elm) {
                return $('helper-' + Validation.getElmID(elm));
        },
	getElmID : function(elm) {
		return elm.id ? elm.id : elm.name;
	},
	reset : function(elm) {
		elm = $(elm);
		var cn = elm.classNames();
		cn.each(function(value) {
			var prop = '__advice'+value.camelize();
			if(elm[prop]) {
				var advice = Validation.getAdvice(elm);
				advice.hide();
				elm[prop] = '';
			}
			elm.removeClassName('validation-failed');
			elm.removeClassName('validation-passed');
		});
	},
	add : function(className, error, test, options) {
		var nv = {};
		nv[className] = new Validator(className, error, test, options);
		Object.extend(Validation.methods, nv);
	},
	addAllThese : function(validators) {
		var nv = {};
		$A(validators).each(function(value) {
				nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
			});
		Object.extend(Validation.methods, nv);
	},
	get : function(name) {
		return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
	},
	methods : {
		'_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
	}
});

Validation.add('IsEmpty', '', function(v) {
				return  ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
			});

Validation.addAllThese([
	['required', 'This is a required field.', function(v) {
				return !Validation.get('IsEmpty').test(v);
			}],
	['valid-number', 'Please enter a valid number in this field.', function(v) {
				return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
			}],
	['valid-digits', 'Please use numbers only in this field.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	['valid-alpha', 'Please use letters only in this field.', function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	['valid-alphanum', 'Please use letters and numbers only in this field.', function(v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z0-9]+$/.test(v)
			}],

	['valid-email', 'Please enter a valid email address.', function (v) {
				return Validation.get('IsEmpty').test(v) || /^[A-Za-z0-9][+A-Za-z0-9._-]*[A-Za-z0-9]*@[A-Za-z0-9][A-Za-z0-9._-]*\.[A-Za-z]+$/.test(v)
			}]
        ]);

function addUrlValidator() {
	Validation.add('valid-url', 'Please enter a valid URL.', function (v) {
				return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
			});
}

function addDateValidators() {
	Validation.addAllThese([
                           ['valid-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
				if(Validation.get('IsEmpty').test(v)) return true;
				var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(v)) return false;
				var d = new Date(v.replace(regex, '$2/$1/$3'));
				return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
							(parseInt(RegExp.$1, 10) == d.getDate()) &&
							(parseInt(RegExp.$3, 10) == d.getFullYear() );
                            }],

                            ['valid-date', 'Please enter a valid date.', function(v) {
				var test = new Date(v);
				return Validation.get('IsEmpty').test(v) || !isNaN(test);
                            }]
                        ]);
}

function addCurrencyValidator() {
	Validation.add('valid-currency-dollar', 'Please enter a valid $ amount. For example $100.00', function(v) {
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			});
}

function addSelectionValidators() {
    Validation.addAllThese([
	['valid-selection', 'Please make a selection.', function(v,elm){
				return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
			}],
	['valid-one-required', 'Please select one of the above options.', function (v,elm) {
				var p = elm.parentNode;
				var options = p.getElementsByTagName('INPUT');
				return $A(options).any(function(elm) {
					return $F(elm);
				});
			}]
    ]);
}

function addNameValidators() {
    Validation.add('valid-name', 'Please enter a valid name.', function(v) { return /^[ A-Za-z\'-]*$/.test(v); });
    Validation.add('len-lname', 'Last name must be between 2 and 25 characters.', { minLength: 2, maxLength: 25} );
}
function addScreenNameValidators() {
    Validation.add('len-sname', 'Screen names must be between 3 and 12 characters.', { minLength: 3, maxLength: 12} );
}
function addPasswordValidators() {
    Validation.add('len-password', 'Passwords must be at least 8 characters.', { minLength: 8 } );
    Validation.add('valid-password', 'Passwords must contain at least one number.', function(v) { return /.*[0-9].*/.test(v); });
}

function addSecAnswerValidators() {
    Validation.add('valid-secanswer', 'Security answers may contain numbers, letters, and the following characters: - , ? !',
                   function(v) { return /^[ A-Za-z0-9?,!-]*$/.test(v); });
    Validation.add('len-secanswer', 'Security answers must be between 5 and 20 characters in length.', { minLength: 5, maxLength: 20 });
}
function addAddressValidators() {
    Validation.add('valid-address', 'This field may only contain letters and numbers.',
                   function(v) { return /^[ A-Za-z0-9.,-]*$/.test(v); });
    Validation.add('valid-city', 'Cities may only contain letters, numbers, and spaces.',
                   function(v) { return /^[A-Za-z ]*$/.test(v); });
    Validation.add('len-zip', 'Zip codes must be exactly 5 digits long.', { minLength: 5, maxLength: 5 } );
}
function addCSVEmailValidators() {
    Validation.add('valid-csvemails', 'E-mails must be valid and comma-separated.', function(v) {
        return /^([A-Za-z0-9][+A-Za-z0-9._-]+[A-Za-z0-9]*@[A-Za-z0-9][A-Za-z0-9._-]*\.[A-Za-z]+)([ ]*,[ ]*[A-Za-z0-9][+A-Za-z0-9._-]+[A-Za-z0-9]*@[A-Za-z0-9][A-Za-z0-9._-]*\.[A-Za-z]+)*$/.test(v); });
}
